From 8af74d44ca29ed04550600ccefd5aee8ea832c3d Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 12 Sep 2024 09:41:04 +0000 Subject: [PATCH] Update github pages content --- prs/8803/{9347543 => 22983057} | 0 prs/8803/ct_logs/all_runs.html | 6 +- prs/8803/ct_logs/ct_log_cache | Bin 770 -> 770 bytes .../last_name | 1 - .../make_test_dir.system_test.logs/last_name | 1 - .../run.2024-09-11_12.06.30/suite.summary | 1 - .../totals.info | Bin 92 -> 0 bytes .../last_name | 1 - .../make_test_dir.stdlib_test.logs/last_name | 1 - .../run.2024-09-11_11.10.55/suite.summary | 1 - .../totals.info | Bin 95 -> 0 bytes .../MY_MODULE.beam | Bin 700 -> 700 bytes .../ct_default.css | 0 .../ctlog.html | 80 +- .../erl_pp_test.E | 0 .../format_status_server.beam | Bin .../format_status_statem.beam | Bin .../generic_fsm.beam | Bin .../generic_server.beam | Bin .../generic_server_timer.beam | Bin .../generic_statem.beam | Bin .../generic_statem_complex.beam | Bin .../index.html | 12 +- .../jquery-latest.js | 0 .../jquery.tablesorter.min.js | 0 .../l_mod.beam | Bin 1088 -> 1088 bytes .../last_name | 1 + .../last_test.html | 2 +- .../argparse_suite.src.html | 0 .../array_suite.src.html | 0 .../base64_property_test_suite.src.html | 0 .../base64_suite.src.html | 0 .../beam_lib_suite.src.html | 0 .../binary_module_suite.src.html | 0 .../binary_property_test_suite.src.html | 0 .../c_suite.src.html | 0 .../calendar_suite.src.html | 0 .../dets_suite.src.html | 0 .../dict_suite.src.html | 0 .../digraph_suite.src.html | 0 .../digraph_utils_suite.src.html | 0 .../edlin_context_suite.src.html | 0 .../edlin_expand_suite.src.html | 0 .../epp_suite.src.html | 0 .../erl_anno_suite.src.html | 0 .../erl_eval_suite.src.html | 0 .../erl_expand_records_suite.src.html | 0 .../erl_internal_suite.src.html | 0 .../erl_lint_suite.src.html | 0 .../erl_pp_suite.src.html | 0 .../erl_scan_suite.src.html | 0 .../error_logger_h_suite.src.html | 0 .../escript_suite.src.html | 0 .../ets_property_test_suite.src.html | 0 .../ets_suite.src.html | 0 .../ets_tough_suite.src.html | 0 .../file_sorter_suite.src.html | 0 .../filelib_suite.src.html | 0 .../filename_suite.src.html | 0 .../fixtable_suite.src.html | 0 .../format_suite.src.html | 0 .../gb_sets_property_test_suite.src.html | 0 .../gen_event_suite.src.html | 0 .../gen_fsm_suite.src.html | 0 .../gen_server_suite.src.html | 0 .../gen_statem_suite.src.html | 0 .../id_transform_suite.src.html | 0 .../io_proto_suite.src.html | 0 .../io_suite.src.html | 0 .../json_suite.src.html | 0 .../last_link.html | 2 +- .../make_test_dir.stdlib_test.logs/last_name | 1 + .../lists_property_test_suite.src.html | 0 .../lists_suite.src.html | 0 .../log_mf_h_suite.src.html | 0 .../maps_suite.src.html | 0 .../math_suite.src.html | 0 .../ms_transform_suite.src.html | 0 .../peer_suite.src.html | 0 .../pool_suite.src.html | 0 .../proc_lib_suite.src.html | 0 .../proplists_suite.src.html | 0 .../qlc_suite.src.html | 0 .../queue_property_test_suite.src.html | 0 .../queue_suite.src.html | 0 .../rand_suite.src.html | 0 .../random_suite.src.html | 0 .../re_suite.src.html | 0 .../argparse_suite.argparse.1282.html} | 0 .../argparse_suite.basic.1250.html} | 0 .../argparse_suite.built_in_types.3.html} | 0 .../argparse_suite.command_usage.229.html} | 0 .../argparse_suite.complex_command.99.html} | 0 ..._suite.default_for_not_required.1378.html} | 0 .../argparse_suite.global_default.1410.html} | 0 .../argparse_suite.invalid_arguments.35.html} | 0 .../argparse_suite.long_form_eq.67.html} | 0 .../argparse_suite.multi_short.1506.html} | 0 .../argparse_suite.nargs.131.html} | 0 .../argparse_suite.negative.1314.html} | 0 .../argparse_suite.nodigits.1346.html} | 0 .../argparse_suite.parser_error.195.html} | 0 ...rgparse_suite.parser_error_usage.197.html} | 0 .../argparse_suite.pos_mixed_with_opt.4.html} | 0 .../argparse_suite.proxy_arguments.5.html} | 0 .../argparse_suite.readme.1186.html} | 0 .../argparse_suite.src.html} | 0 .../argparse_suite.subcommand.1442.html} | 0 .../argparse_suite.type_validators.1218.html} | 0 .../argparse_suite.unicode.163.html} | 0 .../argparse_suite.usage.1570.html} | 0 ...gparse_suite.usage_args_ordering.227.html} | 0 ...parse_suite.usage_required_args.1602.html} | 0 .../argparse_suite.usage_template.165.html} | 0 .../argparse_suite.usage_width.261.html} | 0 ...rgparse_suite.validator_exception.69.html} | 0 ...suite.validator_exception_format.101.html} | 0 .../argparse_suite.very_short.1474.html} | 0 .../array_suite.end_per_suite.html} | 0 .../array_suite.fix_test.html} | 0 .../array_suite.foldl_test.html} | 0 .../array_suite.foldr_test.html} | 0 .../array_suite.from_list_test.html} | 0 .../array_suite.from_orddict_test.html} | 0 .../array_suite.init_per_suite.html} | 0 .../array_suite.map_test.html} | 0 .../array_suite.new_test.html} | 0 .../array_suite.relax_test.html} | 0 .../array_suite.resize_test.html} | 0 .../array_suite.set_get_test.html} | 0 .../array_suite.sparse_foldl_test.html} | 0 .../array_suite.sparse_foldr_test.html} | 0 .../array_suite.sparse_map_test.html} | 0 .../array_suite.sparse_to_list_test.html} | 0 .../array_suite.sparse_to_orddict_test.html} | 0 .../array_suite.src.html} | 0 .../array_suite.to_list_test.html} | 0 .../array_suite.to_orddict_test.html} | 0 ...64_property_test_suite.decode_1_case.html} | 0 ...y_test_suite.decode_1_malformed_case.html} | 0 ...perty_test_suite.decode_1_noisy_case.html} | 0 ...64_property_test_suite.decode_2_case.html} | 0 ...y_test_suite.decode_2_malformed_case.html} | 0 ...perty_test_suite.decode_2_noisy_case.html} | 0 ...y_test_suite.decode_to_string_1_case.html} | 0 ...te.decode_to_string_1_malformed_case.html} | 0 ..._suite.decode_to_string_1_noisy_case.html} | 0 ...y_test_suite.decode_to_string_2_case.html} | 0 ...te.decode_to_string_2_malformed_case.html} | 0 ..._suite.decode_to_string_2_noisy_case.html} | 0 ...64_property_test_suite.encode_1_case.html} | 0 ...64_property_test_suite.encode_2_case.html} | 0 ...y_test_suite.encode_to_string_1_case.html} | 0 ...y_test_suite.encode_to_string_2_case.html} | 0 ...64_property_test_suite.end_per_suite.html} | 0 ...4_property_test_suite.init_per_suite.html} | 0 ...operty_test_suite.mime_decode_1_case.html} | 0 ...t_suite.mime_decode_1_malformed_case.html} | 0 ...operty_test_suite.mime_decode_2_case.html} | 0 ...t_suite.mime_decode_2_malformed_case.html} | 0 ...t_suite.mime_decode_to_string_1_case.html} | 0 ...me_decode_to_string_1_malformed_case.html} | 0 ...t_suite.mime_decode_to_string_2_case.html} | 0 ...me_decode_to_string_2_malformed_case.html} | 0 .../base64_property_test_suite.src.html} | 0 .../base64_suite.base64_decode.html} | 0 .../base64_suite.base64_decode_modes.html} | 0 ...base64_suite.base64_decode_to_string.html} | 0 .../base64_suite.base64_encode.html} | 0 .../base64_suite.base64_encode_modes.html} | 0 ...base64_suite.base64_encode_to_string.html} | 0 .../base64_suite.base64_otp_5635.html} | 0 .../base64_suite.base64_otp_6279.html} | 0 .../base64_suite.big.html} | 0 .../base64_suite.illegal.html} | 0 .../base64_suite.mime_decode.html} | 0 .../base64_suite.mime_decode_modes.html} | 0 .../base64_suite.mime_decode_to_string.html} | 0 ...64_suite.mime_decode_to_string_modes.html} | 0 .../base64_suite.roundtrip_1.1666.html} | 0 .../base64_suite.roundtrip_2.1698.html} | 0 .../base64_suite.roundtrip_3.1730.html} | 0 .../base64_suite.roundtrip_4.1762.html} | 0 .../base64_suite.src.html} | 0 .../beam_lib_suite.building.html} | 0 .../beam_lib_suite.cmp.html} | 0 .../beam_lib_suite.cmp_literals.html} | 0 .../beam_lib_suite.encrypted_abstr.html} | 0 .../beam_lib_suite.encrypted_abstr_file.html} | 0 .../beam_lib_suite.end_per_suite.html} | 0 .../beam_lib_suite.error.html} | 0 .../beam_lib_suite.init_per_suite.html} | 0 .../beam_lib_suite.md5.html} | 0 ...lib_suite.missing_debug_info_backend.html} | 0 .../beam_lib_suite.normal.html} | 0 .../beam_lib_suite.otp_6711.html} | 0 .../beam_lib_suite.src.html} | 0 .../beam_lib_suite.strip.html} | 0 .../beam_lib_suite.strip_add_chunks.html} | 0 ...lib_suite.test_makedep_abstract_code.html} | 0 .../binary_module_suite.badargs.html} | 0 .../binary_module_suite.bin_to_list.html} | 0 ...dule_suite.check_no_invalid_read_bug.html} | 0 .../binary_module_suite.copy.html} | 0 .../binary_module_suite.encode_decode.html} | 0 .../binary_module_suite.error_info.html} | 0 .../binary_module_suite.guard.html} | 0 .../binary_module_suite.hex_encoding.html} | 0 .../binary_module_suite.interesting.html} | 0 .../binary_module_suite.list_to_bin.html} | 0 ...ary_module_suite.longest_common_trap.html} | 0 .../binary_module_suite.parts.html} | 0 .../binary_module_suite.random_ref_comp.html} | 0 ...ary_module_suite.random_ref_fla_comp.html} | 0 ...nary_module_suite.random_ref_sr_comp.html} | 0 .../binary_module_suite.referenced.html} | 0 .../binary_module_suite.scope_return.html} | 0 .../binary_module_suite.src.html} | 0 .../binary_property_test_suite.at_case.html} | 0 ...rty_test_suite.at_invalid_index_case.html} | 0 ...y_test_suite.at_invalid_subject_case.html} | 0 ...operty_test_suite.bin_to_list_1_case.html} | 0 ...erty_test_suite.bin_to_list_2_3_case.html} | 0 ...e.bin_to_list_2_3_invalid_range_case.html} | 0 ...ite.bin_to_list_invalid_subject_case.html} | 0 ...erty_test_suite.compile_pattern_case.html} | 0 ...compile_pattern_invalid_pattern_case.html} | 0 ...rty_test_suite.copy_2_invalid_n_case.html} | 0 ...binary_property_test_suite.copy_case.html} | 0 ...test_suite.copy_invalid_subject_case.html} | 0 ..._property_test_suite.decode_hex_case.html} | 0 ..._suite.decode_hex_invalid_chars_case.html} | 0 ...uite.decode_hex_invalid_subject_case.html} | 0 ...e_unsigned_2_invalid_endianness_case.html} | 0 ...erty_test_suite.decode_unsigned_case.html} | 0 ...decode_unsigned_invalid_subject_case.html} | 0 ...suite.encode_hex_2_invalid_case_case.html} | 0 ..._property_test_suite.encode_hex_case.html} | 0 ...uite.encode_hex_invalid_subject_case.html} | 0 ...e_unsigned_2_invalid_endianness_case.html} | 0 ...erty_test_suite.encode_unsigned_case.html} | 0 ...encode_unsigned_invalid_integer_case.html} | 0 ...ry_property_test_suite.end_per_suite.html} | 0 ...inary_property_test_suite.first_case.html} | 0 ...est_suite.first_invalid_subject_case.html} | 0 ...y_property_test_suite.init_per_suite.html} | 0 ...binary_property_test_suite.last_case.html} | 0 ...test_suite.last_invalid_subject_case.html} | 0 ...property_test_suite.list_to_bin_case.html} | 0 ...suite.list_to_bin_invalid_bytes_case.html} | 0 ...est_suite.longest_common_prefix_case.html} | 0 ...t_common_prefix_invalid_subject_case.html} | 0 ...est_suite.longest_common_suffix_case.html} | 0 ...t_common_suffix_invalid_subject_case.html} | 0 ...est_suite.match_3_invalid_scope_case.html} | 0 ...inary_property_test_suite.match_case.html} | 0 ...est_suite.match_invalid_pattern_case.html} | 0 ...est_suite.match_invalid_subject_case.html} | 0 ...t_suite.matches_3_invalid_scope_case.html} | 0 ...ary_property_test_suite.matches_case.html} | 0 ...t_suite.matches_invalid_pattern_case.html} | 0 ...t_suite.matches_invalid_subject_case.html} | 0 ...binary_property_test_suite.part_case.html} | 0 ...y_test_suite.part_invalid_range_case.html} | 0 ...test_suite.part_invalid_subject_case.html} | 0 ...place_4_invalid_insert_replaced_case.html} | 0 ...t_suite.replace_4_invalid_scope_case.html} | 0 ...ary_property_test_suite.replace_case.html} | 0 ...t_suite.replace_invalid_pattern_case.html} | 0 ...ite.replace_invalid_replacement_case.html} | 0 ...t_suite.replace_invalid_subject_case.html} | 0 ...est_suite.split_3_invalid_scope_case.html} | 0 ...inary_property_test_suite.split_case.html} | 0 ...est_suite.split_invalid_pattern_case.html} | 0 ...est_suite.split_invalid_subject_case.html} | 0 .../binary_property_test_suite.src.html} | 0 .../run.2024-09-12_10.33.01/c_suite.c_1.html} | 0 .../run.2024-09-12_10.33.01/c_suite.c_2.html} | 0 .../run.2024-09-12_10.33.01/c_suite.c_3.html} | 0 .../run.2024-09-12_10.33.01/c_suite.c_4.html} | 0 .../c_suite.c_default_outdir_1.html} | 0 .../c_suite.c_default_outdir_2.html} | 0 .../c_suite.end_per_suite.html} | 0 .../c_suite.init_per_suite.html} | 0 .../run.2024-09-12_10.33.01/c_suite.ls.html} | 0 .../c_suite.memory.html} | 0 .../c_suite.nc_1.html} | 0 .../c_suite.nc_2.html} | 0 .../c_suite.nc_3.html} | 0 .../c_suite.nc_4.html} | 0 .../c_suite.nc_default_outdir_1.html} | 0 .../c_suite.nc_default_outdir_2.html} | 0 .../run.2024-09-12_10.33.01/c_suite.src.html} | 0 .../calendar_suite.big_gregorian_days.html} | 0 .../calendar_suite.day_of_the_week.html} | 0 ...ndar_suite.day_of_the_week_calibrate.html} | 0 .../calendar_suite.end_per_suite.html} | 0 .../calendar_suite.gregorian_days.html} | 0 .../calendar_suite.gregorian_seconds.html} | 0 .../calendar_suite.init_per_suite.html} | 0 .../calendar_suite.iso_week_number.html} | 0 ...calendar_suite.last_day_of_the_month.html} | 0 .../calendar_suite.leap_years.html} | 0 ...ite.local_time_to_universal_time_dst.html} | 0 .../calendar_suite.rfc3339.html} | 0 .../calendar_suite.src.html} | 0 .../calendar_suite.system_time.html} | 0 .../run.2024-09-12_10.33.01}/cover.html | 0 .../ct_framework.end_per_group.133.html} | 0 .../ct_framework.end_per_group.1826.html} | 0 .../ct_framework.end_per_group.19710434.html} | 0 .../ct_framework.end_per_group.35426.html} | 0 .../ct_framework.end_per_group.35778.html} | 0 .../ct_framework.end_per_group.36.html} | 0 .../ct_framework.end_per_group.36322.html} | 0 .../ct_framework.end_per_group.36546.html} | 0 .../ct_framework.end_per_group.36866.html} | 0 .../ct_framework.end_per_group.36898.html} | 0 .../ct_framework.end_per_group.408419.html} | 0 .../ct_framework.end_per_group.40930.html} | 0 .../ct_framework.end_per_group.40994.html} | 0 .../ct_framework.end_per_group.504962.html} | 0 .../ct_framework.end_per_group.505154.html} | 0 .../ct_framework.end_per_group.html} | 0 .../ct_framework.end_per_suite.1858.html} | 0 .../ct_framework.end_per_suite.19710466.html} | 0 .../ct_framework.end_per_suite.19710562.html} | 0 .../ct_framework.end_per_suite.19715490.html} | 0 .../ct_framework.end_per_suite.19718082.html} | 0 .../ct_framework.end_per_suite.19718146.html} | 0 .../ct_framework.end_per_suite.19721890.html} | 0 .../ct_framework.end_per_suite.34754.html} | 0 .../ct_framework.end_per_suite.408451.html} | 0 .../ct_framework.end_per_suite.41026.html} | 0 .../ct_framework.end_per_suite.491618.html} | 0 .../ct_framework.end_per_suite.493218.html} | 0 .../ct_framework.end_per_suite.497570.html} | 0 .../ct_framework.end_per_suite.html} | 0 .../ct_framework.init_per_group.1538.html} | 0 .../ct_framework.init_per_group.1634.html} | 0 ...ct_framework.init_per_group.19710306.html} | 0 ...ct_framework.init_per_group.19717922.html} | 0 .../ct_framework.init_per_group.34786.html} | 0 .../ct_framework.init_per_group.35458.html} | 0 .../ct_framework.init_per_group.35490.html} | 0 .../ct_framework.init_per_group.35810.html} | 0 .../ct_framework.init_per_group.36354.html} | 0 .../ct_framework.init_per_group.36578.html} | 0 .../ct_framework.init_per_group.37.html} | 0 .../ct_framework.init_per_group.40962.html} | 0 .../ct_framework.init_per_group.504610.html} | 0 .../ct_framework.init_per_group.504994.html} | 0 .../ct_framework.init_per_group.741.html} | 0 .../ct_framework.init_per_group.html} | 0 ...ct_framework.init_per_suite.19710498.html} | 0 ...ct_framework.init_per_suite.19714626.html} | 0 ...ct_framework.init_per_suite.19717890.html} | 0 ...ct_framework.init_per_suite.19718114.html} | 0 ...ct_framework.init_per_suite.19721858.html} | 0 .../ct_framework.init_per_suite.259.html} | 0 .../ct_framework.init_per_suite.2658.html} | 0 .../ct_framework.init_per_suite.408483.html} | 0 .../ct_framework.init_per_suite.491042.html} | 0 .../ct_framework.init_per_suite.492642.html} | 0 .../ct_framework.init_per_suite.497442.html} | 0 .../ct_framework.init_per_suite.502242.html} | 0 .../ct_framework.init_per_suite.709.html} | 0 .../ct_framework.init_per_suite.html} | 0 .../dets_suite.access.html} | 0 .../dets_suite.badarg.html} | 0 .../dets_suite.bag_next.html} | 0 .../dets_suite.bags.html} | 0 .../dets_suite.basic.html} | 0 .../dets_suite.cache_bags.html} | 0 .../dets_suite.cache_duplicate_bags.html} | 0 .../dets_suite.cache_sets.html} | 0 .../dets_suite.dirty_mark.html} | 0 .../dets_suite.dirty_mark2.html} | 0 .../dets_suite.duplicate_bags.html} | 0 .../dets_suite.end_per_suite.html} | 0 .../dets_suite.fixtable.html} | 0 .../dets_suite.fold.html} | 0 .../dets_suite.init_per_suite.html} | 0 .../dets_suite.init_table.html} | 0 .../dets_suite.insert_new.html} | 0 .../dets_suite.many_clients.html} | 0 .../dets_suite.match.html} | 0 .../dets_suite.newly_started.html} | 0 .../dets_suite.oldbugs.html} | 0 .../dets_suite.open.html} | 0 .../dets_suite.open_file.html} | 0 .../dets_suite.otp_11245.html} | 0 .../dets_suite.otp_11709.html} | 0 .../dets_suite.otp_13229.html} | 0 .../dets_suite.otp_13260.html} | 0 .../dets_suite.otp_13830.html} | 0 .../dets_suite.otp_4208.html} | 0 .../dets_suite.otp_4738.html} | 0 .../dets_suite.otp_4906.html} | 0 .../dets_suite.otp_4989.html} | 0 .../dets_suite.otp_5402.html} | 0 .../dets_suite.otp_5487.html} | 0 .../dets_suite.otp_6206.html} | 0 .../dets_suite.otp_6359.html} | 0 .../dets_suite.otp_7146.html} | 0 .../dets_suite.otp_8070.html} | 0 .../dets_suite.otp_8856.html} | 0 .../dets_suite.otp_8898.html} | 0 .../dets_suite.otp_8899.html} | 0 .../dets_suite.otp_8903.html} | 0 .../dets_suite.otp_8923.html} | 0 .../dets_suite.otp_9282.html} | 0 .../dets_suite.phash.html} | 0 .../dets_suite.receive_optimisation.html} | 0 .../dets_suite.repair.html} | 0 .../dets_suite.repair_continuation.html} | 0 .../dets_suite.select.html} | 0 .../dets_suite.sets.html} | 0 .../dets_suite.simultaneous_open.html} | 0 .../dets_suite.src.html} | 0 .../dets_suite.truncated_segment_array.html} | 0 .../dets_suite.update_counter.html} | 0 .../dict_suite.create.html} | 0 .../dict_suite.end_per_suite.html} | 0 .../dict_suite.init_per_suite.html} | 0 .../dict_suite.iterate.html} | 0 .../dict_suite.remove.html} | 0 .../dict_suite.src.html} | 0 .../dict_suite.store.html} | 0 .../digraph_suite.cycle.html} | 0 .../digraph_suite.data.html} | 0 .../digraph_suite.degree.html} | 0 .../digraph_suite.edges.html} | 0 .../digraph_suite.end_per_group.39458.html} | 0 .../digraph_suite.end_per_group.html} | 0 .../digraph_suite.end_per_suite.html} | 0 .../digraph_suite.init_per_group.39426.html} | 0 .../digraph_suite.init_per_group.html} | 0 .../digraph_suite.init_per_suite.html} | 0 .../digraph_suite.opts.html} | 0 .../digraph_suite.otp_3522.html} | 0 .../digraph_suite.otp_3630.html} | 0 .../digraph_suite.otp_8066.html} | 0 .../digraph_suite.path.html} | 0 .../digraph_suite.src.html} | 0 .../digraph_suite.vertex_names.39490.html} | 0 .../digraph_suite.vertex_names.html} | 0 .../digraph_suite.vertices.html} | 0 .../digraph_utils_suite.condensation.html} | 0 .../digraph_utils_suite.end_per_suite.html} | 0 .../digraph_utils_suite.init_per_suite.html} | 0 .../digraph_utils_suite.isolated.html} | 0 .../digraph_utils_suite.loop.html} | 0 .../digraph_utils_suite.simple.html} | 0 .../digraph_utils_suite.src.html} | 0 .../digraph_utils_suite.subgraph.html} | 0 .../digraph_utils_suite.topsort.html} | 0 .../digraph_utils_suite.tree.html} | 0 .../edlin_context_suite.end_per_suite.html} | 0 .../edlin_context_suite.get_context.html} | 0 .../edlin_context_suite.init_per_suite.html} | 0 .../edlin_context_suite.src.html} | 0 ...dlin_expand_suite.binding_completion.html} | 0 .../edlin_expand_suite.check_trailing.html} | 0 .../edlin_expand_suite.end_per_suite.html} | 0 .../edlin_expand_suite.erl_1152.html} | 0 ...lin_expand_suite.filename_completion.html} | 0 .../edlin_expand_suite.fun_completion.html} | 0 ..._suite.function_parameter_completion.html} | 0 .../edlin_expand_suite.get_coverage.html} | 0 .../edlin_expand_suite.init_per_suite.html} | 0 .../edlin_expand_suite.invalid_module.html} | 0 .../edlin_expand_suite.map_completion.html} | 0 .../edlin_expand_suite.no_completion.html} | 0 .../edlin_expand_suite.normal.html} | 0 .../edlin_expand_suite.quoted_both.html} | 0 .../edlin_expand_suite.quoted_fun.html} | 0 .../edlin_expand_suite.quoted_module.html} | 0 ...edlin_expand_suite.record_completion.html} | 0 .../edlin_expand_suite.src.html} | 0 .../edlin_expand_suite.type_completion.html} | 0 .../edlin_expand_suite.unicode.html} | 0 .../epp_suite.deterministic_include.html} | 0 .../epp_suite.encoding.html} | 0 .../epp_suite.end_per_group.39554.html} | 0 .../epp_suite.end_per_group.html} | 0 .../epp_suite.end_per_suite.html} | 0 .../epp_suite.extends.html} | 0 .../epp_suite.file_macro.html} | 0 .../epp_suite.function_macro.html} | 0 .../epp_suite.gh_4995.html} | 0 .../epp_suite.gh_8268.html} | 0 .../epp_suite.include_local.html} | 0 .../epp_suite.init_per_group.39522.html} | 0 .../epp_suite.init_per_group.html} | 0 .../epp_suite.init_per_suite.html} | 0 .../epp_suite.moduledoc_include.html} | 0 .../epp_suite.nondeterministic_include.html} | 0 .../epp_suite.not_circular.html} | 0 .../epp_suite.otp_10302.html} | 0 .../epp_suite.otp_10820.html} | 0 .../epp_suite.otp_11728.html} | 0 .../epp_suite.otp_14285.html} | 0 .../epp_suite.otp_16824.html} | 0 .../epp_suite.otp_16978.html} | 0 .../epp_suite.otp_4870.html} | 0 .../epp_suite.otp_4871.html} | 0 .../epp_suite.otp_5362.html} | 0 .../epp_suite.otp_6277.html} | 0 .../epp_suite.otp_7702.html} | 0 .../epp_suite.otp_8130.html} | 0 .../epp_suite.otp_8388.html} | 0 .../epp_suite.otp_8470.html} | 0 .../epp_suite.otp_8562.html} | 0 .../epp_suite.otp_8665.html} | 0 .../epp_suite.otp_8911.html} | 0 .../epp_suite.overload_mac.html} | 0 .../epp_suite.pmod.html} | 0 .../epp_suite.predef_mac.html} | 0 .../epp_suite.rec_1.html} | 0 .../epp_suite.scan_file.html} | 0 .../epp_suite.skip_header.html} | 0 .../epp_suite.source_name.html} | 0 .../epp_suite.src.html} | 0 .../epp_suite.test_error.html} | 0 .../epp_suite.test_if.html} | 0 .../epp_suite.test_warning.html} | 0 .../epp_suite.upcase_mac_1.html} | 0 .../epp_suite.upcase_mac_2.html} | 0 .../epp_suite.variable_1.html} | 0 .../erl_anno_suite.bad.html} | 0 .../erl_anno_suite.end_location.html} | 0 .../erl_anno_suite.end_per_group.40898.html} | 0 .../erl_anno_suite.end_per_group.html} | 0 .../erl_anno_suite.end_per_suite.html} | 0 .../erl_anno_suite.file.html} | 0 .../erl_anno_suite.generated.html} | 0 .../erl_anno_suite.init_per_group.40866.html} | 0 .../erl_anno_suite.init_per_group.html} | 0 .../erl_anno_suite.init_per_suite.html} | 0 .../erl_anno_suite.is_anno.html} | 0 .../erl_anno_suite.line.html} | 0 .../erl_anno_suite.location.html} | 0 .../erl_anno_suite.mapfold_anno.html} | 0 .../erl_anno_suite.new.html} | 0 .../erl_anno_suite.parse_abstract.html} | 0 .../erl_anno_suite.record.html} | 0 .../erl_anno_suite.src.html} | 0 .../erl_anno_suite.text.html} | 0 .../erl_eval_suite.apply_atom.html} | 0 ...rl_eval_suite.binary_and_map_aliases.html} | 0 .../erl_eval_suite.custom_stacktrace.html} | 0 .../erl_eval_suite.eep37.html} | 0 .../erl_eval_suite.eep43.html} | 0 .../erl_eval_suite.eep49.html} | 0 .../erl_eval_suite.eep58.html} | 0 .../erl_eval_suite.end_per_suite.html} | 0 .../erl_eval_suite.eval_expr_5.html} | 0 .../erl_eval_suite.funs.html} | 0 .../erl_eval_suite.guard_1.html} | 0 .../erl_eval_suite.guard_2.html} | 0 .../erl_eval_suite.guard_3.html} | 0 .../erl_eval_suite.guard_4.html} | 0 .../erl_eval_suite.guard_5.html} | 0 .../erl_eval_suite.init_per_suite.html} | 0 .../erl_eval_suite.lc.html} | 0 .../erl_eval_suite.match_bin.html} | 0 .../erl_eval_suite.match_pattern.html} | 0 .../erl_eval_suite.otp_10622.html} | 0 .../erl_eval_suite.otp_13228.html} | 0 .../erl_eval_suite.otp_14708.html} | 0 .../erl_eval_suite.otp_14826.html} | 0 .../erl_eval_suite.otp_15035.html} | 0 .../erl_eval_suite.otp_16439.html} | 0 .../erl_eval_suite.otp_16545.html} | 0 .../erl_eval_suite.otp_16865.html} | 0 .../erl_eval_suite.otp_5269.html} | 0 .../erl_eval_suite.otp_6539.html} | 0 .../erl_eval_suite.otp_6543.html} | 0 .../erl_eval_suite.otp_6787.html} | 0 .../erl_eval_suite.otp_6977.html} | 0 .../erl_eval_suite.otp_7550.html} | 0 .../erl_eval_suite.otp_8133.html} | 0 .../erl_eval_suite.pattern_expr.html} | 0 .../erl_eval_suite.simple_cases.html} | 0 .../erl_eval_suite.src.html} | 0 .../erl_eval_suite.string_plusplus.html} | 0 .../erl_eval_suite.try_catch.html} | 0 .../erl_eval_suite.unary_plus.html} | 0 .../erl_eval_suite.zero_width.html} | 0 .../erl_expand_records_suite.attributes.html} | 0 ...l_expand_records_suite.end_per_group.html} | 0 ...l_expand_records_suite.end_per_suite.html} | 0 .../erl_expand_records_suite.expr.html} | 0 .../erl_expand_records_suite.guard.html} | 0 .../erl_expand_records_suite.init.html} | 0 ..._expand_records_suite.init_per_group.html} | 0 ..._expand_records_suite.init_per_suite.html} | 0 .../erl_expand_records_suite.maps.html} | 0 .../erl_expand_records_suite.otp_5915.html} | 0 .../erl_expand_records_suite.otp_5990.html} | 0 .../erl_expand_records_suite.otp_7078.html} | 0 .../erl_expand_records_suite.otp_7931.html} | 0 .../erl_expand_records_suite.pattern.html} | 0 ...rl_expand_records_suite.side_effects.html} | 0 .../erl_expand_records_suite.src.html} | 0 .../erl_expand_records_suite.strict.html} | 0 .../erl_expand_records_suite.update.html} | 0 .../erl_internal_suite.behav.html} | 0 .../erl_internal_suite.end_per_suite.html} | 0 .../erl_internal_suite.init_per_suite.html} | 0 .../erl_internal_suite.src.html} | 0 .../erl_lint_suite.basic_errors.html} | 0 .../erl_lint_suite.behaviour_basic.html} | 0 .../erl_lint_suite.behaviour_multiple.html} | 0 .../erl_lint_suite.bif_clash.html} | 0 .../erl_lint_suite.bin_syntax_errors.html} | 0 .../erl_lint_suite.binary_aliases.html} | 0 .../erl_lint_suite.binary_types.html} | 0 ..._lint_suite.documentation_attributes.html} | 0 .../erl_lint_suite.eep49.html} | 0 .../erl_lint_suite.export_all.html} | 0 .../erl_lint_suite.export_vars_warn.html} | 0 .../erl_lint_suite.external_funs.html} | 0 .../erl_lint_suite.format_warn.html} | 0 .../erl_lint_suite.guard.html} | 0 .../erl_lint_suite.illegal_module_name.html} | 0 .../erl_lint_suite.inline_nifs.html} | 0 .../erl_lint_suite.maps.html} | 0 .../erl_lint_suite.maps_parallel_match.html} | 0 .../erl_lint_suite.maps_type.html} | 0 .../erl_lint_suite.match_float_zero.html} | 0 ...suite.messages_with_jaro_suggestions.html} | 0 .../erl_lint_suite.no_load_nif.html} | 0 .../erl_lint_suite.non_latin1_module.html} | 0 .../erl_lint_suite.on_load_failing.html} | 0 .../erl_lint_suite.on_load_successful.html} | 0 .../erl_lint_suite.otp_10436.html} | 0 .../erl_lint_suite.otp_11254.html} | 0 .../erl_lint_suite.otp_11771.html} | 0 .../erl_lint_suite.otp_11772.html} | 0 .../erl_lint_suite.otp_11851.html} | 0 .../erl_lint_suite.otp_11861.html} | 0 .../erl_lint_suite.otp_11872.html} | 0 .../erl_lint_suite.otp_11879.html} | 0 .../erl_lint_suite.otp_11879_cont.html} | 0 .../erl_lint_suite.otp_13230.html} | 0 .../erl_lint_suite.otp_14285.html} | 0 .../erl_lint_suite.otp_14323.html} | 0 .../erl_lint_suite.otp_14378.html} | 0 .../erl_lint_suite.otp_15456.html} | 0 .../erl_lint_suite.otp_15563.html} | 0 .../erl_lint_suite.otp_16516.html} | 0 .../erl_lint_suite.otp_16824.html} | 0 .../erl_lint_suite.otp_4886.html} | 0 .../erl_lint_suite.otp_4988.html} | 0 .../erl_lint_suite.otp_5091.html} | 0 .../erl_lint_suite.otp_5276.html} | 0 .../erl_lint_suite.otp_5338.html} | 0 .../erl_lint_suite.otp_5362.html} | 0 .../erl_lint_suite.otp_5371.html} | 0 .../erl_lint_suite.otp_5494.html} | 0 .../erl_lint_suite.otp_5644.html} | 0 .../erl_lint_suite.otp_5878.html} | 0 .../erl_lint_suite.otp_5917.html} | 0 .../erl_lint_suite.otp_6585.html} | 0 .../erl_lint_suite.otp_6885.html} | 0 .../erl_lint_suite.otp_7227.html} | 0 .../erl_lint_suite.otp_7550.html} | 0 .../erl_lint_suite.otp_8051.html} | 0 .../erl_lint_suite.predef.html} | 0 .../erl_lint_suite.record_errors.html} | 0 ...rl_lint_suite.redefined_builtin_type.html} | 0 .../erl_lint_suite.removed.html} | 0 .../erl_lint_suite.shadow_vars.html} | 0 ...lint_suite.singleton_type_var_errors.html} | 0 .../erl_lint_suite.src.html} | 0 .../erl_lint_suite.stacktrace_syntax.html} | 0 .../erl_lint_suite.tilde_k.html} | 0 .../erl_lint_suite.too_many_arguments.html} | 0 .../erl_lint_suite.undefined_module.html} | 0 .../erl_lint_suite.undefined_nifs.html} | 0 .../erl_lint_suite.underscore_match.html} | 0 .../erl_lint_suite.unsafe_vars.html} | 0 .../erl_lint_suite.unsafe_vars2.html} | 0 .../erl_lint_suite.unsafe_vars_try.html} | 0 ...te.unsized_binary_in_bin_gen_pattern.html} | 0 .../erl_lint_suite.unused_function.html} | 0 .../erl_lint_suite.unused_import.html} | 0 .../erl_lint_suite.unused_record.html} | 0 .../erl_lint_suite.unused_type.html} | 0 .../erl_lint_suite.unused_type2.html} | 0 ...l_lint_suite.unused_unsafe_vars_warn.html} | 0 .../erl_lint_suite.unused_vars_otp_4858.html} | 0 ...rl_lint_suite.unused_vars_warn_basic.html} | 0 .../erl_lint_suite.unused_vars_warn_fun.html} | 0 .../erl_lint_suite.unused_vars_warn_lc.html} | 0 .../erl_lint_suite.unused_vars_warn_rec.html} | 0 .../erl_lint_suite.update_literal.html} | 0 .../erl_lint_suite.warn_missing_spec.html} | 0 .../erl_pp_suite.bits.html} | 0 .../erl_pp_suite.block.html} | 0 .../erl_pp_suite.call.html} | 0 .../erl_pp_suite.case1.html} | 0 .../erl_pp_suite.cond1.html} | 0 .../erl_pp_suite.dialyzer_attrs.html} | 0 .../erl_pp_suite.eep49.html} | 0 .../erl_pp_suite.eep58.html} | 0 .../erl_pp_suite.end_per_group.41090.html} | 0 .../erl_pp_suite.end_per_group.41410.html} | 0 .../erl_pp_suite.end_per_group.html} | 0 .../erl_pp_suite.end_per_suite.html} | 0 .../erl_pp_suite.form_vars.html} | 0 .../erl_pp_suite.format_options.html} | 0 .../erl_pp_suite.func.html} | 0 .../erl_pp_suite.gh_5093.html} | 0 .../erl_pp_suite.head_tail.html} | 0 .../erl_pp_suite.hook.html} | 0 .../erl_pp_suite.if_then.html} | 0 .../erl_pp_suite.import_export.html} | 0 .../erl_pp_suite.init_per_group.41058.html} | 0 .../erl_pp_suite.init_per_group.41122.html} | 0 .../erl_pp_suite.init_per_group.html} | 0 .../erl_pp_suite.init_per_suite.html} | 0 .../erl_pp_suite.maps_syntax.html} | 0 .../erl_pp_suite.messages.html} | 0 .../erl_pp_suite.misc_attrs.html} | 0 .../erl_pp_suite.neg_indent.html} | 0 .../erl_pp_suite.ops.html} | 0 .../erl_pp_suite.otp_10302.html} | 0 .../erl_pp_suite.otp_10820.html} | 0 .../erl_pp_suite.otp_11100.html} | 0 .../erl_pp_suite.otp_11861.html} | 0 .../erl_pp_suite.otp_13662.html} | 0 .../erl_pp_suite.otp_14285.html} | 0 .../erl_pp_suite.otp_15592.html} | 0 .../erl_pp_suite.otp_15751.html} | 0 .../erl_pp_suite.otp_15755.html} | 0 .../erl_pp_suite.otp_16435.html} | 0 .../erl_pp_suite.otp_6321.html} | 0 .../erl_pp_suite.otp_6911.html} | 0 .../erl_pp_suite.otp_6914.html} | 0 .../erl_pp_suite.otp_8150.html} | 0 .../erl_pp_suite.otp_8238.html} | 0 .../erl_pp_suite.otp_8473.html} | 0 .../erl_pp_suite.otp_8522.html} | 0 .../erl_pp_suite.otp_8567.html} | 0 .../erl_pp_suite.otp_8664.html} | 0 .../erl_pp_suite.otp_9147.html} | 0 .../erl_pp_suite.pr_1014.html} | 0 .../erl_pp_suite.quoted_atom_types.html} | 0 .../erl_pp_suite.receive_after.html} | 0 .../erl_pp_suite.recs.html} | 0 .../erl_pp_suite.src.html} | 0 .../erl_pp_suite.try_catch.html} | 0 .../erl_scan_suite.end_per_group.html} | 0 .../erl_scan_suite.end_per_suite.html} | 0 .../erl_scan_suite.error_1.html} | 0 .../erl_scan_suite.error_2.html} | 0 .../erl_scan_suite.init_per_group.html} | 0 .../erl_scan_suite.init_per_suite.html} | 0 .../erl_scan_suite.iso88591.html} | 0 .../erl_scan_suite.otp_10302.html} | 0 .../erl_scan_suite.otp_10990.html} | 0 .../erl_scan_suite.otp_10992.html} | 0 .../erl_scan_suite.otp_11807.html} | 0 .../erl_scan_suite.otp_16480.html} | 0 .../erl_scan_suite.otp_17024.html} | 0 .../erl_scan_suite.otp_7810.html} | 0 .../erl_scan_suite.src.html} | 0 .../erl_scan_suite.text_fun.html} | 0 .../erl_scan_suite.triple_quoted_string.html} | 0 .../error_logger_h_suite.end_per_suite.html} | 0 .../error_logger_h_suite.init_per_suite.html} | 0 .../error_logger_h_suite.logfile.html} | 0 ...ror_logger_h_suite.logfile_truncated.html} | 0 .../error_logger_h_suite.src.html} | 0 .../error_logger_h_suite.tty.html} | 0 .../error_logger_h_suite.tty_truncated.html} | 0 .../escript_suite.archive_script.html} | 0 ...ipt_suite.archive_script_file_access.html} | 0 .../escript_suite.bad_io_server.html} | 0 .../escript_suite.basic.html} | 0 .../escript_suite.beam_script.html} | 0 .../escript_suite.create_and_extract.html} | 0 .../escript_suite.emulator_flags.html} | 0 ...ript_suite.emulator_flags_no_shebang.html} | 0 .../escript_suite.end_per_suite.html} | 0 .../escript_suite.epp.html} | 0 .../escript_suite.errors.html} | 0 .../escript_suite.foldl.html} | 0 .../escript_suite.init_per_suite.html} | 0 .../escript_suite.module_script.html} | 0 .../escript_suite.overflow.html} | 0 .../escript_suite.src.html} | 0 .../escript_suite.strange_name.html} | 0 .../escript_suite.two_lines.html} | 0 .../escript_suite.unicode.html} | 0 ...ts_property_test_suite.end_per_suite.html} | 0 .../ets_property_test_suite.first_case.html} | 0 ...s_property_test_suite.init_per_suite.html} | 0 .../ets_property_test_suite.last_case.html} | 0 .../ets_property_test_suite.next_case.html} | 0 .../ets_property_test_suite.prev_case.html} | 0 .../ets_property_test_suite.src.html} | 0 .../ets_suite.bad_table.html} | 0 .../ets_suite.baddelete.html} | 0 .../ets_suite.badfile.html} | 0 .../ets_suite.badinsert.html} | 0 .../ets_suite.badlookup.html} | 0 .../ets_suite.badnew.html} | 0 .../ets_suite.bound_maps.html} | 0 .../ets_suite.compress_magic_ref.html} | 0 .../ets_suite.default.html} | 0 .../ets_suite.delete_elem.html} | 0 .../ets_suite.delete_large_named_table.html} | 0 .../ets_suite.delete_large_tab.html} | 0 .../ets_suite.delete_tab.html} | 0 .../ets_suite.delete_unfix_race.html} | 0 .../ets_suite.dups.html} | 0 .../ets_suite.empty.html} | 0 .../ets_suite.end_per_group.41954.html} | 0 .../ets_suite.end_per_group.42082.html} | 0 .../ets_suite.end_per_group.42690.html} | 0 .../ets_suite.end_per_group.43074.html} | 0 .../ets_suite.end_per_group.43234.html} | 0 .../ets_suite.end_per_group.43426.html} | 0 .../ets_suite.end_per_group.43714.html} | 0 .../ets_suite.end_per_group.43874.html} | 0 .../ets_suite.end_per_group.44226.html} | 0 .../ets_suite.end_per_group.49026.html} | 0 .../ets_suite.end_per_group.50658.html} | 0 .../ets_suite.end_per_group.html} | 0 .../ets_suite.end_per_suite.html} | 0 .../ets_suite.error_info.html} | 0 .../ets_suite.ets_all.html} | 0 .../ets_suite.evil_delete.html} | 0 .../ets_suite.evil_rename.html} | 0 .../ets_suite.evil_update_counter.html} | 0 .../ets_suite.exit_large_table_owner.html} | 0 ...ts_suite.exit_many_large_table_owner.html} | 0 ...ts_suite.exit_many_many_tables_owner.html} | 0 .../ets_suite.exit_many_tables_owner.html} | 0 .../ets_suite.firstnext.html} | 0 .../ets_suite.firstnext_concurrent.html} | 0 .../ets_suite.firstnext_lookup.html} | 0 ...ts_suite.firstnext_lookup_concurrent.html} | 0 .../ets_suite.fixtable_insert.html} | 0 .../ets_suite.fixtable_iter_bag.html} | 0 .../ets_suite.fixtable_next.html} | 0 .../ets_suite.fold_badarg.html} | 0 .../ets_suite.fold_empty.html} | 0 .../ets_suite.foldl.html} | 0 .../ets_suite.foldl_ordered.html} | 0 .../ets_suite.foldr.html} | 0 .../ets_suite.foldr_ordered.html} | 0 .../ets_suite.give_away.html} | 0 .../ets_suite.grow_pseudo_deleted.html} | 0 .../ets_suite.grow_shrink.html} | 0 .../ets_suite.hash_clash.html} | 0 .../ets_suite.heavy_concurrent.html} | 0 .../ets_suite.heavy_lookup.html} | 0 .../ets_suite.heavy_lookup_element.html} | 0 .../ets_suite.heir.html} | 0 .../ets_suite.info.html} | 0 .../ets_suite.info_binary_stress.html} | 0 .../ets_suite.info_whereis_busy.html} | 0 .../ets_suite.init_per_group.41858.html} | 0 .../ets_suite.init_per_group.41986.html} | 0 .../ets_suite.init_per_group.42114.html} | 0 .../ets_suite.init_per_group.42914.html} | 0 .../ets_suite.init_per_group.43138.html} | 0 .../ets_suite.init_per_group.43266.html} | 0 .../ets_suite.init_per_group.43458.html} | 0 .../ets_suite.init_per_group.43746.html} | 0 .../ets_suite.init_per_group.43906.html} | 0 .../ets_suite.init_per_group.48802.html} | 0 .../ets_suite.init_per_group.50530.html} | 0 .../ets_suite.init_per_group.html} | 0 .../ets_suite.init_per_suite.html} | 0 .../ets_suite.insert_trap_delete.html} | 0 .../ets_suite.insert_trap_rename.html} | 0 .../ets_suite.interface_equality.html} | 0 .../ets_suite.keypos2.html} | 0 .../ets_suite.lookup_element_default.html} | 0 .../ets_suite.lookup_element_mult.html} | 0 .../ets_suite.lookup_order.html} | 0 .../ets_suite.massive_ets_all.html} | 0 .../ets_suite.match1.html} | 0 .../ets_suite.match2.html} | 0 .../ets_suite.match_delete.html} | 0 .../ets_suite.match_delete3.html} | 0 .../ets_suite.match_heavy.html} | 0 .../ets_suite.match_object.html} | 0 .../ets_suite.match_object2.html} | 0 .../ets_suite.member.html} | 0 .../ets_suite.memory.html} | 0 .../ets_suite.meta_lookup_named_read.html} | 0 .../ets_suite.meta_lookup_named_write.html} | 0 .../ets_suite.meta_lookup_unnamed_read.html} | 0 .../ets_suite.meta_lookup_unnamed_write.html} | 0 .../ets_suite.meta_newdel_named.html} | 0 .../ets_suite.meta_newdel_unnamed.html} | 0 .../ets_suite.meta_wb.html} | 0 .../ets_suite.misc1.html} | 0 .../ets_suite.ms_excessive_nesting.html} | 0 .../ets_suite.named.html} | 0 .../ets_suite.ordered.html} | 0 .../ets_suite.ordered_match.html} | 0 .../ets_suite.otp_10182.html} | 0 .../ets_suite.otp_5340.html} | 0 .../ets_suite.otp_6338.html} | 0 .../ets_suite.otp_6842_select_1000.html} | 0 .../ets_suite.otp_7665.html} | 0 .../ets_suite.otp_8166.html} | 0 .../ets_suite.otp_8732.html} | 0 .../ets_suite.otp_9423.html} | 0 .../ets_suite.otp_9932.html} | 0 .../ets_suite.partly_bound.html} | 0 .../ets_suite.privacy.html} | 0 .../ets_suite.rename.html} | 0 .../ets_suite.rename_unnamed.html} | 0 .../ets_suite.safe_fixtable.html} | 0 .../ets_suite.select_bound_chunk.html} | 0 .../ets_suite.select_fail.html} | 0 ...ets_suite.select_fixtab_owner_change.html} | 0 .../ets_suite.select_mbuf_trapping.html} | 0 .../ets_suite.setbag.html} | 0 .../ets_suite.setopts.html} | 0 .../ets_suite.shrink_pseudo_deleted.html} | 0 .../ets_suite.slot.html} | 0 .../ets_suite.smp_fixed_delete.html} | 0 .../ets_suite.smp_insert.html} | 0 .../ets_suite.smp_ordered_iteration.html} | 0 .../ets_suite.smp_select_delete.html} | 0 .../ets_suite.smp_select_replace.html} | 0 .../ets_suite.smp_unfix_fix.html} | 0 .../ets_suite.src.html} | 0 .../ets_suite.t_bucket_disappears.html} | 0 .../ets_suite.t_delete_all_objects.html} | 0 .../ets_suite.t_delete_all_objects_trap.html} | 0 .../ets_suite.t_delete_object.html} | 0 .../ets_suite.t_ets_dets.html} | 0 .../ets_suite.t_init_table.html} | 0 .../ets_suite.t_insert_list.html} | 0 .../ets_suite.t_insert_list_bag.html} | 0 ..._suite.t_insert_list_delete_parallel.html} | 0 .../ets_suite.t_insert_list_delete_set.html} | 0 ...ts_suite.t_insert_list_duplicate_bag.html} | 0 ...t_insert_list_insert_order_preserved.html} | 0 ...ets_suite.t_insert_list_kill_process.html} | 0 .../ets_suite.t_insert_list_parallel.html} | 0 .../ets_suite.t_insert_list_set.html} | 0 .../ets_suite.t_insert_new.html} | 0 .../ets_suite.t_match_spec_run.html} | 0 .../ets_suite.t_named_select.html} | 0 .../ets_suite.t_repair_continuation.html} | 0 .../ets_suite.t_select_delete.html} | 0 ...suite.t_select_flatmap_term_copy_bug.html} | 0 ...suite.t_select_hashmap_term_copy_bug.html} | 0 ...uite.t_select_pam_stack_overflow_bug.html} | 0 .../ets_suite.t_select_replace.html} | 0 .../ets_suite.t_select_replace_next_bug.html} | 0 .../ets_suite.t_select_reverse.html} | 0 .../ets_suite.t_test_ms.html} | 0 .../ets_suite.t_whitebox.html} | 0 .../ets_suite.tab2file.html} | 0 .../ets_suite.tab2file2.html} | 0 .../ets_suite.tab2list.html} | 0 .../ets_suite.tabfile_ext1.html} | 0 .../ets_suite.tabfile_ext2.html} | 0 .../ets_suite.tabfile_ext3.html} | 0 .../ets_suite.tabfile_ext4.html} | 0 .../ets_suite.table_leak.html} | 0 .../ets_suite.take.html} | 0 ....test_decentralized_counters_setting.html} | 0 ...est_delete_table_while_size_snapshot.html} | 0 ..._suite.test_table_memory_concurrency.html} | 0 ...ts_suite.test_table_size_concurrency.html} | 0 .../ets_suite.test_throughput_benchmark.html} | 0 .../ets_suite.types.html} | 0 .../ets_suite.update_counter.html} | 0 ...ts_suite.update_counter_table_growth.html} | 0 ...ts_suite.update_counter_with_default.html} | 0 ....update_counter_with_default_bad_pos.html} | 0 .../ets_suite.update_element.html} | 0 .../ets_suite.update_element_default.html} | 0 .../ets_suite.verybadnew.html} | 0 .../ets_suite.whereis_table.html} | 0 .../ets_suite.write_concurrency.html} | 0 .../ets_tough_suite.end_per_suite.html} | 0 .../ets_tough_suite.ex1.html} | 0 .../ets_tough_suite.init_per_suite.html} | 0 .../ets_tough_suite.src.html} | 0 .../file_sorter_suite.badarg.html} | 0 .../file_sorter_suite.basic.html} | 0 .../file_sorter_suite.binary_check.html} | 0 .../file_sorter_suite.binary_merge.html} | 0 .../file_sorter_suite.binary_sort.html} | 0 .../file_sorter_suite.binary_term_check.html} | 0 ...er_suite.binary_term_keycheck.484290.html} | 0 ...le_sorter_suite.binary_term_keycheck.html} | 0 ...le_sorter_suite.binary_term_keymerge.html} | 0 ...ile_sorter_suite.binary_term_keysort.html} | 0 .../file_sorter_suite.binary_term_merge.html} | 0 .../file_sorter_suite.binary_term_sort.html} | 0 .../file_sorter_suite.end_per_suite.html} | 0 .../file_sorter_suite.init_per_suite.html} | 0 .../file_sorter_suite.inout.html} | 0 .../file_sorter_suite.many.html} | 0 .../file_sorter_suite.misc.html} | 0 .../file_sorter_suite.src.html} | 0 .../file_sorter_suite.term_check.html} | 0 .../file_sorter_suite.term_keymerge.html} | 0 .../file_sorter_suite.term_keysort.html} | 0 .../file_sorter_suite.term_merge.html} | 0 .../file_sorter_suite.term_sort.html} | 0 .../filelib_suite.end_per_suite.html} | 0 .../filelib_suite.ensure_dir_eexist.html} | 0 .../filelib_suite.ensure_dir_symlink.html} | 0 ...ilelib_suite.ensure_path_binary_args.html} | 0 ...lelib_suite.ensure_path_invalid_path.html} | 0 ...ilelib_suite.ensure_path_nested_dirs.html} | 0 ...elib_suite.ensure_path_relative_path.html} | 0 ...te.ensure_path_relative_path_dot_dot.html} | 0 ...filelib_suite.ensure_path_single_dir.html} | 0 .../filelib_suite.ensure_path_symlink.html} | 0 .../filelib_suite.file_props_symlink.html} | 0 .../filelib_suite.find_source.html} | 0 .../filelib_suite.find_source_otp.html} | 0 .../filelib_suite.find_source_subdir.html} | 0 .../filelib_suite.fold_files.html} | 0 .../filelib_suite.init_per_suite.html} | 0 .../filelib_suite.is_file_symlink.html} | 0 .../filelib_suite.otp_5960.html} | 0 .../filelib_suite.safe_relative_path.html} | 0 ...lelib_suite.safe_relative_path_links.html} | 0 .../filelib_suite.src.html} | 0 .../filelib_suite.wildcard_errors.html} | 0 .../filelib_suite.wildcard_one.html} | 0 .../filelib_suite.wildcard_symlink.html} | 0 .../filelib_suite.wildcard_two.html} | 0 .../filename_suite.absname.html} | 0 .../filename_suite.absname_2.html} | 0 .../filename_suite.absname_bin.html} | 0 .../filename_suite.absname_bin_2.html} | 0 .../filename_suite.basename_1.402275.html} | 0 .../filename_suite.basename_2.486658.html} | 0 ...filename_suite.basename_bin_1.486690.html} | 0 ...filename_suite.basename_bin_2.486722.html} | 0 .../filename_suite.dirname.486498.html} | 0 .../filename_suite.dirname_bin.486754.html} | 0 .../filename_suite.end_per_group.html} | 0 .../filename_suite.end_per_suite.html} | 0 .../filename_suite.extension.486530.html} | 0 .../filename_suite.extension_bin.486562.html} | 0 .../filename_suite.init_per_group.html} | 0 .../filename_suite.init_per_suite.html} | 0 .../filename_suite.join.486594.html} | 0 .../filename_suite.join_bin.486786.html} | 0 .../filename_suite.pathtype.486626.html} | 0 .../filename_suite.pathtype_bin.421732.html} | 0 .../filename_suite.rootname.421668.html} | 0 .../filename_suite.rootname_bin.421764.html} | 0 .../filename_suite.split.421700.html} | 0 .../filename_suite.split_bin.421796.html} | 0 .../filename_suite.src.html} | 0 .../filename_suite.t_basedir_api.421828.html} | 0 .../filename_suite.t_basedir_windows.html} | 0 .../filename_suite.t_basedir_xdg.html} | 0 .../filename_suite.t_nativename.402243.html} | 0 ...lename_suite.t_nativename_bin.402307.html} | 0 .../fixtable_suite.end_per_suite.html} | 0 .../fixtable_suite.fixbag.html} | 0 .../fixtable_suite.init_per_suite.html} | 0 .../fixtable_suite.insert_same_key.html} | 0 .../fixtable_suite.multiple_fixes.html} | 0 .../fixtable_suite.multiple_processes.html} | 0 .../fixtable_suite.other_process_closes.html} | 0 ...fixtable_suite.other_process_deletes.html} | 0 .../fixtable_suite.owner_dies.html} | 0 .../fixtable_suite.src.html} | 0 .../format_suite.end_per_suite.html} | 0 .../format_suite.hang_1.html} | 0 .../format_suite.init_per_suite.html} | 0 .../format_suite.src.html} | 0 ...gb_sets_property_test_suite.add_case.html} | 0 ...ets_property_test_suite.balance_case.html} | 0 ..._property_test_suite.delete_any_case.html} | 0 ...sets_property_test_suite.delete_case.html} | 0 ..._property_test_suite.difference_case.html} | 0 ...ts_property_test_suite.end_per_suite.html} | 0 ...property_test_suite.from_ordset_case.html} | 0 ...s_property_test_suite.init_per_suite.html} | 0 ...sets_property_test_suite.insert_case.html} | 0 ...s_property_test_suite.is_member_case.html} | 0 ...ts_property_test_suite.iterator_case.html} | 0 ...operty_test_suite.iterator_from_case.html} | 0 ...sets_property_test_suite.larger_case.html} | 0 ...ets_property_test_suite.largest_case.html} | 0 ...s_property_test_suite.singleton_case.html} | 0 ...ets_property_test_suite.smaller_case.html} | 0 ...ts_property_test_suite.smallest_case.html} | 0 .../gb_sets_property_test_suite.src.html} | 0 ...roperty_test_suite.take_largest_case.html} | 0 ...operty_test_suite.take_smallest_case.html} | 0 .../gen_event_suite.add_handler.html} | 0 .../gen_event_suite.add_sup_handler.html} | 0 .../gen_event_suite.auto_hibernate.html} | 0 .../gen_event_suite.call.html} | 0 .../gen_event_suite.call_format_status.html} | 0 ..._event_suite.call_format_status_anon.html} | 0 .../gen_event_suite.delete_handler.html} | 0 ...gen_event_suite.end_per_group.402339.html} | 0 .../gen_event_suite.end_per_group.html} | 0 .../gen_event_suite.end_per_suite.html} | 0 .../gen_event_suite.error_format_status.html} | 0 .../gen_event_suite.format_log_1.html} | 0 .../gen_event_suite.format_log_2.html} | 0 ..._suite.format_log_with_process_label.html} | 0 .../gen_event_suite.get_state.html} | 0 .../gen_event_suite.hibernate.html} | 0 .../gen_event_suite.info.html} | 0 ...en_event_suite.init_per_group.487362.html} | 0 .../gen_event_suite.init_per_group.html} | 0 .../gen_event_suite.init_per_suite.html} | 0 .../gen_event_suite.notify.html} | 0 .../gen_event_suite.replace_state.html} | 0 ....send_request_check_reqid_collection.html} | 0 ...end_request_receive_reqid_collection.html} | 0 ...e.send_request_wait_reqid_collection.html} | 0 .../gen_event_suite.src.html} | 0 .../gen_event_suite.start.html} | 0 .../gen_event_suite.start_opt.html} | 0 .../gen_event_suite.swap_handler.html} | 0 .../gen_event_suite.swap_sup_handler.html} | 0 .../gen_event_suite.sync_notify.html} | 0 .../gen_event_suite.undef_code_change.html} | 0 .../gen_event_suite.undef_handle_call.html} | 0 .../gen_event_suite.undef_handle_event.html} | 0 .../gen_event_suite.undef_handle_info.html} | 0 .../gen_event_suite.undef_in_terminate.html} | 0 .../gen_event_suite.undef_init.html} | 0 .../gen_event_suite.undef_terminate.html} | 0 .../gen_fsm_suite.abnormal1.html} | 0 .../gen_fsm_suite.abnormal2.html} | 0 .../gen_fsm_suite.auto_hibernate.html} | 0 .../gen_fsm_suite.call_format_status.html} | 0 .../gen_fsm_suite.end_per_group.402371.html} | 0 .../gen_fsm_suite.end_per_group.402435.html} | 0 .../gen_fsm_suite.end_per_group.421860.html} | 0 .../gen_fsm_suite.end_per_group.487458.html} | 0 .../gen_fsm_suite.end_per_group.html} | 0 .../gen_fsm_suite.end_per_suite.html} | 0 .../gen_fsm_suite.enter_loop.html} | 0 .../gen_fsm_suite.error_format_status.html} | 0 .../gen_fsm_suite.format_log_1.html} | 0 .../gen_fsm_suite.format_log_2.html} | 0 ..._suite.format_log_with_process_label.html} | 0 .../gen_fsm_suite.get_state.html} | 0 .../gen_fsm_suite.hibernate.html} | 0 .../gen_fsm_suite.init_per_group.402403.html} | 0 .../gen_fsm_suite.init_per_group.402467.html} | 0 .../gen_fsm_suite.init_per_group.487394.html} | 0 .../gen_fsm_suite.init_per_group.487426.html} | 0 .../gen_fsm_suite.init_per_group.html} | 0 .../gen_fsm_suite.init_per_suite.html} | 0 .../gen_fsm_suite.replace_state.html} | 0 ...sm_suite.reply_by_alias_with_payload.html} | 0 .../gen_fsm_suite.shutdown.html} | 0 .../gen_fsm_suite.src.html} | 0 .../gen_fsm_suite.start1.html} | 0 .../gen_fsm_suite.start10.html} | 0 .../gen_fsm_suite.start11.html} | 0 .../gen_fsm_suite.start12.html} | 0 .../gen_fsm_suite.start2.html} | 0 .../gen_fsm_suite.start3.html} | 0 .../gen_fsm_suite.start4.html} | 0 .../gen_fsm_suite.start5.html} | 0 .../gen_fsm_suite.start6.html} | 0 .../gen_fsm_suite.start7.html} | 0 .../gen_fsm_suite.start8.html} | 0 .../gen_fsm_suite.start9.html} | 0 .../gen_fsm_suite.sys1.html} | 0 ...gen_fsm_suite.terminate_crash_format.html} | 0 .../gen_fsm_suite.undef_code_change.html} | 0 .../gen_fsm_suite.undef_handle_event.html} | 0 .../gen_fsm_suite.undef_handle_info.html} | 0 ...en_fsm_suite.undef_handle_sync_event.html} | 0 .../gen_fsm_suite.undef_in_handle_info.html} | 0 .../gen_fsm_suite.undef_in_terminate.html} | 0 .../gen_fsm_suite.undef_init.html} | 0 .../gen_fsm_suite.undef_terminate1.html} | 0 .../gen_fsm_suite.undef_terminate2.html} | 0 .../gen_server_suite.abcast.html} | 0 .../gen_server_suite.auto_hibernate.html} | 0 .../gen_server_suite.call.html} | 0 .../gen_server_suite.call_format_status.html} | 0 .../gen_server_suite.call_remote1.html} | 0 .../gen_server_suite.call_remote2.html} | 0 .../gen_server_suite.call_remote3.html} | 0 .../gen_server_suite.call_remote_n1.html} | 0 .../gen_server_suite.call_remote_n2.html} | 0 .../gen_server_suite.call_remote_n3.html} | 0 ...r_suite.call_with_huge_message_queue.html} | 0 .../gen_server_suite.calling_self.html} | 0 .../gen_server_suite.cast.html} | 0 .../gen_server_suite.cast_fast.html} | 0 .../gen_server_suite.continue.html} | 0 .../gen_server_suite.crash.html} | 0 ..._server_suite.crash_in_format_status.html} | 0 ...en_server_suite.end_per_group.488418.html} | 0 ...en_server_suite.end_per_group.488834.html} | 0 ...en_server_suite.end_per_group.488866.html} | 0 ...en_server_suite.end_per_group.489442.html} | 0 ...en_server_suite.end_per_group.489506.html} | 0 .../gen_server_suite.end_per_group.html} | 0 .../gen_server_suite.end_per_suite.html} | 0 ...gen_server_suite.error_format_status.html} | 0 .../gen_server_suite.format_all_status.html} | 0 .../gen_server_suite.format_log_1.html} | 0 .../gen_server_suite.format_log_2.html} | 0 ..._suite.format_log_with_process_label.html} | 0 .../gen_server_suite.get_state.html} | 0 .../gen_server_suite.hibernate.html} | 0 .../gen_server_suite.info.html} | 0 ...n_server_suite.init_per_group.487874.html} | 0 ...n_server_suite.init_per_group.487906.html} | 0 ...n_server_suite.init_per_group.488450.html} | 0 ...n_server_suite.init_per_group.489410.html} | 0 ...n_server_suite.init_per_group.489474.html} | 0 .../gen_server_suite.init_per_group.html} | 0 .../gen_server_suite.init_per_suite.html} | 0 .../gen_server_suite.loop_start_fail.html} | 0 .../gen_server_suite.multicall.487938.html} | 0 ...n_server_suite.multicall_down.487970.html} | 0 ...uite.multicall_recv_opt_noconnection.html} | 0 ...ver_suite.multicall_recv_opt_success.html} | 0 ...ver_suite.multicall_recv_opt_timeout.html} | 0 ...server_suite.multicall_remote.488002.html} | 0 ...r_suite.multicall_remote_old2.402499.html} | 0 .../gen_server_suite.otp_5854.html} | 0 .../gen_server_suite.otp_7669.html} | 0 .../gen_server_suite.replace_state.html} | 0 ...er_suite.reply_by_alias_with_payload.html} | 0 .../gen_server_suite.send_request.html} | 0 ....send_request_check_reqid_collection.html} | 0 ...end_request_receive_reqid_collection.html} | 0 ...e.send_request_wait_reqid_collection.html} | 0 .../gen_server_suite.spec_init.html} | 0 ...e.spec_init_global_registered_parent.html} | 0 ...te.spec_init_local_registered_parent.html} | 0 .../gen_server_suite.src.html} | 0 .../gen_server_suite.start.html} | 0 .../gen_server_suite.stop1.html} | 0 .../gen_server_suite.stop10.html} | 0 .../gen_server_suite.stop2.html} | 0 .../gen_server_suite.stop3.html} | 0 .../gen_server_suite.stop4.html} | 0 .../gen_server_suite.stop5.html} | 0 .../gen_server_suite.stop6.html} | 0 .../gen_server_suite.stop7.html} | 0 .../gen_server_suite.stop8.html} | 0 .../gen_server_suite.stop9.html} | 0 ..._server_suite.terminate_crash_format.html} | 0 ..._server_suite.throw_in_format_status.html} | 0 .../gen_server_suite.undef_code_change.html} | 0 .../gen_server_suite.undef_handle_call.html} | 0 .../gen_server_suite.undef_handle_cast.html} | 0 ...n_server_suite.undef_handle_continue.html} | 0 .../gen_server_suite.undef_handle_info.html} | 0 ...en_server_suite.undef_in_handle_info.html} | 0 .../gen_server_suite.undef_in_terminate.html} | 0 .../gen_server_suite.undef_init.html} | 0 .../gen_server_suite.undef_terminate1.html} | 0 .../gen_server_suite.undef_terminate2.html} | 0 .../gen_statem_suite.abnormal1.490658.html} | 0 .../gen_statem_suite.abnormal1.html} | 0 ...n_statem_suite.abnormal1clean.490690.html} | 0 .../gen_statem_suite.abnormal1clean.html} | 0 ...n_statem_suite.abnormal1dirty.490722.html} | 0 .../gen_statem_suite.abnormal1dirty.html} | 0 .../gen_statem_suite.abnormal2.490754.html} | 0 .../gen_statem_suite.abnormal2.html} | 0 .../gen_statem_suite.abnormal3.490786.html} | 0 .../gen_statem_suite.abnormal3.html} | 0 .../gen_statem_suite.abnormal4.490818.html} | 0 .../gen_statem_suite.abnormal4.html} | 0 .../gen_statem_suite.auto_hibernate.html} | 0 .../gen_statem_suite.call_format_status.html} | 0 .../gen_statem_suite.code_change.html} | 0 ...en_statem_suite.end_per_group.403107.html} | 0 ...en_statem_suite.end_per_group.421892.html} | 0 ...en_statem_suite.end_per_group.421924.html} | 0 ...en_statem_suite.end_per_group.490018.html} | 0 ...en_statem_suite.end_per_group.490210.html} | 0 ...en_statem_suite.end_per_group.490530.html} | 0 ...en_statem_suite.end_per_group.490594.html} | 0 ...en_statem_suite.end_per_group.490946.html} | 0 ...en_statem_suite.end_per_group.491010.html} | 0 .../gen_statem_suite.end_per_group.html} | 0 .../gen_statem_suite.end_per_suite.html} | 0 .../gen_statem_suite.enter_loop.html} | 0 ...gen_statem_suite.error_format_status.html} | 0 .../gen_statem_suite.event_order.html} | 0 .../gen_statem_suite.event_types.html} | 0 .../gen_statem_suite.format_all_status.html} | 0 .../gen_statem_suite.format_log_1.html} | 0 .../gen_statem_suite.format_log_2.html} | 0 ..._suite.format_log_with_process_label.html} | 0 .../gen_statem_suite.generic_timers.html} | 0 .../gen_statem_suite.get_state.html} | 0 .../gen_statem_suite.hibernate.html} | 0 ...n_statem_suite.init_per_group.489538.html} | 0 ...n_statem_suite.init_per_group.490050.html} | 0 ...n_statem_suite.init_per_group.490242.html} | 0 ...n_statem_suite.init_per_group.490562.html} | 0 ...n_statem_suite.init_per_group.490626.html} | 0 ...n_statem_suite.init_per_group.490850.html} | 0 ...n_statem_suite.init_per_group.490882.html} | 0 ...n_statem_suite.init_per_group.490914.html} | 0 ...n_statem_suite.init_per_group.490978.html} | 0 .../gen_statem_suite.init_per_group.html} | 0 .../gen_statem_suite.init_per_suite.html} | 0 .../gen_statem_suite.loop_start_fail.html} | 0 .../gen_statem_suite.next_events.489986.html} | 0 .../gen_statem_suite.next_events.html} | 0 .../gen_statem_suite.pop_too_many.html} | 0 .../gen_statem_suite.replace_state.html} | 0 ...em_suite.reply_by_alias_with_payload.html} | 0 ....send_request_check_reqid_collection.html} | 0 ...end_request_receive_reqid_collection.html} | 0 ...e.send_request_wait_reqid_collection.html} | 0 .../gen_statem_suite.shutdown.html} | 0 .../gen_statem_suite.src.html} | 0 .../gen_statem_suite.start1.489570.html} | 0 .../gen_statem_suite.start1.html} | 0 .../gen_statem_suite.start10.489890.html} | 0 .../gen_statem_suite.start10.html} | 0 .../gen_statem_suite.start11.489922.html} | 0 .../gen_statem_suite.start11.html} | 0 .../gen_statem_suite.start12.489954.html} | 0 .../gen_statem_suite.start12.html} | 0 .../gen_statem_suite.start2.489602.html} | 0 .../gen_statem_suite.start2.html} | 0 .../gen_statem_suite.start3.489634.html} | 0 .../gen_statem_suite.start3.html} | 0 .../gen_statem_suite.start4.489666.html} | 0 .../gen_statem_suite.start4.html} | 0 .../gen_statem_suite.start5a.489698.html} | 0 .../gen_statem_suite.start5a.html} | 0 .../gen_statem_suite.start5b.489730.html} | 0 .../gen_statem_suite.start5b.html} | 0 .../gen_statem_suite.start6.489762.html} | 0 .../gen_statem_suite.start6.html} | 0 .../gen_statem_suite.start7.489794.html} | 0 .../gen_statem_suite.start7.html} | 0 .../gen_statem_suite.start8.489826.html} | 0 .../gen_statem_suite.start8.html} | 0 .../gen_statem_suite.start9.489858.html} | 0 .../gen_statem_suite.start9.html} | 0 .../gen_statem_suite.state_enter.html} | 0 .../gen_statem_suite.state_timeout.html} | 0 .../gen_statem_suite.stop1.490274.html} | 0 .../gen_statem_suite.stop1.html} | 0 .../gen_statem_suite.stop10.403043.html} | 0 .../gen_statem_suite.stop10.html} | 0 .../gen_statem_suite.stop2.490306.html} | 0 .../gen_statem_suite.stop2.html} | 0 .../gen_statem_suite.stop3.490338.html} | 0 .../gen_statem_suite.stop3.html} | 0 .../gen_statem_suite.stop4.402819.html} | 0 .../gen_statem_suite.stop4.html} | 0 .../gen_statem_suite.stop5.402851.html} | 0 .../gen_statem_suite.stop5.html} | 0 .../gen_statem_suite.stop6.490370.html} | 0 .../gen_statem_suite.stop6.html} | 0 .../gen_statem_suite.stop7.402883.html} | 0 .../gen_statem_suite.stop7.html} | 0 .../gen_statem_suite.stop8.402915.html} | 0 .../gen_statem_suite.stop8.html} | 0 .../gen_statem_suite.stop9.490434.html} | 0 .../gen_statem_suite.stop9.html} | 0 .../gen_statem_suite.stop_and_reply.html} | 0 .../gen_statem_suite.sys1.html} | 0 ..._statem_suite.terminate_crash_format.html} | 0 ...atem_suite.timeout_cancel_and_update.html} | 0 .../gen_statem_suite.undef_code_change.html} | 0 .../gen_statem_suite.undef_in_terminate.html} | 0 .../gen_statem_suite.undef_terminate1.html} | 0 .../gen_statem_suite.undef_terminate2.html} | 0 .../id_transform_suite.end_per_suite.html} | 0 .../id_transform_suite.id_transform.html} | 0 .../id_transform_suite.init_per_suite.html} | 0 .../id_transform_suite.src.html} | 0 .../io_proto_suite.binary_options.html} | 0 .../io_proto_suite.broken_unicode.html} | 0 .../io_proto_suite.end_per_suite.html} | 0 .../io_proto_suite.eof_on_pipe.html} | 0 ...nicode_translation_error_binary_mode.html} | 0 ..._unicode_translation_error_list_mode.html} | 0 ...to_suite.file_read_stdin_binary_mode.html} | 0 ...e.file_read_stdin_latin1_binary_mode.html} | 0 ...ite.file_read_stdin_latin1_list_mode.html} | 0 ...roto_suite.file_read_stdin_list_mode.html} | 0 ...nicode_translation_error_binary_mode.html} | 0 ..._unicode_translation_error_list_mode.html} | 0 .../io_proto_suite.init_per_suite.html} | 0 ...to_suite.io_fwrite_stdin_latin1_mode.html} | 0 ...et_chars_file_read_stdin_binary_mode.html} | 0 ...suite.io_get_chars_stdin_binary_mode.html} | 0 ...o_suite.io_get_chars_stdin_list_mode.html} | 0 ...suite.io_get_until_stdin_binary_mode.html} | 0 ...o_suite.io_get_until_stdin_list_mode.html} | 0 .../io_proto_suite.raw_stdout.html} | 0 .../io_proto_suite.raw_stdout_isatty.html} | 0 .../io_proto_suite.read_modes_gl.html} | 0 .../io_proto_suite.read_modes_ogl.html} | 0 .../io_proto_suite.setopts_getopts.html} | 0 .../io_proto_suite.shell_slogan.html} | 0 .../io_proto_suite.src.html} | 0 .../io_proto_suite.unicode_options.html} | 0 .../io_proto_suite.unicode_options_gen.html} | 0 .../io_proto_suite.unicode_prompt.html} | 0 .../io_suite.bad_printable_range.html} | 0 ..._suite.build_text_without_maps_order.html} | 0 .../io_suite.calling_self.html} | 0 .../io_suite.chars_limit.html} | 0 .../io_suite.coverage.html} | 0 .../io_suite.cr_whitespace_in_string.html} | 0 .../io_suite.error_1.html} | 0 .../io_suite.error_info.html} | 0 .../io_suite.float_g.html} | 0 .../io_suite.float_w.html} | 0 .../io_suite.format_neg_zero.html} | 0 .../io_suite.format_string.html} | 0 .../io_suite.github_4801.html} | 0 .../io_suite.io_fread_newlines.html} | 0 .../io_suite.io_lib_collect_line_3_wb.html} | 0 .../io_suite.io_lib_fread_literal.html} | 0 ..._suite.io_lib_print_binary_depth_one.html} | 0 .../io_suite.io_lib_width_too_small.html} | 0 .../io_suite.io_with_huge_message_queue.html} | 0 .../io_suite.limit_term.html} | 0 .../io_suite.manpage.html} | 0 .../io_suite.maps.html} | 0 .../io_suite.otp_10302.html} | 0 .../io_suite.otp_10755.html} | 0 .../io_suite.otp_10836.html} | 0 .../io_suite.otp_14175.html} | 0 .../io_suite.otp_14178_unicode_atoms.html} | 0 .../io_suite.otp_14285.html} | 0 .../io_suite.otp_14983.html} | 0 .../io_suite.otp_15076.html} | 0 .../io_suite.otp_15103.html} | 0 .../io_suite.otp_15159.html} | 0 .../io_suite.otp_15639.html} | 0 .../io_suite.otp_15705.html} | 0 .../io_suite.otp_15847.html} | 0 .../io_suite.otp_15875.html} | 0 .../io_suite.otp_17525.html} | 0 .../io_suite.otp_5403.html} | 0 .../io_suite.otp_5813.html} | 0 .../io_suite.otp_6230.html} | 0 .../io_suite.otp_6282.html} | 0 .../io_suite.otp_6354.html} | 0 .../io_suite.otp_6495.html} | 0 .../io_suite.otp_6502.html} | 0 .../io_suite.otp_6517.html} | 0 .../io_suite.otp_6708.html} | 0 .../io_suite.otp_7084.html} | 0 .../io_suite.otp_7421.html} | 0 .../io_suite.otp_8989.html} | 0 .../io_suite.printable_range.html} | 0 .../io_suite.src.html} | 0 ...ite.unscan_format_without_maps_order.html} | 0 .../json_suite.counterexamples.html} | 0 .../json_suite.end_per_group.403267.html} | 0 .../json_suite.end_per_group.493026.html} | 0 .../json_suite.end_per_group.493186.html} | 0 .../json_suite.end_per_group.html} | 0 .../json_suite.init_per_group.403299.html} | 0 .../json_suite.init_per_group.492802.html} | 0 .../json_suite.init_per_group.493058.html} | 0 .../json_suite.init_per_group.html} | 0 ...son_suite.property_escape_all.493154.html} | 0 ...uite.property_float_roundtrip.421988.html} | 0 ...te.property_integer_roundtrip.493122.html} | 0 ...ite.property_object_roundtrip.421956.html} | 0 ...ite.property_string_roundtrip.493090.html} | 0 .../json_suite.src.html} | 0 .../json_suite.test_decode_api.492962.html} | 0 ..._suite.test_decode_api_stream.426245.html} | 0 ...json_suite.test_decode_arrays.492930.html} | 0 .../json_suite.test_decode_atoms.492834.html} | 0 ...son_suite.test_decode_numbers.492866.html} | 0 ...son_suite.test_decode_objects.426181.html} | 0 ...son_suite.test_decode_strings.492898.html} | 0 ..._suite.test_decode_whitespace.426213.html} | 0 .../json_suite.test_encode_atom.492706.html} | 0 ...json_suite.test_encode_binary.403235.html} | 0 ..._suite.test_encode_escape_all.492770.html} | 0 .../json_suite.test_encode_float.492738.html} | 0 ...son_suite.test_encode_integer.403171.html} | 0 .../json_suite.test_encode_list.403203.html} | 0 .../json_suite.test_encode_map.492674.html} | 0 ...on_suite.test_encode_proplist.403139.html} | 0 .../json_suite.test_format_fun.492994.html} | 0 .../json_suite.test_format_list.403331.html} | 0 .../json_suite.test_format_map.403363.html} | 0 .../json_suite.test_json_test_suite.html} | 0 ...s_property_test_suite.all_false_case.html} | 0 ...ts_property_test_suite.all_true_case.html} | 0 ...s_property_test_suite.any_false_case.html} | 0 ...ts_property_test_suite.any_true_case.html} | 0 ...ts_property_test_suite.append_1_case.html} | 0 ...ts_property_test_suite.append_2_case.html} | 0 ...ists_property_test_suite.concat_case.html} | 0 ...operty_test_suite.delete_absent_case.html} | 0 ...ists_property_test_suite.delete_case.html} | 0 ...ts_property_test_suite.droplast_case.html} | 0 ...s_property_test_suite.dropwhile_case.html} | 0 ...s_property_test_suite.duplicate_case.html} | 0 ...ts_property_test_suite.end_per_suite.html} | 0 ...property_test_suite.enumerate_1_case.html} | 0 ...property_test_suite.enumerate_2_case.html} | 0 ...property_test_suite.enumerate_3_case.html} | 0 ...ists_property_test_suite.filter_case.html} | 0 ...s_property_test_suite.filtermap_case.html} | 0 ..._property_test_suite.flatlength_case.html} | 0 ...sts_property_test_suite.flatmap_case.html} | 0 ...s_property_test_suite.flatten_1_case.html} | 0 ...s_property_test_suite.flatten_2_case.html} | 0 ...lists_property_test_suite.foldl_case.html} | 0 ...lists_property_test_suite.foldr_case.html} | 0 ...sts_property_test_suite.foreach_case.html} | 0 ...s_property_test_suite.init_per_suite.html} | 0 .../lists_property_test_suite.join_case.html} | 0 ...rty_test_suite.keydelete_absent_case.html} | 0 ...s_property_test_suite.keydelete_case.html} | 0 ...perty_test_suite.keyfind_absent_case.html} | 0 ...sts_property_test_suite.keyfind_case.html} | 0 ...ists_property_test_suite.keymap_case.html} | 0 ...rty_test_suite.keymember_absent_case.html} | 0 ...s_property_test_suite.keymember_case.html} | 0 ...ts_property_test_suite.keymerge_case.html} | 0 ...rty_test_suite.keymerge_invalid_case.html} | 0 ...ty_test_suite.keyreplace_absent_case.html} | 0 ..._property_test_suite.keyreplace_case.html} | 0 ...rty_test_suite.keysearch_absent_case.html} | 0 ...s_property_test_suite.keysearch_case.html} | 0 ...sts_property_test_suite.keysort_case.html} | 0 ...erty_test_suite.keystore_absent_case.html} | 0 ...ts_property_test_suite.keystore_case.html} | 0 ...perty_test_suite.keytake_absent_case.html} | 0 ...sts_property_test_suite.keytake_case.html} | 0 .../lists_property_test_suite.last_case.html} | 0 .../lists_property_test_suite.map_case.html} | 0 ...ts_property_test_suite.mapfoldl_case.html} | 0 ...ts_property_test_suite.mapfoldr_case.html} | 0 .../lists_property_test_suite.max_case.html} | 0 ...operty_test_suite.member_absent_case.html} | 0 ...ists_property_test_suite.member_case.html} | 0 ...ists_property_test_suite.merge3_case.html} | 0 ...perty_test_suite.merge3_invalid_case.html} | 0 ...sts_property_test_suite.merge_1_case.html} | 0 ...erty_test_suite.merge_1_invalid_case.html} | 0 ...sts_property_test_suite.merge_2_case.html} | 0 ...erty_test_suite.merge_2_invalid_case.html} | 0 ...sts_property_test_suite.merge_3_case.html} | 0 ...erty_test_suite.merge_3_invalid_case.html} | 0 .../lists_property_test_suite.min_case.html} | 0 .../lists_property_test_suite.nth_case.html} | 0 ...perty_test_suite.nth_outofrange_case.html} | 0 ...sts_property_test_suite.nthtail_case.html} | 0 ...y_test_suite.nthtail_outofrange_case.html} | 0 ...s_property_test_suite.partition_case.html} | 0 ...ists_property_test_suite.prefix_case.html} | 0 ...s_property_test_suite.reverse_1_case.html} | 0 ...s_property_test_suite.reverse_2_case.html} | 0 ...operty_test_suite.search_absent_case.html} | 0 ...ists_property_test_suite.search_case.html} | 0 .../lists_property_test_suite.seq2_case.html} | 0 .../lists_property_test_suite.seq3_case.html} | 0 ...ists_property_test_suite.sort_1_case.html} | 0 ...ists_property_test_suite.sort_2_case.html} | 0 ...lists_property_test_suite.split_case.html} | 0 ...rty_test_suite.split_outofrange_case.html} | 0 ...s_property_test_suite.splitwith_case.html} | 0 .../lists_property_test_suite.src.html} | 0 ...s_property_test_suite.sublist_2_case.html} | 0 ...s_property_test_suite.sublist_3_case.html} | 0 ...ts_property_test_suite.subtract_case.html} | 0 ...ists_property_test_suite.suffix_case.html} | 0 .../lists_property_test_suite.sum_case.html} | 0 ...s_property_test_suite.takewhile_case.html} | 0 ...s_property_test_suite.ukeymerge_case.html} | 0 ...ty_test_suite.ukeymerge_invalid_case.html} | 0 ...ts_property_test_suite.ukeysort_case.html} | 0 ...sts_property_test_suite.umerge3_case.html} | 0 ...erty_test_suite.umerge3_invalid_case.html} | 0 ...ts_property_test_suite.umerge_1_case.html} | 0 ...rty_test_suite.umerge_1_invalid_case.html} | 0 ...ts_property_test_suite.umerge_2_case.html} | 0 ...rty_test_suite.umerge_2_invalid_case.html} | 0 ...ts_property_test_suite.umerge_3_case.html} | 0 ...rty_test_suite.umerge_3_invalid_case.html} | 0 ...ists_property_test_suite.uniq_1_case.html} | 0 ...ists_property_test_suite.uniq_2_case.html} | 0 ...ists_property_test_suite.unzip3_case.html} | 0 ...lists_property_test_suite.unzip_case.html} | 0 ...sts_property_test_suite.usort_1_case.html} | 0 ...sts_property_test_suite.usort_2_case.html} | 0 ...ists_property_test_suite.zip3_3_case.html} | 0 ...ists_property_test_suite.zip3_4_case.html} | 0 ...lists_property_test_suite.zip_2_case.html} | 0 ...lists_property_test_suite.zip_3_case.html} | 0 ..._property_test_suite.zipwith3_4_case.html} | 0 ..._property_test_suite.zipwith3_5_case.html} | 0 ...s_property_test_suite.zipwith_3_case.html} | 0 ...s_property_test_suite.zipwith_4_case.html} | 0 .../lists_suite.append_1.493250.html} | 0 .../lists_suite.append_2.493282.html} | 0 .../lists_suite.droplast.404963.html} | 0 .../lists_suite.dropwhile.404931.html} | 0 .../lists_suite.end_per_group.404195.html} | 0 .../lists_suite.end_per_group.404611.html} | 0 .../lists_suite.end_per_group.404803.html} | 0 .../lists_suite.end_per_group.422212.html} | 0 .../lists_suite.end_per_group.426917.html} | 0 .../lists_suite.end_per_group.493442.html} | 0 .../lists_suite.end_per_group.493474.html} | 0 .../lists_suite.end_per_group.493570.html} | 0 .../lists_suite.end_per_group.493698.html} | 0 .../lists_suite.end_per_group.493794.html} | 0 .../lists_suite.end_per_group.493922.html} | 0 .../lists_suite.end_per_group.494050.html} | 0 .../lists_suite.end_per_group.html} | 0 .../lists_suite.end_per_suite.html} | 0 .../lists_suite.enumerate.405027.html} | 0 .../lists_suite.error_info.405059.html} | 0 .../lists_suite.filter_partition.427269.html} | 0 .../lists_suite.flatten_1.493858.html} | 0 .../lists_suite.flatten_1_e.426821.html} | 0 .../lists_suite.flatten_2.426853.html} | 0 .../lists_suite.flatten_2_e.426885.html} | 0 .../lists_suite.hof.427397.html} | 0 .../lists_suite.init_per_group.403523.html} | 0 .../lists_suite.init_per_group.403779.html} | 0 .../lists_suite.init_per_group.404227.html} | 0 .../lists_suite.init_per_group.404835.html} | 0 .../lists_suite.init_per_group.422020.html} | 0 .../lists_suite.init_per_group.422244.html} | 0 .../lists_suite.init_per_group.426949.html} | 0 .../lists_suite.init_per_group.493506.html} | 0 .../lists_suite.init_per_group.493602.html} | 0 .../lists_suite.init_per_group.493730.html} | 0 .../lists_suite.init_per_group.493826.html} | 0 .../lists_suite.init_per_group.493954.html} | 0 .../lists_suite.init_per_group.html} | 0 .../lists_suite.init_per_suite.html} | 0 .../lists_suite.join.427365.html} | 0 .../lists_suite.keymember.403555.html} | 0 .../lists_suite.keymerge.404259.html} | 0 .../lists_suite.keyreplace.493410.html} | 0 ...lists_suite.keysearch_keyfind.493314.html} | 0 .../lists_suite.keysort_1.404291.html} | 0 .../lists_suite.keysort_error.404419.html} | 0 .../lists_suite.keysort_i.404387.html} | 0 .../lists_suite.keysort_rand.404355.html} | 0 .../lists_suite.keystore.493346.html} | 0 .../lists_suite.keytake.493378.html} | 0 .../lists_suite.member.404899.html} | 0 .../lists_suite.merge.403587.html} | 0 .../lists_suite.otp_5939.493986.html} | 0 .../lists_suite.otp_6023.427141.html} | 0 .../lists_suite.otp_6606.427109.html} | 0 .../lists_suite.otp_7230.494018.html} | 0 .../lists_suite.reverse.404867.html} | 0 .../lists_suite.rkeymerge.404323.html} | 0 .../lists_suite.rmerge.422052.html} | 0 .../lists_suite.rukeymerge.426341.html} | 0 .../lists_suite.rumerge.403843.html} | 0 .../lists_suite.search.404995.html} | 0 .../lists_suite.seq_2.427013.html} | 0 .../lists_suite.seq_2_e.493890.html} | 0 .../lists_suite.seq_3.427045.html} | 0 .../lists_suite.seq_3_e.427077.html} | 0 .../lists_suite.seq_loop.426981.html} | 0 .../lists_suite.sort_1.422084.html} | 0 .../lists_suite.sort_rand.403619.html} | 0 .../lists_suite.src.html} | 0 .../lists_suite.sublist_2.493762.html} | 0 .../lists_suite.sublist_2_e.426725.html} | 0 .../lists_suite.sublist_3.426757.html} | 0 .../lists_suite.sublist_3_e.426789.html} | 0 .../lists_suite.subtract.427333.html} | 0 .../lists_suite.suffix.427301.html} | 0 .../lists_suite.takewhile.427237.html} | 0 .../lists_suite.ukeymerge.426309.html} | 0 .../lists_suite.ukeysort_1.426373.html} | 0 .../lists_suite.ukeysort_error.493538.html} | 0 .../lists_suite.ukeysort_i.426437.html} | 0 .../lists_suite.ukeysort_rand.426405.html} | 0 .../lists_suite.umerge.403811.html} | 0 .../lists_suite.uniq_1.493634.html} | 0 .../lists_suite.uniq_2.493666.html} | 0 .../lists_suite.usort_1.403875.html} | 0 .../lists_suite.usort_rand.403907.html} | 0 .../lists_suite.zip3_fail.422436.html} | 0 .../lists_suite.zip3_pad.422500.html} | 0 .../lists_suite.zip3_trim.422468.html} | 0 .../lists_suite.zip_fail.427205.html} | 0 .../lists_suite.zip_pad.422404.html} | 0 .../lists_suite.zip_trim.422372.html} | 0 .../lists_suite.zip_unzip.422276.html} | 0 .../lists_suite.zip_unzip3.422308.html} | 0 .../lists_suite.zipwith.427173.html} | 0 .../lists_suite.zipwith3.422340.html} | 0 .../lists_suite.zipwith3_fail.404707.html} | 0 .../lists_suite.zipwith3_pad.404739.html} | 0 .../lists_suite.zipwith3_trim.404771.html} | 0 .../lists_suite.zipwith_fail.422532.html} | 0 .../lists_suite.zipwith_pad.404675.html} | 0 .../lists_suite.zipwith_trim.404643.html} | 0 .../log_mf_h_suite.end_per_suite.html} | 0 .../log_mf_h_suite.init_per_suite.html} | 0 .../log_mf_h_suite.src.html} | 0 .../log_mf_h_suite.test.html} | 0 .../maps_suite.error_info.html} | 0 .../maps_suite.src.html} | 0 .../maps_suite.t_filter_2.html} | 0 .../maps_suite.t_filtermap_2.html} | 0 .../maps_suite.t_fold_3.html} | 0 .../maps_suite.t_foreach_2.html} | 0 .../maps_suite.t_from_keys.html} | 0 ...aps_suite.t_from_keys_check_trapping.html} | 0 .../maps_suite.t_from_keys_kill_process.html} | 0 ...aps_suite.t_from_list_check_trapping.html} | 0 .../maps_suite.t_from_list_kill_process.html} | 0 .../maps_suite.t_get_3.html} | 0 .../maps_suite.t_groups_from_list.html} | 0 .../maps_suite.t_intersect.html} | 0 .../maps_suite.t_intersect_with.html} | 0 .../maps_suite.t_iterator_1.html} | 0 .../maps_suite.t_iterator_2.html} | 0 .../maps_suite.t_iterator_valid.html} | 0 .../maps_suite.t_keys_kill_process.html} | 0 .../maps_suite.t_keys_trapping.html} | 0 .../maps_suite.t_map_2.html} | 0 .../maps_suite.t_merge_opt.html} | 0 .../maps_suite.t_merge_with.html} | 0 .../maps_suite.t_put_opt.html} | 0 .../maps_suite.t_size_1.html} | 0 .../maps_suite.t_update_with_3.html} | 0 .../maps_suite.t_update_with_4.html} | 0 .../maps_suite.t_values_kill_process.html} | 0 .../maps_suite.t_values_trapping.html} | 0 .../maps_suite.t_with_2.html} | 0 .../maps_suite.t_without_2.html} | 0 .../math_suite.constants.html} | 0 .../math_suite.end_per_suite.html} | 0 .../math_suite.error_info.html} | 0 .../math_suite.floor_ceil.html} | 0 .../math_suite.init_per_suite.html} | 0 .../math_suite.src.html} | 0 .../ms_transform_suite.action_function.html} | 0 .../ms_transform_suite.andalso_orelse.html} | 0 .../ms_transform_suite.autoimported.html} | 0 .../ms_transform_suite.basic_dbg.html} | 0 .../ms_transform_suite.basic_ets.html} | 0 .../ms_transform_suite.binary_bifs.html} | 0 .../ms_transform_suite.bitsyntax.html} | 0 .../ms_transform_suite.eep37.html} | 0 .../ms_transform_suite.end_per_suite.html} | 0 .../ms_transform_suite.float_1_function.html} | 0 .../ms_transform_suite.from_shell.html} | 0 .../ms_transform_suite.init_per_suite.html} | 0 .../ms_transform_suite.map_expr_in_head.html} | 0 ...rm_suite.map_expr_in_head_from_shell.html} | 0 .../ms_transform_suite.map_exprs.html} | 0 ...transform_suite.map_exprs_from_shell.html} | 0 .../ms_transform_suite.map_pattern.html} | 0 ...ansform_suite.map_pattern_from_shell.html} | 0 .../ms_transform_suite.multipass.html} | 0 .../ms_transform_suite.no_warnings.html} | 0 .../ms_transform_suite.old_guards.html} | 0 .../ms_transform_suite.otp_14454.html} | 0 .../ms_transform_suite.otp_16824.html} | 0 .../ms_transform_suite.record_defaults.html} | 0 .../ms_transform_suite.record_index.html} | 0 .../ms_transform_suite.records.html} | 0 .../ms_transform_suite.semicolon.html} | 0 .../ms_transform_suite.src.html} | 0 .../ms_transform_suite.top_match.html} | 0 .../ms_transform_suite.unused_record.html} | 0 .../ms_transform_suite.warnings.html} | 0 .../peer_suite.attached.427525.html} | 0 .../peer_suite.attached.428069.html} | 0 .../peer_suite.attached.428421.html} | 0 ...d_cntrl_channel_handler_crash.405827.html} | 0 ...d_cntrl_channel_handler_crash.427557.html} | 0 ...d_cntrl_channel_handler_crash.428101.html} | 0 .../peer_suite.basic.405667.html} | 0 .../peer_suite.basic.423140.html} | 0 .../peer_suite.cast.405731.html} | 0 .../peer_suite.cast.423204.html} | 0 ...e.cntrl_channel_handler_crash.405859.html} | 0 ...e.cntrl_channel_handler_crash.422564.html} | 0 ...e.cntrl_channel_handler_crash.428133.html} | 0 ...nel_handler_crash_old_release.405891.html} | 0 ...nel_handler_crash_old_release.422596.html} | 0 ...nel_handler_crash_old_release.423300.html} | 0 .../peer_suite.detached.423268.html} | 0 .../peer_suite.detached.428293.html} | 0 .../peer_suite.dist.497666.html} | 0 .../peer_suite.dist_io_redirect.html} | 0 .../peer_suite.dist_localhost.427461.html} | 0 .../peer_suite.dist_up_down.497698.html} | 0 .../peer_suite.duplicate_name.428037.html} | 0 .../peer_suite.duplicate_name.428389.html} | 0 .../peer_suite.dyn_peer.405763.html} | 0 .../peer_suite.dyn_peer.423236.html} | 0 .../peer_suite.end_per_group.405571.html} | 0 .../peer_suite.end_per_group.423972.html} | 0 .../peer_suite.end_per_group.424132.html} | 0 .../peer_suite.end_per_group.498274.html} | 0 .../peer_suite.end_per_group.html} | 0 .../peer_suite.end_per_suite.html} | 0 .../peer_suite.errors.497634.html} | 0 .../peer_suite.init_debug.405635.html} | 0 .../peer_suite.init_per_group.405603.html} | 0 .../peer_suite.init_per_group.423044.html} | 0 .../peer_suite.init_per_group.423108.html} | 0 .../peer_suite.init_per_group.424004.html} | 0 .../peer_suite.init_per_group.424164.html} | 0 .../peer_suite.init_per_group.html} | 0 .../peer_suite.init_per_suite.html} | 0 .../peer_suite.io_redirect.405795.html} | 0 .../peer_suite.io_redirect.427973.html} | 0 .../peer_suite.multi_node.428005.html} | 0 .../peer_suite.multi_node.428357.html} | 0 .../peer_suite.old_release.424036.html} | 0 .../peer_suite.peer_down_boot.497602.html} | 0 ...peer_suite.peer_down_continue.427429.html} | 0 .../peer_suite.peer_down_crash.497730.html} | 0 .../peer_suite.peer_down_crash_tcp.html} | 0 .../peer_suite.peer_states.405699.html} | 0 .../peer_suite.peer_states.423172.html} | 0 .../peer_suite.post_process_args.427493.html} | 0 .../peer_suite.shutdown_close.405987.html} | 0 .../peer_suite.shutdown_close.422628.html} | 0 .../peer_suite.shutdown_close.428229.html} | 0 .../peer_suite.shutdown_halt.405923.html} | 0 .../peer_suite.shutdown_halt.423332.html} | 0 .../peer_suite.shutdown_halt.427589.html} | 0 ...r_suite.shutdown_halt_timeout.405251.html} | 0 ...r_suite.shutdown_halt_timeout.423588.html} | 0 ...r_suite.shutdown_halt_timeout.427621.html} | 0 .../peer_suite.shutdown_stop.423620.html} | 0 .../peer_suite.shutdown_stop.427653.html} | 0 .../peer_suite.shutdown_stop.428197.html} | 0 ...r_suite.shutdown_stop_timeout.423652.html} | 0 ...r_suite.shutdown_stop_timeout.427685.html} | 0 ...r_suite.shutdown_stop_timeout.428165.html} | 0 .../peer_suite.src.html} | 0 .../peer_suite.stop_peer.427941.html} | 0 .../peer_suite.stop_peer.428325.html} | 0 .../pool_suite.basic.html} | 0 .../pool_suite.end_per_suite.html} | 0 .../pool_suite.init_per_suite.html} | 0 .../pool_suite.link_race.html} | 0 .../pool_suite.src.html} | 0 .../proc_lib_suite.crash.html} | 0 .../proc_lib_suite.end_per_group.424324.html} | 0 .../proc_lib_suite.end_per_group.html} | 0 .../proc_lib_suite.end_per_suite.html} | 0 .../proc_lib_suite.hibernate.html} | 0 .../proc_lib_suite.init_dont_hang.html} | 0 ...proc_lib_suite.init_per_group.424292.html} | 0 .../proc_lib_suite.init_per_group.html} | 0 .../proc_lib_suite.init_per_suite.html} | 0 .../proc_lib_suite.otp_6345.html} | 0 .../proc_lib_suite.report_cb.html} | 0 .../proc_lib_suite.spawn_opt.html} | 0 .../proc_lib_suite.src.html} | 0 .../proc_lib_suite.stacktrace.html} | 0 .../proc_lib_suite.stop.html} | 0 .../proc_lib_suite.sync_start_link.html} | 0 ...oc_lib_suite.sync_start_link_timeout.html} | 0 .../proc_lib_suite.sync_start_monitor.html} | 0 ...oc_lib_suite.sync_start_monitor_link.html} | 0 ...uite.sync_start_monitor_link_timeout.html} | 0 .../proc_lib_suite.sync_start_nolink.html} | 0 .../proc_lib_suite.sync_start_timeout.html} | 0 .../proc_lib_suite.t_format.html} | 0 .../proc_lib_suite.t_format_arbitrary.html} | 0 .../proplists_suite.end_per_suite.html} | 0 .../proplists_suite.examples.html} | 0 .../proplists_suite.init_per_suite.html} | 0 .../proplists_suite.map_conversion.html} | 0 ...lists_suite.map_conversion_normalize.html} | 0 .../proplists_suite.pm_fold_test.html} | 0 .../proplists_suite.src.html} | 0 .../qlc_suite.append.html} | 0 .../qlc_suite.backward.html} | 0 .../qlc_suite.badarg.html} | 0 .../qlc_suite.cache.html} | 0 .../qlc_suite.cache_list.html} | 0 .../qlc_suite.cursor.html} | 0 .../qlc_suite.dets.html} | 0 .../qlc_suite.eep37.html} | 0 .../qlc_suite.end_per_group.407043.html} | 0 .../qlc_suite.end_per_group.425124.html} | 0 .../qlc_suite.end_per_group.425188.html} | 0 .../qlc_suite.end_per_group.425508.html} | 0 .../qlc_suite.end_per_group.499938.html} | 0 .../qlc_suite.end_per_group.html} | 0 .../qlc_suite.end_per_suite.html} | 0 .../qlc_suite.errors.html} | 0 .../qlc_suite.ets.html} | 0 .../qlc_suite.eval.html} | 0 .../qlc_suite.eval_cache.html} | 0 .../qlc_suite.eval_unique.html} | 0 .../qlc_suite.evaluator.html} | 0 .../qlc_suite.exported_var.html} | 0 .../qlc_suite.filesort.html} | 0 .../qlc_suite.filter.html} | 0 .../qlc_suite.filter_var.html} | 0 .../qlc_suite.fold.html} | 0 .../qlc_suite.forward.html} | 0 .../qlc_suite.fun_clauses.html} | 0 .../qlc_suite.generator_vars.html} | 0 .../qlc_suite.indices.html} | 0 .../qlc_suite.info.html} | 0 .../qlc_suite.init_per_group.407075.html} | 0 .../qlc_suite.init_per_group.424420.html} | 0 .../qlc_suite.init_per_group.425156.html} | 0 .../qlc_suite.init_per_group.425220.html} | 0 .../qlc_suite.init_per_group.425540.html} | 0 .../qlc_suite.init_per_group.html} | 0 .../qlc_suite.init_per_suite.html} | 0 .../qlc_suite.join_complex.html} | 0 .../qlc_suite.join_filter.html} | 0 .../qlc_suite.join_lookup.html} | 0 .../qlc_suite.join_merge.html} | 0 .../qlc_suite.join_option.html} | 0 .../qlc_suite.join_sort.html} | 0 .../qlc_suite.keysort.html} | 0 .../qlc_suite.lc.html} | 0 .../qlc_suite.lookup1.html} | 0 .../qlc_suite.lookup2.html} | 0 .../qlc_suite.lookup_rec.html} | 0 .../qlc_suite.manpage.html} | 0 .../qlc_suite.nested_info.html} | 0 .../qlc_suite.nested_qlc.html} | 0 .../qlc_suite.nomatch.html} | 0 .../qlc_suite.otp_11758.html} | 0 .../qlc_suite.otp_12946.html} | 0 .../qlc_suite.otp_5195.html} | 0 .../qlc_suite.otp_5644.html} | 0 .../qlc_suite.otp_6038_bug.html} | 0 .../qlc_suite.otp_6359.html} | 0 .../qlc_suite.otp_6562.html} | 0 .../qlc_suite.otp_6590.html} | 0 .../qlc_suite.otp_6673.html} | 0 .../qlc_suite.otp_6674.html} | 0 .../qlc_suite.otp_6964.html} | 0 .../qlc_suite.otp_7114.html} | 0 .../qlc_suite.otp_7232.html} | 0 .../qlc_suite.otp_7238.html} | 0 .../qlc_suite.otp_7552.html} | 0 .../qlc_suite.otp_7714.html} | 0 .../qlc_suite.overridden_bif.html} | 0 .../qlc_suite.pattern.html} | 0 .../qlc_suite.pre_fun.html} | 0 .../qlc_suite.process_dies.html} | 0 .../qlc_suite.single.html} | 0 .../qlc_suite.skip_filters.html} | 0 .../qlc_suite.sort.html} | 0 .../qlc_suite.src.html} | 0 .../qlc_suite.string_to_handle.html} | 0 .../qlc_suite.table.html} | 0 .../qlc_suite.unused_var.html} | 0 .../queue_property_test_suite.all_case.html} | 0 ...property_test_suite.all_invalid_case.html} | 0 .../queue_property_test_suite.any_case.html} | 0 ...property_test_suite.any_invalid_case.html} | 0 .../queue_property_test_suite.cons_case.html} | 0 ...roperty_test_suite.cons_invalid_case.html} | 0 .../queue_property_test_suite.daeh_case.html} | 0 ...roperty_test_suite.daeh_invalid_case.html} | 0 ...ueue_property_test_suite.delete_case.html} | 0 ...perty_test_suite.delete_invalid_case.html} | 0 ...ue_property_test_suite.delete_r_case.html} | 0 ...rty_test_suite.delete_r_invalid_case.html} | 0 ...property_test_suite.delete_with_case.html} | 0 ..._test_suite.delete_with_invalid_case.html} | 0 ...operty_test_suite.delete_with_r_case.html} | 0 ...est_suite.delete_with_r_invalid_case.html} | 0 .../queue_property_test_suite.drop_case.html} | 0 ...roperty_test_suite.drop_invalid_case.html} | 0 ...ueue_property_test_suite.drop_r_case.html} | 0 ...perty_test_suite.drop_r_invalid_case.html} | 0 ...ue_property_test_suite.end_per_suite.html} | 0 ...ueue_property_test_suite.filter_case.html} | 0 ...perty_test_suite.filter_invalid_case.html} | 0 ...e_property_test_suite.filtermap_case.html} | 0 ...ty_test_suite.filtermap_invalid_case.html} | 0 .../queue_property_test_suite.fold_case.html} | 0 ...roperty_test_suite.fold_invalid_case.html} | 0 ...ty_test_suite.from_list_invalid_case.html} | 0 .../queue_property_test_suite.get_case.html} | 0 ...property_test_suite.get_invalid_case.html} | 0 ...queue_property_test_suite.get_r_case.html} | 0 ...operty_test_suite.get_r_invalid_case.html} | 0 .../queue_property_test_suite.head_case.html} | 0 ...roperty_test_suite.head_invalid_case.html} | 0 .../queue_property_test_suite.in_case.html} | 0 ..._property_test_suite.in_invalid_case.html} | 0 .../queue_property_test_suite.in_r_case.html} | 0 ...roperty_test_suite.in_r_invalid_case.html} | 0 .../queue_property_test_suite.init_case.html} | 0 ...roperty_test_suite.init_invalid_case.html} | 0 ...e_property_test_suite.init_per_suite.html} | 0 ...ue_property_test_suite.is_empty_case.html} | 0 ...rty_test_suite.is_empty_invalid_case.html} | 0 ...ue_property_test_suite.is_queue_case.html} | 0 .../queue_property_test_suite.join_case.html} | 0 ...roperty_test_suite.join_invalid_case.html} | 0 .../queue_property_test_suite.last_case.html} | 0 ...roperty_test_suite.last_invalid_case.html} | 0 .../queue_property_test_suite.len_case.html} | 0 ...property_test_suite.len_invalid_case.html} | 0 .../queue_property_test_suite.liat_case.html} | 0 ...roperty_test_suite.liat_invalid_case.html} | 0 ...erty_test_suite.list_conversion_case.html} | 0 ...ueue_property_test_suite.member_case.html} | 0 ...perty_test_suite.member_invalid_case.html} | 0 .../queue_property_test_suite.new_case.html} | 0 .../queue_property_test_suite.ops_case.html} | 0 .../queue_property_test_suite.out_case.html} | 0 ...property_test_suite.out_invalid_case.html} | 0 ...queue_property_test_suite.out_r_case.html} | 0 ...operty_test_suite.out_r_invalid_case.html} | 0 .../queue_property_test_suite.peek_case.html} | 0 ...roperty_test_suite.peek_invalid_case.html} | 0 ...ueue_property_test_suite.peek_r_case.html} | 0 ...perty_test_suite.peek_r_invalid_case.html} | 0 ...eue_property_test_suite.reverse_case.html} | 0 ...erty_test_suite.reverse_invalid_case.html} | 0 .../queue_property_test_suite.snoc_case.html} | 0 ...roperty_test_suite.snoc_invalid_case.html} | 0 ...queue_property_test_suite.split_case.html} | 0 ...operty_test_suite.split_invalid_case.html} | 0 .../queue_property_test_suite.src.html} | 0 .../queue_property_test_suite.tail_case.html} | 0 ...roperty_test_suite.tail_invalid_case.html} | 0 ...erty_test_suite.to_list_invalid_case.html} | 0 .../queue_suite.do.html} | 0 .../queue_suite.end_per_suite.html} | 0 .../queue_suite.error.html} | 0 .../queue_suite.init_per_suite.html} | 0 .../queue_suite.io_test.html} | 0 .../queue_suite.oops.html} | 0 .../queue_suite.op_test.html} | 0 .../queue_suite.src.html} | 0 .../queue_suite.to_list.html} | 0 .../rand_suite.api_eq.html} | 0 .../rand_suite.basic_stats_bytes.504674.html} | 0 ...e.basic_stats_standard_normal.504706.html} | 0 ...d_suite.basic_stats_uniform_1.407459.html} | 0 ...d_suite.basic_stats_uniform_2.504642.html} | 0 .../rand_suite.bytes_count.html} | 0 .../rand_suite.exsp_jump_api.html} | 0 .../rand_suite.exsp_next_api.html} | 0 .../rand_suite.interval_float.html} | 0 .../rand_suite.interval_int.html} | 0 .../rand_suite.measure.html} | 0 .../rand_suite.mwc59_api.html} | 0 .../rand_suite.plugin.html} | 0 .../rand_suite.reference.html} | 0 ...ite.reference_jump_procdict.19710370.html} | 0 ..._suite.reference_jump_state.19710338.html} | 0 .../rand_suite.seed.html} | 0 .../rand_suite.short_jump.html} | 0 .../rand_suite.splitmix64_next_api.html} | 0 .../rand_suite.src.html} | 0 ...d_suite.stats_standard_normal.505090.html} | 0 ...ts_standard_normal_box_muller.505026.html} | 0 ..._standard_normal_box_muller_2.505058.html} | 0 .../rand_suite.uniform_real_conv.html} | 0 .../random_suite.end_per_suite.html} | 0 .../random_suite.init_per_suite.html} | 0 .../random_suite.interval_1.html} | 0 .../random_suite.seed.html} | 0 .../random_suite.seed0.html} | 0 .../random_suite.src.html} | 0 .../re_suite.bad_utf8_subject.html} | 0 .../re_suite.combined_options.html} | 0 .../re_suite.compile_options.html} | 0 .../re_suite.end_per_suite.html} | 0 .../re_suite.error_handling.html} | 0 .../re_suite.error_info.html} | 0 .../re_suite.global_capture.html} | 0 .../re_suite.global_unicode_validation.html} | 0 .../re_suite.init_per_suite.html} | 0 .../re_suite.inspect.html} | 0 .../re_suite.match_limit.html} | 0 .../re_suite.opt_all_names.html} | 0 .../re_suite.opt_dupnames.html} | 0 .../re_suite.opt_never_utf.html} | 0 .../re_suite.opt_no_start_optimize.html} | 0 .../re_suite.opt_ucp.html} | 0 .../re_suite.pcre.html} | 0 ...uite.pcre_compile_workspace_overflow.html} | 0 .../re_suite.pcre_cve_2008_2371.html} | 0 .../re_suite.re_backwards_accented.html} | 0 .../re_suite.re_infinite_loop.html} | 0 .../re_suite.re_version.html} | 0 .../re_suite.replace_autogen.html} | 0 .../re_suite.replace_input_types.html} | 0 .../re_suite.replace_return.html} | 0 .../re_suite.replace_with_fun.html} | 0 .../re_suite.run_options.html} | 0 .../re_suite.split_autogen.html} | 0 .../re_suite.split_options.html} | 0 .../re_suite.split_specials.html} | 0 .../re_suite.src.html} | 0 .../re_suite.sub_binaries.html} | 0 ...re_suite.yield_on_subject_validation.html} | 0 .../select_suite.return_values.html} | 0 .../select_suite.select_test.html} | 0 .../select_suite.src.html} | 0 ...property_test_suite.add_element_case.html} | 0 ...property_test_suite.del_element_case.html} | 0 ...ts_property_test_suite.end_per_suite.html} | 0 ...sets_property_test_suite.filter_case.html} | 0 ...s_property_test_suite.filtermap_case.html} | 0 .../sets_property_test_suite.fold_case.html} | 0 ...s_property_test_suite.from_list_case.html} | 0 ...s_property_test_suite.init_per_suite.html} | 0 ...perty_test_suite.intersection_1_case.html} | 0 ...perty_test_suite.intersection_2_case.html} | 0 ...property_test_suite.is_disjoint_case.html} | 0 ..._property_test_suite.is_element_case.html} | 0 ...ts_property_test_suite.is_empty_case.html} | 0 ...ts_property_test_suite.is_equal_case.html} | 0 ...sets_property_test_suite.is_set_case.html} | 0 ...s_property_test_suite.is_subset_case.html} | 0 .../sets_property_test_suite.map_case.html} | 0 ..._property_test_suite.operations_case.html} | 0 .../sets_property_test_suite.size_case.html} | 0 .../sets_property_test_suite.src.html} | 0 ...ts_property_test_suite.subtract_case.html} | 0 ...ets_property_test_suite.to_list_case.html} | 0 ...ets_property_test_suite.union_1_case.html} | 0 ...ets_property_test_suite.union_2_case.html} | 0 .../sets_suite.add_element.html} | 0 .../sets_suite.create.html} | 0 .../sets_suite.del_element.html} | 0 .../sets_suite.end_per_suite.html} | 0 .../sets_suite.filter.html} | 0 .../sets_suite.filtermap.html} | 0 .../sets_suite.fold.html} | 0 .../sets_suite.init_per_suite.html} | 0 .../sets_suite.intersection.html} | 0 .../sets_suite.is_disjoint.html} | 0 .../sets_suite.is_empty.html} | 0 .../sets_suite.is_equal.html} | 0 .../sets_suite.is_set.html} | 0 .../sets_suite.is_subset.html} | 0 .../sets_suite.iterate.html} | 0 .../sets_suite.map.html} | 0 .../sets_suite.src.html} | 0 .../sets_suite.subtract.html} | 0 .../sets_suite.take_largest.html} | 0 .../sets_suite.take_smallest.html} | 0 .../sets_suite.union.html} | 0 ...rkdown_suite.after_paragraph_comment.html} | 0 ...cs_markdown_suite.begin_comment_test.html} | 0 ...ite.bullet_list_mix_with_number_list.html} | 0 ...rkdown_suite.bullet_list_with_anchor.html} | 0 ...markdown_suite.complex_inline_format.html} | 0 ...own_suite.complex_nested_bullet_list.html} | 0 ...wn_suite.complex_nested_bullet_list2.html} | 0 ...wn_suite.complex_nested_bullet_list3.html} | 0 ...s_markdown_suite.convert_erlang_html.html} | 0 ...arkdown_suite.convert_unknown_format.html} | 0 ...own_suite.double_char_for_quote_test.html} | 0 ...arkdown_suite.end_per_group.19714690.html} | 0 ...arkdown_suite.end_per_group.19714754.html} | 0 ...arkdown_suite.end_per_group.19714818.html} | 0 ...arkdown_suite.end_per_group.19714882.html} | 0 ...arkdown_suite.end_per_group.19714946.html} | 0 ...arkdown_suite.end_per_group.19715010.html} | 0 ...arkdown_suite.end_per_group.19715074.html} | 0 ...arkdown_suite.end_per_group.19715138.html} | 0 ...arkdown_suite.end_per_group.19715202.html} | 0 ...arkdown_suite.end_per_group.19715266.html} | 0 ...arkdown_suite.end_per_group.19715330.html} | 0 ...arkdown_suite.end_per_group.19715394.html} | 0 ...arkdown_suite.end_per_group.19715458.html} | 0 ...ll_docs_markdown_suite.end_per_group.html} | 0 ...l_docs_markdown_suite.ending_br_test.html} | 0 ...ocs_markdown_suite.escaped_character.html} | 0 ...rkdown_suite.even_nested_bullet_list.html} | 0 ...down_suite.even_nested_numbered_list.html} | 0 ...ell_docs_markdown_suite.existing_doc.html} | 0 ...cs_markdown_suite.existing_moduledoc.html} | 0 ..._docs_markdown_suite.fake_table_test.html} | 0 ....fence_code_ignores_link_format_test.html} | 0 ...arkdown_suite.fence_code_with_spaces.html} | 0 ..._markdown_suite.fence_code_with_tabs.html} | 0 ...arkdown_suite.forget_closing_comment.html} | 0 ...kdown_suite.format_header_identifier.html} | 0 ...s_markdown_suite.format_heading_test.html} | 0 ...suite.format_inline_link_with_inline.html} | 0 ...arkdown_suite.format_multiple_inline.html} | 0 ...e.format_multiple_inline_format_long.html} | 0 ....format_multiple_inline_format_mixed.html} | 0 ....format_multiple_inline_format_short.html} | 0 ...markdown_suite.format_paragraph_test.html} | 0 ...markdown_suite.format_separator_test.html} | 0 .../shell_docs_markdown_suite.h1_test.html} | 0 .../shell_docs_markdown_suite.h2_test.html} | 0 .../shell_docs_markdown_suite.h3_test.html} | 0 .../shell_docs_markdown_suite.h4_test.html} | 0 .../shell_docs_markdown_suite.h5_test.html} | 0 .../shell_docs_markdown_suite.h6_test.html} | 0 ...shell_docs_markdown_suite.hidden_doc.html} | 0 ...docs_markdown_suite.hidden_moduledoc.html} | 0 ...ite.ignore_three_spaces_before_quote.html} | 0 ...rkdown_suite.init_per_group.19714658.html} | 0 ...rkdown_suite.init_per_group.19714722.html} | 0 ...rkdown_suite.init_per_group.19714786.html} | 0 ...rkdown_suite.init_per_group.19714850.html} | 0 ...rkdown_suite.init_per_group.19714914.html} | 0 ...rkdown_suite.init_per_group.19714978.html} | 0 ...rkdown_suite.init_per_group.19715042.html} | 0 ...rkdown_suite.init_per_group.19715106.html} | 0 ...rkdown_suite.init_per_group.19715170.html} | 0 ...rkdown_suite.init_per_group.19715234.html} | 0 ...rkdown_suite.init_per_group.19715298.html} | 0 ...rkdown_suite.init_per_group.19715362.html} | 0 ...rkdown_suite.init_per_group.19715426.html} | 0 ...l_docs_markdown_suite.init_per_group.html} | 0 ...docs_markdown_suite.inline_code_list.html} | 0 ..._docs_markdown_suite.inline_mfa_link.html} | 0 ...own_suite.italic_in_middle_word_test.html} | 0 ...cs_markdown_suite.italic_with_colons.html} | 0 ...te.list_format_with_bold_in_sentence.html} | 0 ...list_format_with_italics_in_sentence.html} | 0 ...docs_markdown_suite.list_with_format.html} | 0 ...arkdown_suite.multi_word_format_test.html} | 0 ...suite.multiline_bullet_indented_list.html} | 0 ...uite.multiline_bullet_indented_list2.html} | 0 ...markdown_suite.multiline_bullet_list.html} | 0 ...l_docs_markdown_suite.multiline_link.html} | 0 ...own_suite.multiline_link_not_allowed.html} | 0 ...ite.multiline_numbered_indented_list.html} | 0 ...te.multiline_numbered_indented_list2.html} | 0 ...rkdown_suite.multiline_numbered_list.html} | 0 ...ltiple_br_followed_by_paragraph_test.html} | 0 ...rkdown_suite.multiple_line_code_test.html} | 0 ..._suite.multiple_line_fence_code_test.html} | 0 ...kdown_suite.multiple_line_quote_test.html} | 0 ...e.multiple_lines_of_a_paragraph_test.html} | 0 ...l_docs_markdown_suite.new_lines_test.html} | 0 ...docs_markdown_suite.non_existing_doc.html} | 0 ...arkdown_suite.non_existing_moduledoc.html} | 0 ...arkdown_suite.odd_nested_bullet_list.html} | 0 ...kdown_suite.odd_nested_numbered_list.html} | 0 ...n_suite.paragraph_after_heading_test.html} | 0 ...wn_suite.paragraph_between_code_test.html} | 0 ...te.paragraph_between_fence_code_test.html} | 0 ...down_suite.paragraph_in_between_test.html} | 0 ...s_markdown_suite.parens_with_italics.html} | 0 ...uote_before_and_after_paragraph_test.html} | 0 ...arkdown_suite.quote_with_anchor_test.html} | 0 ...s_markdown_suite.quote_without_space.html} | 0 .../shell_docs_markdown_suite.setext_h1.html} | 0 .../shell_docs_markdown_suite.setext_h2.html} | 0 ...markdown_suite.single_line_code_test.html} | 0 ...e_fence_code_no_language_spaces_test.html} | 0 ...gle_line_fence_code_no_language_test.html} | 0 ...wn_suite.single_line_fence_code_test.html} | 0 ...arkdown_suite.single_line_quote_test.html} | 0 ...markdown_suite.singleton_bullet_list.html} | 0 ...bullet_list_followed_inner_paragraph.html} | 0 ...ullet_list_followed_inner_paragraph2.html} | 0 ...ullet_list_followed_inner_paragraph3.html} | 0 ...n_bullet_list_followed_new_paragraph.html} | 0 ...te.singleton_bullet_list_with_format.html} | 0 ...rkdown_suite.singleton_numbered_list.html} | 0 ...mbered_list_followed_inner_paragraph.html} | 0 ...bered_list_followed_inner_paragraph2.html} | 0 ...numbered_list_followed_new_paragraph.html} | 0 ....singleton_numbered_list_with_format.html} | 0 ...arkdown_suite.skip_symbols_in_inline.html} | 0 .../shell_docs_markdown_suite.src.html} | 0 ...cs_markdown_suite.start_with_br_test.html} | 0 ...rkdown_suite.table_with_escaped_bars.html} | 0 ..._docs_markdown_suite.table_with_rows.html} | 0 ...unmatched_complex_format_with_inline.html} | 0 ...rkdown_suite.unmatched_format_simple.html} | 0 ...n_suite.unmatched_format_with_inline.html} | 0 .../shell_docs_suite.ansi.html} | 0 .../shell_docs_suite.columns.html} | 0 .../shell_docs_suite.end_per_group.html} | 0 .../shell_docs_suite.end_per_suite.html} | 0 .../shell_docs_suite.init_per_group.html} | 0 .../shell_docs_suite.init_per_suite.html} | 0 .../shell_docs_suite.links.html} | 0 .../shell_docs_suite.normalize.html} | 0 .../shell_docs_suite.render.html} | 0 .../shell_docs_suite.render_non_native.html} | 0 .../shell_docs_suite.render_prop.html} | 0 .../shell_docs_suite.render_smoke.html} | 0 .../shell_docs_suite.src.html} | 0 .../shell_suite.bs_construct_suite.html} | 0 .../shell_suite.bs_match_bin_suite.html} | 0 .../shell_suite.bs_match_misc_suite.html} | 0 .../shell_suite.bs_match_tail_suite.html} | 0 .../shell_suite.end_per_group.19713922.html} | 0 .../shell_suite.end_per_group.19713986.html} | 0 .../shell_suite.end_per_group.19714178.html} | 0 .../shell_suite.end_per_group.407971.html} | 0 .../shell_suite.end_per_group.408035.html} | 0 .../shell_suite.end_per_group.425892.html} | 0 .../shell_suite.end_per_group.html} | 0 .../shell_suite.end_per_suite.html} | 0 .../shell_suite.forget.html} | 0 .../shell_suite.init_per_group.19713890.html} | 0 .../shell_suite.init_per_group.19713954.html} | 0 .../shell_suite.init_per_group.19714018.html} | 0 .../shell_suite.init_per_group.19714210.html} | 0 .../shell_suite.init_per_group.408003.html} | 0 .../shell_suite.init_per_group.408067.html} | 0 .../shell_suite.init_per_group.html} | 0 .../shell_suite.init_per_suite.html} | 0 .../shell_suite.known_bugs.html} | 0 ...efinitions_save_to_module_and_forget.html} | 0 .../shell_suite.otp_10302.html} | 0 .../shell_suite.otp_13719.html} | 0 .../shell_suite.otp_14285.html} | 0 .../shell_suite.otp_14296.html} | 0 .../shell_suite.otp_5195.html} | 0 .../shell_suite.otp_5226.html} | 0 .../shell_suite.otp_5327.html} | 0 .../shell_suite.otp_5435.html} | 0 .../shell_suite.otp_5915.html} | 0 .../shell_suite.otp_5916.html} | 0 .../shell_suite.otp_5990.html} | 0 .../shell_suite.otp_6166.html} | 0 .../shell_suite.otp_6554.html} | 0 .../shell_suite.otp_7184.html} | 0 .../shell_suite.otp_7232.html} | 0 .../shell_suite.otp_8393.html} | 0 .../shell_suite.progex_bit_syntax.html} | 0 .../shell_suite.progex_funs.html} | 0 .../shell_suite.progex_lc.html} | 0 .../shell_suite.progex_records.html} | 0 .../shell_suite.prompt_width.html} | 0 .../shell_suite.records.html} | 0 .../shell_suite.refman_bit_syntax.html} | 0 .../shell_suite.restricted_local.html} | 0 .../shell_suite.src.html} | 0 .../shell_suite.start_interactive.html} | 0 ...ll_suite.start_restricted_from_shell.html} | 0 ...ite.start_restricted_on_command_line.html} | 0 .../shell_suite.typed_records.html} | 0 .../shell_suite.types.html} | 0 .../shell_suite.whereis.html} | 0 .../sigils_suite.compiled_sigils.html} | 0 .../sigils_suite.end_per_suite.html} | 0 .../sigils_suite.init_per_suite.html} | 0 .../sigils_suite.parse_sigils.html} | 0 .../sigils_suite.scan_sigils.html} | 0 .../sigils_suite.src.html} | 0 .../slave_suite.end_per_suite.html} | 0 .../slave_suite.errors.html} | 0 .../slave_suite.init_per_suite.html} | 0 .../slave_suite.src.html} | 0 .../slave_suite.start_link_nodedown.html} | 0 .../slave_suite.t_start.html} | 0 .../slave_suite.t_start_link.html} | 0 .../sofs_suite.a_function_1.html} | 0 .../sofs_suite.canonical.html} | 0 .../sofs_suite.composite_1.html} | 0 .../sofs_suite.constant_function.html} | 0 .../sofs_suite.converse_1.html} | 0 .../sofs_suite.difference.html} | 0 .../sofs_suite.digraph.html} | 0 .../sofs_suite.domain_1.html} | 0 .../sofs_suite.drestriction.html} | 0 .../sofs_suite.end_per_group.19715906.html} | 0 .../sofs_suite.end_per_group.html} | 0 .../sofs_suite.end_per_suite.html} | 0 .../sofs_suite.extension.html} | 0 .../sofs_suite.family_1.html} | 0 .../sofs_suite.family_difference.html} | 0 .../sofs_suite.family_domain_1.html} | 0 .../sofs_suite.family_intersection_1.html} | 0 .../sofs_suite.family_intersection_2.html} | 0 .../sofs_suite.family_projection.html} | 0 .../sofs_suite.family_range_1.html} | 0 .../sofs_suite.family_specification.html} | 0 .../sofs_suite.family_to_relation_1.html} | 0 .../sofs_suite.family_union_1.html} | 0 .../sofs_suite.family_union_2.html} | 0 .../sofs_suite.from_sets_1.html} | 0 .../sofs_suite.from_term_1.html} | 0 .../sofs_suite.image.html} | 0 .../sofs_suite.init_per_group.19715874.html} | 0 .../sofs_suite.init_per_group.html} | 0 .../sofs_suite.init_per_suite.html} | 0 .../sofs_suite.intersection_1.html} | 0 .../sofs_suite.intersection_of_family_1.html} | 0 .../sofs_suite.inverse_1.html} | 0 .../sofs_suite.inverse_image.html} | 0 .../sofs_suite.is_a_function_1.html} | 0 .../sofs_suite.is_disjoint.html} | 0 .../sofs_suite.is_equal.html} | 0 .../sofs_suite.is_set_1.html} | 0 .../sofs_suite.is_sofs_set_1.html} | 0 .../sofs_suite.is_subset.html} | 0 .../sofs_suite.join.html} | 0 .../sofs_suite.misc.html} | 0 ...sofs_suite.multiple_relative_product.html} | 0 .../sofs_suite.no_elements_1.html} | 0 .../sofs_suite.partition_1.html} | 0 .../sofs_suite.partition_3.html} | 0 .../sofs_suite.partition_family.html} | 0 .../sofs_suite.product_1.html} | 0 .../sofs_suite.projection.html} | 0 .../sofs_suite.range_1.html} | 0 .../sofs_suite.relation_1.html} | 0 .../sofs_suite.relation_to_family_1.html} | 0 .../sofs_suite.relative_product_1.html} | 0 .../sofs_suite.relative_product_2.html} | 0 .../sofs_suite.restriction.html} | 0 .../sofs_suite.set_1.html} | 0 .../sofs_suite.specification.html} | 0 .../sofs_suite.src.html} | 0 .../sofs_suite.strict_relation_1.html} | 0 .../sofs_suite.substitution.html} | 0 .../sofs_suite.symdiff.html} | 0 .../sofs_suite.symmetric_partition.html} | 0 .../sofs_suite.to_sets_1.html} | 0 .../sofs_suite.union_1.html} | 0 .../sofs_suite.union_of_family_1.html} | 0 .../sofs_suite.weak_relation_1.html} | 0 ...suite.double_random_to_list.19715970.html} | 0 ...suite.double_random_to_list.19716098.html} | 0 ...suite.double_random_to_list.19716226.html} | 0 ...suite.double_random_to_list.19716354.html} | 0 ...ib_bench_suite.double_random_to_list.html} | 0 ...double_random_to_list_array.19716002.html} | 0 ...double_random_to_list_array.19716130.html} | 0 ...double_random_to_list_array.19716258.html} | 0 ...double_random_to_list_array.19716386.html} | 0 ...ch_suite.double_random_to_list_array.html} | 0 ...b_bench_suite.end_per_group.19716034.html} | 0 ...b_bench_suite.end_per_group.19716162.html} | 0 ...b_bench_suite.end_per_group.19716290.html} | 0 ...b_bench_suite.end_per_group.19716418.html} | 0 ...b_bench_suite.end_per_group.19716482.html} | 0 ...lib_bench_suite.end_per_group.408323.html} | 0 .../stdlib_bench_suite.end_per_group.html} | 0 .../stdlib_bench_suite.end_per_suite.html} | 0 ..._bench_suite.init_per_group.19715938.html} | 0 ..._bench_suite.init_per_group.19716066.html} | 0 ..._bench_suite.init_per_group.19716194.html} | 0 ..._bench_suite.init_per_group.19716322.html} | 0 ..._bench_suite.init_per_group.19716450.html} | 0 ..._bench_suite.init_per_group.19716514.html} | 0 .../stdlib_bench_suite.init_per_group.html} | 0 .../stdlib_bench_suite.init_per_suite.html} | 0 .../stdlib_bench_suite.multi_big.408291.html} | 0 .../stdlib_bench_suite.multi_big.html} | 0 .../stdlib_bench_suite.multi_medium.html} | 0 ...tdlib_bench_suite.multi_small.408259.html} | 0 .../stdlib_bench_suite.multi_small.html} | 0 .../stdlib_bench_suite.sched_big.408227.html} | 0 .../stdlib_bench_suite.sched_big.html} | 0 .../stdlib_bench_suite.sched_medium.html} | 0 ...tdlib_bench_suite.sched_small.408195.html} | 0 .../stdlib_bench_suite.sched_small.html} | 0 ...stdlib_bench_suite.single_big.408163.html} | 0 .../stdlib_bench_suite.single_big.html} | 0 .../stdlib_bench_suite.single_medium.html} | 0 ...dlib_bench_suite.single_small.408131.html} | 0 .../stdlib_bench_suite.single_small.html} | 0 .../stdlib_bench_suite.src.html} | 0 .../stdlib_suite.app_test.html} | 0 .../stdlib_suite.appup_test.html} | 0 .../stdlib_suite.assert_test.html} | 0 .../stdlib_suite.end_per_suite.html} | 0 .../stdlib_suite.init_per_suite.html} | 0 .../stdlib_suite.src.html} | 0 .../string_suite.casefold.html} | 0 .../string_suite.cd_gc.html} | 0 .../string_suite.centre.html} | 0 .../string_suite.chars.html} | 0 .../string_suite.chomp.html} | 0 .../string_suite.chr_rchr.html} | 0 .../string_suite.copies.html} | 0 .../string_suite.end_per_group.19716546.html} | 0 .../string_suite.end_per_group.html} | 0 .../string_suite.end_per_suite.html} | 0 .../string_suite.equal.html} | 0 .../string_suite.find.html} | 0 .../string_suite.init_per_group.408355.html} | 0 .../string_suite.init_per_group.html} | 0 .../string_suite.init_per_suite.html} | 0 .../string_suite.is_empty.html} | 0 .../string_suite.jaro_similarity.html} | 0 .../string_suite.join.html} | 0 .../string_suite.left_right.html} | 0 .../string_suite.len.html} | 0 .../string_suite.length.html} | 0 .../string_suite.lexemes.html} | 0 .../string_suite.lowercase.html} | 0 .../string_suite.meas.html} | 0 .../string_suite.nth_lexeme.html} | 0 .../string_suite.old_concat.html} | 0 .../string_suite.old_equal.html} | 0 .../string_suite.old_to_float.html} | 0 .../string_suite.old_to_integer.html} | 0 .../string_suite.old_tokens.html} | 0 .../string_suite.pad.html} | 0 .../string_suite.prefix.html} | 0 .../string_suite.replace.html} | 0 .../string_suite.reverse.html} | 0 .../string_suite.slice.html} | 0 .../string_suite.span_cspan.html} | 0 .../string_suite.split.html} | 0 .../string_suite.src.html} | 0 .../string_suite.str_rstr.html} | 0 .../string_suite.strip.html} | 0 .../string_suite.sub_string.html} | 0 .../string_suite.sub_word.html} | 0 .../string_suite.substr.html} | 0 .../string_suite.take.html} | 0 .../string_suite.titlecase.html} | 0 .../string_suite.to_float.html} | 0 .../string_suite.to_graphemes.html} | 0 .../string_suite.to_integer.html} | 0 .../string_suite.to_upper_to_lower.html} | 0 .../string_suite.trim.html} | 0 .../string_suite.uppercase.html} | 0 .../string_suite.words.html} | 0 .../run.2024-09-12_10.33.01}/suite.log | 18182 ++++++++-------- .../run.2024-09-12_10.33.01}/suite.log.html | 3070 +-- .../run.2024-09-12_10.33.01/suite.summary | 1 + .../supervisor_bridge_suite.badstart.html} | 0 ...upervisor_bridge_suite.end_per_suite.html} | 0 ...supervisor_bridge_suite.format_log_1.html} | 0 ...supervisor_bridge_suite.format_log_2.html} | 0 ...pervisor_bridge_suite.init_per_suite.html} | 0 .../supervisor_bridge_suite.mini_die.html} | 0 ...pervisor_bridge_suite.mini_terminate.html} | 0 ...ridge_suite.simple_global_supervisor.html} | 0 .../supervisor_bridge_suite.src.html} | 0 .../supervisor_bridge_suite.starting.html} | 0 ...e.already_started_outside_supervisor.html} | 0 .../supervisor_suite.child_adm.html} | 0 .../supervisor_suite.child_adm_simple.html} | 0 .../supervisor_suite.child_specs.html} | 0 .../supervisor_suite.child_specs_map.html} | 0 .../supervisor_suite.child_unlink.html} | 0 .../supervisor_suite.code_change.html} | 0 .../supervisor_suite.code_change_map.html} | 0 .../supervisor_suite.code_change_simple.html} | 0 ...ervisor_suite.code_change_simple_map.html} | 0 .../supervisor_suite.count_children.html} | 0 ...isor_suite.count_children_supervisor.html} | 0 ...isor_suite.count_restarting_children.html} | 0 ...e_child_specs_for_temporary_children.html} | 0 ...rt_parameters_for_temporary_children.html} | 0 ...ervisor_suite.end_per_group.19716610.html} | 0 ...ervisor_suite.end_per_group.19716674.html} | 0 ...ervisor_suite.end_per_group.19716738.html} | 0 ...ervisor_suite.end_per_group.19716802.html} | 0 ...ervisor_suite.end_per_group.19716866.html} | 0 ...ervisor_suite.end_per_group.19716930.html} | 0 ...ervisor_suite.end_per_group.19716994.html} | 0 ...ervisor_suite.end_per_group.19717058.html} | 0 ...upervisor_suite.end_per_group.425924.html} | 0 ...upervisor_suite.end_per_group.425988.html} | 0 .../supervisor_suite.end_per_group.html} | 0 .../supervisor_suite.end_per_suite.html} | 0 ...suite.external_start_no_progress_log.html} | 0 .../supervisor_suite.extra_return.html} | 0 ...or_suite.faulty_application_shutdown.html} | 0 .../supervisor_suite.format_log_1.html} | 0 .../supervisor_suite.format_log_2.html} | 0 ...supervisor_suite.get_callback_module.html} | 0 ...upervisor_suite.hanging_restart_loop.html} | 0 ...te.hanging_restart_loop_rest_for_one.html} | 0 ...or_suite.hanging_restart_loop_simple.html} | 0 ...rvisor_suite.init_per_group.19716578.html} | 0 ...rvisor_suite.init_per_group.19716642.html} | 0 ...rvisor_suite.init_per_group.19716706.html} | 0 ...rvisor_suite.init_per_group.19716770.html} | 0 ...rvisor_suite.init_per_group.19716834.html} | 0 ...rvisor_suite.init_per_group.19716898.html} | 0 ...rvisor_suite.init_per_group.19716962.html} | 0 ...rvisor_suite.init_per_group.19717026.html} | 0 ...pervisor_suite.init_per_group.425956.html} | 0 ...pervisor_suite.init_per_group.426020.html} | 0 .../supervisor_suite.init_per_group.html} | 0 .../supervisor_suite.init_per_suite.html} | 0 .../supervisor_suite.multiple_restarts.html} | 0 ...visor_suite.nonsignificant_temporary.html} | 0 ...visor_suite.nonsignificant_transient.html} | 0 .../supervisor_suite.one_for_all.html} | 0 ...ervisor_suite.one_for_all_escalation.html} | 0 ...ne_for_all_other_child_fails_restart.html} | 0 .../supervisor_suite.one_for_one.html} | 0 ...ervisor_suite.one_for_one_escalation.html} | 0 .../supervisor_suite.order_of_children.html} | 0 .../supervisor_suite.permanent_abnormal.html} | 0 .../supervisor_suite.permanent_normal.html} | 0 .../supervisor_suite.permanent_shutdown.html} | 0 .../supervisor_suite.rest_for_one.html} | 0 ...rvisor_suite.rest_for_one_escalation.html} | 0 ...st_for_one_other_child_fails_restart.html} | 0 ...suite.scale_start_stop_many_children.html} | 0 ...pervisor_suite.significant_bystander.html} | 0 ...ervisor_suite.significant_escalation.html} | 0 .../supervisor_suite.significant_simple.html} | 0 ...pervisor_suite.significant_temporary.html} | 0 ...pervisor_suite.significant_transient.html} | 0 ...or_suite.significant_upgrade_all_any.html} | 0 ..._suite.significant_upgrade_all_never.html} | 0 ...or_suite.significant_upgrade_any_all.html} | 0 ..._suite.significant_upgrade_any_never.html} | 0 ...isor_suite.significant_upgrade_child.html} | 0 ..._suite.significant_upgrade_never_all.html} | 0 ..._suite.significant_upgrade_never_any.html} | 0 ...visor_suite.simple_global_supervisor.html} | 0 .../supervisor_suite.simple_one_for_one.html} | 0 ..._suite.simple_one_for_one_corruption.html} | 0 ..._suite.simple_one_for_one_escalation.html} | 0 ...visor_suite.simple_one_for_one_extra.html} | 0 ...te.simple_one_for_one_restart_ignore.html} | 0 ...or_one_scale_many_temporary_children.html} | 0 ...or_suite.simple_one_for_one_shutdown.html} | 0 .../supervisor_suite.src.html} | 0 .../supervisor_suite.sup_flags.html} | 0 ..._suite.sup_start_child_returns_error.html} | 0 ...sup_start_child_returns_error_simple.html} | 0 ...ervisor_suite.sup_start_error_return.html} | 0 .../supervisor_suite.sup_start_fail.html} | 0 ...ervisor_suite.sup_start_ignore_child.html} | 0 ...pervisor_suite.sup_start_ignore_init.html} | 0 ...e_permanent_child_start_child_simple.html} | 0 ...ite.sup_start_ignore_temporary_child.html} | 0 ...t_ignore_temporary_child_start_child.html} | 0 ...e_temporary_child_start_child_simple.html} | 0 .../supervisor_suite.sup_start_map.html} | 0 ...sor_suite.sup_start_map_faulty_specs.html} | 0 ...upervisor_suite.sup_start_map_simple.html} | 0 .../supervisor_suite.sup_start_normal.html} | 0 ...up_start_restart_child_returns_error.html} | 0 ...upervisor_suite.sup_stop_brutal_kill.html} | 0 ...r_suite.sup_stop_brutal_kill_dynamic.html} | 0 .../supervisor_suite.sup_stop_infinity.html} | 0 ...e.sup_stop_non_shutdown_exit_dynamic.html} | 0 .../supervisor_suite.sup_stop_race.html} | 0 .../supervisor_suite.sup_stop_timeout.html} | 0 ...visor_suite.sup_stop_timeout_dynamic.html} | 0 .../supervisor_suite.temporary_abnormal.html} | 0 ...supervisor_suite.temporary_bystander.html} | 0 .../supervisor_suite.temporary_normal.html} | 0 .../supervisor_suite.temporary_shutdown.html} | 0 .../supervisor_suite.transient_abnormal.html} | 0 .../supervisor_suite.transient_normal.html} | 0 .../supervisor_suite.transient_shutdown.html} | 0 .../supervisor_suite.tree.html} | 0 .../sys_suite.end_per_suite.html} | 0 .../sys_suite.init_per_suite.html} | 0 .../sys_suite.install.html} | 0 .../sys_suite.log.html} | 0 .../sys_suite.log_to_file.html} | 0 .../sys_suite.special_process.html} | 0 .../sys_suite.src.html} | 0 .../sys_suite.stats.html} | 0 .../sys_suite.suspend.html} | 0 .../sys_suite.trace.html} | 0 .../tar_suite.apply_file_info_opts.html} | 0 .../tar_suite.atomic.html} | 0 .../tar_suite.bad_tar.html} | 0 .../tar_suite.borderline.html} | 0 .../tar_suite.bsdtgz.html} | 0 .../tar_suite.cooked_compressed.html} | 0 .../tar_suite.create_long_names.html} | 0 .../tar_suite.dotdot.html} | 0 .../tar_suite.end_per_suite.html} | 0 .../tar_suite.errors.html} | 0 .../tar_suite.extract_filtered.html} | 0 .../tar_suite.extract_from_binary.html} | 0 ...suite.extract_from_binary_compressed.html} | 0 .../tar_suite.extract_from_open_file.html} | 0 .../tar_suite.incompatible_options.html} | 0 .../tar_suite.init.html} | 0 .../tar_suite.init_per_suite.html} | 0 .../tar_suite.leading_slash.html} | 0 .../tar_suite.long_names.html} | 0 .../tar_suite.memory.html} | 0 .../tar_suite.open_add_close.html} | 0 ...tar_suite.read_other_implementations.html} | 0 .../tar_suite.roundtrip_metadata.html} | 0 .../tar_suite.sparse.html} | 0 .../tar_suite.src.html} | 0 .../tar_suite.symlinks.html} | 0 .../tar_suite.unicode.html} | 0 .../timer_simple_suite.apply_after1.html} | 0 .../timer_simple_suite.apply_after2.html} | 0 .../timer_simple_suite.apply_after3.html} | 0 .../timer_simple_suite.apply_after4.html} | 0 ...imple_suite.apply_after_invalid_args.html} | 0 .../timer_simple_suite.apply_interval1.html} | 0 .../timer_simple_suite.apply_interval2.html} | 0 ...le_suite.apply_interval_invalid_args.html} | 0 ...timer_simple_suite.apply_repeatedly1.html} | 0 ...timer_simple_suite.apply_repeatedly2.html} | 0 ..._suite.apply_repeatedly_invalid_args.html} | 0 .../timer_simple_suite.cancel1.html} | 0 .../timer_simple_suite.cancel2.html} | 0 .../timer_simple_suite.cancel3.html} | 0 .../timer_simple_suite.cancel4.html} | 0 .../timer_simple_suite.cancel5.html} | 0 .../timer_simple_suite.cancel6.html} | 0 ...mer_simple_suite.cancel_invalid_args.html} | 0 ..._simple_suite.end_per_group.19717346.html} | 0 ..._simple_suite.end_per_group.19717410.html} | 0 ..._simple_suite.end_per_group.19717474.html} | 0 ..._simple_suite.end_per_group.19717538.html} | 0 ..._simple_suite.end_per_group.19717602.html} | 0 ..._simple_suite.end_per_group.19717666.html} | 0 ..._simple_suite.end_per_group.19717730.html} | 0 ..._simple_suite.end_per_group.19717794.html} | 0 ..._simple_suite.end_per_group.19717858.html} | 0 .../timer_simple_suite.end_per_group.html} | 0 .../timer_simple_suite.end_per_suite.html} | 0 .../timer_simple_suite.exit_after1.html} | 0 .../timer_simple_suite.exit_after2.html} | 0 .../timer_simple_suite.exit_after3.html} | 0 .../timer_simple_suite.exit_after4.html} | 0 ...simple_suite.init_per_group.19717314.html} | 0 ...simple_suite.init_per_group.19717378.html} | 0 ...simple_suite.init_per_group.19717442.html} | 0 ...simple_suite.init_per_group.19717506.html} | 0 ...simple_suite.init_per_group.19717570.html} | 0 ...simple_suite.init_per_group.19717634.html} | 0 ...simple_suite.init_per_group.19717698.html} | 0 ...simple_suite.init_per_group.19717762.html} | 0 ...simple_suite.init_per_group.19717826.html} | 0 .../timer_simple_suite.init_per_group.html} | 0 .../timer_simple_suite.init_per_suite.html} | 0 .../timer_simple_suite.kill_after1.html} | 0 .../timer_simple_suite.kill_after2.html} | 0 .../timer_simple_suite.kill_after3.html} | 0 .../timer_simple_suite.nonexistent1.html} | 0 .../timer_simple_suite.nonexistent2.html} | 0 .../timer_simple_suite.send_after1.html} | 0 .../timer_simple_suite.send_after2.html} | 0 .../timer_simple_suite.send_after3.html} | 0 .../timer_simple_suite.send_after4.html} | 0 .../timer_simple_suite.send_after5.html} | 0 .../timer_simple_suite.send_after6.html} | 0 .../timer_simple_suite.send_after7.html} | 0 ...simple_suite.send_after_invalid_args.html} | 0 .../timer_simple_suite.send_interval1.html} | 0 .../timer_simple_suite.send_interval2.html} | 0 .../timer_simple_suite.send_interval3.html} | 0 .../timer_simple_suite.send_interval4.html} | 0 .../timer_simple_suite.send_interval5.html} | 0 ...ple_suite.send_interval_invalid_args.html} | 0 .../timer_simple_suite.sleep1.html} | 0 .../timer_simple_suite.sleep2.html} | 0 .../timer_simple_suite.src.html} | 0 .../timer_simple_suite.tc.html} | 0 .../timer_simple_suite.timer_perf.html} | 0 .../timer_simple_suite.unexpected1.html} | 0 .../timer_simple_suite.unexpected2.html} | 0 .../timer_simple_suite.unexpected3.html} | 0 .../timer_suite.do_big_test.html} | 0 .../timer_suite.end_per_suite.html} | 0 .../timer_suite.init_per_suite.html} | 0 .../timer_suite.src.html} | 0 .../unexpected_io.log.html | 371 +- .../unicode_suite.binaries_errors_limit.html} | 0 .../unicode_suite.error_info.html} | 0 ...x_binaries_errors_utf16_big.19718018.html} | 0 ...inaries_errors_utf16_little.19717986.html} | 0 ....ex_binaries_errors_utf32_big.408387.html} | 0 ...inaries_errors_utf32_little.19718050.html} | 0 ...ite.ex_binaries_errors_utf8.19717954.html} | 0 .../unicode_suite.exceptions.html} | 0 ...icode_suite.huge_illegal_code_points.html} | 0 .../unicode_suite.latin1.html} | 0 .../unicode_suite.normalize.html} | 0 .../unicode_suite.random_lists.html} | 0 .../unicode_suite.roundtrips.html} | 0 .../unicode_suite.src.html} | 0 ...de_suite.utf16_illegal_sequences_bif.html} | 0 ...ode_suite.utf8_illegal_sequences_bif.html} | 0 .../unicode_util_suite.casefold.html} | 0 .../unicode_util_suite.count.html} | 0 .../unicode_util_suite.cp.html} | 0 .../unicode_util_suite.extra.html} | 0 .../unicode_util_suite.gc.html} | 0 .../unicode_util_suite.get.html} | 0 .../unicode_util_suite.lookup.html} | 0 .../unicode_util_suite.lowercase.html} | 0 .../unicode_util_suite.nfc.html} | 0 .../unicode_util_suite.nfd.html} | 0 .../unicode_util_suite.nfkc.html} | 0 .../unicode_util_suite.nfkd.html} | 0 .../unicode_util_suite.src.html} | 0 .../unicode_util_suite.titlecase.html} | 0 .../unicode_util_suite.uppercase.html} | 0 .../unicode_util_suite.whitespace.html} | 0 ...ng_property_test_suite.end_per_suite.html} | 0 ...g_property_test_suite.init_per_suite.html} | 0 ...string_property_test_suite.normalize.html} | 0 ...string_property_test_suite.recompose.html} | 0 .../uri_string_property_test_suite.src.html} | 0 .../uri_string_suite.compose_query.html} | 0 ...ri_string_suite.compose_query_latin1.html} | 0 ..._string_suite.compose_query_negative.html} | 0 .../uri_string_suite.dissect_query.html} | 0 ..._string_suite.dissect_query_negative.html} | 0 ...ri_string_suite.interop_query_latin1.html} | 0 .../uri_string_suite.interop_query_utf8.html} | 0 .../uri_string_suite.normalize.html} | 0 ...ormalize_binary_pct_encoded_fragment.html} | 0 ...e.normalize_binary_pct_encoded_query.html} | 0 ...ormalize_binary_pct_encoded_userinfo.html} | 0 .../uri_string_suite.normalize_map.html} | 0 .../uri_string_suite.normalize_negative.html} | 0 ...suite.normalize_pct_encoded_fragment.html} | 0 ...suite.normalize_pct_encoded_negative.html} | 0 ...ng_suite.normalize_pct_encoded_query.html} | 0 ...suite.normalize_pct_encoded_userinfo.html} | 0 ...ri_string_suite.normalize_return_map.html} | 0 .../uri_string_suite.parse_binary.html} | 0 ...i_string_suite.parse_binary_fragment.html} | 0 .../uri_string_suite.parse_binary_host.html} | 0 ..._string_suite.parse_binary_host_ipv4.html} | 0 ..._string_suite.parse_binary_host_ipv6.html} | 0 .../uri_string_suite.parse_binary_path.html} | 0 ...te.parse_binary_pct_encoded_fragment.html} | 0 ...suite.parse_binary_pct_encoded_query.html} | 0 ...te.parse_binary_pct_encoded_userinfo.html} | 0 .../uri_string_suite.parse_binary_port.html} | 0 .../uri_string_suite.parse_binary_query.html} | 0 ...uri_string_suite.parse_binary_scheme.html} | 0 ...i_string_suite.parse_binary_userinfo.html} | 0 .../uri_string_suite.parse_fragment.html} | 0 .../uri_string_suite.parse_host.html} | 0 .../uri_string_suite.parse_host_ipv4.html} | 0 .../uri_string_suite.parse_host_ipv6.html} | 0 .../uri_string_suite.parse_list.html} | 0 .../uri_string_suite.parse_mixed.html} | 0 .../uri_string_suite.parse_negative.html} | 0 .../uri_string_suite.parse_path.html} | 0 ...ing_suite.parse_pct_encoded_fragment.html} | 0 ...string_suite.parse_pct_encoded_query.html} | 0 ...ing_suite.parse_pct_encoded_userinfo.html} | 0 .../uri_string_suite.parse_port.html} | 0 .../uri_string_suite.parse_query.html} | 0 ...string_suite.parse_recompose_autogen.html} | 0 .../uri_string_suite.parse_relative.html} | 0 .../uri_string_suite.parse_scheme.html} | 0 .../uri_string_suite.parse_special.html} | 0 .../uri_string_suite.parse_special2.html} | 0 .../uri_string_suite.parse_userinfo.html} | 0 .../uri_string_suite.quote.html} | 0 .../uri_string_suite.recompose_autogen.html} | 0 .../uri_string_suite.recompose_fragment.html} | 0 ...g_suite.recompose_host_absolute_path.html} | 0 ...g_suite.recompose_host_relative_path.html} | 0 ...tring_suite.recompose_parse_fragment.html} | 0 ...ri_string_suite.recompose_parse_path.html} | 0 ...i_string_suite.recompose_parse_query.html} | 0 .../uri_string_suite.recompose_path.html} | 0 .../uri_string_suite.recompose_query.html} | 0 ...ri_string_suite.regression_normalize.html} | 0 .../uri_string_suite.regression_parse.html} | 0 ...ri_string_suite.regression_recompose.html} | 0 ...ring_suite.resolve_abnormal_examples.html} | 0 .../uri_string_suite.resolve_base_uri.html} | 0 ...string_suite.resolve_normal_examples.html} | 0 .../uri_string_suite.resolve_return_map.html} | 0 .../uri_string_suite.src.html} | 0 .../uri_string_suite.transcode_basic.html} | 0 .../uri_string_suite.transcode_mixed.html} | 0 .../uri_string_suite.transcode_negative.html} | 0 .../uri_string_suite.transcode_options.html} | 0 .../win32reg_suite.init_per_suite.html} | 0 .../win32reg_suite.src.html} | 0 .../y2k_suite.date_1999_01_01.html} | 0 .../y2k_suite.date_1999_02_28.html} | 0 .../y2k_suite.date_1999_09_09.html} | 0 .../y2k_suite.date_2000_01_01.html} | 0 .../y2k_suite.date_2000_02_29.html} | 0 .../y2k_suite.date_2001_01_01.html} | 0 .../y2k_suite.date_2001_02_29.html} | 0 .../y2k_suite.date_2004_02_29.html} | 0 .../y2k_suite.end_per_suite.html} | 0 .../y2k_suite.init_per_suite.html} | 0 .../y2k_suite.src.html} | 0 .../zip_suite.aliases.html} | 0 .../zip_suite.atomic.html} | 0 .../zip_suite.bad_zip.html} | 0 .../zip_suite.basic_timestamp.19718370.html} | 0 .../zip_suite.basic_timestamp.19718562.html} | 0 .../zip_suite.basic_timestamp.408579.html} | 0 .../zip_suite.basic_timestamp.408739.html} | 0 .../zip_suite.basic_timestamp.409027.html} | 0 .../zip_suite.basic_timestamp.426180.html} | 0 .../zip_suite.basic_timestamp.426436.html} | 0 .../zip_suite.basic_timestamp.426628.html} | 0 .../zip_suite.basic_timestamp.426724.html} | 0 .../zip_suite.borderline.html} | 0 .../zip_suite.compress_control.html} | 0 .../zip_suite.end_per_group.19718242.html} | 0 .../zip_suite.end_per_group.19718466.html} | 0 .../zip_suite.end_per_group.19718690.html} | 0 .../zip_suite.end_per_group.19718722.html} | 0 .../zip_suite.end_per_group.19718818.html} | 0 .../zip_suite.end_per_group.19718946.html} | 0 .../zip_suite.end_per_group.19719458.html} | 0 .../zip_suite.end_per_group.19719490.html} | 0 .../zip_suite.end_per_group.19719682.html} | 0 .../zip_suite.end_per_group.19719810.html} | 0 .../zip_suite.end_per_group.19720418.html} | 0 .../zip_suite.end_per_group.19720450.html} | 0 .../zip_suite.end_per_group.19720834.html} | 0 .../zip_suite.end_per_group.19721058.html} | 0 .../zip_suite.end_per_group.19721762.html} | 0 .../zip_suite.end_per_group.19721794.html} | 0 .../zip_suite.end_per_group.19721826.html} | 0 .../zip_suite.end_per_group.408867.html} | 0 .../zip_suite.end_per_group.408899.html} | 0 .../zip_suite.end_per_group.426084.html} | 0 .../zip_suite.end_per_group.426276.html} | 0 .../zip_suite.end_per_group.426308.html} | 0 .../zip_suite.end_per_group.426532.html} | 0 .../zip_suite.end_per_group.426788.html} | 0 .../zip_suite.end_per_group.429061.html} | 0 .../zip_suite.end_per_group.html} | 0 .../zip_suite.end_per_suite.html} | 0 .../zip_suite.explicit_file_info.html} | 0 ...ip_suite.extended_timestamp.19718338.html} | 0 ...ip_suite.extended_timestamp.19718658.html} | 0 .../zip_suite.extended_timestamp.408611.html} | 0 .../zip_suite.extended_timestamp.408771.html} | 0 .../zip_suite.extended_timestamp.409059.html} | 0 .../zip_suite.extended_timestamp.426212.html} | 0 .../zip_suite.extended_timestamp.426468.html} | 0 .../zip_suite.extended_timestamp.426660.html} | 0 .../zip_suite.extended_timestamp.426756.html} | 0 .../zip_suite.fd_leak.html} | 0 .../zip_suite.foldl.html} | 0 .../zip_suite.init_per_group.19718178.html} | 0 .../zip_suite.init_per_group.19718210.html} | 0 .../zip_suite.init_per_group.19718274.html} | 0 .../zip_suite.init_per_group.19718498.html} | 0 .../zip_suite.init_per_group.19718754.html} | 0 .../zip_suite.init_per_group.19718786.html} | 0 .../zip_suite.init_per_group.19718850.html} | 0 .../zip_suite.init_per_group.19718978.html} | 0 .../zip_suite.init_per_group.19719522.html} | 0 .../zip_suite.init_per_group.19719586.html} | 0 .../zip_suite.init_per_group.19719714.html} | 0 .../zip_suite.init_per_group.19719842.html} | 0 .../zip_suite.init_per_group.19720482.html} | 0 .../zip_suite.init_per_group.19720642.html} | 0 .../zip_suite.init_per_group.19720866.html} | 0 .../zip_suite.init_per_group.19721090.html} | 0 .../zip_suite.init_per_group.408675.html} | 0 .../zip_suite.init_per_group.408931.html} | 0 .../zip_suite.init_per_group.408963.html} | 0 .../zip_suite.init_per_group.426116.html} | 0 .../zip_suite.init_per_group.426340.html} | 0 .../zip_suite.init_per_group.426372.html} | 0 .../zip_suite.init_per_group.426564.html} | 0 .../zip_suite.init_per_group.429029.html} | 0 .../zip_suite.init_per_group.429093.html} | 0 .../zip_suite.init_per_group.html} | 0 .../zip_suite.init_per_suite.html} | 0 .../zip_suite.list_dir_options.html} | 0 .../zip_suite.mode.19718306.html} | 0 .../zip_suite.mode.19718530.html} | 0 .../zip_suite.mode.19718594.html} | 0 .../zip_suite.mode.408547.html} | 0 .../zip_suite.mode.408707.html} | 0 .../zip_suite.mode.408995.html} | 0 .../zip_suite.mode.426148.html} | 0 .../zip_suite.mode.426404.html} | 0 .../zip_suite.mode.426596.html} | 0 .../zip_suite.open_leak.html} | 0 .../zip_suite.src.html} | 0 .../zip_suite.test_zip_dir.html} | 0 .../zip_suite.uid_gid.19718402.html} | 0 .../zip_suite.uid_gid.19718434.html} | 0 .../zip_suite.uid_gid.19718626.html} | 0 .../zip_suite.uid_gid.408643.html} | 0 .../zip_suite.uid_gid.408803.html} | 0 .../zip_suite.uid_gid.408835.html} | 0 .../zip_suite.uid_gid.426244.html} | 0 .../zip_suite.uid_gid.426500.html} | 0 .../zip_suite.uid_gid.426692.html} | 0 .../zip_suite.unicode.html} | 0 ...ite.unzip64_central_headers.19718882.html} | 0 ...ite.unzip64_central_headers.19719010.html} | 0 ...ite.unzip64_central_headers.19719618.html} | 0 ...ite.unzip64_central_headers.19719746.html} | 0 ...ite.unzip64_central_headers.19719874.html} | 0 ...ite.unzip64_central_headers.19720674.html} | 0 ...ite.unzip64_central_headers.19720898.html} | 0 ...ite.unzip64_central_headers.19721122.html} | 0 .../zip_suite.unzip64_central_headers.html} | 0 .../zip_suite.unzip_from_binary.html} | 0 .../zip_suite.unzip_jar.html} | 0 .../zip_suite.unzip_options.html} | 0 .../zip_suite.unzip_to_binary.html} | 0 .../zip_suite.unzip_traversal_exploit.html} | 0 ...ite.zip64_central_directory.19718914.html} | 0 ...ite.zip64_central_directory.19719650.html} | 0 ...ite.zip64_central_directory.19719778.html} | 0 ...ite.zip64_central_directory.19720322.html} | 0 ...ite.zip64_central_directory.19720706.html} | 0 ...ite.zip64_central_directory.19720930.html} | 0 ...ite.zip64_central_directory.19721538.html} | 0 ...suite.zip64_central_directory.409123.html} | 0 .../zip_suite.zip64_central_directory.html} | 0 ...suite.zip64_central_headers.19719554.html} | 0 ...suite.zip64_central_headers.19720514.html} | 0 .../zip_suite.zip64_central_headers.html} | 0 .../zip_suite.zip_api.html} | 0 .../zip_suite.zip_options.html} | 0 .../zip_suite.zip_to_binary.html} | 0 .../zzz_suite.lc_graph.html} | 0 .../zzz_suite.src.html} | 0 .../select_suite.src.html | 0 .../sets_property_test_suite.src.html | 0 .../sets_suite.src.html | 0 .../shell_docs_markdown_suite.src.html | 0 .../shell_docs_suite.src.html | 0 .../shell_suite.src.html | 0 .../sigils_suite.src.html | 0 .../slave_suite.src.html | 0 .../sofs_suite.src.html | 0 .../stdlib_bench_suite.src.html | 0 .../stdlib_suite.src.html | 0 .../string_suite.src.html | 0 .../supervisor_bridge_suite.src.html | 0 .../supervisor_suite.src.html | 0 .../sys_suite.src.html | 0 .../tar_suite.src.html | 0 .../timer_simple_suite.src.html | 0 .../timer_suite.src.html | 0 .../unicode_suite.src.html | 0 .../unicode_util_suite.src.html | 0 .../uri_string_property_test_suite.src.html | 0 .../uri_string_suite.src.html | 0 .../win32reg_suite.src.html | 0 .../y2k_suite.src.html | 0 .../zip_suite.src.html | 0 .../zzz_suite.src.html | 0 .../misc_io.log.html | 2 +- .../oc_event.beam | Bin .../oc_fsm.beam | Bin .../oc_server.beam | Bin .../oc_statem.beam | Bin .../simple_server.beam | Bin .../simple_server_mon.beam | Bin .../simple_server_timer.beam | Bin .../simple_server_timer_mon.beam | Bin .../t | Bin .../totals.info | Bin 0 -> 95 bytes .../ct_default.css | 0 .../ctlog.html | 12 +- .../index.html | 12 +- .../jquery-latest.js | 0 .../jquery.tablesorter.min.js | 0 .../last_name | 1 + .../last_test.html | 2 +- .../erl_print_suite.src.html | 0 .../erlc_suite.src.html | 0 .../erlexec_suite.src.html | 0 .../ethread_suite.src.html | 0 .../install_suite.src.html | 0 .../last_link.html | 2 +- .../make_test_dir.system_test.logs/last_name | 1 + .../nt_suite.src.html | 0 .../otp_suite.src.html | 0 .../parallel_messages_suite.src.html | 0 .../run.2024-09-12_11.29.21}/cover.html | 0 .../ct_framework.end_per_suite.4098.html} | 0 .../ct_framework.end_per_suite.4162.html} | 0 .../ct_framework.end_per_suite.4482.html} | 0 .../ct_framework.end_per_suite.4674.html} | 0 .../ct_framework.end_per_suite.5122.html} | 0 .../ct_framework.end_per_suite.html} | 0 .../ct_framework.init_per_suite.4066.html} | 0 .../ct_framework.init_per_suite.4130.html} | 0 .../ct_framework.init_per_suite.4514.html} | 0 .../ct_framework.init_per_suite.5.html} | 0 .../ct_framework.init_per_suite.5090.html} | 0 .../ct_framework.init_per_suite.html} | 0 .../erl_print_suite.character.html} | 0 .../erl_print_suite.erlang_display.html} | 0 .../erl_print_suite.float.html} | 0 .../erl_print_suite.integer.html} | 0 .../erl_print_suite.quote.html} | 0 .../erl_print_suite.snprintf.html} | 0 .../erl_print_suite.src.html} | 0 .../erl_print_suite.string.html} | 0 .../erlc_suite.arg_overflow.163.html} | 0 .../erlc_suite.arg_overflow.html} | 0 .../erlc_suite.compile_erl.1218.html} | 0 .../erlc_suite.compile_erl.html} | 0 .../erlc_suite.compile_mib.67.html} | 0 .../erlc_suite.compile_mib.html} | 0 .../erlc_suite.compile_script.35.html} | 0 .../erlc_suite.compile_script.html} | 0 .../erlc_suite.compile_yecc.3.html} | 0 .../erlc_suite.compile_yecc.html} | 0 .../erlc_suite.deep_cwd.131.html} | 0 .../erlc_suite.deep_cwd.html} | 0 .../erlc_suite.end_per_group.2338.html} | 0 .../erlc_suite.end_per_group.3842.html} | 0 .../erlc_suite.end_per_group.html} | 0 .../erlc_suite.end_per_suite.html} | 0 .../erlc_suite.features.3810.html} | 0 .../erlc_suite.features.html} | 0 .../erlc_suite.features_all.2978.html} | 0 .../erlc_suite.features_all.html} | 0 ...lc_suite.features_atom_warnings.2498.html} | 0 .../erlc_suite.features_atom_warnings.html} | 0 .../erlc_suite.features_directives.2466.html} | 0 .../erlc_suite.features_directives.html} | 0 .../erlc_suite.features_disable.2882.html} | 0 .../erlc_suite.features_disable.html} | 0 ...lc_suite.features_erlc_describe.2402.html} | 0 .../erlc_suite.features_erlc_describe.html} | 0 ...rlc_suite.features_erlc_unknown.2434.html} | 0 .../erlc_suite.features_erlc_unknown.html} | 0 .../erlc_suite.features_include.3522.html} | 0 .../erlc_suite.features_include.html} | 0 .../erlc_suite.features_load.3202.html} | 0 .../erlc_suite.features_load.html} | 0 .../erlc_suite.features_macros.2530.html} | 0 .../erlc_suite.features_macros.html} | 0 .../erlc_suite.features_runtime.3298.html} | 0 .../erlc_suite.features_runtime.html} | 0 .../erlc_suite.good_citizen.99.html} | 0 .../erlc_suite.good_citizen.html} | 0 .../erlc_suite.init_per_group.1186.html} | 0 .../erlc_suite.init_per_group.2370.html} | 0 .../erlc_suite.init_per_group.html} | 0 .../erlc_suite.init_per_suite.html} | 0 .../erlc_suite.make_dep_options.195.html} | 0 .../erlc_suite.make_dep_options.html} | 0 .../erlc_suite.src.html} | 0 .../erlc_suite.unicode_paths.227.html} | 0 .../erlc_suite.unicode_paths.html} | 0 .../erlexec_suite.args_file.html} | 0 .../erlexec_suite.args_file_env.html} | 0 .../erlexec_suite.argument_separation.html} | 0 .../erlexec_suite.argument_with_option.html} | 0 .../erlexec_suite.end_per_suite.html} | 0 .../erlexec_suite.env.html} | 0 .../erlexec_suite.evil_args_file.html} | 0 .../erlexec_suite.init_per_suite.html} | 0 .../erlexec_suite.missing_args_file.html} | 0 .../erlexec_suite.otp_7461.html} | 0 .../erlexec_suite.src.html} | 0 ...exec_suite.zdbbl_dist_buf_busy_limit.html} | 0 .../ethread_suite.atomic.html} | 0 .../ethread_suite.broadcast.html} | 0 .../ethread_suite.cond_wait.html} | 0 .../ethread_suite.create_join_thread.html} | 0 .../ethread_suite.detached_thread.html} | 0 .../ethread_suite.dw_atomic_massage.html} | 0 .../ethread_suite.equal_tids.html} | 0 .../ethread_suite.max_threads.html} | 0 .../ethread_suite.mutex.html} | 0 .../ethread_suite.rwmutex.html} | 0 .../ethread_suite.rwspinlock.html} | 0 .../ethread_suite.spinlock.html} | 0 .../ethread_suite.src.html} | 0 .../ethread_suite.thread_name.html} | 0 .../ethread_suite.try_lock_mutex.html} | 0 .../ethread_suite.tsd.html} | 0 .../install_suite.'bin white space'.html} | 0 .../install_suite.bin_default.html} | 0 .../install_suite.bin_default_dirty.html} | 0 .../install_suite.bin_dirname_fail.html} | 0 .../install_suite.bin_no_srcfile.html} | 0 ...nstall_suite.bin_no_use_dirname_fail.html} | 0 .../install_suite.bin_not_abs.html} | 0 .../install_suite.bin_ok_symlink.html} | 0 .../install_suite.bin_outside_eprfx.html} | 0 ...nstall_suite.bin_outside_eprfx_dirty.html} | 0 .../install_suite.bin_same_dir.html} | 0 ...stall_suite.bin_unreachable_absolute.html} | 0 ...stall_suite.bin_unreachable_relative.html} | 0 .../install_suite.bin_unreasonable_path.html} | 0 .../install_suite.end_per_suite.html} | 0 .../install_suite.init_per_suite.html} | 0 .../install_suite.src.html} | 0 .../run.2024-09-12_11.29.21/nt_suite.nt.html} | 0 .../nt_suite.src.html} | 0 .../otp_suite.call_to_deprecated.html} | 0 .../otp_suite.call_to_now_0.html} | 0 .../otp_suite.call_to_size_1.html} | 0 ...otp_suite.deprecated_not_in_obsolete.html} | 0 .../otp_suite.end_per_suite.html} | 0 .../otp_suite.erl_file_encoding.html} | 0 .../otp_suite.init_per_suite.html} | 0 ...tp_suite.obsolete_but_not_deprecated.html} | 0 ...suite.runtime_dependencies_functions.html} | 0 ...p_suite.runtime_dependencies_modules.html} | 0 .../otp_suite.src.html} | 0 .../otp_suite.strong_components.html} | 0 ...e.test_runtime_dependencies_versions.html} | 0 .../otp_suite.undefined_functions.html} | 0 .../otp_suite.xml_file_encoding.html} | 0 .../parallel_messages_suite.src.html} | 0 ...te.test_message_queue_data_switching.html} | 0 ...ages_suite.test_throughput_benchmark.html} | 0 .../run_erl_suite.basic.html} | 0 .../run_erl_suite.defunct.html} | 0 .../run_erl_suite.heavier.html} | 0 .../run_erl_suite.heavy.html} | 0 .../run_erl_suite.sleepy_child.html} | 0 .../run_erl_suite.src.html} | 0 .../run.2024-09-12_11.29.21}/suite.log | 902 +- .../run.2024-09-12_11.29.21}/suite.log.html | 218 +- .../run.2024-09-12_11.29.21/suite.summary | 1 + .../unexpected_io.log.html | 2 +- .../upgrade_suite.ancient_major.html} | 0 .../upgrade_suite.end_per_suite.html} | 0 .../upgrade_suite.init_per_suite.html} | 0 .../upgrade_suite.major.html} | 0 .../upgrade_suite.minor.html} | 0 .../upgrade_suite.src.html} | 0 .../z_suite.core_files.html} | 0 .../run.2024-09-12_11.29.21/z_suite.src.html} | 0 .../run_erl_suite.src.html | 0 .../upgrade_suite.src.html | 0 .../z_suite.src.html | 0 .../misc_io.log.html | 2 +- .../test.beam | Bin 752 -> 752 bytes .../totals.info | Bin 0 -> 92 bytes prs/8803/ct_logs/index.html | 18 +- prs/8803/ct_logs/suite.log.latest.html | 2 +- ...e0c => variables-test_server@7a1fde2d1d55} | 0 ...355 => variables-test_server@a4cca6e7dcb5} | 0 prs/8803/doc/system/.build | 2 +- .../system/Erlang System Documentation.epub | Bin 659393 -> 659384 bytes prs/8803/doc/system/applications.html | 112 +- prs/8803/doc/system/appup_cookbook.html | 360 +- prs/8803/doc/system/benchmarking.html | 4 +- prs/8803/doc/system/binaryhandling.html | 112 +- prs/8803/doc/system/bit_syntax.html | 38 +- prs/8803/doc/system/c_port.html | 230 +- prs/8803/doc/system/c_portdriver.html | 204 +- prs/8803/doc/system/code_loading.html | 24 +- prs/8803/doc/system/commoncaveats.html | 98 +- prs/8803/doc/system/conc_prog.html | 374 +- prs/8803/doc/system/create_target.html | 420 +- prs/8803/doc/system/data_types.html | 158 +- prs/8803/doc/system/design_principles.html | 162 +- .../doc/system/dist/search_data-0DC1A4B6.js | 1 + .../doc/system/dist/search_data-9BDB5A32.js | 1 - prs/8803/doc/system/distributed.html | 12 +- .../doc/system/distributed_applications.html | 22 +- prs/8803/doc/system/documentation.html | 96 +- prs/8803/doc/system/drivers.html | 12 +- prs/8803/doc/system/eff_guide_functions.html | 64 +- prs/8803/doc/system/eff_guide_processes.html | 122 +- prs/8803/doc/system/erl_interface.html | 290 +- prs/8803/doc/system/error_logging.html | 32 +- prs/8803/doc/system/errors.html | 16 +- prs/8803/doc/system/events.html | 82 +- prs/8803/doc/system/example.html | 10 +- prs/8803/doc/system/expressions.html | 416 +- prs/8803/doc/system/funs.html | 354 +- prs/8803/doc/system/gen_server_concepts.html | 90 +- .../doc/system/included_applications.html | 72 +- prs/8803/doc/system/install-win32.html | 10 +- prs/8803/doc/system/list_comprehensions.html | 118 +- prs/8803/doc/system/listhandling.html | 90 +- prs/8803/doc/system/macros.html | 108 +- prs/8803/doc/system/maps.html | 66 +- prs/8803/doc/system/modules.html | 36 +- prs/8803/doc/system/nif.html | 88 +- prs/8803/doc/system/opaques.html | 10 +- prs/8803/doc/system/otp-patch-apply.html | 2 +- prs/8803/doc/system/patterns.html | 6 +- prs/8803/doc/system/prog_ex_records.html | 102 +- prs/8803/doc/system/records_macros.html | 172 +- prs/8803/doc/system/ref_man_functions.html | 34 +- prs/8803/doc/system/ref_man_processes.html | 8 +- prs/8803/doc/system/ref_man_records.html | 42 +- prs/8803/doc/system/release_handling.html | 154 +- prs/8803/doc/system/release_structure.html | 42 +- prs/8803/doc/system/robustness.html | 264 +- prs/8803/doc/system/search.html | 2 +- prs/8803/doc/system/seq_prog.html | 784 +- prs/8803/doc/system/spec_proc.html | 382 +- prs/8803/doc/system/statem.html | 804 +- prs/8803/doc/system/sup_princ.html | 124 +- prs/8803/doc/system/tablesdatabases.html | 132 +- prs/8803/doc/system/typespec.html | 74 +- prs/8803/doc/upcoming_incompatibilities.html | 14 +- prs/8803/erts-15.0.1/doc/html/alt_dist.html | 790 +- .../doc/html/automaticyieldingofccode.html | 4 +- .../erts-15.0.1/doc/html/beam_makeops.html | 584 +- prs/8803/erts-15.0.1/doc/html/beamasm.html | 58 +- .../erts-15.0.1/doc/html/codeloading.html | 4 +- prs/8803/erts-15.0.1/doc/html/crash_dump.html | 14 +- prs/8803/erts-15.0.1/doc/html/driver.html | 528 +- .../erts-15.0.1/doc/html/driver_entry.html | 40 +- prs/8803/erts-15.0.1/doc/html/erl_cmd.html | 54 +- .../doc/html/erl_dist_protocol.html | 42 +- prs/8803/erts-15.0.1/doc/html/erl_driver.html | 396 +- .../erts-15.0.1/doc/html/erl_ext_dist.html | 2 +- prs/8803/erts-15.0.1/doc/html/erl_nif.html | 714 +- .../erts-15.0.1/doc/html/erl_prim_loader.html | 2 +- prs/8803/erts-15.0.1/doc/html/erl_tracer.html | 140 +- prs/8803/erts-15.0.1/doc/html/erlang.html | 826 +- prs/8803/erts-15.0.1/doc/html/erlsrv_cmd.html | 22 +- .../erts-15.0.1/doc/html/escript_cmd.html | 32 +- .../doc/html/garbagecollection.html | 34 +- prs/8803/erts-15.0.1/doc/html/inet_cfg.html | 90 +- prs/8803/erts-15.0.1/doc/html/init.html | 28 +- prs/8803/erts-15.0.1/doc/html/match_spec.html | 98 +- prs/8803/erts-15.0.1/doc/html/notes.html | 26 +- .../erts-15.0.1/doc/html/persistent_term.html | 6 +- .../erts-15.0.1/doc/html/supercarrier.html | 4 +- .../erts-15.0.1/doc/html/time_correction.html | 6 +- prs/8803/erts-15.0.1/doc/html/tracing.html | 22 +- prs/8803/erts-15.0.1/doc/html/zlib.html | 74 +- prs/8803/lib/asn1-5.3/doc/html/.build | 2 +- prs/8803/lib/asn1-5.3/doc/html/asn1.epub | Bin 94874 -> 94874 bytes .../doc/html/asn1_getting_started.html | 230 +- prs/8803/lib/asn1-5.3/doc/html/asn1_spec.html | 204 +- prs/8803/lib/asn1-5.3/doc/html/asn1ct.html | 6 +- .../doc/html/dist/search_data-06A31C18.js | 1 - .../doc/html/dist/search_data-965B670D.js | 1 + prs/8803/lib/asn1-5.3/doc/html/search.html | 2 +- prs/8803/lib/common_test-1.27/doc/html/.build | 2 +- .../doc/html/basics_chapter.html | 18 +- .../doc/html/common_test.epub | Bin 403843 -> 403842 bytes .../doc/html/config_file_chapter.html | 192 +- .../doc/html/cover_chapter.html | 26 +- .../lib/common_test-1.27/doc/html/ct.html | 40 +- .../lib/common_test-1.27/doc/html/ct_ftp.html | 8 +- .../doc/html/ct_hooks_chapter.html | 100 +- .../common_test-1.27/doc/html/ct_master.html | 2 +- .../doc/html/ct_master_chapter.html | 56 +- .../doc/html/ct_netconfc.html | 28 +- .../doc/html/ct_property_test.html | 50 +- .../doc/html/ct_property_test_chapter.html | 60 +- .../common_test-1.27/doc/html/ct_run_cmd.html | 8 +- .../common_test-1.27/doc/html/ct_snmp.html | 8 +- .../lib/common_test-1.27/doc/html/ct_ssh.html | 16 +- .../common_test-1.27/doc/html/ct_telnet.html | 38 +- .../doc/html/dependencies_chapter.html | 126 +- .../doc/html/dist/search_data-1A83014C.js | 1 - .../doc/html/dist/search_data-5DA668F7.js | 1 + .../doc/html/event_handler_chapter.html | 10 +- .../doc/html/example_chapter.html | 144 +- .../doc/html/getting_started_chapter.html | 46 +- .../doc/html/run_test_chapter.html | 376 +- .../lib/common_test-1.27/doc/html/search.html | 2 +- .../doc/html/unix_telnet.html | 12 +- .../doc/html/write_test_chapter.html | 184 +- .../lib/compiler-8.5.1/doc/html/beam_ssa.html | 6 +- .../lib/compiler-8.5.1/doc/html/compile.html | 18 +- .../lib/compiler-8.5.1/doc/html/compiler.epub | Bin 185379 -> 185379 bytes .../lib/compiler-8.5.1/doc/html/notes.html | 46 +- .../compiler-8.5.1/doc/html/ssa_checks.html | 24 +- prs/8803/lib/crypto-5.5/doc/html/crypto.epub | Bin 128239 -> 128246 bytes prs/8803/lib/crypto-5.5/doc/html/crypto.html | 38 +- .../lib/crypto-5.5/doc/html/engine_keys.html | 22 +- .../lib/crypto-5.5/doc/html/engine_load.html | 46 +- prs/8803/lib/crypto-5.5/doc/html/new_api.html | 60 +- .../lib/debugger-5.4/doc/html/debugger.epub | Bin 220475 -> 220478 bytes .../doc/html/debugger_chapter.html | 34 +- prs/8803/lib/debugger-5.4/doc/html/i.html | 6 +- prs/8803/lib/debugger-5.4/doc/html/int.html | 2 +- .../lib/dialyzer-5.2/doc/html/dialyzer.epub | Bin 66229 -> 66222 bytes .../lib/dialyzer-5.2/doc/html/dialyzer.html | 20 +- .../doc/html/dialyzer_chapter.html | 28 +- .../lib/diameter-2.4/doc/html/diameter.epub | Bin 146724 -> 146730 bytes .../lib/diameter-2.4/doc/html/diameter.html | 358 +- .../diameter-2.4/doc/html/diameter_app.html | 12 +- .../diameter-2.4/doc/html/diameter_codec.html | 2 +- .../diameter-2.4/doc/html/diameter_dict.html | 28 +- .../diameter-2.4/doc/html/diameterc_cmd.html | 2 +- .../doc/html/edoc_doclet_markdown.html | 4 +- prs/8803/lib/eldap-1.2.13/doc/html/eldap.epub | Bin 34586 -> 34588 bytes prs/8803/lib/eldap-1.2.13/doc/html/eldap.html | 38 +- .../lib/erl_interface-5.5.2/doc/html/ei.html | 192 +- .../doc/html/ei_connect.html | 184 +- .../doc/html/ei_global.html | 8 +- .../doc/html/ei_users_guide.html | 118 +- .../doc/html/erl_call_cmd.html | 4 +- .../doc/html/erl_interface.epub | Bin 99671 -> 99693 bytes prs/8803/lib/et-1.7.1/doc/html/et.epub | Bin 303903 -> 303898 bytes prs/8803/lib/et-1.7.1/doc/html/et_desc.html | 72 +- .../lib/et-1.7.1/doc/html/et_examples.html | 390 +- .../lib/et-1.7.1/doc/html/et_tutorial.html | 106 +- prs/8803/lib/eunit-2.9.1/doc/html/.build | 2 +- .../doc/html/dist/search_data-4CEF3D2D.js | 1 + .../doc/html/dist/search_data-C541596B.js | 1 - prs/8803/lib/eunit-2.9.1/doc/html/eunit.epub | Bin 45835 -> 45837 bytes prs/8803/lib/eunit-2.9.1/doc/html/search.html | 2 +- prs/8803/lib/ftp-1.2.2/doc/html/ftp.epub | Bin 33914 -> 33912 bytes .../lib/ftp-1.2.2/doc/html/ftp_client.html | 26 +- .../lib/inets-9.2/doc/html/http_client.html | 38 +- .../lib/inets-9.2/doc/html/http_server.html | 102 +- prs/8803/lib/inets-9.2/doc/html/httpc.html | 14 +- prs/8803/lib/inets-9.2/doc/html/httpd.html | 66 +- prs/8803/lib/inets-9.2/doc/html/inets.epub | Bin 153379 -> 153386 bytes .../inets-9.2/doc/html/inets_services.html | 2 +- .../html/assets/java/allclasses-index.html | 4 +- .../doc/html/assets/java/allclasses.html | 4 +- .../html/assets/java/allpackages-index.html | 4 +- .../otp/erlang/AbstractConnection.html | 4 +- .../com/ericsson/otp/erlang/AbstractNode.html | 4 +- .../com/ericsson/otp/erlang/GenericQueue.html | 4 +- .../ericsson/otp/erlang/OtpAuthException.html | 4 +- .../ericsson/otp/erlang/OtpConnection.html | 4 +- .../otp/erlang/OtpCookedConnection.html | 4 +- .../java/com/ericsson/otp/erlang/OtpEpmd.html | 4 +- .../ericsson/otp/erlang/OtpErlangAtom.html | 4 +- .../ericsson/otp/erlang/OtpErlangBinary.html | 4 +- .../ericsson/otp/erlang/OtpErlangBitstr.html | 4 +- .../ericsson/otp/erlang/OtpErlangBoolean.html | 4 +- .../ericsson/otp/erlang/OtpErlangByte.html | 4 +- .../ericsson/otp/erlang/OtpErlangChar.html | 4 +- .../otp/erlang/OtpErlangDecodeException.html | 4 +- .../ericsson/otp/erlang/OtpErlangDouble.html | 4 +- .../otp/erlang/OtpErlangException.html | 4 +- .../ericsson/otp/erlang/OtpErlangExit.html | 4 +- .../otp/erlang/OtpErlangExternalFun.html | 4 +- .../ericsson/otp/erlang/OtpErlangFloat.html | 4 +- .../com/ericsson/otp/erlang/OtpErlangFun.html | 4 +- .../com/ericsson/otp/erlang/OtpErlangInt.html | 4 +- .../otp/erlang/OtpErlangList.SubList.html | 4 +- .../ericsson/otp/erlang/OtpErlangList.html | 4 +- .../ericsson/otp/erlang/OtpErlangLong.html | 4 +- .../com/ericsson/otp/erlang/OtpErlangMap.html | 4 +- .../otp/erlang/OtpErlangObject.Hash.html | 4 +- .../ericsson/otp/erlang/OtpErlangObject.html | 4 +- .../com/ericsson/otp/erlang/OtpErlangPid.html | 4 +- .../ericsson/otp/erlang/OtpErlangPort.html | 4 +- .../otp/erlang/OtpErlangRangeException.html | 4 +- .../com/ericsson/otp/erlang/OtpErlangRef.html | 4 +- .../ericsson/otp/erlang/OtpErlangShort.html | 4 +- .../ericsson/otp/erlang/OtpErlangString.html | 4 +- .../ericsson/otp/erlang/OtpErlangTuple.html | 4 +- .../ericsson/otp/erlang/OtpErlangUInt.html | 4 +- .../ericsson/otp/erlang/OtpErlangUShort.html | 4 +- .../com/ericsson/otp/erlang/OtpException.html | 4 +- .../com/ericsson/otp/erlang/OtpExternal.html | 4 +- .../erlang/OtpGenericTransportFactory.html | 4 +- .../ericsson/otp/erlang/OtpInputStream.html | 4 +- .../com/ericsson/otp/erlang/OtpLocalNode.html | 4 +- .../java/com/ericsson/otp/erlang/OtpMbox.html | 4 +- .../java/com/ericsson/otp/erlang/OtpMsg.html | 4 +- .../ericsson/otp/erlang/OtpNode.Acceptor.html | 4 +- .../otp/erlang/OtpNode.Mailboxes.html | 4 +- .../java/com/ericsson/otp/erlang/OtpNode.html | 4 +- .../ericsson/otp/erlang/OtpNodeStatus.html | 4 +- .../ericsson/otp/erlang/OtpOutputStream.html | 4 +- .../java/com/ericsson/otp/erlang/OtpPeer.html | 4 +- .../java/com/ericsson/otp/erlang/OtpSelf.html | 4 +- .../com/ericsson/otp/erlang/OtpServer.html | 4 +- .../otp/erlang/OtpServerSocketTransport.html | 4 +- .../otp/erlang/OtpServerTransport.html | 4 +- .../otp/erlang/OtpSocketTransport.html | 4 +- .../otp/erlang/OtpSocketTransportFactory.html | 4 +- .../com/ericsson/otp/erlang/OtpTransport.html | 4 +- .../otp/erlang/OtpTransportFactory.html | 4 +- .../ericsson/otp/erlang/package-summary.html | 4 +- .../com/ericsson/otp/erlang/package-tree.html | 4 +- .../doc/html/assets/java/constant-values.html | 4 +- .../doc/html/assets/java/deprecated-list.html | 4 +- .../doc/html/assets/java/help-doc.html | 4 +- .../doc/html/assets/java/index-all.html | 4 +- .../doc/html/assets/java/index.html | 2 +- .../html/assets/java/member-search-index.zip | Bin 5397 -> 5397 bytes .../doc/html/assets/java/overview-tree.html | 4 +- .../html/assets/java/package-search-index.zip | Bin 238 -> 238 bytes .../doc/html/assets/java/serialized-form.html | 4 +- .../html/assets/java/type-search-index.zip | Bin 563 -> 563 bytes prs/8803/lib/kernel-10.0.1/doc/html/app.html | 66 +- .../kernel-10.0.1/doc/html/application.html | 2 +- prs/8803/lib/kernel-10.0.1/doc/html/code.html | 26 +- .../lib/kernel-10.0.1/doc/html/config.html | 4 +- .../kernel-10.0.1/doc/html/eep48_chapter.html | 26 +- .../lib/kernel-10.0.1/doc/html/erl_epmd.html | 4 +- prs/8803/lib/kernel-10.0.1/doc/html/erpc.html | 28 +- prs/8803/lib/kernel-10.0.1/doc/html/file.html | 46 +- .../lib/kernel-10.0.1/doc/html/gen_sctp.html | 432 +- .../lib/kernel-10.0.1/doc/html/gen_tcp.html | 142 +- .../lib/kernel-10.0.1/doc/html/gen_udp.html | 8 +- .../kernel-10.0.1/doc/html/global_group.html | 2 +- prs/8803/lib/kernel-10.0.1/doc/html/inet.html | 26 +- .../lib/kernel-10.0.1/doc/html/inet_res.html | 120 +- .../lib/kernel-10.0.1/doc/html/kernel.epub | Bin 790249 -> 790238 bytes .../lib/kernel-10.0.1/doc/html/logger.html | 72 +- .../doc/html/logger_chapter.html | 160 +- .../doc/html/logger_cookbook.html | 146 +- .../doc/html/logger_disk_log_h.html | 6 +- .../doc/html/logger_filters.html | 16 +- .../kernel-10.0.1/doc/html/logger_std_h.html | 6 +- prs/8803/lib/kernel-10.0.1/doc/html/net.html | 12 +- .../lib/kernel-10.0.1/doc/html/net_adm.html | 4 +- .../kernel-10.0.1/doc/html/net_kernel.html | 46 +- .../lib/kernel-10.0.1/doc/html/notes.html | 8 +- prs/8803/lib/kernel-10.0.1/doc/html/os.html | 30 +- prs/8803/lib/kernel-10.0.1/doc/html/pg.html | 2 +- prs/8803/lib/kernel-10.0.1/doc/html/rpc.html | 4 +- .../lib/kernel-10.0.1/doc/html/seq_trace.html | 114 +- .../lib/kernel-10.0.1/doc/html/socket.html | 50 +- .../kernel-10.0.1/doc/html/socket_usage.html | 266 +- .../lib/kernel-10.0.1/doc/html/trace.html | 32 +- prs/8803/lib/megaco-4.6/doc/html/megaco.epub | Bin 188656 -> 188658 bytes prs/8803/lib/megaco-4.6/doc/html/megaco.html | 2 +- .../lib/megaco-4.6/doc/html/megaco_debug.html | 16 +- .../megaco-4.6/doc/html/megaco_encode.html | 94 +- .../megaco-4.6/doc/html/megaco_examples.html | 8 +- .../doc/html/megaco_performance.html | 18 +- .../lib/megaco-4.6/doc/html/megaco_user.html | 10 +- .../lib/mnesia-4.23.2/doc/html/mnesia.epub | Bin 223597 -> 223598 bytes .../lib/mnesia-4.23.2/doc/html/mnesia.html | 72 +- .../mnesia-4.23.2/doc/html/mnesia_app_a.html | 146 +- .../mnesia-4.23.2/doc/html/mnesia_app_b.html | 248 +- .../mnesia-4.23.2/doc/html/mnesia_app_c.html | 146 +- .../mnesia-4.23.2/doc/html/mnesia_chap2.html | 316 +- .../mnesia-4.23.2/doc/html/mnesia_chap3.html | 90 +- .../mnesia-4.23.2/doc/html/mnesia_chap4.html | 252 +- .../mnesia-4.23.2/doc/html/mnesia_chap5.html | 296 +- .../mnesia-4.23.2/doc/html/mnesia_chap7.html | 74 +- .../doc/html/mnesia_registry.html | 4 +- .../lib/observer-2.16/doc/html/observer.epub | Bin 117508 -> 117517 bytes prs/8803/lib/observer-2.16/doc/html/ttb.html | 30 +- .../lib/observer-2.16/doc/html/ttb_ug.html | 426 +- .../odbc-2.14.3/doc/html/getting_started.html | 126 +- prs/8803/lib/odbc-2.14.3/doc/html/odbc.epub | Bin 68213 -> 68217 bytes prs/8803/lib/os_mon-2.10/doc/html/os_mon.epub | Bin 51409 -> 51407 bytes .../lib/parsetools-2.6/doc/html/leex.html | 14 +- .../parsetools-2.6/doc/html/parsetools.epub | Bin 45337 -> 45341 bytes .../lib/parsetools-2.6/doc/html/yecc.html | 70 +- .../doc/html/public_key.epub | Bin 98114 -> 98109 bytes .../doc/html/public_key.html | 74 +- .../doc/html/public_key_records.html | 238 +- .../doc/html/using_public_key.html | 374 +- .../lib/reltool-1.0.1/doc/html/reltool.epub | Bin 64405 -> 64407 bytes .../doc/html/reltool_examples.html | 872 +- .../lib/runtime_tools-2.1/doc/html/dbg.html | 308 +- .../runtime_tools-2.1/doc/html/dyntrace.html | 28 +- .../doc/html/instrument.html | 62 +- .../lib/runtime_tools-2.1/doc/html/lttng.html | 34 +- .../lib/runtime_tools-2.1/doc/html/msacc.html | 16 +- .../doc/html/runtime_tools.epub | Bin 121313 -> 121294 bytes .../runtime_tools-2.1/doc/html/scheduler.html | 2 +- prs/8803/lib/sasl-4.2.2/doc/html/appup.html | 72 +- .../sasl-4.2.2/doc/html/error_logging.html | 38 +- prs/8803/lib/sasl-4.2.2/doc/html/rel.html | 10 +- .../sasl-4.2.2/doc/html/release_handler.html | 4 +- prs/8803/lib/sasl-4.2.2/doc/html/relup.html | 6 +- prs/8803/lib/sasl-4.2.2/doc/html/sasl.epub | Bin 93641 -> 93640 bytes prs/8803/lib/sasl-4.2.2/doc/html/script.html | 22 +- prs/8803/lib/snmp-5.16/doc/html/snmp.epub | Bin 452207 -> 452214 bytes prs/8803/lib/snmp-5.16/doc/html/snmp.html | 18 +- .../doc/html/snmp_advanced_agent.html | 52 +- .../doc/html/snmp_agent_config_files.html | 34 +- .../doc/html/snmp_agent_funct_descr.html | 8 +- prs/8803/lib/snmp-5.16/doc/html/snmp_app.html | 86 +- .../lib/snmp-5.16/doc/html/snmp_app_b.html | 16 +- .../lib/snmp-5.16/doc/html/snmp_config.html | 90 +- .../lib/snmp-5.16/doc/html/snmp_generic.html | 40 +- .../doc/html/snmp_impl_example_agent.html | 382 +- .../lib/snmp-5.16/doc/html/snmp_index.html | 10 +- .../doc/html/snmp_instr_functions.html | 22 +- .../doc/html/snmp_manager_config_files.html | 8 +- .../snmp-5.16/doc/html/snmp_mib_compiler.html | 10 +- .../lib/snmp-5.16/doc/html/snmp_pdus.html | 4 +- prs/8803/lib/snmp-5.16/doc/html/snmpa.html | 34 +- .../lib/snmp-5.16/doc/html/snmpc_cmd.html | 2 +- prs/8803/lib/snmp-5.16/doc/html/snmpm.html | 8 +- .../ssh-5.2.1/doc/html/configurations.html | 158 +- .../ssh-5.2.1/doc/html/configure_algos.html | 322 +- .../lib/ssh-5.2.1/doc/html/hardening.html | 18 +- prs/8803/lib/ssh-5.2.1/doc/html/ssh.epub | Bin 276443 -> 276446 bytes prs/8803/lib/ssh-5.2.1/doc/html/ssh.html | 30 +- .../lib/ssh-5.2.1/doc/html/ssh_agent.html | 4 +- .../lib/ssh-5.2.1/doc/html/using_ssh.html | 372 +- prs/8803/lib/ssl-11.2.1/doc/html/.build | 2 +- .../doc/html/dist/search_data-6435E30D.js | 1 - .../doc/html/dist/search_data-731AC49D.js | 1 + prs/8803/lib/ssl-11.2.1/doc/html/search.html | 2 +- prs/8803/lib/ssl-11.2.1/doc/html/ssl.epub | Bin 201995 -> 201973 bytes prs/8803/lib/ssl-11.2.1/doc/html/ssl.html | 154 +- .../ssl-11.2.1/doc/html/ssl_distribution.html | 50 +- .../lib/ssl-11.2.1/doc/html/using_ssl.html | 492 +- .../lib/stdlib-6.0.1/doc/html/argparse.html | 200 +- prs/8803/lib/stdlib-6.0.1/doc/html/array.html | 20 +- .../lib/stdlib-6.0.1/doc/html/assert_hrl.html | 4 +- .../lib/stdlib-6.0.1/doc/html/base64.html | 12 +- .../lib/stdlib-6.0.1/doc/html/beam_lib.html | 32 +- .../lib/stdlib-6.0.1/doc/html/binary.html | 102 +- prs/8803/lib/stdlib-6.0.1/doc/html/c.html | 2 +- .../lib/stdlib-6.0.1/doc/html/calendar.html | 20 +- prs/8803/lib/stdlib-6.0.1/doc/html/dets.html | 24 +- prs/8803/lib/stdlib-6.0.1/doc/html/dict.html | 30 +- prs/8803/lib/stdlib-6.0.1/doc/html/epp.html | 2 +- .../lib/stdlib-6.0.1/doc/html/erl_error.html | 48 +- .../lib/stdlib-6.0.1/doc/html/erl_eval.html | 8 +- .../lib/stdlib-6.0.1/doc/html/erl_lint.html | 2 +- .../lib/stdlib-6.0.1/doc/html/erl_parse.html | 2 +- .../lib/stdlib-6.0.1/doc/html/erl_scan.html | 2 +- .../lib/stdlib-6.0.1/doc/html/erl_tar.html | 14 +- .../lib/stdlib-6.0.1/doc/html/escript.html | 114 +- prs/8803/lib/stdlib-6.0.1/doc/html/ets.html | 134 +- .../stdlib-6.0.1/doc/html/file_sorter.html | 42 +- .../lib/stdlib-6.0.1/doc/html/filelib.html | 12 +- .../lib/stdlib-6.0.1/doc/html/filename.html | 152 +- .../lib/stdlib-6.0.1/doc/html/gen_event.html | 16 +- .../lib/stdlib-6.0.1/doc/html/gen_fsm.html | 182 +- .../lib/stdlib-6.0.1/doc/html/gen_server.html | 16 +- .../lib/stdlib-6.0.1/doc/html/gen_statem.html | 120 +- prs/8803/lib/stdlib-6.0.1/doc/html/io.html | 264 +- .../lib/stdlib-6.0.1/doc/html/io_lib.html | 10 +- .../stdlib-6.0.1/doc/html/io_protocol.html | 380 +- prs/8803/lib/stdlib-6.0.1/doc/html/json.html | 56 +- prs/8803/lib/stdlib-6.0.1/doc/html/lists.html | 194 +- prs/8803/lib/stdlib-6.0.1/doc/html/maps.html | 310 +- .../stdlib-6.0.1/doc/html/ms_transform.html | 196 +- prs/8803/lib/stdlib-6.0.1/doc/html/notes.html | 14 +- .../lib/stdlib-6.0.1/doc/html/orddict.html | 172 +- prs/8803/lib/stdlib-6.0.1/doc/html/peer.html | 152 +- .../lib/stdlib-6.0.1/doc/html/proc_lib.html | 44 +- .../lib/stdlib-6.0.1/doc/html/proplists.html | 14 +- prs/8803/lib/stdlib-6.0.1/doc/html/qlc.html | 390 +- prs/8803/lib/stdlib-6.0.1/doc/html/queue.html | 248 +- prs/8803/lib/stdlib-6.0.1/doc/html/rand.html | 24 +- .../lib/stdlib-6.0.1/doc/html/random.html | 6 +- prs/8803/lib/stdlib-6.0.1/doc/html/re.html | 100 +- prs/8803/lib/stdlib-6.0.1/doc/html/sets.html | 6 +- prs/8803/lib/stdlib-6.0.1/doc/html/shell.html | 136 +- .../stdlib-6.0.1/doc/html/shell_default.html | 6 +- prs/8803/lib/stdlib-6.0.1/doc/html/slave.html | 6 +- prs/8803/lib/stdlib-6.0.1/doc/html/sofs.html | 494 +- .../lib/stdlib-6.0.1/doc/html/stdlib.epub | Bin 1437743 -> 1437724 bytes .../lib/stdlib-6.0.1/doc/html/stdlib_app.html | 4 +- .../lib/stdlib-6.0.1/doc/html/string.html | 198 +- .../lib/stdlib-6.0.1/doc/html/supervisor.html | 22 +- prs/8803/lib/stdlib-6.0.1/doc/html/timer.html | 24 +- .../lib/stdlib-6.0.1/doc/html/unicode.html | 34 +- .../stdlib-6.0.1/doc/html/unicode_usage.html | 218 +- .../lib/stdlib-6.0.1/doc/html/uri_string.html | 124 +- .../doc/html/uri_string_usage.html | 86 +- prs/8803/lib/stdlib-6.0.1/doc/html/zip.html | 40 +- .../syntax_tools-3.2/doc/html/erl_syntax.html | 12 +- .../lib/syntax_tools-3.2/doc/html/merl.html | 58 +- prs/8803/lib/tftp-1.2/doc/html/.build | 2 +- .../doc/html/dist/search_data-AF02D849.js | 1 - .../doc/html/dist/search_data-C5EAE448.js | 1 + .../tftp-1.2/doc/html/getting_started.html | 6 +- prs/8803/lib/tftp-1.2/doc/html/search.html | 2 +- prs/8803/lib/tftp-1.2/doc/html/tftp.epub | Bin 28990 -> 28994 bytes prs/8803/lib/tftp-1.2/doc/html/tftp.html | 2 +- prs/8803/lib/tools-4.0/doc/html/.build | 2 +- prs/8803/lib/tools-4.0/doc/html/cover.html | 6 +- .../lib/tools-4.0/doc/html/cover_chapter.html | 336 +- prs/8803/lib/tools-4.0/doc/html/cprof.html | 2 +- .../lib/tools-4.0/doc/html/cprof_chapter.html | 174 +- .../doc/html/dist/search_data-536C0AEB.js | 1 + .../doc/html/dist/search_data-8780CEA5.js | 1 - .../lib/tools-4.0/doc/html/erlang-el.html | 24 +- prs/8803/lib/tools-4.0/doc/html/fprof.html | 204 +- .../lib/tools-4.0/doc/html/fprof_chapter.html | 6 +- .../lib/tools-4.0/doc/html/lcnt_chapter.html | 96 +- prs/8803/lib/tools-4.0/doc/html/make.html | 4 +- prs/8803/lib/tools-4.0/doc/html/notes.html | 40 +- prs/8803/lib/tools-4.0/doc/html/search.html | 2 +- prs/8803/lib/tools-4.0/doc/html/tools.epub | Bin 243607 -> 243599 bytes prs/8803/lib/tools-4.0/doc/html/tprof.html | 276 +- .../lib/tools-4.0/doc/html/xref_chapter.html | 64 +- prs/8803/lib/wx-2.4.2/doc/html/.build | 2 +- prs/8803/lib/wx-2.4.2/doc/html/chapter.html | 22 +- .../doc/html/dist/search_data-7004C420.js | 1 - .../doc/html/dist/search_data-DBD265E3.js | 1 + prs/8803/lib/wx-2.4.2/doc/html/search.html | 2 +- prs/8803/lib/wx-2.4.2/doc/html/wx.epub | Bin 1703347 -> 1703345 bytes prs/8803/lib/wx-2.4.2/doc/html/wx_object.html | 40 +- .../xmerl-2.0/doc/html/xmerl_examples.html | 98 +- prs/8803/lib/xmerl-2.0/doc/html/xmerl_ug.html | 360 +- .../xmerl-2.0/doc/html/xmerl_xs_examples.html | 102 +- .../lib/xmerl-2.0/doc/html/xmerl_xsd.html | 6 +- 3717 files changed, 27907 insertions(+), 27892 deletions(-) rename prs/8803/{9347543 => 22983057} (100%) delete mode 100644 prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/last_name delete mode 100644 prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/last_name delete mode 100644 prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/suite.summary delete mode 100644 prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/totals.info delete mode 100644 prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_name delete mode 100644 prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_name delete mode 100644 prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.summary delete mode 100644 prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/totals.info rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/MY_MODULE.beam (90%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/ct_default.css (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/ctlog.html (78%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/erl_pp_test.E (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/format_status_server.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/format_status_statem.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/generic_fsm.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/generic_server.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/generic_server_timer.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/generic_statem.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/generic_statem_complex.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/index.html (92%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/jquery-latest.js (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/jquery.tablesorter.min.js (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/l_mod.beam (76%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_name rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/last_test.html (87%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/argparse_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/array_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/base64_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/base64_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/beam_lib_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/binary_module_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/binary_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/c_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/calendar_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/dets_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/dict_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/digraph_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/digraph_utils_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/edlin_context_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/edlin_expand_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/epp_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_anno_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_eval_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_expand_records_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_internal_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_lint_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_pp_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/erl_scan_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/error_logger_h_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/escript_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/ets_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/ets_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/ets_tough_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/file_sorter_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/filelib_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/filename_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/fixtable_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/format_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/gb_sets_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/gen_event_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/gen_fsm_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/gen_server_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/gen_statem_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/id_transform_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/io_proto_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/io_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/json_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/last_link.html (87%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_name rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/lists_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/lists_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/log_mf_h_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/maps_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/math_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/ms_transform_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/peer_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/pool_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/proc_lib_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/proplists_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/qlc_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/queue_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/queue_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/rand_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/random_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/re_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3170.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.argparse.1282.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3234.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.basic.1250.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3746.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.built_in_types.3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3970.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.command_usage.229.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.4482.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.complex_command.99.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.default_for_not_required.1378.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3138.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.global_default.1410.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3202.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.invalid_arguments.35.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3266.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.long_form_eq.67.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3778.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.multi_short.1506.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.4450.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nargs.131.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.negative.1314.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.character.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nodigits.1346.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.erlang_display.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error.195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.float.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error_usage.197.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.integer.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.pos_mixed_with_opt.4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.quote.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.proxy_arguments.5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.snprintf.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.readme.1186.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.subcommand.1442.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.226.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.type_validators.1218.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.unicode.163.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.34.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage.1570.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_args_ordering.227.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.130.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_required_args.1602.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_template.165.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.98.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_width.261.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception.69.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.66.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception_format.101.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.very_short.1474.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.194.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.fix_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.1410.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldl_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.2914.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldr_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_list_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_orddict_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.2882.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.map_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.2050.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.new_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.relax_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.1570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.resize_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.set_get_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.1538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldl_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldr_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.1954.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_map_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_list_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.1474.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_orddict_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.1506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_list_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_orddict_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.2594.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.2274.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_noisy_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.1602.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_noisy_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.2370.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.162.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_noisy_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.1442.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_noisy_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.258.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.290.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file_env.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_separation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_with_option.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.env.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.evil_args_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.missing_args_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.otp_7461.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_modes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_to_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.zdbbl_dist_buf_busy_limit.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.atomic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_modes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.broadcast.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_to_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.cond_wait.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_5635.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.create_join_thread.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_6279.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.detached_thread.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.big.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.dw_atomic_massage.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.illegal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.equal_tids.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.max_threads.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_modes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.mutex.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwmutex.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string_modes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwspinlock.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_1.1666.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.spinlock.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_2.1698.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_3.1730.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.thread_name.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_4.1762.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.try_lock_mutex.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.tsd.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.building.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.'bin white space'.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp_literals.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default_dirty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_dirname_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_srcfile.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_use_dirname_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.error.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_not_abs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_ok_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.md5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.missing_debug_info_backend.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx_dirty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_same_dir.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.otp_6711.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_absolute.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_relative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreasonable_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip_add_chunks.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.test_makedep_abstract_code.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.badargs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.bin_to_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.nt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.check_no_invalid_read_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.copy.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_deprecated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.encode_decode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_now_0.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_size_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.guard.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.deprecated_not_in_obsolete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.hex_encoding.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.interesting.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.erl_file_encoding.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.list_to_bin.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.longest_common_trap.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.obsolete_but_not_deprecated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.parts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_functions.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_comp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_modules.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_fla_comp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_sr_comp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.strong_components.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.referenced.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.test_runtime_dependencies_versions.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.scope_return.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.undefined_functions.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.xml_file_encoding.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_index_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_message_queue_data_switching.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_throughput_benchmark.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.defunct.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavier.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavy.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.sleepy_child.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_invalid_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_2_invalid_n_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.ancient_major.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.major.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_chars_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.minor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.core_files.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.argparse.35.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_2_invalid_case_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.basic.1250.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.built_in_types.3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.command_usage.356.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.complex_command.1378.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.default_for_not_required.36.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_invalid_integer_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.global_default.196.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.invalid_arguments.1314.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.long_form_eq.1186.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.multi_short.132.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nargs.4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.negative.67.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nodigits.99.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error.1410.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_invalid_bytes_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error_usage.388.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.pos_mixed_with_opt.131.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.proxy_arguments.164.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.readme.1218.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_3_invalid_scope_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.subcommand.68.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.type_validators.1282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.unicode.1346.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage.228.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_3_invalid_scope_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_args_ordering.324.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_required_args.260.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_template.292.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_width.420.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception.37.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_range_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception_format.69.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.very_short.100.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_scope_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.fix_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldl_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldr_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_replacement_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_list_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_orddict_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_3_invalid_scope_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.map_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_pattern_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.new_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_subject_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.relax_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.resize_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.set_get_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldl_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldr_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_map_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_list_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_orddict_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_list_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.ls.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_orddict_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.memory.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_noisy_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_noisy_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.big_gregorian_days.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_noisy_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week_calibrate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_noisy_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_days.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_seconds.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.iso_week_number.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.last_day_of_the_month.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.leap_years.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.local_time_to_universal_time_dst.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.rfc3339.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.system_time.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01}/cover.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.133.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.1826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.19710434.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35426.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35778.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36322.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_modes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36546.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_to_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_modes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.408419.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_to_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40930.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_5635.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40994.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_6279.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.504962.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.big.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.505154.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.illegal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.1858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_modes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710466.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string_modes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19715490.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_1.1506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718082.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_2.1538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718146.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_3.163.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19721890.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_4.1570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.34754.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.408451.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.building.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.41026.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.491618.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp_literals.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.493218.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.497570.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1538.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.error.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1634.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19710306.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.md5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19717922.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.missing_debug_info_backend.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.34786.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.otp_6711.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35490.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35810.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36354.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip_add_chunks.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36578.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.test_makedep_abstract_code.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.37.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.badargs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.40962.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.bin_to_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504610.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.check_no_invalid_read_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504994.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.copy.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.741.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.encode_decode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19710498.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.guard.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19714626.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.hex_encoding.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19717890.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.interesting.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19718114.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.list_to_bin.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19721858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.longest_common_trap.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.259.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.parts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.2658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_comp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.408483.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_fla_comp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.491042.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_sr_comp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.492642.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.referenced.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.497442.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.scope_return.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.502242.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.709.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_index_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.access.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.badarg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bag_next.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_bags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_duplicate_bags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_invalid_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_sets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_2_invalid_n_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.duplicate_bags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_chars_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fixtable.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fold.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.insert_new.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_2_invalid_case_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.many_clients.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.match.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.newly_started.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.oldbugs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_invalid_integer_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11245.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11709.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13229.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13260.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13830.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4208.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4738.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_invalid_bytes_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4906.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4989.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5402.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5487.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6206.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_3_invalid_scope_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6359.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_7146.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8070.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8856.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_3_invalid_scope_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8899.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8903.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8923.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_9282.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_range_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.phash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.receive_optimisation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_scope_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair_continuation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.select.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.sets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_replacement_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.simultaneous_open.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_3_invalid_scope_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.truncated_segment_array.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.update_counter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_pattern_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.create.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_subject_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.iterate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.remove.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.store.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.cycle.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.data.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.degree.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.edges.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.ls.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.39458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.memory.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.39426.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.opts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3522.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3630.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.big_gregorian_days.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_8066.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week_calibrate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.39490.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_days.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_seconds.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertices.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.condensation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.iso_week_number.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.last_day_of_the_month.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.leap_years.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.isolated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.local_time_to_universal_time_dst.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.loop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.rfc3339.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.system_time.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.subgraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.101.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.topsort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19694274.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.tree.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19701250.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.291.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.get_context.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3170.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4066.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.binding_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4290.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.check_trailing.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.452.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4610.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.erl_1152.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4642.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.filename_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503043.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.fun_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503203.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.function_parameter_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9026.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.get_coverage.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9090.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.invalid_module.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.1634.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.map_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694306.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.no_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694402.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19698914.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_both.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_fun.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701346.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_module.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701410.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.record_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19705570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.2498.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.type_completion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.395620.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.unicode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.474882.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.deterministic_include.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.481186.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.encoding.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.9122.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.39554.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.133.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.1474.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.extends.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19694146.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.file_macro.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19701186.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.function_macro.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.2530.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_4995.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3202.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_8268.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3234.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.include_local.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.33059.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.39522.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3554.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4098.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4322.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.moduledoc_include.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.488642.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.nondeterministic_include.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.not_circular.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.503075.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10302.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.9058.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10820.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_11728.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.1442.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_14285.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19694338.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16824.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19698050.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16978.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701154.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4870.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701314.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4871.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701378.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_5362.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19705538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_6277.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.2434.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_7702.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.33027.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8130.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.474306.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8388.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.475906.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8470.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.481122.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.486274.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8665.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8911.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.access.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.overload_mac.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.badarg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.pmod.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bag_next.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.predef_mac.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.rec_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.scan_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_bags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.skip_header.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_duplicate_bags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.source_name.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_sets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_error.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_if.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.duplicate_bags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_warning.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fixtable.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fold.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.variable_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.bad.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_location.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.insert_new.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.40898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.many_clients.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.match.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.newly_started.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.oldbugs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.generated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.40866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11245.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11709.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.is_anno.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13229.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.line.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13260.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.location.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13830.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.mapfold_anno.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4208.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.new.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4738.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.parse_abstract.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4906.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.record.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4989.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5402.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.text.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5487.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.apply_atom.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6206.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.binary_and_map_aliases.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6359.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.custom_stacktrace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_7146.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep37.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8070.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep43.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8856.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep49.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8898.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep58.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8899.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8903.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eval_expr_5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8923.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.funs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_9282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.phash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.receive_optimisation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair_continuation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.select.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.sets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.lc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.simultaneous_open.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_bin.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_pattern.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.truncated_segment_array.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_10622.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.update_counter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_13228.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.create.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14708.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_15035.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.iterate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16439.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.remove.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16545.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16865.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.store.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_5269.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.cycle.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6539.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.data.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6543.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.degree.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6787.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.edges.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6977.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.7170.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_7550.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_8133.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.pattern_expr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.7138.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.simple_cases.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.string_plusplus.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.opts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.try_catch.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.unary_plus.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3630.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.zero_width.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_8066.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.attributes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.7202.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.expr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.guard.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertices.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.condensation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.maps.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.isolated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5915.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.loop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5990.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7078.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7931.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.subgraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.pattern.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.topsort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.side_effects.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.tree.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.strict.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.get_context.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.update.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.behav.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.binding_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.check_trailing.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.basic_errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.erl_1152.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.filename_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_multiple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.fun_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bif_clash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.function_parameter_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bin_syntax_errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.get_coverage.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_aliases.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.invalid_module.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.documentation_attributes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.map_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.eep49.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.no_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_vars_warn.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_both.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.external_funs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_fun.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.format_warn.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_module.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.guard.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.record_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.illegal_module_name.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.inline_nifs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.type_completion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.unicode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_parallel_match.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.deterministic_include.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_type.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.encoding.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.match_float_zero.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.7266.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.messages_with_jaro_suggestions.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.no_load_nif.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.non_latin1_module.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.extends.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_failing.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.file_macro.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_successful.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.function_macro.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_10436.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_4995.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11254.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_8268.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11771.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.include_local.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11772.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.7234.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11851.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11861.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11872.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.moduledoc_include.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.nondeterministic_include.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879_cont.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.not_circular.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_13230.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10302.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14285.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10820.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14323.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_11728.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14378.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_14285.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15456.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16824.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15563.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16978.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16516.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4870.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16824.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4871.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4886.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_5362.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4988.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_6277.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5091.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_7702.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5276.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8130.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8388.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5362.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8470.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5371.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8562.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5494.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8665.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5644.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8911.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5878.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.overload_mac.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5917.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.pmod.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6585.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.predef_mac.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6885.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.rec_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7227.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.scan_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7550.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.skip_header.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_8051.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.source_name.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.predef.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.record_errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_error.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.redefined_builtin_type.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_if.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.removed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_warning.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.shadow_vars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.singleton_type_var_errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.variable_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.stacktrace_syntax.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.bad.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.tilde_k.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_location.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.too_many_arguments.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.8994.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_module.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_nifs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.underscore_match.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.generated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.8962.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars_try.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_function.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.is_anno.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_import.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.line.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_record.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.location.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.mapfold_anno.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.new.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_unsafe_vars_warn.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.parse_abstract.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_otp_4858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.record.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_fun.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.text.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_lc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.apply_atom.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_rec.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.binary_and_map_aliases.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.update_literal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.custom_stacktrace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.warn_missing_spec.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep37.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.bits.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep43.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.block.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep49.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.call.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep58.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.case1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.cond1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eval_expr_5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.dialyzer_attrs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.funs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep49.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep58.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41090.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41410.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.form_vars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.lc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.format_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_bin.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.func.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_pattern.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.gh_5093.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_10622.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.head_tail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_13228.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.hook.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14708.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.if_then.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14826.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.import_export.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_15035.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41058.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16439.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41122.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16545.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16865.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_5269.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.maps_syntax.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6539.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.messages.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6543.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.misc_attrs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6787.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.neg_indent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6977.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.ops.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_7550.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10302.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_8133.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10820.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.pattern_expr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11100.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.simple_cases.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11861.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_13662.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.string_plusplus.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_14285.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.try_catch.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15592.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.unary_plus.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15751.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.zero_width.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15755.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.attributes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_16435.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6321.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6911.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.expr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6914.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.guard.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8150.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8238.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8473.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8522.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.maps.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8567.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5915.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8664.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5990.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_9147.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7078.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.pr_1014.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7931.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.quoted_atom_types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.pattern.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.receive_after.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.side_effects.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.recs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.strict.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.try_catch.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.update.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.behav.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.basic_errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.iso88591.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_multiple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10302.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bif_clash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10990.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bin_syntax_errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10992.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_aliases.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_11807.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_16480.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.documentation_attributes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_17024.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.eep49.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_7810.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_vars_warn.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.text_fun.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.external_funs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.triple_quoted_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.format_warn.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.guard.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.illegal_module_name.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.inline_nifs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile_truncated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_parallel_match.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_type.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty_truncated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.match_float_zero.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.messages_with_jaro_suggestions.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script_file_access.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.no_load_nif.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.bad_io_server.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.non_latin1_module.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_failing.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.beam_script.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_successful.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.create_and_extract.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_10436.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11254.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags_no_shebang.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11771.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11772.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.epp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11851.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11861.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.foldl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11872.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.module_script.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879_cont.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.overflow.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_13230.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14285.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.strange_name.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14323.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.two_lines.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14378.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.unicode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15456.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15563.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.first_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16516.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16824.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.last_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4886.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.next_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4988.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.prev_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5091.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5276.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bad_table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5338.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.baddelete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5362.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badfile.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5371.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badinsert.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5494.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badlookup.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5644.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badnew.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5878.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bound_maps.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5917.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.compress_magic_ref.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6585.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.default.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6885.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_elem.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7227.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_named_table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7550.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_tab.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_8051.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_tab.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.predef.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_unfix_race.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.record_errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.dups.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.redefined_builtin_type.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.empty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.removed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.41954.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.shadow_vars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42082.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.singleton_type_var_errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42690.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43074.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.stacktrace_syntax.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43234.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.tilde_k.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43426.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.too_many_arguments.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43714.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_module.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43874.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_nifs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.44226.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.underscore_match.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.49026.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.50658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars_try.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_function.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ets_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_import.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_record.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_rename.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_update_counter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_large_table_owner.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_unsafe_vars_warn.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_large_table_owner.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_otp_4858.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_many_tables_owner.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_tables_owner.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_fun.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_lc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_concurrent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_rec.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.update_literal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup_concurrent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.warn_missing_spec.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_insert.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.bits.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_iter_bag.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.block.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_next.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.call.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_badarg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.case1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_empty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.cond1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.dialyzer_attrs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl_ordered.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep49.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep58.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr_ordered.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9186.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.give_away.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_pseudo_deleted.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_shrink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.hash_clash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.form_vars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_concurrent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.format_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.func.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup_element.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.gh_5093.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heir.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.head_tail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.hook.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_binary_stress.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.if_then.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_whereis_busy.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.import_export.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9154.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41986.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9218.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42114.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42914.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43138.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.maps_syntax.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43266.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.messages.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.misc_attrs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43746.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.neg_indent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43906.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.ops.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.48802.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10302.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.50530.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10820.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11100.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11861.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_13662.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_rename.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_14285.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.interface_equality.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15592.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.keypos2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15751.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_default.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15755.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_mult.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_16435.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_order.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6321.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.massive_ets_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6911.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6914.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8150.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8238.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8473.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_heavy.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8567.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8664.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.member.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_9147.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.memory.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.pr_1014.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_read.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.quoted_atom_types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_write.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.receive_after.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_read.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.recs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_write.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_named.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.try_catch.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_unnamed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_wb.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.misc1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ms_excessive_nesting.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.named.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered_match.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.iso88591.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_10182.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10302.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_5340.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10990.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10992.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6842_select_1000.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_11807.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_7665.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_16480.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8166.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_17024.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8732.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_7810.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9423.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9932.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.text_fun.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.partly_bound.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.triple_quoted_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.privacy.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename_unnamed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.safe_fixtable.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile_truncated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_bound_chunk.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fixtab_owner_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty_truncated.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_mbuf_trapping.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setbag.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script_file_access.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setopts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.bad_io_server.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.shrink_pseudo_deleted.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.slot.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.beam_script.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_fixed_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.create_and_extract.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_insert.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_ordered_iteration.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags_no_shebang.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_replace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.epp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_unfix_fix.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.foldl.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_bucket_disappears.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.module_script.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects_trap.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.overflow.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_object.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_ets_dets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.strange_name.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_init_table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.two_lines.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.unicode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_bag.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_parallel.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.first_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_set.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_duplicate_bag.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.last_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_insert_order_preserved.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.next_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_kill_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.prev_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_parallel.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_set.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bad_table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_new.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.baddelete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_match_spec_run.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badfile.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_named_select.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badinsert.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_repair_continuation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badlookup.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_delete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badnew.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_flatmap_term_copy_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bound_maps.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_hashmap_term_copy_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.compress_magic_ref.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_pam_stack_overflow_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.default.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_elem.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace_next_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_named_table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_reverse.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_tab.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_test_ms.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_tab.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_whitebox.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_unfix_race.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.dups.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.empty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10082.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10210.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10786.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11170.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11330.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.table_leak.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11618.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.take.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11906.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_decentralized_counters_setting.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.12066.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_delete_table_while_size_snapshot.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.18018.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_memory_concurrency.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.19746.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_size_concurrency.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.33155.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_throughput_benchmark.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_table_growth.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ets_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default_bad_pos.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_rename.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_update_counter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element_default.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_large_table_owner.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.verybadnew.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_large_table_owner.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.whereis_table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_many_tables_owner.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.write_concurrency.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_tables_owner.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.ex1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_concurrent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup_concurrent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.badarg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_insert.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_iter_bag.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_check.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_next.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_merge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_badarg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_sort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_empty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_check.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.484290.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl_ordered.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keymerge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr_ordered.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keysort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.give_away.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_merge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_pseudo_deleted.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_sort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_shrink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.hash_clash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_concurrent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.inout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.many.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup_element.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.misc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heir.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_check.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_binary_stress.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keymerge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_whereis_busy.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keysort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10114.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_merge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10242.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_sort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11010.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11234.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_eexist.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11362.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11650.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_binary_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11938.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_invalid_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.12098.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_nested_dirs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.17794.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.19586.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path_dot_dot.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.9986.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_single_dir.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.file_props_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_rename.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_otp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.interface_equality.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_subdir.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.keypos2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.fold_files.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_default.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_mult.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.is_file_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_order.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.otp_5960.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.massive_ets_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path_links.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_heavy.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_two.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.member.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.memory.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_read.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_write.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_1.402275.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_read.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_2.486658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_write.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_1.486690.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_named.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_2.486722.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_unnamed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname.486498.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_wb.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname_bin.486754.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.misc1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ms_excessive_nesting.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.named.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension.486530.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension_bin.486562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered_match.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_10182.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_5340.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join.486594.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6338.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join_bin.486786.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6842_select_1000.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype.486626.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_7665.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype_bin.421732.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8166.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname.421668.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8732.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname_bin.421764.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9423.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split.421700.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9932.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split_bin.421796.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.partly_bound.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.privacy.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_api.421828.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_windows.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename_unnamed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_xdg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.safe_fixtable.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename.402243.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_bound_chunk.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename_bin.402307.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fixtab_owner_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.fixbag.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_mbuf_trapping.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setbag.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.insert_same_key.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setopts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_fixes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.shrink_pseudo_deleted.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_processes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.slot.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_closes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_fixed_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_deletes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_insert.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.owner_dies.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_ordered_iteration.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_replace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.hang_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_unfix_fix.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_bucket_disappears.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.add_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.balance_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects_trap.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_any_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_object.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_ets_dets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.difference_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_init_table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.from_ordset_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_bag.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_parallel.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.insert_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_set.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.is_member_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_duplicate_bag.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_insert_order_preserved.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_from_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_kill_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.larger_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_parallel.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.largest_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_set.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.singleton_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_new.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smaller_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_match_spec_run.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smallest_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_named_select.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_repair_continuation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_largest_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_delete.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_smallest_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_flatmap_term_copy_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_handler.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_hashmap_term_copy_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_sup_handler.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_pam_stack_overflow_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.auto_hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace_next_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_reverse.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status_anon.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_test_ms.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.delete_handler.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_whitebox.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.402339.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.error_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_with_process_label.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.get_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.table_leak.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.take.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_decentralized_counters_setting.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.487362.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_delete_table_while_size_snapshot.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_memory_concurrency.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_size_concurrency.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.notify.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_throughput_benchmark.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.replace_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_check_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_receive_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_table_growth.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_wait_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default_bad_pos.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start_opt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element_default.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_handler.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.verybadnew.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_sup_handler.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.whereis_table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.sync_notify.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.write_concurrency.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_call.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.ex1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_event.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_in_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.badarg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_check.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_merge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_sort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.auto_hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_check.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.call_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.468674.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402371.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402435.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keymerge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.421860.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keysort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.487458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_merge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_sort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.enter_loop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.error_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.inout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.many.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.misc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_with_process_label.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.get_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_check.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keymerge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402403.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keysort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402467.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_merge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487394.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_sort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487426.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_eexist.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.replace_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_binary_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.reply_by_alias_with_payload.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_invalid_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_nested_dirs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path_dot_dot.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start10.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_single_dir.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start11.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start12.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.file_props_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_otp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_subdir.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.fold_files.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start7.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.is_file_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start8.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.otp_5960.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start9.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.sys1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path_links.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.terminate_crash_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_event.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_symlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_sync_event.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_two.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_handle_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_1.394948.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.abcast.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_2.394916.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.auto_hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_1.496643.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_2.496675.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname.470914.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname_bin.496707.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension.470946.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension_bin.394820.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_with_huge_message_queue.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.calling_self.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join.394852.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join_bin.496739.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast_fast.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype.470882.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.continue.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype_bin.496771.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname.470978.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash_in_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname_bin.395012.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488418.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split.394980.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488834.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split_bin.395044.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489442.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_api.395108.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489506.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_windows.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_xdg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename.394884.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.error_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename_bin.395076.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_all_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.fixbag.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_with_process_label.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.insert_same_key.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.get_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_fixes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_processes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_closes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487874.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_deletes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487906.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.owner_dies.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.488450.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489410.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489474.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.hang_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.loop_start_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.add_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall.487938.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.balance_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_down.487970.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_any_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_noconnection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_success.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.difference_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote.488002.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.from_ordset_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote_old2.402499.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_5854.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.insert_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_7669.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.is_member_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.replace_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.reply_by_alias_with_payload.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_from_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.larger_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_check_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.largest_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_receive_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.singleton_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_wait_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smaller_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smallest_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_global_registered_parent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_local_registered_parent.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_largest_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_smallest_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.start.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_handler.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_sup_handler.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop10.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.auto_hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status_anon.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.delete_handler.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.496867.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop7.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop8.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop9.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.error_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.terminate_crash_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.throw_in_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_with_process_label.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_call.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.get_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_cast.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_continue.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.496835.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_handle_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.notify.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.replace_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_check_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.490658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_receive_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_wait_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.490690.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.490722.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start_opt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_handler.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.490754.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_sup_handler.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.sync_notify.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.490786.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_call.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.490818.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_event.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.auto_hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_in_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.call_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.403107.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421892.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421924.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.auto_hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490018.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.call_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490210.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.471554.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490530.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496931.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490594.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496995.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490946.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.497059.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.491010.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.enter_loop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.enter_loop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.error_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.error_format_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_order.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_with_process_label.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_all_status.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.get_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.471522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_with_process_label.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496899.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.generic_timers.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496963.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.get_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.497027.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.489538.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490050.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.replace_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490242.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.reply_by_alias_with_payload.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490626.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490850.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490882.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start10.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490914.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start11.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490978.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start12.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.loop_start_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.489986.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.pop_too_many.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start7.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.replace_state.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start8.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.reply_by_alias_with_payload.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start9.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_check_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.sys1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_receive_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.terminate_crash_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_wait_reqid_collection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_event.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.489570.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_sync_event.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_handle_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.489890.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.489922.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.489954.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.abcast.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.auto_hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.489602.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.489634.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.489666.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.489698.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.489730.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_with_huge_message_queue.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.calling_self.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.489762.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast_fast.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.489794.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.continue.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.489826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash_in_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472290.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.489858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472642.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472674.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_enter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473250.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473314.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.490274.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.403043.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.error_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_all_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.490306.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.490338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_with_process_label.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.get_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.402819.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.402851.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395140.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395172.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.490370.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395300.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473218.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.402883.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.402915.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.loop_start_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.490434.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall.395204.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_down.395236.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop_and_reply.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_noconnection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.sys1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_success.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.terminate_crash_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.timeout_cancel_and_update.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote.395268.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote_old2.471874.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_in_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_5854.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_7669.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.replace_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.reply_by_alias_with_payload.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.id_transform.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_check_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_receive_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.binary_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_wait_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.broken_unicode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_global_registered_parent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.eof_on_pipe.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_local_registered_parent.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.start.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop10.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_fwrite_stdin_latin1_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop7.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop8.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop9.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.terminate_crash_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_binary_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.throw_in_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_list_mode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_call.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout_isatty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_cast.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_gl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_continue.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_ogl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.setopts_getopts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_handle_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.shell_slogan.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options_gen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_prompt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.498051.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.bad_printable_range.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.build_text_without_maps_order.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.498083.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.calling_self.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.chars_limit.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.498115.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.coverage.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.cr_whitespace_in_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.498147.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.498179.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_g.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_w.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.498211.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_neg_zero.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.auto_hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.github_4801.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.call_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_fread_newlines.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_collect_line_3_wb.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.473826.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_fread_literal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474146.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_print_binary_depth_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474210.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_width_too_small.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474274.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_with_huge_message_queue.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497443.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.limit_term.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497955.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.manpage.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497987.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.maps.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498243.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10302.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498339.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10755.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10836.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14175.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.enter_loop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14178_unicode_atoms.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.error_format_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14285.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_order.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14983.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15076.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_all_status.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15103.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15159.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15639.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_with_process_label.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15705.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.generic_timers.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15847.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.get_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15875.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_17525.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473346.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5403.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473858.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5813.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474114.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6230.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474178.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6282.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474242.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6354.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.497475.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6495.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498019.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6502.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498275.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6517.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498307.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6708.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7084.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7421.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.loop_start_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_8989.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.473794.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.printable_range.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.pop_too_many.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.unscan_format_without_maps_order.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.replace_state.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.counterexamples.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.reply_by_alias_with_payload.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.403267.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_check_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493026.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_receive_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493186.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_wait_reqid_collection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.403299.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.492802.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.473378.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.493058.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.473698.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_escape_all.493154.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_float_roundtrip.421988.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.473730.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_integer_roundtrip.493122.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_object_roundtrip.421956.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.473762.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_string_roundtrip.493090.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.473410.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api.492962.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api_stream.426245.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.473442.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_arrays.492930.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_atoms.492834.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.473474.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_numbers.492866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_objects.426181.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.473506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_strings.492898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_whitespace.426213.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.473538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_atom.492706.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_binary.403235.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.473570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_escape_all.492770.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_float.492738.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.473602.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_integer.403171.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_list.403203.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.473634.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_map.492674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_proplist.403139.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.473666.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_fun.492994.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_list.403331.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_enter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_map.403363.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_json_test_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.497507.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_false_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_true_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.497891.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_false_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_true_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.497539.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.497571.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.concat_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.497603.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.droplast_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.497635.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.dropwhile_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.duplicate_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.497667.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.497699.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.497731.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filter_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filtermap_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.497827.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatlength_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatmap_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop_and_reply.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.sys1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.terminate_crash_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldl_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.timeout_cancel_and_update.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldr_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foreach_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_in_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.join_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.id_transform.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymap_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.binary_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.broken_unicode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.eof_on_pipe.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysort_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_fwrite_stdin_latin1_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.last_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.map_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldl_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldr_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_binary_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.max_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_list_mode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout_isatty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_gl.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_ogl.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.setopts_getopts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.shell_slogan.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options_gen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_prompt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.min_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.bad_printable_range.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.build_text_without_maps_order.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_outofrange_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.calling_self.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.chars_limit.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_outofrange_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.coverage.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.partition_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.cr_whitespace_in_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.prefix_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_g.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_absent_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_w.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_neg_zero.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.github_4801.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_fread_newlines.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_collect_line_3_wb.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_fread_literal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_outofrange_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_print_binary_depth_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.splitwith_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_width_too_small.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_with_huge_message_queue.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.limit_term.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.manpage.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.subtract_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.maps.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.suffix_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10302.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sum_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10755.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.takewhile_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10836.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14175.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14178_unicode_atoms.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeysort_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14285.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14983.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15076.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15103.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15159.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15639.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15705.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15847.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15875.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_17525.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5403.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5813.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6230.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6354.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6495.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_4_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6502.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6517.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6708.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_4_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7084.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_5_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7421.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_3_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_8989.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_4_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.printable_range.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_1.493250.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_2.493282.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.unscan_format_without_maps_order.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.droplast.404963.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.counterexamples.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.dropwhile.404931.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.395588.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476098.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404611.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476258.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404803.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.422212.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476130.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.426917.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476290.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493442.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.498467.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493474.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493570.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_escape_all.395492.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493698.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_float_roundtrip.498723.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493794.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_integer_roundtrip.498691.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493922.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_object_roundtrip.498755.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.494050.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_string_roundtrip.395460.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api.498627.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.enumerate.405027.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api_stream.395428.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.error_info.405059.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_arrays.498659.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.filter_partition.427269.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_atoms.498499.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1.493858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_numbers.498531.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1_e.426821.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_objects.498595.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2.426853.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_strings.498563.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2_e.426885.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_whitespace.395396.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.hof.427397.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_atom.475938.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403523.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_binary.475970.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403779.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_escape_all.476066.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404227.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_float.498371.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404835.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_integer.476002.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422020.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_list.476034.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422244.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_map.498403.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.426949.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_proplist.498435.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493506.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_fun.476226.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493602.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_list.476162.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493730.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_map.476194.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_json_test_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493954.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_false_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_true_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_false_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.join.427365.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_true_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymember.403555.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymerge.404259.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keyreplace.493410.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.concat_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysearch_keyfind.493314.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_1.404291.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_error.404419.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.droplast_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_i.404387.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.dropwhile_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_rand.404355.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.duplicate_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keystore.493346.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keytake.493378.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.member.404899.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.merge.403587.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_5939.493986.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filter_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6023.427141.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filtermap_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6606.427109.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatlength_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_7230.494018.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatmap_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.reverse.404867.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rkeymerge.404323.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rmerge.422052.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldl_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rukeymerge.426341.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldr_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rumerge.403843.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foreach_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.search.404995.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2.427013.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.join_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2_e.493890.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3.427045.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3_e.427077.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_loop.426981.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_1.422084.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymap_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_rand.403619.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2.493762.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2_e.426725.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3.426757.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3_e.426789.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.subtract.427333.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.suffix.427301.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.takewhile.427237.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysort_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeymerge.426309.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_1.426373.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_error.493538.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_i.426437.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_rand.426405.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.last_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.umerge.403811.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.map_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_1.493634.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldl_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_2.493666.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldr_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_1.403875.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.max_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_rand.403907.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_fail.422436.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_pad.422500.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_trim.422468.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_fail.427205.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_pad.422404.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_trim.422372.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip.422276.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip3.422308.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith.427173.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3.422340.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.min_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_fail.404707.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_pad.404739.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_outofrange_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_trim.404771.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_fail.422532.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_outofrange_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_pad.404675.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.partition_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_trim.404643.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.prefix_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_absent_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filter_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filtermap_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_fold_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_foreach_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_outofrange_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.splitwith_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_check_trapping.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_kill_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_check_trapping.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_kill_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.subtract_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_get_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.suffix_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_groups_from_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sum_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.takewhile_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect_with.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeysort_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_valid.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_kill_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_trapping.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_map_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_opt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_with.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_put_opt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_size_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_kill_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_trapping.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_with_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_without_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.constants.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_4_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.floor_ceil.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_4_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_5_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.action_function.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_3_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.andalso_orelse.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_4_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.autoimported.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_1.476386.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_dbg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_2.476418.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_ets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.droplast.477634.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.binary_bifs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.dropwhile.374757.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.bitsyntax.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374373.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.eep37.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374501.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374629.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.float_1_function.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396228.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.from_shell.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396260.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.476962.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477186.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head_from_shell.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477282.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477698.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs_from_shell.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.498851.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499043.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern_from_shell.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499203.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.multipass.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.no_warnings.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.old_guards.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.enumerate.374789.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_14454.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.error_info.396836.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_16824.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.filter_partition.396804.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_defaults.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1.477346.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_index.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1_e.477410.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.records.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2.477378.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.semicolon.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2_e.477442.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.hof.477602.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.top_match.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374405.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.unused_record.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374661.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.warnings.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396292.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.427525.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396484.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428069.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476450.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428421.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476994.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.405827.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477122.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.427557.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477218.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.428101.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477314.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.405667.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.498883.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.423140.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499075.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.405731.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499235.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.423204.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.405859.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.422564.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.join.477570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.428133.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymember.476482.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.405891.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymerge.476770.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.422596.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keyreplace.498819.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.423300.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysearch_keyfind.476514.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.423268.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_1.476802.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.428293.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_error.476898.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist.497666.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_i.476930.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_io_redirect.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_rand.476866.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_localhost.427461.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keystore.476546.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_up_down.497698.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keytake.476578.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428037.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.member.374725.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428389.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.merge.498915.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.405763.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_5939.374437.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.423236.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6023.499555.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.405571.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6606.374469.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.423972.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_7230.396452.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.424132.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.reverse.374693.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.498274.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rkeymerge.476834.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rmerge.498947.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rukeymerge.477058.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.errors.497634.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rumerge.476738.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_debug.405635.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.search.477666.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.405603.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2.396356.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423044.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2_e.396420.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423108.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3.396388.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424004.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3_e.374341.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424164.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_loop.396324.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_1.499011.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_rand.498979.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.405795.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.427973.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2.374245.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428005.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2_e.374309.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428357.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3.374277.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.old_release.424036.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3_e.477250.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_boot.497602.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.subtract.477538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_continue.427429.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.suffix.396772.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash.497730.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.takewhile.396740.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash_tcp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeymerge.477026.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.405699.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_1.477090.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.423172.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_error.395940.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.post_process_args.427493.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_i.499523.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.405987.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_rand.395908.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.422628.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.umerge.499107.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.428229.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_1.374213.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.405923.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_2.477154.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.423332.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_1.499139.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.427589.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_rand.499171.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.405251.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_fail.499619.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.423588.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_pad.374565.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.427621.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_trim.499651.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.423620.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_fail.396612.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.427653.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_pad.374533.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.428197.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_trim.396644.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.423652.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip.396516.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.427685.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip3.396548.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.428165.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith.396580.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3.499587.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.427941.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_fail.477506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.428325.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_pad.374597.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_trim.396708.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_fail.396676.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_pad.477474.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.link_race.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_trim.499683.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.crash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.424324.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.hibernate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_dont_hang.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filter_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.424292.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filtermap_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_fold_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_foreach_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.otp_6345.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.report_cb.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_check_trapping.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.spawn_opt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_kill_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_check_trapping.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stacktrace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_kill_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_get_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_groups_from_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect_with.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_nolink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_valid.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_kill_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_trapping.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format_arbitrary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_map_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_opt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.examples.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_with.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_put_opt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_size_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion_normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.pm_fold_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_kill_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.append.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_trapping.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.backward.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_with_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.badarg.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_without_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.constants.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cursor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.dets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.floor_ceil.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eep37.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.407043.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425124.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.action_function.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425188.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.andalso_orelse.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425508.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.autoimported.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.499938.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_dbg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_ets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.binary_bifs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.bitsyntax.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.ets.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.eep37.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_cache.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.float_1_function.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_unique.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.from_shell.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.evaluator.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.exported_var.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filesort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head_from_shell.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter_var.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs_from_shell.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fold.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.forward.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern_from_shell.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fun_clauses.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.multipass.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.generator_vars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.no_warnings.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.indices.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.old_guards.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_14454.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.407075.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_16824.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.424420.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_defaults.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425156.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_index.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425220.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.records.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425540.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.semicolon.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.top_match.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_complex.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.unused_record.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_filter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.warnings.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_lookup.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.375237.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_merge.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.396932.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_option.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.501187.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_sort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.397252.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.keysort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.499843.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.501219.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.481858.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.501123.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup_rec.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.375461.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.manpage.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.481922.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.375013.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_qlc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.397284.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nomatch.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.501251.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_11758.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.397316.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_12946.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.499875.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.501283.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5644.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.375557.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6038_bug.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.481954.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6359.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist.374853.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_io_redirect.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6590.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_localhost.396900.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6673.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_up_down.374949.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375205.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6964.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375589.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7114.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.375397.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7232.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.481986.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7238.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376005.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7552.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376133.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7714.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.397220.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.overridden_bif.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.501027.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pattern.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pre_fun.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.process_dies.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.errors.374821.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.single.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_debug.501091.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.skip_filters.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376037.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.sort.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376165.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.397188.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.string_to_handle.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.481826.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.table.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.501059.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.unused_var.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375141.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375525.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375173.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375493.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.old_release.376069.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_boot.374981.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_continue.374917.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash.374885.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash_tcp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.481890.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.501155.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.post_process_args.499811.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.375685.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.499939.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.500515.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.375621.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.396964.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.500387.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.396996.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.482146.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.500419.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.397028.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.482178.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.500451.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.375653.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.499907.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.from_list_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.500483.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.375429.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.482018.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.link_race.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.crash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.482402.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.hibernate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_dont_hang.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.482370.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_queue_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.otp_6345.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.report_cb.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.spawn_opt.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stacktrace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.list_conversion_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.new_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.ops_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_nolink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format_arbitrary.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.examples.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion_normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.pm_fold_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.append.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.backward.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.badarg.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cursor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.dets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.to_list_invalid_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eep37.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.do.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.398148.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.483586.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.error.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.501987.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502531.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.io_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502563.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.oops.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.op_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.to_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.ets.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.api_eq.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_bytes.504674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_cache.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_standard_normal.504706.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_unique.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_1.407459.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.evaluator.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_2.504642.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.exported_var.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.bytes_count.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filesort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_jump_api.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_next_api.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter_var.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_float.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fold.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_int.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.forward.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.measure.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fun_clauses.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.mwc59_api.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.generator_vars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.plugin.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.indices.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_procdict.19710370.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_state.19710338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483618.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.seed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.484034.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.short_jump.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.501571.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.splitmix64_next_api.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.502019.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal.505090.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller.505026.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_complex.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller_2.505058.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_filter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.uniform_real_conv.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_lookup.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_merge.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_option.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.interval_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_sort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.keysort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed0.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.bad_utf8_subject.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.combined_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup_rec.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.compile_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.manpage.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_handling.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_qlc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nomatch.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_capture.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_11758.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_unicode_validation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_12946.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5195.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.inspect.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5644.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.match_limit.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6038_bug.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_all_names.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6359.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_dupnames.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6562.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_never_utf.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6590.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_no_start_optimize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6673.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_ucp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6674.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6964.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_compile_workspace_overflow.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7114.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_cve_2008_2371.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7232.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_backwards_accented.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7238.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_infinite_loop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7552.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_version.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7714.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_autogen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.overridden_bif.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_input_types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pattern.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_return.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pre_fun.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_with_fun.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.process_dies.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.run_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.single.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_autogen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.skip_filters.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.sort.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_specials.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.string_to_handle.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.sub_binaries.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.table.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.yield_on_subject_validation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.unused_var.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.return_values.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.select_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.add_element_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.del_element_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filter_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filtermap_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.fold_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.from_list_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_disjoint_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_element_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_empty_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_equal_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_set_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_subset_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.map_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.operations_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.size_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.subtract_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.to_list_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_1_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_2_case.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.add_element.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.from_list_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.create.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.del_element.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filter.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filtermap.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.fold.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.intersection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_disjoint.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_empty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_equal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_set.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_subset.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.iterate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_queue_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.subtract.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_largest.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_smallest.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.union.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.after_paragraph_comment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.begin_comment_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_with_anchor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_inline_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.list_conversion_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.new_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_erlang_html.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.ops_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_unknown_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.double_char_for_quote_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714690.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714754.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714818.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714882.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714946.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715010.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715074.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715138.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715202.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715266.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715330.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715394.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ending_br_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.escaped_character.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.to_list_invalid_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_bullet_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.do.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_numbered_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_doc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.error.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_moduledoc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fake_table_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.io_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.oops.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_spaces.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.op_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_tabs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.forget_closing_comment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.to_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_header_identifier.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.api_eq.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_heading_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_bytes.488706.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_inline_link_with_inline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_standard_normal.502691.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_1.488674.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_long.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_2.488738.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.bytes_count.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_short.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_jump_api.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_paragraph_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_next_api.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_separator_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_float.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h1_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_int.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h2_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.measure.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h3_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.mwc59_api.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h4_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.plugin.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h5_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h6_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_procdict.19694210.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_doc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_state.19694178.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_moduledoc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.seed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.short_jump.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.splitmix64_next_api.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714722.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714786.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal.503171.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714850.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller.503107.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714914.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller_2.503139.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714978.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.uniform_real_conv.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715042.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715106.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715170.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.interval_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715234.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715298.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed0.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715362.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715426.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.bad_utf8_subject.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.combined_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_code_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.compile_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_mfa_link.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_in_middle_word_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_handling.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_with_colons.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_capture.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_unicode_validation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_with_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multi_word_format_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.inspect.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.match_limit.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_all_names.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_dupnames.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_never_utf.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link_not_allowed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_no_start_optimize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_ucp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_compile_workspace_overflow.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_cve_2008_2371.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_backwards_accented.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_fence_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_infinite_loop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_quote_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_version.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_autogen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.new_lines_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_input_types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_doc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_return.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_moduledoc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_with_fun.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_bullet_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.run_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_numbered_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_autogen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_after_heading_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_specials.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_fence_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_in_between_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.sub_binaries.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.parens_with_italics.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.yield_on_subject_validation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.return_values.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_with_anchor_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.select_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_without_space.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.add_element_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.del_element_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filter_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filtermap_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.fold_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_quote_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.from_list_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_disjoint_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_element_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_with_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_empty_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_equal_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_set_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_subset_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.map_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_with_format.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.operations_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.skip_symbols_in_inline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.size_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.start_with_br_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.subtract_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_escaped_bars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.to_list_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_rows.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_1_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_2_case.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.add_element.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_with_inline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.create.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.ansi.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.del_element.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.columns.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filter.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filtermap.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.fold.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.links.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.intersection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_disjoint.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_empty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_non_native.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_equal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_prop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_set.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_smoke.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_subset.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.iterate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_construct_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_bin_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_misc_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.subtract.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_tail_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_largest.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713922.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_smallest.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713986.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.union.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19714178.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.after_paragraph_comment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.407971.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.begin_comment_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.408035.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.425892.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_with_anchor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_inline_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.forget.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713890.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713954.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_erlang_html.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714018.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_unknown_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714210.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.double_char_for_quote_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408003.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698114.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408067.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698178.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698242.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698306.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.known_bugs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698370.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.local_definitions_save_to_module_and_forget.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698434.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_10302.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698498.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_13719.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698562.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14285.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698626.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14296.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698690.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698754.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5226.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698818.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5327.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698882.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5435.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5915.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ending_br_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5916.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.escaped_character.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5990.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_bullet_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6166.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_numbered_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6554.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_doc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7184.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_moduledoc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7232.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fake_table_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_8393.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_bit_syntax.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_spaces.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_funs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_tabs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_lc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.forget_closing_comment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_records.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_header_identifier.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.prompt_width.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_heading_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.records.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_inline_link_with_inline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.refman_bit_syntax.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.restricted_local.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_long.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_interactive.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_short.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_from_shell.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_paragraph_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_on_command_line.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_separator_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.typed_records.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h1_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.types.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h2_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.whereis.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h3_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.compiled_sigils.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h4_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h5_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h6_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.parse_sigils.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_doc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.scan_sigils.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_moduledoc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698082.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698146.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698210.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698274.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.start_link_nodedown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698338.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698402.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start_link.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698466.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.a_function_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698530.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.canonical.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698594.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.composite_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698658.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.constant_function.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698722.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.converse_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698786.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.difference.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698850.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.digraph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.domain_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_code_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.drestriction.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_mfa_link.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.19715906.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_in_middle_word_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_with_colons.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.extension.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_with_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_difference.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multi_word_format_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_domain_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_projection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_range_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link_not_allowed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_specification.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_to_relation_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_sets_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_term_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_fence_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.image.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_quote_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.19715874.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.new_lines_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_doc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_moduledoc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_of_family_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_bullet_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_numbered_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_image.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_after_heading_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_a_function_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_disjoint.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_fence_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_equal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_in_between_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_set_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.parens_with_italics.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_sofs_set_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_subset.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_with_anchor_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.join.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_without_space.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.misc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.multiple_relative_product.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.no_elements_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_family.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.product_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_quote_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.projection.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.range_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_to_family_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_with_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.restriction.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.set_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.specification.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.strict_relation_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_with_format.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.substitution.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.skip_symbols_in_inline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symdiff.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symmetric_partition.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.start_with_br_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.to_sets_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_escaped_bars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_rows.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_of_family_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.weak_relation_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19715970.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_with_inline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716098.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.ansi.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716226.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.columns.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716354.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716002.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716130.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716258.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.links.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716386.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716034.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_non_native.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716162.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_prop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716290.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_smoke.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716418.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716482.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_construct_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.408323.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_bin_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_misc_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_tail_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19715938.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697506.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716066.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697570.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716194.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697794.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716322.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697986.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716450.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.398500.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716514.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.503715.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.408291.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.forget.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697474.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_medium.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697538.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.408259.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697602.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697826.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.408227.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697858.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.503747.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_medium.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.408195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.known_bugs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.408163.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.local_definitions_save_to_module_and_forget.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_10302.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_medium.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_13719.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.408131.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14285.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14296.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5195.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.app_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5226.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.appup_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5327.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.assert_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5435.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5915.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5916.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5990.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.casefold.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6166.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.cd_gc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6554.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.centre.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7184.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chars.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7232.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chomp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_8393.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chr_rchr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_bit_syntax.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.copies.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_funs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.19716546.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_lc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_records.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.prompt_width.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.equal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.records.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.find.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.refman_bit_syntax.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.408355.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.restricted_local.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_interactive.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.is_empty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_from_shell.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.jaro_similarity.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_on_command_line.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.join.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.typed_records.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.left_right.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.types.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.len.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.whereis.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.length.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.compiled_sigils.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lexemes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lowercase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.meas.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.parse_sigils.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.nth_lexeme.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.scan_sigils.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_concat.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_equal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_float.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_integer.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_tokens.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.pad.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.start_link_nodedown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.prefix.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.replace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start_link.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.reverse.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.a_function_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.slice.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.canonical.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.span_cspan.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.composite_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.split.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.constant_function.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.converse_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.str_rstr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.difference.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.strip.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.digraph.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.domain_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_word.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.drestriction.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.substr.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.19699362.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.take.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.titlecase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_float.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.extension.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_graphemes.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_integer.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_difference.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_upper_to_lower.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_domain_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.trim.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.uppercase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.words.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01}/suite.log (55%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01}/suite.log.html (85%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.summary rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_projection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.badstart.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_range_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_specification.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_to_relation_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_union_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_union_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.mini_die.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.from_sets_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.mini_terminate.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.from_term_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.simple_global_supervisor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.image.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.init_per_group.19699330.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_bridge_suite.starting.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.already_started_outside_supervisor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.child_adm.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.intersection_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.child_adm_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.intersection_of_family_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.child_specs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.inverse_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.child_specs_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.inverse_image.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.child_unlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_a_function_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.code_change.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_disjoint.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.code_change_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_equal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.code_change_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_set_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.code_change_simple_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_sofs_set_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.count_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.is_subset.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.count_children_supervisor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.join.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.count_restarting_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.misc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.do_not_save_child_specs_for_temporary_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.multiple_relative_product.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.do_not_save_start_parameters_for_temporary_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.no_elements_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716610.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.partition_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.partition_3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716738.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.partition_family.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716802.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.product_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.projection.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716930.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.range_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19716994.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.relation_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.19717058.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.relation_to_family_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.425924.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.relative_product_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.425988.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.relative_product_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.restriction.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.set_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.external_start_no_progress_log.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.specification.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.extra_return.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.faulty_application_shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.strict_relation_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.format_log_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.substitution.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.format_log_2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.symdiff.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.get_callback_module.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.symmetric_partition.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.hanging_restart_loop.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.to_sets_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.hanging_restart_loop_rest_for_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.union_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.hanging_restart_loop_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.union_of_family_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716578.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.weak_relation_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716642.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list.19699426.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716706.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list.19699554.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716770.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list.19699682.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716834.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list.19699810.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19716962.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list_array.19699458.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.19717026.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list_array.19699586.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.425956.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list_array.19699714.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.426020.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list_array.19699842.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.double_random_to_list_array.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.19699490.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.multiple_restarts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.19699618.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.nonsignificant_temporary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.19699746.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.nonsignificant_transient.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.19699874.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.one_for_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.377093.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.one_for_all_escalation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.504003.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.one_for_all_other_child_fails_restart.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.one_for_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.one_for_one_escalation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.19699394.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.order_of_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.19699522.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.permanent_abnormal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.19699650.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.permanent_normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.19699778.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.permanent_shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.19699906.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.rest_for_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.504035.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.rest_for_one_escalation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.rest_for_one_other_child_fails_restart.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.scale_start_stop_many_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.multi_big.504227.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_bystander.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.multi_big.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_escalation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.multi_medium.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.multi_small.504195.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_temporary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.multi_small.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_transient.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.sched_big.504163.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_all_any.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.sched_big.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_all_never.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.sched_medium.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_any_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.sched_small.504131.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_any_never.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.sched_small.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_child.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.single_big.504099.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_never_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.single_big.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.significant_upgrade_never_any.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.single_medium.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_global_supervisor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.single_small.504067.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.single_small.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_corruption.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_bench_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_escalation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.app_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_extra.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.appup_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_restart_ignore.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.assert_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_scale_many_temporary_children.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.simple_one_for_one_shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/stdlib_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_flags.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.casefold.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_child_returns_error.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.cd_gc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_child_returns_error_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.centre.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_error_return.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.chars.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.chomp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_child.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.chr_rchr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.copies.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_permanent_child_start_child_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.end_per_group.19699970.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_temporary_child.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_temporary_child_start_child.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_ignore_temporary_child_start_child_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.equal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.find.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_map_faulty_specs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.init_per_group.19699938.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_map_simple.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_start_restart_child_returns_error.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.is_empty.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_brutal_kill.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.jaro_similarity.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_brutal_kill_dynamic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.join.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_infinity.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.left_right.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_non_shutdown_exit_dynamic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.len.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_race.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.length.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_timeout.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.lexemes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.sup_stop_timeout_dynamic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.lowercase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.temporary_abnormal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.meas.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.temporary_bystander.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.nth_lexeme.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.temporary_normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.old_concat.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.temporary_shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.old_equal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.transient_abnormal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.old_to_float.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.transient_normal.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.old_to_integer.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.transient_shutdown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.old_tokens.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/supervisor_suite.tree.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.pad.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.prefix.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.replace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.install.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.reverse.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.log.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.slice.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.log_to_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.span_cspan.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.special_process.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.split.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.stats.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.str_rstr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.suspend.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.strip.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sys_suite.trace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.sub_string.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.apply_file_info_opts.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.sub_word.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.atomic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.substr.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.bad_tar.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.take.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.borderline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.titlecase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.bsdtgz.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.to_float.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.cooked_compressed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.to_graphemes.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.create_long_names.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.to_integer.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.dotdot.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.to_upper_to_lower.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.trim.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.errors.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.uppercase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.extract_filtered.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/string_suite.words.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.extract_from_binary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.badstart.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.extract_from_binary_compressed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.extract_from_open_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.incompatible_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.init.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.mini_die.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.leading_slash.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.mini_terminate.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.long_names.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.simple_global_supervisor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.memory.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.open_add_close.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_bridge_suite.starting.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.read_other_implementations.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.already_started_outside_supervisor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.roundtrip_metadata.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.child_adm.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.sparse.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.child_adm_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.child_specs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.symlinks.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.child_specs_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/tar_suite.unicode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.child_unlink.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_after1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.code_change.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_after2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.code_change_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_after3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.code_change_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_after4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.code_change_simple_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_after_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.count_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_interval1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.count_children_supervisor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_interval2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.count_restarting_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_interval_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.do_not_save_child_specs_for_temporary_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_repeatedly1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.do_not_save_start_parameters_for_temporary_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_repeatedly2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700002.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.apply_repeatedly_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700066.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700130.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700194.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700226.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700290.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.19700322.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.504291.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.cancel_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.504387.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717346.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.504451.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717410.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717474.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717538.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.external_start_no_progress_log.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717602.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.extra_return.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717666.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.faulty_application_shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717730.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.format_log_1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717794.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.format_log_2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.19717858.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.get_callback_module.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.hanging_restart_loop.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.hanging_restart_loop_rest_for_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.exit_after1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.hanging_restart_loop_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.exit_after2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.19700034.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.exit_after3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.19700098.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.exit_after4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.19700162.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717314.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.19700258.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717378.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504259.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717442.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504323.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717506.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504355.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717570.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504419.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717634.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504483.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717698.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.504515.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717762.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.19717826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.multiple_restarts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.nonsignificant_temporary.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.kill_after1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.nonsignificant_transient.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.kill_after2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.one_for_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.kill_after3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.one_for_all_escalation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.nonexistent1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.one_for_all_other_child_fails_restart.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.nonexistent2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.one_for_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.one_for_one_escalation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.order_of_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.permanent_abnormal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.permanent_normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.permanent_shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.rest_for_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after7.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.rest_for_one_escalation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_after_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.rest_for_one_other_child_fails_restart.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.scale_start_stop_many_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_bystander.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_escalation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_temporary.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.send_interval_invalid_args.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_transient.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.sleep1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_all_any.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.sleep2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_all_never.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_any_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.tc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_any_never.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.timer_perf.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_child.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.unexpected1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_never_all.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.unexpected2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.significant_upgrade_never_any.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_simple_suite.unexpected3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_global_supervisor.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_suite.do_big_test.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_corruption.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_escalation.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/timer_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01}/unexpected_io.log.html (58%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_extra.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.binaries_errors_limit.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_restart_ignore.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.error_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_scale_many_temporary_children.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.ex_binaries_errors_utf16_big.19718018.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.simple_one_for_one_shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.ex_binaries_errors_utf16_little.19717986.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.ex_binaries_errors_utf32_big.408387.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_flags.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.ex_binaries_errors_utf32_little.19718050.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_child_returns_error.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.ex_binaries_errors_utf8.19717954.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_child_returns_error_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.exceptions.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_error_return.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.huge_illegal_code_points.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_fail.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.latin1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_child.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.random_lists.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_permanent_child_start_child_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.roundtrips.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_temporary_child.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_temporary_child_start_child.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.utf16_illegal_sequences_bif.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_ignore_temporary_child_start_child_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_suite.utf8_illegal_sequences_bif.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.casefold.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_map_faulty_specs.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.count.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_map_simple.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.cp.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.extra.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_start_restart_child_returns_error.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.gc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_brutal_kill.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.get.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_brutal_kill_dynamic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.lookup.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_infinity.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.lowercase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_non_shutdown_exit_dynamic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.nfc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_race.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.nfd.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_timeout.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.nfkc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.sup_stop_timeout_dynamic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.nfkd.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.temporary_abnormal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.temporary_bystander.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.titlecase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.temporary_normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.uppercase.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.temporary_shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/unicode_util_suite.whitespace.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.transient_abnormal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_property_test_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.transient_normal.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_property_test_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.transient_shutdown.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_property_test_suite.normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/supervisor_suite.tree.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_property_test_suite.recompose.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_property_test_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.compose_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.install.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.compose_query_latin1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.log.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.compose_query_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.log_to_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.dissect_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.special_process.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.dissect_query_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.interop_query_latin1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.stats.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.interop_query_utf8.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.suspend.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sys_suite.trace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_binary_pct_encoded_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.apply_file_info_opts.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_binary_pct_encoded_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.atomic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_binary_pct_encoded_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.bad_tar.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.borderline.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.bsdtgz.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_pct_encoded_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.cooked_compressed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_pct_encoded_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.create_long_names.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_pct_encoded_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.dotdot.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_pct_encoded_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.normalize_return_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.errors.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.extract_filtered.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.extract_from_binary.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_host.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.extract_from_binary_compressed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_host_ipv4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.extract_from_open_file.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_host_ipv6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.incompatible_options.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.init.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_pct_encoded_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_pct_encoded_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.leading_slash.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_pct_encoded_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.long_names.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_port.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.memory.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.open_add_close.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_scheme.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.read_other_implementations.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_binary_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.roundtrip_metadata.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.sparse.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_host.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_host_ipv4.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.symlinks.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_host_ipv6.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/tar_suite.unicode.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_list.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_after1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_mixed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_after2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_after3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_after4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_pct_encoded_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_after_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_pct_encoded_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_interval1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_pct_encoded_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_interval2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_port.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_interval_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_repeatedly1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_recompose_autogen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_repeatedly2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_relative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.apply_repeatedly_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_scheme.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_special.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_special2.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.parse_userinfo.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.quote.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_autogen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.cancel_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_host_absolute_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700610.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_host_relative_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700674.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_parse_fragment.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700738.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_parse_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700802.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_parse_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700866.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700930.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.recompose_query.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19700994.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.regression_normalize.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19701058.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.regression_parse.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.19701122.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.regression_recompose.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.resolve_abnormal_examples.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.resolve_base_uri.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.exit_after1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.resolve_normal_examples.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.exit_after2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.resolve_return_map.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.exit_after3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.exit_after4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.transcode_basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700578.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.transcode_mixed.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700642.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.transcode_negative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700706.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/uri_string_suite.transcode_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700770.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/win32reg_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700834.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/win32reg_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700898.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_1999_01_01.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19700962.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_1999_02_28.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19701026.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_1999_09_09.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.19701090.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_2000_01_01.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_group.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_2000_02_29.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_2001_01_01.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.kill_after1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_2001_02_29.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.kill_after2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.date_2004_02_29.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.kill_after3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.nonexistent1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.nonexistent2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/y2k_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.aliases.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.atomic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.bad_zip.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.19718370.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.19718562.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.408579.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after7.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.408739.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_after_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.409027.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.426180.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.426436.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.426628.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.basic_timestamp.426724.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval5.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.borderline.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.send_interval_invalid_args.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.compress_control.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.sleep1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718242.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.sleep2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718466.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718690.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.tc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718722.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.timer_perf.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718818.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.unexpected1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19718946.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.unexpected2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19719458.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_simple_suite.unexpected3.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19719490.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_suite.do_big_test.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19719682.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19719810.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19720418.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/timer_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19720450.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.binaries_errors_limit.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19720834.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.error_info.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19721058.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.ex_binaries_errors_utf16_big.504579.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19721762.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.ex_binaries_errors_utf16_little.504547.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19721794.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.ex_binaries_errors_utf32_big.504643.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.19721826.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.ex_binaries_errors_utf32_little.504611.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.408867.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.ex_binaries_errors_utf8.19701218.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.408899.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.exceptions.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.426084.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.huge_illegal_code_points.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.426276.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.latin1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.426308.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.426532.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.random_lists.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.426788.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.roundtrips.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.429061.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.utf16_illegal_sequences_bif.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_suite.utf8_illegal_sequences_bif.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.explicit_file_info.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.casefold.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.19718338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.count.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.19718658.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.cp.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.408611.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.extra.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.408771.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.gc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.409059.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.get.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.426212.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.lookup.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.426468.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.lowercase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.426660.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.nfc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.extended_timestamp.426756.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.nfd.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.fd_leak.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.nfkc.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.foldl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.nfkd.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718178.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718210.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.titlecase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718274.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.uppercase.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718498.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/unicode_util_suite.whitespace.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718754.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_property_test_suite.end_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718786.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_property_test_suite.init_per_suite.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718850.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_property_test_suite.normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19718978.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_property_test_suite.recompose.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19719522.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_property_test_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19719586.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.compose_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19719714.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.compose_query_latin1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19719842.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.compose_query_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19720482.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.dissect_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19720642.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.dissect_query_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19720866.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.interop_query_latin1.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.19721090.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.interop_query_utf8.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.408675.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.408931.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_binary_pct_encoded_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.408963.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_binary_pct_encoded_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.426116.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_binary_pct_encoded_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.426340.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.426372.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.426564.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_pct_encoded_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.429029.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_pct_encoded_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.429093.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_pct_encoded_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_pct_encoded_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.normalize_return_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.list_dir_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.19718306.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.19718530.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_host.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.19718594.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_host_ipv4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.408547.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_host_ipv6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.408707.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.408995.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_pct_encoded_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.426148.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_pct_encoded_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.426404.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_pct_encoded_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.mode.426596.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_port.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.open_leak.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_scheme.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.test_zip_dir.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_binary_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.19718402.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.19718434.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_host.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.19718626.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_host_ipv4.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.408643.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_host_ipv6.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.408803.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_list.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.408835.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_mixed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.426244.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.426500.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.uid_gid.426692.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_pct_encoded_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unicode.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_pct_encoded_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19718882.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_pct_encoded_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19719010.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_port.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19719618.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19719746.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_recompose_autogen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19719874.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_relative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19720674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_scheme.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19720898.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_special.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.19721122.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_special2.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip64_central_headers.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.parse_userinfo.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip_from_binary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.quote.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip_jar.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_autogen.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip_to_binary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_host_absolute_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.unzip_traversal_exploit.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_host_relative_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19718914.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_parse_fragment.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19719650.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_parse_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19719778.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_parse_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19720322.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_path.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19720706.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.recompose_query.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19720930.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.regression_normalize.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.19721538.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.regression_parse.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.409123.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.regression_recompose.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_directory.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.resolve_abnormal_examples.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_headers.19719554.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.resolve_base_uri.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_headers.19720514.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.resolve_normal_examples.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip64_central_headers.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.resolve_return_map.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip_api.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.src.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.transcode_basic.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zip_suite.zip_to_binary.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.transcode_mixed.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zzz_suite.lc_graph.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.transcode_negative.html => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/zzz_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/select_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/sets_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/sets_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/shell_docs_markdown_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/shell_docs_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/shell_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/sigils_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/slave_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/sofs_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/stdlib_bench_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/stdlib_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/string_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/supervisor_bridge_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/supervisor_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/sys_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/tar_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/timer_simple_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/timer_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/unicode_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/unicode_util_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/uri_string_property_test_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/uri_string_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/win32reg_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/y2k_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/zip_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/make_test_dir.stdlib_test.logs/zzz_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/misc_io.log.html (95%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/oc_event.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/oc_fsm.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/oc_server.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/oc_statem.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/simple_server.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/simple_server_mon.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/simple_server_timer.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/simple_server_timer_mon.beam (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23}/t (100%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/totals.info rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/ct_default.css (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/ctlog.html (92%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/index.html (92%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/jquery-latest.js (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/jquery.tablesorter.min.js (100%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/last_name rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/last_test.html (87%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/erl_print_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/erlc_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/erlexec_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/ethread_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/install_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/last_link.html (87%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/last_name rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/nt_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/otp_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/parallel_messages_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21}/cover.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/uri_string_suite.transcode_options.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.4098.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/win32reg_suite.init_per_suite.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.4162.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/win32reg_suite.src.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.4482.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_1999_01_01.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.4674.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_1999_02_28.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.5122.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_1999_09_09.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_2000_01_01.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.4066.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_2000_02_29.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.4130.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_2001_01_01.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.4514.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_2001_02_29.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.5.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.date_2004_02_29.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.5090.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.end_per_suite.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ct_framework.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.init_per_suite.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.character.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/y2k_suite.src.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.erlang_display.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.aliases.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.float.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.atomic.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.integer.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.bad_zip.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.quote.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.19701570.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.snprintf.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.19701762.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.19701954.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erl_print_suite.string.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.398660.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.arg_overflow.163.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.398820.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.arg_overflow.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.504707.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_erl.1218.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.505027.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_erl.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.505187.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_mib.67.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.basic_timestamp.505283.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_mib.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.borderline.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_script.35.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.compress_control.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_script.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19701666.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_yecc.3.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19701826.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.compile_yecc.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702050.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.deep_cwd.131.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702082.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.deep_cwd.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702178.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.end_per_group.2338.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702306.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.end_per_group.3842.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702338.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.end_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702370.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702498.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features.3810.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19702626.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19703234.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_all.2978.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19703266.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_all.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19703426.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_atom_warnings.2498.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19703554.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_atom_warnings.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19704194.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_directives.2466.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19704226.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_directives.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19704514.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_disable.2882.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19704706.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_disable.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19705442.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_erlc_describe.2402.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19705474.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_erlc_describe.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.19705506.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_erlc_unknown.2434.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.398756.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_erlc_unknown.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.504835.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_include.3522.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.504931.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_include.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.505123.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_load.3202.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_group.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_load.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.end_per_suite.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_macros.2530.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.explicit_file_info.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_macros.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.19701602.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_runtime.3298.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.19701794.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.features_runtime.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.19702242.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.good_citizen.99.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.398692.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.good_citizen.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.504739.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.init_per_group.1186.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.504867.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.init_per_group.2370.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.505059.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.init_per_group.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.505219.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.extended_timestamp.505315.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.make_dep_options.195.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.fd_leak.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.make_dep_options.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.foldl.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701442.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.unicode_paths.227.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701474.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlc_suite.unicode_paths.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701506.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.args_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701698.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.args_file_env.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701858.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.argument_separation.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701890.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.argument_with_option.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19701986.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702114.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.env.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702146.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.evil_args_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702402.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702434.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.missing_args_file.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702466.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.otp_7461.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702530.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19702658.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/erlexec_suite.zdbbl_dist_buf_busy_limit.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19703298.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.atomic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19703362.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.broadcast.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19703458.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.cond_wait.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19703586.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.create_join_thread.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19704258.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.detached_thread.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19704546.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.dw_atomic_massage.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.19704738.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.equal_tids.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.398596.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.max_threads.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.398788.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.mutex.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.504963.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.rwmutex.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.505443.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.rwspinlock.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_group.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.spinlock.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.init_per_suite.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.list_dir_options.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.thread_name.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.19701538.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.try_lock_mutex.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.19701730.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/ethread_suite.tsd.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.19701922.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.'bin white space'.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.19702210.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_default.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.398628.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_default_dirty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.504675.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_dirname_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.504995.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_no_srcfile.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.505155.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_no_use_dirname_fail.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.mode.505251.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_not_abs.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.open_leak.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_ok_symlink.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.src.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_outside_eprfx.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.test_zip_dir.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_outside_eprfx_dirty.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.19701634.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_same_dir.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.19702018.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_unreachable_absolute.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.19702274.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_unreachable_relative.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.398724.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.bin_unreasonable_path.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.504771.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.504803.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.504899.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/install_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.505091.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/nt_suite.nt.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.uid_gid.505347.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/nt_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unicode.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.call_to_deprecated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19702562.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.call_to_now_0.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19702690.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.call_to_size_1.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19703394.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.deprecated_not_in_obsolete.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19703490.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19703618.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.erl_file_encoding.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19704578.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.19704770.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.obsolete_but_not_deprecated.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.505475.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.runtime_dependencies_functions.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip64_central_headers.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.runtime_dependencies_modules.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip_from_binary.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip_jar.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.strong_components.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip_options.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.test_runtime_dependencies_versions.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip_to_binary.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.undefined_functions.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.unzip_traversal_exploit.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/otp_suite.xml_file_encoding.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.19702594.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/parallel_messages_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.19703138.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/parallel_messages_suite.test_message_queue_data_switching.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.19703522.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/parallel_messages_suite.test_throughput_benchmark.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.19704610.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.basic.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.19705250.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.defunct.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.505379.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.heavier.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.505411.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.heavy.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.505507.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.sleepy_child.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_directory.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/run_erl_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21}/suite.log (58%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21}/suite.log.html (81%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/suite.summary rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21}/unexpected_io.log.html (94%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_headers.19703330.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.ancient_major.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_headers.19704290.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.end_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip64_central_headers.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.init_per_suite.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip_api.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.major.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip_options.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.minor.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zip_suite.zip_to_binary.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/upgrade_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zzz_suite.lc_graph.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/z_suite.core_files.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/zzz_suite.src.html => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/make_test_dir.system_test.logs/run.2024-09-12_11.29.21/z_suite.src.html} (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/run_erl_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/upgrade_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/make_test_dir.system_test.logs/z_suite.src.html (100%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/misc_io.log.html (94%) rename prs/8803/ct_logs/{ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30 => ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20}/test.beam (60%) create mode 100644 prs/8803/ct_logs/ct_run.test_server@a4cca6e7dcb5.2024-09-12_11.29.20/totals.info rename prs/8803/ct_logs/{variables-test_server@43e13ac1be0c => variables-test_server@7a1fde2d1d55} (100%) rename prs/8803/ct_logs/{variables-test_server@27af2e7fa355 => variables-test_server@a4cca6e7dcb5} (100%) create mode 100644 prs/8803/doc/system/dist/search_data-0DC1A4B6.js delete mode 100644 prs/8803/doc/system/dist/search_data-9BDB5A32.js delete mode 100644 prs/8803/lib/asn1-5.3/doc/html/dist/search_data-06A31C18.js create mode 100644 prs/8803/lib/asn1-5.3/doc/html/dist/search_data-965B670D.js delete mode 100644 prs/8803/lib/common_test-1.27/doc/html/dist/search_data-1A83014C.js create mode 100644 prs/8803/lib/common_test-1.27/doc/html/dist/search_data-5DA668F7.js create mode 100644 prs/8803/lib/eunit-2.9.1/doc/html/dist/search_data-4CEF3D2D.js delete mode 100644 prs/8803/lib/eunit-2.9.1/doc/html/dist/search_data-C541596B.js delete mode 100644 prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-6435E30D.js create mode 100644 prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-731AC49D.js delete mode 100644 prs/8803/lib/tftp-1.2/doc/html/dist/search_data-AF02D849.js create mode 100644 prs/8803/lib/tftp-1.2/doc/html/dist/search_data-C5EAE448.js create mode 100644 prs/8803/lib/tools-4.0/doc/html/dist/search_data-536C0AEB.js delete mode 100644 prs/8803/lib/tools-4.0/doc/html/dist/search_data-8780CEA5.js delete mode 100644 prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-7004C420.js create mode 100644 prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-DBD265E3.js diff --git a/prs/8803/9347543 b/prs/8803/22983057 similarity index 100% rename from prs/8803/9347543 rename to prs/8803/22983057 diff --git a/prs/8803/ct_logs/all_runs.html b/prs/8803/ct_logs/all_runs.html index 9a133a87af4a1..5d4c49f584044 100644 --- a/prs/8803/ct_logs/all_runs.html +++ b/prs/8803/ct_logs/all_runs.html @@ -107,7 +107,7 @@

All test runs in "ct_logs"

-Wed Sep 11 2024 12:06:30test_server@27af2e7fa355 +Thu Sep 12 2024 11:29:20test_server@a4cca6e7dcb5 - 1 make_test_dir.system_test @@ -119,7 +119,7 @@

All test runs in "ct_logs"

-Wed Sep 11 2024 11:10:18test_server@43e13ac1be0c +Thu Sep 12 2024 10:32:23test_server@7a1fde2d1d55 - 1 make_test_dir.stdlib_test @@ -136,7 +136,7 @@

All test runs in "ct_logs"



diff --git a/prs/8803/ct_logs/ct_log_cache b/prs/8803/ct_logs/ct_log_cache index db416f539ac0505e20f8096ef6dee08f68e6d730..e13bbe63824a3acf8e9cbfd24a1205f24a2d3029 100644 GIT binary patch literal 770 zcmchUv2Md46h&WJXNc4fXqV1iObkw9WvTin2m>t!+o=FI?c5(PSRROED^iCH3=iqO zd+xozDm!o5(+A~@D`_CZh*T{A+^Ks5CHK@0J@V3d>ZJXW_Kod0X9rmcUhfep$SyCA zIVKc`&13jDKlCR$E(qqCf!BZB*fzb8-$?ncUBajseixDmEcTZe1u6+5rOFIErrha* zfmI$&t_(bP%*ctivB-JRHuX585R21lT?1?m3|J8!%=<}iUt}`DB!2X$tJVgd7L_BO zj>h#&c2~6)&yI$+vCp)&fLNjet1R&uwdZ=fs?B`}ZS2j!&+Xv1ZfLxW{wD30#So~p OE#;Oug~ZT(YW)X`f$sGH literal 770 zcmchUu};G<7=-^qI#l8TU}0v7V>?X)3*t>I*Ku*|Bt^DEVdlk&tqw*?RH*}l2M_<< zeRn@9J8in-I}=gYxKFysT z7+B>2a%JGL=SH6MwiY?xbnQO=(Nv4mYP|>8>^N{dJ(%Z7wdcYlJUaTSwSk94=MYZ^ za6QxAMXyEK2vmeU)7fHQRi(0oGkDMKcF|k-skFG8f$#qdU%0XLGVq2dhuXEYd5kEG|jS1@rZC^3#j6GFTI{6B!bjfS3UQjdC7L diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_name b/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_name deleted file mode 100644 index d85af3980372c..0000000000000 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_name b/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_name deleted file mode 100644 index d85af3980372c..0000000000000 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55 diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.summary b/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.summary deleted file mode 100644 index 9bfe971cf233b..0000000000000 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.summary +++ /dev/null @@ -1 +0,0 @@ -{summary,{2358,0,48,0,3113804063}}. diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/totals.info b/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/totals.info deleted file mode 100644 index 71f15229d7f8762744fac04a4e4026b1495c2006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmZq9V992XC`m0Yi7!qqDoZVLFfmRwG)_!5OiDFKF6S)GOG!=3%u7wlVPIfj%w~|w qP0UV>2dhuXEYd43Ny*7f0`v89^3#j6GFX!s7&y%m84?YEm;nIfG9F0) diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/MY_MODULE.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/MY_MODULE.beam similarity index 90% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/MY_MODULE.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/MY_MODULE.beam index 69ff7ae5af0f8184380c06b60223c78f83cb6f99..d872351be26e0404738f2abf29241c4fbaee12ca 100644 GIT binary patch delta 44 zcmdnPx`%axB9nr7qG4J}s!@tzim9odk%5tku7Rblp;5e{fu6CEo{{lnN2Y235Z4P< delta 44 zcmdnPx`%axB9nrNajKzlVzOaUszI`zk%5tku7Rblp<%qCp`M|Eo}tBLN2Y234Dbs` diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/ct_default.css b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/ct_default.css similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/ct_default.css rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/ct_default.css diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/ctlog.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/ctlog.html similarity index 78% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/ctlog.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/ctlog.html index 3e28ba75b1856..ecc2fa77f8b68 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/ctlog.html +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/ctlog.html @@ -118,169 +118,169 @@

PRE/POST TEST I/O LOG

PROGRESS LOG

 
-
*** CT 2024-09-11 11:10:18.560 *** Common Test Logger started
+
*** CT 2024-09-12 10:32:23.554 *** Common Test Logger started
 VERBOSITY LEVELS:
 general level            100
 default                  100
 
 
-
*** CT 2024-09-11 11:10:18.564 *** Test Specification file(s)
+
*** CT 2024-09-12 10:32:23.557 *** Test Specification file(s)
 /buildroot/otp/lib/stdlib/make_test_dir/stdlib_test/stdlib_gh.spec 
 

-
*** CT 2024-09-11 11:10:55.037 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.747 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group parser in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.037 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.747 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group usage in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.038 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.747 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group validator in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.038 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.747 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group run in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.039 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.748 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group roundtrip in base64_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group valid_input in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group out_of_binary in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_subjects in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_patterns in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group misc_invalid in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.040 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.749 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_input in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.041 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.751 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group unused_vars_warn in erl_lint_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.041 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.751 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group on_load in erl_lint_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.048 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.757 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group basic_stats in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.048 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.757 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group distr_stats in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.048 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.757 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group reference_jump in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.051 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.761 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group binaries_errors in unicode_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.055 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.764 *** TEST INFO
 1 test(s), 84 suite(s)
 

-
*** CT 2024-09-11 11:10:55.055 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.764 *** TEST INFO
 Timetrap time multiplier = 1
 Timetrap scaling enabled = false
 

-
*** CT 2024-09-11 11:10:55.160 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.870 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group parser in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.160 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.870 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group usage in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.160 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.870 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group validator in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.160 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.870 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group run in argparse_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group roundtrip in base64_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group valid_input in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group out_of_binary in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_subjects in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_patterns in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group misc_invalid in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.161 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.871 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group invalid_input in binary_property_test_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.163 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.873 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group unused_vars_warn in erl_lint_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.163 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.873 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group on_load in erl_lint_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.170 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.880 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group basic_stats in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.170 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.880 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group distr_stats in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.170 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.880 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group reference_jump in rand_SUITE, using default.
 

-
*** CT 2024-09-11 11:10:55.173 *** TEST INFO
+
*** CT 2024-09-12 10:33:01.883 *** TEST INFO
 init_per_group/2 and end_per_group/2 missing for group binaries_errors in unicode_SUITE, using default.
 

-
*** CT 2024-09-11 12:02:51.848 *** Common Test Logger finished
+
*** CT 2024-09-12 11:26:02.590 *** Common Test Logger finished
 


diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/erl_pp_test.E b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/erl_pp_test.E similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/erl_pp_test.E rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/erl_pp_test.E diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/format_status_server.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/format_status_server.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/format_status_server.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/format_status_server.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/format_status_statem.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/format_status_statem.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/format_status_statem.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/format_status_statem.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_fsm.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_fsm.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_fsm.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_fsm.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_server.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_server.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_server.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_server.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_server_timer.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_server_timer.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_server_timer.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_server_timer.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_statem.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_statem.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_statem.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_statem.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_statem_complex.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_statem_complex.beam similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/generic_statem_complex.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/generic_statem_complex.beam diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/index.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/index.html similarity index 92% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/index.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/index.html index 4e031955b51f4..98eeaee04c3aa 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/index.html +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/index.html @@ -3,7 +3,7 @@ -Test Results Wed Sep 11 2024 11:10:18 +Test Results Thu Sep 12 2024 10:32:23 @@ -81,7 +81,7 @@

Test Results

-

Wed Sep 11 2024 11:10:18

+

Thu Sep 12 2024 10:32:23


@@ -103,12 +103,12 @@

Wed Sep 11 2024 11:10:18

-make_test_dir.stdlib_test +make_test_dir.stdlib_test 2358 0 48 (48/0) 0 -3113.804s +3178.256s @@ -118,7 +118,7 @@

Wed Sep 11 2024 11:10:18

0 48 (48/0) 0 -3113.804s +3178.256s @@ -130,7 +130,7 @@

Wed Sep 11 2024 11:10:18

diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/jquery-latest.js b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/jquery-latest.js similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/jquery-latest.js rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/jquery-latest.js diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/jquery.tablesorter.min.js b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/jquery.tablesorter.min.js similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/jquery.tablesorter.min.js rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/jquery.tablesorter.min.js diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/l_mod.beam b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/l_mod.beam similarity index 76% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/l_mod.beam rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/l_mod.beam index 8a6cbca09d183caab919b6110cc701f0b7774b69..3515ca6e07a078c274dc00a87cb685b063224703 100644 GIT binary patch delta 111 zcmX@Wae!mPS|$baM8mX{RHGEb6jM_@BLgE7T?0#9L!)>@13hCSJtO1E_n39LAY5ZT Q1H;KI%)3a|Bg&!;0Dg@d`2YX_ delta 111 zcmX@Wae!mPS|$Y(<5WZA#AL&yRD)zaBLgE7T?0#9L&JDOLp?(SJwuDh_n39LU|dtv O$t=vfNY*3Dq749Z9UJ8U diff --git a/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_name b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_name new file mode 100644 index 0000000000000..5f7db20349087 --- /dev/null +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_name @@ -0,0 +1 @@ +/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01 diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_test.html similarity index 87% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_test.html index acb36ed788fc7..c9d6ca6956000 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/last_test.html +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/last_test.html @@ -8,6 +8,6 @@

Last test

-make_test_dir.stdlib_test.logs +make_test_dir.stdlib_test.logs diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/argparse_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/argparse_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/argparse_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/argparse_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/array_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/array_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/array_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/array_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/base64_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/base64_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/base64_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/base64_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/base64_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/base64_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/base64_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/base64_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/beam_lib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/beam_lib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/beam_lib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/beam_lib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/binary_module_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/binary_module_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/binary_module_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/binary_module_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/binary_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/binary_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/binary_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/binary_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/c_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/c_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/c_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/c_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/calendar_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/calendar_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/calendar_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/calendar_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/dets_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/dets_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/dets_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/dets_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/dict_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/dict_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/dict_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/dict_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/digraph_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/digraph_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/digraph_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/digraph_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/digraph_utils_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/digraph_utils_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/digraph_utils_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/digraph_utils_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/edlin_context_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/edlin_context_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/edlin_context_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/edlin_context_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/edlin_expand_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/edlin_expand_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/edlin_expand_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/edlin_expand_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/epp_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/epp_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/epp_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/epp_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_anno_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_anno_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_anno_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_anno_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_eval_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_eval_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_eval_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_eval_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_expand_records_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_expand_records_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_expand_records_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_expand_records_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_internal_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_internal_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_internal_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_internal_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_lint_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_lint_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_lint_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_lint_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_pp_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_pp_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_pp_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_pp_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_scan_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_scan_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/erl_scan_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/erl_scan_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/error_logger_h_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/error_logger_h_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/error_logger_h_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/error_logger_h_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/escript_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/escript_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/escript_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/escript_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_tough_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_tough_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ets_tough_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ets_tough_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/file_sorter_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/file_sorter_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/file_sorter_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/file_sorter_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/filelib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/filelib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/filelib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/filelib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/filename_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/filename_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/filename_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/filename_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/fixtable_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/fixtable_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/fixtable_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/fixtable_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/format_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/format_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/format_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/format_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gb_sets_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gb_sets_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gb_sets_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gb_sets_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_event_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_event_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_event_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_event_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_fsm_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_fsm_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_fsm_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_fsm_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_server_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_server_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_server_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_server_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_statem_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_statem_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/gen_statem_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/gen_statem_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/id_transform_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/id_transform_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/id_transform_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/id_transform_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/io_proto_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/io_proto_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/io_proto_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/io_proto_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/io_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/io_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/io_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/io_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/json_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/json_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/json_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/json_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_link.html similarity index 87% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_link.html index 153eda04bdd41..c804ee0919c38 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/last_link.html +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_link.html @@ -8,6 +8,6 @@

Last test

-make_test_dir.stdlib_test.logs +make_test_dir.stdlib_test.logs diff --git a/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_name b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_name new file mode 100644 index 0000000000000..5f7db20349087 --- /dev/null +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/last_name @@ -0,0 +1 @@ +/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01 diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/lists_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/lists_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/lists_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/lists_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/lists_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/lists_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/lists_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/lists_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/log_mf_h_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/log_mf_h_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/log_mf_h_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/log_mf_h_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/maps_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/maps_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/maps_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/maps_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/math_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/math_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/math_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/math_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ms_transform_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ms_transform_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/ms_transform_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/ms_transform_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/peer_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/peer_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/peer_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/peer_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/pool_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/pool_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/pool_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/pool_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/proc_lib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/proc_lib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/proc_lib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/proc_lib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/proplists_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/proplists_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/proplists_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/proplists_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/qlc_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/qlc_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/qlc_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/qlc_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/queue_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/queue_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/queue_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/queue_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/queue_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/queue_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/queue_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/queue_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/rand_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/rand_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/rand_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/rand_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/random_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/random_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/random_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/random_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/re_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/re_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/re_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/re_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3170.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.argparse.1282.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3170.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.argparse.1282.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3234.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.basic.1250.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3234.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.basic.1250.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3746.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.built_in_types.3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3746.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.built_in_types.3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3970.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.command_usage.229.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.3970.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.command_usage.229.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.4482.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.complex_command.99.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.4482.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.complex_command.99.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.default_for_not_required.1378.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.default_for_not_required.1378.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3138.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.global_default.1410.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3138.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.global_default.1410.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3202.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.invalid_arguments.35.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3202.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.invalid_arguments.35.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3266.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.long_form_eq.67.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3266.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.long_form_eq.67.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3778.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.multi_short.1506.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.3778.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.multi_short.1506.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.4450.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nargs.131.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.4450.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nargs.131.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.negative.1314.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ct_framework.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.negative.1314.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.character.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nodigits.1346.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.character.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.nodigits.1346.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.erlang_display.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error.195.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.erlang_display.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error.195.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.float.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error_usage.197.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.float.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.parser_error_usage.197.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.integer.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.pos_mixed_with_opt.4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.integer.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.pos_mixed_with_opt.4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.quote.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.proxy_arguments.5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.quote.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.proxy_arguments.5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.snprintf.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.readme.1186.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.snprintf.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.readme.1186.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.subcommand.1442.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erl_print_suite.string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.subcommand.1442.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.226.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.type_validators.1218.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.226.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.type_validators.1218.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.unicode.163.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.arg_overflow.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.unicode.163.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.34.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage.1570.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.34.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage.1570.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_args_ordering.227.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_erl.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_args_ordering.227.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.130.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_required_args.1602.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.130.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_required_args.1602.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_template.165.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_mib.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_template.165.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.98.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_width.261.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.98.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.usage_width.261.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception.69.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_script.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception.69.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.66.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception_format.101.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.66.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.validator_exception_format.101.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.very_short.1474.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.compile_yecc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/argparse_suite.very_short.1474.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.194.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.194.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.fix_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.deep_cwd.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.fix_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.1410.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldl_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.1410.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldl_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.2914.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldr_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.2914.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.foldr_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_list_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_list_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_orddict_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.from_orddict_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.2882.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.2882.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.map_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.map_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.2050.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.new_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.2050.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.new_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.relax_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_all.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.relax_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.1570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.resize_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.1570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.resize_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.set_get_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_atom_warnings.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.set_get_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.1538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldl_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.1538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldl_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldr_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_directives.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_foldr_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.1954.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_map_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.1954.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_map_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_list_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_disable.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_list_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.1474.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_orddict_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.1474.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.sparse_to_orddict_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_describe.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.1506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_list_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.1506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_list_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_orddict_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_erlc_unknown.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/array_suite.to_orddict_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.2594.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.2594.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_include.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.2274.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_noisy_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.2274.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_1_noisy_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_load.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.1602.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.1602.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_noisy_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_macros.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_2_noisy_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.2370.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.2370.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.features_runtime.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.162.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_noisy_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.162.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_1_noisy_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.good_citizen.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.1442.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.1442.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_noisy_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.decode_to_string_2_noisy_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.258.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.258.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.make_dep_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.encode_to_string_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.290.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.290.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlc_suite.unicode_paths.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_1_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file_env.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.args_file_env.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_separation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_separation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_2_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_with_option.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.argument_with_option.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.env.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.env.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.evil_args_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.evil_args_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.missing_args_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.missing_args_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.otp_7461.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_modes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.otp_7461.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_modes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_to_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_decode_to_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.zdbbl_dist_buf_busy_limit.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/erlexec_suite.zdbbl_dist_buf_busy_limit.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.atomic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_modes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.atomic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_modes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.broadcast.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_to_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.broadcast.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_encode_to_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.cond_wait.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_5635.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.cond_wait.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_5635.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.create_join_thread.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_6279.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.create_join_thread.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.base64_otp_6279.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.detached_thread.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.big.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.detached_thread.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.big.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.dw_atomic_massage.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.illegal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.dw_atomic_massage.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.illegal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.equal_tids.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.equal_tids.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.max_threads.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_modes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.max_threads.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_modes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.mutex.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.mutex.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwmutex.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string_modes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwmutex.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.mime_decode_to_string_modes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwspinlock.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_1.1666.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.rwspinlock.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_1.1666.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.spinlock.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_2.1698.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.spinlock.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_2.1698.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_3.1730.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_3.1730.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.thread_name.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_4.1762.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.thread_name.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.roundtrip_4.1762.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.try_lock_mutex.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.try_lock_mutex.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/base64_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.tsd.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.building.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/ethread_suite.tsd.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.building.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.'bin white space'.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.'bin white space'.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp_literals.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.cmp_literals.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default_dirty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_default_dirty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_dirname_fail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr_file.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_dirname_fail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.encrypted_abstr_file.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_srcfile.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_srcfile.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_use_dirname_fail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.error.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_no_use_dirname_fail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.error.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_not_abs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_not_abs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_ok_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.md5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_ok_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.md5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.missing_debug_info_backend.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.missing_debug_info_backend.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx_dirty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.normal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_outside_eprfx_dirty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.normal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_same_dir.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.otp_6711.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_same_dir.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.otp_6711.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_absolute.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_absolute.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_relative.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreachable_relative.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreasonable_path.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip_add_chunks.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.bin_unreasonable_path.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.strip_add_chunks.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.test_makedep_abstract_code.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/beam_lib_suite.test_makedep_abstract_code.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.badargs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.badargs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.bin_to_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/install_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.bin_to_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.nt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.check_no_invalid_read_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.nt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.check_no_invalid_read_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.copy.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/nt_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.copy.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_deprecated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.encode_decode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_deprecated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.encode_decode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_now_0.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_now_0.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_size_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.guard.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.call_to_size_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.guard.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.deprecated_not_in_obsolete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.hex_encoding.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.deprecated_not_in_obsolete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.hex_encoding.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.interesting.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.interesting.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.erl_file_encoding.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.list_to_bin.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.erl_file_encoding.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.list_to_bin.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.longest_common_trap.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.longest_common_trap.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.obsolete_but_not_deprecated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.parts.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.obsolete_but_not_deprecated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.parts.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_functions.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_comp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_functions.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_comp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_modules.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_fla_comp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.runtime_dependencies_modules.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_fla_comp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_sr_comp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.random_ref_sr_comp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.strong_components.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.referenced.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.strong_components.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.referenced.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.test_runtime_dependencies_versions.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.scope_return.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.test_runtime_dependencies_versions.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.scope_return.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.undefined_functions.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.undefined_functions.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_module_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.xml_file_encoding.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/otp_suite.xml_file_encoding.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_index_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_index_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_message_queue_data_switching.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_message_queue_data_switching.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.at_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_throughput_benchmark.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/parallel_messages_suite.test_throughput_benchmark.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.defunct.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.defunct.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavier.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavier.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.bin_to_list_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavy.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.heavy.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.sleepy_child.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_invalid_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.sleepy_child.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.compile_pattern_invalid_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_2_invalid_n_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/run_erl_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_2_invalid_n_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.ancient_major.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.ancient_major.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.copy_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.major.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_chars_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.major.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_chars_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.minor.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.minor.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_hex_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/upgrade_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.core_files.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.core_files.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/z_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.decode_unsigned_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.argparse.35.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_2_invalid_case_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.argparse.35.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_2_invalid_case_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.basic.1250.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.basic.1250.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.built_in_types.3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.built_in_types.3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_hex_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.command_usage.356.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.command_usage.356.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.complex_command.1378.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.complex_command.1378.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.default_for_not_required.36.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_invalid_integer_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.default_for_not_required.36.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.encode_unsigned_invalid_integer_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.global_default.196.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.global_default.196.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.invalid_arguments.1314.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.invalid_arguments.1314.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.long_form_eq.1186.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.long_form_eq.1186.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.first_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.multi_short.132.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.multi_short.132.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nargs.4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nargs.4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.negative.67.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.negative.67.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.last_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nodigits.99.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.nodigits.99.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error.1410.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_invalid_bytes_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error.1410.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.list_to_bin_invalid_bytes_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error_usage.388.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.parser_error_usage.388.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.pos_mixed_with_opt.131.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.pos_mixed_with_opt.131.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.proxy_arguments.164.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.proxy_arguments.164.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.readme.1218.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.readme.1218.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_3_invalid_scope_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_3_invalid_scope_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.subcommand.68.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.subcommand.68.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.type_validators.1282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.type_validators.1282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.unicode.1346.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.unicode.1346.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.match_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage.228.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_3_invalid_scope_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage.228.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_3_invalid_scope_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_args_ordering.324.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_args_ordering.324.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_required_args.260.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_required_args.260.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_template.292.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_template.292.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.matches_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_width.420.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.usage_width.420.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception.37.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_range_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception.37.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_range_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception_format.69.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.validator_exception_format.69.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.part_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.very_short.100.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/argparse_suite.very_short.100.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_scope_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_4_invalid_scope_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.fix_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.fix_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldl_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldl_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldr_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_replacement_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.foldr_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_replacement_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_list_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_list_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.replace_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_orddict_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_3_invalid_scope_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.from_orddict_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_3_invalid_scope_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.map_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_pattern_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.map_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_pattern_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.new_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_subject_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.new_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.split_invalid_subject_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.relax_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.relax_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/binary_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.resize_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.resize_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.set_get_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.set_get_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldl_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldl_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldr_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_foldr_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_map_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_map_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_list_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_list_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.c_default_outdir_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_orddict_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.sparse_to_orddict_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_list_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.ls.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_list_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.ls.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_orddict_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.memory.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/array_suite.to_orddict_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.memory.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_noisy_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_1_noisy_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_noisy_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_2_noisy_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.nc_default_outdir_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/c_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.big_gregorian_days.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.big_gregorian_days.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_noisy_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_1_noisy_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week_calibrate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.day_of_the_week_calibrate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_noisy_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_days.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.decode_to_string_2_noisy_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_days.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_seconds.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.gregorian_seconds.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.iso_week_number.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.iso_week_number.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.last_day_of_the_month.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.encode_to_string_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.last_day_of_the_month.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.leap_years.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.leap_years.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.local_time_to_universal_time_dst.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.local_time_to_universal_time_dst.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.rfc3339.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.rfc3339.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_1_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.system_time.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/calendar_suite.system_time.html diff --git a/prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/cover.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/cover.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@27af2e7fa355.2024-09-11_12.06.30/make_test_dir.system_test.logs/run.2024-09-11_12.06.30/cover.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/cover.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.133.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_2_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.133.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.1826.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.1826.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.19710434.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_1_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.19710434.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35426.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35426.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35778.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.mime_decode_to_string_2_malformed_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.35778.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36322.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36322.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_modes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36546.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_modes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36546.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_to_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36866.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_decode_to_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36866.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36898.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.36898.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_modes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.408419.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_modes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.408419.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_to_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40930.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_encode_to_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40930.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_5635.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40994.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_5635.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.40994.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_6279.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.504962.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.base64_otp_6279.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.504962.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.big.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.505154.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.big.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.505154.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.illegal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.illegal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.1858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.1858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_modes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710466.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_modes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710466.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710562.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19710562.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string_modes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19715490.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.mime_decode_to_string_modes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19715490.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_1.1506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718082.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_1.1506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718082.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_2.1538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718146.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_2.1538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19718146.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_3.163.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19721890.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_3.163.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.19721890.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_4.1570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.34754.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.roundtrip_4.1570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.34754.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.408451.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/base64_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.408451.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.building.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.41026.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.building.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.41026.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.491618.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.491618.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp_literals.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.493218.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.cmp_literals.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.493218.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.497570.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.497570.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.encrypted_abstr_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1538.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1538.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.error.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1634.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.error.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.1634.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19710306.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19710306.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.md5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19717922.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.md5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.19717922.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.missing_debug_info_backend.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.34786.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.missing_debug_info_backend.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.34786.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.normal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35458.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.normal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35458.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.otp_6711.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35490.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.otp_6711.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35490.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35810.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.35810.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36354.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36354.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip_add_chunks.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36578.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.strip_add_chunks.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.36578.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.test_makedep_abstract_code.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.37.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/beam_lib_suite.test_makedep_abstract_code.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.37.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.badargs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.40962.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.badargs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.40962.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.bin_to_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504610.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.bin_to_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504610.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.check_no_invalid_read_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504994.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.check_no_invalid_read_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.504994.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.copy.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.741.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.copy.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.741.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.encode_decode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.encode_decode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19710498.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19710498.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.guard.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19714626.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.guard.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19714626.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.hex_encoding.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19717890.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.hex_encoding.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19717890.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.interesting.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19718114.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.interesting.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19718114.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.list_to_bin.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19721858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.list_to_bin.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.19721858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.longest_common_trap.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.259.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.longest_common_trap.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.259.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.parts.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.2658.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.parts.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.2658.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_comp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.408483.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_comp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.408483.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_fla_comp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.491042.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_fla_comp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.491042.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_sr_comp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.492642.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.random_ref_sr_comp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.492642.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.referenced.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.497442.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.referenced.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.497442.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.scope_return.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.502242.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.scope_return.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.502242.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.709.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_module_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.709.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ct_framework.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_index_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.access.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_index_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.access.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.badarg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.at_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.badarg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bag_next.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bag_next.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bags.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.bags.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_bags.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.bin_to_list_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_bags.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_duplicate_bags.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_duplicate_bags.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_invalid_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_sets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.compile_pattern_invalid_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.cache_sets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_2_invalid_n_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_2_invalid_n_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.dirty_mark2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.duplicate_bags.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.copy_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.duplicate_bags.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_chars_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fixtable.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_chars_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fixtable.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fold.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_hex_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.fold.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.init_table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.insert_new.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.decode_unsigned_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.insert_new.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_2_invalid_case_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.many_clients.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_2_invalid_case_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.many_clients.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.match.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.match.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.newly_started.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_hex_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.newly_started.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.oldbugs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.oldbugs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_invalid_integer_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open_file.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.encode_unsigned_invalid_integer_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.open_file.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11245.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11245.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11709.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_11709.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13229.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.first_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13229.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13260.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13260.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13830.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_13830.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4208.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.last_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4208.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4738.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4738.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_invalid_bytes_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4906.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.list_to_bin_invalid_bytes_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4906.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4989.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_4989.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5402.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_prefix_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5402.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5487.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_5487.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6206.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.longest_common_suffix_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6206.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_3_invalid_scope_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6359.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_3_invalid_scope_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_6359.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_7146.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_7146.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8070.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8070.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8856.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.match_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8856.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_3_invalid_scope_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8898.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_3_invalid_scope_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8898.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8899.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8899.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8903.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8903.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8923.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.matches_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_8923.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_9282.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.otp_9282.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_range_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.phash.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_range_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.phash.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.receive_optimisation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.part_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.receive_optimisation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_insert_replaced_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_scope_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair_continuation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_4_invalid_scope_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.repair_continuation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.select.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.select.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.sets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.sets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_replacement_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.simultaneous_open.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_replacement_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.simultaneous_open.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.replace_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_3_invalid_scope_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.truncated_segment_array.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_3_invalid_scope_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.truncated_segment_array.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.update_counter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dets_suite.update_counter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_pattern_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.create.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_pattern_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.create.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_subject_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.split_invalid_subject_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/binary_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.iterate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.iterate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.remove.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.remove.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.store.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/dict_suite.store.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.cycle.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.cycle.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.data.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.c_default_outdir_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.data.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.degree.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.degree.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.edges.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.edges.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.ls.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.39458.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.ls.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.39458.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.memory.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.memory.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.39426.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.39426.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.opts.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.opts.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3522.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.nc_default_outdir_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3522.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3630.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/c_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_3630.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.big_gregorian_days.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_8066.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.big_gregorian_days.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.otp_8066.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.path.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.path.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week_calibrate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.day_of_the_week_calibrate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.39490.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.39490.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_days.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_days.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertex_names.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_seconds.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertices.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.gregorian_seconds.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_suite.vertices.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.condensation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.condensation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.iso_week_number.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.iso_week_number.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.last_day_of_the_month.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.last_day_of_the_month.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.leap_years.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.isolated.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.leap_years.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.isolated.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.local_time_to_universal_time_dst.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.loop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.local_time_to_universal_time_dst.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.loop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.rfc3339.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.simple.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.rfc3339.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.simple.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.system_time.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.subgraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/calendar_suite.system_time.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.subgraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.101.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.topsort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.101.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.topsort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19694274.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.tree.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19694274.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/digraph_utils_suite.tree.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19701250.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.19701250.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.291.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.get_context.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.291.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.get_context.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3170.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3170.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3522.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.3522.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_context_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4066.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.binding_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4066.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.binding_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4290.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.check_trailing.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4290.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.check_trailing.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.452.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.452.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4610.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.erl_1152.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4610.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.erl_1152.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4642.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.filename_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.4642.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.filename_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503043.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.fun_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503043.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.fun_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503203.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.function_parameter_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.503203.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.function_parameter_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9026.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.get_coverage.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9026.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.get_coverage.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9090.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.9090.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.invalid_module.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.invalid_module.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.1634.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.map_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.1634.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.map_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694306.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.no_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694306.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.no_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694402.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.normal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19694402.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.normal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19698914.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_both.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19698914.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_both.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_fun.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_fun.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701346.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_module.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701346.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.quoted_module.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701410.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.record_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19701410.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.record_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19705570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.19705570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.2498.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.type_completion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.2498.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.type_completion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.395620.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.unicode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.395620.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/edlin_expand_suite.unicode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.474882.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.deterministic_include.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.474882.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.deterministic_include.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.481186.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.encoding.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.481186.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.encoding.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.9122.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.39554.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.9122.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.39554.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.133.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.133.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.1474.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.extends.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.1474.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.extends.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19694146.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.file_macro.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19694146.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.file_macro.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19701186.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.function_macro.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.19701186.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.function_macro.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.2530.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_4995.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.2530.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_4995.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3202.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_8268.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3202.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.gh_8268.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3234.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.include_local.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3234.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.include_local.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.33059.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.39522.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.33059.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.39522.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3554.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.3554.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4098.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4098.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4322.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.moduledoc_include.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.4322.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.moduledoc_include.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.488642.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.nondeterministic_include.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.488642.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.nondeterministic_include.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.not_circular.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.not_circular.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.503075.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10302.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.503075.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10302.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.9058.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10820.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.9058.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_10820.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_11728.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_11728.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.1442.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_14285.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.1442.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_14285.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19694338.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16824.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19694338.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16824.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19698050.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16978.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19698050.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_16978.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701154.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4870.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701154.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4870.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701314.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4871.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701314.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_4871.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701378.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_5362.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19701378.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_5362.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19705538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_6277.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.19705538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_6277.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.2434.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_7702.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.2434.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_7702.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.33027.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8130.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.33027.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8130.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.474306.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8388.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.474306.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8388.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.475906.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8470.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.475906.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8470.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.481122.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8562.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.481122.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8562.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.486274.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8665.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.486274.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8665.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8911.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ct_framework.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.otp_8911.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.access.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.overload_mac.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.access.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.overload_mac.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.badarg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.pmod.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.badarg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.pmod.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bag_next.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.predef_mac.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bag_next.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.predef_mac.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bags.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.rec_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.bags.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.rec_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.scan_file.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.scan_file.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_bags.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.skip_header.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_bags.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.skip_header.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_duplicate_bags.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.source_name.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_duplicate_bags.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.source_name.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_sets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.cache_sets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_error.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_error.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_if.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.dirty_mark2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_if.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.duplicate_bags.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_warning.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.duplicate_bags.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.test_warning.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fixtable.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fixtable.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.upcase_mac_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fold.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.variable_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.fold.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/epp_suite.variable_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.bad.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.bad.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_location.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.init_table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_location.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.insert_new.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.40898.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.insert_new.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.40898.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.many_clients.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.many_clients.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.match.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.match.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.newly_started.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.file.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.newly_started.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.file.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.oldbugs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.generated.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.oldbugs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.generated.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.40866.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.40866.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.open_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11245.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11245.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11709.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.is_anno.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_11709.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.is_anno.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13229.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.line.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13229.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.line.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13260.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.location.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13260.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.location.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13830.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.mapfold_anno.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_13830.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.mapfold_anno.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4208.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.new.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4208.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.new.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4738.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.parse_abstract.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4738.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.parse_abstract.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4906.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.record.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4906.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.record.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4989.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_4989.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5402.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.text.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5402.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_anno_suite.text.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5487.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.apply_atom.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_5487.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.apply_atom.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6206.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.binary_and_map_aliases.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6206.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.binary_and_map_aliases.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6359.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.custom_stacktrace.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_6359.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.custom_stacktrace.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_7146.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep37.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_7146.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep37.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8070.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep43.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8070.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep43.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8856.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep49.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8856.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep49.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8898.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep58.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8898.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eep58.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8899.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8899.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8903.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eval_expr_5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8903.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.eval_expr_5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8923.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.funs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_8923.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.funs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_9282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.otp_9282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.phash.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.phash.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.receive_optimisation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.receive_optimisation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair_continuation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.repair_continuation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.guard_5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.select.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.select.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.sets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.lc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.sets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.lc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.simultaneous_open.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_bin.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.simultaneous_open.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_bin.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_pattern.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.match_pattern.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.truncated_segment_array.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_10622.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.truncated_segment_array.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_10622.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.update_counter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_13228.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dets_suite.update_counter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_13228.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.create.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14708.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.create.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14708.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14826.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_14826.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_15035.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_15035.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.iterate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16439.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.iterate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16439.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.remove.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16545.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.remove.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16545.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16865.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_16865.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.store.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_5269.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/dict_suite.store.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_5269.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.cycle.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6539.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.cycle.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6539.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.data.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6543.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.data.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6543.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.degree.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6787.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.degree.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6787.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.edges.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6977.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.edges.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_6977.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.7170.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_7550.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.7170.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_7550.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_8133.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.otp_8133.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.pattern_expr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.pattern_expr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.7138.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.simple_cases.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.7138.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.simple_cases.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.string_plusplus.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.string_plusplus.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.opts.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.try_catch.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.opts.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.try_catch.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3522.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.unary_plus.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3522.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.unary_plus.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3630.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.zero_width.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_3630.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_eval_suite.zero_width.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_8066.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.attributes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.otp_8066.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.attributes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.path.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.path.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.7202.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.expr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.7202.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.expr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.guard.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertex_names.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.guard.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertices.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_suite.vertices.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.condensation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.condensation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.maps.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.maps.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.isolated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5915.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.isolated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5915.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.loop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5990.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.loop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_5990.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.simple.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7078.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.simple.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7078.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7931.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.otp_7931.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.subgraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.pattern.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.subgraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.pattern.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.topsort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.side_effects.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.topsort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.side_effects.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.tree.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/digraph_utils_suite.tree.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.strict.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.strict.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.get_context.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.update.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.get_context.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_expand_records_suite.update.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.behav.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.behav.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_context_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.binding_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.binding_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.check_trailing.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.check_trailing.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_internal_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.basic_errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.basic_errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.erl_1152.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.erl_1152.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.filename_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_multiple.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.filename_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.behaviour_multiple.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.fun_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bif_clash.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.fun_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bif_clash.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.function_parameter_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bin_syntax_errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.function_parameter_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.bin_syntax_errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.get_coverage.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_aliases.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.get_coverage.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_aliases.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.binary_types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.invalid_module.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.documentation_attributes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.invalid_module.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.documentation_attributes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.map_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.eep49.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.map_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.eep49.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.no_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_all.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.no_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_all.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.normal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_vars_warn.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.normal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.export_vars_warn.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_both.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.external_funs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_both.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.external_funs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_fun.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.format_warn.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_fun.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.format_warn.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_module.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.guard.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.quoted_module.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.guard.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.record_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.illegal_module_name.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.record_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.illegal_module_name.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.inline_nifs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.inline_nifs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.type_completion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.type_completion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.unicode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_parallel_match.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/edlin_expand_suite.unicode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_parallel_match.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.deterministic_include.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_type.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.deterministic_include.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.maps_type.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.encoding.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.match_float_zero.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.encoding.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.match_float_zero.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.7266.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.messages_with_jaro_suggestions.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.7266.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.messages_with_jaro_suggestions.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.no_load_nif.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.no_load_nif.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.non_latin1_module.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.non_latin1_module.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.extends.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_failing.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.extends.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_failing.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.file_macro.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_successful.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.file_macro.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.on_load_successful.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.function_macro.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_10436.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.function_macro.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_10436.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_4995.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11254.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_4995.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11254.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_8268.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11771.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.gh_8268.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11771.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.include_local.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11772.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.include_local.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11772.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.7234.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11851.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.7234.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11851.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11861.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11861.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11872.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11872.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.moduledoc_include.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.moduledoc_include.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.nondeterministic_include.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879_cont.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.nondeterministic_include.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_11879_cont.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.not_circular.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_13230.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.not_circular.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_13230.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10302.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14285.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10302.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14285.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10820.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14323.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_10820.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14323.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_11728.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14378.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_11728.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_14378.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_14285.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15456.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_14285.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15456.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16824.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15563.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16824.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_15563.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16978.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16516.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_16978.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16516.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4870.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16824.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4870.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_16824.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4871.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4886.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_4871.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4886.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_5362.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4988.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_5362.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_4988.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_6277.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5091.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_6277.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5091.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_7702.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5276.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_7702.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5276.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8130.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5338.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8130.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5338.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8388.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5362.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8388.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5362.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8470.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5371.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8470.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5371.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8562.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5494.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8562.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5494.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8665.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5644.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8665.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5644.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8911.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5878.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.otp_8911.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5878.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.overload_mac.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5917.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.overload_mac.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_5917.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.pmod.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6585.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.pmod.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6585.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.predef_mac.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6885.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.predef_mac.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_6885.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.rec_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7227.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.rec_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7227.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.scan_file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7550.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.scan_file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_7550.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.skip_header.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_8051.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.skip_header.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.otp_8051.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.source_name.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.predef.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.source_name.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.predef.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.record_errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.record_errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_error.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.redefined_builtin_type.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_error.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.redefined_builtin_type.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_if.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.removed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_if.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.removed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_warning.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.shadow_vars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.test_warning.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.shadow_vars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.singleton_type_var_errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.singleton_type_var_errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.upcase_mac_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.variable_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.stacktrace_syntax.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/epp_suite.variable_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.stacktrace_syntax.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.bad.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.tilde_k.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.bad.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.tilde_k.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_location.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.too_many_arguments.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_location.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.too_many_arguments.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.8994.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_module.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.8994.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_module.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_nifs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.undefined_nifs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.underscore_match.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.underscore_match.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.generated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.generated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.8962.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars_try.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.8962.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsafe_vars_try.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_function.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_function.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.is_anno.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_import.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.is_anno.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_import.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.line.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_record.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.line.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_record.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.location.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.location.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.mapfold_anno.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.mapfold_anno.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_type2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.new.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_unsafe_vars_warn.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.new.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_unsafe_vars_warn.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.parse_abstract.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_otp_4858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.parse_abstract.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_otp_4858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.record.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.record.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_fun.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_fun.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.text.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_lc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_anno_suite.text.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_lc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.apply_atom.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_rec.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.apply_atom.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.unused_vars_warn_rec.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.binary_and_map_aliases.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.update_literal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.binary_and_map_aliases.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.update_literal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.custom_stacktrace.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.warn_missing_spec.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.custom_stacktrace.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_lint_suite.warn_missing_spec.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep37.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.bits.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep37.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.bits.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep43.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.block.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep43.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.block.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep49.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.call.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep49.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.call.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep58.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.case1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eep58.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.case1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.cond1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.cond1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eval_expr_5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.dialyzer_attrs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.eval_expr_5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.dialyzer_attrs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.funs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep49.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.funs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep49.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep58.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.eep58.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41090.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41090.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41410.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.41410.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.guard_5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.form_vars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.form_vars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.lc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.format_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.lc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.format_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_bin.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.func.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_bin.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.func.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_pattern.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.gh_5093.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.match_pattern.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.gh_5093.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_10622.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.head_tail.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_10622.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.head_tail.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_13228.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.hook.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_13228.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.hook.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14708.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.if_then.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14708.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.if_then.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14826.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.import_export.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_14826.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.import_export.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_15035.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41058.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_15035.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41058.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16439.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41122.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16439.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.41122.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16545.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16545.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16865.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_16865.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_5269.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.maps_syntax.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_5269.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.maps_syntax.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6539.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.messages.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6539.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.messages.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6543.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.misc_attrs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6543.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.misc_attrs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6787.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.neg_indent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6787.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.neg_indent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6977.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.ops.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_6977.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.ops.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_7550.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10302.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_7550.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10302.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_8133.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10820.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.otp_8133.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_10820.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.pattern_expr.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11100.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.pattern_expr.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11100.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.simple_cases.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11861.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.simple_cases.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_11861.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_13662.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_13662.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.string_plusplus.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_14285.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.string_plusplus.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_14285.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.try_catch.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15592.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.try_catch.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15592.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.unary_plus.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15751.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.unary_plus.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15751.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.zero_width.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15755.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_eval_suite.zero_width.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_15755.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.attributes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_16435.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.attributes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_16435.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6321.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6321.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6911.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6911.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.expr.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6914.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.expr.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_6914.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.guard.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8150.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.guard.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8150.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8238.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8238.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8473.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8473.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8522.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8522.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.maps.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8567.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.maps.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8567.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5915.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8664.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5915.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_8664.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5990.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_9147.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_5990.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.otp_9147.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7078.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.pr_1014.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7078.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.pr_1014.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7931.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.quoted_atom_types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.otp_7931.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.quoted_atom_types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.pattern.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.receive_after.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.pattern.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.receive_after.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.side_effects.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.recs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.side_effects.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.recs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.strict.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.try_catch.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.strict.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_pp_suite.try_catch.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.update.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_expand_records_suite.update.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.behav.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.behav.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.error_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_internal_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.basic_errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.basic_errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.iso88591.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.iso88591.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_multiple.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10302.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.behaviour_multiple.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10302.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bif_clash.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10990.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bif_clash.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10990.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bin_syntax_errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10992.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.bin_syntax_errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_10992.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_aliases.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_11807.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_aliases.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_11807.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_16480.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.binary_types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_16480.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.documentation_attributes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_17024.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.documentation_attributes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_17024.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.eep49.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_7810.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.eep49.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.otp_7810.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_all.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_all.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_vars_warn.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.text_fun.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.export_vars_warn.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.text_fun.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.external_funs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.triple_quoted_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.external_funs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/erl_scan_suite.triple_quoted_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.format_warn.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.format_warn.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.guard.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.guard.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.illegal_module_name.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.illegal_module_name.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.inline_nifs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile_truncated.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.inline_nifs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.logfile_truncated.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_parallel_match.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_parallel_match.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_type.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty_truncated.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.maps_type.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/error_logger_h_suite.tty_truncated.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.match_float_zero.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.match_float_zero.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.messages_with_jaro_suggestions.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script_file_access.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.messages_with_jaro_suggestions.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.archive_script_file_access.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.no_load_nif.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.bad_io_server.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.no_load_nif.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.bad_io_server.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.non_latin1_module.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.non_latin1_module.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_failing.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.beam_script.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_failing.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.beam_script.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_successful.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.create_and_extract.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.on_load_successful.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.create_and_extract.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_10436.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_10436.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11254.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags_no_shebang.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11254.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.emulator_flags_no_shebang.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11771.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11771.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11772.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.epp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11772.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.epp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11851.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11851.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11861.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.foldl.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11861.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.foldl.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11872.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11872.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.module_script.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.module_script.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879_cont.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.overflow.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_11879_cont.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.overflow.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_13230.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_13230.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14285.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.strange_name.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14285.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.strange_name.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14323.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.two_lines.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14323.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.two_lines.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14378.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.unicode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_14378.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/escript_suite.unicode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15456.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15456.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15563.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.first_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_15563.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.first_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16516.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16516.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16824.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.last_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_16824.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.last_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4886.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.next_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4886.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.next_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4988.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.prev_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_4988.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.prev_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5091.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5091.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5276.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bad_table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5276.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bad_table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5338.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.baddelete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5338.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.baddelete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5362.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badfile.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5362.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badfile.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5371.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badinsert.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5371.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badinsert.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5494.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badlookup.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5494.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badlookup.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5644.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badnew.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5644.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.badnew.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5878.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bound_maps.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5878.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.bound_maps.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5917.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.compress_magic_ref.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_5917.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.compress_magic_ref.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6585.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.default.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6585.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.default.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6885.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_elem.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_6885.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_elem.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7227.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_named_table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7227.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_named_table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7550.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_tab.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_7550.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_large_tab.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_8051.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_tab.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.otp_8051.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_tab.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.predef.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_unfix_race.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.predef.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.delete_unfix_race.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.record_errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.dups.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.record_errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.dups.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.redefined_builtin_type.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.empty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.redefined_builtin_type.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.empty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.removed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.41954.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.removed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.41954.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.shadow_vars.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42082.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.shadow_vars.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42082.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.singleton_type_var_errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42690.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.singleton_type_var_errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.42690.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43074.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43074.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.stacktrace_syntax.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43234.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.stacktrace_syntax.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43234.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.tilde_k.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43426.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.tilde_k.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43426.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.too_many_arguments.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43714.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.too_many_arguments.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43714.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_module.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43874.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_module.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.43874.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_nifs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.44226.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.undefined_nifs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.44226.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.underscore_match.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.49026.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.underscore_match.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.49026.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.50658.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.50658.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars_try.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsafe_vars_try.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unsized_binary_in_bin_gen_pattern.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_function.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ets_all.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_function.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ets_all.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_import.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_import.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_record.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_rename.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_record.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_rename.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_update_counter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.evil_update_counter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_large_table_owner.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_type2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_large_table_owner.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_unsafe_vars_warn.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_large_table_owner.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_unsafe_vars_warn.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_large_table_owner.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_otp_4858.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_many_tables_owner.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_otp_4858.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_many_tables_owner.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_tables_owner.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.exit_many_tables_owner.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_fun.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_fun.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_lc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_concurrent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_lc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_concurrent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_rec.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.unused_vars_warn_rec.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.update_literal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup_concurrent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.update_literal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.firstnext_lookup_concurrent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.warn_missing_spec.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_insert.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_lint_suite.warn_missing_spec.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_insert.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.bits.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_iter_bag.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.bits.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_iter_bag.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.block.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_next.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.block.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fixtable_next.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.call.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_badarg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.call.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_badarg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.case1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_empty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.case1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.fold_empty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.cond1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.cond1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.dialyzer_attrs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl_ordered.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.dialyzer_attrs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldl_ordered.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep49.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep49.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep58.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr_ordered.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.eep58.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.foldr_ordered.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9186.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.give_away.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9186.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.give_away.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_pseudo_deleted.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.9506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_pseudo_deleted.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_shrink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.grow_shrink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.hash_clash.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.hash_clash.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.form_vars.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_concurrent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.form_vars.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_concurrent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.format_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.format_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.func.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup_element.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.func.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heavy_lookup_element.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.gh_5093.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heir.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.gh_5093.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.heir.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.head_tail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.head_tail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.hook.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_binary_stress.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.hook.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_binary_stress.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.if_then.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_whereis_busy.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.if_then.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.info_whereis_busy.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.import_export.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.import_export.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9154.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41986.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9154.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.41986.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9218.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42114.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.9218.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42114.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42914.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.42914.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43138.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43138.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.maps_syntax.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43266.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.maps_syntax.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43266.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.messages.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43458.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.messages.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43458.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.misc_attrs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43746.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.misc_attrs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43746.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.neg_indent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43906.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.neg_indent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.43906.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.ops.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.48802.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.ops.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.48802.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10302.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.50530.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10302.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.50530.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10820.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_10820.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11100.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11100.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11861.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_11861.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_13662.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_rename.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_13662.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.insert_trap_rename.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_14285.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.interface_equality.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_14285.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.interface_equality.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15592.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.keypos2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15592.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.keypos2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15751.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_default.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15751.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_default.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15755.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_mult.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_15755.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_element_mult.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_16435.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_order.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_16435.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.lookup_order.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6321.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.massive_ets_all.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6321.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.massive_ets_all.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6911.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6911.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6914.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_6914.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8150.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8150.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8238.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8238.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_delete3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8473.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_heavy.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8473.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_heavy.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8522.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8522.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8567.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8567.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.match_object2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8664.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.member.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_8664.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.member.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_9147.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.memory.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.otp_9147.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.memory.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.pr_1014.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_read.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.pr_1014.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_read.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.quoted_atom_types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_write.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.quoted_atom_types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_named_write.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.receive_after.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_read.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.receive_after.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_read.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.recs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_write.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.recs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_lookup_unnamed_write.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_named.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_named.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.try_catch.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_unnamed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_pp_suite.try_catch.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_newdel_unnamed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_wb.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.meta_wb.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.misc1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.misc1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ms_excessive_nesting.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ms_excessive_nesting.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.named.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.error_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.named.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered_match.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.ordered_match.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.iso88591.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_10182.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.iso88591.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_10182.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10302.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_5340.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10302.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_5340.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10990.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6338.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10990.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6338.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10992.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6842_select_1000.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_10992.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_6842_select_1000.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_11807.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_7665.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_11807.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_7665.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_16480.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8166.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_16480.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8166.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_17024.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8732.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_17024.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_8732.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_7810.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9423.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.otp_7810.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9423.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9932.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.otp_9932.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.text_fun.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.partly_bound.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.text_fun.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.partly_bound.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.triple_quoted_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.privacy.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/erl_scan_suite.triple_quoted_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.privacy.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename_unnamed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.rename_unnamed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.safe_fixtable.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.safe_fixtable.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile_truncated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_bound_chunk.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.logfile_truncated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_bound_chunk.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fail.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fail.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fixtab_owner_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_fixtab_owner_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty_truncated.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_mbuf_trapping.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/error_logger_h_suite.tty_truncated.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.select_mbuf_trapping.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setbag.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setbag.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script_file_access.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setopts.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.archive_script_file_access.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.setopts.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.bad_io_server.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.shrink_pseudo_deleted.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.bad_io_server.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.shrink_pseudo_deleted.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.slot.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.slot.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.beam_script.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_fixed_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.beam_script.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_fixed_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.create_and_extract.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_insert.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.create_and_extract.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_insert.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_ordered_iteration.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_ordered_iteration.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags_no_shebang.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.emulator_flags_no_shebang.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_replace.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_select_replace.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.epp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_unfix_fix.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.epp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.smp_unfix_fix.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.foldl.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_bucket_disappears.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.foldl.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_bucket_disappears.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.module_script.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects_trap.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.module_script.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_all_objects_trap.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.overflow.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_object.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.overflow.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_delete_object.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_ets_dets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_ets_dets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.strange_name.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_init_table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.strange_name.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_init_table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.two_lines.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.two_lines.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.unicode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_bag.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/escript_suite.unicode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_bag.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_parallel.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_parallel.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.first_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_set.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.first_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_delete_set.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_duplicate_bag.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_duplicate_bag.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.last_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_insert_order_preserved.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.last_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_insert_order_preserved.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.next_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_kill_process.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.next_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_kill_process.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.prev_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_parallel.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.prev_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_parallel.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_set.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_list_set.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bad_table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_new.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bad_table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_insert_new.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.baddelete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_match_spec_run.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.baddelete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_match_spec_run.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badfile.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_named_select.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badfile.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_named_select.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badinsert.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_repair_continuation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badinsert.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_repair_continuation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badlookup.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_delete.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badlookup.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_delete.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badnew.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_flatmap_term_copy_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.badnew.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_flatmap_term_copy_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bound_maps.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_hashmap_term_copy_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.bound_maps.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_hashmap_term_copy_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.compress_magic_ref.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_pam_stack_overflow_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.compress_magic_ref.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_pam_stack_overflow_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.default.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.default.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_elem.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace_next_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_elem.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_replace_next_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_named_table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_reverse.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_named_table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_select_reverse.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_tab.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_test_ms.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_large_tab.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_test_ms.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_tab.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_whitebox.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_tab.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.t_whitebox.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_unfix_race.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.delete_unfix_race.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.dups.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.dups.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2file2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.empty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.empty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tab2list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10082.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10082.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10210.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10210.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10786.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.10786.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11170.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11170.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.tabfile_ext4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11330.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.table_leak.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11330.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.table_leak.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11618.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.take.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11618.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.take.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11906.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_decentralized_counters_setting.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.11906.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_decentralized_counters_setting.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.12066.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_delete_table_while_size_snapshot.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.12066.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_delete_table_while_size_snapshot.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.18018.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_memory_concurrency.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.18018.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_memory_concurrency.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.19746.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_size_concurrency.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.19746.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_table_size_concurrency.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.33155.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_throughput_benchmark.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.33155.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.test_throughput_benchmark.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_table_growth.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_table_growth.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ets_all.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ets_all.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default_bad_pos.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_counter_with_default_bad_pos.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_rename.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_rename.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_update_counter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element_default.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.evil_update_counter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.update_element_default.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_large_table_owner.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.verybadnew.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_large_table_owner.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.verybadnew.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_large_table_owner.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.whereis_table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_large_table_owner.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.whereis_table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_many_tables_owner.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.write_concurrency.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_many_tables_owner.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_suite.write_concurrency.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_tables_owner.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.exit_many_tables_owner.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.ex1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.ex1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_concurrent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_concurrent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ets_tough_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup_concurrent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.badarg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.firstnext_lookup_concurrent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.badarg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_insert.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_insert.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_iter_bag.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_check.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_iter_bag.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_check.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_next.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_merge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fixtable_next.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_merge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_badarg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_sort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_badarg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_sort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_empty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_check.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.fold_empty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_check.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.484290.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.484290.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl_ordered.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldl_ordered.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keycheck.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keymerge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keymerge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr_ordered.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keysort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.foldr_ordered.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_keysort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.give_away.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_merge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.give_away.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_merge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_pseudo_deleted.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_sort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_pseudo_deleted.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.binary_term_sort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_shrink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.grow_shrink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.hash_clash.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.hash_clash.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_concurrent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.inout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_concurrent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.inout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.many.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.many.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup_element.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.misc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heavy_lookup_element.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.misc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heir.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.heir.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_check.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_check.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_binary_stress.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keymerge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_binary_stress.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keymerge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_whereis_busy.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keysort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.info_whereis_busy.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_keysort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10114.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_merge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10114.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_merge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10242.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_sort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.10242.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/file_sorter_suite.term_sort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11010.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11010.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11234.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_eexist.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11234.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_eexist.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11362.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_symlink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11362.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_dir_symlink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11650.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_binary_args.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11650.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_binary_args.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11938.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_invalid_path.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.11938.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_invalid_path.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.12098.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_nested_dirs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.12098.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_nested_dirs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.17794.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.17794.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.19586.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path_dot_dot.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.19586.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_relative_path_dot_dot.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.9986.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_single_dir.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.9986.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_single_dir.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_symlink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.ensure_path_symlink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.file_props_symlink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.file_props_symlink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_rename.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_otp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.insert_trap_rename.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_otp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.interface_equality.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_subdir.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.interface_equality.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.find_source_subdir.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.keypos2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.fold_files.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.keypos2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.fold_files.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_default.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_default.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_mult.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.is_file_symlink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_element_mult.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.is_file_symlink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_order.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.otp_5960.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.lookup_order.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.otp_5960.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.massive_ets_all.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.massive_ets_all.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path_links.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.safe_relative_path_links.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_one.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_delete3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_one.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_heavy.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_symlink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_heavy.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_symlink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_two.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filelib_suite.wildcard_two.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.match_object2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.member.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.member.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.memory.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.memory.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_read.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_read.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.absname_bin_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_write.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_1.402275.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_named_write.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_1.402275.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_read.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_2.486658.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_read.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_2.486658.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_write.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_1.486690.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_lookup_unnamed_write.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_1.486690.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_named.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_2.486722.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_named.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.basename_bin_2.486722.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_unnamed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname.486498.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_newdel_unnamed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname.486498.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_wb.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname_bin.486754.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.meta_wb.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.dirname_bin.486754.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.misc1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.misc1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ms_excessive_nesting.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ms_excessive_nesting.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.named.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension.486530.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.named.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension.486530.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension_bin.486562.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.extension_bin.486562.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered_match.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.ordered_match.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_10182.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_10182.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_5340.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join.486594.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_5340.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join.486594.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6338.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join_bin.486786.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6338.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.join_bin.486786.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6842_select_1000.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype.486626.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_6842_select_1000.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype.486626.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_7665.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype_bin.421732.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_7665.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.pathtype_bin.421732.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8166.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname.421668.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8166.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname.421668.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8732.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname_bin.421764.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_8732.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.rootname_bin.421764.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9423.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split.421700.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9423.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split.421700.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9932.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split_bin.421796.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.otp_9932.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.split_bin.421796.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.partly_bound.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.partly_bound.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.privacy.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_api.421828.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.privacy.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_api.421828.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_windows.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_windows.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename_unnamed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_xdg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.rename_unnamed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_basedir_xdg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.safe_fixtable.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename.402243.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.safe_fixtable.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename.402243.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_bound_chunk.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename_bin.402307.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_bound_chunk.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/filename_suite.t_nativename_bin.402307.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fixtab_owner_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.fixbag.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_fixtab_owner_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.fixbag.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_mbuf_trapping.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.select_mbuf_trapping.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setbag.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.insert_same_key.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setbag.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.insert_same_key.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setopts.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_fixes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.setopts.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_fixes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.shrink_pseudo_deleted.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_processes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.shrink_pseudo_deleted.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.multiple_processes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.slot.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_closes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.slot.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_closes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_fixed_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_deletes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_fixed_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.other_process_deletes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_insert.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.owner_dies.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_insert.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.owner_dies.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_ordered_iteration.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_ordered_iteration.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/fixtable_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_replace.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.hang_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_select_replace.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.hang_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_unfix_fix.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.smp_unfix_fix.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/format_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_bucket_disappears.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.add_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_bucket_disappears.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.add_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.balance_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.balance_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects_trap.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_any_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_all_objects_trap.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_any_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_object.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_delete_object.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.delete_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_ets_dets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.difference_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_ets_dets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.difference_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_init_table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_init_table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.from_ordset_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.from_ordset_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_bag.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_bag.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_parallel.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.insert_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_parallel.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.insert_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_set.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.is_member_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_delete_set.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.is_member_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_duplicate_bag.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_duplicate_bag.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_insert_order_preserved.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_from_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_insert_order_preserved.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.iterator_from_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_kill_process.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.larger_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_kill_process.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.larger_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_parallel.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.largest_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_parallel.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.largest_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_set.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.singleton_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_list_set.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.singleton_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_new.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smaller_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_insert_new.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smaller_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_match_spec_run.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smallest_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_match_spec_run.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.smallest_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_named_select.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_named_select.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_repair_continuation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_largest_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_repair_continuation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_largest_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_delete.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_smallest_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_delete.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gb_sets_property_test_suite.take_smallest_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_flatmap_term_copy_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_handler.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_flatmap_term_copy_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_handler.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_hashmap_term_copy_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_sup_handler.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_hashmap_term_copy_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.add_sup_handler.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_pam_stack_overflow_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.auto_hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_pam_stack_overflow_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.auto_hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace_next_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_replace_next_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_reverse.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status_anon.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_select_reverse.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.call_format_status_anon.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_test_ms.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.delete_handler.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_test_ms.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.delete_handler.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_whitebox.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.402339.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.t_whitebox.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.402339.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2file2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.error_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tab2list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.error_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_with_process_label.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.format_log_with_process_label.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.get_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.tabfile_ext4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.get_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.table_leak.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.table_leak.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.take.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.take.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_decentralized_counters_setting.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.487362.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_decentralized_counters_setting.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.487362.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_delete_table_while_size_snapshot.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_delete_table_while_size_snapshot.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_memory_concurrency.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_memory_concurrency.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_size_concurrency.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.notify.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_table_size_concurrency.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.notify.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_throughput_benchmark.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.replace_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.test_throughput_benchmark.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.replace_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_check_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_check_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_receive_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_receive_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_table_growth.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_wait_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_table_growth.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.send_request_wait_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default_bad_pos.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_counter_with_default_bad_pos.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start_opt.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.start_opt.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element_default.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_handler.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.update_element_default.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_handler.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.verybadnew.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_sup_handler.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.verybadnew.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.swap_sup_handler.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.whereis_table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.sync_notify.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.whereis_table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.sync_notify.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.write_concurrency.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_code_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_suite.write_concurrency.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_code_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_call.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_call.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.ex1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_event.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.ex1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_event.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_handle_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_in_terminate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ets_tough_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_in_terminate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.badarg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_init.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.badarg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_init.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_terminate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_event_suite.undef_terminate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_check.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_check.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_merge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_merge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.abnormal2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_sort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.auto_hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_sort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.auto_hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_check.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.call_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_check.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.call_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.468674.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402371.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.468674.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402371.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402435.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keycheck.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.402435.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keymerge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.421860.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keymerge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.421860.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keysort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.487458.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_keysort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.487458.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_merge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_merge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_sort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.binary_term_sort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.enter_loop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.enter_loop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.error_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.error_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.inout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.inout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.many.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.many.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.misc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_with_process_label.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.misc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.format_log_with_process_label.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.get_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.get_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_check.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_check.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keymerge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402403.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keymerge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402403.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keysort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402467.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_keysort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.402467.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_merge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487394.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_merge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487394.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_sort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487426.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/file_sorter_suite.term_sort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.487426.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_eexist.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_eexist.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.replace_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_dir_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.replace_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_binary_args.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.reply_by_alias_with_payload.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_binary_args.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.reply_by_alias_with_payload.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_invalid_path.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.shutdown.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_invalid_path.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.shutdown.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_nested_dirs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_nested_dirs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path_dot_dot.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start10.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_relative_path_dot_dot.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start10.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_single_dir.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start11.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_single_dir.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start11.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start12.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.ensure_path_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start12.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.file_props_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.file_props_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_otp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_otp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_subdir.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.find_source_subdir.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.fold_files.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start6.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.fold_files.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start6.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start7.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start7.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.is_file_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start8.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.is_file_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start8.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.otp_5960.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start9.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.otp_5960.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.start9.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.sys1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.sys1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path_links.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.terminate_crash_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.safe_relative_path_links.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.terminate_crash_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_code_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_code_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_event.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_event.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_one.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_one.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_symlink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_sync_event.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_symlink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_handle_sync_event.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_two.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_handle_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filelib_suite.wildcard_two.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_handle_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_terminate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_in_terminate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_init.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_init.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.absname_bin_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_fsm_suite.undef_terminate2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_1.394948.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.abcast.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_1.394948.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.abcast.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_2.394916.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.auto_hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_2.394916.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.auto_hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_1.496643.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_1.496643.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_2.496675.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.basename_bin_2.496675.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname.470914.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname.470914.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname_bin.496707.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.dirname_bin.496707.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension.470946.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension.470946.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension_bin.394820.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.extension_bin.394820.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_remote_n3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_with_huge_message_queue.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.call_with_huge_message_queue.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.calling_self.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.calling_self.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join.394852.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join.394852.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join_bin.496739.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast_fast.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.join_bin.496739.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.cast_fast.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype.470882.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.continue.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype.470882.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.continue.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype_bin.496771.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.pathtype_bin.496771.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname.470978.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash_in_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname.470978.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.crash_in_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname_bin.395012.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488418.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.rootname_bin.395012.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488418.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split.394980.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488834.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split.394980.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488834.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split_bin.395044.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488866.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.split_bin.395044.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.488866.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489442.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489442.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_api.395108.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489506.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_api.395108.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.489506.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_windows.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_windows.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_xdg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_basedir_xdg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename.394884.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.error_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename.394884.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.error_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename_bin.395076.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_all_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/filename_suite.t_nativename_bin.395076.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_all_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.fixbag.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.fixbag.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_with_process_label.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.format_log_with_process_label.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.insert_same_key.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.get_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.insert_same_key.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.get_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_fixes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_fixes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_processes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.multiple_processes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_closes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487874.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_closes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487874.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_deletes.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487906.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.other_process_deletes.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.487906.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.owner_dies.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.488450.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.owner_dies.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.488450.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489410.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/fixtable_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489410.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489474.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.489474.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.hang_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.hang_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.loop_start_fail.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/format_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.loop_start_fail.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.add_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall.487938.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.add_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall.487938.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.balance_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_down.487970.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.balance_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_down.487970.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_any_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_noconnection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_any_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_noconnection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_success.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.delete_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_success.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.difference_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_timeout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.difference_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_recv_opt_timeout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote.488002.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote.488002.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.from_ordset_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote_old2.402499.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.from_ordset_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.multicall_remote_old2.402499.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_5854.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_5854.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.insert_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_7669.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.insert_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.otp_7669.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.is_member_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.replace_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.is_member_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.replace_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.reply_by_alias_with_payload.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.reply_by_alias_with_payload.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_from_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.iterator_from_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.larger_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_check_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.larger_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_check_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.largest_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_receive_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.largest_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_receive_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.singleton_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_wait_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.singleton_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.send_request_wait_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smaller_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smaller_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smallest_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_global_registered_parent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.smallest_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_global_registered_parent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_local_registered_parent.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.spec_init_local_registered_parent.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_largest_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_largest_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_smallest_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.start.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gb_sets_property_test_suite.take_smallest_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.start.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_handler.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_handler.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_sup_handler.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop10.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.add_sup_handler.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop10.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.auto_hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.auto_hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status_anon.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.call_format_status_anon.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.delete_handler.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop6.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.delete_handler.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop6.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.496867.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop7.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.496867.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop7.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop8.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop8.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop9.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.stop9.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.error_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.terminate_crash_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.error_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.terminate_crash_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.throw_in_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.throw_in_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_code_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_code_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_with_process_label.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_call.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.format_log_with_process_label.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_call.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.get_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_cast.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.get_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_cast.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_continue.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_continue.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_handle_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.496835.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_handle_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.496835.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_handle_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_terminate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_in_terminate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_init.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_init.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.notify.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.notify.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.replace_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.replace_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_server_suite.undef_terminate2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_check_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.490658.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_check_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.490658.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_receive_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_receive_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_wait_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.490690.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.send_request_wait_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.490690.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1clean.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.490722.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.490722.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start_opt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.start_opt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal1dirty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_handler.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.490754.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_handler.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.490754.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_sup_handler.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.swap_sup_handler.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.sync_notify.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.490786.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.sync_notify.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.490786.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_code_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_code_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_call.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.490818.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_call.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.490818.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_event.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_event.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.abnormal4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.auto_hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_handle_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.auto_hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_in_terminate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.call_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_in_terminate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.call_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_init.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.code_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_init.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.code_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_terminate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.403107.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_event_suite.undef_terminate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.403107.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421892.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421892.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421924.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.abnormal2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.421924.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.auto_hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490018.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.auto_hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490018.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.call_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490210.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.call_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490210.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.471554.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490530.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.471554.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490530.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496931.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490594.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496931.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490594.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496995.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490946.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.496995.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.490946.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.497059.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.491010.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.497059.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.491010.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.enter_loop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.enter_loop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.enter_loop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.enter_loop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.error_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.error_format_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.error_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.error_format_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_order.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_order.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.event_types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_with_process_label.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_all_status.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.format_log_with_process_label.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_all_status.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.get_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.get_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.471522.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_with_process_label.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.471522.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.format_log_with_process_label.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496899.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.generic_timers.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496899.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.generic_timers.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496963.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.get_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.496963.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.get_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.497027.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.497027.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.489538.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.489538.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490050.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490050.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.replace_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490242.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.replace_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490242.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.reply_by_alias_with_payload.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490562.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.reply_by_alias_with_payload.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490562.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.shutdown.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490626.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.shutdown.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490626.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490850.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490850.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490882.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490882.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start10.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490914.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start10.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490914.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start11.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490978.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start11.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.490978.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start12.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start12.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.loop_start_fail.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.loop_start_fail.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.489986.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.489986.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.next_events.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start6.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.pop_too_many.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start6.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.pop_too_many.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start7.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.replace_state.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start7.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.replace_state.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start8.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.reply_by_alias_with_payload.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start8.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.reply_by_alias_with_payload.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start9.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_check_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.start9.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_check_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.sys1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_receive_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.sys1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_receive_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.terminate_crash_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_wait_reqid_collection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.terminate_crash_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.send_request_wait_reqid_collection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_code_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.shutdown.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_code_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.shutdown.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_event.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_event.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.489570.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.489570.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_sync_event.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_handle_sync_event.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_handle_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.489890.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_handle_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.489890.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_terminate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_in_terminate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start10.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_init.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.489922.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_init.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.489922.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start11.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.489954.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_fsm_suite.undef_terminate2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.489954.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.abcast.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.abcast.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start12.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.auto_hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.489602.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.auto_hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.489602.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.489634.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.489634.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.489666.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.489666.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.489698.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.489698.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5a.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.489730.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_remote_n3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.489730.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_with_huge_message_queue.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.call_with_huge_message_queue.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start5b.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.calling_self.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.489762.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.calling_self.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.489762.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start6.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast_fast.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.489794.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.cast_fast.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.489794.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.continue.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.continue.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start7.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.489826.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.489826.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash_in_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.crash_in_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start8.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472290.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.489858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472290.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.489858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472642.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472642.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.start9.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472674.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_enter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.472674.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_enter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473250.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_timeout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473250.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.state_timeout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473314.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.490274.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.473314.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.490274.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.403043.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.403043.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.error_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.error_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop10.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_all_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.490306.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_all_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.490306.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.490338.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.490338.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_with_process_label.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.format_log_with_process_label.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.get_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.402819.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.get_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.402819.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.402851.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.402851.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395140.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395140.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop5.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395172.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.490370.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395172.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.490370.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395300.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.395300.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop6.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473218.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.402883.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473218.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.402883.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.473282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop7.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.402915.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.402915.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop8.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.loop_start_fail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.490434.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.loop_start_fail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.490434.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall.395204.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall.395204.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop9.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_down.395236.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop_and_reply.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_down.395236.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.stop_and_reply.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_noconnection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.sys1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_noconnection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.sys1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_success.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.terminate_crash_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_success.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.terminate_crash_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_timeout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.timeout_cancel_and_update.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_recv_opt_timeout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.timeout_cancel_and_update.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote.395268.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_code_change.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote.395268.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_code_change.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote_old2.471874.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_in_terminate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.multicall_remote_old2.471874.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_in_terminate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_5854.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_5854.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_7669.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.otp_7669.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/gen_statem_suite.undef_terminate2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.replace_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.replace_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.reply_by_alias_with_payload.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.id_transform.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.reply_by_alias_with_payload.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.id_transform.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_check_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_check_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/id_transform_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_receive_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.binary_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_receive_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.binary_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_wait_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.broken_unicode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.send_request_wait_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.broken_unicode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_global_registered_parent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.eof_on_pipe.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_global_registered_parent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.eof_on_pipe.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_local_registered_parent.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.spec_init_local_registered_parent.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.start.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.start.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop10.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop10.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_latin1_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop6.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_fwrite_stdin_latin1_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop6.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_fwrite_stdin_latin1_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop7.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop7.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop8.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop8.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop9.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.stop9.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_chars_stdin_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.terminate_crash_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_binary_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.terminate_crash_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_binary_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.throw_in_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_list_mode.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.throw_in_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.io_get_until_stdin_list_mode.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_code_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_code_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_call.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout_isatty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_call.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.raw_stdout_isatty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_cast.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_gl.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_cast.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_gl.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_continue.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_ogl.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_continue.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.read_modes_ogl.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.setopts_getopts.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_handle_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.setopts_getopts.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_handle_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.shell_slogan.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_handle_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.shell_slogan.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_terminate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_in_terminate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_init.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_init.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options_gen.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_options_gen.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_prompt.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_server_suite.undef_terminate2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_proto_suite.unicode_prompt.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.498051.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.bad_printable_range.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.498051.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.bad_printable_range.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.build_text_without_maps_order.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.build_text_without_maps_order.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.498083.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.calling_self.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.498083.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.calling_self.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.chars_limit.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1clean.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.chars_limit.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.498115.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.coverage.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.498115.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.coverage.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.cr_whitespace_in_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal1dirty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.cr_whitespace_in_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.498147.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.498147.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.498179.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_g.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.498179.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_g.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_w.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.float_w.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.498211.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_neg_zero.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.498211.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_neg_zero.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.abnormal4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.format_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.auto_hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.github_4801.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.auto_hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.github_4801.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.call_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_fread_newlines.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.call_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_fread_newlines.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.code_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_collect_line_3_wb.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.code_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_collect_line_3_wb.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.473826.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_fread_literal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.473826.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_fread_literal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474146.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_print_binary_depth_one.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474146.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_print_binary_depth_one.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474210.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_width_too_small.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474210.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_lib_width_too_small.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474274.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_with_huge_message_queue.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.474274.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.io_with_huge_message_queue.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497443.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.limit_term.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497443.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.limit_term.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497955.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.manpage.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497955.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.manpage.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497987.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.maps.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.497987.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.maps.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498243.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10302.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498243.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10302.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498339.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10755.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.498339.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10755.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10836.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_10836.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14175.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14175.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.enter_loop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14178_unicode_atoms.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.enter_loop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14178_unicode_atoms.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.error_format_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14285.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.error_format_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14285.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_order.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14983.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_order.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_14983.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15076.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.event_types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15076.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_all_status.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15103.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_all_status.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15103.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15159.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15159.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15639.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15639.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_with_process_label.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15705.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.format_log_with_process_label.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15705.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.generic_timers.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15847.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.generic_timers.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15847.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.get_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15875.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.get_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_15875.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_17525.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_17525.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473346.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5403.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473346.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5403.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473858.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5813.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.473858.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_5813.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474114.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6230.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474114.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6230.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474178.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6282.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474178.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6282.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474242.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6354.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.474242.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6354.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.497475.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6495.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.497475.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6495.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498019.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6502.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498019.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6502.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498275.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6517.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498275.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6517.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498307.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6708.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.498307.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_6708.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7084.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7084.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7421.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_7421.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.loop_start_fail.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_8989.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.loop_start_fail.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.otp_8989.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.473794.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.printable_range.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.473794.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.printable_range.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.next_events.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.pop_too_many.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.unscan_format_without_maps_order.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.pop_too_many.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/io_suite.unscan_format_without_maps_order.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.replace_state.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.counterexamples.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.replace_state.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.counterexamples.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.reply_by_alias_with_payload.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.403267.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.reply_by_alias_with_payload.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.403267.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_check_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493026.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_check_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493026.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_receive_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493186.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_receive_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.493186.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_wait_reqid_collection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.send_request_wait_reqid_collection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.shutdown.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.403299.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.shutdown.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.403299.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.492802.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.492802.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.473378.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.493058.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.473378.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.493058.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.473698.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_escape_all.493154.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.473698.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_escape_all.493154.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_float_roundtrip.421988.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start10.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_float_roundtrip.421988.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.473730.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_integer_roundtrip.493122.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.473730.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_integer_roundtrip.493122.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_object_roundtrip.421956.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start11.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_object_roundtrip.421956.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.473762.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_string_roundtrip.493090.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.473762.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.property_string_roundtrip.493090.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start12.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.473410.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api.492962.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.473410.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api.492962.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api_stream.426245.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_api_stream.426245.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.473442.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_arrays.492930.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.473442.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_arrays.492930.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_atoms.492834.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_atoms.492834.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.473474.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_numbers.492866.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.473474.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_numbers.492866.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_objects.426181.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_objects.426181.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.473506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_strings.492898.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.473506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_strings.492898.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_whitespace.426213.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5a.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_decode_whitespace.426213.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.473538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_atom.492706.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.473538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_atom.492706.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_binary.403235.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start5b.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_binary.403235.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.473570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_escape_all.492770.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.473570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_escape_all.492770.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_float.492738.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start6.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_float.492738.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.473602.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_integer.403171.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.473602.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_integer.403171.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_list.403203.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start7.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_list.403203.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.473634.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_map.492674.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.473634.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_map.492674.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_proplist.403139.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start8.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_encode_proplist.403139.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.473666.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_fun.492994.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.473666.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_fun.492994.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_list.403331.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.start9.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_list.403331.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_enter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_map.403363.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_enter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_format_map.403363.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_timeout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_json_test_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.state_timeout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/json_suite.test_json_test_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.497507.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_false_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.497507.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_false_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_true_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.all_true_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.497891.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_false_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.497891.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_false_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_true_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop10.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.any_true_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.497539.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.497539.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.append_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.497571.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.concat_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.497571.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.concat_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.497603.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.497603.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.delete_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.droplast_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.droplast_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.497635.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.dropwhile_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.497635.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.dropwhile_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.duplicate_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop5.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.duplicate_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.497667.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.497667.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop6.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.497699.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.497699.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop7.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.enumerate_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.497731.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filter_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.497731.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filter_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filtermap_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop8.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.filtermap_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.497827.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatlength_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.497827.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatlength_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatmap_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop9.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatmap_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop_and_reply.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.stop_and_reply.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.sys1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.sys1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.flatten_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.terminate_crash_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldl_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.terminate_crash_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldl_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.timeout_cancel_and_update.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldr_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.timeout_cancel_and_update.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foldr_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_code_change.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foreach_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_code_change.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.foreach_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_in_terminate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_in_terminate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.join_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.join_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/gen_statem_suite.undef_terminate2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keydelete_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.id_transform.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.id_transform.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyfind_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymap_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/id_transform_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymap_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.binary_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.binary_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.broken_unicode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.broken_unicode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymember_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.eof_on_pipe.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.eof_on_pipe.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keymerge_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keyreplace_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysearch_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysort_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_latin1_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keysort_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keystore_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.keytake_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_fwrite_stdin_latin1_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.last_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_fwrite_stdin_latin1_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.last_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.map_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.map_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldl_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldl_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldr_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_chars_stdin_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.mapfoldr_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_binary_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.max_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_binary_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.max_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_list_mode.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.io_get_until_stdin_list_mode.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.member_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout_isatty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.raw_stdout_isatty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_gl.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_gl.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge3_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_ogl.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.read_modes_ogl.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.setopts_getopts.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.setopts_getopts.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_1_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.shell_slogan.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.shell_slogan.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_2_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options_gen.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_options_gen.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.merge_3_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_prompt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.min_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_proto_suite.unicode_prompt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.min_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.bad_printable_range.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.bad_printable_range.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.build_text_without_maps_order.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_outofrange_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.build_text_without_maps_order.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nth_outofrange_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.calling_self.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.calling_self.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.chars_limit.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_outofrange_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.chars_limit.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.nthtail_outofrange_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.coverage.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.partition_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.coverage.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.partition_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.cr_whitespace_in_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.prefix_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.cr_whitespace_in_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.prefix_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.reverse_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_g.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_absent_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_g.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_absent_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_w.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.float_w.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.search_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_neg_zero.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_neg_zero.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_string.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.format_string.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.seq3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.github_4801.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.github_4801.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_fread_newlines.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_fread_newlines.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sort_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_collect_line_3_wb.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_collect_line_3_wb.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_fread_literal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_outofrange_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_fread_literal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.split_outofrange_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_print_binary_depth_one.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.splitwith_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_print_binary_depth_one.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.splitwith_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_width_too_small.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_lib_width_too_small.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_with_huge_message_queue.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.io_with_huge_message_queue.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.limit_term.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.limit_term.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sublist_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.manpage.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.subtract_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.manpage.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.subtract_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.maps.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.suffix_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.maps.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.suffix_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10302.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sum_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10302.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.sum_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10755.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.takewhile_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10755.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.takewhile_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10836.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_10836.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14175.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14175.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeymerge_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14178_unicode_atoms.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeysort_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14178_unicode_atoms.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.ukeysort_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14285.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14285.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14983.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_14983.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge3_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15076.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15076.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15103.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15103.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_1_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15159.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15159.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15639.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15639.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_2_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15705.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15705.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15847.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15847.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.umerge_3_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15875.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_15875.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_17525.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_17525.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.uniq_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5403.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5403.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5813.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_5813.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.unzip_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6230.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6230.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.usort_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6354.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6354.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6495.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_4_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6495.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip3_4_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6502.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6502.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6517.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6517.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zip_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6708.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_4_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_6708.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_4_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7084.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_5_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7084.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith3_5_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7421.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_3_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_7421.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_3_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_8989.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_4_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.otp_8989.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_property_test_suite.zipwith_4_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.printable_range.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_1.493250.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.printable_range.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_1.493250.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_2.493282.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.append_2.493282.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.unscan_format_without_maps_order.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.droplast.404963.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/io_suite.unscan_format_without_maps_order.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.droplast.404963.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.counterexamples.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.dropwhile.404931.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.counterexamples.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.dropwhile.404931.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.395588.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404195.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.395588.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404195.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476098.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404611.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476098.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404611.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476258.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404803.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.476258.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.404803.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.422212.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.422212.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476130.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.426917.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476130.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.426917.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476290.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493442.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.476290.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493442.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.498467.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493474.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.498467.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493474.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493570.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493570.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_escape_all.395492.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493698.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_escape_all.395492.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493698.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_float_roundtrip.498723.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493794.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_float_roundtrip.498723.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493794.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_integer_roundtrip.498691.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493922.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_integer_roundtrip.498691.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.493922.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_object_roundtrip.498755.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.494050.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_object_roundtrip.498755.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.494050.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_string_roundtrip.395460.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.property_string_roundtrip.395460.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api.498627.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.enumerate.405027.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api.498627.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.enumerate.405027.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api_stream.395428.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.error_info.405059.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_api_stream.395428.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.error_info.405059.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_arrays.498659.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.filter_partition.427269.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_arrays.498659.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.filter_partition.427269.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_atoms.498499.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1.493858.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_atoms.498499.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1.493858.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_numbers.498531.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1_e.426821.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_numbers.498531.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_1_e.426821.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_objects.498595.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2.426853.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_objects.498595.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2.426853.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_strings.498563.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2_e.426885.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_strings.498563.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.flatten_2_e.426885.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_whitespace.395396.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.hof.427397.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_decode_whitespace.395396.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.hof.427397.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_atom.475938.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403523.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_atom.475938.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403523.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_binary.475970.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403779.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_binary.475970.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.403779.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_escape_all.476066.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404227.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_escape_all.476066.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404227.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_float.498371.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404835.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_float.498371.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.404835.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_integer.476002.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422020.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_integer.476002.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422020.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_list.476034.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422244.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_list.476034.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.422244.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_map.498403.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.426949.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_map.498403.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.426949.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_proplist.498435.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493506.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_encode_proplist.498435.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493506.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_fun.476226.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493602.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_fun.476226.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493602.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_list.476162.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493730.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_list.476162.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493730.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_map.476194.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493826.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_format_map.476194.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493826.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_json_test_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493954.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/json_suite.test_json_test_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.493954.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_false_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_false_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_true_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.all_true_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_false_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.join.427365.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_false_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.join.427365.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_true_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymember.403555.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.any_true_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymember.403555.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymerge.404259.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keymerge.404259.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keyreplace.493410.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.append_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keyreplace.493410.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.concat_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysearch_keyfind.493314.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.concat_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysearch_keyfind.493314.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_1.404291.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_1.404291.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_error.404419.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.delete_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_error.404419.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.droplast_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_i.404387.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.droplast_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_i.404387.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.dropwhile_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_rand.404355.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.dropwhile_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keysort_rand.404355.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.duplicate_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keystore.493346.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.duplicate_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keystore.493346.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keytake.493378.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.keytake.493378.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.member.404899.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.member.404899.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.merge.403587.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.merge.403587.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_5939.493986.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.enumerate_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_5939.493986.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filter_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6023.427141.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filter_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6023.427141.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filtermap_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6606.427109.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.filtermap_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_6606.427109.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatlength_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_7230.494018.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatlength_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.otp_7230.494018.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatmap_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.reverse.404867.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatmap_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.reverse.404867.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rkeymerge.404323.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rkeymerge.404323.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rmerge.422052.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.flatten_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rmerge.422052.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldl_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rukeymerge.426341.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldl_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rukeymerge.426341.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldr_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rumerge.403843.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foldr_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.rumerge.403843.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foreach_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.search.404995.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.foreach_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.search.404995.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2.427013.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2.427013.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.join_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2_e.493890.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.join_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_2_e.493890.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3.427045.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3.427045.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3_e.427077.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keydelete_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_3_e.427077.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_loop.426981.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.seq_loop.426981.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_1.422084.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyfind_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_1.422084.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymap_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_rand.403619.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymap_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sort_rand.403619.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2.493762.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymember_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2.493762.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2_e.426725.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_2_e.426725.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3.426757.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keymerge_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3.426757.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3_e.426789.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.sublist_3_e.426789.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.subtract.427333.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keyreplace_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.subtract.427333.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.suffix.427301.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.suffix.427301.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.takewhile.427237.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysearch_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.takewhile.427237.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysort_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeymerge.426309.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keysort_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeymerge.426309.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_1.426373.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_1.426373.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_error.493538.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keystore_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_error.493538.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_i.426437.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_i.426437.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_rand.426405.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.keytake_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.ukeysort_rand.426405.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.last_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.umerge.403811.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.last_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.umerge.403811.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.map_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_1.493634.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.map_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_1.493634.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldl_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_2.493666.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldl_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.uniq_2.493666.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldr_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_1.403875.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.mapfoldr_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_1.403875.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.max_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_rand.403907.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.max_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.usort_rand.403907.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_fail.422436.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_fail.422436.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_pad.422500.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.member_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_pad.422500.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_trim.422468.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip3_trim.422468.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_fail.427205.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge3_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_fail.427205.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_pad.422404.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_pad.422404.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_trim.422372.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_1_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_trim.422372.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip.422276.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip.422276.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip3.422308.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_2_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zip_unzip3.422308.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith.427173.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith.427173.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3.422340.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.merge_3_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3.422340.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.min_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_fail.404707.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.min_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_fail.404707.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_pad.404739.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_pad.404739.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_outofrange_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_trim.404771.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nth_outofrange_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith3_trim.404771.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_fail.422532.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_fail.422532.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_outofrange_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_pad.404675.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.nthtail_outofrange_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_pad.404675.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.partition_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_trim.404643.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.partition_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/lists_suite.zipwith_trim.404643.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.prefix_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.prefix_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.reverse_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_absent_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_absent_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/log_mf_h_suite.test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.search_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filter_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.seq3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filter_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filtermap_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_filtermap_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_fold_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sort_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_fold_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_foreach_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_foreach_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_outofrange_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.split_outofrange_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.splitwith_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_check_trapping.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.splitwith_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_check_trapping.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_kill_process.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_keys_kill_process.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_check_trapping.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_check_trapping.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_kill_process.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sublist_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_from_list_kill_process.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.subtract_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_get_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.subtract_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_get_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.suffix_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_groups_from_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.suffix_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_groups_from_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sum_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.sum_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.takewhile_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect_with.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.takewhile_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_intersect_with.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeymerge_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeysort_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_valid.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.ukeysort_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_iterator_valid.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_kill_process.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_kill_process.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_trapping.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge3_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_keys_trapping.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_map_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_map_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_opt.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_1_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_opt.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_with.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_merge_with.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_put_opt.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_2_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_put_opt.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_size_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_size_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.umerge_3_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_4.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_update_with_4.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_kill_process.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.uniq_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_kill_process.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_trapping.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_values_trapping.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_with_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.unzip_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_with_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_without_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/maps_suite.t_without_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.constants.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.usort_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.constants.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_4_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip3_4_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.floor_ceil.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.floor_ceil.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zip_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_4_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_4_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/math_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_5_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.action_function.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith3_5_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.action_function.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_3_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.andalso_orelse.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_3_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.andalso_orelse.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_4_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.autoimported.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_property_test_suite.zipwith_4_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.autoimported.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_1.476386.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_dbg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_1.476386.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_dbg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_2.476418.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_ets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.append_2.476418.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.basic_ets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.droplast.477634.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.binary_bifs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.droplast.477634.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.binary_bifs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.dropwhile.374757.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.bitsyntax.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.dropwhile.374757.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.bitsyntax.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374373.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.eep37.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374373.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.eep37.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374501.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374501.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374629.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.float_1_function.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.374629.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.float_1_function.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396228.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.from_shell.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396228.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.from_shell.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396260.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.396260.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.476962.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.476962.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477186.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head_from_shell.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477186.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_expr_in_head_from_shell.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477282.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477282.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477698.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs_from_shell.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.477698.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_exprs_from_shell.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.498851.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.498851.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499043.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern_from_shell.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499043.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.map_pattern_from_shell.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499203.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.multipass.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.499203.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.multipass.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.no_warnings.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.no_warnings.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.old_guards.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.old_guards.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.enumerate.374789.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_14454.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.enumerate.374789.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_14454.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.error_info.396836.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_16824.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.error_info.396836.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.otp_16824.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.filter_partition.396804.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_defaults.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.filter_partition.396804.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_defaults.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1.477346.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_index.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1.477346.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.record_index.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1_e.477410.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.records.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_1_e.477410.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.records.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2.477378.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.semicolon.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2.477378.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.semicolon.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2_e.477442.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.flatten_2_e.477442.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.hof.477602.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.top_match.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.hof.477602.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.top_match.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374405.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.unused_record.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374405.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.unused_record.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374661.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.warnings.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.374661.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/ms_transform_suite.warnings.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396292.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.427525.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396292.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.427525.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396484.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428069.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.396484.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428069.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476450.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428421.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476450.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached.428421.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476994.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.405827.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.476994.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.405827.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477122.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.427557.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477122.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.427557.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477218.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.428101.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477218.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.attached_cntrl_channel_handler_crash.428101.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477314.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.405667.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.477314.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.405667.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.498883.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.423140.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.498883.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.basic.423140.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499075.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.405731.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499075.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.405731.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499235.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.423204.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.499235.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cast.423204.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.405859.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.405859.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.422564.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.422564.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.join.477570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.428133.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.join.477570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash.428133.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymember.476482.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.405891.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymember.476482.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.405891.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymerge.476770.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.422596.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keymerge.476770.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.422596.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keyreplace.498819.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.423300.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keyreplace.498819.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.cntrl_channel_handler_crash_old_release.423300.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysearch_keyfind.476514.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.423268.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysearch_keyfind.476514.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.423268.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_1.476802.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.428293.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_1.476802.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.detached.428293.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_error.476898.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist.497666.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_error.476898.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist.497666.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_i.476930.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_io_redirect.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_i.476930.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_io_redirect.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_rand.476866.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_localhost.427461.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keysort_rand.476866.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_localhost.427461.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keystore.476546.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_up_down.497698.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keystore.476546.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dist_up_down.497698.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keytake.476578.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428037.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.keytake.476578.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428037.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.member.374725.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428389.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.member.374725.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.duplicate_name.428389.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.merge.498915.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.405763.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.merge.498915.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.405763.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_5939.374437.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.423236.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_5939.374437.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.dyn_peer.423236.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6023.499555.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.405571.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6023.499555.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.405571.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6606.374469.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.423972.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_6606.374469.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.423972.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_7230.396452.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.424132.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.otp_7230.396452.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.424132.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.reverse.374693.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.498274.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.reverse.374693.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.498274.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rkeymerge.476834.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rkeymerge.476834.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rmerge.498947.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rmerge.498947.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rukeymerge.477058.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.errors.497634.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rukeymerge.477058.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.errors.497634.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rumerge.476738.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_debug.405635.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.rumerge.476738.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_debug.405635.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.search.477666.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.405603.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.search.477666.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.405603.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2.396356.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423044.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2.396356.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423044.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2_e.396420.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423108.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_2_e.396420.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.423108.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3.396388.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424004.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3.396388.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424004.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3_e.374341.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424164.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_3_e.374341.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.424164.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_loop.396324.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.seq_loop.396324.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_1.499011.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_1.499011.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_rand.498979.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.405795.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sort_rand.498979.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.405795.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.427973.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.io_redirect.427973.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2.374245.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428005.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2.374245.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428005.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2_e.374309.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428357.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_2_e.374309.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.multi_node.428357.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3.374277.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.old_release.424036.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3.374277.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.old_release.424036.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3_e.477250.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_boot.497602.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.sublist_3_e.477250.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_boot.497602.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.subtract.477538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_continue.427429.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.subtract.477538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_continue.427429.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.suffix.396772.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash.497730.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.suffix.396772.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash.497730.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.takewhile.396740.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash_tcp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.takewhile.396740.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_down_crash_tcp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeymerge.477026.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.405699.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeymerge.477026.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.405699.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_1.477090.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.423172.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_1.477090.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.peer_states.423172.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_error.395940.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.post_process_args.427493.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_error.395940.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.post_process_args.427493.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_i.499523.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.405987.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_i.499523.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.405987.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_rand.395908.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.422628.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.ukeysort_rand.395908.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.422628.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.umerge.499107.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.428229.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.umerge.499107.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_close.428229.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_1.374213.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.405923.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_1.374213.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.405923.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_2.477154.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.423332.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.uniq_2.477154.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.423332.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_1.499139.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.427589.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_1.499139.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt.427589.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_rand.499171.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.405251.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.usort_rand.499171.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.405251.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_fail.499619.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.423588.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_fail.499619.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.423588.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_pad.374565.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.427621.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_pad.374565.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_halt_timeout.427621.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_trim.499651.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.423620.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip3_trim.499651.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.423620.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_fail.396612.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.427653.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_fail.396612.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.427653.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_pad.374533.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.428197.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_pad.374533.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop.428197.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_trim.396644.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.423652.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_trim.396644.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.423652.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip.396516.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.427685.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip.396516.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.427685.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip3.396548.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.428165.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zip_unzip3.396548.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.shutdown_stop_timeout.428165.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith.396580.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith.396580.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3.499587.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.427941.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3.499587.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.427941.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_fail.477506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.428325.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_fail.477506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/peer_suite.stop_peer.428325.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_pad.374597.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.basic.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_pad.374597.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.basic.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_trim.396708.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith3_trim.396708.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_fail.396676.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_fail.396676.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_pad.477474.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.link_race.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_pad.477474.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.link_race.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_trim.499683.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/lists_suite.zipwith_trim.499683.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/pool_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.crash.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.crash.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.424324.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.424324.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/log_mf_h_suite.test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.hibernate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.hibernate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_dont_hang.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_dont_hang.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filter_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.424292.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filter_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.424292.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filtermap_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_filtermap_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_fold_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_fold_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_foreach_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.otp_6345.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_foreach_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.otp_6345.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.report_cb.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.report_cb.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_check_trapping.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.spawn_opt.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_check_trapping.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.spawn_opt.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_kill_process.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_keys_kill_process.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_check_trapping.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stacktrace.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_check_trapping.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stacktrace.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_kill_process.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_from_list_kill_process.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.stop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_get_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_get_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_groups_from_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link_timeout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_groups_from_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_link_timeout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect_with.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_intersect_with.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link_timeout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_monitor_link_timeout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_nolink.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_nolink.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_valid.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_timeout.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_iterator_valid.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.sync_start_timeout.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_kill_process.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_kill_process.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_trapping.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format_arbitrary.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_keys_trapping.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proc_lib_suite.t_format_arbitrary.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_map_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_map_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_opt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.examples.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_opt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.examples.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_with.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_merge_with.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_put_opt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_put_opt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_size_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion_normalize.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_size_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.map_conversion_normalize.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.pm_fold_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.pm_fold_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_4.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_update_with_4.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/proplists_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_kill_process.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.append.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_kill_process.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.append.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_trapping.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.backward.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_values_trapping.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.backward.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_with_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.badarg.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_with_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.badarg.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_without_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/maps_suite.t_without_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.constants.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.constants.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cache_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cursor.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.cursor.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.dets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.dets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.floor_ceil.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eep37.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.floor_ceil.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eep37.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.407043.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.407043.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425124.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/math_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425124.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.action_function.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425188.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.action_function.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425188.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.andalso_orelse.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425508.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.andalso_orelse.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.425508.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.autoimported.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.499938.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.autoimported.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.499938.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_dbg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_dbg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_ets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.basic_ets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.binary_bifs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.binary_bifs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.bitsyntax.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.ets.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.bitsyntax.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.ets.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.eep37.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.eep37.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_cache.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_cache.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.float_1_function.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_unique.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.float_1_function.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.eval_unique.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.from_shell.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.evaluator.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.from_shell.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.evaluator.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.exported_var.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.exported_var.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filesort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filesort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head_from_shell.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_expr_in_head_from_shell.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter_var.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.filter_var.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs_from_shell.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fold.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_exprs_from_shell.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fold.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.forward.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.forward.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern_from_shell.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fun_clauses.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.map_pattern_from_shell.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.fun_clauses.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.multipass.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.generator_vars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.multipass.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.generator_vars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.no_warnings.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.indices.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.no_warnings.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.indices.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.old_guards.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.old_guards.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_14454.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.407075.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_14454.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.407075.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_16824.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.424420.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.otp_16824.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.424420.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_defaults.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425156.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_defaults.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425156.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_index.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425220.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.record_index.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425220.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.records.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425540.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.records.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.425540.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.semicolon.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.semicolon.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.top_match.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_complex.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.top_match.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_complex.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.unused_record.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_filter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.unused_record.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_filter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.warnings.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_lookup.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/ms_transform_suite.warnings.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_lookup.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.375237.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_merge.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.375237.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_merge.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.396932.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_option.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.396932.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_option.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.501187.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_sort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached.501187.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.join_sort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.397252.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.keysort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.397252.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.keysort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.499843.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.499843.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.501219.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.attached_cntrl_channel_handler_crash.501219.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.481858.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.481858.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.501123.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup_rec.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.basic.501123.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.lookup_rec.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.375461.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.manpage.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.375461.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.manpage.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.481922.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cast.481922.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.375013.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_qlc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.375013.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nested_qlc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.397284.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nomatch.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.397284.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.nomatch.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.501251.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_11758.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash.501251.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_11758.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.397316.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_12946.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.397316.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_12946.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.499875.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5195.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.499875.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5195.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.501283.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5644.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.cntrl_channel_handler_crash_old_release.501283.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_5644.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.375557.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6038_bug.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.375557.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6038_bug.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.481954.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6359.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.detached.481954.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6359.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist.374853.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6562.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist.374853.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6562.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_io_redirect.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6590.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_io_redirect.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6590.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_localhost.396900.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6673.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_localhost.396900.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6673.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_up_down.374949.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6674.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dist_up_down.374949.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6674.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375205.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6964.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375205.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_6964.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375589.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7114.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.duplicate_name.375589.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7114.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.375397.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7232.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.375397.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7232.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.481986.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7238.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.dyn_peer.481986.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7238.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376005.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7552.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376005.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7552.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376133.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7714.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.376133.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.otp_7714.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.397220.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.overridden_bif.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.397220.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.overridden_bif.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.501027.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pattern.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.501027.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pattern.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pre_fun.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.pre_fun.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.process_dies.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.process_dies.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.errors.374821.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.single.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.errors.374821.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.single.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_debug.501091.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.skip_filters.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_debug.501091.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.skip_filters.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376037.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.sort.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376037.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.sort.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376165.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.376165.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.397188.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.string_to_handle.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.397188.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.string_to_handle.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.481826.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.table.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.481826.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.table.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.501059.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.unused_var.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.501059.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/qlc_suite.unused_var.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.all_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375141.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375141.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375525.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.io_redirect.375525.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.any_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375173.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375173.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375493.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.multi_node.375493.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.cons_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.old_release.376069.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.old_release.376069.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_boot.374981.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_boot.374981.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.daeh_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_continue.374917.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_continue.374917.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash.374885.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash.374885.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash_tcp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_down_crash_tcp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.481890.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.481890.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.501155.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.peer_states.501155.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.post_process_args.499811.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.post_process_args.499811.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.375685.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.375685.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.499939.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.499939.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.delete_with_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.500515.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_close.500515.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.375621.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.375621.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.396964.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.396964.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.500387.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt.500387.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.drop_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.396996.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.396996.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.482146.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.482146.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.500419.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_halt_timeout.500419.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filter_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.397028.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.397028.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.482178.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.482178.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.filtermap_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.500451.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop.500451.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.375653.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.375653.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.fold_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.499907.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.from_list_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.499907.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.from_list_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.500483.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.shutdown_stop_timeout.500483.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.375429.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.375429.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.482018.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/peer_suite.stop_peer.482018.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.get_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.basic.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.basic.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.head_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.link_race.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.link_race.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/pool_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.crash.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.crash.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.in_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.482402.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.482402.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.hibernate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.hibernate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_dont_hang.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_dont_hang.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_empty_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.482370.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_queue_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.482370.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.is_queue_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.join_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.otp_6345.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.otp_6345.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.report_cb.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.report_cb.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.last_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.spawn_opt.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.spawn_opt.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.len_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stacktrace.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stacktrace.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.stop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.liat_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.list_conversion_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.list_conversion_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link_timeout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_link_timeout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.member_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.new_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.new_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link_timeout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.ops_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_monitor_link_timeout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.ops_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_nolink.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_nolink.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_timeout.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.sync_start_timeout.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format_arbitrary.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proc_lib_suite.t_format_arbitrary.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.out_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.examples.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.examples.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.peek_r_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion_normalize.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.map_conversion_normalize.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.pm_fold_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.pm_fold_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.reverse_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/proplists_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.append.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.append.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.snoc_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.backward.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.backward.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.badarg.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.badarg.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.split_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cache_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cursor.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.cursor.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.tail_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.dets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.to_list_invalid_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.dets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_property_test_suite.to_list_invalid_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eep37.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.do.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eep37.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.do.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.398148.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.398148.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.483586.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.error.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.483586.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.error.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.501987.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.501987.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502531.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.io_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502531.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.io_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502563.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.oops.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.502563.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.oops.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.op_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.op_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.to_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/queue_suite.to_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.ets.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.api_eq.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.ets.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.api_eq.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_bytes.504674.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_bytes.504674.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_cache.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_standard_normal.504706.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_cache.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_standard_normal.504706.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_unique.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_1.407459.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.eval_unique.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_1.407459.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.evaluator.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_2.504642.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.evaluator.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.basic_stats_uniform_2.504642.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.exported_var.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.bytes_count.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.exported_var.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.bytes_count.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filesort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_jump_api.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filesort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_jump_api.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_next_api.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.exsp_next_api.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter_var.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_float.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.filter_var.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_float.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fold.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_int.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fold.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.interval_int.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.forward.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.measure.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.forward.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.measure.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fun_clauses.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.mwc59_api.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.fun_clauses.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.mwc59_api.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.generator_vars.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.plugin.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.generator_vars.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.plugin.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.indices.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.indices.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_procdict.19710370.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_procdict.19710370.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483522.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_state.19710338.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483522.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.reference_jump_state.19710338.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483618.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.seed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.483618.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.seed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.484034.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.short_jump.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.484034.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.short_jump.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.501571.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.splitmix64_next_api.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.501571.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.splitmix64_next_api.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.502019.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.502019.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal.505090.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal.505090.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller.505026.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller.505026.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_complex.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller_2.505058.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_complex.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.stats_standard_normal_box_muller_2.505058.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_filter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.uniform_real_conv.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_filter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/rand_suite.uniform_real_conv.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_lookup.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_lookup.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_merge.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_merge.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_option.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.interval_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_option.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.interval_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_sort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.join_sort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.keysort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed0.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.keysort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.seed0.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/random_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.bad_utf8_subject.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.bad_utf8_subject.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.combined_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.combined_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup_rec.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.compile_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.lookup_rec.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.compile_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.manpage.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.manpage.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_handling.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_handling.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_qlc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_info.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nested_qlc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.error_info.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nomatch.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_capture.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.nomatch.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_capture.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_11758.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_unicode_validation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_11758.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.global_unicode_validation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_12946.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_12946.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5195.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.inspect.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5195.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.inspect.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5644.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.match_limit.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_5644.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.match_limit.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6038_bug.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_all_names.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6038_bug.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_all_names.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6359.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_dupnames.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6359.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_dupnames.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6562.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_never_utf.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6562.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_never_utf.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6590.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_no_start_optimize.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6590.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_no_start_optimize.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6673.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_ucp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6673.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.opt_ucp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6674.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6674.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6964.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_compile_workspace_overflow.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_6964.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_compile_workspace_overflow.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7114.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_cve_2008_2371.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7114.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.pcre_cve_2008_2371.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7232.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_backwards_accented.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7232.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_backwards_accented.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7238.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_infinite_loop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7238.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_infinite_loop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7552.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_version.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7552.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.re_version.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7714.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_autogen.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.otp_7714.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_autogen.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.overridden_bif.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_input_types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.overridden_bif.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_input_types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pattern.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_return.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pattern.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_return.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pre_fun.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_with_fun.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.pre_fun.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.replace_with_fun.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.process_dies.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.run_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.process_dies.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.run_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.single.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_autogen.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.single.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_autogen.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.skip_filters.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_options.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.skip_filters.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_options.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.sort.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_specials.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.sort.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.split_specials.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.string_to_handle.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.sub_binaries.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.string_to_handle.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.sub_binaries.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.table.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.yield_on_subject_validation.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.table.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/re_suite.yield_on_subject_validation.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.unused_var.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.return_values.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/qlc_suite.unused_var.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.return_values.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.select_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.select_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.all_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/select_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.add_element_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.add_element_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.del_element_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.any_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.del_element_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filter_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.cons_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filter_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filtermap_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.filtermap_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.fold_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.daeh_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.fold_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.from_list_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.from_list_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.intersection_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_disjoint_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_disjoint_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_element_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_element_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_empty_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_empty_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_equal_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.delete_with_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_equal_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_set_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_set_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_subset_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.is_subset_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.map_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.map_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.operations_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.drop_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.operations_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.size_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.size_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.subtract_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filter_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.subtract_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.to_list_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.to_list_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_1_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.filtermap_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_1_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_2_case.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_property_test_suite.union_2_case.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.add_element.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.fold_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.add_element.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.from_list_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.create.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.from_list_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.create.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.del_element.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.del_element.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filter.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filter.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filtermap.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.get_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.filtermap.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.fold.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.fold.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.head_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.intersection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.intersection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_disjoint.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_disjoint.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_empty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_empty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_equal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.in_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_equal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_set.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_set.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_subset.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.is_subset.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.iterate.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.iterate.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.map.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.map.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_empty_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_queue_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.subtract.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.is_queue_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.subtract.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_largest.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_largest.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_smallest.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.join_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.take_smallest.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.union.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sets_suite.union.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.after_paragraph_comment.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.last_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.after_paragraph_comment.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.begin_comment_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.begin_comment_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.len_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_with_anchor.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.bullet_list_with_anchor.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_inline_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.liat_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_inline_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.list_conversion_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.list_conversion_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.member_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.complex_nested_bullet_list3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.new_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_erlang_html.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.new_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_erlang_html.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.ops_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_unknown_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.ops_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.convert_unknown_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.double_char_for_quote_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.double_char_for_quote_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714690.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714690.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714754.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714754.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714818.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.out_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714818.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714882.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714882.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714946.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19714946.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715010.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715010.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715074.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.peek_r_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715074.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715138.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715138.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715202.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.reverse_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715202.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715266.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715266.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715330.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.snoc_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715330.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715394.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715394.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715458.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.split_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.19715458.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ending_br_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ending_br_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.escaped_character.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.tail_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.escaped_character.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.to_list_invalid_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_bullet_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_property_test_suite.to_list_invalid_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_bullet_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.do.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_numbered_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.do.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.even_nested_numbered_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_doc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_doc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.error.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_moduledoc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.error.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.existing_moduledoc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fake_table_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fake_table_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.io_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.io_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.oops.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_spaces.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.oops.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_spaces.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.op_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_tabs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.op_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.fence_code_with_tabs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.forget_closing_comment.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.forget_closing_comment.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.to_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_header_identifier.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/queue_suite.to_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_header_identifier.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.api_eq.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_heading_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.api_eq.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_heading_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_bytes.488706.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_inline_link_with_inline.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_bytes.488706.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_inline_link_with_inline.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_standard_normal.502691.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_standard_normal.502691.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_1.488674.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_long.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_1.488674.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_long.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_2.488738.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.basic_stats_uniform_2.488738.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.bytes_count.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_short.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.bytes_count.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_multiple_inline_format_short.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_jump_api.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_paragraph_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_jump_api.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_paragraph_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_next_api.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_separator_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.exsp_next_api.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.format_separator_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_float.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h1_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_float.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h1_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_int.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h2_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.interval_int.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h2_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.measure.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h3_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.measure.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h3_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.mwc59_api.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h4_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.mwc59_api.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h4_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.plugin.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h5_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.plugin.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h5_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h6_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.h6_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_procdict.19694210.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_doc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_procdict.19694210.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_doc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_state.19694178.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_moduledoc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.reference_jump_state.19694178.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.hidden_moduledoc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.seed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.seed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.short_jump.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714658.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.short_jump.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714658.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.splitmix64_next_api.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714722.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.splitmix64_next_api.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714722.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714786.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714786.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal.503171.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714850.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal.503171.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714850.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller.503107.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714914.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller.503107.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714914.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller_2.503139.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714978.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.stats_standard_normal_box_muller_2.503139.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19714978.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.uniform_real_conv.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715042.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/rand_suite.uniform_real_conv.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715042.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715106.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715106.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715170.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715170.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.interval_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715234.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.interval_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715234.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715298.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715298.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed0.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715362.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.seed0.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715362.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715426.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/random_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.19715426.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.bad_utf8_subject.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.bad_utf8_subject.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.combined_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_code_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.combined_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_code_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.compile_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_mfa_link.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.compile_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.inline_mfa_link.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_in_middle_word_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_in_middle_word_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_handling.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_with_colons.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_handling.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.italic_with_colons.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_info.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.error_info.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_capture.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_capture.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_unicode_validation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_with_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.global_unicode_validation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.list_with_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multi_word_format_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multi_word_format_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.inspect.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.inspect.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.match_limit.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.match_limit.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_indented_list2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_all_names.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_all_names.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_bullet_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_dupnames.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_dupnames.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_never_utf.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link_not_allowed.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_never_utf.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_link_not_allowed.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_no_start_optimize.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_no_start_optimize.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_ucp.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.opt_ucp.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_indented_list2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiline_numbered_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_compile_workspace_overflow.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_compile_workspace_overflow.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_cve_2008_2371.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.pcre_cve_2008_2371.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_backwards_accented.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_fence_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_backwards_accented.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_fence_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_infinite_loop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_quote_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_infinite_loop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_line_quote_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_version.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.re_version.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_autogen.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.new_lines_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_autogen.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.new_lines_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_input_types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_doc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_input_types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_doc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_return.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_moduledoc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_return.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.non_existing_moduledoc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_with_fun.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_bullet_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.replace_with_fun.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_bullet_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.run_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_numbered_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.run_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.odd_nested_numbered_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_autogen.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_after_heading_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_autogen.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_after_heading_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_options.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_options.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_specials.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_fence_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.split_specials.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_between_fence_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_in_between_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.paragraph_in_between_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.sub_binaries.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.parens_with_italics.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.sub_binaries.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.parens_with_italics.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.yield_on_subject_validation.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/re_suite.yield_on_subject_validation.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.return_values.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_with_anchor_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.return_values.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_with_anchor_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.select_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_without_space.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.select_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.quote_without_space.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/select_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.add_element_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.add_element_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.setext_h2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.del_element_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.del_element_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filter_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filter_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filtermap_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.filtermap_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_fence_code_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.fold_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_quote_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.fold_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.single_line_quote_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.from_list_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.from_list_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.intersection_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_disjoint_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_disjoint_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_element_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_with_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_element_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_bullet_list_with_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_empty_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_empty_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_equal_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_equal_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_set_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_set_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_subset_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.is_subset_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.map_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_with_format.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.map_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.singleton_numbered_list_with_format.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.operations_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.skip_symbols_in_inline.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.operations_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.skip_symbols_in_inline.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.size_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.size_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.start_with_br_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.start_with_br_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.subtract_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_escaped_bars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.subtract_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_escaped_bars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.to_list_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_rows.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.to_list_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.table_with_rows.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_1_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_1_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_2_case.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_simple.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_property_test_suite.union_2_case.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_simple.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.add_element.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_with_inline.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.add_element.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_markdown_suite.unmatched_format_with_inline.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.create.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.ansi.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.create.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.ansi.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.del_element.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.columns.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.del_element.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.columns.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filter.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filter.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filtermap.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.filtermap.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.fold.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.fold.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.links.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.links.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.intersection.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.normalize.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.intersection.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.normalize.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_disjoint.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_disjoint.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_empty.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_non_native.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_empty.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_non_native.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_equal.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_prop.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_equal.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_prop.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_set.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_smoke.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_set.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.render_smoke.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_subset.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.is_subset.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_docs_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.iterate.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_construct_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.iterate.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_construct_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.map.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_bin_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.map.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_bin_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_misc_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_misc_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.subtract.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_tail_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.subtract.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.bs_match_tail_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_largest.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713922.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_largest.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713922.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_smallest.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713986.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.take_smallest.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19713986.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.union.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19714178.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sets_suite.union.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.19714178.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.after_paragraph_comment.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.407971.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.after_paragraph_comment.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.407971.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.begin_comment_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.408035.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.begin_comment_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.408035.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.425892.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_mix_with_number_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.425892.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_with_anchor.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.bullet_list_with_anchor.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_inline_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_inline_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.forget.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.forget.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713890.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713890.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713954.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.complex_nested_bullet_list3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19713954.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_erlang_html.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714018.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_erlang_html.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714018.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_unknown_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714210.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.convert_unknown_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.19714210.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.double_char_for_quote_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408003.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.double_char_for_quote_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408003.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698114.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408067.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698114.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.408067.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698178.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698178.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698242.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698242.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698306.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.known_bugs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698306.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.known_bugs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698370.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.local_definitions_save_to_module_and_forget.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698370.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.local_definitions_save_to_module_and_forget.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698434.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_10302.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698434.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_10302.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698498.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_13719.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698498.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_13719.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698562.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14285.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698562.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14285.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698626.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14296.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698626.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_14296.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698690.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5195.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698690.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5195.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698754.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5226.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698754.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5226.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698818.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5327.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698818.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5327.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698882.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5435.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.19698882.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5435.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5915.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5915.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ending_br_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5916.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ending_br_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5916.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.escaped_character.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5990.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.escaped_character.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_5990.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_bullet_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6166.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_bullet_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6166.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_numbered_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6554.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.even_nested_numbered_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_6554.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_doc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7184.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_doc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7184.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_moduledoc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7232.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.existing_moduledoc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_7232.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fake_table_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_8393.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fake_table_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.otp_8393.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_bit_syntax.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_ignores_link_format_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_bit_syntax.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_spaces.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_funs.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_spaces.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_funs.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_tabs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_lc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.fence_code_with_tabs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_lc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.forget_closing_comment.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_records.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.forget_closing_comment.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.progex_records.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_header_identifier.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.prompt_width.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_header_identifier.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.prompt_width.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_heading_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.records.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_heading_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.records.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_inline_link_with_inline.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.refman_bit_syntax.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_inline_link_with_inline.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.refman_bit_syntax.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.restricted_local.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.restricted_local.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_long.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_long.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_interactive.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_mixed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_interactive.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_short.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_from_shell.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_multiple_inline_format_short.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_from_shell.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_paragraph_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_on_command_line.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_paragraph_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.start_restricted_on_command_line.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_separator_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.typed_records.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.format_separator_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.typed_records.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h1_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.types.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h1_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.types.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h2_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.whereis.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h2_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/shell_suite.whereis.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h3_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.compiled_sigils.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h3_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.compiled_sigils.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h4_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h4_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h5_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h5_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h6_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.parse_sigils.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.h6_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.parse_sigils.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_doc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.scan_sigils.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_doc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.scan_sigils.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_moduledoc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.hidden_moduledoc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sigils_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.ignore_three_spaces_before_quote.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698082.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.errors.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698082.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.errors.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698146.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698146.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698210.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698210.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698274.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.start_link_nodedown.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698274.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.start_link_nodedown.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698338.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698338.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698402.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start_link.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698402.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/slave_suite.t_start_link.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698466.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.a_function_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698466.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.a_function_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698530.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.canonical.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698530.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.canonical.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698594.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.composite_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698594.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.composite_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698658.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.constant_function.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698658.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.constant_function.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698722.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.converse_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698722.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.converse_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698786.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.difference.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698786.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.difference.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698850.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.digraph.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.19698850.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.digraph.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.domain_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.domain_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_code_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.drestriction.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_code_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.drestriction.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_mfa_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.19715906.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.inline_mfa_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.19715906.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_in_middle_word_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_in_middle_word_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_with_colons.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.italic_with_colons.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.extension.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_bold_in_sentence.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.extension.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_format_with_italics_in_sentence.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_with_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_difference.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.list_with_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_difference.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multi_word_format_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_domain_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multi_word_format_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_domain_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_indented_list2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_intersection_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_projection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_bullet_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_projection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_range_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_range_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link_not_allowed.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_specification.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_link_not_allowed.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_specification.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_to_relation_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_to_relation_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_indented_list2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiline_numbered_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.family_union_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_sets_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_sets_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_term_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.from_term_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_fence_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.image.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_fence_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.image.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_quote_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.19715874.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_line_quote_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.19715874.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.new_lines_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.new_lines_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_doc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_doc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_moduledoc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_of_family_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.non_existing_moduledoc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.intersection_of_family_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_bullet_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_bullet_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_numbered_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_image.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.odd_nested_numbered_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.inverse_image.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_after_heading_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_a_function_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_after_heading_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_a_function_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_disjoint.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_disjoint.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_fence_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_equal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_between_fence_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_equal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_in_between_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_set_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.paragraph_in_between_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_set_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.parens_with_italics.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_sofs_set_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.parens_with_italics.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_sofs_set_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_subset.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.is_subset.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_with_anchor_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.join.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_with_anchor_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.join.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_without_space.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.misc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.quote_without_space.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.misc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.multiple_relative_product.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.multiple_relative_product.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.no_elements_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.setext_h2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.no_elements_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_3.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_3.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_family.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_no_language_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.partition_family.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.product_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_fence_code_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.product_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_quote_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.projection.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.single_line_quote_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.projection.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.range_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.range_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_to_family_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relation_to_family_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_2.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.relative_product_2.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_with_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.restriction.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_bullet_list_with_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.restriction.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.set_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.set_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.specification.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.specification.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.strict_relation_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.strict_relation_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_with_format.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.substitution.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.singleton_numbered_list_with_format.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.substitution.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.skip_symbols_in_inline.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symdiff.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.skip_symbols_in_inline.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symdiff.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symmetric_partition.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.symmetric_partition.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.start_with_br_test.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.to_sets_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.start_with_br_test.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.to_sets_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_escaped_bars.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_escaped_bars.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_rows.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_of_family_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.table_with_rows.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.union_of_family_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.weak_relation_1.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_complex_format_with_inline.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/sofs_suite.weak_relation_1.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_simple.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19715970.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_simple.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19715970.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_with_inline.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716098.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_markdown_suite.unmatched_format_with_inline.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716098.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.ansi.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716226.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.ansi.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716226.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.columns.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716354.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.columns.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.19716354.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716002.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716002.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716130.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716130.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716258.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716258.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.links.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716386.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.links.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.19716386.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.normalize.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.normalize.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.double_random_to_list_array.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716034.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716034.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_non_native.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716162.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_non_native.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716162.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_prop.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716290.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_prop.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716290.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_smoke.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716418.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.render_smoke.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716418.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716482.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_docs_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.19716482.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_construct_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.408323.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_construct_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.408323.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_bin_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_bin_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_misc_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_misc_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_tail_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19715938.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.bs_match_tail_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19715938.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697506.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716066.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697506.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716066.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697570.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716194.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697570.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716194.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697794.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716322.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697794.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716322.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697986.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716450.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.19697986.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716450.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.398500.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716514.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.398500.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.19716514.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.503715.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.503715.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.408291.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.408291.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.forget.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.forget.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_big.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697474.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_medium.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697474.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_medium.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697538.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.408259.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697538.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.408259.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697602.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697602.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.multi_small.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697826.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.408227.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697826.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.408227.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697858.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.19697858.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_big.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.503747.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_medium.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.503747.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_medium.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.408195.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.408195.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.sched_small.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.known_bugs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.408163.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.known_bugs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.408163.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.local_definitions_save_to_module_and_forget.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.local_definitions_save_to_module_and_forget.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_big.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_10302.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_medium.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_10302.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_medium.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_13719.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.408131.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_13719.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.408131.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14285.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14285.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.single_small.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14296.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_14296.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_bench_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5195.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.app_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5195.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.app_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5226.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.appup_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5226.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.appup_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5327.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.assert_test.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5327.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.assert_test.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5435.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5435.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5915.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5915.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5916.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5916.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/stdlib_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5990.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.casefold.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_5990.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.casefold.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6166.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.cd_gc.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6166.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.cd_gc.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6554.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.centre.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_6554.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.centre.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7184.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chars.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7184.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chars.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7232.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chomp.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_7232.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chomp.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_8393.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chr_rchr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.otp_8393.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.chr_rchr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_bit_syntax.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.copies.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_bit_syntax.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.copies.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_funs.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.19716546.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_funs.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.19716546.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_lc.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_lc.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_records.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.progex_records.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.end_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.prompt_width.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.equal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.prompt_width.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.equal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.records.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.find.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.records.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.find.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.refman_bit_syntax.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.408355.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.refman_bit_syntax.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.408355.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.restricted_local.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.restricted_local.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_group.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_suite.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.init_per_suite.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_interactive.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.is_empty.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_interactive.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.is_empty.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_from_shell.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.jaro_similarity.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_from_shell.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.jaro_similarity.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_on_command_line.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.join.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.start_restricted_on_command_line.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.join.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.typed_records.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.left_right.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.typed_records.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.left_right.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.types.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.len.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.types.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.len.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.whereis.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.length.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/shell_suite.whereis.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.length.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.compiled_sigils.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lexemes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.compiled_sigils.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lexemes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lowercase.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.lowercase.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.meas.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.meas.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.parse_sigils.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.nth_lexeme.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.parse_sigils.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.nth_lexeme.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.scan_sigils.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_concat.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.scan_sigils.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_concat.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_equal.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sigils_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_equal.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_float.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_float.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.errors.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_integer.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.errors.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_to_integer.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.init_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_tokens.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.init_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.old_tokens.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.src.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.pad.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.src.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.pad.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.start_link_nodedown.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.prefix.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.start_link_nodedown.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.prefix.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.replace.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.replace.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start_link.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.reverse.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/slave_suite.t_start_link.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.reverse.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.a_function_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.slice.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.a_function_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.slice.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.canonical.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.span_cspan.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.canonical.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.span_cspan.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.composite_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.split.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.composite_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.split.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.constant_function.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.src.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.constant_function.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.src.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.converse_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.str_rstr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.converse_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.str_rstr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.difference.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.strip.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.difference.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.strip.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.digraph.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_string.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.digraph.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_string.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.domain_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_word.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.domain_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.sub_word.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.drestriction.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.substr.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.drestriction.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.substr.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.19699362.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.take.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.19699362.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.take.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.titlecase.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_group.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.titlecase.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_suite.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_float.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.end_per_suite.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_float.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.extension.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_graphemes.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.extension.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_graphemes.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_integer.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_integer.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_difference.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_upper_to_lower.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_difference.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.to_upper_to_lower.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_domain_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.trim.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_domain_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.trim.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_1.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.uppercase.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_1.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.uppercase.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_2.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.words.html similarity index 100% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/sofs_suite.family_intersection_2.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/string_suite.words.html diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log similarity index 55% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log index 6b7813b80f332..10d52cc748b74 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log @@ -1,12037 +1,12037 @@ -=== Suite started at 2024-09-11 11:10:55 +=== Suite started at 2024-09-12 10:33:01 === Starting test (with repeated test cases) =cases unknown =user otptest -=host 43e13ac1be0c -=hosts 43e13ac1be0c +=host 7a1fde2d1d55 +=hosts 7a1fde2d1d55 =emulator_vsn 15.0.1 =emulator beam =otp_release 28 -=started 2024-09-11 11:10:55 +=started 2024-09-12 10:33:01 =case ct_framework:init_per_suite =logfile ct_framework.init_per_suite.html =group_props [{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok =elapsed 0.0 =case ct_framework:init_per_group =logfile ct_framework.init_per_group.html =group_props [{suite,argparse_SUITE},{name,parser},parallel] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.001755 +=elapsed 0.001779 =case argparse_SUITE:readme -=logfile argparse_suite.readme.1218.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.readme.1186.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.002079 +=elapsed 0.001782 =case argparse_SUITE:basic =logfile argparse_suite.basic.1250.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.001658 +=elapsed 0.00197 =case argparse_SUITE:long_form_eq -=logfile argparse_suite.long_form_eq.1186.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.long_form_eq.67.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.007773 +=elapsed 0.001938 =case argparse_SUITE:built_in_types =logfile argparse_suite.built_in_types.3.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 8.44e-4 +=elapsed 0.005675 =case argparse_SUITE:type_validators -=logfile argparse_suite.type_validators.1282.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.type_validators.1218.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.008713 +=elapsed 0.005073 =case argparse_SUITE:invalid_arguments -=logfile argparse_suite.invalid_arguments.1314.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.invalid_arguments.35.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.001769 +=elapsed 0.001071 =case argparse_SUITE:complex_command -=logfile argparse_suite.complex_command.1378.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.complex_command.99.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.23e-4 +=elapsed 0.001531 =case argparse_SUITE:unicode -=logfile argparse_suite.unicode.1346.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.unicode.163.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.004584 +=elapsed 0.001853 =case argparse_SUITE:parser_error -=logfile argparse_suite.parser_error.1410.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.parser_error.195.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 5.75e-4 +=elapsed 0.002115 =case argparse_SUITE:nargs -=logfile argparse_suite.nargs.4.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.nargs.131.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.002096 +=elapsed 5.17e-4 =case argparse_SUITE:argparse -=logfile argparse_suite.argparse.35.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.argparse.1282.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.008223 +=elapsed 0.001193 =case argparse_SUITE:negative -=logfile argparse_suite.negative.67.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.negative.1314.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 9.51e-4 +=elapsed 0.002063 =case argparse_SUITE:nodigits -=logfile argparse_suite.nodigits.99.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.nodigits.1346.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.001941 +=elapsed 3.56e-4 =case argparse_SUITE:pos_mixed_with_opt -=logfile argparse_suite.pos_mixed_with_opt.131.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.pos_mixed_with_opt.4.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 4.32e-4 +=elapsed 1.36e-4 =case argparse_SUITE:default_for_not_required -=logfile argparse_suite.default_for_not_required.36.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.default_for_not_required.1378.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 4.63e-4 +=elapsed 3.79e-4 =case argparse_SUITE:global_default -=logfile argparse_suite.global_default.196.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.global_default.1410.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 9.0e-6 +=elapsed 8.2e-5 =case argparse_SUITE:subcommand -=logfile argparse_suite.subcommand.68.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.subcommand.1442.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 4.3e-5 +=elapsed 1.08e-4 =case argparse_SUITE:very_short -=logfile argparse_suite.very_short.100.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.very_short.1474.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 1.2e-5 +=elapsed 2.7e-5 =case argparse_SUITE:multi_short -=logfile argparse_suite.multi_short.132.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.multi_short.1506.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 4.1e-5 +=elapsed 4.4e-5 =case argparse_SUITE:proxy_arguments -=logfile argparse_suite.proxy_arguments.164.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.proxy_arguments.5.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 1.38e-4 +=elapsed 2.22e-4 =case ct_framework:end_per_group =logfile ct_framework.end_per_group.html =group_props [{suite,argparse_SUITE},{name,parser},parallel] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.4e-5 -=group_time 0.076s +=elapsed 4.6e-5 +=group_time 0.073s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.5.html +=logfile ct_framework.init_per_group.37.html =group_props [{name,validator},parallel,{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.8e-5 +=elapsed 4.2e-5 =case argparse_SUITE:validator_exception -=logfile argparse_suite.validator_exception.37.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.validator_exception.69.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 7.5e-5 +=elapsed 9.7e-5 =case argparse_SUITE:validator_exception_format -=logfile argparse_suite.validator_exception_format.69.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.validator_exception_format.101.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 6.6e-5 +=elapsed 6.0e-5 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.101.html +=logfile ct_framework.end_per_group.133.html =group_props [{name,validator},parallel,{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.8e-5 -=group_time 0.047s +=elapsed 5.0e-5 +=group_time 0.048s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.133.html +=logfile ct_framework.init_per_group.1538.html =group_props [{name,usage},parallel,{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.0e-5 +=elapsed 5.2e-5 =case argparse_SUITE:usage -=logfile argparse_suite.usage.228.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.usage.1570.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 5.63e-4 +=elapsed 0.001122 =case argparse_SUITE:usage_required_args -=logfile argparse_suite.usage_required_args.260.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.usage_required_args.1602.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 7.0e-5 +=elapsed 6.1e-5 =case argparse_SUITE:usage_template -=logfile argparse_suite.usage_template.292.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.usage_template.165.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 1.47e-4 +=elapsed 1.4e-4 =case argparse_SUITE:usage_args_ordering -=logfile argparse_suite.usage_args_ordering.324.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.usage_args_ordering.227.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 7.4e-5 +=elapsed 7.9e-5 =case argparse_SUITE:parser_error_usage -=logfile argparse_suite.parser_error_usage.388.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.parser_error_usage.197.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 2.48e-4 +=elapsed 1.12e-4 =case argparse_SUITE:command_usage -=logfile argparse_suite.command_usage.356.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.command_usage.229.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 7.3e-5 +=elapsed 6.2e-5 =case argparse_SUITE:usage_width -=logfile argparse_suite.usage_width.420.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=logfile argparse_suite.usage_width.261.html +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 2.04e-4 +=elapsed 1.89e-4 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.452.html +=logfile ct_framework.end_per_group.36.html =group_props [{name,usage},parallel,{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 3.0e-5 -=group_time 0.053s +=elapsed 4.7e-5 +=group_time 0.055s =case ct_framework:end_per_suite =logfile ct_framework.end_per_suite.html =group_props [{suite,argparse_SUITE}] -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok =elapsed 0.0 -=group_time 0.278s +=group_time 0.279s =case array_SUITE:init_per_suite =logfile array_suite.init_per_suite.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok =elapsed 0.0 =case array_SUITE:new_test =logfile array_suite.new_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.001767 +=elapsed 0.001939 =case array_SUITE:fix_test =logfile array_suite.fix_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case array_SUITE:relax_test =logfile array_suite.relax_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 2.0e-6 +=elapsed 4.0e-6 =case array_SUITE:resize_test =logfile array_suite.resize_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 1.0e-5 +=elapsed 1.2e-5 =case array_SUITE:set_get_test =logfile array_suite.set_get_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok =elapsed 9.0e-6 =case array_SUITE:to_list_test =logfile array_suite.to_list_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 2.7e-5 +=elapsed 2.5e-5 =case array_SUITE:sparse_to_list_test =logfile array_suite.sparse_to_list_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case array_SUITE:from_list_test =logfile array_suite.from_list_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:56 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.008203 +=elapsed 0.008462 =case array_SUITE:to_orddict_test =logfile array_suite.to_orddict_test.html -=started 2024-09-11 11:10:56 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 0.0001 +=elapsed 7.0e-5 =case array_SUITE:sparse_to_orddict_test =logfile array_suite.sparse_to_orddict_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:04 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case array_SUITE:from_orddict_test =logfile array_suite.from_orddict_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:04 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.016642 +=elapsed 0.016338 =case array_SUITE:map_test =logfile array_suite.map_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.009567 +=elapsed 0.009708 =case array_SUITE:sparse_map_test =logfile array_suite.sparse_map_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.008754 +=elapsed 0.00916 =case array_SUITE:foldl_test =logfile array_suite.foldl_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 1.63e-4 +=elapsed 1.35e-4 =case array_SUITE:sparse_foldl_test =logfile array_suite.sparse_foldl_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 1.47e-4 +=elapsed 1.17e-4 =case array_SUITE:foldr_test =logfile array_suite.foldr_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 1.55e-4 +=elapsed 1.28e-4 =case array_SUITE:sparse_foldr_test =logfile array_suite.sparse_foldr_test.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 1.41e-4 +=elapsed 1.19e-4 =case array_SUITE:end_per_suite =logfile array_suite.end_per_suite.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok =elapsed 1.0e-6 -=group_time 0.465s +=group_time 0.467s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.1442.html +=logfile ct_framework.init_per_suite.259.html =group_props [{suite,base64_SUITE}] -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok =elapsed 0.0 =case base64_SUITE:base64_encode =logfile base64_suite.base64_encode.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.0018 +=elapsed 0.002427 =case base64_SUITE:base64_encode_to_string =logfile base64_suite.base64_encode_to_string.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.0e-6 +=elapsed 5.0e-6 =case base64_SUITE:base64_encode_modes =logfile base64_suite.base64_encode_modes.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.0e-6 +=elapsed 5.0e-6 =case base64_SUITE:base64_decode =logfile base64_suite.base64_decode.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.9e-5 +=elapsed 4.6e-5 =case base64_SUITE:base64_decode_to_string =logfile base64_suite.base64_decode_to_string.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.6e-5 +=elapsed 4.6e-5 =case base64_SUITE:base64_decode_modes =logfile base64_suite.base64_decode_modes.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 7.0e-6 +=elapsed 1.2e-5 =case base64_SUITE:base64_otp_5635 =logfile base64_suite.base64_otp_5635.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.0e-6 +=elapsed 5.0e-6 =case base64_SUITE:base64_otp_6279 =logfile base64_suite.base64_otp_6279.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 3.0e-6 +=elapsed 6.0e-6 =case base64_SUITE:big =logfile base64_suite.big.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.006827 +=elapsed 0.007337 =case base64_SUITE:illegal =logfile base64_suite.illegal.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 6.0e-6 +=elapsed 1.4e-5 =case base64_SUITE:mime_decode =logfile base64_suite.mime_decode.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 1.4e-5 +=elapsed 2.1e-5 =case base64_SUITE:mime_decode_modes =logfile base64_suite.mime_decode_modes.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 5.0e-6 +=elapsed 9.0e-6 =case base64_SUITE:mime_decode_to_string =logfile base64_suite.mime_decode_to_string.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 8.0e-6 +=elapsed 1.4e-5 =case base64_SUITE:mime_decode_to_string_modes =logfile base64_suite.mime_decode_to_string_modes.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 2.0e-6 +=elapsed 6.0e-6 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.1474.html +=logfile ct_framework.init_per_group.1634.html =group_props [{name,roundtrip},parallel,{suite,base64_SUITE}] -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 3.1e-5 +=elapsed 4.1e-5 =case base64_SUITE:roundtrip_1 -=logfile base64_suite.roundtrip_1.1506.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=logfile base64_suite.roundtrip_1.1666.html +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.283147 +=elapsed 0.294764 =case base64_SUITE:roundtrip_2 -=logfile base64_suite.roundtrip_2.1538.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=logfile base64_suite.roundtrip_2.1698.html +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.28673 +=elapsed 0.298535 =case base64_SUITE:roundtrip_3 -=logfile base64_suite.roundtrip_3.163.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=logfile base64_suite.roundtrip_3.1730.html +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.11204 +=elapsed 0.10648 =case base64_SUITE:roundtrip_4 -=logfile base64_suite.roundtrip_4.1570.html -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=logfile base64_suite.roundtrip_4.1762.html +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 0.301191 +=elapsed 0.254835 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.291.html +=logfile ct_framework.end_per_group.1826.html =group_props [{name,roundtrip},parallel,{suite,base64_SUITE}] -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:57 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok -=elapsed 4.5e-5 -=group_time 0.348s +=elapsed 4.3e-5 +=group_time 0.347s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.1634.html +=logfile ct_framework.end_per_suite.1858.html =group_props [{suite,base64_SUITE}] -=started 2024-09-11 11:10:57 -=ended 2024-09-11 11:10:58 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:05 =result ok =elapsed 0.0 -=group_time 0.721s +=group_time 0.729s =case base64_property_test_SUITE:init_per_suite =logfile base64_property_test_suite.init_per_suite.html -=started 2024-09-11 11:10:58 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:05 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 1.240891 +=elapsed 1.258748 =case base64_property_test_SUITE:encode_1_case =logfile base64_property_test_suite.encode_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.008506 +=elapsed 0.009072 =case base64_property_test_SUITE:encode_2_case =logfile base64_property_test_suite.encode_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.001808 +=elapsed 0.001589 =case base64_property_test_SUITE:encode_to_string_1_case =logfile base64_property_test_suite.encode_to_string_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.001624 +=elapsed 0.001467 =case base64_property_test_SUITE:encode_to_string_2_case =logfile base64_property_test_suite.encode_to_string_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.001705 +=elapsed 0.001556 =case base64_property_test_SUITE:decode_1_case =logfile base64_property_test_suite.decode_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.003861 +=elapsed 0.00386 =case base64_property_test_SUITE:decode_2_case =logfile base64_property_test_suite.decode_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.00943 +=elapsed 0.009097 =case base64_property_test_SUITE:decode_1_malformed_case =logfile base64_property_test_suite.decode_1_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.012488 +=elapsed 0.010787 =case base64_property_test_SUITE:decode_2_malformed_case =logfile base64_property_test_suite.decode_2_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.011886 +=elapsed 0.013351 =case base64_property_test_SUITE:decode_1_noisy_case =logfile base64_property_test_suite.decode_1_noisy_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.016319 +=elapsed 0.01819 =case base64_property_test_SUITE:decode_2_noisy_case =logfile base64_property_test_suite.decode_2_noisy_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.016248 +=elapsed 0.018551 =case base64_property_test_SUITE:decode_to_string_1_case =logfile base64_property_test_suite.decode_to_string_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.003902 +=elapsed 0.005174 =case base64_property_test_SUITE:decode_to_string_2_case =logfile base64_property_test_suite.decode_to_string_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.009198 +=elapsed 0.009971 =case base64_property_test_SUITE:decode_to_string_1_malformed_case =logfile base64_property_test_suite.decode_to_string_1_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.011465 +=elapsed 0.014687 =case base64_property_test_SUITE:decode_to_string_2_malformed_case =logfile base64_property_test_suite.decode_to_string_2_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.01231 +=elapsed 0.012918 =case base64_property_test_SUITE:decode_to_string_1_noisy_case =logfile base64_property_test_suite.decode_to_string_1_noisy_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.016161 +=elapsed 0.018991 =case base64_property_test_SUITE:decode_to_string_2_noisy_case =logfile base64_property_test_suite.decode_to_string_2_noisy_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.01628 +=elapsed 0.016344 =case base64_property_test_SUITE:mime_decode_1_case =logfile base64_property_test_suite.mime_decode_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.006767 +=elapsed 0.00688 =case base64_property_test_SUITE:mime_decode_2_case =logfile base64_property_test_suite.mime_decode_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.009031 +=elapsed 0.009083 =case base64_property_test_SUITE:mime_decode_1_malformed_case =logfile base64_property_test_suite.mime_decode_1_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.028318 +=elapsed 0.027995 =case base64_property_test_SUITE:mime_decode_2_malformed_case =logfile base64_property_test_suite.mime_decode_2_malformed_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.027197 +=elapsed 0.028394 =case base64_property_test_SUITE:mime_decode_to_string_1_case =logfile base64_property_test_suite.mime_decode_to_string_1_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:10:59 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.006503 +=elapsed 0.006286 =case base64_property_test_SUITE:mime_decode_to_string_2_case =logfile base64_property_test_suite.mime_decode_to_string_2_case.html -=started 2024-09-11 11:10:59 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:07 =result ok -=elapsed 0.008719 +=elapsed 0.008791 =case base64_property_test_SUITE:mime_decode_to_string_1_malformed_case =logfile base64_property_test_suite.mime_decode_to_string_1_malformed_case.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:07 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.02759 +=elapsed 0.029061 =case base64_property_test_SUITE:mime_decode_to_string_2_malformed_case =logfile base64_property_test_suite.mime_decode_to_string_2_malformed_case.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.028479 +=elapsed 0.026312 =case base64_property_test_SUITE:end_per_suite =logfile base64_property_test_suite.end_per_suite.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok =elapsed 0.0 -=group_time 2.103s +=group_time 2.142s =case beam_lib_SUITE:init_per_suite =logfile beam_lib_suite.init_per_suite.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok =elapsed 0.0 =case beam_lib_SUITE:error =logfile beam_lib_suite.error.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.017936 +=elapsed 0.017316 =case beam_lib_SUITE:normal =logfile beam_lib_suite.normal.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.006901 +=elapsed 0.005318 =case beam_lib_SUITE:cmp =logfile beam_lib_suite.cmp.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.009344 +=elapsed 0.008276 =case beam_lib_SUITE:cmp_literals =logfile beam_lib_suite.cmp_literals.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.004809 +=elapsed 0.004469 =case beam_lib_SUITE:strip =logfile beam_lib_suite.strip.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.032591 +=elapsed 0.03111 =case beam_lib_SUITE:strip_add_chunks =logfile beam_lib_suite.strip_add_chunks.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.036899 +=elapsed 0.041929 =case beam_lib_SUITE:otp_6711 =logfile beam_lib_suite.otp_6711.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.002465 +=elapsed 0.004306 =case beam_lib_SUITE:building =logfile beam_lib_suite.building.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.002995 +=elapsed 0.004305 =case beam_lib_SUITE:md5 =logfile beam_lib_suite.md5.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:00 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:08 =result ok -=elapsed 0.359658 +=elapsed 0.423846 =case beam_lib_SUITE:encrypted_abstr =logfile beam_lib_suite.encrypted_abstr.html -=started 2024-09-11 11:11:00 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:08 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.19445 +=elapsed 0.199134 =case beam_lib_SUITE:encrypted_abstr_file =logfile beam_lib_suite.encrypted_abstr_file.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.008933 +=elapsed 0.009779 =case beam_lib_SUITE:missing_debug_info_backend =logfile beam_lib_suite.missing_debug_info_backend.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.001778 +=elapsed 0.002479 =case beam_lib_SUITE:test_makedep_abstract_code =logfile beam_lib_suite.test_makedep_abstract_code.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.001536 +=elapsed 0.002191 =case beam_lib_SUITE:end_per_suite =logfile beam_lib_suite.end_per_suite.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 1.0e-6 -=group_time 1.002s +=elapsed 3.0e-6 +=group_time 1.082s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.2434.html +=logfile ct_framework.init_per_suite.2658.html =group_props [{suite,binary_module_SUITE}] -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case binary_module_SUITE:scope_return =logfile binary_module_suite.scope_return.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.010728 +=elapsed 0.010689 =case binary_module_SUITE:interesting =logfile binary_module_suite.interesting.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:01 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:09 =result ok -=elapsed 0.170793 +=elapsed 0.169506 =case binary_module_SUITE:random_ref_fla_comp =logfile binary_module_suite.random_ref_fla_comp.html -=started 2024-09-11 11:11:01 -=ended 2024-09-11 11:11:02 +=started 2024-09-12 10:33:09 +=ended 2024-09-12 10:33:10 =result ok -=elapsed 0.789169 +=elapsed 0.796363 =case binary_module_SUITE:random_ref_sr_comp =logfile binary_module_suite.random_ref_sr_comp.html -=started 2024-09-11 11:11:02 -=ended 2024-09-11 11:11:06 +=started 2024-09-12 10:33:10 +=ended 2024-09-12 10:33:14 =result ok -=elapsed 4.450728 +=elapsed 4.442264 =case binary_module_SUITE:random_ref_comp =logfile binary_module_suite.random_ref_comp.html -=started 2024-09-11 11:11:06 -=ended 2024-09-11 11:11:14 +=started 2024-09-12 10:33:14 +=ended 2024-09-12 10:33:22 =result ok -=elapsed 7.309498 +=elapsed 7.359783 =case binary_module_SUITE:parts =logfile binary_module_suite.parts.html -=started 2024-09-11 11:11:14 -=ended 2024-09-11 11:11:15 +=started 2024-09-12 10:33:22 +=ended 2024-09-12 10:33:23 =result ok -=elapsed 1.145255 +=elapsed 1.159081 =case binary_module_SUITE:bin_to_list =logfile binary_module_suite.bin_to_list.html -=started 2024-09-11 11:11:15 -=ended 2024-09-11 11:11:16 +=started 2024-09-12 10:33:23 +=ended 2024-09-12 10:33:24 =result ok -=elapsed 1.284052 +=elapsed 1.291164 =case binary_module_SUITE:list_to_bin =logfile binary_module_suite.list_to_bin.html -=started 2024-09-11 11:11:16 -=ended 2024-09-11 11:11:16 +=started 2024-09-12 10:33:24 +=ended 2024-09-12 10:33:24 =result ok -=elapsed 0.043687 +=elapsed 0.043663 =case binary_module_SUITE:copy =logfile binary_module_suite.copy.html -=started 2024-09-11 11:11:16 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:24 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 11.507594 +=elapsed 11.533604 =case binary_module_SUITE:referenced =logfile binary_module_suite.referenced.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 4.08e-4 +=elapsed 7.9e-5 =case binary_module_SUITE:guard =logfile binary_module_suite.guard.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok: Guard tests are run in emulator test suite =elapsed 0.0 =case binary_module_SUITE:encode_decode =logfile binary_module_suite.encode_decode.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 0.028256 +=elapsed 0.028252 =case binary_module_SUITE:badargs =logfile binary_module_suite.badargs.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 7.6e-5 +=elapsed 7.8e-5 =case binary_module_SUITE:longest_common_trap =logfile binary_module_suite.longest_common_trap.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 3.88e-4 +=elapsed 4.04e-4 =case binary_module_SUITE:check_no_invalid_read_bug =logfile binary_module_suite.check_no_invalid_read_bug.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok =elapsed 3.0e-6 =case binary_module_SUITE:error_info =logfile binary_module_suite.error_info.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 0.009087 +=elapsed 0.011178 =case binary_module_SUITE:hex_encoding =logfile binary_module_suite.hex_encoding.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok -=elapsed 0.003572 +=elapsed 0.003652 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.2498.html +=logfile ct_framework.end_per_suite.34754.html =group_props [{suite,binary_module_SUITE}] -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:28 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:36 =result ok =elapsed 0.0 -=group_time 27.171s +=group_time 27.271s =case binary_property_test_SUITE:init_per_suite =logfile binary_property_test_suite.init_per_suite.html -=started 2024-09-11 11:11:28 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:36 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 1.226647 +=elapsed 1.206272 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.2530.html +=logfile ct_framework.init_per_group.34786.html =group_props [{suite,binary_property_test_SUITE},{name,valid_input}] -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 2.7e-5 +=elapsed 3.3e-5 =case binary_property_test_SUITE:at_case =logfile binary_property_test_suite.at_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.002026 +=elapsed 0.002793 =case binary_property_test_SUITE:bin_to_list_1_case =logfile binary_property_test_suite.bin_to_list_1_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.001508 +=elapsed 0.001985 =case binary_property_test_SUITE:bin_to_list_2_3_case =logfile binary_property_test_suite.bin_to_list_2_3_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.002376 +=elapsed 0.00308 =case binary_property_test_SUITE:compile_pattern_case =logfile binary_property_test_suite.compile_pattern_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.005853 +=elapsed 0.009892 =case binary_property_test_SUITE:copy_case =logfile binary_property_test_suite.copy_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.001684 +=elapsed 0.002545 =case binary_property_test_SUITE:decode_hex_case =logfile binary_property_test_suite.decode_hex_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.00208 +=elapsed 0.00317 =case binary_property_test_SUITE:decode_unsigned_case =logfile binary_property_test_suite.decode_unsigned_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.001385 +=elapsed 0.001966 =case binary_property_test_SUITE:encode_hex_case =logfile binary_property_test_suite.encode_hex_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 0.001626 +=elapsed 0.002383 =case binary_property_test_SUITE:encode_unsigned_case =logfile binary_property_test_suite.encode_unsigned_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:37 =result ok -=elapsed 9.85e-4 +=elapsed 0.00145 =case binary_property_test_SUITE:first_case =logfile binary_property_test_suite.first_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:37 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001389 +=elapsed 0.002105 =case binary_property_test_SUITE:last_case =logfile binary_property_test_suite.last_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001409 +=elapsed 0.002113 =case binary_property_test_SUITE:list_to_bin_case =logfile binary_property_test_suite.list_to_bin_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001376 +=elapsed 0.002087 =case binary_property_test_SUITE:longest_common_prefix_case =logfile binary_property_test_suite.longest_common_prefix_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.006548 +=elapsed 0.011716 =case binary_property_test_SUITE:longest_common_suffix_case =logfile binary_property_test_suite.longest_common_suffix_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.007302 +=elapsed 0.011625 =case binary_property_test_SUITE:match_case =logfile binary_property_test_suite.match_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:29 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.00816 +=elapsed 0.021549 =case binary_property_test_SUITE:matches_case =logfile binary_property_test_suite.matches_case.html -=started 2024-09-11 11:11:29 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.009519 +=elapsed 0.013188 =case binary_property_test_SUITE:part_case =logfile binary_property_test_suite.part_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001736 +=elapsed 0.001678 =case binary_property_test_SUITE:replace_case =logfile binary_property_test_suite.replace_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.015288 +=elapsed 0.018748 =case binary_property_test_SUITE:split_case =logfile binary_property_test_suite.split_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.010673 +=elapsed 0.011646 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.3170.html +=logfile ct_framework.end_per_group.35426.html =group_props [{suite,binary_property_test_SUITE},{name,valid_input}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 3.2e-5 -=group_time 0.532s +=elapsed 3.4e-5 +=group_time 0.581s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.3202.html +=logfile ct_framework.init_per_group.35458.html =group_props [{name,invalid_input},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok =elapsed 2.7e-5 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.3234.html +=logfile ct_framework.init_per_group.35490.html =group_props [{name,out_of_binary},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok =elapsed 2.5e-5 =case binary_property_test_SUITE:at_invalid_index_case =logfile binary_property_test_suite.at_invalid_index_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001633 +=elapsed 0.001576 =case binary_property_test_SUITE:bin_to_list_2_3_invalid_range_case =logfile binary_property_test_suite.bin_to_list_2_3_invalid_range_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001841 +=elapsed 0.001796 =case binary_property_test_SUITE:match_3_invalid_scope_case =logfile binary_property_test_suite.match_3_invalid_scope_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.010154 +=elapsed 0.01099 =case binary_property_test_SUITE:matches_3_invalid_scope_case =logfile binary_property_test_suite.matches_3_invalid_scope_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.008396 +=elapsed 0.008388 =case binary_property_test_SUITE:part_invalid_range_case =logfile binary_property_test_suite.part_invalid_range_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.001758 +=elapsed 0.002563 =case binary_property_test_SUITE:replace_4_invalid_scope_case =logfile binary_property_test_suite.replace_4_invalid_scope_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.007412 +=elapsed 0.01266 =case binary_property_test_SUITE:replace_4_invalid_insert_replaced_case =logfile binary_property_test_suite.replace_4_invalid_insert_replaced_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.008885 +=elapsed 0.01232 =case binary_property_test_SUITE:split_3_invalid_scope_case =logfile binary_property_test_suite.split_3_invalid_scope_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.005973 +=elapsed 0.012033 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.3522.html +=logfile ct_framework.end_per_group.35778.html =group_props [{name,out_of_binary},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 2.5e-5 -=group_time 0.248s +=elapsed 3.3e-5 +=group_time 0.264s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.3554.html +=logfile ct_framework.init_per_group.35810.html =group_props [{name,invalid_subjects},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 2.5e-5 +=elapsed 3.1e-5 =case binary_property_test_SUITE:at_invalid_subject_case =logfile binary_property_test_suite.at_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.007139 +=elapsed 0.005678 =case binary_property_test_SUITE:bin_to_list_invalid_subject_case =logfile binary_property_test_suite.bin_to_list_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.005835 +=elapsed 0.003725 =case binary_property_test_SUITE:copy_invalid_subject_case =logfile binary_property_test_suite.copy_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.006443 +=elapsed 0.004337 =case binary_property_test_SUITE:decode_hex_invalid_subject_case =logfile binary_property_test_suite.decode_hex_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.005266 +=elapsed 0.003981 =case binary_property_test_SUITE:decode_unsigned_invalid_subject_case =logfile binary_property_test_suite.decode_unsigned_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.003875 +=elapsed 0.003731 =case binary_property_test_SUITE:encode_hex_invalid_subject_case =logfile binary_property_test_suite.encode_hex_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.003918 +=elapsed 0.004082 =case binary_property_test_SUITE:first_invalid_subject_case =logfile binary_property_test_suite.first_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.002603 +=elapsed 0.002247 =case binary_property_test_SUITE:last_invalid_subject_case =logfile binary_property_test_suite.last_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.002186 +=elapsed 0.002708 =case binary_property_test_SUITE:longest_common_prefix_invalid_subject_case =logfile binary_property_test_suite.longest_common_prefix_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.005608 +=elapsed 0.00665 =case binary_property_test_SUITE:longest_common_suffix_invalid_subject_case =logfile binary_property_test_suite.longest_common_suffix_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.006244 +=elapsed 0.006194 =case binary_property_test_SUITE:match_invalid_subject_case =logfile binary_property_test_suite.match_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:38 =result ok -=elapsed 0.007136 +=elapsed 0.00712 =case binary_property_test_SUITE:matches_invalid_subject_case =logfile binary_property_test_suite.matches_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:38 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.009018 +=elapsed 0.007609 =case binary_property_test_SUITE:part_invalid_subject_case =logfile binary_property_test_suite.part_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.003911 +=elapsed 0.003692 =case binary_property_test_SUITE:replace_invalid_subject_case =logfile binary_property_test_suite.replace_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.007765 +=elapsed 0.009122 =case binary_property_test_SUITE:split_invalid_subject_case =logfile binary_property_test_suite.split_invalid_subject_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.007587 +=elapsed 0.009239 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.4066.html +=logfile ct_framework.end_per_group.36322.html =group_props [{name,invalid_subjects},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 2.9e-5 -=group_time 0.444s +=elapsed 2.6e-5 +=group_time 0.441s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.4098.html +=logfile ct_framework.init_per_group.36354.html =group_props [{name,invalid_patterns},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 5.4e-5 +=elapsed 2.5e-5 =case binary_property_test_SUITE:compile_pattern_invalid_pattern_case =logfile binary_property_test_suite.compile_pattern_invalid_pattern_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:30 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.025727 +=elapsed 0.024212 =case binary_property_test_SUITE:match_invalid_pattern_case =logfile binary_property_test_suite.match_invalid_pattern_case.html -=started 2024-09-11 11:11:30 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.027482 +=elapsed 0.028036 =case binary_property_test_SUITE:matches_invalid_pattern_case =logfile binary_property_test_suite.matches_invalid_pattern_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.031941 +=elapsed 0.023319 =case binary_property_test_SUITE:replace_invalid_pattern_case =logfile binary_property_test_suite.replace_invalid_pattern_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.032752 +=elapsed 0.033011 =case binary_property_test_SUITE:split_invalid_pattern_case =logfile binary_property_test_suite.split_invalid_pattern_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.026936 +=elapsed 0.028932 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.4290.html +=logfile ct_framework.end_per_group.36546.html =group_props [{name,invalid_patterns},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 2.3e-5 -=group_time 0.278s +=elapsed 2.6e-5 +=group_time 0.272s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.4322.html +=logfile ct_framework.init_per_group.36578.html =group_props [{name,misc_invalid},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 2.5e-5 +=elapsed 4.4e-5 =case binary_property_test_SUITE:copy_2_invalid_n_case =logfile binary_property_test_suite.copy_2_invalid_n_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.00148 +=elapsed 0.001675 =case binary_property_test_SUITE:decode_hex_invalid_chars_case =logfile binary_property_test_suite.decode_hex_invalid_chars_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.00144 +=elapsed 0.001579 =case binary_property_test_SUITE:decode_unsigned_2_invalid_endianness_case =logfile binary_property_test_suite.decode_unsigned_2_invalid_endianness_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.005028 +=elapsed 0.006324 =case binary_property_test_SUITE:encode_hex_2_invalid_case_case =logfile binary_property_test_suite.encode_hex_2_invalid_case_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.006468 +=elapsed 0.004772 =case binary_property_test_SUITE:encode_unsigned_invalid_integer_case =logfile binary_property_test_suite.encode_unsigned_invalid_integer_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 9.98e-4 +=elapsed 0.001164 =case binary_property_test_SUITE:encode_unsigned_2_invalid_endianness_case =logfile binary_property_test_suite.encode_unsigned_2_invalid_endianness_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.005481 +=elapsed 0.005326 =case binary_property_test_SUITE:list_to_bin_invalid_bytes_case =logfile binary_property_test_suite.list_to_bin_invalid_bytes_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.001517 +=elapsed 0.001731 =case binary_property_test_SUITE:replace_invalid_replacement_case =logfile binary_property_test_suite.replace_invalid_replacement_case.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.010587 +=elapsed 0.010621 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.4610.html +=logfile ct_framework.end_per_group.36866.html =group_props [{name,misc_invalid},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 2.5e-5 -=group_time 0.233s +=elapsed 4.3e-5 +=group_time 0.236s =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.4642.html +=logfile ct_framework.end_per_group.36898.html =group_props [{name,invalid_input},{suite,binary_property_test_SUITE}] -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 2.4e-5 -=group_time 1.314s +=elapsed 2.5e-5 +=group_time 1.327s =case binary_property_test_SUITE:end_per_suite =logfile binary_property_test_suite.end_per_suite.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok =elapsed 0.0 -=group_time 3.142s +=group_time 3.185s =case c_SUITE:init_per_suite =logfile c_suite.init_per_suite.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok =elapsed 0.0 =case c_SUITE:c_1 =logfile c_suite.c_1.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.00253 +=elapsed 0.002917 =case c_SUITE:c_2 =logfile c_suite.c_2.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.002409 +=elapsed 0.002484 =case c_SUITE:c_3 =logfile c_suite.c_3.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.005223 +=elapsed 0.005457 =case c_SUITE:c_4 =logfile c_suite.c_4.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.004291 +=elapsed 0.005564 =case c_SUITE:nc_1 =logfile c_suite.nc_1.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.001484 +=elapsed 0.001651 =case c_SUITE:nc_2 =logfile c_suite.nc_2.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.001918 +=elapsed 0.001791 =case c_SUITE:nc_3 =logfile c_suite.nc_3.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.001908 +=elapsed 0.001758 =case c_SUITE:nc_4 =logfile c_suite.nc_4.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.001852 +=elapsed 0.00196 =case c_SUITE:c_default_outdir_1 =logfile c_suite.c_default_outdir_1.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:39 =result ok -=elapsed 0.003828 +=elapsed 0.005611 =case c_SUITE:c_default_outdir_2 =logfile c_suite.c_default_outdir_2.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:39 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.006173 +=elapsed 0.005533 =case c_SUITE:nc_default_outdir_1 =logfile c_suite.nc_default_outdir_1.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.001648 +=elapsed 0.001896 =case c_SUITE:nc_default_outdir_2 =logfile c_suite.nc_default_outdir_2.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.001999 +=elapsed 0.00185 =case c_SUITE:ls =logfile c_suite.ls.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 5.55e-4 +=elapsed 3.01e-4 =case c_SUITE:memory =logfile c_suite.memory.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 7.48e-4 +=elapsed 0.001589 =case c_SUITE:end_per_suite =logfile c_suite.end_per_suite.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 0.0 -=group_time 0.387s +=group_time 0.389s =case calendar_SUITE:init_per_suite =logfile calendar_suite.init_per_suite.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 0.0 =case calendar_SUITE:gregorian_days =logfile calendar_suite.gregorian_days.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.003874 +=elapsed 0.003822 =case calendar_SUITE:gregorian_seconds =logfile calendar_suite.gregorian_seconds.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:31 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.002056 +=elapsed 0.001997 =case calendar_SUITE:day_of_the_week =logfile calendar_suite.day_of_the_week.html -=started 2024-09-11 11:11:31 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.004017 +=elapsed 0.003978 =case calendar_SUITE:day_of_the_week_calibrate =logfile calendar_suite.day_of_the_week_calibrate.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case calendar_SUITE:leap_years =logfile calendar_suite.leap_years.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 1.0e-6 =case calendar_SUITE:last_day_of_the_month =logfile calendar_suite.last_day_of_the_month.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 1.6e-5 +=elapsed 1.4e-5 =case calendar_SUITE:local_time_to_universal_time_dst =logfile calendar_suite.local_time_to_universal_time_dst.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.002641 +=elapsed 0.002687 =case calendar_SUITE:iso_week_number =logfile calendar_suite.iso_week_number.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 2.0e-6 =case calendar_SUITE:system_time =logfile calendar_suite.system_time.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 2.0e-5 +=elapsed 2.5e-5 =case calendar_SUITE:rfc3339 =logfile calendar_suite.rfc3339.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 1.37e-4 +=elapsed 2.2e-4 =case calendar_SUITE:big_gregorian_days =logfile calendar_suite.big_gregorian_days.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.001274 +=elapsed 0.001269 =case calendar_SUITE:end_per_suite =logfile calendar_suite.end_per_suite.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 0.0 -=group_time 0.287s +=group_time 0.283s =case dets_SUITE:init_per_suite =logfile dets_suite.init_per_suite.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok =elapsed 1.0e-6 =case dets_SUITE:basic =logfile dets_suite.basic.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:40 =result ok -=elapsed 0.016677 +=elapsed 0.01666 =case dets_SUITE:open =logfile dets_suite.open.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:32 +=started 2024-09-12 10:33:40 +=ended 2024-09-12 10:33:41 =result ok -=elapsed 0.609905 +=elapsed 0.609718 =case dets_SUITE:sets =logfile dets_suite.sets.html -=started 2024-09-11 11:11:32 -=ended 2024-09-11 11:11:33 +=started 2024-09-12 10:33:41 +=ended 2024-09-12 10:33:41 =result ok -=elapsed 0.345619 +=elapsed 0.351104 =case dets_SUITE:bags =logfile dets_suite.bags.html -=started 2024-09-11 11:11:33 -=ended 2024-09-11 11:11:33 +=started 2024-09-12 10:33:41 +=ended 2024-09-12 10:33:41 =result ok -=elapsed 0.438761 +=elapsed 0.444547 =case dets_SUITE:duplicate_bags =logfile dets_suite.duplicate_bags.html -=started 2024-09-11 11:11:33 -=ended 2024-09-11 11:11:34 +=started 2024-09-12 10:33:41 +=ended 2024-09-12 10:33:42 =result ok -=elapsed 0.539135 +=elapsed 0.600119 =case dets_SUITE:newly_started =logfile dets_suite.newly_started.html -=started 2024-09-11 11:11:34 -=ended 2024-09-11 11:11:34 +=started 2024-09-12 10:33:42 +=ended 2024-09-12 10:33:42 =result ok -=elapsed 0.156433 +=elapsed 0.157174 =case dets_SUITE:open_file =logfile dets_suite.open_file.html -=started 2024-09-11 11:11:34 -=ended 2024-09-11 11:11:34 +=started 2024-09-12 10:33:42 +=ended 2024-09-12 10:33:42 =result ok -=elapsed 0.065592 +=elapsed 0.072459 =case dets_SUITE:init_table =logfile dets_suite.init_table.html -=started 2024-09-11 11:11:34 -=ended 2024-09-11 11:11:36 +=started 2024-09-12 10:33:42 +=ended 2024-09-12 10:33:44 =result ok -=elapsed 1.60331 +=elapsed 1.394347 =case dets_SUITE:repair =logfile dets_suite.repair.html -=started 2024-09-11 11:11:36 -=ended 2024-09-11 11:11:38 +=started 2024-09-12 10:33:44 +=ended 2024-09-12 10:33:45 =result ok -=elapsed 2.394702 +=elapsed 1.606682 =case dets_SUITE:access =logfile dets_suite.access.html -=started 2024-09-11 11:11:38 -=ended 2024-09-11 11:11:38 +=started 2024-09-12 10:33:45 +=ended 2024-09-12 10:33:45 =result ok -=elapsed 0.007624 +=elapsed 0.0038 =case dets_SUITE:oldbugs =logfile dets_suite.oldbugs.html -=started 2024-09-11 11:11:38 -=ended 2024-09-11 11:11:38 +=started 2024-09-12 10:33:45 +=ended 2024-09-12 10:33:45 =result ok -=elapsed 0.002443 +=elapsed 0.002199 =case dets_SUITE:truncated_segment_array =logfile dets_suite.truncated_segment_array.html -=started 2024-09-11 11:11:38 -=ended 2024-09-11 11:11:38 +=started 2024-09-12 10:33:45 +=ended 2024-09-12 10:33:45 =result ok -=elapsed 0.003748 +=elapsed 0.00328 =case dets_SUITE:dirty_mark =logfile dets_suite.dirty_mark.html -=started 2024-09-11 11:11:38 -=ended 2024-09-11 11:11:38 +=started 2024-09-12 10:33:45 +=ended 2024-09-12 10:33:46 =result ok -=elapsed 0.176829 +=elapsed 0.171574 =case dets_SUITE:dirty_mark2 =logfile dets_suite.dirty_mark2.html -=started 2024-09-11 11:11:38 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:46 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 2.286277 +=elapsed 2.284757 =case dets_SUITE:bag_next =logfile dets_suite.bag_next.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.004081 +=elapsed 0.004507 =case dets_SUITE:phash =logfile dets_suite.phash.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.004826 +=elapsed 0.004798 =case dets_SUITE:fold =logfile dets_suite.fold.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.004695 +=elapsed 0.004957 =case dets_SUITE:fixtable =logfile dets_suite.fixtable.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.023594 +=elapsed 0.023533 =case dets_SUITE:match =logfile dets_suite.match.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.019133 +=elapsed 0.023703 =case dets_SUITE:select =logfile dets_suite.select.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.011298 +=elapsed 0.011425 =case dets_SUITE:update_counter =logfile dets_suite.update_counter.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.003062 +=elapsed 0.003144 =case dets_SUITE:badarg =logfile dets_suite.badarg.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:41 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:48 =result ok -=elapsed 0.002683 +=elapsed 0.002866 =case dets_SUITE:cache_sets =logfile dets_suite.cache_sets.html -=started 2024-09-11 11:11:41 -=ended 2024-09-11 11:11:45 +=started 2024-09-12 10:33:48 +=ended 2024-09-12 10:33:52 =result ok -=elapsed 4.229345 +=elapsed 4.220111 =case dets_SUITE:cache_bags =logfile dets_suite.cache_bags.html -=started 2024-09-11 11:11:45 -=ended 2024-09-11 11:11:50 +=started 2024-09-12 10:33:53 +=ended 2024-09-12 10:33:58 =result ok -=elapsed 5.041371 +=elapsed 5.088539 =case dets_SUITE:cache_duplicate_bags =logfile dets_suite.cache_duplicate_bags.html -=started 2024-09-11 11:11:50 -=ended 2024-09-11 11:11:55 +=started 2024-09-12 10:33:58 +=ended 2024-09-12 10:34:03 =result ok -=elapsed 5.084939 +=elapsed 5.092181 =case dets_SUITE:otp_4208 =logfile dets_suite.otp_4208.html -=started 2024-09-11 11:11:55 -=ended 2024-09-11 11:11:55 +=started 2024-09-12 10:34:03 +=ended 2024-09-12 10:34:03 =result ok -=elapsed 8.53e-4 +=elapsed 8.82e-4 =case dets_SUITE:otp_4989 =logfile dets_suite.otp_4989.html -=started 2024-09-11 11:11:55 -=ended 2024-09-11 11:11:56 +=started 2024-09-12 10:34:03 +=ended 2024-09-12 10:34:03 =result ok -=elapsed 0.222533 +=elapsed 0.220015 =case dets_SUITE:many_clients =logfile dets_suite.many_clients.html -=started 2024-09-11 11:11:56 -=ended 2024-09-11 11:11:56 +=started 2024-09-12 10:34:03 +=ended 2024-09-12 10:34:03 =result ok -=elapsed 0.068285 +=elapsed 0.069161 =case dets_SUITE:otp_4906 =logfile dets_suite.otp_4906.html -=started 2024-09-11 11:11:56 -=ended 2024-09-11 11:12:01 +=started 2024-09-12 10:34:03 +=ended 2024-09-12 10:34:09 =result ok -=elapsed 5.427985 +=elapsed 5.412001 =case dets_SUITE:otp_5402 =logfile dets_suite.otp_5402.html -=started 2024-09-11 11:12:01 -=ended 2024-09-11 11:12:06 +=started 2024-09-12 10:34:09 +=ended 2024-09-12 10:34:14 =result ok -=elapsed 5.001473 +=elapsed 5.001232 =case dets_SUITE:simultaneous_open =logfile dets_suite.simultaneous_open.html -=started 2024-09-11 11:12:06 -=ended 2024-09-11 11:12:16 +=started 2024-09-12 10:34:14 +=ended 2024-09-12 10:34:23 =result ok -=elapsed 9.808584 +=elapsed 9.879177 =case dets_SUITE:insert_new =logfile dets_suite.insert_new.html -=started 2024-09-11 11:12:16 -=ended 2024-09-11 11:12:16 +=started 2024-09-12 10:34:23 +=ended 2024-09-12 10:34:23 =result ok -=elapsed 8.74e-4 +=elapsed 7.78e-4 =case dets_SUITE:repair_continuation =logfile dets_suite.repair_continuation.html -=started 2024-09-11 11:12:16 -=ended 2024-09-11 11:12:16 +=started 2024-09-12 10:34:23 +=ended 2024-09-12 10:34:23 =result ok -=elapsed 0.006045 +=elapsed 0.005065 =case dets_SUITE:otp_5487 =logfile dets_suite.otp_5487.html -=started 2024-09-11 11:12:16 -=ended 2024-09-11 11:12:16 +=started 2024-09-12 10:34:23 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.002988 +=elapsed 0.003763 =case dets_SUITE:otp_6206 =logfile dets_suite.otp_6206.html -=started 2024-09-11 11:12:16 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.366466 +=elapsed 0.400207 =case dets_SUITE:otp_6359 =logfile dets_suite.otp_6359.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 2.86e-4 +=elapsed 2.87e-4 =case dets_SUITE:otp_4738 =logfile dets_suite.otp_4738.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.007905 +=elapsed 0.011819 =case dets_SUITE:otp_7146 =logfile dets_suite.otp_7146.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.032056 +=elapsed 0.11953 =case dets_SUITE:otp_8070 =logfile dets_suite.otp_8070.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 3.24e-4 +=elapsed 4.95e-4 =case dets_SUITE:otp_8856 =logfile dets_suite.otp_8856.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 6.24e-4 +=elapsed 8.39e-4 =case dets_SUITE:otp_8898 =logfile dets_suite.otp_8898.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.007767 +=elapsed 0.008357 =case dets_SUITE:otp_8899 =logfile dets_suite.otp_8899.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.008892 +=elapsed 0.008427 =case dets_SUITE:otp_8903 =logfile dets_suite.otp_8903.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 5.77e-4 +=elapsed 9.29e-4 =case dets_SUITE:otp_8923 =logfile dets_suite.otp_8923.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.003922 +=elapsed 0.00472 =case dets_SUITE:otp_9282 =logfile dets_suite.otp_9282.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.001082 +=elapsed 0.001669 =case dets_SUITE:otp_11245 =logfile dets_suite.otp_11245.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.019552 +=elapsed 0.058831 =case dets_SUITE:otp_11709 =logfile dets_suite.otp_11709.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 0.029917 +=elapsed 0.029535 =case dets_SUITE:otp_13229 =logfile dets_suite.otp_13229.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:24 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case dets_SUITE:otp_13260 =logfile dets_suite.otp_13260.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:24 +=ended 2024-09-12 10:34:25 =result ok -=elapsed 0.204349 +=elapsed 0.305124 =case dets_SUITE:otp_13830 =logfile dets_suite.otp_13830.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:17 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:25 =result ok -=elapsed 5.92e-4 +=elapsed 6.23e-4 =case dets_SUITE:receive_optimisation =logfile dets_suite.receive_optimisation.html -=started 2024-09-11 11:12:17 -=ended 2024-09-11 11:12:18 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:25 =result ok -=elapsed 0.146613 +=elapsed 0.147484 =case dets_SUITE:end_per_suite =logfile dets_suite.end_per_suite.html -=started 2024-09-11 11:12:18 -=ended 2024-09-11 11:12:18 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:25 =result ok =elapsed 1.0e-6 -=group_time 45.813s +=group_time 45.259s =case dict_SUITE:init_per_suite =logfile dict_suite.init_per_suite.html -=started 2024-09-11 11:12:18 -=ended 2024-09-11 11:12:18 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:25 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case dict_SUITE:create =logfile dict_suite.create.html -=started 2024-09-11 11:12:18 -=ended 2024-09-11 11:12:18 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:25 =result ok -=elapsed 2.4e-5 +=elapsed 2.9e-5 =case dict_SUITE:store =logfile dict_suite.store.html -=started 2024-09-11 11:12:18 -=ended 2024-09-11 11:12:18 +=started 2024-09-12 10:34:25 +=ended 2024-09-12 10:34:26 =result ok -=elapsed 0.481611 +=elapsed 0.456093 =case dict_SUITE:remove =logfile dict_suite.remove.html -=started 2024-09-11 11:12:18 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:26 +=ended 2024-09-12 10:34:26 =result ok -=elapsed 0.577496 +=elapsed 0.5533 =case dict_SUITE:iterate =logfile dict_suite.iterate.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:26 +=ended 2024-09-12 10:34:26 =result ok -=elapsed 0.106648 +=elapsed 0.107022 =case dict_SUITE:end_per_suite =logfile dict_suite.end_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:26 +=ended 2024-09-12 10:34:26 =result ok =elapsed 0.0 -=group_time 1.280s +=group_time 1.234s =case digraph_SUITE:init_per_suite =logfile digraph_suite.init_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:26 +=ended 2024-09-12 10:34:26 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case digraph_SUITE:opts =logfile digraph_suite.opts.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:26 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 1.27e-4 +=elapsed 1.78e-4 =case digraph_SUITE:degree =logfile digraph_suite.degree.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 7.3e-5 +=elapsed 1.04e-4 =case digraph_SUITE:path =logfile digraph_suite.path.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 7.8e-5 +=elapsed 1.14e-4 =case digraph_SUITE:cycle =logfile digraph_suite.cycle.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 9.6e-5 +=elapsed 1.39e-4 =case digraph_SUITE:init_per_group =logfile digraph_suite.init_per_group.html =group_props [{name,misc}] -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 =case digraph_SUITE:vertices =logfile digraph_suite.vertices.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 3.5e-5 =case digraph_SUITE:edges =logfile digraph_suite.edges.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 6.2e-5 +=elapsed 6.3e-5 =case digraph_SUITE:data =logfile digraph_suite.data.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 6.3e-5 =case digraph_SUITE:vertex_names =logfile digraph_suite.vertex_names.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 2.7e-5 =case digraph_SUITE:end_per_group =logfile digraph_suite.end_per_group.html =group_props [{name,misc}] -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 -=group_time 0.114s +=group_time 0.115s =case digraph_SUITE:init_per_group -=logfile digraph_suite.init_per_group.7138.html +=logfile digraph_suite.init_per_group.39426.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 =case digraph_SUITE:otp_3522 =logfile digraph_suite.otp_3522.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 7.5e-5 =case digraph_SUITE:otp_3630 =logfile digraph_suite.otp_3630.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 2.35e-4 +=elapsed 2.38e-4 =case digraph_SUITE:otp_8066 =logfile digraph_suite.otp_8066.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 1.94e-4 +=elapsed 0.0002 =case digraph_SUITE:end_per_group -=logfile digraph_suite.end_per_group.7170.html +=logfile digraph_suite.end_per_group.39458.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 =group_time 0.092s =case digraph_SUITE:vertex_names -=logfile digraph_suite.vertex_names.7202.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=logfile digraph_suite.vertex_names.39490.html +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 2.6e-5 =case digraph_SUITE:end_per_suite =logfile digraph_suite.end_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 -=group_time 0.389s +=group_time 0.395s =case digraph_utils_SUITE:init_per_suite =logfile digraph_utils_suite.init_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case digraph_utils_SUITE:simple =logfile digraph_utils_suite.simple.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 2.03e-4 +=elapsed 2.02e-4 =case digraph_utils_SUITE:loop =logfile digraph_utils_suite.loop.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 5.1e-5 +=elapsed 8.0e-5 =case digraph_utils_SUITE:isolated =logfile digraph_utils_suite.isolated.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 4.6e-5 +=elapsed 7.2e-5 =case digraph_utils_SUITE:topsort =logfile digraph_utils_suite.topsort.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 3.2e-5 +=elapsed 4.5e-5 =case digraph_utils_SUITE:subgraph =logfile digraph_utils_suite.subgraph.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 6.6e-5 +=elapsed 9.8e-5 =case digraph_utils_SUITE:condensation =logfile digraph_utils_suite.condensation.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 8.1e-5 +=elapsed 1.19e-4 =case digraph_utils_SUITE:tree =logfile digraph_utils_suite.tree.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 2.55e-4 +=elapsed 3.38e-4 =case digraph_utils_SUITE:end_per_suite =logfile digraph_utils_suite.end_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:19 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.0 -=group_time 0.182s +=elapsed 1.0e-6 +=group_time 0.188s =case edlin_context_SUITE:init_per_suite =logfile edlin_context_suite.init_per_suite.html -=started 2024-09-11 11:12:19 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case edlin_context_SUITE:get_context =logfile edlin_context_suite.get_context.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.012721 +=elapsed 0.012304 =case edlin_context_SUITE:end_per_suite =logfile edlin_context_suite.end_per_suite.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 -=group_time 0.061s +=group_time 0.064s =case edlin_expand_SUITE:init_per_suite =logfile edlin_expand_suite.init_per_suite.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok =elapsed 0.0 =case edlin_expand_SUITE:normal =logfile edlin_expand_suite.normal.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.03547 +=elapsed 0.033352 =case edlin_expand_SUITE:filename_completion =logfile edlin_expand_suite.filename_completion.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.039355 +=elapsed 0.036355 =case edlin_expand_SUITE:binding_completion =logfile edlin_expand_suite.binding_completion.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:20 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:27 =result ok -=elapsed 0.009756 +=elapsed 0.009908 =case edlin_expand_SUITE:get_coverage =logfile edlin_expand_suite.get_coverage.html -=started 2024-09-11 11:12:20 -=ended 2024-09-11 11:12:22 +=started 2024-09-12 10:34:27 +=ended 2024-09-12 10:34:29 =result ok -=elapsed 1.863047 +=elapsed 1.808087 =case edlin_expand_SUITE:type_completion =logfile edlin_expand_suite.type_completion.html -=started 2024-09-11 11:12:22 -=ended 2024-09-11 11:12:27 -=result skipped: "Expansion too slow (5417815) on this machine" +=started 2024-09-12 10:34:29 +=ended 2024-09-12 10:34:35 +=result skipped: "Expansion too slow (5407207) on this machine" === *** SKIPPED test case 278 *** =case edlin_expand_SUITE:record_completion =logfile edlin_expand_suite.record_completion.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:27 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.061194 +=elapsed 0.066516 =case edlin_expand_SUITE:fun_completion =logfile edlin_expand_suite.fun_completion.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:27 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.044571 +=elapsed 0.043242 =case edlin_expand_SUITE:map_completion =logfile edlin_expand_suite.map_completion.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:27 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.009009 +=elapsed 0.008765 =case edlin_expand_SUITE:function_parameter_completion =logfile edlin_expand_suite.function_parameter_completion.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:27 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.115334 +=elapsed 0.113808 =case edlin_expand_SUITE:no_completion =logfile edlin_expand_suite.no_completion.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:27 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.00608 +=elapsed 0.005947 =case edlin_expand_SUITE:quoted_fun =logfile edlin_expand_suite.quoted_fun.html -=started 2024-09-11 11:12:27 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.041569 +=elapsed 0.046113 =case edlin_expand_SUITE:quoted_module =logfile edlin_expand_suite.quoted_module.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.018715 +=elapsed 0.019607 =case edlin_expand_SUITE:quoted_both =logfile edlin_expand_suite.quoted_both.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.03098 +=elapsed 0.031562 =case edlin_expand_SUITE:erl_1152 =logfile edlin_expand_suite.erl_1152.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok =elapsed 1.9e-5 =case edlin_expand_SUITE:check_trailing =logfile edlin_expand_suite.check_trailing.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 3.4e-5 +=elapsed 3.1e-5 =case edlin_expand_SUITE:invalid_module =logfile edlin_expand_suite.invalid_module.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.033026 +=elapsed 0.031346 =case edlin_expand_SUITE:unicode =logfile edlin_expand_suite.unicode.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.010708 +=elapsed 0.011424 =case edlin_expand_SUITE:end_per_suite =logfile edlin_expand_suite.end_per_suite.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.002971 -=group_time 8.225s +=elapsed 0.003232 +=group_time 8.161s =case epp_SUITE:init_per_suite =logfile epp_suite.init_per_suite.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok =elapsed 0.0 =case epp_SUITE:rec_1 =logfile epp_suite.rec_1.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 0.001248 +=elapsed 0.001254 =case epp_SUITE:init_per_group =logfile epp_suite.init_per_group.html =group_props [{name,upcase_mac}] -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok =elapsed 0.0 =case epp_SUITE:upcase_mac_1 =logfile epp_suite.upcase_mac_1.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 3.67e-4 +=elapsed 4.44e-4 =case epp_SUITE:upcase_mac_2 =logfile epp_suite.upcase_mac_2.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:35 =result ok -=elapsed 3.54e-4 +=elapsed 3.78e-4 =case epp_SUITE:end_per_group =logfile epp_suite.end_per_group.html =group_props [{name,upcase_mac}] -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:35 +=ended 2024-09-12 10:34:36 =result ok =elapsed 0.0 -=group_time 0.070s +=group_time 0.071s =case epp_SUITE:include_local =logfile epp_suite.include_local.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 6.24e-4 +=elapsed 6.35e-4 =case epp_SUITE:predef_mac =logfile epp_suite.predef_mac.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 3.76e-4 +=elapsed 3.72e-4 =case epp_SUITE:init_per_group -=logfile epp_suite.init_per_group.7234.html +=logfile epp_suite.init_per_group.39522.html =group_props [{name,variable}] -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok =elapsed 0.0 =case epp_SUITE:variable_1 =logfile epp_suite.variable_1.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 7.58e-4 +=elapsed 7.29e-4 =case epp_SUITE:end_per_group -=logfile epp_suite.end_per_group.7266.html +=logfile epp_suite.end_per_group.39554.html =group_props [{name,variable}] -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok =elapsed 0.0 -=group_time 0.047s +=group_time 0.046s =case epp_SUITE:otp_4870 =logfile epp_suite.otp_4870.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 7.72e-4 +=elapsed 7.71e-4 =case epp_SUITE:otp_4871 =logfile epp_suite.otp_4871.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 0.004037 +=elapsed 0.004093 =case epp_SUITE:otp_5362 =logfile epp_suite.otp_5362.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 0.009475 +=elapsed 0.009522 =case epp_SUITE:pmod =logfile epp_suite.pmod.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 2.18e-4 +=elapsed 2.81e-4 =case epp_SUITE:not_circular =logfile epp_suite.not_circular.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 0.157893 +=elapsed 0.156888 =case epp_SUITE:skip_header =logfile epp_suite.skip_header.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 4.57e-4 +=elapsed 3.34e-4 =case epp_SUITE:otp_6277 =logfile epp_suite.otp_6277.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 8.18e-4 +=elapsed 6.74e-4 =case epp_SUITE:gh_4995 =logfile epp_suite.gh_4995.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 7.04e-4 +=elapsed 5.73e-4 =case epp_SUITE:otp_7702 =logfile epp_suite.otp_7702.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:28 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:36 =result ok -=elapsed 0.002561 +=elapsed 0.002227 =case epp_SUITE:otp_8130 =logfile epp_suite.otp_8130.html -=started 2024-09-11 11:12:28 -=ended 2024-09-11 11:12:31 +=started 2024-09-12 10:34:36 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 2.669461 +=elapsed 2.631588 =case epp_SUITE:overload_mac =logfile epp_suite.overload_mac.html -=started 2024-09-11 11:12:31 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 0.479792 +=elapsed 0.467683 =case epp_SUITE:otp_8388 =logfile epp_suite.otp_8388.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 0.00617 +=elapsed 0.006834 =case epp_SUITE:otp_8470 =logfile epp_suite.otp_8470.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 3.52e-4 +=elapsed 3.87e-4 =case epp_SUITE:otp_8562 =logfile epp_suite.otp_8562.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 0.001103 +=elapsed 0.001091 =case epp_SUITE:otp_8665 =logfile epp_suite.otp_8665.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 8.84e-4 +=elapsed 9.76e-4 =case epp_SUITE:otp_8911 =logfile epp_suite.otp_8911.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 0.012591 +=elapsed 0.013104 =case epp_SUITE:otp_10302 =logfile epp_suite.otp_10302.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:32 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:39 =result ok -=elapsed 0.132495 +=elapsed 0.135884 =case epp_SUITE:otp_10820 =logfile epp_suite.otp_10820.html -=started 2024-09-11 11:12:32 -=ended 2024-09-11 11:12:33 +=started 2024-09-12 10:34:39 +=ended 2024-09-12 10:34:40 =result ok -=elapsed 0.65199 +=elapsed 0.66037 =case epp_SUITE:otp_11728 =logfile epp_suite.otp_11728.html -=started 2024-09-11 11:12:33 -=ended 2024-09-11 11:12:33 +=started 2024-09-12 10:34:40 +=ended 2024-09-12 10:34:40 =result ok -=elapsed 0.001014 +=elapsed 8.13e-4 =case epp_SUITE:encoding =logfile epp_suite.encoding.html -=started 2024-09-11 11:12:33 -=ended 2024-09-11 11:12:33 +=started 2024-09-12 10:34:40 +=ended 2024-09-12 10:34:40 =result ok -=elapsed 0.001704 +=elapsed 0.002274 =case epp_SUITE:extends =logfile epp_suite.extends.html -=started 2024-09-11 11:12:33 -=ended 2024-09-11 11:12:33 +=started 2024-09-12 10:34:40 +=ended 2024-09-12 10:34:40 =result ok -=elapsed 0.154441 +=elapsed 0.15724 =case epp_SUITE:function_macro =logfile epp_suite.function_macro.html -=started 2024-09-11 11:12:33 -=ended 2024-09-11 11:12:33 +=started 2024-09-12 10:34:40 +=ended 2024-09-12 10:34:41 =result ok -=elapsed 0.635106 +=elapsed 0.653432 =case epp_SUITE:test_error =logfile epp_suite.test_error.html -=started 2024-09-11 11:12:34 -=ended 2024-09-11 11:12:34 +=started 2024-09-12 10:34:41 +=ended 2024-09-12 10:34:41 =result ok -=elapsed 0.003125 +=elapsed 0.003111 =case epp_SUITE:test_warning =logfile epp_suite.test_warning.html -=started 2024-09-11 11:12:34 -=ended 2024-09-11 11:12:34 +=started 2024-09-12 10:34:41 +=ended 2024-09-12 10:34:41 =result ok -=elapsed 0.00593 +=elapsed 0.007273 =case epp_SUITE:otp_14285 =logfile epp_suite.otp_14285.html -=started 2024-09-11 11:12:34 -=ended 2024-09-11 11:12:34 +=started 2024-09-12 10:34:41 +=ended 2024-09-12 10:34:41 =result ok -=elapsed 0.001151 +=elapsed 0.001277 =case epp_SUITE:test_if =logfile epp_suite.test_if.html -=started 2024-09-11 11:12:34 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:41 +=ended 2024-09-12 10:34:42 =result ok -=elapsed 1.139802 +=elapsed 1.171062 =case epp_SUITE:source_name =logfile epp_suite.source_name.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:42 +=ended 2024-09-12 10:34:42 =result ok -=elapsed 0.001215 +=elapsed 0.00109 =case epp_SUITE:otp_16978 =logfile epp_suite.otp_16978.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:42 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.473777 +=elapsed 0.487348 =case epp_SUITE:otp_16824 =logfile epp_suite.otp_16824.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.040991 +=elapsed 0.047685 =case epp_SUITE:scan_file =logfile epp_suite.scan_file.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 5.34e-4 +=elapsed 6.46e-4 =case epp_SUITE:file_macro =logfile epp_suite.file_macro.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 5.21e-4 +=elapsed 5.29e-4 =case epp_SUITE:deterministic_include =logfile epp_suite.deterministic_include.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.001025 +=elapsed 9.78e-4 =case epp_SUITE:nondeterministic_include =logfile epp_suite.nondeterministic_include.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:35 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.001009 +=elapsed 9.28e-4 =case epp_SUITE:gh_8268 =logfile epp_suite.gh_8268.html -=started 2024-09-11 11:12:35 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.309197 +=elapsed 0.318196 =case epp_SUITE:moduledoc_include =logfile epp_suite.moduledoc_include.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok -=elapsed 0.001628 +=elapsed 0.001437 =case epp_SUITE:end_per_suite =logfile epp_suite.end_per_suite.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok =elapsed 0.0 -=group_time 7.965s +=group_time 8.013s =case erl_anno_SUITE:init_per_suite =logfile erl_anno_suite.init_per_suite.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok =elapsed 0.0 =case erl_anno_SUITE:init_per_group =logfile erl_anno_suite.init_per_group.html =group_props [{name,anno}] -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok =elapsed 0.0 =case erl_anno_SUITE:new =logfile erl_anno_suite.new.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:43 =result ok =elapsed 2.0e-6 =case erl_anno_SUITE:is_anno =logfile erl_anno_suite.is_anno.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:43 +=ended 2024-09-12 10:34:44 =result ok =elapsed 4.0e-6 =case erl_anno_SUITE:generated =logfile erl_anno_suite.generated.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 2.9e-5 +=elapsed 3.0e-5 =case erl_anno_SUITE:end_location =logfile erl_anno_suite.end_location.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 1.5e-5 +=elapsed 1.3e-5 =case erl_anno_SUITE:file =logfile erl_anno_suite.file.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 1.0e-5 =case erl_anno_SUITE:line =logfile erl_anno_suite.line.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 9.0e-6 +=elapsed 7.0e-6 =case erl_anno_SUITE:location =logfile erl_anno_suite.location.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 2.6e-5 +=elapsed 1.8e-5 =case erl_anno_SUITE:record =logfile erl_anno_suite.record.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.6e-5 +=elapsed 2.6e-5 =case erl_anno_SUITE:text =logfile erl_anno_suite.text.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 1.3e-5 +=elapsed 1.0e-5 =case erl_anno_SUITE:bad =logfile erl_anno_suite.bad.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 9.0e-6 +=elapsed 7.0e-6 =case erl_anno_SUITE:end_per_group =logfile erl_anno_suite.end_per_group.html =group_props [{name,anno}] -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 0.0 -=group_time 0.251s +=group_time 0.244s =case erl_anno_SUITE:init_per_group -=logfile erl_anno_suite.init_per_group.8962.html +=logfile erl_anno_suite.init_per_group.40866.html =group_props [{name,parse}] -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 0.0 =case erl_anno_SUITE:parse_abstract =logfile erl_anno_suite.parse_abstract.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.2e-5 +=elapsed 2.6e-5 =case erl_anno_SUITE:mapfold_anno =logfile erl_anno_suite.mapfold_anno.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.0e-5 +=elapsed 2.4e-5 =case erl_anno_SUITE:end_per_group -=logfile erl_anno_suite.end_per_group.8994.html +=logfile erl_anno_suite.end_per_group.40898.html =group_props [{name,parse}] -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 0.0 -=group_time 0.069s +=group_time 0.067s =case erl_anno_SUITE:end_per_suite =logfile erl_anno_suite.end_per_suite.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 0.0 -=group_time 0.394s +=group_time 0.382s =case erl_eval_SUITE:init_per_suite =logfile erl_eval_suite.init_per_suite.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case erl_eval_SUITE:guard_1 =logfile erl_eval_suite.guard_1.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 4.7e-5 +=elapsed 5.2e-5 =case erl_eval_SUITE:guard_2 =logfile erl_eval_suite.guard_2.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 2.7e-5 +=elapsed 2.8e-5 =case erl_eval_SUITE:match_pattern =logfile erl_eval_suite.match_pattern.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 5.42e-4 +=elapsed 5.45e-4 =case erl_eval_SUITE:string_plusplus =logfile erl_eval_suite.string_plusplus.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.26e-4 +=elapsed 3.22e-4 =case erl_eval_SUITE:pattern_expr =logfile erl_eval_suite.pattern_expr.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 1.8e-4 +=elapsed 2.21e-4 =case erl_eval_SUITE:match_bin =logfile erl_eval_suite.match_bin.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.09e-4 +=elapsed 3.23e-4 =case erl_eval_SUITE:guard_3 =logfile erl_eval_suite.guard_3.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.86e-4 +=elapsed 3.84e-4 =case erl_eval_SUITE:guard_4 =logfile erl_eval_suite.guard_4.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 7.88e-4 +=elapsed 8.11e-4 =case erl_eval_SUITE:guard_5 =logfile erl_eval_suite.guard_5.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 3.0e-5 +=elapsed 4.2e-5 =case erl_eval_SUITE:lc =logfile erl_eval_suite.lc.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:36 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 8.39e-4 +=elapsed 8.5e-4 =case erl_eval_SUITE:simple_cases =logfile erl_eval_suite.simple_cases.html -=started 2024-09-11 11:12:36 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.106816 +=elapsed 0.106825 =case erl_eval_SUITE:unary_plus =logfile erl_eval_suite.unary_plus.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 5.4e-5 +=elapsed 5.5e-5 =case erl_eval_SUITE:apply_atom =logfile erl_eval_suite.apply_atom.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 5.2e-5 +=elapsed 5.4e-5 =case erl_eval_SUITE:otp_5269 =logfile erl_eval_suite.otp_5269.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.001533 +=elapsed 0.001603 =case erl_eval_SUITE:otp_6539 =logfile erl_eval_suite.otp_6539.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 2.53e-4 +=elapsed 3.14e-4 =case erl_eval_SUITE:otp_6543 =logfile erl_eval_suite.otp_6543.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.005093 +=elapsed 0.005107 =case erl_eval_SUITE:otp_6787 =logfile erl_eval_suite.otp_6787.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.002003 +=elapsed 0.002137 =case erl_eval_SUITE:otp_6977 =logfile erl_eval_suite.otp_6977.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 1.22e-4 +=elapsed 1.25e-4 =case erl_eval_SUITE:otp_7550 =logfile erl_eval_suite.otp_7550.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.001534 +=elapsed 0.0016 =case erl_eval_SUITE:otp_8133 =logfile erl_eval_suite.otp_8133.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 7.34e-4 +=elapsed 7.51e-4 =case erl_eval_SUITE:otp_10622 =logfile erl_eval_suite.otp_10622.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.001054 +=elapsed 0.001049 =case erl_eval_SUITE:otp_13228 =logfile erl_eval_suite.otp_13228.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok =elapsed 1.1e-5 =case erl_eval_SUITE:otp_14826 =logfile erl_eval_suite.otp_14826.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:44 =result ok -=elapsed 0.002409 +=elapsed 0.001825 =case erl_eval_SUITE:funs =logfile erl_eval_suite.funs.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:44 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.071974 +=elapsed 0.071364 =case erl_eval_SUITE:custom_stacktrace =logfile erl_eval_suite.custom_stacktrace.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 2.17e-4 +=elapsed 2.14e-4 =case erl_eval_SUITE:try_catch =logfile erl_eval_suite.try_catch.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.002374 +=elapsed 0.002324 =case erl_eval_SUITE:eval_expr_5 =logfile erl_eval_suite.eval_expr_5.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok =elapsed 1.7e-5 =case erl_eval_SUITE:zero_width =logfile erl_eval_suite.zero_width.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 1.64e-4 +=elapsed 1.61e-4 =case erl_eval_SUITE:eep37 =logfile erl_eval_suite.eep37.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 5.7e-4 +=elapsed 5.28e-4 =case erl_eval_SUITE:eep43 =logfile erl_eval_suite.eep43.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.001154 +=elapsed 0.001148 =case erl_eval_SUITE:otp_15035 =logfile erl_eval_suite.otp_15035.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 5.9e-4 +=elapsed 6.26e-4 =case erl_eval_SUITE:otp_16439 =logfile erl_eval_suite.otp_16439.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 2.25e-4 +=elapsed 2.23e-4 =case erl_eval_SUITE:otp_14708 =logfile erl_eval_suite.otp_14708.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.001065 +=elapsed 9.93e-4 =case erl_eval_SUITE:otp_16545 =logfile erl_eval_suite.otp_16545.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 2.86e-4 +=elapsed 2.23e-4 =case erl_eval_SUITE:otp_16865 =logfile erl_eval_suite.otp_16865.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 2.99e-4 +=elapsed 2.45e-4 =case erl_eval_SUITE:eep49 =logfile erl_eval_suite.eep49.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.001122 +=elapsed 0.001046 =case erl_eval_SUITE:binary_and_map_aliases =logfile erl_eval_suite.binary_and_map_aliases.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 8.06e-4 +=elapsed 8.12e-4 =case erl_eval_SUITE:eep58 =logfile erl_eval_suite.eep58.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 8.9e-4 +=elapsed 8.15e-4 =case erl_eval_SUITE:end_per_suite =logfile erl_eval_suite.end_per_suite.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok =elapsed 0.0 -=group_time 1.094s +=group_time 1.084s =case erl_expand_records_SUITE:init_per_suite =logfile erl_expand_records_suite.init_per_suite.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok =elapsed 0.0 =case erl_expand_records_SUITE:attributes =logfile erl_expand_records_suite.attributes.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.003426 +=elapsed 0.003006 =case erl_expand_records_SUITE:expr =logfile erl_expand_records_suite.expr.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:37 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.081061 +=elapsed 0.086812 =case erl_expand_records_SUITE:guard =logfile erl_expand_records_suite.guard.html -=started 2024-09-11 11:12:37 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.001534 +=elapsed 0.001815 =case erl_expand_records_SUITE:init =logfile erl_expand_records_suite.init.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.019253 +=elapsed 0.025969 =case erl_expand_records_SUITE:pattern =logfile erl_expand_records_suite.pattern.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.018521 +=elapsed 0.018935 =case erl_expand_records_SUITE:strict =logfile erl_expand_records_suite.strict.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.012072 +=elapsed 0.014332 =case erl_expand_records_SUITE:update =logfile erl_expand_records_suite.update.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.009271 +=elapsed 0.00858 =case erl_expand_records_SUITE:maps =logfile erl_expand_records_suite.maps.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.007586 +=elapsed 0.009432 =case erl_expand_records_SUITE:side_effects =logfile erl_expand_records_suite.side_effects.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 4.0e-6 +=elapsed 2.0e-6 =case erl_expand_records_SUITE:init_per_group =logfile erl_expand_records_suite.init_per_group.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok =elapsed 0.0 =case erl_expand_records_SUITE:otp_5915 =logfile erl_expand_records_suite.otp_5915.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.053086 +=elapsed 0.05328 =case erl_expand_records_SUITE:otp_7931 =logfile erl_expand_records_suite.otp_7931.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:45 =result ok -=elapsed 0.02183 +=elapsed 0.021213 =case erl_expand_records_SUITE:otp_5990 =logfile erl_expand_records_suite.otp_5990.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:45 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.017813 +=elapsed 0.01858 =case erl_expand_records_SUITE:otp_7078 =logfile erl_expand_records_suite.otp_7078.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.013014 +=elapsed 0.010908 =case erl_expand_records_SUITE:end_per_group =logfile erl_expand_records_suite.end_per_group.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 0.0 -=group_time 0.224s +=group_time 0.220s =case erl_expand_records_SUITE:end_per_suite =logfile erl_expand_records_suite.end_per_suite.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 0.0 -=group_time 0.639s +=group_time 0.649s =case erl_internal_SUITE:init_per_suite =logfile erl_internal_suite.init_per_suite.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 0.0 =case erl_internal_SUITE:behav =logfile erl_internal_suite.behav.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 0.002097 =case erl_internal_SUITE:end_per_suite =logfile erl_internal_suite.end_per_suite.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 0.0 -=group_time 0.050s +=group_time 0.051s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.33027.html +=logfile ct_framework.init_per_suite.709.html =group_props [{suite,erl_lint_SUITE}] -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.33059.html +=logfile ct_framework.init_per_group.741.html =group_props [{suite,erl_lint_SUITE},{name,unused_vars_warn}] -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 3.1e-5 +=elapsed 3.3e-5 =case erl_lint_SUITE:unused_vars_warn_basic =logfile erl_lint_suite.unused_vars_warn_basic.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.016191 +=elapsed 0.016517 =case erl_lint_SUITE:unused_vars_warn_lc =logfile erl_lint_suite.unused_vars_warn_lc.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.130424 +=elapsed 0.13108 =case erl_lint_SUITE:unused_vars_warn_rec =logfile erl_lint_suite.unused_vars_warn_rec.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.016289 +=elapsed 0.016652 =case erl_lint_SUITE:unused_vars_warn_fun =logfile erl_lint_suite.unused_vars_warn_fun.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.013181 +=elapsed 0.013494 =case erl_lint_SUITE:unused_vars_OTP_4858 =logfile erl_lint_suite.unused_vars_otp_4858.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.002008 +=elapsed 0.001571 =case erl_lint_SUITE:unused_unsafe_vars_warn =logfile erl_lint_suite.unused_unsafe_vars_warn.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.008393 +=elapsed 0.009394 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.9026.html +=logfile ct_framework.end_per_group.40930.html =group_props [{suite,erl_lint_SUITE},{name,unused_vars_warn}] -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:38 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok =elapsed 3.3e-5 -=group_time 0.346s +=group_time 0.348s =case erl_lint_SUITE:export_vars_warn =logfile erl_lint_suite.export_vars_warn.html -=started 2024-09-11 11:12:38 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.007486 +=elapsed 0.008742 =case erl_lint_SUITE:shadow_vars =logfile erl_lint_suite.shadow_vars.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.003299 +=elapsed 0.00384 =case erl_lint_SUITE:unused_import =logfile erl_lint_suite.unused_import.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.002629 +=elapsed 0.002599 =case erl_lint_SUITE:unused_function =logfile erl_lint_suite.unused_function.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.007665 +=elapsed 0.007694 =case erl_lint_SUITE:unsafe_vars =logfile erl_lint_suite.unsafe_vars.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.013873 +=elapsed 0.013932 =case erl_lint_SUITE:unsafe_vars2 =logfile erl_lint_suite.unsafe_vars2.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.001941 +=elapsed 0.001923 =case erl_lint_SUITE:unsafe_vars_try =logfile erl_lint_suite.unsafe_vars_try.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.011779 +=elapsed 0.011748 =case erl_lint_SUITE:guard =logfile erl_lint_suite.guard.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.031237 +=elapsed 0.031666 =case erl_lint_SUITE:unsized_binary_in_bin_gen_pattern =logfile erl_lint_suite.unsized_binary_in_bin_gen_pattern.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.002534 +=elapsed 0.002572 =case erl_lint_SUITE:otp_4886 =logfile erl_lint_suite.otp_4886.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.00125 +=elapsed 0.001266 =case erl_lint_SUITE:otp_4988 =logfile erl_lint_suite.otp_4988.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:46 =result ok -=elapsed 0.001536 +=elapsed 0.001537 =case erl_lint_SUITE:otp_5091 =logfile erl_lint_suite.otp_5091.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:46 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.086116 +=elapsed 0.085412 =case erl_lint_SUITE:otp_5276 =logfile erl_lint_suite.otp_5276.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.002487 +=elapsed 0.001984 =case erl_lint_SUITE:otp_5338 =logfile erl_lint_suite.otp_5338.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.001441 +=elapsed 0.001113 =case erl_lint_SUITE:otp_5362 =logfile erl_lint_suite.otp_5362.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.144903 +=elapsed 0.145298 =case erl_lint_SUITE:otp_5371 =logfile erl_lint_suite.otp_5371.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.016757 +=elapsed 0.017246 =case erl_lint_SUITE:otp_7227 =logfile erl_lint_suite.otp_7227.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.0303 +=elapsed 0.031069 =case erl_lint_SUITE:binary_aliases =logfile erl_lint_suite.binary_aliases.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.010645 +=elapsed 0.01134 =case erl_lint_SUITE:otp_5494 =logfile erl_lint_suite.otp_5494.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.002261 +=elapsed 0.002432 =case erl_lint_SUITE:otp_5644 =logfile erl_lint_suite.otp_5644.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.002531 +=elapsed 0.002658 =case erl_lint_SUITE:otp_5878 =logfile erl_lint_suite.otp_5878.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.063494 +=elapsed 0.068037 =case erl_lint_SUITE:otp_5917 =logfile erl_lint_suite.otp_5917.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.001816 +=elapsed 0.002214 =case erl_lint_SUITE:otp_6585 =logfile erl_lint_suite.otp_6585.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.003106 +=elapsed 0.004244 =case erl_lint_SUITE:otp_6885 =logfile erl_lint_suite.otp_6885.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.001737 +=elapsed 0.002699 =case erl_lint_SUITE:otp_10436 =logfile erl_lint_suite.otp_10436.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:39 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.00199 +=elapsed 0.002855 =case erl_lint_SUITE:otp_11254 =logfile erl_lint_suite.otp_11254.html -=started 2024-09-11 11:12:39 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.001088 +=elapsed 0.00174 =case erl_lint_SUITE:otp_11772 =logfile erl_lint_suite.otp_11772.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.0023 +=elapsed 0.003235 =case erl_lint_SUITE:otp_11771 =logfile erl_lint_suite.otp_11771.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.002478 +=elapsed 0.003529 =case erl_lint_SUITE:otp_11872 =logfile erl_lint_suite.otp_11872.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.001292 +=elapsed 0.002058 =case erl_lint_SUITE:export_all =logfile erl_lint_suite.export_all.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.003561 +=elapsed 0.005006 =case erl_lint_SUITE:bif_clash =logfile erl_lint_suite.bif_clash.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.050152 +=elapsed 0.06052 =case erl_lint_SUITE:behaviour_basic =logfile erl_lint_suite.behaviour_basic.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.008899 +=elapsed 0.010104 =case erl_lint_SUITE:behaviour_multiple =logfile erl_lint_suite.behaviour_multiple.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.016333 +=elapsed 0.018814 =case erl_lint_SUITE:otp_11861 =logfile erl_lint_suite.otp_11861.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.04661 +=elapsed 0.048895 =case erl_lint_SUITE:otp_7550 =logfile erl_lint_suite.otp_7550.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:47 =result ok -=elapsed 0.002449 +=elapsed 0.002348 =case erl_lint_SUITE:otp_8051 =logfile erl_lint_suite.otp_8051.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:47 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001182 +=elapsed 9.83e-4 =case erl_lint_SUITE:format_warn =logfile erl_lint_suite.format_warn.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.037735 +=elapsed 0.036146 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.9058.html +=logfile ct_framework.init_per_group.40962.html =group_props [{name,on_load},{suite,erl_lint_SUITE}] -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 3.0e-5 +=elapsed 2.7e-5 =case erl_lint_SUITE:on_load_successful =logfile erl_lint_suite.on_load_successful.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.00679 +=elapsed 0.006192 =case erl_lint_SUITE:on_load_failing =logfile erl_lint_suite.on_load_failing.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.00566 +=elapsed 0.004854 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.9090.html +=logfile ct_framework.end_per_group.40994.html =group_props [{name,on_load},{suite,erl_lint_SUITE}] -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok =elapsed 2.9e-5 -=group_time 0.080s +=group_time 0.078s =case erl_lint_SUITE:too_many_arguments =logfile erl_lint_suite.too_many_arguments.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001736 +=elapsed 0.001456 =case erl_lint_SUITE:basic_errors =logfile erl_lint_suite.basic_errors.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.010983 +=elapsed 0.007352 =case erl_lint_SUITE:bin_syntax_errors =logfile erl_lint_suite.bin_syntax_errors.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.003763 +=elapsed 0.002784 =case erl_lint_SUITE:predef =logfile erl_lint_suite.predef.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.008811 +=elapsed 0.007631 =case erl_lint_SUITE:maps =logfile erl_lint_suite.maps.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.020508 +=elapsed 0.017173 =case erl_lint_SUITE:maps_type =logfile erl_lint_suite.maps_type.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.00561 +=elapsed 0.005003 =case erl_lint_SUITE:maps_parallel_match =logfile erl_lint_suite.maps_parallel_match.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.018888 +=elapsed 0.016165 =case erl_lint_SUITE:otp_11851 =logfile erl_lint_suite.otp_11851.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.007505 +=elapsed 0.005897 =case erl_lint_SUITE:otp_11879 =logfile erl_lint_suite.otp_11879.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 2.48e-4 +=elapsed 2.02e-4 =case erl_lint_SUITE:otp_13230 =logfile erl_lint_suite.otp_13230.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001641 +=elapsed 0.001002 =case erl_lint_SUITE:record_errors =logfile erl_lint_suite.record_errors.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001589 +=elapsed 0.00114 =case erl_lint_SUITE:otp_11879_cont =logfile erl_lint_suite.otp_11879_cont.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.010824 +=elapsed 0.008399 =case erl_lint_SUITE:non_latin1_module =logfile erl_lint_suite.non_latin1_module.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.007424 +=elapsed 0.005004 =case erl_lint_SUITE:illegal_module_name =logfile erl_lint_suite.illegal_module_name.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.006326 +=elapsed 0.005788 =case erl_lint_SUITE:otp_14323 =logfile erl_lint_suite.otp_14323.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:40 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.004629 +=elapsed 0.003207 =case erl_lint_SUITE:stacktrace_syntax =logfile erl_lint_suite.stacktrace_syntax.html -=started 2024-09-11 11:12:40 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.005398 +=elapsed 0.003903 =case erl_lint_SUITE:otp_14285 =logfile erl_lint_suite.otp_14285.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.005646 +=elapsed 0.00392 =case erl_lint_SUITE:otp_14378 =logfile erl_lint_suite.otp_14378.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.002363 +=elapsed 0.002055 =case erl_lint_SUITE:external_funs =logfile erl_lint_suite.external_funs.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.003412 +=elapsed 0.003137 =case erl_lint_SUITE:otp_15456 =logfile erl_lint_suite.otp_15456.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.005631 +=elapsed 0.004998 =case erl_lint_SUITE:otp_15563 =logfile erl_lint_suite.otp_15563.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001526 +=elapsed 0.001249 =case erl_lint_SUITE:unused_type =logfile erl_lint_suite.unused_type.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.006958 +=elapsed 0.005225 =case erl_lint_SUITE:binary_types =logfile erl_lint_suite.binary_types.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.004918 +=elapsed 0.003658 =case erl_lint_SUITE:removed =logfile erl_lint_suite.removed.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.002447 +=elapsed 0.00172 =case erl_lint_SUITE:otp_16516 =logfile erl_lint_suite.otp_16516.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.012591 +=elapsed 0.009396 =case erl_lint_SUITE:undefined_nifs =logfile erl_lint_suite.undefined_nifs.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.001402 +=elapsed 9.9e-4 =case erl_lint_SUITE:no_load_nif =logfile erl_lint_suite.no_load_nif.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.002327 +=elapsed 0.001974 =case erl_lint_SUITE:inline_nifs =logfile erl_lint_suite.inline_nifs.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.010948 +=elapsed 0.012015 =case erl_lint_SUITE:warn_missing_spec =logfile erl_lint_suite.warn_missing_spec.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:48 =result ok -=elapsed 0.017745 +=elapsed 0.016679 =case erl_lint_SUITE:otp_16824 =logfile erl_lint_suite.otp_16824.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:48 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.004206 +=elapsed 0.00369 =case erl_lint_SUITE:underscore_match =logfile erl_lint_suite.underscore_match.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.028412 +=elapsed 0.02825 =case erl_lint_SUITE:unused_record =logfile erl_lint_suite.unused_record.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.004304 +=elapsed 0.004273 =case erl_lint_SUITE:unused_type2 =logfile erl_lint_suite.unused_type2.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.013566 +=elapsed 0.014106 =case erl_lint_SUITE:eep49 =logfile erl_lint_suite.eep49.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.005934 +=elapsed 0.006911 =case erl_lint_SUITE:redefined_builtin_type =logfile erl_lint_suite.redefined_builtin_type.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.021906 +=elapsed 0.02355 =case erl_lint_SUITE:tilde_k =logfile erl_lint_suite.tilde_k.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.008026 +=elapsed 0.007734 =case erl_lint_SUITE:singleton_type_var_errors =logfile erl_lint_suite.singleton_type_var_errors.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.018163 +=elapsed 0.015839 =case erl_lint_SUITE:documentation_attributes =logfile erl_lint_suite.documentation_attributes.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.014998 +=elapsed 0.014969 =case erl_lint_SUITE:match_float_zero =logfile erl_lint_suite.match_float_zero.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.009878 +=elapsed 0.009412 =case erl_lint_SUITE:undefined_module =logfile erl_lint_suite.undefined_module.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.00104 +=elapsed 8.51e-4 =case erl_lint_SUITE:update_literal =logfile erl_lint_suite.update_literal.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.008459 +=elapsed 0.007398 =case erl_lint_SUITE:messages_with_jaro_suggestions =logfile erl_lint_suite.messages_with_jaro_suggestions.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.009877 +=elapsed 0.008155 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.9122.html +=logfile ct_framework.end_per_suite.41026.html =group_props [{suite,erl_lint_SUITE}] -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok =elapsed 0.0 -=group_time 3.258s +=group_time 3.248s =case erl_pp_SUITE:init_per_suite =logfile erl_pp_suite.init_per_suite.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok =elapsed 0.0 =case erl_pp_SUITE:init_per_group =logfile erl_pp_suite.init_per_group.html =group_props [{name,expr}] -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok =elapsed 0.0 =case erl_pp_SUITE:func =logfile erl_pp_suite.func.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.026474 +=elapsed 0.024345 =case erl_pp_SUITE:call =logfile erl_pp_suite.call.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:41 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.002606 +=elapsed 0.002212 =case erl_pp_SUITE:recs =logfile erl_pp_suite.recs.html -=started 2024-09-11 11:12:41 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.062164 +=elapsed 0.061813 =case erl_pp_SUITE:try_catch =logfile erl_pp_suite.try_catch.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.040589 +=elapsed 0.040805 =case erl_pp_SUITE:if_then =logfile erl_pp_suite.if_then.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.007134 +=elapsed 0.006858 =case erl_pp_SUITE:receive_after =logfile erl_pp_suite.receive_after.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.014155 +=elapsed 0.013853 =case erl_pp_SUITE:bits =logfile erl_pp_suite.bits.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.02266 +=elapsed 0.027424 =case erl_pp_SUITE:head_tail =logfile erl_pp_suite.head_tail.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.011897 +=elapsed 0.011994 =case erl_pp_SUITE:cond1 =logfile erl_pp_suite.cond1.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 2.5e-5 +=elapsed 2.6e-5 =case erl_pp_SUITE:block =logfile erl_pp_suite.block.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.002406 +=elapsed 0.002457 =case erl_pp_SUITE:case1 =logfile erl_pp_suite.case1.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.002782 +=elapsed 0.002797 =case erl_pp_SUITE:ops =logfile erl_pp_suite.ops.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 0.007133 +=elapsed 0.007109 =case erl_pp_SUITE:messages =logfile erl_pp_suite.messages.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:49 =result ok -=elapsed 2.3e-5 +=elapsed 2.4e-5 =case erl_pp_SUITE:maps_syntax =logfile erl_pp_suite.maps_syntax.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:49 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.006191 +=elapsed 0.00573 =case erl_pp_SUITE:quoted_atom_types =logfile erl_pp_suite.quoted_atom_types.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 7.3e-5 +=elapsed 7.4e-5 =case erl_pp_SUITE:format_options =logfile erl_pp_suite.format_options.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 1.12e-4 +=elapsed 1.13e-4 =case erl_pp_SUITE:form_vars =logfile erl_pp_suite.form_vars.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.003483 +=elapsed 0.003501 =case erl_pp_SUITE:end_per_group =logfile erl_pp_suite.end_per_group.html =group_props [{name,expr}] -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok =elapsed 0.0 -=group_time 0.614s +=group_time 0.611s =case erl_pp_SUITE:init_per_group -=logfile erl_pp_suite.init_per_group.9154.html +=logfile erl_pp_suite.init_per_group.41058.html =group_props [{name,attributes}] -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok =elapsed 0.0 =case erl_pp_SUITE:misc_attrs =logfile erl_pp_suite.misc_attrs.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 2.96e-4 +=elapsed 3.24e-4 =case erl_pp_SUITE:import_export =logfile erl_pp_suite.import_export.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.010297 +=elapsed 0.011196 =case erl_pp_SUITE:dialyzer_attrs =logfile erl_pp_suite.dialyzer_attrs.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 1.67e-4 +=elapsed 1.88e-4 =case erl_pp_SUITE:end_per_group -=logfile erl_pp_suite.end_per_group.9186.html +=logfile erl_pp_suite.end_per_group.41090.html =group_props [{name,attributes}] -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok =elapsed 0.0 -=group_time 0.101s +=group_time 0.102s =case erl_pp_SUITE:hook =logfile erl_pp_suite.hook.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 6.96e-4 +=elapsed 0.0007 =case erl_pp_SUITE:neg_indent =logfile erl_pp_suite.neg_indent.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.001102 +=elapsed 0.001113 =case erl_pp_SUITE:init_per_group -=logfile erl_pp_suite.init_per_group.9218.html +=logfile erl_pp_suite.init_per_group.41122.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok =elapsed 0.0 =case erl_pp_SUITE:otp_6321 =logfile erl_pp_suite.otp_6321.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok =elapsed 2.3e-5 =case erl_pp_SUITE:otp_6911 =logfile erl_pp_suite.otp_6911.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 1.05e-4 +=elapsed 1.11e-4 =case erl_pp_SUITE:otp_6914 =logfile erl_pp_suite.otp_6914.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 1.88e-4 +=elapsed 1.9e-4 =case erl_pp_SUITE:otp_8150 =logfile erl_pp_suite.otp_8150.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.00176 +=elapsed 0.0018 =case erl_pp_SUITE:otp_8238 =logfile erl_pp_suite.otp_8238.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.008597 +=elapsed 0.008837 =case erl_pp_SUITE:otp_8473 =logfile erl_pp_suite.otp_8473.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 7.6e-5 +=elapsed 8.0e-5 =case erl_pp_SUITE:otp_8522 =logfile erl_pp_suite.otp_8522.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.001105 +=elapsed 0.001462 =case erl_pp_SUITE:otp_8567 =logfile erl_pp_suite.otp_8567.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 7.6e-4 +=elapsed 9.25e-4 =case erl_pp_SUITE:otp_8664 =logfile erl_pp_suite.otp_8664.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.001762 +=elapsed 0.001945 =case erl_pp_SUITE:otp_9147 =logfile erl_pp_suite.otp_9147.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 8.5e-4 +=elapsed 9.04e-4 =case erl_pp_SUITE:otp_10302 =logfile erl_pp_suite.otp_10302.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:42 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:50 =result ok -=elapsed 0.004054 +=elapsed 0.004406 =case erl_pp_SUITE:otp_10820 =logfile erl_pp_suite.otp_10820.html -=started 2024-09-11 11:12:42 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:50 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 0.740982 +=elapsed 0.736032 =case erl_pp_SUITE:otp_11100 =logfile erl_pp_suite.otp_11100.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 1.2e-4 +=elapsed 1.19e-4 =case erl_pp_SUITE:otp_11861 =logfile erl_pp_suite.otp_11861.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 3.8e-5 +=elapsed 4.3e-5 =case erl_pp_SUITE:pr_1014 =logfile erl_pp_suite.pr_1014.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 9.73e-4 +=elapsed 9.72e-4 =case erl_pp_SUITE:otp_13662 =logfile erl_pp_suite.otp_13662.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 0.005508 +=elapsed 0.005625 =case erl_pp_SUITE:otp_14285 =logfile erl_pp_suite.otp_14285.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 4.56e-4 +=elapsed 4.76e-4 =case erl_pp_SUITE:otp_15592 =logfile erl_pp_suite.otp_15592.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 7.0e-5 =case erl_pp_SUITE:otp_15751 =logfile erl_pp_suite.otp_15751.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 5.87e-4 +=elapsed 6.32e-4 =case erl_pp_SUITE:otp_15755 =logfile erl_pp_suite.otp_15755.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 2.93e-4 +=elapsed 2.34e-4 =case erl_pp_SUITE:otp_16435 =logfile erl_pp_suite.otp_16435.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 3.96e-4 +=elapsed 3.34e-4 =case erl_pp_SUITE:gh_5093 =logfile erl_pp_suite.gh_5093.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:43 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 1.63e-4 +=elapsed 1.26e-4 =case erl_pp_SUITE:eep49 =logfile erl_pp_suite.eep49.html -=started 2024-09-11 11:12:43 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 7.7e-5 +=elapsed 5.7e-5 =case erl_pp_SUITE:eep58 =logfile erl_pp_suite.eep58.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 1.09e-4 +=elapsed 1.05e-4 =case erl_pp_SUITE:end_per_group -=logfile erl_pp_suite.end_per_group.9506.html +=logfile erl_pp_suite.end_per_group.41410.html =group_props [{name,tickets}] -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 1.0e-6 -=group_time 1.339s +=elapsed 0.0 +=group_time 1.335s =case erl_pp_SUITE:end_per_suite =logfile erl_pp_suite.end_per_suite.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 0.0 -=group_time 2.195s +=group_time 2.190s =case erl_scan_SUITE:init_per_suite =logfile erl_scan_suite.init_per_suite.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 0.0 =case erl_scan_SUITE:init_per_group =logfile erl_scan_suite.init_per_group.html =group_props [{name,error}] -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 0.0 =case erl_scan_SUITE:error_1 =logfile erl_scan_suite.error_1.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 3.0e-6 =case erl_scan_SUITE:error_2 =logfile erl_scan_suite.error_2.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 3.5e-5 =case erl_scan_SUITE:end_per_group =logfile erl_scan_suite.end_per_group.html =group_props [{name,error}] -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok =elapsed 0.0 =group_time 0.069s =case erl_scan_SUITE:iso88591 =logfile erl_scan_suite.iso88591.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:51 =result ok -=elapsed 1.4e-5 +=elapsed 1.5e-5 =case erl_scan_SUITE:otp_7810 =logfile erl_scan_suite.otp_7810.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:51 +=ended 2024-09-12 10:34:52 =result ok -=elapsed 0.251072 +=elapsed 0.251027 =case erl_scan_SUITE:otp_10302 =logfile erl_scan_suite.otp_10302.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok -=elapsed 4.1e-5 +=elapsed 4.2e-5 =case erl_scan_SUITE:otp_10990 =logfile erl_scan_suite.otp_10990.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case erl_scan_SUITE:otp_10992 =logfile erl_scan_suite.otp_10992.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 3.0e-6 =case erl_scan_SUITE:otp_11807 =logfile erl_scan_suite.otp_11807.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 7.0e-6 =case erl_scan_SUITE:otp_16480 =logfile erl_scan_suite.otp_16480.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case erl_scan_SUITE:otp_17024 =logfile erl_scan_suite.otp_17024.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 1.0e-6 =case erl_scan_SUITE:text_fun =logfile erl_scan_suite.text_fun.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 5.0e-5 =case erl_scan_SUITE:triple_quoted_string =logfile erl_scan_suite.triple_quoted_string.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok -=elapsed 2.9e-5 +=elapsed 3.0e-5 =case erl_scan_SUITE:end_per_suite =logfile erl_scan_suite.end_per_suite.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 0.0 -=group_time 0.602s +=group_time 0.597s =case error_logger_h_SUITE:init_per_suite =logfile error_logger_h_suite.init_per_suite.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:44 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:52 =result ok =elapsed 0.0 =case error_logger_h_SUITE:logfile =logfile error_logger_h_suite.logfile.html -=started 2024-09-11 11:12:44 -=ended 2024-09-11 11:12:46 +=started 2024-09-12 10:34:52 +=ended 2024-09-12 10:34:54 =result ok -=elapsed 1.933541 +=elapsed 1.932511 =case error_logger_h_SUITE:logfile_truncated =logfile error_logger_h_suite.logfile_truncated.html -=started 2024-09-11 11:12:46 -=ended 2024-09-11 11:12:47 +=started 2024-09-12 10:34:54 +=ended 2024-09-12 10:34:54 =result ok -=elapsed 0.393011 +=elapsed 0.393653 =case error_logger_h_SUITE:tty =logfile error_logger_h_suite.tty.html -=started 2024-09-11 11:12:47 -=ended 2024-09-11 11:12:49 +=started 2024-09-12 10:34:54 +=ended 2024-09-12 10:34:56 =result ok -=elapsed 1.929853 +=elapsed 1.930411 =case error_logger_h_SUITE:tty_truncated =logfile error_logger_h_suite.tty_truncated.html -=started 2024-09-11 11:12:49 -=ended 2024-09-11 11:12:49 +=started 2024-09-12 10:34:56 +=ended 2024-09-12 10:34:57 =result ok -=elapsed 0.393487 +=elapsed 0.394604 =case error_logger_h_SUITE:end_per_suite =logfile error_logger_h_suite.end_per_suite.html -=started 2024-09-11 11:12:49 -=ended 2024-09-11 11:12:49 +=started 2024-09-12 10:34:57 +=ended 2024-09-12 10:34:57 =result ok =elapsed 0.0 =group_time 4.769s =case escript_SUITE:init_per_suite =logfile escript_suite.init_per_suite.html -=started 2024-09-11 11:12:49 -=ended 2024-09-11 11:12:49 +=started 2024-09-12 10:34:57 +=ended 2024-09-12 10:34:57 =result ok =elapsed 0.0 =case escript_SUITE:basic =logfile escript_suite.basic.html -=started 2024-09-11 11:12:49 -=ended 2024-09-11 11:12:52 +=started 2024-09-12 10:34:57 +=ended 2024-09-12 10:35:00 =result ok -=elapsed 2.911468 +=elapsed 2.913205 =case escript_SUITE:errors =logfile escript_suite.errors.html -=started 2024-09-11 11:12:52 -=ended 2024-09-11 11:12:53 +=started 2024-09-12 10:35:00 +=ended 2024-09-12 10:35:00 =result ok -=elapsed 0.681594 +=elapsed 0.667169 =case escript_SUITE:strange_name =logfile escript_suite.strange_name.html -=started 2024-09-11 11:12:53 -=ended 2024-09-11 11:12:53 +=started 2024-09-12 10:35:00 +=ended 2024-09-12 10:35:00 =result ok -=elapsed 0.256446 +=elapsed 0.259714 =case escript_SUITE:emulator_flags =logfile escript_suite.emulator_flags.html -=started 2024-09-11 11:12:53 -=ended 2024-09-11 11:12:53 +=started 2024-09-12 10:35:00 +=ended 2024-09-12 10:35:01 =result ok -=elapsed 0.257626 +=elapsed 0.260629 =case escript_SUITE:emulator_flags_no_shebang =logfile escript_suite.emulator_flags_no_shebang.html -=started 2024-09-11 11:12:53 -=ended 2024-09-11 11:12:53 +=started 2024-09-12 10:35:01 +=ended 2024-09-12 10:35:01 =result ok -=elapsed 0.256828 +=elapsed 0.271799 =case escript_SUITE:two_lines =logfile escript_suite.two_lines.html -=started 2024-09-11 11:12:53 -=ended 2024-09-11 11:12:54 +=started 2024-09-12 10:35:01 +=ended 2024-09-12 10:35:01 =result ok -=elapsed 0.274228 +=elapsed 0.260067 =case escript_SUITE:module_script =logfile escript_suite.module_script.html -=started 2024-09-11 11:12:54 -=ended 2024-09-11 11:12:55 +=started 2024-09-12 10:35:01 +=ended 2024-09-12 10:35:03 =result ok -=elapsed 1.316695 +=elapsed 1.320115 =case escript_SUITE:beam_script =logfile escript_suite.beam_script.html -=started 2024-09-11 11:12:55 -=ended 2024-09-11 11:12:56 +=started 2024-09-12 10:35:03 +=ended 2024-09-12 10:35:03 =result ok -=elapsed 0.741965 +=elapsed 0.730457 =case escript_SUITE:archive_script =logfile escript_suite.archive_script.html -=started 2024-09-11 11:12:56 -=ended 2024-09-11 11:12:57 +=started 2024-09-12 10:35:03 +=ended 2024-09-12 10:35:04 =result ok -=elapsed 0.871375 +=elapsed 0.844936 =case escript_SUITE:epp =logfile escript_suite.epp.html -=started 2024-09-11 11:12:57 -=ended 2024-09-11 11:12:57 +=started 2024-09-12 10:35:04 +=ended 2024-09-12 10:35:05 =result ok -=elapsed 0.259151 +=elapsed 0.254907 =case escript_SUITE:create_and_extract =logfile escript_suite.create_and_extract.html -=started 2024-09-11 11:12:57 -=ended 2024-09-11 11:13:22 +=started 2024-09-12 10:35:05 +=ended 2024-09-12 10:35:29 =result ok -=elapsed 24.699792 +=elapsed 24.705518 =case escript_SUITE:foldl =logfile escript_suite.foldl.html -=started 2024-09-11 11:13:22 -=ended 2024-09-11 11:13:22 +=started 2024-09-12 10:35:29 +=ended 2024-09-12 10:35:29 =result ok -=elapsed 0.019766 +=elapsed 0.020566 =case escript_SUITE:overflow =logfile escript_suite.overflow.html -=started 2024-09-11 11:13:22 -=ended 2024-09-11 11:13:22 +=started 2024-09-12 10:35:29 +=ended 2024-09-12 10:35:30 =result ok -=elapsed 0.474579 +=elapsed 0.48078 =case escript_SUITE:archive_script_file_access =logfile escript_suite.archive_script_file_access.html -=started 2024-09-11 11:13:22 -=ended 2024-09-11 11:13:23 +=started 2024-09-12 10:35:30 +=ended 2024-09-12 10:35:30 =result ok -=elapsed 0.507247 +=elapsed 0.492421 =case escript_SUITE:unicode =logfile escript_suite.unicode.html -=started 2024-09-11 11:13:23 -=ended 2024-09-11 11:13:24 +=started 2024-09-12 10:35:30 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 1.541086 +=elapsed 1.555548 =case escript_SUITE:bad_io_server =logfile escript_suite.bad_io_server.html -=started 2024-09-11 11:13:24 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.24545 +=elapsed 0.243843 =case escript_SUITE:end_per_suite =logfile escript_suite.end_per_suite.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok =elapsed 0.0 -=group_time 35.714s +=group_time 35.680s =case ets_SUITE:init_per_suite =logfile ets_suite.init_per_suite.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 2.2e-5 +=elapsed 2.0e-5 =case ets_SUITE:init_per_group =logfile ets_suite.init_per_group.html =group_props [{name,new}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok =elapsed 0.0 =case ets_SUITE:default =logfile ets_suite.default.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.00217 +=elapsed 0.00174 =case ets_SUITE:setbag =logfile ets_suite.setbag.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.001682 +=elapsed 0.001916 =case ets_SUITE:badnew =logfile ets_suite.badnew.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.001151 +=elapsed 0.001133 =case ets_SUITE:verybadnew =logfile ets_suite.verybadnew.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.00115 +=elapsed 0.001482 =case ets_SUITE:named =logfile ets_suite.named.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.001282 +=elapsed 0.001606 =case ets_SUITE:keypos2 =logfile ets_suite.keypos2.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:32 =result ok -=elapsed 0.001449 +=elapsed 0.002036 =case ets_SUITE:privacy =logfile ets_suite.privacy.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:32 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.027274 +=elapsed 0.025261 =case ets_SUITE:end_per_group =logfile ets_suite.end_per_group.html =group_props [{name,new}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok =elapsed 0.0 -=group_time 0.218s +=group_time 0.216s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.9986.html +=logfile ets_suite.init_per_group.41858.html =group_props [{name,insert}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok =elapsed 0.0 =case ets_SUITE:empty =logfile ets_suite.empty.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.10048 +=elapsed 0.099951 =case ets_SUITE:badinsert =logfile ets_suite.badinsert.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.110992 +=elapsed 0.110009 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.10082.html +=logfile ets_suite.end_per_group.41954.html =group_props [{name,insert}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok =elapsed 0.0 -=group_time 0.280s +=group_time 0.279s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.10114.html +=logfile ets_suite.init_per_group.41986.html =group_props [{name,lookup}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok =elapsed 0.0 =case ets_SUITE:badlookup =logfile ets_suite.badlookup.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.001327 +=elapsed 0.001257 =case ets_SUITE:lookup_order =logfile ets_suite.lookup_order.html -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.060766 +=elapsed 0.057846 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.10210.html +=logfile ets_suite.end_per_group.42082.html =group_props [{name,lookup}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:25 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.0 -=group_time 0.130s +=elapsed 1.0e-6 +=group_time 0.126s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.10242.html +=logfile ets_suite.init_per_group.42114.html =group_props [{name,delete}] -=started 2024-09-11 11:13:25 -=ended 2024-09-11 11:13:26 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok =elapsed 0.0 =case ets_SUITE:delete_elem =logfile ets_suite.delete_elem.html -=started 2024-09-11 11:13:26 -=ended 2024-09-11 11:13:26 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.025794 +=elapsed 0.024928 =case ets_SUITE:delete_tab =logfile ets_suite.delete_tab.html -=started 2024-09-11 11:13:26 -=ended 2024-09-11 11:13:26 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:33 =result ok -=elapsed 0.02419 +=elapsed 0.02586 =case ets_SUITE:delete_large_tab =logfile ets_suite.delete_large_tab.html -=started 2024-09-11 11:13:26 -=ended 2024-09-11 11:13:30 +=started 2024-09-12 10:35:33 +=ended 2024-09-12 10:35:38 =result ok -=elapsed 4.396167 +=elapsed 4.856267 =case ets_SUITE:delete_large_named_table =logfile ets_suite.delete_large_named_table.html -=started 2024-09-11 11:13:30 -=ended 2024-09-11 11:13:34 +=started 2024-09-12 10:35:38 +=ended 2024-09-12 10:35:42 =result ok -=elapsed 4.156187 +=elapsed 4.307755 =case ets_SUITE:evil_delete =logfile ets_suite.evil_delete.html -=started 2024-09-11 11:13:34 -=ended 2024-09-11 11:13:37 +=started 2024-09-12 10:35:42 +=ended 2024-09-12 10:35:45 =result ok -=elapsed 3.099125 +=elapsed 3.122398 =case ets_SUITE:table_leak =logfile ets_suite.table_leak.html -=started 2024-09-11 11:13:37 -=ended 2024-09-11 11:14:17 +=started 2024-09-12 10:35:45 +=ended 2024-09-12 10:36:26 =result ok -=elapsed 39.994682 +=elapsed 40.357536 =case ets_SUITE:baddelete =logfile ets_suite.baddelete.html -=started 2024-09-11 11:14:17 -=ended 2024-09-11 11:14:17 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:26 =result ok -=elapsed 0.002119 +=elapsed 0.001501 =case ets_SUITE:match_delete =logfile ets_suite.match_delete.html -=started 2024-09-11 11:14:17 -=ended 2024-09-11 11:14:17 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:26 =result ok -=elapsed 0.027648 +=elapsed 0.026453 =case ets_SUITE:match_delete3 =logfile ets_suite.match_delete3.html -=started 2024-09-11 11:14:17 -=ended 2024-09-11 11:14:17 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:26 =result ok -=elapsed 0.022287 +=elapsed 0.023201 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.10786.html +=logfile ets_suite.end_per_group.42690.html =group_props [{name,delete}] -=started 2024-09-11 11:14:17 -=ended 2024-09-11 11:14:17 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:26 =result ok =elapsed 0.0 -=group_time 51.978s +=group_time 52.976s =case ets_SUITE:firstnext =logfile ets_suite.firstnext.html -=started 2024-09-11 11:14:17 -=ended 2024-09-11 11:14:18 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:26 =result ok -=elapsed 0.057733 +=elapsed 0.058988 =case ets_SUITE:firstnext_concurrent =logfile ets_suite.firstnext_concurrent.html -=started 2024-09-11 11:14:18 -=ended 2024-09-11 11:14:33 +=started 2024-09-12 10:36:26 +=ended 2024-09-12 10:36:41 =result ok -=elapsed 15.003123 +=elapsed 15.003115 =case ets_SUITE:firstnext_lookup =logfile ets_suite.firstnext_lookup.html -=started 2024-09-11 11:14:33 -=ended 2024-09-11 11:14:33 +=started 2024-09-12 10:36:41 +=ended 2024-09-12 10:36:41 =result ok -=elapsed 0.077811 +=elapsed 0.060802 =case ets_SUITE:firstnext_lookup_concurrent =logfile ets_suite.firstnext_lookup_concurrent.html -=started 2024-09-11 11:14:33 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:41 +=ended 2024-09-12 10:36:56 =result ok -=elapsed 15.002476 +=elapsed 15.002654 =case ets_SUITE:slot =logfile ets_suite.slot.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:56 =result ok -=elapsed 0.062025 +=elapsed 0.061319 =case ets_SUITE:hash_clash =logfile ets_suite.hash_clash.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:56 =result ok -=elapsed 6.0e-6 +=elapsed 7.0e-6 =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.11010.html +=logfile ets_suite.init_per_group.42914.html =group_props [{name,match}] -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:56 =result ok =elapsed 0.0 =case ets_SUITE:match1 =logfile ets_suite.match1.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:56 =result ok -=elapsed 0.061628 +=elapsed 0.059721 =case ets_SUITE:match2 =logfile ets_suite.match2.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:56 =result ok -=elapsed 0.023075 +=elapsed 0.022847 =case ets_SUITE:match_object =logfile ets_suite.match_object.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:48 +=started 2024-09-12 10:36:56 +=ended 2024-09-12 10:36:57 =result ok -=elapsed 0.075275 +=elapsed 0.077607 =case ets_SUITE:match_object2 =logfile ets_suite.match_object2.html -=started 2024-09-11 11:14:48 -=ended 2024-09-11 11:14:49 +=started 2024-09-12 10:36:57 +=ended 2024-09-12 10:36:57 =result ok -=elapsed 0.714962 +=elapsed 0.715858 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.11170.html +=logfile ets_suite.end_per_group.43074.html =group_props [{name,match}] -=started 2024-09-11 11:14:49 -=ended 2024-09-11 11:14:49 +=started 2024-09-12 10:36:57 +=ended 2024-09-12 10:36:57 =result ok =elapsed 0.0 -=group_time 0.990s +=group_time 0.992s =case ets_SUITE:t_match_spec_run =logfile ets_suite.t_match_spec_run.html -=started 2024-09-11 11:14:49 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:57 +=ended 2024-09-12 10:36:58 =result ok -=elapsed 0.934991 +=elapsed 0.934731 =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.11234.html +=logfile ets_suite.init_per_group.43138.html =group_props [{name,lookup_element}] -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:58 =result ok =elapsed 0.0 =case ets_SUITE:lookup_element_mult =logfile ets_suite.lookup_element_mult.html -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:58 =result ok -=elapsed 0.025333 +=elapsed 0.026264 =case ets_SUITE:lookup_element_default =logfile ets_suite.lookup_element_default.html -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:58 =result ok -=elapsed 0.00151 +=elapsed 0.001409 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.11330.html +=logfile ets_suite.end_per_group.43234.html =group_props [{name,lookup_element}] -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:58 =result ok =elapsed 0.0 -=group_time 0.095s +=group_time 0.096s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.11362.html +=logfile ets_suite.init_per_group.43266.html =group_props [{name,misc}] -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:58 =result ok =elapsed 0.0 =case ets_SUITE:misc1 =logfile ets_suite.misc1.html -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:58 +=ended 2024-09-12 10:36:59 =result ok -=elapsed 0.100684 +=elapsed 0.098833 =case ets_SUITE:safe_fixtable =logfile ets_suite.safe_fixtable.html -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:50 +=started 2024-09-12 10:36:59 +=ended 2024-09-12 10:36:59 =result ok -=elapsed 0.231918 +=elapsed 0.230592 =case ets_SUITE:info =logfile ets_suite.info.html -=started 2024-09-11 11:14:50 -=ended 2024-09-11 11:14:51 +=started 2024-09-12 10:36:59 +=ended 2024-09-12 10:36:59 =result ok -=elapsed 0.463496 +=elapsed 0.447602 =case ets_SUITE:info_binary_stress =logfile ets_suite.info_binary_stress.html -=started 2024-09-11 11:14:51 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:36:59 +=ended 2024-09-12 10:37:03 =result ok -=elapsed 4.014238 +=elapsed 4.013099 =case ets_SUITE:info_whereis_busy =logfile ets_suite.info_whereis_busy.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:03 +=ended 2024-09-12 10:37:03 =result ok -=elapsed 0.039859 +=elapsed 0.041049 =case ets_SUITE:dups =logfile ets_suite.dups.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:03 +=ended 2024-09-12 10:37:03 =result ok -=elapsed 0.032763 +=elapsed 0.031762 =case ets_SUITE:tab2list =logfile ets_suite.tab2list.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:03 +=ended 2024-09-12 10:37:03 =result ok -=elapsed 0.00535 +=elapsed 0.003526 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.11618.html +=logfile ets_suite.end_per_group.43426.html =group_props [{name,misc}] -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:03 +=ended 2024-09-12 10:37:03 =result ok =elapsed 0.0 -=group_time 5.071s +=group_time 5.051s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.11650.html +=logfile ets_suite.init_per_group.43458.html =group_props [{name,files}] -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok =elapsed 0.0 =case ets_SUITE:tab2file =logfile ets_suite.tab2file.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok -=elapsed 0.022979 +=elapsed 0.022985 =case ets_SUITE:tab2file2 =logfile ets_suite.tab2file2.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok -=elapsed 0.196397 +=elapsed 0.199742 =case ets_SUITE:tabfile_ext1 =logfile ets_suite.tabfile_ext1.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:55 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok -=elapsed 0.098707 +=elapsed 0.090802 =case ets_SUITE:tabfile_ext2 =logfile ets_suite.tabfile_ext2.html -=started 2024-09-11 11:14:55 -=ended 2024-09-11 11:14:56 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok -=elapsed 0.092663 +=elapsed 0.099325 =case ets_SUITE:tabfile_ext3 =logfile ets_suite.tabfile_ext3.html -=started 2024-09-11 11:14:56 -=ended 2024-09-11 11:14:56 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:04 =result ok -=elapsed 0.006189 +=elapsed 0.007063 =case ets_SUITE:tabfile_ext4 =logfile ets_suite.tabfile_ext4.html -=started 2024-09-11 11:14:56 -=ended 2024-09-11 11:15:03 +=started 2024-09-12 10:37:04 +=ended 2024-09-12 10:37:11 =result ok -=elapsed 7.092138 +=elapsed 6.853179 =case ets_SUITE:badfile =logfile ets_suite.badfile.html -=started 2024-09-11 11:15:03 -=ended 2024-09-11 11:15:03 +=started 2024-09-12 10:37:11 +=ended 2024-09-12 10:37:11 =result ok -=elapsed 0.001293 +=elapsed 0.001141 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.11906.html +=logfile ets_suite.end_per_group.43714.html =group_props [{name,files}] -=started 2024-09-11 11:15:03 -=ended 2024-09-11 11:15:03 +=started 2024-09-12 10:37:11 +=ended 2024-09-12 10:37:11 =result ok =elapsed 0.0 -=group_time 7.927s +=group_time 7.698s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.11938.html +=logfile ets_suite.init_per_group.43746.html =group_props [{name,heavy}] -=started 2024-09-11 11:15:03 -=ended 2024-09-11 11:15:03 +=started 2024-09-12 10:37:11 +=ended 2024-09-12 10:37:11 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case ets_SUITE:heavy_lookup =logfile ets_suite.heavy_lookup.html -=started 2024-09-11 11:15:03 -=ended 2024-09-11 11:15:06 +=started 2024-09-12 10:37:11 +=ended 2024-09-12 10:37:14 =result ok -=elapsed 2.912391 +=elapsed 2.940386 =case ets_SUITE:heavy_lookup_element =logfile ets_suite.heavy_lookup_element.html -=started 2024-09-11 11:15:06 -=ended 2024-09-11 11:15:20 +=started 2024-09-12 10:37:14 +=ended 2024-09-12 10:37:29 =result ok -=elapsed 14.531953 +=elapsed 14.577727 =case ets_SUITE:heavy_concurrent =logfile ets_suite.heavy_concurrent.html -=started 2024-09-11 11:15:20 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:29 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 30.04927 +=elapsed 30.137605 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.12066.html +=logfile ets_suite.end_per_group.43874.html =group_props [{name,heavy}] -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.0 -=group_time 47.585s +=elapsed 1.0e-6 +=group_time 47.749s =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.12098.html +=logfile ets_suite.init_per_group.43906.html =group_props [{name,insert_list}] -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case ets_SUITE:t_insert_list =logfile ets_suite.t_insert_list.html -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.130954 +=elapsed 0.152095 =case ets_SUITE:t_insert_list_set =logfile ets_suite.t_insert_list_set.html -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.002158 +=elapsed 0.002441 =case ets_SUITE:t_insert_list_bag =logfile ets_suite.t_insert_list_bag.html -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.206803 +=elapsed 0.211888 =case ets_SUITE:t_insert_list_duplicate_bag =logfile ets_suite.t_insert_list_duplicate_bag.html -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:15:51 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:37:59 =result ok -=elapsed 0.01188 +=elapsed 0.01223 =case ets_SUITE:t_insert_list_delete_set =logfile ets_suite.t_insert_list_delete_set.html -=started 2024-09-11 11:15:51 -=ended 2024-09-11 11:16:11 +=started 2024-09-12 10:37:59 +=ended 2024-09-12 10:38:19 =result ok -=elapsed 19.860666 +=elapsed 19.859028 =case ets_SUITE:t_insert_list_parallel =logfile ets_suite.t_insert_list_parallel.html -=started 2024-09-11 11:16:11 -=ended 2024-09-11 11:16:12 +=started 2024-09-12 10:38:19 +=ended 2024-09-12 10:38:21 =result ok -=elapsed 1.442708 +=elapsed 1.544193 =case ets_SUITE:t_insert_list_delete_parallel =logfile ets_suite.t_insert_list_delete_parallel.html -=started 2024-09-11 11:16:12 -=ended 2024-09-11 11:16:13 +=started 2024-09-12 10:38:21 +=ended 2024-09-12 10:38:22 =result ok -=elapsed 0.780748 +=elapsed 0.774694 =case ets_SUITE:t_insert_list_kill_process =logfile ets_suite.t_insert_list_kill_process.html -=started 2024-09-11 11:16:13 -=ended 2024-09-11 11:16:17 +=started 2024-09-12 10:38:22 +=ended 2024-09-12 10:38:25 =result ok -=elapsed 3.311108 +=elapsed 3.330851 =case ets_SUITE:t_insert_list_insert_order_preserved =logfile ets_suite.t_insert_list_insert_order_preserved.html -=started 2024-09-11 11:16:17 -=ended 2024-09-11 11:16:21 +=started 2024-09-12 10:38:25 +=ended 2024-09-12 10:38:29 =result ok -=elapsed 4.450603 +=elapsed 4.028859 =case ets_SUITE:insert_trap_delete =logfile ets_suite.insert_trap_delete.html -=started 2024-09-11 11:16:21 -=ended 2024-09-11 11:16:33 +=started 2024-09-12 10:38:29 +=ended 2024-09-12 10:38:42 =result ok -=elapsed 12.17525 +=elapsed 12.663215 =case ets_SUITE:insert_trap_rename =logfile ets_suite.insert_trap_rename.html -=started 2024-09-11 11:16:33 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:42 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 6.325662 +=elapsed 6.742551 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.33155.html +=logfile ets_suite.end_per_group.44226.html =group_props [{name,insert_list}] -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 1.0e-6 -=group_time 48.973s +=elapsed 0.0 +=group_time 49.600s =case ets_SUITE:ordered =logfile ets_suite.ordered.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.019604 +=elapsed 0.017445 =case ets_SUITE:ordered_match =logfile ets_suite.ordered_match.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.045454 +=elapsed 0.043533 =case ets_SUITE:interface_equality =logfile ets_suite.interface_equality.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.037976 +=elapsed 0.035904 =case ets_SUITE:fixtable_next =logfile ets_suite.fixtable_next.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.029679 +=elapsed 0.027433 =case ets_SUITE:fixtable_iter_bag =logfile ets_suite.fixtable_iter_bag.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.015624 +=elapsed 0.015712 =case ets_SUITE:fixtable_insert =logfile ets_suite.fixtable_insert.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 1.9e-4 +=elapsed 2.74e-4 =case ets_SUITE:rename =logfile ets_suite.rename.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.022649 +=elapsed 0.025578 =case ets_SUITE:rename_unnamed =logfile ets_suite.rename_unnamed.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.024028 +=elapsed 0.024382 =case ets_SUITE:evil_rename =logfile ets_suite.evil_rename.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:40 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:49 =result ok -=elapsed 0.288298 +=elapsed 0.311365 =case ets_SUITE:update_element =logfile ets_suite.update_element.html -=started 2024-09-11 11:16:40 -=ended 2024-09-11 11:16:47 +=started 2024-09-12 10:38:49 +=ended 2024-09-12 10:38:57 =result ok -=elapsed 7.087755 +=elapsed 7.158045 =case ets_SUITE:update_element_default =logfile ets_suite.update_element_default.html -=started 2024-09-11 11:16:47 -=ended 2024-09-11 11:16:47 +=started 2024-09-12 10:38:57 +=ended 2024-09-12 10:38:57 =result ok -=elapsed 0.004713 +=elapsed 0.004488 =case ets_SUITE:update_counter =logfile ets_suite.update_counter.html -=started 2024-09-11 11:16:47 -=ended 2024-09-11 11:16:48 +=started 2024-09-12 10:38:57 +=ended 2024-09-12 10:38:57 =result ok -=elapsed 0.881859 +=elapsed 0.873009 =case ets_SUITE:evil_update_counter =logfile ets_suite.evil_update_counter.html -=started 2024-09-11 11:16:48 -=ended 2024-09-11 11:16:51 +=started 2024-09-12 10:38:57 +=ended 2024-09-12 10:39:00 =result ok -=elapsed 2.492607 +=elapsed 2.510748 =case ets_SUITE:update_counter_with_default =logfile ets_suite.update_counter_with_default.html -=started 2024-09-11 11:16:51 -=ended 2024-09-11 11:16:51 +=started 2024-09-12 10:39:00 +=ended 2024-09-12 10:39:00 =result ok -=elapsed 0.00165 +=elapsed 0.002824 =case ets_SUITE:update_counter_with_default_bad_pos =logfile ets_suite.update_counter_with_default_bad_pos.html -=started 2024-09-11 11:16:51 -=ended 2024-09-11 11:16:51 +=started 2024-09-12 10:39:00 +=ended 2024-09-12 10:39:00 =result ok -=elapsed 2.34e-4 +=elapsed 1.67e-4 =case ets_SUITE:partly_bound =logfile ets_suite.partly_bound.html -=started 2024-09-11 11:16:51 -=ended 2024-09-11 11:16:52 +=started 2024-09-12 10:39:00 +=ended 2024-09-12 10:39:01 =result ok -=elapsed 0.717338 +=elapsed 0.731143 =case ets_SUITE:update_counter_table_growth =logfile ets_suite.update_counter_table_growth.html -=started 2024-09-11 11:16:52 -=ended 2024-09-11 11:16:52 +=started 2024-09-12 10:39:01 +=ended 2024-09-12 10:39:01 =result ok -=elapsed 0.088448 +=elapsed 0.090793 =case ets_SUITE:match_heavy =logfile ets_suite.match_heavy.html -=started 2024-09-11 11:16:52 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:01 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 1.772169 +=elapsed 1.732686 =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.17794.html +=logfile ets_suite.init_per_group.48802.html =group_props [{name,fold}] -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok =elapsed 0.0 =case ets_SUITE:foldl_ordered =logfile ets_suite.foldl_ordered.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.038797 +=elapsed 0.034906 =case ets_SUITE:foldr_ordered =logfile ets_suite.foldr_ordered.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.078937 +=elapsed 0.034322 =case ets_SUITE:foldl =logfile ets_suite.foldl.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.142744 +=elapsed 0.10326 =case ets_SUITE:foldr =logfile ets_suite.foldr.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.118031 +=elapsed 0.104979 =case ets_SUITE:fold_empty =logfile ets_suite.fold_empty.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.056693 +=elapsed 0.056792 =case ets_SUITE:fold_badarg =logfile ets_suite.fold_badarg.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 2.0e-6 +=elapsed 1.8e-5 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.18018.html +=logfile ets_suite.end_per_group.49026.html =group_props [{name,fold}] -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok =elapsed 0.0 -=group_time 0.595s +=group_time 0.495s =case ets_SUITE:member =logfile ets_suite.member.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:54 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:03 =result ok -=elapsed 0.079869 +=elapsed 0.082042 =case ets_SUITE:t_delete_object =logfile ets_suite.t_delete_object.html -=started 2024-09-11 11:16:54 -=ended 2024-09-11 11:16:56 +=started 2024-09-12 10:39:03 +=ended 2024-09-12 10:39:05 =result ok -=elapsed 1.258042 +=elapsed 1.27435 =case ets_SUITE:select_bound_chunk =logfile ets_suite.select_bound_chunk.html -=started 2024-09-11 11:16:56 -=ended 2024-09-11 11:16:56 +=started 2024-09-12 10:39:05 +=ended 2024-09-12 10:39:05 =result ok -=elapsed 3.27e-4 +=elapsed 3.46e-4 =case ets_SUITE:t_init_table =logfile ets_suite.t_init_table.html -=started 2024-09-11 11:16:56 -=ended 2024-09-11 11:16:56 +=started 2024-09-12 10:39:05 +=ended 2024-09-12 10:39:05 =result ok -=elapsed 0.132539 +=elapsed 0.131293 =case ets_SUITE:t_whitebox =logfile ets_suite.t_whitebox.html -=started 2024-09-11 11:16:56 -=ended 2024-09-11 11:16:56 +=started 2024-09-12 10:39:05 +=ended 2024-09-12 10:39:05 =result ok -=elapsed 0.010708 +=elapsed 0.010383 =case ets_SUITE:t_delete_all_objects =logfile ets_suite.t_delete_all_objects.html -=started 2024-09-11 11:16:56 -=ended 2024-09-11 11:16:59 +=started 2024-09-12 10:39:05 +=ended 2024-09-12 10:39:08 =result ok -=elapsed 3.039437 +=elapsed 3.141918 =case ets_SUITE:t_delete_all_objects_trap =logfile ets_suite.t_delete_all_objects_trap.html -=started 2024-09-11 11:16:59 -=ended 2024-09-11 11:17:01 +=started 2024-09-12 10:39:08 +=ended 2024-09-12 10:39:11 =result ok -=elapsed 2.50602 +=elapsed 2.539645 =case ets_SUITE:t_test_ms =logfile ets_suite.t_test_ms.html -=started 2024-09-11 11:17:01 -=ended 2024-09-11 11:17:01 +=started 2024-09-12 10:39:11 +=ended 2024-09-12 10:39:11 =result ok -=elapsed 0.001153 +=elapsed 0.001266 =case ets_SUITE:t_select_delete =logfile ets_suite.t_select_delete.html -=started 2024-09-11 11:17:01 -=ended 2024-09-11 11:17:07 +=started 2024-09-12 10:39:11 +=ended 2024-09-12 10:39:16 =result ok -=elapsed 5.740803 +=elapsed 5.676493 =case ets_SUITE:t_select_replace =logfile ets_suite.t_select_replace.html -=started 2024-09-11 11:17:07 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:16 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 1.746123 +=elapsed 1.798839 =case ets_SUITE:t_select_replace_next_bug =logfile ets_suite.t_select_replace_next_bug.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 1.0e-5 +=elapsed 1.4e-5 =case ets_SUITE:t_select_pam_stack_overflow_bug =logfile ets_suite.t_select_pam_stack_overflow_bug.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case ets_SUITE:t_select_flatmap_term_copy_bug =logfile ets_suite.t_select_flatmap_term_copy_bug.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 4.0e-5 +=elapsed 4.7e-5 =case ets_SUITE:t_select_hashmap_term_copy_bug =logfile ets_suite.t_select_hashmap_term_copy_bug.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 0.029657 +=elapsed 0.029626 =case ets_SUITE:t_ets_dets =logfile ets_suite.t_ets_dets.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 0.14697 +=elapsed 0.147044 =case ets_SUITE:memory =logfile ets_suite.memory.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 0.007253 +=elapsed 0.005328 =case ets_SUITE:t_select_reverse =logfile ets_suite.t_select_reverse.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 0.002097 +=elapsed 0.001988 =case ets_SUITE:t_bucket_disappears =logfile ets_suite.t_bucket_disappears.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:18 =result ok -=elapsed 0.027675 +=elapsed 0.033452 =case ets_SUITE:t_named_select =logfile ets_suite.t_named_select.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:18 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.023191 +=elapsed 0.02602 =case ets_SUITE:select_fixtab_owner_change =logfile ets_suite.select_fixtab_owner_change.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 8.27e-4 +=elapsed 8.09e-4 =case ets_SUITE:select_fail =logfile ets_suite.select_fail.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.002977 +=elapsed 0.003292 =case ets_SUITE:t_insert_new =logfile ets_suite.t_insert_new.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:09 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.007186 +=elapsed 0.007529 =case ets_SUITE:t_repair_continuation =logfile ets_suite.t_repair_continuation.html -=started 2024-09-11 11:17:09 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.071895 +=elapsed 0.072091 =case ets_SUITE:otp_5340 =logfile ets_suite.otp_5340.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.107788 +=elapsed 0.112513 =case ets_SUITE:otp_6338 =logfile ets_suite.otp_6338.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.002721 +=elapsed 0.001861 =case ets_SUITE:otp_6842_select_1000 =logfile ets_suite.otp_6842_select_1000.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.48911 +=elapsed 0.490927 =case ets_SUITE:otp_7665 =logfile ets_suite.otp_7665.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.004249 +=elapsed 0.003356 =case ets_SUITE:select_mbuf_trapping =logfile ets_suite.select_mbuf_trapping.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 6.54e-4 +=elapsed 9.7e-4 =case ets_SUITE:otp_8732 =logfile ets_suite.otp_8732.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:10 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:19 =result ok -=elapsed 0.001819 +=elapsed 0.001527 =case ets_SUITE:meta_wb =logfile ets_suite.meta_wb.html -=started 2024-09-11 11:17:10 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:19 +=ended 2024-09-12 10:39:20 =result ok -=elapsed 0.493801 +=elapsed 0.491298 =case ets_SUITE:grow_shrink =logfile ets_suite.grow_shrink.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:20 +=ended 2024-09-12 10:39:20 =result ok -=elapsed 0.253043 +=elapsed 0.257886 =case ets_SUITE:grow_pseudo_deleted =logfile ets_suite.grow_pseudo_deleted.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:20 +=ended 2024-09-12 10:39:20 =result ok -=elapsed 0.133565 +=elapsed 0.139624 =case ets_SUITE:shrink_pseudo_deleted =logfile ets_suite.shrink_pseudo_deleted.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:20 +=ended 2024-09-12 10:39:20 =result ok -=elapsed 0.03828 +=elapsed 0.039325 =case ets_SUITE:init_per_group -=logfile ets_suite.init_per_group.19586.html +=logfile ets_suite.init_per_group.50530.html =group_props [{name,meta_smp}] -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:20 +=ended 2024-09-12 10:39:20 =result ok =elapsed 0.0 =case ets_SUITE:meta_lookup_unnamed_read =logfile ets_suite.meta_lookup_unnamed_read.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:20 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.002113 +=elapsed 0.001759 =case ets_SUITE:meta_lookup_unnamed_write =logfile ets_suite.meta_lookup_unnamed_write.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.002353 +=elapsed 0.002206 =case ets_SUITE:meta_lookup_named_read =logfile ets_suite.meta_lookup_named_read.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.002977 +=elapsed 0.003177 =case ets_SUITE:meta_lookup_named_write =logfile ets_suite.meta_lookup_named_write.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.003288 +=elapsed 0.003207 =case ets_SUITE:meta_newdel_unnamed =logfile ets_suite.meta_newdel_unnamed.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.017293 +=elapsed 0.01788 =case ets_SUITE:meta_newdel_named =logfile ets_suite.meta_newdel_named.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.02143 +=elapsed 0.022142 =case ets_SUITE:end_per_group -=logfile ets_suite.end_per_group.19746.html +=logfile ets_suite.end_per_group.50658.html =group_props [{name,meta_smp}] -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:11 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.0 -=group_time 0.209s +=elapsed 1.0e-6 +=group_time 0.212s =case ets_SUITE:smp_insert =logfile ets_suite.smp_insert.html -=started 2024-09-11 11:17:11 -=ended 2024-09-11 11:17:12 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.159991 +=elapsed 0.16437 =case ets_SUITE:smp_fixed_delete =logfile ets_suite.smp_fixed_delete.html -=started 2024-09-11 11:17:12 -=ended 2024-09-11 11:17:12 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.06841 +=elapsed 0.079309 =case ets_SUITE:smp_unfix_fix =logfile ets_suite.smp_unfix_fix.html -=started 2024-09-11 11:17:12 -=ended 2024-09-11 11:17:12 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:21 =result ok -=elapsed 0.070132 +=elapsed 0.075406 =case ets_SUITE:smp_select_replace =logfile ets_suite.smp_select_replace.html -=started 2024-09-11 11:17:12 -=ended 2024-09-11 11:17:36 +=started 2024-09-12 10:39:21 +=ended 2024-09-12 10:39:45 =result ok -=elapsed 24.019865 +=elapsed 24.017347 =case ets_SUITE:smp_ordered_iteration =logfile ets_suite.smp_ordered_iteration.html -=started 2024-09-11 11:17:36 -=ended 2024-09-11 11:17:38 +=started 2024-09-12 10:39:45 +=ended 2024-09-12 10:39:47 =result ok -=elapsed 2.02109 +=elapsed 2.022445 =case ets_SUITE:smp_select_delete =logfile ets_suite.smp_select_delete.html -=started 2024-09-11 11:17:38 -=ended 2024-09-11 11:17:39 +=started 2024-09-12 10:39:47 +=ended 2024-09-12 10:39:49 =result ok -=elapsed 1.311088 +=elapsed 1.313032 =case ets_SUITE:otp_8166 =logfile ets_suite.otp_8166.html -=started 2024-09-11 11:17:39 -=ended 2024-09-11 11:17:40 +=started 2024-09-12 10:39:49 +=ended 2024-09-12 10:39:49 =result ok -=elapsed 0.270521 +=elapsed 0.238281 =case ets_SUITE:exit_large_table_owner =logfile ets_suite.exit_large_table_owner.html -=started 2024-09-11 11:17:40 -=ended 2024-09-11 11:17:50 +=started 2024-09-12 10:39:49 +=ended 2024-09-12 10:40:01 =result ok -=elapsed 10.576289 +=elapsed 12.23485 =case ets_SUITE:exit_many_large_table_owner =logfile ets_suite.exit_many_large_table_owner.html -=started 2024-09-11 11:17:50 -=ended 2024-09-11 11:18:10 +=started 2024-09-12 10:40:01 +=ended 2024-09-12 10:40:21 =result ok -=elapsed 20.221609 +=elapsed 19.978059 =case ets_SUITE:exit_many_tables_owner =logfile ets_suite.exit_many_tables_owner.html -=started 2024-09-11 11:18:10 -=ended 2024-09-11 11:18:10 +=started 2024-09-12 10:40:21 +=ended 2024-09-12 10:40:21 =result ok -=elapsed 0.012778 +=elapsed 0.011613 =case ets_SUITE:exit_many_many_tables_owner =logfile ets_suite.exit_many_many_tables_owner.html -=started 2024-09-11 11:18:10 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:21 +=ended 2024-09-12 10:40:22 =result ok -=elapsed 1.077944 +=elapsed 1.108739 =case ets_SUITE:write_concurrency =logfile ets_suite.write_concurrency.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:22 +=ended 2024-09-12 10:40:22 =result ok -=elapsed 0.002589 +=elapsed 0.001999 =case ets_SUITE:heir =logfile ets_suite.heir.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:22 +=ended 2024-09-12 10:40:22 =result ok -=elapsed 0.195187 +=elapsed 0.204673 =case ets_SUITE:give_away =logfile ets_suite.give_away.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:22 +=ended 2024-09-12 10:40:22 =result ok -=elapsed 0.003401 +=elapsed 0.00466 =case ets_SUITE:setopts =logfile ets_suite.setopts.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:22 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 0.001374 +=elapsed 0.001969 =case ets_SUITE:bad_table =logfile ets_suite.bad_table.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 0.189003 +=elapsed 0.179773 =case ets_SUITE:types =logfile ets_suite.types.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 0.034255 +=elapsed 0.033314 =case ets_SUITE:otp_10182 =logfile ets_suite.otp_10182.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 0.007981 +=elapsed 0.00999 =case ets_SUITE:otp_9932 =logfile ets_suite.otp_9932.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 5.6e-5 +=elapsed 5.2e-5 =case ets_SUITE:otp_9423 =logfile ets_suite.otp_9423.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 0.170665 +=elapsed 0.176195 =case ets_SUITE:compress_magic_ref =logfile ets_suite.compress_magic_ref.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:12 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:23 =result ok -=elapsed 1.3e-4 +=elapsed 1.67e-4 =case ets_SUITE:ets_all =logfile ets_suite.ets_all.html -=started 2024-09-11 11:18:12 -=ended 2024-09-11 11:18:15 +=started 2024-09-12 10:40:23 +=ended 2024-09-12 10:40:26 =result ok -=elapsed 3.000905 +=elapsed 3.000396 =case ets_SUITE:massive_ets_all =logfile ets_suite.massive_ets_all.html -=started 2024-09-11 11:18:15 -=ended 2024-09-11 11:18:15 +=started 2024-09-12 10:40:26 +=ended 2024-09-12 10:40:26 =result ok -=elapsed 0.006577 +=elapsed 0.006559 =case ets_SUITE:take =logfile ets_suite.take.html -=started 2024-09-11 11:18:15 -=ended 2024-09-11 11:18:15 +=started 2024-09-12 10:40:26 +=ended 2024-09-12 10:40:26 =result ok -=elapsed 2.47e-4 +=elapsed 2.74e-4 =case ets_SUITE:whereis_table =logfile ets_suite.whereis_table.html -=started 2024-09-11 11:18:15 -=ended 2024-09-11 11:18:15 +=started 2024-09-12 10:40:26 +=ended 2024-09-12 10:40:26 =result ok -=elapsed 3.5e-5 +=elapsed 3.6e-5 =case ets_SUITE:delete_unfix_race =logfile ets_suite.delete_unfix_race.html -=started 2024-09-11 11:18:15 -=ended 2024-09-11 11:18:16 +=started 2024-09-12 10:40:26 +=ended 2024-09-12 10:40:26 =result ok -=elapsed 0.043239 +=elapsed 0.028933 =case ets_SUITE:test_throughput_benchmark =logfile ets_suite.test_throughput_benchmark.html -=started 2024-09-11 11:18:16 -=ended 2024-09-11 11:18:47 -=result ok: Result visualization -=elapsed 30.99899 +=started 2024-09-12 10:40:26 +=ended 2024-09-12 10:40:57 +=result ok: Result visualization +=elapsed 31.03073 === =case ets_SUITE:init_per_group =group_props [{name,"benchmark"}] -=started 2024-09-11 11:18:47 +=started 2024-09-12 10:40:57 =result skipped: Benchmark only === *** Skipping {ets_SUITE,init_per_group} *** === =case ets_SUITE:long_throughput_benchmark =group_props [{name,"benchmark"}] -=started 2024-09-11 11:18:47 +=started 2024-09-12 10:40:57 =result skipped: Benchmark only === *** Skipping test case #712 {ets_SUITE,long_throughput_benchmark} *** === =case ets_SUITE:end_per_group =group_props [{name,"benchmark"}] -=started 2024-09-11 11:18:47 +=started 2024-09-12 10:40:57 =result skipped: Benchmark only === *** Skipping {ets_SUITE,end_per_group} *** =case ets_SUITE:test_table_size_concurrency =logfile ets_suite.test_table_size_concurrency.html -=started 2024-09-11 11:18:47 -=ended 2024-09-11 11:18:48 +=started 2024-09-12 10:40:57 +=ended 2024-09-12 10:40:59 =result ok -=elapsed 1.192557 +=elapsed 1.32371 =case ets_SUITE:test_table_memory_concurrency =logfile ets_suite.test_table_memory_concurrency.html -=started 2024-09-11 11:18:48 -=ended 2024-09-11 11:18:50 +=started 2024-09-12 10:40:59 +=ended 2024-09-12 10:41:01 =result ok -=elapsed 1.264322 +=elapsed 1.319692 =case ets_SUITE:test_delete_table_while_size_snapshot =logfile ets_suite.test_delete_table_while_size_snapshot.html -=started 2024-09-11 11:18:50 -=ended 2024-09-11 11:18:50 +=started 2024-09-12 10:41:01 +=ended 2024-09-12 10:41:01 =result ok -=elapsed 0.507759 +=elapsed 0.495808 =case ets_SUITE:test_decentralized_counters_setting =logfile ets_suite.test_decentralized_counters_setting.html -=started 2024-09-11 11:18:50 -=ended 2024-09-11 11:18:50 +=started 2024-09-12 10:41:01 +=ended 2024-09-12 10:41:01 =result ok -=elapsed 0.002108 +=elapsed 0.002111 =case ets_SUITE:ms_excessive_nesting =logfile ets_suite.ms_excessive_nesting.html -=started 2024-09-11 11:18:50 -=ended 2024-09-11 11:18:51 +=started 2024-09-12 10:41:01 +=ended 2024-09-12 10:41:01 =result ok: match_spec_compile() got system_limit; select_replace(_,[ordered_set]) got system_limit; select_replace(_,[set]) got system_limit -=elapsed 0.173536 +=elapsed 0.168965 =case ets_SUITE:error_info =logfile ets_suite.error_info.html -=started 2024-09-11 11:18:51 -=ended 2024-09-11 11:18:51 +=started 2024-09-12 10:41:01 +=ended 2024-09-12 10:41:02 =result ok -=elapsed 0.116039 +=elapsed 0.096941 =case ets_SUITE:bound_maps =logfile ets_suite.bound_maps.html -=started 2024-09-11 11:18:51 -=ended 2024-09-11 11:18:51 +=started 2024-09-12 10:41:02 +=ended 2024-09-12 10:41:02 =result ok -=elapsed 1.0e-5 +=elapsed 1.3e-5 =case ets_SUITE:end_per_suite =logfile ets_suite.end_per_suite.html -=started 2024-09-11 11:18:51 -=ended 2024-09-11 11:18:51 +=started 2024-09-12 10:41:02 +=ended 2024-09-12 10:41:02 =result ok -=elapsed 1.1e-5 -=group_time 326.048s +=elapsed 9.0e-6 +=group_time 329.375s =case ets_property_test_SUITE:init_per_suite =logfile ets_property_test_suite.init_per_suite.html -=started 2024-09-11 11:18:51 -=ended 2024-09-11 11:18:52 +=started 2024-09-12 10:41:02 +=ended 2024-09-12 10:41:03 =result ok -=elapsed 1.280873 +=elapsed 1.274948 =case ets_property_test_SUITE:first_case =logfile ets_property_test_suite.first_case.html -=started 2024-09-11 11:18:52 -=ended 2024-09-11 11:18:52 +=started 2024-09-12 10:41:03 +=ended 2024-09-12 10:41:03 =result ok -=elapsed 0.135007 +=elapsed 0.115949 =case ets_property_test_SUITE:next_case =logfile ets_property_test_suite.next_case.html -=started 2024-09-11 11:18:52 -=ended 2024-09-11 11:18:52 +=started 2024-09-12 10:41:03 +=ended 2024-09-12 10:41:03 =result ok -=elapsed 0.136306 +=elapsed 0.100212 =case ets_property_test_SUITE:last_case =logfile ets_property_test_suite.last_case.html -=started 2024-09-11 11:18:52 -=ended 2024-09-11 11:18:53 +=started 2024-09-12 10:41:03 +=ended 2024-09-12 10:41:03 =result ok -=elapsed 0.117154 +=elapsed 0.131327 =case ets_property_test_SUITE:prev_case =logfile ets_property_test_suite.prev_case.html -=started 2024-09-11 11:18:53 -=ended 2024-09-11 11:18:53 +=started 2024-09-12 10:41:03 +=ended 2024-09-12 10:41:04 =result ok -=elapsed 0.113711 +=elapsed 0.121771 =case ets_property_test_SUITE:end_per_suite =logfile ets_property_test_suite.end_per_suite.html -=started 2024-09-11 11:18:53 -=ended 2024-09-11 11:18:53 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:04 =result ok =elapsed 0.0 -=group_time 1.901s +=group_time 1.862s =case ets_tough_SUITE:init_per_suite =logfile ets_tough_suite.init_per_suite.html -=started 2024-09-11 11:18:53 -=ended 2024-09-11 11:18:53 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:04 =result ok =elapsed 0.0 =case ets_tough_SUITE:ex1 =logfile ets_tough_suite.ex1.html -=started 2024-09-11 11:18:53 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:04 =result ok -=elapsed 0.832494 +=elapsed 0.851067 =case ets_tough_SUITE:end_per_suite =logfile ets_tough_suite.end_per_suite.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:04 =result ok =elapsed 0.0 -=group_time 0.882s +=group_time 0.901s =case file_sorter_SUITE:init_per_suite =logfile file_sorter_suite.init_per_suite.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:04 =result ok =elapsed 0.0 =case file_sorter_SUITE:basic =logfile file_sorter_suite.basic.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:04 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.006298 +=elapsed 0.006338 =case file_sorter_SUITE:badarg =logfile file_sorter_suite.badarg.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.003705 +=elapsed 0.003693 =case file_sorter_SUITE:term_sort =logfile file_sorter_suite.term_sort.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.052303 +=elapsed 0.063927 =case file_sorter_SUITE:term_keysort =logfile file_sorter_suite.term_keysort.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.025974 +=elapsed 0.029773 =case file_sorter_SUITE:binary_term_sort =logfile file_sorter_suite.binary_term_sort.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.055713 +=elapsed 0.055421 =case file_sorter_SUITE:binary_term_keysort =logfile file_sorter_suite.binary_term_keysort.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.023916 +=elapsed 0.024683 =case file_sorter_SUITE:binary_sort =logfile file_sorter_suite.binary_sort.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.053213 +=elapsed 0.056205 =case file_sorter_SUITE:term_merge =logfile file_sorter_suite.term_merge.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.015566 +=elapsed 0.019561 =case file_sorter_SUITE:term_keymerge =logfile file_sorter_suite.term_keymerge.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.059223 +=elapsed 0.072808 =case file_sorter_SUITE:binary_term_merge =logfile file_sorter_suite.binary_term_merge.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.010637 +=elapsed 0.013098 =case file_sorter_SUITE:binary_term_keymerge =logfile file_sorter_suite.binary_term_keymerge.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.052517 +=elapsed 0.058703 =case file_sorter_SUITE:binary_merge =logfile file_sorter_suite.binary_merge.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.010413 +=elapsed 0.012825 =case file_sorter_SUITE:term_check =logfile file_sorter_suite.term_check.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.038746 +=elapsed 0.041717 =case file_sorter_SUITE:binary_term_keycheck =logfile file_sorter_suite.binary_term_keycheck.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.003078 +=elapsed 0.003107 =case file_sorter_SUITE:binary_term_check =logfile file_sorter_suite.binary_term_check.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.008165 +=elapsed 0.008193 =case file_sorter_SUITE:binary_term_keycheck -=logfile file_sorter_suite.binary_term_keycheck.468674.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=logfile file_sorter_suite.binary_term_keycheck.484290.html +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.003034 +=elapsed 0.003008 =case file_sorter_SUITE:binary_check =logfile file_sorter_suite.binary_check.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.006614 +=elapsed 0.00666 =case file_sorter_SUITE:inout =logfile file_sorter_suite.inout.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:54 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.002023 +=elapsed 0.002011 =case file_sorter_SUITE:misc =logfile file_sorter_suite.misc.html -=started 2024-09-11 11:18:54 -=ended 2024-09-11 11:18:55 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:05 =result ok -=elapsed 0.015949 +=elapsed 0.016071 =case file_sorter_SUITE:many =logfile file_sorter_suite.many.html -=started 2024-09-11 11:18:55 -=ended 2024-09-11 11:18:55 +=started 2024-09-12 10:41:05 +=ended 2024-09-12 10:41:06 =result ok -=elapsed 0.760763 +=elapsed 0.83964 =case file_sorter_SUITE:end_per_suite =logfile file_sorter_suite.end_per_suite.html -=started 2024-09-11 11:18:55 -=ended 2024-09-11 11:18:55 +=started 2024-09-12 10:41:06 +=ended 2024-09-12 10:41:06 =result ok =elapsed 0.0 -=group_time 1.686s +=group_time 1.820s =case filelib_SUITE:init_per_suite =logfile filelib_suite.init_per_suite.html -=started 2024-09-11 11:18:55 -=ended 2024-09-11 11:18:55 +=started 2024-09-12 10:41:06 +=ended 2024-09-12 10:41:06 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case filelib_SUITE:wildcard_one =logfile filelib_suite.wildcard_one.html -=started 2024-09-11 11:18:55 -=ended 2024-09-11 11:18:55 +=started 2024-09-12 10:41:06 +=ended 2024-09-12 10:41:06 =result ok -=elapsed 0.080286 +=elapsed 0.0822 =case filelib_SUITE:wildcard_two =logfile filelib_suite.wildcard_two.html -=started 2024-09-11 11:18:55 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:06 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.094842 +=elapsed 0.093205 =case filelib_SUITE:wildcard_errors =logfile filelib_suite.wildcard_errors.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.0e-5 +=elapsed 1.9e-5 =case filelib_SUITE:fold_files =logfile filelib_suite.fold_files.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.003363 +=elapsed 0.005032 =case filelib_SUITE:otp_5960 =logfile filelib_suite.otp_5960.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 4.13e-4 +=elapsed 6.55e-4 =case filelib_SUITE:ensure_dir_eexist =logfile filelib_suite.ensure_dir_eexist.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 4.86e-4 +=elapsed 6.56e-4 =case filelib_SUITE:ensure_dir_symlink =logfile filelib_suite.ensure_dir_symlink.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.82e-4 +=elapsed 3.97e-4 =case filelib_SUITE:ensure_path_single_dir =logfile filelib_suite.ensure_path_single_dir.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 1.63e-4 +=elapsed 2.17e-4 =case filelib_SUITE:ensure_path_nested_dirs =logfile filelib_suite.ensure_path_nested_dirs.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.73e-4 +=elapsed 4.16e-4 =case filelib_SUITE:ensure_path_binary_args =logfile filelib_suite.ensure_path_binary_args.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.46e-4 +=elapsed 3.87e-4 =case filelib_SUITE:ensure_path_symlink =logfile filelib_suite.ensure_path_symlink.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.73e-4 +=elapsed 4.01e-4 =case filelib_SUITE:ensure_path_relative_path =logfile filelib_suite.ensure_path_relative_path.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.77e-4 +=elapsed 4.56e-4 =case filelib_SUITE:ensure_path_relative_path_dot_dot =logfile filelib_suite.ensure_path_relative_path_dot_dot.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 2.23e-4 +=elapsed 2.77e-4 =case filelib_SUITE:ensure_path_invalid_path =logfile filelib_suite.ensure_path_invalid_path.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 4.23e-4 +=elapsed 6.19e-4 =case filelib_SUITE:wildcard_symlink =logfile filelib_suite.wildcard_symlink.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 9.93e-4 +=elapsed 0.001384 =case filelib_SUITE:is_file_symlink =logfile filelib_suite.is_file_symlink.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 7.12e-4 +=elapsed 0.001006 =case filelib_SUITE:file_props_symlink =logfile filelib_suite.file_props_symlink.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 4.77e-4 +=elapsed 6.84e-4 =case filelib_SUITE:find_source =logfile filelib_suite.find_source.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.00139 +=elapsed 0.002385 =case filelib_SUITE:find_source_subdir =logfile filelib_suite.find_source_subdir.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.001062 +=elapsed 0.001904 =case filelib_SUITE:find_source_otp =logfile filelib_suite.find_source_otp.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.408041 +=elapsed 0.39171 =case filelib_SUITE:safe_relative_path =logfile filelib_suite.safe_relative_path.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.007095 +=elapsed 0.006811 =case filelib_SUITE:safe_relative_path_links =logfile filelib_suite.safe_relative_path_links.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok -=elapsed 0.011075 +=elapsed 0.010884 =case filelib_SUITE:end_per_suite =logfile filelib_suite.end_per_suite.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:56 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok =elapsed 0.0 -=group_time 1.138s +=group_time 1.129s =case filename_SUITE:init_per_suite =logfile filename_suite.init_per_suite.html -=started 2024-09-11 11:18:56 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:07 =result ok =elapsed 0.0 =case filename_SUITE:absname =logfile filename_suite.absname.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:07 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 3.39e-4 +=elapsed 3.06e-4 =case filename_SUITE:absname_2 =logfile filename_suite.absname_2.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 6.0e-6 +=elapsed 5.0e-6 =case filename_SUITE:absname_bin =logfile filename_suite.absname_bin.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.97e-4 +=elapsed 2.1e-4 =case filename_SUITE:absname_bin_2 =logfile filename_suite.absname_bin_2.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 6.0e-6 =case filename_SUITE:init_per_group =logfile filename_suite.init_per_group.html =group_props [{name,p},parallel] -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 0.0 =case filename_SUITE:dirname -=logfile filename_suite.dirname.470914.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.dirname.486498.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 7.0e-6 =case filename_SUITE:extension -=logfile filename_suite.extension.470946.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.extension.486530.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 6.0e-6 =case filename_SUITE:extension_bin -=logfile filename_suite.extension_bin.394820.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.extension_bin.486562.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.3e-5 +=elapsed 1.2e-5 =case filename_SUITE:join -=logfile filename_suite.join.394852.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.join.486594.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 2.5e-5 +=elapsed 2.6e-5 =case filename_SUITE:pathtype -=logfile filename_suite.pathtype.470882.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.pathtype.486626.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 2.0e-6 =case filename_SUITE:rootname -=logfile filename_suite.rootname.470978.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.rootname.421668.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.1e-5 +=elapsed 1.6e-5 =case filename_SUITE:split -=logfile filename_suite.split.394980.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.split.421700.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 5.0e-6 =case filename_SUITE:t_nativename -=logfile filename_suite.t_nativename.394884.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.t_nativename.402243.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case filename_SUITE:basename_1 -=logfile filename_suite.basename_1.394948.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.basename_1.402275.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 5.0e-6 =case filename_SUITE:basename_2 -=logfile filename_suite.basename_2.394916.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.basename_2.486658.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.1e-5 +=elapsed 1.7e-5 =case filename_SUITE:basename_bin_1 -=logfile filename_suite.basename_bin_1.496643.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.basename_bin_1.486690.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case filename_SUITE:basename_bin_2 -=logfile filename_suite.basename_bin_2.496675.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.basename_bin_2.486722.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 9.0e-6 +=elapsed 1.2e-5 =case filename_SUITE:dirname_bin -=logfile filename_suite.dirname_bin.496707.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.dirname_bin.486754.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 8.0e-6 =case filename_SUITE:join_bin -=logfile filename_suite.join_bin.496739.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.join_bin.486786.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 6.1e-5 +=elapsed 2.9e-5 =case filename_SUITE:pathtype_bin -=logfile filename_suite.pathtype_bin.496771.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.pathtype_bin.421732.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 2.0e-6 =case filename_SUITE:rootname_bin -=logfile filename_suite.rootname_bin.395012.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.rootname_bin.421764.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.0e-5 +=elapsed 9.0e-6 =case filename_SUITE:split_bin -=logfile filename_suite.split_bin.395044.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.split_bin.421796.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 6.0e-6 +=elapsed 8.0e-6 =case filename_SUITE:t_nativename_bin -=logfile filename_suite.t_nativename_bin.395076.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.t_nativename_bin.402307.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 2.0e-6 +=elapsed 3.0e-6 =case filename_SUITE:t_basedir_api -=logfile filename_suite.t_basedir_api.395108.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=logfile filename_suite.t_basedir_api.421828.html +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 1.39e-4 +=elapsed 1.12e-4 =case filename_SUITE:end_per_group =logfile filename_suite.end_per_group.html =group_props [{name,p},parallel] -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 0.0 -=group_time 0.067s +=group_time 0.069s =case filename_SUITE:t_basedir_xdg =logfile filename_suite.t_basedir_xdg.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 6.52e-4 +=elapsed 6.3e-4 =case filename_SUITE:t_basedir_windows =logfile filename_suite.t_basedir_windows.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 0.001377 +=elapsed 0.001314 =case filename_SUITE:end_per_suite =logfile filename_suite.end_per_suite.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 0.0 -=group_time 0.266s +=group_time 0.267s =case fixtable_SUITE:init_per_suite =logfile fixtable_suite.init_per_suite.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok =elapsed 0.0 =case fixtable_SUITE:multiple_fixes =logfile fixtable_suite.multiple_fixes.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:18:57 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:08 =result ok -=elapsed 4.2e-4 +=elapsed 4.75e-4 =case fixtable_SUITE:multiple_processes =logfile fixtable_suite.multiple_processes.html -=started 2024-09-11 11:18:57 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:08 +=ended 2024-09-12 10:41:12 =result ok -=elapsed 4.01229 +=elapsed 4.011508 =case fixtable_SUITE:other_process_deletes =logfile fixtable_suite.other_process_deletes.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok -=elapsed 0.001793 +=elapsed 0.001785 =case fixtable_SUITE:owner_dies =logfile fixtable_suite.owner_dies.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok -=elapsed 0.007467 +=elapsed 0.008081 =case fixtable_SUITE:other_process_closes =logfile fixtable_suite.other_process_closes.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok -=elapsed 0.002307 +=elapsed 0.00223 =case fixtable_SUITE:insert_same_key =logfile fixtable_suite.insert_same_key.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok -=elapsed 0.001155 +=elapsed 0.001477 =case fixtable_SUITE:fixbag =logfile fixtable_suite.fixbag.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok =elapsed 7.0e-6 =case fixtable_SUITE:end_per_suite =logfile fixtable_suite.end_per_suite.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok =elapsed 0.0 -=group_time 4.214s +=group_time 4.213s =case format_SUITE:init_per_suite =logfile format_suite.init_per_suite.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok =elapsed 0.0 =case format_SUITE:hang_1 =logfile format_suite.hang_1.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok =elapsed 2.0e-6 =case format_SUITE:end_per_suite =logfile format_suite.end_per_suite.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:01 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:12 =result ok =elapsed 0.0 -=group_time 0.051s +=group_time 0.050s =case gb_sets_property_test_SUITE:init_per_suite =logfile gb_sets_property_test_suite.init_per_suite.html -=started 2024-09-11 11:19:01 -=ended 2024-09-11 11:19:02 +=started 2024-09-12 10:41:12 +=ended 2024-09-12 10:41:13 =result ok -=elapsed 1.264443 +=elapsed 1.255704 =case gb_sets_property_test_SUITE:add_case =logfile gb_sets_property_test_suite.add_case.html -=started 2024-09-11 11:19:02 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:13 +=ended 2024-09-12 10:41:13 =result ok -=elapsed 0.123072 +=elapsed 0.136074 =case gb_sets_property_test_SUITE:balance_case =logfile gb_sets_property_test_suite.balance_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:13 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.13802 +=elapsed 0.139159 =case gb_sets_property_test_SUITE:delete_case =logfile gb_sets_property_test_suite.delete_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.128002 +=elapsed 0.132519 =case gb_sets_property_test_SUITE:delete_any_case =logfile gb_sets_property_test_suite.delete_any_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.130968 +=elapsed 0.129554 =case gb_sets_property_test_SUITE:difference_case =logfile gb_sets_property_test_suite.difference_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.180955 +=elapsed 0.189857 =case gb_sets_property_test_SUITE:from_ordset_case =logfile gb_sets_property_test_suite.from_ordset_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.055645 +=elapsed 0.067183 =case gb_sets_property_test_SUITE:insert_case =logfile gb_sets_property_test_suite.insert_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:03 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:14 =result ok -=elapsed 0.139955 +=elapsed 0.129986 =case gb_sets_property_test_SUITE:is_member_case =logfile gb_sets_property_test_suite.is_member_case.html -=started 2024-09-11 11:19:03 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:14 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.124187 +=elapsed 0.129791 =case gb_sets_property_test_SUITE:iterator_case =logfile gb_sets_property_test_suite.iterator_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.073306 +=elapsed 0.073751 =case gb_sets_property_test_SUITE:iterator_from_case =logfile gb_sets_property_test_suite.iterator_from_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.077955 +=elapsed 0.064043 =case gb_sets_property_test_SUITE:larger_case =logfile gb_sets_property_test_suite.larger_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.132515 +=elapsed 0.122773 =case gb_sets_property_test_SUITE:largest_case =logfile gb_sets_property_test_suite.largest_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.084276 +=elapsed 0.067352 =case gb_sets_property_test_SUITE:singleton_case =logfile gb_sets_property_test_suite.singleton_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.00558 +=elapsed 0.00588 =case gb_sets_property_test_SUITE:smaller_case =logfile gb_sets_property_test_suite.smaller_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.124479 +=elapsed 0.122715 =case gb_sets_property_test_SUITE:smallest_case =logfile gb_sets_property_test_suite.smallest_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.057028 +=elapsed 0.060636 =case gb_sets_property_test_SUITE:take_largest_case =logfile gb_sets_property_test_suite.take_largest_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.066432 +=elapsed 0.062677 =case gb_sets_property_test_SUITE:take_smallest_case =logfile gb_sets_property_test_suite.take_smallest_case.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok -=elapsed 0.061545 +=elapsed 0.067482 =case gb_sets_property_test_SUITE:end_per_suite =logfile gb_sets_property_test_suite.end_per_suite.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:04 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok =elapsed 0.0 -=group_time 3.380s +=group_time 3.367s =case gen_event_SUITE:init_per_suite =logfile gen_event_suite.init_per_suite.html -=started 2024-09-11 11:19:04 -=ended 2024-09-11 11:19:05 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:15 =result ok =elapsed 1.0e-6 =case gen_event_SUITE:start =logfile gen_event_suite.start.html -=started 2024-09-11 11:19:05 -=ended 2024-09-11 11:19:05 +=started 2024-09-12 10:41:15 +=ended 2024-09-12 10:41:16 =result ok -=elapsed 4.31e-4 +=elapsed 5.31e-4 =case gen_event_SUITE:init_per_group =logfile gen_event_suite.init_per_group.html =group_props [{name,test_all}] -=started 2024-09-11 11:19:05 -=ended 2024-09-11 11:19:05 +=started 2024-09-12 10:41:16 +=ended 2024-09-12 10:41:16 =result ok =elapsed 0.0 =case gen_event_SUITE:add_handler =logfile gen_event_suite.add_handler.html -=started 2024-09-11 11:19:05 -=ended 2024-09-11 11:19:05 +=started 2024-09-12 10:41:16 +=ended 2024-09-12 10:41:16 =result ok -=elapsed 3.7e-5 +=elapsed 5.7e-5 =case gen_event_SUITE:add_sup_handler =logfile gen_event_suite.add_sup_handler.html -=started 2024-09-11 11:19:05 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:16 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 1.000431 +=elapsed 1.000259 =case gen_event_SUITE:delete_handler =logfile gen_event_suite.delete_handler.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 4.8e-5 +=elapsed 5.6e-5 =case gen_event_SUITE:swap_handler =logfile gen_event_suite.swap_handler.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 4.1e-5 +=elapsed 4.5e-5 =case gen_event_SUITE:swap_sup_handler =logfile gen_event_suite.swap_sup_handler.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 4.6e-5 +=elapsed 5.4e-5 =case gen_event_SUITE:notify =logfile gen_event_suite.notify.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 0.001351 +=elapsed 0.001662 =case gen_event_SUITE:sync_notify =logfile gen_event_suite.sync_notify.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 0.001276 +=elapsed 0.001205 =case gen_event_SUITE:call =logfile gen_event_suite.call.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 0.002228 +=elapsed 0.001883 =case gen_event_SUITE:info =logfile gen_event_suite.info.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok -=elapsed 0.001633 +=elapsed 0.001358 =case gen_event_SUITE:end_per_group =logfile gen_event_suite.end_per_group.html =group_props [{name,test_all}] -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:06 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:17 =result ok =elapsed 0.0 -=group_time 1.233s +=group_time 1.237s =case gen_event_SUITE:hibernate =logfile gen_event_suite.hibernate.html -=started 2024-09-11 11:19:06 -=ended 2024-09-11 11:19:07 +=started 2024-09-12 10:41:17 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 1.038781 +=elapsed 1.038962 =case gen_event_SUITE:auto_hibernate =logfile gen_event_suite.auto_hibernate.html -=started 2024-09-11 11:19:07 -=ended 2024-09-11 11:19:07 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 0.520778 +=elapsed 0.520953 =case gen_event_SUITE:call_format_status =logfile gen_event_suite.call_format_status.html -=started 2024-09-11 11:19:07 -=ended 2024-09-11 11:19:07 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 7.2e-5 +=elapsed 9.3e-5 =case gen_event_SUITE:call_format_status_anon =logfile gen_event_suite.call_format_status_anon.html -=started 2024-09-11 11:19:07 -=ended 2024-09-11 11:19:07 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 6.3e-5 +=elapsed 3.5e-5 =case gen_event_SUITE:error_format_status =logfile gen_event_suite.error_format_status.html -=started 2024-09-11 11:19:07 -=ended 2024-09-11 11:19:07 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 8.53e-4 +=elapsed 8.82e-4 =case gen_event_SUITE:get_state =logfile gen_event_suite.get_state.html -=started 2024-09-11 11:19:07 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 4.3e-5 +=elapsed 7.2e-5 =case gen_event_SUITE:replace_state =logfile gen_event_suite.replace_state.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:18 =result ok -=elapsed 3.6e-5 +=elapsed 3.8e-5 =case gen_event_SUITE:start_opt =logfile gen_event_suite.start_opt.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:18 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 3.03e-4 +=elapsed 2.74e-4 =case gen_event_SUITE:init_per_group -=logfile gen_event_suite.init_per_group.496835.html +=logfile gen_event_suite.init_per_group.487362.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 0.002493 +=elapsed 0.002401 =case gen_event_SUITE:undef_init =logfile gen_event_suite.undef_init.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 7.06e-4 +=elapsed 6.42e-4 =case gen_event_SUITE:undef_handle_call =logfile gen_event_suite.undef_handle_call.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 2.92e-4 +=elapsed 3.49e-4 =case gen_event_SUITE:undef_handle_event =logfile gen_event_suite.undef_handle_event.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 6.67e-4 +=elapsed 5.74e-4 =case gen_event_SUITE:undef_handle_info =logfile gen_event_suite.undef_handle_info.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 0.101063 +=elapsed 0.100707 =case gen_event_SUITE:undef_code_change =logfile gen_event_suite.undef_code_change.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 2.2e-5 +=elapsed 2.7e-5 =case gen_event_SUITE:undef_terminate =logfile gen_event_suite.undef_terminate.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 5.0e-6 +=elapsed 8.0e-6 =case gen_event_SUITE:end_per_group -=logfile gen_event_suite.end_per_group.496867.html +=logfile gen_event_suite.end_per_group.402339.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok =elapsed 0.0 =group_time 0.267s =case gen_event_SUITE:undef_in_terminate =logfile gen_event_suite.undef_in_terminate.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 2.0e-5 +=elapsed 2.8e-5 =case gen_event_SUITE:format_log_1 =logfile gen_event_suite.format_log_1.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 1.9e-4 +=elapsed 1.76e-4 =case gen_event_SUITE:format_log_2 =logfile gen_event_suite.format_log_2.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 0.0007 +=elapsed 6.59e-4 =case gen_event_SUITE:format_log_with_process_label =logfile gen_event_suite.format_log_with_process_label.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:08 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:19 =result ok -=elapsed 1.99e-4 +=elapsed 1.92e-4 =case gen_event_SUITE:send_request_receive_reqid_collection =logfile gen_event_suite.send_request_receive_reqid_collection.html -=started 2024-09-11 11:19:08 -=ended 2024-09-11 11:19:10 +=started 2024-09-12 10:41:19 +=ended 2024-09-12 10:41:21 =result ok -=elapsed 1.902954 +=elapsed 1.902991 =case gen_event_SUITE:send_request_wait_reqid_collection =logfile gen_event_suite.send_request_wait_reqid_collection.html -=started 2024-09-11 11:19:10 -=ended 2024-09-11 11:19:12 +=started 2024-09-12 10:41:21 +=ended 2024-09-12 10:41:23 =result ok -=elapsed 1.802886 +=elapsed 1.802221 =case gen_event_SUITE:send_request_check_reqid_collection =logfile gen_event_suite.send_request_check_reqid_collection.html -=started 2024-09-11 11:19:12 -=ended 2024-09-11 11:19:13 +=started 2024-09-12 10:41:23 +=ended 2024-09-12 10:41:24 =result ok -=elapsed 1.003145 +=elapsed 1.00386 =case gen_event_SUITE:end_per_suite =logfile gen_event_suite.end_per_suite.html -=started 2024-09-11 11:19:13 -=ended 2024-09-11 11:19:13 +=started 2024-09-12 10:41:24 +=ended 2024-09-12 10:41:24 =result ok =elapsed 0.0 -=group_time 8.218s +=group_time 8.221s =case gen_fsm_SUITE:init_per_suite =logfile gen_fsm_suite.init_per_suite.html -=started 2024-09-11 11:19:13 -=ended 2024-09-11 11:19:13 +=started 2024-09-12 10:41:24 +=ended 2024-09-12 10:41:24 =result ok =elapsed 1.0e-6 =case gen_fsm_SUITE:init_per_group =logfile gen_fsm_suite.init_per_group.html =group_props [{name,start}] -=started 2024-09-11 11:19:13 -=ended 2024-09-11 11:19:13 +=started 2024-09-12 10:41:24 +=ended 2024-09-12 10:41:24 =result ok =elapsed 0.0 =case gen_fsm_SUITE:start1 =logfile gen_fsm_suite.start1.html -=started 2024-09-11 11:19:13 -=ended 2024-09-11 11:19:14 +=started 2024-09-12 10:41:24 +=ended 2024-09-12 10:41:25 =result ok -=elapsed 1.204204 +=elapsed 1.204507 =case gen_fsm_SUITE:start2 =logfile gen_fsm_suite.start2.html -=started 2024-09-11 11:19:14 -=ended 2024-09-11 11:19:15 +=started 2024-09-12 10:41:25 +=ended 2024-09-12 10:41:26 =result ok -=elapsed 1.205023 +=elapsed 1.20459 =case gen_fsm_SUITE:start3 =logfile gen_fsm_suite.start3.html -=started 2024-09-11 11:19:15 -=ended 2024-09-11 11:19:16 +=started 2024-09-12 10:41:26 +=ended 2024-09-12 10:41:27 =result ok -=elapsed 1.210945 +=elapsed 1.21033 =case gen_fsm_SUITE:start4 =logfile gen_fsm_suite.start4.html -=started 2024-09-11 11:19:16 -=ended 2024-09-11 11:19:16 +=started 2024-09-12 10:41:27 +=ended 2024-09-12 10:41:27 =result ok -=elapsed 0.001136 +=elapsed 0.001856 =case gen_fsm_SUITE:start5 =logfile gen_fsm_suite.start5.html -=started 2024-09-11 11:19:16 -=ended 2024-09-11 11:19:17 +=started 2024-09-12 10:41:27 +=ended 2024-09-12 10:41:27 =result ok -=elapsed 0.002135 +=elapsed 0.002164 =case gen_fsm_SUITE:start6 =logfile gen_fsm_suite.start6.html -=started 2024-09-11 11:19:17 -=ended 2024-09-11 11:19:18 +=started 2024-09-12 10:41:27 +=ended 2024-09-12 10:41:29 =result ok -=elapsed 1.204863 +=elapsed 1.204249 =case gen_fsm_SUITE:start7 =logfile gen_fsm_suite.start7.html -=started 2024-09-11 11:19:18 -=ended 2024-09-11 11:19:20 +=started 2024-09-12 10:41:29 +=ended 2024-09-12 10:41:31 =result ok -=elapsed 2.407958 +=elapsed 2.407979 =case gen_fsm_SUITE:start8 =logfile gen_fsm_suite.start8.html -=started 2024-09-11 11:19:20 -=ended 2024-09-11 11:19:23 +=started 2024-09-12 10:41:31 +=ended 2024-09-12 10:41:34 =result ok -=elapsed 2.407926 +=elapsed 2.408145 =case gen_fsm_SUITE:start9 =logfile gen_fsm_suite.start9.html -=started 2024-09-11 11:19:23 -=ended 2024-09-11 11:19:25 +=started 2024-09-12 10:41:34 +=ended 2024-09-12 10:41:36 =result ok -=elapsed 2.408243 +=elapsed 2.408103 =case gen_fsm_SUITE:start10 =logfile gen_fsm_suite.start10.html -=started 2024-09-11 11:19:25 -=ended 2024-09-11 11:19:27 +=started 2024-09-12 10:41:36 +=ended 2024-09-12 10:41:38 =result ok -=elapsed 2.407673 +=elapsed 2.408208 =case gen_fsm_SUITE:start11 =logfile gen_fsm_suite.start11.html -=started 2024-09-11 11:19:27 -=ended 2024-09-11 11:19:28 +=started 2024-09-12 10:41:38 +=ended 2024-09-12 10:41:38 =result ok -=elapsed 0.004126 +=elapsed 0.004112 =case gen_fsm_SUITE:start12 =logfile gen_fsm_suite.start12.html -=started 2024-09-11 11:19:28 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:38 +=ended 2024-09-12 10:41:41 =result ok -=elapsed 2.408224 +=elapsed 2.407243 =case gen_fsm_SUITE:end_per_group =logfile gen_fsm_suite.end_per_group.html =group_props [{name,start}] -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:41 =result ok =elapsed 0.0 -=group_time 17.173s +=group_time 17.168s =case gen_fsm_SUITE:init_per_group -=logfile gen_fsm_suite.init_per_group.471522.html +=logfile gen_fsm_suite.init_per_group.487394.html =group_props [{name,abnormal}] -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:41 =result ok =elapsed 0.0 =case gen_fsm_SUITE:abnormal1 =logfile gen_fsm_suite.abnormal1.html -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:41 =result ok -=elapsed 0.005205 +=elapsed 0.005247 =case gen_fsm_SUITE:abnormal2 =logfile gen_fsm_suite.abnormal2.html -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:41 =result ok -=elapsed 0.001763 +=elapsed 0.002193 =case gen_fsm_SUITE:end_per_group -=logfile gen_fsm_suite.end_per_group.471554.html +=logfile gen_fsm_suite.end_per_group.402371.html =group_props [{name,abnormal}] -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:30 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:41 =result ok =elapsed 0.0 -=group_time 0.078s +=group_time 0.076s =case gen_fsm_SUITE:shutdown =logfile gen_fsm_suite.shutdown.html -=started 2024-09-11 11:19:30 -=ended 2024-09-11 11:19:32 +=started 2024-09-12 10:41:41 +=ended 2024-09-12 10:41:43 =result ok -=elapsed 1.703815 +=elapsed 1.704082 =case gen_fsm_SUITE:init_per_group -=logfile gen_fsm_suite.init_per_group.496899.html +=logfile gen_fsm_suite.init_per_group.402403.html =group_props [{name,sys}] -=started 2024-09-11 11:19:32 -=ended 2024-09-11 11:19:32 +=started 2024-09-12 10:41:43 +=ended 2024-09-12 10:41:43 =result ok =elapsed 0.0 =case gen_fsm_SUITE:sys1 =logfile gen_fsm_suite.sys1.html -=started 2024-09-11 11:19:32 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:43 +=ended 2024-09-12 10:41:48 =result ok -=elapsed 5.000493 +=elapsed 5.000519 =case gen_fsm_SUITE:call_format_status =logfile gen_fsm_suite.call_format_status.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok -=elapsed 3.5e-4 +=elapsed 5.03e-4 =case gen_fsm_SUITE:error_format_status =logfile gen_fsm_suite.error_format_status.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok -=elapsed 7.68e-4 +=elapsed 7.9e-4 =case gen_fsm_SUITE:terminate_crash_format =logfile gen_fsm_suite.terminate_crash_format.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok -=elapsed 0.001079 +=elapsed 8.84e-4 =case gen_fsm_SUITE:get_state =logfile gen_fsm_suite.get_state.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok -=elapsed 6.0e-5 +=elapsed 6.1e-5 =case gen_fsm_SUITE:replace_state =logfile gen_fsm_suite.replace_state.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok =elapsed 4.3e-5 =case gen_fsm_SUITE:end_per_group -=logfile gen_fsm_suite.end_per_group.496931.html +=logfile gen_fsm_suite.end_per_group.402435.html =group_props [{name,sys}] -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:37 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:48 =result ok =elapsed 0.0 -=group_time 5.161s +=group_time 5.162s =case gen_fsm_SUITE:hibernate =logfile gen_fsm_suite.hibernate.html -=started 2024-09-11 11:19:37 -=ended 2024-09-11 11:19:39 +=started 2024-09-12 10:41:48 +=ended 2024-09-12 10:41:50 =result ok -=elapsed 2.059222 +=elapsed 2.059187 =case gen_fsm_SUITE:auto_hibernate =logfile gen_fsm_suite.auto_hibernate.html -=started 2024-09-11 11:19:39 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:50 +=ended 2024-09-12 10:41:50 =result ok -=elapsed 0.422101 +=elapsed 0.421198 =case gen_fsm_SUITE:enter_loop =logfile gen_fsm_suite.enter_loop.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:50 +=ended 2024-09-12 10:41:50 =result ok -=elapsed 0.002546 +=elapsed 0.003409 =case gen_fsm_SUITE:init_per_group -=logfile gen_fsm_suite.init_per_group.496963.html +=logfile gen_fsm_suite.init_per_group.402467.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:50 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 0.002439 +=elapsed 0.002908 =case gen_fsm_SUITE:undef_handle_event =logfile gen_fsm_suite.undef_handle_event.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 0.00242 +=elapsed 0.003015 =case gen_fsm_SUITE:undef_handle_sync_event =logfile gen_fsm_suite.undef_handle_sync_event.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 8.73e-4 +=elapsed 0.001124 =case gen_fsm_SUITE:undef_handle_info =logfile gen_fsm_suite.undef_handle_info.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 0.500891 +=elapsed 0.501012 =case gen_fsm_SUITE:undef_init =logfile gen_fsm_suite.undef_init.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 0.001054 +=elapsed 0.001062 =case gen_fsm_SUITE:undef_code_change =logfile gen_fsm_suite.undef_code_change.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 2.6e-5 +=elapsed 3.7e-5 =case gen_fsm_SUITE:undef_terminate1 =logfile gen_fsm_suite.undef_terminate1.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok =elapsed 1.6e-5 =case gen_fsm_SUITE:undef_terminate2 =logfile gen_fsm_suite.undef_terminate2.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 5.26e-4 +=elapsed 8.47e-4 =case gen_fsm_SUITE:end_per_group -=logfile gen_fsm_suite.end_per_group.496995.html +=logfile gen_fsm_suite.end_per_group.421860.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok =elapsed 0.0 -=group_time 0.691s +=group_time 0.693s =case gen_fsm_SUITE:undef_in_handle_info =logfile gen_fsm_suite.undef_in_handle_info.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 6.94e-4 +=elapsed 8.93e-4 =case gen_fsm_SUITE:undef_in_terminate =logfile gen_fsm_suite.undef_in_terminate.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 8.08e-4 +=elapsed 0.001542 =case gen_fsm_SUITE:init_per_group -=logfile gen_fsm_suite.init_per_group.497027.html +=logfile gen_fsm_suite.init_per_group.487426.html =group_props [{name,format_log}] -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok =elapsed 0.0 =case gen_fsm_SUITE:format_log_1 =logfile gen_fsm_suite.format_log_1.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 1.42e-4 +=elapsed 1.62e-4 =case gen_fsm_SUITE:format_log_2 =logfile gen_fsm_suite.format_log_2.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 7.93e-4 +=elapsed 7.57e-4 =case gen_fsm_SUITE:format_log_with_process_label =logfile gen_fsm_suite.format_log_with_process_label.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 1.89e-4 +=elapsed 2.83e-4 =case gen_fsm_SUITE:end_per_group -=logfile gen_fsm_suite.end_per_group.497059.html +=logfile gen_fsm_suite.end_per_group.487458.html =group_props [{name,format_log}] -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok =elapsed 0.0 =group_time 0.092s =case gen_fsm_SUITE:reply_by_alias_with_payload =logfile gen_fsm_suite.reply_by_alias_with_payload.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 8.0e-6 +=elapsed 1.0e-5 =case gen_fsm_SUITE:end_per_suite =logfile gen_fsm_suite.end_per_suite.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok =elapsed 0.0 -=group_time 27.691s +=group_time 27.687s =case gen_server_SUITE:init_per_suite =logfile gen_server_suite.init_per_suite.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:40 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:51 =result ok -=elapsed 0.004395 +=elapsed 0.004416 =case gen_server_SUITE:start =logfile gen_server_suite.start.html -=started 2024-09-11 11:19:40 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:51 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 0.516425 +=elapsed 0.518421 =case gen_server_SUITE:init_per_group =logfile gen_server_suite.init_per_group.html =group_props [{name,stop}] -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok =elapsed 0.0 =case gen_server_SUITE:stop1 =logfile gen_server_suite.stop1.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 2.3e-5 +=elapsed 3.0e-5 =case gen_server_SUITE:stop2 =logfile gen_server_suite.stop2.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 5.84e-4 +=elapsed 5.88e-4 =case gen_server_SUITE:stop3 =logfile gen_server_suite.stop3.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 2.1e-5 +=elapsed 2.3e-5 =case gen_server_SUITE:stop4 =logfile gen_server_suite.stop4.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 2.1e-5 +=elapsed 1.9e-5 =case gen_server_SUITE:stop5 =logfile gen_server_suite.stop5.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 2.1e-5 +=elapsed 1.8e-5 =case gen_server_SUITE:stop6 =logfile gen_server_suite.stop6.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 7.8e-5 +=elapsed 8.8e-5 =case gen_server_SUITE:stop7 =logfile gen_server_suite.stop7.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 4.1e-5 +=elapsed 4.9e-5 =case gen_server_SUITE:stop8 =logfile gen_server_suite.stop8.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:41 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:52 =result ok -=elapsed 0.160035 +=elapsed 0.151829 =case gen_server_SUITE:stop9 =logfile gen_server_suite.stop9.html -=started 2024-09-11 11:19:41 -=ended 2024-09-11 11:19:42 +=started 2024-09-12 10:41:52 +=ended 2024-09-12 10:41:53 =result ok -=elapsed 0.151572 +=elapsed 0.164657 =case gen_server_SUITE:stop10 =logfile gen_server_suite.stop10.html -=started 2024-09-11 11:19:42 -=ended 2024-09-11 11:19:42 +=started 2024-09-12 10:41:53 +=ended 2024-09-12 10:41:53 =result ok -=elapsed 0.351101 +=elapsed 0.34051 =case gen_server_SUITE:end_per_group =logfile gen_server_suite.end_per_group.html =group_props [{name,stop}] -=started 2024-09-11 11:19:42 -=ended 2024-09-11 11:19:42 +=started 2024-09-12 10:41:53 +=ended 2024-09-12 10:41:53 =result ok =elapsed 1.0e-6 -=group_time 0.916s +=group_time 0.909s =case gen_server_SUITE:crash =logfile gen_server_suite.crash.html -=started 2024-09-11 11:19:42 -=ended 2024-09-11 11:19:42 +=started 2024-09-12 10:41:53 +=ended 2024-09-12 10:41:53 =result ok -=elapsed 0.501376 +=elapsed 0.501356 =case gen_server_SUITE:loop_start_fail =logfile gen_server_suite.loop_start_fail.html -=started 2024-09-11 11:19:42 -=ended 2024-09-11 11:19:48 +=started 2024-09-12 10:41:53 +=ended 2024-09-12 10:41:59 =result ok -=elapsed 5.062116 +=elapsed 5.067939 =case gen_server_SUITE:call =logfile gen_server_suite.call.html -=started 2024-09-11 11:19:48 -=ended 2024-09-11 11:19:50 +=started 2024-09-12 10:41:59 +=ended 2024-09-12 10:42:01 =result ok -=elapsed 2.008721 +=elapsed 2.008687 =case gen_server_SUITE:send_request =logfile gen_server_suite.send_request.html -=started 2024-09-11 11:19:50 -=ended 2024-09-11 11:19:52 +=started 2024-09-12 10:42:01 +=ended 2024-09-12 10:42:03 =result ok -=elapsed 1.573731 +=elapsed 1.571408 =case gen_server_SUITE:send_request_receive_reqid_collection =logfile gen_server_suite.send_request_receive_reqid_collection.html -=started 2024-09-11 11:19:52 -=ended 2024-09-11 11:19:53 +=started 2024-09-12 10:42:03 +=ended 2024-09-12 10:42:04 =result ok -=elapsed 1.902831 +=elapsed 1.902747 =case gen_server_SUITE:send_request_wait_reqid_collection =logfile gen_server_suite.send_request_wait_reqid_collection.html -=started 2024-09-11 11:19:53 -=ended 2024-09-11 11:19:55 +=started 2024-09-12 10:42:04 +=ended 2024-09-12 10:42:06 =result ok -=elapsed 1.803057 +=elapsed 1.802951 =case gen_server_SUITE:send_request_check_reqid_collection =logfile gen_server_suite.send_request_check_reqid_collection.html -=started 2024-09-11 11:19:55 -=ended 2024-09-11 11:19:56 +=started 2024-09-12 10:42:06 +=ended 2024-09-12 10:42:07 =result ok -=elapsed 1.003793 +=elapsed 1.003675 =case gen_server_SUITE:cast =logfile gen_server_suite.cast.html -=started 2024-09-11 11:19:56 -=ended 2024-09-11 11:19:56 +=started 2024-09-12 10:42:07 +=ended 2024-09-12 10:42:07 =result ok -=elapsed 0.002195 +=elapsed 0.001873 =case gen_server_SUITE:cast_fast =logfile gen_server_suite.cast_fast.html -=started 2024-09-11 11:19:56 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:07 +=ended 2024-09-12 10:42:09 =result ok -=elapsed 1.3383 +=elapsed 1.339861 =case gen_server_SUITE:info =logfile gen_server_suite.info.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok -=elapsed 0.001862 +=elapsed 0.002008 =case gen_server_SUITE:abcast =logfile gen_server_suite.abcast.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok -=elapsed 0.002073 +=elapsed 0.001799 =case gen_server_SUITE:continue =logfile gen_server_suite.continue.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok -=elapsed 4.8e-5 +=elapsed 6.5e-5 =case gen_server_SUITE:init_per_group -=logfile gen_server_suite.init_per_group.395140.html +=logfile gen_server_suite.init_per_group.487874.html =group_props [{name,multi_call}] -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok =elapsed 0.0 =case gen_server_SUITE:init_per_group -=logfile gen_server_suite.init_per_group.395172.html +=logfile gen_server_suite.init_per_group.487906.html =group_props [{name,multi_call_parallel},parallel] -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok =elapsed 0.0 === =case gen_server_SUITE:multicall_remote_old1 =group_props [{name,"multi_call_parallel"}] -=started 2024-09-11 11:19:58 +=started 2024-09-12 10:42:09 =result skipped: Broken in docker === *** Skipping test case #911 {gen_server_SUITE,multicall_remote_old1} *** =case gen_server_SUITE:multicall -=logfile gen_server_suite.multicall.395204.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:20:00 +=logfile gen_server_suite.multicall.487938.html +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:11 =result ok -=elapsed 2.005927 +=elapsed 2.004856 =case gen_server_SUITE:multicall_down -=logfile gen_server_suite.multicall_down.395236.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:19:58 +=logfile gen_server_suite.multicall_down.487970.html +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:09 =result ok -=elapsed 0.009891 +=elapsed 0.006663 =case gen_server_SUITE:multicall_remote -=logfile gen_server_suite.multicall_remote.395268.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:20:01 +=logfile gen_server_suite.multicall_remote.488002.html +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:12 =result ok -=elapsed 2.790139 +=elapsed 2.81225 =case gen_server_SUITE:multicall_remote_old2 -=logfile gen_server_suite.multicall_remote_old2.471874.html -=started 2024-09-11 11:19:58 -=ended 2024-09-11 11:20:30 +=logfile gen_server_suite.multicall_remote_old2.402499.html +=started 2024-09-12 10:42:09 +=ended 2024-09-12 10:42:41 =result ok -=elapsed 31.736383 +=elapsed 31.718849 =case gen_server_SUITE:end_per_group -=logfile gen_server_suite.end_per_group.472290.html +=logfile gen_server_suite.end_per_group.488418.html =group_props [{name,multi_call_parallel},parallel] -=started 2024-09-11 11:20:30 -=ended 2024-09-11 11:20:30 +=started 2024-09-12 10:42:41 +=ended 2024-09-12 10:42:41 =result ok =elapsed 1.0e-6 -=group_time 31.786s +=group_time 31.772s =case gen_server_SUITE:init_per_group -=logfile gen_server_suite.init_per_group.395300.html +=logfile gen_server_suite.init_per_group.488450.html =group_props [{name,multi_call_sequence}] -=started 2024-09-11 11:20:30 -=ended 2024-09-11 11:20:30 +=started 2024-09-12 10:42:41 +=ended 2024-09-12 10:42:41 =result ok =elapsed 0.0 =case gen_server_SUITE:multicall_recv_opt_success =logfile gen_server_suite.multicall_recv_opt_success.html -=started 2024-09-11 11:20:30 -=ended 2024-09-11 11:20:30 -=result ok: Ratio: 1.08272809802733482876e+00 -=elapsed 0.628839 +=started 2024-09-12 10:42:41 +=ended 2024-09-12 10:42:41 +=result ok: Ratio: 1.05760937470734606158e+00 +=elapsed 0.614249 =case gen_server_SUITE:multicall_recv_opt_timeout =logfile gen_server_suite.multicall_recv_opt_timeout.html -=started 2024-09-11 11:20:30 -=ended 2024-09-11 11:20:35 -=result ok: Ratio: 9.99957039460168117806e-01 -=elapsed 4.608634 +=started 2024-09-12 10:42:41 +=ended 2024-09-12 10:42:46 +=result ok: Ratio: 9.99852047222122064518e-01 +=elapsed 4.595284 =case gen_server_SUITE:multicall_recv_opt_noconnection =logfile gen_server_suite.multicall_recv_opt_noconnection.html -=started 2024-09-11 11:20:35 -=ended 2024-09-11 11:20:36 -=result ok: Ratio: 9.86144722207283108695e-01 -=elapsed 1.429388 +=started 2024-09-12 10:42:46 +=ended 2024-09-12 10:42:47 +=result ok: Ratio: 9.88034566373387601601e-01 +=elapsed 1.413763 =case gen_server_SUITE:end_per_group -=logfile gen_server_suite.end_per_group.472642.html +=logfile gen_server_suite.end_per_group.488834.html =group_props [{name,multi_call_sequence}] -=started 2024-09-11 11:20:36 -=ended 2024-09-11 11:20:36 +=started 2024-09-12 10:42:47 +=ended 2024-09-12 10:42:47 =result ok -=elapsed 1.0e-6 -=group_time 6.760s +=elapsed 0.0 +=group_time 6.715s =case gen_server_SUITE:end_per_group -=logfile gen_server_suite.end_per_group.472674.html +=logfile gen_server_suite.end_per_group.488866.html =group_props [{name,multi_call}] -=started 2024-09-11 11:20:36 -=ended 2024-09-11 11:20:36 +=started 2024-09-12 10:42:47 +=ended 2024-09-12 10:42:47 =result ok =elapsed 0.0 -=group_time 38.615s +=group_time 38.555s =case gen_server_SUITE:call_remote1 =logfile gen_server_suite.call_remote1.html -=started 2024-09-11 11:20:36 -=ended 2024-09-11 11:20:37 +=started 2024-09-12 10:42:47 +=ended 2024-09-12 10:42:48 =result ok -=elapsed 0.00682 +=elapsed 0.007195 =case gen_server_SUITE:call_remote2 =logfile gen_server_suite.call_remote2.html -=started 2024-09-11 11:20:37 -=ended 2024-09-11 11:20:37 +=started 2024-09-12 10:42:48 +=ended 2024-09-12 10:42:48 =result ok -=elapsed 0.006663 +=elapsed 0.007352 =case gen_server_SUITE:calling_self =logfile gen_server_suite.calling_self.html -=started 2024-09-11 11:20:37 -=ended 2024-09-11 11:20:37 +=started 2024-09-12 10:42:48 +=ended 2024-09-12 10:42:48 =result ok =elapsed 1.0e-6 =case gen_server_SUITE:call_remote3 =logfile gen_server_suite.call_remote3.html -=started 2024-09-11 11:20:37 -=ended 2024-09-11 11:20:38 +=started 2024-09-12 10:42:48 +=ended 2024-09-12 10:42:48 =result ok -=elapsed 0.005977 +=elapsed 0.006462 =case gen_server_SUITE:call_remote_n1 =logfile gen_server_suite.call_remote_n1.html -=started 2024-09-11 11:20:38 -=ended 2024-09-11 11:20:38 +=started 2024-09-12 10:42:48 +=ended 2024-09-12 10:42:49 =result ok -=elapsed 0.005701 +=elapsed 0.005598 =case gen_server_SUITE:call_remote_n2 =logfile gen_server_suite.call_remote_n2.html -=started 2024-09-11 11:20:38 -=ended 2024-09-11 11:20:38 +=started 2024-09-12 10:42:49 +=ended 2024-09-12 10:42:49 =result ok -=elapsed 0.006016 +=elapsed 0.006391 =case gen_server_SUITE:call_remote_n3 =logfile gen_server_suite.call_remote_n3.html -=started 2024-09-11 11:20:38 -=ended 2024-09-11 11:20:39 +=started 2024-09-12 10:42:49 +=ended 2024-09-12 10:42:50 =result ok -=elapsed 0.005765 +=elapsed 0.005704 =case gen_server_SUITE:spec_init =logfile gen_server_suite.spec_init.html -=started 2024-09-11 11:20:39 -=ended 2024-09-11 11:20:40 +=started 2024-09-12 10:42:50 +=ended 2024-09-12 10:42:51 =result ok -=elapsed 1.007658 +=elapsed 1.010937 =case gen_server_SUITE:spec_init_local_registered_parent =logfile gen_server_suite.spec_init_local_registered_parent.html -=started 2024-09-11 11:20:40 -=ended 2024-09-11 11:20:40 +=started 2024-09-12 10:42:51 +=ended 2024-09-12 10:42:51 =result ok -=elapsed 1.44e-4 +=elapsed 9.7e-5 =case gen_server_SUITE:spec_init_global_registered_parent =logfile gen_server_suite.spec_init_global_registered_parent.html -=started 2024-09-11 11:20:40 -=ended 2024-09-11 11:20:40 +=started 2024-09-12 10:42:51 +=ended 2024-09-12 10:42:51 =result ok -=elapsed 3.6e-4 +=elapsed 2.41e-4 =case gen_server_SUITE:otp_5854 =logfile gen_server_suite.otp_5854.html -=started 2024-09-11 11:20:40 -=ended 2024-09-11 11:20:40 +=started 2024-09-12 10:42:51 +=ended 2024-09-12 10:42:51 =result ok -=elapsed 0.001681 +=elapsed 0.001419 =case gen_server_SUITE:hibernate =logfile gen_server_suite.hibernate.html -=started 2024-09-11 11:20:40 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:51 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 3.022883 +=elapsed 3.021727 =case gen_server_SUITE:auto_hibernate =logfile gen_server_suite.auto_hibernate.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.422076 +=elapsed 0.422715 =case gen_server_SUITE:otp_7669 =logfile gen_server_suite.otp_7669.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.027504 +=elapsed 0.030902 =case gen_server_SUITE:init_per_group -=logfile gen_server_suite.init_per_group.473218.html +=logfile gen_server_suite.init_per_group.489410.html =group_props [{name,format_status}] -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case gen_server_SUITE:call_format_status =logfile gen_server_suite.call_format_status.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.010961 +=elapsed 0.015761 =case gen_server_SUITE:error_format_status =logfile gen_server_suite.error_format_status.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.002166 +=elapsed 0.003963 =case gen_server_SUITE:terminate_crash_format =logfile gen_server_suite.terminate_crash_format.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.002633 +=elapsed 0.002621 =case gen_server_SUITE:crash_in_format_status =logfile gen_server_suite.crash_in_format_status.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:43 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.002258 +=elapsed 0.001778 =case gen_server_SUITE:throw_in_format_status =logfile gen_server_suite.throw_in_format_status.html -=started 2024-09-11 11:20:43 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.001744 +=elapsed 0.001973 =case gen_server_SUITE:format_all_status =logfile gen_server_suite.format_all_status.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 0.013967 +=elapsed 0.012193 =case gen_server_SUITE:end_per_group -=logfile gen_server_suite.end_per_group.473250.html +=logfile gen_server_suite.end_per_group.489442.html =group_props [{name,format_status}] -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok =elapsed 0.0 -=group_time 0.195s +=group_time 0.199s =case gen_server_SUITE:get_state =logfile gen_server_suite.get_state.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:54 =result ok -=elapsed 1.66e-4 +=elapsed 1.47e-4 =case gen_server_SUITE:replace_state =logfile gen_server_suite.replace_state.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:54 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 1.62e-4 +=elapsed 1.6e-4 =case gen_server_SUITE:call_with_huge_message_queue =logfile gen_server_suite.call_with_huge_message_queue.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.123953 +=elapsed 0.122228 =case gen_server_SUITE:init_per_group -=logfile gen_server_suite.init_per_group.473282.html +=logfile gen_server_suite.init_per_group.489474.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.002838 +=elapsed 0.00263 =case gen_server_SUITE:undef_handle_call =logfile gen_server_suite.undef_handle_call.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.002704 +=elapsed 0.002768 =case gen_server_SUITE:undef_handle_cast =logfile gen_server_suite.undef_handle_cast.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 7.22e-4 +=elapsed 8.09e-4 =case gen_server_SUITE:undef_handle_info =logfile gen_server_suite.undef_handle_info.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.101105 +=elapsed 0.100678 =case gen_server_SUITE:undef_handle_continue =logfile gen_server_suite.undef_handle_continue.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:44 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.001059 +=elapsed 7.48e-4 =case gen_server_SUITE:undef_init =logfile gen_server_suite.undef_init.html -=started 2024-09-11 11:20:44 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:55 =result ok -=elapsed 0.502321 +=elapsed 0.502984 =case gen_server_SUITE:undef_code_change =logfile gen_server_suite.undef_code_change.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:55 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 2.9e-5 +=elapsed 4.4e-5 =case gen_server_SUITE:undef_terminate1 =logfile gen_server_suite.undef_terminate1.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 1.7e-5 +=elapsed 2.2e-5 =case gen_server_SUITE:undef_terminate2 =logfile gen_server_suite.undef_terminate2.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 5.37e-4 +=elapsed 6.1e-4 =case gen_server_SUITE:end_per_group -=logfile gen_server_suite.end_per_group.473314.html +=logfile gen_server_suite.end_per_group.489506.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok =elapsed 0.0 -=group_time 0.817s +=group_time 0.819s =case gen_server_SUITE:undef_in_terminate =logfile gen_server_suite.undef_in_terminate.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 7.99e-4 +=elapsed 9.03e-4 =case gen_server_SUITE:undef_in_handle_info =logfile gen_server_suite.undef_in_handle_info.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 7.54e-4 +=elapsed 7.51e-4 =case gen_server_SUITE:format_log_1 =logfile gen_server_suite.format_log_1.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 1.07e-4 +=elapsed 1.32e-4 =case gen_server_SUITE:format_log_2 =logfile gen_server_suite.format_log_2.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 6.62e-4 +=elapsed 8.19e-4 =case gen_server_SUITE:format_log_with_process_label =logfile gen_server_suite.format_log_with_process_label.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 2.06e-4 +=elapsed 3.01e-4 =case gen_server_SUITE:reply_by_alias_with_payload =logfile gen_server_suite.reply_by_alias_with_payload.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 1.1e-5 +=elapsed 1.2e-5 =case gen_server_SUITE:end_per_suite =logfile gen_server_suite.end_per_suite.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok =elapsed 0.0 -=group_time 64.383s +=group_time 64.314s =case gen_statem_SUITE:init_per_suite =logfile gen_statem_suite.init_per_suite.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case gen_statem_SUITE:init_per_group =logfile gen_statem_suite.init_per_group.html =group_props [{name,start}] -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:45 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:56 =result ok =elapsed 0.0 =case gen_statem_SUITE:start1 =logfile gen_statem_suite.start1.html -=started 2024-09-11 11:20:45 -=ended 2024-09-11 11:20:48 +=started 2024-09-12 10:42:56 +=ended 2024-09-12 10:42:59 =result ok -=elapsed 2.80791 +=elapsed 2.807823 =case gen_statem_SUITE:start2 =logfile gen_statem_suite.start2.html -=started 2024-09-11 11:20:48 -=ended 2024-09-11 11:20:50 +=started 2024-09-12 10:42:59 +=ended 2024-09-12 10:43:01 =result ok -=elapsed 1.402923 +=elapsed 1.40287 =case gen_statem_SUITE:start3 =logfile gen_statem_suite.start3.html -=started 2024-09-11 11:20:50 -=ended 2024-09-11 11:20:52 +=started 2024-09-12 10:43:01 +=ended 2024-09-12 10:43:03 =result ok -=elapsed 1.408918 +=elapsed 1.408864 =case gen_statem_SUITE:start4 =logfile gen_statem_suite.start4.html -=started 2024-09-11 11:20:52 -=ended 2024-09-11 11:20:53 +=started 2024-09-12 10:43:03 +=ended 2024-09-12 10:43:04 =result ok -=elapsed 0.500954 +=elapsed 0.500874 =case gen_statem_SUITE:start5a =logfile gen_statem_suite.start5a.html -=started 2024-09-11 11:20:53 -=ended 2024-09-11 11:20:54 +=started 2024-09-12 10:43:04 +=ended 2024-09-12 10:43:05 =result ok -=elapsed 0.500922 +=elapsed 0.501873 =case gen_statem_SUITE:start5b =logfile gen_statem_suite.start5b.html -=started 2024-09-11 11:20:54 -=ended 2024-09-11 11:20:55 +=started 2024-09-12 10:43:05 +=ended 2024-09-12 10:43:06 =result ok -=elapsed 0.500925 +=elapsed 0.500887 =case gen_statem_SUITE:start6 =logfile gen_statem_suite.start6.html -=started 2024-09-11 11:20:55 -=ended 2024-09-11 11:20:57 +=started 2024-09-12 10:43:06 +=ended 2024-09-12 10:43:08 =result ok -=elapsed 1.402906 +=elapsed 1.402831 =case gen_statem_SUITE:start7 =logfile gen_statem_suite.start7.html -=started 2024-09-11 11:20:57 -=ended 2024-09-11 11:21:02 +=started 2024-09-12 10:43:08 +=ended 2024-09-12 10:43:13 =result ok -=elapsed 4.609924 +=elapsed 4.6099 =case gen_statem_SUITE:start8 =logfile gen_statem_suite.start8.html -=started 2024-09-11 11:21:02 -=ended 2024-09-11 11:21:05 +=started 2024-09-12 10:43:13 +=ended 2024-09-12 10:43:16 =result ok -=elapsed 2.304882 +=elapsed 2.304846 =case gen_statem_SUITE:start9 =logfile gen_statem_suite.start9.html -=started 2024-09-11 11:21:05 -=ended 2024-09-11 11:21:10 +=started 2024-09-12 10:43:16 +=ended 2024-09-12 10:43:21 =result ok -=elapsed 4.609926 +=elapsed 4.609885 =case gen_statem_SUITE:start10 =logfile gen_statem_suite.start10.html -=started 2024-09-11 11:21:10 -=ended 2024-09-11 11:21:13 +=started 2024-09-12 10:43:21 +=ended 2024-09-12 10:43:24 =result ok -=elapsed 2.304925 +=elapsed 2.304892 =case gen_statem_SUITE:start11 =logfile gen_statem_suite.start11.html -=started 2024-09-11 11:21:13 -=ended 2024-09-11 11:21:14 +=started 2024-09-12 10:43:24 +=ended 2024-09-12 10:43:25 =result ok -=elapsed 0.502922 +=elapsed 0.502894 =case gen_statem_SUITE:start12 =logfile gen_statem_suite.start12.html -=started 2024-09-11 11:21:14 -=ended 2024-09-11 11:21:17 +=started 2024-09-12 10:43:25 +=ended 2024-09-12 10:43:28 =result ok -=elapsed 2.304912 +=elapsed 2.304887 =case gen_statem_SUITE:next_events =logfile gen_statem_suite.next_events.html -=started 2024-09-11 11:21:17 -=ended 2024-09-11 11:21:17 +=started 2024-09-12 10:43:28 +=ended 2024-09-12 10:43:28 =result ok -=elapsed 1.38e-4 +=elapsed 1.82e-4 =case gen_statem_SUITE:end_per_group =logfile gen_statem_suite.end_per_group.html =group_props [{name,start}] -=started 2024-09-11 11:21:17 -=ended 2024-09-11 11:21:17 +=started 2024-09-12 10:43:28 +=ended 2024-09-12 10:43:28 =result ok =elapsed 0.0 -=group_time 32.514s +=group_time 32.518s =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.473346.html +=logfile gen_statem_suite.init_per_group.489538.html =group_props [{name,start_handle_event}] -=started 2024-09-11 11:21:17 -=ended 2024-09-11 11:21:17 +=started 2024-09-12 10:43:28 +=ended 2024-09-12 10:43:28 =result ok =elapsed 0.0 =case gen_statem_SUITE:start1 -=logfile gen_statem_suite.start1.473378.html -=started 2024-09-11 11:21:17 -=ended 2024-09-11 11:21:21 +=logfile gen_statem_suite.start1.489570.html +=started 2024-09-12 10:43:28 +=ended 2024-09-12 10:43:32 =result ok -=elapsed 2.808913 +=elapsed 2.808886 =case gen_statem_SUITE:start2 -=logfile gen_statem_suite.start2.473410.html -=started 2024-09-11 11:21:21 -=ended 2024-09-11 11:21:23 +=logfile gen_statem_suite.start2.489602.html +=started 2024-09-12 10:43:32 +=ended 2024-09-12 10:43:34 =result ok -=elapsed 1.402923 +=elapsed 1.402873 =case gen_statem_SUITE:start3 -=logfile gen_statem_suite.start3.473442.html -=started 2024-09-11 11:21:23 -=ended 2024-09-11 11:21:25 +=logfile gen_statem_suite.start3.489634.html +=started 2024-09-12 10:43:34 +=ended 2024-09-12 10:43:36 =result ok -=elapsed 1.408929 +=elapsed 1.408878 =case gen_statem_SUITE:start4 -=logfile gen_statem_suite.start4.473474.html -=started 2024-09-11 11:21:25 -=ended 2024-09-11 11:21:26 +=logfile gen_statem_suite.start4.489666.html +=started 2024-09-12 10:43:36 +=ended 2024-09-12 10:43:37 =result ok -=elapsed 0.500949 +=elapsed 0.500843 =case gen_statem_SUITE:start5a -=logfile gen_statem_suite.start5a.473506.html -=started 2024-09-11 11:21:26 -=ended 2024-09-11 11:21:27 +=logfile gen_statem_suite.start5a.489698.html +=started 2024-09-12 10:43:37 +=ended 2024-09-12 10:43:38 =result ok -=elapsed 0.500914 +=elapsed 0.500876 =case gen_statem_SUITE:start5b -=logfile gen_statem_suite.start5b.473538.html -=started 2024-09-11 11:21:27 -=ended 2024-09-11 11:21:28 +=logfile gen_statem_suite.start5b.489730.html +=started 2024-09-12 10:43:38 +=ended 2024-09-12 10:43:39 =result ok -=elapsed 0.500905 +=elapsed 0.500866 =case gen_statem_SUITE:start6 -=logfile gen_statem_suite.start6.473570.html -=started 2024-09-11 11:21:28 -=ended 2024-09-11 11:21:30 +=logfile gen_statem_suite.start6.489762.html +=started 2024-09-12 10:43:39 +=ended 2024-09-12 10:43:41 =result ok -=elapsed 1.402927 +=elapsed 1.402912 =case gen_statem_SUITE:start7 -=logfile gen_statem_suite.start7.473602.html -=started 2024-09-11 11:21:30 -=ended 2024-09-11 11:21:35 +=logfile gen_statem_suite.start7.489794.html +=started 2024-09-12 10:43:41 +=ended 2024-09-12 10:43:46 =result ok -=elapsed 4.609935 +=elapsed 4.609857 =case gen_statem_SUITE:start8 -=logfile gen_statem_suite.start8.473634.html -=started 2024-09-11 11:21:35 -=ended 2024-09-11 11:21:38 +=logfile gen_statem_suite.start8.489826.html +=started 2024-09-12 10:43:46 +=ended 2024-09-12 10:43:48 =result ok -=elapsed 2.304928 +=elapsed 2.304893 =case gen_statem_SUITE:start9 -=logfile gen_statem_suite.start9.473666.html -=started 2024-09-11 11:21:38 -=ended 2024-09-11 11:21:43 +=logfile gen_statem_suite.start9.489858.html +=started 2024-09-12 10:43:48 +=ended 2024-09-12 10:43:54 =result ok -=elapsed 4.609904 +=elapsed 4.609888 =case gen_statem_SUITE:start10 -=logfile gen_statem_suite.start10.473698.html -=started 2024-09-11 11:21:43 -=ended 2024-09-11 11:21:46 +=logfile gen_statem_suite.start10.489890.html +=started 2024-09-12 10:43:54 +=ended 2024-09-12 10:43:56 =result ok -=elapsed 2.304925 +=elapsed 2.304887 =case gen_statem_SUITE:start11 -=logfile gen_statem_suite.start11.473730.html -=started 2024-09-11 11:21:46 -=ended 2024-09-11 11:21:47 +=logfile gen_statem_suite.start11.489922.html +=started 2024-09-12 10:43:56 +=ended 2024-09-12 10:43:57 =result ok -=elapsed 0.502924 +=elapsed 0.502884 =case gen_statem_SUITE:start12 -=logfile gen_statem_suite.start12.473762.html -=started 2024-09-11 11:21:47 -=ended 2024-09-11 11:21:49 +=logfile gen_statem_suite.start12.489954.html +=started 2024-09-12 10:43:57 +=ended 2024-09-12 10:44:00 =result ok -=elapsed 2.30489 +=elapsed 2.304873 =case gen_statem_SUITE:next_events -=logfile gen_statem_suite.next_events.473794.html -=started 2024-09-11 11:21:49 -=ended 2024-09-11 11:21:50 +=logfile gen_statem_suite.next_events.489986.html +=started 2024-09-12 10:44:00 +=ended 2024-09-12 10:44:01 =result ok -=elapsed 1.95e-4 +=elapsed 2.48e-4 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.473826.html +=logfile gen_statem_suite.end_per_group.490018.html =group_props [{name,start_handle_event}] -=started 2024-09-11 11:21:50 -=ended 2024-09-11 11:21:50 +=started 2024-09-12 10:44:01 +=ended 2024-09-12 10:44:01 =result ok =elapsed 0.0 -=group_time 32.523s +=group_time 32.519s =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.473858.html +=logfile gen_statem_suite.init_per_group.490050.html =group_props [{name,stop}] -=started 2024-09-11 11:21:50 -=ended 2024-09-11 11:21:50 +=started 2024-09-12 10:44:01 +=ended 2024-09-12 10:44:01 =result ok =elapsed 0.0 =case gen_statem_SUITE:stop1 =logfile gen_statem_suite.stop1.html -=started 2024-09-11 11:21:50 -=ended 2024-09-11 11:21:51 +=started 2024-09-12 10:44:01 +=ended 2024-09-12 10:44:01 =result ok -=elapsed 1.24e-4 +=elapsed 1.36e-4 =case gen_statem_SUITE:stop2 =logfile gen_statem_suite.stop2.html -=started 2024-09-11 11:21:51 -=ended 2024-09-11 11:21:51 +=started 2024-09-12 10:44:01 +=ended 2024-09-12 10:44:02 =result ok -=elapsed 0.001182 +=elapsed 9.1e-4 =case gen_statem_SUITE:stop3 =logfile gen_statem_suite.stop3.html -=started 2024-09-11 11:21:51 -=ended 2024-09-11 11:21:52 +=started 2024-09-12 10:44:02 +=ended 2024-09-12 10:44:02 =result ok -=elapsed 1.26e-4 +=elapsed 1.29e-4 =case gen_statem_SUITE:stop4 =logfile gen_statem_suite.stop4.html -=started 2024-09-11 11:21:52 -=ended 2024-09-11 11:21:52 +=started 2024-09-12 10:44:02 +=ended 2024-09-12 10:44:03 =result ok -=elapsed 1.2e-4 +=elapsed 1.39e-4 =case gen_statem_SUITE:stop5 =logfile gen_statem_suite.stop5.html -=started 2024-09-11 11:21:52 -=ended 2024-09-11 11:21:53 +=started 2024-09-12 10:44:03 +=ended 2024-09-12 10:44:04 =result ok -=elapsed 1.02e-4 +=elapsed 1.84e-4 =case gen_statem_SUITE:stop6 =logfile gen_statem_suite.stop6.html -=started 2024-09-11 11:21:53 -=ended 2024-09-11 11:21:53 +=started 2024-09-12 10:44:04 +=ended 2024-09-12 10:44:04 =result ok -=elapsed 1.97e-4 +=elapsed 2.98e-4 =case gen_statem_SUITE:stop7 =logfile gen_statem_suite.stop7.html -=started 2024-09-11 11:21:53 -=ended 2024-09-11 11:21:54 +=started 2024-09-12 10:44:04 +=ended 2024-09-12 10:44:05 =result ok -=elapsed 1.34e-4 +=elapsed 1.86e-4 =case gen_statem_SUITE:stop8 =logfile gen_statem_suite.stop8.html -=started 2024-09-11 11:21:54 -=ended 2024-09-11 11:21:54 +=started 2024-09-12 10:44:05 +=ended 2024-09-12 10:44:05 =result ok -=elapsed 0.17102 +=elapsed 0.170187 =case gen_statem_SUITE:stop9 =logfile gen_statem_suite.stop9.html -=started 2024-09-11 11:21:54 -=ended 2024-09-11 11:21:55 +=started 2024-09-12 10:44:05 +=ended 2024-09-12 10:44:06 =result ok -=elapsed 0.173912 +=elapsed 0.157554 =case gen_statem_SUITE:stop10 =logfile gen_statem_suite.stop10.html -=started 2024-09-11 11:21:55 -=ended 2024-09-11 11:21:56 +=started 2024-09-12 10:44:06 +=ended 2024-09-12 10:44:07 =result ok -=elapsed 0.343829 +=elapsed 0.344183 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.497443.html +=logfile gen_statem_suite.end_per_group.490210.html =group_props [{name,stop}] -=started 2024-09-11 11:21:56 -=ended 2024-09-11 11:21:56 +=started 2024-09-12 10:44:07 +=ended 2024-09-12 10:44:07 =result ok =elapsed 0.0 -=group_time 5.951s +=group_time 5.932s =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.497475.html +=logfile gen_statem_suite.init_per_group.490242.html =group_props [{name,stop_handle_event}] -=started 2024-09-11 11:21:56 -=ended 2024-09-11 11:21:56 +=started 2024-09-12 10:44:07 +=ended 2024-09-12 10:44:07 =result ok =elapsed 0.0 =case gen_statem_SUITE:stop1 -=logfile gen_statem_suite.stop1.497507.html -=started 2024-09-11 11:21:56 -=ended 2024-09-11 11:21:56 +=logfile gen_statem_suite.stop1.490274.html +=started 2024-09-12 10:44:07 +=ended 2024-09-12 10:44:07 =result ok -=elapsed 1.96e-4 +=elapsed 2.02e-4 =case gen_statem_SUITE:stop2 -=logfile gen_statem_suite.stop2.497539.html -=started 2024-09-11 11:21:56 -=ended 2024-09-11 11:21:57 +=logfile gen_statem_suite.stop2.490306.html +=started 2024-09-12 10:44:07 +=ended 2024-09-12 10:44:08 =result ok -=elapsed 0.001079 +=elapsed 9.34e-4 =case gen_statem_SUITE:stop3 -=logfile gen_statem_suite.stop3.497571.html -=started 2024-09-11 11:21:57 -=ended 2024-09-11 11:21:58 +=logfile gen_statem_suite.stop3.490338.html +=started 2024-09-12 10:44:08 +=ended 2024-09-12 10:44:08 =result ok -=elapsed 1.27e-4 +=elapsed 2.14e-4 =case gen_statem_SUITE:stop4 -=logfile gen_statem_suite.stop4.497603.html -=started 2024-09-11 11:21:58 -=ended 2024-09-11 11:21:58 +=logfile gen_statem_suite.stop4.402819.html +=started 2024-09-12 10:44:08 +=ended 2024-09-12 10:44:09 =result ok -=elapsed 1.57e-4 +=elapsed 2.21e-4 =case gen_statem_SUITE:stop5 -=logfile gen_statem_suite.stop5.497635.html -=started 2024-09-11 11:21:58 -=ended 2024-09-11 11:21:59 +=logfile gen_statem_suite.stop5.402851.html +=started 2024-09-12 10:44:09 +=ended 2024-09-12 10:44:09 =result ok -=elapsed 1.55e-4 +=elapsed 2.12e-4 =case gen_statem_SUITE:stop6 -=logfile gen_statem_suite.stop6.497667.html -=started 2024-09-11 11:21:59 -=ended 2024-09-11 11:21:59 +=logfile gen_statem_suite.stop6.490370.html +=started 2024-09-12 10:44:09 +=ended 2024-09-12 10:44:10 =result ok -=elapsed 2.69e-4 +=elapsed 3.18e-4 =case gen_statem_SUITE:stop7 -=logfile gen_statem_suite.stop7.497699.html -=started 2024-09-11 11:21:59 -=ended 2024-09-11 11:22:00 +=logfile gen_statem_suite.stop7.402883.html +=started 2024-09-12 10:44:10 +=ended 2024-09-12 10:44:11 =result ok -=elapsed 1.94e-4 +=elapsed 2.73e-4 =case gen_statem_SUITE:stop8 -=logfile gen_statem_suite.stop8.497731.html -=started 2024-09-11 11:22:00 -=ended 2024-09-11 11:22:00 +=logfile gen_statem_suite.stop8.402915.html +=started 2024-09-12 10:44:11 +=ended 2024-09-12 10:44:11 =result ok -=elapsed 0.159505 +=elapsed 0.161467 =case gen_statem_SUITE:stop9 -=logfile gen_statem_suite.stop9.497827.html -=started 2024-09-11 11:22:00 -=ended 2024-09-11 11:22:01 +=logfile gen_statem_suite.stop9.490434.html +=started 2024-09-12 10:44:11 +=ended 2024-09-12 10:44:12 =result ok -=elapsed 0.162183 +=elapsed 0.164338 =case gen_statem_SUITE:stop10 -=logfile gen_statem_suite.stop10.497891.html -=started 2024-09-11 11:22:01 -=ended 2024-09-11 11:22:02 +=logfile gen_statem_suite.stop10.403043.html +=started 2024-09-12 10:44:12 +=ended 2024-09-12 10:44:13 =result ok -=elapsed 0.351403 +=elapsed 0.351504 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.497955.html +=logfile gen_statem_suite.end_per_group.490530.html =group_props [{name,stop_handle_event}] -=started 2024-09-11 11:22:02 -=ended 2024-09-11 11:22:02 +=started 2024-09-12 10:44:13 +=ended 2024-09-12 10:44:13 =result ok =elapsed 0.0 -=group_time 5.934s +=group_time 5.939s =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.474114.html +=logfile gen_statem_suite.init_per_group.490562.html =group_props [{name,abnormal}] -=started 2024-09-11 11:22:02 -=ended 2024-09-11 11:22:02 +=started 2024-09-12 10:44:13 +=ended 2024-09-12 10:44:13 =result ok =elapsed 0.0 =case gen_statem_SUITE:abnormal1 =logfile gen_statem_suite.abnormal1.html -=started 2024-09-11 11:22:02 -=ended 2024-09-11 11:22:06 +=started 2024-09-12 10:44:13 +=ended 2024-09-12 10:44:17 =result ok -=elapsed 3.703905 +=elapsed 3.703893 =case gen_statem_SUITE:abnormal1clean =logfile gen_statem_suite.abnormal1clean.html -=started 2024-09-11 11:22:06 -=ended 2024-09-11 11:22:09 +=started 2024-09-12 10:44:17 +=ended 2024-09-12 10:44:20 =result ok -=elapsed 2.604944 +=elapsed 2.604884 =case gen_statem_SUITE:abnormal1dirty =logfile gen_statem_suite.abnormal1dirty.html -=started 2024-09-11 11:22:09 -=ended 2024-09-11 11:22:12 +=started 2024-09-12 10:44:20 +=ended 2024-09-12 10:44:23 =result ok -=elapsed 2.60491 +=elapsed 2.604872 =case gen_statem_SUITE:abnormal2 =logfile gen_statem_suite.abnormal2.html -=started 2024-09-11 11:22:12 -=ended 2024-09-11 11:22:13 +=started 2024-09-12 10:44:23 +=ended 2024-09-12 10:44:24 =result ok -=elapsed 0.501863 +=elapsed 0.501878 =case gen_statem_SUITE:abnormal3 =logfile gen_statem_suite.abnormal3.html -=started 2024-09-11 11:22:13 -=ended 2024-09-11 11:22:14 +=started 2024-09-12 10:44:24 +=ended 2024-09-12 10:44:25 =result ok -=elapsed 0.501857 +=elapsed 0.501832 =case gen_statem_SUITE:abnormal4 =logfile gen_statem_suite.abnormal4.html -=started 2024-09-11 11:22:14 -=ended 2024-09-11 11:22:15 +=started 2024-09-12 10:44:25 +=ended 2024-09-12 10:44:26 =result ok -=elapsed 0.501827 +=elapsed 0.501835 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.497987.html +=logfile gen_statem_suite.end_per_group.490594.html =group_props [{name,abnormal}] -=started 2024-09-11 11:22:15 -=ended 2024-09-11 11:22:16 +=started 2024-09-12 10:44:26 +=ended 2024-09-12 10:44:26 =result ok =elapsed 0.0 -=group_time 13.586s +=group_time 13.587s =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.498019.html +=logfile gen_statem_suite.init_per_group.490626.html =group_props [{name,abnormal_handle_event}] -=started 2024-09-11 11:22:16 -=ended 2024-09-11 11:22:16 +=started 2024-09-12 10:44:26 +=ended 2024-09-12 10:44:26 =result ok =elapsed 0.0 =case gen_statem_SUITE:abnormal1 -=logfile gen_statem_suite.abnormal1.498051.html -=started 2024-09-11 11:22:16 -=ended 2024-09-11 11:22:20 +=logfile gen_statem_suite.abnormal1.490658.html +=started 2024-09-12 10:44:26 +=ended 2024-09-12 10:44:31 =result ok -=elapsed 3.703923 +=elapsed 3.703884 =case gen_statem_SUITE:abnormal1clean -=logfile gen_statem_suite.abnormal1clean.498083.html -=started 2024-09-11 11:22:20 -=ended 2024-09-11 11:22:23 +=logfile gen_statem_suite.abnormal1clean.490690.html +=started 2024-09-12 10:44:31 +=ended 2024-09-12 10:44:34 =result ok -=elapsed 2.604916 +=elapsed 2.604869 =case gen_statem_SUITE:abnormal1dirty -=logfile gen_statem_suite.abnormal1dirty.498115.html -=started 2024-09-11 11:22:23 -=ended 2024-09-11 11:22:26 +=logfile gen_statem_suite.abnormal1dirty.490722.html +=started 2024-09-12 10:44:34 +=ended 2024-09-12 10:44:37 =result ok -=elapsed 2.604924 +=elapsed 2.604887 =case gen_statem_SUITE:abnormal2 -=logfile gen_statem_suite.abnormal2.498147.html -=started 2024-09-11 11:22:26 -=ended 2024-09-11 11:22:27 +=logfile gen_statem_suite.abnormal2.490754.html +=started 2024-09-12 10:44:37 +=ended 2024-09-12 10:44:38 =result ok -=elapsed 0.501875 +=elapsed 0.501836 =case gen_statem_SUITE:abnormal3 -=logfile gen_statem_suite.abnormal3.498179.html -=started 2024-09-11 11:22:27 -=ended 2024-09-11 11:22:28 +=logfile gen_statem_suite.abnormal3.490786.html +=started 2024-09-12 10:44:38 +=ended 2024-09-12 10:44:39 =result ok -=elapsed 0.501841 +=elapsed 0.501811 =case gen_statem_SUITE:abnormal4 -=logfile gen_statem_suite.abnormal4.498211.html -=started 2024-09-11 11:22:28 -=ended 2024-09-11 11:22:29 +=logfile gen_statem_suite.abnormal4.490818.html +=started 2024-09-12 10:44:39 +=ended 2024-09-12 10:44:40 =result ok -=elapsed 0.501901 +=elapsed 0.501889 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.498243.html +=logfile gen_statem_suite.end_per_group.403107.html =group_props [{name,abnormal_handle_event}] -=started 2024-09-11 11:22:29 -=ended 2024-09-11 11:22:29 +=started 2024-09-12 10:44:40 +=ended 2024-09-12 10:44:40 =result ok =elapsed 0.0 -=group_time 13.585s +=group_time 13.587s =case gen_statem_SUITE:shutdown =logfile gen_statem_suite.shutdown.html -=started 2024-09-11 11:22:29 -=ended 2024-09-11 11:22:31 +=started 2024-09-12 10:44:40 +=ended 2024-09-12 10:44:42 =result ok -=elapsed 1.402887 +=elapsed 1.402853 =case gen_statem_SUITE:loop_start_fail =logfile gen_statem_suite.loop_start_fail.html -=started 2024-09-11 11:22:31 -=ended 2024-09-11 11:22:37 +=started 2024-09-12 10:44:42 +=ended 2024-09-12 10:44:48 =result ok -=elapsed 5.100927 +=elapsed 5.094911 =case gen_statem_SUITE:stop_and_reply =logfile gen_statem_suite.stop_and_reply.html -=started 2024-09-11 11:22:37 -=ended 2024-09-11 11:22:38 +=started 2024-09-12 10:44:48 +=ended 2024-09-12 10:44:49 =result ok -=elapsed 1.002857 +=elapsed 1.002877 =case gen_statem_SUITE:state_enter =logfile gen_statem_suite.state_enter.html -=started 2024-09-11 11:22:38 -=ended 2024-09-11 11:22:42 +=started 2024-09-12 10:44:49 +=ended 2024-09-12 10:44:53 =result ok -=elapsed 3.50875 +=elapsed 3.508884 =case gen_statem_SUITE:event_order =logfile gen_statem_suite.event_order.html -=started 2024-09-11 11:22:42 -=ended 2024-09-11 11:22:44 +=started 2024-09-12 10:44:53 +=ended 2024-09-12 10:44:55 =result ok -=elapsed 1.002869 +=elapsed 1.002868 =case gen_statem_SUITE:state_timeout =logfile gen_statem_suite.state_timeout.html -=started 2024-09-11 11:22:44 -=ended 2024-09-11 11:22:46 +=started 2024-09-12 10:44:55 +=ended 2024-09-12 10:44:57 =result ok -=elapsed 1.501914 +=elapsed 1.501863 =case gen_statem_SUITE:timeout_cancel_and_update =logfile gen_statem_suite.timeout_cancel_and_update.html -=started 2024-09-11 11:22:46 -=ended 2024-09-11 11:22:47 +=started 2024-09-12 10:44:57 +=ended 2024-09-12 10:44:58 =result ok -=elapsed 0.569911 +=elapsed 0.569873 =case gen_statem_SUITE:event_types =logfile gen_statem_suite.event_types.html -=started 2024-09-11 11:22:47 -=ended 2024-09-11 11:22:48 +=started 2024-09-12 10:44:58 +=ended 2024-09-12 10:44:59 =result ok -=elapsed 0.501892 +=elapsed 0.501859 =case gen_statem_SUITE:generic_timers =logfile gen_statem_suite.generic_timers.html -=started 2024-09-11 11:22:48 -=ended 2024-09-11 11:22:50 +=started 2024-09-12 10:44:59 +=ended 2024-09-12 10:45:01 =result ok -=elapsed 1.501943 +=elapsed 1.501843 =case gen_statem_SUITE:code_change =logfile gen_statem_suite.code_change.html -=started 2024-09-11 11:22:50 -=ended 2024-09-11 11:22:50 +=started 2024-09-12 10:45:01 +=ended 2024-09-12 10:45:01 =result ok -=elapsed 2.95e-4 +=elapsed 3.4e-4 =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.498275.html +=logfile gen_statem_suite.init_per_group.490850.html =group_props [{name,sys}] -=started 2024-09-11 11:22:50 -=ended 2024-09-11 11:22:50 +=started 2024-09-12 10:45:01 +=ended 2024-09-12 10:45:01 =result ok -=elapsed 0.003785 +=elapsed 0.003776 =case gen_statem_SUITE:sys1 =logfile gen_statem_suite.sys1.html -=started 2024-09-11 11:22:50 -=ended 2024-09-11 11:22:54 +=started 2024-09-12 10:45:01 +=ended 2024-09-12 10:45:05 =result ok -=elapsed 3.000942 +=elapsed 3.000947 =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.498307.html +=logfile gen_statem_suite.init_per_group.490882.html =group_props [{name,format_status}] -=started 2024-09-11 11:22:54 -=ended 2024-09-11 11:22:54 +=started 2024-09-12 10:45:05 +=ended 2024-09-12 10:45:05 =result ok =elapsed 0.0 =case gen_statem_SUITE:call_format_status =logfile gen_statem_suite.call_format_status.html -=started 2024-09-11 11:22:54 -=ended 2024-09-11 11:22:55 +=started 2024-09-12 10:45:05 +=ended 2024-09-12 10:45:05 =result ok -=elapsed 0.005545 +=elapsed 0.004488 =case gen_statem_SUITE:error_format_status =logfile gen_statem_suite.error_format_status.html -=started 2024-09-11 11:22:55 -=ended 2024-09-11 11:22:56 +=started 2024-09-12 10:45:05 +=ended 2024-09-12 10:45:07 =result ok -=elapsed 1.003946 +=elapsed 1.004926 =case gen_statem_SUITE:terminate_crash_format =logfile gen_statem_suite.terminate_crash_format.html -=started 2024-09-11 11:22:56 -=ended 2024-09-11 11:22:58 +=started 2024-09-12 10:45:07 +=ended 2024-09-12 10:45:09 =result ok -=elapsed 1.511508 +=elapsed 1.511898 =case gen_statem_SUITE:format_all_status =logfile gen_statem_suite.format_all_status.html -=started 2024-09-11 11:22:58 -=ended 2024-09-11 11:22:59 +=started 2024-09-12 10:45:09 +=ended 2024-09-12 10:45:10 =result ok -=elapsed 0.001357 +=elapsed 0.001604 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.474146.html +=logfile gen_statem_suite.end_per_group.421892.html =group_props [{name,format_status}] -=started 2024-09-11 11:22:59 -=ended 2024-09-11 11:22:59 +=started 2024-09-12 10:45:10 +=ended 2024-09-12 10:45:10 =result ok =elapsed 0.0 -=group_time 4.640s +=group_time 4.641s =case gen_statem_SUITE:get_state =logfile gen_statem_suite.get_state.html -=started 2024-09-11 11:22:59 -=ended 2024-09-11 11:23:00 +=started 2024-09-12 10:45:10 +=ended 2024-09-12 10:45:11 =result ok -=elapsed 0.500911 +=elapsed 0.500877 =case gen_statem_SUITE:replace_state =logfile gen_statem_suite.replace_state.html -=started 2024-09-11 11:23:00 -=ended 2024-09-11 11:23:01 +=started 2024-09-12 10:45:11 +=ended 2024-09-12 10:45:12 =result ok -=elapsed 0.500923 +=elapsed 0.500896 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.498339.html +=logfile gen_statem_suite.end_per_group.421924.html =group_props [{name,sys}] -=started 2024-09-11 11:23:01 -=ended 2024-09-11 11:23:01 +=started 2024-09-12 10:45:12 +=ended 2024-09-12 10:45:12 =result ok =elapsed 0.0 -=group_time 10.263s +=group_time 10.265s =case gen_statem_SUITE:hibernate =logfile gen_statem_suite.hibernate.html -=started 2024-09-11 11:23:01 -=ended 2024-09-11 11:23:03 +=started 2024-09-12 10:45:12 +=ended 2024-09-12 10:45:13 =result ok -=elapsed 1.309916 +=elapsed 1.309871 =case gen_statem_SUITE:auto_hibernate =logfile gen_statem_suite.auto_hibernate.html -=started 2024-09-11 11:23:03 -=ended 2024-09-11 11:23:08 +=started 2024-09-12 10:45:13 +=ended 2024-09-12 10:45:19 =result ok -=elapsed 4.786915 +=elapsed 4.786823 =case gen_statem_SUITE:enter_loop =logfile gen_statem_suite.enter_loop.html -=started 2024-09-11 11:23:08 -=ended 2024-09-11 11:23:09 +=started 2024-09-12 10:45:19 +=ended 2024-09-12 10:45:20 =result ok -=elapsed 0.503904 +=elapsed 0.503832 =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.474178.html +=logfile gen_statem_suite.init_per_group.490914.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:23:09 -=ended 2024-09-11 11:23:09 +=started 2024-09-12 10:45:20 +=ended 2024-09-12 10:45:20 =result ok -=elapsed 0.006904 +=elapsed 0.007078 =case gen_statem_SUITE:undef_code_change =logfile gen_statem_suite.undef_code_change.html -=started 2024-09-11 11:23:09 -=ended 2024-09-11 11:23:09 +=started 2024-09-12 10:45:20 +=ended 2024-09-12 10:45:20 =result ok -=elapsed 0.002271 +=elapsed 0.002311 =case gen_statem_SUITE:undef_terminate1 =logfile gen_statem_suite.undef_terminate1.html -=started 2024-09-11 11:23:09 -=ended 2024-09-11 11:23:10 +=started 2024-09-12 10:45:20 +=ended 2024-09-12 10:45:21 =result ok -=elapsed 2.34e-4 +=elapsed 2.59e-4 =case gen_statem_SUITE:undef_terminate2 =logfile gen_statem_suite.undef_terminate2.html -=started 2024-09-11 11:23:10 -=ended 2024-09-11 11:23:11 +=started 2024-09-12 10:45:21 +=ended 2024-09-12 10:45:21 =result ok -=elapsed 0.001342 +=elapsed 0.00103 =case gen_statem_SUITE:pop_too_many =logfile gen_statem_suite.pop_too_many.html -=started 2024-09-11 11:23:11 -=ended 2024-09-11 11:23:11 +=started 2024-09-12 10:45:21 +=ended 2024-09-12 10:45:22 =result ok -=elapsed 0.001733 +=elapsed 0.002129 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.474210.html +=logfile gen_statem_suite.end_per_group.490946.html =group_props [{name,undef_callbacks}] -=started 2024-09-11 11:23:11 -=ended 2024-09-11 11:23:11 +=started 2024-09-12 10:45:22 +=ended 2024-09-12 10:45:22 =result ok =elapsed 0.0 -=group_time 2.131s +=group_time 2.130s =case gen_statem_SUITE:undef_in_terminate =logfile gen_statem_suite.undef_in_terminate.html -=started 2024-09-11 11:23:11 -=ended 2024-09-11 11:23:12 +=started 2024-09-12 10:45:22 +=ended 2024-09-12 10:45:22 =result ok -=elapsed 9.75e-4 +=elapsed 9.88e-4 =case gen_statem_SUITE:init_per_group -=logfile gen_statem_suite.init_per_group.474242.html +=logfile gen_statem_suite.init_per_group.490978.html =group_props [{name,format_log}] -=started 2024-09-11 11:23:12 -=ended 2024-09-11 11:23:12 +=started 2024-09-12 10:45:22 +=ended 2024-09-12 10:45:22 =result ok =elapsed 0.0 =case gen_statem_SUITE:format_log_1 =logfile gen_statem_suite.format_log_1.html -=started 2024-09-11 11:23:12 -=ended 2024-09-11 11:23:12 +=started 2024-09-12 10:45:22 +=ended 2024-09-12 10:45:23 =result ok -=elapsed 2.11e-4 +=elapsed 1.97e-4 =case gen_statem_SUITE:format_log_2 =logfile gen_statem_suite.format_log_2.html -=started 2024-09-11 11:23:12 -=ended 2024-09-11 11:23:13 +=started 2024-09-12 10:45:23 +=ended 2024-09-12 10:45:24 =result ok -=elapsed 0.001139 +=elapsed 0.001467 =case gen_statem_SUITE:format_log_with_process_label =logfile gen_statem_suite.format_log_with_process_label.html -=started 2024-09-11 11:23:13 -=ended 2024-09-11 11:23:13 +=started 2024-09-12 10:45:24 +=ended 2024-09-12 10:45:24 =result ok -=elapsed 3.42e-4 +=elapsed 2.43e-4 =case gen_statem_SUITE:end_per_group -=logfile gen_statem_suite.end_per_group.474274.html +=logfile gen_statem_suite.end_per_group.491010.html =group_props [{name,format_log}] -=started 2024-09-11 11:23:13 -=ended 2024-09-11 11:23:13 +=started 2024-09-12 10:45:24 +=ended 2024-09-12 10:45:24 =result ok =elapsed 0.0 =group_time 1.595s =case gen_statem_SUITE:reply_by_alias_with_payload =logfile gen_statem_suite.reply_by_alias_with_payload.html -=started 2024-09-11 11:23:13 -=ended 2024-09-11 11:23:14 +=started 2024-09-12 10:45:24 +=ended 2024-09-12 10:45:25 =result ok -=elapsed 1.3e-5 +=elapsed 2.0e-5 =case gen_statem_SUITE:send_request_receive_reqid_collection =logfile gen_statem_suite.send_request_receive_reqid_collection.html -=started 2024-09-11 11:23:14 -=ended 2024-09-11 11:23:16 +=started 2024-09-12 10:45:25 +=ended 2024-09-12 10:45:27 =result ok -=elapsed 1.902957 +=elapsed 1.902951 =case gen_statem_SUITE:send_request_wait_reqid_collection =logfile gen_statem_suite.send_request_wait_reqid_collection.html -=started 2024-09-11 11:23:16 -=ended 2024-09-11 11:23:18 +=started 2024-09-12 10:45:27 +=ended 2024-09-12 10:45:29 =result ok -=elapsed 1.802963 +=elapsed 1.802925 =case gen_statem_SUITE:send_request_check_reqid_collection =logfile gen_statem_suite.send_request_check_reqid_collection.html -=started 2024-09-11 11:23:18 -=ended 2024-09-11 11:23:20 +=started 2024-09-12 10:45:29 +=ended 2024-09-12 10:45:31 =result ok -=elapsed 1.003974 +=elapsed 1.00394 =case gen_statem_SUITE:end_per_suite =logfile gen_statem_suite.end_per_suite.html -=started 2024-09-11 11:23:20 -=ended 2024-09-11 11:23:20 +=started 2024-09-12 10:45:31 +=ended 2024-09-12 10:45:31 =result ok =elapsed 0.0 -=group_time 155.158s +=group_time 155.149s =case id_transform_SUITE:init_per_suite =logfile id_transform_suite.init_per_suite.html -=started 2024-09-11 11:23:20 -=ended 2024-09-11 11:23:20 +=started 2024-09-12 10:45:31 +=ended 2024-09-12 10:45:31 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case id_transform_SUITE:id_transform =logfile id_transform_suite.id_transform.html -=started 2024-09-11 11:23:20 -=ended 2024-09-11 11:23:23 +=started 2024-09-12 10:45:31 +=ended 2024-09-12 10:45:34 =result ok -=elapsed 3.321889 +=elapsed 3.373953 =case id_transform_SUITE:end_per_suite =logfile id_transform_suite.end_per_suite.html -=started 2024-09-11 11:23:23 -=ended 2024-09-11 11:23:23 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok =elapsed 0.0 -=group_time 3.377s +=group_time 3.427s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.474306.html +=logfile ct_framework.init_per_suite.491042.html =group_props [{suite,io_SUITE}] -=started 2024-09-11 11:23:23 -=ended 2024-09-11 11:23:23 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok =elapsed 0.0 =case io_SUITE:error_1 =logfile io_suite.error_1.html -=started 2024-09-11 11:23:23 -=ended 2024-09-11 11:23:23 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok -=elapsed 0.002789 +=elapsed 0.002809 =case io_SUITE:float_g =logfile io_suite.float_g.html -=started 2024-09-11 11:23:23 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok -=elapsed 4.49e-4 +=elapsed 4.39e-4 =case io_SUITE:float_w =logfile io_suite.float_w.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok -=elapsed 1.8e-4 +=elapsed 1.81e-4 =case io_SUITE:otp_5403 =logfile io_suite.otp_5403.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:34 =result ok -=elapsed 1.4e-5 +=elapsed 1.5e-5 =case io_SUITE:otp_5813 =logfile io_suite.otp_5813.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:34 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 4.3e-4 +=elapsed 4.62e-4 =case io_SUITE:otp_6230 =logfile io_suite.otp_6230.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 0.004892 +=elapsed 0.005288 =case io_SUITE:otp_6282 =logfile io_suite.otp_6282.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok =elapsed 6.6e-5 =case io_SUITE:otp_6354 =logfile io_suite.otp_6354.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 8.86e-4 +=elapsed 8.84e-4 =case io_SUITE:otp_6495 =logfile io_suite.otp_6495.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 2.0e-5 +=elapsed 1.9e-5 =case io_SUITE:otp_6517 =logfile io_suite.otp_6517.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok =elapsed 5.0e-6 =case io_SUITE:otp_6502 =logfile io_suite.otp_6502.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok =elapsed 3.2e-5 =case io_SUITE:manpage =logfile io_suite.manpage.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 3.36e-4 +=elapsed 3.35e-4 =case io_SUITE:otp_6708 =logfile io_suite.otp_6708.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:24 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:35 =result ok -=elapsed 2.29e-4 +=elapsed 2.28e-4 =case io_SUITE:otp_7084 =logfile io_suite.otp_7084.html -=started 2024-09-11 11:23:24 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:35 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 0.970674 +=elapsed 0.97112 =case io_SUITE:otp_7421 =logfile io_suite.otp_7421.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 1.7e-5 +=elapsed 1.5e-5 =case io_SUITE:io_lib_collect_line_3_wb =logfile io_suite.io_lib_collect_line_3_wb.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 8.0e-5 +=elapsed 6.1e-5 =case io_SUITE:cr_whitespace_in_string =logfile io_suite.cr_whitespace_in_string.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 0.001687 +=elapsed 0.001776 =case io_SUITE:io_fread_newlines =logfile io_suite.io_fread_newlines.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 0.010468 +=elapsed 0.00983 =case io_SUITE:otp_8989 =logfile io_suite.otp_8989.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok -=elapsed 1.46e-4 +=elapsed 9.8e-5 =case io_SUITE:io_lib_fread_literal =logfile io_suite.io_lib_fread_literal.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:25 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:36 =result ok =elapsed 8.0e-6 =case io_SUITE:printable_range =logfile io_suite.printable_range.html -=started 2024-09-11 11:23:25 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:36 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 0.823461 +=elapsed 0.843191 =case io_SUITE:bad_printable_range =logfile io_suite.bad_printable_range.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 0.009062 +=elapsed 0.009037 =case io_SUITE:format_neg_zero =logfile io_suite.format_neg_zero.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 1.4e-5 +=elapsed 1.5e-5 =case io_SUITE:io_lib_print_binary_depth_one =logfile io_suite.io_lib_print_binary_depth_one.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok =elapsed 2.6e-5 =case io_SUITE:otp_10302 =logfile io_suite.otp_10302.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 0.326179 +=elapsed 0.327996 =case io_SUITE:otp_10755 =logfile io_suite.otp_10755.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 0.002746 +=elapsed 0.002321 =case io_SUITE:otp_10836 =logfile io_suite.otp_10836.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 4.0e-6 +=elapsed 3.0e-6 =case io_SUITE:io_lib_width_too_small =logfile io_suite.io_lib_width_too_small.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:26 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:37 =result ok -=elapsed 5.0e-6 +=elapsed 4.0e-6 =case io_SUITE:io_with_huge_message_queue =logfile io_suite.io_with_huge_message_queue.html -=started 2024-09-11 11:23:26 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:37 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 0.438093 +=elapsed 0.435943 =case io_SUITE:calling_self =logfile io_suite.calling_self.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 4.0e-6 +=elapsed 3.0e-6 =case io_SUITE:format_string =logfile io_suite.format_string.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 1.3e-5 +=elapsed 1.0e-5 =case io_SUITE:maps =logfile io_suite.maps.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 9.11e-4 +=elapsed 7.59e-4 =case io_SUITE:coverage =logfile io_suite.coverage.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 1.39e-4 +=elapsed 9.2e-5 =case io_SUITE:otp_14178_unicode_atoms =logfile io_suite.otp_14178_unicode_atoms.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 0.001948 +=elapsed 0.001935 =case io_SUITE:otp_14175 =logfile io_suite.otp_14175.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 4.39e-4 +=elapsed 3.66e-4 =case io_SUITE:otp_14285 =logfile io_suite.otp_14285.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 7.96e-4 +=elapsed 6.8e-4 =case io_SUITE:limit_term =logfile io_suite.limit_term.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 4.07e-4 +=elapsed 3.14e-4 =case io_SUITE:otp_14983 =logfile io_suite.otp_14983.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 0.169012 +=elapsed 0.162622 =case io_SUITE:otp_15103 =logfile io_suite.otp_15103.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok =elapsed 3.5e-5 =case io_SUITE:otp_15076 =logfile io_suite.otp_15076.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 0.002431 +=elapsed 0.002362 =case io_SUITE:otp_15159 =logfile io_suite.otp_15159.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok =elapsed 6.0e-6 =case io_SUITE:otp_15639 =logfile io_suite.otp_15639.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok =elapsed 5.3e-5 =case io_SUITE:otp_15705 =logfile io_suite.otp_15705.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 3.2e-5 +=elapsed 3.1e-5 =case io_SUITE:otp_15847 =logfile io_suite.otp_15847.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok =elapsed 9.0e-6 =case io_SUITE:otp_15875 =logfile io_suite.otp_15875.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok -=elapsed 1.0e-5 +=elapsed 1.1e-5 =case io_SUITE:github_4801 =logfile io_suite.github_4801.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:27 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:38 =result ok =elapsed 6.0e-6 =case io_SUITE:chars_limit =logfile io_suite.chars_limit.html -=started 2024-09-11 11:23:27 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:38 +=ended 2024-09-12 10:45:39 =result ok -=elapsed 0.314225 +=elapsed 0.309974 =case io_SUITE:error_info =logfile io_suite.error_info.html -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:39 =result ok -=elapsed 0.067924 +=elapsed 0.066957 =case io_SUITE:otp_17525 =logfile io_suite.otp_17525.html -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:39 =result ok -=elapsed 5.2e-5 +=elapsed 4.0e-5 =case io_SUITE:unscan_format_without_maps_order =logfile io_suite.unscan_format_without_maps_order.html -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:39 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case io_SUITE:build_text_without_maps_order =logfile io_suite.build_text_without_maps_order.html -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:39 =result ok =elapsed 2.0e-6 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.474882.html +=logfile ct_framework.end_per_suite.491618.html =group_props [{suite,io_SUITE}] -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:28 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:39 =result ok =elapsed 0.0 -=group_time 4.444s +=group_time 4.436s =case io_proto_SUITE:init_per_suite =logfile io_proto_suite.init_per_suite.html -=started 2024-09-11 11:23:28 -=ended 2024-09-11 11:23:31 +=started 2024-09-12 10:45:39 +=ended 2024-09-12 10:45:42 =result ok -=elapsed 2.703315 +=elapsed 2.698928 =case io_proto_SUITE:setopts_getopts =logfile io_proto_suite.setopts_getopts.html -=started 2024-09-11 11:23:31 -=ended 2024-09-11 11:23:37 +=started 2024-09-12 10:45:42 +=ended 2024-09-12 10:45:48 =result ok -=elapsed 6.565371 +=elapsed 6.595002 =case io_proto_SUITE:unicode_options =logfile io_proto_suite.unicode_options.html -=started 2024-09-11 11:23:37 -=ended 2024-09-11 11:23:43 +=started 2024-09-12 10:45:48 +=ended 2024-09-12 10:45:54 =result ok -=elapsed 5.409495 +=elapsed 5.417986 =case io_proto_SUITE:unicode_options_gen =logfile io_proto_suite.unicode_options_gen.html -=started 2024-09-11 11:23:43 -=ended 2024-09-11 11:23:59 +=started 2024-09-12 10:45:54 +=ended 2024-09-12 10:46:10 =result ok -=elapsed 16.003044 +=elapsed 16.242842 =case io_proto_SUITE:binary_options =logfile io_proto_suite.binary_options.html -=started 2024-09-11 11:23:59 -=ended 2024-09-11 11:24:04 +=started 2024-09-12 10:46:10 +=ended 2024-09-12 10:46:15 =result ok -=elapsed 5.396961 +=elapsed 5.412293 =case io_proto_SUITE:read_modes_gl =logfile io_proto_suite.read_modes_gl.html -=started 2024-09-11 11:24:04 -=ended 2024-09-11 11:24:07 +=started 2024-09-12 10:46:15 +=ended 2024-09-12 10:46:19 =result ok -=elapsed 3.21158 +=elapsed 3.219871 =case io_proto_SUITE:read_modes_ogl =logfile io_proto_suite.read_modes_ogl.html -=started 2024-09-11 11:24:07 -=ended 2024-09-11 11:24:11 +=started 2024-09-12 10:46:19 +=ended 2024-09-12 10:46:22 =result ok -=elapsed 3.212719 +=elapsed 3.230303 =case io_proto_SUITE:broken_unicode =logfile io_proto_suite.broken_unicode.html -=started 2024-09-11 11:24:11 -=ended 2024-09-11 11:24:11 +=started 2024-09-12 10:46:22 +=ended 2024-09-12 10:46:22 =result ok -=elapsed 0.190096 +=elapsed 0.196731 =case io_proto_SUITE:eof_on_pipe =logfile io_proto_suite.eof_on_pipe.html -=started 2024-09-11 11:24:11 -=ended 2024-09-11 11:24:13 +=started 2024-09-12 10:46:22 +=ended 2024-09-12 10:46:24 =result ok -=elapsed 2.337648 +=elapsed 2.350462 =case io_proto_SUITE:unicode_prompt =logfile io_proto_suite.unicode_prompt.html -=started 2024-09-11 11:24:13 -=ended 2024-09-11 11:24:19 +=started 2024-09-12 10:46:24 +=ended 2024-09-12 10:46:30 =result ok -=elapsed 5.379182 +=elapsed 5.407778 =case io_proto_SUITE:shell_slogan =logfile io_proto_suite.shell_slogan.html -=started 2024-09-11 11:24:19 -=ended 2024-09-11 11:24:27 +=started 2024-09-12 10:46:30 +=ended 2024-09-12 10:46:38 =result ok -=elapsed 8.061345 +=elapsed 8.080561 =case io_proto_SUITE:raw_stdout =logfile io_proto_suite.raw_stdout.html -=started 2024-09-11 11:24:27 -=ended 2024-09-11 11:24:27 +=started 2024-09-12 10:46:38 +=ended 2024-09-12 10:46:38 =result ok -=elapsed 0.140739 +=elapsed 0.150707 =case io_proto_SUITE:raw_stdout_isatty =logfile io_proto_suite.raw_stdout_isatty.html -=started 2024-09-11 11:24:27 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:38 +=ended 2024-09-12 10:46:41 =result ok -=elapsed 2.695213 +=elapsed 2.696344 =case io_proto_SUITE:file_read_stdin_binary_mode =logfile io_proto_suite.file_read_stdin_binary_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:41 +=ended 2024-09-12 10:46:41 =result ok -=elapsed 0.152697 +=elapsed 0.145538 =case io_proto_SUITE:file_read_stdin_list_mode =logfile io_proto_suite.file_read_stdin_list_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:41 +=ended 2024-09-12 10:46:41 =result ok -=elapsed 0.15106 +=elapsed 0.148728 =case io_proto_SUITE:file_read_stdin_unicode_translation_error_binary_mode =logfile io_proto_suite.file_read_stdin_unicode_translation_error_binary_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:41 +=ended 2024-09-12 10:46:41 =result ok -=elapsed 0.15637 +=elapsed 0.147428 =case io_proto_SUITE:file_read_stdin_unicode_translation_error_list_mode =logfile io_proto_suite.file_read_stdin_unicode_translation_error_list_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:41 +=ended 2024-09-12 10:46:42 =result ok -=elapsed 0.152608 +=elapsed 0.159118 =case io_proto_SUITE:file_read_line_stdin_unicode_translation_error_binary_mode =logfile io_proto_suite.file_read_line_stdin_unicode_translation_error_binary_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:30 +=started 2024-09-12 10:46:42 +=ended 2024-09-12 10:46:42 =result ok -=elapsed 0.142044 +=elapsed 0.147729 =case io_proto_SUITE:file_read_line_stdin_unicode_translation_error_list_mode =logfile io_proto_suite.file_read_line_stdin_unicode_translation_error_list_mode.html -=started 2024-09-11 11:24:30 -=ended 2024-09-11 11:24:31 +=started 2024-09-12 10:46:42 +=ended 2024-09-12 10:46:42 =result ok -=elapsed 0.147763 +=elapsed 0.147671 =case io_proto_SUITE:io_get_chars_stdin_binary_mode =logfile io_proto_suite.io_get_chars_stdin_binary_mode.html -=started 2024-09-11 11:24:31 -=ended 2024-09-11 11:24:31 +=started 2024-09-12 10:46:42 +=ended 2024-09-12 10:46:42 =result ok -=elapsed 0.143668 +=elapsed 0.150874 =case io_proto_SUITE:io_get_chars_stdin_list_mode =logfile io_proto_suite.io_get_chars_stdin_list_mode.html -=started 2024-09-11 11:24:31 -=ended 2024-09-11 11:24:31 +=started 2024-09-12 10:46:42 +=ended 2024-09-12 10:46:42 =result ok -=elapsed 0.154471 +=elapsed 0.147285 =case io_proto_SUITE:io_get_until_stdin_binary_mode =logfile io_proto_suite.io_get_until_stdin_binary_mode.html -=started 2024-09-11 11:24:31 -=ended 2024-09-11 11:24:32 +=started 2024-09-12 10:46:42 +=ended 2024-09-12 10:46:43 =result ok -=elapsed 0.879555 +=elapsed 0.852295 =case io_proto_SUITE:io_get_until_stdin_list_mode =logfile io_proto_suite.io_get_until_stdin_list_mode.html -=started 2024-09-11 11:24:32 -=ended 2024-09-11 11:24:33 +=started 2024-09-12 10:46:43 +=ended 2024-09-12 10:46:45 =result ok -=elapsed 1.430349 +=elapsed 1.459588 =case io_proto_SUITE:io_get_chars_file_read_stdin_binary_mode =logfile io_proto_suite.io_get_chars_file_read_stdin_binary_mode.html -=started 2024-09-11 11:24:33 -=ended 2024-09-11 11:24:34 +=started 2024-09-12 10:46:45 +=ended 2024-09-12 10:46:45 =result ok -=elapsed 0.469912 +=elapsed 0.444404 =case io_proto_SUITE:file_read_stdin_latin1_binary_mode =logfile io_proto_suite.file_read_stdin_latin1_binary_mode.html -=started 2024-09-11 11:24:34 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:45 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.815776 +=elapsed 0.79246 =case io_proto_SUITE:file_read_stdin_latin1_list_mode =logfile io_proto_suite.file_read_stdin_latin1_list_mode.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.313907 +=elapsed 0.310197 =case io_proto_SUITE:io_fwrite_stdin_latin1_mode =logfile io_proto_suite.io_fwrite_stdin_latin1_mode.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.150701 +=elapsed 0.157438 =case io_proto_SUITE:end_per_suite =logfile io_proto_suite.end_per_suite.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok =elapsed 2.0e-6 -=group_time 67.196s +=group_time 67.538s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.475906.html +=logfile ct_framework.init_per_suite.492642.html =group_props [{suite,json_SUITE}] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok =elapsed 0.0 =case json_SUITE:init_per_group =logfile json_suite.init_per_group.html =group_props [{name,encode},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok =elapsed 0.0 =case json_SUITE:test_encode_atom -=logfile json_suite.test_encode_atom.475938.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_atom.492706.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.002667 +=elapsed 0.003334 =case json_SUITE:test_encode_integer -=logfile json_suite.test_encode_integer.476002.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_integer.403171.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.002281 +=elapsed 0.002685 =case json_SUITE:test_encode_float -=logfile json_suite.test_encode_float.498371.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_float.492738.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.003479 +=elapsed 0.002469 =case json_SUITE:test_encode_binary -=logfile json_suite.test_encode_binary.475970.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_binary.403235.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.00458 +=elapsed 0.002633 =case json_SUITE:test_encode_map -=logfile json_suite.test_encode_map.498403.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_map.492674.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.002397 +=elapsed 0.003301 =case json_SUITE:test_encode_list -=logfile json_suite.test_encode_list.476034.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_list.403203.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.00202 +=elapsed 0.002982 =case json_SUITE:test_encode_proplist -=logfile json_suite.test_encode_proplist.498435.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_proplist.403139.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 7.32e-4 +=elapsed 0.003457 =case json_SUITE:test_encode_escape_all -=logfile json_suite.test_encode_escape_all.476066.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_encode_escape_all.492770.html +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:46 =result ok -=elapsed 0.002619 +=elapsed 0.002829 =case json_SUITE:end_per_group =logfile json_suite.end_per_group.html =group_props [{name,encode},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:46 +=ended 2024-09-12 10:46:47 =result ok =elapsed 0.0 -=group_time 0.056s +=group_time 0.058s =case json_SUITE:init_per_group -=logfile json_suite.init_per_group.498467.html +=logfile json_suite.init_per_group.492802.html =group_props [{name,decode},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok =elapsed 0.0 =case json_SUITE:test_decode_atoms -=logfile json_suite.test_decode_atoms.498499.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_atoms.492834.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok =elapsed 1.4e-5 =case json_SUITE:test_decode_numbers -=logfile json_suite.test_decode_numbers.498531.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_numbers.492866.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 1.55e-4 +=elapsed 1.35e-4 =case json_SUITE:test_decode_strings -=logfile json_suite.test_decode_strings.498563.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_strings.492898.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 3.44e-4 +=elapsed 4.18e-4 =case json_SUITE:test_decode_arrays -=logfile json_suite.test_decode_arrays.498659.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_arrays.492930.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 4.8e-5 +=elapsed 5.3e-5 =case json_SUITE:test_decode_objects -=logfile json_suite.test_decode_objects.498595.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_objects.426181.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 5.9e-5 +=elapsed 8.3e-5 =case json_SUITE:test_decode_whitespace -=logfile json_suite.test_decode_whitespace.395396.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_whitespace.426213.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 4.7e-5 +=elapsed 6.3e-5 =case json_SUITE:test_decode_api -=logfile json_suite.test_decode_api.498627.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_api.492962.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 2.3e-5 +=elapsed 2.1e-5 =case json_SUITE:test_decode_api_stream -=logfile json_suite.test_decode_api_stream.395428.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_decode_api_stream.426245.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 1.8e-4 +=elapsed 3.06e-4 =case json_SUITE:end_per_group -=logfile json_suite.end_per_group.476098.html +=logfile json_suite.end_per_group.403267.html =group_props [{name,decode},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok =elapsed 0.0 -=group_time 0.056s +=group_time 0.055s =case json_SUITE:init_per_group -=logfile json_suite.init_per_group.476130.html +=logfile json_suite.init_per_group.403299.html =group_props [{name,format},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok =elapsed 0.0 =case json_SUITE:test_format_list -=logfile json_suite.test_format_list.476162.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_format_list.403331.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 1.8e-5 +=elapsed 1.6e-5 =case json_SUITE:test_format_map -=logfile json_suite.test_format_map.476194.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_format_map.403363.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 2.3e-5 +=elapsed 4.5e-5 =case json_SUITE:test_format_fun -=logfile json_suite.test_format_fun.476226.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=logfile json_suite.test_format_fun.492994.html +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 2.2e-5 +=elapsed 1.7e-5 =case json_SUITE:end_per_group -=logfile json_suite.end_per_group.476258.html +=logfile json_suite.end_per_group.493026.html =group_props [{name,format},parallel] -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:35 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok =elapsed 0.0 -=group_time 0.051s +=group_time 0.049s =case json_SUITE:test_json_test_suite =logfile json_suite.test_json_test_suite.html -=started 2024-09-11 11:24:35 -=ended 2024-09-11 11:24:36 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:47 =result ok -=elapsed 0.542302 +=elapsed 0.542242 =case json_SUITE:init_per_group -=logfile json_suite.init_per_group.476290.html +=logfile json_suite.init_per_group.493058.html =group_props [{name,properties},parallel] -=started 2024-09-11 11:24:36 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:47 +=ended 2024-09-12 10:46:48 =result ok -=elapsed 1.249974 +=elapsed 1.253516 =case json_SUITE:property_string_roundtrip -=logfile json_suite.property_string_roundtrip.395460.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile json_suite.property_string_roundtrip.493090.html +=started 2024-09-12 10:46:48 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.009421 +=elapsed 0.009538 =case json_SUITE:property_integer_roundtrip -=logfile json_suite.property_integer_roundtrip.498691.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile json_suite.property_integer_roundtrip.493122.html +=started 2024-09-12 10:46:48 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.004658 +=elapsed 0.007119 =case json_SUITE:property_float_roundtrip -=logfile json_suite.property_float_roundtrip.498723.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile json_suite.property_float_roundtrip.421988.html +=started 2024-09-12 10:46:48 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.00781 +=elapsed 0.006525 =case json_SUITE:property_object_roundtrip -=logfile json_suite.property_object_roundtrip.498755.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile json_suite.property_object_roundtrip.421956.html +=started 2024-09-12 10:46:48 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.008657 +=elapsed 0.008853 =case json_SUITE:property_escape_all -=logfile json_suite.property_escape_all.395492.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile json_suite.property_escape_all.493154.html +=started 2024-09-12 10:46:48 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.010093 +=elapsed 0.008532 =case json_SUITE:end_per_group -=logfile json_suite.end_per_group.395588.html +=logfile json_suite.end_per_group.493186.html =group_props [{name,properties},parallel] -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 -=group_time 1.310s +=group_time 1.312s =case json_SUITE:counterexamples =logfile json_suite.counterexamples.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.1e-5 +=elapsed 9.0e-6 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.395620.html +=logfile ct_framework.end_per_suite.493218.html =group_props [{suite,json_SUITE}] -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 -=group_time 2.191s +=group_time 2.193s =case lists_SUITE:init_per_suite =logfile lists_suite.init_per_suite.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case lists_SUITE:init_per_group =logfile lists_suite.init_per_group.html =group_props [{name,append},parallel] -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:append_1 -=logfile lists_suite.append_1.476386.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:37 +=logfile lists_suite.append_1.493250.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 1.0e-6 =case lists_SUITE:append_2 -=logfile lists_suite.append_2.476418.html -=started 2024-09-11 11:24:37 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.append_2.493282.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.090116 +=elapsed 0.090945 =case lists_SUITE:end_per_group =logfile lists_suite.end_per_group.html =group_props [{name,append},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =group_time 0.137s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.476450.html +=logfile lists_suite.init_per_group.403523.html =group_props [{name,key},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:keymember -=logfile lists_suite.keymember.476482.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keymember.403555.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.015017 +=elapsed 0.015374 =case lists_SUITE:keysearch_keyfind -=logfile lists_suite.keysearch_keyfind.476514.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keysearch_keyfind.493314.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.016118 +=elapsed 0.016133 =case lists_SUITE:keystore -=logfile lists_suite.keystore.476546.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keystore.493346.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case lists_SUITE:keytake -=logfile lists_suite.keytake.476578.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keytake.493378.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 7.0e-6 +=elapsed 6.0e-6 =case lists_SUITE:keyreplace -=logfile lists_suite.keyreplace.498819.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keyreplace.493410.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 4.0e-6 +=elapsed 3.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.498851.html +=logfile lists_suite.end_per_group.493442.html =group_props [{name,key},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 -=group_time 0.066s +=elapsed 1.0e-6 +=group_time 0.065s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.498883.html +=logfile lists_suite.init_per_group.422020.html =group_props [{name,sort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:merge -=logfile lists_suite.merge.498915.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.merge.403587.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 6.5e-5 +=elapsed 6.4e-5 =case lists_SUITE:rmerge -=logfile lists_suite.rmerge.498947.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.rmerge.422052.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 2.4e-5 +=elapsed 2.8e-5 =case lists_SUITE:sort_1 -=logfile lists_suite.sort_1.499011.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sort_1.422084.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.025464 +=elapsed 0.02541 =case lists_SUITE:sort_rand -=logfile lists_suite.sort_rand.498979.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sort_rand.403619.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.006571 +=elapsed 0.006632 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.499043.html +=logfile lists_suite.end_per_group.493474.html =group_props [{name,sort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =group_time 0.073s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.499075.html +=logfile lists_suite.init_per_group.403779.html =group_props [{name,usort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:umerge -=logfile lists_suite.umerge.499107.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.umerge.403811.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 6.4e-5 +=elapsed 5.8e-5 =case lists_SUITE:rumerge -=logfile lists_suite.rumerge.476738.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.rumerge.403843.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 3.0e-5 +=elapsed 3.2e-5 =case lists_SUITE:usort_1 -=logfile lists_suite.usort_1.499139.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.usort_1.403875.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.023607 +=elapsed 0.021107 =case lists_SUITE:usort_rand -=logfile lists_suite.usort_rand.499171.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.usort_rand.403907.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.01134 +=elapsed 0.011212 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.499203.html +=logfile lists_suite.end_per_group.404195.html =group_props [{name,usort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 -=group_time 0.072s +=elapsed 1.0e-6 +=group_time 0.071s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.499235.html +=logfile lists_suite.init_per_group.404227.html =group_props [{name,keysort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:keymerge -=logfile lists_suite.keymerge.476770.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keymerge.404259.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 9.0e-6 +=elapsed 1.1e-5 =case lists_SUITE:rkeymerge -=logfile lists_suite.rkeymerge.476834.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.rkeymerge.404323.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.1e-5 +=elapsed 1.0e-5 =case lists_SUITE:keysort_1 -=logfile lists_suite.keysort_1.476802.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keysort_1.404291.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.035406 +=elapsed 0.035617 =case lists_SUITE:keysort_rand -=logfile lists_suite.keysort_rand.476866.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keysort_rand.404355.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.010177 +=elapsed 0.00986 =case lists_SUITE:keysort_i -=logfile lists_suite.keysort_i.476930.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keysort_i.404387.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:keysort_error -=logfile lists_suite.keysort_error.476898.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.keysort_error.404419.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 8.0e-6 +=elapsed 9.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.476962.html +=logfile lists_suite.end_per_group.404611.html =group_props [{name,keysort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =group_time 0.085s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.476994.html +=logfile lists_suite.init_per_group.493506.html =group_props [{name,ukeysort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:ukeymerge -=logfile lists_suite.ukeymerge.477026.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.ukeymerge.426309.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.0e-5 +=elapsed 1.2e-5 =case lists_SUITE:rukeymerge -=logfile lists_suite.rukeymerge.477058.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.rukeymerge.426341.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.2e-5 +=elapsed 1.1e-5 =case lists_SUITE:ukeysort_1 -=logfile lists_suite.ukeysort_1.477090.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.ukeysort_1.426373.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.029651 +=elapsed 0.029221 =case lists_SUITE:ukeysort_rand -=logfile lists_suite.ukeysort_rand.395908.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.ukeysort_rand.426405.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.009077 +=elapsed 0.010726 =case lists_SUITE:ukeysort_i -=logfile lists_suite.ukeysort_i.499523.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.ukeysort_i.426437.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case lists_SUITE:ukeysort_error -=logfile lists_suite.ukeysort_error.395940.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.ukeysort_error.493538.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 9.0e-6 +=elapsed 8.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.396228.html +=logfile lists_suite.end_per_group.493570.html =group_props [{name,ukeysort},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 -=group_time 0.079s +=elapsed 1.0e-6 +=group_time 0.081s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.477122.html +=logfile lists_suite.init_per_group.493602.html =group_props [{name,uniq},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:uniq_1 -=logfile lists_suite.uniq_1.374213.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.uniq_1.493634.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 1.8e-5 +=elapsed 4.0e-6 =case lists_SUITE:uniq_2 -=logfile lists_suite.uniq_2.477154.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.uniq_2.493666.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 3.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.477186.html +=logfile lists_suite.end_per_group.493698.html =group_props [{name,uniq},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 -=group_time 0.048s +=group_time 0.047s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.477218.html +=logfile lists_suite.init_per_group.493730.html =group_props [{name,sublist},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:sublist_2 -=logfile lists_suite.sublist_2.374245.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sublist_2.493762.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 1.0e-6 =case lists_SUITE:sublist_3 -=logfile lists_suite.sublist_3.374277.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sublist_3.426757.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 1.0e-6 =case lists_SUITE:sublist_2_e -=logfile lists_suite.sublist_2_e.374309.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sublist_2_e.426725.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 8.0e-6 +=elapsed 7.0e-6 =case lists_SUITE:sublist_3_e -=logfile lists_suite.sublist_3_e.477250.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.sublist_3_e.426789.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 3.5e-5 +=elapsed 3.3e-5 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.477282.html +=logfile lists_suite.end_per_group.493794.html =group_props [{name,sublist},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =group_time 0.050s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.477314.html +=logfile lists_suite.init_per_group.493826.html =group_props [{name,flatten},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:flatten_1 -=logfile lists_suite.flatten_1.477346.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.flatten_1.493858.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 2.0e-6 =case lists_SUITE:flatten_2 -=logfile lists_suite.flatten_2.477378.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.flatten_2.426853.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case lists_SUITE:flatten_1_e -=logfile lists_suite.flatten_1_e.477410.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.flatten_1_e.426821.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case lists_SUITE:flatten_2_e -=logfile lists_suite.flatten_2_e.477442.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.flatten_2_e.426885.html +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:49 =result ok =elapsed 0.0 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.396260.html +=logfile lists_suite.end_per_group.426917.html =group_props [{name,flatten},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:49 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =group_time 0.050s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.396292.html +=logfile lists_suite.init_per_group.426949.html =group_props [{name,seq},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:seq_loop -=logfile lists_suite.seq_loop.396324.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.seq_loop.426981.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 2.0e-6 =case lists_SUITE:seq_2 -=logfile lists_suite.seq_2.396356.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.seq_2.427013.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 2.0e-6 =case lists_SUITE:seq_3 -=logfile lists_suite.seq_3.396388.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.seq_3.427045.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 4.0e-6 +=elapsed 3.0e-6 =case lists_SUITE:seq_2_e -=logfile lists_suite.seq_2_e.396420.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.seq_2_e.493890.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 5.0e-6 =case lists_SUITE:seq_3_e -=logfile lists_suite.seq_3_e.374341.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.seq_3_e.427077.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 9.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.374373.html +=logfile lists_suite.end_per_group.493922.html =group_props [{name,seq},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =group_time 0.051s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.374405.html +=logfile lists_suite.init_per_group.493954.html =group_props [{name,tickets},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:otp_5939 -=logfile lists_suite.otp_5939.374437.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.otp_5939.493986.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 4.8e-5 +=elapsed 3.1e-5 =case lists_SUITE:otp_6023 -=logfile lists_suite.otp_6023.499555.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.otp_6023.427141.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 2.0e-6 =case lists_SUITE:otp_6606 -=logfile lists_suite.otp_6606.374469.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.otp_6606.427109.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 3.0e-6 =case lists_SUITE:otp_7230 -=logfile lists_suite.otp_7230.396452.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.otp_7230.494018.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 0.003185 +=elapsed 0.003949 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.374501.html +=logfile lists_suite.end_per_group.422212.html =group_props [{name,tickets},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =group_time 0.052s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.396484.html +=logfile lists_suite.init_per_group.422244.html =group_props [{name,zip},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:zip_unzip -=logfile lists_suite.zip_unzip.396516.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip_unzip.422276.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.7e-5 +=elapsed 2.6e-5 =case lists_SUITE:zip_unzip3 -=logfile lists_suite.zip_unzip3.396548.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip_unzip3.422308.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 4.3e-5 +=elapsed 4.2e-5 =case lists_SUITE:zipwith -=logfile lists_suite.zipwith.396580.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith.427173.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.5e-5 +=elapsed 2.3e-5 =case lists_SUITE:zipwith3 -=logfile lists_suite.zipwith3.499587.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith3.422340.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.6e-5 +=elapsed 3.3e-5 =case lists_SUITE:zip_fail -=logfile lists_suite.zip_fail.396612.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip_fail.427205.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case lists_SUITE:zip_trim -=logfile lists_suite.zip_trim.396644.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip_trim.422372.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case lists_SUITE:zip_pad -=logfile lists_suite.zip_pad.374533.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip_pad.422404.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 1.0e-6 =case lists_SUITE:zip3_fail -=logfile lists_suite.zip3_fail.499619.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip3_fail.422436.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.0e-5 +=elapsed 1.0e-5 =case lists_SUITE:zip3_trim -=logfile lists_suite.zip3_trim.499651.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip3_trim.422468.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 1.0e-6 =case lists_SUITE:zip3_pad -=logfile lists_suite.zip3_pad.374565.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zip3_pad.422500.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 2.0e-6 =case lists_SUITE:zipwith_fail -=logfile lists_suite.zipwith_fail.396676.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith_fail.422532.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 6.0e-6 +=elapsed 7.0e-6 =case lists_SUITE:zipwith_trim -=logfile lists_suite.zipwith_trim.499683.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith_trim.404643.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:zipwith_pad -=logfile lists_suite.zipwith_pad.477474.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith_pad.404675.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 1.0e-6 =case lists_SUITE:zipwith3_fail -=logfile lists_suite.zipwith3_fail.477506.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith3_fail.404707.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 1.1e-5 =case lists_SUITE:zipwith3_trim -=logfile lists_suite.zipwith3_trim.396708.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith3_trim.404771.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 1.0e-6 =case lists_SUITE:zipwith3_pad -=logfile lists_suite.zipwith3_pad.374597.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=logfile lists_suite.zipwith3_pad.404739.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 2.0e-6 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.374629.html +=logfile lists_suite.end_per_group.404803.html =group_props [{name,zip},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 -=group_time 0.061s +=group_time 0.060s =case lists_SUITE:init_per_group -=logfile lists_suite.init_per_group.374661.html +=logfile lists_suite.init_per_group.404835.html =group_props [{name,misc},parallel] -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:38 +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:reverse -=logfile lists_suite.reverse.374693.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.reverse.404867.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 0.009812 +=elapsed 0.012616 =case lists_SUITE:member -=logfile lists_suite.member.374725.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.member.404899.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 0.008136 +=elapsed 0.006158 =case lists_SUITE:dropwhile -=logfile lists_suite.dropwhile.374757.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.dropwhile.404931.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.3e-5 +=elapsed 1.6e-5 =case lists_SUITE:takewhile -=logfile lists_suite.takewhile.396740.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.takewhile.427237.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.1e-5 +=elapsed 3.8e-5 =case lists_SUITE:filter_partition -=logfile lists_suite.filter_partition.396804.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.filter_partition.427269.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 6.0e-6 +=elapsed 7.0e-6 =case lists_SUITE:suffix -=logfile lists_suite.suffix.396772.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.suffix.427301.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 0.024691 +=elapsed 0.029097 =case lists_SUITE:subtract -=logfile lists_suite.subtract.477538.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:42 +=logfile lists_suite.subtract.427333.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:53 =result ok -=elapsed 3.167491 +=elapsed 3.161264 =case lists_SUITE:join -=logfile lists_suite.join.477570.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.join.427365.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 0.0 =case lists_SUITE:hof -=logfile lists_suite.hof.477602.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.hof.427397.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok =elapsed 7.0e-6 =case lists_SUITE:droplast -=logfile lists_suite.droplast.477634.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.droplast.404963.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 4.0e-6 +=elapsed 3.0e-6 =case lists_SUITE:search -=logfile lists_suite.search.477666.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.search.404995.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case lists_SUITE:enumerate -=logfile lists_suite.enumerate.374789.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.enumerate.405027.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 2.5e-5 +=elapsed 2.6e-5 =case lists_SUITE:error_info -=logfile lists_suite.error_info.396836.html -=started 2024-09-11 11:24:38 -=ended 2024-09-11 11:24:39 +=logfile lists_suite.error_info.405059.html +=started 2024-09-12 10:46:50 +=ended 2024-09-12 10:46:50 =result ok -=elapsed 0.002204 +=elapsed 0.001121 =case lists_SUITE:end_per_group -=logfile lists_suite.end_per_group.477698.html +=logfile lists_suite.end_per_group.494050.html =group_props [{name,misc},parallel] -=started 2024-09-11 11:24:42 -=ended 2024-09-11 11:24:42 +=started 2024-09-12 10:46:53 +=ended 2024-09-12 10:46:53 =result ok -=elapsed 0.0 -=group_time 3.228s +=elapsed 1.0e-6 +=group_time 3.217s =case lists_SUITE:end_per_suite =logfile lists_suite.end_per_suite.html -=started 2024-09-11 11:24:42 -=ended 2024-09-11 11:24:42 +=started 2024-09-12 10:46:53 +=ended 2024-09-12 10:46:53 =result ok =elapsed 0.0 -=group_time 4.385s +=group_time 4.383s =case lists_property_test_SUITE:init_per_suite =logfile lists_property_test_suite.init_per_suite.html -=started 2024-09-11 11:24:42 -=ended 2024-09-11 11:24:43 +=started 2024-09-12 10:46:53 +=ended 2024-09-12 10:46:54 =result ok -=elapsed 1.262465 +=elapsed 1.256471 =case lists_property_test_SUITE:all_true_case =logfile lists_property_test_suite.all_true_case.html -=started 2024-09-11 11:24:43 -=ended 2024-09-11 11:24:43 +=started 2024-09-12 10:46:54 +=ended 2024-09-12 10:46:54 =result ok -=elapsed 0.070786 +=elapsed 0.065811 =case lists_property_test_SUITE:all_false_case =logfile lists_property_test_suite.all_false_case.html -=started 2024-09-11 11:24:43 -=ended 2024-09-11 11:24:43 +=started 2024-09-12 10:46:54 +=ended 2024-09-12 10:46:55 =result ok -=elapsed 0.119466 +=elapsed 0.116356 =case lists_property_test_SUITE:any_true_case =logfile lists_property_test_suite.any_true_case.html -=started 2024-09-11 11:24:43 -=ended 2024-09-11 11:24:43 +=started 2024-09-12 10:46:55 +=ended 2024-09-12 10:46:55 =result ok -=elapsed 0.117373 +=elapsed 0.127318 =case lists_property_test_SUITE:any_false_case =logfile lists_property_test_suite.any_false_case.html -=started 2024-09-11 11:24:43 -=ended 2024-09-11 11:24:43 +=started 2024-09-12 10:46:55 +=ended 2024-09-12 10:46:55 =result ok -=elapsed 0.05106 +=elapsed 0.068131 =case lists_property_test_SUITE:append_1_case =logfile lists_property_test_suite.append_1_case.html -=started 2024-09-11 11:24:43 -=ended 2024-09-11 11:24:44 +=started 2024-09-12 10:46:55 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.873678 +=elapsed 0.731778 =case lists_property_test_SUITE:append_2_case =logfile lists_property_test_suite.append_2_case.html -=started 2024-09-11 11:24:44 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.127614 +=elapsed 0.130232 =case lists_property_test_SUITE:concat_case =logfile lists_property_test_suite.concat_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.026581 +=elapsed 0.022858 =case lists_property_test_SUITE:delete_case =logfile lists_property_test_suite.delete_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.133719 +=elapsed 0.115689 =case lists_property_test_SUITE:delete_absent_case =logfile lists_property_test_suite.delete_absent_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.071753 +=elapsed 0.057504 =case lists_property_test_SUITE:droplast_case =logfile lists_property_test_suite.droplast_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.071642 +=elapsed 0.056731 =case lists_property_test_SUITE:dropwhile_case =logfile lists_property_test_suite.dropwhile_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.153822 +=elapsed 0.155734 =case lists_property_test_SUITE:duplicate_case =logfile lists_property_test_suite.duplicate_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.010974 +=elapsed 0.011283 =case lists_property_test_SUITE:enumerate_1_case =logfile lists_property_test_suite.enumerate_1_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:56 =result ok -=elapsed 0.143399 +=elapsed 0.150099 =case lists_property_test_SUITE:enumerate_2_case =logfile lists_property_test_suite.enumerate_2_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:45 +=started 2024-09-12 10:46:56 +=ended 2024-09-12 10:46:57 =result ok -=elapsed 0.148528 +=elapsed 0.150868 =case lists_property_test_SUITE:enumerate_3_case =logfile lists_property_test_suite.enumerate_3_case.html -=started 2024-09-11 11:24:45 -=ended 2024-09-11 11:24:46 +=started 2024-09-12 10:46:57 +=ended 2024-09-12 10:46:57 =result ok -=elapsed 0.148499 +=elapsed 0.151613 =case lists_property_test_SUITE:filter_case =logfile lists_property_test_suite.filter_case.html -=started 2024-09-11 11:24:46 -=ended 2024-09-11 11:24:46 +=started 2024-09-12 10:46:57 +=ended 2024-09-12 10:46:57 =result ok -=elapsed 0.155848 +=elapsed 0.142702 =case lists_property_test_SUITE:filtermap_case =logfile lists_property_test_suite.filtermap_case.html -=started 2024-09-11 11:24:46 -=ended 2024-09-11 11:24:46 +=started 2024-09-12 10:46:57 +=ended 2024-09-12 10:46:57 =result ok -=elapsed 0.227322 +=elapsed 0.226796 =case lists_property_test_SUITE:flatlength_case =logfile lists_property_test_suite.flatlength_case.html -=started 2024-09-11 11:24:46 -=ended 2024-09-11 11:24:46 +=started 2024-09-12 10:46:57 +=ended 2024-09-12 10:46:57 =result ok -=elapsed 0.067575 +=elapsed 0.046378 =case lists_property_test_SUITE:flatmap_case =logfile lists_property_test_suite.flatmap_case.html -=started 2024-09-11 11:24:46 -=ended 2024-09-11 11:24:50 +=started 2024-09-12 10:46:57 +=ended 2024-09-12 10:47:01 =result ok -=elapsed 3.412779 +=elapsed 3.385101 =case lists_property_test_SUITE:flatten_1_case =logfile lists_property_test_suite.flatten_1_case.html -=started 2024-09-11 11:24:50 -=ended 2024-09-11 11:24:50 +=started 2024-09-12 10:47:01 +=ended 2024-09-12 10:47:01 =result ok -=elapsed 0.071837 +=elapsed 0.055575 =case lists_property_test_SUITE:flatten_2_case =logfile lists_property_test_suite.flatten_2_case.html -=started 2024-09-11 11:24:50 -=ended 2024-09-11 11:24:50 +=started 2024-09-12 10:47:01 +=ended 2024-09-12 10:47:01 =result ok -=elapsed 0.133095 +=elapsed 0.096186 =case lists_property_test_SUITE:foldl_case =logfile lists_property_test_suite.foldl_case.html -=started 2024-09-11 11:24:50 -=ended 2024-09-11 11:24:50 +=started 2024-09-12 10:47:01 +=ended 2024-09-12 10:47:01 =result ok -=elapsed 0.361422 +=elapsed 0.353276 =case lists_property_test_SUITE:foldr_case =logfile lists_property_test_suite.foldr_case.html -=started 2024-09-11 11:24:50 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:01 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.369084 +=elapsed 0.362228 =case lists_property_test_SUITE:foreach_case =logfile lists_property_test_suite.foreach_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.067075 +=elapsed 0.077103 =case lists_property_test_SUITE:join_case =logfile lists_property_test_suite.join_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.066011 +=elapsed 0.063042 =case lists_property_test_SUITE:keydelete_case =logfile lists_property_test_suite.keydelete_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.153694 +=elapsed 0.14763 =case lists_property_test_SUITE:keydelete_absent_case =logfile lists_property_test_suite.keydelete_absent_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.064065 +=elapsed 0.059615 =case lists_property_test_SUITE:keyfind_case =logfile lists_property_test_suite.keyfind_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.155534 +=elapsed 0.146272 =case lists_property_test_SUITE:keyfind_absent_case =logfile lists_property_test_suite.keyfind_absent_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:51 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:02 =result ok -=elapsed 0.0608 +=elapsed 0.057873 =case lists_property_test_SUITE:keymap_case =logfile lists_property_test_suite.keymap_case.html -=started 2024-09-11 11:24:51 -=ended 2024-09-11 11:24:52 +=started 2024-09-12 10:47:02 +=ended 2024-09-12 10:47:03 =result ok -=elapsed 0.901988 +=elapsed 0.842432 =case lists_property_test_SUITE:keymember_case =logfile lists_property_test_suite.keymember_case.html -=started 2024-09-11 11:24:52 -=ended 2024-09-11 11:24:52 +=started 2024-09-12 10:47:03 +=ended 2024-09-12 10:47:03 =result ok -=elapsed 0.132642 +=elapsed 0.141608 =case lists_property_test_SUITE:keymember_absent_case =logfile lists_property_test_suite.keymember_absent_case.html -=started 2024-09-11 11:24:52 -=ended 2024-09-11 11:24:52 +=started 2024-09-12 10:47:03 +=ended 2024-09-12 10:47:03 =result ok -=elapsed 0.06105 +=elapsed 0.057279 =case lists_property_test_SUITE:keymerge_case =logfile lists_property_test_suite.keymerge_case.html -=started 2024-09-11 11:24:52 -=ended 2024-09-11 11:24:53 +=started 2024-09-12 10:47:03 +=ended 2024-09-12 10:47:04 =result ok -=elapsed 0.536179 +=elapsed 0.502255 =case lists_property_test_SUITE:keymerge_invalid_case =logfile lists_property_test_suite.keymerge_invalid_case.html -=started 2024-09-11 11:24:53 -=ended 2024-09-11 11:24:53 +=started 2024-09-12 10:47:04 +=ended 2024-09-12 10:47:04 =result ok -=elapsed 0.275578 +=elapsed 0.315098 =case lists_property_test_SUITE:keyreplace_case =logfile lists_property_test_suite.keyreplace_case.html -=started 2024-09-11 11:24:53 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:04 +=ended 2024-09-12 10:47:04 =result ok -=elapsed 0.201381 +=elapsed 0.181144 =case lists_property_test_SUITE:keyreplace_absent_case =logfile lists_property_test_suite.keyreplace_absent_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:04 +=ended 2024-09-12 10:47:05 =result ok -=elapsed 0.123474 +=elapsed 0.125043 =case lists_property_test_SUITE:keysearch_case =logfile lists_property_test_suite.keysearch_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:05 +=ended 2024-09-12 10:47:05 =result ok -=elapsed 0.151241 +=elapsed 0.153451 =case lists_property_test_SUITE:keysearch_absent_case =logfile lists_property_test_suite.keysearch_absent_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:05 +=ended 2024-09-12 10:47:05 =result ok -=elapsed 0.062016 +=elapsed 0.066888 =case lists_property_test_SUITE:keysort_case =logfile lists_property_test_suite.keysort_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:05 +=ended 2024-09-12 10:47:05 =result ok -=elapsed 0.233894 +=elapsed 0.25431 =case lists_property_test_SUITE:keystore_case =logfile lists_property_test_suite.keystore_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:54 +=started 2024-09-12 10:47:05 +=ended 2024-09-12 10:47:05 =result ok -=elapsed 0.180076 +=elapsed 0.211042 =case lists_property_test_SUITE:keystore_absent_case =logfile lists_property_test_suite.keystore_absent_case.html -=started 2024-09-11 11:24:54 -=ended 2024-09-11 11:24:55 +=started 2024-09-12 10:47:05 +=ended 2024-09-12 10:47:06 =result ok -=elapsed 0.120525 +=elapsed 0.11701 =case lists_property_test_SUITE:keytake_case =logfile lists_property_test_suite.keytake_case.html -=started 2024-09-11 11:24:55 -=ended 2024-09-11 11:24:55 +=started 2024-09-12 10:47:06 +=ended 2024-09-12 10:47:06 =result ok -=elapsed 0.16183 +=elapsed 0.14064 =case lists_property_test_SUITE:keytake_absent_case =logfile lists_property_test_suite.keytake_absent_case.html -=started 2024-09-11 11:24:55 -=ended 2024-09-11 11:24:55 +=started 2024-09-12 10:47:06 +=ended 2024-09-12 10:47:06 =result ok -=elapsed 0.060687 +=elapsed 0.063484 =case lists_property_test_SUITE:last_case =logfile lists_property_test_suite.last_case.html -=started 2024-09-11 11:24:55 -=ended 2024-09-11 11:24:55 +=started 2024-09-12 10:47:06 +=ended 2024-09-12 10:47:06 =result ok -=elapsed 0.065944 +=elapsed 0.053771 =case lists_property_test_SUITE:map_case =logfile lists_property_test_suite.map_case.html -=started 2024-09-11 11:24:55 -=ended 2024-09-11 11:24:55 +=started 2024-09-12 10:47:06 +=ended 2024-09-12 10:47:06 =result ok -=elapsed 0.362737 +=elapsed 0.36016 =case lists_property_test_SUITE:mapfoldl_case =logfile lists_property_test_suite.mapfoldl_case.html -=started 2024-09-11 11:24:55 -=ended 2024-09-11 11:24:56 +=started 2024-09-12 10:47:06 +=ended 2024-09-12 10:47:07 =result ok -=elapsed 0.589548 +=elapsed 0.589637 =case lists_property_test_SUITE:mapfoldr_case =logfile lists_property_test_suite.mapfoldr_case.html -=started 2024-09-11 11:24:56 -=ended 2024-09-11 11:24:57 +=started 2024-09-12 10:47:07 +=ended 2024-09-12 10:47:07 =result ok -=elapsed 0.579993 +=elapsed 0.609101 =case lists_property_test_SUITE:max_case =logfile lists_property_test_suite.max_case.html -=started 2024-09-11 11:24:57 -=ended 2024-09-11 11:24:57 +=started 2024-09-12 10:47:07 +=ended 2024-09-12 10:47:08 =result ok -=elapsed 0.132837 +=elapsed 0.135037 =case lists_property_test_SUITE:member_case =logfile lists_property_test_suite.member_case.html -=started 2024-09-11 11:24:57 -=ended 2024-09-11 11:24:57 +=started 2024-09-12 10:47:08 +=ended 2024-09-12 10:47:08 =result ok -=elapsed 0.117797 +=elapsed 0.135148 =case lists_property_test_SUITE:member_absent_case =logfile lists_property_test_suite.member_absent_case.html -=started 2024-09-11 11:24:57 -=ended 2024-09-11 11:24:57 +=started 2024-09-12 10:47:08 +=ended 2024-09-12 10:47:08 =result ok -=elapsed 0.057553 +=elapsed 0.059308 =case lists_property_test_SUITE:merge_1_case =logfile lists_property_test_suite.merge_1_case.html -=started 2024-09-11 11:24:57 -=ended 2024-09-11 11:24:58 +=started 2024-09-12 10:47:08 +=ended 2024-09-12 10:47:09 =result ok -=elapsed 0.779261 +=elapsed 0.845123 =case lists_property_test_SUITE:merge_1_invalid_case =logfile lists_property_test_suite.merge_1_invalid_case.html -=started 2024-09-11 11:24:58 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:09 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.912421 +=elapsed 0.919216 =case lists_property_test_SUITE:merge_2_case =logfile lists_property_test_suite.merge_2_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.125195 +=elapsed 0.127917 =case lists_property_test_SUITE:merge_2_invalid_case =logfile lists_property_test_suite.merge_2_invalid_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.076961 +=elapsed 0.067632 =case lists_property_test_SUITE:merge_3_case =logfile lists_property_test_suite.merge_3_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.124641 +=elapsed 0.143417 =case lists_property_test_SUITE:merge_3_invalid_case =logfile lists_property_test_suite.merge_3_invalid_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.069167 +=elapsed 0.074289 =case lists_property_test_SUITE:merge3_case =logfile lists_property_test_suite.merge3_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.193 +=elapsed 0.176394 =case lists_property_test_SUITE:merge3_invalid_case =logfile lists_property_test_suite.merge3_invalid_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:24:59 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:10 =result ok -=elapsed 0.078937 +=elapsed 0.077574 =case lists_property_test_SUITE:min_case =logfile lists_property_test_suite.min_case.html -=started 2024-09-11 11:24:59 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:10 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.139917 +=elapsed 0.136397 =case lists_property_test_SUITE:nth_case =logfile lists_property_test_suite.nth_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.120637 +=elapsed 0.12265 =case lists_property_test_SUITE:nth_outofrange_case =logfile lists_property_test_suite.nth_outofrange_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.058734 +=elapsed 0.05578 =case lists_property_test_SUITE:nthtail_case =logfile lists_property_test_suite.nthtail_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.130641 +=elapsed 0.1165 =case lists_property_test_SUITE:nthtail_outofrange_case =logfile lists_property_test_suite.nthtail_outofrange_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.062802 +=elapsed 0.056688 =case lists_property_test_SUITE:partition_case =logfile lists_property_test_suite.partition_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.062164 +=elapsed 0.063126 =case lists_property_test_SUITE:prefix_case =logfile lists_property_test_suite.prefix_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.121838 +=elapsed 0.119167 =case lists_property_test_SUITE:reverse_1_case =logfile lists_property_test_suite.reverse_1_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:00 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:11 =result ok -=elapsed 0.063941 +=elapsed 0.061068 =case lists_property_test_SUITE:reverse_2_case =logfile lists_property_test_suite.reverse_2_case.html -=started 2024-09-11 11:25:00 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:11 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.109931 +=elapsed 0.120743 =case lists_property_test_SUITE:search_case =logfile lists_property_test_suite.search_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.124261 +=elapsed 0.123967 =case lists_property_test_SUITE:search_absent_case =logfile lists_property_test_suite.search_absent_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.053565 +=elapsed 0.052881 =case lists_property_test_SUITE:seq2_case =logfile lists_property_test_suite.seq2_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.00117 +=elapsed 0.001313 =case lists_property_test_SUITE:seq3_case =logfile lists_property_test_suite.seq3_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.001198 +=elapsed 0.001356 =case lists_property_test_SUITE:sort_1_case =logfile lists_property_test_suite.sort_1_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.071923 +=elapsed 0.069787 =case lists_property_test_SUITE:sort_2_case =logfile lists_property_test_suite.sort_2_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.064662 +=elapsed 0.069277 =case lists_property_test_SUITE:split_case =logfile lists_property_test_suite.split_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.129368 +=elapsed 0.126203 =case lists_property_test_SUITE:split_outofrange_case =logfile lists_property_test_suite.split_outofrange_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.061576 +=elapsed 0.055777 =case lists_property_test_SUITE:splitwith_case =logfile lists_property_test_suite.splitwith_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.06661 +=elapsed 0.074717 =case lists_property_test_SUITE:sublist_2_case =logfile lists_property_test_suite.sublist_2_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:01 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:12 =result ok -=elapsed 0.141316 +=elapsed 0.124519 =case lists_property_test_SUITE:sublist_3_case =logfile lists_property_test_suite.sublist_3_case.html -=started 2024-09-11 11:25:01 -=ended 2024-09-11 11:25:02 +=started 2024-09-12 10:47:12 +=ended 2024-09-12 10:47:13 =result ok -=elapsed 0.187257 +=elapsed 0.171113 =case lists_property_test_SUITE:subtract_case =logfile lists_property_test_suite.subtract_case.html -=started 2024-09-11 11:25:02 -=ended 2024-09-11 11:25:02 +=started 2024-09-12 10:47:13 +=ended 2024-09-12 10:47:13 =result ok -=elapsed 0.1827 +=elapsed 0.188052 =case lists_property_test_SUITE:suffix_case =logfile lists_property_test_suite.suffix_case.html -=started 2024-09-11 11:25:02 -=ended 2024-09-11 11:25:02 +=started 2024-09-12 10:47:13 +=ended 2024-09-12 10:47:13 =result ok -=elapsed 0.114494 +=elapsed 0.119809 =case lists_property_test_SUITE:sum_case =logfile lists_property_test_suite.sum_case.html -=started 2024-09-11 11:25:02 -=ended 2024-09-11 11:25:02 +=started 2024-09-12 10:47:13 +=ended 2024-09-12 10:47:13 =result ok -=elapsed 0.003601 +=elapsed 0.004014 =case lists_property_test_SUITE:takewhile_case =logfile lists_property_test_suite.takewhile_case.html -=started 2024-09-11 11:25:02 -=ended 2024-09-11 11:25:02 +=started 2024-09-12 10:47:13 +=ended 2024-09-12 10:47:13 =result ok -=elapsed 0.129359 +=elapsed 0.133894 =case lists_property_test_SUITE:ukeymerge_case =logfile lists_property_test_suite.ukeymerge_case.html -=started 2024-09-11 11:25:02 -=ended 2024-09-11 11:25:03 +=started 2024-09-12 10:47:13 +=ended 2024-09-12 10:47:14 =result ok -=elapsed 0.518512 +=elapsed 0.600875 =case lists_property_test_SUITE:ukeymerge_invalid_case =logfile lists_property_test_suite.ukeymerge_invalid_case.html -=started 2024-09-11 11:25:03 -=ended 2024-09-11 11:25:03 +=started 2024-09-12 10:47:14 +=ended 2024-09-12 10:47:14 =result ok -=elapsed 0.288535 +=elapsed 0.282769 =case lists_property_test_SUITE:ukeysort_case =logfile lists_property_test_suite.ukeysort_case.html -=started 2024-09-11 11:25:03 -=ended 2024-09-11 11:25:03 +=started 2024-09-12 10:47:14 +=ended 2024-09-12 10:47:14 =result ok -=elapsed 0.265384 +=elapsed 0.25396 =case lists_property_test_SUITE:umerge_1_case =logfile lists_property_test_suite.umerge_1_case.html -=started 2024-09-11 11:25:03 -=ended 2024-09-11 11:25:04 +=started 2024-09-12 10:47:14 +=ended 2024-09-12 10:47:15 =result ok -=elapsed 0.885389 +=elapsed 0.931411 =case lists_property_test_SUITE:umerge_1_invalid_case =logfile lists_property_test_suite.umerge_1_invalid_case.html -=started 2024-09-11 11:25:04 -=ended 2024-09-11 11:25:05 +=started 2024-09-12 10:47:15 +=ended 2024-09-12 10:47:16 =result ok -=elapsed 1.004268 +=elapsed 0.803228 =case lists_property_test_SUITE:umerge_2_case =logfile lists_property_test_suite.umerge_2_case.html -=started 2024-09-11 11:25:05 -=ended 2024-09-11 11:25:05 +=started 2024-09-12 10:47:16 +=ended 2024-09-12 10:47:16 =result ok -=elapsed 0.116009 +=elapsed 0.127452 =case lists_property_test_SUITE:umerge_2_invalid_case =logfile lists_property_test_suite.umerge_2_invalid_case.html -=started 2024-09-11 11:25:05 -=ended 2024-09-11 11:25:05 +=started 2024-09-12 10:47:16 +=ended 2024-09-12 10:47:16 =result ok -=elapsed 0.067883 +=elapsed 0.069435 =case lists_property_test_SUITE:umerge_3_case =logfile lists_property_test_suite.umerge_3_case.html -=started 2024-09-11 11:25:05 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:16 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.125763 +=elapsed 0.142569 =case lists_property_test_SUITE:umerge_3_invalid_case =logfile lists_property_test_suite.umerge_3_invalid_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.059936 +=elapsed 0.073473 =case lists_property_test_SUITE:umerge3_case =logfile lists_property_test_suite.umerge3_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.166971 +=elapsed 0.219718 =case lists_property_test_SUITE:umerge3_invalid_case =logfile lists_property_test_suite.umerge3_invalid_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.076068 +=elapsed 0.072561 =case lists_property_test_SUITE:uniq_1_case =logfile lists_property_test_suite.uniq_1_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.136075 +=elapsed 0.132904 =case lists_property_test_SUITE:uniq_2_case =logfile lists_property_test_suite.uniq_2_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:06 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:17 =result ok -=elapsed 0.061441 +=elapsed 0.061344 =case lists_property_test_SUITE:unzip_case =logfile lists_property_test_suite.unzip_case.html -=started 2024-09-11 11:25:06 -=ended 2024-09-11 11:25:07 +=started 2024-09-12 10:47:17 +=ended 2024-09-12 10:47:18 =result ok -=elapsed 0.280834 +=elapsed 0.285834 =case lists_property_test_SUITE:unzip3_case =logfile lists_property_test_suite.unzip3_case.html -=started 2024-09-11 11:25:07 -=ended 2024-09-11 11:25:07 +=started 2024-09-12 10:47:18 +=ended 2024-09-12 10:47:18 =result ok -=elapsed 0.412881 +=elapsed 0.437226 =case lists_property_test_SUITE:usort_1_case =logfile lists_property_test_suite.usort_1_case.html -=started 2024-09-11 11:25:07 -=ended 2024-09-11 11:25:07 +=started 2024-09-12 10:47:18 +=ended 2024-09-12 10:47:18 =result ok -=elapsed 0.062191 +=elapsed 0.066798 =case lists_property_test_SUITE:usort_2_case =logfile lists_property_test_suite.usort_2_case.html -=started 2024-09-11 11:25:07 -=ended 2024-09-11 11:25:07 +=started 2024-09-12 10:47:18 +=ended 2024-09-12 10:47:18 =result ok -=elapsed 0.069081 +=elapsed 0.075184 =case lists_property_test_SUITE:zip_2_case =logfile lists_property_test_suite.zip_2_case.html -=started 2024-09-11 11:25:07 -=ended 2024-09-11 11:25:07 +=started 2024-09-12 10:47:18 +=ended 2024-09-12 10:47:19 =result ok -=elapsed 0.296207 +=elapsed 0.272334 =case lists_property_test_SUITE:zip_3_case =logfile lists_property_test_suite.zip_3_case.html -=started 2024-09-11 11:25:07 -=ended 2024-09-11 11:25:08 +=started 2024-09-12 10:47:19 +=ended 2024-09-12 10:47:19 =result ok -=elapsed 0.33995 +=elapsed 0.350199 =case lists_property_test_SUITE:zip3_3_case =logfile lists_property_test_suite.zip3_3_case.html -=started 2024-09-11 11:25:08 -=ended 2024-09-11 11:25:08 +=started 2024-09-12 10:47:19 +=ended 2024-09-12 10:47:19 =result ok -=elapsed 0.40975 +=elapsed 0.428132 =case lists_property_test_SUITE:zip3_4_case =logfile lists_property_test_suite.zip3_4_case.html -=started 2024-09-11 11:25:08 -=ended 2024-09-11 11:25:09 +=started 2024-09-12 10:47:19 +=ended 2024-09-12 10:47:20 =result ok -=elapsed 0.473399 +=elapsed 0.490266 =case lists_property_test_SUITE:zipwith_3_case =logfile lists_property_test_suite.zipwith_3_case.html -=started 2024-09-11 11:25:09 -=ended 2024-09-11 11:25:09 +=started 2024-09-12 10:47:20 +=ended 2024-09-12 10:47:20 =result ok -=elapsed 0.508511 +=elapsed 0.526158 =case lists_property_test_SUITE:zipwith_4_case =logfile lists_property_test_suite.zipwith_4_case.html -=started 2024-09-11 11:25:09 -=ended 2024-09-11 11:25:11 +=started 2024-09-12 10:47:20 +=ended 2024-09-12 10:47:22 =result ok -=elapsed 1.521678 +=elapsed 1.675655 =case lists_property_test_SUITE:zipwith3_4_case =logfile lists_property_test_suite.zipwith3_4_case.html -=started 2024-09-11 11:25:11 -=ended 2024-09-11 11:25:12 +=started 2024-09-12 10:47:22 +=ended 2024-09-12 10:47:23 =result ok -=elapsed 0.642577 +=elapsed 0.671321 =case lists_property_test_SUITE:zipwith3_5_case =logfile lists_property_test_suite.zipwith3_5_case.html -=started 2024-09-11 11:25:12 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:23 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 3.357158 +=elapsed 3.419762 =case lists_property_test_SUITE:end_per_suite =logfile lists_property_test_suite.end_per_suite.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok =elapsed 0.0 -=group_time 33.158s +=group_time 33.235s =case log_mf_h_SUITE:init_per_suite =logfile log_mf_h_suite.init_per_suite.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok =elapsed 0.0 =case log_mf_h_SUITE:test =logfile log_mf_h_suite.test.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 0.006364 +=elapsed 0.006247 =case log_mf_h_SUITE:end_per_suite =logfile log_mf_h_suite.end_per_suite.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok =elapsed 0.0 =group_time 0.058s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.481122.html +=logfile ct_framework.init_per_suite.497442.html =group_props [{suite,maps_SUITE}] -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok =elapsed 0.0 =case maps_SUITE:t_update_with_3 =logfile maps_suite.t_update_with_3.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 7.0e-6 +=elapsed 6.0e-6 =case maps_SUITE:t_update_with_4 =logfile maps_suite.t_update_with_4.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case maps_SUITE:t_get_3 =logfile maps_suite.t_get_3.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok =elapsed 1.0e-6 =case maps_SUITE:t_filter_2 =logfile maps_suite.t_filter_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 9.0e-6 +=elapsed 1.2e-5 =case maps_SUITE:t_filtermap_2 =logfile maps_suite.t_filtermap_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:26 =result ok -=elapsed 8.0e-6 +=elapsed 9.0e-6 =case maps_SUITE:t_fold_3 =logfile maps_suite.t_fold_3.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:26 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 5.4e-5 +=elapsed 5.5e-5 =case maps_SUITE:t_map_2 =logfile maps_suite.t_map_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 1.04e-4 +=elapsed 1.06e-4 =case maps_SUITE:t_size_1 =logfile maps_suite.t_size_1.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 1.47e-4 +=elapsed 1.75e-4 =case maps_SUITE:t_foreach_2 =logfile maps_suite.t_foreach_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 1.8e-5 +=elapsed 1.9e-5 =case maps_SUITE:t_iterator_1 =logfile maps_suite.t_iterator_1.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.015439 +=elapsed 0.015452 =case maps_SUITE:t_iterator_2 =logfile maps_suite.t_iterator_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.064088 +=elapsed 0.063165 =case maps_SUITE:t_iterator_valid =logfile maps_suite.t_iterator_valid.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case maps_SUITE:t_put_opt =logfile maps_suite.t_put_opt.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 2.6e-5 +=elapsed 3.1e-5 =case maps_SUITE:t_merge_opt =logfile maps_suite.t_merge_opt.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok =elapsed 2.9e-5 =case maps_SUITE:t_with_2 =logfile maps_suite.t_with_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 2.3e-5 +=elapsed 2.5e-5 =case maps_SUITE:t_without_2 =logfile maps_suite.t_without_2.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:15 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 4.4e-5 +=elapsed 4.6e-5 =case maps_SUITE:t_intersect =logfile maps_suite.t_intersect.html -=started 2024-09-11 11:25:15 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.018851 +=elapsed 0.019317 =case maps_SUITE:t_intersect_with =logfile maps_suite.t_intersect_with.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.016323 +=elapsed 0.015919 =case maps_SUITE:t_merge_with =logfile maps_suite.t_merge_with.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.029691 +=elapsed 0.029527 =case maps_SUITE:t_from_keys =logfile maps_suite.t_from_keys.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case maps_SUITE:error_info =logfile maps_suite.error_info.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.005641 +=elapsed 0.005695 =case maps_SUITE:t_from_list_kill_process =logfile maps_suite.t_from_list_kill_process.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.001468 +=elapsed 0.001676 =case maps_SUITE:t_from_keys_kill_process =logfile maps_suite.t_from_keys_kill_process.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.001087 +=elapsed 0.00128 =case maps_SUITE:t_values_kill_process =logfile maps_suite.t_values_kill_process.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.158147 +=elapsed 0.164671 =case maps_SUITE:t_keys_kill_process =logfile maps_suite.t_keys_kill_process.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.11583 +=elapsed 0.116906 =case maps_SUITE:t_from_list_check_trapping =logfile maps_suite.t_from_list_check_trapping.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:16 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:27 =result ok -=elapsed 0.086663 +=elapsed 0.089565 =case maps_SUITE:t_from_keys_check_trapping =logfile maps_suite.t_from_keys_check_trapping.html -=started 2024-09-11 11:25:16 -=ended 2024-09-11 11:25:17 +=started 2024-09-12 10:47:27 +=ended 2024-09-12 10:47:29 =result ok -=elapsed 1.320326 +=elapsed 1.32742 =case maps_SUITE:t_keys_trapping =logfile maps_suite.t_keys_trapping.html -=started 2024-09-11 11:25:17 -=ended 2024-09-11 11:25:19 +=started 2024-09-12 10:47:29 +=ended 2024-09-12 10:47:30 =result ok -=elapsed 1.524184 +=elapsed 1.546137 =case maps_SUITE:t_values_trapping =logfile maps_suite.t_values_trapping.html -=started 2024-09-11 11:25:19 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:30 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 1.515829 +=elapsed 1.59601 =case maps_SUITE:t_groups_from_list =logfile maps_suite.t_groups_from_list.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 5.0e-6 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.481186.html +=logfile ct_framework.end_per_suite.497570.html =group_props [{suite,maps_SUITE}] -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 0.0 -=group_time 5.578s +=group_time 5.698s =case math_SUITE:init_per_suite =logfile math_suite.init_per_suite.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 0.0 =case math_SUITE:floor_ceil =logfile math_suite.floor_ceil.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 1.0e-6 =case math_SUITE:error_info =logfile math_suite.error_info.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.003442 +=elapsed 0.003228 =case math_SUITE:constants =logfile math_suite.constants.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 0.0 =case math_SUITE:end_per_suite =logfile math_suite.end_per_suite.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 0.0 =group_time 0.101s =case ms_transform_SUITE:init_per_suite =logfile ms_transform_suite.init_per_suite.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok =elapsed 0.0 =case ms_transform_SUITE:from_shell =logfile ms_transform_suite.from_shell.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 1.72e-4 +=elapsed 1.75e-4 =case ms_transform_SUITE:basic_ets =logfile ms_transform_suite.basic_ets.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.023164 +=elapsed 0.022568 =case ms_transform_SUITE:basic_dbg =logfile ms_transform_suite.basic_dbg.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.037881 +=elapsed 0.039411 =case ms_transform_SUITE:records =logfile ms_transform_suite.records.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.017163 +=elapsed 0.018931 =case ms_transform_SUITE:record_index =logfile ms_transform_suite.record_index.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.016833 +=elapsed 0.017812 =case ms_transform_SUITE:multipass =logfile ms_transform_suite.multipass.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:32 =result ok -=elapsed 0.036849 +=elapsed 0.036901 =case ms_transform_SUITE:bitsyntax =logfile ms_transform_suite.bitsyntax.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:32 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.013264 +=elapsed 0.014625 =case ms_transform_SUITE:binary_bifs =logfile ms_transform_suite.binary_bifs.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.017316 +=elapsed 0.018167 =case ms_transform_SUITE:record_defaults =logfile ms_transform_suite.record_defaults.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.004273 +=elapsed 0.003777 =case ms_transform_SUITE:andalso_orelse =logfile ms_transform_suite.andalso_orelse.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.024875 +=elapsed 0.025983 =case ms_transform_SUITE:float_1_function =logfile ms_transform_suite.float_1_function.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.053226 +=elapsed 0.051655 =case ms_transform_SUITE:action_function =logfile ms_transform_suite.action_function.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.025173 +=elapsed 0.023924 =case ms_transform_SUITE:warnings =logfile ms_transform_suite.warnings.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.012942 +=elapsed 0.012739 =case ms_transform_SUITE:no_warnings =logfile ms_transform_suite.no_warnings.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.003243 +=elapsed 0.003322 =case ms_transform_SUITE:top_match =logfile ms_transform_suite.top_match.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:21 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.028606 +=elapsed 0.030169 =case ms_transform_SUITE:old_guards =logfile ms_transform_suite.old_guards.html -=started 2024-09-11 11:25:21 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:33 =result ok -=elapsed 0.087358 +=elapsed 0.085671 =case ms_transform_SUITE:autoimported =logfile ms_transform_suite.autoimported.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:33 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.699403 +=elapsed 0.698475 =case ms_transform_SUITE:semicolon =logfile ms_transform_suite.semicolon.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.025868 +=elapsed 0.025171 =case ms_transform_SUITE:eep37 =logfile ms_transform_suite.eep37.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.003729 +=elapsed 0.003747 =case ms_transform_SUITE:otp_14454 =logfile ms_transform_suite.otp_14454.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.01094 +=elapsed 0.013036 =case ms_transform_SUITE:otp_16824 =logfile ms_transform_suite.otp_16824.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 8.58e-4 +=elapsed 8.64e-4 =case ms_transform_SUITE:unused_record =logfile ms_transform_suite.unused_record.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.001353 +=elapsed 0.001656 =case ms_transform_SUITE:map_pattern =logfile ms_transform_suite.map_pattern.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.004309 +=elapsed 0.004585 =case ms_transform_SUITE:map_expr_in_head =logfile ms_transform_suite.map_expr_in_head.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:22 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.004715 +=elapsed 0.005255 =case ms_transform_SUITE:map_pattern_from_shell =logfile ms_transform_suite.map_pattern_from_shell.html -=started 2024-09-11 11:25:22 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 8.1e-5 +=elapsed 6.5e-5 =case ms_transform_SUITE:map_expr_in_head_from_shell =logfile ms_transform_suite.map_expr_in_head_from_shell.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 4.8e-5 +=elapsed 4.3e-5 =case ms_transform_SUITE:map_exprs =logfile ms_transform_suite.map_exprs.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.010854 +=elapsed 0.011061 =case ms_transform_SUITE:map_exprs_from_shell =logfile ms_transform_suite.map_exprs_from_shell.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 1.06e-4 +=elapsed 1.15e-4 =case ms_transform_SUITE:end_per_suite =logfile ms_transform_suite.end_per_suite.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok =elapsed 0.0 -=group_time 1.869s +=group_time 1.883s =case peer_SUITE:init_per_suite =logfile peer_suite.init_per_suite.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok =elapsed 3.0e-6 =case peer_SUITE:init_per_group =logfile peer_suite.init_per_group.html =group_props [{name,dist},parallel] -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case peer_SUITE:errors -=logfile peer_suite.errors.374821.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=logfile peer_suite.errors.497634.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok =elapsed 5.0e-6 =case peer_SUITE:dist -=logfile peer_suite.dist.374853.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:37 +=logfile peer_suite.dist.497666.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:48 =result ok -=elapsed 14.288451 +=elapsed 14.09819 =case peer_SUITE:peer_down_crash -=logfile peer_suite.peer_down_crash.374885.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.peer_down_crash.497730.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:35 =result ok -=elapsed 1.232054 +=elapsed 1.17461 =case peer_SUITE:peer_down_continue -=logfile peer_suite.peer_down_continue.374917.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:37 +=logfile peer_suite.peer_down_continue.427429.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:48 =result ok -=elapsed 14.290161 +=elapsed 14.099945 =case peer_SUITE:peer_down_boot -=logfile peer_suite.peer_down_boot.374981.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:23 +=logfile peer_suite.peer_down_boot.497602.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:34 =result ok -=elapsed 0.043666 +=elapsed 0.023841 =case peer_SUITE:dist_up_down -=logfile peer_suite.dist_up_down.374949.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.dist_up_down.497698.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:35 =result ok -=elapsed 1.237384 +=elapsed 1.203215 =case peer_SUITE:dist_localhost -=logfile peer_suite.dist_localhost.396900.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.dist_localhost.427461.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:36 =result ok -=elapsed 1.367667 +=elapsed 1.409054 =case peer_SUITE:post_process_args -=logfile peer_suite.post_process_args.499811.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.post_process_args.427493.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:35 =result ok -=elapsed 1.209045 +=elapsed 1.098322 =case peer_SUITE:attached -=logfile peer_suite.attached.396932.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.attached.427525.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:35 =result ok -=elapsed 1.190508 +=elapsed 1.207059 =case peer_SUITE:attached_cntrl_channel_handler_crash -=logfile peer_suite.attached_cntrl_channel_handler_crash.499843.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:25 +=logfile peer_suite.attached_cntrl_channel_handler_crash.427557.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:36 =result ok -=elapsed 2.274168 +=elapsed 2.275124 =case peer_SUITE:cntrl_channel_handler_crash -=logfile peer_suite.cntrl_channel_handler_crash.375013.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.cntrl_channel_handler_crash.422564.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:35 =result ok -=elapsed 1.023009 +=elapsed 1.232669 =case peer_SUITE:cntrl_channel_handler_crash_old_release -=logfile peer_suite.cntrl_channel_handler_crash_old_release.499875.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:37 +=logfile peer_suite.cntrl_channel_handler_crash_old_release.422596.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:48 =result ok -=elapsed 14.49779 +=elapsed 14.290302 =case peer_SUITE:shutdown_halt -=logfile peer_suite.shutdown_halt.396964.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:25 +=logfile peer_suite.shutdown_halt.427589.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:36 =result ok -=elapsed 2.110762 +=elapsed 2.244045 =case peer_SUITE:shutdown_halt_timeout -=logfile peer_suite.shutdown_halt_timeout.396996.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:25 +=logfile peer_suite.shutdown_halt_timeout.427621.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:37 =result ok -=elapsed 2.759761 +=elapsed 2.688923 =case peer_SUITE:shutdown_stop -=logfile peer_suite.shutdown_stop.397028.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:26 +=logfile peer_suite.shutdown_stop.427653.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:37 =result ok -=elapsed 3.103958 +=elapsed 3.165541 =case peer_SUITE:shutdown_stop_timeout -=logfile peer_suite.shutdown_stop_timeout.499907.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:25 +=logfile peer_suite.shutdown_stop_timeout.427685.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:37 =result ok -=elapsed 2.635744 +=elapsed 2.687502 =case peer_SUITE:shutdown_close -=logfile peer_suite.shutdown_close.499939.html -=started 2024-09-11 11:25:23 -=ended 2024-09-11 11:25:24 +=logfile peer_suite.shutdown_close.422628.html +=started 2024-09-12 10:47:34 +=ended 2024-09-12 10:47:36 =result ok -=elapsed 1.682601 +=elapsed 1.588244 =case peer_SUITE:end_per_group =logfile peer_suite.end_per_group.html =group_props [{name,dist},parallel] -=started 2024-09-11 11:25:37 -=ended 2024-09-11 11:25:37 +=started 2024-09-12 10:47:48 +=ended 2024-09-12 10:47:48 =result ok =elapsed 1.0e-6 -=group_time 14.558s +=group_time 14.351s =case peer_SUITE:init_per_group -=logfile peer_suite.init_per_group.397188.html +=logfile peer_suite.init_per_group.423044.html =group_props [{name,dist_seq}] -=started 2024-09-11 11:25:37 -=ended 2024-09-11 11:25:37 +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:49 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case peer_SUITE:dist_io_redirect =logfile peer_suite.dist_io_redirect.html -=started 2024-09-11 11:25:37 -=ended 2024-09-11 11:25:38 +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:49 =result ok -=elapsed 0.657772 +=elapsed 0.663372 =case peer_SUITE:peer_down_crash_tcp =logfile peer_suite.peer_down_crash_tcp.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:38 +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:49 =result ok -=elapsed 0.159001 +=elapsed 0.148248 =case peer_SUITE:end_per_group -=logfile peer_suite.end_per_group.397220.html +=logfile peer_suite.end_per_group.498274.html =group_props [{name,dist_seq}] -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:38 +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:49 =result ok -=elapsed 0.0 -=group_time 0.888s +=elapsed 1.0e-6 +=group_time 0.885s =case peer_SUITE:init_per_group -=logfile peer_suite.init_per_group.481826.html +=logfile peer_suite.init_per_group.423108.html =group_props [{name,tcp},parallel] -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:38 +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:49 =result ok =elapsed 0.0 =case peer_SUITE:basic -=logfile peer_suite.basic.481858.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.basic.423140.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.740381 +=elapsed 1.329851 =case peer_SUITE:peer_states -=logfile peer_suite.peer_states.481890.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.peer_states.423172.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:52 =result ok -=elapsed 2.448623 +=elapsed 2.54851 =case peer_SUITE:cast -=logfile peer_suite.cast.481922.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.cast.423204.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.630569 +=elapsed 1.546446 =case peer_SUITE:detached -=logfile peer_suite.detached.481954.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.detached.423268.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.640773 +=elapsed 1.337193 =case peer_SUITE:dyn_peer -=logfile peer_suite.dyn_peer.481986.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.dyn_peer.423236.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.61536 +=elapsed 1.717256 =case peer_SUITE:stop_peer -=logfile peer_suite.stop_peer.482018.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.stop_peer.427941.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.74042 +=elapsed 1.636612 =case peer_SUITE:io_redirect -=logfile peer_suite.io_redirect.375141.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.io_redirect.427973.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.657755 +=elapsed 1.400164 =case peer_SUITE:multi_node -=logfile peer_suite.multi_node.375173.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.multi_node.428005.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.766222 +=elapsed 1.681113 =case peer_SUITE:duplicate_name -=logfile peer_suite.duplicate_name.375205.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.duplicate_name.428037.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.885499 +=elapsed 1.921132 =case peer_SUITE:attached -=logfile peer_suite.attached.375237.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.attached.428069.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.778746 +=elapsed 1.5756 =case peer_SUITE:attached_cntrl_channel_handler_crash -=logfile peer_suite.attached_cntrl_channel_handler_crash.397252.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.attached_cntrl_channel_handler_crash.428101.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:52 =result ok -=elapsed 2.499187 +=elapsed 2.770671 =case peer_SUITE:cntrl_channel_handler_crash -=logfile peer_suite.cntrl_channel_handler_crash.397284.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.cntrl_channel_handler_crash.428133.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:51 =result ok -=elapsed 1.721054 +=elapsed 1.753146 =case peer_SUITE:cntrl_channel_handler_crash_old_release -=logfile peer_suite.cntrl_channel_handler_crash_old_release.397316.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.cntrl_channel_handler_crash_old_release.423300.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:52 =result ok -=elapsed 2.337803 +=elapsed 2.33174 =case peer_SUITE:shutdown_halt -=logfile peer_suite.shutdown_halt.500387.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.shutdown_halt.423332.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:52 =result ok -=elapsed 2.694746 +=elapsed 2.745093 =case peer_SUITE:shutdown_halt_timeout -=logfile peer_suite.shutdown_halt_timeout.500419.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.shutdown_halt_timeout.405251.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 3.245584 +=elapsed 3.105512 =case peer_SUITE:shutdown_stop -=logfile peer_suite.shutdown_stop.500451.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:42 +=logfile peer_suite.shutdown_stop.428197.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 3.688709 +=elapsed 3.740818 =case peer_SUITE:shutdown_stop_timeout -=logfile peer_suite.shutdown_stop_timeout.500483.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:41 +=logfile peer_suite.shutdown_stop_timeout.428165.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 3.081648 +=elapsed 3.06095 =case peer_SUITE:shutdown_close -=logfile peer_suite.shutdown_close.500515.html -=started 2024-09-11 11:25:38 -=ended 2024-09-11 11:25:40 +=logfile peer_suite.shutdown_close.428229.html +=started 2024-09-12 10:47:49 +=ended 2024-09-12 10:47:52 =result ok -=elapsed 2.197742 +=elapsed 2.078159 =case peer_SUITE:end_per_group -=logfile peer_suite.end_per_group.501027.html +=logfile peer_suite.end_per_group.405571.html =group_props [{name,tcp},parallel] -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:42 +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 0.0 -=group_time 3.760s +=elapsed 1.0e-6 +=group_time 3.804s =case peer_SUITE:init_per_group -=logfile peer_suite.init_per_group.501059.html +=logfile peer_suite.init_per_group.405603.html =group_props [{name,standard_io},parallel] -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:42 +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:53 =result ok =elapsed 0.0 =case peer_SUITE:init_debug -=logfile peer_suite.init_debug.501091.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:45 +=logfile peer_suite.init_debug.405635.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:56 =result ok -=elapsed 2.74311 +=elapsed 2.698611 =case peer_SUITE:basic -=logfile peer_suite.basic.501123.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.basic.405667.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.398472 +=elapsed 1.218756 =case peer_SUITE:peer_states -=logfile peer_suite.peer_states.501155.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.peer_states.405699.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.937953 +=elapsed 2.212839 =case peer_SUITE:cast -=logfile peer_suite.cast.375461.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.cast.405731.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.512549 +=elapsed 1.328734 =case peer_SUITE:detached -=logfile peer_suite.detached.375557.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.detached.428293.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.348898 +=elapsed 1.545623 =case peer_SUITE:dyn_peer -=logfile peer_suite.dyn_peer.375397.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.dyn_peer.405763.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.228844 +=elapsed 1.470874 =case peer_SUITE:stop_peer -=logfile peer_suite.stop_peer.375429.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.stop_peer.428325.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.47862 +=elapsed 1.415837 =case peer_SUITE:io_redirect -=logfile peer_suite.io_redirect.375525.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.io_redirect.405795.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.322885 +=elapsed 1.52972 =case peer_SUITE:multi_node -=logfile peer_suite.multi_node.375493.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.multi_node.428357.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.49444 +=elapsed 1.44882 =case peer_SUITE:duplicate_name -=logfile peer_suite.duplicate_name.375589.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.duplicate_name.428389.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.639007 +=elapsed 1.672278 =case peer_SUITE:attached -=logfile peer_suite.attached.501187.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:42 +=logfile peer_suite.attached.428421.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 2.82e-4 +=elapsed 0.002694 =case peer_SUITE:attached_cntrl_channel_handler_crash -=logfile peer_suite.attached_cntrl_channel_handler_crash.501219.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:42 +=logfile peer_suite.attached_cntrl_channel_handler_crash.405827.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:53 =result ok -=elapsed 6.67e-4 +=elapsed 2.3e-4 =case peer_SUITE:cntrl_channel_handler_crash -=logfile peer_suite.cntrl_channel_handler_crash.501251.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:43 +=logfile peer_suite.cntrl_channel_handler_crash.405859.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 1.465955 +=elapsed 1.527306 =case peer_SUITE:cntrl_channel_handler_crash_old_release -=logfile peer_suite.cntrl_channel_handler_crash_old_release.501283.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.cntrl_channel_handler_crash_old_release.405891.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 2.074408 +=elapsed 2.122944 =case peer_SUITE:shutdown_halt -=logfile peer_suite.shutdown_halt.375621.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.shutdown_halt.405923.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:56 =result ok -=elapsed 2.405769 +=elapsed 2.581438 =case peer_SUITE:shutdown_halt_timeout -=logfile peer_suite.shutdown_halt_timeout.482146.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:45 +=logfile peer_suite.shutdown_halt_timeout.423588.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:56 =result ok -=elapsed 2.890609 +=elapsed 3.034596 =case peer_SUITE:shutdown_stop -=logfile peer_suite.shutdown_stop.482178.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:45 +=logfile peer_suite.shutdown_stop.423620.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:57 =result ok -=elapsed 3.481501 +=elapsed 3.51608 =case peer_SUITE:shutdown_stop_timeout -=logfile peer_suite.shutdown_stop_timeout.375653.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:45 +=logfile peer_suite.shutdown_stop_timeout.423652.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:56 =result ok -=elapsed 2.823548 +=elapsed 2.934104 =case peer_SUITE:shutdown_close -=logfile peer_suite.shutdown_close.375685.html -=started 2024-09-11 11:25:42 -=ended 2024-09-11 11:25:44 +=logfile peer_suite.shutdown_close.405987.html +=started 2024-09-12 10:47:53 +=ended 2024-09-12 10:47:55 =result ok -=elapsed 2.007281 +=elapsed 1.531337 =case peer_SUITE:end_per_group -=logfile peer_suite.end_per_group.376005.html +=logfile peer_suite.end_per_group.423972.html =group_props [{name,standard_io},parallel] -=started 2024-09-11 11:25:45 -=ended 2024-09-11 11:25:45 +=started 2024-09-12 10:47:57 +=ended 2024-09-12 10:47:57 =result ok -=elapsed 0.0 -=group_time 3.546s +=elapsed 1.0e-6 +=group_time 3.585s =case peer_SUITE:init_per_group -=logfile peer_suite.init_per_group.376037.html +=logfile peer_suite.init_per_group.424004.html =group_props [{name,compatibility},parallel] -=started 2024-09-11 11:25:45 -=ended 2024-09-11 11:25:46 +=started 2024-09-12 10:47:57 +=ended 2024-09-12 10:47:57 =result ok =elapsed 0.0 =case peer_SUITE:old_release -=logfile peer_suite.old_release.376069.html -=started 2024-09-11 11:25:46 -=ended 2024-09-11 11:25:59 +=logfile peer_suite.old_release.424036.html +=started 2024-09-12 10:47:57 +=ended 2024-09-12 10:48:10 =result ok -=elapsed 13.517974 +=elapsed 13.533671 =case peer_SUITE:end_per_group -=logfile peer_suite.end_per_group.376133.html +=logfile peer_suite.end_per_group.424132.html =group_props [{name,compatibility},parallel] -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:25:59 +=started 2024-09-12 10:48:10 +=ended 2024-09-12 10:48:10 =result ok =elapsed 0.0 -=group_time 13.564s +=group_time 13.579s =case peer_SUITE:init_per_group -=logfile peer_suite.init_per_group.376165.html +=logfile peer_suite.init_per_group.424164.html =group_props [{name,remote},parallel] -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:25:59 +=started 2024-09-12 10:48:10 +=ended 2024-09-12 10:48:10 =result skipped: "'ssh localhost echo ok' did not return ok" === *** SKIPPED {peer_SUITE,init_per_group} *** === =case peer_SUITE:ssh =group_props [{name,"remote"}] -=started 2024-09-11 11:25:59 +=started 2024-09-12 10:48:10 =result skipped: 'ssh localhost echo ok' did not return ok === *** Skipping test case #1450 {peer_SUITE,ssh} *** === =case peer_SUITE:end_per_group =group_props [{name,"remote"}] -=started 2024-09-11 11:25:59 +=started 2024-09-12 10:48:10 =result skipped: 'ssh localhost echo ok' did not return ok === *** Skipping {peer_SUITE,end_per_group} *** =case peer_SUITE:end_per_suite =logfile peer_suite.end_per_suite.html -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:25:59 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok -=elapsed 2.0e-6 -=group_time 36.525s +=elapsed 3.0e-6 +=group_time 36.412s =case pool_SUITE:init_per_suite =logfile pool_suite.init_per_suite.html -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:25:59 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok =elapsed 0.0 =case pool_SUITE:basic =logfile pool_suite.basic.html -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:25:59 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok -=elapsed 0.167007 +=elapsed 0.162309 =case pool_SUITE:link_race =logfile pool_suite.link_race.html -=started 2024-09-11 11:25:59 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok -=elapsed 0.315718 +=elapsed 0.344808 =case pool_SUITE:end_per_suite =logfile pool_suite.end_per_suite.html -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok =elapsed 0.0 -=group_time 0.562s +=group_time 0.587s =case proc_lib_SUITE:init_per_suite =logfile proc_lib_suite.init_per_suite.html -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok =elapsed 0.0 =case proc_lib_SUITE:crash =logfile proc_lib_suite.crash.html -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok -=elapsed 0.208603 +=elapsed 0.208817 =case proc_lib_SUITE:stacktrace =logfile proc_lib_suite.stacktrace.html -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok -=elapsed 0.001364 +=elapsed 0.001416 =case proc_lib_SUITE:init_per_group =logfile proc_lib_suite.init_per_group.html =group_props [{name,sync_start}] -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:00 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:11 =result ok =elapsed 0.0 =case proc_lib_SUITE:sync_start_nolink =logfile proc_lib_suite.sync_start_nolink.html -=started 2024-09-11 11:26:00 -=ended 2024-09-11 11:26:01 +=started 2024-09-12 10:48:11 +=ended 2024-09-12 10:48:12 =result ok -=elapsed 1.00013 +=elapsed 1.000938 =case proc_lib_SUITE:sync_start_link =logfile proc_lib_suite.sync_start_link.html -=started 2024-09-11 11:26:01 -=ended 2024-09-11 11:26:02 +=started 2024-09-12 10:48:12 +=ended 2024-09-12 10:48:13 =result ok -=elapsed 1.001089 +=elapsed 1.000816 =case proc_lib_SUITE:sync_start_monitor =logfile proc_lib_suite.sync_start_monitor.html -=started 2024-09-11 11:26:02 -=ended 2024-09-11 11:26:04 +=started 2024-09-12 10:48:13 +=ended 2024-09-12 10:48:16 =result ok -=elapsed 2.002061 +=elapsed 2.001741 =case proc_lib_SUITE:sync_start_monitor_link =logfile proc_lib_suite.sync_start_monitor_link.html -=started 2024-09-11 11:26:04 -=ended 2024-09-11 11:26:05 +=started 2024-09-12 10:48:16 +=ended 2024-09-12 10:48:17 =result ok -=elapsed 1.000749 +=elapsed 1.000389 =case proc_lib_SUITE:sync_start_timeout =logfile proc_lib_suite.sync_start_timeout.html -=started 2024-09-11 11:26:05 -=ended 2024-09-11 11:26:06 +=started 2024-09-12 10:48:17 +=ended 2024-09-12 10:48:18 =result ok -=elapsed 1.002101 +=elapsed 1.002078 =case proc_lib_SUITE:sync_start_link_timeout =logfile proc_lib_suite.sync_start_link_timeout.html -=started 2024-09-11 11:26:06 -=ended 2024-09-11 11:26:07 +=started 2024-09-12 10:48:18 +=ended 2024-09-12 10:48:19 =result ok -=elapsed 1.001675 +=elapsed 1.001637 =case proc_lib_SUITE:sync_start_monitor_link_timeout =logfile proc_lib_suite.sync_start_monitor_link_timeout.html -=started 2024-09-11 11:26:07 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:19 +=ended 2024-09-12 10:48:20 =result ok -=elapsed 1.001887 +=elapsed 1.00185 =case proc_lib_SUITE:end_per_group =logfile proc_lib_suite.end_per_group.html =group_props [{name,sync_start}] -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok =elapsed 0.0 -=group_time 8.193s +=group_time 8.195s =case proc_lib_SUITE:spawn_opt =logfile proc_lib_suite.spawn_opt.html -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok -=elapsed 0.101067 +=elapsed 0.100613 =case proc_lib_SUITE:hibernate =logfile proc_lib_suite.hibernate.html -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok -=elapsed 6.77e-4 +=elapsed 5.94e-4 =case proc_lib_SUITE:init_per_group -=logfile proc_lib_suite.init_per_group.482370.html +=logfile proc_lib_suite.init_per_group.424292.html =group_props [{name,tickets}] -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok =elapsed 0.0 =case proc_lib_SUITE:otp_6345 =logfile proc_lib_suite.otp_6345.html -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok =elapsed 1.0e-6 =case proc_lib_SUITE:init_dont_hang =logfile proc_lib_suite.init_dont_hang.html -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok -=elapsed 0.001355 +=elapsed 0.001153 =case proc_lib_SUITE:end_per_group -=logfile proc_lib_suite.end_per_group.482402.html +=logfile proc_lib_suite.end_per_group.424324.html =group_props [{name,tickets}] -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:08 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:20 =result ok =elapsed 0.0 -=group_time 0.069s +=group_time 0.070s =case proc_lib_SUITE:stop =logfile proc_lib_suite.stop.html -=started 2024-09-11 11:26:08 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:20 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 6.157731 +=elapsed 6.166278 =case proc_lib_SUITE:t_format =logfile proc_lib_suite.t_format.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 0.004103 +=elapsed 0.004174 =case proc_lib_SUITE:t_format_arbitrary =logfile proc_lib_suite.t_format_arbitrary.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 7.99e-4 +=elapsed 8.2e-4 =case proc_lib_SUITE:report_cb =logfile proc_lib_suite.report_cb.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 0.10318 +=elapsed 0.103424 =case proc_lib_SUITE:end_per_suite =logfile proc_lib_suite.end_per_suite.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok =elapsed 0.0 -=group_time 15.100s +=group_time 15.120s =case proplists_SUITE:init_per_suite =logfile proplists_suite.init_per_suite.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok =elapsed 0.0 =case proplists_SUITE:examples =logfile proplists_suite.examples.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 9.0e-6 +=elapsed 8.0e-6 =case proplists_SUITE:map_conversion =logfile proplists_suite.map_conversion.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 0.031149 +=elapsed 0.031446 =case proplists_SUITE:map_conversion_normalize =logfile proplists_suite.map_conversion_normalize.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case proplists_SUITE:pm_fold_test =logfile proplists_suite.pm_fold_test.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok -=elapsed 3.0e-6 +=elapsed 2.0e-6 =case proplists_SUITE:end_per_suite =logfile proplists_suite.end_per_suite.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:26 =result ok =elapsed 0.0 -=group_time 0.156s +=group_time 0.154s =case qlc_SUITE:init_per_suite =logfile qlc_suite.init_per_suite.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:26 +=ended 2024-09-12 10:48:27 =result ok =elapsed 0.0 =case qlc_SUITE:init_per_group =logfile qlc_suite.init_per_group.html =group_props [{name,parse_transform}] -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok =elapsed 0.0 =case qlc_SUITE:badarg =logfile qlc_suite.badarg.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.00451 +=elapsed 0.004457 =case qlc_SUITE:nested_qlc =logfile qlc_suite.nested_qlc.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.094589 +=elapsed 0.093373 =case qlc_SUITE:unused_var =logfile qlc_suite.unused_var.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.026396 +=elapsed 0.025706 =case qlc_SUITE:lc =logfile qlc_suite.lc.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.00517 +=elapsed 0.004656 =case qlc_SUITE:fun_clauses =logfile qlc_suite.fun_clauses.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.010763 +=elapsed 0.009945 =case qlc_SUITE:filter_var =logfile qlc_suite.filter_var.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.021485 +=elapsed 0.020633 =case qlc_SUITE:single =logfile qlc_suite.single.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:15 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.033889 +=elapsed 0.033115 =case qlc_SUITE:exported_var =logfile qlc_suite.exported_var.html -=started 2024-09-11 11:26:15 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.006599 +=elapsed 0.006398 =case qlc_SUITE:generator_vars =logfile qlc_suite.generator_vars.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.004943 +=elapsed 0.005147 =case qlc_SUITE:nomatch =logfile qlc_suite.nomatch.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.121491 +=elapsed 0.126846 =case qlc_SUITE:errors =logfile qlc_suite.errors.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.001297 +=elapsed 0.001816 =case qlc_SUITE:pattern =logfile qlc_suite.pattern.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.089117 +=elapsed 0.091693 =case qlc_SUITE:overridden_bif =logfile qlc_suite.overridden_bif.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok -=elapsed 0.075887 +=elapsed 0.077554 =case qlc_SUITE:end_per_group =logfile qlc_suite.end_per_group.html =group_props [{name,parse_transform}] -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok =elapsed 0.0 -=group_time 0.815s +=group_time 0.821s =case qlc_SUITE:init_per_group -=logfile qlc_suite.init_per_group.501571.html +=logfile qlc_suite.init_per_group.424420.html =group_props [{name,evaluation}] -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:16 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:27 =result ok =elapsed 0.0 =case qlc_SUITE:eval =logfile qlc_suite.eval.html -=started 2024-09-11 11:26:16 -=ended 2024-09-11 11:26:17 +=started 2024-09-12 10:48:27 +=ended 2024-09-12 10:48:28 =result ok -=elapsed 0.776341 +=elapsed 0.774786 =case qlc_SUITE:cursor =logfile qlc_suite.cursor.html -=started 2024-09-11 11:26:17 -=ended 2024-09-11 11:26:17 +=started 2024-09-12 10:48:28 +=ended 2024-09-12 10:48:29 =result ok -=elapsed 0.497101 +=elapsed 0.501077 =case qlc_SUITE:fold =logfile qlc_suite.fold.html -=started 2024-09-11 11:26:17 -=ended 2024-09-11 11:26:18 +=started 2024-09-12 10:48:29 +=ended 2024-09-12 10:48:29 =result ok -=elapsed 0.525771 +=elapsed 0.532166 =case qlc_SUITE:eval_unique =logfile qlc_suite.eval_unique.html -=started 2024-09-11 11:26:18 -=ended 2024-09-11 11:26:18 +=started 2024-09-12 10:48:29 +=ended 2024-09-12 10:48:30 =result ok -=elapsed 0.595215 +=elapsed 0.616412 =case qlc_SUITE:eval_cache =logfile qlc_suite.eval_cache.html -=started 2024-09-11 11:26:18 -=ended 2024-09-11 11:26:19 +=started 2024-09-12 10:48:30 +=ended 2024-09-12 10:48:30 =result ok -=elapsed 0.563185 +=elapsed 0.58306 =case qlc_SUITE:append =logfile qlc_suite.append.html -=started 2024-09-11 11:26:19 -=ended 2024-09-11 11:26:20 +=started 2024-09-12 10:48:30 +=ended 2024-09-12 10:48:31 =result ok -=elapsed 0.63659 +=elapsed 0.662879 =case qlc_SUITE:evaluator =logfile qlc_suite.evaluator.html -=started 2024-09-11 11:26:20 -=ended 2024-09-11 11:26:20 +=started 2024-09-12 10:48:31 +=ended 2024-09-12 10:48:31 =result ok -=elapsed 0.208414 +=elapsed 0.201045 =case qlc_SUITE:string_to_handle =logfile qlc_suite.string_to_handle.html -=started 2024-09-11 11:26:20 -=ended 2024-09-11 11:26:20 +=started 2024-09-12 10:48:31 +=ended 2024-09-12 10:48:31 =result ok -=elapsed 0.029869 +=elapsed 0.029838 =case qlc_SUITE:table =logfile qlc_suite.table.html -=started 2024-09-11 11:26:20 -=ended 2024-09-11 11:26:21 +=started 2024-09-12 10:48:31 +=ended 2024-09-12 10:48:33 =result ok -=elapsed 1.09383 +=elapsed 1.115173 =case qlc_SUITE:process_dies =logfile qlc_suite.process_dies.html -=started 2024-09-11 11:26:21 -=ended 2024-09-11 11:26:22 +=started 2024-09-12 10:48:33 +=ended 2024-09-12 10:48:33 =result ok -=elapsed 0.47078 +=elapsed 0.473448 =case qlc_SUITE:sort =logfile qlc_suite.sort.html -=started 2024-09-11 11:26:22 -=ended 2024-09-11 11:26:22 +=started 2024-09-12 10:48:33 +=ended 2024-09-12 10:48:34 =result ok -=elapsed 0.5547 +=elapsed 0.571845 =case qlc_SUITE:keysort =logfile qlc_suite.keysort.html -=started 2024-09-11 11:26:22 -=ended 2024-09-11 11:26:23 +=started 2024-09-12 10:48:34 +=ended 2024-09-12 10:48:34 =result ok -=elapsed 0.747593 +=elapsed 0.753342 =case qlc_SUITE:filesort =logfile qlc_suite.filesort.html -=started 2024-09-11 11:26:23 -=ended 2024-09-11 11:26:23 +=started 2024-09-12 10:48:34 +=ended 2024-09-12 10:48:35 =result ok -=elapsed 0.044581 +=elapsed 0.044002 =case qlc_SUITE:cache =logfile qlc_suite.cache.html -=started 2024-09-11 11:26:23 -=ended 2024-09-11 11:26:24 +=started 2024-09-12 10:48:35 +=ended 2024-09-12 10:48:36 =result ok -=elapsed 0.955187 +=elapsed 0.971337 =case qlc_SUITE:cache_list =logfile qlc_suite.cache_list.html -=started 2024-09-11 11:26:24 -=ended 2024-09-11 11:26:28 +=started 2024-09-12 10:48:36 +=ended 2024-09-12 10:48:39 =result ok -=elapsed 3.691339 +=elapsed 3.678468 =case qlc_SUITE:filter =logfile qlc_suite.filter.html -=started 2024-09-11 11:26:28 -=ended 2024-09-11 11:26:29 +=started 2024-09-12 10:48:39 +=ended 2024-09-12 10:48:40 =result ok -=elapsed 0.888083 +=elapsed 0.908489 =case qlc_SUITE:info =logfile qlc_suite.info.html -=started 2024-09-11 11:26:29 -=ended 2024-09-11 11:26:30 +=started 2024-09-12 10:48:40 +=ended 2024-09-12 10:48:42 =result ok -=elapsed 1.339163 +=elapsed 1.382494 =case qlc_SUITE:nested_info =logfile qlc_suite.nested_info.html -=started 2024-09-11 11:26:30 -=ended 2024-09-11 11:26:31 +=started 2024-09-12 10:48:42 +=ended 2024-09-12 10:48:42 =result ok -=elapsed 0.515691 +=elapsed 0.527751 =case qlc_SUITE:lookup1 =logfile qlc_suite.lookup1.html -=started 2024-09-11 11:26:31 -=ended 2024-09-11 11:26:32 +=started 2024-09-12 10:48:42 +=ended 2024-09-12 10:48:43 =result ok -=elapsed 1.346505 +=elapsed 1.338784 =case qlc_SUITE:lookup2 =logfile qlc_suite.lookup2.html -=started 2024-09-11 11:26:32 -=ended 2024-09-11 11:26:36 +=started 2024-09-12 10:48:43 +=ended 2024-09-12 10:48:48 =result ok -=elapsed 4.042518 +=elapsed 4.140132 =case qlc_SUITE:lookup_rec =logfile qlc_suite.lookup_rec.html -=started 2024-09-11 11:26:36 -=ended 2024-09-11 11:26:36 +=started 2024-09-12 10:48:48 +=ended 2024-09-12 10:48:48 =result ok -=elapsed 0.389201 +=elapsed 0.391752 =case qlc_SUITE:indices =logfile qlc_suite.indices.html -=started 2024-09-11 11:26:36 -=ended 2024-09-11 11:26:37 +=started 2024-09-12 10:48:48 +=ended 2024-09-12 10:48:48 =result ok -=elapsed 0.390238 +=elapsed 0.389029 =case qlc_SUITE:pre_fun =logfile qlc_suite.pre_fun.html -=started 2024-09-11 11:26:37 -=ended 2024-09-11 11:26:37 +=started 2024-09-12 10:48:48 +=ended 2024-09-12 10:48:49 =result ok -=elapsed 0.323822 +=elapsed 0.3219 =case qlc_SUITE:skip_filters =logfile qlc_suite.skip_filters.html -=started 2024-09-11 11:26:37 -=ended 2024-09-11 11:26:39 +=started 2024-09-12 10:48:49 +=ended 2024-09-12 10:48:51 =result ok -=elapsed 2.236827 +=elapsed 2.276143 =case qlc_SUITE:eep37 =logfile qlc_suite.eep37.html -=started 2024-09-11 11:26:39 -=ended 2024-09-11 11:26:39 +=started 2024-09-12 10:48:51 +=ended 2024-09-12 10:48:51 =result ok -=elapsed 0.021113 +=elapsed 0.021438 =case qlc_SUITE:end_per_group -=logfile qlc_suite.end_per_group.398148.html +=logfile qlc_suite.end_per_group.425124.html =group_props [{name,evaluation}] -=started 2024-09-11 11:26:39 -=ended 2024-09-11 11:26:39 +=started 2024-09-12 10:48:51 +=ended 2024-09-12 10:48:51 =result ok =elapsed 0.0 -=group_time 23.495s +=group_time 23.814s =case qlc_SUITE:init_per_group -=logfile qlc_suite.init_per_group.483522.html +=logfile qlc_suite.init_per_group.425156.html =group_props [{name,table_impls}] -=started 2024-09-11 11:26:39 -=ended 2024-09-11 11:26:39 +=started 2024-09-12 10:48:51 +=ended 2024-09-12 10:48:51 =result ok =elapsed 0.0 =case qlc_SUITE:ets =logfile qlc_suite.ets.html -=started 2024-09-11 11:26:39 -=ended 2024-09-11 11:26:40 +=started 2024-09-12 10:48:51 +=ended 2024-09-12 10:48:52 =result ok -=elapsed 0.376452 +=elapsed 0.37762 =case qlc_SUITE:dets =logfile qlc_suite.dets.html -=started 2024-09-11 11:26:40 -=ended 2024-09-11 11:26:41 +=started 2024-09-12 10:48:52 +=ended 2024-09-12 10:48:52 =result ok -=elapsed 0.597839 +=elapsed 0.598526 =case qlc_SUITE:end_per_group -=logfile qlc_suite.end_per_group.501987.html +=logfile qlc_suite.end_per_group.425188.html =group_props [{name,table_impls}] -=started 2024-09-11 11:26:41 -=ended 2024-09-11 11:26:41 +=started 2024-09-12 10:48:52 +=ended 2024-09-12 10:48:52 =result ok =elapsed 0.0 -=group_time 1.043s +=group_time 1.050s =case qlc_SUITE:init_per_group -=logfile qlc_suite.init_per_group.502019.html +=logfile qlc_suite.init_per_group.425220.html =group_props [{name,join}] -=started 2024-09-11 11:26:41 -=ended 2024-09-11 11:26:41 +=started 2024-09-12 10:48:52 +=ended 2024-09-12 10:48:52 =result ok =elapsed 0.0 =case qlc_SUITE:join_option =logfile qlc_suite.join_option.html -=started 2024-09-11 11:26:41 -=ended 2024-09-11 11:26:42 +=started 2024-09-12 10:48:52 +=ended 2024-09-12 10:48:53 =result ok -=elapsed 1.13848 +=elapsed 1.153995 =case qlc_SUITE:join_filter =logfile qlc_suite.join_filter.html -=started 2024-09-11 11:26:42 -=ended 2024-09-11 11:26:42 +=started 2024-09-12 10:48:53 +=ended 2024-09-12 10:48:54 =result ok -=elapsed 0.297754 +=elapsed 0.29796 =case qlc_SUITE:join_lookup =logfile qlc_suite.join_lookup.html -=started 2024-09-11 11:26:42 -=ended 2024-09-11 11:26:43 +=started 2024-09-12 10:48:54 +=ended 2024-09-12 10:48:54 =result ok -=elapsed 0.636987 +=elapsed 0.65111 =case qlc_SUITE:join_merge =logfile qlc_suite.join_merge.html -=started 2024-09-11 11:26:43 -=ended 2024-09-11 11:26:48 +=started 2024-09-12 10:48:54 +=ended 2024-09-12 10:49:00 =result ok -=elapsed 4.849977 +=elapsed 5.052906 =case qlc_SUITE:join_sort =logfile qlc_suite.join_sort.html -=started 2024-09-11 11:26:48 -=ended 2024-09-11 11:26:50 +=started 2024-09-12 10:49:00 +=ended 2024-09-12 10:49:02 =result ok -=elapsed 2.681606 +=elapsed 2.723835 =case qlc_SUITE:join_complex =logfile qlc_suite.join_complex.html -=started 2024-09-11 11:26:50 -=ended 2024-09-11 11:26:51 +=started 2024-09-12 10:49:02 +=ended 2024-09-12 10:49:03 =result ok -=elapsed 0.304961 +=elapsed 0.307578 =case qlc_SUITE:end_per_group -=logfile qlc_suite.end_per_group.483586.html +=logfile qlc_suite.end_per_group.407043.html =group_props [{name,join}] -=started 2024-09-11 11:26:51 -=ended 2024-09-11 11:26:51 +=started 2024-09-12 10:49:03 +=ended 2024-09-12 10:49:03 =result ok =elapsed 0.0 -=group_time 10.072s +=group_time 10.351s =case qlc_SUITE:init_per_group -=logfile qlc_suite.init_per_group.483618.html +=logfile qlc_suite.init_per_group.407075.html =group_props [{name,tickets}] -=started 2024-09-11 11:26:51 -=ended 2024-09-11 11:26:51 +=started 2024-09-12 10:49:03 +=ended 2024-09-12 10:49:03 =result ok =elapsed 0.0 =case qlc_SUITE:otp_5644 =logfile qlc_suite.otp_5644.html -=started 2024-09-11 11:26:51 -=ended 2024-09-11 11:26:51 +=started 2024-09-12 10:49:03 +=ended 2024-09-12 10:49:03 =result ok -=elapsed 0.029431 +=elapsed 0.031536 =case qlc_SUITE:otp_5195 =logfile qlc_suite.otp_5195.html -=started 2024-09-11 11:26:51 -=ended 2024-09-11 11:26:51 +=started 2024-09-12 10:49:03 +=ended 2024-09-12 10:49:03 =result ok -=elapsed 0.471715 +=elapsed 0.485934 =case qlc_SUITE:otp_6038_bug =logfile qlc_suite.otp_6038_bug.html -=started 2024-09-11 11:26:51 -=ended 2024-09-11 11:26:52 +=started 2024-09-12 10:49:03 +=ended 2024-09-12 10:49:04 =result ok -=elapsed 0.320536 +=elapsed 0.316641 =case qlc_SUITE:otp_6359 =logfile qlc_suite.otp_6359.html -=started 2024-09-11 11:26:52 -=ended 2024-09-11 11:26:52 +=started 2024-09-12 10:49:04 +=ended 2024-09-12 10:49:04 =result ok -=elapsed 0.041316 +=elapsed 0.041721 =case qlc_SUITE:otp_6562 =logfile qlc_suite.otp_6562.html -=started 2024-09-11 11:26:52 -=ended 2024-09-11 11:26:52 +=started 2024-09-12 10:49:04 +=ended 2024-09-12 10:49:04 =result ok -=elapsed 0.309807 +=elapsed 0.32607 =case qlc_SUITE:otp_6590 =logfile qlc_suite.otp_6590.html -=started 2024-09-11 11:26:52 -=ended 2024-09-11 11:26:52 +=started 2024-09-12 10:49:04 +=ended 2024-09-12 10:49:04 =result ok -=elapsed 0.068593 +=elapsed 0.071389 =case qlc_SUITE:otp_6673 =logfile qlc_suite.otp_6673.html -=started 2024-09-11 11:26:52 -=ended 2024-09-11 11:26:52 +=started 2024-09-12 10:49:04 +=ended 2024-09-12 10:49:05 =result ok -=elapsed 0.412448 +=elapsed 0.42114 =case qlc_SUITE:otp_6964 =logfile qlc_suite.otp_6964.html -=started 2024-09-11 11:26:52 -=ended 2024-09-11 11:26:53 +=started 2024-09-12 10:49:05 +=ended 2024-09-12 10:49:06 =result ok -=elapsed 1.000081 +=elapsed 1.010481 =case qlc_SUITE:otp_7114 =logfile qlc_suite.otp_7114.html -=started 2024-09-11 11:26:53 -=ended 2024-09-11 11:26:54 +=started 2024-09-12 10:49:06 +=ended 2024-09-12 10:49:06 =result ok -=elapsed 0.043648 +=elapsed 0.042809 =case qlc_SUITE:otp_7232 =logfile qlc_suite.otp_7232.html -=started 2024-09-11 11:26:54 -=ended 2024-09-11 11:26:54 +=started 2024-09-12 10:49:06 +=ended 2024-09-12 10:49:06 =result ok -=elapsed 0.143922 +=elapsed 0.137451 =case qlc_SUITE:otp_7238 =logfile qlc_suite.otp_7238.html -=started 2024-09-11 11:26:54 -=ended 2024-09-11 11:26:55 +=started 2024-09-12 10:49:06 +=ended 2024-09-12 10:49:07 =result ok -=elapsed 1.203805 +=elapsed 1.216619 =case qlc_SUITE:otp_7552 =logfile qlc_suite.otp_7552.html -=started 2024-09-11 11:26:55 -=ended 2024-09-11 11:26:55 +=started 2024-09-12 10:49:07 +=ended 2024-09-12 10:49:07 =result ok -=elapsed 0.108216 +=elapsed 0.109118 =case qlc_SUITE:otp_6674 =logfile qlc_suite.otp_6674.html -=started 2024-09-11 11:26:55 -=ended 2024-09-11 11:26:58 +=started 2024-09-12 10:49:07 +=ended 2024-09-12 10:49:10 =result ok -=elapsed 2.849935 +=elapsed 2.916482 =case qlc_SUITE:otp_7714 =logfile qlc_suite.otp_7714.html -=started 2024-09-11 11:26:58 -=ended 2024-09-11 11:26:58 +=started 2024-09-12 10:49:10 +=ended 2024-09-12 10:49:10 =result ok -=elapsed 0.083095 +=elapsed 0.084191 =case qlc_SUITE:otp_11758 =logfile qlc_suite.otp_11758.html -=started 2024-09-11 11:26:58 -=ended 2024-09-11 11:26:58 +=started 2024-09-12 10:49:10 +=ended 2024-09-12 10:49:10 =result ok -=elapsed 0.050039 +=elapsed 0.047872 =case qlc_SUITE:otp_12946 =logfile qlc_suite.otp_12946.html -=started 2024-09-11 11:26:58 -=ended 2024-09-11 11:26:58 +=started 2024-09-12 10:49:10 +=ended 2024-09-12 10:49:10 =result ok -=elapsed 0.011818 +=elapsed 0.01269 =case qlc_SUITE:end_per_group -=logfile qlc_suite.end_per_group.502531.html +=logfile qlc_suite.end_per_group.425508.html =group_props [{name,tickets}] -=started 2024-09-11 11:26:58 -=ended 2024-09-11 11:26:58 +=started 2024-09-12 10:49:10 +=ended 2024-09-12 10:49:10 =result ok =elapsed 0.0 -=group_time 7.543s +=group_time 7.667s =case qlc_SUITE:manpage =logfile qlc_suite.manpage.html -=started 2024-09-11 11:26:58 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:10 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 0.641892 +=elapsed 0.652283 =case qlc_SUITE:init_per_group -=logfile qlc_suite.init_per_group.484034.html +=logfile qlc_suite.init_per_group.425540.html =group_props [{name,compat}] -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok =elapsed 0.0 =case qlc_SUITE:backward =logfile qlc_suite.backward.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 0.057602 +=elapsed 0.060296 =case qlc_SUITE:forward =logfile qlc_suite.forward.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 0.051889 +=elapsed 0.055322 =case qlc_SUITE:end_per_group -=logfile qlc_suite.end_per_group.502563.html +=logfile qlc_suite.end_per_group.499938.html =group_props [{name,compat}] -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok =elapsed 0.0 -=group_time 0.179s +=group_time 0.184s =case qlc_SUITE:end_per_suite =logfile qlc_suite.end_per_suite.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok =elapsed 0.0 -=group_time 44.004s +=group_time 44.748s =case queue_SUITE:init_per_suite =logfile queue_suite.init_per_suite.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok =elapsed 0.0 =case queue_SUITE:do =logfile queue_suite.do.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok =elapsed 3.0e-6 =case queue_SUITE:to_list =logfile queue_suite.to_list.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case queue_SUITE:io_test =logfile queue_suite.io_test.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 6.8e-5 +=elapsed 8.9e-5 =case queue_SUITE:op_test =logfile queue_suite.op_test.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 4.9e-5 +=elapsed 6.0e-5 =case queue_SUITE:error =logfile queue_suite.error.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:11 =result ok -=elapsed 1.43e-4 +=elapsed 1.19e-4 =case queue_SUITE:oops =logfile queue_suite.oops.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:11 +=ended 2024-09-12 10:49:12 =result ok -=elapsed 0.15178 +=elapsed 0.164248 =case queue_SUITE:end_per_suite =logfile queue_suite.end_per_suite.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:26:59 +=started 2024-09-12 10:49:12 +=ended 2024-09-12 10:49:12 =result ok =elapsed 0.0 -=group_time 0.325s +=group_time 0.342s =case queue_property_test_SUITE:init_per_suite =logfile queue_property_test_suite.init_per_suite.html -=started 2024-09-11 11:26:59 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:12 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 1.275813 +=elapsed 1.261506 =case queue_property_test_SUITE:new_case =logfile queue_property_test_suite.new_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.001255 +=elapsed 0.001319 =case queue_property_test_SUITE:is_queue_case =logfile queue_property_test_suite.is_queue_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.044214 +=elapsed 0.033056 =case queue_property_test_SUITE:list_conversion_case =logfile queue_property_test_suite.list_conversion_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.057967 +=elapsed 0.059866 =case queue_property_test_SUITE:from_list_invalid_case =logfile queue_property_test_suite.from_list_invalid_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.007539 +=elapsed 0.007116 =case queue_property_test_SUITE:to_list_invalid_case =logfile queue_property_test_suite.to_list_invalid_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.005514 +=elapsed 0.00534 =case queue_property_test_SUITE:all_case =logfile queue_property_test_suite.all_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.050875 +=elapsed 0.076664 =case queue_property_test_SUITE:all_invalid_case =logfile queue_property_test_suite.all_invalid_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.021128 +=elapsed 0.028528 =case queue_property_test_SUITE:any_case =logfile queue_property_test_suite.any_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.127022 +=elapsed 0.130296 =case queue_property_test_SUITE:any_invalid_case =logfile queue_property_test_suite.any_invalid_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:13 =result ok -=elapsed 0.028449 +=elapsed 0.031534 =case queue_property_test_SUITE:cons_case =logfile queue_property_test_suite.cons_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:13 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.063788 +=elapsed 0.058897 =case queue_property_test_SUITE:cons_invalid_case =logfile queue_property_test_suite.cons_invalid_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:01 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.009748 +=elapsed 0.009943 =case queue_property_test_SUITE:daeh_case =logfile queue_property_test_suite.daeh_case.html -=started 2024-09-11 11:27:01 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.129639 +=elapsed 0.123617 =case queue_property_test_SUITE:daeh_invalid_case =logfile queue_property_test_suite.daeh_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.005586 +=elapsed 0.004656 =case queue_property_test_SUITE:delete_case =logfile queue_property_test_suite.delete_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.142434 +=elapsed 0.140708 =case queue_property_test_SUITE:delete_invalid_case =logfile queue_property_test_suite.delete_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.010893 +=elapsed 0.009612 =case queue_property_test_SUITE:delete_r_case =logfile queue_property_test_suite.delete_r_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.135358 +=elapsed 0.13324 =case queue_property_test_SUITE:delete_r_invalid_case =logfile queue_property_test_suite.delete_r_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.010598 +=elapsed 0.011173 =case queue_property_test_SUITE:delete_with_case =logfile queue_property_test_suite.delete_with_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.12078 +=elapsed 0.120339 =case queue_property_test_SUITE:delete_with_invalid_case =logfile queue_property_test_suite.delete_with_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.033887 +=elapsed 0.032077 =case queue_property_test_SUITE:delete_with_r_case =logfile queue_property_test_suite.delete_with_r_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:14 =result ok -=elapsed 0.116715 +=elapsed 0.132971 =case queue_property_test_SUITE:delete_with_r_invalid_case =logfile queue_property_test_suite.delete_with_r_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:14 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.024424 +=elapsed 0.02149 =case queue_property_test_SUITE:drop_case =logfile queue_property_test_suite.drop_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:02 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.116417 +=elapsed 0.12103 =case queue_property_test_SUITE:drop_invalid_case =logfile queue_property_test_suite.drop_invalid_case.html -=started 2024-09-11 11:27:02 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.00544 +=elapsed 0.006481 =case queue_property_test_SUITE:drop_r_case =logfile queue_property_test_suite.drop_r_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.132685 +=elapsed 0.127344 =case queue_property_test_SUITE:drop_r_invalid_case =logfile queue_property_test_suite.drop_r_invalid_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.005306 +=elapsed 0.005858 =case queue_property_test_SUITE:filter_case =logfile queue_property_test_suite.filter_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.122936 +=elapsed 0.121717 =case queue_property_test_SUITE:filter_invalid_case =logfile queue_property_test_suite.filter_invalid_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.031674 +=elapsed 0.020168 =case queue_property_test_SUITE:filtermap_case =logfile queue_property_test_suite.filtermap_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.125202 +=elapsed 0.118103 =case queue_property_test_SUITE:filtermap_invalid_case =logfile queue_property_test_suite.filtermap_invalid_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.027696 +=elapsed 0.036852 =case queue_property_test_SUITE:fold_case =logfile queue_property_test_suite.fold_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.146787 +=elapsed 0.110541 =case queue_property_test_SUITE:fold_invalid_case =logfile queue_property_test_suite.fold_invalid_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:15 =result ok -=elapsed 0.026147 +=elapsed 0.025775 =case queue_property_test_SUITE:get_case =logfile queue_property_test_suite.get_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:03 +=started 2024-09-12 10:49:15 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.129183 +=elapsed 0.131393 =case queue_property_test_SUITE:get_invalid_case =logfile queue_property_test_suite.get_invalid_case.html -=started 2024-09-11 11:27:03 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.008959 +=elapsed 0.005565 =case queue_property_test_SUITE:get_r_case =logfile queue_property_test_suite.get_r_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.126974 +=elapsed 0.119998 =case queue_property_test_SUITE:get_r_invalid_case =logfile queue_property_test_suite.get_r_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.008579 +=elapsed 0.006081 =case queue_property_test_SUITE:head_case =logfile queue_property_test_suite.head_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.116987 +=elapsed 0.120189 =case queue_property_test_SUITE:head_invalid_case =logfile queue_property_test_suite.head_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.00609 +=elapsed 0.00814 =case queue_property_test_SUITE:in_case =logfile queue_property_test_suite.in_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.072603 +=elapsed 0.06564 =case queue_property_test_SUITE:in_invalid_case =logfile queue_property_test_suite.in_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.009041 +=elapsed 0.014172 =case queue_property_test_SUITE:in_r_case =logfile queue_property_test_suite.in_r_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.066337 +=elapsed 0.067375 =case queue_property_test_SUITE:in_r_invalid_case =logfile queue_property_test_suite.in_r_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.010288 +=elapsed 0.014891 =case queue_property_test_SUITE:init_case =logfile queue_property_test_suite.init_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.11442 +=elapsed 0.129116 =case queue_property_test_SUITE:init_invalid_case =logfile queue_property_test_suite.init_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:16 =result ok -=elapsed 0.006571 +=elapsed 0.009313 =case queue_property_test_SUITE:is_empty_case =logfile queue_property_test_suite.is_empty_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:16 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.113918 +=elapsed 0.132489 =case queue_property_test_SUITE:is_empty_invalid_case =logfile queue_property_test_suite.is_empty_invalid_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:04 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.004525 +=elapsed 0.005192 =case queue_property_test_SUITE:join_case =logfile queue_property_test_suite.join_case.html -=started 2024-09-11 11:27:04 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.23067 +=elapsed 0.239247 =case queue_property_test_SUITE:join_invalid_case =logfile queue_property_test_suite.join_invalid_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.046988 +=elapsed 0.046087 =case queue_property_test_SUITE:last_case =logfile queue_property_test_suite.last_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.120736 +=elapsed 0.132569 =case queue_property_test_SUITE:last_invalid_case =logfile queue_property_test_suite.last_invalid_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.005246 +=elapsed 0.005536 =case queue_property_test_SUITE:len_case =logfile queue_property_test_suite.len_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.125758 +=elapsed 0.122559 =case queue_property_test_SUITE:len_invalid_case =logfile queue_property_test_suite.len_invalid_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.004795 +=elapsed 0.005448 =case queue_property_test_SUITE:liat_case =logfile queue_property_test_suite.liat_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.119143 +=elapsed 0.130715 =case queue_property_test_SUITE:liat_invalid_case =logfile queue_property_test_suite.liat_invalid_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:17 =result ok -=elapsed 0.005323 +=elapsed 0.006393 =case queue_property_test_SUITE:member_case =logfile queue_property_test_suite.member_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:17 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.132053 +=elapsed 0.136151 =case queue_property_test_SUITE:member_invalid_case =logfile queue_property_test_suite.member_invalid_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:05 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.010129 +=elapsed 0.00952 =case queue_property_test_SUITE:out_case =logfile queue_property_test_suite.out_case.html -=started 2024-09-11 11:27:05 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.130093 +=elapsed 0.11988 =case queue_property_test_SUITE:out_invalid_case =logfile queue_property_test_suite.out_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.007631 +=elapsed 0.006216 =case queue_property_test_SUITE:out_r_case =logfile queue_property_test_suite.out_r_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.117925 +=elapsed 0.129887 =case queue_property_test_SUITE:out_r_invalid_case =logfile queue_property_test_suite.out_r_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.008268 +=elapsed 0.007995 =case queue_property_test_SUITE:peek_case =logfile queue_property_test_suite.peek_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.13659 +=elapsed 0.122735 =case queue_property_test_SUITE:peek_invalid_case =logfile queue_property_test_suite.peek_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.007405 +=elapsed 0.008081 =case queue_property_test_SUITE:peek_r_case =logfile queue_property_test_suite.peek_r_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.114383 +=elapsed 0.126825 =case queue_property_test_SUITE:peek_r_invalid_case =logfile queue_property_test_suite.peek_r_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:18 =result ok -=elapsed 0.00535 +=elapsed 0.005293 =case queue_property_test_SUITE:reverse_case =logfile queue_property_test_suite.reverse_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:18 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.135848 +=elapsed 0.12602 =case queue_property_test_SUITE:reverse_invalid_case =logfile queue_property_test_suite.reverse_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.004868 +=elapsed 0.007787 =case queue_property_test_SUITE:snoc_case =logfile queue_property_test_suite.snoc_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.058095 +=elapsed 0.069327 =case queue_property_test_SUITE:snoc_invalid_case =logfile queue_property_test_suite.snoc_invalid_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:06 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.010843 +=elapsed 0.01298 =case queue_property_test_SUITE:split_case =logfile queue_property_test_suite.split_case.html -=started 2024-09-11 11:27:06 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.129771 +=elapsed 0.126914 =case queue_property_test_SUITE:split_invalid_case =logfile queue_property_test_suite.split_invalid_case.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.039913 +=elapsed 0.041124 =case queue_property_test_SUITE:tail_case =logfile queue_property_test_suite.tail_case.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.127872 +=elapsed 0.126886 =case queue_property_test_SUITE:tail_invalid_case =logfile queue_property_test_suite.tail_invalid_case.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.005212 +=elapsed 0.004947 =case queue_property_test_SUITE:ops_case =logfile queue_property_test_suite.ops_case.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 0.127503 +=elapsed 0.140672 =case queue_property_test_SUITE:end_per_suite =logfile queue_property_test_suite.end_per_suite.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok =elapsed 0.0 -=group_time 7.581s +=group_time 7.639s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.486274.html +=logfile ct_framework.init_per_suite.502242.html =group_props [{suite,rand_SUITE}] -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok =elapsed 0.0 =case rand_SUITE:seed =logfile rand_suite.seed.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:07 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:19 =result ok -=elapsed 3.11e-4 +=elapsed 2.39e-4 =case rand_SUITE:interval_int =logfile rand_suite.interval_int.html -=started 2024-09-11 11:27:07 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:19 +=ended 2024-09-12 10:49:20 =result ok -=elapsed 0.65606 +=elapsed 0.66198 =case rand_SUITE:interval_float =logfile rand_suite.interval_float.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:20 +=ended 2024-09-12 10:49:20 =result ok -=elapsed 0.314364 +=elapsed 0.311496 =case rand_SUITE:bytes_count =logfile rand_suite.bytes_count.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:20 +=ended 2024-09-12 10:49:20 =result ok -=elapsed 0.01089 +=elapsed 0.010814 =case rand_SUITE:api_eq =logfile rand_suite.api_eq.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:20 +=ended 2024-09-12 10:49:20 =result ok -=elapsed 0.028082 +=elapsed 0.027998 =case rand_SUITE:mwc59_api =logfile rand_suite.mwc59_api.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:20 +=ended 2024-09-12 10:49:20 =result ok -=elapsed 0.043389 +=elapsed 0.043399 =case rand_SUITE:exsp_next_api =logfile rand_suite.exsp_next_api.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:20 +=ended 2024-09-12 10:49:21 =result ok -=elapsed 0.055708 +=elapsed 0.057035 =case rand_SUITE:exsp_jump_api =logfile rand_suite.exsp_jump_api.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:21 +=ended 2024-09-12 10:49:21 =result ok -=elapsed 0.060826 +=elapsed 0.060995 =case rand_SUITE:splitmix64_next_api =logfile rand_suite.splitmix64_next_api.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:08 +=started 2024-09-12 10:49:21 +=ended 2024-09-12 10:49:21 =result ok -=elapsed 0.027901 +=elapsed 0.026709 =case rand_SUITE:reference =logfile rand_suite.reference.html -=started 2024-09-11 11:27:08 -=ended 2024-09-11 11:27:10 +=started 2024-09-12 10:49:21 +=ended 2024-09-12 10:49:22 =result ok -=elapsed 1.180287 +=elapsed 1.184378 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.488642.html +=logfile ct_framework.init_per_group.504610.html =group_props [{name,basic_stats},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:10 -=ended 2024-09-11 11:27:10 +=started 2024-09-12 10:49:22 +=ended 2024-09-12 10:49:22 =result ok =elapsed 3.8e-5 =case rand_SUITE:basic_stats_uniform_1 -=logfile rand_suite.basic_stats_uniform_1.488674.html -=started 2024-09-11 11:27:10 -=ended 2024-09-11 11:27:13 +=logfile rand_suite.basic_stats_uniform_1.407459.html +=started 2024-09-12 10:49:22 +=ended 2024-09-12 10:49:25 =result ok -=elapsed 3.50642 +=elapsed 3.532923 =case rand_SUITE:basic_stats_uniform_2 -=logfile rand_suite.basic_stats_uniform_2.488738.html -=started 2024-09-11 11:27:10 -=ended 2024-09-11 11:27:13 +=logfile rand_suite.basic_stats_uniform_2.504642.html +=started 2024-09-12 10:49:22 +=ended 2024-09-12 10:49:25 =result ok -=elapsed 3.209945 +=elapsed 3.313047 =case rand_SUITE:basic_stats_bytes -=logfile rand_suite.basic_stats_bytes.488706.html -=started 2024-09-11 11:27:10 -=ended 2024-09-11 11:27:12 +=logfile rand_suite.basic_stats_bytes.504674.html +=started 2024-09-12 10:49:22 +=ended 2024-09-12 10:49:24 =result ok -=elapsed 2.43257 +=elapsed 2.413912 =case rand_SUITE:basic_stats_standard_normal -=logfile rand_suite.basic_stats_standard_normal.502691.html -=started 2024-09-11 11:27:10 -=ended 2024-09-11 11:27:13 +=logfile rand_suite.basic_stats_standard_normal.504706.html +=started 2024-09-12 10:49:22 +=ended 2024-09-12 10:49:25 =result ok -=elapsed 3.099241 +=elapsed 2.873522 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.503043.html +=logfile ct_framework.end_per_group.504962.html =group_props [{name,basic_stats},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:13 -=ended 2024-09-11 11:27:13 +=started 2024-09-12 10:49:25 +=ended 2024-09-12 10:49:26 =result ok -=elapsed 4.0e-5 -=group_time 3.558s +=elapsed 3.9e-5 +=group_time 3.580s =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.503075.html +=logfile ct_framework.init_per_group.504994.html =group_props [{name,distr_stats},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:13 -=ended 2024-09-11 11:27:13 +=started 2024-09-12 10:49:26 +=ended 2024-09-12 10:49:26 =result ok -=elapsed 4.1e-5 +=elapsed 4.5e-5 =case rand_SUITE:stats_standard_normal_box_muller -=logfile rand_suite.stats_standard_normal_box_muller.503107.html -=started 2024-09-11 11:27:13 -=ended 2024-09-11 11:27:21 -=result ok: {tp,7.903340006167214,op,0.6000429761841857} -=elapsed 7.793473 +=logfile rand_suite.stats_standard_normal_box_muller.505026.html +=started 2024-09-12 10:49:26 +=ended 2024-09-12 10:49:33 +=result ok: {tp,7.214729335018004,op,1.4816028301143793} +=elapsed 7.387357 =case rand_SUITE:stats_standard_normal_box_muller_2 -=logfile rand_suite.stats_standard_normal_box_muller_2.503139.html -=started 2024-09-11 11:27:13 -=ended 2024-09-11 11:27:21 -=result ok: {tp,7.736935264315239,op,1.119992882577854} -=elapsed 7.742518 +=logfile rand_suite.stats_standard_normal_box_muller_2.505058.html +=started 2024-09-12 10:49:26 +=ended 2024-09-12 10:49:33 +=result ok: {tp,8.83620275154175,op,10.610893926570208} +=elapsed 7.329903 =case rand_SUITE:stats_standard_normal -=logfile rand_suite.stats_standard_normal.503171.html -=started 2024-09-11 11:27:13 -=ended 2024-09-11 11:27:21 -=result ok: {tp,9.12599096011556,op,90.40118884611324} -=elapsed 7.710885 +=logfile rand_suite.stats_standard_normal.505090.html +=started 2024-09-12 10:49:26 +=ended 2024-09-12 10:49:33 +=result ok: {tp,7.903340006167214,op,16.069013440209282} +=elapsed 7.365339 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.503203.html +=logfile ct_framework.end_per_group.505154.html =group_props [{name,distr_stats},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:21 -=ended 2024-09-11 11:27:21 +=started 2024-09-12 10:49:33 +=ended 2024-09-12 10:49:33 =result ok -=elapsed 3.2e-5 -=group_time 7.841s +=elapsed 4.2e-5 +=group_time 7.436s =case rand_SUITE:uniform_real_conv =logfile rand_suite.uniform_real_conv.html -=started 2024-09-11 11:27:21 -=ended 2024-09-11 11:27:21 +=started 2024-09-12 10:49:33 +=ended 2024-09-12 10:49:33 =result ok -=elapsed 0.008102 +=elapsed 0.008107 =case rand_SUITE:plugin =logfile rand_suite.plugin.html -=started 2024-09-11 11:27:21 -=ended 2024-09-11 11:27:21 +=started 2024-09-12 10:49:33 +=ended 2024-09-12 10:49:33 =result ok -=elapsed 1.11e-4 +=elapsed 9.6e-5 =case rand_SUITE:measure =logfile rand_suite.measure.html -=started 2024-09-11 11:27:21 -=ended 2024-09-11 11:27:38 +=started 2024-09-12 10:49:33 +=ended 2024-09-12 10:49:51 =result ok -=elapsed 17.1952 +=elapsed 17.536677 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.19694146.html +=logfile ct_framework.init_per_group.19710306.html =group_props [{name,reference_jump},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:38 -=ended 2024-09-11 11:27:38 +=started 2024-09-12 10:49:51 +=ended 2024-09-12 10:49:51 =result ok -=elapsed 3.8e-5 +=elapsed 3.4e-5 =case rand_SUITE:reference_jump_state -=logfile rand_suite.reference_jump_state.19694178.html -=started 2024-09-11 11:27:38 -=ended 2024-09-11 11:27:40 +=logfile rand_suite.reference_jump_state.19710338.html +=started 2024-09-12 10:49:51 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 1.179754 +=elapsed 1.157174 =case rand_SUITE:reference_jump_procdict -=logfile rand_suite.reference_jump_procdict.19694210.html -=started 2024-09-11 11:27:38 -=ended 2024-09-11 11:27:40 +=logfile rand_suite.reference_jump_procdict.19710370.html +=started 2024-09-12 10:49:51 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 1.179272 +=elapsed 1.166871 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.19694274.html +=logfile ct_framework.end_per_group.19710434.html =group_props [{name,reference_jump},parallel,{suite,rand_SUITE}] -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 3.8e-5 -=group_time 1.226s +=elapsed 3.2e-5 +=group_time 1.214s =case rand_SUITE:short_jump =logfile rand_suite.short_jump.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 0.448898 +=elapsed 0.456613 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19694306.html +=logfile ct_framework.end_per_suite.19710466.html =group_props [{suite,rand_SUITE}] -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok =elapsed 0.0 -=group_time 33.086s +=group_time 33.046s =case random_SUITE:init_per_suite =logfile random_suite.init_per_suite.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok =elapsed 0.0 =case random_SUITE:interval_1 =logfile random_suite.interval_1.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 0.002104 +=elapsed 0.001871 =case random_SUITE:seed0 =logfile random_suite.seed0.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 1.0e-5 +=elapsed 8.0e-6 =case random_SUITE:seed =logfile random_suite.seed.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 5.5e-5 +=elapsed 4.6e-5 =case random_SUITE:end_per_suite =logfile random_suite.end_per_suite.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok =elapsed 0.0 -=group_time 0.106s +=group_time 0.104s =case re_SUITE:init_per_suite =logfile re_suite.init_per_suite.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:40 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:52 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case re_SUITE:pcre =logfile re_suite.pcre.html -=started 2024-09-11 11:27:40 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:52 +=ended 2024-09-12 10:49:53 =result ok: [{0,6786,0}, {0,4926,88}, {0,138,48}, @@ -12048,6214 +12048,6214 @@ {0,1716,0}, {0,594,8}, {0,36,0}] -=elapsed 0.648227 +=elapsed 0.652561 =case re_SUITE:compile_options =logfile re_suite.compile_options.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 9.0e-5 +=elapsed 9.2e-5 =case re_SUITE:run_options =logfile re_suite.run_options.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 1.51e-4 +=elapsed 1.53e-4 =case re_SUITE:combined_options =logfile re_suite.combined_options.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 1.24e-4 +=elapsed 1.27e-4 =case re_SUITE:replace_autogen =logfile re_suite.replace_autogen.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 0.025233 +=elapsed 0.025258 =case re_SUITE:global_capture =logfile re_suite.global_capture.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 1.57e-4 +=elapsed 1.65e-4 =case re_SUITE:replace_input_types =logfile re_suite.replace_input_types.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 1.6e-5 +=elapsed 1.5e-5 =case re_SUITE:replace_with_fun =logfile re_suite.replace_with_fun.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 4.7e-5 +=elapsed 4.6e-5 =case re_SUITE:replace_return =logfile re_suite.replace_return.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 2.59e-4 +=elapsed 2.61e-4 =case re_SUITE:split_autogen =logfile re_suite.split_autogen.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 0.038391 +=elapsed 0.038996 =case re_SUITE:split_options =logfile re_suite.split_options.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 2.34e-4 +=elapsed 2.35e-4 =case re_SUITE:split_specials =logfile re_suite.split_specials.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:53 =result ok -=elapsed 3.1e-5 +=elapsed 2.2e-5 =case re_SUITE:error_handling =logfile re_suite.error_handling.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:53 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 1.23e-4 +=elapsed 1.2e-4 =case re_SUITE:pcre_cve_2008_2371 =logfile re_suite.pcre_cve_2008_2371.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok =elapsed 5.0e-6 =case re_SUITE:pcre_compile_workspace_overflow =logfile re_suite.pcre_compile_workspace_overflow.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:41 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok: Got expected error: regular expression is too complicated -=elapsed 1.55e-4 +=elapsed 1.72e-4 =case re_SUITE:re_infinite_loop =logfile re_suite.re_infinite_loop.html -=started 2024-09-11 11:27:41 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.421766 +=elapsed 0.418422 =case re_SUITE:re_backwards_accented =logfile re_suite.re_backwards_accented.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 9.0e-6 +=elapsed 1.0e-5 =case re_SUITE:opt_dupnames =logfile re_suite.opt_dupnames.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 2.81e-4 +=elapsed 2.86e-4 =case re_SUITE:opt_all_names =logfile re_suite.opt_all_names.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 2.72e-4 +=elapsed 2.76e-4 =case re_SUITE:inspect =logfile re_suite.inspect.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 1.5e-5 +=elapsed 1.6e-5 =case re_SUITE:opt_no_start_optimize =logfile re_suite.opt_no_start_optimize.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 9.0e-6 +=elapsed 1.1e-5 =case re_SUITE:opt_never_utf =logfile re_suite.opt_never_utf.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 2.6e-5 +=elapsed 3.8e-5 =case re_SUITE:opt_ucp =logfile re_suite.opt_ucp.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 1.2e-5 +=elapsed 1.8e-5 =case re_SUITE:match_limit =logfile re_suite.match_limit.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.001664 +=elapsed 0.001812 =case re_SUITE:sub_binaries =logfile re_suite.sub_binaries.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 1.77e-4 +=elapsed 2.68e-4 =case re_SUITE:re_version =logfile re_suite.re_version.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 8.0e-6 +=elapsed 1.0e-5 =case re_SUITE:global_unicode_validation =logfile re_suite.global_unicode_validation.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.12722 +=elapsed 0.133239 =case re_SUITE:yield_on_subject_validation =logfile re_suite.yield_on_subject_validation.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.00105 +=elapsed 0.001187 =case re_SUITE:bad_utf8_subject =logfile re_suite.bad_utf8_subject.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.00313 +=elapsed 0.003147 =case re_SUITE:error_info =logfile re_suite.error_info.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok -=elapsed 0.003329 +=elapsed 0.003508 =case re_SUITE:end_per_suite =logfile re_suite.end_per_suite.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:54 =result ok =elapsed 0.0 -=group_time 1.998s +=group_time 2.007s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19694338.html +=logfile ct_framework.init_per_suite.19710498.html =group_props [{suite,select_SUITE}] -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:54 +=ended 2024-09-12 10:49:55 =result ok =elapsed 0.0 =case select_SUITE:return_values =logfile select_suite.return_values.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:42 +=started 2024-09-12 10:49:55 +=ended 2024-09-12 10:49:55 =result ok -=elapsed 0.006153 +=elapsed 0.006015 =case select_SUITE:select_test =logfile select_suite.select_test.html -=started 2024-09-11 11:27:42 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:49:55 +=ended 2024-09-12 10:50:07 =result ok -=elapsed 12.403859 +=elapsed 12.480334 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19694402.html +=logfile ct_framework.end_per_suite.19710562.html =group_props [{suite,select_SUITE}] -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:07 =result ok =elapsed 0.0 -=group_time 12.489s +=group_time 12.567s =case sets_SUITE:init_per_suite =logfile sets_suite.init_per_suite.html -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:07 =result ok =elapsed 0.0 =case sets_SUITE:create =logfile sets_suite.create.html -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:07 =result ok -=elapsed 2.1e-5 +=elapsed 2.3e-5 =case sets_SUITE:add_element =logfile sets_suite.add_element.html -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:07 =result ok -=elapsed 0.154789 +=elapsed 0.155049 =case sets_SUITE:del_element =logfile sets_suite.del_element.html -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:55 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:07 =result ok -=elapsed 0.170629 +=elapsed 0.171322 =case sets_SUITE:subtract =logfile sets_suite.subtract.html -=started 2024-09-11 11:27:55 -=ended 2024-09-11 11:27:56 +=started 2024-09-12 10:50:07 +=ended 2024-09-12 10:50:08 =result ok -=elapsed 0.403033 +=elapsed 0.401998 =case sets_SUITE:intersection =logfile sets_suite.intersection.html -=started 2024-09-11 11:27:56 -=ended 2024-09-11 11:27:56 +=started 2024-09-12 10:50:08 +=ended 2024-09-12 10:50:08 =result ok -=elapsed 0.52109 +=elapsed 0.521016 =case sets_SUITE:union =logfile sets_suite.union.html -=started 2024-09-11 11:27:56 -=ended 2024-09-11 11:27:57 +=started 2024-09-12 10:50:08 +=ended 2024-09-12 10:50:09 =result ok -=elapsed 0.625861 +=elapsed 0.626688 =case sets_SUITE:is_subset =logfile sets_suite.is_subset.html -=started 2024-09-11 11:27:57 -=ended 2024-09-11 11:27:57 +=started 2024-09-12 10:50:09 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.557873 +=elapsed 0.554358 =case sets_SUITE:is_set =logfile sets_suite.is_set.html -=started 2024-09-11 11:27:57 -=ended 2024-09-11 11:27:57 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case sets_SUITE:fold =logfile sets_suite.fold.html -=started 2024-09-11 11:27:57 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.081465 +=elapsed 0.081163 =case sets_SUITE:filter =logfile sets_suite.filter.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.057319 +=elapsed 0.05856 =case sets_SUITE:map =logfile sets_suite.map.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.086914 +=elapsed 0.087355 =case sets_SUITE:filtermap =logfile sets_suite.filtermap.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.048081 +=elapsed 0.047581 =case sets_SUITE:take_smallest =logfile sets_suite.take_smallest.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.014336 +=elapsed 0.014437 =case sets_SUITE:take_largest =logfile sets_suite.take_largest.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.016439 +=elapsed 0.016534 =case sets_SUITE:iterate =logfile sets_suite.iterate.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.070946 +=elapsed 0.073354 =case sets_SUITE:is_empty =logfile sets_suite.is_empty.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case sets_SUITE:is_disjoint =logfile sets_suite.is_disjoint.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.022215 +=elapsed 0.022253 =case sets_SUITE:is_equal =logfile sets_suite.is_equal.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok -=elapsed 0.049346 +=elapsed 0.049113 =case sets_SUITE:end_per_suite =logfile sets_suite.end_per_suite.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:58 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:10 =result ok =elapsed 0.0 -=group_time 3.318s +=group_time 3.328s =case sets_property_test_SUITE:init_per_suite =logfile sets_property_test_suite.init_per_suite.html -=started 2024-09-11 11:27:58 -=ended 2024-09-11 11:27:59 +=started 2024-09-12 10:50:10 +=ended 2024-09-12 10:50:12 =result ok -=elapsed 1.261903 +=elapsed 1.281607 =case sets_property_test_SUITE:add_element_case =logfile sets_property_test_suite.add_element_case.html -=started 2024-09-11 11:27:59 -=ended 2024-09-11 11:28:00 +=started 2024-09-12 10:50:12 +=ended 2024-09-12 10:50:12 =result ok -=elapsed 0.583391 +=elapsed 0.500622 =case sets_property_test_SUITE:del_element_case =logfile sets_property_test_suite.del_element_case.html -=started 2024-09-11 11:28:00 -=ended 2024-09-11 11:28:01 +=started 2024-09-12 10:50:12 +=ended 2024-09-12 10:50:13 =result ok -=elapsed 0.585125 +=elapsed 0.527979 =case sets_property_test_SUITE:filter_case =logfile sets_property_test_suite.filter_case.html -=started 2024-09-11 11:28:01 -=ended 2024-09-11 11:28:01 +=started 2024-09-12 10:50:13 +=ended 2024-09-12 10:50:13 =result ok -=elapsed 0.180726 +=elapsed 0.205541 =case sets_property_test_SUITE:filtermap_case =logfile sets_property_test_suite.filtermap_case.html -=started 2024-09-11 11:28:01 -=ended 2024-09-11 11:28:01 +=started 2024-09-12 10:50:13 +=ended 2024-09-12 10:50:13 =result ok -=elapsed 0.304328 +=elapsed 0.310368 =case sets_property_test_SUITE:fold_case =logfile sets_property_test_suite.fold_case.html -=started 2024-09-11 11:28:01 -=ended 2024-09-11 11:28:01 +=started 2024-09-12 10:50:13 +=ended 2024-09-12 10:50:14 =result ok -=elapsed 0.181741 +=elapsed 0.186302 =case sets_property_test_SUITE:from_list_case =logfile sets_property_test_suite.from_list_case.html -=started 2024-09-11 11:28:01 -=ended 2024-09-11 11:28:02 +=started 2024-09-12 10:50:14 +=ended 2024-09-12 10:50:14 =result ok -=elapsed 0.189364 +=elapsed 0.182514 =case sets_property_test_SUITE:intersection_1_case =logfile sets_property_test_suite.intersection_1_case.html -=started 2024-09-11 11:28:02 -=ended 2024-09-11 11:28:04 +=started 2024-09-12 10:50:14 +=ended 2024-09-12 10:50:17 =result ok -=elapsed 2.678149 +=elapsed 2.780878 =case sets_property_test_SUITE:intersection_2_case =logfile sets_property_test_suite.intersection_2_case.html -=started 2024-09-11 11:28:04 -=ended 2024-09-11 11:28:05 +=started 2024-09-12 10:50:17 +=ended 2024-09-12 10:50:17 =result ok -=elapsed 0.574297 +=elapsed 0.519404 =case sets_property_test_SUITE:is_disjoint_case =logfile sets_property_test_suite.is_disjoint_case.html -=started 2024-09-11 11:28:05 -=ended 2024-09-11 11:28:05 +=started 2024-09-12 10:50:17 +=ended 2024-09-12 10:50:18 =result ok -=elapsed 0.557623 +=elapsed 0.589852 =case sets_property_test_SUITE:is_element_case =logfile sets_property_test_suite.is_element_case.html -=started 2024-09-11 11:28:05 -=ended 2024-09-11 11:28:06 +=started 2024-09-12 10:50:18 +=ended 2024-09-12 10:50:18 =result ok -=elapsed 0.387592 +=elapsed 0.360947 =case sets_property_test_SUITE:is_empty_case =logfile sets_property_test_suite.is_empty_case.html -=started 2024-09-11 11:28:06 -=ended 2024-09-11 11:28:06 +=started 2024-09-12 10:50:18 +=ended 2024-09-12 10:50:18 =result ok -=elapsed 0.184164 +=elapsed 0.194834 =case sets_property_test_SUITE:is_equal_case =logfile sets_property_test_suite.is_equal_case.html -=started 2024-09-11 11:28:06 -=ended 2024-09-11 11:28:06 +=started 2024-09-12 10:50:18 +=ended 2024-09-12 10:50:19 =result ok -=elapsed 0.37249 +=elapsed 0.387084 =case sets_property_test_SUITE:is_set_case =logfile sets_property_test_suite.is_set_case.html -=started 2024-09-11 11:28:06 -=ended 2024-09-11 11:28:07 +=started 2024-09-12 10:50:19 +=ended 2024-09-12 10:50:19 =result ok -=elapsed 0.107096 +=elapsed 0.095325 =case sets_property_test_SUITE:is_subset_case =logfile sets_property_test_suite.is_subset_case.html -=started 2024-09-11 11:28:07 -=ended 2024-09-11 11:28:07 +=started 2024-09-12 10:50:19 +=ended 2024-09-12 10:50:19 =result ok -=elapsed 0.447113 +=elapsed 0.448371 =case sets_property_test_SUITE:map_case =logfile sets_property_test_suite.map_case.html -=started 2024-09-11 11:28:07 -=ended 2024-09-11 11:28:08 +=started 2024-09-12 10:50:19 +=ended 2024-09-12 10:50:20 =result ok -=elapsed 0.545253 +=elapsed 0.515336 =case sets_property_test_SUITE:size_case =logfile sets_property_test_suite.size_case.html -=started 2024-09-11 11:28:08 -=ended 2024-09-11 11:28:08 +=started 2024-09-12 10:50:20 +=ended 2024-09-12 10:50:20 =result ok -=elapsed 0.182284 +=elapsed 0.199065 =case sets_property_test_SUITE:subtract_case =logfile sets_property_test_suite.subtract_case.html -=started 2024-09-11 11:28:08 -=ended 2024-09-11 11:28:08 +=started 2024-09-12 10:50:20 +=ended 2024-09-12 10:50:21 =result ok -=elapsed 0.582065 +=elapsed 0.571191 =case sets_property_test_SUITE:to_list_case =logfile sets_property_test_suite.to_list_case.html -=started 2024-09-11 11:28:08 -=ended 2024-09-11 11:28:09 +=started 2024-09-12 10:50:21 +=ended 2024-09-12 10:50:21 =result ok -=elapsed 0.199656 +=elapsed 0.19901 =case sets_property_test_SUITE:union_1_case =logfile sets_property_test_suite.union_1_case.html -=started 2024-09-11 11:28:09 -=ended 2024-09-11 11:28:12 +=started 2024-09-12 10:50:21 +=ended 2024-09-12 10:50:24 =result ok -=elapsed 3.004532 +=elapsed 2.565882 =case sets_property_test_SUITE:union_2_case =logfile sets_property_test_suite.union_2_case.html -=started 2024-09-11 11:28:12 -=ended 2024-09-11 11:28:12 +=started 2024-09-12 10:50:24 +=ended 2024-09-12 10:50:24 =result ok -=elapsed 0.544433 +=elapsed 0.542962 =case sets_property_test_SUITE:operations_case =logfile sets_property_test_suite.operations_case.html -=started 2024-09-11 11:28:12 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:24 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 1.874388 +=elapsed 1.74659 =case sets_property_test_SUITE:end_per_suite =logfile sets_property_test_suite.end_per_suite.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok =elapsed 0.0 -=group_time 16.037s +=group_time 15.422s =case shell_SUITE:init_per_suite =logfile shell_suite.init_per_suite.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok =elapsed 0.0 =case shell_SUITE:forget =logfile shell_suite.forget.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.007512 +=elapsed 0.00737 =case shell_SUITE:known_bugs =logfile shell_suite.known_bugs.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.001085 +=elapsed 0.001034 =case shell_SUITE:otp_5226 =logfile shell_suite.otp_5226.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.076517 +=elapsed 0.065028 =case shell_SUITE:otp_5327 =logfile shell_suite.otp_5327.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:14 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.025531 +=elapsed 0.031546 =case shell_SUITE:otp_5435 =logfile shell_suite.otp_5435.html -=started 2024-09-11 11:28:14 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.191838 +=elapsed 0.18567 =case shell_SUITE:otp_5195 =logfile shell_suite.otp_5195.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.029379 +=elapsed 0.030155 =case shell_SUITE:otp_5915 =logfile shell_suite.otp_5915.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.007213 +=elapsed 0.007174 =case shell_SUITE:otp_5916 =logfile shell_suite.otp_5916.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 0.001405 +=elapsed 0.001404 =case shell_SUITE:prompt_width =logfile shell_suite.prompt_width.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:26 =result ok -=elapsed 1.87e-4 +=elapsed 1.65e-4 =case shell_SUITE:local_definitions_save_to_module_and_forget =logfile shell_suite.local_definitions_save_to_module_and_forget.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:28:15 +=started 2024-09-12 10:50:26 +=ended 2024-09-12 10:50:27 =result ok -=elapsed 0.020225 +=elapsed 0.019254 =case shell_SUITE:start_interactive =logfile shell_suite.start_interactive.html -=started 2024-09-11 11:28:15 -=ended 2024-09-11 11:29:00 +=started 2024-09-12 10:50:27 +=ended 2024-09-12 10:51:12 =result ok -=elapsed 44.920895 +=elapsed 44.947741 =case shell_SUITE:whereis =logfile shell_suite.whereis.html -=started 2024-09-11 11:29:00 -=ended 2024-09-11 11:29:13 +=started 2024-09-12 10:51:12 +=ended 2024-09-12 10:51:24 =result ok -=elapsed 12.958578 +=elapsed 12.960391 =case shell_SUITE:init_per_group =logfile shell_suite.init_per_group.html =group_props [{name,bits}] -=started 2024-09-11 11:29:13 -=ended 2024-09-11 11:29:13 +=started 2024-09-12 10:51:24 +=ended 2024-09-12 10:51:25 =result ok =elapsed 0.0 =case shell_SUITE:bs_match_misc_SUITE =logfile shell_suite.bs_match_misc_suite.html -=started 2024-09-11 11:29:13 -=ended 2024-09-11 11:29:13 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok -=elapsed 0.00851 +=elapsed 0.009729 =case shell_SUITE:bs_match_tail_SUITE =logfile shell_suite.bs_match_tail_suite.html -=started 2024-09-11 11:29:13 -=ended 2024-09-11 11:29:13 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok -=elapsed 0.003433 +=elapsed 0.003732 =case shell_SUITE:bs_match_bin_SUITE =logfile shell_suite.bs_match_bin_suite.html -=started 2024-09-11 11:29:13 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok -=elapsed 0.75374 +=elapsed 0.768598 =case shell_SUITE:bs_construct_SUITE =logfile shell_suite.bs_construct_suite.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok -=elapsed 0.011646 +=elapsed 0.010462 =case shell_SUITE:end_per_group =logfile shell_suite.end_per_group.html =group_props [{name,bits}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok =elapsed 0.0 -=group_time 0.915s +=group_time 0.930s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.19697474.html +=logfile shell_suite.init_per_group.19713890.html =group_props [{name,refman}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:25 =result ok =elapsed 0.0 =case shell_SUITE:refman_bit_syntax =logfile shell_suite.refman_bit_syntax.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:25 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.001488 +=elapsed 0.001826 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.19697506.html +=logfile shell_suite.end_per_group.19713922.html =group_props [{name,refman}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok =elapsed 0.0 -=group_time 0.052s +=group_time 0.053s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.19697538.html +=logfile shell_suite.init_per_group.19713954.html =group_props [{name,progex}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok =elapsed 0.0 =case shell_SUITE:progex_bit_syntax =logfile shell_suite.progex_bit_syntax.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.00267 +=elapsed 0.002982 =case shell_SUITE:progex_records =logfile shell_suite.progex_records.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.014656 +=elapsed 0.014759 =case shell_SUITE:progex_lc =logfile shell_suite.progex_lc.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.118826 +=elapsed 0.115571 =case shell_SUITE:progex_funs =logfile shell_suite.progex_funs.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.030988 +=elapsed 0.032533 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.19697570.html +=logfile shell_suite.end_per_group.19713986.html =group_props [{name,progex}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok =elapsed 0.0 -=group_time 0.297s +=group_time 0.302s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.19697602.html +=logfile shell_suite.init_per_group.19714018.html =group_props [{name,tickets}] -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok =elapsed 0.0 =case shell_SUITE:otp_5990 =logfile shell_suite.otp_5990.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.001237 +=elapsed 0.001249 =case shell_SUITE:otp_6166 =logfile shell_suite.otp_6166.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:14 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:26 =result ok -=elapsed 0.002776 +=elapsed 0.002649 =case shell_SUITE:otp_6554 =logfile shell_suite.otp_6554.html -=started 2024-09-11 11:29:14 -=ended 2024-09-11 11:29:16 +=started 2024-09-12 10:51:26 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 1.99496 +=elapsed 1.987647 =case shell_SUITE:otp_7184 =logfile shell_suite.otp_7184.html -=started 2024-09-11 11:29:16 -=ended 2024-09-11 11:29:16 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 0.005368 +=elapsed 0.005387 =case shell_SUITE:otp_7232 =logfile shell_suite.otp_7232.html -=started 2024-09-11 11:29:16 -=ended 2024-09-11 11:29:16 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 0.00187 +=elapsed 0.001884 =case shell_SUITE:otp_8393 =logfile shell_suite.otp_8393.html -=started 2024-09-11 11:29:16 -=ended 2024-09-11 11:29:16 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 0.016768 +=elapsed 0.016196 =case shell_SUITE:otp_10302 =logfile shell_suite.otp_10302.html -=started 2024-09-11 11:29:16 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 0.217507 +=elapsed 0.22171 =case shell_SUITE:otp_13719 =logfile shell_suite.otp_13719.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:28 =result ok -=elapsed 0.00316 +=elapsed 0.004403 =case shell_SUITE:otp_14285 =logfile shell_suite.otp_14285.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:28 +=ended 2024-09-12 10:51:29 =result ok -=elapsed 0.183851 +=elapsed 0.179868 =case shell_SUITE:otp_14296 =logfile shell_suite.otp_14296.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:29 =result ok -=elapsed 0.008866 +=elapsed 0.013611 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.503715.html +=logfile shell_suite.end_per_group.19714178.html =group_props [{name,tickets}] -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:29 =result ok =elapsed 0.0 -=group_time 2.738s +=group_time 2.737s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.503747.html +=logfile shell_suite.init_per_group.19714210.html =group_props [{name,restricted}] -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:29 =result ok =elapsed 0.0 =case shell_SUITE:start_restricted_from_shell =logfile shell_suite.start_restricted_from_shell.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:29 =result ok -=elapsed 0.100625 +=elapsed 0.099103 =case shell_SUITE:start_restricted_on_command_line =logfile shell_suite.start_restricted_on_command_line.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:17 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:29 =result ok -=elapsed 0.383985 +=elapsed 0.391114 =case shell_SUITE:restricted_local =logfile shell_suite.restricted_local.html -=started 2024-09-11 11:29:17 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:29 +=ended 2024-09-12 10:51:31 =result ok -=elapsed 1.509647 +=elapsed 1.483708 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.19697794.html +=logfile shell_suite.end_per_group.407971.html =group_props [{name,restricted}] -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok =elapsed 0.0 -=group_time 2.107s +=group_time 2.087s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.19697826.html +=logfile shell_suite.init_per_group.408003.html =group_props [{name,records}] -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok =elapsed 0.0 =case shell_SUITE:records =logfile shell_suite.records.html -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok -=elapsed 0.181726 +=elapsed 0.196752 =case shell_SUITE:typed_records =logfile shell_suite.typed_records.html -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok -=elapsed 0.015934 +=elapsed 0.01528 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.398500.html +=logfile shell_suite.end_per_group.408035.html =group_props [{name,records}] -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok =elapsed 0.0 -=group_time 0.288s +=group_time 0.304s =case shell_SUITE:init_per_group -=logfile shell_suite.init_per_group.19697858.html +=logfile shell_suite.init_per_group.408067.html =group_props [{name,definitions}] -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:19 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:31 =result ok =elapsed 0.0 =case shell_SUITE:types =logfile shell_suite.types.html -=started 2024-09-11 11:29:19 -=ended 2024-09-11 11:29:33 +=started 2024-09-12 10:51:31 +=ended 2024-09-12 10:51:45 =result ok -=elapsed 13.794362 +=elapsed 13.815723 =case shell_SUITE:end_per_group -=logfile shell_suite.end_per_group.19697986.html +=logfile shell_suite.end_per_group.425892.html =group_props [{name,definitions}] -=started 2024-09-11 11:29:33 -=ended 2024-09-11 11:29:33 +=started 2024-09-12 10:51:45 +=ended 2024-09-12 10:51:45 =result ok =elapsed 0.0 -=group_time 13.851s +=group_time 13.873s =case shell_SUITE:end_per_suite =logfile shell_suite.end_per_suite.html -=started 2024-09-11 11:29:33 -=ended 2024-09-11 11:29:33 +=started 2024-09-12 10:51:45 +=ended 2024-09-12 10:51:45 =result ok =elapsed 0.0 -=group_time 79.030s +=group_time 79.086s =case shell_docs_SUITE:init_per_suite =logfile shell_docs_suite.init_per_suite.html -=started 2024-09-11 11:29:33 -=ended 2024-09-11 11:29:33 +=started 2024-09-12 10:51:45 +=ended 2024-09-12 10:51:45 =result ok -=elapsed 0.102686 +=elapsed 0.102752 =case shell_docs_SUITE:render_smoke =logfile shell_docs_suite.render_smoke.html -=started 2024-09-11 11:29:33 -=ended 2024-09-11 11:30:50 +=started 2024-09-12 10:51:45 +=ended 2024-09-12 10:53:01 =result ok -=elapsed 76.153515 +=elapsed 76.019851 =case shell_docs_SUITE:render =logfile shell_docs_suite.render.html -=started 2024-09-11 11:30:50 -=ended 2024-09-11 11:30:54 +=started 2024-09-12 10:53:01 +=ended 2024-09-12 10:53:06 =result ok -=elapsed 4.803735 +=elapsed 4.891871 =case shell_docs_SUITE:render_non_native =logfile shell_docs_suite.render_non_native.html -=started 2024-09-11 11:30:54 -=ended 2024-09-11 11:30:54 +=started 2024-09-12 10:53:06 +=ended 2024-09-12 10:53:06 =result ok -=elapsed 8.0e-5 +=elapsed 6.1e-5 =case shell_docs_SUITE:links =logfile shell_docs_suite.links.html -=started 2024-09-11 11:30:54 -=ended 2024-09-11 11:30:55 +=started 2024-09-12 10:53:06 +=ended 2024-09-12 10:53:07 =result ok -=elapsed 0.922228 +=elapsed 0.914996 =case shell_docs_SUITE:normalize =logfile shell_docs_suite.normalize.html -=started 2024-09-11 11:30:55 -=ended 2024-09-11 11:30:55 +=started 2024-09-12 10:53:07 +=ended 2024-09-12 10:53:07 =result ok -=elapsed 1.01e-4 +=elapsed 9.6e-5 =case shell_docs_SUITE:init_per_group =logfile shell_docs_suite.init_per_group.html =group_props [{name,prop}] -=started 2024-09-11 11:30:55 -=ended 2024-09-11 11:30:57 +=started 2024-09-12 10:53:07 +=ended 2024-09-12 10:53:08 =result ok -=elapsed 1.284703 +=elapsed 1.316639 =case shell_docs_SUITE:render_prop =logfile shell_docs_suite.render_prop.html -=started 2024-09-11 11:30:57 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:08 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 11.579191 +=elapsed 11.355754 =case shell_docs_SUITE:end_per_group =logfile shell_docs_suite.end_per_group.html =group_props [{name,prop}] -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 -=group_time 12.909s +=group_time 12.719s =case shell_docs_SUITE:ansi =logfile shell_docs_suite.ansi.html -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 5.6e-4 +=elapsed 5.77e-4 =case shell_docs_SUITE:columns =logfile shell_docs_suite.columns.html -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 0.001367 +=elapsed 0.001344 =case shell_docs_SUITE:end_per_suite =logfile shell_docs_suite.end_per_suite.html -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 -=group_time 95.117s +=group_time 94.871s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19698050.html +=logfile ct_framework.init_per_suite.19714626.html =group_props [{suite,shell_docs_markdown_SUITE}] -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case shell_docs_markdown_SUITE:init_per_group =logfile shell_docs_markdown_suite.init_per_group.html =group_props [{name,different_format_generator},sequence] -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:convert_erlang_html =logfile shell_docs_markdown_suite.convert_erlang_html.html -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:08 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 2.1e-5 +=elapsed 1.6e-5 =case shell_docs_markdown_SUITE:convert_unknown_format =logfile shell_docs_markdown_suite.convert_unknown_format.html -=started 2024-09-11 11:31:08 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 2.0e-6 +=elapsed 1.0e-6 =case shell_docs_markdown_SUITE:end_per_group =logfile shell_docs_markdown_suite.end_per_group.html =group_props [{name,different_format_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =group_time 0.069s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698082.html +=logfile shell_docs_markdown_suite.init_per_group.19714658.html =group_props [{name,module_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:non_existing_moduledoc =logfile shell_docs_markdown_suite.non_existing_moduledoc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.4e-5 +=elapsed 1.0e-5 =case shell_docs_markdown_SUITE:hidden_moduledoc =logfile shell_docs_markdown_suite.hidden_moduledoc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.2e-5 +=elapsed 9.0e-6 =case shell_docs_markdown_SUITE:existing_moduledoc =logfile shell_docs_markdown_suite.existing_moduledoc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 7.0e-5 +=elapsed 5.5e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698114.html +=logfile shell_docs_markdown_suite.end_per_group.19714690.html =group_props [{name,module_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 -=group_time 0.092s +=group_time 0.089s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698146.html +=logfile shell_docs_markdown_suite.init_per_group.19714722.html =group_props [{name,doc_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:non_existing_doc =logfile shell_docs_markdown_suite.non_existing_doc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.4e-5 +=elapsed 1.0e-5 =case shell_docs_markdown_SUITE:hidden_doc =logfile shell_docs_markdown_suite.hidden_doc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 7.0e-6 +=elapsed 5.0e-6 =case shell_docs_markdown_SUITE:existing_doc =logfile shell_docs_markdown_suite.existing_doc.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 4.9e-5 +=elapsed 3.8e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698178.html +=logfile shell_docs_markdown_suite.end_per_group.19714754.html =group_props [{name,doc_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 -=group_time 0.091s +=group_time 0.088s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698210.html +=logfile shell_docs_markdown_suite.init_per_group.19714786.html =group_props [{name,header_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:h1_test =logfile shell_docs_markdown_suite.h1_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 4.8e-5 +=elapsed 3.6e-5 =case shell_docs_markdown_SUITE:h2_test =logfile shell_docs_markdown_suite.h2_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 7.1e-5 +=elapsed 5.1e-5 =case shell_docs_markdown_SUITE:h3_test =logfile shell_docs_markdown_suite.h3_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 6.7e-5 +=elapsed 4.9e-5 =case shell_docs_markdown_SUITE:h4_test =logfile shell_docs_markdown_suite.h4_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 6.8e-5 +=elapsed 5.0e-5 =case shell_docs_markdown_SUITE:h5_test =logfile shell_docs_markdown_suite.h5_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.04e-4 +=elapsed 7.0e-5 =case shell_docs_markdown_SUITE:h6_test =logfile shell_docs_markdown_suite.h6_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 1.31e-4 +=elapsed 8.7e-5 =case shell_docs_markdown_SUITE:setext_h1 =logfile shell_docs_markdown_suite.setext_h1.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok -=elapsed 5.5e-5 +=elapsed 5.3e-5 =case shell_docs_markdown_SUITE:setext_h2 =logfile shell_docs_markdown_suite.setext_h2.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 5.3e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698242.html +=logfile shell_docs_markdown_suite.end_per_group.19714818.html =group_props [{name,header_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 -=group_time 0.206s +=group_time 0.203s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698274.html +=logfile shell_docs_markdown_suite.init_per_group.19714850.html =group_props [{name,quote_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:single_line_quote_test =logfile shell_docs_markdown_suite.single_line_quote_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:20 =result ok =elapsed 6.0e-5 =case shell_docs_markdown_SUITE:double_char_for_quote_test =logfile shell_docs_markdown_suite.double_char_for_quote_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:20 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 6.8e-5 +=elapsed 9.9e-5 =case shell_docs_markdown_SUITE:ignore_three_spaces_before_quote =logfile shell_docs_markdown_suite.ignore_three_spaces_before_quote.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 3.5e-5 +=elapsed 3.8e-5 =case shell_docs_markdown_SUITE:multiple_line_quote_test =logfile shell_docs_markdown_suite.multiple_line_quote_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 5.3e-5 +=elapsed 5.7e-5 =case shell_docs_markdown_SUITE:paragraph_in_between_test =logfile shell_docs_markdown_suite.paragraph_in_between_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 1.19e-4 +=elapsed 1.18e-4 =case shell_docs_markdown_SUITE:quote_with_anchor_test =logfile shell_docs_markdown_suite.quote_with_anchor_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 1.01e-4 +=elapsed 1.35e-4 =case shell_docs_markdown_SUITE:quote_without_space =logfile shell_docs_markdown_suite.quote_without_space.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 1.23e-4 +=elapsed 1.01e-4 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698306.html +=logfile shell_docs_markdown_suite.end_per_group.19714882.html =group_props [{name,quote_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 -=group_time 0.181s +=group_time 0.179s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698338.html +=logfile shell_docs_markdown_suite.init_per_group.19714914.html =group_props [{name,paragraph_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:paragraph_after_heading_test =logfile shell_docs_markdown_suite.paragraph_after_heading_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 7.3e-5 +=elapsed 7.7e-5 =case shell_docs_markdown_SUITE:quote_before_and_after_paragraph_test =logfile shell_docs_markdown_suite.quote_before_and_after_paragraph_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 8.6e-5 +=elapsed 8.4e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698370.html +=logfile shell_docs_markdown_suite.end_per_group.19714946.html =group_props [{name,paragraph_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 -=group_time 0.068s +=group_time 0.069s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698402.html +=logfile shell_docs_markdown_suite.init_per_group.19714978.html =group_props [{name,code_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:single_line_code_test =logfile shell_docs_markdown_suite.single_line_code_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 4.2e-5 +=elapsed 4.3e-5 =case shell_docs_markdown_SUITE:multiple_line_code_test =logfile shell_docs_markdown_suite.multiple_line_code_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 3.4e-5 +=elapsed 3.6e-5 =case shell_docs_markdown_SUITE:paragraph_between_code_test =logfile shell_docs_markdown_suite.paragraph_between_code_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 8.2e-5 +=elapsed 8.3e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698434.html +=logfile shell_docs_markdown_suite.end_per_group.19715010.html =group_props [{name,code_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =group_time 0.091s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698466.html +=logfile shell_docs_markdown_suite.init_per_group.19715042.html =group_props [{name,fence_code_generator},sequence] -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:single_line_fence_code_test =logfile shell_docs_markdown_suite.single_line_fence_code_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 3.9e-5 +=elapsed 4.2e-5 =case shell_docs_markdown_SUITE:multiple_line_fence_code_test =logfile shell_docs_markdown_suite.multiple_line_fence_code_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 4.1e-5 +=elapsed 4.0e-5 =case shell_docs_markdown_SUITE:single_line_fence_code_no_language_test =logfile shell_docs_markdown_suite.single_line_fence_code_no_language_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:09 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 3.3e-5 =case shell_docs_markdown_SUITE:single_line_fence_code_no_language_spaces_test =logfile shell_docs_markdown_suite.single_line_fence_code_no_language_spaces_test.html -=started 2024-09-11 11:31:09 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 3.2e-5 =case shell_docs_markdown_SUITE:paragraph_between_fence_code_test =logfile shell_docs_markdown_suite.paragraph_between_fence_code_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 6.4e-5 =case shell_docs_markdown_SUITE:fence_code_ignores_link_format_test =logfile shell_docs_markdown_suite.fence_code_ignores_link_format_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 6.1e-5 +=elapsed 6.4e-5 =case shell_docs_markdown_SUITE:fence_code_with_spaces =logfile shell_docs_markdown_suite.fence_code_with_spaces.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 4.0e-5 =case shell_docs_markdown_SUITE:fence_code_with_tabs =logfile shell_docs_markdown_suite.fence_code_with_tabs.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 3.8e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698498.html +=logfile shell_docs_markdown_suite.end_per_group.19715074.html =group_props [{name,fence_code_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 -=group_time 0.204s +=group_time 0.200s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698530.html +=logfile shell_docs_markdown_suite.init_per_group.19715106.html =group_props [{name,br_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:start_with_br_test =logfile shell_docs_markdown_suite.start_with_br_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 4.6e-5 +=elapsed 5.1e-5 =case shell_docs_markdown_SUITE:multiple_br_followed_by_paragraph_test =logfile shell_docs_markdown_suite.multiple_br_followed_by_paragraph_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 6.4e-5 =case shell_docs_markdown_SUITE:multiple_lines_of_a_paragraph_test =logfile shell_docs_markdown_suite.multiple_lines_of_a_paragraph_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 9.1e-5 =case shell_docs_markdown_SUITE:ending_br_test =logfile shell_docs_markdown_suite.ending_br_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 3.4e-5 +=elapsed 3.6e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698562.html +=logfile shell_docs_markdown_suite.end_per_group.19715138.html =group_props [{name,br_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 -=group_time 0.110s +=group_time 0.111s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698594.html +=logfile shell_docs_markdown_suite.init_per_group.19715170.html =group_props [{name,comment_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:begin_comment_test =logfile shell_docs_markdown_suite.begin_comment_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 4.1e-5 +=elapsed 4.3e-5 =case shell_docs_markdown_SUITE:after_paragraph_comment =logfile shell_docs_markdown_suite.after_paragraph_comment.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 5.1e-5 +=elapsed 5.3e-5 =case shell_docs_markdown_SUITE:forget_closing_comment =logfile shell_docs_markdown_suite.forget_closing_comment.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 1.4e-5 +=elapsed 1.5e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698626.html +=logfile shell_docs_markdown_suite.end_per_group.19715202.html =group_props [{name,comment_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 -=group_time 0.088s +=group_time 0.089s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698658.html +=logfile shell_docs_markdown_suite.init_per_group.19715234.html =group_props [{name,format_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:format_heading_test =logfile shell_docs_markdown_suite.format_heading_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 6.2e-5 +=elapsed 6.5e-5 =case shell_docs_markdown_SUITE:format_paragraph_test =logfile shell_docs_markdown_suite.format_paragraph_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 5.3e-5 =case shell_docs_markdown_SUITE:format_multiple_inline =logfile shell_docs_markdown_suite.format_multiple_inline.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 4.3e-5 +=elapsed 5.8e-5 =case shell_docs_markdown_SUITE:format_multiple_inline_format_long =logfile shell_docs_markdown_suite.format_multiple_inline_format_long.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 3.9e-5 =case shell_docs_markdown_SUITE:format_multiple_inline_format_short =logfile shell_docs_markdown_suite.format_multiple_inline_format_short.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok -=elapsed 3.8e-5 +=elapsed 3.7e-5 =case shell_docs_markdown_SUITE:format_multiple_inline_format_mixed =logfile shell_docs_markdown_suite.format_multiple_inline_format_mixed.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 5.7e-5 =case shell_docs_markdown_SUITE:unmatched_format_simple =logfile shell_docs_markdown_suite.unmatched_format_simple.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:21 =result ok =elapsed 4.3e-5 =case shell_docs_markdown_SUITE:unmatched_format_with_inline =logfile shell_docs_markdown_suite.unmatched_format_with_inline.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:21 +=ended 2024-09-12 10:53:22 =result ok =elapsed 6.0e-5 =case shell_docs_markdown_SUITE:unmatched_complex_format_with_inline =logfile shell_docs_markdown_suite.unmatched_complex_format_with_inline.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 7.6e-5 +=elapsed 7.7e-5 =case shell_docs_markdown_SUITE:format_inline_link_with_inline =logfile shell_docs_markdown_suite.format_inline_link_with_inline.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.0e-5 +=elapsed 5.6e-5 =case shell_docs_markdown_SUITE:complex_inline_format =logfile shell_docs_markdown_suite.complex_inline_format.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.5e-5 +=elapsed 5.0e-5 =case shell_docs_markdown_SUITE:skip_symbols_in_inline =logfile shell_docs_markdown_suite.skip_symbols_in_inline.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.5e-5 +=elapsed 6.2e-5 =case shell_docs_markdown_SUITE:format_header_identifier =logfile shell_docs_markdown_suite.format_header_identifier.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.0e-5 +=elapsed 4.4e-5 =case shell_docs_markdown_SUITE:italic_in_middle_word_test =logfile shell_docs_markdown_suite.italic_in_middle_word_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.2e-5 +=elapsed 6.5e-5 =case shell_docs_markdown_SUITE:italic_with_colons =logfile shell_docs_markdown_suite.italic_with_colons.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.0e-5 +=elapsed 5.2e-5 =case shell_docs_markdown_SUITE:list_format_with_italics_in_sentence =logfile shell_docs_markdown_suite.list_format_with_italics_in_sentence.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 7.3e-5 +=elapsed 7.7e-5 =case shell_docs_markdown_SUITE:list_format_with_bold_in_sentence =logfile shell_docs_markdown_suite.list_format_with_bold_in_sentence.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 7.2e-5 +=elapsed 7.5e-5 =case shell_docs_markdown_SUITE:new_lines_test =logfile shell_docs_markdown_suite.new_lines_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.6e-5 +=elapsed 4.7e-5 =case shell_docs_markdown_SUITE:format_separator_test =logfile shell_docs_markdown_suite.format_separator_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 8.9e-5 +=elapsed 9.3e-5 =case shell_docs_markdown_SUITE:list_with_format =logfile shell_docs_markdown_suite.list_with_format.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 7.0e-5 +=elapsed 7.2e-5 =case shell_docs_markdown_SUITE:multi_word_format_test =logfile shell_docs_markdown_suite.multi_word_format_test.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.5e-5 +=elapsed 7.0e-5 =case shell_docs_markdown_SUITE:multiline_link =logfile shell_docs_markdown_suite.multiline_link.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.2e-5 +=elapsed 6.6e-5 =case shell_docs_markdown_SUITE:multiline_link_not_allowed =logfile shell_docs_markdown_suite.multiline_link_not_allowed.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.9e-5 +=elapsed 7.4e-5 =case shell_docs_markdown_SUITE:inline_mfa_link =logfile shell_docs_markdown_suite.inline_mfa_link.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.9e-5 +=elapsed 6.1e-5 =case shell_docs_markdown_SUITE:escaped_character =logfile shell_docs_markdown_suite.escaped_character.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 7.8e-5 +=elapsed 7.9e-5 =case shell_docs_markdown_SUITE:parens_with_italics =logfile shell_docs_markdown_suite.parens_with_italics.html -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.51e-4 +=elapsed 1.61e-4 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698690.html +=logfile shell_docs_markdown_suite.end_per_group.19715266.html =group_props [{name,format_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:10 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 0.0 -=group_time 0.605s +=group_time 0.600s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698722.html +=logfile shell_docs_markdown_suite.init_per_group.19715298.html =group_props [{name,bullet_list_generator},sequence] -=started 2024-09-11 11:31:10 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:singleton_bullet_list =logfile shell_docs_markdown_suite.singleton_bullet_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.0e-5 +=elapsed 4.2e-5 =case shell_docs_markdown_SUITE:singleton_bullet_list_followed_new_paragraph =logfile shell_docs_markdown_suite.singleton_bullet_list_followed_new_paragraph.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 6.6e-5 =case shell_docs_markdown_SUITE:singleton_bullet_list_with_format =logfile shell_docs_markdown_suite.singleton_bullet_list_with_format.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.9e-5 +=elapsed 5.1e-5 =case shell_docs_markdown_SUITE:singleton_bullet_list_followed_inner_paragraph =logfile shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.7e-5 +=elapsed 5.9e-5 =case shell_docs_markdown_SUITE:singleton_bullet_list_followed_inner_paragraph2 =logfile shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph2.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.7e-5 +=elapsed 5.8e-5 =case shell_docs_markdown_SUITE:singleton_bullet_list_followed_inner_paragraph3 =logfile shell_docs_markdown_suite.singleton_bullet_list_followed_inner_paragraph3.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.15e-4 +=elapsed 1.42e-4 =case shell_docs_markdown_SUITE:multiline_bullet_indented_list =logfile shell_docs_markdown_suite.multiline_bullet_indented_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.5e-5 +=elapsed 5.6e-5 =case shell_docs_markdown_SUITE:multiline_bullet_indented_list2 =logfile shell_docs_markdown_suite.multiline_bullet_indented_list2.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.4e-5 +=elapsed 6.9e-5 =case shell_docs_markdown_SUITE:multiline_bullet_list =logfile shell_docs_markdown_suite.multiline_bullet_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 9.2e-5 +=elapsed 5.6e-5 =case shell_docs_markdown_SUITE:even_nested_bullet_list =logfile shell_docs_markdown_suite.even_nested_bullet_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 9.3e-5 +=elapsed 9.2e-5 =case shell_docs_markdown_SUITE:odd_nested_bullet_list =logfile shell_docs_markdown_suite.odd_nested_bullet_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.04e-4 +=elapsed 1.11e-4 =case shell_docs_markdown_SUITE:complex_nested_bullet_list =logfile shell_docs_markdown_suite.complex_nested_bullet_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 8.4e-5 +=elapsed 8.9e-5 =case shell_docs_markdown_SUITE:complex_nested_bullet_list2 =logfile shell_docs_markdown_suite.complex_nested_bullet_list2.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.61e-4 +=elapsed 1.6e-4 =case shell_docs_markdown_SUITE:complex_nested_bullet_list3 =logfile shell_docs_markdown_suite.complex_nested_bullet_list3.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.73e-4 +=elapsed 1.72e-4 =case shell_docs_markdown_SUITE:bullet_list_mix_with_number_list =logfile shell_docs_markdown_suite.bullet_list_mix_with_number_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.3e-5 +=elapsed 6.5e-5 =case shell_docs_markdown_SUITE:inline_code_list =logfile shell_docs_markdown_suite.inline_code_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.7e-5 +=elapsed 6.1e-5 =case shell_docs_markdown_SUITE:bullet_list_with_anchor =logfile shell_docs_markdown_suite.bullet_list_with_anchor.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 1.7e-4 +=elapsed 1.73e-4 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698754.html +=logfile shell_docs_markdown_suite.end_per_group.19715330.html =group_props [{name,bullet_list_generator},sequence] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 0.0 -=group_time 0.403s +=group_time 0.404s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698786.html +=logfile shell_docs_markdown_suite.init_per_group.19715362.html =group_props [{name,numbered_list_generator},sequence] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:singleton_numbered_list =logfile shell_docs_markdown_suite.singleton_numbered_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok =elapsed 4.5e-5 =case shell_docs_markdown_SUITE:singleton_numbered_list_followed_new_paragraph =logfile shell_docs_markdown_suite.singleton_numbered_list_followed_new_paragraph.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.6e-5 +=elapsed 6.9e-5 =case shell_docs_markdown_SUITE:singleton_numbered_list_with_format =logfile shell_docs_markdown_suite.singleton_numbered_list_with_format.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 4.9e-5 +=elapsed 5.4e-5 =case shell_docs_markdown_SUITE:singleton_numbered_list_followed_inner_paragraph =logfile shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 5.7e-5 +=elapsed 6.6e-5 =case shell_docs_markdown_SUITE:singleton_numbered_list_followed_inner_paragraph2 =logfile shell_docs_markdown_suite.singleton_numbered_list_followed_inner_paragraph2.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:22 =result ok -=elapsed 6.0e-5 +=elapsed 5.9e-5 =case shell_docs_markdown_SUITE:multiline_numbered_indented_list =logfile shell_docs_markdown_suite.multiline_numbered_indented_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:22 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 6.4e-5 +=elapsed 6.3e-5 =case shell_docs_markdown_SUITE:multiline_numbered_indented_list2 =logfile shell_docs_markdown_suite.multiline_numbered_indented_list2.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 6.4e-5 +=elapsed 6.8e-5 =case shell_docs_markdown_SUITE:multiline_numbered_list =logfile shell_docs_markdown_suite.multiline_numbered_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 5.8e-5 +=elapsed 6.1e-5 =case shell_docs_markdown_SUITE:even_nested_numbered_list =logfile shell_docs_markdown_suite.even_nested_numbered_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 9.2e-5 +=elapsed 9.0e-5 =case shell_docs_markdown_SUITE:odd_nested_numbered_list =logfile shell_docs_markdown_suite.odd_nested_numbered_list.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 1.04e-4 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698818.html +=logfile shell_docs_markdown_suite.end_per_group.19715394.html =group_props [{name,numbered_list_generator},sequence] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 -=group_time 0.244s +=group_time 0.250s =case shell_docs_markdown_SUITE:init_per_group -=logfile shell_docs_markdown_suite.init_per_group.19698850.html +=logfile shell_docs_markdown_suite.init_per_group.19715426.html =group_props [{name,table_generator},sequence] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 =case shell_docs_markdown_SUITE:table_with_rows =logfile shell_docs_markdown_suite.table_with_rows.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 5.3e-5 +=elapsed 5.7e-5 =case shell_docs_markdown_SUITE:table_with_escaped_bars =logfile shell_docs_markdown_suite.table_with_escaped_bars.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 6.3e-5 +=elapsed 9.2e-5 =case shell_docs_markdown_SUITE:fake_table_test =logfile shell_docs_markdown_suite.fake_table_test.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 4.8e-5 +=elapsed 4.7e-5 =case shell_docs_markdown_SUITE:end_per_group -=logfile shell_docs_markdown_suite.end_per_group.19698882.html +=logfile shell_docs_markdown_suite.end_per_group.19715458.html =group_props [{name,table_generator},sequence] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 -=group_time 0.090s +=group_time 0.088s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19698914.html +=logfile ct_framework.end_per_suite.19715490.html =group_props [{suite,shell_docs_markdown_SUITE}] -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 -=group_time 2.899s +=group_time 2.881s =case sigils_SUITE:init_per_suite =logfile sigils_suite.init_per_suite.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 =case sigils_SUITE:compiled_sigils =logfile sigils_suite.compiled_sigils.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 =case sigils_SUITE:scan_sigils =logfile sigils_suite.scan_sigils.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 3.7e-5 +=elapsed 3.6e-5 =case sigils_SUITE:parse_sigils =logfile sigils_suite.parse_sigils.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 6.4e-5 =case sigils_SUITE:end_per_suite =logfile sigils_suite.end_per_suite.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok =elapsed 0.0 -=group_time 0.097s +=group_time 0.099s =case slave_SUITE:init_per_suite =logfile slave_suite.init_per_suite.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:11 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:23 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case slave_SUITE:t_start_link =logfile slave_suite.t_start_link.html -=started 2024-09-11 11:31:11 -=ended 2024-09-11 11:31:13 +=started 2024-09-12 10:53:23 +=ended 2024-09-12 10:53:24 =result ok -=elapsed 1.094906 +=elapsed 1.119486 =case slave_SUITE:start_link_nodedown =logfile slave_suite.start_link_nodedown.html -=started 2024-09-11 11:31:13 -=ended 2024-09-11 11:31:13 +=started 2024-09-12 10:53:24 +=ended 2024-09-12 10:53:25 =result ok -=elapsed 0.512397 +=elapsed 0.520225 =case slave_SUITE:t_start =logfile slave_suite.t_start.html -=started 2024-09-11 11:31:13 -=ended 2024-09-11 11:31:15 +=started 2024-09-12 10:53:25 +=ended 2024-09-12 10:53:26 =result ok -=elapsed 1.606033 +=elapsed 1.622499 =case slave_SUITE:errors =logfile slave_suite.errors.html -=started 2024-09-11 11:31:15 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:26 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 32.180687 +=elapsed 32.478577 =case slave_SUITE:end_per_suite =logfile slave_suite.end_per_suite.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 0.0 -=group_time 35.531s +=group_time 35.879s =case sofs_SUITE:init_per_suite =logfile sofs_suite.init_per_suite.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case sofs_SUITE:init_per_group =logfile sofs_suite.init_per_group.html =group_props [{name,sofs}] -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 0.0 =case sofs_SUITE:from_term_1 =logfile sofs_suite.from_term_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 6.3e-5 +=elapsed 4.7e-5 =case sofs_SUITE:set_1 =logfile sofs_suite.set_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 3.5e-5 +=elapsed 2.6e-5 =case sofs_SUITE:from_sets_1 =logfile sofs_suite.from_sets_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 2.6e-5 +=elapsed 2.1e-5 =case sofs_SUITE:relation_1 =logfile sofs_suite.relation_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 3.2e-5 +=elapsed 2.7e-5 =case sofs_SUITE:a_function_1 =logfile sofs_suite.a_function_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 3.5e-5 +=elapsed 2.9e-5 =case sofs_SUITE:family_1 =logfile sofs_suite.family_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 6.9e-5 +=elapsed 3.5e-5 =case sofs_SUITE:relation_to_family_1 =logfile sofs_suite.relation_to_family_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 7.0e-6 +=elapsed 5.0e-6 =case sofs_SUITE:domain_1 =logfile sofs_suite.domain_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 9.0e-6 +=elapsed 7.0e-6 =case sofs_SUITE:range_1 =logfile sofs_suite.range_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 6.0e-6 =case sofs_SUITE:image =logfile sofs_suite.image.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 1.2e-5 =case sofs_SUITE:inverse_image =logfile sofs_suite.inverse_image.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 1.2e-5 =case sofs_SUITE:inverse_1 =logfile sofs_suite.inverse_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 7.0e-6 +=elapsed 6.0e-6 =case sofs_SUITE:converse_1 =logfile sofs_suite.converse_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case sofs_SUITE:no_elements_1 =logfile sofs_suite.no_elements_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case sofs_SUITE:substitution =logfile sofs_suite.substitution.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 5.3e-5 +=elapsed 5.4e-5 =case sofs_SUITE:restriction =logfile sofs_suite.restriction.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 5.7e-5 +=elapsed 5.8e-5 =case sofs_SUITE:drestriction =logfile sofs_suite.drestriction.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 5.3e-5 +=elapsed 5.5e-5 =case sofs_SUITE:projection =logfile sofs_suite.projection.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 5.9e-5 +=elapsed 5.7e-5 =case sofs_SUITE:strict_relation_1 =logfile sofs_suite.strict_relation_1.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:47 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 4.0e-6 =case sofs_SUITE:extension =logfile sofs_suite.extension.html -=started 2024-09-11 11:31:47 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok =elapsed 1.8e-5 =case sofs_SUITE:weak_relation_1 =logfile sofs_suite.weak_relation_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.3e-5 +=elapsed 1.6e-5 =case sofs_SUITE:to_sets_1 =logfile sofs_suite.to_sets_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 8.0e-6 +=elapsed 1.0e-5 =case sofs_SUITE:specification =logfile sofs_suite.specification.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.1e-5 +=elapsed 1.4e-5 =case sofs_SUITE:union_1 =logfile sofs_suite.union_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.7e-5 +=elapsed 2.1e-5 =case sofs_SUITE:intersection_1 =logfile sofs_suite.intersection_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.0e-5 +=elapsed 1.3e-5 =case sofs_SUITE:difference =logfile sofs_suite.difference.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 7.0e-6 +=elapsed 9.0e-6 =case sofs_SUITE:symdiff =logfile sofs_suite.symdiff.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 1.1e-5 +=elapsed 1.3e-5 =case sofs_SUITE:symmetric_partition =logfile sofs_suite.symmetric_partition.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:53:59 =result ok -=elapsed 8.0e-6 +=elapsed 1.0e-5 =case sofs_SUITE:is_sofs_set_1 =logfile sofs_suite.is_sofs_set_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:53:59 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case sofs_SUITE:is_set_1 =logfile sofs_suite.is_set_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 5.0e-6 =case sofs_SUITE:is_equal =logfile sofs_suite.is_equal.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.4e-5 +=elapsed 1.8e-5 =case sofs_SUITE:is_subset =logfile sofs_suite.is_subset.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 6.0e-6 +=elapsed 8.0e-6 =case sofs_SUITE:is_a_function_1 =logfile sofs_suite.is_a_function_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 5.0e-6 =case sofs_SUITE:is_disjoint =logfile sofs_suite.is_disjoint.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 4.0e-6 +=elapsed 5.0e-6 =case sofs_SUITE:join =logfile sofs_suite.join.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.6e-5 +=elapsed 3.5e-5 =case sofs_SUITE:canonical =logfile sofs_suite.canonical.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 6.0e-6 +=elapsed 7.0e-6 =case sofs_SUITE:composite_1 =logfile sofs_suite.composite_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.5e-5 +=elapsed 3.2e-5 =case sofs_SUITE:relative_product_1 =logfile sofs_suite.relative_product_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.2e-5 +=elapsed 1.5e-5 =case sofs_SUITE:relative_product_2 =logfile sofs_suite.relative_product_2.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 4.4e-5 +=elapsed 5.5e-5 =case sofs_SUITE:product_1 =logfile sofs_suite.product_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.3e-5 +=elapsed 1.6e-5 =case sofs_SUITE:partition_1 =logfile sofs_suite.partition_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 3.5e-5 +=elapsed 4.9e-5 =case sofs_SUITE:partition_3 =logfile sofs_suite.partition_3.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 7.9e-5 +=elapsed 1.02e-4 =case sofs_SUITE:multiple_relative_product =logfile sofs_suite.multiple_relative_product.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.6e-5 +=elapsed 3.1e-5 =case sofs_SUITE:digraph =logfile sofs_suite.digraph.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 8.37e-4 +=elapsed 2.29e-4 =case sofs_SUITE:constant_function =logfile sofs_suite.constant_function.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 6.0e-6 +=elapsed 1.1e-5 =case sofs_SUITE:misc =logfile sofs_suite.misc.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 5.76e-4 +=elapsed 7.15e-4 =case sofs_SUITE:end_per_group =logfile sofs_suite.end_per_group.html =group_props [{name,sofs}] -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 -=group_time 1.083s +=group_time 1.086s =case sofs_SUITE:init_per_group -=logfile sofs_suite.init_per_group.19699330.html +=logfile sofs_suite.init_per_group.19715874.html =group_props [{name,sofs_family}] -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 =case sofs_SUITE:family_specification =logfile sofs_suite.family_specification.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.0e-5 +=elapsed 1.9e-5 =case sofs_SUITE:family_domain_1 =logfile sofs_suite.family_domain_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.1e-5 +=elapsed 3.0e-5 =case sofs_SUITE:family_range_1 =logfile sofs_suite.family_range_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.8e-5 +=elapsed 2.4e-5 =case sofs_SUITE:family_to_relation_1 =logfile sofs_suite.family_to_relation_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 5.0e-6 +=elapsed 7.0e-6 =case sofs_SUITE:union_of_family_1 =logfile sofs_suite.union_of_family_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 9.0e-6 +=elapsed 1.3e-5 =case sofs_SUITE:intersection_of_family_1 =logfile sofs_suite.intersection_of_family_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 8.0e-6 +=elapsed 1.0e-5 =case sofs_SUITE:family_projection =logfile sofs_suite.family_projection.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 3.6e-5 +=elapsed 5.3e-5 =case sofs_SUITE:family_difference =logfile sofs_suite.family_difference.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.3e-5 +=elapsed 3.0e-5 =case sofs_SUITE:family_intersection_1 =logfile sofs_suite.family_intersection_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.2e-5 +=elapsed 1.5e-5 =case sofs_SUITE:family_intersection_2 =logfile sofs_suite.family_intersection_2.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 2.3e-5 +=elapsed 2.9e-5 =case sofs_SUITE:family_union_1 =logfile sofs_suite.family_union_1.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 8.0e-6 +=elapsed 1.6e-5 =case sofs_SUITE:family_union_2 =logfile sofs_suite.family_union_2.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.3e-5 +=elapsed 1.9e-5 =case sofs_SUITE:partition_family =logfile sofs_suite.partition_family.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 5.5e-5 +=elapsed 7.5e-5 =case sofs_SUITE:end_per_group -=logfile sofs_suite.end_per_group.19699362.html +=logfile sofs_suite.end_per_group.19715906.html =group_props [{name,sofs_family}] -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 -=group_time 0.309s +=group_time 0.321s =case sofs_SUITE:end_per_suite =logfile sofs_suite.end_per_suite.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:48 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 -=group_time 1.476s +=group_time 1.495s =case stdlib_SUITE:init_per_suite =logfile stdlib_suite.init_per_suite.html -=started 2024-09-11 11:31:48 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 =case stdlib_SUITE:app_test =logfile stdlib_suite.app_test.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 0.001519 +=elapsed 0.001781 =case stdlib_SUITE:appup_test =logfile stdlib_suite.appup_test.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result skipped: "This is a development version, test might fail because of incorrect version numbers" === *** SKIPPED test case 1925 *** =case stdlib_SUITE:assert_test =logfile stdlib_suite.assert_test.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok -=elapsed 1.9e-5 +=elapsed 2.7e-5 =case stdlib_SUITE:end_per_suite =logfile stdlib_suite.end_per_suite.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 -=group_time 0.109s +=group_time 0.112s =case stdlib_bench_SUITE:init_per_suite =logfile stdlib_bench_suite.init_per_suite.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 +=ended 2024-09-12 10:54:00 =result ok =elapsed 0.0 === =case stdlib_bench_SUITE:init_per_group =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,init_per_group} *** === =case stdlib_bench_SUITE:norm_nfc_list =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1927 {stdlib_bench_SUITE,norm_nfc_list} *** === =case stdlib_bench_SUITE:norm_nfc_deep_l =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1928 {stdlib_bench_SUITE,norm_nfc_deep_l} *** === =case stdlib_bench_SUITE:norm_nfc_binary =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1929 {stdlib_bench_SUITE,norm_nfc_binary} *** === =case stdlib_bench_SUITE:string_lexemes_list =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1930 {stdlib_bench_SUITE,string_lexemes_list} *** === =case stdlib_bench_SUITE:string_lexemes_binary =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1931 {stdlib_bench_SUITE,string_lexemes_binary} *** === =case stdlib_bench_SUITE:end_per_group =group_props [{name,"unicode"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,end_per_group} *** === =case stdlib_bench_SUITE:init_per_group =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,init_per_group} *** === =case stdlib_bench_SUITE:decode_binary =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:00 =result skipped: Benchmark only === *** Skipping test case #1932 {stdlib_bench_SUITE,decode_binary} *** === =case stdlib_bench_SUITE:decode_binary_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1933 {stdlib_bench_SUITE,decode_binary_to_string} *** === =case stdlib_bench_SUITE:decode_list =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1934 {stdlib_bench_SUITE,decode_list} *** === =case stdlib_bench_SUITE:decode_list_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1935 {stdlib_bench_SUITE,decode_list_to_string} *** === =case stdlib_bench_SUITE:encode_binary =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1936 {stdlib_bench_SUITE,encode_binary} *** === =case stdlib_bench_SUITE:encode_binary_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1937 {stdlib_bench_SUITE,encode_binary_to_string} *** === =case stdlib_bench_SUITE:encode_list =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1938 {stdlib_bench_SUITE,encode_list} *** === =case stdlib_bench_SUITE:encode_list_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1939 {stdlib_bench_SUITE,encode_list_to_string} *** === =case stdlib_bench_SUITE:mime_binary_decode =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1940 {stdlib_bench_SUITE,mime_binary_decode} *** === =case stdlib_bench_SUITE:mime_binary_decode_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1941 {stdlib_bench_SUITE,mime_binary_decode_to_string} *** === =case stdlib_bench_SUITE:mime_list_decode =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1942 {stdlib_bench_SUITE,mime_list_decode} *** === =case stdlib_bench_SUITE:mime_list_decode_to_string =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1943 {stdlib_bench_SUITE,mime_list_decode_to_string} *** === =case stdlib_bench_SUITE:end_per_group =group_props [{name,"base64"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,end_per_group} *** === =case stdlib_bench_SUITE:init_per_group =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,init_per_group} *** === =case stdlib_bench_SUITE:match_single_pattern_no_match =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1944 {stdlib_bench_SUITE,match_single_pattern_no_match} *** === =case stdlib_bench_SUITE:matches_single_pattern_no_match =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1945 {stdlib_bench_SUITE,matches_single_pattern_no_match} *** === =case stdlib_bench_SUITE:matches_single_pattern_eventual_match =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1946 {stdlib_bench_SUITE,matches_single_pattern_eventual_match} *** === =case stdlib_bench_SUITE:matches_single_pattern_frequent_match =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1947 {stdlib_bench_SUITE,matches_single_pattern_frequent_match} *** === =case stdlib_bench_SUITE:end_per_group =group_props [{name,"binary"}] -=started 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,end_per_group} *** =case stdlib_bench_SUITE:init_per_group =logfile stdlib_bench_suite.init_per_group.html =group_props [{name,io},{repeat,5}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case stdlib_bench_SUITE:double_random_to_list =logfile stdlib_bench_suite.double_random_to_list.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 7803355 -=elapsed 0.041173 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 7279610 +=elapsed 0.041719 =case stdlib_bench_SUITE:double_random_to_list_array =logfile stdlib_bench_suite.double_random_to_list_array.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 6641870 -=elapsed 0.040255 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 6803184 +=elapsed 0.038627 =case stdlib_bench_SUITE:end_per_group =logfile stdlib_bench_suite.end_per_group.html =group_props [{name,io},{repeat,5}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =group_time 0.150s =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.19699394.html +=logfile stdlib_bench_suite.init_per_group.19715938.html =group_props [{repeat,4},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 =case stdlib_bench_SUITE:double_random_to_list -=logfile stdlib_bench_suite.double_random_to_list.19699426.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 9134088 -=elapsed 0.033068 +=logfile stdlib_bench_suite.double_random_to_list.19715970.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 7820443 +=elapsed 0.035209 =case stdlib_bench_SUITE:double_random_to_list_array -=logfile stdlib_bench_suite.double_random_to_list_array.19699458.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 6382028 -=elapsed 0.04262 +=logfile stdlib_bench_suite.double_random_to_list_array.19716002.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 6273526 +=elapsed 0.043084 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.19699490.html +=logfile stdlib_bench_suite.end_per_group.19716034.html =group_props [{repeat,4},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 -=group_time 0.144s +=group_time 0.147s =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.19699522.html +=logfile stdlib_bench_suite.init_per_group.19716066.html =group_props [{repeat,3},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 =case stdlib_bench_SUITE:double_random_to_list -=logfile stdlib_bench_suite.double_random_to_list.19699554.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 9508415 -=elapsed 0.033047 +=logfile stdlib_bench_suite.double_random_to_list.19716098.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 8820676 +=elapsed 0.033821 =case stdlib_bench_SUITE:double_random_to_list_array -=logfile stdlib_bench_suite.double_random_to_list_array.19699586.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 6242977 -=elapsed 0.043026 +=logfile stdlib_bench_suite.double_random_to_list_array.19716130.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 6028818 +=elapsed 0.043152 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.19699618.html +=logfile stdlib_bench_suite.end_per_group.19716162.html =group_props [{repeat,3},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 -=group_time 0.144s +=group_time 0.146s =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.19699650.html +=logfile stdlib_bench_suite.init_per_group.19716194.html =group_props [{repeat,2},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 =case stdlib_bench_SUITE:double_random_to_list -=logfile stdlib_bench_suite.double_random_to_list.19699682.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 8968610 -=elapsed 0.03334 +=logfile stdlib_bench_suite.double_random_to_list.19716226.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 8950148 +=elapsed 0.033312 =case stdlib_bench_SUITE:double_random_to_list_array -=logfile stdlib_bench_suite.double_random_to_list_array.19699714.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 6394680 -=elapsed 0.043227 +=logfile stdlib_bench_suite.double_random_to_list_array.19716258.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 6073489 +=elapsed 0.043964 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.19699746.html +=logfile stdlib_bench_suite.end_per_group.19716290.html =group_props [{repeat,2},{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok -=elapsed 0.0 -=group_time 0.145s +=elapsed 1.0e-6 +=group_time 0.146s =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.19699778.html +=logfile stdlib_bench_suite.init_per_group.19716322.html =group_props [{name,io}] -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok =elapsed 0.0 =case stdlib_bench_SUITE:double_random_to_list -=logfile stdlib_bench_suite.double_random_to_list.19699810.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:49 -=result ok: 8208159 -=elapsed 0.035807 +=logfile stdlib_bench_suite.double_random_to_list.19716354.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 8274721 +=elapsed 0.037712 =case stdlib_bench_SUITE:double_random_to_list_array -=logfile stdlib_bench_suite.double_random_to_list_array.19699842.html -=started 2024-09-11 11:31:49 -=ended 2024-09-11 11:31:50 -=result ok: 6660450 -=elapsed 0.041082 +=logfile stdlib_bench_suite.double_random_to_list_array.19716386.html +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 +=result ok: 6355663 +=elapsed 0.042745 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.19699874.html +=logfile stdlib_bench_suite.end_per_group.19716418.html =group_props [{name,io}] -=started 2024-09-11 11:31:50 -=ended 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:01 =result ok -=elapsed 1.0e-6 -=group_time 0.145s +=elapsed 0.0 +=group_time 0.150s === =case stdlib_bench_SUITE:init_per_group =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,init_per_group} *** === =case stdlib_bench_SUITE:simple =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1958 {stdlib_bench_SUITE,simple} *** === =case stdlib_bench_SUITE:simple_timer =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1959 {stdlib_bench_SUITE,simple_timer} *** === =case stdlib_bench_SUITE:simple_mon =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1960 {stdlib_bench_SUITE,simple_mon} *** === =case stdlib_bench_SUITE:simple_timer_mon =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1961 {stdlib_bench_SUITE,simple_timer_mon} *** === =case stdlib_bench_SUITE:generic =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1962 {stdlib_bench_SUITE,generic} *** === =case stdlib_bench_SUITE:generic_timer =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1963 {stdlib_bench_SUITE,generic_timer} *** === =case stdlib_bench_SUITE:end_per_group =group_props [{name,"gen_server"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,end_per_group} *** === =case stdlib_bench_SUITE:init_per_group =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,init_per_group} *** === =case stdlib_bench_SUITE:generic =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1964 {stdlib_bench_SUITE,generic} *** === =case stdlib_bench_SUITE:generic_log =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1965 {stdlib_bench_SUITE,generic_log} *** === =case stdlib_bench_SUITE:generic_log100 =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1966 {stdlib_bench_SUITE,generic_log100} *** === =case stdlib_bench_SUITE:generic_fsm =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1967 {stdlib_bench_SUITE,generic_fsm} *** === =case stdlib_bench_SUITE:generic_fsm_transit =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1968 {stdlib_bench_SUITE,generic_fsm_transit} *** === =case stdlib_bench_SUITE:generic_statem =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1969 {stdlib_bench_SUITE,generic_statem} *** === =case stdlib_bench_SUITE:generic_statem_log =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1970 {stdlib_bench_SUITE,generic_statem_log} *** === =case stdlib_bench_SUITE:generic_statem_log100 =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1971 {stdlib_bench_SUITE,generic_statem_log100} *** === =case stdlib_bench_SUITE:generic_statem_transit =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1972 {stdlib_bench_SUITE,generic_statem_transit} *** === =case stdlib_bench_SUITE:generic_statem_complex =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping test case #1973 {stdlib_bench_SUITE,generic_statem_complex} *** === =case stdlib_bench_SUITE:end_per_group =group_props [{name,"gen_statem"}] -=started 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 =result skipped: Benchmark only === *** Skipping {stdlib_bench_SUITE,end_per_group} *** =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.19699906.html +=logfile stdlib_bench_suite.init_per_group.19716450.html =group_props [{name,gen_server_comparison}] -=started 2024-09-11 11:31:50 -=ended 2024-09-11 11:31:50 +=started 2024-09-12 10:54:01 +=ended 2024-09-12 10:54:02 =result ok -=elapsed 0.037858 +=elapsed 0.038917 =case stdlib_bench_SUITE:single_small =logfile stdlib_bench_suite.single_small.html -=started 2024-09-11 11:31:50 -=ended 2024-09-11 11:31:56 -=result ok: #parallel gen_server instances: 1, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.37 simple_mon: 1.68 simple_timer_mon: 2.09 generic: 1.89 generic_timer: 2.47 -=elapsed 6.028182 +=started 2024-09-12 10:54:02 +=ended 2024-09-12 10:54:08 +=result ok: #parallel gen_server instances: 1, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.34 simple_mon: 1.71 simple_timer_mon: 2.08 generic: 1.94 generic_timer: 2.53 +=elapsed 6.036802 =case stdlib_bench_SUITE:single_medium =logfile stdlib_bench_suite.single_medium.html -=started 2024-09-11 11:31:56 -=ended 2024-09-11 11:32:02 -=result ok: #parallel gen_server instances: 1, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.13 simple_mon: 1.45 simple_timer_mon: 1.60 generic: 1.17 generic_timer: 1.53 -=elapsed 6.005332 +=started 2024-09-12 10:54:08 +=ended 2024-09-12 10:54:14 +=result ok: #parallel gen_server instances: 1, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.11 simple_mon: 1.41 simple_timer_mon: 1.57 generic: 1.18 generic_timer: 1.50 +=elapsed 6.006128 =case stdlib_bench_SUITE:single_big =logfile stdlib_bench_suite.single_big.html -=started 2024-09-11 11:32:02 -=ended 2024-09-11 11:32:08 -=result ok: #parallel gen_server instances: 1, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.00 simple_mon: 1.09 simple_timer_mon: 1.11 generic: 0.97 generic_timer: 1.02 -=elapsed 6.005935 +=started 2024-09-12 10:54:14 +=ended 2024-09-12 10:54:20 +=result ok: #parallel gen_server instances: 1, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.03 simple_mon: 1.11 simple_timer_mon: 1.14 generic: 1.00 generic_timer: 1.01 +=elapsed 6.006064 =case stdlib_bench_SUITE:sched_small =logfile stdlib_bench_suite.sched_small.html -=started 2024-09-11 11:32:08 -=ended 2024-09-11 11:32:14 -=result ok: #parallel gen_server instances: 4, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.66 simple_mon: 2.00 simple_timer_mon: 2.06 generic: 1.55 generic_timer: 2.20 -=elapsed 6.006134 +=started 2024-09-12 10:54:20 +=ended 2024-09-12 10:54:26 +=result ok: #parallel gen_server instances: 4, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.27 simple_mon: 1.55 simple_timer_mon: 1.74 generic: 1.29 generic_timer: 1.72 +=elapsed 6.005998 =case stdlib_bench_SUITE:sched_medium =logfile stdlib_bench_suite.sched_medium.html -=started 2024-09-11 11:32:14 -=ended 2024-09-11 11:32:20 -=result ok: #parallel gen_server instances: 4, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.07 simple_mon: 1.33 simple_timer_mon: 1.59 generic: 1.37 generic_timer: 1.49 -=elapsed 6.005551 +=started 2024-09-12 10:54:26 +=ended 2024-09-12 10:54:32 +=result ok: #parallel gen_server instances: 4, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.05 simple_mon: 1.28 simple_timer_mon: 1.47 generic: 1.29 generic_timer: 1.45 +=elapsed 6.005909 =case stdlib_bench_SUITE:sched_big =logfile stdlib_bench_suite.sched_big.html -=started 2024-09-11 11:32:20 -=ended 2024-09-11 11:32:26 -=result ok: #parallel gen_server instances: 4, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.09 simple_mon: 0.98 simple_timer_mon: 1.00 generic: 0.94 generic_timer: 1.00 -=elapsed 6.00561 +=started 2024-09-12 10:54:32 +=ended 2024-09-12 10:54:38 +=result ok: #parallel gen_server instances: 4, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.13 simple_mon: 1.05 simple_timer_mon: 1.10 generic: 0.95 generic_timer: 0.99 +=elapsed 6.005938 =case stdlib_bench_SUITE:multi_small =logfile stdlib_bench_suite.multi_small.html -=started 2024-09-11 11:32:26 -=ended 2024-09-11 11:32:32 -=result ok: #parallel gen_server instances: 400, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.08 simple_mon: 1.39 simple_timer_mon: 1.45 generic: 1.49 generic_timer: 1.81 -=elapsed 6.070889 +=started 2024-09-12 10:54:38 +=ended 2024-09-12 10:54:44 +=result ok: #parallel gen_server instances: 400, message flat size: 0 bytes: simple: 1.00 simple_timer: 1.06 simple_mon: 1.34 simple_timer_mon: 1.40 generic: 1.48 generic_timer: 1.75 +=elapsed 6.074452 =case stdlib_bench_SUITE:multi_medium =logfile stdlib_bench_suite.multi_medium.html -=started 2024-09-11 11:32:32 -=ended 2024-09-11 11:32:38 -=result ok: #parallel gen_server instances: 400, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.09 simple_mon: 1.26 simple_timer_mon: 1.32 generic: 1.28 generic_timer: 1.43 -=elapsed 6.058794 +=started 2024-09-12 10:54:44 +=ended 2024-09-12 10:54:50 +=result ok: #parallel gen_server instances: 400, message flat size: 800 bytes: simple: 1.00 simple_timer: 1.09 simple_mon: 1.25 simple_timer_mon: 1.29 generic: 1.26 generic_timer: 1.47 +=elapsed 6.057093 =case stdlib_bench_SUITE:multi_big =logfile stdlib_bench_suite.multi_big.html -=started 2024-09-11 11:32:38 -=ended 2024-09-11 11:32:44 -=result ok: #parallel gen_server instances: 400, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.02 simple_mon: 1.02 simple_timer_mon: 1.07 generic: 1.06 generic_timer: 1.09 -=elapsed 6.048533 +=started 2024-09-12 10:54:50 +=ended 2024-09-12 10:54:56 +=result ok: #parallel gen_server instances: 400, message flat size: 16000 bytes: simple: 1.00 simple_timer: 1.00 simple_mon: 1.04 simple_timer_mon: 1.03 generic: 1.03 generic_timer: 1.03 +=elapsed 6.049427 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.504003.html +=logfile stdlib_bench_suite.end_per_group.19716482.html =group_props [{name,gen_server_comparison}] -=started 2024-09-11 11:32:44 -=ended 2024-09-11 11:32:44 +=started 2024-09-12 10:54:56 +=ended 2024-09-12 10:54:56 =result ok =elapsed 0.0 -=group_time 54.505s +=group_time 54.518s =case stdlib_bench_SUITE:init_per_group -=logfile stdlib_bench_suite.init_per_group.504035.html +=logfile stdlib_bench_suite.init_per_group.19716514.html =group_props [{name,gen_statem_comparison}] -=started 2024-09-11 11:32:44 -=ended 2024-09-11 11:32:44 +=started 2024-09-12 10:54:56 +=ended 2024-09-12 10:54:56 =result ok -=elapsed 0.038629 +=elapsed 0.038493 =case stdlib_bench_SUITE:single_small -=logfile stdlib_bench_suite.single_small.504067.html -=started 2024-09-11 11:32:44 -=ended 2024-09-11 11:32:54 -=result ok: #parallel gen_server instances: 1, message flat size: 0 bytes: generic: 1.00 generic_log: 1.11 generic_log100: 1.12 generic_fsm: 1.07 generic_fsm_transit: 1.07 generic_statem: 1.11 generic_statem_log: 1.39 generic_statem_log100: 1.27 generic_statem_transit: 1.90 generic_statem_complex: 2.88 -=elapsed 10.025853 +=logfile stdlib_bench_suite.single_small.408131.html +=started 2024-09-12 10:54:56 +=ended 2024-09-12 10:55:06 +=result ok: #parallel gen_server instances: 1, message flat size: 0 bytes: generic: 1.00 generic_log: 1.10 generic_log100: 1.10 generic_fsm: 1.03 generic_fsm_transit: 1.00 generic_statem: 1.02 generic_statem_log: 1.26 generic_statem_log100: 1.16 generic_statem_transit: 1.75 generic_statem_complex: 2.55 +=elapsed 10.024899 =case stdlib_bench_SUITE:single_big -=logfile stdlib_bench_suite.single_big.504099.html -=started 2024-09-11 11:32:54 -=ended 2024-09-11 11:33:04 -=result ok: #parallel gen_server instances: 1, message flat size: 16000 bytes: generic: 1.00 generic_log: 0.92 generic_log100: 1.29 generic_fsm: 1.03 generic_fsm_transit: 1.02 generic_statem: 1.02 generic_statem_log: 0.98 generic_statem_log100: 1.17 generic_statem_transit: 1.07 generic_statem_complex: 1.14 -=elapsed 10.009321 +=logfile stdlib_bench_suite.single_big.408163.html +=started 2024-09-12 10:55:06 +=ended 2024-09-12 10:55:16 +=result ok: #parallel gen_server instances: 1, message flat size: 16000 bytes: generic: 1.00 generic_log: 0.91 generic_log100: 1.30 generic_fsm: 1.00 generic_fsm_transit: 1.00 generic_statem: 0.99 generic_statem_log: 0.95 generic_statem_log100: 1.21 generic_statem_transit: 1.05 generic_statem_complex: 1.17 +=elapsed 10.009708 =case stdlib_bench_SUITE:sched_small -=logfile stdlib_bench_suite.sched_small.504131.html -=started 2024-09-11 11:33:04 -=ended 2024-09-11 11:33:14 -=result ok: #parallel gen_server instances: 4, message flat size: 0 bytes: generic: 1.00 generic_log: 1.00 generic_log100: 0.98 generic_fsm: 0.97 generic_fsm_transit: 0.99 generic_statem: 1.02 generic_statem_log: 1.22 generic_statem_log100: 1.13 generic_statem_transit: 2.00 generic_statem_complex: 3.39 -=elapsed 10.009744 +=logfile stdlib_bench_suite.sched_small.408195.html +=started 2024-09-12 10:55:16 +=ended 2024-09-12 10:55:26 +=result ok: #parallel gen_server instances: 4, message flat size: 0 bytes: generic: 1.00 generic_log: 1.04 generic_log100: 1.04 generic_fsm: 0.96 generic_fsm_transit: 1.00 generic_statem: 1.07 generic_statem_log: 1.25 generic_statem_log100: 1.13 generic_statem_transit: 2.13 generic_statem_complex: 3.46 +=elapsed 10.009841 =case stdlib_bench_SUITE:sched_big -=logfile stdlib_bench_suite.sched_big.504163.html -=started 2024-09-11 11:33:14 -=ended 2024-09-11 11:33:24 -=result ok: #parallel gen_server instances: 4, message flat size: 16000 bytes: generic: 1.00 generic_log: 1.09 generic_log100: 1.44 generic_fsm: 0.98 generic_fsm_transit: 0.98 generic_statem: 1.01 generic_statem_log: 1.24 generic_statem_log100: 1.54 generic_statem_transit: 1.06 generic_statem_complex: 1.15 -=elapsed 10.009576 +=logfile stdlib_bench_suite.sched_big.408227.html +=started 2024-09-12 10:55:26 +=ended 2024-09-12 10:55:36 +=result ok: #parallel gen_server instances: 4, message flat size: 16000 bytes: generic: 1.00 generic_log: 1.16 generic_log100: 1.55 generic_fsm: 1.12 generic_fsm_transit: 1.01 generic_statem: 1.09 generic_statem_log: 1.24 generic_statem_log100: 1.62 generic_statem_transit: 1.08 generic_statem_complex: 1.18 +=elapsed 10.009673 =case stdlib_bench_SUITE:multi_small -=logfile stdlib_bench_suite.multi_small.504195.html -=started 2024-09-11 11:33:24 -=ended 2024-09-11 11:33:34 -=result ok: #parallel gen_server instances: 400, message flat size: 0 bytes: generic: 1.00 generic_log: 1.23 generic_log100: 1.14 generic_fsm: 1.02 generic_fsm_transit: 1.05 generic_statem: 1.16 generic_statem_log: 1.88 generic_statem_log100: 1.54 generic_statem_transit: 2.17 generic_statem_complex: 3.67 -=elapsed 10.07048 +=logfile stdlib_bench_suite.multi_small.408259.html +=started 2024-09-12 10:55:36 +=ended 2024-09-12 10:55:46 +=result ok: #parallel gen_server instances: 400, message flat size: 0 bytes: generic: 1.00 generic_log: 1.21 generic_log100: 1.14 generic_fsm: 1.03 generic_fsm_transit: 1.05 generic_statem: 1.15 generic_statem_log: 1.83 generic_statem_log100: 1.53 generic_statem_transit: 2.12 generic_statem_complex: 3.72 +=elapsed 10.069921 =case stdlib_bench_SUITE:multi_big -=logfile stdlib_bench_suite.multi_big.504227.html -=started 2024-09-11 11:33:34 -=ended 2024-09-11 11:33:45 -=result ok: #parallel gen_server instances: 400, message flat size: 16000 bytes: generic: 1.00 generic_log: 1.04 generic_log100: 1.02 generic_fsm: 1.04 generic_fsm_transit: 1.02 generic_statem: 1.02 generic_statem_log: 1.09 generic_statem_log100: 1.03 generic_statem_transit: 1.14 generic_statem_complex: 1.29 -=elapsed 10.096432 +=logfile stdlib_bench_suite.multi_big.408291.html +=started 2024-09-12 10:55:46 +=ended 2024-09-12 10:55:56 +=result ok: #parallel gen_server instances: 400, message flat size: 16000 bytes: generic: 1.00 generic_log: 1.04 generic_log100: 1.01 generic_fsm: 1.01 generic_fsm_transit: 1.00 generic_statem: 0.98 generic_statem_log: 1.03 generic_statem_log100: 1.10 generic_statem_transit: 1.11 generic_statem_complex: 1.23 +=elapsed 10.081999 =case stdlib_bench_SUITE:end_per_group -=logfile stdlib_bench_suite.end_per_group.377093.html +=logfile stdlib_bench_suite.end_per_group.408323.html =group_props [{name,gen_statem_comparison}] -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:56 +=ended 2024-09-12 10:55:56 =result ok =elapsed 1.0e-6 -=group_time 60.423s +=group_time 60.408s =case stdlib_bench_SUITE:end_per_suite =logfile stdlib_bench_suite.end_per_suite.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:56 +=ended 2024-09-12 10:55:56 =result ok =elapsed 0.0 -=group_time 115.981s +=group_time 116.005s =case string_SUITE:init_per_suite =logfile string_suite.init_per_suite.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:56 +=ended 2024-09-12 10:55:57 =result ok =elapsed 0.0 =case string_SUITE:init_per_group =logfile string_suite.init_per_group.html =group_props [{name,chardata}] -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok =elapsed 0.0 =case string_SUITE:is_empty =logfile string_suite.is_empty.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.3e-5 +=elapsed 1.4e-5 =case string_SUITE:length =logfile string_suite.length.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 6.2e-5 +=elapsed 5.2e-5 =case string_SUITE:to_graphemes =logfile string_suite.to_graphemes.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 2.2e-5 +=elapsed 2.0e-5 =case string_SUITE:equal =logfile string_suite.equal.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 4.15e-4 +=elapsed 3.65e-4 =case string_SUITE:reverse =logfile string_suite.reverse.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 2.3e-5 +=elapsed 2.7e-5 =case string_SUITE:slice =logfile string_suite.slice.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 9.0e-5 +=elapsed 1.14e-4 =case string_SUITE:pad =logfile string_suite.pad.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 7.1e-5 +=elapsed 1.06e-4 =case string_SUITE:trim =logfile string_suite.trim.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 4.26e-4 +=elapsed 4.28e-4 =case string_SUITE:chomp =logfile string_suite.chomp.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.77e-4 +=elapsed 0.0002 =case string_SUITE:take =logfile string_suite.take.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 0.001565 +=elapsed 0.001579 =case string_SUITE:lexemes =logfile string_suite.lexemes.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 9.53e-4 +=elapsed 0.001066 =case string_SUITE:nth_lexeme =logfile string_suite.nth_lexeme.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 5.54e-4 +=elapsed 5.71e-4 =case string_SUITE:to_integer =logfile string_suite.to_integer.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 6.0e-5 +=elapsed 9.2e-5 =case string_SUITE:to_float =logfile string_suite.to_float.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 8.4e-5 +=elapsed 8.6e-5 =case string_SUITE:uppercase =logfile string_suite.uppercase.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.34e-4 +=elapsed 0.0001 =case string_SUITE:lowercase =logfile string_suite.lowercase.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.09e-4 +=elapsed 8.2e-5 =case string_SUITE:titlecase =logfile string_suite.titlecase.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.57e-4 +=elapsed 1.05e-4 =case string_SUITE:casefold =logfile string_suite.casefold.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 8.9e-5 +=elapsed 9.3e-5 =case string_SUITE:prefix =logfile string_suite.prefix.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.36e-4 +=elapsed 9.3e-5 =case string_SUITE:find =logfile string_suite.find.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 3.3e-4 +=elapsed 3.49e-4 =case string_SUITE:split =logfile string_suite.split.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 0.001213 +=elapsed 0.001037 =case string_SUITE:replace =logfile string_suite.replace.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 6.5e-5 +=elapsed 6.3e-5 =case string_SUITE:cd_gc =logfile string_suite.cd_gc.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 6.0e-6 +=elapsed 7.0e-6 =case string_SUITE:jaro_similarity =logfile string_suite.jaro_similarity.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:33:45 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:55:57 =result ok -=elapsed 1.24e-4 +=elapsed 1.23e-4 =case string_SUITE:meas =logfile string_suite.meas.html -=started 2024-09-11 11:33:45 -=ended 2024-09-11 11:34:37 +=started 2024-09-12 10:55:57 +=ended 2024-09-12 10:56:49 =result ok -=elapsed 52.243697 +=elapsed 52.280746 =case string_SUITE:end_per_group =logfile string_suite.end_per_group.html =group_props [{name,chardata}] -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:49 =result ok =elapsed 0.0 -=group_time 52.835s +=group_time 52.877s =case string_SUITE:init_per_group -=logfile string_suite.init_per_group.19699938.html +=logfile string_suite.init_per_group.408355.html =group_props [{name,list_string}] -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:49 =result ok =elapsed 0.0 =case string_SUITE:len =logfile string_suite.len.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:49 =result ok =elapsed 5.0e-6 =case string_SUITE:old_equal =logfile string_suite.old_equal.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:49 =result ok =elapsed 1.0e-6 =case string_SUITE:old_concat =logfile string_suite.old_concat.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:49 =result ok -=elapsed 2.0e-6 +=elapsed 4.0e-6 =case string_SUITE:chr_rchr =logfile string_suite.chr_rchr.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:49 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 4.0e-6 +=elapsed 7.0e-6 =case string_SUITE:str_rstr =logfile string_suite.str_rstr.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 5.0e-6 +=elapsed 7.0e-6 =case string_SUITE:span_cspan =logfile string_suite.span_cspan.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 6.0e-6 =case string_SUITE:substr =logfile string_suite.substr.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 6.0e-6 =case string_SUITE:old_tokens =logfile string_suite.old_tokens.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 4.0e-5 +=elapsed 4.1e-5 =case string_SUITE:chars =logfile string_suite.chars.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 2.0e-6 +=elapsed 3.0e-6 =case string_SUITE:copies =logfile string_suite.copies.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 4.0e-6 =case string_SUITE:words =logfile string_suite.words.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 8.0e-6 +=elapsed 9.0e-6 =case string_SUITE:strip =logfile string_suite.strip.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 7.0e-6 +=elapsed 6.0e-6 =case string_SUITE:sub_word =logfile string_suite.sub_word.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 5.0e-6 +=elapsed 6.0e-6 =case string_SUITE:left_right =logfile string_suite.left_right.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 6.0e-6 =case string_SUITE:sub_string =logfile string_suite.sub_string.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 6.0e-6 =case string_SUITE:centre =logfile string_suite.centre.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 3.0e-6 =case string_SUITE:join =logfile string_suite.join.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case string_SUITE:old_to_integer =logfile string_suite.old_to_integer.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 4.0e-5 +=elapsed 4.2e-5 =case string_SUITE:old_to_float =logfile string_suite.old_to_float.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 4.9e-5 +=elapsed 5.2e-5 =case string_SUITE:to_upper_to_lower =logfile string_suite.to_upper_to_lower.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 6.8e-5 =case string_SUITE:end_per_group -=logfile string_suite.end_per_group.19699970.html +=logfile string_suite.end_per_group.19716546.html =group_props [{name,list_string}] -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 0.0 -=group_time 0.463s +=group_time 0.470s =case string_SUITE:end_per_suite =logfile string_suite.end_per_suite.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 0.0 -=group_time 53.384s +=group_time 53.432s =case supervisor_SUITE:init_per_suite =logfile supervisor_suite.init_per_suite.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 0.0 =case supervisor_SUITE:init_per_group =logfile supervisor_suite.init_per_group.html =group_props [{name,sup_start}] -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case supervisor_SUITE:sup_start_normal =logfile supervisor_suite.sup_start_normal.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 3.1e-5 +=elapsed 3.2e-5 =case supervisor_SUITE:sup_start_ignore_init =logfile supervisor_suite.sup_start_ignore_init.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 0.100591 +=elapsed 0.100562 =case supervisor_SUITE:sup_start_ignore_child =logfile supervisor_suite.sup_start_ignore_child.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 4.1e-5 +=elapsed 4.3e-5 =case supervisor_SUITE:sup_start_ignore_temporary_child =logfile supervisor_suite.sup_start_ignore_temporary_child.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 2.8e-5 =case supervisor_SUITE:sup_start_ignore_temporary_child_start_child =logfile supervisor_suite.sup_start_ignore_temporary_child_start_child.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 3.0e-5 =case supervisor_SUITE:sup_start_ignore_temporary_child_start_child_simple =logfile supervisor_suite.sup_start_ignore_temporary_child_start_child_simple.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 2.4e-5 =case supervisor_SUITE:sup_start_ignore_permanent_child_start_child_simple =logfile supervisor_suite.sup_start_ignore_permanent_child_start_child_simple.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok =elapsed 3.9e-5 =case supervisor_SUITE:sup_start_error_return =logfile supervisor_suite.sup_start_error_return.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:38 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 0.100511 +=elapsed 0.101382 =case supervisor_SUITE:sup_start_fail =logfile supervisor_suite.sup_start_fail.html -=started 2024-09-11 11:34:38 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:50 =result ok -=elapsed 0.101204 +=elapsed 0.101365 =case supervisor_SUITE:sup_start_child_returns_error =logfile supervisor_suite.sup_start_child_returns_error.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:50 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 2.1e-5 +=elapsed 2.7e-5 =case supervisor_SUITE:sup_start_restart_child_returns_error =logfile supervisor_suite.sup_start_restart_child_returns_error.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 4.57e-4 +=elapsed 5.29e-4 =case supervisor_SUITE:sup_start_child_returns_error_simple =logfile supervisor_suite.sup_start_child_returns_error_simple.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 2.3e-5 +=elapsed 2.9e-5 =case supervisor_SUITE:end_per_group =logfile supervisor_suite.end_per_group.html =group_props [{name,sup_start}] -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok =elapsed 0.0 -=group_time 0.597s +=group_time 0.596s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504259.html +=logfile supervisor_suite.init_per_group.19716578.html =group_props [{name,sup_start_map}] -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok =elapsed 0.0 =case supervisor_SUITE:sup_start_map =logfile supervisor_suite.sup_start_map.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 6.5e-5 +=elapsed 8.3e-5 =case supervisor_SUITE:sup_start_map_simple =logfile supervisor_suite.sup_start_map_simple.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 1.05e-4 +=elapsed 6.6e-5 =case supervisor_SUITE:sup_start_map_faulty_specs =logfile supervisor_suite.sup_start_map_faulty_specs.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 0.002036 +=elapsed 0.001222 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.504291.html +=logfile supervisor_suite.end_per_group.19716610.html =group_props [{name,sup_start_map}] -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok =elapsed 0.0 -=group_time 0.094s +=group_time 0.093s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504323.html +=logfile supervisor_suite.init_per_group.19716642.html =group_props [{name,sup_stop}] -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok =elapsed 0.0 =case supervisor_SUITE:sup_stop_infinity =logfile supervisor_suite.sup_stop_infinity.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:39 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:51 =result ok -=elapsed 5.1e-5 +=elapsed 5.8e-5 =case supervisor_SUITE:sup_stop_timeout =logfile supervisor_suite.sup_stop_timeout.html -=started 2024-09-11 11:34:39 -=ended 2024-09-11 11:34:40 +=started 2024-09-12 10:56:51 +=ended 2024-09-12 10:56:52 =result ok -=elapsed 1.000764 +=elapsed 1.001474 =case supervisor_SUITE:sup_stop_timeout_dynamic =logfile supervisor_suite.sup_stop_timeout_dynamic.html -=started 2024-09-11 11:34:40 -=ended 2024-09-11 11:34:41 +=started 2024-09-12 10:56:52 +=ended 2024-09-12 10:56:53 =result ok -=elapsed 1.001081 +=elapsed 1.001291 =case supervisor_SUITE:sup_stop_brutal_kill =logfile supervisor_suite.sup_stop_brutal_kill.html -=started 2024-09-11 11:34:41 -=ended 2024-09-11 11:34:41 +=started 2024-09-12 10:56:53 +=ended 2024-09-12 10:56:53 =result ok -=elapsed 5.4e-5 +=elapsed 8.6e-5 =case supervisor_SUITE:sup_stop_brutal_kill_dynamic =logfile supervisor_suite.sup_stop_brutal_kill_dynamic.html -=started 2024-09-11 11:34:41 -=ended 2024-09-11 11:34:41 +=started 2024-09-12 10:56:53 +=ended 2024-09-12 10:56:53 =result ok -=elapsed 1.21e-4 +=elapsed 1.72e-4 =case supervisor_SUITE:sup_stop_race =logfile supervisor_suite.sup_stop_race.html -=started 2024-09-11 11:34:41 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:53 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 1.002302 +=elapsed 1.002669 =case supervisor_SUITE:sup_stop_non_shutdown_exit_dynamic =logfile supervisor_suite.sup_stop_non_shutdown_exit_dynamic.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 0.010846 +=elapsed 0.005729 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700002.html +=logfile supervisor_suite.end_per_group.19716674.html =group_props [{name,sup_stop}] -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok =elapsed 0.0 -=group_time 3.200s +=group_time 3.196s =case supervisor_SUITE:child_adm =logfile supervisor_suite.child_adm.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 1.44e-4 +=elapsed 1.31e-4 =case supervisor_SUITE:child_adm_simple =logfile supervisor_suite.child_adm_simple.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 9.9e-5 +=elapsed 1.22e-4 =case supervisor_SUITE:extra_return =logfile supervisor_suite.extra_return.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 0.001019 +=elapsed 9.2e-4 =case supervisor_SUITE:child_specs =logfile supervisor_suite.child_specs.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 0.001659 +=elapsed 0.001766 =case supervisor_SUITE:child_specs_map =logfile supervisor_suite.child_specs_map.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 0.006783 +=elapsed 0.008302 =case supervisor_SUITE:sup_flags =logfile supervisor_suite.sup_flags.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:42 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:56:54 =result ok -=elapsed 0.004282 +=elapsed 0.004983 =case supervisor_SUITE:multiple_restarts =logfile supervisor_suite.multiple_restarts.html -=started 2024-09-11 11:34:42 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:56:54 +=ended 2024-09-12 10:57:00 =result ok -=elapsed 6.305275 +=elapsed 6.305857 =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.19700034.html +=logfile supervisor_suite.init_per_group.19716706.html =group_props [{name,restart_one_for_one}] -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:00 +=ended 2024-09-12 10:57:00 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case supervisor_SUITE:one_for_one =logfile supervisor_suite.one_for_one.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:00 +=ended 2024-09-12 10:57:00 =result ok -=elapsed 0.003104 +=elapsed 0.002856 =case supervisor_SUITE:one_for_one_escalation =logfile supervisor_suite.one_for_one_escalation.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:00 +=ended 2024-09-12 10:57:00 =result ok -=elapsed 0.004885 +=elapsed 0.005766 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700066.html +=logfile supervisor_suite.end_per_group.19716738.html =group_props [{name,restart_one_for_one}] -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:00 +=ended 2024-09-12 10:57:01 =result ok =elapsed 0.0 -=group_time 0.078s +=group_time 0.079s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.19700098.html +=logfile supervisor_suite.init_per_group.19716770.html =group_props [{name,restart_one_for_all}] -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok =elapsed 0.0 =case supervisor_SUITE:one_for_all =logfile supervisor_suite.one_for_all.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok -=elapsed 0.002516 +=elapsed 0.003991 =case supervisor_SUITE:one_for_all_escalation =logfile supervisor_suite.one_for_all_escalation.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok -=elapsed 0.005158 +=elapsed 0.005071 =case supervisor_SUITE:one_for_all_other_child_fails_restart =logfile supervisor_suite.one_for_all_other_child_fails_restart.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok -=elapsed 5.82e-4 +=elapsed 7.79e-4 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700130.html +=logfile supervisor_suite.end_per_group.19716802.html =group_props [{name,restart_one_for_all}] -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok =elapsed 0.0 -=group_time 0.100s +=group_time 0.102s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.19700162.html +=logfile supervisor_suite.init_per_group.19716834.html =group_props [{name,restart_simple_one_for_one}] -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok =elapsed 0.0 =case supervisor_SUITE:simple_one_for_one =logfile supervisor_suite.simple_one_for_one.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:49 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:01 =result ok -=elapsed 0.002644 +=elapsed 0.002877 =case supervisor_SUITE:simple_one_for_one_shutdown =logfile supervisor_suite.simple_one_for_one_shutdown.html -=started 2024-09-11 11:34:49 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:01 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 2.001267 +=elapsed 2.001139 =case supervisor_SUITE:simple_one_for_one_extra =logfile supervisor_suite.simple_one_for_one_extra.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.003693 +=elapsed 0.002566 =case supervisor_SUITE:simple_one_for_one_escalation =logfile supervisor_suite.simple_one_for_one_escalation.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.004166 +=elapsed 0.006926 =case supervisor_SUITE:simple_one_for_one_corruption =logfile supervisor_suite.simple_one_for_one_corruption.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.00404 +=elapsed 0.005249 =case supervisor_SUITE:simple_one_for_one_restart_ignore =logfile supervisor_suite.simple_one_for_one_restart_ignore.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.002393 +=elapsed 0.001188 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700194.html +=logfile supervisor_suite.end_per_group.19716866.html =group_props [{name,restart_simple_one_for_one}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 -=group_time 2.181s +=group_time 2.184s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504355.html +=logfile supervisor_suite.init_per_group.19716898.html =group_props [{name,restart_rest_for_one}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =case supervisor_SUITE:rest_for_one =logfile supervisor_suite.rest_for_one.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.003253 +=elapsed 0.004068 =case supervisor_SUITE:rest_for_one_escalation =logfile supervisor_suite.rest_for_one_escalation.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.004569 +=elapsed 0.004376 =case supervisor_SUITE:rest_for_one_other_child_fails_restart =logfile supervisor_suite.rest_for_one_other_child_fails_restart.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 6.71e-4 +=elapsed 7.7e-4 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.504387.html +=logfile supervisor_suite.end_per_group.19716930.html =group_props [{name,restart_rest_for_one}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =group_time 0.101s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504419.html +=logfile supervisor_suite.init_per_group.19716962.html =group_props [{name,normal_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =case supervisor_SUITE:external_start_no_progress_log =logfile supervisor_suite.external_start_no_progress_log.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 6.61e-4 +=elapsed 5.76e-4 =case supervisor_SUITE:permanent_normal =logfile supervisor_suite.permanent_normal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 3.64e-4 +=elapsed 4.51e-4 =case supervisor_SUITE:transient_normal =logfile supervisor_suite.transient_normal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 4.0e-5 +=elapsed 6.5e-5 =case supervisor_SUITE:temporary_normal =logfile supervisor_suite.temporary_normal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 3.9e-5 +=elapsed 5.9e-5 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.504451.html +=logfile supervisor_suite.end_per_group.19716994.html =group_props [{name,normal_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =group_time 0.116s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504483.html +=logfile supervisor_suite.init_per_group.19717026.html =group_props [{name,shutdown_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =case supervisor_SUITE:permanent_shutdown =logfile supervisor_suite.permanent_shutdown.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.001417 +=elapsed 7.62e-4 =case supervisor_SUITE:transient_shutdown =logfile supervisor_suite.transient_shutdown.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 5.8e-5 +=elapsed 7.7e-5 =case supervisor_SUITE:temporary_shutdown =logfile supervisor_suite.temporary_shutdown.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 7.1e-5 +=elapsed 7.3e-5 =case supervisor_SUITE:faulty_application_shutdown =logfile supervisor_suite.faulty_application_shutdown.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.016445 +=elapsed 0.013839 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700226.html +=logfile supervisor_suite.end_per_group.425924.html =group_props [{name,shutdown_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 -=group_time 0.133s +=group_time 0.130s =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.19700258.html +=logfile supervisor_suite.init_per_group.425956.html =group_props [{name,abnormal_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 =case supervisor_SUITE:permanent_abnormal =logfile supervisor_suite.permanent_abnormal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.001899 +=elapsed 0.001006 =case supervisor_SUITE:transient_abnormal =logfile supervisor_suite.transient_abnormal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.001388 +=elapsed 0.001491 =case supervisor_SUITE:temporary_abnormal =logfile supervisor_suite.temporary_abnormal.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok -=elapsed 0.001257 +=elapsed 0.001079 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700290.html +=logfile supervisor_suite.end_per_group.425988.html =group_props [{name,abnormal_termination}] -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:51 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:03 =result ok =elapsed 0.0 -=group_time 0.097s +=group_time 0.096s =case supervisor_SUITE:child_unlink =logfile supervisor_suite.child_unlink.html -=started 2024-09-11 11:34:51 -=ended 2024-09-11 11:34:57 +=started 2024-09-12 10:57:03 +=ended 2024-09-12 10:57:08 =result ok -=elapsed 5.000307 +=elapsed 5.000778 =case supervisor_SUITE:tree =logfile supervisor_suite.tree.html -=started 2024-09-11 11:34:57 -=ended 2024-09-11 11:34:58 +=started 2024-09-12 10:57:08 +=ended 2024-09-12 10:57:09 =result ok -=elapsed 1.003898 +=elapsed 1.002712 =case supervisor_SUITE:init_per_group -=logfile supervisor_suite.init_per_group.504515.html +=logfile supervisor_suite.init_per_group.426020.html =group_props [{name,significant}] -=started 2024-09-11 11:34:58 -=ended 2024-09-11 11:34:58 +=started 2024-09-12 10:57:09 +=ended 2024-09-12 10:57:09 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case supervisor_SUITE:nonsignificant_temporary =logfile supervisor_suite.nonsignificant_temporary.html -=started 2024-09-11 11:34:58 -=ended 2024-09-11 11:35:10 +=started 2024-09-12 10:57:09 +=ended 2024-09-12 10:57:21 =result ok -=elapsed 12.011878 +=elapsed 12.013976 =case supervisor_SUITE:nonsignificant_transient =logfile supervisor_suite.nonsignificant_transient.html -=started 2024-09-11 11:35:10 -=ended 2024-09-11 11:35:22 +=started 2024-09-12 10:57:21 +=ended 2024-09-12 10:57:34 =result ok -=elapsed 12.011547 +=elapsed 12.011766 =case supervisor_SUITE:significant_temporary =logfile supervisor_suite.significant_temporary.html -=started 2024-09-11 11:35:22 -=ended 2024-09-11 11:35:28 +=started 2024-09-12 10:57:34 +=ended 2024-09-12 10:57:40 =result ok -=elapsed 6.007255 +=elapsed 6.007712 =case supervisor_SUITE:significant_transient =logfile supervisor_suite.significant_transient.html -=started 2024-09-11 11:35:28 -=ended 2024-09-11 11:35:40 +=started 2024-09-12 10:57:40 +=ended 2024-09-12 10:57:52 =result ok -=elapsed 12.012656 +=elapsed 12.012786 =case supervisor_SUITE:significant_simple =logfile supervisor_suite.significant_simple.html -=started 2024-09-11 11:35:40 -=ended 2024-09-11 11:35:40 +=started 2024-09-12 10:57:52 +=ended 2024-09-12 10:57:52 =result ok -=elapsed 0.001103 +=elapsed 0.001039 =case supervisor_SUITE:significant_bystander =logfile supervisor_suite.significant_bystander.html -=started 2024-09-11 11:35:40 -=ended 2024-09-11 11:35:52 +=started 2024-09-12 10:57:52 +=ended 2024-09-12 10:58:04 =result ok -=elapsed 12.011294 +=elapsed 12.011947 =case supervisor_SUITE:significant_escalation =logfile supervisor_suite.significant_escalation.html -=started 2024-09-11 11:35:52 -=ended 2024-09-11 11:35:53 +=started 2024-09-12 10:58:04 +=ended 2024-09-12 10:58:05 =result ok -=elapsed 1.000421 +=elapsed 1.000805 =case supervisor_SUITE:significant_upgrade_never_any =logfile supervisor_suite.significant_upgrade_never_any.html -=started 2024-09-11 11:35:53 -=ended 2024-09-11 11:35:53 +=started 2024-09-12 10:58:05 +=ended 2024-09-12 10:58:05 =result ok -=elapsed 0.0001 +=elapsed 1.19e-4 =case supervisor_SUITE:significant_upgrade_any_never =logfile supervisor_suite.significant_upgrade_any_never.html -=started 2024-09-11 11:35:53 -=ended 2024-09-11 11:35:56 +=started 2024-09-12 10:58:05 +=ended 2024-09-12 10:58:08 =result ok -=elapsed 3.002564 +=elapsed 3.003104 =case supervisor_SUITE:significant_upgrade_never_all =logfile supervisor_suite.significant_upgrade_never_all.html -=started 2024-09-11 11:35:56 -=ended 2024-09-11 11:35:58 +=started 2024-09-12 10:58:08 +=ended 2024-09-12 10:58:10 =result ok -=elapsed 2.002161 +=elapsed 2.00183 =case supervisor_SUITE:significant_upgrade_all_never =logfile supervisor_suite.significant_upgrade_all_never.html -=started 2024-09-11 11:35:58 -=ended 2024-09-11 11:36:01 +=started 2024-09-12 10:58:10 +=ended 2024-09-12 10:58:13 =result ok -=elapsed 3.00317 +=elapsed 3.002775 =case supervisor_SUITE:significant_upgrade_any_all =logfile supervisor_suite.significant_upgrade_any_all.html -=started 2024-09-11 11:36:01 -=ended 2024-09-11 11:36:06 +=started 2024-09-12 10:58:13 +=ended 2024-09-12 10:58:18 =result ok -=elapsed 5.004809 +=elapsed 5.004773 =case supervisor_SUITE:significant_upgrade_all_any =logfile supervisor_suite.significant_upgrade_all_any.html -=started 2024-09-11 11:36:06 -=ended 2024-09-11 11:36:09 +=started 2024-09-12 10:58:18 +=ended 2024-09-12 10:58:21 =result ok -=elapsed 3.003105 +=elapsed 3.002905 =case supervisor_SUITE:significant_upgrade_child =logfile supervisor_suite.significant_upgrade_child.html -=started 2024-09-11 11:36:09 -=ended 2024-09-11 11:36:16 +=started 2024-09-12 10:58:21 +=ended 2024-09-12 10:58:28 =result ok -=elapsed 7.007118 +=elapsed 7.007019 =case supervisor_SUITE:end_per_group -=logfile supervisor_suite.end_per_group.19700322.html +=logfile supervisor_suite.end_per_group.19717058.html =group_props [{name,significant}] -=started 2024-09-11 11:36:16 -=ended 2024-09-11 11:36:16 +=started 2024-09-12 10:58:28 +=ended 2024-09-12 10:58:28 =result ok =elapsed 0.0 -=group_time 78.426s +=group_time 78.429s =case supervisor_SUITE:count_children =logfile supervisor_suite.count_children.html -=started 2024-09-11 11:36:16 -=ended 2024-09-11 11:36:17 +=started 2024-09-12 10:58:28 +=ended 2024-09-12 10:58:28 =result ok -=elapsed 0.521284 +=elapsed 0.56633 =case supervisor_SUITE:count_children_supervisor =logfile supervisor_suite.count_children_supervisor.html -=started 2024-09-11 11:36:17 -=ended 2024-09-11 11:36:17 +=started 2024-09-12 10:58:28 +=ended 2024-09-12 10:58:29 =result ok -=elapsed 0.381144 +=elapsed 0.394859 =case supervisor_SUITE:count_restarting_children =logfile supervisor_suite.count_restarting_children.html -=started 2024-09-11 11:36:17 -=ended 2024-09-11 11:36:27 +=started 2024-09-12 10:58:29 +=ended 2024-09-12 10:58:39 =result ok -=elapsed 10.407167 +=elapsed 10.40668 =case supervisor_SUITE:get_callback_module =logfile supervisor_suite.get_callback_module.html -=started 2024-09-11 11:36:27 -=ended 2024-09-11 11:36:27 +=started 2024-09-12 10:58:39 +=ended 2024-09-12 10:58:39 =result ok -=elapsed 2.8e-5 +=elapsed 3.9e-5 =case supervisor_SUITE:do_not_save_start_parameters_for_temporary_children =logfile supervisor_suite.do_not_save_start_parameters_for_temporary_children.html -=started 2024-09-11 11:36:27 -=ended 2024-09-11 11:36:27 +=started 2024-09-12 10:58:39 +=ended 2024-09-12 10:58:39 =result ok -=elapsed 0.013877 +=elapsed 0.013574 =case supervisor_SUITE:do_not_save_child_specs_for_temporary_children =logfile supervisor_suite.do_not_save_child_specs_for_temporary_children.html -=started 2024-09-11 11:36:27 -=ended 2024-09-11 11:36:27 +=started 2024-09-12 10:58:39 +=ended 2024-09-12 10:58:39 =result ok -=elapsed 0.014388 +=elapsed 0.018432 =case supervisor_SUITE:simple_one_for_one_scale_many_temporary_children =logfile supervisor_suite.simple_one_for_one_scale_many_temporary_children.html -=started 2024-09-11 11:36:27 -=ended 2024-09-11 11:36:28 +=started 2024-09-12 10:58:39 +=ended 2024-09-12 10:58:40 =result ok -=elapsed 0.123966 +=elapsed 0.134104 =case supervisor_SUITE:temporary_bystander =logfile supervisor_suite.temporary_bystander.html -=started 2024-09-11 11:36:28 -=ended 2024-09-11 11:36:28 +=started 2024-09-12 10:58:40 +=ended 2024-09-12 10:58:40 =result ok -=elapsed 0.350759 +=elapsed 0.350702 =case supervisor_SUITE:simple_global_supervisor =logfile supervisor_suite.simple_global_supervisor.html -=started 2024-09-11 11:36:28 -=ended 2024-09-11 11:36:29 +=started 2024-09-12 10:58:40 +=ended 2024-09-12 10:58:41 =result ok -=elapsed 1.406809 +=elapsed 1.406511 =case supervisor_SUITE:hanging_restart_loop =logfile supervisor_suite.hanging_restart_loop.html -=started 2024-09-11 11:36:29 -=ended 2024-09-11 11:36:43 +=started 2024-09-12 10:58:41 +=ended 2024-09-12 10:58:55 =result ok -=elapsed 14.010066 +=elapsed 14.012489 =case supervisor_SUITE:hanging_restart_loop_rest_for_one =logfile supervisor_suite.hanging_restart_loop_rest_for_one.html -=started 2024-09-11 11:36:43 -=ended 2024-09-11 11:36:57 +=started 2024-09-12 10:58:55 +=ended 2024-09-12 10:59:09 =result ok -=elapsed 14.009373 +=elapsed 14.012495 =case supervisor_SUITE:hanging_restart_loop_simple =logfile supervisor_suite.hanging_restart_loop_simple.html -=started 2024-09-11 11:36:57 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:09 +=ended 2024-09-12 10:59:21 =result ok -=elapsed 12.008425 +=elapsed 12.013357 =case supervisor_SUITE:code_change =logfile supervisor_suite.code_change.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:21 +=ended 2024-09-12 10:59:22 =result ok -=elapsed 1.4e-4 +=elapsed 1.96e-4 =case supervisor_SUITE:code_change_map =logfile supervisor_suite.code_change_map.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:22 +=ended 2024-09-12 10:59:22 =result ok -=elapsed 1.78e-4 +=elapsed 1.25e-4 =case supervisor_SUITE:code_change_simple =logfile supervisor_suite.code_change_simple.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:22 +=ended 2024-09-12 10:59:22 =result ok -=elapsed 7.5e-5 +=elapsed 5.7e-5 =case supervisor_SUITE:code_change_simple_map =logfile supervisor_suite.code_change_simple_map.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:22 +=ended 2024-09-12 10:59:22 =result ok -=elapsed 7.0e-5 +=elapsed 5.3e-5 =case supervisor_SUITE:order_of_children =logfile supervisor_suite.order_of_children.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:10 +=started 2024-09-12 10:59:22 +=ended 2024-09-12 10:59:22 =result ok -=elapsed 0.01049 +=elapsed 0.010426 =case supervisor_SUITE:scale_start_stop_many_children =logfile supervisor_suite.scale_start_stop_many_children.html -=started 2024-09-11 11:37:10 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:22 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 1.394552 +=elapsed 1.326208 =case supervisor_SUITE:format_log_1 =logfile supervisor_suite.format_log_1.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 2.26e-4 +=elapsed 2.3e-4 =case supervisor_SUITE:format_log_2 =logfile supervisor_suite.format_log_2.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 8.84e-4 +=elapsed 8.97e-4 =case supervisor_SUITE:already_started_outside_supervisor =logfile supervisor_suite.already_started_outside_supervisor.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 4.9e-5 +=elapsed 5.9e-5 =case supervisor_SUITE:end_per_suite =logfile supervisor_suite.end_per_suite.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok =elapsed 0.0 -=group_time 153.098s +=group_time 153.111s =case supervisor_bridge_SUITE:init_per_suite =logfile supervisor_bridge_suite.init_per_suite.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 1.0e-6 +=elapsed 0.0 =case supervisor_bridge_SUITE:starting =logfile supervisor_bridge_suite.starting.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 3.94e-4 +=elapsed 4.9e-4 =case supervisor_bridge_SUITE:mini_terminate =logfile supervisor_bridge_suite.mini_terminate.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 9.61e-4 +=elapsed 0.001011 =case supervisor_bridge_SUITE:mini_die =logfile supervisor_bridge_suite.mini_die.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 9.02e-4 +=elapsed 8.81e-4 =case supervisor_bridge_SUITE:badstart =logfile supervisor_bridge_suite.badstart.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:11 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 0.002852 +=elapsed 0.00203 =case supervisor_bridge_SUITE:simple_global_supervisor =logfile supervisor_bridge_suite.simple_global_supervisor.html -=started 2024-09-11 11:37:11 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 0.200973 +=elapsed 0.20091 =case supervisor_bridge_SUITE:format_log_1 =logfile supervisor_bridge_suite.format_log_1.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 1.61e-4 +=elapsed 1.7e-4 =case supervisor_bridge_SUITE:format_log_2 =logfile supervisor_bridge_suite.format_log_2.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok -=elapsed 7.5e-4 +=elapsed 7.67e-4 =case supervisor_bridge_SUITE:end_per_suite =logfile supervisor_bridge_suite.end_per_suite.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:23 =result ok =elapsed 0.0 =group_time 0.404s =case sys_SUITE:init_per_suite =logfile sys_suite.init_per_suite.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:23 +=ended 2024-09-12 10:59:24 =result ok =elapsed 0.0 =case sys_SUITE:log =logfile sys_suite.log.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:24 +=ended 2024-09-12 10:59:24 =result ok -=elapsed 5.4e-5 +=elapsed 5.6e-5 =case sys_SUITE:log_to_file =logfile sys_suite.log_to_file.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:24 +=ended 2024-09-12 10:59:24 =result ok -=elapsed 8.09e-4 +=elapsed 8.36e-4 =case sys_SUITE:stats =logfile sys_suite.stats.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:12 +=started 2024-09-12 10:59:24 +=ended 2024-09-12 10:59:24 =result ok -=elapsed 7.7e-5 +=elapsed 7.8e-5 =case sys_SUITE:trace =logfile sys_suite.trace.html -=started 2024-09-11 11:37:12 -=ended 2024-09-11 11:37:15 +=started 2024-09-12 10:59:24 +=ended 2024-09-12 10:59:27 =result ok -=elapsed 3.002219 +=elapsed 3.002297 =case sys_SUITE:suspend =logfile sys_suite.suspend.html -=started 2024-09-11 11:37:15 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:27 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 2.00176 +=elapsed 2.00128 =case sys_SUITE:install =logfile sys_suite.install.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.00776 +=elapsed 0.00737 =case sys_SUITE:special_process =logfile sys_suite.special_process.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 4.48e-4 +=elapsed 4.54e-4 =case sys_SUITE:end_per_suite =logfile sys_suite.end_per_suite.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok =elapsed 0.0 -=group_time 5.214s +=group_time 5.215s =case tar_SUITE:init_per_suite =logfile tar_suite.init_per_suite.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok =elapsed 0.0 =case tar_SUITE:borderline =logfile tar_suite.borderline.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.15245 +=elapsed 0.148946 =case tar_SUITE:atomic =logfile tar_suite.atomic.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.00948 +=elapsed 0.009435 =case tar_SUITE:long_names =logfile tar_suite.long_names.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.003561 +=elapsed 0.003721 =case tar_SUITE:create_long_names =logfile tar_suite.create_long_names.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.003013 +=elapsed 0.003027 =case tar_SUITE:bad_tar =logfile tar_suite.bad_tar.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.001515 +=elapsed 0.001363 =case tar_SUITE:errors =logfile tar_suite.errors.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 5.27e-4 +=elapsed 5.65e-4 =case tar_SUITE:extract_from_binary =logfile tar_suite.extract_from_binary.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.001672 +=elapsed 0.001673 =case tar_SUITE:extract_from_binary_compressed =logfile tar_suite.extract_from_binary_compressed.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.005669 +=elapsed 0.005339 =case tar_SUITE:extract_from_open_file =logfile tar_suite.extract_from_open_file.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.008517 +=elapsed 0.007944 =case tar_SUITE:extract_filtered =logfile tar_suite.extract_filtered.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.001229 +=elapsed 0.001532 =case tar_SUITE:symlinks =logfile tar_suite.symlinks.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.006141 +=elapsed 0.00581 =case tar_SUITE:open_add_close =logfile tar_suite.open_add_close.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.003742 +=elapsed 0.003563 =case tar_SUITE:cooked_compressed =logfile tar_suite.cooked_compressed.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 0.012314 +=elapsed 0.01114 =case tar_SUITE:memory =logfile tar_suite.memory.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:17 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:29 =result ok -=elapsed 8.89e-4 +=elapsed 8.11e-4 =case tar_SUITE:unicode =logfile tar_suite.unicode.html -=started 2024-09-11 11:37:17 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:29 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.340691 +=elapsed 0.34663 =case tar_SUITE:read_other_implementations =logfile tar_suite.read_other_implementations.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.004332 +=elapsed 0.002437 =case tar_SUITE:bsdtgz =logfile tar_suite.bsdtgz.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 5.76e-4 +=elapsed 5.85e-4 =case tar_SUITE:sparse =logfile tar_suite.sparse.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.00889 +=elapsed 0.008274 =case tar_SUITE:init =logfile tar_suite.init.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.001884 +=elapsed 0.00161 =case tar_SUITE:leading_slash =logfile tar_suite.leading_slash.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.00143 +=elapsed 0.001053 =case tar_SUITE:dotdot =logfile tar_suite.dotdot.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 7.39e-4 +=elapsed 5.3e-4 =case tar_SUITE:roundtrip_metadata =logfile tar_suite.roundtrip_metadata.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.001092 +=elapsed 7.28e-4 =case tar_SUITE:apply_file_info_opts =logfile tar_suite.apply_file_info_opts.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 0.001634 +=elapsed 9.4e-4 =case tar_SUITE:incompatible_options =logfile tar_suite.incompatible_options.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok -=elapsed 1.65e-4 +=elapsed 1.35e-4 =case tar_SUITE:end_per_suite =logfile tar_suite.end_per_suite.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok =elapsed 0.0 -=group_time 1.161s +=group_time 1.157s =case timer_SUITE:init_per_suite =logfile timer_suite.init_per_suite.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:37:18 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 10:59:30 =result ok =elapsed 0.0 =case timer_SUITE:do_big_test =logfile timer_suite.do_big_test.html -=started 2024-09-11 11:37:18 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 10:59:30 +=ended 2024-09-12 11:00:42 =result ok -=elapsed 80.719057 +=elapsed 71.802699 =case timer_SUITE:end_per_suite =logfile timer_suite.end_per_suite.html -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:42 =result ok =elapsed 0.0 -=group_time 80.783s +=group_time 71.867s =case timer_simple_SUITE:init_per_suite =logfile timer_simple_suite.init_per_suite.html -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:42 =result ok =elapsed 0.0 =case timer_simple_SUITE:init_per_group =logfile timer_simple_suite.init_per_group.html =group_props [{name,apply_after}] -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:42 =result ok =elapsed 0.0 =case timer_simple_SUITE:apply_after1 =logfile timer_simple_suite.apply_after1.html -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:42 =result ok -=elapsed 1.4e-5 +=elapsed 1.5e-5 =case timer_simple_SUITE:apply_after2 =logfile timer_simple_suite.apply_after2.html -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:39 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:42 =result ok -=elapsed 0.501917 +=elapsed 0.502081 =case timer_simple_SUITE:apply_after3 =logfile timer_simple_suite.apply_after3.html -=started 2024-09-11 11:38:39 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:42 +=ended 2024-09-12 11:00:43 =result ok -=elapsed 0.101929 +=elapsed 0.101871 =case timer_simple_SUITE:apply_after4 =logfile timer_simple_suite.apply_after4.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok -=elapsed 0.10186 +=elapsed 0.10205 =case timer_simple_SUITE:apply_after_invalid_args =logfile timer_simple_suite.apply_after_invalid_args.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:end_per_group =logfile timer_simple_suite.end_per_group.html =group_props [{name,apply_after}] -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok =elapsed 0.0 =group_time 0.844s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700578.html +=logfile timer_simple_suite.init_per_group.19717314.html =group_props [{name,send_after}] -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok =elapsed 0.0 =case timer_simple_SUITE:send_after1 =logfile timer_simple_suite.send_after1.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:send_after2 =logfile timer_simple_suite.send_after2.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok -=elapsed 9.0e-6 +=elapsed 1.0e-5 =case timer_simple_SUITE:send_after3 =logfile timer_simple_suite.send_after3.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok =elapsed 8.0e-6 =case timer_simple_SUITE:send_after4 =logfile timer_simple_suite.send_after4.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:40 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:43 =result ok -=elapsed 0.500988 +=elapsed 0.500985 =case timer_simple_SUITE:send_after5 =logfile timer_simple_suite.send_after5.html -=started 2024-09-11 11:38:40 -=ended 2024-09-11 11:38:41 +=started 2024-09-12 11:00:43 +=ended 2024-09-12 11:00:44 =result ok -=elapsed 0.501918 +=elapsed 0.501649 =case timer_simple_SUITE:send_after6 =logfile timer_simple_suite.send_after6.html -=started 2024-09-11 11:38:41 -=ended 2024-09-11 11:38:41 +=started 2024-09-12 11:00:44 +=ended 2024-09-12 11:00:44 =result ok -=elapsed 0.501994 +=elapsed 0.501654 =case timer_simple_SUITE:send_after7 =logfile timer_simple_suite.send_after7.html -=started 2024-09-11 11:38:41 -=ended 2024-09-11 11:38:42 +=started 2024-09-12 11:00:44 +=ended 2024-09-12 11:00:45 =result ok -=elapsed 0.502013 +=elapsed 0.501725 =case timer_simple_SUITE:send_after_invalid_args =logfile timer_simple_suite.send_after_invalid_args.html -=started 2024-09-11 11:38:42 -=ended 2024-09-11 11:38:42 +=started 2024-09-12 11:00:45 +=ended 2024-09-12 11:00:45 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700610.html +=logfile timer_simple_suite.end_per_group.19717346.html =group_props [{name,send_after}] -=started 2024-09-11 11:38:42 -=ended 2024-09-11 11:38:42 +=started 2024-09-12 11:00:45 +=ended 2024-09-12 11:00:45 =result ok =elapsed 0.0 =group_time 2.214s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700642.html +=logfile timer_simple_suite.init_per_group.19717378.html =group_props [{name,exit_after}] -=started 2024-09-11 11:38:42 -=ended 2024-09-11 11:38:42 +=started 2024-09-12 11:00:45 +=ended 2024-09-12 11:00:45 =result ok =elapsed 0.0 =case timer_simple_SUITE:exit_after1 =logfile timer_simple_suite.exit_after1.html -=started 2024-09-11 11:38:42 -=ended 2024-09-11 11:38:43 +=started 2024-09-12 11:00:45 +=ended 2024-09-12 11:00:46 =result ok -=elapsed 1.001953 +=elapsed 1.002081 =case timer_simple_SUITE:exit_after2 =logfile timer_simple_suite.exit_after2.html -=started 2024-09-11 11:38:43 -=ended 2024-09-11 11:38:44 +=started 2024-09-12 11:00:46 +=ended 2024-09-12 11:00:47 =result ok -=elapsed 1.001977 +=elapsed 1.001515 =case timer_simple_SUITE:exit_after3 =logfile timer_simple_suite.exit_after3.html -=started 2024-09-11 11:38:44 -=ended 2024-09-11 11:38:45 +=started 2024-09-12 11:00:47 +=ended 2024-09-12 11:00:48 =result ok -=elapsed 1.001993 +=elapsed 1.001695 =case timer_simple_SUITE:exit_after4 =logfile timer_simple_suite.exit_after4.html -=started 2024-09-11 11:38:45 -=ended 2024-09-11 11:38:46 +=started 2024-09-12 11:00:48 +=ended 2024-09-12 11:00:49 =result ok -=elapsed 1.000769 +=elapsed 1.000705 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700674.html +=logfile timer_simple_suite.end_per_group.19717410.html =group_props [{name,exit_after}] -=started 2024-09-11 11:38:46 -=ended 2024-09-11 11:38:46 +=started 2024-09-12 11:00:49 +=ended 2024-09-12 11:00:49 =result ok =elapsed 0.0 =group_time 4.122s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700706.html +=logfile timer_simple_suite.init_per_group.19717442.html =group_props [{name,kill_after}] -=started 2024-09-11 11:38:46 -=ended 2024-09-11 11:38:46 +=started 2024-09-12 11:00:49 +=ended 2024-09-12 11:00:49 =result ok =elapsed 0.0 =case timer_simple_SUITE:kill_after1 =logfile timer_simple_suite.kill_after1.html -=started 2024-09-11 11:38:46 -=ended 2024-09-11 11:38:47 +=started 2024-09-12 11:00:49 +=ended 2024-09-12 11:00:50 =result ok -=elapsed 1.001763 +=elapsed 1.001982 =case timer_simple_SUITE:kill_after2 =logfile timer_simple_suite.kill_after2.html -=started 2024-09-11 11:38:47 -=ended 2024-09-11 11:38:48 +=started 2024-09-12 11:00:50 +=ended 2024-09-12 11:00:51 =result ok -=elapsed 1.001573 +=elapsed 1.001745 =case timer_simple_SUITE:kill_after3 =logfile timer_simple_suite.kill_after3.html -=started 2024-09-11 11:38:48 -=ended 2024-09-11 11:38:49 +=started 2024-09-12 11:00:51 +=ended 2024-09-12 11:00:52 =result ok -=elapsed 1.001709 +=elapsed 1.001415 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700738.html +=logfile timer_simple_suite.end_per_group.19717474.html =group_props [{name,kill_after}] -=started 2024-09-11 11:38:49 -=ended 2024-09-11 11:38:49 +=started 2024-09-12 11:00:52 +=ended 2024-09-12 11:00:52 =result ok =elapsed 0.0 =group_time 3.098s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700770.html +=logfile timer_simple_suite.init_per_group.19717506.html =group_props [{name,apply_interval}] -=started 2024-09-11 11:38:49 -=ended 2024-09-11 11:38:49 +=started 2024-09-12 11:00:52 +=ended 2024-09-12 11:00:52 =result ok =elapsed 0.0 =case timer_simple_SUITE:apply_interval1 =logfile timer_simple_suite.apply_interval1.html -=started 2024-09-11 11:38:49 -=ended 2024-09-11 11:38:53 +=started 2024-09-12 11:00:52 +=ended 2024-09-12 11:00:56 =result ok -=elapsed 4.002571 +=elapsed 4.002887 =case timer_simple_SUITE:apply_interval2 =logfile timer_simple_suite.apply_interval2.html -=started 2024-09-11 11:38:53 -=ended 2024-09-11 11:38:56 +=started 2024-09-12 11:00:56 +=ended 2024-09-12 11:00:59 =result ok -=elapsed 2.801733 +=elapsed 2.8014 =case timer_simple_SUITE:apply_interval_invalid_args =logfile timer_simple_suite.apply_interval_invalid_args.html -=started 2024-09-11 11:38:56 -=ended 2024-09-11 11:38:56 +=started 2024-09-12 11:00:59 +=ended 2024-09-12 11:00:59 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700802.html +=logfile timer_simple_suite.end_per_group.19717538.html =group_props [{name,apply_interval}] -=started 2024-09-11 11:38:56 -=ended 2024-09-11 11:38:56 +=started 2024-09-12 11:00:59 +=ended 2024-09-12 11:00:59 =result ok =elapsed 0.0 =group_time 6.897s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700834.html +=logfile timer_simple_suite.init_per_group.19717570.html =group_props [{name,apply_repeatedly}] -=started 2024-09-11 11:38:56 -=ended 2024-09-11 11:38:56 +=started 2024-09-12 11:00:59 +=ended 2024-09-12 11:00:59 =result ok =elapsed 0.0 =case timer_simple_SUITE:apply_repeatedly1 =logfile timer_simple_suite.apply_repeatedly1.html -=started 2024-09-11 11:38:56 -=ended 2024-09-11 11:39:00 +=started 2024-09-12 11:00:59 +=ended 2024-09-12 11:01:03 =result ok -=elapsed 4.002413 +=elapsed 4.002877 =case timer_simple_SUITE:apply_repeatedly2 =logfile timer_simple_suite.apply_repeatedly2.html -=started 2024-09-11 11:39:00 -=ended 2024-09-11 11:39:04 +=started 2024-09-12 11:01:03 +=ended 2024-09-12 11:01:07 =result ok -=elapsed 3.501849 +=elapsed 3.501709 =case timer_simple_SUITE:apply_repeatedly_invalid_args =logfile timer_simple_suite.apply_repeatedly_invalid_args.html -=started 2024-09-11 11:39:04 -=ended 2024-09-11 11:39:04 +=started 2024-09-12 11:01:07 +=ended 2024-09-12 11:01:07 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700866.html +=logfile timer_simple_suite.end_per_group.19717602.html =group_props [{name,apply_repeatedly}] -=started 2024-09-11 11:39:04 -=ended 2024-09-11 11:39:04 +=started 2024-09-12 11:01:07 +=ended 2024-09-12 11:01:07 =result ok =elapsed 0.0 -=group_time 7.598s +=group_time 7.597s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700898.html +=logfile timer_simple_suite.init_per_group.19717634.html =group_props [{name,send_interval}] -=started 2024-09-11 11:39:04 -=ended 2024-09-11 11:39:04 +=started 2024-09-12 11:01:07 +=ended 2024-09-12 11:01:07 =result ok =elapsed 0.0 =case timer_simple_SUITE:send_interval1 =logfile timer_simple_suite.send_interval1.html -=started 2024-09-11 11:39:04 -=ended 2024-09-11 11:39:10 +=started 2024-09-12 11:01:07 +=ended 2024-09-12 11:01:13 =result ok -=elapsed 6.002735 +=elapsed 6.002826 =case timer_simple_SUITE:send_interval2 =logfile timer_simple_suite.send_interval2.html -=started 2024-09-11 11:39:10 -=ended 2024-09-11 11:39:13 +=started 2024-09-12 11:01:13 +=ended 2024-09-12 11:01:16 =result ok -=elapsed 3.002497 +=elapsed 3.002692 =case timer_simple_SUITE:send_interval3 =logfile timer_simple_suite.send_interval3.html -=started 2024-09-11 11:39:13 -=ended 2024-09-11 11:39:16 +=started 2024-09-12 11:01:16 +=ended 2024-09-12 11:01:19 =result ok -=elapsed 3.002703 +=elapsed 3.002625 =case timer_simple_SUITE:send_interval4 =logfile timer_simple_suite.send_interval4.html -=started 2024-09-11 11:39:16 -=ended 2024-09-11 11:39:19 +=started 2024-09-12 11:01:19 +=ended 2024-09-12 11:01:22 =result ok -=elapsed 3.002496 +=elapsed 3.002693 =case timer_simple_SUITE:send_interval5 =logfile timer_simple_suite.send_interval5.html -=started 2024-09-11 11:39:19 -=ended 2024-09-11 11:39:20 +=started 2024-09-12 11:01:22 +=ended 2024-09-12 11:01:23 =result ok -=elapsed 1.102854 +=elapsed 1.102753 =case timer_simple_SUITE:send_interval_invalid_args =logfile timer_simple_suite.send_interval_invalid_args.html -=started 2024-09-11 11:39:20 -=ended 2024-09-11 11:39:20 +=started 2024-09-12 11:01:23 +=ended 2024-09-12 11:01:23 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700930.html +=logfile timer_simple_suite.end_per_group.19717666.html =group_props [{name,send_interval}] -=started 2024-09-11 11:39:20 -=ended 2024-09-11 11:39:20 +=started 2024-09-12 11:01:23 +=ended 2024-09-12 11:01:23 =result ok =elapsed 0.0 -=group_time 16.276s +=group_time 16.277s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19700962.html +=logfile timer_simple_suite.init_per_group.19717698.html =group_props [{name,cancel}] -=started 2024-09-11 11:39:20 -=ended 2024-09-11 11:39:20 +=started 2024-09-12 11:01:23 +=ended 2024-09-12 11:01:23 =result ok =elapsed 0.0 =case timer_simple_SUITE:cancel1 =logfile timer_simple_suite.cancel1.html -=started 2024-09-11 11:39:20 -=ended 2024-09-11 11:39:20 +=started 2024-09-12 11:01:23 +=ended 2024-09-12 11:01:23 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:cancel2 =logfile timer_simple_suite.cancel2.html -=started 2024-09-11 11:39:20 -=ended 2024-09-11 11:39:22 +=started 2024-09-12 11:01:23 +=ended 2024-09-12 11:01:25 =result ok -=elapsed 2.000859 +=elapsed 2.000978 =case timer_simple_SUITE:cancel3 =logfile timer_simple_suite.cancel3.html -=started 2024-09-11 11:39:22 -=ended 2024-09-11 11:39:24 +=started 2024-09-12 11:01:25 +=ended 2024-09-12 11:01:27 =result ok -=elapsed 2.000945 +=elapsed 2.000729 =case timer_simple_SUITE:cancel4 =logfile timer_simple_suite.cancel4.html -=started 2024-09-11 11:39:24 -=ended 2024-09-11 11:39:25 +=started 2024-09-12 11:01:27 +=ended 2024-09-12 11:01:28 =result ok -=elapsed 1.102766 +=elapsed 1.102173 =case timer_simple_SUITE:cancel5 =logfile timer_simple_suite.cancel5.html -=started 2024-09-11 11:39:25 -=ended 2024-09-11 11:39:26 +=started 2024-09-12 11:01:28 +=ended 2024-09-12 11:01:29 =result ok -=elapsed 1.102889 +=elapsed 1.102615 =case timer_simple_SUITE:cancel6 =logfile timer_simple_suite.cancel6.html -=started 2024-09-11 11:39:26 -=ended 2024-09-11 11:39:28 +=started 2024-09-12 11:01:29 +=ended 2024-09-12 11:01:31 =result ok -=elapsed 2.003898 +=elapsed 2.003705 =case timer_simple_SUITE:cancel_invalid_args =logfile timer_simple_suite.cancel_invalid_args.html -=started 2024-09-11 11:39:28 -=ended 2024-09-11 11:39:28 +=started 2024-09-12 11:01:31 +=ended 2024-09-12 11:01:31 =result ok =elapsed 1.0e-6 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19700994.html +=logfile timer_simple_suite.end_per_group.19717730.html =group_props [{name,cancel}] -=started 2024-09-11 11:39:28 -=ended 2024-09-11 11:39:28 +=started 2024-09-12 11:01:31 +=ended 2024-09-12 11:01:31 =result ok =elapsed 0.0 -=group_time 8.395s +=group_time 8.396s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19701026.html +=logfile timer_simple_suite.init_per_group.19717762.html =group_props [{name,sleep}] -=started 2024-09-11 11:39:28 -=ended 2024-09-11 11:39:28 +=started 2024-09-12 11:01:31 +=ended 2024-09-12 11:01:31 =result ok -=elapsed 0.0 +=elapsed 1.0e-6 =case timer_simple_SUITE:sleep1 =logfile timer_simple_suite.sleep1.html -=started 2024-09-11 11:39:28 -=ended 2024-09-11 11:39:30 +=started 2024-09-12 11:01:31 +=ended 2024-09-12 11:01:33 =result ok -=elapsed 1.000163 +=elapsed 1.000962 =case timer_simple_SUITE:sleep2 =logfile timer_simple_suite.sleep2.html -=started 2024-09-11 11:39:30 -=ended 2024-09-11 11:39:31 +=started 2024-09-12 11:01:33 +=ended 2024-09-12 11:01:34 =result ok -=elapsed 1.001837 +=elapsed 1.001227 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19701058.html +=logfile timer_simple_suite.end_per_group.19717794.html =group_props [{name,sleep}] -=started 2024-09-11 11:39:31 -=ended 2024-09-11 11:39:31 +=started 2024-09-12 11:01:34 +=ended 2024-09-12 11:01:34 =result ok =elapsed 0.0 -=group_time 2.071s +=group_time 2.072s =case timer_simple_SUITE:init_per_group -=logfile timer_simple_suite.init_per_group.19701090.html +=logfile timer_simple_suite.init_per_group.19717826.html =group_props [{name,misc}] -=started 2024-09-11 11:39:31 -=ended 2024-09-11 11:39:31 +=started 2024-09-12 11:01:34 +=ended 2024-09-12 11:01:34 =result ok =elapsed 0.0 =case timer_simple_SUITE:tc =logfile timer_simple_suite.tc.html -=started 2024-09-11 11:39:31 -=ended 2024-09-11 11:39:33 +=started 2024-09-12 11:01:34 +=ended 2024-09-12 11:01:36 =result ok -=elapsed 2.003154 +=elapsed 2.004005 =case timer_simple_SUITE:unexpected1 =logfile timer_simple_suite.unexpected1.html -=started 2024-09-11 11:39:33 -=ended 2024-09-11 11:39:33 +=started 2024-09-12 11:01:36 +=ended 2024-09-12 11:01:36 =result ok -=elapsed 0.601311 +=elapsed 0.601749 =case timer_simple_SUITE:unexpected2 =logfile timer_simple_suite.unexpected2.html -=started 2024-09-11 11:39:33 -=ended 2024-09-11 11:39:34 +=started 2024-09-12 11:01:36 +=ended 2024-09-12 11:01:37 =result ok -=elapsed 0.500262 +=elapsed 0.500756 =case timer_simple_SUITE:unexpected3 =logfile timer_simple_suite.unexpected3.html -=started 2024-09-11 11:39:34 -=ended 2024-09-11 11:39:34 +=started 2024-09-12 11:01:37 +=ended 2024-09-12 11:01:37 =result ok -=elapsed 0.500285 +=elapsed 0.500791 =case timer_simple_SUITE:nonexistent1 =logfile timer_simple_suite.nonexistent1.html -=started 2024-09-11 11:39:34 -=ended 2024-09-11 11:39:35 +=started 2024-09-12 11:01:37 +=ended 2024-09-12 11:01:38 =result ok -=elapsed 1.000193 +=elapsed 1.00077 =case timer_simple_SUITE:nonexistent2 =logfile timer_simple_suite.nonexistent2.html -=started 2024-09-11 11:39:35 -=ended 2024-09-11 11:39:36 +=started 2024-09-12 11:01:38 +=ended 2024-09-12 11:01:39 =result ok -=elapsed 1.00026 +=elapsed 1.000856 =case timer_simple_SUITE:timer_perf =logfile timer_simple_suite.timer_perf.html -=started 2024-09-11 11:39:36 -=ended 2024-09-11 11:40:28 +=started 2024-09-12 11:01:39 +=ended 2024-09-12 11:02:31 =result ok -=elapsed 51.807183 +=elapsed 51.807409 =case timer_simple_SUITE:end_per_group -=logfile timer_simple_suite.end_per_group.19701122.html +=logfile timer_simple_suite.end_per_group.19717858.html =group_props [{name,misc}] -=started 2024-09-11 11:40:28 -=ended 2024-09-11 11:40:28 +=started 2024-09-12 11:02:31 +=ended 2024-09-12 11:02:31 =result ok =elapsed 0.0 -=group_time 57.595s +=group_time 57.601s =case timer_simple_SUITE:end_per_suite =logfile timer_simple_suite.end_per_suite.html -=started 2024-09-11 11:40:28 -=ended 2024-09-11 11:40:28 +=started 2024-09-12 11:02:31 +=ended 2024-09-12 11:02:31 =result ok =elapsed 0.0 -=group_time 109.383s +=group_time 109.389s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19701154.html +=logfile ct_framework.init_per_suite.19717890.html =group_props [{suite,unicode_SUITE}] -=started 2024-09-11 11:40:28 -=ended 2024-09-11 11:40:28 +=started 2024-09-12 11:02:31 +=ended 2024-09-12 11:02:31 =result ok =elapsed 0.0 =case unicode_SUITE:utf8_illegal_sequences_bif =logfile unicode_suite.utf8_illegal_sequences_bif.html -=started 2024-09-11 11:40:28 -=ended 2024-09-11 11:40:34 +=started 2024-09-12 11:02:31 +=ended 2024-09-12 11:02:37 =result ok -=elapsed 6.022421 +=elapsed 6.148404 =case unicode_SUITE:utf16_illegal_sequences_bif =logfile unicode_suite.utf16_illegal_sequences_bif.html -=started 2024-09-11 11:40:34 -=ended 2024-09-11 11:40:36 +=started 2024-09-12 11:02:37 +=ended 2024-09-12 11:02:39 =result ok -=elapsed 2.149119 +=elapsed 2.055694 =case unicode_SUITE:random_lists =logfile unicode_suite.random_lists.html -=started 2024-09-11 11:40:36 -=ended 2024-09-11 11:40:39 +=started 2024-09-12 11:02:39 +=ended 2024-09-12 11:02:42 =result ok -=elapsed 2.498869 +=elapsed 2.531145 =case unicode_SUITE:roundtrips =logfile unicode_suite.roundtrips.html -=started 2024-09-11 11:40:39 -=ended 2024-09-11 11:40:39 +=started 2024-09-12 11:02:42 +=ended 2024-09-12 11:02:43 =result ok -=elapsed 0.42388 +=elapsed 0.430284 =case unicode_SUITE:latin1 =logfile unicode_suite.latin1.html -=started 2024-09-11 11:40:39 -=ended 2024-09-11 11:40:39 +=started 2024-09-12 11:02:43 +=ended 2024-09-12 11:02:43 =result ok -=elapsed 0.003902 +=elapsed 0.003962 =case unicode_SUITE:exceptions =logfile unicode_suite.exceptions.html -=started 2024-09-11 11:40:39 -=ended 2024-09-11 11:40:39 +=started 2024-09-12 11:02:43 +=ended 2024-09-12 11:02:43 =result ok -=elapsed 0.005582 +=elapsed 0.005508 =case unicode_SUITE:binaries_errors_limit =logfile unicode_suite.binaries_errors_limit.html -=started 2024-09-11 11:40:39 -=ended 2024-09-11 11:40:42 +=started 2024-09-12 11:02:43 +=ended 2024-09-12 11:02:45 =result ok -=elapsed 2.11701 +=elapsed 2.011247 =case unicode_SUITE:normalize =logfile unicode_suite.normalize.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:42 +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:45 =result ok -=elapsed 4.39e-4 +=elapsed 3.91e-4 =case ct_framework:init_per_group -=logfile ct_framework.init_per_group.19701186.html +=logfile ct_framework.init_per_group.19717922.html =group_props [{name,binaries_errors},parallel,{suite,unicode_SUITE}] -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:42 +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:45 =result ok -=elapsed 3.9e-5 +=elapsed 3.6e-5 =case unicode_SUITE:ex_binaries_errors_utf8 -=logfile unicode_suite.ex_binaries_errors_utf8.19701218.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:42 +=logfile unicode_suite.ex_binaries_errors_utf8.19717954.html +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:45 =result ok -=elapsed 0.633057 +=elapsed 0.737995 =case unicode_SUITE:ex_binaries_errors_utf16_little -=logfile unicode_suite.ex_binaries_errors_utf16_little.504547.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:44 +=logfile unicode_suite.ex_binaries_errors_utf16_little.19717986.html +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 2.644971 +=elapsed 2.737986 =case unicode_SUITE:ex_binaries_errors_utf16_big -=logfile unicode_suite.ex_binaries_errors_utf16_big.504579.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:44 +=logfile unicode_suite.ex_binaries_errors_utf16_big.19718018.html +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 2.753674 +=elapsed 2.758118 =case unicode_SUITE:ex_binaries_errors_utf32_little -=logfile unicode_suite.ex_binaries_errors_utf32_little.504611.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:44 +=logfile unicode_suite.ex_binaries_errors_utf32_little.19718050.html +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 2.713702 +=elapsed 2.740274 =case unicode_SUITE:ex_binaries_errors_utf32_big -=logfile unicode_suite.ex_binaries_errors_utf32_big.504643.html -=started 2024-09-11 11:40:42 -=ended 2024-09-11 11:40:44 +=logfile unicode_suite.ex_binaries_errors_utf32_big.408387.html +=started 2024-09-12 11:02:45 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 2.529292 +=elapsed 2.368242 =case ct_framework:end_per_group -=logfile ct_framework.end_per_group.19701250.html +=logfile ct_framework.end_per_group.408419.html =group_props [{name,binaries_errors},parallel,{suite,unicode_SUITE}] -=started 2024-09-11 11:40:44 -=ended 2024-09-11 11:40:44 +=started 2024-09-12 11:02:47 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 4.0e-5 -=group_time 2.803s +=elapsed 4.3e-5 +=group_time 2.807s =case unicode_SUITE:huge_illegal_code_points =logfile unicode_suite.huge_illegal_code_points.html -=started 2024-09-11 11:40:44 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:47 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 2.18e-4 +=elapsed 1.8e-4 =case unicode_SUITE:error_info =logfile unicode_suite.error_info.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:47 +=ended 2024-09-12 11:02:47 =result ok -=elapsed 0.002394 +=elapsed 0.002477 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19701282.html +=logfile ct_framework.end_per_suite.408451.html =group_props [{suite,unicode_SUITE}] -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:47 +=ended 2024-09-12 11:02:48 =result ok =elapsed 0.0 -=group_time 16.323s +=group_time 16.296s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19701314.html +=logfile ct_framework.init_per_suite.408483.html =group_props [{suite,unicode_util_SUITE}] -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok =elapsed 0.0 =case unicode_util_SUITE:extra =logfile unicode_util_suite.extra.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 3.0e-6 +=elapsed 4.0e-6 =case unicode_util_SUITE:uppercase =logfile unicode_util_suite.uppercase.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case unicode_util_SUITE:lowercase =logfile unicode_util_suite.lowercase.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case unicode_util_SUITE:titlecase =logfile unicode_util_suite.titlecase.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case unicode_util_SUITE:casefold =logfile unicode_util_suite.casefold.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 2.0e-6 +=elapsed 3.0e-6 =case unicode_util_SUITE:cp =logfile unicode_util_suite.cp.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 9.0e-6 +=elapsed 1.0e-5 =case unicode_util_SUITE:gc =logfile unicode_util_suite.gc.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 0.010958 +=elapsed 0.011133 =case unicode_util_SUITE:nfd =logfile unicode_util_suite.nfd.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 0.089071 +=elapsed 0.093222 =case unicode_util_SUITE:nfc =logfile unicode_util_suite.nfc.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 0.091386 +=elapsed 0.094241 =case unicode_util_SUITE:nfkd =logfile unicode_util_suite.nfkd.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 0.091946 +=elapsed 0.094296 =case unicode_util_SUITE:nfkc =logfile unicode_util_suite.nfkc.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 0.096894 +=elapsed 0.101151 =case unicode_util_SUITE:whitespace =logfile unicode_util_suite.whitespace.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok -=elapsed 1.0e-6 +=elapsed 2.0e-6 =case unicode_util_SUITE:get =logfile unicode_util_suite.get.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:45 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:48 =result ok =elapsed 0.0 =case unicode_util_SUITE:lookup =logfile unicode_util_suite.lookup.html -=started 2024-09-11 11:40:45 -=ended 2024-09-11 11:40:46 +=started 2024-09-12 11:02:48 +=ended 2024-09-12 11:02:49 =result ok -=elapsed 0.254415 +=elapsed 0.272549 =case unicode_util_SUITE:count =logfile unicode_util_suite.count.html -=started 2024-09-11 11:40:46 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:02:49 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 39.694666 +=elapsed 40.016253 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19701346.html +=logfile ct_framework.end_per_suite.19718082.html =group_props [{suite,unicode_util_SUITE}] -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok =elapsed 0.0 -=group_time 40.712s +=group_time 41.075s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19701378.html +=logfile ct_framework.init_per_suite.19718114.html =group_props [{suite,uri_string_SUITE}] -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok =elapsed 0.0 =case uri_string_SUITE:normalize =logfile uri_string_suite.normalize.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.42e-4 +=elapsed 2.07e-4 =case uri_string_SUITE:normalize_map =logfile uri_string_suite.normalize_map.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 9.0e-5 +=elapsed 1.29e-4 =case uri_string_SUITE:normalize_return_map =logfile uri_string_suite.normalize_return_map.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 3.7e-5 +=elapsed 4.9e-5 =case uri_string_SUITE:normalize_negative =logfile uri_string_suite.normalize_negative.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.8e-5 +=elapsed 3.7e-5 =case uri_string_SUITE:normalize_binary_pct_encoded_userinfo =logfile uri_string_suite.normalize_binary_pct_encoded_userinfo.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 7.1e-5 +=elapsed 9.7e-5 =case uri_string_SUITE:normalize_binary_pct_encoded_query =logfile uri_string_suite.normalize_binary_pct_encoded_query.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.7e-5 +=elapsed 3.8e-5 =case uri_string_SUITE:normalize_binary_pct_encoded_fragment =logfile uri_string_suite.normalize_binary_pct_encoded_fragment.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:25 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 3.8e-5 +=elapsed 4.5e-5 =case uri_string_SUITE:normalize_pct_encoded_userinfo =logfile uri_string_suite.normalize_pct_encoded_userinfo.html -=started 2024-09-11 11:41:25 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 9.0e-5 +=elapsed 1.26e-4 =case uri_string_SUITE:normalize_pct_encoded_query =logfile uri_string_suite.normalize_pct_encoded_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok =elapsed 4.7e-5 =case uri_string_SUITE:normalize_pct_encoded_fragment =logfile uri_string_suite.normalize_pct_encoded_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.5e-5 +=elapsed 3.2e-5 =case uri_string_SUITE:normalize_pct_encoded_negative =logfile uri_string_suite.normalize_pct_encoded_negative.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.8e-5 +=elapsed 3.6e-5 =case uri_string_SUITE:parse_binary_scheme =logfile uri_string_suite.parse_binary_scheme.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.7e-5 +=elapsed 2.2e-5 =case uri_string_SUITE:parse_binary_userinfo =logfile uri_string_suite.parse_binary_userinfo.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.7e-5 +=elapsed 2.3e-5 =case uri_string_SUITE:parse_binary_pct_encoded_userinfo =logfile uri_string_suite.parse_binary_pct_encoded_userinfo.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.9e-5 +=elapsed 2.6e-5 =case uri_string_SUITE:parse_binary_host =logfile uri_string_suite.parse_binary_host.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.1e-5 +=elapsed 1.4e-5 =case uri_string_SUITE:parse_binary_host_ipv4 =logfile uri_string_suite.parse_binary_host_ipv4.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.7e-5 +=elapsed 2.3e-5 =case uri_string_SUITE:parse_binary_host_ipv6 =logfile uri_string_suite.parse_binary_host_ipv6.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.2e-5 +=elapsed 2.9e-5 =case uri_string_SUITE:parse_binary_port =logfile uri_string_suite.parse_binary_port.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.9e-5 +=elapsed 2.4e-5 =case uri_string_SUITE:parse_binary_path =logfile uri_string_suite.parse_binary_path.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.1e-5 +=elapsed 1.6e-5 =case uri_string_SUITE:parse_binary_query =logfile uri_string_suite.parse_binary_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.3e-5 +=elapsed 3.1e-5 =case uri_string_SUITE:parse_binary_pct_encoded_query =logfile uri_string_suite.parse_binary_pct_encoded_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 7.0e-6 +=elapsed 9.0e-6 =case uri_string_SUITE:parse_binary_fragment =logfile uri_string_suite.parse_binary_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.7e-5 +=elapsed 2.4e-5 =case uri_string_SUITE:parse_binary_pct_encoded_fragment =logfile uri_string_suite.parse_binary_pct_encoded_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case uri_string_SUITE:parse_scheme =logfile uri_string_suite.parse_scheme.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.8e-5 +=elapsed 2.4e-5 =case uri_string_SUITE:parse_userinfo =logfile uri_string_suite.parse_userinfo.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.9e-5 +=elapsed 2.5e-5 =case uri_string_SUITE:parse_pct_encoded_userinfo =logfile uri_string_suite.parse_pct_encoded_userinfo.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 3.1e-5 +=elapsed 4.3e-5 =case uri_string_SUITE:parse_host =logfile uri_string_suite.parse_host.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 8.0e-6 +=elapsed 1.1e-5 =case uri_string_SUITE:parse_host_ipv4 =logfile uri_string_suite.parse_host_ipv4.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.5e-5 +=elapsed 3.6e-5 =case uri_string_SUITE:parse_host_ipv6 =logfile uri_string_suite.parse_host_ipv6.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.9e-5 +=elapsed 3.8e-5 =case uri_string_SUITE:parse_port =logfile uri_string_suite.parse_port.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 2.2e-5 +=elapsed 2.9e-5 =case uri_string_SUITE:parse_path =logfile uri_string_suite.parse_path.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.2e-5 +=elapsed 1.6e-5 =case uri_string_SUITE:parse_query =logfile uri_string_suite.parse_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 3.0e-5 +=elapsed 4.1e-5 =case uri_string_SUITE:parse_pct_encoded_query =logfile uri_string_suite.parse_pct_encoded_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.3e-5 +=elapsed 1.7e-5 =case uri_string_SUITE:parse_fragment =logfile uri_string_suite.parse_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 3.3e-5 +=elapsed 4.6e-5 =case uri_string_SUITE:parse_pct_encoded_fragment =logfile uri_string_suite.parse_pct_encoded_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.7e-5 +=elapsed 2.2e-5 =case uri_string_SUITE:parse_list =logfile uri_string_suite.parse_list.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:29 =result ok -=elapsed 1.2e-5 +=elapsed 1.6e-5 =case uri_string_SUITE:parse_binary =logfile uri_string_suite.parse_binary.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:29 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 9.0e-6 +=elapsed 1.2e-5 =case uri_string_SUITE:parse_mixed =logfile uri_string_suite.parse_mixed.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 6.0e-6 =case uri_string_SUITE:parse_relative =logfile uri_string_suite.parse_relative.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 5.0e-6 =case uri_string_SUITE:parse_special =logfile uri_string_suite.parse_special.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 3.7e-5 +=elapsed 3.8e-5 =case uri_string_SUITE:parse_special2 =logfile uri_string_suite.parse_special2.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.7e-5 +=elapsed 1.8e-5 =case uri_string_SUITE:parse_negative =logfile uri_string_suite.parse_negative.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.9e-5 +=elapsed 2.0e-5 =case uri_string_SUITE:recompose_fragment =logfile uri_string_suite.recompose_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 7.0e-6 +=elapsed 8.0e-6 =case uri_string_SUITE:recompose_parse_fragment =logfile uri_string_suite.recompose_parse_fragment.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 1.5e-5 =case uri_string_SUITE:recompose_query =logfile uri_string_suite.recompose_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 1.6e-5 =case uri_string_SUITE:recompose_parse_query =logfile uri_string_suite.recompose_parse_query.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.4e-5 +=elapsed 3.3e-5 =case uri_string_SUITE:recompose_path =logfile uri_string_suite.recompose_path.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.2e-5 +=elapsed 2.3e-5 =case uri_string_SUITE:recompose_parse_path =logfile uri_string_suite.recompose_parse_path.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 2.1e-5 =case uri_string_SUITE:recompose_autogen =logfile uri_string_suite.recompose_autogen.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 0.009992 +=elapsed 0.009854 =case uri_string_SUITE:parse_recompose_autogen =logfile uri_string_suite.parse_recompose_autogen.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 0.014147 +=elapsed 0.014198 =case uri_string_SUITE:resolve_normal_examples =logfile uri_string_suite.resolve_normal_examples.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:26 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.95e-4 +=elapsed 1.87e-4 =case uri_string_SUITE:resolve_abnormal_examples =logfile uri_string_suite.resolve_abnormal_examples.html -=started 2024-09-11 11:41:26 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.51e-4 +=elapsed 1.89e-4 =case uri_string_SUITE:resolve_base_uri =logfile uri_string_suite.resolve_base_uri.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 5.3e-5 +=elapsed 4.6e-5 =case uri_string_SUITE:resolve_return_map =logfile uri_string_suite.resolve_return_map.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 1.9e-5 =case uri_string_SUITE:transcode_basic =logfile uri_string_suite.transcode_basic.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 3.3e-5 +=elapsed 2.6e-5 =case uri_string_SUITE:transcode_options =logfile uri_string_suite.transcode_options.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.4e-5 +=elapsed 1.9e-5 =case uri_string_SUITE:transcode_mixed =logfile uri_string_suite.transcode_mixed.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.5e-5 +=elapsed 2.0e-5 =case uri_string_SUITE:transcode_negative =logfile uri_string_suite.transcode_negative.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 4.0e-6 =case uri_string_SUITE:compose_query =logfile uri_string_suite.compose_query.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 3.5e-5 +=elapsed 3.0e-5 =case uri_string_SUITE:compose_query_latin1 =logfile uri_string_suite.compose_query_latin1.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 5.9e-5 +=elapsed 4.9e-5 =case uri_string_SUITE:compose_query_negative =logfile uri_string_suite.compose_query_negative.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.0e-6 +=elapsed 3.0e-6 =case uri_string_SUITE:dissect_query =logfile uri_string_suite.dissect_query.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 9.3e-5 +=elapsed 9.2e-5 =case uri_string_SUITE:dissect_query_negative =logfile uri_string_suite.dissect_query_negative.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.8e-5 +=elapsed 1.4e-5 =case uri_string_SUITE:interop_query_latin1 =logfile uri_string_suite.interop_query_latin1.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 3.1e-5 +=elapsed 5.0e-5 =case uri_string_SUITE:interop_query_utf8 =logfile uri_string_suite.interop_query_utf8.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.7e-5 +=elapsed 2.2e-5 =case uri_string_SUITE:regression_parse =logfile uri_string_suite.regression_parse.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.5e-5 +=elapsed 2.2e-5 =case uri_string_SUITE:regression_recompose =logfile uri_string_suite.regression_recompose.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.1e-5 +=elapsed 2.3e-5 =case uri_string_SUITE:regression_normalize =logfile uri_string_suite.regression_normalize.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.45e-4 +=elapsed 1.12e-4 =case uri_string_SUITE:recompose_host_relative_path =logfile uri_string_suite.recompose_host_relative_path.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.1e-5 +=elapsed 1.0e-5 =case uri_string_SUITE:recompose_host_absolute_path =logfile uri_string_suite.recompose_host_absolute_path.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 1.6e-5 +=elapsed 1.2e-5 =case uri_string_SUITE:quote =logfile uri_string_suite.quote.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok -=elapsed 2.33e-4 +=elapsed 1.67e-4 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19701410.html +=logfile ct_framework.end_per_suite.19718146.html =group_props [{suite,uri_string_SUITE}] -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:27 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:30 =result ok =elapsed 0.0 -=group_time 1.656s +=group_time 1.676s =case uri_string_property_test_SUITE:init_per_suite =logfile uri_string_property_test_suite.init_per_suite.html -=started 2024-09-11 11:41:27 -=ended 2024-09-11 11:41:28 +=started 2024-09-12 11:03:30 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 1.294834 +=elapsed 1.288106 =case uri_string_property_test_SUITE:recompose =logfile uri_string_property_test_suite.recompose.html -=started 2024-09-11 11:41:28 -=ended 2024-09-11 11:41:28 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.072139 +=elapsed 0.07361 =case uri_string_property_test_SUITE:normalize =logfile uri_string_property_test_suite.normalize.html -=started 2024-09-11 11:41:28 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.091759 +=elapsed 0.08048 =case uri_string_property_test_SUITE:end_per_suite =logfile uri_string_property_test_suite.end_per_suite.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok =elapsed 0.0 -=group_time 1.555s +=group_time 1.535s =case win32reg_SUITE:init_per_suite =logfile win32reg_suite.init_per_suite.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result skipped: "Doesn't run on UNIX." === *** SKIPPED {win32reg_SUITE,init_per_suite} *** === =case win32reg_SUITE:long -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2315 {win32reg_SUITE,long} *** === =case win32reg_SUITE:evil_write -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2316 {win32reg_SUITE,evil_write} *** === =case win32reg_SUITE:read_write_default_1 -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2317 {win32reg_SUITE,read_write_default_1} *** === =case win32reg_SUITE:read_write_default_2 -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2318 {win32reg_SUITE,read_write_default_2} *** === =case win32reg_SUITE:delete_key -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2319 {win32reg_SUITE,delete_key} *** === =case win32reg_SUITE:up_and_away -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping test case #2320 {win32reg_SUITE,up_and_away} *** === =case win32reg_SUITE:end_per_suite -=started 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 =result skipped: Doesn't run on UNIX. === *** Skipping {win32reg_SUITE,end_per_suite} *** =case y2k_SUITE:init_per_suite =logfile y2k_suite.init_per_suite.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok =elapsed 0.0 =case y2k_SUITE:date_1999_01_01 =logfile y2k_suite.date_1999_01_01.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 2.3e-5 +=elapsed 3.6e-5 =case y2k_SUITE:date_1999_02_28 =logfile y2k_suite.date_1999_02_28.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 2.2e-5 +=elapsed 2.1e-5 =case y2k_SUITE:date_1999_09_09 =logfile y2k_suite.date_1999_09_09.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 2.2e-5 +=elapsed 1.8e-5 =case y2k_SUITE:date_2000_01_01 =logfile y2k_suite.date_2000_01_01.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 3.8e-5 +=elapsed 3.1e-5 =case y2k_SUITE:date_2000_02_29 =logfile y2k_suite.date_2000_02_29.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 3.8e-5 +=elapsed 3.1e-5 =case y2k_SUITE:date_2001_01_01 =logfile y2k_suite.date_2001_01_01.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 2.3e-5 +=elapsed 1.8e-5 =case y2k_SUITE:date_2001_02_29 =logfile y2k_suite.date_2001_02_29.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 2.3e-5 +=elapsed 1.9e-5 =case y2k_SUITE:date_2004_02_29 =logfile y2k_suite.date_2004_02_29.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 3.8e-5 +=elapsed 3.1e-5 =case y2k_SUITE:end_per_suite =logfile y2k_suite.end_per_suite.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok =elapsed 0.0 -=group_time 0.221s +=group_time 0.213s =case zip_SUITE:init_per_suite =logfile zip_suite.init_per_suite.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.03347 +=elapsed 0.033977 =case zip_SUITE:borderline =logfile zip_suite.borderline.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.110592 +=elapsed 0.107331 =case zip_SUITE:atomic =logfile zip_suite.atomic.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.004327 +=elapsed 0.004092 =case zip_SUITE:bad_zip =logfile zip_suite.bad_zip.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.001571 +=elapsed 0.001156 =case zip_SUITE:unzip_from_binary =logfile zip_suite.unzip_from_binary.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 0.003762 +=elapsed 0.004113 =case zip_SUITE:unzip_to_binary =logfile zip_suite.unzip_to_binary.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:32 =result ok -=elapsed 7.63e-4 +=elapsed 7.71e-4 =case zip_SUITE:zip_to_binary =logfile zip_suite.zip_to_binary.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:32 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.001057 +=elapsed 8.12e-4 =case zip_SUITE:unzip_options =logfile zip_suite.unzip_options.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.004253 +=elapsed 0.003307 =case zip_SUITE:zip_options =logfile zip_suite.zip_options.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.002839 +=elapsed 0.002836 =case zip_SUITE:list_dir_options =logfile zip_suite.list_dir_options.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 5.01e-4 +=elapsed 2.52e-4 =case zip_SUITE:aliases =logfile zip_suite.aliases.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 1.52e-4 +=elapsed 1.3e-4 =case zip_SUITE:zip_api =logfile zip_suite.zip_api.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.003159 +=elapsed 0.003187 =case zip_SUITE:open_leak =logfile zip_suite.open_leak.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 3.41e-4 +=elapsed 1.86e-4 =case zip_SUITE:unzip_jar =logfile zip_suite.unzip_jar.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.00255 +=elapsed 0.00156 =case zip_SUITE:compress_control =logfile zip_suite.compress_control.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.043547 +=elapsed 0.028913 =case zip_SUITE:foldl =logfile zip_suite.foldl.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 7.39e-4 +=elapsed 7.27e-4 =case zip_SUITE:unzip_traversal_exploit =logfile zip_suite.unzip_traversal_exploit.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:29 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:33 =result ok -=elapsed 0.008072 +=elapsed 0.007239 =case zip_SUITE:fd_leak =logfile zip_suite.fd_leak.html -=started 2024-09-11 11:41:29 -=ended 2024-09-11 11:41:31 +=started 2024-09-12 11:03:33 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 1.811028 +=elapsed 1.885194 =case zip_SUITE:unicode =logfile zip_suite.unicode.html -=started 2024-09-11 11:41:31 -=ended 2024-09-11 11:41:31 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 0.11383 +=elapsed 0.117634 =case zip_SUITE:test_zip_dir =logfile zip_suite.test_zip_dir.html -=started 2024-09-11 11:41:31 -=ended 2024-09-11 11:41:31 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 0.003042 +=elapsed 0.002824 =case zip_SUITE:explicit_file_info =logfile zip_suite.explicit_file_info.html -=started 2024-09-11 11:41:31 -=ended 2024-09-11 11:41:32 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 5.9e-5 +=elapsed 5.7e-5 =case zip_SUITE:init_per_group =logfile zip_suite.init_per_group.html =group_props [{name,zip_group}] -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:32 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 7.0e-6 +=elapsed 6.0e-6 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701442.html +=logfile zip_suite.init_per_group.19718178.html =group_props [{name,zip}] -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:32 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 3.38e-4 +=elapsed 3.49e-4 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701474.html +=logfile zip_suite.init_per_group.19718210.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:32 +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 3.56e-4 +=elapsed 2.06e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.504675.html -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:32 +=logfile zip_suite.mode.408547.html +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 0.008756 +=elapsed 0.00875 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.504707.html -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:34 +=logfile zip_suite.basic_timestamp.408579.html +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 2.010894 +=elapsed 2.013023 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.504739.html -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:34 +=logfile zip_suite.extended_timestamp.408611.html +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 2.01225 +=elapsed 2.012875 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.504771.html -=started 2024-09-11 11:41:32 -=ended 2024-09-11 11:41:32 +=logfile zip_suite.uid_gid.408643.html +=started 2024-09-12 11:03:35 +=ended 2024-09-12 11:03:35 =result ok -=elapsed 0.008079 +=elapsed 0.00763 =case zip_SUITE:end_per_group =logfile zip_suite.end_per_group.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:34 +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 6.09e-4 -=group_time 2.062s +=elapsed 9.3e-4 +=group_time 2.064s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701506.html +=logfile zip_suite.init_per_group.408675.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:34 +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 1.28e-4 +=elapsed 1.23e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.19701538.html -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:34 +=logfile zip_suite.mode.408707.html +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 0.006631 +=elapsed 0.006493 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.19701570.html -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:36 +=logfile zip_suite.basic_timestamp.408739.html +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 2.009973 +=elapsed 2.010071 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.19701602.html -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:36 +=logfile zip_suite.extended_timestamp.408771.html +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 2.008746 +=elapsed 2.009845 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.19701634.html -=started 2024-09-11 11:41:34 -=ended 2024-09-11 11:41:34 +=logfile zip_suite.uid_gid.408803.html +=started 2024-09-12 11:03:37 +=ended 2024-09-12 11:03:37 =result ok -=elapsed 0.004634 +=elapsed 0.006257 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19701666.html +=logfile zip_suite.end_per_group.426084.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:36 +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 8.93e-4 -=group_time 2.060s +=elapsed 9.2e-4 +=group_time 2.061s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701698.html +=logfile zip_suite.init_per_group.426116.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:36 +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 1.48e-4 +=elapsed 1.5e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.19701730.html -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:36 +=logfile zip_suite.mode.426148.html +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 0.005303 +=elapsed 0.005927 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.19701762.html -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:38 +=logfile zip_suite.basic_timestamp.426180.html +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 2.00888 +=elapsed 2.010633 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.19701794.html -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:38 +=logfile zip_suite.extended_timestamp.426212.html +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 2.009976 +=elapsed 2.010253 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.504803.html -=started 2024-09-11 11:41:36 -=ended 2024-09-11 11:41:36 +=logfile zip_suite.uid_gid.426244.html +=started 2024-09-12 11:03:39 +=ended 2024-09-12 11:03:39 =result ok -=elapsed 0.004225 +=elapsed 0.004476 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.504835.html +=logfile zip_suite.end_per_group.426276.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 7.55e-4 -=group_time 2.060s +=elapsed 9.57e-4 +=group_time 2.061s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19701826.html +=logfile zip_suite.end_per_group.426308.html =group_props [{name,zip}] -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 5.8e-4 -=group_time 6.276s +=elapsed 5.77e-4 +=group_time 6.282s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701858.html +=logfile zip_suite.init_per_group.426340.html =group_props [{name,ezip}] -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 1.29e-4 +=elapsed 1.88e-4 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701890.html +=logfile zip_suite.init_per_group.426372.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 2.76e-4 +=elapsed 2.27e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.19701922.html -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=logfile zip_suite.mode.426404.html +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 0.00591 +=elapsed 0.006201 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.19701954.html -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:40 +=logfile zip_suite.basic_timestamp.426436.html +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 2.009219 +=elapsed 2.009614 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.504867.html -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:40 +=logfile zip_suite.extended_timestamp.426468.html +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 2.01004 +=elapsed 2.009803 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.504899.html -=started 2024-09-11 11:41:38 -=ended 2024-09-11 11:41:38 +=logfile zip_suite.uid_gid.426500.html +=started 2024-09-12 11:03:41 +=ended 2024-09-12 11:03:41 =result ok -=elapsed 0.004949 +=elapsed 0.005831 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.504931.html +=logfile zip_suite.end_per_group.19718242.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:40 +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 8.06e-4 -=group_time 2.060s +=elapsed 6.75e-4 +=group_time 2.061s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.504963.html +=logfile zip_suite.init_per_group.19718274.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:40 +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 1.39e-4 +=elapsed 1.47e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.504995.html -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:40 +=logfile zip_suite.mode.19718306.html +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 0.002883 +=elapsed 0.003929 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.505027.html -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:42 +=logfile zip_suite.basic_timestamp.19718370.html +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:45 =result ok -=elapsed 2.007081 +=elapsed 2.009314 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.505059.html -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:42 +=logfile zip_suite.extended_timestamp.19718338.html +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:45 =result ok -=elapsed 2.007632 +=elapsed 2.008671 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.505091.html -=started 2024-09-11 11:41:40 -=ended 2024-09-11 11:41:40 +=logfile zip_suite.uid_gid.19718402.html +=started 2024-09-12 11:03:43 +=ended 2024-09-12 11:03:43 =result ok -=elapsed 0.001589 +=elapsed 0.003003 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.505123.html +=logfile zip_suite.end_per_group.426532.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:42 +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:45 =result ok -=elapsed 7.21e-4 -=group_time 2.059s +=elapsed 7.27e-4 +=group_time 2.060s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19701986.html +=logfile zip_suite.init_per_group.426564.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:42 +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:45 =result ok =elapsed 1.58e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.505155.html -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:42 +=logfile zip_suite.mode.426596.html +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:45 =result ok -=elapsed 0.003387 +=elapsed 0.003916 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.505187.html -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:44 +=logfile zip_suite.basic_timestamp.426628.html +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:47 =result ok -=elapsed 2.006366 +=elapsed 2.006595 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.505219.html -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:44 +=logfile zip_suite.extended_timestamp.426660.html +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:47 =result ok -=elapsed 2.006017 +=elapsed 2.006987 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.19702018.html -=started 2024-09-11 11:41:42 -=ended 2024-09-11 11:41:42 +=logfile zip_suite.uid_gid.408835.html +=started 2024-09-12 11:03:45 +=ended 2024-09-12 11:03:45 =result ok -=elapsed 0.001794 +=elapsed 0.003169 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702050.html +=logfile zip_suite.end_per_group.408867.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=started 2024-09-12 11:03:47 +=ended 2024-09-12 11:03:47 =result ok -=elapsed 6.59e-4 -=group_time 2.058s +=elapsed 7.35e-4 +=group_time 2.059s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702082.html +=logfile zip_suite.end_per_group.408899.html =group_props [{name,ezip}] -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=started 2024-09-12 11:03:47 +=ended 2024-09-12 11:03:48 =result ok -=elapsed 5.33e-4 -=group_time 6.273s +=elapsed 6.97e-4 +=group_time 6.275s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702114.html +=logfile zip_suite.init_per_group.408931.html =group_props [{name,emzip}] -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:48 =result ok -=elapsed 1.56e-4 +=elapsed 2.76e-4 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702146.html +=logfile zip_suite.init_per_group.408963.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:48 =result ok -=elapsed 2.74e-4 +=elapsed 3.16e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.505251.html -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=logfile zip_suite.mode.408995.html +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:48 =result ok -=elapsed 0.005143 +=elapsed 0.006655 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.505283.html -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:46 +=logfile zip_suite.basic_timestamp.409027.html +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 2.010651 +=elapsed 2.009878 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.505315.html -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:46 +=logfile zip_suite.extended_timestamp.409059.html +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 2.010007 +=elapsed 2.010535 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.505347.html -=started 2024-09-11 11:41:44 -=ended 2024-09-11 11:41:44 +=logfile zip_suite.uid_gid.19718434.html +=started 2024-09-12 11:03:48 +=ended 2024-09-12 11:03:48 =result ok -=elapsed 0.004795 +=elapsed 0.005937 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702178.html +=logfile zip_suite.end_per_group.19718466.html =group_props [{name,unzip},parallel] -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:46 +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 8.15e-4 -=group_time 2.060s +=elapsed 7.59e-4 +=group_time 2.063s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.398596.html +=logfile zip_suite.init_per_group.19718498.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:46 +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 1.91e-4 +=elapsed 1.71e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.398628.html -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:46 +=logfile zip_suite.mode.19718530.html +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 0.004319 +=elapsed 0.004305 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.398660.html -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:48 +=logfile zip_suite.basic_timestamp.426724.html +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 2.007758 +=elapsed 2.008902 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.398692.html -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:48 +=logfile zip_suite.extended_timestamp.426756.html +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 2.006731 +=elapsed 2.008962 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.398724.html -=started 2024-09-11 11:41:46 -=ended 2024-09-11 11:41:46 +=logfile zip_suite.uid_gid.426692.html +=started 2024-09-12 11:03:50 +=ended 2024-09-12 11:03:50 =result ok -=elapsed 0.002188 +=elapsed 0.002656 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.398756.html +=logfile zip_suite.end_per_group.426788.html =group_props [{name,unezip},parallel] -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:48 +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 6.91e-4 -=group_time 2.058s +=elapsed 0.001072 +=group_time 2.063s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.398788.html +=logfile zip_suite.init_per_group.429029.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:48 +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 1.41e-4 +=elapsed 1.55e-4 =case zip_SUITE:mode -=logfile zip_suite.mode.19702210.html -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:48 +=logfile zip_suite.mode.19718594.html +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 0.003407 +=elapsed 0.003973 =case zip_SUITE:basic_timestamp -=logfile zip_suite.basic_timestamp.398820.html -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:50 +=logfile zip_suite.basic_timestamp.19718562.html +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:54 =result ok -=elapsed 2.007142 +=elapsed 2.006516 =case zip_SUITE:extended_timestamp -=logfile zip_suite.extended_timestamp.19702242.html -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:50 +=logfile zip_suite.extended_timestamp.19718658.html +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:54 =result ok -=elapsed 2.00696 +=elapsed 2.006455 =case zip_SUITE:uid_gid -=logfile zip_suite.uid_gid.19702274.html -=started 2024-09-11 11:41:48 -=ended 2024-09-11 11:41:48 +=logfile zip_suite.uid_gid.19718626.html +=started 2024-09-12 11:03:52 +=ended 2024-09-12 11:03:52 =result ok -=elapsed 0.002098 +=elapsed 0.00309 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702306.html +=logfile zip_suite.end_per_group.19718690.html =group_props [{name,unemzip},parallel] -=started 2024-09-11 11:41:50 -=ended 2024-09-11 11:41:50 +=started 2024-09-12 11:03:54 +=ended 2024-09-12 11:03:54 =result ok -=elapsed 7.99e-4 -=group_time 2.059s +=elapsed 7.32e-4 +=group_time 2.060s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702338.html +=logfile zip_suite.end_per_group.19718722.html =group_props [{name,emzip}] -=started 2024-09-11 11:41:50 -=ended 2024-09-11 11:41:50 +=started 2024-09-12 11:03:54 +=ended 2024-09-12 11:03:54 =result ok -=elapsed 6.68e-4 -=group_time 6.272s +=elapsed 6.56e-4 +=group_time 6.283s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702370.html +=logfile zip_suite.end_per_group.429061.html =group_props [{name,zip_group}] -=started 2024-09-11 11:41:50 -=ended 2024-09-11 11:41:50 +=started 2024-09-12 11:03:54 +=ended 2024-09-12 11:03:54 =result ok -=elapsed 0.003588 -=group_time 18.915s +=elapsed 0.003754 +=group_time 18.934s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702402.html +=logfile zip_suite.init_per_group.429093.html =group_props [{name,zip64_group}] -=started 2024-09-11 11:41:50 -=ended 2024-09-11 11:41:58 +=started 2024-09-12 11:03:54 +=ended 2024-09-12 11:04:02 =result ok -=elapsed 7.950193 +=elapsed 7.928808 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702434.html +=logfile zip_suite.init_per_group.19718754.html =group_props [{name,z64_zip},sequence] -=started 2024-09-11 11:41:58 -=ended 2024-09-11 11:41:58 +=started 2024-09-12 11:04:02 +=ended 2024-09-12 11:04:02 =result ok -=elapsed 3.08e-4 +=elapsed 2.79e-4 =case zip_SUITE:zip64_central_headers =logfile zip_suite.zip64_central_headers.html -=started 2024-09-11 11:41:58 -=ended 2024-09-11 11:43:09 +=started 2024-09-12 11:04:02 +=ended 2024-09-12 11:05:15 =result ok -=elapsed 70.090771 +=elapsed 73.310662 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702466.html +=logfile zip_suite.init_per_group.19718786.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:43:09 -=ended 2024-09-11 11:43:09 +=started 2024-09-12 11:05:15 +=ended 2024-09-12 11:05:15 =result ok -=elapsed 0.002145 +=elapsed 0.046473 =case zip_SUITE:unzip64_central_headers =logfile zip_suite.unzip64_central_headers.html -=started 2024-09-11 11:43:09 -=ended 2024-09-11 11:44:47 +=started 2024-09-12 11:05:15 +=ended 2024-09-12 11:06:59 =result ok -=elapsed 98.11681 +=elapsed 103.992677 =case zip_SUITE:zip64_central_directory =logfile zip_suite.zip64_central_directory.html -=started 2024-09-11 11:44:47 -=ended 2024-09-11 11:45:02 +=started 2024-09-12 11:06:59 +=ended 2024-09-12 11:07:16 =result ok -=elapsed 10.67022 +=elapsed 10.131502 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702498.html +=logfile zip_suite.end_per_group.19718818.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:45:02 -=ended 2024-09-11 11:45:02 +=started 2024-09-12 11:07:16 +=ended 2024-09-12 11:07:16 =result ok -=elapsed 4.27e-4 -=group_time 113.530s +=elapsed 4.97e-4 +=group_time 120.307s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702530.html +=logfile zip_suite.init_per_group.19718850.html =group_props [{name,z64_unezip}] -=started 2024-09-11 11:45:02 -=ended 2024-09-11 11:45:02 +=started 2024-09-12 11:07:16 +=ended 2024-09-12 11:07:16 =result ok -=elapsed 1.18e-4 +=elapsed 1.99e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19702562.html -=started 2024-09-11 11:45:02 -=ended 2024-09-11 11:46:17 +=logfile zip_suite.unzip64_central_headers.19718882.html +=started 2024-09-12 11:07:16 +=ended 2024-09-12 11:08:27 =result ok -=elapsed 75.188508 +=elapsed 71.33177 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.19702594.html -=started 2024-09-11 11:46:17 -=ended 2024-09-11 11:46:34 +=logfile zip_suite.zip64_central_directory.19718914.html +=started 2024-09-12 11:08:27 +=ended 2024-09-12 11:08:50 =result ok -=elapsed 11.900445 +=elapsed 15.915992 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19702626.html +=logfile zip_suite.end_per_group.19718946.html =group_props [{name,z64_unezip}] -=started 2024-09-11 11:46:34 -=ended 2024-09-11 11:46:34 +=started 2024-09-12 11:08:50 +=ended 2024-09-12 11:08:50 =result ok -=elapsed 5.74e-4 -=group_time 91.635s +=elapsed 5.92e-4 +=group_time 94.079s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19702658.html +=logfile zip_suite.init_per_group.19718978.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 11:46:34 -=ended 2024-09-11 11:46:34 +=started 2024-09-12 11:08:50 +=ended 2024-09-12 11:08:50 =result ok -=elapsed 1.41e-4 +=elapsed 1.74e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19702690.html -=started 2024-09-11 11:46:34 -=ended 2024-09-11 11:47:53 +=logfile zip_suite.unzip64_central_headers.19719010.html +=started 2024-09-12 11:08:50 +=ended 2024-09-12 11:10:22 =result ok -=elapsed 79.521362 +=elapsed 91.950015 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.19703138.html -=started 2024-09-11 11:47:53 -=ended 2024-09-11 11:48:11 +=logfile zip_suite.zip64_central_directory.409123.html +=started 2024-09-12 11:10:22 +=ended 2024-09-12 11:10:41 =result ok -=elapsed 12.72571 +=elapsed 14.802929 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19703234.html +=logfile zip_suite.end_per_group.19719458.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 11:48:11 -=ended 2024-09-11 11:48:11 +=started 2024-09-12 11:10:41 +=ended 2024-09-12 11:10:41 =result ok -=elapsed 0.001032 -=group_time 96.852s +=elapsed 6.87e-4 +=group_time 111.783s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19703266.html +=logfile zip_suite.end_per_group.19719490.html =group_props [{name,z64_zip},sequence] -=started 2024-09-11 11:48:11 -=ended 2024-09-11 11:48:11 +=started 2024-09-12 11:10:41 +=ended 2024-09-12 11:10:42 =result ok -=elapsed 0.600516 -=group_time 372.231s +=elapsed 0.490496 +=group_time 399.678s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19703298.html +=logfile zip_suite.init_per_group.19719522.html =group_props [{name,z64_ezip},sequence] -=started 2024-09-11 11:48:11 -=ended 2024-09-11 11:48:11 +=started 2024-09-12 11:10:42 +=ended 2024-09-12 11:10:42 =result ok -=elapsed 8.3e-4 +=elapsed 8.11e-4 =case zip_SUITE:zip64_central_headers -=logfile zip_suite.zip64_central_headers.19703330.html -=started 2024-09-11 11:48:11 -=ended 2024-09-11 11:49:37 +=logfile zip_suite.zip64_central_headers.19719554.html +=started 2024-09-12 11:10:42 +=ended 2024-09-12 11:12:08 =result ok -=elapsed 85.773219 +=elapsed 86.386017 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19703362.html +=logfile zip_suite.init_per_group.19719586.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:49:37 -=ended 2024-09-11 11:49:37 +=started 2024-09-12 11:12:09 +=ended 2024-09-12 11:12:09 =result ok -=elapsed 4.21e-4 +=elapsed 2.64e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19703394.html -=started 2024-09-11 11:49:37 -=ended 2024-09-11 11:51:34 +=logfile zip_suite.unzip64_central_headers.19719618.html +=started 2024-09-12 11:12:09 +=ended 2024-09-12 11:14:07 =result ok -=elapsed 117.172828 +=elapsed 118.054498 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.505379.html -=started 2024-09-11 11:51:34 -=ended 2024-09-11 11:51:57 +=logfile zip_suite.zip64_central_directory.19719650.html +=started 2024-09-12 11:14:07 +=ended 2024-09-12 11:14:38 =result ok -=elapsed 18.128642 +=elapsed 25.373902 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19703426.html +=logfile zip_suite.end_per_group.19719682.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:51:57 -=ended 2024-09-11 11:51:57 +=started 2024-09-12 11:14:38 +=ended 2024-09-12 11:14:38 =result ok -=elapsed 6.65e-4 -=group_time 139.914s +=elapsed 0.001252 +=group_time 149.156s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19703458.html +=logfile zip_suite.init_per_group.19719714.html =group_props [{name,z64_unezip}] -=started 2024-09-11 11:51:57 -=ended 2024-09-11 11:51:57 +=started 2024-09-12 11:14:38 +=ended 2024-09-12 11:14:38 =result ok -=elapsed 1.84e-4 +=elapsed 1.91e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19703490.html -=started 2024-09-11 11:51:57 -=ended 2024-09-11 11:53:21 +=logfile zip_suite.unzip64_central_headers.19719746.html +=started 2024-09-12 11:14:38 +=ended 2024-09-12 11:16:02 =result ok -=elapsed 83.925649 +=elapsed 83.831855 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.19703522.html -=started 2024-09-11 11:53:21 -=ended 2024-09-11 11:53:43 +=logfile zip_suite.zip64_central_directory.19719778.html +=started 2024-09-12 11:16:02 +=ended 2024-09-12 11:16:24 =result ok -=elapsed 17.446084 +=elapsed 17.084737 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19703554.html +=logfile zip_suite.end_per_group.19719810.html =group_props [{name,z64_unezip}] -=started 2024-09-11 11:53:43 -=ended 2024-09-11 11:53:43 +=started 2024-09-12 11:16:24 +=ended 2024-09-12 11:16:24 =result ok -=elapsed 8.97e-4 -=group_time 105.933s +=elapsed 6.72e-4 +=group_time 105.735s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19703586.html +=logfile zip_suite.init_per_group.19719842.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 11:53:43 -=ended 2024-09-11 11:53:43 +=started 2024-09-12 11:16:24 +=ended 2024-09-12 11:16:24 =result ok -=elapsed 4.08e-4 +=elapsed 1.29e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19703618.html -=started 2024-09-11 11:53:43 -=ended 2024-09-11 11:55:16 +=logfile zip_suite.unzip64_central_headers.19719874.html +=started 2024-09-12 11:16:24 +=ended 2024-09-12 11:17:57 =result ok -=elapsed 92.532646 +=elapsed 93.422623 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.505411.html -=started 2024-09-11 11:55:16 -=ended 2024-09-11 11:55:36 +=logfile zip_suite.zip64_central_directory.19720322.html +=started 2024-09-12 11:17:57 +=ended 2024-09-12 11:18:22 =result ok -=elapsed 16.243718 +=elapsed 17.701613 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19704194.html +=logfile zip_suite.end_per_group.19720418.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 11:55:36 -=ended 2024-09-11 11:55:36 +=started 2024-09-12 11:18:22 +=ended 2024-09-12 11:18:22 =result ok -=elapsed 6.2e-4 -=group_time 113.432s +=elapsed 6.06e-4 +=group_time 118.108s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19704226.html +=logfile zip_suite.end_per_group.19720450.html =group_props [{name,z64_ezip},sequence] -=started 2024-09-11 11:55:36 -=ended 2024-09-11 11:55:37 +=started 2024-09-12 11:18:22 +=ended 2024-09-12 11:18:23 =result ok -=elapsed 0.591089 -=group_time 445.186s +=elapsed 0.671807 +=group_time 460.056s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19704258.html +=logfile zip_suite.init_per_group.19720482.html =group_props [{name,z64_emzip},sequence] -=started 2024-09-11 11:55:37 -=ended 2024-09-11 11:55:37 +=started 2024-09-12 11:18:23 +=ended 2024-09-12 11:18:23 =result ok -=elapsed 6.96e-4 +=elapsed 0.001597 =case zip_SUITE:zip64_central_headers -=logfile zip_suite.zip64_central_headers.19704290.html -=started 2024-09-11 11:55:37 -=ended 2024-09-11 11:57:17 +=logfile zip_suite.zip64_central_headers.19720514.html +=started 2024-09-12 11:18:23 +=ended 2024-09-12 11:20:11 =result ok -=elapsed 99.746507 +=elapsed 108.14465 =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.505443.html +=logfile zip_suite.init_per_group.19720642.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:57:17 -=ended 2024-09-11 11:57:17 +=started 2024-09-12 11:20:11 +=ended 2024-09-12 11:20:11 =result ok -=elapsed 2.73e-4 +=elapsed 5.08e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.505475.html -=started 2024-09-11 11:57:17 -=ended 2024-09-11 11:59:02 +=logfile zip_suite.unzip64_central_headers.19720674.html +=started 2024-09-12 11:20:11 +=ended 2024-09-12 11:21:58 =result ok -=elapsed 104.971438 +=elapsed 106.775213 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.505507.html -=started 2024-09-11 11:59:02 -=ended 2024-09-11 11:59:23 +=logfile zip_suite.zip64_central_directory.19720706.html +=started 2024-09-12 11:21:58 +=ended 2024-09-12 11:22:24 =result ok -=elapsed 14.678961 +=elapsed 19.860435 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19704514.html +=logfile zip_suite.end_per_group.19720834.html =group_props [{name,z64_unzip}] -=started 2024-09-11 11:59:23 -=ended 2024-09-11 11:59:24 +=started 2024-09-12 11:22:24 +=ended 2024-09-12 11:22:24 =result ok -=elapsed 4.54e-4 -=group_time 126.598s +=elapsed 4.14e-4 +=group_time 133.437s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19704546.html +=logfile zip_suite.init_per_group.19720866.html =group_props [{name,z64_unezip}] -=started 2024-09-11 11:59:24 -=ended 2024-09-11 11:59:24 +=started 2024-09-12 11:22:24 +=ended 2024-09-12 11:22:24 =result ok -=elapsed 1.71e-4 +=elapsed 1.27e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19704578.html -=started 2024-09-11 11:59:24 -=ended 2024-09-11 12:00:29 +=logfile zip_suite.unzip64_central_headers.19720898.html +=started 2024-09-12 11:22:24 +=ended 2024-09-12 11:23:39 =result ok -=elapsed 65.772394 +=elapsed 74.80714 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.19704610.html -=started 2024-09-11 12:00:29 -=ended 2024-09-11 12:00:51 +=logfile zip_suite.zip64_central_directory.19720930.html +=started 2024-09-12 11:23:39 +=ended 2024-09-12 11:24:03 =result ok -=elapsed 16.451745 +=elapsed 17.067854 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19704706.html +=logfile zip_suite.end_per_group.19721058.html =group_props [{name,z64_unezip}] -=started 2024-09-11 12:00:51 -=ended 2024-09-11 12:00:51 +=started 2024-09-12 11:24:03 +=ended 2024-09-12 11:24:03 =result ok -=elapsed 4.72e-4 -=group_time 87.555s +=elapsed 6.81e-4 +=group_time 98.863s =case zip_SUITE:init_per_group -=logfile zip_suite.init_per_group.19704738.html +=logfile zip_suite.init_per_group.19721090.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 12:00:51 -=ended 2024-09-11 12:00:51 +=started 2024-09-12 11:24:03 +=ended 2024-09-12 11:24:03 =result ok -=elapsed 1.49e-4 +=elapsed 2.13e-4 =case zip_SUITE:unzip64_central_headers -=logfile zip_suite.unzip64_central_headers.19704770.html -=started 2024-09-11 12:00:51 -=ended 2024-09-11 12:02:23 +=logfile zip_suite.unzip64_central_headers.19721122.html +=started 2024-09-12 11:24:03 +=ended 2024-09-12 11:25:34 =result ok -=elapsed 91.782931 +=elapsed 90.63484 =case zip_SUITE:zip64_central_directory -=logfile zip_suite.zip64_central_directory.19705250.html -=started 2024-09-11 12:02:23 -=ended 2024-09-11 12:02:48 +=logfile zip_suite.zip64_central_directory.19721538.html +=started 2024-09-12 11:25:34 +=ended 2024-09-12 11:25:59 =result ok -=elapsed 17.764386 +=elapsed 19.712415 =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19705442.html +=logfile zip_suite.end_per_group.19721762.html =group_props [{name,z64_unemzip}] -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:25:59 +=ended 2024-09-12 11:25:59 =result ok -=elapsed 7.42e-4 -=group_time 116.421s +=elapsed 4.34e-4 +=group_time 115.210s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19705474.html +=logfile zip_suite.end_per_group.19721794.html =group_props [{name,z64_emzip},sequence] -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:25:59 +=ended 2024-09-12 11:25:59 =result ok -=elapsed 0.513953 -=group_time 430.455s +=elapsed 0.650266 +=group_time 455.782s =case zip_SUITE:end_per_group -=logfile zip_suite.end_per_group.19705506.html +=logfile zip_suite.end_per_group.19721826.html =group_props [{name,zip64_group}] -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:25:59 +=ended 2024-09-12 11:25:59 =result ok -=elapsed 0.201328 -=group_time 1257.626s +=elapsed 0.204321 +=group_time 1325.355s =case zip_SUITE:end_per_suite =logfile zip_suite.end_per_suite.html -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:25:59 +=ended 2024-09-12 11:25:59 =result ok -=elapsed 0.012047 -=group_time 1279.453s +=elapsed 0.01573 +=group_time 1347.256s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.19705538.html +=logfile ct_framework.init_per_suite.19721858.html =group_props [{suite,zzz_SUITE}] -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:25:59 +=ended 2024-09-12 11:26:00 =result ok -=elapsed 4.0e-6 +=elapsed 0.0 =case zzz_SUITE:lc_graph =logfile zzz_suite.lc_graph.html -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:26:00 +=ended 2024-09-12 11:26:00 =result ok -=elapsed 5.81e-4 +=elapsed 6.62e-4 =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.19705570.html +=logfile ct_framework.end_per_suite.19721890.html =group_props [{suite,zzz_SUITE}] -=started 2024-09-11 12:02:48 -=ended 2024-09-11 12:02:48 +=started 2024-09-12 11:26:00 +=ended 2024-09-12 11:26:00 =result ok -=elapsed 2.29e-4 -=group_time 0.086s +=elapsed 0.0 +=group_time 0.123s === TEST COMPLETE, 2358 ok, 0 failed, 48 skipped of 2406 test cases -=finished 2024-09-11 12:02:48 +=finished 2024-09-12 11:26:00 =failed 0 =successful 2358 =user_skipped 48 =auto_skipped 0 -=elapsed_time 3113804063 +=elapsed_time 3178255973 diff --git a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log.html b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log.html similarity index 85% rename from prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log.html rename to prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log.html index 39e7a32d5f8e0..dafa6abdbdf22 100644 --- a/prs/8803/ct_logs/ct_run.test_server@43e13ac1be0c.2024-09-11_11.10.18/make_test_dir.stdlib_test.logs/run.2024-09-11_11.10.55/suite.log.html +++ b/prs/8803/ct_logs/ct_run.test_server@7a1fde2d1d55.2024-09-12_10.32.23/make_test_dir.stdlib_test.logs/run.2024-09-12_10.33.01/suite.log.html @@ -80,9 +80,9 @@

Results for make_test_dir.stdlib_test

-

Test started at 2024-09-11 11:10:55

+

Test started at 2024-09-12 10:33:01

Host info:
-Run by otptest on 43e13ac1be0c
Used Erlang v15.0.1 in "/buildroot/otp/Erlang ∅⊤℞"

+Run by otptest on 7a1fde2d1d55
Used Erlang v15.0.1 in "/buildroot/otp/Erlang ∅⊤℞"

Example:

-moduledoc {file, "../doc/arith.asciidoc"}.
--moduledoc #{since => "0.1", format => "text/asciidoc"}.
--moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

+of the format.

Example:

-moduledoc {file, "../doc/arith.asciidoc"}.
+-moduledoc #{since => "0.1", format => "text/asciidoc"}.
+-moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

@@ -224,7 +224,7 @@

We use a special number here so that we know that this number comes from this module. """. --opaque number() :: {arith, erlang:number()}. +-opaque number() :: {arith, erlang:number()}. -doc """ Adds two numbers. @@ -235,8 +235,8 @@

1> arith:add(arith:number(1), arith:number(2)). {number, 3} ``` """. --spec add(number(), number()) -> number(). -add({number, One}, {number, Two}) -> {number, One + Two}.

+-spec add(number(), number()) -> number(). +add({number, One}, {number, Two}) -> {number, One + Two}.

@@ -248,12 +248,12 @@

automatically insert this key if there is a -deprecated attribute marking a function as deprecated.

  • equiv => unicode:chardata() | F/A | F(...) - Notes that this function is equivalent to another function in this module. The equivalence can be described using either -Func/Arity, Func(Args) or a unicode string. For example:

    -doc #{equiv => add/3}.
    -add(One, Two) -> add(One, Two, []).
    -add(One, Two, Options) -> ...

    or

    -doc #{equiv => add(One, Two, [])}.
    --spec add(One :: number(), Two :: number()) -> number().
    -add(One, Two) -> add(One, Two, []).
    -add(One, Two, Options) -> ...

    The entry into the EEP-48 doc chunk metadata is +Func/Arity, Func(Args) or a unicode string. For example:

    -doc #{equiv => add/3}.
    +add(One, Two) -> add(One, Two, []).
    +add(One, Two, Options) -> ...

    or

    -doc #{equiv => add(One, Two, [])}.
    +-spec add(One :: number(), Two :: number()) -> number().
    +add(One, Two) -> add(One, Two, []).
    +add(One, Two, Options) -> ...

    The entry into the EEP-48 doc chunk metadata is the value converted to a string.

  • exported => boolean() - A boolean/0 signifying if the entry is exported or not. This value is automatically set by the compiler and should not be set by the user.

  • @@ -264,20 +264,20 @@

    The doc signature is a short text shown to describe the function and its arguments. By default it is determined by looking at the names of the arguments in the --spec or function. For example:

    add(One, Two) -> One + Two.
    +-spec or function. For example:

    add(One, Two) -> One + Two.
     
    --spec sub(One :: integer(), Two :: integer()) -> integer().
    -sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback -specification. For example:

    -type number(Value) :: {number, Value}.
    +-spec sub(One :: integer(), Two :: integer()) -> integer().
    +sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback +specification. For example:

    -type number(Value) :: {number, Value}.
     %% signature will be `number(Value)`
     
    --opaque number() :: {number, number()}.
    +-opaque number() :: {number, number()}.
     %% signature will be `number()`
     
    --callback increment(In :: number()) -> Out.
    +-callback increment(In :: number()) -> Out.
     %% signature will be `increment(In)`
     
    --callback increment(In) -> Out when In :: number().
    +-callback increment(In) -> Out when In :: number().
     %% signature will be `increment(In)`

    If it is not possible to "easily" figure out a nice signature from the code, the MFA syntax is used instead. For example: add/2, number/1, increment/1

    It is possible to supply a custom signature by placing it as the first line of the -doc attribute. The provided signature must be in the form of a function @@ -286,7 +286,7 @@

    Adds two numbers. """. -add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the +add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the documentation string, so in the example above only the text "Adds two numbers" will be part of the documentation. This works for functions, types, and callbacks.

    When configured you can run rebar3 ex_doc to generate the documentation to doc/index.html. For more details and options see the rebar3_ex_doc documentation.

    You can also download the release escript bundle from diff --git a/prs/8803/doc/system/drivers.html b/prs/8803/doc/system/drivers.html index 3c960d016d92d..38a648b23a63a 100644 --- a/prs/8803/doc/system/drivers.html +++ b/prs/8803/doc/system/drivers.html @@ -126,15 +126,15 @@

    running.

    A driver can be configured to have one lock for each port instead.

    If a driver is used in a functional way (that is, holds no state, but only does some heavy calculation and returns a result), several ports with registered names can be opened beforehand, and the port to be used can be chosen based on -the scheduler ID as follows:

    -define(PORT_NAMES(),
    -	{some_driver_01, some_driver_02, some_driver_03, some_driver_04,
    +the scheduler ID as follows:

    -define(PORT_NAMES(),
    +	{some_driver_01, some_driver_02, some_driver_03, some_driver_04,
     	 some_driver_05, some_driver_06, some_driver_07, some_driver_08,
     	 some_driver_09, some_driver_10, some_driver_11, some_driver_12,
    -	 some_driver_13, some_driver_14, some_driver_15, some_driver_16}).
    +	 some_driver_13, some_driver_14, some_driver_15, some_driver_16}).
     
    -client_port() ->
    -    element(erlang:system_info(scheduler_id) rem tuple_size(?PORT_NAMES()) + 1,
    -	    ?PORT_NAMES()).

    As long as there are no more than 16 schedulers, there will never be any lock +client_port() -> + element(erlang:system_info(scheduler_id) rem tuple_size(?PORT_NAMES()) + 1, + ?PORT_NAMES()).

    As long as there are no more than 16 schedulers, there will never be any lock contention on the port lock for the driver.

    diff --git a/prs/8803/doc/system/eff_guide_functions.html b/prs/8803/doc/system/eff_guide_functions.html index bf7066199cc1f..89f3f4361a449 100644 --- a/prs/8803/doc/system/eff_guide_functions.html +++ b/prs/8803/doc/system/eff_guide_functions.html @@ -126,13 +126,13 @@

    rearranging clauses.

    One exception is pattern matching of binaries. The compiler does not rearrange clauses that match binaries. Placing the clause that matches against the empty binary last is usually slightly faster than placing it first.

    The following is a rather unnatural example to show another exception where -rearranging clauses is beneficial:

    DO NOT

    atom_map1(one) -> 1;
    -atom_map1(two) -> 2;
    -atom_map1(three) -> 3;
    -atom_map1(Int) when is_integer(Int) -> Int;
    -atom_map1(four) -> 4;
    -atom_map1(five) -> 5;
    -atom_map1(six) -> 6.

    The problem is the clause with the variable Int. As a variable can match +rearranging clauses is beneficial:

    DO NOT

    atom_map1(one) -> 1;
    +atom_map1(two) -> 2;
    +atom_map1(three) -> 3;
    +atom_map1(Int) when is_integer(Int) -> Int;
    +atom_map1(four) -> 4;
    +atom_map1(five) -> 5;
    +atom_map1(six) -> 6.

    The problem is the clause with the variable Int. As a variable can match anything, including the atoms four, five, and six, which the following clauses also match, the compiler must generate suboptimal code that executes as follows:

    Rewriting to either:

    DO

    atom_map2(one) -> 1;
    -atom_map2(two) -> 2;
    -atom_map2(three) -> 3;
    -atom_map2(four) -> 4;
    -atom_map2(five) -> 5;
    -atom_map2(six) -> 6;
    -atom_map2(Int) when is_integer(Int) -> Int.

    or:

    DO

    atom_map3(Int) when is_integer(Int) -> Int;
    -atom_map3(one) -> 1;
    -atom_map3(two) -> 2;
    -atom_map3(three) -> 3;
    -atom_map3(four) -> 4;
    -atom_map3(five) -> 5;
    -atom_map3(six) -> 6.

    gives slightly more efficient matching code.

    Another example:

    DO NOT

    map_pairs1(_Map, [], Ys) ->
    +exception if none of the values matched.)

    Rewriting to either:

    DO

    atom_map2(one) -> 1;
    +atom_map2(two) -> 2;
    +atom_map2(three) -> 3;
    +atom_map2(four) -> 4;
    +atom_map2(five) -> 5;
    +atom_map2(six) -> 6;
    +atom_map2(Int) when is_integer(Int) -> Int.

    or:

    DO

    atom_map3(Int) when is_integer(Int) -> Int;
    +atom_map3(one) -> 1;
    +atom_map3(two) -> 2;
    +atom_map3(three) -> 3;
    +atom_map3(four) -> 4;
    +atom_map3(five) -> 5;
    +atom_map3(six) -> 6.

    gives slightly more efficient matching code.

    Another example:

    DO NOT

    map_pairs1(_Map, [], Ys) ->
         Ys;
    -map_pairs1(_Map, Xs, []) ->
    +map_pairs1(_Map, Xs, []) ->
         Xs;
    -map_pairs1(Map, [X|Xs], [Y|Ys]) ->
    -    [Map(X, Y)|map_pairs1(Map, Xs, Ys)].

    The first argument is not a problem. It is variable, but it is a variable in +map_pairs1(Map, [X|Xs], [Y|Ys]) -> + [Map(X, Y)|map_pairs1(Map, Xs, Ys)].

    The first argument is not a problem. It is variable, but it is a variable in all clauses. The problem is the variable in the second argument, Xs, in the middle clause. Because the variable can match anything, the compiler is not allowed to rearrange the clauses, but must generate code that matches them in the order written.

    If the function is rewritten as follows, the compiler is free to rearrange the -clauses:

    DO

    map_pairs2(_Map, [], Ys) ->
    +clauses:

    DO

    map_pairs2(_Map, [], Ys) ->
         Ys;
    -map_pairs2(_Map, [_|_]=Xs, [] ) ->
    +map_pairs2(_Map, [_|_]=Xs, [] ) ->
         Xs;
    -map_pairs2(Map, [X|Xs], [Y|Ys]) ->
    -    [Map(X, Y)|map_pairs2(Map, Xs, Ys)].

    The compiler will generate code similar to this:

    DO NOT (already done by the compiler)

    explicit_map_pairs(Map, Xs0, Ys0) ->
    +map_pairs2(Map, [X|Xs], [Y|Ys]) ->
    +    [Map(X, Y)|map_pairs2(Map, Xs, Ys)].

    The compiler will generate code similar to this:

    DO NOT (already done by the compiler)

    explicit_map_pairs(Map, Xs0, Ys0) ->
         case Xs0 of
    -	[X|Xs] ->
    +	[X|Xs] ->
     	    case Ys0 of
    -		[Y|Ys] ->
    -		    [Map(X, Y)|explicit_map_pairs(Map, Xs, Ys)];
    -		[] ->
    +		[Y|Ys] ->
    +		    [Map(X, Y)|explicit_map_pairs(Map, Xs, Ys)];
    +		[] ->
     		    Xs0
     	    end;
    -	[] ->
    +	[] ->
     	    Ys0
         end.

    This is slightly faster for probably the most common case that the input lists are not empty or very short. (Another advantage is that Dialyzer can deduce a diff --git a/prs/8803/doc/system/eff_guide_processes.html b/prs/8803/doc/system/eff_guide_processes.html index f7de077122dca..f3a5ded4ddde3 100644 --- a/prs/8803/doc/system/eff_guide_processes.html +++ b/prs/8803/doc/system/eff_guide_processes.html @@ -123,37 +123,37 @@

    An Erlang process is lightweight compared to threads and processes in operating systems.

    A newly spawned Erlang process uses 327 words of memory. The size can be found -as follows:

    Erlang/OTP 27 [erts-14.2.3] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
    +as follows:

    Erlang/OTP 27 [erts-14.2.3] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
     
    -Eshell V14.2.3 (press Ctrl+G to abort, type help(). for help)
    -1> Fun = fun() -> receive after infinity -> ok end end.
    +Eshell V14.2.3 (press Ctrl+G to abort, type help(). for help)
    +1> Fun = fun() -> receive after infinity -> ok end end.
     #Fun<erl_eval.43.39164016>
    -2> {_,Bytes} = process_info(spawn(Fun), memory).
    -{memory,2616}
    -3> Bytes div erlang:system_info(wordsize).
    +2> {_,Bytes} = process_info(spawn(Fun), memory).
    +{memory,2616}
    +3> Bytes div erlang:system_info(wordsize).
     327

    The size includes 233 words for the heap area (which includes the stack). The garbage collector increases the heap as needed.

    The main (outer) loop for a process must be tail-recursive. Otherwise, the -stack grows until the process terminates.

    DO NOT

    loop() ->
    +stack grows until the process terminates.

    DO NOT

    loop() ->
       receive
    -     {sys, Msg} ->
    -         handle_sys_msg(Msg),
    -         loop();
    -     {From, Msg} ->
    -          Reply = handle_msg(Msg),
    +     {sys, Msg} ->
    +         handle_sys_msg(Msg),
    +         loop();
    +     {From, Msg} ->
    +          Reply = handle_msg(Msg),
               From ! Reply,
    -          loop()
    +          loop()
       end,
    -  io:format("Message is processed~n", []).

    The call to io:format/2 will never be executed, but a return address will + io:format("Message is processed~n", []).

    The call to io:format/2 will never be executed, but a return address will still be pushed to the stack each time loop/0 is called recursively. The -correct tail-recursive version of the function looks as follows:

    DO

    loop() ->
    +correct tail-recursive version of the function looks as follows:

    DO

    loop() ->
        receive
    -      {sys, Msg} ->
    -         handle_sys_msg(Msg),
    -         loop();
    -      {From, Msg} ->
    -         Reply = handle_msg(Msg),
    +      {sys, Msg} ->
    +         handle_sys_msg(Msg),
    +         loop();
    +      {From, Msg} ->
    +         Reply = handle_msg(Msg),
              From ! Reply,
    -         loop()
    +         loop()
      end.

    @@ -193,22 +193,22 @@

    The cost of receiving messages depends on how complicated the receive expression is. A simple expression that matches any message is very cheap because it retrieves the first message in the message queue:

    DO

    receive
    -    Message -> handle_msg(Message)
    +    Message -> handle_msg(Message)
     end.

    However, this is not always convenient: we can receive a message that we do not know how to handle at this point, so it is common to only match the messages we expect:

    receive
    -    {Tag, Message} -> handle_msg(Message)
    +    {Tag, Message} -> handle_msg(Message)
     end.

    While this is convenient it means that the entire message queue must be searched until it finds a matching message. This is very expensive for processes with long message queues, so there is an optimization for the common case of -sending a request and waiting for a response shortly after:

    DO

    MRef = monitor(process, Process),
    -Process ! {self(), MRef, Request},
    +sending a request and waiting for a response shortly after:

    DO

    MRef = monitor(process, Process),
    +Process ! {self(), MRef, Request},
     receive
    -    {MRef, Reply} ->
    -        erlang:demonitor(MRef, [flush]),
    -        handle_reply(Reply);
    -    {'DOWN', MRef, _, _, Reason} ->
    -        handle_error(Reason)
    +    {MRef, Reply} ->
    +        erlang:demonitor(MRef, [flush]),
    +        handle_reply(Reply);
    +    {'DOWN', MRef, _, _, Reason} ->
    +        handle_error(Reason)
     end.

    Since the compiler knows that the reference created by monitor/2 cannot exist before the call (since it is a globally unique identifier), and that the receive only matches messages that contain @@ -232,45 +232,45 @@

    efficiency_guide.erl:222: Warning: OPTIMIZED: all clauses match reference in function parameter 1

    To make it clearer exactly what code the warnings refer to, the warnings in the following examples are inserted as comments after the clause they refer to, for example:

    %% DO
    -simple_receive() ->
    +simple_receive() ->
     %% efficiency_guide.erl:194: Warning: INFO: not a selective receive, this is always fast
     receive
    -    Message -> handle_msg(Message)
    +    Message -> handle_msg(Message)
     end.
     
     %% DO NOT, unless Tag is known to be a suitable reference: see
     %% cross_function_receive/0 further down.
    -selective_receive(Tag, Message) ->
    +selective_receive(Tag, Message) ->
     %% efficiency_guide.erl:200: Warning: NOT OPTIMIZED: all clauses do not match a suitable reference
     receive
    -    {Tag, Message} -> handle_msg(Message)
    +    {Tag, Message} -> handle_msg(Message)
     end.
     
     %% DO
    -optimized_receive(Process, Request) ->
    +optimized_receive(Process, Request) ->
     %% efficiency_guide.erl:206: Warning: OPTIMIZED: reference used to mark a message queue position
    -    MRef = monitor(process, Process),
    -    Process ! {self(), MRef, Request},
    +    MRef = monitor(process, Process),
    +    Process ! {self(), MRef, Request},
         %% efficiency_guide.erl:208: Warning: OPTIMIZED: matches reference created by monitor/2 at efficiency_guide.erl:206
         receive
    -        {MRef, Reply} ->
    -        erlang:demonitor(MRef, [flush]),
    -        handle_reply(Reply);
    -    {'DOWN', MRef, _, _, Reason} ->
    -    handle_error(Reason)
    +        {MRef, Reply} ->
    +        erlang:demonitor(MRef, [flush]),
    +        handle_reply(Reply);
    +    {'DOWN', MRef, _, _, Reason} ->
    +    handle_error(Reason)
         end.
     
     %% DO
    -cross_function_receive() ->
    +cross_function_receive() ->
         %% efficiency_guide.erl:218: Warning: OPTIMIZED: reference used to mark a message queue position
    -    Ref = make_ref(),
    +    Ref = make_ref(),
         %% efficiency_guide.erl:219: Warning: INFO: passing reference created by make_ref/0 at efficiency_guide.erl:218
    -    cross_function_receive(Ref).
    +    cross_function_receive(Ref).
     
    -cross_function_receive(Ref) ->
    +cross_function_receive(Ref) ->
         %% efficiency_guide.erl:222: Warning: OPTIMIZED: all clauses match reference in function parameter 1
         receive
    -        {Ref, Message} -> handle_msg(Message)
    +        {Ref, Message} -> handle_msg(Message)
         end.

    @@ -281,8 +281,8 @@

    each loaded module has its own pool. The following function does not build the tuple every time it is called (only to have it discarded the next time the garbage collector was run), but the tuple is located in the module's literal -pool:

    DO

    days_in_month(M) ->
    -    element(M, {31,28,31,30,31,30,31,31,30,31,30,31}).

    If a literal, or a term that contains a literal, is inserted into an Ets table, +pool:

    DO

    days_in_month(M) ->
    +    element(M, {31,28,31,30,31,30,31,31,30,31,30,31}).

    If a literal, or a term that contains a literal, is inserted into an Ets table, it is copied. The reason is that the module containing the literal can be unloaded in the future.

    When a literal is sent to another process, it is not copied. When a module holding a literal is unloaded, the literal will be copied to the heap of all @@ -297,28 +297,28 @@

    Loss of Sharing

    -

    An Erlang term can have shared subterms. Here is a simple example:

    {SubTerm, SubTerm}

    Shared subterms are not preserved in the following cases:

    • When a term is sent to another process
    • When a term is passed as the initial process arguments in the spawn call
    • When a term is stored in an Ets table

    That is an optimization. Most applications do not send messages with shared -subterms.

    The following example shows how a shared subterm can be created:

    kilo_byte() ->
    -    kilo_byte(10, [42]).
    +

    An Erlang term can have shared subterms. Here is a simple example:

    {SubTerm, SubTerm}

    Shared subterms are not preserved in the following cases:

    • When a term is sent to another process
    • When a term is passed as the initial process arguments in the spawn call
    • When a term is stored in an Ets table

    That is an optimization. Most applications do not send messages with shared +subterms.

    The following example shows how a shared subterm can be created:

    kilo_byte() ->
    +    kilo_byte(10, [42]).
     
    -kilo_byte(0, Acc) ->
    +kilo_byte(0, Acc) ->
         Acc;
    -kilo_byte(N, Acc) ->
    -    kilo_byte(N-1, [Acc|Acc]).

    kilo_byte/1 creates a deep list. If list_to_binary/1 +kilo_byte(N, Acc) -> + kilo_byte(N-1, [Acc|Acc]).

    kilo_byte/1 creates a deep list. If list_to_binary/1 is called, the deep list can be converted to a binary of 1024 bytes:

    1> byte_size(list_to_binary(efficiency_guide:kilo_byte())).
     1024

    Using the erts_debug:size/1 BIF, it can be seen that the deep list only -requires 22 words of heap space:

    2> erts_debug:size(efficiency_guide:kilo_byte()).
    +requires 22 words of heap space:

    2> erts_debug:size(efficiency_guide:kilo_byte()).
     22

    Using the erts_debug:flat_size/1 BIF, the size of the deep list can be calculated if sharing is ignored. It becomes the size of the list when it has -been sent to another process or stored in an Ets table:

    3> erts_debug:flat_size(efficiency_guide:kilo_byte()).
    +been sent to another process or stored in an Ets table:

    3> erts_debug:flat_size(efficiency_guide:kilo_byte()).
     4094

    It can be verified that sharing will be lost if the data is inserted into an Ets -table:

    4> T = ets:new(tab, []).
    +table:

    4> T = ets:new(tab, []).
     #Ref<0.1662103692.2407923716.214181>
    -5> ets:insert(T, {key,efficiency_guide:kilo_byte()}).
    +5> ets:insert(T, {key,efficiency_guide:kilo_byte()}).
     true
    -6> erts_debug:size(element(2, hd(ets:lookup(T, key)))).
    +6> erts_debug:size(element(2, hd(ets:lookup(T, key)))).
     4094
    -7> erts_debug:flat_size(element(2, hd(ets:lookup(T, key)))).
    +7> erts_debug:flat_size(element(2, hd(ets:lookup(T, key)))).
     4094

    When the data has passed through an Ets table, erts_debug:size/1 and erts_debug:flat_size/1 return the same value. Sharing has been lost.

    It is possible to build an experimental variant of the runtime system that will preserve sharing when copying terms by giving the diff --git a/prs/8803/doc/system/erl_interface.html b/prs/8803/doc/system/erl_interface.html index 9630fb1bdb5c1..263efc1db5117 100644 --- a/prs/8803/doc/system/erl_interface.html +++ b/prs/8803/doc/system/erl_interface.html @@ -124,111 +124,111 @@

    Erlang Program

    The following example shows an Erlang program communicating with a C program -over a plain port with home made encoding:

    -module(complex1).
    --export([start/1, stop/0, init/1]).
    --export([foo/1, bar/1]).
    +over a plain port with home made encoding:

    -module(complex1).
    +-export([start/1, stop/0, init/1]).
    +-export([foo/1, bar/1]).
     
    -start(ExtPrg) ->
    -    spawn(?MODULE, init, [ExtPrg]).
    -stop() ->
    +start(ExtPrg) ->
    +    spawn(?MODULE, init, [ExtPrg]).
    +stop() ->
         complex ! stop.
     
    -foo(X) ->
    -    call_port({foo, X}).
    -bar(Y) ->
    -    call_port({bar, Y}).
    +foo(X) ->
    +    call_port({foo, X}).
    +bar(Y) ->
    +    call_port({bar, Y}).
     
    -call_port(Msg) ->
    -    complex ! {call, self(), Msg},
    +call_port(Msg) ->
    +    complex ! {call, self(), Msg},
         receive
    -	{complex, Result} ->
    +	{complex, Result} ->
     	    Result
         end.
     
    -init(ExtPrg) ->
    -    register(complex, self()),
    -    process_flag(trap_exit, true),
    -    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
    -    loop(Port).
    +init(ExtPrg) ->
    +    register(complex, self()),
    +    process_flag(trap_exit, true),
    +    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
    +    loop(Port).
     
    -loop(Port) ->
    +loop(Port) ->
         receive
    -	{call, Caller, Msg} ->
    -	    Port ! {self(), {command, encode(Msg)}},
    +	{call, Caller, Msg} ->
    +	    Port ! {self(), {command, encode(Msg)}},
     	    receive
    -		{Port, {data, Data}} ->
    -		    Caller ! {complex, decode(Data)}
    +		{Port, {data, Data}} ->
    +		    Caller ! {complex, decode(Data)}
     	    end,
    -	    loop(Port);
    +	    loop(Port);
     	stop ->
    -	    Port ! {self(), close},
    +	    Port ! {self(), close},
     	    receive
    -		{Port, closed} ->
    -		    exit(normal)
    +		{Port, closed} ->
    +		    exit(normal)
     	    end;
    -	{'EXIT', Port, Reason} ->
    -	    exit(port_terminated)
    +	{'EXIT', Port, Reason} ->
    +	    exit(port_terminated)
         end.
     
    -encode({foo, X}) -> [1, X];
    -encode({bar, Y}) -> [2, Y].
    +encode({foo, X}) -> [1, X];
    +encode({bar, Y}) -> [2, Y].
     
    -decode([Int]) -> Int.

    There are two differences when using Erl_Interface on the C side compared to the +decode([Int]) -> Int.

    There are two differences when using Erl_Interface on the C side compared to the example in Ports, using only the plain port:

    • As Erl_Interface operates on the Erlang external term format, the port must be set to use binaries.
    • Instead of inventing an encoding/decoding scheme, the term_to_binary/1 and -binary_to_term/1 BIFs are to be used.

    That is:

    open_port({spawn, ExtPrg}, [{packet, 2}])

    is replaced with:

    open_port({spawn, ExtPrg}, [{packet, 2}, binary])

    And:

    Port ! {self(), {command, encode(Msg)}},
    +binary_to_term/1 BIFs are to be used.

    That is:

    open_port({spawn, ExtPrg}, [{packet, 2}])

    is replaced with:

    open_port({spawn, ExtPrg}, [{packet, 2}, binary])

    And:

    Port ! {self(), {command, encode(Msg)}},
     receive
    -  {Port, {data, Data}} ->
    -    Caller ! {complex, decode(Data)}
    -end

    is replaced with:

    Port ! {self(), {command, term_to_binary(Msg)}},
    +  {Port, {data, Data}} ->
    +    Caller ! {complex, decode(Data)}
    +end

    is replaced with:

    Port ! {self(), {command, term_to_binary(Msg)}},
     receive
    -  {Port, {data, Data}} ->
    -    Caller ! {complex, binary_to_term(Data)}
    -end

    The resulting Erlang program is as follows:

    -module(complex2).
    --export([start/1, stop/0, init/1]).
    --export([foo/1, bar/1]).
    -
    -start(ExtPrg) ->
    -    spawn(?MODULE, init, [ExtPrg]).
    -stop() ->
    +  {Port, {data, Data}} ->
    +    Caller ! {complex, binary_to_term(Data)}
    +end

    The resulting Erlang program is as follows:

    -module(complex2).
    +-export([start/1, stop/0, init/1]).
    +-export([foo/1, bar/1]).
    +
    +start(ExtPrg) ->
    +    spawn(?MODULE, init, [ExtPrg]).
    +stop() ->
         complex ! stop.
     
    -foo(X) ->
    -    call_port({foo, X}).
    -bar(Y) ->
    -    call_port({bar, Y}).
    +foo(X) ->
    +    call_port({foo, X}).
    +bar(Y) ->
    +    call_port({bar, Y}).
     
    -call_port(Msg) ->
    -    complex ! {call, self(), Msg},
    +call_port(Msg) ->
    +    complex ! {call, self(), Msg},
         receive
    -	{complex, Result} ->
    +	{complex, Result} ->
     	    Result
         end.
     
    -init(ExtPrg) ->
    -    register(complex, self()),
    -    process_flag(trap_exit, true),
    -    Port = open_port({spawn, ExtPrg}, [{packet, 2}, binary]),
    -    loop(Port).
    +init(ExtPrg) ->
    +    register(complex, self()),
    +    process_flag(trap_exit, true),
    +    Port = open_port({spawn, ExtPrg}, [{packet, 2}, binary]),
    +    loop(Port).
     
    -loop(Port) ->
    +loop(Port) ->
         receive
    -	{call, Caller, Msg} ->
    -	    Port ! {self(), {command, term_to_binary(Msg)}},
    +	{call, Caller, Msg} ->
    +	    Port ! {self(), {command, term_to_binary(Msg)}},
     	    receive
    -		{Port, {data, Data}} ->
    -		    Caller ! {complex, binary_to_term(Data)}
    +		{Port, {data, Data}} ->
    +		    Caller ! {complex, binary_to_term(Data)}
     	    end,
    -	    loop(Port);
    +	    loop(Port);
     	stop ->
    -	    Port ! {self(), close},
    +	    Port ! {self(), close},
     	    receive
    -		{Port, closed} ->
    -		    exit(normal)
    +		{Port, closed} ->
    +		    exit(normal)
     	    end;
    -	{'EXIT', Port, Reason} ->
    -	    exit(port_terminated)
    +	{'EXIT', Port, Reason} ->
    +	    exit(port_terminated)
         end.

    Notice that calling complex2:foo/1 and complex2:bar/1 results in the tuple {foo,X} or {bar,Y} being sent to the complex process, which codes them as binaries and sends them to the port. This means that the C program must be able @@ -248,53 +248,53 @@

    typedef unsigned char byte; -int read_cmd(byte *buf); -int write_cmd(byte *buf, int len); -int foo(int x); -int bar(int y); +int read_cmd(byte *buf); +int write_cmd(byte *buf, int len); +int foo(int x); +int bar(int y); -static void fail(int place) { - fprintf(stderr, "Something went wrong %d\n", place); - exit(1); -} +static void fail(int place) { + fprintf(stderr, "Something went wrong %d\n", place); + exit(1); +} -int main() { - byte buf[100]; +int main() { + byte buf[100]; int index = 0; int version = 0; int arity = 0; - char atom[128]; + char atom[128]; long in = 0; int res = 0; ei_x_buff res_buf; - ei_init(); - while (read_cmd(buf) > 0) { - if (ei_decode_version(buf, &index, &version) != 0) - fail(1); - if (ei_decode_tuple_header(buf, &index, &arity) != 0) - fail(2); - if (arity != 2) - fail(3); - if (ei_decode_atom(buf, &index, atom) != 0) - fail(4); - if (ei_decode_long(buf, &index, &in) != 0) - fail(5); - if (strncmp(atom, "foo", 3) == 0) { - res = foo((int)in); - } else if (strncmp(atom, "bar", 3) == 0) { - res = bar((int)in); - } - if (ei_x_new_with_version(&res_buf) != 0) - fail(6); - if (ei_x_encode_long(&res_buf, res) != 0) - fail(7); - write_cmd(res_buf.buff, res_buf.index); - - if (ei_x_free(&res_buf) != 0) - fail(8); + ei_init(); + while (read_cmd(buf) > 0) { + if (ei_decode_version(buf, &index, &version) != 0) + fail(1); + if (ei_decode_tuple_header(buf, &index, &arity) != 0) + fail(2); + if (arity != 2) + fail(3); + if (ei_decode_atom(buf, &index, atom) != 0) + fail(4); + if (ei_decode_long(buf, &index, &in) != 0) + fail(5); + if (strncmp(atom, "foo", 3) == 0) { + res = foo((int)in); + } else if (strncmp(atom, "bar", 3) == 0) { + res = bar((int)in); + } + if (ei_x_new_with_version(&res_buf) != 0) + fail(6); + if (ei_x_encode_long(&res_buf, res) != 0) + fail(7); + write_cmd(res_buf.buff, res_buf.index); + + if (ei_x_free(&res_buf) != 0) + fail(8); index = 0; - } -}

    The following functions, read_cmd() and write_cmd(), from the erl_comm.c + } +}

    The following functions, read_cmd() and write_cmd(), from the erl_comm.c example in Ports can still be used for reading from and writing to the port:

    /* erl_comm.c */
     
    @@ -303,55 +303,55 @@ 

    typedef unsigned char byte; -int read_exact(byte *buf, int len) -{ +int read_exact(byte *buf, int len) +{ int i, got=0; - do { - if ((i = read(0, buf+got, len-got)) <= 0){ - return(i); - } + do { + if ((i = read(0, buf+got, len-got)) <= 0){ + return(i); + } got += i; - } while (got<len); + } while (got<len); - return(len); -} + return(len); +} -int write_exact(byte *buf, int len) -{ +int write_exact(byte *buf, int len) +{ int i, wrote = 0; - do { - if ((i = write(1, buf+wrote, len-wrote)) <= 0) - return (i); + do { + if ((i = write(1, buf+wrote, len-wrote)) <= 0) + return (i); wrote += i; - } while (wrote<len); + } while (wrote<len); - return (len); -} + return (len); +} -int read_cmd(byte *buf) -{ +int read_cmd(byte *buf) +{ int len; - if (read_exact(buf, 2) != 2) - return(-1); - len = (buf[0] << 8) | buf[1]; - return read_exact(buf, len); -} + if (read_exact(buf, 2) != 2) + return(-1); + len = (buf[0] << 8) | buf[1]; + return read_exact(buf, len); +} -int write_cmd(byte *buf, int len) -{ +int write_cmd(byte *buf, int len) +{ byte li; - li = (len >> 8) & 0xff; - write_exact(&li, 1); + li = (len >> 8) & 0xff; + write_exact(&li, 1); li = len & 0xff; - write_exact(&li, 1); + write_exact(&li, 1); - return write_exact(buf, len); -}

    + return write_exact(buf, len); +}

    @@ -366,19 +366,19 @@

    and VSN is the version of the Erl_interface application (3.2.1 in the recent example).

    In R4B and earlier versions of OTP, include and lib are situated under $OTPROOT/usr.

    Step 2. Start Erlang and compile the Erlang code:

    $ erl
    -Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
    -Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
    -1> c(complex2).
    -{ok,complex2}

    Step 3. Run the example:

    2> complex2:start("./extprg").
    +Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
    +1> c(complex2).
    +{ok,complex2}

    Step 3. Run the example:

    2> complex2:start("./extprg").
     <0.34.0>
    -3> complex2:foo(3).
    +3> complex2:foo(3).
     4
    -4> complex2:bar(5).
    +4> complex2:bar(5).
     10
    -5> complex2:bar(352).
    +5> complex2:bar(352).
     704
    -6> complex2:stop().
    +6> complex2:stop().
     stop

    diff --git a/prs/8803/doc/system/error_logging.html b/prs/8803/doc/system/error_logging.html index fb2712a62d78b..37a67ef54e32e 100644 --- a/prs/8803/doc/system/error_logging.html +++ b/prs/8803/doc/system/error_logging.html @@ -147,7 +147,7 @@

    logger_sasl_compatible to true. For more information, see SASL Error Logging in the SASL User's Guide.

    % erl -kernel logger_level info
    -Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
    +Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
     
     =PROGRESS REPORT==== 8-Jun-2018::16:54:19.916404 ===
         application: kernel
    @@ -156,22 +156,22 @@ 

    application: stdlib started_at: nonode@nohost =PROGRESS REPORT==== 8-Jun-2018::16:54:19.925755 === - supervisor: {local,kernel_safe_sup} - started: [{pid,<0.74.0>}, - {id,disk_log_sup}, - {mfargs,{disk_log_sup,start_link,[]}}, - {restart_type,permanent}, - {shutdown,1000}, - {child_type,supervisor}] + supervisor: {local,kernel_safe_sup} + started: [{pid,<0.74.0>}, + {id,disk_log_sup}, + {mfargs,{disk_log_sup,start_link,[]}}, + {restart_type,permanent}, + {shutdown,1000}, + {child_type,supervisor}] =PROGRESS REPORT==== 8-Jun-2018::16:54:19.926056 === - supervisor: {local,kernel_safe_sup} - started: [{pid,<0.75.0>}, - {id,disk_log_server}, - {mfargs,{disk_log_server,start_link,[]}}, - {restart_type,permanent}, - {shutdown,2000}, - {child_type,worker}] -Eshell V10.0 (abort with ^G) + supervisor: {local,kernel_safe_sup} + started: [{pid,<0.75.0>}, + {id,disk_log_server}, + {mfargs,{disk_log_server,start_link,[]}}, + {restart_type,permanent}, + {shutdown,2000}, + {child_type,worker}] +Eshell V10.0 (abort with ^G) 1>

    diff --git a/prs/8803/doc/system/errors.html b/prs/8803/doc/system/errors.html index e774610dfc089..dd2a7709174e3 100644 --- a/prs/8803/doc/system/errors.html +++ b/prs/8803/doc/system/errors.html @@ -155,14 +155,14 @@

    Exit Reason), and a stack trace (which aids in finding the code location of the exception).

    The stack trace can be bound to a variable from within a try expression for any exception class, or as part of the exit reason when a run-time error is -caught by a catch. Example:

    > {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
    -[{shell,apply_fun,3,[]},
    - {erl_eval,do_apply,6,[]},
    - ...]
    -> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
    -[{shell,apply_fun,3,[]},
    - {erl_eval,do_apply,6,[]},
    - ...]

    +caught by a catch. Example:

    > {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
    +[{shell,apply_fun,3,[]},
    + {erl_eval,do_apply,6,[]},
    + ...]
    +> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
    +[{shell,apply_fun,3,[]},
    + {erl_eval,do_apply,6,[]},
    + ...]

    diff --git a/prs/8803/doc/system/events.html b/prs/8803/doc/system/events.html index 6ca88a64a42b7..0ef6a45775bce 100644 --- a/prs/8803/doc/system/events.html +++ b/prs/8803/doc/system/events.html @@ -139,35 +139,35 @@

    Example

    The callback module for the event handler writing error messages to the terminal -can look as follows:

    -module(terminal_logger).
    --behaviour(gen_event).
    +can look as follows:

    -module(terminal_logger).
    +-behaviour(gen_event).
     
    --export([init/1, handle_event/2, terminate/2]).
    +-export([init/1, handle_event/2, terminate/2]).
     
    -init(_Args) ->
    -    {ok, []}.
    +init(_Args) ->
    +    {ok, []}.
     
    -handle_event(ErrorMsg, State) ->
    -    io:format("***Error*** ~p~n", [ErrorMsg]),
    -    {ok, State}.
    +handle_event(ErrorMsg, State) ->
    +    io:format("***Error*** ~p~n", [ErrorMsg]),
    +    {ok, State}.
     
    -terminate(_Args, _State) ->
    +terminate(_Args, _State) ->
         ok.

    The callback module for the event handler writing error messages to a file can -look as follows:

    -module(file_logger).
    --behaviour(gen_event).
    +look as follows:

    -module(file_logger).
    +-behaviour(gen_event).
     
    --export([init/1, handle_event/2, terminate/2]).
    +-export([init/1, handle_event/2, terminate/2]).
     
    -init(File) ->
    -    {ok, Fd} = file:open(File, read),
    -    {ok, Fd}.
    +init(File) ->
    +    {ok, Fd} = file:open(File, read),
    +    {ok, Fd}.
     
    -handle_event(ErrorMsg, Fd) ->
    -    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    -    {ok, Fd}.
    +handle_event(ErrorMsg, Fd) ->
    +    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    +    {ok, Fd}.
     
    -terminate(_Args, Fd) ->
    -    file:close(Fd).

    The code is explained in the next sections.

    +terminate(_Args, Fd) -> + file:close(Fd).

    The code is explained in the next sections.

    @@ -188,19 +188,19 @@

    Adding an Event Handler

    The following example shows how to start an event manager and add an event -handler to it by using the shell:

    1> gen_event:start({local, error_man}).
    -{ok,<0.31.0>}
    -2> gen_event:add_handler(error_man, terminal_logger, []).
    +handler to it by using the shell:

    1> gen_event:start({local, error_man}).
    +{ok,<0.31.0>}
    +2> gen_event:add_handler(error_man, terminal_logger, []).
     ok

    This function sends a message to the event manager registered as error_man, telling it to add the event handler terminal_logger. The event manager calls the callback function terminal_logger:init([]), where the argument [] is the third argument to add_handler. init/1 is expected to return {ok, State}, -where State is the internal state of the event handler.

    init(_Args) ->
    -    {ok, []}.

    Here, init/1 does not need any input data and ignores its argument. For +where State is the internal state of the event handler.

    init(_Args) ->
    +    {ok, []}.

    Here, init/1 does not need any input data and ignores its argument. For terminal_logger, the internal state is not used. For file_logger, the -internal state is used to save the open file descriptor.

    init(File) ->
    -    {ok, Fd} = file:open(File, read),
    -    {ok, Fd}.

    +internal state is used to save the open file descriptor.

    init(File) ->
    +    {ok, Fd} = file:open(File, read),
    +    {ok, Fd}.

    @@ -212,25 +212,25 @@

    is received, the event manager calls handle_event(Event, State) for each installed event handler, in the same order as they were added. The function is expected to return a tuple {ok,State1}, where State1 is a new value for the -state of the event handler.

    In terminal_logger:

    handle_event(ErrorMsg, State) ->
    -    io:format("***Error*** ~p~n", [ErrorMsg]),
    -    {ok, State}.

    In file_logger:

    handle_event(ErrorMsg, Fd) ->
    -    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    -    {ok, Fd}.

    +state of the event handler.

    In terminal_logger:

    handle_event(ErrorMsg, State) ->
    +    io:format("***Error*** ~p~n", [ErrorMsg]),
    +    {ok, State}.

    In file_logger:

    handle_event(ErrorMsg, Fd) ->
    +    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    +    {ok, Fd}.

    Deleting an Event Handler

    -
    4> gen_event:delete_handler(error_man, terminal_logger, []).
    +
    4> gen_event:delete_handler(error_man, terminal_logger, []).
     ok

    This function sends a message to the event manager registered as error_man, telling it to delete the event handler terminal_logger. The event manager calls the callback function terminal_logger:terminate([], State), where the argument [] is the third argument to delete_handler. terminate/2 is to be the opposite of init/1 and do any necessary cleaning up. Its return value is -ignored.

    For terminal_logger, no cleaning up is necessary:

    terminate(_Args, _State) ->
    -    ok.

    For file_logger, the file descriptor opened in init must be closed:

    terminate(_Args, Fd) ->
    -    file:close(Fd).

    +ignored.

    For terminal_logger, no cleaning up is necessary:

    terminate(_Args, _State) ->
    +    ok.

    For file_logger, the file descriptor opened in init must be closed:

    terminate(_Args, Fd) ->
    +    file:close(Fd).

    @@ -253,7 +253,7 @@

    Standalone Event Managers

    -

    An event manager can also be stopped by calling:

    1> gen_event:stop(error_man).
    +

    An event manager can also be stopped by calling:

    1> gen_event:stop(error_man).
     ok

    @@ -265,13 +265,13 @@

    implemented to handle them. Examples of other messages are exit messages if the event manager is linked to other processes than the supervisor (for example via gen_event:add_sup_handler/3) and is -trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.

    diff --git a/prs/8803/doc/system/example.html b/prs/8803/doc/system/example.html index 0d338aa4bba0a..bff90d1c70095 100644 --- a/prs/8803/doc/system/example.html +++ b/prs/8803/doc/system/example.html @@ -125,17 +125,17 @@

    code, solving a complex problem, in your Erlang program. Suppose for example, that you have the following C functions that you would like to call from Erlang:

    /* complex.c */
     
    -int foo(int x) {
    +int foo(int x) {
       return x+1;
    -}
    +}
     
    -int bar(int y) {
    +int bar(int y) {
       return y*2;
    -}

    The functions are deliberately kept as simple as possible, for readability +}

    The functions are deliberately kept as simple as possible, for readability reasons.

    From an Erlang perspective, it is preferable to be able to call foo and bar without having to bother about that they are C functions:

    % Erlang code
     ...
    -Res = complex:foo(X),
    +Res = complex:foo(X),
     ...

    Here, the communication with C is hidden in the implementation of complex.erl. In the following sections, it is shown how this module can be implemented using the different interoperability mechanisms.

    diff --git a/prs/8803/doc/system/expressions.html b/prs/8803/doc/system/expressions.html index f6da19ae84b68..c44aaf569e512 100644 --- a/prs/8803/doc/system/expressions.html +++ b/prs/8803/doc/system/expressions.html @@ -155,12 +155,12 @@

    single assignment, that is, a variable can only be bound once.

    The anonymous variable is denoted by underscore (_) and can be used when a variable is required but its value can be ignored.

    Example:

    [H|_] = [1,2,3]

    Variables starting with underscore (_), for example, _Height, are normal variables, not anonymous. However, they are ignored by the compiler in the sense -that they do not generate warnings.

    Example:

    The following code:

    member(_, []) ->
    -    [].

    can be rewritten to be more readable:

    member(Elem, []) ->
    -    [].

    This causes a warning for an unused variable, Elem. To avoid the warning, -the code can be rewritten to:

    member(_Elem, []) ->
    -    [].

    Notice that since variables starting with an underscore are not anonymous, the -following example matches:

    {_,_} = {1,2}

    But this example fails:

    {_N,_N} = {1,2}

    The scope for a variable is its function clause. Variables bound in a branch of +that they do not generate warnings.

    Example:

    The following code:

    member(_, []) ->
    +    [].

    can be rewritten to be more readable:

    member(Elem, []) ->
    +    [].

    This causes a warning for an unused variable, Elem. To avoid the warning, +the code can be rewritten to:

    member(_Elem, []) ->
    +    [].

    Notice that since variables starting with an underscore are not anonymous, the +following example matches:

    {_,_} = {1,2}

    But this example fails:

    {_N,_N} = {1,2}

    The scope for a variable is its function clause. Variables bound in a branch of an if, case, or receive expression must be bound in all branches to have a value outside the expression. Otherwise they are regarded as unsafe outside the expression.

    For the try expression variable scoping is limited so that variables bound in @@ -171,8 +171,8 @@

    Patterns

    A pattern has the same structure as a term but can contain unbound variables.

    Example:

    Name1
    -[H|T]
    -{error,Reason}

    Patterns are allowed in clause heads, case expressions, +[H|T] +{error,Reason}

    Patterns are allowed in clause heads, case expressions, receive expressions, and match expressions.

    @@ -182,13 +182,13 @@

    If Pattern1 and Pattern2 are valid patterns, the following is also a valid pattern:

    Pattern1 = Pattern2

    When matched against a term, both Pattern1 and Pattern2 are matched against -the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    -    Signal = {connect,From,To,Number,Options},
    +the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    +    Signal = {connect,From,To,Number,Options},
         ...;
    -f(Signal, To) ->
    -    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
    +f(Signal, To) ->
    +    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
         ...;
    -f(Signal, To) ->
    +f(Signal, To) ->
         ignore.

    The compound pattern operator does not imply that its operands are matched in any particular order. That means that it is not legal to bind a variable in Pattern1 and use it in Pattern2, or vice versa.

    @@ -197,15 +197,15 @@

    String Prefix in Patterns

    -

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    +

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    Expressions in Patterns

    An arithmetic expression can be used within a pattern if it meets both of the -following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    -    {?THRESHOLD+1, ok} -> ...

    +following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    +    {?THRESHOLD+1, ok} -> ...

    @@ -213,15 +213,15 @@

    The following matches Pattern against Expr:

    Pattern = Expr

    If the matching succeeds, any unbound variable in the pattern becomes bound and the value of Expr is returned.

    If multiple match operators are applied in sequence, they will be evaluated from -right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    -{answer,42}
    +right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    +{answer,42}
     2> A.
     answer
     3> B.
     42
     4> T.
    -{answer,42}
    -5> {C, D} = [1, 2].
    +{answer,42}
    +5> {C, D} = [1, 2].
     ** exception error: no match of right-hand side value [1,2]

    Because multiple match operators are evaluated from right to left, it means that:

    Pattern1 = Pattern2 = . . . = PatternN = Expression

    is equivalent to:

    Temporary = Expression,
     PatternN = Temporary,
    @@ -243,20 +243,20 @@ 

    compound pattern matches if all of its constituent patterns match. It is not legal for a pattern that is part of a compound pattern to use variables (as keys in map patterns or sizes in binary patterns) bound in other sub patterns of the -same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
    +same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
     * 1:7: variable 'Key' is unbound
    -2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}).
    -{{1,2},3}
    -3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>).
    -{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used +2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}). +{{1,2},3} +3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>). +{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used to match the value of an expression to a pattern. If multiple match operators -are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    -#{key => key2,key2 => value}
    -2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
    +are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    +#{key => key2,key2 => value}
    +2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
     value
    -3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
    +3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
     value
    -4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
    +4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
     * 1:12: variable 'Key' is unbound
     5> <<X:Y>> = begin Y = 8, <<42:8>> end, X.
     42

    The expression at prompt 2> first matches the value of variable M against @@ -280,22 +280,22 @@

    Function Calls

    -
    ExprF(Expr1,...,ExprN)
    -ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of +

    ExprF(Expr1,...,ExprN)
    +ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of ExprM and ExprF must be an atom or an expression that evaluates to an atom. The function is said to be called by using the fully qualified function name. -This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be +This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be an atom or evaluate to a fun.

    If ExprF is an atom, the function is said to be called by using the implicitly qualified function name. If the function ExprF is locally defined, it is called. Alternatively, if ExprF is explicitly imported from the M module, M:ExprF(Expr1,...,ExprN) is called. If ExprF is neither declared locally nor explicitly imported, ExprF must be the name of an automatically -imported BIF.

    Examples:

    handle(Msg, State)
    -spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    -Fun1(3).
    +imported BIF.

    Examples:

    handle(Msg, State)
    +spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    +Fun1(3).
     4
    -2> fun lists:append/2([1,2], [3,4]).
    -[1,2,3,4]
    +2> fun lists:append/2([1,2], [3,4]).
    +[1,2,3,4]
     3>

    Notice that when calling a local function, there is a difference between using the implicitly or fully qualified function name. The latter always refers to the latest version of the module. See @@ -320,32 +320,32 @@

    (ERTS version 5.8) and have an implicitly qualified call to that function in your code, you either need to explicitly remove the auto-import using a compiler directive, or replace the call with a fully qualified function call. Otherwise -you get a compilation error. See the following example:

    -export([length/1,f/1]).
    +you get a compilation error. See the following example:

    -export([length/1,f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    -length([]) ->
    +length([]) ->
         0;
    -length([H|T]) ->
    -    1 + length(T). %% Calls the local function length/1
    +length([H|T]) ->
    +    1 + length(T). %% Calls the local function length/1
     
    -f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
                                       %% which is allowed in guards
         long.

    The same logic applies to explicitly imported functions from other modules, as to locally defined functions. It is not allowed to both import a function from -another module and have the function declared in the module at the same time:

    -export([f/1]).
    +another module and have the function declared in the module at the same time:

    -export([f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    --import(mod,[length/1]).
    +-import(mod,[length/1]).
     
    -f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
                                        %% which is allowed in guards
     
    -    erlang:length(X);              %% Explicit call to erlang:length in body
    +    erlang:length(X);              %% Explicit call to erlang:length in body
     
    -f(X) ->
    -    length(X).                     %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the +f(X) -> + length(X). %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the name with a local function or explicit import is always allowed. However, if the -compile({no_auto_import,[F/A]) directive is not used, the compiler issues a warning whenever the function is called in the module using the implicitly @@ -365,7 +365,7 @@

    sequence GuardSeq that evaluates to true is found. Then the corresponding Body (a sequence of expressions separated by ,) is evaluated.

    The return value of Body is the return value of the if expression.

    If no guard sequence is evaluated as true, an if_clause run-time error occurs. If necessary, the guard expression true can be used in the last branch, as -that guard sequence is always true.

    Example:

    is_greater_than(X, Y) ->
    +that guard sequence is always true.

    Example:

    is_greater_than(X, Y) ->
         if
             X > Y ->
                 true;
    @@ -378,19 +378,19 @@ 

    Case

    case Expr of
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     end

    The expression Expr is evaluated and the patterns Pattern are sequentially matched against the result. If a match succeeds and the optional guard sequence GuardSeq is true, the corresponding Body is evaluated.

    The return value of Body is the return value of the case expression.

    If there is no matching pattern with a true guard sequence, a case_clause -run-time error occurs.

    Example:

    is_valid_signal(Signal) ->
    +run-time error occurs.

    Example:

    is_valid_signal(Signal) ->
         case Signal of
    -        {signal, _What, _From, _To} ->
    +        {signal, _What, _From, _To} ->
                 true;
    -        {signal, _What, _To} ->
    +        {signal, _What, _To} ->
                 true;
             _Else ->
                 false
    @@ -416,9 +416,9 @@ 

    expressions in the maybe block are skipped and the return value of the maybe block is Expr2.

    None of the variables bound in a maybe block must be used in the code that follows the block.

    Here is an example:

    maybe
    -    {ok, A} ?= a(),
    +    {ok, A} ?= a(),
         true = A >= 0,
    -    {ok, B} ?= b(),
    +    {ok, B} ?= b(),
         A + B
     end

    Let us first assume that a() returns {ok,42} and b() returns {ok,58}. With those return values, all of the match operators will succeed, and the @@ -427,11 +427,11 @@

    the value of the expression that failed to match, namely error. Similarly, if b() returns wrong, the return value of the maybe block is wrong.

    Finally, let us assume that a() returns {ok,-1}. Because true = A >= 0 uses the match operator =, a {badmatch,false} run-time error occurs when the -expression fails to match the pattern.

    The example can be written in a less succient way using nested case expressions:

    case a() of
    -    {ok, A} ->
    +expression fails to match the pattern.

    The example can be written in a less succient way using nested case expressions:

    case a() of
    +    {ok, A} ->
             true = A >= 0,
    -        case b() of
    -            {ok, B} ->
    +        case b() of
    +            {ok, B} ->
                     A + B;
                 Other1 ->
                     Other1
    @@ -443,10 +443,10 @@ 

    ..., ExprN else - Pattern1 [when GuardSeq1] -> + Pattern1 [when GuardSeq1] -> Body1; ...; - PatternN [when GuardSeqN] -> + PatternN [when GuardSeqN] -> BodyN end

    If a conditional match operator fails, the failed expression is matched against the patterns in all clauses between the else and end keywords. If a match @@ -456,9 +456,9 @@

    run-time error occurs.

    None of the variables bound in a maybe block must be used in the else clauses. None of the variables bound in the else clauses must be used in the code that follows the maybe block.

    Here is the previous example augmented with else clauses:

    maybe
    -    {ok, A} ?= a(),
    +    {ok, A} ?= a(),
         true = A >= 0,
    -    {ok, B} ?= b(),
    +    {ok, B} ?= b(),
         A + B
     else
         error -> error;
    @@ -485,10 +485,10 @@ 

    Receive

    receive
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     end

    Fetches a received message present in the message queue of the process. The first message in the message queue is matched sequentially against the patterns @@ -500,19 +500,19 @@

    corresponding Body is evaluated. All other messages in the message queue remain unchanged.

    The return value of Body is the return value of the receive expression.

    receive never fails. The execution is suspended, possibly indefinitely, until a message arrives that matches one of the patterns and with a true guard -sequence.

    Example:

    wait_for_onhook() ->
    +sequence.

    Example:

    wait_for_onhook() ->
         receive
             onhook ->
    -            disconnect(),
    -            idle();
    -        {connect, B} ->
    -            B ! {busy, self()},
    -            wait_for_onhook()
    +            disconnect(),
    +            idle();
    +        {connect, B} ->
    +            B ! {busy, self()},
    +            wait_for_onhook()
         end.

    The receive expression can be augmented with a timeout:

    receive
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     after
         ExprT ->
    @@ -525,27 +525,27 @@ 

    timeout is almost 50 days. With a zero value the timeout occurs immediately if there is no matching message in the message queue.

    The atom infinity will make the process wait indefinitely for a matching message. This is the same as not using a timeout. It can be useful for timeout -values that are calculated at runtime.

    Example:

    wait_for_onhook() ->
    +values that are calculated at runtime.

    Example:

    wait_for_onhook() ->
         receive
             onhook ->
    -            disconnect(),
    -            idle();
    -        {connect, B} ->
    -            B ! {busy, self()},
    -            wait_for_onhook()
    +            disconnect(),
    +            idle();
    +        {connect, B} ->
    +            B ! {busy, self()},
    +            wait_for_onhook()
         after
             60000 ->
    -            disconnect(),
    -            error()
    +            disconnect(),
    +            error()
         end.

    It is legal to use a receive...after expression with no branches:

    receive
     after
         ExprT ->
             BodyT
     end

    This construction does not consume any messages, only suspends execution in the -process for ExprT milliseconds. This can be used to implement simple timers.

    Example:

    timer() ->
    -    spawn(m, timer, [self()]).
    +process for ExprT milliseconds. This can be used to implement simple timers.

    Example:

    timer() ->
    +    spawn(m, timer, [self()]).
     
    -timer(Pid) ->
    +timer(Pid) ->
         receive
         after
             5000 ->
    @@ -592,9 +592,9 @@ 

    true 6> 1 > a. false -7> #{c => 3} > #{a => 1, b => 2}. +7> #{c => 3} > #{a => 1, b => 2}. false -8> #{a => 1, b => 2} == #{a => 1.0, b => 2.0}. +8> #{a => 1, b => 2} == #{a => 1.0, b => 2.0}. true 9> <<2:2>> < <<128>>. true @@ -632,7 +632,7 @@

    ** exception error: an error occurred when evaluating an arithmetic expression in operator +/2 called as a + 10 -10> 1 bsl (1 bsl 64). +10> 1 bsl (1 bsl 64). ** exception error: a system limit has been reached in operator bsl/2 called as 1 bsl 18446744073709551616

    @@ -659,12 +659,12 @@

    Expr1 orelse Expr2
     Expr1 andalso Expr2

    Expr2 is evaluated only if necessary. That is, Expr2 is evaluated only if:

    • Expr1 evaluates to false in an orelse expression.

    or

    • Expr1 evaluates to true in an andalso expression.

    Returns either the value of Expr1 (that is, true or false) or the value of -Expr2 (if Expr2 is evaluated).

    Example 1:

    case A >= -1.0 andalso math:sqrt(A+1) > B of

    This works even if A is less than -1.0, since in that case, math:sqrt/1 is -never evaluated.

    Example 2:

    OnlyOne = is_atom(L) orelse
    -         (is_list(L) andalso length(L) == 1),

    Expr2 is not required to evaluate to a Boolean value. Because of that, -andalso and orelse are tail-recursive.

    Example 3 (tail-recursive function):

    all(Pred, [Hd|Tail]) ->
    -    Pred(Hd) andalso all(Pred, Tail);
    -all(_, []) ->
    +Expr2 (if Expr2 is evaluated).

    Example 1:

    case A >= -1.0 andalso math:sqrt(A+1) > B of

    This works even if A is less than -1.0, since in that case, math:sqrt/1 is +never evaluated.

    Example 2:

    OnlyOne = is_atom(L) orelse
    +         (is_list(L) andalso length(L) == 1),

    Expr2 is not required to evaluate to a Boolean value. Because of that, +andalso and orelse are tail-recursive.

    Example 3 (tail-recursive function):

    all(Pred, [Hd|Tail]) ->
    +    Pred(Hd) andalso all(Pred, Tail);
    +all(_, []) ->
         true.

    Change

    Before Erlang/OTP R13A, Expr2 was required to evaluate to a Boolean value, and as consequence, andalso and orelse were not tail-recursive.

    @@ -676,10 +676,10 @@

    Expr1 -- Expr2

    The list concatenation operator ++ appends its second argument to its first and returns the resulting list.

    The list subtraction operator -- produces a list that is a copy of the first argument. The procedure is as follows: for each element in the second argument, -the first occurrence of this element (if any) is removed.

    Example:

    1> [1,2,3] ++ [4,5].
    -[1,2,3,4,5]
    -2> [1,2,3,2,1,2] -- [2,1,2].
    -[3,1,2]

    +the first occurrence of this element (if any) is removed.

    Example:

    1> [1,2,3] ++ [4,5].
    +[1,2,3,4,5]
    +2> [1,2,3,2,1,2] -- [2,1,2].
    +[3,1,2]

    @@ -692,18 +692,18 @@

    Creating Maps

    Constructing a new map is done by letting an expression K be associated with -another expression V:

    #{K => V}

    New maps can include multiple associations at construction by listing every -association:

    #{K1 => V1, ..., Kn => Vn}

    An empty map is constructed by not associating any terms with each other:

    #{}

    All keys and values in the map are terms. Any expression is first evaluated and +another expression V:

    #{K => V}

    New maps can include multiple associations at construction by listing every +association:

    #{K1 => V1, ..., Kn => Vn}

    An empty map is constructed by not associating any terms with each other:

    #{}

    All keys and values in the map are terms. Any expression is first evaluated and then the resulting terms are used as key and value respectively.

    Keys and values are separated by the => arrow and associations are separated -by a comma (,).

    Examples:

    M0 = #{},                 % empty map
    -M1 = #{a => <<"hello">>}, % single association with literals
    -M2 = #{1 => 2, b => b},   % multiple associations with literals
    -M3 = #{k => {A,B}},       % single association with variables
    -M4 = #{{"w", 1} => f()}.  % compound key associated with an evaluated expression

    Here, A and B are any expressions and M0 through M4 are the resulting -map terms.

    If two matching keys are declared, the latter key takes precedence.

    Example:

    1> #{1 => a, 1 => b}.
    -#{1 => b }
    -2> #{1.0 => a, 1 => b}.
    -#{1 => b, 1.0 => a}

    The order in which the expressions constructing the keys (and their associated +by a comma (,).

    Examples:

    M0 = #{},                 % empty map
    +M1 = #{a => <<"hello">>}, % single association with literals
    +M2 = #{1 => 2, b => b},   % multiple associations with literals
    +M3 = #{k => {A,B}},       % single association with variables
    +M4 = #{{"w", 1} => f()}.  % compound key associated with an evaluated expression

    Here, A and B are any expressions and M0 through M4 are the resulting +map terms.

    If two matching keys are declared, the latter key takes precedence.

    Example:

    1> #{1 => a, 1 => b}.
    +#{1 => b }
    +2> #{1.0 => a, 1 => b}.
    +#{1 => b, 1.0 => a}

    The order in which the expressions constructing the keys (and their associated values) are evaluated is not defined. The syntactic order of the key-value pairs in the construction is of no relevance, except in the recently mentioned case of two matching keys.

    @@ -713,24 +713,24 @@

    Updating Maps

    Updating a map has a similar syntax as constructing it.

    An expression defining the map to be updated is put in front of the expression -defining the keys to be updated and their respective values:

    M#{K => V}

    Here M is a term of type map and K and V are any expression.

    If key K does not match any existing key in the map, a new association is +defining the keys to be updated and their respective values:

    M#{K => V}

    Here M is a term of type map and K and V are any expression.

    If key K does not match any existing key in the map, a new association is created from key K to value V.

    If key K matches an existing key in map M, its associated value is replaced by the new value V. In both cases, the evaluated map expression returns a new -map.

    If M is not of type map, an exception of type badmap is raised.

    To only update an existing value, the following syntax is used:

    M#{K := V}

    Here M is a term of type map, V is an expression and K is an expression +map.

    If M is not of type map, an exception of type badmap is raised.

    To only update an existing value, the following syntax is used:

    M#{K := V}

    Here M is a term of type map, V is an expression and K is an expression that evaluates to an existing key in M.

    If key K does not match any existing keys in map M, an exception of type badkey is raised at runtime. If a matching key K is present in map M, its associated value is replaced by the new value V, and the evaluated map -expression returns a new map.

    If M is not of type map, an exception of type badmap is raised.

    Examples:

    M0 = #{},
    -M1 = M0#{a => 0},
    -M2 = M1#{a => 1, b => 2},
    -M3 = M2#{"function" => fun() -> f() end},
    -M4 = M3#{a := 2, b := 3}.  % 'a' and 'b' was added in `M1` and `M2`.

    Here M0 is any map. It follows that M1 through M4 are maps as well.

    More examples:

    1> M = #{1 => a}.
    -#{1 => a }
    -2> M#{1.0 => b}.
    -#{1 => a, 1.0 => b}.
    -3> M#{1 := b}.
    -#{1 => b}
    -4> M#{1.0 := b}.
    +expression returns a new map.

    If M is not of type map, an exception of type badmap is raised.

    Examples:

    M0 = #{},
    +M1 = M0#{a => 0},
    +M2 = M1#{a => 1, b => 2},
    +M3 = M2#{"function" => fun() -> f() end},
    +M4 = M3#{a := 2, b := 3}.  % 'a' and 'b' was added in `M1` and `M2`.

    Here M0 is any map. It follows that M1 through M4 are maps as well.

    More examples:

    1> M = #{1 => a}.
    +#{1 => a }
    +2> M#{1.0 => b}.
    +#{1 => a, 1.0 => b}.
    +3> M#{1 := b}.
    +#{1 => b}
    +4> M#{1.0 := b}.
     ** exception error: bad argument

    As in construction, the order in which the key and value expressions are evaluated is not defined. The syntactic order of the key-value pairs in the update is of no relevance, except in the case where two keys match. In that @@ -740,31 +740,31 @@

    Maps in Patterns

    -

    Matching of key-value associations from maps is done as follows:

    #{K := V} = M

    Here M is any map. The key K must be a +

    Matching of key-value associations from maps is done as follows:

    #{K := V} = M

    Here M is any map. The key K must be a guard expression, with all variables already bound. V can be any pattern with either bound or unbound variables.

    If the variable V is unbound, it becomes bound to the value associated with the key K, which must exist in the map M. If the variable V is bound, it must match the value associated with K in M.

    Change

    Before Erlang/OTP 23, the expression defining the key K was restricted to be -either a single variable or a literal.

    Example:

    1> M = #{"tuple" => {1,2}}.
    -#{"tuple" => {1,2}}
    -2> #{"tuple" := {1,B}} = M.
    -#{"tuple" => {1,2}}
    +either a single variable or a literal.

    Example:

    1> M = #{"tuple" => {1,2}}.
    +#{"tuple" => {1,2}}
    +2> #{"tuple" := {1,B}} = M.
    +#{"tuple" => {1,2}}
     3> B.
    -2.

    This binds variable B to integer 2.

    Similarly, multiple values from the map can be matched:

    #{K1 := V1, ..., Kn := Vn} = M

    Here keys K1 through Kn are any expressions with literals or bound +2.

    This binds variable B to integer 2.

    Similarly, multiple values from the map can be matched:

    #{K1 := V1, ..., Kn := Vn} = M

    Here keys K1 through Kn are any expressions with literals or bound variables. If all key expressions evaluate successfully and all keys exist in map M, all variables in V1 .. Vn is matched to the associated values of their respective keys.

    If the matching conditions are not met the match fails.

    Note that when matching a map, only the := operator (not the =>) is allowed as a delimiter for the associations.

    The order in which keys are declared in matching has no relevance.

    Duplicate keys are allowed in matching and match each pattern associated to the -keys:

    #{K := V1, K := V2} = M

    The empty map literal (#{}) matches any map when used as a pattern:

    #{} = Expr

    This expression matches if the expression Expr is of type map, otherwise it -fails with an exception badmatch.

    Here the key to be retrieved is constructed from an expression:

    #{{tag,length(List)} := V} = Map

    List must be an already bound variable.

    Matching Syntax

    Matching of literals as keys are allowed in function heads:

    %% only start if not_started
    -handle_call(start, From, #{state := not_started} = S) ->
    +keys:

    #{K := V1, K := V2} = M

    The empty map literal (#{}) matches any map when used as a pattern:

    #{} = Expr

    This expression matches if the expression Expr is of type map, otherwise it +fails with an exception badmatch.

    Here the key to be retrieved is constructed from an expression:

    #{{tag,length(List)} := V} = Map

    List must be an already bound variable.

    Matching Syntax

    Matching of literals as keys are allowed in function heads:

    %% only start if not_started
    +handle_call(start, From, #{state := not_started} = S) ->
     ...
    -    {reply, ok, S#{state := start}};
    +    {reply, ok, S#{state := start}};
     
     %% only change if started
    -handle_call(change, From, #{state := start} = S) ->
    +handle_call(change, From, #{state := start} = S) ->
     ...
    -    {reply, ok, S#{state := changed}};

    + {reply, ok, S#{state := changed}};

    @@ -851,17 +851,17 @@

    types binary, bitstring, bytes, and bits.

    See also the paragraphs about Binaries.

    When constructing binaries and no size is specified for a binary segment, the entire binary value is interpolated into the binary being constructed. However, the size in bits of the binary being interpolated must be evenly divisible by -the unit value for the segment; otherwise an exception is raised.

    For example, the following examples all succeed:

    1> <<(<<"abc">>)/bitstring>>.
    +the unit value for the segment; otherwise an exception is raised.

    For example, the following examples all succeed:

    1> <<(<<"abc">>)/bitstring>>.
     <<"abc">>
    -2> <<(<<"abc">>)/binary-unit:1>>.
    +2> <<(<<"abc">>)/binary-unit:1>>.
     <<"abc">>
    -3> <<(<<"abc">>)/binary>>.
    +3> <<(<<"abc">>)/binary>>.
     <<"abc">>

    The first two examples have a unit value of 1 for the segment, while the third segment has a unit value of 8.

    Attempting to interpolate a bit string of size 1 into a binary segment with unit -8 (the default unit for binary) fails as shown in this example:

    1> <<(<<1:1>>)/binary>>.
    -** exception error: bad argument

    For the construction to succeed, the unit value of the segment must be 1:

    2> <<(<<1:1>>)/bitstring>>.
    +8 (the default unit for binary) fails as shown in this example:

    1> <<(<<1:1>>)/binary>>.
    +** exception error: bad argument

    For the construction to succeed, the unit value of the segment must be 1:

    2> <<(<<1:1>>)/bitstring>>.
     <<1:1>>
    -3> <<(<<1:1>>)/binary-unit:1>>.
    +3> <<(<<1:1>>)/binary-unit:1>>.
     <<1:1>>

    Similarly, when matching a binary segment with no size specified, the match succeeds if and only if the size in bits of the rest of the binary is evenly divisible by the unit value:

    1> <<_/binary-unit:16>> = <<"">>.
    @@ -875,9 +875,9 @@ 

    5> <<_/binary-unit:16>> = <<"abcd">>. <<"abcd">>

    When a size is explicitly specified for a binary segment, the segment size in bits is the value of Size multiplied by the default or explicit unit value.

    When constructing binaries, the size of the binary being interpolated into the -constructed binary must be at least as large as the size of the binary segment.

    Examples:

    1> <<(<<"abc">>):2/binary>>.
    +constructed binary must be at least as large as the size of the binary segment.

    Examples:

    1> <<(<<"abc">>):2/binary>>.
     <<"ab">>
    -2> <<(<<"a">>):2/binary>>.
    +2> <<(<<"a">>):2/binary>>.
     ** exception error: construction of binary failed
             *** segment 1 of type 'binary': the value <<"a">> is shorter than the size of the segment

    @@ -941,30 +941,30 @@

    Fun Expressions

    fun
    -    [Name](Pattern11,...,Pattern1N) [when GuardSeq1] ->
    +    [Name](Pattern11,...,Pattern1N) [when GuardSeq1] ->
                   Body1;
         ...;
    -    [Name](PatternK1,...,PatternKN) [when GuardSeqK] ->
    +    [Name](PatternK1,...,PatternKN) [when GuardSeqK] ->
                   BodyK
     end

    A fun expression begins with the keyword fun and ends with the keyword end. Between them is to be a function declaration, similar to a regular function declaration, except that the function name is optional and is to be a variable, if any.

    Variables in a fun head shadow the function name and both shadow variables in the function clause surrounding the fun expression. Variables bound in a fun -body are local to the fun body.

    The return value of the expression is the resulting fun.

    Examples:

    1> Fun1 = fun (X) -> X+1 end.
    +body are local to the fun body.

    The return value of the expression is the resulting fun.

    Examples:

    1> Fun1 = fun (X) -> X+1 end.
     #Fun<erl_eval.6.39074546>
    -2> Fun1(2).
    +2> Fun1(2).
     3
    -3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
    +3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
     #Fun<erl_eval.6.39074546>
    -4> Fun2(7).
    +4> Fun2(7).
     gt
    -5> Fun3 = fun Fact(1) -> 1; Fact(X) when X > 1 -> X * Fact(X - 1) end.
    +5> Fun3 = fun Fact(1) -> 1; Fact(X) when X > 1 -> X * Fact(X - 1) end.
     #Fun<erl_eval.6.39074546>
    -6> Fun3(4).
    +6> Fun3(4).
     24

    The following fun expressions are also allowed:

    fun Name/Arity
     fun Module:Name/Arity

    In Name/Arity, Name is an atom and Arity is an integer. Name/Arity must -specify an existing local function. The expression is syntactic sugar for:

    fun (Arg1,...,ArgN) -> Name(Arg1,...,ArgN) end

    In Module:Name/Arity, Module, and Name are atoms and Arity is an +specify an existing local function. The expression is syntactic sugar for:

    fun (Arg1,...,ArgN) -> Name(Arg1,...,ArgN) end

    In Module:Name/Arity, Module, and Name are atoms and Arity is an integer. Module, Name, and Arity can also be variables. A fun defined in this way refers to the function Name with arity Arity in the latest version of module Module. A fun defined in this way is not dependent on the @@ -982,11 +982,11 @@

    recent function calls, see Exit Reasons.

    Examples:

    1> catch 1+2.
     3
     2> catch 1+a.
    -{'EXIT',{badarith,[...]}}

    The BIF throw(Any) can be used for non-local return from a -function. It must be evaluated within a catch, which returns the value Any.

    Example:

    3> catch throw(hello).
    +{'EXIT',{badarith,[...]}}

    The BIF throw(Any) can be used for non-local return from a +function. It must be evaluated within a catch, which returns the value Any.

    Example:

    3> catch throw(hello).
     hello

    If throw/1 is not evaluated within a catch, a nocatch run-time error occurs.

    Change

    Before Erlang/OTP 24, the catch operator had the lowest precedence, making -it necessary to add parentheses when combining it with the match operator:

    1> A = (catch 42).
    +it necessary to add parentheses when combining it with the match operator:

    1> A = (catch 42).
     42
     2> A.
     42

    Starting from Erlang/OTP 24, the parentheses can be omitted:

    1> A = catch 42.
    @@ -1000,9 +1000,9 @@ 

    try Exprs
     catch
    -    Class1:ExceptionPattern1[:Stacktrace] [when ExceptionGuardSeq1] ->
    +    Class1:ExceptionPattern1[:Stacktrace] [when ExceptionGuardSeq1] ->
             ExceptionBody1;
    -    ClassN:ExceptionPatternN[:Stacktrace] [when ExceptionGuardSeqN] ->
    +    ClassN:ExceptionPatternN[:Stacktrace] [when ExceptionGuardSeqN] ->
             ExceptionBodyN
     end

    This is an enhancement of catch. It gives the possibility to:

    Examples (using a guard expression as filter):

    1> List = [1,2,a,b,c,3,4].
    +[1,2,a,b,c,3,4]
    +2> [E || E <- List, E rem 2].
    +[]
    +3> [E || E <- List, E rem 2 =:= 0].
    +[2,4]

    Examples (using a non-guard expression as filter):

    1> List = [1,2,a,b,c,3,4].
    +[1,2,a,b,c,3,4]
    +2> FaultyIsEven = fun(E) -> E rem 2 end.
     #Fun<erl_eval.42.17316486>
    -3> [E || E <- List, FaultyIsEven(E)].
    +3> [E || E <- List, FaultyIsEven(E)].
     ** exception error: bad filter 1
    -4> IsEven = fun(E) -> E rem 2 =:= 0 end.
    +4> IsEven = fun(E) -> E rem 2 =:= 0 end.
     #Fun<erl_eval.42.17316486>
    -5> [E || E <- List, IsEven(E)].
    +5> [E || E <- List, IsEven(E)].
     ** exception error: an error occurred when evaluating an arithmetic expression
          in operator  rem/2
             called as a rem 2
    -6> [E || E <- List, is_integer(E), IsEven(E)].
    -[2,4]

    +6> [E || E <- List, is_integer(E), IsEven(E)]. +[2,4]

    diff --git a/prs/8803/doc/system/funs.html b/prs/8803/doc/system/funs.html index 4fea69357a75d..fc0eb83935aa1 100644 --- a/prs/8803/doc/system/funs.html +++ b/prs/8803/doc/system/funs.html @@ -121,14 +121,14 @@

    map

    -

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    -double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    -[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    -add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used -by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as -follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    -add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as +

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    +double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    +[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    +add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used +by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as +follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    +add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as arguments and returns a new list, obtained by applying F to each of the elements in L.

    The process of abstracting out the common features of a number of different programs is called procedural abstraction. Procedural abstraction can be used @@ -142,21 +142,21 @@

    foreach

    This section illustrates procedural abstraction. Initially, the following two -examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    -    io:format(Stream, "~p~n", [H]),
    -    print_list(Stream, T);
    -print_list(Stream, []) ->
    -    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
    +examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    +    io:format(Stream, "~p~n", [H]),
    +    print_list(Stream, T);
    +print_list(Stream, []) ->
    +    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
         Pid ! Msg,
    -    broadcast(Msg, Pids);
    -broadcast(_, []) ->
    +    broadcast(Msg, Pids);
    +broadcast(_, []) ->
         true.

    These two functions have a similar structure. They both iterate over a list and do something to each element in the list. The "something" is passed on as an -extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    -    F(H),
    -    foreach(F, T);
    -foreach(F, []) ->
    -    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) +extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    +    F(H),
    +    foreach(F, T);
    +foreach(F, []) ->
    +    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) calls Fun(X) for each element X in L and the processing occurs in the order that the elements were defined in L. map does not define the order in which its elements are processed.

    @@ -166,24 +166,24 @@

    Syntax of Funs

    Funs are written with the following syntax (see -Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
    +Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
             ...
         end

    This creates an anonymous function of N arguments and binds it to the variable F.

    Another function, FunctionName, written in the same module, can be passed as an argument, using the following syntax:

    F = fun FunctionName/Arity

    With this form of function reference, the function that is referred to does not need to be exported from the module.

    It is also possible to refer to a function defined in a different module, with -the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    --export([t1/0, t2/0]).
    --import(lists, [map/2]).
    +the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    +-export([t1/0, t2/0]).
    +-import(lists, [map/2]).
     
    -t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
    +t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
     
    -t2() -> map(fun double/1, [1,2,3,4,5]).
    +t2() -> map(fun double/1, [1,2,3,4,5]).
     
    -double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test -is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    -   apply(F, Args);
    -f(N, _) when is_integer(N) ->
    +double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test +is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    +   apply(F, Args);
    +f(N, _) when is_integer(N) ->
        N.

    Funs are a distinct type. The BIFs erlang:fun_info/1,2 can be used to retrieve information about a fun, and the BIF erlang:fun_to_list/1 returns a textual representation of a fun. The check_process_code/2 @@ -196,18 +196,18 @@

    The scope rules for variables that occur in funs are as follows:

    • All variables that occur in the head of a fun are assumed to be "fresh" variables.
    • Variables that are defined before the fun, and that occur in function calls or -guard tests within the fun, have the values they had outside the fun.
    • Variables cannot be exported from a fun.

    The following examples illustrate these rules:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    -    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The +guard tests within the fun, have the values they had outside the fun.

  • Variables cannot be exported from a fun.
  • The following examples illustrate these rules:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    +    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The variable Stream, which is used within the fun, gets its value from the file:open line.

    As any variable that occurs in the head of a fun is considered a new variable, -it is equally valid to write as follows:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(File) ->
    -                io:format(Stream,"~p~n",[File])
    -            end, List),
    -    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise +it is equally valid to write as follows:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(File) ->
    +                io:format(Stream,"~p~n",[File])
    +            end, List),
    +    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise because code in the fun body cannot refer to the variable File, which is defined outside of the fun. Compiling this example gives the following diagnostic:

    ./FileName.erl:Line: Warning: variable 'File'
    @@ -216,20 +216,20 @@ 

    pattern matching operations must be moved into guard expressions and cannot be written in the head of the fun. For example, you might write the following code if you intend the first clause of F to be evaluated when the value of its -argument is Y:

    f(...) ->
    +argument is Y:

    f(...) ->
         Y = ...
    -    map(fun(X) when X == Y ->
    +    map(fun(X) when X == Y ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    -    ...

    instead of writing the following code:

    f(...) ->
    +        end, ...)
    +    ...

    instead of writing the following code:

    f(...) ->
         Y = ...
    -    map(fun(Y) ->
    +    map(fun(Y) ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    +        end, ...)
         ...

    @@ -243,58 +243,58 @@

    map

    -

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the +

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the list.

    When a new fun is defined in the shell, the value of the fun is printed as -Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
    +Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
     #Fun<erl_eval.6.72228031>
    -> lists:map(Double, [1,2,3,4,5]).
    -[2,4,6,8,10]

    +> lists:map(Double, [1,2,3,4,5]). +[2,4,6,8,10]

    any

    -

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    -    case Pred(H) of
    +

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    +    case Pred(H) of
             true  ->  true;
    -        false ->  any(Pred, T)
    +        false ->  any(Pred, T)
         end;
    -any(Pred, []) ->
    +any(Pred, []) ->
         false.

    A predicate is a function that returns true or false. any is true if there is a term X in the list such that P(X) is true.

    A predicate Big(X) is defined, which is true if its argument is greater that -10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
    +10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
     #Fun<erl_eval.6.72228031>
    -> lists:any(Big, [1,2,3,4]).
    +> lists:any(Big, [1,2,3,4]).
     false
    -> lists:any(Big, [1,2,3,12,5]).
    +> lists:any(Big, [1,2,3,12,5]).
     true

    all

    -

    lists:all/2 has the same arguments as any:

    all(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  ->  all(Pred, T);
    +

    lists:all/2 has the same arguments as any:

    all(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  ->  all(Pred, T);
             false ->  false
         end;
    -all(Pred, []) ->
    -    true.

    It is true if the predicate applied to all elements in the list is true.

    > lists:all(Big, [1,2,3,4,12,6]).
    +all(Pred, []) ->
    +    true.

    It is true if the predicate applied to all elements in the list is true.

    > lists:all(Big, [1,2,3,4,12,6]).
     false
    -> lists:all(Big, [12,13,14,15]).
    +> lists:all(Big, [12,13,14,15]).
     true

    foreach

    -

    lists:foreach/2 takes a function of one argument and a list of terms:

    foreach(F, [H|T]) ->
    -    F(H),
    -    foreach(F, T);
    -foreach(F, []) ->
    +

    lists:foreach/2 takes a function of one argument and a list of terms:

    foreach(F, [H|T]) ->
    +    F(H),
    +    foreach(F, T);
    +foreach(F, []) ->
         ok.

    The function is applied to each argument in the list. foreach returns ok. It -is only used for its side-effect:

    > lists:foreach(fun(X) -> io:format("~w~n",[X]) end, [1,2,3,4]).
    +is only used for its side-effect:

    > lists:foreach(fun(X) -> io:format("~w~n",[X]) end, [1,2,3,4]).
     1
     2
     3
    @@ -305,106 +305,106 @@ 

    foldl

    -

    lists:foldl/3 takes a function of two arguments, an accumulator and a list:

    foldl(F, Accu, [Hd|Tail]) ->
    -    foldl(F, F(Hd, Accu), Tail);
    -foldl(F, Accu, []) -> Accu.

    The function is called with two arguments. The first argument is the successive +

    lists:foldl/3 takes a function of two arguments, an accumulator and a list:

    foldl(F, Accu, [Hd|Tail]) ->
    +    foldl(F, F(Hd, Accu), Tail);
    +foldl(F, Accu, []) -> Accu.

    The function is called with two arguments. The first argument is the successive elements in the list. The second argument is the accumulator. The function must return a new accumulator, which is used the next time the function is called.

    If you have a list of lists L = ["I","like","Erlang"], then you can sum the -lengths of all the strings in L as follows:

    > L = ["I","like","Erlang"].
    -["I","like","Erlang"]
    -10> lists:foldl(fun(X, Sum) -> length(X) + Sum end, 0, L).
    -11

    lists:foldl/3 works like a while loop in an imperative language:

    L =  ["I","like","Erlang"],
    +lengths of all the strings in L as follows:

    > L = ["I","like","Erlang"].
    +["I","like","Erlang"]
    +10> lists:foldl(fun(X, Sum) -> length(X) + Sum end, 0, L).
    +11

    lists:foldl/3 works like a while loop in an imperative language:

    L =  ["I","like","Erlang"],
     Sum = 0,
    -while( L != []){
    -    Sum += length(head(L)),
    -    L = tail(L)
    +while( L != []){
    +    Sum += length(head(L)),
    +    L = tail(L)
     end

    mapfoldl

    -

    lists:mapfoldl/3 simultaneously maps and folds over a list:

    mapfoldl(F, Accu0, [Hd|Tail]) ->
    -    {R,Accu1} = F(Hd, Accu0),
    -    {Rs,Accu2} = mapfoldl(F, Accu1, Tail),
    -    {[R|Rs], Accu2};
    -mapfoldl(F, Accu, []) -> {[], Accu}.

    The following example shows how to change all letters in L to upper case and -then count them.

    First the change to upper case:

    > Upcase =  fun(X) when $a =< X,  X =< $z -> X + $A - $a;
    -(X) -> X
    +

    lists:mapfoldl/3 simultaneously maps and folds over a list:

    mapfoldl(F, Accu0, [Hd|Tail]) ->
    +    {R,Accu1} = F(Hd, Accu0),
    +    {Rs,Accu2} = mapfoldl(F, Accu1, Tail),
    +    {[R|Rs], Accu2};
    +mapfoldl(F, Accu, []) -> {[], Accu}.

    The following example shows how to change all letters in L to upper case and +then count them.

    First the change to upper case:

    > Upcase =  fun(X) when $a =< X,  X =< $z -> X + $A - $a;
    +(X) -> X
     end.
     #Fun<erl_eval.6.72228031>
     > Upcase_word =
    -fun(X) ->
    -lists:map(Upcase, X)
    +fun(X) ->
    +lists:map(Upcase, X)
     end.
     #Fun<erl_eval.6.72228031>
    -> Upcase_word("Erlang").
    +> Upcase_word("Erlang").
     "ERLANG"
    -> lists:map(Upcase_word, L).
    -["I","LIKE","ERLANG"]

    Now, the fold and the map can be done at the same time:

    > lists:mapfoldl(fun(Word, Sum) ->
    -{Upcase_word(Word), Sum + length(Word)}
    -end, 0, L).
    -{["I","LIKE","ERLANG"],11}

    +> lists:map(Upcase_word, L). +["I","LIKE","ERLANG"]

    Now, the fold and the map can be done at the same time:

    > lists:mapfoldl(fun(Word, Sum) ->
    +{Upcase_word(Word), Sum + length(Word)}
    +end, 0, L).
    +{["I","LIKE","ERLANG"],11}

    filter

    lists:filter/2 takes a predicate of one argument and a list and returns all elements -in the list that satisfy the predicate:

    filter(F, [H|T]) ->
    -    case F(H) of
    -        true  -> [H|filter(F, T)];
    -        false -> filter(F, T)
    +in the list that satisfy the predicate:

    filter(F, [H|T]) ->
    +    case F(H) of
    +        true  -> [H|filter(F, T)];
    +        false -> filter(F, T)
         end;
    -filter(F, []) -> [].
    > lists:filter(Big, [500,12,2,45,6,7]).
    -[500,12,45]

    Combining maps and filters enables writing of very succinct code. For example, +filter(F, []) -> [].

    > lists:filter(Big, [500,12,2,45,6,7]).
    +[500,12,45]

    Combining maps and filters enables writing of very succinct code. For example, to define a set difference function diff(L1, L2) to be the difference between -the lists L1 and L2, the code can be written as follows:

    diff(L1, L2) ->
    -    filter(fun(X) -> not member(X, L2) end, L1).

    This gives the list of all elements in L1 that are not contained in L2.

    The AND intersection of the list L1 and L2 is also easily defined:

    intersection(L1,L2) -> filter(fun(X) -> member(X,L1) end, L2).

    +the lists L1 and L2, the code can be written as follows:

    diff(L1, L2) ->
    +    filter(fun(X) -> not member(X, L2) end, L1).

    This gives the list of all elements in L1 that are not contained in L2.

    The AND intersection of the list L1 and L2 is also easily defined:

    intersection(L1,L2) -> filter(fun(X) -> member(X,L1) end, L2).

    takewhile

    lists:takewhile/2 takes elements X from a list L as long as the predicate -P(X) is true:

    takewhile(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  -> [H|takewhile(Pred, T)];
    -        false -> []
    +P(X) is true:

    takewhile(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  -> [H|takewhile(Pred, T)];
    +        false -> []
         end;
    -takewhile(Pred, []) ->
    -    [].
    > lists:takewhile(Big, [200,500,45,5,3,45,6]).
    -[200,500,45]

    +takewhile(Pred, []) -> + [].

    > lists:takewhile(Big, [200,500,45,5,3,45,6]).
    +[200,500,45]

    dropwhile

    -

    lists:dropwhile/2 is the complement of takewhile:

    dropwhile(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  -> dropwhile(Pred, T);
    -        false -> [H|T]
    +

    lists:dropwhile/2 is the complement of takewhile:

    dropwhile(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  -> dropwhile(Pred, T);
    +        false -> [H|T]
         end;
    -dropwhile(Pred, []) ->
    -    [].
    > lists:dropwhile(Big, [200,500,45,5,3,45,6]).
    -[5,3,45,6]

    +dropwhile(Pred, []) -> + [].

    > lists:dropwhile(Big, [200,500,45,5,3,45,6]).
    +[5,3,45,6]

    splitwith

    lists:splitwith/2 splits the list L into the two sublists {L1, L2}, where -L = takewhile(P, L) and L2 = dropwhile(P, L):

    splitwith(Pred, L) ->
    -    splitwith(Pred, L, []).
    +L = takewhile(P, L) and L2 = dropwhile(P, L):

    splitwith(Pred, L) ->
    +    splitwith(Pred, L, []).
     
    -splitwith(Pred, [H|T], L) ->
    -    case Pred(H) of
    -        true  -> splitwith(Pred, T, [H|L]);
    -        false -> {reverse(L), [H|T]}
    +splitwith(Pred, [H|T], L) ->
    +    case Pred(H) of
    +        true  -> splitwith(Pred, T, [H|L]);
    +        false -> {reverse(L), [H|T]}
         end;
    -splitwith(Pred, [], L) ->
    -    {reverse(L), []}.
    > lists:splitwith(Big, [200,500,45,5,3,45,6]).
    -{[200,500,45],[5,3,45,6]}

    +splitwith(Pred, [], L) -> + {reverse(L), []}.

    > lists:splitwith(Big, [200,500,45,5,3,45,6]).
    +{[200,500,45],[5,3,45,6]}

    @@ -419,60 +419,60 @@

    Simple Higher Order Functions

    Adder(X) is a function that given X, returns a new function G such that -G(K) returns K + X:

    > Adder = fun(X) -> fun(Y) -> X + Y end end.
    +G(K) returns K + X:

    > Adder = fun(X) -> fun(Y) -> X + Y end end.
     #Fun<erl_eval.6.72228031>
    -> Add6 = Adder(6).
    +> Add6 = Adder(6).
     #Fun<erl_eval.6.72228031>
    -> Add6(10).
    +> Add6(10).
     16

    Infinite Lists

    -

    The idea is to write something like:

    -module(lazy).
    --export([ints_from/1]).
    -ints_from(N) ->
    -    fun() ->
    -            [N|ints_from(N+1)]
    -    end.

    Then proceed as follows:

    > XX = lazy:ints_from(1).
    +

    The idea is to write something like:

    -module(lazy).
    +-export([ints_from/1]).
    +ints_from(N) ->
    +    fun() ->
    +            [N|ints_from(N+1)]
    +    end.

    Then proceed as follows:

    > XX = lazy:ints_from(1).
     #Fun<lazy.0.29874839>
    -> XX().
    -[1|#Fun<lazy.0.29874839>]
    -> hd(XX()).
    +> XX().
    +[1|#Fun<lazy.0.29874839>]
    +> hd(XX()).
     1
    -> Y = tl(XX()).
    +> Y = tl(XX()).
     #Fun<lazy.0.29874839>
    -> hd(Y()).
    +> hd(Y()).
     2

    And so on. This is an example of "lazy embedding".

    Parsing

    -

    The following examples show parsers of the following type:

    Parser(Toks) -> {ok, Tree, Toks1} | fail

    Toks is the list of tokens to be parsed. A successful parse returns +

    The following examples show parsers of the following type:

    Parser(Toks) -> {ok, Tree, Toks1} | fail

    Toks is the list of tokens to be parsed. A successful parse returns {ok, Tree, Toks1}.

    • Tree is a parse tree.
    • Toks1 is a tail of Tree that contains symbols encountered after the structure that was correctly parsed.

    An unsuccessful parse returns fail.

    The following example illustrates a simple, functional parser that parses the grammar:

    (a | b) & (c | d)

    The following code defines a function pconst(X) in the module funparse, -which returns a fun that parses a list of tokens:

    pconst(X) ->
    -    fun (T) ->
    +which returns a fun that parses a list of tokens:

    pconst(X) ->
    +    fun (T) ->
            case T of
    -           [X|T1] -> {ok, {const, X}, T1};
    +           [X|T1] -> {ok, {const, X}, T1};
                _      -> fail
            end
    -    end.

    This function can be used as follows:

    > P1 = funparse:pconst(a).
    +    end.

    This function can be used as follows:

    > P1 = funparse:pconst(a).
     #Fun<funparse.0.22674075>
    -> P1([a,b,c]).
    -{ok,{const,a},[b,c]}
    -> P1([x,y,z]).
    +> P1([a,b,c]).
    +{ok,{const,a},[b,c]}
    +> P1([x,y,z]).
     fail

    Next, the two higher order functions pand and por are defined. They combine -primitive parsers to produce more complex parsers.

    First pand:

    pand(P1, P2) ->
    -    fun (T) ->
    -        case P1(T) of
    -            {ok, R1, T1} ->
    -                case P2(T1) of
    -                    {ok, R2, T2} ->
    -                        {ok, {'and', R1, R2}};
    +primitive parsers to produce more complex parsers.

    First pand:

    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;
    @@ -482,33 +482,33 @@ 

    end.

    Given a parser P1 for grammar G1, and a parser P2 for grammar G2, pand(P1, P2) returns a parser for the grammar, which consists of sequences of tokens that satisfy G1, followed by sequences of tokens that satisfy G2.

    por(P1, P2) returns a parser for the language described by the grammar G1 or -G2:

    por(P1, P2) ->
    -    fun (T) ->
    -        case P1(T) of
    -            {ok, R, T1} ->
    -                {ok, {'or',1,R}, T1};
    +G2:

    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};
    +                case P2(T) of
    +                    {ok, R1, T1} ->
    +                        {ok, {'or',2,R1}, T1};
                         fail ->
                             fail
                     end
             end
         end.

    The original problem was to parse the grammar (a | b) & (c | d). The following -code addresses this problem:

    grammar() ->
    -    pand(
    -         por(pconst(a), pconst(b)),
    -         por(pconst(c), pconst(d))).

    The following code adds a parser interface to the grammar:

    parse(List) ->
    -    (grammar())(List).

    The parser can be tested as follows:

    > funparse:parse([a,c]).
    -{ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}}
    -> funparse:parse([a,d]).
    -{ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}}
    -> funparse:parse([b,c]).
    -{ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}}
    -> funparse:parse([b,d]).
    -{ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}}
    -> funparse:parse([a,b]).
    +code addresses this problem:

    grammar() ->
    +    pand(
    +         por(pconst(a), pconst(b)),
    +         por(pconst(c), pconst(d))).

    The following code adds a parser interface to the grammar:

    parse(List) ->
    +    (grammar())(List).

    The parser can be tested as follows:

    > funparse:parse([a,c]).
    +{ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}}
    +> funparse:parse([a,d]).
    +{ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}}
    +> funparse:parse([b,c]).
    +{ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}}
    +> funparse:parse([b,d]).
    +{ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}}
    +> funparse:parse([a,b]).
     fail

    diff --git a/prs/8803/doc/system/gen_server_concepts.html b/prs/8803/doc/system/gen_server_concepts.html index 0b69a255548a5..963f782ef746d 100644 --- a/prs/8803/doc/system/gen_server_concepts.html +++ b/prs/8803/doc/system/gen_server_concepts.html @@ -161,40 +161,40 @@

    An example of a simple server written in plain Erlang is provided in Overview. The server can be reimplemented using -gen_server, resulting in this callback module:

    -module(ch3).
    --behaviour(gen_server).
    +gen_server, resulting in this callback module:

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([init/1, handle_call/3, handle_cast/2]).
    +-export([start_link/0]).
    +-export([alloc/0, free/1]).
    +-export([init/1, handle_call/3, handle_cast/2]).
     
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    +start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []).
     
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    +alloc() ->
    +    gen_server:call(ch3, alloc).
     
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    +free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).
     
    -init(_Args) ->
    -    {ok, channels()}.
    +init(_Args) ->
    +    {ok, channels()}.
     
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.
    +handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.
     
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    The code is explained in the next sections.

    +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    The code is explained in the next sections.

    Starting a Gen_Server

    In the example in the previous section, gen_server is started by calling -ch3:start_link():

    start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function +ch3:start_link():

    start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function spawns and links to a new process, a gen_server.

    • The first argument, {local, ch3}, specifies the name. The gen_server is then locally registered as ch3.

      If the name is omitted, the gen_server is not registered. Instead its pid must be used. The name can also be given as {global, Name}, in which case @@ -208,8 +208,8 @@

      for the available options.

    If name registration succeeds, the new gen_server process calls the callback function ch3:init([]). init is expected to return {ok, State}, where State is the internal state of the gen_server. In this case, the state is -the available channels.

    init(_Args) ->
    -    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the +the available channels.

    init(_Args) ->
    +    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the gen_server has been initialized and is ready to receive requests.

    gen_server:start_link/4 must be used if the gen_server is part of a supervision tree, meaning that it was started by a supervisor. There is another function, gen_server:start/4, to start a standalone @@ -225,9 +225,9 @@

    When the request is received, the gen_server calls handle_call(Request, From, State), which is expected to return a tuple {reply,Reply,State1}. Reply is the reply that is to be sent back -to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the +to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the set of remaining available channels Chs2.

    Thus, the call ch3:alloc() returns the allocated channel Ch and the gen_server then waits for new requests, now with an updated list of available channels.

    @@ -236,13 +236,13 @@

    Asynchronous Requests - Cast

    -

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. +

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. cast, and thus free, then returns ok.

    When the request is received, the gen_server calls handle_cast(Request, State), which is expected to return a tuple -{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. +{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    +    Chs2 = free(Ch, Chs),
    +    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. The gen_server is now ready for new requests.

    @@ -261,15 +261,15 @@

    set in the supervisor.

    If it is necessary to clean up before termination, the shutdown strategy must be a time-out value and the gen_server must be set to trap exit signals in function init. When ordered to shutdown, the gen_server then calls -the callback function terminate(shutdown, State):

    init(Args) ->
    +the callback function terminate(shutdown, State):

    init(Args) ->
         ...,
    -    process_flag(trap_exit, true),
    +    process_flag(trap_exit, true),
         ...,
    -    {ok, State}.
    +    {ok, State}.
     
     ...
     
    -terminate(shutdown, State) ->
    +terminate(shutdown, State) ->
         %% Code for cleaning up here
         ...
         ok.

    @@ -280,21 +280,21 @@

    If the gen_server is not part of a supervision tree, a stop function can be useful, for example:

    ...
    -export([stop/0]).
    +export([stop/0]).
     ...
     
    -stop() ->
    -    gen_server:cast(ch3, stop).
    +stop() ->
    +    gen_server:cast(ch3, stop).
     ...
     
    -handle_cast(stop, State) ->
    -    {stop, normal, State};
    -handle_cast({free, Ch}, State) ->
    +handle_cast(stop, State) ->
    +    {stop, normal, State};
    +handle_cast({free, Ch}, State) ->
         ...
     
     ...
     
    -terminate(normal, State) ->
    +terminate(normal, State) ->
         ok.

    The callback function handling the stop request returns a tuple {stop,normal,State1}, where normal specifies that it is a normal termination and State1 is a new value for the state @@ -309,13 +309,13 @@

    the callback function handle_info(Info, State) must be implemented to handle them. Examples of other messages are exit messages, if the gen_server is linked to other processes than the supervisor -and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.

    diff --git a/prs/8803/doc/system/included_applications.html b/prs/8803/doc/system/included_applications.html index daef8aa7aa637..b66e2998936a2 100644 --- a/prs/8803/doc/system/included_applications.html +++ b/prs/8803/doc/system/included_applications.html @@ -165,16 +165,16 @@

    Specifying Included Applications

    Which applications to include is defined by the included_applications key in -the .app file:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {prim_app_cb,[]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.

    +the .app file:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {prim_app_cb,[]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.

    @@ -188,27 +188,27 @@

    term.

    The value of the mod key of the including application must be set to {application_starter,[Module,StartArgs]}, where Module as usual is the application callback module. StartArgs is a term provided as argument to the -callback function Module:start/2:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {start_phases, [{init,[]}, {go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {application_starter,[prim_app_cb,[]]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.
    -
    -{application, incl_app,
    - [{description, "Included application"},
    -  {vsn, "1"},
    -  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    -  {registered, []},
    -  {start_phases, [{go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {incl_app_cb,[]}}
    - ]}.

    When starting a primary application with included applications, the primary +callback function Module:start/2:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {start_phases, [{init,[]}, {go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {application_starter,[prim_app_cb,[]]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.
    +
    +{application, incl_app,
    + [{description, "Included application"},
    +  {vsn, "1"},
    +  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    +  {registered, []},
    +  {start_phases, [{go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {incl_app_cb,[]}}
    + ]}.

    When starting a primary application with included applications, the primary application is started the normal way, that is:

    • The application controller creates an application master for the application
    • The application master calls Module:start(normal, StartArgs) to start the top supervisor.

    Then, for the primary application and each included application in top-down, left-to-right order, the application master calls @@ -221,11 +221,11 @@

    of specified phases must be a subset of the set of phases specified for the primary application.

    When starting prim_app as defined above, the application controller calls the following callback functions before application:start(prim_app) returns a -value:

    application:start(prim_app)
    - => prim_app_cb:start(normal, [])
    - => prim_app_cb:start_phase(init, normal, [])
    - => prim_app_cb:start_phase(go, normal, [])
    - => incl_app_cb:start_phase(go, normal, [])
    +value:

    application:start(prim_app)
    + => prim_app_cb:start(normal, [])
    + => prim_app_cb:start_phase(init, normal, [])
    + => prim_app_cb:start_phase(go, normal, [])
    + => incl_app_cb:start_phase(go, normal, [])
     ok

    diff --git a/prs/8803/doc/system/install-win32.html b/prs/8803/doc/system/install-win32.html index 145e095f0262e..c87d21c14215f 100644 --- a/prs/8803/doc/system/install-win32.html +++ b/prs/8803/doc/system/install-win32.html @@ -299,7 +299,7 @@

    and sometimes

    $ cd $ERL_TOP
     $ make local_setup
     

    So now when you run $ERL_TOP/erl.exe, you should have a debug compiled -emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you +emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you got a debug compiled emulator.

    To hack the erlang libraries, you simply do a make opt in the specific "applications" directory, like:

    $ cd $ERL_TOP/lib/stdlib
     $ make opt
    @@ -322,11 +322,11 @@ 

    Remember that:

    • Windows specific C-code goes in the $ERL_TOP/erts/emulator/sys/win32, $ERL_TOP/erts/emulator/drivers/win32 or $ERL_TOP/erts/etc/win32.

    • Windows specific erlang code should be used conditionally and the host OS tested in runtime, the exactly same beam files should be -distributed for every platform! So write code like:

      case os:type() of
      -    {win32,_} ->
      -        do_windows_specific();
      +distributed for every platform! So write code like:

      case os:type() of
      +    {win32,_} ->
      +        do_windows_specific();
           Other ->
      -        do_fallback_or_exit()
      +        do_fallback_or_exit()
       end,

    That's basically all you need to get going.

    diff --git a/prs/8803/doc/system/list_comprehensions.html b/prs/8803/doc/system/list_comprehensions.html index 54e84b573554c..a46cafc2ba15b 100644 --- a/prs/8803/doc/system/list_comprehensions.html +++ b/prs/8803/doc/system/list_comprehensions.html @@ -121,25 +121,25 @@

    Simple Examples

    -

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    -[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list +

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    +[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list [1,2,a,...] and X is greater than 3.

    The notation X <- [1,2,a,...] is a generator and the expression X > 3 is a filter.

    An additional filter, is_integer(X), can be added to -restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    -[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can -be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    -[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    +restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    +[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can +be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    +[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    Quick Sort

    -

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    -sort([_] = L) -> L;
    -sort([Pivot|T]) ->
    -    sort([ X || X <- T, X < Pivot]) ++
    -    [Pivot] ++
    -    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T +

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    +sort([_] = L) -> L;
    +sort([Pivot|T]) ->
    +    sort([ X || X <- T, X < Pivot]) ++
    +    [Pivot] ++
    +    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T that are less than Pivot.

    [X || X <- T, X >= Pivot] is the list of all elements in T that are greater than or equal to Pivot.

    With the algorithm above, a list is sorted as follows:

    • A list with zero or one element is trivially sorted.
    • For lists with more than one element:
      1. The first element in the list is isolated as the pivot element.
      2. The remaining list is partitioned into two sublists, such that:
      • The first sublist contains all elements that are smaller than the pivot element.
      • The second sublist contains all elements that are greater than or equal to @@ -155,11 +155,11 @@

        Permutations

        -

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        -perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists +

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        +perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L, with H -removed:

        > perms([b,u,g]).
        -[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        +removed:

        > perms([b,u,g]).
        +[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        @@ -168,47 +168,47 @@

        Pythagorean triplets are sets of integers {A,B,C} such that A**2 + B**2 = C**2.

        The function pyth(N) generates a list of all integers {A,B,C} such that A**2 + B**2 = C**2 and where the sum of the sides is equal to, or less than, -N:

        pyth(N) ->
        -    [ {A,B,C} ||
        -        A <- lists:seq(1,N),
        -        B <- lists:seq(1,N),
        -        C <- lists:seq(1,N),
        +N:

        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
        -    ].
        > pyth(3).
        -[].
        -> pyth(11).
        -[].
        -> pyth(12).
        -[{3,4,5},{4,3,5}]
        -> pyth(50).
        -[{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}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        -   [{A,B,C} ||
        -       A <- lists:seq(1,N-2),
        -       B <- lists:seq(A+1,N-1),
        -       C <- lists:seq(B+1,N),
        +    ].
        > pyth(3).
        +[].
        +> pyth(11).
        +[].
        +> pyth(12).
        +[{3,4,5},{4,3,5}]
        +> pyth(50).
        +[{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}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        +   [{A,B,C} ||
        +       A <- lists:seq(1,N-2),
        +       B <- lists:seq(A+1,N-1),
        +       C <- lists:seq(B+1,N),
                A+B+C =< N,
        -       A*A+B*B == C*C ].

        + A*A+B*B == C*C ].

        Simplifications With List Comprehensions

        As an example, list comprehensions can be used to simplify some of the functions -in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        -map(Fun, L) -> [Fun(X) || X <- L].
        -filter(Pred, L) -> [X || X <- L, Pred(X)].

        +in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        +map(Fun, L) -> [Fun(X) || X <- L].
        +filter(Pred, L) -> [X || X <- L, Pred(X)].

        @@ -220,20 +220,20 @@

        which selects certain elements from a list of tuples. Suppose you write select(X, L) -> [Y || {X, Y} <- L]. with the intention of extracting all tuples from L, where the first item is X.

        Compiling this gives the following diagnostic:

        ./FileName.erl:Line: Warning: variable 'X' shadowed in generate

        This diagnostic warns that the variable X in the pattern is not the same as -the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be -written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into -the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the -same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        -[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is +the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be +written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into +the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the +same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        +[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is that certain pattern matching operations must be moved into the filters and -cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
        +cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y  <- Expr, ...]
        -    ...

        Instead, write as follows:

        f(...) ->
        +    [ Expression || PatternInvolving Y  <- Expr, ...]
        +    ...

        Instead, write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
        +    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
             ...

    diff --git a/prs/8803/doc/system/listhandling.html b/prs/8803/doc/system/listhandling.html index 0c1b3c0abae0c..1938e4e8c5692 100644 --- a/prs/8803/doc/system/listhandling.html +++ b/prs/8803/doc/system/listhandling.html @@ -124,47 +124,47 @@

    Lists can only be built starting from the end and attaching list elements at the beginning. If you use the ++ operator as follows, a new list is created that is a copy of the elements in List1, followed by List2:

    List1 ++ List2

    Looking at how lists:append/2 or ++ would be implemented in plain Erlang, -clearly the first list is copied:

    append([H|T], Tail) ->
    -    [H|append(T, Tail)];
    -append([], Tail) ->
    +clearly the first list is copied:

    append([H|T], Tail) ->
    +    [H|append(T, Tail)];
    +append([], Tail) ->
         Tail.

    When recursing and building a list, it is important to ensure that you attach the new elements to the beginning of the list. In this way, you will build one -list, not hundreds or thousands of copies of the growing result list.

    Let us first see how it is not to be done:

    DO NOT

    bad_fib(N) ->
    -    bad_fib(N, 0, 1, []).
    +list, not hundreds or thousands of copies of the growing result list.

    Let us first see how it is not to be done:

    DO NOT

    bad_fib(N) ->
    +    bad_fib(N, 0, 1, []).
     
    -bad_fib(0, _Current, _Next, Fibs) ->
    +bad_fib(0, _Current, _Next, Fibs) ->
         Fibs;
    -bad_fib(N, Current, Next, Fibs) ->
    -    bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

    Here more than one list is built. In each iteration step a new list is created +bad_fib(N, Current, Next, Fibs) -> + bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

    Here more than one list is built. In each iteration step a new list is created that is one element longer than the new previous list.

    To avoid copying the result in each iteration, build the list in reverse order -and reverse the list when you are done:

    DO

    tail_recursive_fib(N) ->
    -    tail_recursive_fib(N, 0, 1, []).
    +and reverse the list when you are done:

    DO

    tail_recursive_fib(N) ->
    +    tail_recursive_fib(N, 0, 1, []).
     
    -tail_recursive_fib(0, _Current, _Next, Fibs) ->
    -    lists:reverse(Fibs);
    -tail_recursive_fib(N, Current, Next, Fibs) ->
    -    tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

    +tail_recursive_fib(0, _Current, _Next, Fibs) -> + lists:reverse(Fibs); +tail_recursive_fib(N, Current, Next, Fibs) -> + tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

    List Comprehensions

    -

    A list comprehension:

    [Expr(E) || E <- List]

    is basically translated to a local function:

    'lc^0'([E|Tail], Expr) ->
    -    [Expr(E)|'lc^0'(Tail, Expr)];
    -'lc^0'([], _Expr) -> [].

    If the result of the list comprehension will obviously not be used, a list -will not be constructed. For example, in this code:

    [io:put_chars(E) || E <- List],
    +

    A list comprehension:

    [Expr(E) || E <- List]

    is basically translated to a local function:

    'lc^0'([E|Tail], Expr) ->
    +    [Expr(E)|'lc^0'(Tail, Expr)];
    +'lc^0'([], _Expr) -> [].

    If the result of the list comprehension will obviously not be used, a list +will not be constructed. For example, in this code:

    [io:put_chars(E) || E <- List],
     ok.

    or in this code:

    case Var of
         ... ->
    -        [io:put_chars(E) || E <- List];
    +        [io:put_chars(E) || E <- List];
         ... ->
     end,
    -some_function(...),

    the value is not assigned to a variable, not passed to another function, and not +some_function(...),

    the value is not assigned to a variable, not passed to another function, and not returned. This means that there is no need to construct a list and the compiler -will simplify the code for the list comprehension to:

    'lc^0'([E|Tail], Expr) ->
    -    Expr(E),
    -    'lc^0'(Tail, Expr);
    -'lc^0'([], _Expr) -> [].

    The compiler also understands that assigning to _ means that the value will -not be used. Therefore, the code in the following example will also be optimized:

    _ = [io:put_chars(E) || E <- List],
    +will simplify the code for the list comprehension to:

    'lc^0'([E|Tail], Expr) ->
    +    Expr(E),
    +    'lc^0'(Tail, Expr);
    +'lc^0'([], _Expr) -> [].

    The compiler also understands that assigning to _ means that the value will +not be used. Therefore, the code in the following example will also be optimized:

    _ = [io:put_chars(E) || E <- List],
     ok.

    @@ -177,11 +177,11 @@

    to flatten the list before sending it to the port.
  • When calling BIFs that accept deep lists, such as list_to_binary/1 or iolist_to_binary/1.
  • When you know that your list is only one level deep. Use lists:append/1 -instead.
  • Examples:

    DO

    port_command(Port, DeepList)

    DO NOT

    port_command(Port, lists:flatten(DeepList))

    A common way to send a zero-terminated string to a port is the following:

    DO NOT

    TerminatedStr = String ++ [0],
    -port_command(Port, TerminatedStr)

    Instead:

    DO

    TerminatedStr = [String, 0],
    -port_command(Port, TerminatedStr)

    DO

    1> lists:append([[1], [2], [3]]).
    -[1,2,3]

    DO NOT

    1> lists:flatten([[1], [2], [3]]).
    -[1,2,3]

    +instead.

    Examples:

    DO

    port_command(Port, DeepList)

    DO NOT

    port_command(Port, lists:flatten(DeepList))

    A common way to send a zero-terminated string to a port is the following:

    DO NOT

    TerminatedStr = String ++ [0],
    +port_command(Port, TerminatedStr)

    Instead:

    DO

    TerminatedStr = [String, 0],
    +port_command(Port, TerminatedStr)

    DO

    1> lists:append([[1], [2], [3]]).
    +[1,2,3]

    DO NOT

    1> lists:flatten([[1], [2], [3]]).
    +[1,2,3]

    @@ -189,17 +189,17 @@

    There are two basic ways to write a function that traverses a list and produces a new list.

    The first way is writing a body-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_body([H|T]) ->
    -    [H + 42 | add_42_body(T)];
    -add_42_body([]) ->
    -    [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_tail(List) ->
    -    add_42_tail(List, []).
    -
    -add_42_tail([H|T], Acc) ->
    -    add_42_tail(T, [H + 42 | Acc]);
    -add_42_tail([], Acc) ->
    -    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically +add_42_body([H|T]) -> + [H + 42 | add_42_body(T)]; +add_42_body([]) -> + [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    +add_42_tail(List) ->
    +    add_42_tail(List, []).
    +
    +add_42_tail([H|T], Acc) ->
    +    add_42_tail(T, [H + 42 | Acc]);
    +add_42_tail([], Acc) ->
    +    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically be more efficient. In modern versions of Erlang, there is usually not much difference in performance between a body-recursive list function and tail-recursive function that reverses the list at the end. Therefore, @@ -210,11 +210,11 @@

    function that does not construct a list runs in constant space, while the corresponding body-recursive function uses stack space proportional to the length of the list.

    For example, a function that sums a list of integers, is not to be written as -follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    -recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
    +follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    +recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
     
    -sum([H|T], Sum) -> sum(T, Sum + H);
    -sum([], Sum)    -> Sum.
    +
    sum([H|T], Sum) -> sum(T, Sum + H); +sum([], Sum) -> Sum.

    diff --git a/prs/8803/doc/system/macros.html b/prs/8803/doc/system/macros.html index 01ed45af1d80a..2a1d6f39f5fc5 100644 --- a/prs/8803/doc/system/macros.html +++ b/prs/8803/doc/system/macros.html @@ -121,8 +121,8 @@

    File Inclusion

    -

    A file can be included as follows:

    -include(File).
    --include_lib(File).

    File, a string, is to point out a file. The contents of this file are included +

    A file can be included as follows:

    -include(File).
    +-include_lib(File).

    File, a string, is to point out a file. The contents of this file are included as is, at the position of the directive.

    Include files are typically used for record and macro definitions that are shared by several modules. It is recommended to use the file name extension .hrl for include files.

    File can start with a path component $VAR, for some string VAR. If that is @@ -131,12 +131,12 @@

    $VAR is left as is.

    If the filename File is absolute (possibly after variable substitution), the include file with that name is included. Otherwise, the specified file is searched for in the following directories, and in this order:

    1. The current working directory
    2. The directory where the module is being compiled
    3. The directories given by the include option

    For details, see erlc in ERTS and -compile in Compiler.

    Examples:

    -include("my_records.hrl").
    --include("incdir/my_records.hrl").
    --include("/home/user/proj/my_records.hrl").
    --include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. +compile in Compiler.

    Examples:

    -include("my_records.hrl").
    +-include("incdir/my_records.hrl").
    +-include("/home/user/proj/my_records.hrl").
    +-include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. Instead, the first path component (possibly after variable substitution) is -assumed to be the name of an application.

    Example:

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

    The code server uses code:lib_dir(kernel) to find the directory of the current +assumed to be the name of an application.

    Example:

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

    The code server uses code:lib_dir(kernel) to find the directory of the current (latest) version of Kernel, and then the subdirectory include is searched for the file file.hrl.

    @@ -144,25 +144,25 @@

    Defining and Using Macros

    -

    A macro is defined as follows:

    -define(Const, Replacement).
    --define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function +

    A macro is defined as follows:

    -define(Const, Replacement).
    +-define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the macro.

    If a macro is used in several modules, it is recommended that the macro definition is placed in an include file.

    A macro is used as follows:

    ?Const
     ?Func(Arg1,...,ArgN)

    Macros are expanded during compilation. A simple macro ?Const is replaced with -Replacement.

    Example:

    -define(TIMEOUT, 200).
    +Replacement.

    Example:

    -define(TIMEOUT, 200).
     ...
    -call(Request) ->
    -    server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    -    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all +call(Request) -> + server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    +    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all occurrences of a variable Var from the macro definition are replaced with the -corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
    +corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
     ...
    -bar(X) ->
    -    ?MACRO1(a, b),
    -    ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    -    {a,a,b,b},
    -    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro +bar(X) -> + ?MACRO1(a, b), + ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    +    {a,a,b,b},
    +    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro definition is a valid Erlang syntactic form.

    To view the result of macro expansion, a module can be compiled with the 'P' option. compile:file(File, ['P']). This produces a listing of the parsed code after preprocessing and parse transforms, in the file File.P.

    @@ -189,21 +189,21 @@

    It is possible to overload macros, except for predefined macros. An overloaded macro has more than one definition, each with a different number of arguments.

    Change

    Support for overloading of macros was added in Erlang 5.7.5/OTP R13B04.

    A macro ?Func(Arg1,...,ArgN) with a (possibly empty) list of arguments results in an error message if there is at least one definition of Func with -arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    --define(F1(A), A).
    --define(C, m:f).

    the following does not work:

    f0() ->
    +arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    +-define(F1(A), A).
    +-define(C, m:f).

    the following does not work:

    f0() ->
         ?F0. % No, an empty list of arguments expected.
     
    -f1(A) ->
    -    ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    -    ?C().

    is expanded to

    f() ->
    -    m:f().

    +f1(A) -> + ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    +    ?C().

    is expanded to

    f() ->
    +    m:f().

    Removing a macro definition

    -

    A definition of macro can be removed as follows:

    -undef(Macro).

    +

    A definition of macro can be removed as follows:

    -undef(Macro).

    @@ -223,13 +223,13 @@

    elif also supports calling the psuedo-function defined(Name), which tests whether the Name argument is the name of a previously defined macro. defined(Name) evaluates to true if the macro is defined and false -otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
    +otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
     ...
     
    --ifdef(debug).
    --define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
    +-ifdef(debug).
    +-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
     -else.
    --define(LOG(X), true).
    +-define(LOG(X), true).
     -endif.
     
     ...

    When trace output is desired, debug is to be defined when the module m is @@ -237,21 +237,21 @@

    or -1> c(m, {d, debug}). -{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user -with some simple trace output.

    Example:

    -module(m)
    +1> c(m, {d, debug}).
    +{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user +with some simple trace output.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 25).
    +-if(?OTP_RELEASE >= 25).
     %% Code that will work in OTP 25 or higher
    --elif(?OTP_RELEASE >= 26).
    +-elif(?OTP_RELEASE >= 26).
     %% Code that will work in OTP 26 or higher
     -else.
     %% Code that will work in OTP 24 or lower.
     -endif.
     ...

    This code uses the OTP_RELEASE macro to conditionally select code depending on -release.

    Example:

    -module(m)
    +release.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 26 andalso defined(debug)).
    +-if(?OTP_RELEASE >= 26 andalso defined(debug)).
     %% Debugging code that requires OTP 26 or later.
     -else.
     %% Non-debug code that works in any release.
    @@ -274,23 +274,23 @@ 

    -error() and -warning() directives

    -

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    --export([version/0]).
    +

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifdef(VERSION).
    -version() -> ?VERSION.
    +-ifdef(VERSION).
    +version() -> ?VERSION.
     -else.
    --error("Macro VERSION must be defined.").
    -version() -> "".
    +-error("Macro VERSION must be defined.").
    +version() -> "".
     -endif.

    The error message will look like this:

    % erlc t.erl
    -t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    --export([version/0]).
    +t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifndef(VERSION).
    --warning("Macro VERSION not defined -- using default version.").
    --define(VERSION, "0").
    +-ifndef(VERSION).
    +-warning("Macro VERSION not defined -- using default version.").
    +-define(VERSION, "0").
     -endif.
    -version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
    +version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
     t.erl:5: Warning: -warning("Macro VERSION not defined -- using default version.").

    Change

    The -error() and -warning() directives were added in Erlang/OTP 19.

    @@ -299,11 +299,11 @@

    The construction ??Arg, where Arg is a macro argument, is expanded to a string containing the tokens of the argument. This is similar to the #arg -stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
    +stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
     
    -?TESTCALL(myfunction(1,2)),
    -?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    -io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    +
    ?TESTCALL(myfunction(1,2)), +?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    +io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    diff --git a/prs/8803/doc/system/maps.html b/prs/8803/doc/system/maps.html index e7aab8e5629eb..625a301852410 100644 --- a/prs/8803/doc/system/maps.html +++ b/prs/8803/doc/system/maps.html @@ -152,8 +152,8 @@

    values, sharing of keys between different instances of the map will be less effective, and it is not possible to match multiple elements having default values in one go.

  • To avoid having to deal with a map that may lack some keys, maps:merge/2 can -efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)
  • +efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

    @@ -171,10 +171,10 @@

    Using Maps as Sets

    Starting in OTP 24, the sets module has an option to represent sets as maps. -Examples:

    1> sets:new([{version,2}]).
    -#{}
    -2> sets:from_list([x,y,z], [{version,2}]).
    -#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a +Examples:

    1> sets:new([{version,2}]).
    +#{}
    +2> sets:from_list([x,y,z], [{version,2}]).
    +#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a few possible exceptions:

    • ordsets:intersection/2 can be more efficient than sets:intersection/2. If the intersection operation is frequently used and operations that operate on a single element in a set (such as is_element/2) are avoided, ordsets can @@ -207,10 +207,10 @@

      allowing the key tuple to be shared with other instances of the map that have the same keys. In fact, the key tuple can be shared between all maps with the same keys with some care. To arrange that, define a function that returns a map. -For example:

      new() ->
      -    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure +For example:

      new() ->
      +    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure that the key tuple is shared when creating an instance of the map, always call -new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the +new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the keys are known at compile-time, the map is updated in one go, making the time to update a map essentially constant regardless of the number of keys updated. The same goes for matching. (When the keys are variables, one or more of the keys @@ -245,13 +245,13 @@

      Using the map syntax is usually slightly more efficient than using the corresponding function in the maps module.

      The gain in efficiency for the map syntax is more noticeable for the following -operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      -Map3 = maps:update(y, Y, Map2),
      -Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to -right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from -left to right:

      Map2 = Map1#{Key1 := X},
      -Map3 = Map2#{Key2 := Y},
      -Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more +operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      +Map3 = maps:update(y, Y, Map2),
      +Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to +right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from +left to right:

      Map2 = Map1#{Key1 := X},
      +Map3 = Map2#{Key2 := Y},
      +Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more efficient than using the => operator for a small map.

      @@ -310,15 +310,15 @@

      As an optimization, the compiler will rewrite a call to maps:get/3 to Erlang code similar to the following:

      Result = case Map of
      -             #{Key := Value} -> Value;
      -             #{} -> Default
      +             #{Key := Value} -> Value;
      +             #{} -> Default
                end

      This is reasonably efficient, but if a small map is used as an alternative to using a record it is often better not to rely on default values as it prevents sharing of keys, which may in the end use more memory than what you save from not storing default values in the map.

      If default values are nevertheless required, instead of calling maps:get/3 multiple times, consider putting the default values in a map and merging that -map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults +map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults to, as long as the default map contains all the keys that will ever be used and not just the ones with default values. Whether this is faster than calling maps:get/3 multiple times depends on the size of the map and the number of @@ -414,21 +414,21 @@

      maps:put/3 is implemented in C.

      If the key is known to already exist in the map, maps:update/3 is slightly more efficient than maps:put/3.

      If the compiler can determine that the third argument is always a map, it -will rewrite the call to maps:put/3 to use the map syntax for updating the map.

      For example, consider the following function:

      add_to_known_map(Map0, A, B, C) when is_map(Map0) ->
      -    Map1 = maps:put(a, A, Map0),
      -    Map2 = maps:put(b, B, Map1),
      -    maps:put(c, C, Map2).

      The compiler first rewrites each call to maps:put/3 to use the map +will rewrite the call to maps:put/3 to use the map syntax for updating the map.

      For example, consider the following function:

      add_to_known_map(Map0, A, B, C) when is_map(Map0) ->
      +    Map1 = maps:put(a, A, Map0),
      +    Map2 = maps:put(b, B, Map1),
      +    maps:put(c, C, Map2).

      The compiler first rewrites each call to maps:put/3 to use the map syntax, and subsequently combines the three update operations to a -single update operation:

      add_to_known_map(Map0, A, B, C) when is_map(Map0) ->
      -    Map0#{a => A, b => B, c => C}.

      If the compiler cannot determine that the third argument is always a +single update operation:

      add_to_known_map(Map0, A, B, C) when is_map(Map0) ->
      +    Map0#{a => A, b => B, c => C}.

      If the compiler cannot determine that the third argument is always a map, it retains the maps:put/3 call. For example, given this -function:

      add_to_map(Map0, A, B, C) ->
      -    Map1 = maps:put(a, A, Map0),
      -    Map2 = maps:put(b, B, Map1),
      -    maps:put(c, C, Map2).

      the compiler keeps the first call to maps:put/3, but rewrites -and combines the other two calls:

      add_to_map(Map0, A, B, C) ->
      -    Map1 = maps:put(a, A, Map0),
      -    Map1#{b => B, c => C}.

      Change

      The rewriting of maps:put/3 to the map syntax was introduced in +function:

      add_to_map(Map0, A, B, C) ->
      +    Map1 = maps:put(a, A, Map0),
      +    Map2 = maps:put(b, B, Map1),
      +    maps:put(c, C, Map2).

      the compiler keeps the first call to maps:put/3, but rewrites +and combines the other two calls:

      add_to_map(Map0, A, B, C) ->
      +    Map1 = maps:put(a, A, Map0),
      +    Map1#{b => B, c => C}.

      Change

      The rewriting of maps:put/3 to the map syntax was introduced in Erlang/OTP 28.

      diff --git a/prs/8803/doc/system/modules.html b/prs/8803/doc/system/modules.html index a3cefbf17bd05..22e61a6c50f43 100644 --- a/prs/8803/doc/system/modules.html +++ b/prs/8803/doc/system/modules.html @@ -122,12 +122,12 @@

      Module Syntax

      Erlang code is divided into modules. A module consists of a sequence of -attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      --export([fact/1]).   % module attribute
      +attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      +-export([fact/1]).   % module attribute
       
      -fact(N) when N>0 ->  % beginning of function declaration
      -    N * fact(N-1);   %  |
      -fact(0) ->           %  |
      +fact(N) when N>0 ->  % beginning of function declaration
      +    N * fact(N-1);   %  |
      +fact(0) ->           %  |
           1.               % end of function declaration

      For a description of function declarations, see Function Declaration Syntax.

      @@ -180,9 +180,9 @@

      Behaviour Module Attribute

      It is possible to specify that the module is the callback module for a -behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a +behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a user-defined behaviour or one of the following OTP standard behaviours:

      • gen_server
      • gen_statem
      • gen_event
      • supervisor

      The spelling behavior is also accepted.

      The callback functions of the module can be specified either directly by the -exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute +exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute is to be preferred since the extra type information can be used by tools to produce documentation or find discrepancies.

      Read more about behaviours and callback modules in OTP Design Principles.

      @@ -191,7 +191,7 @@

      Record Definitions

      -

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function +

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function declarations. Read more in Records.

      @@ -199,15 +199,15 @@

      Preprocessor

      The same syntax as for module attributes is used by the preprocessor, which -supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      --define(Macro, Replacement).

      Read more in Preprocessor.

      +supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      +-define(Macro, Replacement).

      Read more in Preprocessor.

      Setting File and Line

      The same syntax as for module attributes is used for changing the pre-defined -macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the +macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the source program is generated by another tool. It also indicates the correspondence of source files to lines of the original user-written file, from which the source program is produced.

      @@ -217,8 +217,8 @@

      Types and function specifications

      A similar syntax as for module attributes is used for specifying types and -function specifications:

      -type my_type() :: atom() | integer().
      --spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on +function specifications:

      -type my_type() :: atom() | integer().
      +-spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on EEP8 - Types and function specifications, which is not to be further updated.

      @@ -227,16 +227,16 @@

      Documentation attributes

      The module attribute -doc(Documentation) is used to provide user documentation -for a function/type/callback:

      -doc("Example documentation").
      -example() -> ok.

      The attribute should be placed just before the entity it documents.The +for a function/type/callback:

      -doc("Example documentation").
      +example() -> ok.

      The attribute should be placed just before the entity it documents.The parenthesis are optional around Documentation. The allowed values for Documentation are:

      • literal string or utf-8 encoded binary string - The string documenting the entity. Any literal string is allowed, so both triple quoted strings and sigils that translate to literal strings can be used. -The following examples are equivalent:

        -doc("Example \"docs\"").
        --doc(<<"Example \"docs\""/utf8>>).
        +The following examples are equivalent:

        -doc("Example \"docs\"").
        +-doc(<<"Example \"docs\""/utf8>>).
         -doc ~S/Example "docs"/.
         -doc """
            Example "docs"
        @@ -257,7 +257,7 @@ 

        While not a module attribute, but rather a directive (since it might affect syntax), there is the -feature(..) directive used for enabling and disabling -features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear +features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear in a prefix of the module.

        diff --git a/prs/8803/doc/system/nif.html b/prs/8803/doc/system/nif.html index 383235a7e5e87..125c1482a2f7a 100644 --- a/prs/8803/doc/system/nif.html +++ b/prs/8803/doc/system/nif.html @@ -137,18 +137,18 @@

        they can also be used as fallback implementations for functions that do not have native implementations on some architectures.

        NIF libraries are loaded by calling erlang:load_nif/2, with the name of the shared library as argument. The second argument can be any term that will be -passed on to the library and used for initialization:

        -module(complex6).
        --export([foo/1, bar/1]).
        --nifs([foo/1, bar/1]).
        --on_load(init/0).
        -
        -init() ->
        -    ok = erlang:load_nif("./complex6_nif", 0).
        -
        -foo(_X) ->
        -    erlang:nif_error(nif_library_not_loaded).
        -bar(_Y) ->
        -    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically +passed on to the library and used for initialization:

        -module(complex6).
        +-export([foo/1, bar/1]).
        +-nifs([foo/1, bar/1]).
        +-on_load(init/0).
        +
        +init() ->
        +    ok = erlang:load_nif("./complex6_nif", 0).
        +
        +foo(_X) ->
        +    erlang:nif_error(nif_library_not_loaded).
        +bar(_Y) ->
        +    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically called when the module is loaded. If init returns anything other than ok, such when the loading of the NIF library fails in this example, the module is unloaded and calls to functions within it, fail.

        Loading the NIF library overrides the stub implementations and cause calls to @@ -169,35 +169,35 @@

        API functions. The environment contains information about the calling Erlang process:

        #include <erl_nif.h>
         
        -extern int foo(int x);
        -extern int bar(int y);
        +extern int foo(int x);
        +extern int bar(int y);
         
        -static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int x, ret;
        -    if (!enif_get_int(env, argv[0], &x)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = foo(x);
        -    return enif_make_int(env, ret);
        -}
        -
        -static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +    if (!enif_get_int(env, argv[0], &x)) {
        +	return enif_make_badarg(env);
        +    }
        +    ret = foo(x);
        +    return enif_make_int(env, ret);
        +}
        +
        +static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int y, ret;
        -    if (!enif_get_int(env, argv[0], &y)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = bar(y);
        -    return enif_make_int(env, ret);
        -}
        -
        -static ErlNifFunc nif_funcs[] = {
        -    {"foo", 1, foo_nif},
        -    {"bar", 1, bar_nif}
        -};
        -
        -ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It + if (!enif_get_int(env, argv[0], &y)) { + return enif_make_badarg(env); + } + ret = bar(y); + return enif_make_int(env, ret); +} + +static ErlNifFunc nif_funcs[] = { + {"foo", 1, foo_nif}, + {"bar", 1, bar_nif} +}; + +ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It will be stringified by the macro.
        • The second argument is the array of ErlNifFunc structures containing name, arity, and function pointer of each NIF.
        • The remaining arguments are pointers to callback functions that can be used to initialize the library. They are not used in this simple example, hence they @@ -213,15 +213,15 @@

          Step 1. Compile the C code:

          unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c
           windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c

          Step 2: Start Erlang and compile the Erlang code:

          > erl
          -Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
          +Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
           
          -Eshell V5.7.5  (abort with ^G)
          -1> c(complex6).
          -{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
          +Eshell V5.7.5  (abort with ^G)
          +1> c(complex6).
          +{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
           4
          -4> complex6:bar(5).
          +4> complex6:bar(5).
           10
          -5> complex6:foo("not an integer").
          +5> complex6:foo("not an integer").
           ** exception error: bad argument
                in function  complex6:foo/1
                   called as comlpex6:foo("not an integer")
          diff --git a/prs/8803/doc/system/opaques.html b/prs/8803/doc/system/opaques.html index ca514418fbf03..62282db7e3e79 100644 --- a/prs/8803/doc/system/opaques.html +++ b/prs/8803/doc/system/opaques.html @@ -126,16 +126,16 @@

          The runtime does not check opacity. Dialyzer provides some opacity-checking, but the rest is up to convention.

          This document explains what Erlang opacity is (and the trade-offs involved) via the example of the sets:set() data type. This type was -defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in -this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had +defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in +this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had been defined with -type instead of -opaque. Here is why: when a module defines an -opaque, the contract is that only the defining module should rely on the definition of the type: no other modules should rely on the definition.

          This means that code that pattern-matched on set as a record/tuple technically broke the contract, and opted in to being potentially broken when the definition of set() changed. Before OTP 24, this code printed ok. In OTP 24 it may -error:

          case sets:new() of
          -    Set when is_tuple(Set) ->
          -        io:format("ok")
          +error:

          case sets:new() of
          +    Set when is_tuple(Set) ->
          +        io:format("ok")
           end.

          When working with an opaque defined in another module, here are some recommendations:

          • Don't examine the underlying type using pattern-matching, guards, or functions that reveal the type, such as tuple_size/1 .
          • Instead, use functions provided by the module for working with the type. For diff --git a/prs/8803/doc/system/otp-patch-apply.html b/prs/8803/doc/system/otp-patch-apply.html index 4eb2c47a5efec..d2754922a2577 100644 --- a/prs/8803/doc/system/otp-patch-apply.html +++ b/prs/8803/doc/system/otp-patch-apply.html @@ -205,7 +205,7 @@

            Application dependencies are verified among installed applications by otp_patch_apply, but these are not necessarily those actually loaded. By calling system_information:sanity_check() one can validate -dependencies among applications actually loaded.

            1> system_information:sanity_check().
            +dependencies among applications actually loaded.

            1> system_information:sanity_check().
             ok

            Please take a look at the reference of sanity_check() for more information.

    diff --git a/prs/8803/doc/system/patterns.html b/prs/8803/doc/system/patterns.html index cde2f71cd135c..4d2f58cdfbeb6 100644 --- a/prs/8803/doc/system/patterns.html +++ b/prs/8803/doc/system/patterns.html @@ -132,10 +132,10 @@

    2 3> X + 1. 3 -4> {X, Y} = {1, 2}. +4> {X, Y} = {1, 2}. ** exception error: no match of right hand side value {1,2} -5> {X, Y} = {2, 3}. -{2,3} +5> {X, Y} = {2, 3}. +{2,3} 6> Y. 3

    diff --git a/prs/8803/doc/system/prog_ex_records.html b/prs/8803/doc/system/prog_ex_records.html index 2daaff3a3ec39..7828e206e2b9d 100644 --- a/prs/8803/doc/system/prog_ex_records.html +++ b/prs/8803/doc/system/prog_ex_records.html @@ -126,17 +126,17 @@

    To illustrate these differences, suppose that you want to represent a person with the tuple {Name, Address, Phone}.

    To write functions that manipulate this data, remember the following:

    • The Name field is the first element of the tuple.
    • The Address field is the second element.
    • The Phone field is the third element.

    For example, to extract data from a variable P that contains such a tuple, you can write the following code and then use pattern matching to extract the -relevant fields:

    Name = element(1, P),
    -Address = element(2, P),
    +relevant fields:

    Name = element(1, P),
    +Address = element(2, P),
     ...

    Such code is difficult to read and understand, and errors occur if the numbering of the elements in the tuple is wrong. If the data representation of the fields is changed, by re-ordering, adding, or removing fields, all references to the person tuple must be checked and possibly modified.

    Records allow references to the fields by name, instead of by position. In the -following example, a record instead of a tuple is used to store the data:

    -record(person, {name, phone, address}).

    This enables references to the fields of the record by name. For example, if P +following example, a record instead of a tuple is used to store the data:

    -record(person, {name, phone, address}).

    This enables references to the fields of the record by name. For example, if P is a variable whose value is a person record, the following code access the name and address fields of the records:

    Name = P#person.name,
     Address = P#person.address,
    -...

    Internally, records are represented using tagged tuples:

    {person, Name, Phone, Address}

    +...

    Internally, records are represented using tagged tuples:

    {person, Name, Phone, Address}

    @@ -146,8 +146,8 @@

    section. Three fields are included, name, phone, and address. The default values for name and phone is "" and [], respectively. The default value for address is the atom undefined, since no default value is supplied for this -field:

    -record(person, {name = "", phone = [], address}).

    The record must be defined in the shell to enable use of the record syntax in -the examples:

    > rd(person, {name = "", phone = [], address}).
    +field:

    -record(person, {name = "", phone = [], address}).

    The record must be defined in the shell to enable use of the record syntax in +the examples:

    > rd(person, {name = "", phone = [], address}).
     person

    This is because record definitions are only available at compile time, not at runtime. For details on records in the shell, see the shell manual page in STDLIB.

    @@ -156,10 +156,10 @@

    Creating a Record

    -

    A new person record is created as follows:

    > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
    -#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

    As the address field was omitted, its default value is used.

    From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the -special field _. _ means "all fields not explicitly specified".

    Example:

    > #person{name = "Jakob", _ = '_'}.
    -#person{name = "Jakob",phone = '_',address = '_'}

    It is primarily intended to be used in ets:match/2 and +

    A new person record is created as follows:

    > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
    +#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

    As the address field was omitted, its default value is used.

    From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the +special field _. _ means "all fields not explicitly specified".

    Example:

    > #person{name = "Jakob", _ = '_'}.
    +#person{name = "Jakob",phone = '_',address = '_'}

    It is primarily intended to be used in ets:match/2 and mnesia:match_object/3, to set record fields to the atom '_'. (This is a wildcard in ets:match/2.)

    @@ -167,8 +167,8 @@

    Accessing a Record Field

    -

    The following example shows how to access a record field:

    > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
    -#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
    +

    The following example shows how to access a record field:

    > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
    +#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
     > P#person.name.
     "Joe"

    @@ -176,33 +176,33 @@

    Updating a Record

    -

    The following example shows how to update a record:

    > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
    -#person{name = "Joe",phone = [1,2,3],address = "A street"}
    -> P2 = P1#person{name="Robert"}.
    -#person{name = "Robert",phone = [1,2,3],address = "A street"}

    +

    The following example shows how to update a record:

    > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
    +#person{name = "Joe",phone = [1,2,3],address = "A street"}
    +> P2 = P1#person{name="Robert"}.
    +#person{name = "Robert",phone = [1,2,3],address = "A street"}

    Type Testing

    The following example shows that the guard succeeds if P is record of type -person:

    foo(P) when is_record(P, person) -> a_person;
    -foo(_) -> not_a_person.

    +person:

    foo(P) when is_record(P, person) -> a_person;
    +foo(_) -> not_a_person.

    Pattern Matching

    Matching can be used in combination with records, as shown in the following -example:

    > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
    -#person{name = "Joe",phone = [0,0,7],address = "A street"}
    -> #person{name = Name} = P3, Name.
    +example:

    > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
    +#person{name = "Joe",phone = [0,0,7],address = "A street"}
    +> #person{name = Name} = P3, Name.
     "Joe"

    The following function takes a list of person records and searches for the -phone number of a person with a particular name:

    find_phone([#person{name=Name, phone=Phone} | _], Name) ->
    -    {found,  Phone};
    -find_phone([_| T], Name) ->
    -    find_phone(T, Name);
    -find_phone([], Name) ->
    +phone number of a person with a particular name:

    find_phone([#person{name=Name, phone=Phone} | _], Name) ->
    +    {found,  Phone};
    +find_phone([_| T], Name) ->
    +    find_phone(T, Name);
    +find_phone([], Name) ->
         not_found.

    The fields referred to in the pattern can be given in any order.

    @@ -211,12 +211,12 @@

    The value of a field in a record can be an instance of a record. Retrieval of nested data can be done stepwise, or in a single step, as shown in the following -example:

    -record(name, {first = "Robert", last = "Ericsson"}).
    --record(person, {name = #name{}, phone}).
    +example:

    -record(name, {first = "Robert", last = "Ericsson"}).
    +-record(person, {name = #name{}, phone}).
     
    -demo() ->
    -  P = #person{name= #name{first="Robert",last="Virding"}, phone=123},
    -  First = (P#person.name)#name.first.

    Here, demo() evaluates to "Robert".

    +demo() -> + P = #person{name= #name{first="Robert",last="Virding"}, phone=123}, + First = (P#person.name)#name.first.

    Here, demo() evaluates to "Robert".

    @@ -234,40 +234,40 @@

    %% about the person. %% A {Key, Value} list (default is the empty list). %%------------------------------------------------------------ --record(person, {name, age, phone = [], dict = []}).

    -module(person).
    --include("person.hrl").
    --compile(export_all). % For test purposes only.
    +-record(person, {name, age, phone = [], dict = []}).
    -module(person).
    +-include("person.hrl").
    +-compile(export_all). % For test purposes only.
     
     %% This creates an instance of a person.
     %%   Note: The phone number is not supplied so the
     %%         default value [] will be used.
     
    -make_hacker_without_phone(Name, Age) ->
    -   #person{name = Name, age = Age,
    -           dict = [{computer_knowledge, excellent},
    -                   {drinks, coke}]}.
    +make_hacker_without_phone(Name, Age) ->
    +   #person{name = Name, age = Age,
    +           dict = [{computer_knowledge, excellent},
    +                   {drinks, coke}]}.
     
     %% This demonstrates matching in arguments
     
    -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]).
    +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]).
     
     %% Demonstrates type testing, selector, updating.
     
    -birthday(P) when is_record(P, person) ->
    -   P#person{age = P#person.age + 1}.
    +birthday(P) when is_record(P, person) ->
    +   P#person{age = P#person.age + 1}.
     
    -register_two_hackers() ->
    -   Hacker1 = make_hacker_without_phone("Joe", 29),
    -   OldHacker = birthday(Hacker1),
    +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]}}.
    +
    central_register_server ! {register_person, Hacker1}, + central_register_server ! {register_person, + OldHacker#person{name = "Robert", + phone = [0,8,3,2,4,5,3,1]}}.

    diff --git a/prs/8803/doc/system/records_macros.html b/prs/8803/doc/system/records_macros.html index 4b63d8897fda5..f7029bafb9e6b 100644 --- a/prs/8803/doc/system/records_macros.html +++ b/prs/8803/doc/system/records_macros.html @@ -128,7 +128,7 @@

    introduced:

    %%%----FILE mess_config.hrl----
     
     %%% Configure the location of the server node,
    --define(server_node, messenger@super).
    +-define(server_node, messenger@super).
     
     %%%----END FILE----
    %%%----FILE mess_interface.hrl----
     
    @@ -136,24 +136,24 @@ 

    %%% messenger program %%%Messages from Client to server received in server/1 function. --record(logon,{client_pid, username}). --record(message,{client_pid, to_name, message}). +-record(logon,{client_pid, username}). +-record(message,{client_pid, to_name, message}). %%% {'EXIT', ClientPid, Reason} (client terminated or unreachable. %%% Messages from Server to Client, received in await_result/0 function --record(abort_client,{message}). +-record(abort_client,{message}). %%% Messages are: user_exists_at_other_node, %%% you_are_not_logged_on --record(server_reply,{message}). +-record(server_reply,{message}). %%% Messages are: logged_on %%% receiver_not_found %%% sent (Message has been sent (no guarantee) %%% Messages from Server to Client received in client/1 function --record(message_from,{from_name, message}). +-record(message_from,{from_name, message}). %%% Messages from shell to Client received in client/1 function %%% spawn(mess_client, client, [server_node(), Name]) --record(message_to,{to_name, message}). +-record(message_to,{to_name, message}). %%% logoff %%%----END FILE----

    %%%----FILE user_interface.erl----
    @@ -174,27 +174,27 @@ 

    %%% function is not logged on or if ToName is not logged on at %%% any node. --module(user_interface). --export([logon/1, logoff/0, message/2]). --include("mess_interface.hrl"). --include("mess_config.hrl"). +-module(user_interface). +-export([logon/1, logoff/0, message/2]). +-include("mess_interface.hrl"). +-include("mess_config.hrl"). -logon(Name) -> - case whereis(mess_client) of +logon(Name) -> + case whereis(mess_client) of undefined -> - register(mess_client, - spawn(mess_client, client, [?server_node, Name])); + register(mess_client, + spawn(mess_client, client, [?server_node, Name])); _ -> already_logged_on end. -logoff() -> +logoff() -> mess_client ! logoff. -message(ToName, Message) -> - case whereis(mess_client) of % Test if the client is running +message(ToName, Message) -> + case whereis(mess_client) of % Test if the client is running undefined -> not_logged_on; - _ -> mess_client ! #message_to{to_name=ToName, message=Message}, + _ -> mess_client ! #message_to{to_name=ToName, message=Message}, ok end. @@ -202,107 +202,107 @@

    %%% The client process which runs on each user node --module(mess_client). --export([client/2]). --include("mess_interface.hrl"). +-module(mess_client). +-export([client/2]). +-include("mess_interface.hrl"). -client(Server_Node, Name) -> - {messenger, Server_Node} ! #logon{client_pid=self(), username=Name}, - await_result(), - client(Server_Node). +client(Server_Node, Name) -> + {messenger, Server_Node} ! #logon{client_pid=self(), username=Name}, + await_result(), + client(Server_Node). -client(Server_Node) -> +client(Server_Node) -> receive logoff -> - exit(normal); - #message_to{to_name=ToName, message=Message} -> - {messenger, Server_Node} ! - #message{client_pid=self(), to_name=ToName, message=Message}, - await_result(); - {message_from, FromName, Message} -> - io:format("Message from ~p: ~p~n", [FromName, Message]) + exit(normal); + #message_to{to_name=ToName, message=Message} -> + {messenger, Server_Node} ! + #message{client_pid=self(), to_name=ToName, message=Message}, + await_result(); + {message_from, FromName, Message} -> + io:format("Message from ~p: ~p~n", [FromName, Message]) end, - client(Server_Node). + client(Server_Node). %%% wait for a response from the server -await_result() -> +await_result() -> receive - #abort_client{message=Why} -> - io:format("~p~n", [Why]), - exit(normal); - #server_reply{message=What} -> - io:format("~p~n", [What]) + #abort_client{message=Why} -> + io:format("~p~n", [Why]), + exit(normal); + #server_reply{message=What} -> + io:format("~p~n", [What]) after 5000 -> - io:format("No response from server~n", []), - exit(timeout) + io:format("No response from server~n", []), + exit(timeout) end. %%%----END FILE---

    %%%----FILE mess_server.erl----
     
     %%% This is the server process of the messenger service
     
    --module(mess_server).
    --export([start_server/0, server/0]).
    --include("mess_interface.hrl").
    +-module(mess_server).
    +-export([start_server/0, server/0]).
    +-include("mess_interface.hrl").
     
    -server() ->
    -    process_flag(trap_exit, true),
    -    server([]).
    +server() ->
    +    process_flag(trap_exit, true),
    +    server([]).
     
     %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...]
    -server(User_List) ->
    -    io:format("User list = ~p~n", [User_List]),
    +server(User_List) ->
    +    io:format("User list = ~p~n", [User_List]),
         receive
    -        #logon{client_pid=From, username=Name} ->
    -            New_User_List = server_logon(From, Name, User_List),
    -            server(New_User_List);
    -        {'EXIT', From, _} ->
    -            New_User_List = server_logoff(From, User_List),
    -            server(New_User_List);
    -        #message{client_pid=From, to_name=To, message=Message} ->
    -            server_transfer(From, To, Message, User_List),
    -            server(User_List)
    +        #logon{client_pid=From, username=Name} ->
    +            New_User_List = server_logon(From, Name, User_List),
    +            server(New_User_List);
    +        {'EXIT', From, _} ->
    +            New_User_List = server_logoff(From, User_List),
    +            server(New_User_List);
    +        #message{client_pid=From, to_name=To, message=Message} ->
    +            server_transfer(From, To, Message, User_List),
    +            server(User_List)
         end.
     
     %%% Start the server
    -start_server() ->
    -    register(messenger, spawn(?MODULE, server, [])).
    +start_server() ->
    +    register(messenger, spawn(?MODULE, server, [])).
     
     %%% Server adds a new user to the user list
    -server_logon(From, Name, User_List) ->
    +server_logon(From, Name, User_List) ->
         %% check if logged on anywhere else
    -    case lists:keymember(Name, 2, User_List) of
    +    case lists:keymember(Name, 2, User_List) of
             true ->
    -            From ! #abort_client{message=user_exists_at_other_node},
    +            From ! #abort_client{message=user_exists_at_other_node},
                 User_List;
             false ->
    -            From ! #server_reply{message=logged_on},
    -            link(From),
    -            [{From, Name} | User_List]        %add user to the list
    +            From ! #server_reply{message=logged_on},
    +            link(From),
    +            [{From, Name} | User_List]        %add user to the list
         end.
     
     %%% Server deletes a user from the user list
    -server_logoff(From, User_List) ->
    -    lists:keydelete(From, 1, User_List).
    +server_logoff(From, User_List) ->
    +    lists:keydelete(From, 1, User_List).
     
     %%% Server transfers a message between user
    -server_transfer(From, To, Message, User_List) ->
    +server_transfer(From, To, Message, User_List) ->
         %% check that the user is logged on and who he is
    -    case lists:keysearch(From, 1, User_List) of
    +    case lists:keysearch(From, 1, User_List) of
             false ->
    -            From ! #abort_client{message=you_are_not_logged_on};
    -        {value, {_, Name}} ->
    -            server_transfer(From, Name, To, Message, User_List)
    +            From ! #abort_client{message=you_are_not_logged_on};
    +        {value, {_, Name}} ->
    +            server_transfer(From, Name, To, Message, User_List)
         end.
     %%% If the user exists, send the message
    -server_transfer(From, Name, To, Message, User_List) ->
    +server_transfer(From, Name, To, Message, User_List) ->
         %% Find the receiver and send the message
    -    case lists:keysearch(To, 2, User_List) of
    +    case lists:keysearch(To, 2, User_List) of
             false ->
    -            From ! #server_reply{message=receiver_not_found};
    -        {value, {ToPid, To}} ->
    -            ToPid ! #message_from{from_name=Name, message=Message},
    -            From !  #server_reply{message=sent}
    +            From ! #server_reply{message=receiver_not_found};
    +        {value, {ToPid, To}} ->
    +            ToPid ! #message_from{from_name=Name, message=Message},
    +            From !  #server_reply{message=sent}
         end.
     
     %%%----END FILE---

    @@ -312,7 +312,7 @@

    Header Files

    As shown above, some files have extension .hrl. These are header files that -are included in the .erl files by:

    -include("File_Name").

    for example:

    -include("mess_interface.hrl").

    In the case above the file is fetched from the same directory as all the other +are included in the .erl files by:

    -include("File_Name").

    for example:

    -include("mess_interface.hrl").

    In the case above the file is fetched from the same directory as all the other files in the messenger example. (manual).

    .hrl files can contain any valid Erlang code but are most often used for record and macro definitions.

    @@ -320,14 +320,14 @@

    Records

    -

    A record is defined as:

    -record(name_of_record,{field_name1, field_name2, field_name3, ......}).

    For example:

    -record(message_to,{to_name, message}).

    This is equivalent to:

    {message_to, To_Name, Message}

    Creating a record is best illustrated by an example:

    #message_to{message="hello", to_name=fred)

    This creates:

    {message_to, fred, "hello"}

    Notice that you do not have to worry about the order you assign values to the +

    A record is defined as:

    -record(name_of_record,{field_name1, field_name2, field_name3, ......}).

    For example:

    -record(message_to,{to_name, message}).

    This is equivalent to:

    {message_to, To_Name, Message}

    Creating a record is best illustrated by an example:

    #message_to{message="hello", to_name=fred)

    This creates:

    {message_to, fred, "hello"}

    Notice that you do not have to worry about the order you assign values to the various parts of the records when you create it. The advantage of using records is that by placing their definitions in header files you can conveniently define interfaces that are easy to change. For example, if you want to add a new field to the record, you only have to change the code where the new field is used and not at every place the record is referred to. If you leave out a field when creating a record, it gets the value of the atom undefined. (manual)

    Pattern matching with records is very similar to creating records. For example, -inside a case or receive:

    #message_to{to_name=ToName, message=Message} ->

    This is the same as:

    {message_to, ToName, Message}

    +inside a case or receive:

    #message_to{to_name=ToName, message=Message} ->

    This is the same as:

    {message_to, ToName, Message}

    @@ -335,8 +335,8 @@

    Another thing that has been added to the messenger is a macro. The file mess_config.hrl contains the definition:

    %%% Configure the location of the server node,
    --define(server_node, messenger@super).

    This file is included in mess_server.erl:

    -include("mess_config.hrl").

    Every occurrence of ?server_node in mess_server.erl is now replaced by -messenger@super.

    A macro is also used when spawning the server process:

    spawn(?MODULE, server, [])

    This is a standard macro (that is, defined by the system, not by the user). +-define(server_node, messenger@super).

    This file is included in mess_server.erl:

    -include("mess_config.hrl").

    Every occurrence of ?server_node in mess_server.erl is now replaced by +messenger@super.

    A macro is also used when spawning the server process:

    spawn(?MODULE, server, [])

    This is a standard macro (that is, defined by the system, not by the user). ?MODULE is always replaced by the name of the current module (that is, the -module definition near the start of the file). There are more advanced ways of using macros with, for example, parameters.

    The three Erlang (.erl) files in the messenger example are individually diff --git a/prs/8803/doc/system/ref_man_functions.html b/prs/8803/doc/system/ref_man_functions.html index 23432641f4c51..92184dd2c0a2d 100644 --- a/prs/8803/doc/system/ref_man_functions.html +++ b/prs/8803/doc/system/ref_man_functions.html @@ -124,10 +124,10 @@

    A function declaration is a sequence of function clauses separated by semicolons, and terminated by a period (.).

    A function clause consists of a clause head and a clause body, separated by ->.

    A clause head consists of the function name, an argument list, and an optional -guard sequence beginning with the keyword when:

    Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
    +guard sequence beginning with the keyword when:

    Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
         Body1;
     ...;
    -Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
    +Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
         BodyK.

    The function name is an atom. Each argument is a pattern.

    The number of arguments N is the arity of the function. A function is uniquely defined by the module name, function name, and arity. That is, two functions with the same name and in the same module, but with different arities @@ -135,10 +135,10 @@

    mod:f/N.

    A clause body consists of a sequence of expressions separated by comma (,):

    Expr1,
     ...,
     ExprN

    Valid Erlang expressions and guard sequences are described in -Expressions.

    Example:

    fact(N) when N > 0 ->  % first clause head
    -    N * fact(N-1);     % first clause body
    +Expressions.

    Example:

    fact(N) when N > 0 ->  % first clause head
    +    N * fact(N-1);     % first clause body
     
    -fact(0) ->             % second clause head
    +fact(0) ->             % second clause head
         1.                 % second clause body

    @@ -151,16 +151,16 @@

    clause is found that fulfills both of the following two conditions:

    1. The patterns in the clause head can be successfully matched against the given arguments.
    2. The guard sequence, if any, is true.

    If such a clause cannot be found, a function_clause runtime error occurs.

    If such a clause is found, the corresponding clause body is evaluated. That is, the expressions in the body are evaluated sequentially and the value of the last -expression is returned.

    Consider the function fact:

    -module(mod).
    --export([fact/1]).
    +expression is returned.

    Consider the function fact:

    -module(mod).
    +-export([fact/1]).
     
    -fact(N) when N > 0 ->
    -    N * fact(N - 1);
    -fact(0) ->
    +fact(N) when N > 0 ->
    +    N * fact(N - 1);
    +fact(0) ->
         1.

    Assume that you want to calculate the factorial for 1:

    1> mod:fact(1).

    Evaluation starts at the first clause. The pattern N is matched against argument 1. The matching succeeds and the guard (N > 0) is true, thus N is -bound to 1, and the corresponding body is evaluated:

    N * fact(N-1) => (N is bound to 1)
    -1 * fact(0)

    Now, fact(0) is called, and the function clauses are scanned +bound to 1, and the corresponding body is evaluated:

    N * fact(N-1) => (N is bound to 1)
    +1 * fact(0)

    Now, fact(0) is called, and the function clauses are scanned sequentially again. First, the pattern N is matched against 0. The matching succeeds, but the guard (N > 0) is false. Second, the pattern 0 is matched against the argument 0. The matching succeeds @@ -177,9 +177,9 @@

    tail-recursive call is done. This is to ensure that no system resources, for example, call stack, are consumed. This means that an infinite loop using tail-recursive calls will not exhaust the call -stack and can (in principle) run forever.

    Example:

    loop(N) ->
    -    io:format("~w~n", [N]),
    -    loop(N+1).

    The earlier factorial example is a counter-example. It is not +stack and can (in principle) run forever.

    Example:

    loop(N) ->
    +    io:format("~w~n", [N]),
    +    loop(N+1).

    The earlier factorial example is a counter-example. It is not tail-recursive, since a multiplication is done on the result of the recursive call to fact(N-1).

    @@ -195,9 +195,9 @@

    not need to be prefixed with the module name. Which BIFs that are auto-imported is specified in the erlang module in ERTS. For example, standard-type conversion BIFs like atom_to_list and BIFs allowed in guards can be called -without specifying the module name.

    Examples:

    1> tuple_size({a,b,c}).
    +without specifying the module name.

    Examples:

    1> tuple_size({a,b,c}).
     3
    -2> atom_to_list('Erlang').
    +2> atom_to_list('Erlang').
     "Erlang"

    diff --git a/prs/8803/doc/system/ref_man_processes.html b/prs/8803/doc/system/ref_man_processes.html index 42a1d1b293148..36d3ff5492078 100644 --- a/prs/8803/doc/system/ref_man_processes.html +++ b/prs/8803/doc/system/ref_man_processes.html @@ -129,10 +129,10 @@

    Process Creation

    -

    A process is created by calling spawn():

    spawn(Module, Name, Args) -> pid()
    -  Module = Name = atom()
    -  Args = [Arg1,...,ArgN]
    -    ArgI = term()

    spawn() creates a new process and returns the pid.

    The new process starts executing in Module:Name(Arg1,...,ArgN) where the +

    A process is created by calling spawn():

    spawn(Module, Name, Args) -> pid()
    +  Module = Name = atom()
    +  Args = [Arg1,...,ArgN]
    +    ArgI = term()

    spawn() creates a new process and returns the pid.

    The new process starts executing in Module:Name(Arg1,...,ArgN) where the arguments are the elements of the (possible empty) Args argument list.

    There exist a number of different spawn BIFs:

    diff --git a/prs/8803/doc/system/ref_man_records.html b/prs/8803/doc/system/ref_man_records.html index 55563e6c7f161..7b177fe9dc5e2 100644 --- a/prs/8803/doc/system/ref_man_records.html +++ b/prs/8803/doc/system/ref_man_records.html @@ -127,9 +127,9 @@

    A record definition consists of the name of the record, followed by the field names of the record. Record and field names must be atoms. Each field can be given an optional default value. If no default value is supplied, undefined is -used.

    -record(Name, {Field1 [= Expr1],
    +used.

    -record(Name, {Field1 [= Expr1],
                    ...
    -               FieldN [= ExprN]}).

    The default value for a field is an arbitrary expression, except that it must + FieldN [= ExprN]}).

    The default value for a field is an arbitrary expression, except that it must not use any variables.

    A record definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the record.

    If a record is used in several modules, it is recommended that the record @@ -147,24 +147,24 @@

    default value instead.

    If several fields are to be assigned the same value, the following construction can be used:

    #Name{Field1=Expr1, ..., FieldK=ExprK, _=ExprL}

    Omitted fields then get the value of evaluating ExprL instead of their default values. This feature is primarily intended to be used to create patterns for ETS -and Mnesia match functions.

    Example:

    -record(person, {name, phone, address}).
    +and Mnesia match functions.

    Example:

    -record(person, {name, phone, address}).
     
    -lookup(Name, Tab) ->
    -    ets:match_object(Tab, #person{name=Name, _='_'}).

    +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name=Name, _='_'}).

    Accessing Record Fields

    Expr#Name.Field

    Returns the value of the specified field. Expr is to evaluate to a Name -record.

    Example:

    -record(person, {name, phone, address}).
    +record.

    Example:

    -record(person, {name, phone, address}).
     
    -get_person_name(Person) ->
    +get_person_name(Person) ->
         Person#person.name.

    The following expression returns the position of the specified field in the -tuple representation of the record:

    #Name.Field

    Example:

    -record(person, {name, phone, address}).
    +tuple representation of the record:

    #Name.Field

    Example:

    -record(person, {name, phone, address}).
     
    -lookup(Name, List) ->
    -    lists:keyfind(Name, #person.name, List).

    +lookup(Name, List) -> + lists:keyfind(Name, #person.name, List).

    @@ -182,13 +182,13 @@

    Since record expressions are expanded to tuple expressions, creating records and accessing record fields are allowed in guards. However, all subexpressions (for initializing fields), must be valid guard -expressions as well.

    Examples:

    handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
    +expressions as well.

    Examples:

    handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
         ...
     
    -handle(Msg, State) when State#state.running =:= true ->
    -    ...

    There is also a type test BIF is_record(Term, RecordTag).

    Example:

    is_person(P) when is_record(P, person) ->
    +handle(Msg, State) when State#state.running =:= true ->
    +    ...

    There is also a type test BIF is_record(Term, RecordTag).

    Example:

    is_person(P) when is_record(P, person) ->
         true;
    -is_person(_P) ->
    +is_person(_P) ->
         false.

    @@ -202,11 +202,11 @@

    Nested Records

    -

    Assume the following record definitions:

    -record(nrec0, {name = "nested0"}).
    --record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
    --record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
    +

    Assume the following record definitions:

    -record(nrec0, {name = "nested0"}).
    +-record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
    +-record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
     
    -N2 = #nrec2{},

    Accessing or updating nested records can be written without parentheses:

    "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
    +N2 = #nrec2{},

    Accessing or updating nested records can be written without parentheses:

    "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
         N0n = N2#nrec2.nrec1#nrec1.nrec0#nrec0{name = "nested0a"},

    which is equivalent to:

    "nested0" = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0.name,
     N0n = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0{name = "nested0a"},

    Change

    Before Erlang/OTP R14, parentheses were necessary when accessing or updating nested records.

    @@ -216,9 +216,9 @@

    Internal Representation of Records

    Record expressions are translated to tuple expressions during compilation. A -record defined as:

    -record(Name, {Field1, ..., FieldN}).

    is internally represented by the tuple:

    {Name, Value1, ..., ValueN}

    Here each ValueI is the default value for FieldI.

    To each module using records, a pseudo function is added during compilation to -obtain information about records:

    record_info(fields, Record) -> [Field]
    -record_info(size, Record) -> Size

    Size is the size of the tuple representation, that is, one more than the +record defined as:

    -record(Name, {Field1, ..., FieldN}).

    is internally represented by the tuple:

    {Name, Value1, ..., ValueN}

    Here each ValueI is the default value for FieldI.

    To each module using records, a pseudo function is added during compilation to +obtain information about records:

    record_info(fields, Record) -> [Field]
    +record_info(size, Record) -> Size

    Size is the size of the tuple representation, that is, one more than the number of fields.

    diff --git a/prs/8803/doc/system/release_handling.html b/prs/8803/doc/system/release_handling.html index 1ebbce6714efd..a94601283b8a6 100644 --- a/prs/8803/doc/system/release_handling.html +++ b/prs/8803/doc/system/release_handling.html @@ -227,15 +227,15 @@

    Instead, it is necessary to:

    • Suspend the processes using the module (to avoid that they try to handle any requests before the code replacement is completed).
    • Ask them to transform the internal state format and switch to the new version of the module.
    • Remove the old version.
    • Resume the processes.

    This is called synchronized code replacement and for this the following -instructions are used:

    {update, Module, {advanced, Extra}}
    -{update, Module, supervisor}

    update with argument {advanced,Extra} is used when changing the internal +instructions are used:

    {update, Module, {advanced, Extra}}
    +{update, Module, supervisor}

    update with argument {advanced,Extra} is used when changing the internal state of a behaviour as described above. It causes behaviour processes to call the callback function code_change/3, passing the term Extra and some other information as arguments. See the manual pages for the respective behaviours and Appup Cookbook.

    update with argument supervisor is used when changing the start specification of a supervisor. See Appup Cookbook.

    When a module is to be updated, the release handler finds which processes that are using the module by traversing the supervision tree of each running -application and checking all the child specifications:

    {Id, StartFunc, Restart, Shutdown, Type, Modules}

    A process uses a module if the name is listed in Modules in the child +application and checking all the child specifications:

    {Id, StartFunc, Restart, Shutdown, Type, Modules}

    A process uses a module if the name is listed in Modules in the child specification for the process.

    If Modules=dynamic, which is the case for event managers, the event manager process informs the release handler about the list of currently installed event handlers (gen_event), and it is checked if the module name is in this list @@ -247,10 +247,10 @@

    add_module and delete_module

    -

    If a new module is introduced, the following instruction is used:

    {add_module, Module}

    This instruction loads module Module. When running Erlang in +

    If a new module is introduced, the following instruction is used:

    {add_module, Module}

    This instruction loads module Module. When running Erlang in embedded mode it is necessary to use this this instruction. It is not strictly required when running Erlang in interactive mode, since the -code server automatically searches for and loads unloaded modules.

    The opposite of add_module is delete_module, which unloads a module:

    {delete_module, Module}

    Any process, in any application, with Module as residence module, is +code server automatically searches for and loads unloaded modules.

    The opposite of add_module is delete_module, which unloads a module:

    {delete_module, Module}

    Any process, in any application, with Module as residence module, is killed when the instruction is evaluated. Therefore, the user must ensure that all such processes are terminated before deleting module Module to avoid a situation with failing supervisor restarts.

    @@ -331,13 +331,13 @@

    To define how to upgrade/downgrade between the current version and previous versions of an application, an application upgrade file, or in short .appup file is created. The file is to be called Application.appup, where -Application is the application name:

    {Vsn,
    - [{UpFromVsn1, InstructionsU1},
    +Application is the application name:

    {Vsn,
    + [{UpFromVsn1, InstructionsU1},
       ...,
    -  {UpFromVsnK, InstructionsUK}],
    - [{DownToVsn1, InstructionsD1},
    +  {UpFromVsnK, InstructionsUK}],
    + [{DownToVsn1, InstructionsD1},
       ...,
    -  {DownToVsnK, InstructionsDK}]}.
    • Vsn, a string, is the current version of the application, as defined in the + {DownToVsnK, InstructionsDK}]}.
    • Vsn, a string, is the current version of the application, as defined in the .app file.
    • Each UpFromVsn is a previous version of the application to upgrade from.
    • Each DownToVsn is a previous version of the application to downgrade to.
    • Each Instructions is a list of release handling instructions.

    UpFromVsn and DownToVsn can also be specified as regular expressions. For more information about the syntax and contents of the .appup file, see appup in SASL.

    Appup Cookbook includes examples of .appup files for @@ -345,52 +345,52 @@

    Releases. Assume you want to add a function available/0 to server ch3, which returns the number of available channels (when trying out the example, make the change in a copy of the original -directory, to ensure that the first version is still available):

    -module(ch3).
    --behaviour(gen_server).
    +directory, to ensure that the first version is still available):

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([available/0]).
    --export([init/1, handle_call/3, handle_cast/2]).
    -
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    -
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    -
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    -
    -available() ->
    -    gen_server:call(ch3, available).
    -
    -init(_Args) ->
    -    {ok, channels()}.
    -
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2};
    -handle_call(available, _From, Chs) ->
    -    N = available(Chs),
    -    {reply, N, Chs}.
    -
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    A new version of the ch_app.app file must now be created, where the version is -updated:

    {application, ch_app,
    - [{description, "Channel allocator"},
    -  {vsn, "2"},
    -  {modules, [ch_app, ch_sup, ch3]},
    -  {registered, [ch3]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {ch_app,[]}}
    - ]}.

    To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), +-export([start_link/0]). +-export([alloc/0, free/1]). +-export([available/0]). +-export([init/1, handle_call/3, handle_cast/2]). + +start_link() -> + gen_server:start_link({local, ch3}, ch3, [], []). + +alloc() -> + gen_server:call(ch3, alloc). + +free(Ch) -> + gen_server:cast(ch3, {free, Ch}). + +available() -> + gen_server:call(ch3, available). + +init(_Args) -> + {ok, channels()}. + +handle_call(alloc, _From, Chs) -> + {Ch, Chs2} = alloc(Chs), + {reply, Ch, Chs2}; +handle_call(available, _From, Chs) -> + N = available(Chs), + {reply, N, Chs}. + +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    A new version of the ch_app.app file must now be created, where the version is +updated:

    {application, ch_app,
    + [{description, "Channel allocator"},
    +  {vsn, "2"},
    +  {modules, [ch_app, ch_sup, ch3]},
    +  {registered, [ch3]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {ch_app,[]}}
    + ]}.

    To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), you only need to load the new (old) version of the ch3 callback module. Create -the application upgrade file ch_app.appup in the ebin directory:

    {"2",
    - [{"1", [{load_module, ch3}]}],
    - [{"1", [{load_module, ch3}]}]
    -}.

    +the application upgrade file ch_app.appup in the ebin directory:

    {"2",
    + [{"1", [{load_module, ch3}]}],
    + [{"1", [{load_module, ch3}]}]
    +}.

    @@ -409,14 +409,14 @@

    relup in SASL.

    Example, continued from the previous section: You have a new version "2" of ch_app and an .appup file. A new version of the .rel file is also needed. This time the file is called ch_rel-2.rel and the release version string is -changed from "A" to "B":

    {release,
    - {"ch_rel", "B"},
    - {erts, "14.2.5"},
    - [{kernel, "9.2.4"},
    -  {stdlib, "5.2.3"},
    -  {sasl, "4.2.1"},
    -  {ch_app, "2"}]
    -}.

    Now the relup file can be generated:

    1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
    +changed from "A" to "B":

    {release,
    + {"ch_rel", "B"},
    + {erts, "14.2.5"},
    + [{kernel, "9.2.4"},
    +  {stdlib, "5.2.3"},
    +  {sasl, "4.2.1"},
    +  {ch_app, "2"}]
    +}.

    Now the relup file can be generated:

    1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
     ok

    This generates a relup file with instructions for how to upgrade from version "A" ("ch_rel-1") to version "B" ("ch_rel-2") and how to downgrade from version "B" to version "A".

    Both the old and new versions of the .app and .rel files must be in the code @@ -437,17 +437,17 @@

    packages. The release_handler module communicates with this process.

    Assuming there is an operational target system with installation root directory $ROOT, the release package with the new version of the release is to be copied to $ROOT/releases.

    First, unpack the release package. The files are then extracted from the -package:

    release_handler:unpack_release(ReleaseName) => {ok, Vsn}
    • ReleaseName is the name of the release package except the .tar.gz +package:

      release_handler:unpack_release(ReleaseName) => {ok, Vsn}
      • ReleaseName is the name of the release package except the .tar.gz extension.
      • Vsn is the version of the unpacked release, as defined in its .rel file.

      A directory $ROOT/lib/releases/Vsn is created, where the .rel file, the boot script start.boot, the system configuration file sys.config, and relup are placed. For applications with new version numbers, the application directories are placed under $ROOT/lib. Unchanged applications are not affected.

      An unpacked release can be installed. The release handler then evaluates the -instructions in relup, step by step:

      release_handler:install_release(Vsn) => {ok, FromVsn, []}

      If an error occurs during the installation, the system is rebooted using the old +instructions in relup, step by step:

      release_handler:install_release(Vsn) => {ok, FromVsn, []}

      If an error occurs during the installation, the system is rebooted using the old version of the release. If installation succeeds, the system is afterwards using the new version of the release, but if anything happens and the system is rebooted, it starts using the previous version again.

      To be made the default version, the newly installed release must be made permanent, which means the previous version becomes old:

      release_handler:make_permanent(Vsn) => ok

      The system keeps information about which versions are old and permanent in the -files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

      To downgrade from Vsn to FromVsn, install_release must be called again:

      release_handler:install_release(FromVsn) => {ok, Vsn, []}

      An installed, but not permanent, release can be removed. Information about the +files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

      To downgrade from Vsn to FromVsn, install_release must be called again:

      release_handler:install_release(FromVsn) => {ok, Vsn, []}

      An installed, but not permanent, release can be removed. Information about the release is then deleted from $ROOT/releases/RELEASES and the release-specific code, that is, the new application directories and the $ROOT/releases/Vsn directory, are removed.

      release_handler:remove_release(Vsn) => ok

      @@ -466,9 +466,9 @@

      ...

    $ROOT is the installation directory of the target system.

    Step 3) In another Erlang shell, generate start scripts and create a release package for the new version "B". Remember to include (a possible updated) sys.config and the relup file. For more information, see -Release Upgrade File.

    1> systools:make_script("ch_rel-2").
    +Release Upgrade File.

    1> systools:make_script("ch_rel-2").
     ok
    -2> systools:make_tar("ch_rel-2").
    +2> systools:make_tar("ch_rel-2").
     ok

    The new release package now also contains version "2" of ch_app and the relup file:

    % tar tf ch_rel-2.tar
     lib/kernel-9.2.4/ebin/kernel.app
    @@ -489,23 +489,23 @@ 

    releases/B/sys.config releases/B/ch_rel-2.rel releases/ch_rel-2.rel

    Step 4) Copy the release package ch_rel-2.tar.gz to the $ROOT/releases -directory.

    Step 5) In the running target system, unpack the release package:

    1> release_handler:unpack_release("ch_rel-2").
    -{ok,"B"}

    The new application version ch_app-2 is installed under $ROOT/lib next to +directory.

    Step 5) In the running target system, unpack the release package:

    1> release_handler:unpack_release("ch_rel-2").
    +{ok,"B"}

    The new application version ch_app-2 is installed under $ROOT/lib next to ch_app-1. The kernel, stdlib, and sasl directories are not affected, as they have not changed.

    Under $ROOT/releases, a new directory B is created, containing -ch_rel-2.rel, start.boot, sys.config, and relup.

    Step 6) Check if the function ch3:available/0 is available:

    2> ch3:available().
    +ch_rel-2.rel, start.boot, sys.config, and relup.

    Step 6) Check if the function ch3:available/0 is available:

    2> ch3:available().
     ** exception error: undefined function ch3:available/0

    Step 7) Install the new release. The instructions in $ROOT/releases/B/relup are executed one by one, resulting in the new version of ch3 being loaded. The -function ch3:available/0 is now available:

    3> release_handler:install_release("B").
    -{ok,"A",[]}
    -4> ch3:available().
    +function ch3:available/0 is now available:

    3> release_handler:install_release("B").
    +{ok,"A",[]}
    +4> ch3:available().
     3
    -5> code:which(ch3).
    +5> code:which(ch3).
     ".../lib/ch_app-2/ebin/ch3.beam"
    -6> code:which(ch_sup).
    +6> code:which(ch_sup).
     ".../lib/ch_app-1/ebin/ch_sup.beam"

    Processes in ch_app for which code have not been updated, for example, the supervisor, are still evaluating code from ch_app-1.

    Step 8) If the target system is now rebooted, it uses version "A" again. The -"B" version must be made permanent, to be used when the system is rebooted.

    7> release_handler:make_permanent("B").
    +"B" version must be made permanent, to be used when the system is rebooted.

    7> release_handler:make_permanent("B").
     ok

    @@ -522,7 +522,7 @@

    values set using application:set_env/3 are disregarded.

    When an installed release is made permanent, the system process init is set to point out the new sys.config.

    After the installation, the application controller compares the old and new configuration parameters for all running applications and call the callback -function:

    Module:config_change(Changed, New, Removed)
    • Module is the application callback module as defined by the mod key in the +function:

      Module:config_change(Changed, New, Removed)
      • Module is the application callback module as defined by the mod key in the .app file.
      • Changed and New are lists of {Par,Val} for all changed and added configuration parameters, respectively.
      • Removed is a list of all parameters Par that have been removed.

      The function is optional and can be omitted when implementing an application callback module.

      diff --git a/prs/8803/doc/system/release_structure.html b/prs/8803/doc/system/release_structure.html index 6ec88785c05b2..2363384ec6b01 100644 --- a/prs/8803/doc/system/release_structure.html +++ b/prs/8803/doc/system/release_structure.html @@ -140,29 +140,29 @@

      To define a release, create a release resource file, or in short a .rel file. In the file, specify the name and version of the release, which ERTS -version it is based on, and which applications it consists of:

      {release, {Name,Vsn}, {erts, EVsn},
      - [{Application1, AppVsn1},
      +version it is based on, and which applications it consists of:

      {release, {Name,Vsn}, {erts, EVsn},
      + [{Application1, AppVsn1},
          ...
      -  {ApplicationN, AppVsnN}]}.

      Name, Vsn, EVsn, and AppVsn are strings.

      The file must be named Rel.rel, where Rel is a unique name.

      Each Application (atom) and AppVsn is the name and version of an application + {ApplicationN, AppVsnN}]}.

      Name, Vsn, EVsn, and AppVsn are strings.

      The file must be named Rel.rel, where Rel is a unique name.

      Each Application (atom) and AppVsn is the name and version of an application included in the release. The minimal release based on Erlang/OTP consists of the Kernel and STDLIB applications, so these applications must be included in the list.

      If the release is to be upgraded, it must also include the SASL application.

      Here is an example showing the .app file for a release of ch_app from -the Applications section:

      {application, ch_app,
      - [{description, "Channel allocator"},
      -  {vsn, "1"},
      -  {modules, [ch_app, ch_sup, ch3]},
      -  {registered, [ch3]},
      -  {applications, [kernel, stdlib, sasl]},
      -  {mod, {ch_app,[]}}
      - ]}.

      The .rel file must also contain kernel, stdlib, and sasl, as these -applications are required by ch_app. The file is called ch_rel-1.rel:

      {release,
      - {"ch_rel", "A"},
      - {erts, "14.2.5"},
      - [{kernel, "9.2.4"},
      -  {stdlib, "5.2.3"},
      -  {sasl, "4.2.1"},
      -  {ch_app, "1"}]
      -}.

      +the Applications section:

      {application, ch_app,
      + [{description, "Channel allocator"},
      +  {vsn, "1"},
      +  {modules, [ch_app, ch_sup, ch3]},
      +  {registered, [ch3]},
      +  {applications, [kernel, stdlib, sasl]},
      +  {mod, {ch_app,[]}}
      + ]}.

      The .rel file must also contain kernel, stdlib, and sasl, as these +applications are required by ch_app. The file is called ch_rel-1.rel:

      {release,
      + {"ch_rel", "A"},
      + {erts, "14.2.5"},
      + [{kernel, "9.2.4"},
      +  {stdlib, "5.2.3"},
      +  {sasl, "4.2.1"},
      +  {ch_app, "1"}]
      +}.

      @@ -194,9 +194,9 @@

      The systools:make_tar/1,2 function takes a .rel file as input and creates a zipped tar file with the code for -the specified applications, a release package:

      1> systools:make_script("ch_rel-1").
      +the specified applications, a release package:

      1> systools:make_script("ch_rel-1").
       ok
      -2> systools:make_tar("ch_rel-1").
      +2> systools:make_tar("ch_rel-1").
       ok

      The release package by default contains:

      • The .app files
      • The .rel file
      • The object code for all applications, structured according to the application directory structure
      • The binary boot script renamed to start.boot
      % tar tf ch_rel-1.tar
       lib/kernel-9.2.4/ebin/kernel.app
      diff --git a/prs/8803/doc/system/robustness.html b/prs/8803/doc/system/robustness.html
      index a1f0b564669ab..81b482de558cc 100644
      --- a/prs/8803/doc/system/robustness.html
      +++ b/prs/8803/doc/system/robustness.html
      @@ -132,36 +132,36 @@ 

      "pong" so that "pong" can also finish. Another way to let "pong" finish is to make "pong" exit if it does not receive a message from ping within a certain time. This can be done by adding a time-out to pong as shown in the -following example:

      -module(tut19).
      +following example:

      -module(tut19).
       
      --export([start_ping/1, start_pong/0,  ping/2, pong/0]).
      +-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
       
      -ping(0, Pong_Node) ->
      -    io:format("ping finished~n", []);
      +ping(0, Pong_Node) ->
      +    io:format("ping finished~n", []);
       
      -ping(N, Pong_Node) ->
      -    {pong, Pong_Node} ! {ping, self()},
      +ping(N, Pong_Node) ->
      +    {pong, Pong_Node} ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1, Pong_Node).
      +    ping(N - 1, Pong_Node).
       
      -pong() ->
      +pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           after 5000 ->
      -            io:format("Pong timed out~n", [])
      +            io:format("Pong timed out~n", [])
           end.
       
      -start_pong() ->
      -    register(pong, spawn(tut19, pong, [])).
      +start_pong() ->
      +    register(pong, spawn(tut19, pong, [])).
       
      -start_ping(Pong_Node) ->
      -    spawn(tut19, ping, [3, Pong_Node]).

      After this is compiled and the file tut19.beam is copied to the necessary +start_ping(Pong_Node) -> + spawn(tut19, ping, [3, Pong_Node]).

      After this is compiled and the file tut19.beam is copied to the necessary directories, the following is seen on (pong@kosken):

      (pong@kosken)1> tut19:start_pong().
       true
       Pong received ping
      @@ -172,20 +172,20 @@ 

      Ping received pong Ping received pong Ping received pong -ping finished

      The time-out is set in:

      pong() ->
      +ping finished

      The time-out is set in:

      pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           after 5000 ->
      -            io:format("Pong timed out~n", [])
      +            io:format("Pong timed out~n", [])
           end.

      The time-out (after 5000) is started when receive is entered. The time-out is canceled if {ping,Ping_PID} is received. If {ping,Ping_PID} is not received, the actions following the time-out are done after 5000 milliseconds. after must be last in the receive, that is, preceded by all other message reception specifications in the receive. It is also possible to call a -function that returned an integer for the time-out:

      after pong_timeout() ->

      In general, there are better ways than using time-outs to supervise parts of a +function that returned an integer for the time-out:

      after pong_timeout() ->

      In general, there are better ways than using time-outs to supervise parts of a distributed Erlang system. Time-outs are usually appropriate to supervise external events, for example, if you have expected a message from some external system within a specified time. For example, a time-out can be used to log a @@ -213,36 +213,36 @@

      If one of the processes exits abnormally, all the processes in the transaction are killed. As it is often wanted to create a process and link to it at the same time, there is a special BIF, spawn_link that does the -same as spawn, but also creates a link to the spawned process.

      Now an example of the ping pong example using links to terminate "pong":

      -module(tut20).
      +same as spawn, but also creates a link to the spawned process.

      Now an example of the ping pong example using links to terminate "pong":

      -module(tut20).
       
      --export([start/1,  ping/2, pong/0]).
      +-export([start/1,  ping/2, pong/0]).
       
      -ping(N, Pong_Pid) ->
      -    link(Pong_Pid),
      -    ping1(N, Pong_Pid).
      +ping(N, Pong_Pid) ->
      +    link(Pong_Pid),
      +    ping1(N, Pong_Pid).
       
      -ping1(0, _) ->
      -    exit(ping);
      +ping1(0, _) ->
      +    exit(ping);
       
      -ping1(N, Pong_Pid) ->
      -    Pong_Pid ! {ping, self()},
      +ping1(N, Pong_Pid) ->
      +    Pong_Pid ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping1(N - 1, Pong_Pid).
      +    ping1(N - 1, Pong_Pid).
       
      -pong() ->
      +pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start(Ping_Node) ->
      -    PongPID = spawn(tut20, pong, []),
      -    spawn(Ping_Node, tut20, ping, [3, PongPID]).
      (s1@bill)3> tut20:start(s2@kosken).
      +start(Ping_Node) ->
      +    PongPID = spawn(tut20, pong, []),
      +    spawn(Ping_Node, tut20, ping, [3, PongPID]).
      (s1@bill)3> tut20:start(s2@kosken).
       Pong received ping
       <3820.41.0>
       Ping received pong
      @@ -256,45 +256,45 @@ 

      sent to "pong", which also terminates.

      It is possible to modify the default behaviour of a process so that it does not get killed when it receives abnormal exit signals. Instead, all signals are turned into normal messages on the format {'EXIT',FromPID,Reason} and added to -the end of the receiving process' message queue. This behaviour is set by:

      process_flag(trap_exit, true)

      There are several other process flags, see erlang(3). +the end of the receiving process' message queue. This behaviour is set by:

      process_flag(trap_exit, true)

      There are several other process flags, see erlang(3). Changing the default behaviour of a process in this way is usually not done in standard user programs, but is left to the supervisory programs in OTP. However, -the ping pong program is modified to illustrate exit trapping.

      -module(tut21).
      +the ping pong program is modified to illustrate exit trapping.

      -module(tut21).
       
      --export([start/1,  ping/2, pong/0]).
      +-export([start/1,  ping/2, pong/0]).
       
      -ping(N, Pong_Pid) ->
      -    link(Pong_Pid),
      -    ping1(N, Pong_Pid).
      +ping(N, Pong_Pid) ->
      +    link(Pong_Pid),
      +    ping1(N, Pong_Pid).
       
      -ping1(0, _) ->
      -    exit(ping);
      +ping1(0, _) ->
      +    exit(ping);
       
      -ping1(N, Pong_Pid) ->
      -    Pong_Pid ! {ping, self()},
      +ping1(N, Pong_Pid) ->
      +    Pong_Pid ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping1(N - 1, Pong_Pid).
      +    ping1(N - 1, Pong_Pid).
       
      -pong() ->
      -    process_flag(trap_exit, true),
      -    pong1().
      +pong() ->
      +    process_flag(trap_exit, true),
      +    pong1().
       
      -pong1() ->
      +pong1() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong1();
      -        {'EXIT', From, Reason} ->
      -            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
      +            pong1();
      +        {'EXIT', From, Reason} ->
      +            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
           end.
       
      -start(Ping_Node) ->
      -    PongPID = spawn(tut21, pong, []),
      -    spawn(Ping_Node, tut21, ping, [3, PongPID]).
      (s1@bill)1> tut21:start(s2@gollum).
      +start(Ping_Node) ->
      +    PongPID = spawn(tut21, pong, []),
      +    spawn(Ping_Node, tut21, ping, [3, PongPID]).
      (s1@bill)1> tut21:start(s2@gollum).
       <3820.39.0>
       Pong received ping
       Ping received pong
      @@ -355,127 +355,127 @@ 

      %%% Configuration: change the server_node() function to return the %%% name of the node where the messenger server runs --module(messenger). --export([start_server/0, server/0, - logon/1, logoff/0, message/2, client/2]). +-module(messenger). +-export([start_server/0, server/0, + logon/1, logoff/0, message/2, client/2]). %%% Change the function below to return the name of the node where the %%% messenger server runs -server_node() -> +server_node() -> messenger@super. %%% This is the server process for the "messenger" %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...] -server() -> - process_flag(trap_exit, true), - server([]). +server() -> + process_flag(trap_exit, true), + server([]). -server(User_List) -> +server(User_List) -> receive - {From, logon, Name} -> - New_User_List = server_logon(From, Name, User_List), - server(New_User_List); - {'EXIT', From, _} -> - New_User_List = server_logoff(From, User_List), - server(New_User_List); - {From, message_to, To, Message} -> - server_transfer(From, To, Message, User_List), - io:format("list is now: ~p~n", [User_List]), - server(User_List) + {From, logon, Name} -> + New_User_List = server_logon(From, Name, User_List), + server(New_User_List); + {'EXIT', From, _} -> + New_User_List = server_logoff(From, User_List), + server(New_User_List); + {From, message_to, To, Message} -> + server_transfer(From, To, Message, User_List), + io:format("list is now: ~p~n", [User_List]), + server(User_List) end. %%% Start the server -start_server() -> - register(messenger, spawn(messenger, server, [])). +start_server() -> + register(messenger, spawn(messenger, server, [])). %%% Server adds a new user to the user list -server_logon(From, Name, User_List) -> +server_logon(From, Name, User_List) -> %% check if logged on anywhere else - case lists:keymember(Name, 2, User_List) of + case lists:keymember(Name, 2, User_List) of true -> - From ! {messenger, stop, user_exists_at_other_node}, %reject logon + From ! {messenger, stop, user_exists_at_other_node}, %reject logon User_List; false -> - From ! {messenger, logged_on}, - link(From), - [{From, Name} | User_List] %add user to the list + From ! {messenger, logged_on}, + link(From), + [{From, Name} | User_List] %add user to the list end. %%% Server deletes a user from the user list -server_logoff(From, User_List) -> - lists:keydelete(From, 1, User_List). +server_logoff(From, User_List) -> + lists:keydelete(From, 1, User_List). %%% Server transfers a message between user -server_transfer(From, To, Message, User_List) -> +server_transfer(From, To, Message, User_List) -> %% check that the user is logged on and who he is - case lists:keysearch(From, 1, User_List) of + case lists:keysearch(From, 1, User_List) of false -> - From ! {messenger, stop, you_are_not_logged_on}; - {value, {_, Name}} -> - server_transfer(From, Name, To, Message, User_List) + From ! {messenger, stop, you_are_not_logged_on}; + {value, {_, Name}} -> + server_transfer(From, Name, To, Message, User_List) end. %%% If the user exists, send the message -server_transfer(From, Name, To, Message, User_List) -> +server_transfer(From, Name, To, Message, User_List) -> %% Find the receiver and send the message - case lists:keysearch(To, 2, User_List) of + case lists:keysearch(To, 2, User_List) of false -> - From ! {messenger, receiver_not_found}; - {value, {ToPid, To}} -> - ToPid ! {message_from, Name, Message}, - From ! {messenger, sent} + From ! {messenger, receiver_not_found}; + {value, {ToPid, To}} -> + ToPid ! {message_from, Name, Message}, + From ! {messenger, sent} end. %%% User Commands -logon(Name) -> - case whereis(mess_client) of +logon(Name) -> + case whereis(mess_client) of undefined -> - register(mess_client, - spawn(messenger, client, [server_node(), Name])); + register(mess_client, + spawn(messenger, client, [server_node(), Name])); _ -> already_logged_on end. -logoff() -> +logoff() -> mess_client ! logoff. -message(ToName, Message) -> - case whereis(mess_client) of % Test if the client is running +message(ToName, Message) -> + case whereis(mess_client) of % Test if the client is running undefined -> not_logged_on; - _ -> mess_client ! {message_to, ToName, Message}, + _ -> mess_client ! {message_to, ToName, Message}, ok end. %%% The client process which runs on each user node -client(Server_Node, Name) -> - {messenger, Server_Node} ! {self(), logon, Name}, - await_result(), - client(Server_Node). +client(Server_Node, Name) -> + {messenger, Server_Node} ! {self(), logon, Name}, + await_result(), + client(Server_Node). -client(Server_Node) -> +client(Server_Node) -> receive logoff -> - exit(normal); - {message_to, ToName, Message} -> - {messenger, Server_Node} ! {self(), message_to, ToName, Message}, - await_result(); - {message_from, FromName, Message} -> - io:format("Message from ~p: ~p~n", [FromName, Message]) + exit(normal); + {message_to, ToName, Message} -> + {messenger, Server_Node} ! {self(), message_to, ToName, Message}, + await_result(); + {message_from, FromName, Message} -> + io:format("Message from ~p: ~p~n", [FromName, Message]) end, - client(Server_Node). + client(Server_Node). %%% wait for a response from the server -await_result() -> +await_result() -> receive - {messenger, stop, Why} -> % Stop the client - io:format("~p~n", [Why]), - exit(normal); - {messenger, What} -> % Normal response - io:format("~p~n", [What]) + {messenger, stop, Why} -> % Stop the client + io:format("~p~n", [Why]), + exit(normal); + {messenger, What} -> % Normal response + io:format("~p~n", [What]) after 5000 -> - io:format("No response from server~n", []), - exit(timeout) + io:format("No response from server~n", []), + exit(timeout) end.

      The following changes are added:

      The messenger server traps exits. If it receives an exit signal, {'EXIT',From,Reason}, this means that a client process has terminated or is unreachable for one of the following reasons:

      • The user has logged off (the "logoff" message is removed).
      • The network connection to the client is broken.
      • The node on which the client process resides has gone down.
      • The client processes has done some illegal operation.

      If an exit signal is received as above, the tuple {From,Name} is deleted from diff --git a/prs/8803/doc/system/search.html b/prs/8803/doc/system/search.html index b28cfa319469e..c08442d0c429e 100644 --- a/prs/8803/doc/system/search.html +++ b/prs/8803/doc/system/search.html @@ -112,7 +112,7 @@

    - +
    diff --git a/prs/8803/doc/system/statem.html b/prs/8803/doc/system/statem.html index 032aa731d1a23..cdca1b9ede95b 100644 --- a/prs/8803/doc/system/statem.html +++ b/prs/8803/doc/system/statem.html @@ -128,7 +128,7 @@

    a state transition and the output is actions executed during the state transition. Analogously to the mathematical model of a Finite State Machine, it can be described as a set of relations -of the following form:

    State(S) x Event(E) -> Actions(A), State(S')

    These relations are interpreted as follows: if we are in state S, +of the following form:

    State(S) x Event(E) -> Actions(A), State(S')

    These relations are interpreted as follows: if we are in state S, and event E occurs, we are to perform actions A, and make a transition to state S'. Notice that S' can be equal to S, and that A can be empty.

    In gen_statem we define a state change as a state transition in which the @@ -409,12 +409,12 @@

    mode, automatically call the state callback with special arguments whenever the state changes, so you can write state enter actions near the rest of the state transition rules. -It typically looks like this:

    StateName(enter, OldState, Data) ->
    +It typically looks like this:

    StateName(enter, OldState, Data) ->
         ... code for state enter actions here ...
    -    {keep_state, NewData};
    -StateName(EventType, EventContent, Data) ->
    +    {keep_state, NewData};
    +StateName(EventType, EventContent, Data) ->
         ... code for actions here ...
    -    {next_state, NewStateName, NewData}.

    Since the state enter call is not an event there are restrictions on the + {next_state, NewStateName, NewData}.

    Since the state enter call is not an event there are restrictions on the allowed return value and state transition actions. You must not change the state, postpone this non-event, insert any events, or change the @@ -503,55 +503,55 @@

    open --> open : {button, Digit} open --> locked : state_timeout\n* do_lock()

    This code lock state machine can be implemented using gen_statem with -the following callback module:

    -module(code_lock).
    --behaviour(gen_statem).
    --define(NAME, code_lock).
    +the following callback module:

    -module(code_lock).
    +-behaviour(gen_statem).
    +-define(NAME, code_lock).
     
    --export([start_link/1]).
    --export([button/1]).
    --export([init/1,callback_mode/0,terminate/3]).
    --export([locked/3,open/3]).
    -
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    -
    -button(Button) ->
    -    gen_statem:cast(?NAME, {button,Button}).
    -
    -init(Code) ->
    -    do_lock(),
    -    Data = #{code => Code, length => length(Code), buttons => []},
    -    {ok, locked, Data}.
    -
    -callback_mode() ->
    -    state_functions.
    locked(
    -  cast, {button,Button},
    -  #{code := Code, length := Length, buttons := Buttons} = Data) ->
    +-export([start_link/1]).
    +-export([button/1]).
    +-export([init/1,callback_mode/0,terminate/3]).
    +-export([locked/3,open/3]).
    +
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +
    +button(Button) ->
    +    gen_statem:cast(?NAME, {button,Button}).
    +
    +init(Code) ->
    +    do_lock(),
    +    Data = #{code => Code, length => length(Code), buttons => []},
    +    {ok, locked, Data}.
    +
    +callback_mode() ->
    +    state_functions.
    locked(
    +  cast, {button,Button},
    +  #{code := Code, length := Length, buttons := Buttons} = Data) ->
         NewButtons =
             if
    -            length(Buttons) < Length ->
    +            length(Buttons) < Length ->
                     Buttons;
                 true ->
    -                tl(Buttons)
    -        end ++ [Button],
    +                tl(Buttons)
    +        end ++ [Button],
         if
             NewButtons =:= Code -> % Correct
    -	    do_unlock(),
    -            {next_state, open, Data#{buttons := []},
    -             [{state_timeout,10_000,lock}]}; % Time in milliseconds
    +	    do_unlock(),
    +            {next_state, open, Data#{buttons := []},
    +             [{state_timeout,10_000,lock}]}; % Time in milliseconds
     	true -> % Incomplete | Incorrect
    -            {next_state, locked, Data#{buttons := NewButtons}}
    -    end.
    open(state_timeout, lock,  Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, open, Data}.
    do_lock() ->
    -    io:format("Lock~n", []).
    -do_unlock() ->
    -    io:format("Unlock~n", []).
    -
    -terminate(_Reason, State, _Data) ->
    -    State =/= locked andalso do_lock(),
    +            {next_state, locked, Data#{buttons := NewButtons}}
    +    end.
    open(state_timeout, lock,  Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, open, Data}.
    do_lock() ->
    +    io:format("Lock~n", []).
    +do_unlock() ->
    +    io:format("Unlock~n", []).
    +
    +terminate(_Reason, State, _Data) ->
    +    State =/= locked andalso do_lock(),
         ok.

    The code is explained in the next sections.

    @@ -559,8 +559,8 @@

    Starting gen_statem

    In the example in the previous section, gen_statem is started by calling -code_lock:start_link(Code):

    start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

    start_link/1 calls function gen_statem:start_link/4, +code_lock:start_link(Code):

    start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).

    start_link/1 calls function gen_statem:start_link/4, which spawns and links to a new process, a gen_statem.

    diff --git a/prs/8803/doc/system/typespec.html b/prs/8803/doc/system/typespec.html index e05a37645d267..97165d930bf5f 100644 --- a/prs/8803/doc/system/typespec.html +++ b/prs/8803/doc/system/typespec.html @@ -241,11 +241,11 @@

    predefined aliases for the type unions also shown in the table.

    Built-in typeDefined as
    term/0any/0
    binary/0<<_:_*8>>
    nonempty_binary/0<<_:8, _:_*8>>
    bitstring/0<<_:_*1>>
    nonempty_bitstring/0<<_:1, _:_*1>>
    boolean/0'false' | 'true'
    byte/00..255
    char/00..16#10ffff
    nil/0[]
    number/0integer/0 | float/0
    list/0[any()]
    maybe_improper_list/0maybe_improper_list(any(), any())
    nonempty_list/0nonempty_list(any())
    string/0[char()]
    nonempty_string/0[char(),...]
    iodata/0iolist() | binary()
    iolist/0maybe_improper_list(byte() | binary() | iolist(), binary() | [])
    map/0#{any() => any()}
    function/0fun()
    module/0atom/0
    mfa/0{module(),atom(),arity()}
    arity/00..255
    identifier/0pid() | port() | reference()
    node/0atom/0
    timeout/0'infinity' | non_neg_integer()
    no_return/0none/0

    Table: Built-in types, predefined aliases

    In addition, the following three built-in types exist and can be thought as defined below, though strictly their "type definition" is not valid syntax according to the type language defined above.

    Built-in typeCan be thought defined by the syntax
    non_neg_integer/00..
    pos_integer/01..
    neg_integer/0..-1

    Table: Additional built-in types

    Note

    The following built-in list types also exist, but they are expected to be -rarely used. Hence, they have long names:

    nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
    -nonempty_improper_list(Type1, Type2)
    -nonempty_maybe_improper_list(Type1, Type2)

    where the last two types define the set of Erlang terms one would expect.

    Also for convenience, record notation is allowed to be used. Records are -shorthands for the corresponding tuples:

    Record :: #Erlang_Atom{}
    -        | #Erlang_Atom{Fields}

    Records are extended to possibly contain type information. This is described in +rarely used. Hence, they have long names:

    nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any())
    +nonempty_improper_list(Type1, Type2)
    +nonempty_maybe_improper_list(Type1, Type2)

    where the last two types define the set of Erlang terms one would expect.

    Also for convenience, record notation is allowed to be used. Records are +shorthands for the corresponding tuples:

    Record :: #Erlang_Atom{}
    +        | #Erlang_Atom{Fields}

    Records are extended to possibly contain type information. This is described in Type Information in Record Declarations.

    @@ -256,8 +256,8 @@

    name as a built-in type.

    It is recommended to avoid deliberately reusing built-in names because it can be confusing. However, when an Erlang/OTP release introduces a new type, code that happened to define its own type having the same name will continue to work.

    As an example, imagine that the Erlang/OTP 42 release introduces a new type -gadget() defined like this:

    -type gadget() :: {'gadget', reference()}.

    Further imagine that some code has its own (different) definition of gadget(), -for example:

    -type gadget() :: #{}.

    Since redefinitions are allowed, the code will still compile (but with a +gadget() defined like this:

    -type gadget() :: {'gadget', reference()}.

    Further imagine that some code has its own (different) definition of gadget(), +for example:

    -type gadget() :: #{}.

    Since redefinitions are allowed, the code will still compile (but with a warning), and Dialyzer will not emit any additional warnings.

    @@ -266,8 +266,8 @@

    As seen, the basic syntax of a type is an atom followed by closed parentheses. New types are declared using -type and -opaque attributes as in the -following:

    -type my_struct_type() :: Type.
    --opaque my_opaq_type() :: Type.

    The type name is the atom my_struct_type, followed by parentheses. Type is a +following:

    -type my_struct_type() :: Type.
    +-opaque my_opaq_type() :: Type.

    The type name is the atom my_struct_type, followed by parentheses. Type is a type as defined in the previous section. A current restriction is that Type can contain only predefined types, or user-defined types which are either of the following:

    diff --git a/prs/8803/doc/upcoming_incompatibilities.html b/prs/8803/doc/upcoming_incompatibilities.html index bac06e39fb14c..9536d8843d8fc 100644 --- a/prs/8803/doc/upcoming_incompatibilities.html +++ b/prs/8803/doc/upcoming_incompatibilities.html @@ -170,10 +170,10 @@

    Singleton type variables will become a compile-time error

    -

    Before Erlang/OTP 26, the compiler would silenty accept the following spec:

    -spec f(Opts) -> term() when
    -    Opts :: {ok, Unknown} | {error, Unknown}.
    -f(_) -> error.

    In OTP 26, the compiler emits a warning pointing out that the type variable -Unknown is unbound:

    t.erl:6:18: Warning: type variable 'Unknown' is only used once (is unbound)
    +

    Before Erlang/OTP 26, the compiler would silenty accept the following spec:

    -spec f(Opts) -> term() when
    +    Opts :: {ok, Unknown} | {error, Unknown}.
    +f(_) -> error.

    In OTP 26, the compiler emits a warning pointing out that the type variable +Unknown is unbound:

    t.erl:6:18: Warning: type variable 'Unknown' is only used once (is unbound)
     %    6|     Opts :: {ok, Unknown} | {error, Unknown}.
     %     |                  ^

    In OTP 27, that warning will become an error.

    @@ -183,7 +183,7 @@

    compiler application must be available.

    The old behavior of interpreting escripts can be restored by adding the -following line to the script file:

    -mode(interpret).

    In OTP 28, support for interpreting an escript will be removed.

    +following line to the script file:

    -mode(interpret).

    In OTP 28, support for interpreting an escript will be removed.

    @@ -235,10 +235,10 @@

    """" -++ foo() ++ +++ foo() ++ """" %% Became -"" ++ foo() ++ "" +"" ++ foo() ++ "" %% %% In OTP 27 it is instead interpreted as a %% Triple-Quoted String (triple-or-more) equivalent to diff --git a/prs/8803/erts-15.0.1/doc/html/alt_dist.html b/prs/8803/erts-15.0.1/doc/html/alt_dist.html index 6ea300addeafd..abbfbc8e09c60 100644 --- a/prs/8803/erts-15.0.1/doc/html/alt_dist.html +++ b/prs/8803/erts-15.0.1/doc/html/alt_dist.html @@ -241,10 +241,10 @@

    Exported Callback Functions

    -

    The following functions are mandatory:

    • listen(Name) ->
      -  {ok, {Listen, Address, Creation}} | {error, Error}
      -listen(Name,Host) ->
      -  {ok, {Listen, Address, Creation}} | {error, Error}

      listen/2 is called once in order to listen for incoming connection requests. +

      The following functions are mandatory:

      • listen(Name) ->
        +  {ok, {Listen, Address, Creation}} | {error, Error}
        +listen(Name,Host) ->
        +  {ok, {Listen, Address, Creation}} | {error, Error}

        listen/2 is called once in order to listen for incoming connection requests. The call is made when the distribution is brought up. The argument Name is the part of the node name before the @ sign in the full node name. It can be either an atom or a string. The argument Host is the part of the node name @@ -254,12 +254,12 @@

        #net_address{} record is defined in kernel/include/net_address.hrl), and Creation which (currently) is an integer 1, 2, or 3.

        If epmd is to be used for node discovery, you typically want to use the erl_epmd module (part of the kernel application) in order to -register the listen port with epmd and retrieve Creation to use.

      • address() ->
        +register the listen port with epmd and retrieve Creation to use.

      • address() ->
           Address

        address/0 is called in order to get the Address part of the listen/2 function without creating a listen socket. -All fields except address have to be set in the returned record

        Example:

        address() ->
        -    {ok, Host} = inet:gethostname(),
        -    #net_address{ host = Host, protocol = tcp, family = inet6 }.
      • accept(Listen) ->
        +All fields except address have to be set in the returned record

        Example:

        address() ->
        +    {ok, Host} = inet:gethostname(),
        +    #net_address{ host = Host, protocol = tcp, family = inet6 }.
      • accept(Listen) ->
           AcceptorPid

        accept/1 should spawn a process that accepts connections. This process should preferably execute on max priority. The process identifier of this process should be returned.

        The Listen argument will be the same as the Listen handle part of the @@ -268,7 +268,7 @@

        may not be the process registered as net_kernel) and is in this document identified as Kernel. When a connection has been accepted by the acceptor process, it needs to inform Kernel about the accepted connection. This is -done by passing a message on the form:

        Kernel ! {accept, AcceptorPid, DistController, Family, Proto}

        DistController is either the process or port identifier of the distribution +done by passing a message on the form:

        Kernel ! {accept, AcceptorPid, DistController, Family, Proto}

        DistController is either the process or port identifier of the distribution controller for the connection. The distribution controller should be created by the acceptor processes when a new connection is accepted. Its job is to dispatch traffic on the connection.

        Kernel responds with one of the following messages:

        • {Kernel, controller, SupervisorPid} - The request was accepted and @@ -276,7 +276,7 @@

          process (which is created in the accept_connection/5 callback).

        • {Kernel, unsupported_protocol} - The request was rejected. This is a fatal error. The acceptor process should terminate.

        When an accept sequence has been completed the acceptor process is expected to -continue accepting further requests.

      • accept_connection(AcceptorPid, DistCtrl, MyNode, Allowed, SetupTime) ->
        +continue accepting further requests.

      • accept_connection(AcceptorPid, DistCtrl, MyNode, Allowed, SetupTime) ->
           ConnectionSupervisorPid

        accept_connection/5 should spawn a process that will perform the Erlang distribution handshake for the connection. If the handshake successfully completes it should continue to function as a connection supervisor. This @@ -298,7 +298,7 @@

        the handshake in a #hs_data{} record and call dist_util:handshake_other_started(HsData) with this record.

        dist_util:handshake_other_started(HsData) will perform the handshake and if the handshake successfully completes this process will then continue in a -connection supervisor loop as long as the connection is up.

      • setup(Node, Type, MyNode, LongOrShortNames, SetupTime) ->
        +connection supervisor loop as long as the connection is up.

      • setup(Node, Type, MyNode, LongOrShortNames, SetupTime) ->
           ConnectionSupervisorPid

        setup/5 should spawn a process that connects to Node. When connection has been established it should perform the Erlang distribution handshake for the connection. If the handshake successfully completes it should continue to @@ -324,15 +324,15 @@

        the handshake in a #hs_data{} record and call dist_util:handshake_we_started(HsData) with this record.

        dist_util:handshake_we_started(HsData) will perform the handshake and the handshake successfully completes this process will then continue in a -connection supervisor loop as long as the connection is up.

      • close(Listen) ->
        -  void()

        Called in order to close the Listen handle that originally was passed from -the listen/1 callback.

      • select(NodeName) ->
        -  boolean()

        Return true if the host name part of the NodeName is valid for use with -this protocol; otherwise, false.

      There are also two optional functions that may be exported:

      • setopts(Listen, Opts) ->
        -  ok | {error, Error}

        The argument Listen is the handle originally passed from the +connection supervisor loop as long as the connection is up.

      • close(Listen) ->
        +  void()

        Called in order to close the Listen handle that originally was passed from +the listen/1 callback.

      • select(NodeName) ->
        +  boolean()

        Return true if the host name part of the NodeName is valid for use with +this protocol; otherwise, false.

      There are also two optional functions that may be exported:

      • setopts(Listen, Opts) ->
        +  ok | {error, Error}

        The argument Listen is the handle originally passed from the listen/1 callback. The argument Opts is a list of -options to set on future connections.

      • getopts(Listen, Opts) ->
        -  {ok, OptionValues} | {error, Error}

        The argument Listen is the handle originally passed from the +options to set on future connections.

      • getopts(Listen, Opts) ->
        +  {ok, OptionValues} | {error, Error}

        The argument Listen is the handle originally passed from the listen/1 callback. The argument Opts is a list of options to read for future connections.

      @@ -354,36 +354,36 @@

      dist_util:start_timer/1.

    • allowed - Information passed as Allowed to accept_connection/5. This field is only mandatory when the remote node initiated the connection. That is, when the connection is set up via -accept_connection/5.

    • f_send - A fun with the following signature:

      fun (DistCtrlr, Data) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Data -is io data to pass to the other side.

      Only used during handshake phase.

    • f_recv - A fun with the following signature:

      fun (DistCtrlr, Length) -> {ok, Packet} | {error, Reason}

      where DistCtrlr is the identifier of the distribution controller. If +accept_connection/5.

    • f_send - A fun with the following signature:

      fun (DistCtrlr, Data) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Data +is io data to pass to the other side.

      Only used during handshake phase.

    • f_recv - A fun with the following signature:

      fun (DistCtrlr, Length) -> {ok, Packet} | {error, Reason}

      where DistCtrlr is the identifier of the distribution controller. If Length is 0, all available bytes should be returned. If Length > 0, exactly Length bytes should be returned, or an error; possibly discarding less than Length bytes of data when the connection is closed from the other side. It is used for passive receive of data from the other end.

      Only used during handshake phase.

    • f_setopts_pre_nodeup - A fun with the -following signature:

      fun (DistCtrlr) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller. Called +following signature:

      fun (DistCtrlr) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller. Called just before the distribution channel is taken up for normal traffic.

      Only used during handshake phase.

    • f_setopts_post_nodeup - A fun with -the following signature:

      fun (DistCtrlr) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller. Called -just after distribution channel has been taken up for normal traffic.

      Only used during handshake phase.

    • f_getll - A fun with the following signature:

      fun (DistCtrlr) -> ID

      where DistCtrlr is the identifier of the distribution controller and ID is +the following signature:

      fun (DistCtrlr) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller. Called +just after distribution channel has been taken up for normal traffic.

      Only used during handshake phase.

    • f_getll - A fun with the following signature:

      fun (DistCtrlr) -> ID

      where DistCtrlr is the identifier of the distribution controller and ID is the identifier of the low level entity that handles the connection (often -DistCtrlr itself).

      Only used during handshake phase.

    • f_address - A fun with the following signature:

      fun (DistCtrlr, Node) -> NetAddress

      where DistCtrlr is the identifier of the distribution controller, Node is +DistCtrlr itself).

      Only used during handshake phase.

    • f_address - A fun with the following signature:

      fun (DistCtrlr, Node) -> NetAddress

      where DistCtrlr is the identifier of the distribution controller, Node is the node name of the node on the other end, and NetAddress is a #net_address{} record with information about the address for the Node on the other end of the connection. The #net_address{} record is defined in -kernel/include/net_address.hrl.

      Only used during handshake phase.

    • mf_tick - A fun with the following signature:

      fun (DistCtrlr) -> void()

      where DistCtrlr is the identifier of the distribution controller. This +kernel/include/net_address.hrl.

      Only used during handshake phase.

    • mf_tick - A fun with the following signature:

      fun (DistCtrlr) -> void()

      where DistCtrlr is the identifier of the distribution controller. This function should send information over the connection that is not interpreted by the other end while increasing the statistics of received packets on the other end. This is usually implemented by sending an empty packet.

      Note

      It is of vital importance that this operation does not block the caller for -a long time. This since it is called from the connection supervisor.

      Used when connection is up.

    • mf_getstat - A fun with the following signature:

      fun (DistCtrlr) -> {ok, Received, Sent, PendSend}

      where DistCtrlr is the identifier of the distribution controller, Received +a long time. This since it is called from the connection supervisor.

      Used when connection is up.

    • mf_getstat - A fun with the following signature:

      fun (DistCtrlr) -> {ok, Received, Sent, PendSend}

      where DistCtrlr is the identifier of the distribution controller, Received is received packets, Sent is sent packets, and PendSend is amount of data in queue to be sent (typically in bytes, but dist_util only checks whether the value is non-zero to know there is data in queue) or a boolean/0 indicating whether there are packets in queue to be sent.

      Note

      It is of vital importance that this operation does not block the caller for a long time. This since it is called from the connection supervisor.

      Used when connection is up.

    • request_type - The request Type as passed to setup/5. This is only mandatory when the connection has -been initiated by this node. That is, the connection is set up via setup/5.

    • mf_setopts - A fun with the following signature:

      fun (DistCtrl, Opts) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Opts -is a list of options to set on the connection.

      This function is optional. Used when connection is up.

    • mf_getopts - A fun with the following signature:

      fun (DistCtrl, Opts) -> {ok, OptionValues} | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Opts +been initiated by this node. That is, the connection is set up via setup/5.

    • mf_setopts - A fun with the following signature:

      fun (DistCtrl, Opts) -> ok | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Opts +is a list of options to set on the connection.

      This function is optional. Used when connection is up.

    • mf_getopts - A fun with the following signature:

      fun (DistCtrl, Opts) -> {ok, OptionValues} | {error, Error}

      where DistCtrlr is the identifier of the distribution controller and Opts is a list of options to read for the connection.

      This function is optional. Used when connection is up.

    • f_handshake_complete - A fun with the -following signature:

      fun (DistCtrlr, Node, DHandle) -> void()

      where DistCtrlr is the identifier of the distribution controller, Node is +following signature:

      fun (DistCtrlr, Node, DHandle) -> void()

      where DistCtrlr is the identifier of the distribution controller, Node is the node name of the node connected at the other end, and DHandle is a distribution handle needed by a distribution controller process when calling the following BIFs:

      This function is called when the handshake has completed and the distribution @@ -519,62 +519,62 @@

      because in most situation you need to do it. Unix domain sockets are reliable and order maintaining, so we do not need to implement resends and such in the driver.

      We start writing the example Unix domain sockets driver by declaring prototypes -and filling in a static ErlDrvEntry structure:

      ( 1) #include <stdio.h>
      -( 2) #include <stdlib.h>
      -( 3) #include <string.h>
      -( 4) #include <unistd.h>
      -( 5) #include <errno.h>
      -( 6) #include <sys/types.h>
      -( 7) #include <sys/stat.h>
      -( 8) #include <sys/socket.h>
      -( 9) #include <sys/un.h>
      -(10) #include <fcntl.h>
      +and filling in a static ErlDrvEntry structure:

      ( 1) #include <stdio.h>
      +( 2) #include <stdlib.h>
      +( 3) #include <string.h>
      +( 4) #include <unistd.h>
      +( 5) #include <errno.h>
      +( 6) #include <sys/types.h>
      +( 7) #include <sys/stat.h>
      +( 8) #include <sys/socket.h>
      +( 9) #include <sys/un.h>
      +(10) #include <fcntl.h>
       
      -(11) #define HAVE_UIO_H
      -(12) #include "erl_driver.h"
      +(11) #define HAVE_UIO_H
      +(12) #include "erl_driver.h"
       
      -(13) /*
      +(13) /*
       (14) ** Interface routines
       (15) */
      -(16) static ErlDrvData uds_start(ErlDrvPort port, char *buff);
      -(17) static void uds_stop(ErlDrvData handle);
      -(18) static void uds_command(ErlDrvData handle, char *buff, int bufflen);
      -(19) static void uds_input(ErlDrvData handle, ErlDrvEvent event);
      -(20) static void uds_output(ErlDrvData handle, ErlDrvEvent event);
      -(21) static void uds_finish(void);
      -(22) static int uds_control(ErlDrvData handle, unsigned int command,
      -(23)                        char* buf, int count, char** res, int res_size);
      +(16) static ErlDrvData uds_start(ErlDrvPort port, char *buff);
      +(17) static void uds_stop(ErlDrvData handle);
      +(18) static void uds_command(ErlDrvData handle, char *buff, int bufflen);
      +(19) static void uds_input(ErlDrvData handle, ErlDrvEvent event);
      +(20) static void uds_output(ErlDrvData handle, ErlDrvEvent event);
      +(21) static void uds_finish(void);
      +(22) static int uds_control(ErlDrvData handle, unsigned int command,
      +(23)                        char* buf, int count, char** res, int res_size);
       
      -(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
      +(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
       (31)                                         descriptor ready */
      -(32)     uds_output,                      /* ready_output, called when output
      +(32)     uds_output,                      /* ready_output, called when output
       (33)                                         descriptor ready */
      -(34)     "uds_drv",                       /* char *driver_name, the argument
      +(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
      +(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-10 the OS headers needed for the driver are included. As this driver +(50) NULL, /* Reserved for internal use */ +(51) NULL, /* process_exit callback */ +(52) NULL /* stop_select callback */ +(53) };

      On line 1-10 the OS headers needed for the driver are included. As this driver is written for Solaris, we know that the header uio.h exists. So the preprocessor variable HAVE_UIO_H can be defined before erl_driver.h is included on line 12. The definition of HAVE_UIO_H will make the I/O vectors @@ -625,17 +625,17 @@

      up, the port is to accept data to send. However, the port should not receive any data, to avoid that data arrives from another node before every kernel subsystem is prepared to handle it. A third mode, named intermediate, is used for this -intermediate stage.

      An enum is defined for the different types of ports:

      ( 1) typedef enum {
      -( 2)     portTypeUnknown,      /* An uninitialized port */
      -( 3)     portTypeListener,     /* A listening port/socket */
      -( 4)     portTypeAcceptor,     /* An intermediate stage when accepting
      +intermediate stage.

      An enum is defined for the different types of ports:

      ( 1) typedef enum {
      +( 2)     portTypeUnknown,      /* An uninitialized port */
      +( 3)     portTypeListener,     /* A listening port/socket */
      +( 4)     portTypeAcceptor,     /* An intermediate stage when accepting
       ( 5)                              on a listen port */
      -( 6)     portTypeConnector,    /* An intermediate stage when connecting */
      -( 7)     portTypeCommand,      /* A connected open port in command mode */
      -( 8)     portTypeIntermediate, /* A connected open port in special
      +( 6)     portTypeConnector,    /* An intermediate stage when connecting */
      +( 7)     portTypeCommand,      /* A connected open port in command mode */
      +( 8)     portTypeIntermediate, /* A connected open port in special
       ( 9)                              half active mode */
      -(10)     portTypeData          /* A connected open port in data mode */
      -(11) } PortType;

      The different types are as follows:

      • portTypeUnknown - The type a port has when it is opened, but not bound +(10) portTypeData /* A connected open port in data mode */ +(11) } PortType;

      The different types are as follows:

      • portTypeUnknown - The type a port has when it is opened, but not bound to any file descriptor.

      • portTypeListener - A port that is connected to a listen socket. This port does not do much, no data pumping is done on this socket, but read data is available when one is trying to do an accept on the port.

      • portTypeAcceptor - This port is to represent the result of an accept @@ -651,29 +651,29 @@

        the socket, much like in the active mode of a gen_tcp socket.

      We study the state that is needed for the ports. Notice that not all fields are used for all types of ports. Some space could be saved by using unions, but that would clutter the code with multiple indirections, so here is used one struct -for all types of ports, for readability:

      ( 1) typedef unsigned char Byte;
      -( 2) typedef unsigned int Word;
      +for all types of ports, for readability:

      ( 1) typedef unsigned char Byte;
      +( 2) typedef unsigned int Word;
       
      -( 3) typedef struct uds_data {
      -( 4)     int fd;                   /* File descriptor */
      -( 5)     ErlDrvPort port;          /* The port identifier */
      -( 6)     int lockfd;               /* The file descriptor for a lock file in
      +( 3) typedef struct uds_data {
      +( 4)     int fd;                   /* File descriptor */
      +( 5)     ErlDrvPort port;          /* The port identifier */
      +( 6)     int lockfd;               /* The file descriptor for a lock file in
       ( 7)                                  case of listen sockets */
      -( 8)     Byte creation;            /* The creation serial derived from the
      +( 8)     Byte creation;            /* The creation serial derived from the
       ( 9)                                  lock file */
      -(10)     PortType type;            /* Type of port */
      -(11)     char *name;               /* Short name of socket for unlink */
      -(12)     Word sent;                /* Bytes sent */
      -(13)     Word received;            /* Bytes received */
      -(14)     struct uds_data *partner; /* The partner in an accept/listen pair */
      -(15)     struct uds_data *next;    /* Next structure in list */
      -(16)     /* The input buffer and its data */
      -(17)     int buffer_size;          /* The allocated size of the input buffer */
      -(18)     int buffer_pos;           /* Current position in input buffer */
      -(19)     int header_pos;           /* Where the current header is in the
      +(10)     PortType type;            /* Type of port */
      +(11)     char *name;               /* Short name of socket for unlink */
      +(12)     Word sent;                /* Bytes sent */
      +(13)     Word received;            /* Bytes received */
      +(14)     struct uds_data *partner; /* The partner in an accept/listen pair */
      +(15)     struct uds_data *next;    /* Next structure in list */
      +(16)     /* The input buffer and its data */
      +(17)     int buffer_size;          /* The allocated size of the input buffer */
      +(18)     int buffer_pos;           /* Current position in input buffer */
      +(19)     int header_pos;           /* Where the current header is in the
       (20)                                  input buffer */
      -(21)     Byte *buffer;             /* The actual input buffer */
      -(22) } UdsData;

      This structure is used for all types of ports although some fields are useless +(21) Byte *buffer; /* The actual input buffer */ +(22) } UdsData;

      This structure is used for all types of ports although some fields are useless for some types. The least memory consuming solution would be to arrange this structure as a union of structures. However, the multiple indirections in the code to access a field in such a structure would clutter the code too much for @@ -722,97 +722,97 @@

      driver easier to port between different operating systems (and flavors of systems). This is the only routine that must have a well-defined name. All other callbacks are reached through the driver structure. The macro to use is named -DRIVER_INIT and takes the driver name as parameter:

      (1) /* Beginning of linked list of ports */
      -(2) static UdsData *first_data;
      +DRIVER_INIT and takes the driver name as parameter:

      (1) /* Beginning of linked list of ports */
      +(2) static UdsData *first_data;
       
      -(3) DRIVER_INIT(uds_drv)
      -(4) {
      -(5)     first_data = NULL;
      -(6)     return &uds_driver_entry;
      -(7) }

      The routine initializes the single global data structure and returns a pointer +(3) DRIVER_INIT(uds_drv) +(4) { +(5) first_data = NULL; +(6) return &uds_driver_entry; +(7) }

      The routine initializes the single global data structure and returns a pointer to the driver entry. The routine is called when erl_ddll:load_driver is called from Erlang.

      The uds_start routine is called when a port is opened from Erlang. In this case, we only allocate a structure and initialize it. Creating the actual socket -is left to the uds_command routine.

      ( 1) static ErlDrvData uds_start(ErlDrvPort port, char *buff)
      -( 2) {
      -( 3)     UdsData *ud;
      -( 4)
      -( 5)     ud = ALLOC(sizeof(UdsData));
      -( 6)     ud->fd = -1;
      -( 7)     ud->lockfd = -1;
      -( 8)     ud->creation = 0;
      -( 9)     ud->port = port;
      -(10)     ud->type = portTypeUnknown;
      -(11)     ud->name = NULL;
      -(12)     ud->buffer_size = 0;
      -(13)     ud->buffer_pos = 0;
      -(14)     ud->header_pos = 0;
      -(15)     ud->buffer = NULL;
      -(16)     ud->sent = 0;
      -(17)     ud->received = 0;
      -(18)     ud->partner = NULL;
      -(19)     ud->next = first_data;
      -(20)     first_data = ud;
      -(21)
      -(22)     return((ErlDrvData) ud);
      -(23) }

      Every data item is initialized, so that no problems arise when a newly created +is left to the uds_command routine.

      ( 1) static ErlDrvData uds_start(ErlDrvPort port, char *buff)
      +( 2) {
      +( 3)     UdsData *ud;
      +( 4)
      +( 5)     ud = ALLOC(sizeof(UdsData));
      +( 6)     ud->fd = -1;
      +( 7)     ud->lockfd = -1;
      +( 8)     ud->creation = 0;
      +( 9)     ud->port = port;
      +(10)     ud->type = portTypeUnknown;
      +(11)     ud->name = NULL;
      +(12)     ud->buffer_size = 0;
      +(13)     ud->buffer_pos = 0;
      +(14)     ud->header_pos = 0;
      +(15)     ud->buffer = NULL;
      +(16)     ud->sent = 0;
      +(17)     ud->received = 0;
      +(18)     ud->partner = NULL;
      +(19)     ud->next = first_data;
      +(20)     first_data = ud;
      +(21)
      +(22)     return((ErlDrvData) ud);
      +(23) }

      Every data item is initialized, so that no problems arise when a newly created port is closed (without there being any corresponding socket). This routine is called when open_port({spawn, "uds_drv"},[]) is called from Erlang.

      The uds_command routine is the routine called when an Erlang process sends data to the port. This routine handles all asynchronous commands when the port is in command mode and the sending of all data when the port is in data -mode:

      ( 1) static void uds_command(ErlDrvData handle, char *buff, int bufflen)
      -( 2) {
      -( 3)     UdsData *ud = (UdsData *) handle;
      +mode:

      ( 1) static void uds_command(ErlDrvData handle, char *buff, int bufflen)
      +( 2) {
      +( 3)     UdsData *ud = (UdsData *) handle;
       
      -( 4)     if (ud->type == portTypeData || ud->type == portTypeIntermediate) {
      -( 5)         DEBUGF(("Passive do_send %d",bufflen));
      -( 6)         do_send(ud, buff + 1, bufflen - 1); /* XXX */
      -( 7)         return;
      -( 8)     }
      -( 9)     if (bufflen == 0) {
      -(10)         return;
      -(11)     }
      -(12)     switch (*buff) {
      -(13)     case 'L':
      -(14)         if (ud->type != portTypeUnknown) {
      -(15)             driver_failure_posix(ud->port, ENOTSUP);
      -(16)             return;
      -(17)         }
      -(18)         uds_command_listen(ud,buff,bufflen);
      -(19)         return;
      -(20)     case 'A':
      -(21)         if (ud->type != portTypeUnknown) {
      -(22)             driver_failure_posix(ud->port, ENOTSUP);
      -(23)             return;
      -(24)         }
      -(25)         uds_command_accept(ud,buff,bufflen);
      -(26)         return;
      -(27)     case 'C':
      -(28)         if (ud->type != portTypeUnknown) {
      -(29)             driver_failure_posix(ud->port, ENOTSUP);
      -(30)             return;
      -(31)         }
      -(32)         uds_command_connect(ud,buff,bufflen);
      -(33)         return;
      -(34)     case 'S':
      -(35)         if (ud->type != portTypeCommand) {
      -(36)             driver_failure_posix(ud->port, ENOTSUP);
      -(37)             return;
      -(38)         }
      -(39)         do_send(ud, buff + 1, bufflen - 1);
      -(40)         return;
      -(41)     case 'R':
      -(42)         if (ud->type != portTypeCommand) {
      -(43)             driver_failure_posix(ud->port, ENOTSUP);
      -(44)             return;
      -(45)         }
      -(46)         do_recv(ud);
      -(47)         return;
      -(48)     default:
      -(49)         return;
      -(50)     }
      -(51) }

      The command routine takes three parameters; the handle returned for the port by +( 4) if (ud->type == portTypeData || ud->type == portTypeIntermediate) { +( 5) DEBUGF(("Passive do_send %d",bufflen)); +( 6) do_send(ud, buff + 1, bufflen - 1); /* XXX */ +( 7) return; +( 8) } +( 9) if (bufflen == 0) { +(10) return; +(11) } +(12) switch (*buff) { +(13) case 'L': +(14) if (ud->type != portTypeUnknown) { +(15) driver_failure_posix(ud->port, ENOTSUP); +(16) return; +(17) } +(18) uds_command_listen(ud,buff,bufflen); +(19) return; +(20) case 'A': +(21) if (ud->type != portTypeUnknown) { +(22) driver_failure_posix(ud->port, ENOTSUP); +(23) return; +(24) } +(25) uds_command_accept(ud,buff,bufflen); +(26) return; +(27) case 'C': +(28) if (ud->type != portTypeUnknown) { +(29) driver_failure_posix(ud->port, ENOTSUP); +(30) return; +(31) } +(32) uds_command_connect(ud,buff,bufflen); +(33) return; +(34) case 'S': +(35) if (ud->type != portTypeCommand) { +(36) driver_failure_posix(ud->port, ENOTSUP); +(37) return; +(38) } +(39) do_send(ud, buff + 1, bufflen - 1); +(40) return; +(41) case 'R': +(42) if (ud->type != portTypeCommand) { +(43) driver_failure_posix(ud->port, ENOTSUP); +(44) return; +(45) } +(46) do_recv(ud); +(47) return; +(48) default: +(49) return; +(50) } +(51) }

      The command routine takes three parameters; the handle returned for the port by uds_start, which is a pointer to the internal port structure, the data buffer, and the length of the data buffer. The buffer is the data sent from Erlang (a list of bytes) converted to an C array (of bytes).

      If Erlang sends, for example, the list [$a,$b,$c] to the port, the bufflen @@ -841,34 +841,34 @@

      signals to all linked processes.

      The uds_input routine is called when data is available on a file descriptor previously passed to the driver_select routine. This occurs typically when a read command is issued and no data is available. The do_recv routine is as -follows:

      ( 1) static void do_recv(UdsData *ud)
      -( 2) {
      -( 3)     int res;
      -( 4)     char *ibuf;
      -( 5)     for(;;) {
      -( 6)         if ((res = buffered_read_package(ud,&ibuf)) < 0) {
      -( 7)             if (res == NORMAL_READ_FAILURE) {
      -( 8)                 driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 1);
      -( 9)             } else {
      -(10)                 driver_failure_eof(ud->port);
      -(11)             }
      -(12)             return;
      -(13)         }
      -(14)         /* Got a package */
      -(15)         if (ud->type == portTypeCommand) {
      -(16)             ibuf[-1] = 'R'; /* There is always room for a single byte
      +follows:

      ( 1) static void do_recv(UdsData *ud)
      +( 2) {
      +( 3)     int res;
      +( 4)     char *ibuf;
      +( 5)     for(;;) {
      +( 6)         if ((res = buffered_read_package(ud,&ibuf)) < 0) {
      +( 7)             if (res == NORMAL_READ_FAILURE) {
      +( 8)                 driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 1);
      +( 9)             } else {
      +(10)                 driver_failure_eof(ud->port);
      +(11)             }
      +(12)             return;
      +(13)         }
      +(14)         /* Got a package */
      +(15)         if (ud->type == portTypeCommand) {
      +(16)             ibuf[-1] = 'R'; /* There is always room for a single byte
       (17)                                opcode before the actual buffer
       (18)                                (where the packet header was) */
      -(19)             driver_output(ud->port,ibuf - 1, res + 1);
      -(20)             driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ,0);
      -(21)             return;
      -(22)         } else {
      -(23)             ibuf[-1] = DIST_MAGIC_RECV_TAG; /* XXX */
      -(24)             driver_output(ud->port,ibuf - 1, res + 1);
      -(25)             driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ,1);
      -(26)         }
      -(27)     }
      -(28) }

      The routine tries to read data until a packet is read or the +(19) driver_output(ud->port,ibuf - 1, res + 1); +(20) driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ,0); +(21) return; +(22) } else { +(23) ibuf[-1] = DIST_MAGIC_RECV_TAG; /* XXX */ +(24) driver_output(ud->port,ibuf - 1, res + 1); +(25) driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ,1); +(26) } +(27) } +(28) }

      The routine tries to read data until a packet is read or the buffered_read_package routine returns a NORMAL_READ_FAILURE (an internally defined constant for the module, which means that the read operation resulted in an EWOULDBLOCK). If the port is in command mode, the reading stops when one @@ -883,77 +883,77 @@

      emulator version, received data is to be tagged with a single byte of 100. That is what the macro DIST_MAGIC_RECV_TAG is defined to. The tagging of data in the distribution can be changed in the future.

      The uds_input routine handles other input events (like non-blocking accept), -but most importantly handle data arriving at the socket by calling do_recv:

      ( 1) static void uds_input(ErlDrvData handle, ErlDrvEvent event)
      -( 2) {
      -( 3)     UdsData *ud = (UdsData *) handle;
      +but most importantly handle data arriving at the socket by calling do_recv:

      ( 1) static void uds_input(ErlDrvData handle, ErlDrvEvent event)
      +( 2) {
      +( 3)     UdsData *ud = (UdsData *) handle;
       
      -( 4)     if (ud->type == portTypeListener) {
      -( 5)         UdsData *ad = ud->partner;
      -( 6)         struct sockaddr_un peer;
      -( 7)         int pl = sizeof(struct sockaddr_un);
      -( 8)         int fd;
      +( 4)     if (ud->type == portTypeListener) {
      +( 5)         UdsData *ad = ud->partner;
      +( 6)         struct sockaddr_un peer;
      +( 7)         int pl = sizeof(struct sockaddr_un);
      +( 8)         int fd;
       
      -( 9)         if ((fd = accept(ud->fd, (struct sockaddr *) &peer, &pl)) < 0) {
      -(10)             if (errno != EWOULDBLOCK) {
      -(11)                 driver_failure_posix(ud->port, errno);
      -(12)                 return;
      -(13)             }
      -(14)             return;
      -(15)         }
      -(16)         SET_NONBLOCKING(fd);
      -(17)         ad->fd = fd;
      -(18)         ad->partner = NULL;
      -(19)         ad->type = portTypeCommand;
      -(20)         ud->partner = NULL;
      -(21)         driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0);
      -(22)         driver_output(ad->port, "Aok",3);
      -(23)         return;
      -(24)     }
      -(25)     do_recv(ud);
      -(26) }

      The important line is the last line in the function: the do_read routine is +( 9) if ((fd = accept(ud->fd, (struct sockaddr *) &peer, &pl)) < 0) { +(10) if (errno != EWOULDBLOCK) { +(11) driver_failure_posix(ud->port, errno); +(12) return; +(13) } +(14) return; +(15) } +(16) SET_NONBLOCKING(fd); +(17) ad->fd = fd; +(18) ad->partner = NULL; +(19) ad->type = portTypeCommand; +(20) ud->partner = NULL; +(21) driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0); +(22) driver_output(ad->port, "Aok",3); +(23) return; +(24) } +(25) do_recv(ud); +(26) }

      The important line is the last line in the function: the do_read routine is called to handle new input. The remaining function handles input on a listen socket, which means that it is to be possible to do an accept on the socket, which is also recognized as a read event.

      The output mechanisms are similar to the input. The do_send routine is as -follows:

      ( 1) static void do_send(UdsData *ud, char *buff, int bufflen)
      -( 2) {
      -( 3)     char header[4];
      -( 4)     int written;
      -( 5)     SysIOVec iov[2];
      -( 6)     ErlIOVec eio;
      -( 7)     ErlDrvBinary *binv[] = {NULL,NULL};
      +follows:

      ( 1) static void do_send(UdsData *ud, char *buff, int bufflen)
      +( 2) {
      +( 3)     char header[4];
      +( 4)     int written;
      +( 5)     SysIOVec iov[2];
      +( 6)     ErlIOVec eio;
      +( 7)     ErlDrvBinary *binv[] = {NULL,NULL};
       
      -( 8)     put_packet_length(header, bufflen);
      -( 9)     iov[0].iov_base = (char *) header;
      -(10)     iov[0].iov_len = 4;
      -(11)     iov[1].iov_base = buff;
      -(12)     iov[1].iov_len = bufflen;
      -(13)     eio.iov = iov;
      -(14)     eio.binv = binv;
      -(15)     eio.vsize = 2;
      -(16)     eio.size = bufflen + 4;
      -(17)     written = 0;
      -(18)     if (driver_sizeq(ud->port) == 0) {
      -(19)         if ((written = writev(ud->fd, iov, 2)) == eio.size) {
      -(20)             ud->sent += written;
      -(21)             if (ud->type == portTypeCommand) {
      -(22)                 driver_output(ud->port, "Sok", 3);
      -(23)             }
      -(24)             return;
      -(25)         } else if (written < 0) {
      -(26)             if (errno != EWOULDBLOCK) {
      -(27)                 driver_failure_eof(ud->port);
      -(28)                 return;
      -(29)             } else {
      -(30)                 written = 0;
      -(31)             }
      -(32)         } else {
      -(33)             ud->sent += written;
      -(34)         }
      -(35)         /* Enqueue remaining */
      -(36)     }
      -(37)     driver_enqv(ud->port, &eio, written);
      -(38)     send_out_queue(ud);
      -(39) }

      This driver uses the writev system call to send data onto the socket. A +( 8) put_packet_length(header, bufflen); +( 9) iov[0].iov_base = (char *) header; +(10) iov[0].iov_len = 4; +(11) iov[1].iov_base = buff; +(12) iov[1].iov_len = bufflen; +(13) eio.iov = iov; +(14) eio.binv = binv; +(15) eio.vsize = 2; +(16) eio.size = bufflen + 4; +(17) written = 0; +(18) if (driver_sizeq(ud->port) == 0) { +(19) if ((written = writev(ud->fd, iov, 2)) == eio.size) { +(20) ud->sent += written; +(21) if (ud->type == portTypeCommand) { +(22) driver_output(ud->port, "Sok", 3); +(23) } +(24) return; +(25) } else if (written < 0) { +(26) if (errno != EWOULDBLOCK) { +(27) driver_failure_eof(ud->port); +(28) return; +(29) } else { +(30) written = 0; +(31) } +(32) } else { +(33) ud->sent += written; +(34) } +(35) /* Enqueue remaining */ +(36) } +(37) driver_enqv(ud->port, &eio, written); +(38) send_out_queue(ud); +(39) }

      This driver uses the writev system call to send data onto the socket. A combination of writev and the driver output queues is very convenient. An ErlIOVec structure contains a SysIOVec (which is equivalent to the struct iovec structure defined in uio.h. The ErlIOVec also contains an @@ -969,52 +969,52 @@

      completely (line 22). The send_out_queue sends acknowledgements if the sending is completed there. If the port is in command mode, the Erlang code serializes the send operations so that only one packet can be waiting for delivery at a -time. Therefore the acknowledgement can be sent whenever the queue is empty.

      The send_out_queue routine is as follows:

      ( 1) static int send_out_queue(UdsData *ud)
      -( 2) {
      -( 3)     for(;;) {
      -( 4)         int vlen;
      -( 5)         SysIOVec *tmp = driver_peekq(ud->port, &vlen);
      -( 6)         int wrote;
      -( 7)         if (tmp == NULL) {
      -( 8)             driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_WRITE, 0);
      -( 9)             if (ud->type == portTypeCommand) {
      -(10)                 driver_output(ud->port, "Sok", 3);
      -(11)             }
      -(12)             return 0;
      -(13)         }
      -(14)         if (vlen > IO_VECTOR_MAX) {
      -(15)             vlen = IO_VECTOR_MAX;
      -(16)         }
      -(17)         if ((wrote = writev(ud->fd, tmp, vlen)) < 0) {
      -(18)             if (errno == EWOULDBLOCK) {
      -(19)                 driver_select(ud->port, (ErlDrvEvent) ud->fd,
      -(20)                               DO_WRITE, 1);
      -(21)                 return 0;
      -(22)             } else {
      -(23)                 driver_failure_eof(ud->port);
      -(24)                 return -1;
      -(25)             }
      -(26)         }
      -(27)         driver_deq(ud->port, wrote);
      -(28)         ud->sent += wrote;
      -(29)     }
      -(30) }

      We simply pick out an I/O vector from the queue (which is the whole queue as a +time. Therefore the acknowledgement can be sent whenever the queue is empty.

      The send_out_queue routine is as follows:

      ( 1) static int send_out_queue(UdsData *ud)
      +( 2) {
      +( 3)     for(;;) {
      +( 4)         int vlen;
      +( 5)         SysIOVec *tmp = driver_peekq(ud->port, &vlen);
      +( 6)         int wrote;
      +( 7)         if (tmp == NULL) {
      +( 8)             driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_WRITE, 0);
      +( 9)             if (ud->type == portTypeCommand) {
      +(10)                 driver_output(ud->port, "Sok", 3);
      +(11)             }
      +(12)             return 0;
      +(13)         }
      +(14)         if (vlen > IO_VECTOR_MAX) {
      +(15)             vlen = IO_VECTOR_MAX;
      +(16)         }
      +(17)         if ((wrote = writev(ud->fd, tmp, vlen)) < 0) {
      +(18)             if (errno == EWOULDBLOCK) {
      +(19)                 driver_select(ud->port, (ErlDrvEvent) ud->fd,
      +(20)                               DO_WRITE, 1);
      +(21)                 return 0;
      +(22)             } else {
      +(23)                 driver_failure_eof(ud->port);
      +(24)                 return -1;
      +(25)             }
      +(26)         }
      +(27)         driver_deq(ud->port, wrote);
      +(28)         ud->sent += wrote;
      +(29)     }
      +(30) }

      We simply pick out an I/O vector from the queue (which is the whole queue as a SysIOVec). If the I/O vector is too long (IO_VECTOR_MAX is defined to 16), the vector length is decreased (line 15), otherwise the writev call (line 17) fails. Writing is tried and anything written is dequeued (line 27). If the write fails with EWOULDBLOCK (notice that all sockets are in non-blocking mode), driver_select is called to make the uds_output routine be called when there -is space to write again.

      We continue trying to write until the queue is empty or the writing blocks.

      The routine above is called from the uds_output routine:

      ( 1) static void uds_output(ErlDrvData handle, ErlDrvEvent event)
      -( 2) {
      -( 3)    UdsData *ud = (UdsData *) handle;
      -( 4)    if (ud->type == portTypeConnector) {
      -( 5)        ud->type = portTypeCommand;
      -( 6)        driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_WRITE, 0);
      -( 7)        driver_output(ud->port, "Cok",3);
      -( 8)        return;
      -( 9)    }
      -(10)    send_out_queue(ud);
      -(11) }

      The routine is simple: it first handles the fact that the output select will +is space to write again.

      We continue trying to write until the queue is empty or the writing blocks.

      The routine above is called from the uds_output routine:

      ( 1) static void uds_output(ErlDrvData handle, ErlDrvEvent event)
      +( 2) {
      +( 3)    UdsData *ud = (UdsData *) handle;
      +( 4)    if (ud->type == portTypeConnector) {
      +( 5)        ud->type = portTypeCommand;
      +( 6)        driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_WRITE, 0);
      +( 7)        driver_output(ud->port, "Cok",3);
      +( 8)        return;
      +( 9)    }
      +(10)    send_out_queue(ud);
      +(11) }

      The routine is simple: it first handles the fact that the output select will concern a socket in the business of connecting (and the connecting blocked). If the socket is in a connected state, it simply sends the output queue. This routine is called when it is possible to write to a socket where we have an @@ -1038,85 +1038,85 @@

      the number stored in the lock file to differentiate between invocations of Erlang nodes with the same name.

    The control interface gets a buffer to return its value in, but is free to allocate its own buffer if the provided one is too small. The uds_control code -is as follows:

    ( 1) static int uds_control(ErlDrvData handle, unsigned int command,
    -( 2)                        char* buf, int count, char** res, int res_size)
    -( 3) {
    -( 4) /* Local macro to ensure large enough buffer. */
    -( 5) #define ENSURE(N)                               \
    -( 6)    do {                                         \
    -( 7)        if (res_size < N) {                      \
    -( 8)            *res = ALLOC(N);                     \
    -( 9)        }                                        \
    -(10)    } while(0)
    +is as follows:

    ( 1) static int uds_control(ErlDrvData handle, unsigned int command,
    +( 2)                        char* buf, int count, char** res, int res_size)
    +( 3) {
    +( 4) /* Local macro to ensure large enough buffer. */
    +( 5) #define ENSURE(N)                               \
    +( 6)    do {                                         \
    +( 7)        if (res_size < N) {                      \
    +( 8)            *res = ALLOC(N);                     \
    +( 9)        }                                        \
    +(10)    } while(0)
     
    -(11)    UdsData *ud = (UdsData *) handle;
    +(11)    UdsData *ud = (UdsData *) handle;
     
    -(12)    switch (command) {
    -(13)    case 'S':
    -(14)        {
    -(15)            ENSURE(13);
    -(16)            **res = 0;
    -(17)            put_packet_length((*res) + 1, ud->received);
    -(18)            put_packet_length((*res) + 5, ud->sent);
    -(19)            put_packet_length((*res) + 9, driver_sizeq(ud->port));
    -(20)            return 13;
    -(21)        }
    -(22)    case 'C':
    -(23)        if (ud->type < portTypeCommand) {
    -(24)            return report_control_error(res, res_size, "einval");
    -(25)        }
    -(26)        ud->type = portTypeCommand;
    -(27)        driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0);
    -(28)        ENSURE(1);
    -(29)        **res = 0;
    -(30)        return 1;
    -(31)    case 'I':
    -(32)        if (ud->type < portTypeCommand) {
    -(33)            return report_control_error(res, res_size, "einval");
    -(34)        }
    -(35)        ud->type = portTypeIntermediate;
    -(36)        driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0);
    -(37)        ENSURE(1);
    -(38)        **res = 0;
    -(39)        return 1;
    -(40)    case 'D':
    -(41)        if (ud->type < portTypeCommand) {
    -(42)            return report_control_error(res, res_size, "einval");
    -(43)        }
    -(44)        ud->type = portTypeData;
    -(45)        do_recv(ud);
    -(46)        ENSURE(1);
    -(47)        **res = 0;
    -(48)        return 1;
    -(49)    case 'N':
    -(50)        if (ud->type != portTypeListener) {
    -(51)            return report_control_error(res, res_size, "einval");
    -(52)        }
    -(53)        ENSURE(5);
    -(54)        (*res)[0] = 0;
    -(55)        put_packet_length((*res) + 1, ud->fd);
    -(56)        return 5;
    -(57)    case 'T': /* tick */
    -(58)        if (ud->type != portTypeData) {
    -(59)            return report_control_error(res, res_size, "einval");
    -(60)        }
    -(61)        do_send(ud,"",0);
    -(62)        ENSURE(1);
    -(63)        **res = 0;
    -(64)        return 1;
    -(65)    case 'R':
    -(66)        if (ud->type != portTypeListener) {
    -(67)            return report_control_error(res, res_size, "einval");
    -(68)        }
    -(69)        ENSURE(2);
    -(70)        (*res)[0] = 0;
    -(71)        (*res)[1] = ud->creation;
    -(72)        return 2;
    -(73)    default:
    -(74)        return report_control_error(res, res_size, "einval");
    -(75)    }
    -(76) #undef ENSURE
    -(77) }

    The macro ENSURE (line 5-10) is used to ensure that the buffer is large enough +(12) switch (command) { +(13) case 'S': +(14) { +(15) ENSURE(13); +(16) **res = 0; +(17) put_packet_length((*res) + 1, ud->received); +(18) put_packet_length((*res) + 5, ud->sent); +(19) put_packet_length((*res) + 9, driver_sizeq(ud->port)); +(20) return 13; +(21) } +(22) case 'C': +(23) if (ud->type < portTypeCommand) { +(24) return report_control_error(res, res_size, "einval"); +(25) } +(26) ud->type = portTypeCommand; +(27) driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0); +(28) ENSURE(1); +(29) **res = 0; +(30) return 1; +(31) case 'I': +(32) if (ud->type < portTypeCommand) { +(33) return report_control_error(res, res_size, "einval"); +(34) } +(35) ud->type = portTypeIntermediate; +(36) driver_select(ud->port, (ErlDrvEvent) ud->fd, DO_READ, 0); +(37) ENSURE(1); +(38) **res = 0; +(39) return 1; +(40) case 'D': +(41) if (ud->type < portTypeCommand) { +(42) return report_control_error(res, res_size, "einval"); +(43) } +(44) ud->type = portTypeData; +(45) do_recv(ud); +(46) ENSURE(1); +(47) **res = 0; +(48) return 1; +(49) case 'N': +(50) if (ud->type != portTypeListener) { +(51) return report_control_error(res, res_size, "einval"); +(52) } +(53) ENSURE(5); +(54) (*res)[0] = 0; +(55) put_packet_length((*res) + 1, ud->fd); +(56) return 5; +(57) case 'T': /* tick */ +(58) if (ud->type != portTypeData) { +(59) return report_control_error(res, res_size, "einval"); +(60) } +(61) do_send(ud,"",0); +(62) ENSURE(1); +(63) **res = 0; +(64) return 1; +(65) case 'R': +(66) if (ud->type != portTypeListener) { +(67) return report_control_error(res, res_size, "einval"); +(68) } +(69) ENSURE(2); +(70) (*res)[0] = 0; +(71) (*res)[1] = ud->creation; +(72) return 2; +(73) default: +(74) return report_control_error(res, res_size, "einval"); +(75) } +(76) #undef ENSURE +(77) }

    The macro ENSURE (line 5-10) is used to ensure that the buffer is large enough for the answer. We switch on the command and take actions. We always have read select active on a port in data mode (achieved by calling do_recv on line 45), but we turn off read selection in intermediate and command modes (line diff --git a/prs/8803/erts-15.0.1/doc/html/automaticyieldingofccode.html b/prs/8803/erts-15.0.1/doc/html/automaticyieldingofccode.html index 546e4507fe64c..d84c9a37d60f8 100644 --- a/prs/8803/erts-15.0.1/doc/html/automaticyieldingofccode.html +++ b/prs/8803/erts-15.0.1/doc/html/automaticyieldingofccode.html @@ -213,9 +213,9 @@

    function is used, the convention is to "comment out" the source for the function by surrounding it with the following #ifdef (this way, one will not get warnings about unused functions):

    #ifdef INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS
    -void my_fun() {
    +void my_fun() {
         ...
    -}
    +}
     #endif /* INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS */

    While editing the function one can define INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS so that one can see errors and warnings in the non-transformed source.

    diff --git a/prs/8803/erts-15.0.1/doc/html/beam_makeops.html b/prs/8803/erts-15.0.1/doc/html/beam_makeops.html index 2d659a6dfc157..3067a9f8791cd 100644 --- a/prs/8803/erts-15.0.1/doc/html/beam_makeops.html +++ b/prs/8803/erts-15.0.1/doc/html/beam_makeops.html @@ -155,9 +155,9 @@

    BEAM interpreter. For the BeamAsm JIT introduced in OTP 24, the implementation of instructions are defined in emitter functions written in C++.

    Generic instructions have typed operands. Here are a few examples of -operands for move/2:

    {move,{atom,id},{x,5}}.
    -{move,{x,3},{x,0}}.
    -{move,{x,2},{y,1}}.

    When those instructions are loaded, the loader rewrites them +operands for move/2:

    {move,{atom,id},{x,5}}.
    +{move,{x,3},{x,0}}.
    +{move,{x,2},{y,1}}.

    When those instructions are loaded, the loader rewrites them to specific instructions:

    move_cx id 5
     move_xx 3 0
     move_xy 2 1

    Corresponding to each generic instruction, there is a family of @@ -189,9 +189,9 @@

    an integer, an atom, or a literal).

    Now let's look at the implementation of the move instruction. There are multiple files containing implementations of instructions in the erts/emulator/beam/emu directory. The move instruction is defined -in instrs.tab. It looks like this:

    move(Src, Dst) {
    +in instrs.tab.  It looks like this:

    move(Src, Dst) {
         $Dst = $Src;
    -}

    The implementation for an instruction largely follows the C syntax, +}

    The implementation for an instruction largely follows the C syntax, except that the variables in the function head don't have any types. The $ before an identifier denotes a macro expansion. Thus, $Src will expand to the code to pick up the source operand for @@ -208,14 +208,14 @@

    is stored in the lower 32 bits of the word. In the upper 32 bits is the byte offset to the X register; the register number 5 has been multiplied by the word size size 8.

    In the next word the tagged atom id is stored.

    With that background, we can look at the generated code for move_cx -in beam_hot.h:

    OpCase(move_cx):
    -{
    -  BeamInstr next_pf = BeamCodeAddr(I[2]);
    -  xb(BeamExtraData(I[0])) = I[1];
    +in beam_hot.h:

    OpCase(move_cx):
    +{
    +  BeamInstr next_pf = BeamCodeAddr(I[2]);
    +  xb(BeamExtraData(I[0])) = I[1];
       I += 2;
    -  ASSERT(VALID_INSTR(next_pf));
    -  GotoPF(next_pf);
    -}

    We will go through each line in turn.

    • OpCase(move_cx): defines a label for the instruction. The + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

    We will go through each line in turn.

    • OpCase(move_cx): defines a label for the instruction. The OpCase() macro is defined in beam_emu.c. It will expand this line to lb_move_cx:.

    • BeamInstr next_pf = BeamCodeAddr(I[2]); fetches the pointer to code for the next instruction to be executed. The BeamCodeAddr() @@ -229,15 +229,15 @@

      this case).

    • I += 2 advances the instruction pointer to the next instruction.

    • In a debug-compiled emulator, ASSERT(VALID_INSTR(next_pf)); makes sure that next_pf is a valid instruction (that is, that it points -within the process_main() function in beam_emu.c).

    • GotoPF(next_pf); transfers control to the next instruction.

    Now let's look at the implementation of move_xx:

    OpCase(move_xx):
    -{
    -  Eterm tmp_packed1 = BeamExtraData(I[0]);
    -  BeamInstr next_pf = BeamCodeAddr(I[1]);
    -  xb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
    +within the process_main() function in beam_emu.c).

  • GotoPF(next_pf); transfers control to the next instruction.

  • Now let's look at the implementation of move_xx:

    OpCase(move_xx):
    +{
    +  Eterm tmp_packed1 = BeamExtraData(I[0]);
    +  BeamInstr next_pf = BeamCodeAddr(I[1]);
    +  xb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
       I += 1;
    -  ASSERT(VALID_INSTR(next_pf));
    -  GotoPF(next_pf);
    -}

    We will go through the lines that are new or have changed compared to + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

    We will go through the lines that are new or have changed compared to move_cx.

    • Eterm tmp_packed1 = BeamExtraData(I[0]); picks up both X register numbers packed into the upper 32 bits of the instruction word.

    • BeamInstr next_pf = BeamCodeAddr(I[1]); pre-fetches the address of the next instruction. Note that because both X registers operands fits @@ -246,15 +246,15 @@

      copies the source to the destination. (For a 64-bit architecture, BEAM_TIGHT_SHIFT is 16 and BEAM_TIGHT_MASK is 0xFFFF.)

    • I += 1; advances the instruction pointer to the next instruction.

    move_xy is almost identical to move_xx. The only difference is the use of the yb() macro instead of xb() to reference the -destination register:

    OpCase(move_xy):
    -{
    -  Eterm tmp_packed1 = BeamExtraData(I[0]);
    -  BeamInstr next_pf = BeamCodeAddr(I[1]);
    -  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
    +destination register:

    OpCase(move_xy):
    +{
    +  Eterm tmp_packed1 = BeamExtraData(I[0]);
    +  BeamInstr next_pf = BeamCodeAddr(I[1]);
    +  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
       I += 1;
    -  ASSERT(VALID_INSTR(next_pf));
    -  GotoPF(next_pf);
    -}

    + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

    @@ -275,13 +275,13 @@

    move2 x y x y // In instrs.tab -move2(S1, D1, S2, D2) { +move2(S1, D1, S2, D2) { Eterm V1, V2; V1 = $S1; V2 = $S2; $D1 = V1; $D2 = V2; -}

    When the loader has found a match and replaced the matched instructions, +}

    When the loader has found a match and replaced the matched instructions, it will match the new instructions against the transformation rules. Because of that, we can define the rule for a move3/6 instruction as follows:

    move2 X1=x Y1=y X2=x Y2=y | move X3=x Y3=y =>
    @@ -437,21 +437,21 @@ 

    i_fcheckerror fclearerror %endif

    It is also possible to add an %else clause:

    %if ARCH_64
    -BS_SAFE_MUL(A, B, Fail, Dst) {
    -    Uint64 res = ($A) * ($B);
    -    if (res / $B != $A) {
    +BS_SAFE_MUL(A, B, Fail, Dst) {
    +    Uint64 res = ($A) * ($B);
    +    if (res / $B != $A) {
             $Fail;
    -    }
    +    }
         $Dst = res;
    -}
    +}
     %else
    -BS_SAFE_MUL(A, B, Fail, Dst) {
    -    Uint64 res = (Uint64)($A) * (Uint64)($B);
    -    if ((res >> (8*sizeof(Uint))) != 0) {
    +BS_SAFE_MUL(A, B, Fail, Dst) {
    +    Uint64 res = (Uint64)($A) * (Uint64)($B);
    +    if ((res >> (8*sizeof(Uint))) != 0) {
             $Fail;
    -    }
    +    }
         $Dst = res;
    -}
    +}
     %endif

    Symbols that are defined in directives

    The following symbols are always defined.

    • ARCH_64 - is 1 for a 64-bit machine, and 0 otherwise.
    • ARCH_32 - is 1 for 32-bit machine, and 0 otherwise.

    The Makefile for building the emulator currently defines the following symbols by using the -D option on the command line for beam_makeops.

    • USE_VM_PROBES - 1 if the runtime system is compiled to use VM @@ -680,7 +680,7 @@

      a non-zero value, the matching of the rule will continue, otherwise the match will fail. Such guard functions are hereafter called predicates.

      The most commonly used guard constraints is equal(). It can be used -to remove a redundant move instructio like this:

      move R1 R2 | equal(R1, R2) => _

      or remove a redundant is_eq_exact instruction like this:

      is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

      At the time of writing, all predicates are defined in files named +to remove a redundant move instructio like this:

      move R1 R2 | equal(R1, R2) => _

      or remove a redundant is_eq_exact instruction like this:

      is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

      At the time of writing, all predicates are defined in files named predicates.tab in several directories. In predicates.tab directly in $ERL_TOP/erts/emulator/beam, predicates that are used by both the traditinal emulator and the JIT implementations are contained. @@ -696,33 +696,33 @@

      internal loader data structures, but here is quick look at the implementation of a simple predicate called literal_is_map().

      Here is first an example how it is used:

      ismap Fail Lit=q | literal_is_map(Lit) =>

      If the Lit operand is a literal, then the literal_is_map() predicate is called to determine whether it is a map literal. -If it is, the instruction is not needed and can be removed.

      literal_is_map() is implemented like this (in emu/predicates.tab):

      pred.literal_is_map(Lit) {
      +If it is, the instruction is not needed and can be removed.

      literal_is_map() is implemented like this (in emu/predicates.tab):

      pred.literal_is_map(Lit) {
           Eterm term;
       
      -    ASSERT(Lit.type == TAG_q);
      -    term = beamfile_get_literal(&S->beam, Lit.val);
      -    return is_map(term);
      -}

      The pred. prefix tells beam_makeops that this function is a + ASSERT(Lit.type == TAG_q); + term = beamfile_get_literal(&S->beam, Lit.val); + return is_map(term); +}

      The pred. prefix tells beam_makeops that this function is a predicate. Without the prefix, it would have been interpreted as the implementation of an instruction (described in Defining the implementation).

      Predicate functions have a magic variabled called S, which is a pointer to a state struct. In the example, beamfile_get_literal(&S->beam, Lit.val); is used to retrieve the actual term for the literal.

      At the time of writing, the expanded C code generated by -beam_makeops looks like this:

      static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
      +beam_makeops looks like this:

      static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
         Eterm term;
       
      -  ASSERT(Lit.type == TAG_q);
      -  term = S->literals[Lit.val].term;
      -  return is_map(term);;
      -}

      Handling instructions with variable number of operands

      Some instructions, such as select_val/3, essentially has a variable + ASSERT(Lit.type == TAG_q); + term = S->literals[Lit.val].term; + return is_map(term);; +}

      Handling instructions with variable number of operands

      Some instructions, such as select_val/3, essentially has a variable number of operands. Such instructions have a {list,[...]} operand -as their last operand in the BEAM assembly code. For example:

      {select_val,{x,0},
      -            {f,1},
      -            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose +as their last operand in the BEAM assembly code. For example:

      {select_val,{x,0},
      +            {f,1},
      +            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose value is the number of elements in the list, followed by each element in the list. The instruction above would be translated to the following -generic instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      To match a variable number of arguments we need to use the special +generic instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      To match a variable number of arguments we need to use the special operand type * like this:

      select_val Src=aiq Fail=f Size=u List=* =>
           i_const_select_val Src Fail Size List

      This transformation renames a select_val/3 instruction with a constant source operand to i_const_select_val/3.

      Constructing new instructions on the right-hand side

      The most common operand on the right-hand side is a variable that was @@ -750,7 +750,7 @@

      side of the transformation will perform the match and bind operands to variables. The variables can then be passed to a generator function on the right-hand side. For example:

      bif2 Fail=j u$bif:erlang:element/2 Index=s Tuple=xy Dst=d =>
      -    element(Jump, Index, Tuple, Dst)

      This transformation rule matches a call to the BIF element/2. + element(Jump, Index, Tuple, Dst)

    This transformation rule matches a call to the BIF element/2. The operands will be captured and the generator function element() will be called.

    The element() generator will produce one of two instructions depending on Index. If Index is an integer in the range from 1 up @@ -765,30 +765,30 @@

    named generators.tab in several directories (in the same directories as the predicates.tab files).

    It is outside the scope of this document to describe in detail how generator functions are written, but here is the implementation of -element():

    gen.element(Fail, Index, Tuple, Dst) {
    +element():

    gen.element(Fail, Index, Tuple, Dst) {
         BeamOp* op;
     
    -    $NewBeamOp(S, op);
    +    $NewBeamOp(S, op);
     
    -    if (Index.type == TAG_i && Index.val > 0 &&
    +    if (Index.type == TAG_i && Index.val > 0 &&
             Index.val <= ERTS_MAX_TUPLE_SIZE &&
    -        (Tuple.type == TAG_x || Tuple.type == TAG_y)) {
    -        $BeamOpNameArity(op, i_fast_element, 4);
    -        op->a[0] = Tuple;
    -        op->a[1] = Fail;
    -        op->a[2].type = TAG_u;
    -        op->a[2].val = Index.val;
    -        op->a[3] = Dst;
    -    } else {
    -        $BeamOpNameArity(op, i_element, 4);
    -        op->a[0] = Tuple;
    -        op->a[1] = Fail;
    -        op->a[2] = Index;
    -        op->a[3] = Dst;
    -    }
    +        (Tuple.type == TAG_x || Tuple.type == TAG_y)) {
    +        $BeamOpNameArity(op, i_fast_element, 4);
    +        op->a[0] = Tuple;
    +        op->a[1] = Fail;
    +        op->a[2].type = TAG_u;
    +        op->a[2].val = Index.val;
    +        op->a[3] = Dst;
    +    } else {
    +        $BeamOpNameArity(op, i_element, 4);
    +        op->a[0] = Tuple;
    +        op->a[1] = Fail;
    +        op->a[2] = Index;
    +        op->a[3] = Dst;
    +    }
     
         return op;
    -}

    The gen. prefix tells beam_makeops that this function is a +}

    The gen. prefix tells beam_makeops that this function is a generator. Without the prefix, it would have been interpreted as the implementation of an instruction (described in Defining the implementation).

    Generator functions have a magic variabled called S, which is a @@ -818,9 +818,9 @@

    following line:

    // -*- c -*-

    To avoid messing up the indentation, all comments are written as C++ style comments (//) instead of #. Note that a comment must start at the beginning of a line.

    The meat of an instruction definition file are macro definitions. -We have seen this macro definition before:

    move(Src, Dst) {
    +We have seen this macro definition before:

    move(Src, Dst) {
         $Dst = $Src;
    -}

    A macro definitions must start at the beginning of the line (no spaces +}

    A macro definitions must start at the beginning of the line (no spaces allowed), the opening curly bracket must be on the same line, and the finishing curly bracket must be at the beginning of a line. It is recommended that the macro body is properly indented.

    As a convention, the macro arguments in the head all start with an @@ -829,103 +829,103 @@

    specific instructions is assumed to be the implementation of that instruction.

    A macro can also be invoked from within another macro. For example, move_deallocate_return/2 avoids repeating code by invoking -$deallocate_return() as a macro:

    move_deallocate_return(Src, Deallocate) {
    -    x(0) = $Src;
    -    $deallocate_return($Deallocate);
    -}

    Here is the definition of deallocate_return/1:

    deallocate_return(Deallocate) {
    +$deallocate_return() as a macro:

    move_deallocate_return(Src, Deallocate) {
    +    x(0) = $Src;
    +    $deallocate_return($Deallocate);
    +}

    Here is the definition of deallocate_return/1:

    deallocate_return(Deallocate) {
         //| -no_next
         int words_to_pop = $Deallocate;
    -    SET_I((BeamInstr *) cp_val(*E));
    -    E = ADD_BYTE_OFFSET(E, words_to_pop);
    -    CHECK_TERM(x(0));
    +    SET_I((BeamInstr *) cp_val(*E));
    +    E = ADD_BYTE_OFFSET(E, words_to_pop);
    +    CHECK_TERM(x(0));
         DispatchReturn;
    -}

    The expanded code for move_deallocate_return will look this:

    OpCase(move_deallocate_return_cQ):
    -{
    -  x(0) = I[1];
    -  do {
    -    int words_to_pop = Qb(BeamExtraData(I[0]));
    -    SET_I((BeamInstr *) cp_val(*E));
    -    E = ADD_BYTE_OFFSET(E, words_to_pop);
    -    CHECK_TERM(x(0));
    +}

    The expanded code for move_deallocate_return will look this:

    OpCase(move_deallocate_return_cQ):
    +{
    +  x(0) = I[1];
    +  do {
    +    int words_to_pop = Qb(BeamExtraData(I[0]));
    +    SET_I((BeamInstr *) cp_val(*E));
    +    E = ADD_BYTE_OFFSET(E, words_to_pop);
    +    CHECK_TERM(x(0));
         DispatchReturn;
    -  } while (0);
    -}

    When expanding macros, beam_makeops wraps the expansion in a + } while (0); +}

    When expanding macros, beam_makeops wraps the expansion in a do/while wrapper unless beam_makeops can clearly see that no wrapper is needed. In this case, the wrapper is needed.

    Note that arguments for macros cannot be complex expressions, because the arguments are split on ,. For example, the following would not work because beam_makeops would split the expression into -two arguments:

    $deallocate_return(get_deallocation(y, $Deallocate));

    Code generation directives

    Within macro definitions, // comments are in general not treated +two arguments:

    $deallocate_return(get_deallocation(y, $Deallocate));

    Code generation directives

    Within macro definitions, // comments are in general not treated specially. They will be copied to the file with the generated code along with the rest of code in the body.

    However, there is an exception. Within a macro definition, a line that starts with whitespace followed by //| is treated specially. The rest of the line is assumed to contain directives to control code generation.

    Currently, two code generation directives are recognized:

    • -no_prefetch
    • -no_next
    The -no_prefetch directive

    To see what -no_prefetch does, let's first look at the default code -generation. Here is the code generated for move_cx:

    OpCase(move_cx):
    -{
    -  BeamInstr next_pf = BeamCodeAddr(I[2]);
    -  xb(BeamExtraData(I[0])) = I[1];
    +generation.  Here is the code generated for move_cx:

    OpCase(move_cx):
    +{
    +  BeamInstr next_pf = BeamCodeAddr(I[2]);
    +  xb(BeamExtraData(I[0])) = I[1];
       I += 2;
    -  ASSERT(VALID_INSTR(next_pf));
    -  GotoPF(next_pf);
    -}

    Note that the very first thing done is to fetch the address to the + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

    Note that the very first thing done is to fetch the address to the next instruction. The reason is that it usually improves performance.

    Just as a demonstration, we can add a -no_prefetch directive to -the move/2 instruction:

    move(Src, Dst) {
    +the move/2 instruction:

    move(Src, Dst) {
         //| -no_prefetch
         $Dst = $Src;
    -}

    We can see that the prefetch is no longer done:

    OpCase(move_cx):
    -{
    -  xb(BeamExtraData(I[0])) = I[1];
    +}

    We can see that the prefetch is no longer done:

    OpCase(move_cx):
    +{
    +  xb(BeamExtraData(I[0])) = I[1];
       I += 2;
    -  ASSERT(VALID_INSTR(*I));
    -  Goto(*I);
    -}

    When would we want to turn off the prefetch in practice?

    In instructions that will not always execute the next instruction. -For example:

    is_atom(Fail, Src) {
    -    if (is_not_atom($Src)) {
    -        $FAIL($Fail);
    -    }
    -}
    +  ASSERT(VALID_INSTR(*I));
    +  Goto(*I);
    +}

    When would we want to turn off the prefetch in practice?

    In instructions that will not always execute the next instruction. +For example:

    is_atom(Fail, Src) {
    +    if (is_not_atom($Src)) {
    +        $FAIL($Fail);
    +    }
    +}
     
     // From macros.tab
    -FAIL(Fail) {
    +FAIL(Fail) {
         //| -no_prefetch
    -    $SET_I_REL($Fail);
    -    Goto(*I);
    -}

    is_atom/2 may either execute the next instruction (if the second -operand is an atom) or branch to the failure label.

    The generated code looks like this:

    OpCase(is_atom_fx):
    -{
    -  if (is_not_atom(xb(I[1]))) {
    -    ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    -    I += fb(BeamExtraData(I[0])) + 0;;
    -    Goto(*I);;
    -  }
    +    $SET_I_REL($Fail);
    +    Goto(*I);
    +}

    is_atom/2 may either execute the next instruction (if the second +operand is an atom) or branch to the failure label.

    The generated code looks like this:

    OpCase(is_atom_fx):
    +{
    +  if (is_not_atom(xb(I[1]))) {
    +    ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    +    I += fb(BeamExtraData(I[0])) + 0;;
    +    Goto(*I);;
    +  }
       I += 2;
    -  ASSERT(VALID_INSTR(*I));
    -  Goto(*I);
    -}
    The -no_next directive

    Next we will look at when the -no_next directive can be used. Here -is the jump/1 instruction:

    jump(Fail) {
    -    $JUMP($Fail);
    -}
    +  ASSERT(VALID_INSTR(*I));
    +  Goto(*I);
    +}
    The -no_next directive

    Next we will look at when the -no_next directive can be used. Here +is the jump/1 instruction:

    jump(Fail) {
    +    $JUMP($Fail);
    +}
     
     // From macros.tab
    -JUMP(Fail) {
    +JUMP(Fail) {
         //| -no_next
    -    $SET_I_REL($Fail);
    -    Goto(*I);
    -}

    The generated code looks like this:

    OpCase(jump_f):
    -{
    -  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    -  I += fb(BeamExtraData(I[0])) + 0;;
    -  Goto(*I);;
    -}

    If we remove the -no_next directive, the code would look like this:

    OpCase(jump_f):
    -{
    -  BeamInstr next_pf = BeamCodeAddr(I[1]);
    -  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    -  I += fb(BeamExtraData(I[0])) + 0;;
    -  Goto(*I);;
    +    $SET_I_REL($Fail);
    +    Goto(*I);
    +}

    The generated code looks like this:

    OpCase(jump_f):
    +{
    +  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    +  I += fb(BeamExtraData(I[0])) + 0;;
    +  Goto(*I);;
    +}

    If we remove the -no_next directive, the code would look like this:

    OpCase(jump_f):
    +{
    +  BeamInstr next_pf = BeamCodeAddr(I[1]);
    +  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
    +  I += fb(BeamExtraData(I[0])) + 0;;
    +  Goto(*I);;
       I += 1;
    -  ASSERT(VALID_INSTR(next_pf));
    -  GotoPF(next_pf);
    -}

    In the end, the C compiler will probably optimize this code to the + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

    In the end, the C compiler will probably optimize this code to the same native code as the first version, but the first version is certainly much easier to read for human readers.

    Macros in the macros.tab file

    The file macros.tab contains many useful macros. When implementing new instructions it is good practice to look through macros.tab to @@ -936,61 +936,61 @@

    $REFRESH_GEN_DEST() macro.

    If you need to define a new function that does garbage collection, you should give it the prefix erts_gc_. If that is not possible you should update the regular expression so that it will match your -new function.

    FAIL(Fail)

    Branch to $Fail. Will suppress prefetch (-no_prefetch). Typical use:

    is_nonempty_list(Fail, Src) {
    -    if (is_not_list($Src)) {
    -        $FAIL($Fail);
    -    }
    -}
    JUMP(Fail)

    Branch to $Fail. Suppresses generation of dispatch of the next -instruction (-no_next). Typical use:

    jump(Fail) {
    -    $JUMP($Fail);
    -}
    GC_TEST(NeedStack, NeedHeap, Live)

    $GC_TEST(NeedStack, NeedHeap, Live) tests that given amount of +new function.

    FAIL(Fail)

    Branch to $Fail. Will suppress prefetch (-no_prefetch). Typical use:

    is_nonempty_list(Fail, Src) {
    +    if (is_not_list($Src)) {
    +        $FAIL($Fail);
    +    }
    +}
    JUMP(Fail)

    Branch to $Fail. Suppresses generation of dispatch of the next +instruction (-no_next). Typical use:

    jump(Fail) {
    +    $JUMP($Fail);
    +}
    GC_TEST(NeedStack, NeedHeap, Live)

    $GC_TEST(NeedStack, NeedHeap, Live) tests that given amount of stack space and heap space is available. If not it will do a -garbage collection. Typical use:

    test_heap(Nh, Live) {
    -    $GC_TEST(0, $Nh, $Live);
    -}
    AH(NeedStack, NeedHeap, Live)

    AH(NeedStack, NeedHeap, Live) allocates a stack frame and +garbage collection. Typical use:

    test_heap(Nh, Live) {
    +    $GC_TEST(0, $Nh, $Live);
    +}
    AH(NeedStack, NeedHeap, Live)

    AH(NeedStack, NeedHeap, Live) allocates a stack frame and optionally additional heap space.

    Pre-defined macros and variables

    beam_makeops defines several built-in macros and pre-bound variables.

    The NEXT_INSTRUCTION pre-bound variable

    The NEXT_INSTRUCTION is a pre-bound variable that is available in -all instructions. It expands to the address of the next instruction.

    Here is an example:

    i_call(CallDest) {
    +all instructions.  It expands to the address of the next instruction.

    Here is an example:

    i_call(CallDest) {
         //| -no_next
    -    $SAVE_CONTINUATION_POINTER($NEXT_INSTRUCTION);
    -    $DISPATCH_REL($CallDest);
    -}

    When calling a function, the return address is first stored in E[0] + $SAVE_CONTINUATION_POINTER($NEXT_INSTRUCTION); + $DISPATCH_REL($CallDest); +}

    When calling a function, the return address is first stored in E[0] (using the $SAVE_CONTINUATION_POINTER() macro), and then control is -transferred to the callee. Here is the generated code:

    OpCase(i_call_f):
    -{
    -    ASSERT(VALID_INSTR(*(I+2)));
    -    *E = (BeamInstr) (I+2);;
    +transferred to the callee.  Here is the generated code:

    OpCase(i_call_f):
    +{
    +    ASSERT(VALID_INSTR(*(I+2)));
    +    *E = (BeamInstr) (I+2);;
     
         /* ... dispatch code intentionally left out ... */
    -}

    We can see that that $NEXT_INSTRUCTION has been expanded to I+2. +}

    We can see that that $NEXT_INSTRUCTION has been expanded to I+2. That makes sense since the size of the i_call_f/1 instruction is two words.

    The IP_ADJUSTMENT pre-bound variable

    $IP_ADJUSTMENT is usually 0. In a few combined instructions (described below) it can be non-zero. It is used like this -in macros.tab:

    SET_I_REL(Offset) {
    -    ASSERT(VALID_INSTR(*(I + ($Offset) + $IP_ADJUSTMENT)));
    +in macros.tab:

    SET_I_REL(Offset) {
    +    ASSERT(VALID_INSTR(*(I + ($Offset) + $IP_ADJUSTMENT)));
         I += $Offset + $IP_ADJUSTMENT;
    -}

    Avoid using IP_ADJUSTMENT directly. Use SET_I_REL() or +}

    Avoid using IP_ADJUSTMENT directly. Use SET_I_REL() or one of the macros that invoke such as FAIL() or JUMP() defined in macros.tab.

    Pre-defined macro functions

    The IF() macro

    $IF(Expr, IfTrue, IfFalse) evaluates Expr, which must be a valid Perl expression (which for simple numeric expressions have the same syntax as C). If Expr evaluates to 0, the entire IF() expression will be replaced with IfFalse, otherwise it will be replaced with IfTrue.

    See the description of OPERAND_POSITION() for an example.

    The OPERAND_POSITION() macro

    $OPERAND_POSITION(Expr) returns the position for Expr, if Expr is an operand that is not packed. The first operand is -at position 1.

    Returns 0 otherwise.

    This macro could be used like this in order to share code:

    FAIL(Fail) {
    +at position 1.

    Returns 0 otherwise.

    This macro could be used like this in order to share code:

    FAIL(Fail) {
         //| -no_prefetch
    -    $IF($OPERAND_POSITION($Fail) == 1 && $IP_ADJUSTMENT == 0,
    +    $IF($OPERAND_POSITION($Fail) == 1 && $IP_ADJUSTMENT == 0,
             goto common_jump,
    -        $DO_JUMP($Fail));
    -}
    +        $DO_JUMP($Fail));
    +}
     
    -DO_JUMP(Fail) {
    -    $SET_I_REL($Fail);
    -    Goto(*I));
    -}
    +DO_JUMP(Fail) {
    +    $SET_I_REL($Fail);
    +    Goto(*I));
    +}
     
     // In beam_emu.c:
     common_jump:
    -   I += I[1];
    -   Goto(*I));

    The $REFRESH_GEN_DEST() macro

    When a specific instruction has a d operand, early during execution + I += I[1]; + Goto(*I));

    The $REFRESH_GEN_DEST() macro

    When a specific instruction has a d operand, early during execution of the instruction, a pointer will be initialized to point to the X or Y register in question.

    If there is a garbage collection before the result is stored, the stack will move and if the d operand referred to a Y @@ -999,29 +999,29 @@

    to set up the pointer again. beam_makeops will notice if there is a call to a function that does a garbage collection and $REFRESH_GEN_DEST() is not called.

    Here is a complete example. The new_map instruction is defined -like this:

    new_map d t I

    It is implemented like this:

    new_map(Dst, Live, N) {
    +like this:

    new_map d t I

    It is implemented like this:

    new_map(Dst, Live, N) {
         Eterm res;
     
         HEAVY_SWAPOUT;
    -    res = erts_gc_new_map(c_p, reg, $Live, $N, $NEXT_INSTRUCTION);
    +    res = erts_gc_new_map(c_p, reg, $Live, $N, $NEXT_INSTRUCTION);
         HEAVY_SWAPIN;
    -    $REFRESH_GEN_DEST();
    +    $REFRESH_GEN_DEST();
         $Dst = res;
    -    $NEXT($NEXT_INSTRUCTION+$N);
    -}

    If we have forgotten the $REFRESH_GEN_DEST() there would be a message -similar to this:

    pointer to destination register is invalid after GC -- use $REFRESH_GEN_DEST()
    -... from the body of new_map at beam/map_instrs.tab(30)

    Variable number of operands

    Here follows an example of how to handle an instruction with a variable number + $NEXT($NEXT_INSTRUCTION+$N); +}

    If we have forgotten the $REFRESH_GEN_DEST() there would be a message +similar to this:

    pointer to destination register is invalid after GC -- use $REFRESH_GEN_DEST()
    +... from the body of new_map at beam/map_instrs.tab(30)

    Variable number of operands

    Here follows an example of how to handle an instruction with a variable number of operands for the interpreter. Here is the instruction definition in emu/ops.tab:

    put_tuple2 xy I *

    For the interpreter, the * is optional, because it does not effect code generation in any way. However, it is recommended to include it to make it clear for human readers that there is a variable number of operands.

    Use the $NEXT_INSTRUCTION macro to obtain a pointer to the first of the variable -operands.

    Here is the implementation:

    put_tuple2(Dst, Arity) {
    +operands.

    Here is the implementation:

    put_tuple2(Dst, Arity) {
     Eterm* hp = HTOP;
     Eterm arity = $Arity;
    -Eterm* dst_ptr = &($Dst);
    +Eterm* dst_ptr = &($Dst);
     
     //| -no_next
    -ASSERT(arity != 0);
    -*hp++ = make_arityval(arity);
    +ASSERT(arity != 0);
    +*hp++ = make_arityval(arity);
     
     /*
      * The $NEXT_INSTRUCTION macro points just beyond the fixed
    @@ -1029,58 +1029,58 @@ 

    * the first element to be put into the tuple. */ I = $NEXT_INSTRUCTION; -do { +do { Eterm term = *I++; - switch (loader_tag(term)) { + switch (loader_tag(term)) { case LOADER_X_REG: - *hp++ = x(loader_x_reg_index(term)); + *hp++ = x(loader_x_reg_index(term)); break; case LOADER_Y_REG: - *hp++ = y(loader_y_reg_index(term)); + *hp++ = y(loader_y_reg_index(term)); break; default: *hp++ = term; break; - } -} while (--arity != 0); -*dst_ptr = make_tuple(HTOP); + } +} while (--arity != 0); +*dst_ptr = make_tuple(HTOP); HTOP = hp; -ASSERT(VALID_INSTR(* (Eterm *)I)); -Goto(*I); -}

    Combined instructions

    Problem: For frequently executed instructions we want to use +ASSERT(VALID_INSTR(* (Eterm *)I)); +Goto(*I); +}

    Combined instructions

    Problem: For frequently executed instructions we want to use "fast" operands types such as x and y, as opposed to s or S. To avoid an explosion in code size, we want to share most of the implementation between the instructions. Here are the specific instructions for i_increment/5:

    i_increment r W t d
     i_increment x W t d
    -i_increment y W t d

    The i_increment instruction is implemented like this:

    i_increment(Source, IncrementVal, Live, Dst) {
    +i_increment y W t d

    The i_increment instruction is implemented like this:

    i_increment(Source, IncrementVal, Live, Dst) {
         Eterm increment_reg_source = $Source;
         Eterm increment_val = $IncrementVal;
         Uint live;
         Eterm result;
     
    -    if (ERTS_LIKELY(is_small(increment_reg_val))) {
    -        Sint i = signed_val(increment_reg_val) + increment_val;
    -        if (ERTS_LIKELY(IS_SSMALL(i))) {
    -            $Dst = make_small(i);
    -            $NEXT0();
    -        }
    -    }
    +    if (ERTS_LIKELY(is_small(increment_reg_val))) {
    +        Sint i = signed_val(increment_reg_val) + increment_val;
    +        if (ERTS_LIKELY(IS_SSMALL(i))) {
    +            $Dst = make_small(i);
    +            $NEXT0();
    +        }
    +    }
         live = $Live;
         HEAVY_SWAPOUT;
    -    reg[live] = increment_reg_val;
    -    reg[live+1] = make_small(increment_val);
    -    result = erts_gc_mixed_plus(c_p, reg, live);
    +    reg[live] = increment_reg_val;
    +    reg[live+1] = make_small(increment_val);
    +    result = erts_gc_mixed_plus(c_p, reg, live);
         HEAVY_SWAPIN;
    -    ERTS_HOLE_CHECK(c_p);
    -    if (ERTS_LIKELY(is_value(result))) {
    -        $REFRESH_GEN_DEST();
    +    ERTS_HOLE_CHECK(c_p);
    +    if (ERTS_LIKELY(is_value(result))) {
    +        $REFRESH_GEN_DEST();
             $Dst = result;
    -        $NEXT0();
    -    }
    -    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
    +        $NEXT0();
    +    }
    +    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
         goto find_func_info;
    -}

    There will be three almost identical copies of the code. Given the +}

    There will be three almost identical copies of the code. Given the size of the code, that could be too high cost to pay.

    To avoid the three copies of the code, we could use only one specific instruction:

    i_increment S W t d

    (The same implementation as above will work.)

    That reduces the code size, but is slower because S means that there will be extra code to test whether the operand refers to an X @@ -1089,44 +1089,44 @@

    bulk of the code can be shared.

    Here we will show how i_increment can be implemented as a combined instruction. We will show each individual fragment first, and then show how to connect them together. First we will need a variable that -we can store the value fetched from the register in:

    increment.head() {
    +we can store the value fetched from the register in:

    increment.head() {
         Eterm increment_reg_val;
    -}

    The name increment is the name of the group that the fragment +}

    The name increment is the name of the group that the fragment belongs to. Note that it does not need to have the same name as the instruction. The group name is followed by . and the name of the fragment. The name head is pre-defined. The code in it will be placed at the beginning of a block, so that all fragments in the group can access it.

    Next we define the fragment that will pick up the value from the -register from the first operand:

    increment.fetch(Src) {
    +register from the first operand:

    increment.fetch(Src) {
         increment_reg_val = $Src;
    -}

    We call this fragment fetch. This fragment will be duplicated three -times, one for each value of the first operand (r, x, and y).

    Next we define the main part of the code that do the actual incrementing.

    increment.execute(IncrementVal, Live, Dst) {
    +}

    We call this fragment fetch. This fragment will be duplicated three +times, one for each value of the first operand (r, x, and y).

    Next we define the main part of the code that do the actual incrementing.

    increment.execute(IncrementVal, Live, Dst) {
         Eterm increment_val = $IncrementVal;
         Uint live;
         Eterm result;
     
    -    if (ERTS_LIKELY(is_small(increment_reg_val))) {
    -        Sint i = signed_val(increment_reg_val) + increment_val;
    -        if (ERTS_LIKELY(IS_SSMALL(i))) {
    -            $Dst = make_small(i);
    -            $NEXT0();
    -        }
    -    }
    +    if (ERTS_LIKELY(is_small(increment_reg_val))) {
    +        Sint i = signed_val(increment_reg_val) + increment_val;
    +        if (ERTS_LIKELY(IS_SSMALL(i))) {
    +            $Dst = make_small(i);
    +            $NEXT0();
    +        }
    +    }
         live = $Live;
         HEAVY_SWAPOUT;
    -    reg[live] = increment_reg_val;
    -    reg[live+1] = make_small(increment_val);
    -    result = erts_gc_mixed_plus(c_p, reg, live);
    +    reg[live] = increment_reg_val;
    +    reg[live+1] = make_small(increment_val);
    +    result = erts_gc_mixed_plus(c_p, reg, live);
         HEAVY_SWAPIN;
    -    ERTS_HOLE_CHECK(c_p);
    -    if (ERTS_LIKELY(is_value(result))) {
    -        $REFRESH_GEN_DEST();
    +    ERTS_HOLE_CHECK(c_p);
    +    if (ERTS_LIKELY(is_value(result))) {
    +        $REFRESH_GEN_DEST();
             $Dst = result;
    -        $NEXT0();
    -    }
    -    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
    +        $NEXT0();
    +    }
    +    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
         goto find_func_info;
    -}

    We call this fragment execute. It will handle the three remaining +}

    We call this fragment execute. It will handle the three remaining operands (W t d). There will only be one copy of this fragment.

    Now that we have defined the fragments, we need to inform beam_makeops how they should be connected:

    i_increment := increment.fetch.execute;

    To the left of the := is the name of the specific instruction that should be implemented by the fragments, in this case i_increment. @@ -1134,33 +1134,33 @@

    followed by a .. Then the name of the fragments in the group are listed in the order they should be executed. Note that the head fragment is not listed.

    The line ends in ; (to avoid messing up the indentation in Emacs).

    (Note that in practice the := line is usually placed before the -fragments.)

    The generated code looks like this:

    {
    +fragments.)

    The generated code looks like this:

    {
       Eterm increment_reg_val;
    -  OpCase(i_increment_rWtd):
    -  {
    -    increment_reg_val = r(0);
    -  }
    +  OpCase(i_increment_rWtd):
    +  {
    +    increment_reg_val = r(0);
    +  }
       goto increment__execute;
     
    -  OpCase(i_increment_xWtd):
    -  {
    -    increment_reg_val = xb(BeamExtraData(I[0]));
    -  }
    +  OpCase(i_increment_xWtd):
    +  {
    +    increment_reg_val = xb(BeamExtraData(I[0]));
    +  }
       goto increment__execute;
     
    -  OpCase(i_increment_yWtd):
    -  {
    -    increment_reg_val = yb(BeamExtraData(I[0]));
    -  }
    +  OpCase(i_increment_yWtd):
    +  {
    +    increment_reg_val = yb(BeamExtraData(I[0]));
    +  }
       goto increment__execute;
     
       increment__execute:
    -  {
    -    // Here follows the code from increment.execute()
    +  {
    +    // Here follows the code from increment.execute()
         .
         .
         .
    -}
    Some notes about combined instructions

    The operands that are different must be at +}

    Some notes about combined instructions

    The operands that are different must be at the beginning of the instruction. All operands in the last fragment must have the same operands in all variants of the specific instruction.

    As an example, the following specific instructions cannot be @@ -1171,21 +1171,21 @@

    i_times x y j? t d i_times s s j? t d

    We can then define:

    i_times := times.fetch.execute;
     
    -times.head {
    +times.head {
         Eterm op1, op2;
    -}
    +}
     
    -times.fetch(Src1, Src2) {
    +times.fetch(Src1, Src2) {
         op1 = $Src1;
         op2 = $Src2;
    -}
    +}
     
    -times.execute(Fail, Live, Dst) {
    +times.execute(Fail, Live, Dst) {
         // Multiply op1 and op2.
         .
         .
         .
    -}

    Several instructions can share a group. As an example, the following +}

    Several instructions can share a group. As an example, the following instructions have different names, but in the end they all create a binary. The last two operands are common for all of them:

    i_bs_init_fail       xy j? t? x
     i_bs_init_fail_heap s I j? t? x
    @@ -1195,46 +1195,46 @@ 

    i_bs_init_fail := bs_init . fail . verify . execute; i_bs_init := bs_init . . plain . execute; i_bs_init_heap := bs_init . heap . execute;

    Note that the first two instruction have three fragments, while the -other two only have two fragments. Here are the fragments:

    bs_init_bits.head() {
    +other two only have two fragments.  Here are the fragments:

    bs_init_bits.head() {
         Eterm num_bits_term;
         Uint num_bits;
         Uint alloc;
    -}
    +}
     
    -bs_init_bits.plain(NumBits) {
    +bs_init_bits.plain(NumBits) {
         num_bits = $NumBits;
         alloc = 0;
    -}
    +}
     
    -bs_init_bits.heap(NumBits, Alloc) {
    +bs_init_bits.heap(NumBits, Alloc) {
         num_bits = $NumBits;
         alloc = $Alloc;
    -}
    +}
     
    -bs_init_bits.fail(NumBitsTerm) {
    +bs_init_bits.fail(NumBitsTerm) {
         num_bits_term = $NumBitsTerm;
         alloc = 0;
    -}
    +}
     
    -bs_init_bits.fail_heap(NumBitsTerm, Alloc) {
    +bs_init_bits.fail_heap(NumBitsTerm, Alloc) {
         num_bits_term = $NumBitsTerm;
         alloc = $Alloc;
    -}
    +}
     
    -bs_init_bits.verify(Fail) {
    +bs_init_bits.verify(Fail) {
         // Verify the num_bits_term, fail using $FAIL
         // if there is a problem.
     .
     .
     .
    -}
    +}
     
    -bs_init_bits.execute(Live, Dst) {
    +bs_init_bits.execute(Live, Dst) {
        // Long complicated code to a create a binary.
        .
        .
        .
    -}

    The full definitions of those instructions can be found in bs_instrs.tab. +}

    The full definitions of those instructions can be found in bs_instrs.tab. The generated code can be found in beam_warm.h.

    @@ -1244,39 +1244,39 @@

    For the BeamAsm runtime system, the implementation of each instruction is defined by emitter functions written in C++ that emit the assembly code for each instruction. There is one emitter function for each family of specific instructions.

    Take for example the move instruction. In beam/asm/ops.tab there is a -single specific instruction for move defined like this:

    move s d

    The implementation is found in beam/asm/instr_common.cpp:

    void BeamModuleAssembler::emit_move(const ArgVal &Src, const ArgVal &Dst) {
    -    mov_arg(Dst, Src);
    -}

    The mov_arg() helper function will handle all combinations of source and destination -operands. For example, the instruction {move,{x,1},{y,1}} will be translated like this:

    mov rdi, qword [rbx+8]
    -mov qword [rsp+8], rdi

    while {move,{integer,42},{x,0}} will be translated like this:

    mov qword [rbx], 687

    It is possible to define more than one specific instruction, but there will still be +single specific instruction for move defined like this:

    move s d

    The implementation is found in beam/asm/instr_common.cpp:

    void BeamModuleAssembler::emit_move(const ArgVal &Src, const ArgVal &Dst) {
    +    mov_arg(Dst, Src);
    +}

    The mov_arg() helper function will handle all combinations of source and destination +operands. For example, the instruction {move,{x,1},{y,1}} will be translated like this:

    mov rdi, qword [rbx+8]
    +mov qword [rsp+8], rdi

    while {move,{integer,42},{x,0}} will be translated like this:

    mov qword [rbx], 687

    It is possible to define more than one specific instruction, but there will still be only one emitter function. For example:

    fload S l
     fload q l

    By defining fload like this, the source operand must be a X register, Y register, or a literal. If not, the loading will be aborted. If the instruction instead had been defined like this:

    fload s l

    attempting to load an invalid instruction such as {fload,{atom,clearly_bad},{fr,0}} would cause a crash (either at load time or when the instruction was executed).

    Regardless on how many specific instructions there are in the family, -only a single emit_fload() function is allowed:

    void BeamModuleAssembler::emit_fload(const ArgVal &Src, const ArgVal &Dst) {
    +only a single emit_fload() function is allowed:

    void BeamModuleAssembler::emit_fload(const ArgVal &Src, const ArgVal &Dst) {
         .
         .
         .
    -}

    Handling a variable number of operands

    Here follows an example of how an instruction with a variable number +}

    Handling a variable number of operands

    Here follows an example of how an instruction with a variable number of operands could be handled. One such instructions is -select_val/3. Here is an example how it can look like in BEAM code:

    {select_val,{x,0},
    -            {f,1},
    -            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

    The loader will convert a {list,[...]} operand to an u operand whose +select_val/3. Here is an example how it can look like in BEAM code:

    {select_val,{x,0},
    +            {f,1},
    +            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

    The loader will convert a {list,[...]} operand to an u operand whose value is the number of elements in the list, followed by each element in the list. The instruction above would be translated to the following -instruction:

    {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

    A definition of a specific instruction for that instruction would look +instruction:

    {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

    A definition of a specific instruction for that instruction would look like this:

    select_val s f I *

    The * as the last operand will make sure that the variable operands are passed in as a Span of ArgVal (will be std::span in C++20 onwards). -Here is the emitter function:

    void BeamModuleAssembler::emit_select_val(const ArgVal &Src,
    +Here is the emitter function:

    void BeamModuleAssembler::emit_select_val(const ArgVal &Src,
                                               const ArgVal &Fail,
                                               const ArgVal &Size,
    -                                          const Span<ArgVal> &args) {
    -    ASSERT(Size.getValue() == args.size());
    +                                          const Span<ArgVal> &args) {
    +    ASSERT(Size.getValue() == args.size());
            .
            .
            .
    -}
    +
    }

    diff --git a/prs/8803/erts-15.0.1/doc/html/beamasm.html b/prs/8803/erts-15.0.1/doc/html/beamasm.html index 55e11aac60c9d..74ed784a01bb4 100644 --- a/prs/8803/erts-15.0.1/doc/html/beamasm.html +++ b/prs/8803/erts-15.0.1/doc/html/beamasm.html @@ -149,10 +149,10 @@

    used in BeamAsm are much simpler than the interpreter's, as most of the transformations for the interpreter are done only to eliminate the instruction dispatch overhead.

    Then each instruction is encoded using the C++ functions in the -jit/$ARCH/instr_*.cpp files. For example:

    void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
    -  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
    -  a.jne(labels[Fail.getLabel()]);
    -}

    asmjit provides a fairly straightforward +jit/$ARCH/instr_*.cpp files. For example:

    void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
    +  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
    +  a.jne(labels[Fail.getLabel()]);
    +}

    asmjit provides a fairly straightforward mapping from a C++ function call to the x86 assembly instruction. The above instruction tests if the value in the Src register is a non-empty list and if it is not then it jumps to the fail label.

    For comparison, the interpreter has 8 combinations and specializations of @@ -160,7 +160,7 @@

    common patterns.

    The original register allocation done by the Erlang compiler is used to manage the liveness of values and the physical registers are statically allocated to keep the necessary process state. At the moment this is the static register -allocation on x86-64:

    rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
    +allocation on x86-64:

    rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
     rbp: Current frame pointer when `perf` support is enabled, otherwise this
          is an optional save slot for the Erlang stack pointer when executing C
          code.
    @@ -187,13 +187,13 @@ 

    used about double the amount of memory for code as the interpreter, while current versions use about 10% more. How was this achieved?

    In BeamAsm we heavily use shared code fragments to try to emit as much code as possible as global shared fragments instead of duplicating the code unnecessarily. -For instance, the return instruction looks something like this:

    Label yield = a.newLabel();
    +For instance, the return instruction looks something like this:

    Label yield = a.newLabel();
     
     /* Decrement reduction counter */
    -a.dec(FCALLS);
    +a.dec(FCALLS);
     /* If FCALLS < 0, jump to the yield-on-return fragment */
    -a.jl(resolve_fragment(ga->get_dispatch_return()));
    -a.ret();

    The code above is not exactly what is emitted, but close enough. The thing to note +a.jl(resolve_fragment(ga->get_dispatch_return())); +a.ret();

    The code above is not exactly what is emitted, but close enough. The thing to note is that the code for doing the context switch is never emitted. Instead, we jump to a global fragment that all return instructions share. This greatly reduces the amount of code that has to be emitted for each module.

    @@ -243,24 +243,24 @@

    As Erlang stacks can be very small, we have to switch over to a different stack when we need to execute C code (which may expect a much larger stack). This is -done through emit_enter_runtime and emit_leave_runtime, for example:

    mov_arg(ARG4, NumFree);
    +done through emit_enter_runtime and emit_leave_runtime, for example:

    mov_arg(ARG4, NumFree);
     
     /* Move to the C stack and swap out our current reductions, stack-, and
      * heap pointer to the process structure. */
    -emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
    +emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
     
    -a.mov(ARG1, c_p);
    -load_x_reg_array(ARG2);
    -make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
    +a.mov(ARG1, c_p);
    +load_x_reg_array(ARG2);
    +make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
     
     /* Call `new_fun`, asserting that we're on the C stack. */
    -runtime_call<4>(new_fun);
    +runtime_call<4>(new_fun);
     
     /* Move back to the C stack, and read the updated values from the process
      * structure */
    -emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
    +emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
     
    -a.mov(getXRef(0), RET);

    All combinations of the Update constants are legal, but the ones given to +a.mov(getXRef(0), RET);

    All combinations of the Update constants are legal, but the ones given to emit_leave_runtime must be the same as those given to emit_enter_runtime.

    @@ -271,7 +271,7 @@

    any function call. In the interpreter, this is done by rewriting the loaded BEAM code, but this is more complicated in BeamAsm as we want to have a fast and compact way to do this. This is solved by emitting the code below at the -start of each function (x86 variant below):

      0x0: short jmp 6 (address 0x8)
    +start of each function (x86 variant below):

      0x0: short jmp 6 (address 0x8)
       0x2: nop
       0x3: relative near call to shared breakpoint fragment
       0x8: actual code for function

    When code starts to execute it will simply see the short jmp 6 instruction @@ -293,23 +293,23 @@

    executable page and once with a writable page. Since they're backed by the same memory, writes to the writable page appear magically in the executable one.

    The erts_writable_code_ptr function can be used to get writable pointers -given a module instance, provided that it has been unsealed first:

    for (i = 0; i < n; i++) {
    +given a module instance, provided that it has been unsealed first:

    for (i = 0; i < n; i++) {
         const ErtsCodeInfo* ci_exec;
         ErtsCodeInfo* ci_rw;
         void *w_ptr;
     
    -    erts_unseal_module(&modp->curr);
    +    erts_unseal_module(&modp->curr);
     
    -    ci_exec = code_hdr->functions[i];
    -    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
    -    ci_rw = (ErtsCodeInfo*)w_ptr;
    +    ci_exec = code_hdr->functions[i];
    +    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
    +    ci_rw = (ErtsCodeInfo*)w_ptr;
     
    -    uninstall_breakpoint(ci_rw, ci_exec);
    -    consolidate_bp_data(modp, ci_rw, 1);
    -    ASSERT(ci_rw->gen_bp == NULL);
    +    uninstall_breakpoint(ci_rw, ci_exec);
    +    consolidate_bp_data(modp, ci_rw, 1);
    +    ASSERT(ci_rw->gen_bp == NULL);
     
    -    erts_seal_module(&modp->curr);
    -}

    Without the module instance there's no reliable way to figure out the writable + erts_seal_module(&modp->curr); +}

    Without the module instance there's no reliable way to figure out the writable address of a code page, and we rely on address space layout randomization (ASLR) to make it difficult to guess. On some platforms, security is further enhanced by protecting the writable area from writes until the module has been @@ -397,7 +397,7 @@

    flamegraph.pl out.folded > out.svg

    We get a graph that would look something like this:

    Linux Perf FlameGraph: dialyzer PLT build

    You can view a larger version here. It contains the same information, but it is easier to share with others as it does not need the symbols in the executable.

    Using the same data we can also produce a graph where the scheduler profile data -has been merged by using sed:

    ## Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
    +has been merged by using sed:

    ## Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
     ## scheduler names changed in OTP26, hence two expressions
     sed -e 's/^[0-9]\+_//' -e 's/^erts_\([^_]\+\)_[0-9]\+/erts_\1/' out.folded > out.folded_sched
     ## Create the svg
    diff --git a/prs/8803/erts-15.0.1/doc/html/codeloading.html b/prs/8803/erts-15.0.1/doc/html/codeloading.html
    index 2c476b9d8eaa5..1f6a0d994f31d 100644
    --- a/prs/8803/erts-15.0.1/doc/html/codeloading.html
    +++ b/prs/8803/erts-15.0.1/doc/html/codeloading.html
    @@ -167,8 +167,8 @@ 

    erts_try_seize_code_load_permission and erts_release_code_load_permission).

    The ability to prepare several modules in parallel is not currently used as almost all code loading is serialized by the code_server -process. The BIF interface is however prepared for this.

      erlang:prepare_loading(Module, Code) -> LoaderState
    -  erlang:finish_loading([LoaderState])

    The idea is that prepare_loading could be called in parallel for +process. The BIF interface is however prepared for this.

      erlang:prepare_loading(Module, Code) -> LoaderState
    +  erlang:finish_loading([LoaderState])

    The idea is that prepare_loading could be called in parallel for different modules and returns a "magic binary" containing the internal state of each prepared module. Function finish_loading could take a list of such states and do the finishing of all of them in one go.

    Currently we use the legacy BIF erlang:load_module which is now diff --git a/prs/8803/erts-15.0.1/doc/html/crash_dump.html b/prs/8803/erts-15.0.1/doc/html/crash_dump.html index 17bdffa9ed9dd..2e6e645d78875 100644 --- a/prs/8803/erts-15.0.1/doc/html/crash_dump.html +++ b/prs/8803/erts-15.0.1/doc/html/crash_dump.html @@ -405,13 +405,13 @@

    interesting. One has to "guess" what is what, but as the information is symbolic, thorough reading of this information can be useful. As an example, we can find the state variable of the Erlang primitive loader online (5) and -(6) in the following example:

    (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
    -(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
    -(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
    -(4)  y(1)     <0.1.0>
    -(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
    -(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
    -(7)  y(3)     infinity

    When interpreting the data for a process, it is helpful to know that anonymous +(6) in the following example:

    (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
    +(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
    +(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
    +(4)  y(1)     <0.1.0>
    +(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
    +(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
    +(7)  y(3)     infinity

    When interpreting the data for a process, it is helpful to know that anonymous function objects (funs) are given the following:

    • A name constructed from the name of the function in which they are created
    • A number (starting with 0) indicating the number of that fun within that function

    diff --git a/prs/8803/erts-15.0.1/doc/html/driver.html b/prs/8803/erts-15.0.1/doc/html/driver.html index 4b6a49e36c5a5..ae4d9bcd6fabe 100644 --- a/prs/8803/erts-15.0.1/doc/html/driver.html +++ b/prs/8803/erts-15.0.1/doc/html/driver.html @@ -180,12 +180,12 @@

    terms, so binary_to_term is called in Erlang to convert the result to term form.

    The code is available in pg_sync.c in the sample directory of erts.

    The driver entry contains the functions that will be called by the emulator. In this example, only start, stop, and control are provided:

    /* Driver interface declarations */
    -static ErlDrvData start(ErlDrvPort port, char *command);
    -static void stop(ErlDrvData drv_data);
    -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    -                   int len, char **rbuf, int rlen);
    +static ErlDrvData start(ErlDrvPort port, char *command);
    +static void stop(ErlDrvData drv_data);
    +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    +                   int len, char **rbuf, int rlen);
     
    -static ErlDrvEntry pq_driver_entry = {
    +static ErlDrvEntry pq_driver_entry = {
         NULL,                        /* init */
         start,
         stop,
    @@ -202,10 +202,10 @@ 

    NULL, /* flush */ NULL, /* call */ NULL /* event */ -};

    We have a structure to store state needed by the driver, in this case we only -need to keep the database connection:

    typedef struct our_data_s {
    +};

    We have a structure to store state needed by the driver, in this case we only +need to keep the database connection:

    typedef struct our_data_s {
         PGconn* conn;
    -} our_data_t;

    The control codes that we have defined are as follows:

    /* Keep the following definitions in alignment with the
    +} our_data_t;

    The control codes that we have defined are as follows:

    /* Keep the following definitions in alignment with the
      * defines in erl_pq_sync.erl
      */
     
    @@ -221,130 +221,130 @@ 

    * the driver entry. */ -DRIVER_INIT(pq_drv) -{ +DRIVER_INIT(pq_drv) +{ return &pq_driver_entry; -}

    Here some initialization is done, start is called from open_port/2. The data +}

    Here some initialization is done, start is called from open_port/2. The data will be passed to control and stop.

    /* DRIVER INTERFACE */
    -static ErlDrvData start(ErlDrvPort port, char *command)
    -{
    +static ErlDrvData start(ErlDrvPort port, char *command)
    +{
         our_data_t* data;
     
    -    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
    +    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
         data->conn = NULL;
    -    set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
    -    return (ErlDrvData)data;
    -}

    We call disconnect to log out from the database. (This should have been done -from Erlang, but just in case.)

    static int do_disconnect(our_data_t* data, ei_x_buff* x);
    -
    -static void stop(ErlDrvData drv_data)
    -{
    -    our_data_t* data = (our_data_t*)drv_data;
    -
    -    do_disconnect(data, NULL);
    -    driver_free(data);
    -}

    We use the binary format only to return data to the emulator; input data is a + set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); + return (ErlDrvData)data; +}

    We call disconnect to log out from the database. (This should have been done +from Erlang, but just in case.)

    static int do_disconnect(our_data_t* data, ei_x_buff* x);
    +
    +static void stop(ErlDrvData drv_data)
    +{
    +    our_data_t* data = (our_data_t*)drv_data;
    +
    +    do_disconnect(data, NULL);
    +    driver_free(data);
    +}

    We use the binary format only to return data to the emulator; input data is a string parameter for connect and select. The returned data consists of Erlang terms.

    The functions get_s and ei_x_to_new_binary are utilities that are used to make the code shorter. get_s duplicates the string and zero-terminates it, as the postgres client library wants that. ei_x_to_new_binary takes an ei_x_buff buffer, allocates a binary, and copies the data there. This binary is returned in *rbuf. (Notice that this binary is freed by the emulator, not -by us.)

    static char* get_s(const char* buf, int len);
    -static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
    -static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
    +by us.)

    static char* get_s(const char* buf, int len);
    +static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
    +static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
     
     /* As we are operating in binary mode, the return value from control
      * is irrelevant, as long as it is not negative.
      */
    -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    -                   int len, char **rbuf, int rlen)
    -{
    +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    +                   int len, char **rbuf, int rlen)
    +{
         int r;
         ei_x_buff x;
    -    our_data_t* data = (our_data_t*)drv_data;
    -    char* s = get_s(buf, len);
    -    ei_x_new_with_version(&x);
    -    switch (command) {
    -        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
    -        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
    -        case DRV_SELECT:     r = do_select(s, data, &x);   break;
    +    our_data_t* data = (our_data_t*)drv_data;
    +    char* s = get_s(buf, len);
    +    ei_x_new_with_version(&x);
    +    switch (command) {
    +        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
    +        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
    +        case DRV_SELECT:     r = do_select(s, data, &x);   break;
             default:             r = -1;        break;
    -    }
    -    *rbuf = (char*)ei_x_to_new_binary(&x);
    -    ei_x_free(&x);
    -    driver_free(s);
    +    }
    +    *rbuf = (char*)ei_x_to_new_binary(&x);
    +    ei_x_free(&x);
    +    driver_free(s);
         return r;
    -}

    do_connect is where we log in to the database. If the connection was +}

    do_connect is where we log in to the database. If the connection was successful, we store the connection handle in the driver data, and return 'ok'. Otherwise, we return the error message from postgres and store NULL in -the driver data.

    static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
    -{
    -    PGconn* conn = PQconnectdb(s);
    -    if (PQstatus(conn) != CONNECTION_OK) {
    -        encode_error(x, conn);
    -        PQfinish(conn);
    +the driver data.

    static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
    +{
    +    PGconn* conn = PQconnectdb(s);
    +    if (PQstatus(conn) != CONNECTION_OK) {
    +        encode_error(x, conn);
    +        PQfinish(conn);
             conn = NULL;
    -    } else {
    -        encode_ok(x);
    -    }
    +    } else {
    +        encode_ok(x);
    +    }
         data->conn = conn;
         return 0;
    -}

    If we are connected (and if the connection handle is not NULL), we log out +}

    If we are connected (and if the connection handle is not NULL), we log out from the database. We need to check if we should encode an 'ok', as we can get -here from function stop, which does not return data to the emulator:

    static int do_disconnect(our_data_t* data, ei_x_buff* x)
    -{
    -    if (data->conn == NULL)
    +here from function stop, which does not return data to the emulator:

    static int do_disconnect(our_data_t* data, ei_x_buff* x)
    +{
    +    if (data->conn == NULL)
             return 0;
    -    PQfinish(data->conn);
    +    PQfinish(data->conn);
         data->conn = NULL;
    -    if (x != NULL)
    -        encode_ok(x);
    +    if (x != NULL)
    +        encode_ok(x);
         return 0;
    -}

    We execute a query and encode the result. Encoding is done in another C module, -pg_encode.c, which is also provided as sample code.

    static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
    -{
    -   PGresult* res = PQexec(data->conn, s);
    -    encode_result(x, res, data->conn);
    -    PQclear(res);
    +}

    We execute a query and encode the result. Encoding is done in another C module, +pg_encode.c, which is also provided as sample code.

    static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
    +{
    +   PGresult* res = PQexec(data->conn, s);
    +    encode_result(x, res, data->conn);
    +    PQclear(res);
         return 0;
    -}

    Here we check the result from postgres. If it is data, we encode it as lists of +}

    Here we check the result from postgres. If it is data, we encode it as lists of lists with column data. Everything from postgres is C strings, so we use ei_x_encode_string to send the result as strings to Erlang. (The head of the -list contains the column names.)

    void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
    -{
    +list contains the column names.)

    void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
    +{
         int row, n_rows, col, n_cols;
    -    switch (PQresultStatus(res)) {
    +    switch (PQresultStatus(res)) {
         case PGRES_TUPLES_OK:
    -        n_rows = PQntuples(res);
    -        n_cols = PQnfields(res);
    -        ei_x_encode_tuple_header(x, 2);
    -        encode_ok(x);
    -        ei_x_encode_list_header(x, n_rows+1);
    -        ei_x_encode_list_header(x, n_cols);
    -        for (col = 0; col < n_cols; ++col) {
    -            ei_x_encode_string(x, PQfname(res, col));
    -        }
    -        ei_x_encode_empty_list(x);
    -        for (row = 0; row < n_rows; ++row) {
    -            ei_x_encode_list_header(x, n_cols);
    -            for (col = 0; col < n_cols; ++col) {
    -                ei_x_encode_string(x, PQgetvalue(res, row, col));
    -            }
    -            ei_x_encode_empty_list(x);
    -        }
    -        ei_x_encode_empty_list(x);
    +        n_rows = PQntuples(res);
    +        n_cols = PQnfields(res);
    +        ei_x_encode_tuple_header(x, 2);
    +        encode_ok(x);
    +        ei_x_encode_list_header(x, n_rows+1);
    +        ei_x_encode_list_header(x, n_cols);
    +        for (col = 0; col < n_cols; ++col) {
    +            ei_x_encode_string(x, PQfname(res, col));
    +        }
    +        ei_x_encode_empty_list(x);
    +        for (row = 0; row < n_rows; ++row) {
    +            ei_x_encode_list_header(x, n_cols);
    +            for (col = 0; col < n_cols; ++col) {
    +                ei_x_encode_string(x, PQgetvalue(res, row, col));
    +            }
    +            ei_x_encode_empty_list(x);
    +        }
    +        ei_x_encode_empty_list(x);
             break;
         case PGRES_COMMAND_OK:
    -        ei_x_encode_tuple_header(x, 2);
    -        encode_ok(x);
    -        ei_x_encode_string(x, PQcmdTuples(res));
    +        ei_x_encode_tuple_header(x, 2);
    +        encode_ok(x);
    +        ei_x_encode_string(x, PQcmdTuples(res));
             break;
         default:
    -        encode_error(x, conn);
    +        encode_error(x, conn);
             break;
    -    }
    -}

    + } +}

    @@ -368,33 +368,33 @@

    the shared library and the name in the driver entry structure.

    When the port has been opened, the driver can be called. In the pg_sync example, we do not have any data from the port, only the return value from the port_control/3.

    The following code is the Erlang part of the synchronous postgres driver, -pg_sync.erl:

    -module(pg_sync).
    +pg_sync.erl:

    -module(pg_sync).
     
    --define(DRV_CONNECT, 1).
    --define(DRV_DISCONNECT, 2).
    --define(DRV_SELECT, 3).
    +-define(DRV_CONNECT, 1).
    +-define(DRV_DISCONNECT, 2).
    +-define(DRV_SELECT, 3).
     
    --export([connect/1, disconnect/1, select/2]).
    +-export([connect/1, disconnect/1, select/2]).
     
    -connect(ConnectStr) ->
    -    case erl_ddll:load_driver(".", "pg_sync") of
    +connect(ConnectStr) ->
    +    case erl_ddll:load_driver(".", "pg_sync") of
             ok -> ok;
    -        {error, already_loaded} -> ok;
    -        E -> exit({error, E})
    +        {error, already_loaded} -> ok;
    +        E -> exit({error, E})
         end,
    -    Port = open_port({spawn, ?MODULE}, []),
    -    case binary_to_term(port_control(Port, ?DRV_CONNECT, ConnectStr)) of
    -        ok -> {ok, Port};
    +    Port = open_port({spawn, ?MODULE}, []),
    +    case binary_to_term(port_control(Port, ?DRV_CONNECT, ConnectStr)) of
    +        ok -> {ok, Port};
             Error -> Error
         end.
     
    -disconnect(Port) ->
    -    R = binary_to_term(port_control(Port, ?DRV_DISCONNECT, "")),
    -    port_close(Port),
    +disconnect(Port) ->
    +    R = binary_to_term(port_control(Port, ?DRV_DISCONNECT, "")),
    +    port_close(Port),
         R.
     
    -select(Port, Query) ->
    -    binary_to_term(port_control(Port, ?DRV_SELECT, Query)).

    The API is simple:

    • connect/1 loads the driver, opens it, and logs on to the database, returning +select(Port, Query) -> + binary_to_term(port_control(Port, ?DRV_SELECT, Query)).

    The API is simple:

    • connect/1 loads the driver, opens it, and logs on to the database, returning the Erlang port if successful.
    • select/2 sends a query to the driver and returns the result.
    • disconnect/1 closes the database connection and the driver. (However, it does not unload it.)

    The connection string is to be a connection string for postgres.

    The driver is loaded with erl_ddll:load_driver/2. If this is successful, or if it is already loaded, it is opened. This will call the start function in the @@ -414,13 +414,13 @@

    on our postgres driver, we re-implement it using the asynchronous calls in LibPQ.

    The asynchronous version of the driver is in the sample files pg_async.c and pg_asyng.erl.

    /* Driver interface declarations */
    -static ErlDrvData start(ErlDrvPort port, char *command);
    -static void stop(ErlDrvData drv_data);
    -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    -                   int len, char **rbuf, int rlen);
    -static void ready_io(ErlDrvData drv_data, ErlDrvEvent event);
    +static ErlDrvData start(ErlDrvPort port, char *command);
    +static void stop(ErlDrvData drv_data);
    +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
    +                   int len, char **rbuf, int rlen);
    +static void ready_io(ErlDrvData drv_data, ErlDrvEvent event);
     
    -static ErlDrvEntry pq_driver_entry = {
    +static ErlDrvEntry pq_driver_entry = {
         NULL,                     /* init */
         start,
         stop,
    @@ -437,14 +437,14 @@ 

    NULL, /* flush */ NULL, /* call */ NULL /* event */ -}; +}; -typedef struct our_data_t { +typedef struct our_data_t { PGconn* conn; ErlDrvPort port; int socket; int connecting; -} our_data_t;

    Some things have changed from pg_sync.c: we use the entry ready_io for +} our_data_t;

    Some things have changed from pg_sync.c: we use the entry ready_io for ready_input and ready_output, which is called from the emulator only when there is input to be read from the socket. (Actually, the socket is used in a select function inside the emulator, and when the socket is signaled, @@ -454,83 +454,83 @@

    data to the port with driver_output. We have a flag connecting to tell whether the driver is waiting for a connection or waiting for the result of a query. (This is needed, as the entry ready_io is called both when connecting -and when there is a query result.)

    static int do_connect(const char *s, our_data_t* data)
    -{
    -    PGconn* conn = PQconnectStart(s);
    -    if (PQstatus(conn) == CONNECTION_BAD) {
    +and when there is a query result.)

    static int do_connect(const char *s, our_data_t* data)
    +{
    +    PGconn* conn = PQconnectStart(s);
    +    if (PQstatus(conn) == CONNECTION_BAD) {
             ei_x_buff x;
    -        ei_x_new_with_version(&x);
    -        encode_error(&x, conn);
    -        PQfinish(conn);
    +        ei_x_new_with_version(&x);
    +        encode_error(&x, conn);
    +        PQfinish(conn);
             conn = NULL;
    -        driver_output(data->port, x.buff, x.index);
    -        ei_x_free(&x);
    -    }
    -    PQconnectPoll(conn);
    -    int socket = PQsocket(conn);
    +        driver_output(data->port, x.buff, x.index);
    +        ei_x_free(&x);
    +    }
    +    PQconnectPoll(conn);
    +    int socket = PQsocket(conn);
         data->socket = socket;
    -    driver_select(data->port, (ErlDrvEvent)socket, DO_READ, 1);
    -    driver_select(data->port, (ErlDrvEvent)socket, DO_WRITE, 1);
    +    driver_select(data->port, (ErlDrvEvent)socket, DO_READ, 1);
    +    driver_select(data->port, (ErlDrvEvent)socket, DO_WRITE, 1);
         data->conn = conn;
         data->connecting = 1;
         return 0;
    -}

    The connect function looks a bit different too. We connect using the +}

    The connect function looks a bit different too. We connect using the asynchronous PQconnectStart function. After the connection is started, we retrieve the socket for the connection with PQsocket. This socket is used with the driver_select function to wait for connection. When the socket is ready for input or for output, the ready_io function is called.

    Notice that we only return data (with driver_output) if there is an error here, otherwise we wait for the connection to be completed, in which case our -ready_io function is called.

    static int do_select(const char* s, our_data_t* data)
    -{
    +ready_io function is called.

    static int do_select(const char* s, our_data_t* data)
    +{
         data->connecting = 0;
         PGconn* conn = data->conn;
         /* if there's an error return it now */
    -    if (PQsendQuery(conn, s) == 0) {
    +    if (PQsendQuery(conn, s) == 0) {
             ei_x_buff x;
    -        ei_x_new_with_version(&x);
    -        encode_error(&x, conn);
    -        driver_output(data->port, x.buff, x.index);
    -        ei_x_free(&x);
    -    }
    +        ei_x_new_with_version(&x);
    +        encode_error(&x, conn);
    +        driver_output(data->port, x.buff, x.index);
    +        ei_x_free(&x);
    +    }
         /* else wait for ready_output to get results */
         return 0;
    -}

    The do_select function initiates a select, and returns if there is no -immediate error. The result is returned when ready_io is called.

    static void ready_io(ErlDrvData drv_data, ErlDrvEvent event)
    -{
    +}

    The do_select function initiates a select, and returns if there is no +immediate error. The result is returned when ready_io is called.

    static void ready_io(ErlDrvData drv_data, ErlDrvEvent event)
    +{
         PGresult* res = NULL;
    -    our_data_t* data = (our_data_t*)drv_data;
    +    our_data_t* data = (our_data_t*)drv_data;
         PGconn* conn = data->conn;
         ei_x_buff x;
    -    ei_x_new_with_version(&x);
    -    if (data->connecting) {
    +    ei_x_new_with_version(&x);
    +    if (data->connecting) {
             ConnStatusType status;
    -        PQconnectPoll(conn);
    -        status = PQstatus(conn);
    -        if (status == CONNECTION_OK)
    -            encode_ok(&x);
    -        else if (status == CONNECTION_BAD)
    -            encode_error(&x, conn);
    -    } else {
    -        PQconsumeInput(conn);
    -        if (PQisBusy(conn))
    +        PQconnectPoll(conn);
    +        status = PQstatus(conn);
    +        if (status == CONNECTION_OK)
    +            encode_ok(&x);
    +        else if (status == CONNECTION_BAD)
    +            encode_error(&x, conn);
    +    } else {
    +        PQconsumeInput(conn);
    +        if (PQisBusy(conn))
                 return;
    -        res = PQgetResult(conn);
    -        encode_result(&x, res, conn);
    -        PQclear(res);
    -        for (;;) {
    -            res = PQgetResult(conn);
    -            if (res == NULL)
    +        res = PQgetResult(conn);
    +        encode_result(&x, res, conn);
    +        PQclear(res);
    +        for (;;) {
    +            res = PQgetResult(conn);
    +            if (res == NULL)
                     break;
    -            PQclear(res);
    -        }
    -    }
    -    if (x.index > 1) {
    -        driver_output(data->port, x.buff, x.index);
    -        if (data->connecting)
    -            driver_select(data->port, (ErlDrvEvent)data->socket, DO_WRITE, 0);
    -    }
    -    ei_x_free(&x);
    -}

    The ready_io function is called when the socket we got from postgres is ready + PQclear(res); + } + } + if (x.index > 1) { + driver_output(data->port, x.buff, x.index); + if (data->connecting) + driver_select(data->port, (ErlDrvEvent)data->socket, DO_WRITE, 0); + } + ei_x_free(&x); +}

    The ready_io function is called when the socket we got from postgres is ready for input or output. Here we first check if we are connecting to the database. In that case, we check connection status and return OK if the connection is successful, or error if it is not. If the connection is not yet established, we @@ -540,43 +540,43 @@

    the result and return it. The encoding is done with the same functions as in the earlier example.

    Error handling is to be added here, for example, checking that the socket is still open, but this is only a simple example.

    The Erlang part of the asynchronous driver consists of the sample file -pg_async.erl.

    -module(pg_async).
    +pg_async.erl.

    -module(pg_async).
     
    --define(DRV_CONNECT, $C).
    --define(DRV_DISCONNECT, $D).
    --define(DRV_SELECT, $S).
    +-define(DRV_CONNECT, $C).
    +-define(DRV_DISCONNECT, $D).
    +-define(DRV_SELECT, $S).
     
    --export([connect/1, disconnect/1, select/2]).
    +-export([connect/1, disconnect/1, select/2]).
     
    -connect(ConnectStr) ->
    -    case erl_ddll:load_driver(".", "pg_async") of
    +connect(ConnectStr) ->
    +    case erl_ddll:load_driver(".", "pg_async") of
             ok -> ok;
    -        {error, already_loaded} -> ok;
    -        _ -> exit({error, could_not_load_driver})
    +        {error, already_loaded} -> ok;
    +        _ -> exit({error, could_not_load_driver})
         end,
    -    Port = open_port({spawn, ?MODULE}, [binary]),
    -    port_control(Port, ?DRV_CONNECT, ConnectStr),
    -    case return_port_data(Port) of
    +    Port = open_port({spawn, ?MODULE}, [binary]),
    +    port_control(Port, ?DRV_CONNECT, ConnectStr),
    +    case return_port_data(Port) of
             ok ->
    -            {ok, Port};
    +            {ok, Port};
             Error ->
                 Error
         end.
     
    -disconnect(Port) ->
    -    port_control(Port, ?DRV_DISCONNECT, ""),
    -    R = return_port_data(Port),
    -    port_close(Port),
    +disconnect(Port) ->
    +    port_control(Port, ?DRV_DISCONNECT, ""),
    +    R = return_port_data(Port),
    +    port_close(Port),
         R.
     
    -select(Port, Query) ->
    -    port_control(Port, ?DRV_SELECT, Query),
    -    return_port_data(Port).
    +select(Port, Query) ->
    +    port_control(Port, ?DRV_SELECT, Query),
    +    return_port_data(Port).
     
    -return_port_data(Port) ->
    +return_port_data(Port) ->
         receive
    -        {Port, {data, Data}} ->
    -            binary_to_term(Data)
    +        {Port, {data, Data}} ->
    +            binary_to_term(Data)
         end.

    The Erlang code is slightly different, as we do not return the result synchronously from port_control/3, instead we get it from driver_output as data in the message queue. The function return_port_data above receives data @@ -606,7 +606,7 @@

    callback ready_async is called from the main emulator thread, this is where we return the result to Erlang. (We cannot return the result from within the asynchronous function, as we cannot call the driver functions.)

    The following code is from the sample file next_perm.cc. The driver entry -looks like before, but also contains the callback ready_async.

    static ErlDrvEntry next_perm_driver_entry = {
    +looks like before, but also contains the callback ready_async.

    static ErlDrvEntry next_perm_driver_entry = {
         NULL,                        /* init */
         start,
         NULL,                        /* stop */
    @@ -623,109 +623,109 @@ 

    NULL, /* flush */ NULL, /* call */ NULL /* event */ -};

    The output function allocates the work area of the asynchronous function. As +};

    The output function allocates the work area of the asynchronous function. As we use C++, we use a struct, and stuff the data in it. We must copy the original data, it is not valid after we have returned from the output function, and the do_perm function is called later, and from another thread. We return no data here, instead it is sent later from the ready_async callback.

    The async_data is passed to the do_perm function. We do not use a async_free function (the last argument to driver_async), it is only used if -the task is cancelled programmatically.

    struct our_async_data {
    +the task is cancelled programmatically.

    struct our_async_data {
         bool prev;
         vector<int> data;
    -    our_async_data(ErlDrvPort p, int command, const char* buf, int len);
    -};
    -
    -our_async_data::our_async_data(ErlDrvPort p, int command,
    -                               const char* buf, int len)
    -    : prev(command == 2),
    -      data((int*)buf, (int*)buf + len / sizeof(int))
    -{
    -}
    -
    -static void do_perm(void* async_data);
    -
    -static void output(ErlDrvData drv_data, char *buf, int len)
    -{
    -    if (*buf < 1 || *buf > 2) return;
    -    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
    -    void* async_data = new our_async_data(port, *buf, buf+1, len);
    -    driver_async(port, NULL, do_perm, async_data, do_free);
    -}

    In the do_perm we do the work, operating on the structure that was allocated -in output.

    static void do_perm(void* async_data)
    -{
    -    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
    -    if (d->prev)
    -        prev_permutation(d->data.begin(), d->data.end());
    +    our_async_data(ErlDrvPort p, int command, const char* buf, int len);
    +};
    +
    +our_async_data::our_async_data(ErlDrvPort p, int command,
    +                               const char* buf, int len)
    +    : prev(command == 2),
    +      data((int*)buf, (int*)buf + len / sizeof(int))
    +{
    +}
    +
    +static void do_perm(void* async_data);
    +
    +static void output(ErlDrvData drv_data, char *buf, int len)
    +{
    +    if (*buf < 1 || *buf > 2) return;
    +    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
    +    void* async_data = new our_async_data(port, *buf, buf+1, len);
    +    driver_async(port, NULL, do_perm, async_data, do_free);
    +}

    In the do_perm we do the work, operating on the structure that was allocated +in output.

    static void do_perm(void* async_data)
    +{
    +    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
    +    if (d->prev)
    +        prev_permutation(d->data.begin(), d->data.end());
         else
    -        next_permutation(d->data.begin(), d->data.end());
    -}

    In the ready_async function the output is sent back to the emulator. We use + next_permutation(d->data.begin(), d->data.end()); +}

    In the ready_async function the output is sent back to the emulator. We use the driver term format instead of ei. This is the only way to send Erlang terms directly to a driver, without having the Erlang code to call binary_to_term/1. In the simple example this works well, -and we do not need to use ei to handle the binary term format.

    When the data is returned, we deallocate our data.

    static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
    -{
    -    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
    -    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
    -    int n = d->data.size(), result_n = n*2 + 3;
    -    ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
    -    for (vector<int>::iterator i = d->data.begin();
    -         i != d->data.end(); ++i) {
    +and we do not need to use ei to handle the binary term format.

    When the data is returned, we deallocate our data.

    static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
    +{
    +    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
    +    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
    +    int n = d->data.size(), result_n = n*2 + 3;
    +    ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
    +    for (vector<int>::iterator i = d->data.begin();
    +         i != d->data.end(); ++i) {
             *rp++ = ERL_DRV_INT;
             *rp++ = *i;
    -    }
    +    }
         *rp++ = ERL_DRV_NIL;
         *rp++ = ERL_DRV_LIST;
         *rp++ = n+1;
    -    driver_output_term(port, result, result_n);
    -    delete[] result;
    +    driver_output_term(port, result, result_n);
    +    delete[] result;
         delete d;
    -}

    This driver is called like the others from Erlang. However, as we use +}

    This driver is called like the others from Erlang. However, as we use driver_output_term, there is no need to call binary_to_term/1. The Erlang code -is in the sample file next_perm.erl.

    The input is changed into a list of integers and sent to the driver.

    -module(next_perm).
    +is in the sample file next_perm.erl.

    The input is changed into a list of integers and sent to the driver.

    -module(next_perm).
     
    --export([next_perm/1, prev_perm/1, load/0, all_perm/1]).
    +-export([next_perm/1, prev_perm/1, load/0, all_perm/1]).
     
    -load() ->
    -    case whereis(next_perm) of
    +load() ->
    +    case whereis(next_perm) of
             undefined ->
    -            case erl_ddll:load_driver(".", "next_perm") of
    +            case erl_ddll:load_driver(".", "next_perm") of
                     ok -> ok;
    -                {error, already_loaded} -> ok;
    -                E -> exit(E)
    +                {error, already_loaded} -> ok;
    +                E -> exit(E)
                 end,
    -            Port = open_port({spawn, "next_perm"}, []),
    -            register(next_perm, Port);
    +            Port = open_port({spawn, "next_perm"}, []),
    +            register(next_perm, Port);
             _ ->
                 ok
         end.
     
    -list_to_integer_binaries(L) ->
    -    [<<I:32/integer-native>> || I <- L].
    +list_to_integer_binaries(L) ->
    +    [<<I:32/integer-native>> || I <- L].
     
    -next_perm(L) ->
    -    next_perm(L, 1).
    +next_perm(L) ->
    +    next_perm(L, 1).
     
    -prev_perm(L) ->
    -    next_perm(L, 2).
    +prev_perm(L) ->
    +    next_perm(L, 2).
     
    -next_perm(L, Nxt) ->
    -    load(),
    -    B = list_to_integer_binaries(L),
    -    port_control(next_perm, Nxt, B),
    +next_perm(L, Nxt) ->
    +    load(),
    +    B = list_to_integer_binaries(L),
    +    port_control(next_perm, Nxt, B),
         receive
             Result ->
                 Result
         end.
     
    -all_perm(L) ->
    -    New = prev_perm(L),
    -    all_perm(New, L, [New]).
    +all_perm(L) ->
    +    New = prev_perm(L),
    +    all_perm(New, L, [New]).
     
    -all_perm(L, L, Acc) ->
    +all_perm(L, L, Acc) ->
         Acc;
    -all_perm(L, Orig, Acc) ->
    -    New = prev_perm(L),
    -    all_perm(New, Orig, [New | Acc]).
    +
    all_perm(L, Orig, Acc) -> + New = prev_perm(L), + all_perm(New, Orig, [New | Acc]).

    diff --git a/prs/8803/erts-15.0.1/doc/html/driver_entry.html b/prs/8803/erts-15.0.1/doc/html/driver_entry.html index 9f40040e1a59b..cff915cbc6f03 100644 --- a/prs/8803/erts-15.0.1/doc/html/driver_entry.html +++ b/prs/8803/erts-15.0.1/doc/html/driver_entry.html @@ -176,54 +176,54 @@

    Data Types

    -

    ErlDrvEntry

    typedef struct erl_drv_entry {
    -    int (*init)(void);          /* Called at system startup for statically
    +

    ErlDrvEntry

    typedef struct erl_drv_entry {
    +    int (*init)(void);          /* Called at system startup for statically
                                        linked drivers, and after loading for
                                        dynamically loaded drivers */
     #ifndef ERL_SYS_DRV
    -    ErlDrvData (*start)(ErlDrvPort port, char *command);
    +    ErlDrvData (*start)(ErlDrvPort port, char *command);
                                     /* Called when open_port/2 is invoked,
                                        return value -1 means failure */
     #else
    -    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
    +    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
                                     /* Special options, only for system driver */
     #endif
    -    void (*stop)(ErlDrvData drv_data);
    +    void (*stop)(ErlDrvData drv_data);
                                     /* Called when port is closed, and when the
                                        emulator is halted */
    -    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
    +    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
                                     /* Called when we have output from Erlang to
                                        the port */
    -    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
    +    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
                                     /* Called when we have input from one of
                                        the driver's handles */
    -    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
    +    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
                                     /* Called when output is possible to one of
                                        the driver's handles */
         char *driver_name;          /* Name supplied as command in
                                        erlang:open_port/2 */
    -    void (*finish)(void);       /* Called before unloading the driver -
    +    void (*finish)(void);       /* Called before unloading the driver -
                                        dynamic drivers only */
         void *handle;               /* Reserved, used by emulator internally */
    -    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
    +    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
                                 char *buf, ErlDrvSizeT len,
    -			    char **rbuf, ErlDrvSizeT rlen);
    +			    char **rbuf, ErlDrvSizeT rlen);
                                     /* "ioctl" for drivers - invoked by
                                        port_control/3 */
    -    void (*timeout)(ErlDrvData drv_data);
    +    void (*timeout)(ErlDrvData drv_data);
                                     /* Handling of time-out in driver */
    -    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
    +    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
                                     /* Called when we have output from Erlang
                                        to the port */
    -    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
    -    void (*flush)(ErlDrvData drv_data);
    +    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
    +    void (*flush)(ErlDrvData drv_data);
                                     /* Called when the port is about to be
                                        closed, and there is data in the
                                        driver queue that must be flushed
                                        before 'stop' can be called */
    -    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
    +    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
                              char *buf, ErlDrvSizeT len,
    -			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
    +			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
                                     /* Works mostly like 'control', a synchronous
                                        call into the driver */
         void* unused_event_callback;
    @@ -232,11 +232,11 @@ 

    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); + void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor); /* Called when a process monitor fires */ - void (*stop_select)(ErlDrvEvent event, void* reserved); + void (*stop_select)(ErlDrvEvent event, void* reserved); /* Called to close an event object */ - } ErlDrvEntry;

    • int (*init)(void) - Called directly after the driver has been + } ErlDrvEntry;

    • int (*init)(void) - Called directly after the driver has been loaded by erl_ddll:load_driver/2 (actually when the driver is added to the driver list). The driver is to return 0, or, if the driver cannot initialize, -1.

    • ErlDrvData (*start)(ErlDrvPort port, char* command) - Called diff --git a/prs/8803/erts-15.0.1/doc/html/erl_cmd.html b/prs/8803/erts-15.0.1/doc/html/erl_cmd.html index dc45cf3dc3922..c38bfcedf5e90 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_cmd.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_cmd.html @@ -154,18 +154,18 @@

      init process and can be retrieved by calling init:get_plain_arguments/0. Plain arguments can occur before the first flag, or after a -- flag. Also, the -extra flag causes everything that follows to become plain arguments.

    Examples:

    % 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"]

    Here +W w and +R 9 are emulator flags. -s my_init is an init flag, +(arnie@host)1> init:get_argument(sname). +{ok,[["arnie"]]} +(arnie@host)2> init:get_plain_arguments(). +["+bertie"]

    Here +W w and +R 9 are emulator flags. -s my_init is an init flag, interpreted by init. -sname arnie is a user flag, stored by init. It is read by Kernel and causes the Erlang runtime system to become distributed. Finally, everything after -extra (that is, +bertie) is considered as plain arguments.

    % erl -myflag 1
    -1> init:get_argument(myflag).
    -{ok,[["1"]]}
    -2> init:get_plain_arguments().
    -[]

    Here the user flag -myflag 1 is passed to and stored by the init process. It +1> init:get_argument(myflag). +{ok,[["1"]]} +2> init:get_plain_arguments(). +[]

    Here the user flag -myflag 1 is passed to and stored by the init process. It is a user-defined flag, presumably used by some user-defined application.

    @@ -704,7 +704,7 @@

    also balances scheduler utilization between schedulers.

  • +sct CpuTopology - Sets a user-defined CPU topology. The user-defined CPU topology overrides any automatically detected CPU topology. The CPU topology is used when -binding schedulers to logical processors.

    <Id> = integer(); when 0 =< <Id> =< 65535
    +binding schedulers to logical processors.

    <Id> = integer(); when 0 =< <Id> =< 65535
     <IdRange> = <Id>-<Id>
     <IdOrIdRange> = <Id> | <IdRange>
     <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>
    @@ -737,22 +737,22 @@ 

    NUMA node. If <ProcessorIds> is omitted, its default position is before <NodeIds>. That is, the default is processor external NUMA nodes.

    If a list of identifiers is used in an <IdDefs>:

    • <LogicalIds> must be a list of identifiers.
    • At least one other identifier type besides <LogicalIds> must also have a list of identifiers.
    • All lists of identifiers must produce the same number of identifiers.

    A simple example. A single quad core processor can be described as follows:

    % erl +sct L0-3c0-3
    -1> erlang:system_info(cpu_topology).
    -[{processor,[{core,{logical,0}},
    -             {core,{logical,1}},
    -             {core,{logical,2}},
    -             {core,{logical,3}}]}]

    A more complicated example with two quad core processors, each processor in +1> erlang:system_info(cpu_topology). +[{processor,[{core,{logical,0}}, + {core,{logical,1}}, + {core,{logical,2}}, + {core,{logical,3}}]}]

    A more complicated example with two quad core processors, each processor in its own NUMA node. The ordering of logical processors is a bit weird. This to give a better example of identifier lists:

    % 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}}]}]}]

    As long as real identifiers are correct, it is OK to pass a CPU topology +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}}]}]}]

    As long as real identifiers are correct, it is OK to pass a CPU topology that is not a correct description of the CPU topology. When used with care this can be very useful. This to trick the emulator to bind its schedulers as you want. For example, if you want to run multiple Erlang runtime systems @@ -927,10 +927,10 @@

    user's home directory and then filename:basedir(user_config, "erlang").

    If an .erlang file is found, it is assumed to contain valid Erlang expressions. These expressions are evaluated as if they were input to the -shell.

    A typical .erlang file contains a set of search paths, for example:

    io:format("executing user profile in $HOME/.erlang\n",[]).
    -code:add_path("/home/calvin/test/ebin").
    -code:add_path("/home/hobbes/bigappl-1.2/ebin").
    -io:format(".erlang rc finished\n",[]).

  • user_default and shell_default - Functions in the shell that are not +shell.

    A typical .erlang file contains a set of search paths, for example:

    io:format("executing user profile in $HOME/.erlang\n",[]).
    +code:add_path("/home/calvin/test/ebin").
    +code:add_path("/home/hobbes/bigappl-1.2/ebin").
    +io:format(".erlang rc finished\n",[]).
  • user_default and shell_default - Functions in the shell that are not prefixed by a module name are assumed to be functional objects (funs), built-in functions (BIFs), or belong to the module user_default or shell_default.

    To include private shell commands, define them in a module user_default and diff --git a/prs/8803/erts-15.0.1/doc/html/erl_dist_protocol.html b/prs/8803/erts-15.0.1/doc/html/erl_dist_protocol.html index 7e1e6e842a26a..2f57403d140d3 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_dist_protocol.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_dist_protocol.html @@ -256,7 +256,7 @@

    client ->> EPMD: NAMES_REQ EPMD -->> client: NAMES_RESP

  • 1
    110

    Table: NAMES_REQ (110)

    The response for a NAMES_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: NAMES_RESP

    NodeInfo is a string written for each active node. When all NodeInfo has -been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    +been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    @@ -271,9 +271,9 @@

    client ->> EPMD: DUMP_REQ EPMD -->> client: DUMP_RESP

    1
    100

    Table: DUMP_REQ

    The response for a DUMP_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: DUMP_RESP

    NodeInfo is a string written for each node kept in the EPMD. When all -NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    -          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    -          [NodeName, Port, Fd]).

    +NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    +          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    +          [NodeName, Port, Fd]).

    @@ -411,7 +411,7 @@

    Semigraphic View

    -
    A (initiator)                                      B (acceptor)
    +
    A (initiator)                                      B (acceptor)
     
     TCP connect ------------------------------------>
                                                        TCP accept
    @@ -421,36 +421,36 @@ 

    <---------------------------------------------- send_status recv_status -(if status was 'alive' +(if status was 'alive' send_status - - - - - - - - - - - - - - - - - -> - recv_status) + recv_status) - (ChB) ChB = gen_challenge() + (ChB) ChB = gen_challenge() <---------------------------------------------- send_challenge recv_challenge -(if old send_name +(if old send_name send_complement - - - - - - - - - - - - - - - -> - recv_complement) + recv_complement) -ChA = gen_challenge(), -OCA = out_cookie(B), -DiA = gen_digest(ChB, OCA) - (ChA, DiA) +ChA = gen_challenge(), +OCA = out_cookie(B), +DiA = gen_digest(ChB, OCA) + (ChA, DiA) send_challenge_reply ---------------------------> recv_challenge_reply - ICB = in_cookie(A), + ICB = in_cookie(A), check: - DiA == gen_digest (ChB, ICB)? + DiA == gen_digest (ChB, ICB)? - if OK: - OCB = out_cookie(A), - DiB = gen_digest (ChA, OCB) - (DiB) + OCB = out_cookie(A), + DiB = gen_digest (ChA, OCB) + (DiB) <----------------------------------------------- send_challenge_ack recv_challenge_ack DONE -ICA = in_cookie(B), - else: +ICA = in_cookie(B), - else: check: CLOSE -DiB == gen_digest(ChA, ICA)? +DiB == gen_digest(ChA, ICA)? - if OK: DONE - else: diff --git a/prs/8803/erts-15.0.1/doc/html/erl_driver.html b/prs/8803/erts-15.0.1/doc/html/erl_driver.html index 2fa467f492a42..e51c4634cf0d3 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_driver.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_driver.html @@ -333,7 +333,7 @@

    • ErlDrvSizeT - An unsigned integer type to be used as size_t.

    • ErlDrvSSizeT - A signed integer type, the size of -ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
      +ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
          int driver_major_version;
          int driver_minor_version;
          char *erts_version;
      @@ -345,7 +345,7 @@ 

      int nif_major_version; int nif_minor_version; int dirty_scheduler_support; -} ErlDrvSysInfo;

      The ErlDrvSysInfo structure is used for storage of information about the +} ErlDrvSysInfo;

    The ErlDrvSysInfo structure is used for storage of information about the Erlang runtime system. driver_system_info writes the system information when passed a reference to a ErlDrvSysInfo structure. The fields @@ -401,12 +401,12 @@

    aligned for storage of an array of doubles (usually 8-byte aligned).

  • ErlDrvData - A handle to driver-specific data, passed to the driver callbacks. It is a pointer, and is most often type cast to a specific pointer in the driver.

  • SysIOVec - A system I/O vector, as used by writev on Unix and -WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
    +WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
       int vsize;
       ErlDrvSizeT size;
       SysIOVec* iov;
       ErlDrvBinary** binv;
    -} ErlIOVec;

    The I/O vector used by the emulator and drivers is a list of binaries, with a +} 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 callback. Also, the driver queue is an ErlIOVec.

  • ErlDrvMonitor - When a driver creates a monitor for a process, a @@ -485,8 +485,8 @@

    add_driver_entry()

    -
    void add_driver_entry(ErlDrvEntry
    -        *de);

    Adds a driver entry to the list of drivers known by Erlang. The +

    void add_driver_entry(ErlDrvEntry
    +        *de);

    Adds a driver entry to the list of drivers known by Erlang. The init function of parameter de is called.

    Note

    To use this function for adding drivers residing in dynamically loaded code is dangerous. If the driver code for the added driver resides in the same dynamically loaded module (that is, .so file) as a normal dynamically loaded @@ -498,7 +498,7 @@

    driver_alloc()

    -
    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This +

    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This fails only on out of memory, in which case NULL is returned. (This is most often a wrapper for malloc).

    Memory allocated must be explicitly freed with a corresponding call to driver_free (unless otherwise stated).

    This function is thread-safe.

    @@ -507,7 +507,7 @@

    driver_alloc_binary()

    -
    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and +

    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and returns a pointer to it, or NULL on failure (out of memory). When a driver binary has been sent to the emulator, it must not be changed. Every allocated binary is to be freed by a corresponding call to @@ -521,9 +521,9 @@

    driver_async()

    -
    long driver_async(ErlDrvPort port, unsigned
    -        int* key, void (*async_invoke)(void*), void* async_data, void
    -        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a +

    long driver_async(ErlDrvPort port, unsigned
    +        int* key, void (*async_invoke)(void*), void* async_data, void
    +        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a thread separate from the emulator thread. This enables the driver to perform time-consuming, blocking operations without blocking the emulator.

    The async thread pool size can be set with command-line argument +A in erl(1). If an async @@ -555,7 +555,7 @@

    driver_async_port_key()

    -
    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. +

    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. The keys are evenly distributed so that a fair mapping between port IDs and async thread IDs is achieved.

    Note

    Before Erlang/OTP R16, the port ID could be used as a key with proper casting, but after the rewrite of the port subsystem, this is no longer the case. With @@ -566,7 +566,7 @@

    driver_binary_dec_refc()

    -
    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached +

    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached after the decrement.

    This function is thread-safe.

    Note

    The reference count of driver binary is normally to be decremented by calling driver_free_binary.

    driver_binary_dec_refc does not free the binary if the reference count reaches zero. Only use driver_binary_dec_refc when you are sure not to @@ -576,21 +576,21 @@

    driver_binary_get_refc()

    -
    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    +
    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    driver_binary_inc_refc()

    -
    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached +

    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached after the increment.

    This function is thread-safe.

    driver_caller()

    -
    ErlDrvTermData driver_caller(ErlDrvPort
    -        port);

    Returns the process ID of the process that made the current call to the driver. +

    ErlDrvTermData driver_caller(ErlDrvPort
    +        port);

    Returns the process ID of the process that made the current call to the driver. The process ID can be used with driver_send_term to send back data to the caller. driver_caller only returns valid data when currently executing in one @@ -603,14 +603,14 @@

    driver_cancel_timer()

    -
    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    +
    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    driver_compare_monitors()

    -
    int driver_compare_monitors(const ErlDrvMonitor
    -        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order +

    int driver_compare_monitors(const ErlDrvMonitor
    +        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order on monitors, for whatever reason.

    Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < monitor2, and > 0 if monitor1 > monitor2.

    @@ -618,16 +618,16 @@

    driver_connected()

    -
    ErlDrvTermData driver_connected(ErlDrvPort
    -        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    +
    ErlDrvTermData driver_connected(ErlDrvPort
    +        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    driver_create_port()

    -
    ErlDrvPort driver_create_port(ErlDrvPort port,
    +
    ErlDrvPort driver_create_port(ErlDrvPort port,
             ErlDrvTermData owner_pid, char* name,
    -        ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new + ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new port.

    • port - The port handle of the port (driver instance) creating the new port.

    • owner_pid - The process ID of the Erlang process to become owner of the new port. This process will be linked to the new port. You usually want to use @@ -648,15 +648,15 @@

      driver_demonitor_process()

      -
      int driver_demonitor_process(ErlDrvPort port,
      -        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      +
      int driver_demonitor_process(ErlDrvPort port,
      +        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      driver_deq()

      -
      ErlDrvSizeT driver_deq(ErlDrvPort port,
      -        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size +

      ErlDrvSizeT driver_deq(ErlDrvPort port,
      +        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size bytes. The data in the queue is deallocated.

      Returns the number of bytes remaining in the queue on success, otherwise -1.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -665,8 +665,8 @@

      driver_enq()

      -
      int driver_enq(ErlDrvPort port, char* buf,
      -        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and +

      int driver_enq(ErlDrvPort port, char* buf,
      +        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and placed at the end of the driver queue. The driver queue is normally used in a FIFO way.

      The driver queue is available to queue output from the emulator to the driver (data from the driver to the emulator is queued by the emulator in normal Erlang @@ -681,8 +681,8 @@

      driver_enq_bin()

      -
      int driver_enq_bin(ErlDrvPort port,
      -        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with +

      int driver_enq_bin(ErlDrvPort port,
      +        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with length len is placed at the end of the queue. This function is most often faster than driver_enq, because no data must be copied.

      This function can be called from any thread if a @@ -693,8 +693,8 @@

      driver_enqv()

      -
      int driver_enqv(ErlDrvPort port, ErlIOVec *ev,
      -        ErlDrvSizeT skip);

      Enqueues the data in ev, skipping the first skip bytes of it, at the end of +

      int driver_enqv(ErlDrvPort port, ErlIOVec *ev,
      +        ErlDrvSizeT skip);

      Enqueues the data in ev, skipping the first skip bytes of it, at the end of the driver queue. It is faster than driver_enq, because no data must be copied.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -716,10 +716,10 @@

      driver_failure_posix()

      -
      int driver_failure(ErlDrvPort port, int
      -        error);
      int driver_failure_atom(ErlDrvPort port, char
      -        *string);
      int driver_failure_posix(ErlDrvPort port, int
      -        error);

      Signals to Erlang that the driver has encountered an error and is to be closed. +

      int driver_failure(ErlDrvPort port, int
      +        error);
      int driver_failure_atom(ErlDrvPort port, char
      +        *string);
      int driver_failure_posix(ErlDrvPort port, int
      +        error);

      Signals to Erlang that the driver has encountered an error and is to be closed. The port is closed and the tuple {'EXIT', error, Err} is sent to the port owner process, where error is an error atom (driver_failure_atom and driver_failure_posix) or an integer (driver_failure).

      The driver is to fail only when in severe error situations, when the driver @@ -731,8 +731,8 @@

      driver_failure_eof()

      -
      int driver_failure_eof(ErlDrvPort
      -        port);

      Signals to Erlang that the driver has encountered an EOF and is to be closed, +

      int driver_failure_eof(ErlDrvPort
      +        port);

      Signals to Erlang that the driver has encountered an EOF and is to be closed, unless the port was opened with option eof, in which case eof is sent to the port. Otherwise the port is closed and an 'EXIT' message is sent to the port owner process.

      The return value is 0.

      @@ -741,7 +741,7 @@

      driver_free()

      -
      void driver_free(void *ptr);

      Frees the memory pointed to by ptr. The memory is to have been allocated with +

      void driver_free(void *ptr);

      Frees the memory pointed to by ptr. The memory is to have been allocated with driver_alloc. All allocated memory is to be deallocated, only once. There is no garbage collection in drivers.

      This function is thread-safe.

      @@ -749,7 +749,7 @@

      driver_free_binary()

      -
      void driver_free_binary(ErlDrvBinary *bin);

      Frees a driver binary bin, allocated previously with +

      void driver_free_binary(ErlDrvBinary *bin);

      Frees a driver binary bin, allocated previously with driver_alloc_binary. As binaries in Erlang are reference counted, the binary can still be around.

      This function is thread-safe.

      @@ -757,8 +757,8 @@

      driver_get_monitored_process()

      -
      ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const
      -        ErlDrvMonitor *monitor);

      Returns the process ID associated with a living monitor. It can be used in the +

      ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const
      +        ErlDrvMonitor *monitor);

      Returns the process ID associated with a living monitor. It can be used in the process_exit callback to get the process identification for the exiting process.

      Returns driver_term_nil if the monitor no longer exists.

      @@ -766,7 +766,7 @@

      driver_get_now()

      -
      int driver_get_now(ErlDrvNowData *now);

      Warning

      This function is deprecated. Do not use it. Use +

      int driver_get_now(ErlDrvNowData *now);

      Warning

      This function is deprecated. Do not use it. Use erl_drv_monotonic_time (perhaps in combination with erl_drv_time_offset) instead.

      Reads a time stamp into the memory pointed to by parameter now. For @@ -778,8 +778,8 @@

      driver_lock_driver()

      -
      int driver_lock_driver(ErlDrvPort
      -        port);

      Locks the driver used by the port port in memory for the rest of the emulator +

      int driver_lock_driver(ErlDrvPort
      +        port);

      Locks the driver used by the port port in memory for the rest of the emulator process' lifetime. After this call, the driver behaves as one of Erlang's statically linked-in drivers.

      @@ -787,8 +787,8 @@

      driver_mk_atom()

      -
      ErlDrvTermData driver_mk_atom(char*
      -        string);

      Returns an atom given a name string. The atom is created and does not change, +

      ErlDrvTermData driver_mk_atom(char*
      +        string);

      Returns an atom given a name string. The atom is created and does not change, so the return value can be saved and reused, which is faster than looking up the atom several times.

      Notice that this function is not thread-safe.

      @@ -796,8 +796,8 @@

      driver_mk_port()

      -
      ErlDrvTermData driver_mk_port(ErlDrvPort
      -        port);

      Converts a port handle to the Erlang term format, usable in +

      ErlDrvTermData driver_mk_port(ErlDrvPort
      +        port);

      Converts a port handle to the Erlang term format, usable in erl_drv_output_term and erl_drv_send_term.

      Notice that this function is not thread-safe.

      @@ -805,8 +805,8 @@

      driver_monitor_process()

      -
      int driver_monitor_process(ErlDrvPort port,
      -        ErlDrvTermData process, ErlDrvMonitor *monitor);

      Starts monitoring a process from a driver. When a process is monitored, a +

      int driver_monitor_process(ErlDrvPort port,
      +        ErlDrvTermData process, ErlDrvMonitor *monitor);

      Starts monitoring a process from a driver. When a process is monitored, a process exit results in a call to the provided process_exit callback in the ErlDrvEntry structure. The ErlDrvMonitor structure is @@ -819,8 +819,8 @@

      driver_output()

      -
      int driver_output(ErlDrvPort port, char *buf,
      -        ErlDrvSizeT len);

      Sends data from the driver up to the emulator. The data is received as terms or +

      int driver_output(ErlDrvPort port, char *buf,
      +        ErlDrvSizeT len);

      Sends data from the driver up to the emulator. The data is received as terms or binary data, depending on how the driver port was opened.

      The data is queued in the port owner process' message queue. Notice that this does not yield to the emulator (as the driver and the emulator run in the same thread).

      Parameter buf points to the data to send, and len is the number of bytes.

      The return value for all output functions is 0 for normal use. If the driver @@ -830,9 +830,9 @@

      driver_output_binary()

      -
      int driver_output_binary(ErlDrvPort port, char
      +
      int driver_output_binary(ErlDrvPort port, char
               *hbuf, ErlDrvSizeT hlen, ErlDrvBinary* bin, ErlDrvSizeT offset,
      -        ErlDrvSizeT len);

      Sends data to a port owner process from a driver binary. It has a header buffer + ErlDrvSizeT len);

      Sends data to a port owner process from a driver binary. It has a header buffer (hbuf and hlen) just like driver_output2. Parameter hbuf can be NULL.

      Parameter offset is an offset into the binary and len is the number of bytes to send.

      Driver binaries are created with @@ -846,8 +846,8 @@

      driver_output_term()

      -
      int driver_output_term(ErlDrvPort port,
      -        ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use +

      int driver_output_term(ErlDrvPort port,
      +        ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use erl_drv_output_terminstead.

      Parameters term and n work as in erl_drv_output_term.

      Notice that this function is not thread-safe.

      @@ -855,8 +855,8 @@

      driver_output2()

      -
      int driver_output2(ErlDrvPort port, char *hbuf,
      -        ErlDrvSizeT hlen, char *buf, ErlDrvSizeT len);

      First sends hbuf (length in hlen) data as a list, regardless of port +

      int driver_output2(ErlDrvPort port, char *hbuf,
      +        ErlDrvSizeT hlen, char *buf, ErlDrvSizeT len);

      First sends hbuf (length in hlen) data as a list, regardless of port settings. Then sends buf as a binary or list. For example, if hlen is 3, the port owner process receives [H1, H2, H3 | T].

      The point of sending data as a list header, is to facilitate matching on the data received.

      The return value is 0 for normal use.

      @@ -865,8 +865,8 @@

      driver_outputv()

      -
      int driver_outputv(ErlDrvPort port, char* hbuf,
      -        ErlDrvSizeT hlen, ErlIOVec *ev, ErlDrvSizeT skip);

      Sends data from an I/O vector, ev, to the port owner process. It has a header +

      int driver_outputv(ErlDrvPort port, char* hbuf,
      +        ErlDrvSizeT hlen, ErlIOVec *ev, ErlDrvSizeT skip);

      Sends data from an I/O vector, ev, to the port owner process. It has a header buffer (hbuf and hlen), just like driver_output2.

      Parameter skip is a number of bytes to skip of the ev vector from the head.

      You get vectors of ErlIOVec type from the driver queue (see below), and the outputv driver entry function. You can also make @@ -878,7 +878,7 @@

      driver_pdl_create()

      -
      ErlDrvPDL driver_pdl_create(ErlDrvPort port);

      Creates a port data lock associated with the port.

      Note

      Once a port data lock has been created, it must be locked during all +

      ErlDrvPDL driver_pdl_create(ErlDrvPort port);

      Creates a port data lock associated with the port.

      Note

      Once a port data lock has been created, it must be locked during all operations on the driver queue of the port.

      Returns a newly created port data lock on success, otherwise NULL. The function fails if port is invalid or if a port data lock already has been associated with the port.

      @@ -887,40 +887,40 @@

      driver_pdl_dec_refc()

      -
      long driver_pdl_dec_refc(ErlDrvPDL
      -        pdl);

      Decrements the reference count of the port data lock passed as argument (pdl).

      The current reference count after the decrement has been performed is returned.

      This function is thread-safe.

      +
      long driver_pdl_dec_refc(ErlDrvPDL
      +        pdl);

      Decrements the reference count of the port data lock passed as argument (pdl).

      The current reference count after the decrement has been performed is returned.

      This function is thread-safe.

      driver_pdl_get_refc()

      -
      long driver_pdl_get_refc(ErlDrvPDL pdl);

      Returns the current reference count of the port data lock passed as argument +

      long driver_pdl_get_refc(ErlDrvPDL pdl);

      Returns the current reference count of the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_pdl_inc_refc()

      -
      long driver_pdl_inc_refc(ErlDrvPDL pdl);

      Increments the reference count of the port data lock passed as argument (pdl).

      The current reference count after the increment has been performed is returned.

      This function is thread-safe.

      +
      long driver_pdl_inc_refc(ErlDrvPDL pdl);

      Increments the reference count of the port data lock passed as argument (pdl).

      The current reference count after the increment has been performed is returned.

      This function is thread-safe.

      driver_pdl_lock()

      -
      void driver_pdl_lock(ErlDrvPDL pdl);

      Locks the port data lock passed as argument (pdl).

      This function is thread-safe.

      +
      void driver_pdl_lock(ErlDrvPDL pdl);

      Locks the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_pdl_unlock()

      -
      void driver_pdl_unlock(ErlDrvPDL pdl);

      Unlocks the port data lock passed as argument (pdl).

      This function is thread-safe.

      +
      void driver_pdl_unlock(ErlDrvPDL pdl);

      Unlocks the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_peekq()

      -
      SysIOVec * driver_peekq(ErlDrvPort port, int
      -        *vlen);

      Retrieves the driver queue as a pointer to an array of SysIOVecs. It also +

      SysIOVec * driver_peekq(ErlDrvPort port, int
      +        *vlen);

      Retrieves the driver queue as a pointer to an array of SysIOVecs. It also returns the number of elements in vlen. This is one of two ways to get data out of the queue.

      Nothing is removed from the queue by this function, that must be done with driver_deq.

      The returned array is suitable to use with the Unix system call writev.

      This function can be called from any thread if a @@ -931,8 +931,8 @@

      driver_peekqv()

      -
      ErlDrvSizeT driver_peekqv(ErlDrvPort port,
      -        ErlIOVec *ev);

      Retrieves the driver queue into a supplied ErlIOVec ev. It also returns the +

      ErlDrvSizeT driver_peekqv(ErlDrvPort port,
      +        ErlIOVec *ev);

      Retrieves the driver queue into a supplied ErlIOVec ev. It also returns the queue size. This is one of two ways to get data out of the queue.

      If ev is NULL, all ones that is -1 type cast to ErlDrvSizeT are returned.

      Nothing is removed from the queue by this function, that must be done with driver_deq.

      This function can be called from any thread if a @@ -943,8 +943,8 @@

      driver_pushq()

      -
      int driver_pushq(ErlDrvPort port, char* buf,
      -        ErlDrvSizeT len);

      Puts data at the head of the driver queue. The data in buf is copied (len +

      int driver_pushq(ErlDrvPort port, char* buf,
      +        ErlDrvSizeT len);

      Puts data at the head of the driver queue. The data in buf is copied (len bytes) and placed at the beginning of the queue.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -953,8 +953,8 @@

      driver_pushq_bin()

      -
      int driver_pushq_bin(ErlDrvPort port,
      -        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Puts data in the binary bin, at offset with length len at the head of the +

      int driver_pushq_bin(ErlDrvPort port,
      +        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Puts data in the binary bin, at offset with length len at the head of the driver queue. It is most often faster than driver_pushq, because no data must be copied.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -964,8 +964,8 @@

      driver_pushqv()

      -
      int driver_pushqv(ErlDrvPort port, ErlIOVec
      -        *ev, ErlDrvSizeT skip);

      Puts the data in ev, skipping the first skip bytes of it, at the head of the +

      int driver_pushqv(ErlDrvPort port, ErlIOVec
      +        *ev, ErlDrvSizeT skip);

      Puts the data in ev, skipping the first skip bytes of it, at the head of the driver queue. It is faster than driver_pushq, because no data must be copied.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -975,15 +975,15 @@

      driver_read_timer()

      -
      int driver_read_timer(ErlDrvPort port, unsigned
      -        long *time_left);

      Reads the current time of a timer, and places the result in time_left. This is +

      int driver_read_timer(ErlDrvPort port, unsigned
      +        long *time_left);

      Reads the current time of a timer, and places the result in time_left. This is the time in milliseconds, before the time-out occurs.

      The return value is 0.

      driver_realloc()

      -
      void * driver_realloc(void *ptr, ErlDrvSizeT size);

      Resizes a memory block, either in place, or by allocating a new block, copying +

      void * driver_realloc(void *ptr, ErlDrvSizeT size);

      Resizes a memory block, either in place, or by allocating a new block, copying the data, and freeing the old block. A pointer is returned to the reallocated memory. On failure (out of memory), NULL is returned. (This is most often a wrapper for realloc.)

      This function is thread-safe.

      @@ -992,15 +992,15 @@

      driver_realloc_binary()

      -
      ErlDrvBinary * driver_realloc_binary(ErlDrvBinary *bin, ErlDrvSizeT size);

      Resizes a driver binary, while keeping the data.

      Returns the resized driver binary on success. Returns NULL on failure (out of +

      ErlDrvBinary * driver_realloc_binary(ErlDrvBinary *bin, ErlDrvSizeT size);

      Resizes a driver binary, while keeping the data.

      Returns the resized driver binary on success. Returns NULL on failure (out of memory).

      This function is thread-safe.

      driver_select()

      -
      int driver_select(ErlDrvPort port, ErlDrvEvent
      -        event, int mode, int on);

      This function is used by drivers to provide the emulator with events to check +

      int driver_select(ErlDrvPort port, ErlDrvEvent
      +        event, int mode, int on);

      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 occurred asynchronously.

      Parameter event identifies an OS-specific event object. On Unix systems, the functions select/poll are used. The event object must be a socket or pipe @@ -1030,8 +1030,8 @@

      driver_send_term()

      -
      int driver_send_term(ErlDrvPort port,
      -        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use +

      int driver_send_term(ErlDrvPort port,
      +        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use erl_drv_send_term instead.

      Note

      The parameters of this function cannot be properly checked by the runtime system when executed by arbitrary threads. This can cause the function not to fail when it should.

      Parameters term and n work as in @@ -1041,8 +1041,8 @@

      driver_set_timer()

      -
      int driver_set_timer(ErlDrvPort port, unsigned
      -        long time);

      Sets a timer on the driver, which will count down and call the driver when it is +

      int driver_set_timer(ErlDrvPort port, unsigned
      +        long time);

      Sets a timer on the driver, which will count down and call the driver when it is timed out. Parameter time is the time in milliseconds before the timer expires.

      When the timer reaches 0 and expires, the driver entry function timeout is called.

      Notice that only one timer exists on each driver instance; setting a new timer @@ -1053,7 +1053,7 @@

      driver_sizeq()

      -
      ErlDrvSizeT driver_sizeq(ErlDrvPort port);

      Returns the number of bytes currently in the driver queue.

      This function can be called from any thread if a +

      ErlDrvSizeT driver_sizeq(ErlDrvPort port);

      Returns the number of bytes currently in the driver queue.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -1061,8 +1061,8 @@

      driver_system_info()

      -
      void driver_system_info(ErlDrvSysInfo
      -        *sys_info_ptr, size_t size);

      Writes information about the Erlang runtime system into the +

      void driver_system_info(ErlDrvSysInfo
      +        *sys_info_ptr, size_t size);

      Writes information about the Erlang runtime system into the ErlDrvSysInfo structure referred to by the first argument. The second argument is to be the size of the ErlDrvSysInfo structure, that is, @@ -1073,8 +1073,8 @@

      driver_vec_to_buf()

      -
      ErlDrvSizeT driver_vec_to_buf(ErlIOVec *ev,
      -        char *buf, ErlDrvSizeT len);

      Collects several segments of data, referenced by ev, by copying them in order +

      ErlDrvSizeT driver_vec_to_buf(ErlIOVec *ev,
      +        char *buf, ErlDrvSizeT len);

      Collects several segments of data, referenced by ev, by copying them in order to the buffer buf, of the size len.

      If the data is to be sent from the driver to the port owner process, it is faster to use driver_outputv.

      The return value is the space left in the buffer, that is, if ev contains less than len bytes it is the difference, and if ev contains len bytes or more, @@ -1085,8 +1085,8 @@

      erl_drv_busy_msgq_limits()

      -
      void erl_drv_busy_msgq_limits(ErlDrvPort port,
      -        ErlDrvSizeT *low, ErlDrvSizeT *high);

      Sets and gets limits that will be used for controlling the busy state of the +

      void erl_drv_busy_msgq_limits(ErlDrvPort port,
      +        ErlDrvSizeT *low, ErlDrvSizeT *high);

      Sets and gets limits that will be used for controlling the busy state of the port message queue.

      The port message queue is set into a busy state when the amount of command data queued on the message queue reaches the high limit. The port message queue is set into a not busy state when the amount of command data queued on the message @@ -1118,16 +1118,16 @@

      erl_drv_cond_broadcast()

      -
      void erl_drv_cond_broadcast(ErlDrvCond
      -        *cnd);

      Broadcasts on a condition variable. That is, if other threads are waiting on the +

      void erl_drv_cond_broadcast(ErlDrvCond
      +        *cnd);

      Broadcasts on a condition variable. That is, if other threads are waiting on the condition variable being broadcast on, all of them are woken.

      cnd is a pointer to a condition variable to broadcast on.

      This function is thread-safe.

      erl_drv_cond_create()

      -
      ErlDrvCond * erl_drv_cond_create(char
      -        *name);

      Creates a condition variable and returns a pointer to it.

      name is a string identifying the created condition variable. It is used to +

      ErlDrvCond * erl_drv_cond_create(char
      +        *name);

      Creates a condition variable and returns a pointer to it.

      name is a string identifying the created condition variable. It is used to identify the condition variable in planned future debug functionality.

      Returns NULL on failure. The driver creating the condition variable is responsible for destroying it before the driver is unloaded.

      This function is thread-safe.

      @@ -1135,31 +1135,31 @@

      erl_drv_cond_destroy()

      -
      void erl_drv_cond_destroy(ErlDrvCond
      -        *cnd);

      Destroys a condition variable previously created by +

      void erl_drv_cond_destroy(ErlDrvCond
      +        *cnd);

      Destroys a condition variable previously created by erl_drv_cond_create.

      cnd is a pointer to a condition variable to destroy.

      This function is thread-safe.

      erl_drv_cond_name()

      -
      char * erl_drv_cond_name(ErlDrvCond
      -        *cnd);

      Returns a pointer to the name of the condition.

      cnd is a pointer to an initialized condition.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      +
      char * erl_drv_cond_name(ErlDrvCond
      +        *cnd);

      Returns a pointer to the name of the condition.

      cnd is a pointer to an initialized condition.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      erl_drv_cond_signal()

      -
      void erl_drv_cond_signal(ErlDrvCond
      -        *cnd);

      Signals on a condition variable. That is, if other threads are waiting on the +

      void erl_drv_cond_signal(ErlDrvCond
      +        *cnd);

      Signals on a condition variable. That is, if other threads are waiting on the condition variable being signaled, one of them is woken.

      cnd is a pointer to a condition variable to signal on.

      This function is thread-safe.

      erl_drv_cond_wait()

      -
      void erl_drv_cond_wait(ErlDrvCond *cnd,
      -        ErlDrvMutex *mtx);

      Waits on a condition variable. The calling thread is blocked until another +

      void erl_drv_cond_wait(ErlDrvCond *cnd,
      +        ErlDrvMutex *mtx);

      Waits on a condition variable. The calling thread is blocked until another thread wakes it by signaling or broadcasting on the condition variable. Before the calling thread is blocked, it unlocks the mutex passed as argument. When the calling thread is woken, it locks the same mutex before returning. That is, the @@ -1175,8 +1175,8 @@

      erl_drv_consume_timeslice()

      -
      int erl_drv_consume_timeslice(ErlDrvPort port,
      -        int percent);

      Gives the runtime system a hint about how much CPU time the current driver +

      int erl_drv_consume_timeslice(ErlDrvPort port,
      +        int percent);

      Gives the runtime system a hint about how much CPU time the current driver callback call has consumed since the last hint, or since the the start of the callback if no previous hint has been given.

      • port - Port handle of the executing port.

      • percent - Approximate consumed fraction of a full time-slice in percent.

      The time is specified as a fraction, in percent, of a full time-slice that a port is allowed to execute before it is to surrender the CPU to other runnable @@ -1199,8 +1199,8 @@

      erl_drv_convert_time_unit()

      -
      ErlDrvTime erl_drv_convert_time_unit(ErlDrvTime
      -        val, ErlDrvTimeUnit from, ErlDrvTimeUnit to);

      Converts the val value of time unit from to the corresponding value of time +

      ErlDrvTime erl_drv_convert_time_unit(ErlDrvTime
      +        val, ErlDrvTimeUnit from, ErlDrvTimeUnit to);

      Converts the val value of time unit from to the corresponding value of time unit to. The result is rounded using the floor function.

      • val - Value to convert time unit for.

      • from - Time unit of val.

      • to - Time unit of returned value.

      Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument.

      See also ErlDrvTime and ErlDrvTimeUnit.

      Available since OTP 18.3

      @@ -1208,8 +1208,8 @@

      erl_drv_equal_tids()

      -
      int erl_drv_equal_tids(ErlDrvTid tid1,
      -        ErlDrvTid tid2);

      Compares two thread identifiers, tid1 and tid2, for equality.

      Returns 0 it they are not equal, and a value not equal to 0 if they are +

      int erl_drv_equal_tids(ErlDrvTid tid1,
      +        ErlDrvTid tid2);

      Compares two thread identifiers, tid1 and tid2, for equality.

      Returns 0 it they are not equal, and a value not equal to 0 if they are equal.

      Note

      A thread identifier can be reused very quickly after a thread has terminated. Therefore, if a thread corresponding to one of the involved thread identifiers has terminated since the thread identifier was saved, the result of @@ -1219,8 +1219,8 @@

      erl_drv_getenv()

      -
      int erl_drv_getenv(const char *key, char
      -        *value, size_t *value_size);

      Retrieves the value of an environment variable.

      • key - A NULL-terminated string containing the name of the environment +

        int erl_drv_getenv(const char *key, char
        +        *value, size_t *value_size);

        Retrieves the value of an environment variable.

        • key - A NULL-terminated string containing the name of the environment variable.

        • value - A pointer to an output buffer.

        • value_size - A pointer to an integer. The integer is used both for passing input and output sizes (see below).

        When this function is called, *value_size is to contain the size of the value buffer.

        On success, 0 is returned, the value of the environment variable has been @@ -1238,8 +1238,8 @@

        erl_drv_init_ack()

        -
        void erl_drv_init_ack(ErlDrvPort port,
        -        ErlDrvData res);

        Acknowledges the start of the port.

        • port - The port handle of the port (driver instance) doing the +

          void erl_drv_init_ack(ErlDrvPort port,
          +        ErlDrvData res);

          Acknowledges the start of the port.

          • port - The port handle of the port (driver instance) doing the acknowledgment.

          • res - The result of the port initialization. Can be the same values as the return value of start, that is, any of the error codes or the ErlDrvData that is to be used for this port.

          When this function is called the initiating erlang:open_port call is returned @@ -1252,7 +1252,7 @@

          erl_drv_monotonic_time()

          -
          ErlDrvTime erl_drv_monotonic_time(ErlDrvTimeUnit time_unit);

          Returns Erlang monotonic time. +

          ErlDrvTime erl_drv_monotonic_time(ErlDrvTimeUnit time_unit);

          Returns Erlang monotonic time. Notice that negative values are not uncommon.

          time_unit is time unit of returned value.

          Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument, or if called from a thread that is not a scheduler thread.

          See also ErlDrvTime and ErlDrvTimeUnit.

          Available since OTP 18.3

          @@ -1261,8 +1261,8 @@

          erl_drv_mutex_create()

          -
          ErlDrvMutex * erl_drv_mutex_create(char
          -        *name);

          Creates a mutex and returns a pointer to it.

          name is a string identifying the created mutex. It is used to identify the +

          ErlDrvMutex * erl_drv_mutex_create(char
          +        *name);

          Creates a mutex and returns a pointer to it.

          name is a string identifying the created mutex. It is used to identify the mutex in debug functionality (see note).

          Returns NULL on failure. The driver creating the mutex is responsible for destroying it before the driver is unloaded.

          This function is thread-safe.

          Note

          One such debug functionality is the lock checker, which can detect locking order violations and thereby potential deadlock bugs. For the lock checker to @@ -1279,8 +1279,8 @@

          erl_drv_mutex_destroy()

          -
          void erl_drv_mutex_destroy(ErlDrvMutex
          -        *mtx);

          Destroys a mutex previously created by +

          void erl_drv_mutex_destroy(ErlDrvMutex
          +        *mtx);

          Destroys a mutex previously created by erl_drv_mutex_create. The mutex must be in an unlocked state before it is destroyed.

          mtx is a pointer to a mutex to destroy.

          This function is thread-safe.

          @@ -1288,8 +1288,8 @@

          erl_drv_mutex_lock()

          -
          void erl_drv_mutex_lock(ErlDrvMutex
          -        *mtx);

          Locks a mutex. The calling thread is blocked until the mutex has been locked. A +

          void erl_drv_mutex_lock(ErlDrvMutex
          +        *mtx);

          Locks a mutex. The calling thread is blocked until the mutex has been locked. A thread that has currently locked the mutex cannot lock the same mutex again.

          mtx is a pointer to a mutex to lock.

          Warning

          If you leave a mutex locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

          This function is thread-safe.

          @@ -1297,15 +1297,15 @@

          erl_drv_mutex_name()

          -
          char * erl_drv_mutex_name(ErlDrvMutex
          -        *mtx);

          Returns a pointer to the mutex name.

          mtx is a pointer to an initialized mutex.

          Note

          This function is intended for debugging purposes only.

          Available since OTP R16B02

          +
          char * erl_drv_mutex_name(ErlDrvMutex
          +        *mtx);

          Returns a pointer to the mutex name.

          mtx is a pointer to an initialized mutex.

          Note

          This function is intended for debugging purposes only.

          Available since OTP R16B02

          erl_drv_mutex_trylock()

          -
          int erl_drv_mutex_trylock(ErlDrvMutex
          -        *mtx);

          Tries to lock a mutex. A thread that has currently locked the mutex cannot try +

          int erl_drv_mutex_trylock(ErlDrvMutex
          +        *mtx);

          Tries to lock a mutex. A thread that has currently locked the mutex cannot try to lock the same mutex again.

          mtx is a pointer to a mutex to try to lock.

          Returns 0 on success, otherwise EBUSY.

          Warning

          If you leave a mutex locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

          This function is thread-safe.

          @@ -1313,15 +1313,15 @@

          erl_drv_mutex_unlock()

          -
          void erl_drv_mutex_unlock(ErlDrvMutex
          -        *mtx);

          Unlocks a mutex. The mutex currently must be locked by the calling thread.

          mtx is a pointer to a mutex to unlock.

          This function is thread-safe.

          +
          void erl_drv_mutex_unlock(ErlDrvMutex
          +        *mtx);

          Unlocks a mutex. The mutex currently must be locked by the calling thread.

          mtx is a pointer to a mutex to unlock.

          This function is thread-safe.

          erl_drv_output_term()

          -
          int erl_drv_output_term(ErlDrvTermData port,
          -        ErlDrvTermData* term, int n);

          Sends data in the special driver term format to the port owner process. This is +

          int erl_drv_output_term(ErlDrvTermData port,
          +        ErlDrvTermData* term, int n);

          Sends data in the special driver term format to the port owner process. This is a fast way to deliver term data from a driver. It needs no binary conversion, so the port owner process receives data as normal Erlang terms. The erl_drv_send_term functions can be used for @@ -1379,20 +1379,20 @@

          concatenating the strings added to a list. The tail must be specified before ERL_DRV_STRING_CONS.

          ERL_DRV_STRING constructs a string, and ends it. (So it is the same as ERL_DRV_NIL followed by ERL_DRV_STRING_CONS.)

          /* to send [x, "abc", y] to the port: */
          -ErlDrvTermData spec[] = {
          -    ERL_DRV_ATOM, driver_mk_atom("x"),
          -    ERL_DRV_STRING, (ErlDrvTermData)"abc", 3,
          -    ERL_DRV_ATOM, driver_mk_atom("y"),
          +ErlDrvTermData spec[] = {
          +    ERL_DRV_ATOM, driver_mk_atom("x"),
          +    ERL_DRV_STRING, (ErlDrvTermData)"abc", 3,
          +    ERL_DRV_ATOM, driver_mk_atom("y"),
               ERL_DRV_NIL,
               ERL_DRV_LIST, 4
          -};
          -erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
          /* to send "abc123" to the port: */
          -ErlDrvTermData spec[] = {
          +};
          +erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
          /* to send "abc123" to the port: */
          +ErlDrvTermData spec[] = {
               ERL_DRV_NIL,        /* with STRING_CONS, the tail comes first */
          -    ERL_DRV_STRING_CONS, (ErlDrvTermData)"123", 3,
          -    ERL_DRV_STRING_CONS, (ErlDrvTermData)"abc", 3,
          -};
          -erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));

          The ERL_DRV_EXT2TERM term type is used for passing + ERL_DRV_STRING_CONS, (ErlDrvTermData)"123", 3, + ERL_DRV_STRING_CONS, (ErlDrvTermData)"abc", 3, +}; +erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));

  • The ERL_DRV_EXT2TERM term type is used for passing a term encoded with the external format, that is, a term that has been encoded by erlang:term_to_binary(), erl_interface:ei(3), and so on. For example, if @@ -1429,8 +1429,8 @@

    erl_drv_putenv()

    -
    int erl_drv_putenv(const char *key, char
    -        *value);

    Sets the value of an environment variable.

    key is a NULL-terminated string containing the name of the environment +

    int erl_drv_putenv(const char *key, char
    +        *value);

    Sets the value of an environment variable.

    key is a NULL-terminated string containing the name of the environment variable.

    value is a NULL-terminated string containing the new value of the environment variable.

    Returns 0 on success, otherwise a value != 0.

    Note

    The result of passing the empty string ("") as a value is platform-dependent. On some platforms the variable value is set to the empty @@ -1444,8 +1444,8 @@

    erl_drv_rwlock_create()

    -
    ErlDrvRWLock * erl_drv_rwlock_create(char
    -        *name);

    Creates an rwlock and returns a pointer to it.

    name is a string identifying the created rwlock. It is used to identify the +

    ErlDrvRWLock * erl_drv_rwlock_create(char
    +        *name);

    Creates an rwlock and returns a pointer to it.

    name is a string identifying the created rwlock. It is used to identify the rwlock in debug functionality (see note about the lock checker).

    Returns NULL on failure. The driver creating the rwlock is responsible for destroying it before the driver is unloaded.

    This function is thread-safe.

    @@ -1454,8 +1454,8 @@

    erl_drv_rwlock_destroy()

    -
    void erl_drv_rwlock_destroy(ErlDrvRWLock
    -        *rwlck);

    Destroys an rwlock previously created by +

    void erl_drv_rwlock_destroy(ErlDrvRWLock
    +        *rwlck);

    Destroys an rwlock previously created by erl_drv_rwlock_create. The rwlock must be in an unlocked state before it is destroyed.

    rwlck is a pointer to an rwlock to destroy.

    This function is thread-safe.

    @@ -1463,15 +1463,15 @@

    erl_drv_rwlock_name()

    -
    char * erl_drv_rwlock_name(ErlDrvRWLock
    -        *rwlck);

    Returns a pointer to the name of the rwlock.

    rwlck is a pointer to an initialized rwlock.

    Note

    This function is intended for debugging purposes only.

    Available since OTP R16B02

    +
    char * erl_drv_rwlock_name(ErlDrvRWLock
    +        *rwlck);

    Returns a pointer to the name of the rwlock.

    rwlck is a pointer to an initialized rwlock.

    Note

    This function is intended for debugging purposes only.

    Available since OTP R16B02

    erl_drv_rwlock_rlock()

    -
    void erl_drv_rwlock_rlock(ErlDrvRWLock
    -        *rwlck);

    Read locks an rwlock. The calling thread is blocked until the rwlock has been +

    void erl_drv_rwlock_rlock(ErlDrvRWLock
    +        *rwlck);

    Read locks an rwlock. The calling thread is blocked until the rwlock has been read locked. A thread that currently has read or read/write locked the rwlock cannot lock the same rwlock again.

    rwlck is a pointer to the rwlock to read lock.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1480,16 +1480,16 @@

    erl_drv_rwlock_runlock()

    -
    void erl_drv_rwlock_runlock(ErlDrvRWLock
    -        *rwlck);

    Read unlocks an rwlock. The rwlock currently must be read locked by the calling +

    void erl_drv_rwlock_runlock(ErlDrvRWLock
    +        *rwlck);

    Read unlocks an rwlock. The rwlock currently must be read locked by the calling thread.

    rwlck is a pointer to an rwlock to read unlock.

    This function is thread-safe.

    erl_drv_rwlock_rwlock()

    -
    void erl_drv_rwlock_rwlock(ErlDrvRWLock
    -        *rwlck);

    Read/write locks an rwlock. The calling thread is blocked until the rwlock has +

    void erl_drv_rwlock_rwlock(ErlDrvRWLock
    +        *rwlck);

    Read/write locks an rwlock. The calling thread is blocked until the rwlock has been read/write locked. A thread that currently has read or read/write locked the rwlock cannot lock the same rwlock again.

    rwlck is a pointer to an rwlock to read/write lock.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1498,16 +1498,16 @@

    erl_drv_rwlock_rwunlock()

    -
    void erl_drv_rwlock_rwunlock(ErlDrvRWLock
    -        *rwlck);

    Read/write unlocks an rwlock. The rwlock currently must be read/write locked by +

    void erl_drv_rwlock_rwunlock(ErlDrvRWLock
    +        *rwlck);

    Read/write unlocks an rwlock. The rwlock currently must be read/write locked by the calling thread.

    rwlck is a pointer to an rwlock to read/write unlock.

    This function is thread-safe.

    erl_drv_rwlock_tryrlock()

    -
    int erl_drv_rwlock_tryrlock(ErlDrvRWLock
    -        *rwlck);

    Tries to read lock an rwlock.

    rwlck is a pointer to an rwlock to try to read lock.

    Returns 0 on success, otherwise EBUSY. A thread that currently has read or +

    int erl_drv_rwlock_tryrlock(ErlDrvRWLock
    +        *rwlck);

    Tries to read lock an rwlock.

    rwlck is a pointer to an rwlock to try to read lock.

    Returns 0 on success, otherwise EBUSY. A thread that currently has read or read/write locked the rwlock cannot try to lock the same rwlock again.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1515,8 +1515,8 @@

    erl_drv_rwlock_tryrwlock()

    -
    int erl_drv_rwlock_tryrwlock(ErlDrvRWLock
    -        *rwlck);

    Tries to read/write lock an rwlock. A thread that currently has read or +

    int erl_drv_rwlock_tryrwlock(ErlDrvRWLock
    +        *rwlck);

    Tries to read/write lock an rwlock. A thread that currently has read or read/write locked the rwlock cannot try to lock the same rwlock again.

    rwlckis pointer to an rwlock to try to read/write lock.

    Returns 0 on success, otherwise EBUSY.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1524,8 +1524,8 @@

    erl_drv_send_term()

    -
    int erl_drv_send_term(ErlDrvTermData port,
    -        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

    This function is the only way for a driver to send data to other processes +

    int erl_drv_send_term(ErlDrvTermData port,
    +        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

    This function is the only way for a driver to send data to other processes than the port owner process. Parameter receiver specifies the process to receive the data.

    Note

    Parameter port is not an ordinary port handle, but a port handle converted using driver_mk_port.

    Parameters port, term, and n work as in @@ -1535,17 +1535,17 @@

    erl_drv_set_os_pid()

    -
    void erl_drv_set_os_pid(ErlDrvPort port,
    -        ErlDrvSInt pid);

    Sets the os_pid seen when doing erlang:port_info/2 on this port.

    port is the port handle of the port (driver instance) to set the pid on. +

    void erl_drv_set_os_pid(ErlDrvPort port,
    +        ErlDrvSInt pid);

    Sets the os_pid seen when doing erlang:port_info/2 on this port.

    port is the port handle of the port (driver instance) to set the pid on. pidis the pid to set.

    Available since OTP 19.0

    erl_drv_thread_create()

    -
    int erl_drv_thread_create(char *name, ErlDrvTid
    -        *tid, void * (*func)(void *), void *arg, ErlDrvThreadOpts
    -        *opts);

    Creates a new thread.

    • name - A string identifying the created thread. It is used to identify +

      int erl_drv_thread_create(char *name, ErlDrvTid
      +        *tid, void * (*func)(void *), void *arg, ErlDrvThreadOpts
      +        *opts);

      Creates a new thread.

      • name - A string identifying the created thread. It is used to identify the thread in planned future debug functionality.

      • tid - A pointer to a thread identifier variable.

      • func - A pointer to a function to execute in the created thread.

      • arg - A pointer to argument to the func function.

      • opts - A pointer to thread options to use or NULL.

      Returns 0 on success, otherwise an errno value is returned to indicate the error. The newly created thread begins executing in the function pointed to by func, and func is passed arg as argument. When erl_drv_thread_create @@ -1570,8 +1570,8 @@

      erl_drv_thread_exit()

      -
      void erl_drv_thread_exit(void
      -        *exit_value);

      Terminates the calling thread with the exit value passed as argument. +

      void erl_drv_thread_exit(void
      +        *exit_value);

      Terminates the calling thread with the exit value passed as argument. exit_value is a pointer to an exit value or NULL.

      You are only allowed to terminate threads created with erl_drv_thread_create.

      The exit value can later be retrieved by another thread through erl_drv_thread_join.

      This function is thread-safe.

      @@ -1580,8 +1580,8 @@

      erl_drv_thread_join()

      -
      int erl_drv_thread_join(ErlDrvTid tid, void
      -        **exit_value);

      Joins the calling thread with another thread, that is, the calling thread is +

      int erl_drv_thread_join(ErlDrvTid tid, void
      +        **exit_value);

      Joins the calling thread with another thread, that is, the calling thread is blocked until the thread identified by tid has terminated.

      tid is the thread identifier of the thread to join. exit_value is a pointer to a pointer to an exit value, or NULL.

      Returns 0 on success, otherwise an errno value is returned to indicate the error.

      A thread can only be joined once. The behavior of joining more than once is @@ -1593,14 +1593,14 @@

      erl_drv_thread_name()

      -
      char * erl_drv_thread_name(ErlDrvTid
      -        tid);

      Returns a pointer to the name of the thread.

      tid is a thread identifier.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      +
      char * erl_drv_thread_name(ErlDrvTid
      +        tid);

      Returns a pointer to the name of the thread.

      tid is a thread identifier.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      erl_drv_thread_opts_create()

      -
      ErlDrvThreadOpts * erl_drv_thread_opts_create(char *name);

      Allocates and initializes a thread option structure.

      name is a string identifying the created thread options. It is used to +

      ErlDrvThreadOpts * erl_drv_thread_opts_create(char *name);

      Allocates and initializes a thread option structure.

      name is a string identifying the created thread options. It is used to identify the thread options in planned future debug functionality.

      Returns NULL on failure. A thread option structure is used for passing options to erl_drv_thread_create. If the structure is not modified before it is passed to @@ -1613,21 +1613,21 @@

      erl_drv_thread_opts_destroy()

      -
      void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts);

      Destroys thread options previously created by +

      void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts);

      Destroys thread options previously created by erl_drv_thread_opts_create.

      opts is a pointer to thread options to destroy.

      This function is thread-safe.

      erl_drv_thread_self()

      -
      ErlDrvTid erl_drv_thread_self(void);

      Returns the thread identifier of the calling thread.

      This function is thread-safe.

      +
      ErlDrvTid erl_drv_thread_self(void);

      Returns the thread identifier of the calling thread.

      This function is thread-safe.

      erl_drv_time_offset()

      -
      ErlDrvTime erl_drv_time_offset(ErlDrvTimeUnit
      -        time_unit);

      Returns the current time offset between +

      ErlDrvTime erl_drv_time_offset(ErlDrvTimeUnit
      +        time_unit);

      Returns the current time offset between Erlang monotonic time and Erlang system time converted into the time_unit passed as argument.

      time_unit is time unit of returned value.

      Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument, or if @@ -1638,15 +1638,15 @@

      erl_drv_tsd_get()

      -
      void * erl_drv_tsd_get(ErlDrvTSDKey
      -        key);

      Returns the thread-specific data associated with key for the calling thread.

      key is a thread-specific data key.

      Returns NULL if no data has been associated with key for the calling thread.

      This function is thread-safe.

      +
      void * erl_drv_tsd_get(ErlDrvTSDKey
      +        key);

      Returns the thread-specific data associated with key for the calling thread.

      key is a thread-specific data key.

      Returns NULL if no data has been associated with key for the calling thread.

      This function is thread-safe.

      erl_drv_tsd_key_create()

      -
      int erl_drv_tsd_key_create(char *name,
      -        ErlDrvTSDKey *key);

      Creates a thread-specific data key.

      name is a string identifying the created key. It is used to identify the key +

      int erl_drv_tsd_key_create(char *name,
      +        ErlDrvTSDKey *key);

      Creates a thread-specific data key.

      name is a string identifying the created key. It is used to identify the key in planned future debug functionality.

      key is a pointer to a thread-specific data key variable.

      Returns 0 on success, otherwise an errno value is returned to indicate the error. The driver creating the key is responsible for destroying it before the driver is unloaded.

      This function is thread-safe.

      @@ -1655,8 +1655,8 @@

      erl_drv_tsd_key_destroy()

      -
      void erl_drv_tsd_key_destroy(ErlDrvTSDKey
      -        key);

      Destroys a thread-specific data key previously created by +

      void erl_drv_tsd_key_destroy(ErlDrvTSDKey
      +        key);

      Destroys a thread-specific data key previously created by erl_drv_tsd_key_create. All thread-specific data using this key in all threads must be cleared (see erl_drv_tsd_set) before the call to @@ -1669,8 +1669,8 @@

      erl_drv_tsd_set()

      -
      void erl_drv_tsd_set(ErlDrvTSDKey key, void
      -        *data);

      Sets thread-specific data associated with key for the calling thread. You are +

      void erl_drv_tsd_set(ErlDrvTSDKey key, void
      +        *data);

      Sets thread-specific data associated with key for the calling thread. You are only allowed to set thread-specific data for threads while they are fully under your control. For example, if you set thread-specific data in a thread calling a driver callback function, it must be cleared, that is, set to NULL, before @@ -1682,7 +1682,7 @@

      erl_errno_id()

      -
      char * erl_errno_id(int error);

      Returns the atom name of the Erlang error, given the error number in error. +

      char * erl_errno_id(int error);

      Returns the atom name of the Erlang error, given the error number in error. The error atoms are einval, enoent, and so on. It can be used to make error terms from the driver.

      @@ -1690,8 +1690,8 @@

      remove_driver_entry()

      -
      int remove_driver_entry(ErlDrvEntry
      -        *de);

      Removes a driver entry de previously added with +

      int remove_driver_entry(ErlDrvEntry
      +        *de);

      Removes a driver entry de previously added with add_driver_entry.

      Driver entries added by the erl_ddll Erlang interface cannot be removed by using this interface.

      @@ -1699,8 +1699,8 @@

      set_busy_port()

      -
      void set_busy_port(ErlDrvPort port, int
      -        on);

      Sets and unsets the busy state of the port. If on is non-zero, the port is set +

      void set_busy_port(ErlDrvPort port, int
      +        on);

      Sets and unsets the busy state of the port. If on is non-zero, the port is set to busy. If it is zero, the port is set to not busy. You typically want to combine this feature with the busy port message queue functionality.

      Processes sending command data to the port are suspended if either the port or @@ -1717,8 +1717,8 @@

      set_port_control_flags()

      -
      void set_port_control_flags(ErlDrvPort port,
      -        int flags);

      Sets flags for how the control driver entry +

      void set_port_control_flags(ErlDrvPort port,
      +        int flags);

      Sets flags for how the control driver entry function will return data to the port owner process. (The control function is called from erlang:port_control/3.)

      Currently there are only two meaningful values for flags: 0 means that data is returned in a list, and PORT_CONTROL_FLAG_BINARY means data is returned as diff --git a/prs/8803/erts-15.0.1/doc/html/erl_ext_dist.html b/prs/8803/erts-15.0.1/doc/html/erl_ext_dist.html index 7c77ba5549596..33d49c5cb6220 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_ext_dist.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_ext_dist.html @@ -440,7 +440,7 @@

      positive and 1 if it is negative. The digits are stored with the least significant byte stored first. To calculate the integer, the following formula can be used:

      B = 256
      -(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

      +(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

    diff --git a/prs/8803/erts-15.0.1/doc/html/erl_nif.html b/prs/8803/erts-15.0.1/doc/html/erl_nif.html index 644f18def1629..67d8e5efae244 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_nif.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_nif.html @@ -155,29 +155,29 @@

    A minimal example of a NIF library can look as follows:

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

    The Erlang module can look as follows:

    -module(niftest).
    +ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

    The Erlang module can look as follows:

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

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
    +hello() ->
    +      erlang:nif_error("NIF library not loaded").

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
     $> erl
     
     1> c(niftest).
    @@ -223,21 +223,21 @@ 

    ERL_NIF_TERM world_atom; -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) -{ - world_atom = enif_make_atom(env, "world"); +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + world_atom = enif_make_atom(env, "world"); return 0; -} +} -static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{ - ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1); - return enif_make_tuple2(env, hello_string, world_atom); -} +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1); + return enif_make_tuple2(env, hello_string, world_atom); +} -static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } }; +static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } }; -ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)

  • Binaries - Terms of type binary are accessed with the help of struct type +ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)

  • Binaries - Terms of type binary are accessed with the help of struct type ErlNifBinary, which contains a pointer (data) to the raw binary data and the length (size) of the data in bytes. Both data and size are read-only and are only to be written using calls to API @@ -275,19 +275,19 @@

    garbage collector or enif_release_resource). Resource types are uniquely identified by a supplied name string and the name of the implementing module.

    The following is a template example of how to create and return a resource object.

    ERL_NIF_TERM term;
    -MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
    +MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
     
     /* initialize struct ... */
     
    -term = enif_make_resource(env, obj);
    +term = enif_make_resource(env, obj);
     
    -if (keep_a_reference_of_our_own) {
    +if (keep_a_reference_of_our_own) {
         /* store 'obj' in static variable, private data or other resource object */
    -}
    -else {
    -    enif_release_resource(obj);
    +}
    +else {
    +    enif_release_resource(obj);
         /* resource now only owned by "Erlang" */
    -}
    +}
     return term;

    Notice that once enif_make_resource creates the term to return to Erlang, the code can choose to either keep its own native pointer to the allocated struct and release it later, or release it immediately and rely only on the @@ -339,50 +339,50 @@

    libraries can however fail if deprecated features are used.

  • Time Measurement - Support for time measurement in NIF libraries:

  • I/O Queues
    The Erlang nif library contains function for easily working with I/O vectors as used by the unix system call writev. The I/O Queue is not thread safe, so -some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    -               ErlNifIOQueue *q, int fd) {
    +some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    +               ErlNifIOQueue *q, int fd) {
     
         ErlNifIOVec vec, *iovec = &vec;
         SysIOVec *sysiovec;
         int saved_errno;
         int iovcnt, n;
     
    -    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
    +    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
             return -2;
     
    -    if (enif_ioq_size(q) > 0) {
    +    if (enif_ioq_size(q) > 0) {
             /* If the I/O queue contains data we enqueue the iovec and
                then peek the data to write out of the queue. */
    -        if (!enif_ioq_enqv(q, iovec, 0))
    +        if (!enif_ioq_enqv(q, iovec, 0))
                 return -3;
     
    -        sysiovec = enif_ioq_peek(q, &iovcnt);
    -    } else {
    +        sysiovec = enif_ioq_peek(q, &iovcnt);
    +    } else {
             /* If the I/O queue is empty we skip the trip through it. */
             iovcnt = iovec->iovcnt;
             sysiovec = iovec->iov;
    -    }
    +    }
     
         /* Attempt to write the data */
    -    n = writev(fd, sysiovec, iovcnt);
    +    n = writev(fd, sysiovec, iovcnt);
         saved_errno = errno;
     
    -    if (enif_ioq_size(q) == 0) {
    +    if (enif_ioq_size(q) == 0) {
             /* If the I/O queue was initially empty we enqueue any
                remaining data into the queue for writing later. */
    -        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
    +        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
                 return -3;
    -    } else {
    +    } else {
             /* Dequeue any data that was written from the queue. */
    -        if (n > 0 && !enif_ioq_deq(q, n, NULL))
    +        if (n > 0 && !enif_ioq_deq(q, n, NULL))
                 return -4;
    -    }
    +    }
     
         /* return n, which is either number of bytes written or -1 if
            some error happened */
         errno = saved_errno;
         return n;
    -}
  • Long-running NIFs
    As mentioned in the warning text at the beginning of +}

  • Long-running NIFs
    As mentioned in the warning text at the beginning of this manual page, it is of vital importance that a native function returns relatively fast. It is difficult to give an exact maximum amount of time that a native function is allowed to work, but usually a well-behaving native @@ -512,12 +512,12 @@

    with all its terms is valid until you explicitly invalidate it with enif_free_env or enif_send.

  • All contained terms of a list/tuple/map must belong to the same environment as the list/tuple/map itself. Terms can be copied between environments with -enif_make_copy.

  • ErlNifFunc

    typedef struct {
    +enif_make_copy.

  • ErlNifFunc

    typedef struct {
         const char* name;
         unsigned arity;
    -    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
    +    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
         unsigned flags;
    -} ErlNifFunc;

    Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus +} ErlNifFunc;

  • Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus denotes the Nth argument to the NIF. Notice that the argument argc allows for the same C function to implement several Erlang functions with different arity (but probably with the same name).

    • flags - Is 0 for a regular NIF (and so its value can be omitted for @@ -561,25 +561,25 @@

      type. It can be copied, moved in memory, forgotten, and so on.

    • ErlNifResourceType - Each instance of ErlNifResourceType represents a class of memory-managed resource objects that can be garbage collected. Each resource type has a unique name and a -destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
      +destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
           ErlNifResourceDtor* dtor;       // #1 Destructor
           ErlNifResourceStop* stop;       // #2 Select stop
           ErlNifResourceDown* down;       // #3 Monitor down
           int members;
           ErlNifResourceDynCall* dyncall; // #4 Dynamic call
      -} ErlNifResourceTypeInit;

      Initialization structure read by +} ErlNifResourceTypeInit;

    Initialization structure read by enif_open_resource_type_x enif_init_resource_type.

  • ErlNifResourceDtor

    typedef void ErlNifResourceDtor(ErlNifEnv* caller_env, void* obj);

    The function prototype of a resource destructor function.

    The obj argument is a pointer to the resource. The only allowed use for the resource in the destructor is to access its user data one final time. The destructor is guaranteed to be the last callback before the resource is -deallocated.

  • ErlNifResourceDown

    typedef void ErlNifResourceDown(ErlNifEnv* caller_env, void* obj, ErlNifPid* pid, ErlNifMonitor* mon);

    The function prototype of a resource down function, called on the behalf of +deallocated.

  • ErlNifResourceDown

    typedef void ErlNifResourceDown(ErlNifEnv* caller_env, void* obj, ErlNifPid* pid, ErlNifMonitor* mon);

    The function prototype of a resource down function, called on the behalf of enif_monitor_process. obj is the resource, pid is the identity of the monitored process that is exiting, and mon is the identity of the monitor.

  • ErlNifResourceStop

    typedef void ErlNifResourceStop(ErlNifEnv* caller_env, void* obj, ErlNifEvent event, int is_direct_call);

    The function prototype of a resource stop function, called on the behalf of enif_select. obj is the resource, event is OS event, is_direct_call is true if the call is made directly from enif_select or false if it is a scheduled call (potentially from another -thread).

  • ErlNifResourceDynCall

    typedef void ErlNifResourceDynCall(ErlNifEnv* caller_env, void* obj, void* call_data);

    The function prototype of a dynamic resource call function, called by +thread).

  • ErlNifResourceDynCall

    typedef void ErlNifResourceDynCall(ErlNifEnv* caller_env, void* obj, void* call_data);

    The function prototype of a dynamic resource call function, called by enif_dynamic_resource_call. Argument obj is the resource object and call_data is the last argument to enif_dynamic_resource_call passed through.

  • ErlNifCharEncoding

    typedef enum {
    @@ -602,11 +602,11 @@ 

    guarantees the same hash for the same term within one Erlang VM instance.

    It takes 32-bit salt values and generates hashes within 0..2^32-1.

  • ERL_NIF_PHASH2 - Portable hash function that gives the same hash for the same Erlang term regardless of machine architecture and ERTS version.

    It ignores salt values and generates hashes within 0..2^27-1.

    Slower than ERL_NIF_INTERNAL_HASH. It corresponds to erlang:phash2/1.

  • SysIOVec - A system I/O vector, as used by writev on Unix and WSASend on Win32. It is used in ErlNifIOVec and by -enif_ioq_peek.

  • ErlNifIOVec

    typedef struct {
    +enif_ioq_peek.

  • ErlNifIOVec

    typedef struct {
       int iovcnt;
       size_t size;
       SysIOVec* iov;
    -} ErlNifIOVec;

    An I/O vector containing iovcnt SysIOVecs pointing to the data. It is used +} ErlNifIOVec;

  • An I/O vector containing iovcnt SysIOVecs pointing to the data. It is used by enif_inspect_iovec and enif_ioq_enqv.

  • ErlNifIOQueueOpts - Options to configure a ErlNifIOQueue.

    • ERL_NIF_IOQ_NORMAL - Create a normal I/O Queue
  • @@ -615,14 +615,14 @@

    enif_alloc()

    -
    void * enif_alloc(size_t size);

    Allocates memory of size bytes.

    Returns NULL if the allocation fails.

    The returned pointer is suitably aligned for any built-in type that fit in the +

    void * enif_alloc(size_t size);

    Allocates memory of size bytes.

    Returns NULL if the allocation fails.

    The returned pointer is suitably aligned for any built-in type that fit in the allocated memory.

    enif_alloc_binary()

    -
    int enif_alloc_binary(size_t size, ErlNifBinary* bin);

    Allocates a new binary of size size bytes. Initializes the structure pointed +

    int enif_alloc_binary(size_t size, ErlNifBinary* bin);

    Allocates a new binary of size size bytes. Initializes the structure pointed to by bin to refer to the allocated binary. The binary must either be released by enif_release_binary or ownership transferred to an Erlang term with @@ -635,7 +635,7 @@

    enif_alloc_env()

    -
    ErlNifEnv * enif_alloc_env();

    Allocates a new process independent environment. +

    ErlNifEnv * enif_alloc_env();

    Allocates a new process independent environment. The environment can be used to hold terms that are not bound to any process. Such terms can later be copied to a process environment with enif_make_copy or be sent to a process as a @@ -645,18 +645,18 @@

    enif_alloc_resource()

    -
    void * enif_alloc_resource(ErlNifResourceType* type,
    -                           unsigned size);

    Allocates a memory-managed resource object of type type and size size bytes.

    Available since OTP R13B04

    +
    void * enif_alloc_resource(ErlNifResourceType* type,
    +                           unsigned size);

    Allocates a memory-managed resource object of type type and size size bytes.

    Available since OTP R13B04

    enif_binary_to_term()

    -
    size_t enif_binary_to_term(ErlNifEnv *env,
    +
    size_t enif_binary_to_term(ErlNifEnv *env,
                                const unsigned char* data,
     			   size_t size,
     			   ERL_NIF_TERM *term,
    -                           unsigned int opts);

    Creates a term that is the result of decoding the binary data at data, which + unsigned int opts);

    Creates a term that is the result of decoding the binary data at data, which must be encoded according to the Erlang external term format. No more than size bytes are read from data. Argument opts corresponds to the second argument to erlang:binary_to_term/2 and must be either 0 or @@ -669,14 +669,14 @@

    enif_clear_env()

    -
    void enif_clear_env(ErlNifEnv* env);

    Frees all terms in an environment and clears it for reuse. The environment must +

    void enif_clear_env(ErlNifEnv* env);

    Frees all terms in an environment and clears it for reuse. The environment must have been allocated with enif_alloc_env.

    Available since OTP R14B

    enif_compare()

    -
    int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs);

    Returns an integer < 0 if lhs < rhs, 0 if lhs = rhs, and > 0 if +

    int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs);

    Returns an integer < 0 if lhs < rhs, 0 if lhs = rhs, and > 0 if lhs > rhs. Corresponds to the Erlang operators ==, /=, =<, <, >=, and > (but not =:= or =/=).

    Available since OTP R13B04

    @@ -684,8 +684,8 @@

    enif_compare_monitors()

    -
    int enif_compare_monitors(const ErlNifMonitor
    -        *monitor1, const ErlNifMonitor *monitor2);

    Compares two ErlNifMonitors. Can also be used to +

    int enif_compare_monitors(const ErlNifMonitor
    +        *monitor1, const ErlNifMonitor *monitor2);

    Compares two ErlNifMonitors. Can also be used to imply some artificial order on monitors, for whatever reason.

    Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < monitor2, and > 0 if monitor1 > monitor2.

    Available since OTP 20.0

    @@ -693,50 +693,50 @@

    enif_compare_pids()

    -
    int enif_compare_pids(const ErlNifPid *pid1, const ErlNifPid *pid2);

    Compares two ErlNifPid s according to term order.

    Returns 0 if pid1 and pid2 are equal, < 0 if pid1 < pid2, and > 0 +

    int enif_compare_pids(const ErlNifPid *pid1, const ErlNifPid *pid2);

    Compares two ErlNifPid s according to term order.

    Returns 0 if pid1 and pid2 are equal, < 0 if pid1 < pid2, and > 0 if pid1 > pid2.

    Available since OTP 22.0

    enif_cond_broadcast()

    -
    void enif_cond_broadcast(ErlNifCond *cnd);

    Same as erl_drv_cond_broadcast.

    Available since OTP R13B04

    +
    void enif_cond_broadcast(ErlNifCond *cnd);

    Same as erl_drv_cond_broadcast.

    Available since OTP R13B04

    enif_cond_create()

    -
    ErlNifCond * enif_cond_create(char *name);

    Same as erl_drv_cond_create.

    Available since OTP R13B04

    +
    ErlNifCond * enif_cond_create(char *name);

    Same as erl_drv_cond_create.

    Available since OTP R13B04

    enif_cond_destroy()

    -
    void enif_cond_destroy(ErlNifCond *cnd);

    Same as erl_drv_cond_destroy.

    Available since OTP R13B04

    +
    void enif_cond_destroy(ErlNifCond *cnd);

    Same as erl_drv_cond_destroy.

    Available since OTP R13B04

    enif_cond_name()

    -
    char* enif_cond_name(ErlNifCond* cnd);

    Same as erl_drv_cond_name.

    Available since OTP 21.0

    +
    char* enif_cond_name(ErlNifCond* cnd);

    Same as erl_drv_cond_name.

    Available since OTP 21.0

    enif_cond_signal()

    -
    void enif_cond_signal(ErlNifCond *cnd);

    Same as erl_drv_cond_signal.

    Available since OTP R13B04

    +
    void enif_cond_signal(ErlNifCond *cnd);

    Same as erl_drv_cond_signal.

    Available since OTP R13B04

    enif_cond_wait()

    -
    void enif_cond_wait(ErlNifCond *cnd, ErlNifMutex *mtx);

    Same as erl_drv_cond_wait.

    Available since OTP R13B04

    +
    void enif_cond_wait(ErlNifCond *cnd, ErlNifMutex *mtx);

    Same as erl_drv_cond_wait.

    Available since OTP R13B04

    enif_consume_timeslice()

    -
    int enif_consume_timeslice(ErlNifEnv *env, int percent);

    Gives the runtime system a hint about how much CPU time the current NIF call has +

    int enif_consume_timeslice(ErlNifEnv *env, int percent);

    Gives the runtime system a hint about how much CPU time the current NIF call has consumed since the last hint, or since the start of the NIF if no previous hint has been specified. The time is specified as a percent of the timeslice that a process is allowed to execute Erlang code until it can be suspended to give time @@ -758,8 +758,8 @@

    enif_convert_time_unit()

    -
    ErlNifTime enif_convert_time_unit(ErlNifTime
    -        val, ErlNifTimeUnit from, ErlNifTimeUnit to);

    Converts the val value of time unit from to the corresponding value of time +

    ErlNifTime enif_convert_time_unit(ErlNifTime
    +        val, ErlNifTimeUnit from, ErlNifTimeUnit to);

    Converts the val value of time unit from to the corresponding value of time unit to. The result is rounded using the floor function.

    • val - Value to convert time unit for.

    • from - Time unit of val.

    • to - Time unit of returned value.

    Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument.

    See also ErlNifTime and ErlNifTimeUnit.

    Available since OTP 18.3

    @@ -767,7 +767,7 @@

    enif_cpu_time()

    -
    ERL_NIF_TERM enif_cpu_time(ErlNifEnv *);

    Returns the CPU time in the same format as +

    ERL_NIF_TERM enif_cpu_time(ErlNifEnv *);

    Returns the CPU time in the same format as erlang:timestamp(). The CPU time is the time the current logical CPU has spent executing since some arbitrary point in the past. If the OS does not support fetching this value, enif_cpu_time invokes @@ -777,8 +777,8 @@

    enif_demonitor_process()

    -
    int enif_demonitor_process(ErlNifEnv* caller_env,
    -      void* obj, const ErlNifMonitor* mon);

    Cancels a monitor created earlier with +

    int enif_demonitor_process(ErlNifEnv* caller_env,
    +      void* obj, const ErlNifMonitor* mon);

    Cancels a monitor created earlier with enif_monitor_process. Argument obj is a pointer to the resource holding the monitor and *mon identifies the monitor.

    Argument caller_env is the environment of the calling thread (process bound or @@ -790,9 +790,9 @@

    enif_dynamic_resource_call()

    -
    int enif_dynamic_resource_call(ErlNifEnv* caller_env,
    +
    int enif_dynamic_resource_call(ErlNifEnv* caller_env,
     	ERL_NIF_TERM rt_module, ERL_NIF_TERM rt_name, ERL_NIF_TERM resource,
    -	void* call_data);

    Call code of a resource type implemented by another NIF module. The atoms + void* call_data);

    Call code of a resource type implemented by another NIF module. The atoms rt_module and rt_name identifies the resource type to be called. Argument resource identifies a resource object of that type.

    The callback dyncall of the identified resource type will be called with a pointer to the resource objects obj and @@ -807,13 +807,13 @@

    enif_equal_tids()

    -
    int enif_equal_tids(ErlNifTid tid1, ErlNifTid tid2);

    Same as erl_drv_equal_tids.

    Available since OTP R13B04

    +
    int enif_equal_tids(ErlNifTid tid1, ErlNifTid tid2);

    Same as erl_drv_equal_tids.

    Available since OTP R13B04

    enif_fprintf()

    -
    int enif_fprintf(FILE *stream, const char *format, ...);

    Similar to fprintf but this format string also accepts "%T", which formats +

    int enif_fprintf(FILE *stream, const char *format, ...);

    Similar to fprintf but this format string also accepts "%T", which formats Erlang terms of type ERL_NIF_TERM.

    This function is primarily intended for debugging purpose. It is not recommended to print very large terms with %T. The function may change errno, even if successful.

    Available since OTP 21.0

    @@ -822,13 +822,13 @@

    enif_free()

    -
    void enif_free(void* ptr);

    Frees memory allocated by enif_alloc.

    +
    void enif_free(void* ptr);

    Frees memory allocated by enif_alloc.

    enif_free_env()

    -
    void enif_free_env(ErlNifEnv* env);

    Frees an environment allocated with +

    void enif_free_env(ErlNifEnv* env);

    Frees an environment allocated with enif_alloc_env. All terms created in the environment are freed as well.

    Available since OTP R14B

    @@ -836,26 +836,26 @@

    enif_free_iovec()

    -
    void enif_free_iovec(ErlNifIOVec* iov);

    Frees an io vector returned from +

    void enif_free_iovec(ErlNifIOVec* iov);

    Frees an io vector returned from enif_inspect_iovec. This is needed only if a NULL environment is passed to enif_inspect_iovec.

    ErlNifIOVec *iovec = NULL;
     size_t max_elements = 128;
     ERL_NIF_TERM tail;
    -if (!enif_inspect_iovec(NULL, max_elements, term, &tail, &iovec))
    +if (!enif_inspect_iovec(NULL, max_elements, term, &tail, &iovec))
       return 0;
     
     // Do things with the iovec
     
     /* Free the iovector, possibly in another thread or nif function call */
    -enif_free_iovec(iovec);

    Available since OTP 20.1

    +enif_free_iovec(iovec);

    Available since OTP 20.1

    enif_get_atom()

    -
    int enif_get_atom(ErlNifEnv *env, ERL_NIF_TERM
    -        term, char *buf, unsigned size, ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf of size +

    int enif_get_atom(ErlNifEnv *env, ERL_NIF_TERM
    +        term, char *buf, unsigned size, ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf of size size bytes, consisting of the string representation of the atom term with encoding.

    Returns the number of bytes written (including terminating NULL character) or 0 if term is not an atom with maximum length of size-1 bytes in @@ -865,8 +865,8 @@

    enif_get_atom_length()

    -
    int enif_get_atom_length(ErlNifEnv *env,
    -        ERL_NIF_TERM term, unsigned *len, ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL +

    int enif_get_atom_length(ErlNifEnv *env,
    +        ERL_NIF_TERM term, unsigned *len, ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL character) of the atom term with encoding.

    Returns true on success, or false if term is not an atom or if the atom cannot be encoded using encoding.

    Available since OTP R14B

    @@ -874,31 +874,31 @@

    enif_get_double()

    -
    int enif_get_double(ErlNifEnv* env,
    -        ERL_NIF_TERM term, double* dp);

    Sets *dp to the floating-point value of term.

    Returns true on success, or false if term is not a float.

    Available since OTP R13B04

    +
    int enif_get_double(ErlNifEnv* env,
    +        ERL_NIF_TERM term, double* dp);

    Sets *dp to the floating-point value of term.

    Returns true on success, or false if term is not a float.

    Available since OTP R13B04

    enif_get_int()

    -
    int enif_get_int(ErlNifEnv* env, ERL_NIF_TERM
    -        term, int* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside +

    int enif_get_int(ErlNifEnv* env, ERL_NIF_TERM
    +        term, int* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of type int.

    enif_get_int64()

    -
    int enif_get_int64(ErlNifEnv* env, ERL_NIF_TERM
    -        term, ErlNifSInt64* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside +

    int enif_get_int64(ErlNifEnv* env, ERL_NIF_TERM
    +        term, ErlNifSInt64* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of a signed 64-bit integer.

    Available since OTP R14B

    enif_get_local_pid()

    -
    int enif_get_local_pid(ErlNifEnv* env,
    -        ERL_NIF_TERM term, ErlNifPid* pid);

    If term is the pid of a node local process, this function initializes the pid +

    int enif_get_local_pid(ErlNifEnv* env,
    +        ERL_NIF_TERM term, ErlNifPid* pid);

    If term is the pid of a node local process, this function initializes the pid variable *pid from it and returns true. Otherwise returns false. No check is done to see if the process is alive.

    Note

    enif_get_local_pid will return false if argument term is the atom undefined.

    Available since OTP R14B

    @@ -907,8 +907,8 @@

    enif_get_local_port()

    -
    int enif_get_local_port(ErlNifEnv* env,
    -        ERL_NIF_TERM term, ErlNifPort* port_id);

    If term identifies a node local port, this function initializes the port +

    int enif_get_local_port(ErlNifEnv* env,
    +        ERL_NIF_TERM term, ErlNifPort* port_id);

    If term identifies a node local port, this function initializes the port variable *port_id from it and returns true. Otherwise returns false. No check is done to see if the port is alive.

    Available since OTP 19.0

    @@ -916,45 +916,45 @@

    enif_get_list_cell()

    -
    int enif_get_list_cell(ErlNifEnv* env,
    -        ERL_NIF_TERM list, ERL_NIF_TERM* head, ERL_NIF_TERM* tail);

    Sets *head and *tail from list list.

    Returns true on success, or false if it is not a list or the list is empty.

    +
    int enif_get_list_cell(ErlNifEnv* env,
    +        ERL_NIF_TERM list, ERL_NIF_TERM* head, ERL_NIF_TERM* tail);

    Sets *head and *tail from list list.

    Returns true on success, or false if it is not a list or the list is empty.

    enif_get_list_length()

    -
    int enif_get_list_length(ErlNifEnv* env,
    -        ERL_NIF_TERM term, unsigned* len);

    Sets *len to the length of list term.

    Returns true on success, or false if term is not a proper list.

    Available since OTP R14B

    +
    int enif_get_list_length(ErlNifEnv* env,
    +        ERL_NIF_TERM term, unsigned* len);

    Sets *len to the length of list term.

    Returns true on success, or false if term is not a proper list.

    Available since OTP R14B

    enif_get_long()

    -
    int enif_get_long(ErlNifEnv* env, ERL_NIF_TERM
    -        term, long int* ip);

    Sets *ip to the long integer value of term.

    Returns true on success, or false if term is not an integer or is outside +

    int enif_get_long(ErlNifEnv* env, ERL_NIF_TERM
    +        term, long int* ip);

    Sets *ip to the long integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of type long int.

    Available since OTP R13B04

    enif_get_map_size()

    -
    int enif_get_map_size(ErlNifEnv* env,
    -        ERL_NIF_TERM term, size_t *size);

    Sets *size to the number of key-value pairs in the map term.

    Returns true on success, or false if term is not a map.

    Available since OTP 18.0

    +
    int enif_get_map_size(ErlNifEnv* env,
    +        ERL_NIF_TERM term, size_t *size);

    Sets *size to the number of key-value pairs in the map term.

    Returns true on success, or false if term is not a map.

    Available since OTP 18.0

    enif_get_map_value()

    -
    int enif_get_map_value(ErlNifEnv* env,
    -        ERL_NIF_TERM map, ERL_NIF_TERM key, ERL_NIF_TERM* value);

    Sets *value to the value associated with key in the map map.

    Returns true on success, or false if map is not a map or if map does not +

    int enif_get_map_value(ErlNifEnv* env,
    +        ERL_NIF_TERM map, ERL_NIF_TERM key, ERL_NIF_TERM* value);

    Sets *value to the value associated with key in the map map.

    Returns true on success, or false if map is not a map or if map does not contain key.

    Available since OTP 18.0

    enif_get_resource()

    -
    int enif_get_resource(ErlNifEnv* env,
    -        ERL_NIF_TERM term, ErlNifResourceType* type, void** objp);

    Sets *objp to point to the resource object referred to by term.

    Returns true on success, or false if term is not a handle to a resource +

    int enif_get_resource(ErlNifEnv* env,
    +        ERL_NIF_TERM term, ErlNifResourceType* type, void** objp);

    Sets *objp to point to the resource object referred to by term.

    Returns true on success, or false if term is not a handle to a resource object of type type.

    enif_get_resource does not add a reference to the resource object. However, the pointer received in *objp is guaranteed to be valid at least as long as the resource handle term is valid.

    Available since OTP R13B04

    @@ -963,9 +963,9 @@

    enif_get_string()

    -
    int enif_get_string(ErlNifEnv* env,
    +
    int enif_get_string(ErlNifEnv* env,
             ERL_NIF_TERM list, char* buf, unsigned size,
    -        ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf with size + ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf with size size, consisting of the characters in the string list. The characters are written using encoding.

    Returns one of the following:

    • The number of bytes written (including terminating NULL character)
    • -size if the string was truncated because of buffer space
    • 0 if list is not a string that can be encoded with encoding or if size was < 1.

    The written string is always NULL-terminated, unless buffer size is < 1.

    Available since OTP R13B04

    @@ -974,8 +974,8 @@

    enif_get_string_length()

    -
    int enif_get_string_length(ErlNifEnv *env,
    -        ERL_NIF_TERM list, unsigned *len, ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL +

    int enif_get_string_length(ErlNifEnv *env,
    +        ERL_NIF_TERM list, unsigned *len, ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL character) of the string list with encoding.

    Returns true on success, or false if list is not a string that can be encoded with encoding.

    Available since OTP 26.0

    @@ -983,8 +983,8 @@

    enif_get_tuple()

    -
    int enif_get_tuple(ErlNifEnv* env, ERL_NIF_TERM
    -        term, int* arity, const ERL_NIF_TERM** array);

    If term is a tuple, this function sets *array to point to an array +

    int enif_get_tuple(ErlNifEnv* env, ERL_NIF_TERM
    +        term, int* arity, const ERL_NIF_TERM** array);

    If term is a tuple, this function sets *array to point to an array containing the elements of the tuple, and sets *arity to the number of elements. Notice that the array is read-only and (*array)[N-1] is the Nth element of the tuple. *array is undefined if the arity of the tuple is zero.

    Returns true on success, or false if term is not a tuple.

    Available since OTP R13B04

    @@ -993,39 +993,39 @@

    enif_get_uint()

    -
    int enif_get_uint(ErlNifEnv* env, ERL_NIF_TERM
    -        term, unsigned int* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is +

    int enif_get_uint(ErlNifEnv* env, ERL_NIF_TERM
    +        term, unsigned int* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of type unsigned int.

    Available since OTP R13B04

    enif_get_uint64()

    -
    int enif_get_uint64(ErlNifEnv* env,
    -        ERL_NIF_TERM term, ErlNifUInt64* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is +

    int enif_get_uint64(ErlNifEnv* env,
    +        ERL_NIF_TERM term, ErlNifUInt64* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of an unsigned 64-bit integer.

    Available since OTP R14B

    enif_get_ulong()

    -
    int enif_get_ulong(ErlNifEnv* env, ERL_NIF_TERM
    -        term, unsigned long* ip);

    Sets *ip to the unsigned long integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is +

    int enif_get_ulong(ErlNifEnv* env, ERL_NIF_TERM
    +        term, unsigned long* ip);

    Sets *ip to the unsigned long integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of type unsigned long.

    enif_getenv()

    -
    int enif_getenv(const char* key, char* value,
    -        size_t *value_size);

    Same as erl_drv_getenv.

    Available since OTP 18.2

    +
    int enif_getenv(const char* key, char* value,
    +        size_t *value_size);

    Same as erl_drv_getenv.

    Available since OTP 18.2

    enif_has_pending_exception()

    -
    int enif_has_pending_exception(ErlNifEnv* env,
    -        ERL_NIF_TERM* reason);

    Returns true if a pending exception is associated with the environment env. +

    int enif_has_pending_exception(ErlNifEnv* env,
    +        ERL_NIF_TERM* reason);

    Returns true if a pending exception is associated with the environment env. If reason is a NULL pointer, ignore it. Otherwise, if a pending exception associated with env exists, set *reason to the value of the exception term. For example, if enif_make_badarg is called to @@ -1038,23 +1038,23 @@

    enif_hash()

    -
    ErlNifUInt64 enif_hash(ErlNifHash type, ERL_NIF_TERM term, ErlNifUInt64 salt);

    Hashes term according to the specified ErlNifHash +

    ErlNifUInt64 enif_hash(ErlNifHash type, ERL_NIF_TERM term, ErlNifUInt64 salt);

    Hashes term according to the specified ErlNifHash type.

    Ranges of taken salt (if any) and returned value depend on the hash type.

    Available since OTP 20.0

    enif_inspect_binary()

    -
    int enif_inspect_binary(ErlNifEnv* env,
    -        ERL_NIF_TERM bin_term, ErlNifBinary* bin);

    Initializes the structure pointed to by bin with information about binary term +

    int enif_inspect_binary(ErlNifEnv* env,
    +        ERL_NIF_TERM bin_term, ErlNifBinary* bin);

    Initializes the structure pointed to by bin with information about binary term bin_term.

    Returns true on success, or false if bin_term is not a binary.

    enif_inspect_iolist_as_binary()

    -
    int enif_inspect_iolist_as_binary(ErlNifEnv*
    -        env, ERL_NIF_TERM term, ErlNifBinary* bin);

    Initializes the structure pointed to by bin with a continuous buffer with the +

    int enif_inspect_iolist_as_binary(ErlNifEnv*
    +        env, ERL_NIF_TERM term, ErlNifBinary* bin);

    Initializes the structure pointed to by bin with a continuous buffer with the same byte content as iolist. As with inspect_binary, the data pointed to by bin is transient and does not need to be released.

    Returns true on success, or false if iolist is not an iolist.

    Available since OTP R13B04

    @@ -1062,20 +1062,20 @@

    enif_inspect_iovec()

    -
    int enif_inspect_iovec(ErlNifEnv*
    +
    int enif_inspect_iovec(ErlNifEnv*
             env, size_t max_elements, ERL_NIF_TERM iovec_term, ERL_NIF_TERM* tail,
    -        ErlNifIOVec** iovec);

    Fills iovec with the list of binaries provided in iovec_term. The number of + ErlNifIOVec** iovec);

    Fills iovec with the list of binaries provided in iovec_term. The number of elements handled in the call is limited to max_elements, and tail is set to the remainder of the list. Note that the output may be longer than max_elements on some platforms.

    To create a list of binaries from an arbitrary iolist, use erlang:iolist_to_iovec/1.

    When calling this function, iovec should contain a pointer to NULL or a ErlNifIOVec structure that should be used if possible. e.g.

    /* Don't use a pre-allocated structure */
     ErlNifIOVec *iovec = NULL;
    -enif_inspect_iovec(env, max_elements, term, &tail, &iovec);
    +enif_inspect_iovec(env, max_elements, term, &tail, &iovec);
     
     /* Use a stack-allocated vector as an optimization for vectors with few elements */
     ErlNifIOVec vec, *iovec = &vec;
    -enif_inspect_iovec(env, max_elements, term, &tail, &iovec);

    The contents of the iovec is valid until the called nif function returns. If +enif_inspect_iovec(env, max_elements, term, &tail, &iovec);

    The contents of the iovec is valid until the called nif function returns. If the iovec should be valid after the nif call returns, it is possible to call this function with a NULL environment. If no environment is given the iovec owns the data in the vector and it has to be explicitly freed using @@ -1085,20 +1085,20 @@

    enif_ioq_create()

    -
    ErlNifIOQueue * enif_ioq_create(ErlNifIOQueueOpts opts);

    Create a new I/O Queue that can be used to store data. opts has to be set to +

    ErlNifIOQueue * enif_ioq_create(ErlNifIOQueueOpts opts);

    Create a new I/O Queue that can be used to store data. opts has to be set to ERL_NIF_IOQ_NORMAL.

    Available since OTP 20.1

    enif_ioq_destroy()

    -
    void enif_ioq_destroy(ErlNifIOQueue *q);

    Destroy the I/O queue and free all of it's contents

    Available since OTP 20.1

    +
    void enif_ioq_destroy(ErlNifIOQueue *q);

    Destroy the I/O queue and free all of it's contents

    Available since OTP 20.1

    enif_ioq_deq()

    -
    int enif_ioq_deq(ErlNifIOQueue *q, size_t count, size_t *size);

    Dequeue count bytes from the I/O queue. If size is not NULL, the new size +

    int enif_ioq_deq(ErlNifIOQueue *q, size_t count, size_t *size);

    Dequeue count bytes from the I/O queue. If size is not NULL, the new size of the queue is placed there.

    Returns true on success, or false if the I/O does not contain count bytes. On failure the queue is left un-altered.

    Available since OTP 20.1

    @@ -1106,7 +1106,7 @@

    enif_ioq_enq_binary()

    -
    int enif_ioq_enq_binary(ErlNifIOQueue *q, ErlNifBinary *bin, size_t skip);

    Enqueue the bin into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of +

    int enif_ioq_enq_binary(ErlNifIOQueue *q, ErlNifBinary *bin, size_t skip);

    Enqueue the bin into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of bin. Any ownership of the binary data is transferred to the queue and bin is to be considered read-only for the rest of the NIF call and then as released.

    Available since OTP 20.1

    @@ -1114,14 +1114,14 @@

    enif_ioq_enqv()

    -
    int enif_ioq_enqv(ErlNifIOQueue *q, ErlNifIOVec *iovec, size_t skip);

    Enqueue the iovec into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of +

    int enif_ioq_enqv(ErlNifIOQueue *q, ErlNifIOVec *iovec, size_t skip);

    Enqueue the iovec into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of iovec.

    Available since OTP 20.1

    enif_ioq_peek()

    -
    SysIOVec * enif_ioq_peek(ErlNifIOQueue *q, int *iovlen);

    Get the I/O queue as a pointer to an array of SysIOVecs. It also returns the +

    SysIOVec * enif_ioq_peek(ErlNifIOQueue *q, int *iovlen);

    Get the I/O queue as a pointer to an array of SysIOVecs. It also returns the number of elements in iovlen.

    Nothing is removed from the queue by this function, that must be done with enif_ioq_deq.

    The returned array is suitable to use with the Unix system call writev.

    Available since OTP 20.1

    @@ -1129,32 +1129,32 @@

    enif_ioq_peek_head()

    -
    int enif_ioq_peek_head(ErlNifEnv *env, ErlNifIOQueue *q, size_t *size, ERL_NIF_TERM *bin_term);

    Get the head of the IO Queue as a binary term.

    If size is not NULL, the size of the head is placed there.

    Nothing is removed from the queue by this function, that must be done with +

    int enif_ioq_peek_head(ErlNifEnv *env, ErlNifIOQueue *q, size_t *size, ERL_NIF_TERM *bin_term);

    Get the head of the IO Queue as a binary term.

    If size is not NULL, the size of the head is placed there.

    Nothing is removed from the queue by this function, that must be done with enif_ioq_deq.

    Returns true on success, or false if the queue is empty.

    Available since OTP 21.0

    enif_ioq_size()

    -
    size_t enif_ioq_size(ErlNifIOQueue *q);

    Get the size of q.

    Available since OTP 20.1

    +
    size_t enif_ioq_size(ErlNifIOQueue *q);

    Get the size of q.

    Available since OTP 20.1

    enif_is_atom()

    -
    int enif_is_atom(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is an atom.

    Available since OTP R13B04

    +
    int enif_is_atom(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is an atom.

    Available since OTP R13B04

    enif_is_binary()

    -
    int enif_is_binary(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a binary.

    +
    int enif_is_binary(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a binary.

    enif_is_current_process_alive()

    -
    int enif_is_current_process_alive(ErlNifEnv* env);

    Returns true if the currently executing process is currently alive, otherwise +

    int enif_is_current_process_alive(ErlNifEnv* env);

    Returns true if the currently executing process is currently alive, otherwise false.

    This function can only be used from a NIF-calling thread, and with an environment corresponding to currently executing processes.

    Available since OTP 19.0

    @@ -1162,101 +1162,101 @@

    enif_is_empty_list()

    -
    int enif_is_empty_list(ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is an empty list.

    Available since OTP R13B04

    +
    int enif_is_empty_list(ErlNifEnv* env,
    +        ERL_NIF_TERM term);

    Returns true if term is an empty list.

    Available since OTP R13B04

    enif_is_exception()

    -
    int enif_is_exception(ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Return true if term is an exception.

    Available since OTP R14B03

    +
    int enif_is_exception(ErlNifEnv* env,
    +        ERL_NIF_TERM term);

    Return true if term is an exception.

    Available since OTP R14B03

    enif_is_fun()

    -
    int enif_is_fun(ErlNifEnv* env, ERL_NIF_TERM
    -        term);

    Returns true if term is a fun.

    Available since OTP R13B04

    +
    int enif_is_fun(ErlNifEnv* env, ERL_NIF_TERM
    +        term);

    Returns true if term is a fun.

    Available since OTP R13B04

    enif_is_identical()

    -
    int enif_is_identical(ERL_NIF_TERM lhs,
    -        ERL_NIF_TERM rhs);

    Returns true if the two terms are identical. Corresponds to the Erlang +

    int enif_is_identical(ERL_NIF_TERM lhs,
    +        ERL_NIF_TERM rhs);

    Returns true if the two terms are identical. Corresponds to the Erlang operators =:= and =/=.

    Available since OTP R13B04

    enif_is_list()

    -
    int enif_is_list(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a list.

    Available since OTP R14B

    +
    int enif_is_list(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a list.

    Available since OTP R14B

    enif_is_map()

    -
    int enif_is_map(ErlNifEnv* env, ERL_NIF_TERM
    -        term);

    Returns true if term is a map, otherwise false.

    Available since OTP 18.0

    +
    int enif_is_map(ErlNifEnv* env, ERL_NIF_TERM
    +        term);

    Returns true if term is a map, otherwise false.

    Available since OTP 18.0

    enif_is_number()

    -
    int enif_is_number(ErlNifEnv* env, ERL_NIF_TERM
    -        term);

    Returns true if term is a number.

    Available since OTP R15B

    +
    int enif_is_number(ErlNifEnv* env, ERL_NIF_TERM
    +        term);

    Returns true if term is a number.

    Available since OTP R15B

    enif_is_pid()

    -
    int enif_is_pid(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a pid.

    Available since OTP R13B04

    +
    int enif_is_pid(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a pid.

    Available since OTP R13B04

    enif_is_pid_undefined()

    -
    int enif_is_pid_undefined(const ErlNifPid* pid);

    Returns true if pid has been set as undefined by +

    int enif_is_pid_undefined(const ErlNifPid* pid);

    Returns true if pid has been set as undefined by enif_set_pid_undefined .

    Available since OTP 22.0

    enif_is_port()

    -
    int enif_is_port(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a port.

    Available since OTP R13B04

    +
    int enif_is_port(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a port.

    Available since OTP R13B04

    enif_is_port_alive()

    -
    int enif_is_port_alive(ErlNifEnv* env,
    -        ErlNifPort *port_id);

    Returns true if port_id is alive.

    This function is thread-safe.

    Available since OTP 19.0

    +
    int enif_is_port_alive(ErlNifEnv* env,
    +        ErlNifPort *port_id);

    Returns true if port_id is alive.

    This function is thread-safe.

    Available since OTP 19.0

    enif_is_process_alive()

    -
    int enif_is_process_alive(ErlNifEnv* env,
    -        ErlNifPid *pid);

    Returns true if pid is alive.

    This function is thread-safe.

    Available since OTP 19.0

    +
    int enif_is_process_alive(ErlNifEnv* env,
    +        ErlNifPid *pid);

    Returns true if pid is alive.

    This function is thread-safe.

    Available since OTP 19.0

    enif_is_ref()

    -
    int enif_is_ref(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a reference.

    Available since OTP R13B04

    +
    int enif_is_ref(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a reference.

    Available since OTP R13B04

    enif_is_tuple()

    -
    int enif_is_tuple(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a tuple.

    Available since OTP R14B

    +
    int enif_is_tuple(ErlNifEnv* env, ERL_NIF_TERM term);

    Returns true if term is a tuple.

    Available since OTP R14B

    enif_keep_resource()

    -
    int enif_keep_resource(void* obj);

    Adds a reference to resource object obj obtained from +

    int enif_keep_resource(void* obj);

    Adds a reference to resource object obj obtained from enif_alloc_resource. Each call to enif_keep_resource for an object must be balanced by a call to enif_release_resource before the object is @@ -1266,7 +1266,7 @@

    enif_make_atom()

    -
    ERL_NIF_TERM enif_make_atom(ErlNifEnv *env, const char *name);

    Creates an atom term from the NULL-terminated C-string name with ISO +

    ERL_NIF_TERM enif_make_atom(ErlNifEnv *env, const char *name);

    Creates an atom term from the NULL-terminated C-string name with ISO Latin-1 encoding. If the length of name exceeds the maximum length allowed for an atom (255 characters), enif_make_atom invokes enif_make_badarg.

    @@ -1275,8 +1275,8 @@

    enif_make_atom_len()

    -
    ERL_NIF_TERM enif_make_atom_len(ErlNifEnv *env,
    -        const char *name, size_t len);

    Create an atom term from the string name with length len and ISO Latin-1 +

    ERL_NIF_TERM enif_make_atom_len(ErlNifEnv *env,
    +        const char *name, size_t len);

    Create an atom term from the string name with length len and ISO Latin-1 encoding. NULL characters are treated as any other characters. If len exceeds the maximum length allowed for an atom (255 characters), enif_make_atom invokes enif_make_badarg .

    Available since OTP R14B

    @@ -1285,7 +1285,7 @@

    enif_make_badarg()

    -
    ERL_NIF_TERM enif_make_badarg(ErlNifEnv* env);

    Makes a badarg exception to be returned from a NIF, and associates it with +

    ERL_NIF_TERM enif_make_badarg(ErlNifEnv* env);

    Makes a badarg exception to be returned from a NIF, and associates it with environment env. Once a NIF or any function it calls invokes enif_make_badarg, the runtime ensures that a badarg exception is raised when the NIF returns, even if the NIF attempts to return a non-exception term @@ -1301,7 +1301,7 @@

    enif_make_binary()

    -
    ERL_NIF_TERM enif_make_binary(ErlNifEnv* env, ErlNifBinary* bin);

    Makes a binary term from bin. Any ownership of the binary data is transferred +

    ERL_NIF_TERM enif_make_binary(ErlNifEnv* env, ErlNifBinary* bin);

    Makes a binary term from bin. Any ownership of the binary data is transferred to the created term and bin is to be considered read-only for the rest of the NIF call and then as released.

    @@ -1309,15 +1309,15 @@

    enif_make_copy()

    -
    ERL_NIF_TERM enif_make_copy(ErlNifEnv* dst_env,
    -        ERL_NIF_TERM src_term);

    Makes a copy of term src_term. The copy is created in environment dst_env. +

    ERL_NIF_TERM enif_make_copy(ErlNifEnv* dst_env,
    +        ERL_NIF_TERM src_term);

    Makes a copy of term src_term. The copy is created in environment dst_env. The source term can be located in any environment.

    Available since OTP R14B

    enif_make_double()

    -
    ERL_NIF_TERM enif_make_double(ErlNifEnv* env, double d);

    Creates a floating-point term from a double. If argument double is not +

    ERL_NIF_TERM enif_make_double(ErlNifEnv* env, double d);

    Creates a floating-point term from a double. If argument double is not finite or is NaN, enif_make_double invokes enif_make_badarg.

    Available since OTP R13B04

    @@ -1325,9 +1325,9 @@

    enif_make_existing_atom()

    -
    int enif_make_existing_atom(ErlNifEnv *env,
    +
    int enif_make_existing_atom(ErlNifEnv *env,
             const char *name, ERL_NIF_TERM *atom, ErlNifCharEncoding
    -        encoding);

    Tries to create the term of an already existing atom from the NULL-terminated + encoding);

    Tries to create the term of an already existing atom from the NULL-terminated C-string name with encoding.

    If the atom already exists, this function stores the term in *atom and returns true, otherwise returns false. It also returns false if the string name exceeds the maximum length allowed for an atom (255 characters) or if name is @@ -1337,9 +1337,9 @@

    enif_make_existing_atom_len()

    -
    int enif_make_existing_atom_len(ErlNifEnv *env,
    +
    int enif_make_existing_atom_len(ErlNifEnv *env,
             const char *name, size_t len, ERL_NIF_TERM *atom, ErlNifCharEncoding
    -        encoding);

    Tries to create the term of an already existing atom from the string name with + encoding);

    Tries to create the term of an already existing atom from the string name with length len bytes and encoding. NULL characters are treated as any other characters.

    If the atom already exists, this function stores the term in *atom and returns true, otherwise returns false. It also returns false if the string name @@ -1350,19 +1350,19 @@

    enif_make_int()

    -
    ERL_NIF_TERM enif_make_int(ErlNifEnv* env, int i);

    Creates an integer term.

    +
    ERL_NIF_TERM enif_make_int(ErlNifEnv* env, int i);

    Creates an integer term.

    enif_make_int64()

    -
    ERL_NIF_TERM enif_make_int64(ErlNifEnv* env, ErlNifSInt64 i);

    Creates an integer term from a signed 64-bit integer.

    Available since OTP R14B

    +
    ERL_NIF_TERM enif_make_int64(ErlNifEnv* env, ErlNifSInt64 i);

    Creates an integer term from a signed 64-bit integer.

    Available since OTP R14B

    enif_make_list()

    -
    ERL_NIF_TERM enif_make_list(ErlNifEnv* env, unsigned cnt, ...);

    Creates an ordinary list term of length cnt. Expects cnt number of arguments +

    ERL_NIF_TERM enif_make_list(ErlNifEnv* env, unsigned cnt, ...);

    Creates 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.

    Returns an empty list if cnt is 0.

    @@ -1417,15 +1417,15 @@

    enif_make_list9()

    -
    ERL_NIF_TERM enif_make_list1(ErlNifEnv* env, ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_list2(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_list3(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_list4(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_list5(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_list6(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_list7(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_list8(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_list9(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates an ordinary list term with length indicated by the function name. Prefer +

    ERL_NIF_TERM enif_make_list1(ErlNifEnv* env, ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_list2(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_list3(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_list4(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_list5(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_list6(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_list7(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_list8(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_list9(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates an ordinary list term with length indicated by the function name. Prefer these functions (macros) over the variadic enif_make_list to get a compile-time error if the number of arguments does not match.

    Available since OTP R13B04

    @@ -1433,29 +1433,29 @@

    enif_make_list_cell()

    -
    ERL_NIF_TERM enif_make_list_cell(ErlNifEnv*
    -        env, ERL_NIF_TERM head, ERL_NIF_TERM tail);

    Creates a list cell [head | tail].

    +
    ERL_NIF_TERM enif_make_list_cell(ErlNifEnv*
    +        env, ERL_NIF_TERM head, ERL_NIF_TERM tail);

    Creates a list cell [head | tail].

    enif_make_list_from_array()

    -
    ERL_NIF_TERM enif_make_list_from_array(ErlNifEnv* env, const ERL_NIF_TERM
    -          arr[], unsigned cnt);

    Creates an ordinary list containing the elements of array arr of length cnt.

    Returns an empty list if cnt is 0.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_list_from_array(ErlNifEnv* env, const ERL_NIF_TERM
    +          arr[], unsigned cnt);

    Creates an ordinary list containing the elements of array arr of length cnt.

    Returns an empty list if cnt is 0.

    Available since OTP R13B04

    enif_make_long()

    -
    ERL_NIF_TERM enif_make_long(ErlNifEnv* env, long int i);

    Creates an integer term from a long int.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_long(ErlNifEnv* env, long int i);

    Creates an integer term from a long int.

    Available since OTP R13B04

    enif_make_map_put()

    -
    int enif_make_map_put(ErlNifEnv* env,
    +
    int enif_make_map_put(ErlNifEnv* env,
             ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM value,
    -        ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and inserts key with value. If key already + ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and inserts key with value. If key already exists in map_in, the old associated value is replaced by value.

    If successful, this function sets *map_out to the new map and returns true. Returns false if map_in is not a map.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1463,8 +1463,8 @@

    enif_make_map_remove()

    -
    int enif_make_map_remove(ErlNifEnv* env,
    -        ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM* map_out);

    If map map_in contains key, this function makes a copy of map_in in +

    int enif_make_map_remove(ErlNifEnv* env,
    +        ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM* map_out);

    If map map_in contains key, this function makes a copy of map_in in *map_out, and removes key and the associated value. If map map_in does not contain key, *map_out is set to map_in.

    Returns true on success, or false if map_in is not a map.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1472,9 +1472,9 @@

    enif_make_map_update()

    -
    int enif_make_map_update(ErlNifEnv* env,
    +
    int enif_make_map_update(ErlNifEnv* env,
             ERL_NIF_TERM map_in, ERL_NIF_TERM key, ERL_NIF_TERM new_value,
    -        ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and replace the old associated value for key with + ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and replace the old associated value for key with new_value.

    If successful, this function sets *map_out to the new map and returns true. Returns false if map_in is not a map or if it does not contain key.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1482,24 +1482,24 @@

    enif_make_map_from_arrays()

    -
    int enif_make_map_from_arrays(ErlNifEnv* env, ERL_NIF_TERM keys[],
    -        ERL_NIF_TERM values[], size_t cnt, ERL_NIF_TERM *map_out);

    Makes a map term from the given keys and values.

    If successful, this function sets *map_out to the new map and returns true. +

    int enif_make_map_from_arrays(ErlNifEnv* env, ERL_NIF_TERM keys[],
    +        ERL_NIF_TERM values[], size_t cnt, ERL_NIF_TERM *map_out);

    Makes a map term from the given keys and values.

    If successful, this function sets *map_out to the new map and returns true. Returns false there are any duplicate keys.

    All keys and values must belong to env.

    Available since OTP 21.0

    enif_make_monitor_term()

    -
    ERL_NIF_TERM enif_make_monitor_term(ErlNifEnv* env, const ErlNifMonitor* mon);

    Creates a term identifying the given monitor received from +

    ERL_NIF_TERM enif_make_monitor_term(ErlNifEnv* env, const ErlNifMonitor* mon);

    Creates a term identifying the given monitor received from enif_monitor_process .

    This function is primarily intended for debugging purpose.

    Available since OTP 22.0

    enif_make_new_atom()

    -
    int enif_make_new_atom(ErlNifEnv *env,
    +
    int enif_make_new_atom(ErlNifEnv *env,
             const char *name, ERL_NIF_TERM *atom, ErlNifCharEncoding
    -        encoding);

    Creates an atom term from the NULL-terminated C-string name with + encoding);

    Creates an atom term from the NULL-terminated C-string name with encoding.

    If successful, true is returned and the atom term is stored in *atom.

    Otherwise, false is returned if the length of name exceeds the maximum length allowed for an atom (255 characters) or if name is not correctly encoded.

    Available since OTP 26.0

    @@ -1508,9 +1508,9 @@

    enif_make_new_atom_len()

    -
    int enif_make_new_atom_len(ErlNifEnv *env,
    +
    int enif_make_new_atom_len(ErlNifEnv *env,
             const char *name, size_t len, ERL_NIF_TERM *atom, ErlNifCharEncoding
    -        encoding);

    Create an atom term from string name with length len bytes and + encoding);

    Create an atom term from string name with length len bytes and encoding.

    If successful, true is returned and atom term is stored in *atom.

    Otherwise, false is returned if the string exceeds the maximum length allowed for an atom (255 characters) or if the string is not correctly encoded.

    Available since OTP 26.0

    @@ -1518,8 +1518,8 @@

    enif_make_new_binary()

    -
    unsigned char * enif_make_new_binary(ErlNifEnv*
    -        env, size_t size, ERL_NIF_TERM* termp);

    Allocates a binary of size size bytes and creates an owning term. The binary +

    unsigned char * enif_make_new_binary(ErlNifEnv*
    +        env, size_t size, ERL_NIF_TERM* termp);

    Allocates a binary of size size bytes and creates an owning term. The binary data is mutable until the calling NIF returns. This is a quick way to create a new binary without having to use ErlNifBinary. The drawbacks are that the binary cannot be kept between NIF calls and it cannot be @@ -1529,26 +1529,26 @@

    enif_make_new_map()

    -
    ERL_NIF_TERM enif_make_new_map(ErlNifEnv* env);

    Makes an empty map term.

    Available since OTP 18.0

    +
    ERL_NIF_TERM enif_make_new_map(ErlNifEnv* env);

    Makes an empty map term.

    Available since OTP 18.0

    enif_make_pid()

    -
    ERL_NIF_TERM enif_make_pid(ErlNifEnv* env, const ErlNifPid* pid);

    Makes a pid term or the atom undefined +

    ERL_NIF_TERM enif_make_pid(ErlNifEnv* env, const ErlNifPid* pid);

    Makes a pid term or the atom undefined from *pid.

    Available since OTP R14B

    enif_make_ref()

    -
    ERL_NIF_TERM enif_make_ref(ErlNifEnv* env);

    Creates a reference like erlang:make_ref/0.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_ref(ErlNifEnv* env);

    Creates a reference like erlang:make_ref/0.

    Available since OTP R13B04

    enif_make_resource()

    -
    ERL_NIF_TERM enif_make_resource(ErlNifEnv* env, void* obj);

    Creates an opaque handle to a memory-managed resource object obtained by +

    ERL_NIF_TERM enif_make_resource(ErlNifEnv* env, void* obj);

    Creates an opaque handle to a memory-managed resource object obtained by enif_alloc_resource. No ownership transfer is done, as the resource object still needs to be released by enif_release_resource. However, notice @@ -1575,8 +1575,8 @@

    enif_make_resource_binary()

    -
    ERL_NIF_TERM enif_make_resource_binary(ErlNifEnv* env, void* obj, const
    -        void* data, size_t size);

    Creates a binary term that is memory-managed by a resource object obj obtained +

    ERL_NIF_TERM enif_make_resource_binary(ErlNifEnv* env, void* obj, const
    +        void* data, size_t size);

    Creates a binary term that is memory-managed by a resource object obj obtained by enif_alloc_resource. The returned binary term consists of size bytes pointed to by data. This raw binary data must be kept readable and unchanged until the destructor of the resource is called. The @@ -1591,8 +1591,8 @@

    enif_make_reverse_list()

    -
    int enif_make_reverse_list(ErlNifEnv* env, ERL_NIF_TERM list_in,
    -        ERL_NIF_TERM *list_out);

    Sets *list_out to the reverse list of the list list_in and returns true, +

    int enif_make_reverse_list(ErlNifEnv* env, ERL_NIF_TERM list_in,
    +        ERL_NIF_TERM *list_out);

    Sets *list_out to the reverse list of the list list_in and returns true, or returns false if list_in is not a list.

    This function is only to be used on short lists, as a copy is created of the list, which is not released until after the NIF returns.

    The list_in term must belong to environment env.

    Available since OTP R15B

    @@ -1600,17 +1600,17 @@

    enif_make_string()

    -
    ERL_NIF_TERM enif_make_string(ErlNifEnv *env,
    -        const char *string, ErlNifCharEncoding encoding);

    Creates a list containing the characters of the NULL-terminated string +

    ERL_NIF_TERM enif_make_string(ErlNifEnv *env,
    +        const char *string, ErlNifCharEncoding encoding);

    Creates a list containing the characters of the NULL-terminated string string with encoding.

    enif_make_string_len()

    -
    ERL_NIF_TERM enif_make_string_len(ErlNifEnv
    +
    ERL_NIF_TERM enif_make_string_len(ErlNifEnv
             *env, const char *string, size_t len, ErlNifCharEncoding
    -        encoding);

    Creates a list containing the characters of the string string with length + encoding);

    Creates a list containing the characters of the string string with length len and encoding. NULL characters are treated as any other characters.

    Available since OTP R14B

    @@ -1618,8 +1618,8 @@

    enif_make_sub_binary()

    -
    ERL_NIF_TERM enif_make_sub_binary(ErlNifEnv*
    -        env, ERL_NIF_TERM bin_term, size_t pos, size_t size);

    Makes a subbinary of binary bin_term, starting at zero-based position pos +

    ERL_NIF_TERM enif_make_sub_binary(ErlNifEnv*
    +        env, ERL_NIF_TERM bin_term, size_t pos, size_t size);

    Makes a subbinary of binary bin_term, starting at zero-based position pos with a length of size bytes. bin_term must be a binary or bitstring. pos+size must be less or equal to the number of whole bytes in bin_term.

    Available since OTP R13B04

    @@ -1627,8 +1627,8 @@

    enif_make_tuple()

    -
    ERL_NIF_TERM enif_make_tuple(ErlNifEnv* env,
    -        unsigned cnt, ...);

    Creates a tuple term of arity cnt. Expects cnt number of arguments (after +

    ERL_NIF_TERM enif_make_tuple(ErlNifEnv* env,
    +        unsigned cnt, ...);

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

    @@ -1683,16 +1683,16 @@

    enif_make_tuple9()

    -
    ERL_NIF_TERM enif_make_tuple1(ErlNifEnv* env,
    -        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_tuple2(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_tuple3(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_tuple4(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_tuple5(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_tuple6(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_tuple7(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_tuple8(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_tuple9(ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates a tuple term with length indicated by the function name. Prefer these +

    ERL_NIF_TERM enif_make_tuple1(ErlNifEnv* env,
    +        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_tuple2(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_tuple3(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_tuple4(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_tuple5(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_tuple6(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_tuple7(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_tuple8(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_tuple9(ErlNifEnv* env,
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates a tuple term with length indicated by the function name. Prefer these functions (macros) over the variadic enif_make_tuple to get a compile-time error if the number of arguments does not match.

    Available since OTP R13B04

    @@ -1700,33 +1700,33 @@

    enif_make_tuple_from_array()

    -
    ERL_NIF_TERM enif_make_tuple_from_array(ErlNifEnv* env, const ERL_NIF_TERM
    -        arr[], unsigned cnt);

    Creates a tuple containing the elements of array arr of length cnt.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_tuple_from_array(ErlNifEnv* env, const ERL_NIF_TERM
    +        arr[], unsigned cnt);

    Creates a tuple containing the elements of array arr of length cnt.

    Available since OTP R13B04

    enif_make_uint()

    -
    ERL_NIF_TERM enif_make_uint(ErlNifEnv* env, unsigned int i);

    Creates an integer term from an unsigned int.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_uint(ErlNifEnv* env, unsigned int i);

    Creates an integer term from an unsigned int.

    Available since OTP R13B04

    enif_make_uint64()

    -
    ERL_NIF_TERM enif_make_uint64(ErlNifEnv* env, ErlNifUInt64 i);

    Creates an integer term from an unsigned 64-bit integer.

    Available since OTP R14B

    +
    ERL_NIF_TERM enif_make_uint64(ErlNifEnv* env, ErlNifUInt64 i);

    Creates an integer term from an unsigned 64-bit integer.

    Available since OTP R14B

    enif_make_ulong()

    -
    ERL_NIF_TERM enif_make_ulong(ErlNifEnv* env, unsigned long i);

    Creates an integer term from an unsigned long int.

    +
    ERL_NIF_TERM enif_make_ulong(ErlNifEnv* env, unsigned long i);

    Creates an integer term from an unsigned long int.

    enif_make_unique_integer()

    -
    ERL_NIF_TERM enif_make_unique_integer(ErlNifEnv
    -        *env, ErlNifUniqueInteger properties);

    Returns a unique integer with the same properties as specified by +

    ERL_NIF_TERM enif_make_unique_integer(ErlNifEnv
    +        *env, ErlNifUniqueInteger properties);

    Returns a unique integer with the same properties as specified by erlang:unique_integer/1.

    env is the environment to create the integer in.

    ERL_NIF_UNIQUE_POSITIVE and ERL_NIF_UNIQUE_MONOTONIC can be passed as the second argument to change the properties of the integer returned. They can be combined by OR:ing the two values together.

    See also ErlNifUniqueInteger.

    Available since OTP 19.0

    @@ -1735,21 +1735,21 @@

    enif_map_iterator_create()

    -
    int enif_map_iterator_create(ErlNifEnv *env,
    +
    int enif_map_iterator_create(ErlNifEnv *env,
             ERL_NIF_TERM map, ErlNifMapIterator *iter, ErlNifMapIteratorEntry
    -        entry);

    Creates an iterator for the map map by initializing the structure pointed to + entry);

    Creates an iterator for the map map by initializing the structure pointed to by iter. Argument entry determines the start position of the iterator: ERL_NIF_MAP_ITERATOR_FIRST or ERL_NIF_MAP_ITERATOR_LAST.

    Returns true on success, or false if map is not a map.

    A map iterator is only useful during the lifetime of environment env that the map belongs to. The iterator must be destroyed by calling enif_map_iterator_destroy:

    ERL_NIF_TERM key, value;
     ErlNifMapIterator iter;
    -enif_map_iterator_create(env, my_map, &iter, ERL_NIF_MAP_ITERATOR_FIRST);
    +enif_map_iterator_create(env, my_map, &iter, ERL_NIF_MAP_ITERATOR_FIRST);
     
    -while (enif_map_iterator_get_pair(env, &iter, &key, &value)) {
    -    do_something(key,value);
    -    enif_map_iterator_next(env, &iter);
    -}
    -enif_map_iterator_destroy(env, &iter);

    Note

    The key-value pairs of a map have no defined iteration order. The only +while (enif_map_iterator_get_pair(env, &iter, &key, &value)) { + do_something(key,value); + enif_map_iterator_next(env, &iter); +} +enif_map_iterator_destroy(env, &iter);

    Note

    The key-value pairs of a map have no defined iteration order. The only guarantee is that the iteration order of a single map instance is preserved during the lifetime of the environment that the map belongs to.

    Available since OTP 18.0

    @@ -1757,55 +1757,55 @@

    enif_map_iterator_destroy()

    -
    void enif_map_iterator_destroy(ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Destroys a map iterator created by +

    void enif_map_iterator_destroy(ErlNifEnv *env,
    +        ErlNifMapIterator *iter);

    Destroys a map iterator created by enif_map_iterator_create.

    Available since OTP 18.0

    enif_map_iterator_get_pair()

    -
    int enif_map_iterator_get_pair(ErlNifEnv *env,
    +
    int enif_map_iterator_get_pair(ErlNifEnv *env,
             ErlNifMapIterator *iter, ERL_NIF_TERM *key, ERL_NIF_TERM
    -        *value);

    Gets key and value terms at the current map iterator position.

    On success, sets *key and *value and returns true. Returns false if the + *value);

    Gets key and value terms at the current map iterator position.

    On success, sets *key and *value and returns true. Returns false if the iterator is positioned at head (before first entry) or tail (beyond last entry).

    Available since OTP 18.0

    enif_map_iterator_is_head()

    -
    int enif_map_iterator_is_head(ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned before the first entry.

    Available since OTP 18.0

    +
    int enif_map_iterator_is_head(ErlNifEnv *env,
    +        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned before the first entry.

    Available since OTP 18.0

    enif_map_iterator_is_tail()

    -
    int enif_map_iterator_is_tail(ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned after the last entry.

    Available since OTP 18.0

    +
    int enif_map_iterator_is_tail(ErlNifEnv *env,
    +        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned after the last entry.

    Available since OTP 18.0

    enif_map_iterator_next()

    -
    int enif_map_iterator_next(ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Increments map iterator to point to the next key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or +

    int enif_map_iterator_next(ErlNifEnv *env,
    +        ErlNifMapIterator *iter);

    Increments map iterator to point to the next key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or false if the iterator is positioned at the tail (beyond the last entry).

    Available since OTP 18.0

    enif_map_iterator_prev()

    -
    int enif_map_iterator_prev(ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Decrements map iterator to point to the previous key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or +

    int enif_map_iterator_prev(ErlNifEnv *env,
    +        ErlNifMapIterator *iter);

    Decrements map iterator to point to the previous key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or false if the iterator is positioned at the head (before the first entry).

    Available since OTP 18.0

    enif_monitor_process()

    -
    int enif_monitor_process(ErlNifEnv* caller_env,
    -      void* obj, const ErlNifPid* target_pid, ErlNifMonitor* mon);

    Starts monitoring a process from a resource. When a process is monitored, a +

    int enif_monitor_process(ErlNifEnv* caller_env,
    +      void* obj, const ErlNifPid* target_pid, ErlNifMonitor* mon);

    Starts monitoring a process from a resource. When a process is monitored, a process exit results in a call to the provided down callback associated with the resource type.

    Argument obj is pointer to the resource to hold the monitor and *target_pid @@ -1825,7 +1825,7 @@

    enif_monotonic_time()

    -
    ErlNifTime enif_monotonic_time(ErlNifTimeUnit time_unit);

    Returns the current +

    ErlNifTime enif_monotonic_time(ErlNifTimeUnit time_unit);

    Returns the current Erlang monotonic time. Notice that it is not uncommon with negative values.

    time_unit is the time unit of the returned value.

    Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument, or if called from a thread that is not a scheduler thread.

    See also ErlNifTime and @@ -1835,51 +1835,51 @@

    enif_mutex_create()

    -
    ErlNifMutex * enif_mutex_create(char *name);

    Same as erl_drv_mutex_create.

    Available since OTP R13B04

    +
    ErlNifMutex * enif_mutex_create(char *name);

    Same as erl_drv_mutex_create.

    Available since OTP R13B04

    enif_mutex_destroy()

    -
    void enif_mutex_destroy(ErlNifMutex *mtx);

    Same as erl_drv_mutex_destroy.

    Available since OTP R13B04

    +
    void enif_mutex_destroy(ErlNifMutex *mtx);

    Same as erl_drv_mutex_destroy.

    Available since OTP R13B04

    enif_mutex_lock()

    -
    void enif_mutex_lock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_lock.

    Available since OTP R13B04

    +
    void enif_mutex_lock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_lock.

    Available since OTP R13B04

    enif_mutex_name()

    -
    char* enif_mutex_name(ErlNifMutex* mtx);

    Same as erl_drv_mutex_name.

    Available since OTP 21.0

    +
    char* enif_mutex_name(ErlNifMutex* mtx);

    Same as erl_drv_mutex_name.

    Available since OTP 21.0

    enif_mutex_trylock()

    -
    int enif_mutex_trylock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_trylock.

    Available since OTP R13B04

    +
    int enif_mutex_trylock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_trylock.

    Available since OTP R13B04

    enif_mutex_unlock()

    -
    void enif_mutex_unlock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_unlock.

    Available since OTP R13B04

    +
    void enif_mutex_unlock(ErlNifMutex *mtx);

    Same as erl_drv_mutex_unlock.

    Available since OTP R13B04

    enif_now_time()

    -
    ERL_NIF_TERM enif_now_time(ErlNifEnv *env);

    Returns an erlang:now() time stamp.

    This function is deprecated.

    Available since OTP 19.0

    +
    ERL_NIF_TERM enif_now_time(ErlNifEnv *env);

    Returns an erlang:now() time stamp.

    This function is deprecated.

    Available since OTP 19.0

    enif_open_resource_type()

    -
    ErlNifResourceType * enif_open_resource_type(ErlNifEnv* env, const char*
    +
    ErlNifResourceType * enif_open_resource_type(ErlNifEnv* env, const char*
             module_str, const char* name, ErlNifResourceDtor* dtor,
    -        ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

    Creates or takes over a resource type identified by the string name and gives + ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

    Creates or takes over a resource type identified by the string name and gives it the destructor function pointed to by dtor. Argument flags can have the following values:

    • ERL_NIF_RT_CREATE - Creates a new resource type that does not already @@ -1900,9 +1900,9 @@

      enif_open_resource_type_x()

      -
      ErlNifResourceType * enif_open_resource_type_x(ErlNifEnv* env, const char* name,
      +
      ErlNifResourceType * enif_open_resource_type_x(ErlNifEnv* env, const char* name,
       	const ErlNifResourceTypeInit* init,
      -        ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

      Same as enif_open_resource_type except + ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

      Same as enif_open_resource_type except it accepts additional callback functions for resource types that are used together with enif_select and enif_monitor_process.

      Argument init is a pointer to an @@ -1917,9 +1917,9 @@

      enif_init_resource_type()

      -
      ErlNifResourceType * enif_init_resource_type(ErlNifEnv* env, const char* name,
      +
      ErlNifResourceType * enif_init_resource_type(ErlNifEnv* env, const char* name,
       	const ErlNifResourceTypeInit* init,
      -        ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

      Same as enif_open_resource_type_x + ErlNifResourceFlags flags, ErlNifResourceFlags* tried);

      Same as enif_open_resource_type_x except it accepts an additional callback function for resource types that are used together with enif_dynamic_resource_call.

      Argument init is a pointer to an @@ -1934,8 +1934,8 @@

      enif_port_command()

      -
      int enif_port_command(ErlNifEnv* env, const
      -       ErlNifPort* to_port, ErlNifEnv *msg_env, ERL_NIF_TERM msg);

      Works as erlang:port_command/2, except that it is always completely +

      int enif_port_command(ErlNifEnv* env, const
      +       ErlNifPort* to_port, ErlNifEnv *msg_env, ERL_NIF_TERM msg);

      Works as erlang:port_command/2, except that it is always completely asynchronous.

      • env - The environment of the calling process. Must not be NULL.

      • *to_port - The port ID of the receiving port. The port ID is to refer to a port on the local node.

      • msg_env - The environment of the message term. Can be a process independent environment allocated with @@ -1950,15 +1950,15 @@

        enif_priv_data()

        -
        void * enif_priv_data(ErlNifEnv* env);

        Returns the pointer to the private data that was set by +

        void * enif_priv_data(ErlNifEnv* env);

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

        Available since OTP R13B04

        enif_raise_exception()

        -
        ERL_NIF_TERM enif_raise_exception(ErlNifEnv*
        -        env, ERL_NIF_TERM reason);

        Creates an error exception with the term reason to be returned from a NIF, and +

        ERL_NIF_TERM enif_raise_exception(ErlNifEnv*
        +        env, ERL_NIF_TERM reason);

        Creates an error exception with the term reason to be returned from a NIF, and associates it with environment env. Once a NIF or any function it calls invokes enif_raise_exception, the runtime ensures that the exception it creates is raised when the NIF returns, even if the NIF attempts to return a @@ -1972,7 +1972,7 @@

        enif_realloc()

        -
        void * enif_realloc(void* ptr, size_t size);

        Reallocates memory allocated by enif_alloc to size +

        void * enif_realloc(void* ptr, size_t size);

        Reallocates memory allocated by enif_alloc to size bytes.

        Returns NULL if the reallocation fails.

        The returned pointer is suitably aligned for any built-in type that fit in the allocated memory.

        Available since OTP 20.2

        @@ -1980,7 +1980,7 @@

        enif_realloc_binary()

        -
        int enif_realloc_binary(ErlNifBinary* bin, size_t size);

        Changes the size of a binary bin. The source binary can be read-only, in which +

        int enif_realloc_binary(ErlNifBinary* bin, size_t size);

        Changes the size of a binary bin. The source binary can be read-only, in which case it is left untouched and a mutable copy is allocated and assigned to *bin.

        Returns true on success, or false if memory allocation failed.

        Available since OTP R13B04

        @@ -1988,14 +1988,14 @@

        enif_release_binary()

        -
        void enif_release_binary(ErlNifBinary* bin);

        Releases a binary obtained from +

        void enif_release_binary(ErlNifBinary* bin);

        Releases a binary obtained from enif_alloc_binary.

        enif_release_resource()

        -
        void enif_release_resource(void* obj);

        Removes a reference to resource object obj obtained from +

        void enif_release_resource(void* obj);

        Removes a reference to resource object obj obtained from enif_alloc_resource. The resource object is destructed when the last reference is removed. Each call to enif_release_resource must correspond to a previous call to @@ -2009,64 +2009,64 @@

        enif_rwlock_create()

        -
        ErlNifRWLock * enif_rwlock_create(char *name);

        Same as erl_drv_rwlock_create.

        Available since OTP R13B04

        +
        ErlNifRWLock * enif_rwlock_create(char *name);

        Same as erl_drv_rwlock_create.

        Available since OTP R13B04

        enif_rwlock_destroy()

        -
        void enif_rwlock_destroy(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_destroy.

        Available since OTP R13B04

        +
        void enif_rwlock_destroy(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_destroy.

        Available since OTP R13B04

        enif_rwlock_name()

        -
        char* enif_rwlock_name(ErlNifRWLock* rwlck);

        Same as erl_drv_rwlock_name.

        Available since OTP 21.0

        +
        char* enif_rwlock_name(ErlNifRWLock* rwlck);

        Same as erl_drv_rwlock_name.

        Available since OTP 21.0

        enif_rwlock_rlock()

        -
        void enif_rwlock_rlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rlock.

        Available since OTP R13B04

        enif_rwlock_runlock()

        -
        void enif_rwlock_runlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_runlock.

        Available since OTP R13B04

        +
        void enif_rwlock_runlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_runlock.

        Available since OTP R13B04

        enif_rwlock_rwlock()

        -
        void enif_rwlock_rwlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rwlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwlock.

        Available since OTP R13B04

        enif_rwlock_rwunlock()

        -
        void enif_rwlock_rwunlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwunlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rwunlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwunlock.

        Available since OTP R13B04

        enif_rwlock_tryrlock()

        -
        int enif_rwlock_tryrlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrlock.

        Available since OTP R13B04

        +
        int enif_rwlock_tryrlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrlock.

        Available since OTP R13B04

        enif_rwlock_tryrwlock()

        -
        int enif_rwlock_tryrwlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrwlock.

        Available since OTP R13B04

        +
        int enif_rwlock_tryrwlock(ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrwlock.

        Available since OTP R13B04

        enif_schedule_nif()

        -
        ERL_NIF_TERM enif_schedule_nif(
        +
        ERL_NIF_TERM enif_schedule_nif(
                 ErlNifEnv* caller_env, const char* fun_name, int flags,
        -	ERL_NIF_TERM (*fp)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]),
        -	int argc, const ERL_NIF_TERM argv[]);

        Schedules NIF fp to execute. This function allows an application to break up + ERL_NIF_TERM (*fp)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]), + int argc, const ERL_NIF_TERM argv[]);

        Schedules NIF fp to execute. This function allows an application to break up long-running work into multiple regular NIF calls or to schedule a dirty NIF to execute on a dirty scheduler thread.

        • caller_env - Must be process bound environment of the calling NIF.

        • fun_name - Provides a name for the NIF that is scheduled for execution. @@ -2087,8 +2087,8 @@

          enif_select()

          -
          int enif_select(ErlNifEnv* env, ErlNifEvent event, enum ErlNifSelectFlags mode,
          -	void* obj, const ErlNifPid* pid, ERL_NIF_TERM ref);

          This function can be used to receive asynchronous notifications when OS-specific +

          int enif_select(ErlNifEnv* env, ErlNifEvent event, enum ErlNifSelectFlags mode,
          +	void* obj, const ErlNifPid* pid, ERL_NIF_TERM ref);

          This function can be used to receive asynchronous notifications when OS-specific event objects become ready for either read or write operations.

          Argument event identifies the event object. On Unix systems, the functions select/poll are used. The event object must be a socket, pipe or other file descriptor object that select/poll can use.

          Argument mode describes the type of events to wait for. It can be @@ -2143,14 +2143,14 @@

          to the poll set.

        Note

        Use bitwise AND to test for specific bits in the return value. New significant bits may be added in future releases to give more detailed information for both failed and successful calls. Do NOT use equality tests like ==, as that -may cause your application to stop working.

        Example:

        retval = enif_select(env, fd, ERL_NIF_SELECT_STOP, resource, ref);
        -if (retval < 0) {
        +may cause your application to stop working.

        Example:

        retval = enif_select(env, fd, ERL_NIF_SELECT_STOP, resource, ref);
        +if (retval < 0) {
             /* handle error */
        -}
        +}
         /* Success! */
        -if (retval & ERL_NIF_SELECT_STOP_CALLED) {
        +if (retval & ERL_NIF_SELECT_STOP_CALLED) {
             /* ... */
        -}

        Note

        The mode flag ERL_NIF_SELECT_CANCEL and the return flags +}

        Note

        The mode flag ERL_NIF_SELECT_CANCEL and the return flags ERL_NIF_SELECT_READ_CANCELLED and ERL_NIF_SELECT_WRITE_CANCELLED were introduced in erts-11.0 (OTP-22.0).

        Available since OTP 20.0

        @@ -2164,9 +2164,9 @@

        enif_select_write()

        -
        int enif_select_read(ErlNifEnv* env, ErlNifEvent event, void* obj,
        -      const ErlNifPid* pid, ERL_NIF_TERM msg, ErlNifEnv* msg_env);
        int enif_select_write(ErlNifEnv* env, ErlNifEvent event, void* obj,
        -      const ErlNifPid* pid, ERL_NIF_TERM msg, ErlNifEnv* msg_env);

        These are variants of enif_select where you can supply +

        int enif_select_read(ErlNifEnv* env, ErlNifEvent event, void* obj,
        +      const ErlNifPid* pid, ERL_NIF_TERM msg, ErlNifEnv* msg_env);
        int enif_select_write(ErlNifEnv* env, ErlNifEvent event, void* obj,
        +      const ErlNifPid* pid, ERL_NIF_TERM msg, ErlNifEnv* msg_env);

        These are variants of enif_select where you can supply your own message term msg that will be sent to the process instead of the predefined tuple {select,_,_,_}.

        Argument msg_env must either be NULL or the environment of msg allocated with enif_alloc_env. If argument msg_env is @@ -2184,7 +2184,7 @@

        enif_self()

        -
        ErlNifPid * enif_self(ErlNifEnv* caller_env, ErlNifPid* pid);

        Initializes the ErlNifPid variable at *pid to +

        ErlNifPid * enif_self(ErlNifEnv* caller_env, ErlNifPid* pid);

        Initializes the ErlNifPid variable at *pid to represent the calling process.

        Returns pid if successful, or NULL if caller_env is not a process bound environment.

        Available since OTP R14B

        @@ -2192,8 +2192,8 @@

        enif_send()

        -
        int enif_send(ErlNifEnv* caller_env,
        -      ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg);

        Sends a message to a process.

        • caller_env - The environment of the calling thread +

          int enif_send(ErlNifEnv* caller_env,
          +      ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg);

          Sends a message to a process.

          • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

          • *to_pid - The pid of the receiving process. The pid is to refer to a @@ -2212,8 +2212,8 @@

            enif_set_option()

            -
            int enif_set_option(ErlNifEnv *env, ErlNifOption opt, ...);

            Set an option. On success, zero will be returned. On failure, a non zero value -will be returned. Currently the following options can be set:

            • ERL_NIF_OPT_DELAY_HALT

              enif_set_option(env, ERL_NIF_OPT_DELAY_HALT)

              Enable delay of +

              int enif_set_option(ErlNifEnv *env, ErlNifOption opt, ...);

              Set an option. On success, zero will be returned. On failure, a non zero value +will be returned. Currently the following options can be set:

              • ERL_NIF_OPT_DELAY_HALT

                enif_set_option(env, ERL_NIF_OPT_DELAY_HALT)

                Enable delay of runtime system halt with flushing enabled until all calls to NIFs in the NIF library have returned. If the delay halt feature has not been enabled, a halt with flushing enabled may complete even though processes are still @@ -2243,7 +2243,7 @@

                case typically used to notify processes blocked in NIFs in the library that it is time to return in order to let the runtime system complete the halting. Such NIFs should be dirty NIFs, since ordinary NIFs should never block for a -long time.

              • ERL_NIF_OPT_ON_HALT

                enif_set_option(env, ERL_NIF_OPT_ON_HALT, on_halt)

                Install a callback that will be called when the runtime system halts with +long time.

              • ERL_NIF_OPT_ON_HALT

                enif_set_option(env, ERL_NIF_OPT_ON_HALT, on_halt)

                Install a callback that will be called when the runtime system halts with flushing enabled.

                The runtime system halts when one of the erlang:halt() BIFs are called. By default flushing is enabled, but can be disabled using the erlang:halt/2 BIF. When flushing has been disabled, the runtime system will @@ -2270,7 +2270,7 @@

                returned. The on halt callback is in this case typically used to notify processes blocked in NIFs in the library that it is time to return in order to let the runtime system complete the halting. Such NIFs should be dirty NIFs, -since ordinary NIFs should never block for a long time.

              • ERL_NIF_OPT_ON_UNLOAD_THREAD

                enif_set_option(env, ERL_NIF_OPT_ON_UNLOAD_THREAD, on_unload_thread)

                Install a callback that will be called by each scheduler thread when the +since ordinary NIFs should never block for a long time.

              • ERL_NIF_OPT_ON_UNLOAD_THREAD

                enif_set_option(env, ERL_NIF_OPT_ON_UNLOAD_THREAD, on_unload_thread)

                Install a callback that will be called by each scheduler thread when the module instance that the NIF library belongs to is purged as old. A typical use is to release thread specific data.

                The ERL_NIF_OPT_ON_UNLOAD_THREAD option can only be set during loading of a NIF library inside a call to load() or @@ -2295,22 +2295,22 @@

                enif_set_pid_undefined()

                -
                void enif_set_pid_undefined(ErlNifPid* pid);

                Sets an ErlNifPid variable as undefined. See +

                void enif_set_pid_undefined(ErlNifPid* pid);

                Sets an ErlNifPid variable as undefined. See enif_is_pid_undefined.

                Available since OTP 22.0

                enif_sizeof_resource()

                -
                unsigned enif_sizeof_resource(void* obj);

                Gets the byte size of resource object obj obtained by +

                unsigned enif_sizeof_resource(void* obj);

                Gets the byte size of resource object obj obtained by enif_alloc_resource.

                Available since OTP R13B04

                enif_snprintf()

                -
                int enif_snprintf(char *str, size_t size, const
                -        char *format, ...);

                Similar to snprintf but this format string also accepts "%T", which formats +

                int enif_snprintf(char *str, size_t size, const
                +        char *format, ...);

                Similar to snprintf but this format string also accepts "%T", which formats Erlang terms of type ERL_NIF_TERM.

                This function is primarily intended for debugging purpose. It is not recommended to print very large terms with %T. The function may change errno, even if successful.

                Available since OTP 19.0

                @@ -2319,15 +2319,15 @@

                enif_system_info()

                -
                void enif_system_info(ErlNifSysInfo
                -        *sys_info_ptr, size_t size);

                Same as driver_system_info.

                Available since OTP R13B04

                +
                void enif_system_info(ErlNifSysInfo
                +        *sys_info_ptr, size_t size);

                Same as driver_system_info.

                Available since OTP R13B04

                enif_term_to_binary()

                -
                int enif_term_to_binary(ErlNifEnv *env,
                -        ERL_NIF_TERM term, ErlNifBinary *bin);

                Allocates a new binary with enif_alloc_binary +

                int enif_term_to_binary(ErlNifEnv *env,
                +        ERL_NIF_TERM term, ErlNifBinary *bin);

                Allocates a new binary with enif_alloc_binary and stores the result of encoding term according to the Erlang external term format.

                Returns true on success, or false if the allocation fails.

                See also erlang:term_to_binary/1 and enif_binary_to_term.

                Available since OTP 19.0

                @@ -2336,7 +2336,7 @@

                enif_term_type()

                -
                ErlNifTermType enif_term_type(ErlNifEnv *env, ERL_NIF_TERM term);

                Determines the type of the given term. The term must be an ordinary Erlang term +

                ErlNifTermType enif_term_type(ErlNifEnv *env, ERL_NIF_TERM term);

                Determines the type of the given term. The term must be an ordinary Erlang term and not one of the special terms returned by enif_raise_exception, enif_schedule_nif, or similar.

                The following types are defined at the moment:

                • ERL_NIF_TERM_TYPE_ATOM

                • ERL_NIF_TERM_TYPE_BITSTRING - A bitstring or binary

                • ERL_NIF_TERM_TYPE_FLOAT

                • ERL_NIF_TERM_TYPE_FUN

                • ERL_NIF_TERM_TYPE_INTEGER

                • ERL_NIF_TERM_TYPE_LIST - A list, empty or not

                • ERL_NIF_TERM_TYPE_MAP

                • ERL_NIF_TERM_TYPE_PID

                • ERL_NIF_TERM_TYPE_PORT

                • ERL_NIF_TERM_TYPE_REFERENCE

                • ERL_NIF_TERM_TYPE_TUPLE

                Note that new types may be added in the future, so the caller must be prepared @@ -2346,53 +2346,53 @@

                enif_thread_create()

                -
                int enif_thread_create(char *name,ErlNifTid
                -        *tid,void * (*func)(void *),void *args,ErlNifThreadOpts
                -        *opts);

                Same as erl_drv_thread_create.

                Available since OTP R13B04

                +
                int enif_thread_create(char *name,ErlNifTid
                +        *tid,void * (*func)(void *),void *args,ErlNifThreadOpts
                +        *opts);

                Same as erl_drv_thread_create.

                Available since OTP R13B04

                enif_thread_exit()

                -
                void enif_thread_exit(void *resp);

                Same as erl_drv_thread_exit.

                Available since OTP R13B04

                +
                void enif_thread_exit(void *resp);

                Same as erl_drv_thread_exit.

                Available since OTP R13B04

                enif_thread_join()

                -
                int enif_thread_join(ErlNifTid, void **respp);

                Same as erl_drv_thread_join.

                Available since OTP R13B04

                +
                int enif_thread_join(ErlNifTid, void **respp);

                Same as erl_drv_thread_join.

                Available since OTP R13B04

                enif_thread_name()

                -
                char* enif_thread_name(ErlNifTid tid);

                Same as erl_drv_thread_name.

                Available since OTP 21.0

                +
                char* enif_thread_name(ErlNifTid tid);

                Same as erl_drv_thread_name.

                Available since OTP 21.0

                enif_thread_opts_create()

                -
                ErlNifThreadOpts * enif_thread_opts_create(char *name);

                Same as +

                ErlNifThreadOpts * enif_thread_opts_create(char *name);

                Same as erl_drv_thread_opts_create.

                Available since OTP R13B04

                enif_thread_opts_destroy()

                -
                void enif_thread_opts_destroy(ErlNifThreadOpts *opts);

                Same as +

                void enif_thread_opts_destroy(ErlNifThreadOpts *opts);

                Same as erl_drv_thread_opts_destroy.

                Available since OTP R13B04

                enif_thread_self()

                -
                ErlNifTid enif_thread_self(void);

                Same as erl_drv_thread_self.

                Available since OTP R13B04

                +
                ErlNifTid enif_thread_self(void);

                Same as erl_drv_thread_self.

                Available since OTP R13B04

                enif_thread_type()

                -
                int enif_thread_type(void);

                Determine the type of currently executing thread. A positive value indicates a +

                int enif_thread_type(void);

                Determine the type of currently executing thread. A positive value indicates a scheduler thread while a negative value or zero indicates another type of thread. Currently the following specific types exist (which may be extended in the future):

                • ERL_NIF_THR_UNDEFINED - Undefined thread that is not a scheduler thread.

                • ERL_NIF_THR_NORMAL_SCHEDULER - A normal scheduler thread.

                • ERL_NIF_THR_DIRTY_CPU_SCHEDULER - A dirty CPU scheduler thread.

                • ERL_NIF_THR_DIRTY_IO_SCHEDULER - A dirty I/O scheduler thread.

                Available since OTP 19.0

                @@ -2401,7 +2401,7 @@

                enif_time_offset()

                -
                ErlNifTime enif_time_offset(ErlNifTimeUnit time_unit);

                Returns the current time offset between +

                ErlNifTime enif_time_offset(ErlNifTimeUnit time_unit);

                Returns the current time offset between Erlang monotonic time and Erlang system time converted into the time_unit passed as argument.

                time_unit is the time unit of the returned value.

                Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument or if @@ -2412,46 +2412,46 @@

                enif_tsd_get()

                -
                void * enif_tsd_get(ErlNifTSDKey key);

                Same as erl_drv_tsd_get.

                Available since OTP R13B04

                +
                void * enif_tsd_get(ErlNifTSDKey key);

                Same as erl_drv_tsd_get.

                Available since OTP R13B04

                enif_tsd_key_create()

                -
                int enif_tsd_key_create(char *name, ErlNifTSDKey *key);

                Same as erl_drv_tsd_key_create.

                Available since OTP R13B04

                +
                int enif_tsd_key_create(char *name, ErlNifTSDKey *key);

                Same as erl_drv_tsd_key_create.

                Available since OTP R13B04

                enif_tsd_key_destroy()

                -
                void enif_tsd_key_destroy(ErlNifTSDKey key);

                Same as erl_drv_tsd_key_destroy.

                Available since OTP R13B04

                +
                void enif_tsd_key_destroy(ErlNifTSDKey key);

                Same as erl_drv_tsd_key_destroy.

                Available since OTP R13B04

                enif_tsd_set()

                -
                void enif_tsd_set(ErlNifTSDKey key, void *data);

                Same as erl_drv_tsd_set.

                Available since OTP R13B04

                +
                void enif_tsd_set(ErlNifTSDKey key, void *data);

                Same as erl_drv_tsd_set.

                Available since OTP R13B04

                enif_vfprintf()

                -
                int enif_vfprintf(FILE *stream, const char *format, va_list ap);

                Equivalent to enif_fprintf except that its called +

                int enif_vfprintf(FILE *stream, const char *format, va_list ap);

                Equivalent to enif_fprintf except that its called with a va_list instead of a variable number of arguments.

                Available since OTP 21.0

                enif_vsnprintf()

                -
                int enif_vsnprintf(char *str, size_t size, const char *format, va_list ap);

                Equivalent to enif_snprintf except that its called +

                int enif_vsnprintf(char *str, size_t size, const char *format, va_list ap);

                Equivalent to enif_snprintf except that its called with a va_list instead of a variable number of arguments.

                Available since OTP 21.0

                enif_whereis_pid()

                -
                int enif_whereis_pid(ErlNifEnv *caller_env,
                -          ERL_NIF_TERM name, ErlNifPid *pid);

                Looks up a process by its registered name.

                • caller_env - The environment of the calling thread +

                  int enif_whereis_pid(ErlNifEnv *caller_env,
                  +          ERL_NIF_TERM name, ErlNifPid *pid);

                  Looks up a process by its registered name.

                  • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

                  • name - The name of a registered process, as an atom.

                  • *pid - The ErlNifPid in which the resolved @@ -2464,8 +2464,8 @@

                    enif_whereis_port()

                    -
                    int enif_whereis_port(ErlNifEnv *caller_env,
                    -          ERL_NIF_TERM name, ErlNifPort *port);

                    Looks up a port by its registered name.

                    • caller_env - The environment of the calling thread +

                      int enif_whereis_port(ErlNifEnv *caller_env,
                      +          ERL_NIF_TERM name, ErlNifPort *port);

                      Looks up a port by its registered name.

                      • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

                      • name - The name of a registered port, as an atom.

                      • *port - The ErlNifPort in which the resolved diff --git a/prs/8803/erts-15.0.1/doc/html/erl_prim_loader.html b/prs/8803/erts-15.0.1/doc/html/erl_prim_loader.html index c5d4be6a323ac..4cbdef0c8e210 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_prim_loader.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_prim_loader.html @@ -412,7 +412,7 @@

                        read_file_info(Filename)

                        Retrieves information about a file.

                        Returns {ok, FileInfo} if successful, otherwise error. FileInfo is a record file_info, defined in the Kernel include file file.hrl. Include the following directive in the module from which the -function is called:

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

                        For more information about the record see file:read_file_info/2.

                        Filename can also be a file in an archive, for example, +function is called:

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

                        For more information about the record see file:read_file_info/2.

                        Filename can also be a file in an archive, for example, $OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin/mnesia. For information about archive files, see code.

                        diff --git a/prs/8803/erts-15.0.1/doc/html/erl_tracer.html b/prs/8803/erts-15.0.1/doc/html/erl_tracer.html index 1217f7d755414..f2d5b571e6ffb 100644 --- a/prs/8803/erts-15.0.1/doc/html/erl_tracer.html +++ b/prs/8803/erts-15.0.1/doc/html/erl_tracer.html @@ -149,107 +149,107 @@

                        module, a much more lightweight message tracer is used, which only records who sent messages to who.

                        The following is an example session using it on Linux:

                        $ gcc -I erts-8.0/include/ -fPIC -shared -o erl_msg_tracer.so erl_msg_tracer.c
                         $ erl
                        -Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
                        +Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
                         
                        -Eshell V8.0  (abort with ^G)
                        -1> c(erl_msg_tracer), erl_msg_tracer:load().
                        +Eshell V8.0  (abort with ^G)
                        +1> c(erl_msg_tracer), erl_msg_tracer:load().
                         ok
                        -2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
                        +2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
                         <0.37.0>
                        -3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
                        +3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
                         0
                        -{trace,<0.39.0>,<0.27.0>}
                        -4> {ok, D} = file:open("/tmp/tmp.data",[write]).
                        -{trace,#Port<0.486>,<0.40.0>}
                        -{trace,<0.40.0>,<0.21.0>}
                        -{trace,#Port<0.487>,<0.4.0>}
                        -{trace,#Port<0.488>,<0.4.0>}
                        -{trace,#Port<0.489>,<0.4.0>}
                        -{trace,#Port<0.490>,<0.4.0>}
                        -{ok,<0.40.0>}
                        -{trace,<0.41.0>,<0.27.0>}
                        -5>

                        erl_msg_tracer.erl:

                        -module(erl_msg_tracer).
                        +{trace,<0.39.0>,<0.27.0>}
                        +4> {ok, D} = file:open("/tmp/tmp.data",[write]).
                        +{trace,#Port<0.486>,<0.40.0>}
                        +{trace,<0.40.0>,<0.21.0>}
                        +{trace,#Port<0.487>,<0.4.0>}
                        +{trace,#Port<0.488>,<0.4.0>}
                        +{trace,#Port<0.489>,<0.4.0>}
                        +{trace,#Port<0.490>,<0.4.0>}
                        +{ok,<0.40.0>}
                        +{trace,<0.41.0>,<0.27.0>}
                        +5>

                        erl_msg_tracer.erl:

                        -module(erl_msg_tracer).
                         
                        --export([enabled/3, trace/5, load/0]).
                        +-export([enabled/3, trace/5, load/0]).
                         
                        -load() ->
                        -    erlang:load_nif("erl_msg_tracer", []).
                        +load() ->
                        +    erlang:load_nif("erl_msg_tracer", []).
                         
                        -enabled(_, _, _) ->
                        +enabled(_, _, _) ->
                             error.
                         
                        -trace(_, _, _, _, _) ->
                        +trace(_, _, _, _, _) ->
                             error.

                        erl_msg_tracer.c:

                        #include <erl_nif.h>
                         
                         /* NIF interface declarations */
                        -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
                        -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
                        -static void unload(ErlNifEnv* env, void* priv_data);
                        +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
                        +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
                        +static void unload(ErlNifEnv* env, void* priv_data);
                         
                         /* The NIFs: */
                        -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
                        -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
                        +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
                        +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
                         
                        -static ErlNifFunc nif_funcs[] = {
                        -    {"enabled", 3, enabled},
                        -    {"trace", 5, trace}
                        -};
                        +static ErlNifFunc nif_funcs[] = {
                        +    {"enabled", 3, enabled},
                        +    {"trace", 5, trace}
                        +};
                         
                        -ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
                        +ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
                         
                        -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
                        -{
                        +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
                        +{
                             *priv_data = NULL;
                             return 0;
                        -}
                        +}
                         
                        -static void unload(ErlNifEnv* env, void* priv_data)
                        -{
                        +static void unload(ErlNifEnv* env, void* priv_data)
                        +{
                         
                        -}
                        +}
                         
                        -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
                        -		   ERL_NIF_TERM load_info)
                        -{
                        -    if (*old_priv_data != NULL || *priv_data != NULL) {
                        +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
                        +		   ERL_NIF_TERM load_info)
                        +{
                        +    if (*old_priv_data != NULL || *priv_data != NULL) {
                         	return -1; /* Don't know how to do that */
                        -    }
                        -    if (load(env, priv_data, load_info)) {
                        +    }
                        +    if (load(env, priv_data, load_info)) {
                         	return -1;
                        -    }
                        +    }
                             return 0;
                        -}
                        +}
                         
                         /*
                          * argv[0]: TraceTag
                          * argv[1]: TracerState
                          * argv[2]: Tracee
                          */
                        -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
                        -{
                        +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
                        +{
                             ErlNifPid to_pid;
                        -    if (enif_get_local_pid(env, argv[1], &to_pid))
                        -        if (!enif_is_process_alive(env, &to_pid))
                        -            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                        +    if (enif_get_local_pid(env, argv[1], &to_pid))
                        +        if (!enif_is_process_alive(env, &to_pid))
                        +            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                                         /* tracer is dead so we should remove this tracepoint */
                        -                return enif_make_atom(env, "remove");
                        +                return enif_make_atom(env, "remove");
                                     else
                        -                return enif_make_atom(env, "discard");
                        +                return enif_make_atom(env, "discard");
                         
                             /* Only generate trace for when tracer != tracee */
                        -    if (enif_is_identical(argv[1], argv[2]))
                        -        return enif_make_atom(env, "discard");
                        +    if (enif_is_identical(argv[1], argv[2]))
                        +        return enif_make_atom(env, "discard");
                         
                             /* Only trigger trace messages on 'send' */
                        -    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
                        -        return enif_make_atom(env, "trace");
                        +    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
                        +        return enif_make_atom(env, "trace");
                         
                             /* Have to answer trace_status */
                        -    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                        -        return enif_make_atom(env, "trace");
                        +    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                        +        return enif_make_atom(env, "trace");
                         
                        -    return enif_make_atom(env, "discard");
                        -}
                        +    return enif_make_atom(env, "discard");
                        +}
                         
                         /*
                          * argv[0]: TraceTag, should only be 'send'
                        @@ -258,20 +258,20 @@ 

                        * argv[3]: Message * argv[4]: Options, map containing Recipient */ -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{ +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ ErlNifPid to_pid; ERL_NIF_TERM recipient, msg; - if (enif_get_local_pid(env, argv[1], &to_pid)) { - if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) { - msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient); - enif_send(env, &to_pid, NULL, msg); - } - } + if (enif_get_local_pid(env, argv[1], &to_pid)) { + if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) { + msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient); + enif_send(env, &to_pid, NULL, msg); + } + } - return enif_make_atom(env, "ok"); -}

                        + return enif_make_atom(env, "ok"); +}

    diff --git a/prs/8803/erts-15.0.1/doc/html/erlang.html b/prs/8803/erts-15.0.1/doc/html/erlang.html index 3e26ee71f7f79..36ce87d1d2dd1 100644 --- a/prs/8803/erts-15.0.1/doc/html/erlang.html +++ b/prs/8803/erts-15.0.1/doc/html/erlang.html @@ -7035,8 +7035,8 @@

    adler32(OldAdler, Data)

    Continues computing the adler32 checksum by combining the previous checksum, -OldAdler, with the checksum of Data.

    The following code:

    X = erlang:adler32(Data1),
    -Y = erlang:adler32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:adler32([Data1,Data2]).
    +OldAdler, with the checksum of Data.

    The following code:

    X = erlang:adler32(Data1),
    +Y = erlang:adler32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:adler32([Data1,Data2]).
    @@ -7069,10 +7069,10 @@

    adler32_combine(FirstAdler, SecondAdler, Se

    Combines two previously computed adler32 checksums.

    This computation requires the size of the data object for the second checksum -to be known.

    The following code:

    Y = erlang:adler32(Data1),
    -Z = erlang:adler32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:adler32(Data1),
    -Y = erlang:adler32(Data2),
    -Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).
    +to be known.

    The following code:

    Y = erlang:adler32(Data1),
    +Z = erlang:adler32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:adler32(Data1),
    +Y = erlang:adler32(Data2),
    +Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).

    @@ -7129,8 +7129,8 @@

    crc32(OldCrc, Data)

    Continues computing the crc32 checksum by combining the previous checksum, -OldCrc, with the checksum of Data.

    The following code:

    X = erlang:crc32(Data1),
    -Y = erlang:crc32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:crc32([Data1,Data2]).
    +OldCrc, with the checksum of Data.

    The following code:

    X = erlang:crc32(Data1),
    +Y = erlang:crc32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:crc32([Data1,Data2]).
    @@ -7163,10 +7163,10 @@

    crc32_combine(FirstCrc, SecondCrc, SecondSi

    Combines two previously computed crc32 checksums.

    This computation requires the size of the data object for the second checksum -to be known.

    The following code:

    Y = erlang:crc32(Data1),
    -Z = erlang:crc32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:crc32(Data1),
    -Y = erlang:crc32(Data2),
    -Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).
    +to be known.

    The following code:

    Y = erlang:crc32(Data1),
    +Z = erlang:crc32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:crc32(Data1),
    +Y = erlang:crc32(Data2),
    +Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).

    @@ -8390,11 +8390,11 @@

    nodes(Arg, InfoOpts)

    in the result returned by nodes/0.

  • hidden - The node is connected to the node of the calling process through a hidden connection. That is, the node name would not appear in the result returned by nodes/0.

  • this - This is the node of the calling process.

  • known - The node is not connected but known to the node of the calling -process.

  • Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    -[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    - {b@localhost,#{connection_id => 3067553,node_type => visible}},
    - {a@localhost,#{connection_id => undefined,node_type => this}}]
    -(a@localhost)2>
    +process.

    Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    +[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    + {b@localhost,#{connection_id => 3067553,node_type => visible}},
    + {a@localhost,#{connection_id => undefined,node_type => this}}]
    +(a@localhost)2>
    @@ -8504,9 +8504,9 @@

    abs(Number)

    Returns an integer or float that is the arithmetical absolute value of Float -or Int.

    For example:

    > abs(-3.33).
    +or Int.

    For example:

    > abs(-3.33).
     3.33
    -> abs(-3).
    +> abs(-3).
     3
    @@ -8538,8 +8538,8 @@

    append_element(Tuple1, Term)

    Returns a new tuple that has one element more than Tuple1, and contains the elements in Tuple1 followed by Term as the last element.

    Semantically equivalent to list_to_tuple(tuple_to_list(Tuple1) ++ [Term]), but much -faster.

    For example:

    > erlang:append_element({one, two}, three).
    -{one,two,three}
    +faster.

    For example:

    > erlang:append_element({one, two}, three).
    +{one,two,three}
    @@ -8606,7 +8606,7 @@

    atom_to_binary(Atom, Encoding)

    representation. If Encoding is utf8 or unicode, the characters are encoded using UTF-8 where characters may require multiple bytes.

    Change

    As from Erlang/OTP 20, atoms can contain any Unicode character and atom_to_binary(Atom, latin1) may fail if the text -representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
    +representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
     <<"Erlang">>
    @@ -8638,9 +8638,9 @@

    atom_to_list(Atom)

    Returns a list of unicode code points corresponding to the text representation -of Atom.

    For example:

    > atom_to_list('Erlang').
    -"Erlang"
    > atom_to_list('你好').
    -[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    +of Atom.

    For example:

    > atom_to_list('Erlang').
    +"Erlang"
    > atom_to_list('你好').
    +[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    @@ -8678,9 +8678,9 @@

    binary_part(Subject, PosLen)

    Extracts the part of the binary described by PosLen.

    Negative length can be used to extract bytes at the end of a binary.

    For example:

    1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
    -2> binary_part(Bin,{byte_size(Bin), -5}).
    +2> binary_part(Bin,{byte_size(Bin), -5}).
     <<6,7,8,9,10>>

    Failure: badarg if PosLen in any way references outside the binary.

    Start is zero-based, that is:

    1> Bin = <<1,2,3>>
    -2> binary_part(Bin,{0,2}).
    +2> binary_part(Bin,{0,2}).
     <<1,2>>

    For details about the PosLen semantics, see binary.

    @@ -8788,8 +8788,8 @@

    binary_to_atom(Binary, Encoding)

    garbage collected. Therefore, it is recommended to consider whether binary_to_existing_atom/2 is a better option than binary_to_atom/2. The default limits can be found -in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    -'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
    +in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    +'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
     'Ѐ'
    @@ -8902,7 +8902,7 @@

    binary_to_float(Binary)

    -

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
    +

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
     2.2017764

    The float string format is the same as the format for Erlang float literals except for that underscores are not permitted.

    Failure: badarg if Binary contains a bad representation of a float.

    @@ -8937,7 +8937,7 @@

    binary_to_integer(Binary)

    -

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
    +

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
     123

    binary_to_integer/1 accepts the same string formats as list_to_integer/1.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -8971,7 +8971,7 @@

    binary_to_integer(Binary, Base)

    -

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
    +

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
     1023

    binary_to_integer/2 accepts the same string formats as list_to_integer/2.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -9070,9 +9070,9 @@

    binary_to_term(Binary)

    Returns an Erlang term that is the result of decoding binary object Binary, which must be encoded according to the -Erlang external term format.

    > Bin = term_to_binary(hello).
    +Erlang external term format.

    > Bin = term_to_binary(hello).
     <<131,100,0,5,104,101,108,108,111>>
    -> hello = binary_to_term(Bin).
    +> hello = binary_to_term(Bin).
     hello

    Warning

    When decoding binaries from untrusted sources, the untrusted source may submit data in a way to create resources, such as atoms and remote references, that cannot be garbage collected and lead to Denial of Service attack. In such @@ -9121,11 +9121,11 @@

    binary_to_term(Binary, Opts)

    (as they are embedded in certain structures, such as process identifiers, refs, and funs), and creation of new external function references. None of those resources are garbage collected, so unchecked creation of them can -exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     ** exception error: bad argument
     > hello.
     hello
    -> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     hello

    Warning

    The safe option ensures the data is safely processed by the Erlang runtime but it does not guarantee the data is safe to your application. You must always validate data from untrusted sources. If the binary is stored or @@ -9133,10 +9133,10 @@

    binary_to_term(Binary, Opts)

    cryptographically signing it.

  • used - Changes the return value to {Term, Used} where Used is the number of bytes actually read from Binary.

    > Input = <<131,100,0,5,"hello","world">>.
     <<131,100,0,5,104,101,108,108,111,119,111,114,108,100>>
    -> {Term, Used} = binary_to_term(Input, [used]).
    -{hello, 9}
    -> split_binary(Input, Used).
    -{<<131,100,0,5,104,101,108,108,111>>, <<"world">>}
  • Failure: badarg if safe is specified and unsafe data is decoded.

    See also term_to_binary/1, binary_to_term/1, and list_to_existing_atom/1.

    +>
    {Term, Used} = binary_to_term(Input, [used]). +{hello, 9} +> split_binary(Input, Used). +{<<131,100,0,5,104,101,108,108,111>>, <<"world">>}

    Failure: badarg if safe is specified and unsafe data is decoded.

    See also term_to_binary/1, binary_to_term/1, and list_to_existing_atom/1.

    @@ -9168,9 +9168,9 @@

    bit_size(Bitstring)

    -

    Returns an integer that is the size in bits of Bitstring.

    For example:

    > bit_size(<<433:16,3:3>>).
    +

    Returns an integer that is the size in bits of Bitstring.

    For example:

    > bit_size(<<433:16,3:3>>).
     19
    -> bit_size(<<1,2,3>>).
    +> bit_size(<<1,2,3>>).
     24
    @@ -9202,9 +9202,9 @@

    bitstring_to_list(Bitstring)

    Returns a list of integers corresponding to the bytes of Bitstring.

    If the number of bits in the binary is not divisible by 8, the last element of -the list is a bitstring containing the remaining 1-7 bits.

    For example:

    > bitstring_to_list(<<433:16>>).
    -[1,177]
    > bitstring_to_list(<<433:16,3:3>>).
    -[1,177,<<3:3>>]
    +the list is a bitstring containing the remaining 1-7 bits.

    For example:

    > bitstring_to_list(<<433:16>>).
    +[1,177]
    > bitstring_to_list(<<433:16,3:3>>).
    +[1,177,<<3:3>>]
    @@ -9238,9 +9238,9 @@

    byte_size(Bitstring)

    Returns an integer that is the number of bytes needed to contain Bitstring. That is, if the number of bits in Bitstring is not divisible by 8, the -resulting number of bytes is rounded up.

    For example:

    > byte_size(<<433:16,3:3>>).
    +resulting number of bytes is rounded up.

    For example:

    > byte_size(<<433:16,3:3>>).
     3
    -> byte_size(<<1,2,3>>).
    +> byte_size(<<1,2,3>>).
     3
    @@ -9275,7 +9275,7 @@

    ceil(Number)

    -

    Returns the smallest integer not less than Number.

    For example:

    > ceil(5.5).
    +

    Returns the smallest integer not less than Number.

    For example:

    > ceil(5.5).
     6
    @@ -9385,10 +9385,10 @@

    decode_packet(Type, Bin, Options)

    than the indicated length are truncated.

    Option line_length also applies to http* packet types as an alias for option packet_size if packet_size itself is not set. This use is only intended for backward compatibility.

  • {line_delimiter, 0 =< byte() =< 255} - For packet type line, sets the -delimiting byte. Default is the latin-1 character $\n.

  • Examples:

    > erlang:decode_packet(1,<<3,"abcd">>,[]).
    -{ok,<<"abc">>,<<"d">>}
    -> erlang:decode_packet(1,<<5,"abcd">>,[]).
    -{more,6}
    +delimiting byte. Default is the latin-1 character $\n.

    Examples:

    > erlang:decode_packet(1,<<3,"abcd">>,[]).
    +{ok,<<"abc">>,<<"d">>}
    +> erlang:decode_packet(1,<<5,"abcd">>,[]).
    +{more,6}
    @@ -9419,8 +9419,8 @@

    delete_element(Index, Tuple1)

    -

    Returns a new tuple with element at Index removed from tuple Tuple1.

    For example:

    > erlang:delete_element(2, {one, two, three}).
    -{one,three}
    +

    Returns a new tuple with element at Index removed from tuple Tuple1.

    For example:

    > erlang:delete_element(2, {one, two, three}).
    +{one,three}
    @@ -9482,7 +9482,7 @@

    element(N, Tuple)

    -

    Returns the Nth element (numbering from 1) of Tuple.

    For example:

    > element(2, {a, b, c}).
    +

    Returns the Nth element (numbering from 1) of Tuple.

    For example:

    > element(2, {a, b, c}).
     b
    @@ -9514,10 +9514,10 @@

    external_size(Term)

    Calculates, without doing the encoding, the maximum byte size for a term encoded -in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term)),
    -> Size2 = erlang:external_size(Term),
    +in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term)),
    +> Size2 = erlang:external_size(Term),
     > true = Size1 =< Size2.
    -true

    This is equivalent to a call to:

    erlang:external_size(Term, [])
    +
    true

    This is equivalent to a call to:

    erlang:external_size(Term, [])
    @@ -9556,8 +9556,8 @@

    external_size(Term, Options)

    Calculates, without doing the encoding, the maximum byte size for a term encoded -in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term, Options)),
    -> Size2 = erlang:external_size(Term, Options),
    +in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term, Options)),
    +> Size2 = erlang:external_size(Term, Options),
     > true = Size1 =< Size2.
     true

    Option {minor_version, Version} specifies how floats are encoded. For a detailed description, see term_to_binary/2.

    @@ -9592,7 +9592,7 @@

    float(Number)

    -

    Returns a float by converting Number to a float.

    For example:

    > float(55).
    +

    Returns a float by converting Number to a float.

    For example:

    > float(55).
     55.0

    Note

    If used on the top level in a guard, it tests whether the argument is a floating point number; for clarity, use is_float/1 instead.

    When float/1 is used in an expression in a guard, such as 'float(A) == 4.0', it converts a number as described earlier.

    @@ -9667,17 +9667,17 @@

    float_to_binary(Float, Options)

    Returns a binary corresponding to the text representation of Float using fixed -decimal point formatting.

    Options behaves in the same way as float_to_list/2.

    For example:

    > float_to_binary(7.12, [{decimals, 4}]).
    +decimal point formatting.

    Options behaves in the same way as float_to_list/2.

    For example:

    > float_to_binary(7.12, [{decimals, 4}]).
     <<"7.1200">>
    -> float_to_binary(7.12, [{decimals, 4}, compact]).
    +> float_to_binary(7.12, [{decimals, 4}, compact]).
     <<"7.12">>
    -> float_to_binary(7.12, [{scientific, 3}]).
    +> float_to_binary(7.12, [{scientific, 3}]).
     <<"7.120e+00">>
    -> float_to_binary(7.12, [short]).
    +> float_to_binary(7.12, [short]).
     <<"7.12">>
    -> float_to_binary(0.1+0.2, [short]).
    +> float_to_binary(0.1+0.2, [short]).
     <<"0.30000000000000004">>
    -> float_to_binary(0.1+0.2)
    +> float_to_binary(0.1+0.2)
     <<"3.00000000000000044409e-01">>
    @@ -9758,17 +9758,17 @@

    float_to_list(Float, Options)

    range (-2⁵³, 2⁵³), the notation that yields the smallest number of characters is used (scientific notation or normal decimal notation). Floats outside the range (-2⁵³, 2⁵³) are always formatted using scientific notation to avoid -confusing results when doing arithmetic operations.
  • If Options is [], the function behaves as float_to_list/1.
  • Examples:

    > float_to_list(7.12, [{decimals, 4}]).
    +confusing results when doing arithmetic operations.
  • If Options is [], the function behaves as float_to_list/1.
  • Examples:

    > float_to_list(7.12, [{decimals, 4}]).
     "7.1200"
    -> float_to_list(7.12, [{decimals, 4}, compact]).
    +> float_to_list(7.12, [{decimals, 4}, compact]).
     "7.12"
    -> float_to_list(7.12, [{scientific, 3}]).
    +> float_to_list(7.12, [{scientific, 3}]).
     "7.120e+00"
    -> float_to_list(7.12, [short]).
    +> float_to_list(7.12, [short]).
     "7.12"
    -> float_to_list(0.1+0.2, [short]).
    +> float_to_list(0.1+0.2, [short]).
     "0.30000000000000004"
    -> float_to_list(0.1+0.2)
    +> float_to_list(0.1+0.2)
     "3.00000000000000044409e-01"

    In the last example, float_to_list(0.1+0.2) evaluates to "3.00000000000000044409e-01". The reason for this is explained in Representation of Floating Point Numbers.

    @@ -9805,7 +9805,7 @@

    floor(Number)

    -

    Returns the largest integer not greater than Number.

    For example:

    > floor(-10.5).
    +

    Returns the largest integer not greater than Number.

    For example:

    > floor(-10.5).
     -11
    @@ -9939,17 +9939,17 @@

    fun_to_list(Fun)

    funs are equal as fun_to_list/1 does not take the fun's environment into account. See erlang:fun_info/1 for how to get the environment of a fun.

    Change

    The output of fun_to_list/1 can differ between Erlang -implementations and may change in future versions.

    Examples:

    -module(test).
    --export([add/1, add2/0, fun_tuple/0]).
    -add(A) -> fun(B) -> A + B end.
    -add2() -> fun add/1.
    -fun_tuple() -> {fun() -> 1 end, fun() -> 1 end}.
    > {fun test:add/1, test:add2()}.
    -{fun test:add/1,#Fun<test.1.107738983>}

    Explanation: fun test:add/1 is upgradable but test:add2() is not upgradable.

    > {test:add(1), test:add(42)}.
    -{#Fun<test.0.107738983>,#Fun<test.0.107738983>}

    Explanation: test:add(1) and test:add(42) has the same string representation -as the environment is not taken into account.

    >test:fun_tuple().
    -{#Fun<test.2.107738983>,#Fun<test.3.107738983>}

    Explanation: The string representations differ because the funs come from -different fun expressions.

    > {fun() -> 1 end, fun() -> 1 end}. >
    -{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}

    Explanation: All funs created from fun expressions of this form in uncompiled +implementations and may change in future versions.

    Examples:

    -module(test).
    +-export([add/1, add2/0, fun_tuple/0]).
    +add(A) -> fun(B) -> A + B end.
    +add2() -> fun add/1.
    +fun_tuple() -> {fun() -> 1 end, fun() -> 1 end}.
    > {fun test:add/1, test:add2()}.
    +{fun test:add/1,#Fun<test.1.107738983>}

    Explanation: fun test:add/1 is upgradable but test:add2() is not upgradable.

    > {test:add(1), test:add(42)}.
    +{#Fun<test.0.107738983>,#Fun<test.0.107738983>}

    Explanation: test:add(1) and test:add(42) has the same string representation +as the environment is not taken into account.

    >test:fun_tuple().
    +{#Fun<test.2.107738983>,#Fun<test.3.107738983>}

    Explanation: The string representations differ because the funs come from +different fun expressions.

    > {fun() -> 1 end, fun() -> 1 end}. >
    +{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}

    Explanation: All funs created from fun expressions of this form in uncompiled code with the same arity are mapped to the same list by fun_to_list/1.

    @@ -9983,8 +9983,8 @@

    hd(List)

    -

    Returns the head of List, that is, the first element.

    It works with improper lists.

    Examples:

    > hd([1,2,3,4,5]).
    -1
    > hd([first, second, third, so_on | improper_end]).
    +

    Returns the head of List, that is, the first element.

    It works with improper lists.

    Examples:

    > hd([1,2,3,4,5]).
    +1
    > hd([first, second, third, so_on | improper_end]).
     first

    Failure: badarg if List is an empty list [].

    @@ -10019,8 +10019,8 @@

    insert_element(Index, Tuple1, Term)

    Returns a new tuple with element Term inserted at position Index in tuple Tuple1. All elements from position Index and upwards are pushed one step -higher in the new tuple Tuple2.

    For example:

    > erlang:insert_element(2, {one, two, three}, new).
    -{one,new,two,three}
    +higher in the new tuple Tuple2.

    For example:

    > erlang:insert_element(2, {one, two, three}, new).
    +{one,new,two,three}
    @@ -10052,7 +10052,7 @@

    integer_to_binary(Integer)

    -

    Returns a binary corresponding to the text representation of Integer.

    For example:

    > integer_to_binary(77).
    +

    Returns a binary corresponding to the text representation of Integer.

    For example:

    > integer_to_binary(77).
     <<"77">>
    @@ -10086,7 +10086,7 @@

    integer_to_binary(Integer, Base)

    Returns a binary corresponding to the text representation of Integer in base -Base.

    For example:

    > integer_to_binary(1023, 16).
    +Base.

    For example:

    > integer_to_binary(1023, 16).
     <<"3FF">>
    @@ -10117,7 +10117,7 @@

    integer_to_list(Integer)

    -

    Returns a string corresponding to the text representation of Integer.

    For example:

    > integer_to_list(77).
    +

    Returns a string corresponding to the text representation of Integer.

    For example:

    > integer_to_list(77).
     "77"
    @@ -10149,7 +10149,7 @@

    integer_to_list(Integer, Base)

    Returns a string corresponding to the text representation of Integer in base -Base.

    For example:

    > integer_to_list(1023, 16).
    +Base.

    For example:

    > integer_to_list(1023, 16).
     "3FF"
    @@ -10181,7 +10181,7 @@

    iolist_size(Item)

    Returns an integer, that is the size in bytes, of the binary that would be the -result of iolist_to_binary(Item).

    For example:

    > iolist_size([1,2|<<3,4>>]).
    +result of iolist_to_binary(Item).

    For example:

    > iolist_size([1,2|<<3,4>>]).
     4
    @@ -10219,7 +10219,7 @@

    iolist_to_binary(IoListOrBinary)

    <<4,5>> > Bin3 = <<6>>. <<6>> -> iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). +> iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6>>
    @@ -10263,16 +10263,16 @@

    iolist_to_iovec(IoListOrBinary)

    >
    Bin3 = <<6>>. <<6>> %% If you pass small binaries and integers it works as iolist_to_binary -> erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]). -[<<1,2,3,1,2,3,4,5,4,6>>] +> erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]). +[<<1,2,3,1,2,3,4,5,4,6>>] %% If you pass larger binaries, they are split and returned in a form %% optimized for calling the C function writev. -> erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]). -[<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +> erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]). +[<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,...>>, <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ...>>, - <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
    +
    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
    @@ -10632,11 +10632,11 @@

    is_map_key(Key, Map)

    Returns true if map Map contains Key and returns false if it does not -contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    -#{"42" => value}
    -> is_map_key("42",Map).
    +contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    +#{"42" => value}
    +> is_map_key("42",Map).
     true
    -> is_map_key(value,Map).
    +> is_map_key(value,Map).
     false
    @@ -10903,7 +10903,7 @@

    length(List)

    -

    Returns the length of List.

    For example:

    > length([1,2,3,4,5,6,7,8,9]).
    +

    Returns the length of List.

    For example:

    > length([1,2,3,4,5,6,7,8,9]).
     9
    @@ -10943,7 +10943,7 @@

    list_to_atom(String)

    garbage collected. Therefore, it is recommended to consider if list_to_existing_atom/1 is a better option than list_to_atom/1. The default limits can be found in the -Efficiency Guide (section System Limits).

    Example:

    > list_to_atom("Erlang").
    +Efficiency Guide (section System Limits).

    Example:

    > list_to_atom("Erlang").
     'Erlang'
    @@ -10980,7 +10980,7 @@

    list_to_binary(IoList)

    <<4,5>> > Bin3 = <<6>>. <<6>> -> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). +> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6>>
    @@ -11019,7 +11019,7 @@

    list_to_bitstring(BitstringList)

    <<4,5>> > Bin3 = <<6,7:4>>. <<6,7:4>> -> list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]). +> list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6,7:4>>
    @@ -11088,7 +11088,7 @@

    list_to_float(String)

    -

    Returns the float whose text representation is String.

    For example:

    > list_to_float("2.2017764e+0").
    +

    Returns the float whose text representation is String.

    For example:

    > list_to_float("2.2017764e+0").
     2.2017764

    The float string format is the same as the format for Erlang float literals except for that underscores are not permitted.

    Failure: badarg if String contains a bad representation of a float.

    @@ -11121,9 +11121,9 @@

    list_to_integer(String)

    -

    Returns an integer whose text representation is String.

    For example:

    > list_to_integer("123").
    -123
    > list_to_integer("-123").
    --123
    > list_to_integer("+123234982304982309482093833234234").
    +

    Returns an integer whose text representation is String.

    For example:

    > list_to_integer("123").
    +123
    > list_to_integer("-123").
    +-123
    > list_to_integer("+123234982304982309482093833234234").
     123234982304982309482093833234234

    String must contain at least one digit character and can have an optional prefix consisting of a single "+" or "-" character (that is, String must match the regular expression "^[+-]?[0-9]+$").

    Failure: badarg if String contains a bad representation of an integer.

    @@ -11156,11 +11156,11 @@

    list_to_integer(String, Base)

    -

    Returns an integer whose text representation in base Base is String.

    For example:

    > list_to_integer("3FF", 16).
    -1023
    > list_to_integer("+3FF", 16).
    -1023
    > list_to_integer("3ff", 16).
    -1023
    > list_to_integer("3fF", 16).
    -1023
    > list_to_integer("-3FF", 16).
    +

    Returns an integer whose text representation in base Base is String.

    For example:

    > list_to_integer("3FF", 16).
    +1023
    > list_to_integer("+3FF", 16).
    +1023
    > list_to_integer("3ff", 16).
    +1023
    > list_to_integer("3fF", 16).
    +1023
    > list_to_integer("-3FF", 16).
     -1023

    For example, when Base is 16, String must match the regular expression "^[+-]?([0-9]|[A-F]|[a-f])+$".

    Failure: badarg if String contains a bad representation of an integer.

    @@ -11192,7 +11192,7 @@

    list_to_pid(String)

    -

    Returns a process identifier whose text representation is a String.

    For example:

    > list_to_pid("<0.4.1>").
    +

    Returns a process identifier whose text representation is a String.

    For example:

    > list_to_pid("<0.4.1>").
     <0.4.1>

    Failure: badarg if String contains a bad representation of a process identifier.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11227,7 +11227,7 @@

    list_to_port(String)

    -

    Returns a port identifier whose text representation is a String.

    For example:

    > list_to_port("#Port<0.4>").
    +

    Returns a port identifier whose text representation is a String.

    For example:

    > list_to_port("#Port<0.4>").
     #Port<0.4>

    Failure: badarg if String contains a bad representation of a port identifier.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11262,7 +11262,7 @@

    list_to_ref(String)

    -

    Returns a reference whose text representation is a String.

    For example:

    > list_to_ref("#Ref<0.4192537678.4073193475.71181>").
    +

    Returns a reference whose text representation is a String.

    For example:

    > list_to_ref("#Ref<0.4192537678.4073193475.71181>").
     #Ref<0.4192537678.4073193475.71181>

    Failure: badarg if String contains a bad representation of a reference.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11294,8 +11294,8 @@

    list_to_tuple(List)

    -

    Returns a tuple corresponding to List, for example

    > list_to_tuple([share, ['Ericsson_B', 163]]).
    -{share, ['Ericsson_B', 163]}

    List can contain any Erlang terms.

    +

    Returns a tuple corresponding to List, for example

    > list_to_tuple([share, ['Ericsson_B', 163]]).
    +{share, ['Ericsson_B', 163]}

    List can contain any Erlang terms.

    @@ -11357,8 +11357,8 @@

    make_tuple(Arity, InitialValue)

    Creates a new tuple of the specified Arity, where all elements are -InitialValue.

    For example:

    > erlang:make_tuple(4, []).
    -{[],[],[],[]}
    +InitialValue.

    For example:

    > erlang:make_tuple(4, []).
    +{[],[],[],[]}
    @@ -11394,8 +11394,8 @@

    make_tuple(Arity, DefaultValue, InitList)InitList.

    Each list element in InitList must be a two-tuple, where the first element is a position in the newly created tuple and the second element is any term. If a position occurs more than once in the list, the term corresponding to the last -occurrence is used.

    For example:

    > erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).
    -{[],aa,[],[],zz}
    +occurrence is used.

    For example:

    > erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).
    +{[],aa,[],[],zz}

    @@ -11431,8 +11431,8 @@

    map_get(Key, Map)

    Returns value Value associated with Key if Map contains Key.

    The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkey,Key} exception if no value is associated with Key.

    Example:

    > Key = 1337,
    -  Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  map_get(Key,Map).
    +  Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  map_get(Key,Map).
     "value one"
    @@ -11467,7 +11467,7 @@

    map_size(Map)

    -

    Returns an integer, which is the number of key-value pairs in Map.

    For example:

    > map_size(#{a=>1, b=>2, c=>3}).
    +

    Returns an integer, which is the number of key-value pairs in Map.

    For example:

    > map_size(#{a=>1, b=>2, c=>3}).
     3
    @@ -11550,10 +11550,10 @@

    max(Term1, Term2)

    Returns the largest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

    The Expressions section contains -descriptions of the == operator and how terms are ordered.

    Examples:

    > max(1, 2).
    -2
    > max(1.0, 1).
    -1.0
    > max(1, 1.0).
    -1
    > max("abc", "b").
    +descriptions of the == operator and how terms are ordered.

    Examples:

    > max(1, 2).
    +2
    > max(1.0, 1).
    +1.0
    > max(1, 1.0).
    +1
    > max("abc", "b").
     "b"

    Change

    Allowed in guards tests from Erlang/OTP 26.

    @@ -11588,10 +11588,10 @@

    min(Term1, Term2)

    Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

    The Expressions section contains -descriptions of the == operator and how terms are ordered.

    Examples:

    > min(1, 2).
    -1
    > min(1.0, 1).
    -1.0
    > min(1, 1.0).
    -1
    > min("abc", "b").
    +descriptions of the == operator and how terms are ordered.

    Examples:

    > min(1, 2).
    +1
    > min(1.0, 1).
    +1.0
    > min(1, 1.0).
    +1
    > min("abc", "b").
     "abc"

    Change

    Allowed in guards tests from Erlang/OTP 26.

    @@ -11717,7 +11717,7 @@

    pid_to_list(Pid)

    -

    Returns a string corresponding to the text representation of Pid.

    For example:

    > erlang:pid_to_list(self()).
    +

    Returns a string corresponding to the text representation of Pid.

    For example:

    > erlang:pid_to_list(self()).
     "<0.85.0>"

    Note

    The creation for the node is not included in the list representation of Pid. This means that processes in different incarnations of a node with a specific name can get the same list representation.

    @@ -11814,10 +11814,10 @@

    round(Number)

    -

    Returns an integer by rounding Number.

    For example:

    round(42.1).
    -42
    round(5.5).
    -6
    round(-5.5).
    --6
    round(36028797018963969.0).
    +

    Returns an integer by rounding Number.

    For example:

    round(42.1).
    +42
    round(5.5).
    +6
    round(-5.5).
    +-6
    round(36028797018963969.0).
     36028797018963968

    In the last example, round(36028797018963969.0) evaluates to 36028797018963968. The reason for this is that the number 36028797018963969.0 cannot be represented exactly as a float value. Instead, @@ -11857,8 +11857,8 @@

    setelement(Index, Tuple1, Value)

    Returns a tuple that is a copy of argument Tuple1 with the element specified by integer argument Index (the first element is the element with index 1) -replaced by argument Value.

    For example:

    > setelement(2, {10, green, bottles}, red).
    -{10,red,bottles}
    +replaced by argument Value.

    For example:

    > setelement(2, {10, green, bottles}, red).
    +{10,red,bottles}
    @@ -11891,9 +11891,9 @@

    size(Item)

    Returns the number of elements in a tuple or the number of bytes in a binary or -bitstring.

    For example:

    > size({morni, mulle, bwange}).
    +bitstring.

    For example:

    > size({morni, mulle, bwange}).
     3
    -> size(<<11, 22, 33>>).
    +> size(<<11, 22, 33>>).
     3

    For bitstrings, the number of whole bytes is returned. That is, if the number of bits in the bitstring is not divisible by 8, the resulting number of bytes is rounded down.

    See also tuple_size/1, byte_size/1, and bit_size/1.

    @@ -11927,15 +11927,15 @@

    split_binary(Bin, Pos)

    Returns a tuple containing the binaries that are the result of splitting Bin -into two parts at position Pos.

    This is not a destructive operation. After the operation, there are three binaries altogether.

    For example:

    > B = list_to_binary("0123456789").
    +into two parts at position Pos.

    This is not a destructive operation. After the operation, there are three binaries altogether.

    For example:

    > B = list_to_binary("0123456789").
     <<"0123456789">>
    -> byte_size(B).
    +> byte_size(B).
     10
    -> {B1, B2} = split_binary(B,3).
    -{<<"012">>,<<"3456789">>}
    -> byte_size(B1).
    +> {B1, B2} = split_binary(B,3).
    +{<<"012">>,<<"3456789">>}
    +> byte_size(B1).
     3
    -> byte_size(B2).
    +> byte_size(B2).
     7
    @@ -11969,9 +11969,9 @@

    term_to_binary(Term)

    Returns a binary data object that is the result of encoding Term according to the Erlang external term format.

    This can be used for various purposes, for example, writing a term to a file in an efficient way, or sending an Erlang term to some type of communications -channel not supported by distributed Erlang.

    > Bin = term_to_binary(hello).
    +channel not supported by distributed Erlang.

    > Bin = term_to_binary(hello).
     <<131,100,0,5,104,101,108,108,111>>
    -> hello = binary_to_term(Bin).
    +> hello = binary_to_term(Bin).
     hello

    See also binary_to_term/1.

    Note

    There is no guarantee that this function will return the same encoded representation for the same term.

    @@ -12204,10 +12204,10 @@

    tl(List)

    -

    Returns the tail of List, that is, the list minus the first element

    It works with improper lists.

    Examples:

    > tl([geesties, guilies, beasties]).
    -[guilies, beasties]
    > tl([geesties]).
    -[]
    > tl([geesties, guilies, beasties | improper_end]).
    -[guilies, beasties | improper_end]
    > tl([geesties | improper_end]).
    +

    Returns the tail of List, that is, the list minus the first element

    It works with improper lists.

    Examples:

    > tl([geesties, guilies, beasties]).
    +[guilies, beasties]
    > tl([geesties]).
    +[]
    > tl([geesties, guilies, beasties | improper_end]).
    +[guilies, beasties | improper_end]
    > tl([geesties | improper_end]).
     improper_end

    Failure: badarg if List is an empty list [].

    @@ -12240,10 +12240,10 @@

    trunc(Number)

    -

    Truncates the decimals of Number.

    For example:

    > trunc(5.7).
    -5
    > trunc(-5.7).
    --5
    > trunc(5).
    -5
    > trunc(36028797018963969.0).
    +

    Truncates the decimals of Number.

    For example:

    > trunc(5.7).
    +5
    > trunc(-5.7).
    +-5
    > trunc(5).
    +5
    > trunc(36028797018963969.0).
     36028797018963968

    In the last example, trunc(36028797018963969.0) evaluates to 36028797018963968. The reason for this is that the number 36028797018963969.0 cannot be represented exactly as a float value. Instead, @@ -12282,7 +12282,7 @@

    tuple_size(Tuple)

    -

    Returns an integer that is the number of elements in Tuple.

    For example:

    > tuple_size({morni, mulle, bwange}).
    +

    Returns an integer that is the number of elements in Tuple.

    For example:

    > tuple_size({morni, mulle, bwange}).
     3
    @@ -12314,8 +12314,8 @@

    tuple_to_list(Tuple)

    Returns a list corresponding to Tuple. Tuple can contain any Erlang terms. -Example:

    > tuple_to_list({share, {'Ericsson_B', 163}}).
    -[share,{'Ericsson_B',163}]
    +Example:

    > tuple_to_list({share, {'Ericsson_B', 163}}).
    +[share,{'Ericsson_B',163}]
    @@ -12486,27 +12486,27 @@

    alias(Opts)

    unalias/1. This is also the default behaviour if no options are passed or if alias/0 is called.

  • reply - The alias will be automatically deactivated when a reply message sent via the alias is received. The alias can also still be deactivated via a -call to unalias/1.

  • Example:

    server() ->
    +call to unalias/1.

    Example:

    server() ->
         receive
    -        {request, AliasReqId, Request} ->
    -            Result = perform_request(Request),
    -            AliasReqId ! {reply, AliasReqId, Result}
    +        {request, AliasReqId, Request} ->
    +            Result = perform_request(Request),
    +            AliasReqId ! {reply, AliasReqId, Result}
         end,
    -    server().
    +    server().
     
    -client(ServerPid, Request) ->
    -    AliasReqId = alias([reply]),
    -    ServerPid ! {request, AliasReqId, Request},
    +client(ServerPid, Request) ->
    +    AliasReqId = alias([reply]),
    +    ServerPid ! {request, AliasReqId, Request},
         %% Alias will be automatically deactivated if we receive a reply
         %% since we used the 'reply' option...
         receive
    -        {reply, AliasReqId, Result} -> Result
    +        {reply, AliasReqId, Result} -> Result
         after 5000 ->
    -            unalias(AliasReqId),
    +            unalias(AliasReqId),
                 %% Flush message queue in case the reply arrived
                 %% just before the alias was deactivated...
    -            receive {reply, AliasReqId, Result} -> Result
    -            after 0 -> exit(timeout)
    +            receive {reply, AliasReqId, Result} -> Result
    +            after 0 -> exit(timeout)
                 end
         end.

    Note that both the server and the client in this example must be executing on at least OTP 24 systems in order for this to work.

    For more information on process aliases see the @@ -12577,9 +12577,9 @@

    apply(Module, Function, Args)

    Returns the result of applying Function in Module to Args. The applied function must be exported from Module. The arity of the function is the length -of Args.

    For example:

    > apply(lists, reverse, [[a, b, c]]).
    -[c,b,a]
    -> apply(erlang, atom_to_list, ['Erlang']).
    +of Args.

    For example:

    > apply(lists, reverse, [[a, b, c]]).
    +[c,b,a]
    +> apply(erlang, atom_to_list, ['Erlang']).
     "Erlang"

    If the number of arguments are known at compile time, the call is better written as Module:Function(Arg1, Arg2, ..., ArgN).

    Failure: error_handler:undefined_function/3 is called if the applied function is not exported. The error handler can be redefined (see process_flag/2). If @@ -12700,9 +12700,9 @@

    demonitor(MonitorRef, OptionList)

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

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

    Options:

    • flush - Removes (one) {_, MonitorRef, _, _, _} message, if there is one, from the caller message queue after monitoring has been stopped.

      Calling demonitor(MonitorRef, [flush]) is equivalent to the -following, but more efficient:

      demonitor(MonitorRef),
      +following, but more efficient:

      demonitor(MonitorRef),
       receive
      -    {_, MonitorRef, _, _, _} ->
      +    {_, MonitorRef, _, _, _} ->
               true
       after 0 ->
               true
      @@ -12741,10 +12741,10 @@ 

      erase()

      -

      Returns the process dictionary and deletes it.

      For example:

      > put(key1, {1, 2, 3}),
      -put(key2, [a, b, c]),
      -erase().
      -[{key1,{1,2,3}},{key2,[a,b,c]}]
      +

      Returns the process dictionary and deletes it.

      For example:

      > put(key1, {1, 2, 3}),
      +put(key2, [a, b, c]),
      +erase().
      +[{key1,{1,2,3}},{key2,[a,b,c]}]
    @@ -12777,10 +12777,10 @@

    erase(Key)

    Returns the value Val associated with Key and deletes it from the process dictionary. Returns undefined if no value is associated with Key.

    The average time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

    For example:

    > put(key1, {merry, lambs, are, playing}),
    -X = erase(key1),
    -{X, erase(key1)}.
    -{{merry,lambs,are,playing},undefined}
    +items in the process dictionary.

    For example:

    > put(key1, {merry, lambs, are, playing}),
    +X = erase(key1),
    +{X, erase(key1)}.
    +{{merry,lambs,are,playing},undefined}
    @@ -12814,14 +12814,14 @@

    error(Reason)

    has happened (for example, a function is called with a parameter that has an incorrect type). See the guide about errors and error handling for additional information. -Example:

    > catch error(foobar).
    -{'EXIT',{foobar,[{shell,apply_fun,3,
    -                        [{file,"shell.erl"},{line,906}]},
    -                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,677}]},
    -                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,430}]},
    -                 {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
    -                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
    -                 {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}
    +Example:

    > catch error(foobar).
    +{'EXIT',{foobar,[{shell,apply_fun,3,
    +                        [{file,"shell.erl"},{line,906}]},
    +                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,677}]},
    +                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,430}]},
    +                 {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
    +                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
    +                 {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}
    @@ -12860,13 +12860,13 @@

    error(Reason, Args)

    has happened (for example, a function is called with a parameter that has an incorrect type). See the guide about errors and error handling for additional information. -Example:

    test.erl:

    -module(test).
    --export([example_fun/2]).
    +Example:

    test.erl:

    -module(test).
    +-export([example_fun/2]).
     
    -example_fun(A1, A2) ->
    -    erlang:error(my_error, [A1, A2]).

    Erlang shell:

    6> c(test).
    -{ok,test}
    -7> test:example_fun(arg1,"this is the second argument").
    +example_fun(A1, A2) ->
    +    erlang:error(my_error, [A1, A2]).

    Erlang shell:

    6> c(test).
    +{ok,test}
    +7> test:example_fun(arg1,"this is the second argument").
     ** exception error: my_error
          in function  test:example_fun/2
              called as test:example_fun(arg1,"this is the second argument")
    @@ -12955,10 +12955,10 @@

    exit(Reason)

    stopped (for example when a message telling a process to stop is received).

    This function differ from error/1,2,3 by causing an exception of a different class and by having a reason that does not include the list of functions from the call stack.

    See the guide about errors and error handling for -additional information.

    Example:

    > exit(foobar).
    +additional information.

    Example:

    > exit(foobar).
     ** exception exit: foobar
    -> catch exit(foobar).
    -{'EXIT',foobar}

    Note

    If a process calls exit(kill) and does not catch the exception, +> catch exit(foobar). +{'EXIT',foobar}

    Note

    If a process calls exit(kill) and does not catch the exception, it will terminate with exit reason kill and also emit exit signals with exit reason kill (not killed) to all linked processes. Such exit signals with exit reason kill can be trapped by the linked processes. Note that this @@ -13169,11 +13169,11 @@

    get()

    Returns the process dictionary as a list of {Key, Val} tuples. The items in -the returned list can be in any order.

    For example:

    > put(key1, merry),
    -put(key2, lambs),
    -put(key3, {are, playing}),
    -get().
    -[{key1,merry},{key2,lambs},{key3,{are,playing}}]
    +the returned list can be in any order.

    For example:

    > put(key1, merry),
    +put(key2, lambs),
    +put(key3, {are, playing}),
    +get().
    +[{key1,merry},{key2,lambs},{key3,{are,playing}}]
    @@ -13206,11 +13206,11 @@

    get(Key)

    Returns the value Val associated with Key in the process dictionary, or undefined if Key does not exist.

    The expected time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

    For example:

    > put(key1, merry),
    -put(key2, lambs),
    -put({any, [valid, term]}, {are, playing}),
    -get({any, [valid, term]}).
    -{are,playing}
    +items in the process dictionary.

    For example:

    > put(key1, merry),
    +put(key2, lambs),
    +put({any, [valid, term]}, {are, playing}),
    +get({any, [valid, term]}).
    +{are,playing}
    @@ -13243,11 +13243,11 @@

    get_keys()

    Returns a list of all keys present in the process dictionary. The items in the -returned list can be in any order.

    For example:

    > put(dog, {animal,1}),
    -put(cow, {animal,2}),
    -put(lamb, {animal,3}),
    -get_keys().
    -[dog,cow,lamb]
    +returned list can be in any order.

    For example:

    > put(dog, {animal,1}),
    +put(cow, {animal,2}),
    +put(lamb, {animal,3}),
    +get_keys().
    +[dog,cow,lamb]
    @@ -13278,14 +13278,14 @@

    get_keys(Val)

    Returns a list of keys that are associated with the value Val in the process -dictionary. The items in the returned list can be in any order.

    For example:

    > put(mary, {1, 2}),
    -put(had, {1, 2}),
    -put(a, {1, 2}),
    -put(little, {1, 2}),
    -put(dog, {1, 3}),
    -put(lamb, {1, 2}),
    -get_keys({1, 2}).
    -[mary,had,a,little,lamb]
    +dictionary. The items in the returned list can be in any order.

    For example:

    > put(mary, {1, 2}),
    +put(had, {1, 2}),
    +put(a, {1, 2}),
    +put(little, {1, 2}),
    +put(dog, {1, 3}),
    +put(lamb, {1, 2}),
    +get_keys({1, 2}).
    +[mary,had,a,little,lamb]
    @@ -13448,9 +13448,9 @@

    is_process_alive(Pid)

    aliveness of P2 is checked. This guarantee means that one can use is_process_alive/1 to let a process P1 wait until a process P2, which has got an exit signal with reason kill from P1, is -killed.

    For example:

    exit(P2Pid, kill),
    +killed.

    For example:

    exit(P2Pid, kill),
     % P2 might not be killed
    -is_process_alive(P2Pid),
    +is_process_alive(P2Pid),
     % P2 is not alive (the call above always return false)

    See the documentation about signals and erlang:exit/2 for more information about signals and exit signals.

    @@ -13543,7 +13543,7 @@

    monitor(Type, Item)

    Sends a monitor request of type Type to the entity identified by Item.

    If the monitored entity does not exist or it changes monitored state, the caller -of monitor/2 is notified by a message on the following format:

    {Tag, MonitorRef, Type, Object, Info}

    Note

    The monitor request is an asynchronous signal. That is, it takes time before +of monitor/2 is notified by a message on the following format:

    {Tag, MonitorRef, Type, Object, Info}

    Note

    The monitor request is an asynchronous signal. That is, it takes time before the signal reaches its destination.

    Type can be one of the following atoms: process, port or time_offset.

    A process or port monitor is triggered only once, after that it is removed from both monitoring process and the monitored entity. Monitors are fired when the monitored process or port terminates, does not exist at the moment of @@ -13552,7 +13552,7 @@

    monitor(Type, Item)

    demonitor/1 is called.

    A process or port monitor by name resolves the RegisteredName to pid/0 or port/0 only once at the moment of monitor instantiation, later changes to the name registration will not affect the existing monitor.

    When a process or port monitor is triggered, a 'DOWN' message is sent that -has the following pattern:

    {'DOWN', MonitorRef, Type, Object, Info}

    In the monitor message MonitorRef and Type are the same as described +has the following pattern:

    {'DOWN', MonitorRef, Type, Object, Info}

    In the monitor message MonitorRef and Type are the same as described earlier, and:

    • Object - The monitored entity, which triggered the event. When monitoring a process or a local port, Object will be equal to the pid/0 or port/0 that was being monitored. When monitoring process or port by @@ -13596,7 +13596,7 @@

      monitor(Type, Item)

      under normal operation this is to be detected within a minute, but during heavy load it can take longer time.

      The monitor is not automatically removed after it has been triggered. That is, repeated changes of the time offset trigger the monitor repeatedly.

      When the monitor is triggered a 'CHANGE' message is sent to the monitoring -process. A 'CHANGE' message has the following pattern:

      {'CHANGE', MonitorRef, Type, Item, NewTimeOffset}

      where MonitorRef, Type, and Item are the same as described above, and +process. A 'CHANGE' message has the following pattern:

      {'CHANGE', MonitorRef, Type, Item, NewTimeOffset}

      where MonitorRef, Type, and Item are the same as described above, and NewTimeOffset is the new time offset.

      When the 'CHANGE' message has been received you are guaranteed not to retrieve the old time offset when calling erlang:time_offset/0. Notice that you can observe the @@ -13662,25 +13662,25 @@

      monitor(Type, Item, Opts)

      monitor will be automatically removed regardless of whether the response is a reply or a 'DOWN' message. The alias can also still be deactivated via a call to unalias/1. Note that if the alias is removed using -the unalias/1 BIF, the monitor will still be left active.

    Example:

    server() ->
    +the unalias/1 BIF, the monitor will still be left active.

    Example:

    server() ->
         receive
    -        {request, AliasReqId, Request} ->
    -            Result = perform_request(Request),
    -            AliasReqId ! {reply, AliasReqId, Result}
    +        {request, AliasReqId, Request} ->
    +            Result = perform_request(Request),
    +            AliasReqId ! {reply, AliasReqId, Result}
         end,
    -    server().
    +    server().
     
    -client(ServerPid, Request) ->
    -    AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
    -    ServerPid ! {request, AliasMonReqId, Request},
    +client(ServerPid, Request) ->
    +    AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
    +    ServerPid ! {request, AliasMonReqId, Request},
         %% Alias as well as monitor will be automatically deactivated if we
         %% receive a reply or a 'DOWN' message since we used 'reply_demonitor'
         %% as unalias option...
         receive
    -        {reply, AliasMonReqId, Result} ->
    +        {reply, AliasMonReqId, Result} ->
                 Result;
    -        {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
    -            error(ExitReason)
    +        {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
    +            error(ExitReason)
         end.

    Note that both the server and the client in this example must be executing on at least OTP 24 systems in order for this to work.

    For more information on process aliases see the Process Aliases section @@ -13690,42 +13690,42 @@

    monitor(Type, Item, Opts)

    in the down message will be replaced by UserDefinedTag.

    An example of how the {tag, UserDefinedTag} option can be used in order to enable the new selective receive optimization, -introduced in OTP 24, when making multiple requests to different servers:

    server() ->
    +introduced in OTP 24, when making multiple requests to different servers:

    server() ->
         receive
    -        {request, From, ReqId, Request} ->
    -            Result = perform_request(Request),
    -            From ! {reply, self(), ReqId, Result}
    +        {request, From, ReqId, Request} ->
    +            Result = perform_request(Request),
    +            From ! {reply, self(), ReqId, Result}
         end,
    -    server().
    -
    -client(ServerPids, Request) when is_list(ServerPids) ->
    -    ReqId = make_ref(),
    -    lists:foreach(fun (ServerPid) ->
    -                          _ = monitor(process, ServerPid,
    -                                      [{tag, {'DOWN', ReqId}}]),
    -                          ServerPid ! {request, self(), ReqId, Request}
    +    server().
    +
    +client(ServerPids, Request) when is_list(ServerPids) ->
    +    ReqId = make_ref(),
    +    lists:foreach(fun (ServerPid) ->
    +                          _ = monitor(process, ServerPid,
    +                                      [{tag, {'DOWN', ReqId}}]),
    +                          ServerPid ! {request, self(), ReqId, Request}
                       end,
    -                  ServerPids),
    -    receive_replies(ReqId, length(ServerPids), []).
    +                  ServerPids),
    +    receive_replies(ReqId, length(ServerPids), []).
     
    -receive_replies(_ReqId, 0, Acc) ->
    +receive_replies(_ReqId, 0, Acc) ->
         Acc;
    -receive_replies(ReqId, N, Acc) ->
    +receive_replies(ReqId, N, Acc) ->
         %% The compiler will detect that we match on the 'ReqId'
         %% reference in all clauses, and will enable the selective
         %% receive optimization which makes the receive able to
         %% skip past all messages present in the message queue at
         %% the time when the 'ReqId' reference was created...
         Res = receive
    -              {reply, ServerPid, ReqId, Result} ->
    +              {reply, ServerPid, ReqId, Result} ->
                       %% Here we typically would have deactivated the
                       %% monitor by a call to demonitor(Mon, [flush]) but
                       %% we ignore this in this example for simplicity...
    -                  {ok, ServerPid, Result};
    -              {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
    -                  {error, ServerPid, ExitReason}
    +                  {ok, ServerPid, Result};
    +              {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
    +                  {error, ServerPid, ExitReason}
               end,
    -    receive_replies(ReqId, N-1, [Res | Acc]).

    In order for this example to work as intended, the client must be executing on + receive_replies(ReqId, N-1, [Res | Acc]).

    In order for this example to work as intended, the client must be executing on at least an OTP 24 system, but the servers may execute on older systems.

    @@ -14467,7 +14467,7 @@

    process_flag(Flag, Value)

    Sets the process flag indicated to the specified value. Returns the previous value -of the flag.

    Flag is one of the following:

    • process_flag(async_dist, boolean())

      Enable or disable fully asynchronous distributed signaling for the calling +of the flag.

      Flag is one of the following:

      • process_flag(async_dist, boolean())

        Enable or disable fully asynchronous distributed signaling for the calling process. When disabled, which is the default, the process sending a distributed signal will block in the send operation if the buffer for the distribution channel reach the distribution buffer busy limit. The @@ -14492,14 +14492,14 @@

        process_flag(Flag, Value)

        command line argument +pad <boolean> when starting the runtime system. If the +pad <boolean> command line argument is not passed, the default value of the async_dist flag will be false.

        You can inspect the state of the async_dist process flag of a process by -calling process_info(Pid, async_dist).

      • process_flag(trap_exit, boolean())

        When trap_exit is set to true, exit signals arriving to a process are +calling process_info(Pid, async_dist).

      • process_flag(trap_exit, boolean())

        When trap_exit is set to true, exit signals arriving to a process are converted to {'EXIT', From, Reason} messages, which can be received as ordinary messages. If trap_exit is set to false, the process exits if it receives an exit signal other than normal and the exit signal is propagated to -its linked processes. Application processes are normally not to trap exits.

        See also exit/2.

      • process_flag(error_handler, module())

        Used by a process to redefine the error_handler for undefined function calls and +its linked processes. Application processes are normally not to trap exits.

        See also exit/2.

      • process_flag(error_handler, module())

        Used by a process to redefine the error_handler for undefined function calls and undefined registered processes. Use this flag with substantial caution, as code -auto-loading depends on the correct operation of the error handling module.

      • process_flag(fullsweep_after,  non_neg_integer())

        Changes the maximum number of generational collections before forcing a -fullsweep for the calling process.

      • process_flag(min_heap_size, non_neg_integer())

        Changes the minimum heap size for the calling process.

      • process_flag(min_bin_vheap_size, non_neg_integer())

        Changes the minimum binary virtual heap size for the calling process.

      • process_flag(max_heap_size, max_heap_size())

        This flag sets the maximum heap size for the calling process. If MaxHeapSize +auto-loading depends on the correct operation of the error handling module.

      • process_flag(fullsweep_after,  non_neg_integer())

        Changes the maximum number of generational collections before forcing a +fullsweep for the calling process.

      • process_flag(min_heap_size, non_neg_integer())

        Changes the minimum heap size for the calling process.

      • process_flag(min_bin_vheap_size, non_neg_integer())

        Changes the minimum binary virtual heap size for the calling process.

      • process_flag(max_heap_size, max_heap_size())

        This flag sets the maximum heap size for the calling process. If MaxHeapSize is an integer, the system default values for kill and error_logger are used.

        For details on how the heap grows, see Sizing the heap in the ERTS internal documentation.

        • size - The maximum size in words of the process. If set to zero, the @@ -14535,7 +14535,7 @@

          process_flag(Flag, Value)

          memory that is used during the garbage collection. When contemplating using this option, it is recommended to first run it in production with kill set to false and inspect the log events to see what the normal peak sizes of the -processes in the system is and then tune the value accordingly.

        • process_flag(message_queue_data, message_queue_data())

          Determines how messages in the message queue are stored, as follows:

          • off_heap - All messages in the message queue will be stored outside +processes in the system is and then tune the value accordingly.

          • process_flag(message_queue_data, message_queue_data())

            Determines how messages in the message queue are stored, as follows:

            • off_heap - All messages in the message queue will be stored outside the process heap. This implies that no messages in the message queue will be part of a garbage collection of the process.

            • on_heap - All messages in the message queue will eventually be placed on the process heap. They can, however, be temporarily stored off the heap. This @@ -14547,7 +14547,7 @@

              process_flag(Flag, Value)

              consume large amounts of memory. The performance of the actual message passing is, however, generally better when the flag value is on_heap.

              Changing the flag value causes any existing messages to be moved. The move operation is initiated, but not necessarily completed, by the time the function -returns.

            • process_flag(priority, priority_level())

              Sets the process priority. Level is an atom. Four priority levels exist: +returns.

            • process_flag(priority, priority_level())

              Sets the process priority. Level is an atom. Four priority levels exist: low, normal, high, and max. Default is normal.

              Note

              Priority level max is reserved for internal use in the Erlang runtime system, and is not to be used by others.

              Internally in each priority level, processes are scheduled in a round robin fashion.

              Execution of processes on priority normal and low are interleaved. Processes @@ -14576,7 +14576,7 @@

              process_flag(Flag, Value)

              are used, use them with care, especially priority high. A process on priority high is only to perform work for short periods. Busy looping for long periods in a high priority process causes most likely problems, as important -OTP servers run on priority normal.

            • process_flag(save_calls, 0..10000)

              N must be an integer in the interval 0..10000. If N > 0, call saving is made +OTP servers run on priority normal.

            • process_flag(save_calls, 0..10000)

              N must be an integer in the interval 0..10000. If N > 0, call saving is made active for the process. This means that information about the N most recent global function calls, BIF calls, sends, and receives made by the process are saved in a list, which can be retrieved with @@ -14585,7 +14585,7 @@

              process_flag(Flag, Value)

              amount of information is saved, as follows:

              • A tuple {Module, Function, Arity} for function calls
              • The atoms send, 'receive', and timeout for sends and receives ('receive' when a message is received and timeout when a receive times out)

              If N = 0, call saving is disabled for the process, which is the default. -Whenever the size of the call saving list is set, its contents are reset.

            • process_flag(sensitive, boolean())

              Sets or clears flag sensitive for the current process. When a process has been +Whenever the size of the call saving list is set, its contents are reset.

            • process_flag(sensitive, boolean())

              Sets or clears flag sensitive for the current process. When a process has been marked as sensitive by calling process_flag(sensitive, true), features in the runtime system that can be used for examining the data or inner working of the process @@ -14844,8 +14844,8 @@

              processes()

              currently existing on the local node.

              Notice that an exiting process exists, but is not alive. That is, is_process_alive/1 returns false for an exiting process, but its process identifier is part of the result returned from -processes/0.

              Example:

              > processes().
              -[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]
              +processes/0.

              Example:

              > processes().
              +[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]
              @@ -14879,10 +14879,10 @@

              put(Key, Val)

              returns undefined. If Key exists, the old value is deleted and replaced by Val, and the function returns the old value.

              The average time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

              For example:

              > X = put(name, walrus), Y = put(name, carpenter),
              -Z = get(name),
              -{X, Y, Z}.
              -{undefined,walrus,carpenter}

              Note

              The values stored when put is evaluated within the scope of a catch are +items in the process dictionary.

              For example:

              > X = put(name, walrus), Y = put(name, carpenter),
              +Z = get(name),
              +{X, Y, Z}.
              +{undefined,walrus,carpenter}

              Note

              The values stored when put is evaluated within the scope of a catch are not retracted if a throw is evaluated, or if an error occurs.

              @@ -14965,7 +14965,7 @@

              register(RegName, PidOrPort)

              name registry. RegName, which must be an atom, can be used instead of the pid or port identifier in send operator (RegName ! Message) and most other BIFs that take -a pid or port identifies as an argument.

              For example:

              > register(db, Pid).
              +a pid or port identifies as an argument.

              For example:

              > register(db, Pid).
               true

              The registered name is considered a Directly Visible Erlang Resource and is automatically unregistered when the process terminates.

              Failures:

              • badarg - If PidOrPort is not an existing local process or port.

              • badarg - If RegName is already in use.

              • badarg - If the process or port is already registered (already has a @@ -14999,8 +14999,8 @@

                registered()

                -

                Returns a list of names that have been registered using register/2.

                For example:

                > registered().
                -[code_server, file_server, init, user, my_db]
                +

                Returns a list of names that have been registered using register/2.

                For example:

                > registered().
                +[code_server, file_server, init, user, my_db]
                @@ -15067,7 +15067,7 @@

                self()

                -

                Returns the process identifier of the calling process.

                For example:

                > self().
                +

                Returns the process identifier of the calling process.

                For example:

                > self().
                 <0.26.0>
                @@ -15331,7 +15331,7 @@

                spawn(Module, Function, Args)

                (see process_flag/2). If error_handler is undefined, or the user has redefined the default error_handler and its replacement is undefined, a failure with reason undef -occurs.

                Example:

                > spawn(speed, regulator, [high_speed, thin_cut]).
                +occurs.

                Example:

                > spawn(speed, regulator, [high_speed, thin_cut]).
                 <0.13.1>
                @@ -16323,14 +16323,14 @@

                throw(Any)

                Raises an exception of class throw. Intended to be used to do non-local returns from functions.

                If evaluated within a catch expression, the -catch expression returns value Any.

                For example:

                > catch throw({hello, there}).
                -        {hello,there}

                If evaluated within a try-block of a +catch expression returns value Any.

                For example:

                > catch throw({hello, there}).
                +        {hello,there}

                If evaluated within a try-block of a try expression, the value Any can be caught within the catch block.

                For example:

                try
                -    throw({my_exception, "Something happened"})
                +    throw({my_exception, "Something happened"})
                 catch
                -    throw:{my_exception, Desc} ->
                -        io:format(standard_error, "Error: ~s~n", [Desc])
                +    throw:{my_exception, Desc} ->
                +        io:format(standard_error, "Error: ~s~n", [Desc])
                 end

                Failure: nocatch if not caught by an exception handler.

                See the guide about errors and error handling for additional information.

                @@ -16412,9 +16412,9 @@

                unlink(Id)

                result of the link, but may also be the result of the unlikee sending the caller an exit signal by calling the exit/2 BIF. Therefore, it may or may not be appropriate to clean up the message queue after a call to -unlink(Id) as follows, when trapping exits:

                unlink(Id),
                +unlink(Id) as follows, when trapping exits:

                unlink(Id),
                 receive
                -    {'EXIT', Id, _} ->
                +    {'EXIT', Id, _} ->
                         true
                 after 0 ->
                         true
                @@ -16455,7 +16455,7 @@ 

                unregister(RegName)

                Removes the registered name RegName associated with a process identifier or a port identifier from the -name registry.

                For example:

                > unregister(db).
                +name registry.

                For example:

                > unregister(db).
                 true

                Keep in mind that you can still receive signals associated with the registered name after it has been unregistered as the sender may have looked up the name before sending to it.

                Users are advised not to unregister system processes.

                Failure: badarg if RegName is not a registered name.

                @@ -16491,7 +16491,7 @@

                whereis(RegName)

                Returns the process identifier or port identifier with the registered name RegName from the name registry. Returns -undefined if the name is not registered.

                For example:

                > whereis(db).
                +undefined if the name is not registered.

                For example:

                > whereis(db).
                 <0.43.0>
                @@ -16570,7 +16570,7 @@

                halt()

                -

                Equivalent to calling halt(0, []).

                For example:

                > halt().
                +

                Equivalent to calling halt(0, []).

                For example:

                > halt().
                 os_prompt%
                @@ -16603,7 +16603,7 @@

                halt(HaltType)

                -

                Equivalent to calling halt(HaltType, []).

                For example:

                > halt(17).
                +

                Equivalent to calling halt(HaltType, []).

                For example:

                > halt(17).
                 os_prompt% echo $?
                 17
                 os_prompt%
                @@ -16640,7 +16640,7 @@

                halt/2

                -

                Halt the runtime system.

                • halt(Status :: non_neg_integer(), Options :: halt_options())

                  Halt the runtime system with status code Status.

                  Note

                  On many platforms, the OS supports only status codes 0-255. A too large +

                  Halt the runtime system.

                  • halt(Status :: non_neg_integer(), Options :: halt_options())

                    Halt the runtime system with status code Status.

                    Note

                    On many platforms, the OS supports only status codes 0-255. A too large status code is truncated by clearing the high bits.

                    Currently the following options are valid:

                    • {flush, EnableFlushing} - If EnableFlushing equals true, which also is the default behavior, the runtime system will perform the following operations before terminating:

                      • Flush all outstanding output.
                      • Send all Erlang ports exit signals and wait for them to exit.
                      • Wait for all async threads to complete all outstanding async jobs.
                      • Call all installed NIF on halt callbacks.
                      • Wait for all ongoing @@ -16657,10 +16657,10 @@

                        halt/2

                        with the exit code 255. If flushing is not enabled, the timeout will have no effect on the system.

                        See also the erl +zhft <Timeout> command line flag. Note that the shortest timeout set by the command line flag and the -flush_timeout option will be the actual timeout value in effect.

                        Since: OTP 27.0

                    • halt(Abort :: abort, Options :: halt_options())

                      Halt the Erlang runtime system by aborting and produce a core dump if core +flush_timeout option will be the actual timeout value in effect.

                      Since: OTP 27.0

                  • halt(Abort :: abort, Options :: halt_options())

                    Halt the Erlang runtime system by aborting and produce a core dump if core dumping has been enabled in the environment that the runtime system is executing in.

                    Note

                    The {flush, boolean()} option will be ignored, and -flushing will be disabled.

                  • halt(CrashDumpSlogan :: string(), Options :: halt_options())

                    Halt the Erlang runtime system and generate an +flushing will be disabled.

                • halt(CrashDumpSlogan :: string(), Options :: halt_options())

                  Halt the Erlang runtime system and generate an Erlang crash dump. The string CrashDumpSlogan will be used as slogan in the Erlang crash dump created. The slogan will be trunkated if CrashDumpSlogan is longer than 1023 characters.

                  Note

                  The {flush, boolean()} option will be ignored, and @@ -16851,11 +16851,11 @@

                  statistics(Item)

                  -

                  Returns statistics about the current system.

                  The possible flags are:

                  • statistics(active_tasks) -> [non_neg_integer()]

                    Returns the same as +

                    Returns statistics about the current system.

                    The possible flags are:

                    • statistics(active_tasks) -> [non_neg_integer()]

                      Returns the same as statistics(active_tasks_all) with the exception that no information about the dirty IO run queue and its associated schedulers is part of the result. That is, only tasks that are -expected to be CPU bound are part of the result.

                      Available since OTP 18.3

                    • statistics(active_tasks_all) -> [non_neg_integer()]

                      Returns a list where each element represents the amount of active processes and +expected to be CPU bound are part of the result.

                      Available since OTP 18.3

                    • statistics(active_tasks_all) -> [non_neg_integer()]

                      Returns a list where each element represents the amount of active processes and ports on each run queue and its associated schedulers. That is, the number of processes and ports that are ready to run, or are currently running. Values for normal run queues and their associated schedulers are located first in the @@ -16877,11 +16877,11 @@

                      statistics(Item)

                      statistics(run_queue_lengths_all), statistics(total_run_queue_lengths), and -statistics(total_run_queue_lengths_all).

                      Available since OTP 20.0

                    • statistics(context_switches) -> {non_neg_integer(), 0}

                      Returns the total number of context switches since the system started.

                    • statistics(exact_reductions) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                      Returns the number of exact reductions.

                      Note

                      statistics(exact_reductions) is a more expensive operation -than statistics(reductions).

                    • statistics(garbage_collection) ->
                      -  { NumerOfGCs :: non_neg_integer(), WordsReclaimed :: non_neg_integer(), 0}

                      Returns information about garbage collection, for example:

                      > statistics(garbage_collection).
                      -{85,23961,0}

                      This information can be invalid for some implementations.

                    • statistics(io) -> {{input, non_neg_integer()}, {output, non_neg_integer()}}

                      Returns Input, which is the total number of bytes received through ports, and -Output, which is the total number of bytes output to ports.

                    • statistics(microstate_accounting) -> [MSAcc_Thread]

                      Microstate accounting can be used to measure how much time the Erlang runtime +statistics(total_run_queue_lengths_all).

                      Available since OTP 20.0

                    • statistics(context_switches) -> {non_neg_integer(), 0}

                      Returns the total number of context switches since the system started.

                    • statistics(exact_reductions) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                      Returns the number of exact reductions.

                      Note

                      statistics(exact_reductions) is a more expensive operation +than statistics(reductions).

                    • statistics(garbage_collection) ->
                      +  { NumerOfGCs :: non_neg_integer(), WordsReclaimed :: non_neg_integer(), 0}

                      Returns information about garbage collection, for example:

                      > statistics(garbage_collection).
                      +{85,23961,0}

                      This information can be invalid for some implementations.

                    • statistics(io) -> {{input, non_neg_integer()}, {output, non_neg_integer()}}

                      Returns Input, which is the total number of bytes received through ports, and +Output, which is the total number of bytes output to ports.

                    • statistics(microstate_accounting) -> [MSAcc_Thread]

                      Microstate accounting can be used to measure how much time the Erlang runtime system spends doing various tasks. It is designed to be as lightweight as possible, but some overhead exists when this is enabled. Microstate accounting is meant to be a profiling tool to help finding performance bottlenecks. To @@ -16890,23 +16890,23 @@

                      statistics(Item)

                      representing some of the OS threads within ERTS. Each map contains type and id fields that can be used to identify what thread it is, and also a counters field that contains data about how much time has been spent in the various -states.

                      Example:

                      > erlang:statistics(microstate_accounting).
                      -[#{counters => #{aux => 1899182914,
                      +states.

                      Example:

                      > erlang:statistics(microstate_accounting).
                      +[#{counters => #{aux => 1899182914,
                                        check_io => 2605863602,
                                        emulator => 45731880463,
                                        gc => 1512206910,
                                        other => 5421338456,
                                        port => 221631,
                      -                 sleep => 5150294100},
                      +                 sleep => 5150294100},
                          id => 1,
                      -   type => scheduler}|...]

                      The time unit is the same as returned by os:perf_counter/0. So, to convert it -to milliseconds, you can do something like this:

                      lists:map(
                      -  fun(#{ counters := Cnt } = M) ->
                      -         MsCnt = maps:map(fun(_K, PerfCount) ->
                      -                                    erlang:convert_time_unit(PerfCount, perf_counter, 1000)
                      -                           end, Cnt),
                      -         M#{ counters := MsCnt }
                      -  end, erlang:statistics(microstate_accounting)).

                      Notice that these values are not guaranteed to be the exact time spent in each + type => scheduler}|...]

                      The time unit is the same as returned by os:perf_counter/0. So, to convert it +to milliseconds, you can do something like this:

                      lists:map(
                      +  fun(#{ counters := Cnt } = M) ->
                      +         MsCnt = maps:map(fun(_K, PerfCount) ->
                      +                                    erlang:convert_time_unit(PerfCount, perf_counter, 1000)
                      +                           end, Cnt),
                      +         M#{ counters := MsCnt }
                      +  end, erlang:statistics(microstate_accounting)).

                      Notice that these values are not guaranteed to be the exact time spent in each state. This is because of various optimisation done to keep the overhead as small as possible.

                      MSAcc_Thread_Types:

                      • scheduler - The main execution threads that do most of the work. See erl +S for more details.

                      • dirty_cpu_scheduler - The threads for long running cpu intensive work. @@ -16938,20 +16938,20 @@

                        statistics(Item)

                        statistics.

                        Returns undefined if system flag microstate_accounting is turned off.

                        The list of thread information is unsorted and can appear in different order -between calls.

                        Note

                        The threads and states are subject to change without any prior notice.

                        Available since OTP 19.0

                      • statistics(reductions) -> {Reductions :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                        Returns information about reductions, for example:

                        > statistics(reductions).
                        -{2046,11}

                        Change

                        As from ERTS 5.5 (Erlang/OTP R11B), this value does not include reductions +between calls.

                        Note

                        The threads and states are subject to change without any prior notice.

                        Available since OTP 19.0

                      • statistics(reductions) -> {Reductions :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                        Returns information about reductions, for example:

                        > statistics(reductions).
                        +{2046,11}

                        Change

                        As from ERTS 5.5 (Erlang/OTP R11B), this value does not include reductions performed in current time slices of currently scheduled processes. If an exact value is wanted, use -statistics(exact_reductions).

                      • statistics(run_queue) -> non_neg_integer()

                        Returns the total length of all normal and dirty CPU run queues. That is, queued +statistics(exact_reductions).

                • statistics(run_queue) -> non_neg_integer()

                  Returns the total length of all normal and dirty CPU run queues. That is, queued work that is expected to be CPU bound. The information is gathered atomically. That is, the result is a consistent snapshot of the state, but this operation is much more expensive compared to statistics(total_run_queue_lengths), -especially when a large amount of schedulers is used.

                • statistics(run_queue_lengths) -> [non_neg_integer()]

                  Returns the same as +especially when a large amount of schedulers is used.

                • statistics(run_queue_lengths) -> [non_neg_integer()]

                  Returns the same as statistics(run_queue_lengths_all) with the exception that no information about the dirty IO run queue is part of the result. That is, only run queues with work that is expected to be CPU bound -is part of the result.

                  Available since OTP 18.3

                • statistics(run_queue_lengths_all) -> [non_neg_integer()]

                  Returns a list where each element represents the amount of processes and ports +is part of the result.

                  Available since OTP 18.3

                • statistics(run_queue_lengths_all) -> [non_neg_integer()]

                  Returns a list where each element represents the amount of processes and ports ready to run for each run queue. Values for normal run queues are located first in the resulting list. The first element corresponds to the normal run queue of scheduler number 1 and so on. If support for dirty schedulers exist, values for @@ -16971,13 +16971,13 @@

                  statistics(Item)

                  statistics(active_tasks), statistics(active_tasks_all), and statistics(total_active_tasks), -statistics(total_active_tasks_all).

                  Available since OTP 20.0

                • statistics(runtime) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about runtime, in milliseconds.

                  This is the sum of the runtime for all threads in the Erlang runtime system and +statistics(total_active_tasks_all).

                  Available since OTP 20.0

                • statistics(runtime) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about runtime, in milliseconds.

                  This is the sum of the runtime for all threads in the Erlang runtime system and can therefore be greater than the wall clock time.

                  Warning

                  This value might wrap due to limitations in the underlying functionality -provided by the operating system that is used.

                  Example:

                  > statistics(runtime).
                  -{1690,1620}
                • statistics(scheduler_wall_time) ->
                  -  [{Id :: pos_integer,
                  -    ActiveTime :: non_neg_integer(),
                  -    TotalTime :: non_neg_integer()}] |
                  +provided by the operating system that is used.

                  Example:

                  > statistics(runtime).
                  +{1690,1620}
                • statistics(scheduler_wall_time) ->
                  +  [{Id :: pos_integer,
                  +    ActiveTime :: non_neg_integer(),
                  +    TotalTime :: non_neg_integer()}] |
                     undefined

                  Returns information describing how much time normal and dirty CPU schedulers in the @@ -17017,52 +17017,52 @@

                  statistics(Item)

                  This fact has to be taken under consideration when evaluating the result returned.

                  You can use scheduler_wall_time to calculate scheduler utilization. First you take a sample of the values returned by -erlang:statistics(scheduler_wall_time).

                  > erlang:system_flag(scheduler_wall_time, true).
                  +erlang:statistics(scheduler_wall_time).

                  > erlang:system_flag(scheduler_wall_time, true).
                   false
                  -> Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                  +> Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                   ok

                  Some time later the user takes another snapshot and calculates scheduler -utilization per scheduler, for example:

                  > Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                  +utilization per scheduler, for example:

                  > Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                   ok
                  -> lists:map(fun({{I, A0, T0}, {I, A1, T1}}) ->
                  -        {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).
                  -[{1,0.9743474730177548},
                  - {2,0.9744843782751444},
                  - {3,0.9995902361669045},
                  - {4,0.9738012596572161},
                  - {5,0.9717956667018103},
                  - {6,0.9739235846420741},
                  - {7,0.973237033077876},
                  - {8,0.9741297293248656}]

                  Using the same snapshots to calculate a total scheduler utilization:

                  > {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) ->
                  -        {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)),
                  +> lists:map(fun({{I, A0, T0}, {I, A1, T1}}) ->
                  +        {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).
                  +[{1,0.9743474730177548},
                  + {2,0.9744843782751444},
                  + {3,0.9995902361669045},
                  + {4,0.9738012596572161},
                  + {5,0.9717956667018103},
                  + {6,0.9739235846420741},
                  + {7,0.973237033077876},
                  + {8,0.9741297293248656}]

                  Using the same snapshots to calculate a total scheduler utilization:

                  > {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) ->
                  +        {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)),
                     TotalSchedulerUtilization = A/T.
                   0.9769136803764825

                  Total scheduler utilization will equal 1.0 when all schedulers have been active all the time between the two measurements.

                  Another (probably more) useful value is to calculate total scheduler utilization -weighted against maximum amount of available CPU time:

                  > WeightedSchedulerUtilization = (TotalSchedulerUtilization
                  -                                  * (erlang:system_info(schedulers)
                  -                                     + erlang:system_info(dirty_cpu_schedulers)))
                  -                                 / erlang:system_info(logical_processors_available).
                  +weighted against maximum amount of available CPU time:

                  > WeightedSchedulerUtilization = (TotalSchedulerUtilization
                  +                                  * (erlang:system_info(schedulers)
                  +                                     + erlang:system_info(dirty_cpu_schedulers)))
                  +                                 / erlang:system_info(logical_processors_available).
                   0.9769136803764825

                  This weighted scheduler utilization will reach 1.0 when schedulers are active the same amount of time as maximum available CPU time. If more schedulers exist than available logical processors, this value may be greater than 1.0.

                  As of ERTS version 9.0, the Erlang runtime system will as default have more schedulers than logical processors. This due to the dirty schedulers.

                  Note

                  scheduler_wall_time is by default disabled. To enable it, use -erlang:system_flag(scheduler_wall_time, true).

                  Available since OTP R15B01

                • statistics(scheduler_wall_time_all) ->
                  -  [{Id :: pos_integer,
                  -    ActiveTime :: non_neg_integer(),
                  -    TotalTime :: non_neg_integer()}] |
                  +erlang:system_flag(scheduler_wall_time, true).

                  Available since OTP R15B01

                • statistics(scheduler_wall_time_all) ->
                  +  [{Id :: pos_integer,
                  +    ActiveTime :: non_neg_integer(),
                  +    TotalTime :: non_neg_integer()}] |
                     undefined

                  Equivalent to statistics(scheduler_wall_time), except that it also include information about all dirty I/O schedulers.

                  Dirty IO schedulers will have scheduler identifiers in the range erlang:system_info(schedulers)+erlang:system_info(dirty_cpu_schedulers)< SchedulerId =< erlang:system_info(schedulers) + erlang:system_info(dirty_cpu_schedulers) +erlang:system_info(dirty_io_schedulers).

                  Note

                  Note that work executing on dirty I/O schedulers are expected to mainly wait for I/O. That is, when you get high scheduler utilization on dirty I/O -schedulers, CPU utilization is not expected to be high due to this work.

                  Available since OTP 20.0

                • statistics(total_active_tasks) -> non_neg_integer()

                  Equivalent to calling +schedulers, CPU utilization is not expected to be high due to this work.

                  Available since OTP 20.0

                • statistics(total_active_tasks) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(active_tasks)), -but more efficient.

                  Available since OTP 18.3

                • statistics(total_active_tasks_all) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 18.3

                • statistics(total_active_tasks_all) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(active_tasks_all)), -but more efficient.

                  Available since OTP 20.0

                • statistics(total_run_queue_lengths) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 20.0

                • statistics(total_run_queue_lengths) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(run_queue_lengths)), -but more efficient.

                  Available since OTP 18.3

                • statistics(total_run_queue_lengths_all) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 18.3

                • statistics(total_run_queue_lengths_all) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(run_queue_lengths_all)), -but more efficient.

                  Available since OTP 20.0

                • statistics(wall_clock) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about wall clock. wall_clock can be used in the same +but more efficient.

                  Available since OTP 20.0

                • statistics(wall_clock) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about wall clock. wall_clock can be used in the same manner as runtime, except that real time is measured as opposed to runtime or CPU time.

                @@ -17136,9 +17136,9 @@

                system_flag(Flag, Value)

                -

                Sets a system flag to the given value.

                The possible flags to set are:

                • system_flag(backtrace_depths, non_neg_integer()) -> non_neg_integer()

                  Sets the maximum depth of call stack back-traces in the exit reason element of +

                  Sets a system flag to the given value.

                  The possible flags to set are:

                  • system_flag(backtrace_depths, non_neg_integer()) -> non_neg_integer()

                    Sets the maximum depth of call stack back-traces in the exit reason element of 'EXIT' tuples. The flag also limits the stacktrace depth returned by -process_info/2 item current_stacktrace.

                    Returns the old value of the flag.

                  • system_flag(cpu_topology, cpu_topology()) -> cpu_topology()

                    Warning

                    This argument is deprecated. Instead of using this argument, use +process_info/2 item current_stacktrace.

                    Returns the old value of the flag.

                  • system_flag(cpu_topology, cpu_topology()) -> cpu_topology()

                    Warning

                    This argument is deprecated. Instead of using this argument, use command-line argument +sct in erl.

                    When this argument is removed, a final CPU topology to use is determined at emulator boot time.

                    Sets the user-defined CpuTopology. The user-defined CPU topology overrides any automatically detected CPU topology. By passing undefined as CpuTopology, @@ -17150,7 +17150,7 @@

                    system_flag(Flag, Value)

                    +sct to erl.

                    For information on type CpuTopology and more, see erlang:system_info(cpu_topology) as well as command-line flags +sct and -+sbt in erl.

                  • system_flag(dirty_cpu_schedulers_online, pos_integer()) -> pos_integer()

                    Sets the number of dirty CPU schedulers online. Range is ++sbt in erl.

                  • system_flag(dirty_cpu_schedulers_online, pos_integer()) -> pos_integer()

                    Sets the number of dirty CPU schedulers online. Range is 1 <= DirtyCPUSchedulersOnline <= N, where N is the smallest of the return values of erlang:system_info(dirty_cpu_schedulers) and erlang:system_info(schedulers_online).

                    Returns the old value of the flag.

                    The number of dirty CPU schedulers online can change if the number of schedulers @@ -17162,31 +17162,31 @@

                    system_flag(Flag, Value)

                    of schedulers online.

                    For more information, see erlang:system_info(dirty_cpu_schedulers) and -erlang:system_info(dirty_cpu_schedulers_online).

                    Available since OTP 17.0

                  • system_flag(erts_alloc, {Alloc :: atom(), F :: atom(), V :: integer()}) ->
                    +erlang:system_info(dirty_cpu_schedulers_online).

                    Available since OTP 17.0

                  • system_flag(erts_alloc, {Alloc :: atom(), F :: atom(), V :: integer()}) ->
                       ok | notsup

                    Sets system flags for erts_alloc(3). Alloc is the allocator to affect, for example binary_alloc. F is the flag to change and V is the new value.

                    Only a subset of all erts_alloc flags can be changed at run time. This subset -is currently only the flag sbct.

                    Returns ok if the flag was set or notsup if not supported by erts_alloc.

                    Available since OTP 20.2.3

                  • system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()

                    Sets system flag fullsweep_after. Number is a non-negative integer +is currently only the flag sbct.

                    Returns ok if the flag was set or notsup if not supported by erts_alloc.

                    Available since OTP 20.2.3

                  • system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()

                    Sets system flag fullsweep_after. Number is a non-negative integer indicating how many times generational garbage collections can be done without forcing a fullsweep collection. The value applies to new processes, while processes already running are not affected.

                    Returns the old value of the flag.

                    In low-memory systems (especially without virtual memory), setting the value to 0 can help to conserve memory.

                    This value can also be set through (OS) environment variable -ERL_FULLSWEEP_AFTER.

                  • system_flag(microstate_accounting, true | false | reset) -> boolean()

                    Turns on/off microstate accounting measurements. When passing reset, all +ERL_FULLSWEEP_AFTER.

                  • system_flag(microstate_accounting, true | false | reset) -> boolean()

                    Turns on/off microstate accounting measurements. When passing reset, all counters are reset to 0.

                    For more information see -statistics(microstate_accounting).

                    Available since OTP 19.0

                  • system_flag(min_heap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum heap size for processes. The size is specified in +statistics(microstate_accounting).

                    Available since OTP 19.0

                  • system_flag(min_heap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum heap size for processes. The size is specified in words. The new min_heap_size effects only processes spawned after the change of min_heap_size has been made. min_heap_size can be set for individual -processes by using spawn_opt/4 or process_flag/2.

                    Returns the old value of the flag.

                  • system_flag(min_bin_vheap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum binary virtual heap size for processes. The size is +processes by using spawn_opt/4 or process_flag/2.

                    Returns the old value of the flag.

                  • system_flag(min_bin_vheap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum binary virtual heap size for processes. The size is specified in words. The new min_bin_vhheap_size effects only processes spawned after the change of min_bin_vheap_size has been made. min_bin_vheap_size can be set for individual processes by using spawn_opt/2,3,4 or -process_flag/2.

                    Returns the old value of the flag.

                    Available since OTP R13B04

                  • system_flag(max_heap_size, max_heap_size()) -> max_heap_size()

                    Sets the default maximum heap size settings for processes. The size is specified +process_flag/2.

                    Returns the old value of the flag.

                    Available since OTP R13B04

                  • system_flag(max_heap_size, max_heap_size()) -> max_heap_size()

                    Sets the default maximum heap size settings for processes. The size is specified in words. The new max_heap_size effects only processes spawned after the change has been made. max_heap_size can be set for individual processes using spawn_opt/2,3,4 or process_flag/2.

                    Returns the old value of the flag.

                    For details on how the heap grows, see Sizing the heap in the ERTS internal -documentation.

                    Available since OTP 19.0

                  • system_flag(multi_scheduling, BlockState) -> OldBlockState when
                    +documentation.

                    Available since OTP 19.0

                  • system_flag(multi_scheduling, BlockState) -> OldBlockState when
                       BlockState :: block | unblock | block_normal | unblock_normal,
                       OldBlockState :: blocked | disabled | enabled

                    If multi-scheduling is enabled, more than one scheduler thread is used by the emulator. Multi-scheduling can be blocked in two different ways. Either all @@ -17215,7 +17215,7 @@

                    system_flag(Flag, Value)

                    erlang:system_info(multi_scheduling), erlang:system_info(normal_multi_scheduling_blockers), erlang:system_info(multi_scheduling_blockers), -and erlang:system_info(schedulers).

                  • system_flag(outstanding_system_requests_limit, 1..134217727) -> 1..134217727

                    Sets a limit on the amount of outstanding requests made by a system process +and erlang:system_info(schedulers).

                  • system_flag(outstanding_system_requests_limit, 1..134217727) -> 1..134217727

                    Sets a limit on the amount of outstanding requests made by a system process orchestrating system wide changes. Currently there are two such processes:

                    • The Code Purger - The code purger orchestrates checking of references to old code before old code is removed from the system.

                    • The Literal Area Collector - The literal area collector orchestrates copying of references from old literal areas before removal of such areas from @@ -17226,8 +17226,8 @@

                      system_flag(Flag, Value)

                      quickly as possible at the same time as other work will be interleaved with this work. Currently used limit can be checked by calling erlang:system_info(outstanding_system_requests_limit).

                      This limit can also be set by passing the command line argument -+zosrl <Limit> to erl.

                      Available since OTP 24.2

                    • system_flag(scheduler_bind_type, scheduler_bind_type() | default_bind) ->
                      -  scheduler_bind_type()

                      Warning

                      This argument is deprecated. Instead of using this argument, use ++zosrl <Limit> to erl.

                      Available since OTP 24.2

                    • system_flag(scheduler_bind_type, scheduler_bind_type() | default_bind) ->
                      +  scheduler_bind_type()

                      Warning

                      This argument is deprecated. Instead of using this argument, use command-line argument +sbt in erl. When this argument is removed, a final scheduler bind type to use is determined at emulator boot time.

                      Controls if and how schedulers are bound to logical processors.

                      When erlang:system_flag(scheduler_bind_type, How) is called, an asynchronous @@ -17261,7 +17261,7 @@

                      system_flag(Flag, Value)

                      erlang:system_info(scheduler_bind_type), erlang:system_info(scheduler_bindings), as well as command-line flags +sbt and -+sct in erl.

                    • system_flag(scheduler_wall_time, boolean()) -> boolean()

                      Try enable or disable scheduler wall time measurements by passing Boolean as ++sct in erl.

                    • system_flag(scheduler_wall_time, boolean()) -> boolean()

                      Try enable or disable scheduler wall time measurements by passing Boolean as either true or false.

                      For more information about how to use scheduler wall time measurements, see statistics(scheduler_wall_time).

                      Scheduler wall time measurements has a node global state. It is either enabled for all processes on the node or disabled for all processes. Each process has a @@ -17273,7 +17273,7 @@

                      system_flag(Flag, Value)

                      counter will also disappear. To ensure scheduler_wall_time is kept enabled, the process that enabled it must therefore be kept alive.

                      Returns the old value of the node global state, true if scheduler wall time measurements were enabled, false if it were disabled.

                      Scheduler wall time measurements do consume some cpu overhead and should not be -left turned on unless used.

                      Available since OTP R15B01

                    • system_flag(schedulers_online, pos_integer()) -> pos_integer()

                      Sets the number of schedulers online. Range is +left turned on unless used.

                      Available since OTP R15B01

                    • system_flag(schedulers_online, pos_integer()) -> pos_integer()

                      Sets the number of schedulers online. Range is 1 <= SchedulersOnline <= erlang:system_info(schedulers).

                      Returns the old value of the flag.

                      If the emulator was built with support for dirty schedulers, changing the number of schedulers online can also change the number of dirty CPU @@ -17284,23 +17284,23 @@

                      system_flag(Flag, Value)

                      dirty CPU schedulers online increases proportionally to increases in the number of schedulers online.

                      For more information, see erlang:system_info(schedulers) and -erlang:system_info(schedulers_online).

                    • system_flag(system_logger, logger | undefined | pid()) -> logger | undefined | pid()

                      Sets the process that will receive the logging messages generated by ERTS. If +erlang:system_info(schedulers_online).

                    • system_flag(system_logger, logger | undefined | pid()) -> logger | undefined | pid()

                      Sets the process that will receive the logging messages generated by ERTS. If set to undefined, all logging messages generated by ERTS will be dropped. The -messages will be in the format:

                      {log,Level,Format,ArgList,Metadata} where
                      -
                      -Level = atom(),
                      -Format = string(),
                      -ArgList = list(term()),
                      -Metadata = #{ pid => pid(),
                      -   group_leader => pid(),
                      -   time := logger:timestamp(),
                      -   error_logger := #{ emulator := true, tag := atom() }

                      If the system_logger process dies, this flag will be reset to logger.

                      The default is the process named logger.

                      Returns the old value of the flag.

                      Note

                      This function is designed to be used by the KERNEL logger. Be careful if +messages will be in the format:

                      {log,Level,Format,ArgList,Metadata} where
                      +
                      +Level = atom(),
                      +Format = string(),
                      +ArgList = list(term()),
                      +Metadata = #{ pid => pid(),
                      +   group_leader => pid(),
                      +   time := logger:timestamp(),
                      +   error_logger := #{ emulator := true, tag := atom() }

                      If the system_logger process dies, this flag will be reset to logger.

                      The default is the process named logger.

                      Returns the old value of the flag.

                      Note

                      This function is designed to be used by the KERNEL logger. Be careful if you change it to something else as log messages may be lost. If you want to intercept emulator log messages, do it by adding a specialized handler to the -KERNEL logger.

                      Available since OTP 21.2

                    • system_flag(trace_control_word, non_neg_integer()) -> non_neg_integer()

                      Sets the value of the node trace control word to TCW, which is to be an +KERNEL logger.

                      Available since OTP 21.2

                    • system_flag(trace_control_word, non_neg_integer()) -> non_neg_integer()

                      Sets the value of the node trace control word to TCW, which is to be an unsigned integer. For more information, see function set_tcw in section "Match Specifications in Erlang" -in the User's Guide.

                      Returns the old value of the flag.

                    • system_flag(time_offset, finalize) -> preliminary | final | volatile

                      Finalizes the time offset when +in the User's Guide.

                      Returns the old value of the flag.

                    • system_flag(time_offset, finalize) -> preliminary | final | volatile

                      Finalizes the time offset when single time warp mode is used. If another time warp mode is used, the time offset state is left unchanged.

                      Returns the old state identifier, that is:

                      • If preliminary is returned, finalization was performed and the time offset is now final.
                      • If final is returned, the time offset was already in the final state. This @@ -17512,14 +17512,14 @@

                        system_info(Item)

                        allocated by the emulator. Some values are part of other values, and some memory areas are not part of the result. For information about the total amount of memory allocated by the emulator, see -erlang:memory/0,1.

                      • allocator - Returns

                        {Allocator :: undefined | glibc,
                        - Version :: [non_neg_integer()],
                        - Features :: [atom()],
                        - Settings :: [{Subsystem :: atom(),
                        -               [{Parameter :: atom(),
                        -                 Value :: term()}]
                        -               }]
                        -}

                        where

                        • allocator - Returns

                          {Allocator :: undefined | glibc,
                          + Version :: [non_neg_integer()],
                          + Features :: [atom()],
                          + Settings :: [{Subsystem :: atom(),
                          +               [{Parameter :: atom(),
                          +                 Value :: term()}]
                          +               }]
                          +}

                          where

                          • Allocator corresponds to the malloc() implementation used. If Allocator equals undefined, the malloc() implementation used cannot be identified. glibc can be identified.
                          • Version is a list of integers (but not a string) representing the version of the malloc() implementation used.
                          • Features is a list of atoms representing the allocation features used.
                          • Settings is a list of subsystems, their configurable parameters, and used @@ -18415,8 +18415,8 @@

                            date()

                            Returns the current date as {Year, Month, Day}.

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the -OS System Time.

                            For example:

                            > date().
                            -{1995,2,19}
                            +OS System Time.

                            For example:

                            > date().
                            +{1995,2,19}
                            @@ -18445,8 +18445,8 @@

                            localtime()

                            Returns the current local date and time, -{{Year, Month, Day}, {Hour, Minute, Second}}.

                            For example:

                            > erlang:localtime().
                            -{{1996,11,6},{14,45,17}}

                            The time zone and Daylight Saving Time correction depend on the underlying OS. +{{Year, Month, Day}, {Hour, Minute, Second}}.

                            For example:

                            > erlang:localtime().
                            +{{1996,11,6},{14,45,17}}

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the OS System Time.

                            @@ -18481,8 +18481,8 @@

                            localtime_to_universaltime(Localtime)

                            Converts local date and time to Universal Time Coordinated (UTC), if supported by the underlying OS. Otherwise no conversion is done and Localtime is -returned.

                            For example:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).
                            -{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            +returned.

                            For example:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).
                            +{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            @@ -18519,12 +18519,12 @@

                            localtime_to_universaltime(Localtime, IsDst Time is active.

                            If IsDst == true, Localtime is during Daylight Saving Time, if IsDst == false it is not. If IsDst == undefined, the underlying OS can guess, which is the same as calling -erlang:localtime_to_universaltime(Localtime).

                            Examples:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).
                            -{{1996,11,6},{12,45,17}}
                            -> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).
                            -{{1996,11,6},{13,45,17}}
                            -> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).
                            -{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            +erlang:localtime_to_universaltime(Localtime).

                            Examples:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).
                            +{{1996,11,6},{12,45,17}}
                            +> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).
                            +{{1996,11,6},{13,45,17}}
                            +> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).
                            +{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            @@ -18952,8 +18952,8 @@

                            time()

                            Returns the current time as {Hour, Minute, Second}.

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the -OS System Time.

                            For example:

                            > time().
                            -{9,42,44}
                            +OS System Time.

                            For example:

                            > time().
                            +{9,42,44}
                            @@ -19066,12 +19066,12 @@

                            timestamp()

                            The reason for the existence of erlang:timestamp() is purely to simplify use for existing code that assumes this time stamp format. Current Erlang system time can more efficiently be retrieved in the time unit of your choice using -erlang:system_time/1.

                            The erlang:timestamp() BIF is equivalent to:

                            timestamp() ->
                            -    ErlangSystemTime = erlang:system_time(microsecond),
                            +erlang:system_time/1.

                            The erlang:timestamp() BIF is equivalent to:

                            timestamp() ->
                            +    ErlangSystemTime = erlang:system_time(microsecond),
                                 MegaSecs = ErlangSystemTime div 1000_000_000_000,
                                 Secs = ErlangSystemTime div 1000_000 - MegaSecs*1000_000,
                                 MicroSecs = ErlangSystemTime rem 1000_000,
                            -    {MegaSecs, Secs, MicroSecs}.

                            It, however, uses a native implementation that does not build garbage on the + {MegaSecs, Secs, MicroSecs}.

                            It, however, uses a native implementation that does not build garbage on the heap and with slightly better performance.

                            Note

                            This time is not a monotonically increasing time in the general case. For more information, see the documentation of time warp modes in the User's Guide.

                            @@ -19106,8 +19106,8 @@

                            universaltime()

                            in the form {{Year, Month, Day}, {Hour, Minute, Second}} if supported by the underlying OS. Otherwise erlang:universaltime() is equivalent to erlang:localtime(). The return value is based on the -OS System Time.

                            For example:

                            > erlang:universaltime().
                            -{{1996,11,6},{14,18,43}}
                            +OS System Time.

                            For example:

                            > erlang:universaltime().
                            +{{1996,11,6},{14,18,43}}
                            @@ -19140,8 +19140,8 @@

                            universaltime_to_localtime(Universaltime)Converts Universal Time Coordinated (UTC) date and time to local date and time in the form {{Year, Month, Day}, {Hour, Minute, Second}} if supported by the -underlying OS. Otherwise no conversion is done, and Universaltime is returned.

                            For example:

                            > erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).
                            -{{1996,11,7},{15,18,43}}

                            Failure: badarg if Universaltime denotes an invalid date and time.

                            +underlying OS. Otherwise no conversion is done, and Universaltime is returned.

                            For example:

                            > erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).
                            +{{1996,11,7},{15,18,43}}

                            Failure: badarg if Universaltime denotes an invalid date and time.

                            diff --git a/prs/8803/erts-15.0.1/doc/html/erlsrv_cmd.html b/prs/8803/erts-15.0.1/doc/html/erlsrv_cmd.html index 59fd4444ef286..b30c71ae73d57 100644 --- a/prs/8803/erts-15.0.1/doc/html/erlsrv_cmd.html +++ b/prs/8803/erts-15.0.1/doc/html/erlsrv_cmd.html @@ -315,28 +315,28 @@

                            ** A Console control handler that ignores the log off events, ** and lets the default handler take care of other events. */ -BOOL WINAPI service_aware_handler(DWORD ctrl){ - if(ctrl == CTRL_LOGOFF_EVENT) +BOOL WINAPI service_aware_handler(DWORD ctrl){ + if(ctrl == CTRL_LOGOFF_EVENT) return TRUE; - if(ctrl == CTRL_SHUTDOWN_EVENT) + if(ctrl == CTRL_SHUTDOWN_EVENT) return TRUE; return FALSE; -} +} -void initialize_handler(void){ - char buffer[2]; +void initialize_handler(void){ + char buffer[2]; /* * We assume we are running as a service if this * environment variable is defined. */ - if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, - (DWORD) 2)){ + if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, + (DWORD) 2)){ /* ** Actually set the control handler */ - SetConsoleCtrlHandler(&service_aware_handler, TRUE); - } -}

                + SetConsoleCtrlHandler(&service_aware_handler, TRUE); + } +}

                diff --git a/prs/8803/erts-15.0.1/doc/html/escript_cmd.html b/prs/8803/erts-15.0.1/doc/html/escript_cmd.html index 92b2fc82ba31f..26399d497e2e5 100644 --- a/prs/8803/erts-15.0.1/doc/html/escript_cmd.html +++ b/prs/8803/erts-15.0.1/doc/html/escript_cmd.html @@ -131,7 +131,7 @@

                Synopsis

                -
                script-name [arg1 arg2...]

                +
                script-name [arg1 arg2...]

                @@ -143,24 +143,24 @@

                $ cat factorial

                #!/usr/bin/env escript
                 %% -*- erlang -*-
                 %%! -sname factorial -mnesia debug verbose
                -main([String]) ->
                +main([String]) ->
                     try
                -        N = list_to_integer(String),
                -        F = fac(N),
                -        io:format("factorial ~w = ~w\n", [N,F])
                +        N = list_to_integer(String),
                +        F = fac(N),
                +        io:format("factorial ~w = ~w\n", [N,F])
                     catch
                         _:_ ->
                -            usage()
                +            usage()
                     end;
                -main(_) ->
                -    usage().
                +main(_) ->
                +    usage().
                 
                -usage() ->
                -    io:format("usage: factorial integer\n"),
                -    halt(1).
                +usage() ->
                +    io:format("usage: factorial integer\n"),
                +    halt(1).
                 
                -fac(0) -> 1;
                -fac(N) -> N * fac(N-1).
                $ ./factorial 5
                +fac(0) -> 1;
                +fac(N) -> N * fac(N-1).
                $ ./factorial 5
                 factorial 5 = 120
                 $ ./factorial
                 usage: factorial integer
                @@ -173,7 +173,7 @@ 

                If the directive is present, it must be located on the second line.

                If a comment selecting the encoding exists, it can be located on the second line.

                Note

                The encoding specified by the above mentioned comment applies to the script itself. The encoding of the I/O-server, however, must be set explicitly as -follows:

                io:setopts([{encoding, latin1}])

                The default encoding of the I/O-server for +follows:

                io:setopts([{encoding, latin1}])

                The default encoding of the I/O-server for standard_io is unicode if its supported. (see section Summary of Options) in @@ -192,7 +192,7 @@

                script (the pathname is usually, but not always, absolute).

                If the file contains source code (as in the example above), it is processed by the epp preprocessor. This means that you, for example, can use predefined macros (such as ?MODULE) and include directives like the -include_lib -directive. For example, use

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

                to include the record definitions for the records used by function +directive. For example, use

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

                to include the record definitions for the records used by function file:read_link_info/1. You can also select encoding by including an encoding comment here, but if a valid encoding comment exists on the second line, it takes precedence.

                The script is checked for syntactic and semantic correctness before it is run. @@ -200,7 +200,7 @@

                script will still be run. If there are errors, they are printed and the script will not be run and its exit status is 127.

                Both the module declaration and the export declaration of the main/1 function are optional.

                By default, the script will be compiled by the Erlang compiler.

                It is possible to force it to be interpreted by including the following line -somewhere in the script file:

                -mode(interpret).

                Execution of interpreted code is slower than compiled code, and some language +somewhere in the script file:

                -mode(interpret).

                Execution of interpreted code is slower than compiled code, and some language constructs will not work, but there is no requirement for the Erlang compiler application to be available.

                Change

                Before Erlang/OTP 27 the script would be interpreted by default.

                diff --git a/prs/8803/erts-15.0.1/doc/html/garbagecollection.html b/prs/8803/erts-15.0.1/doc/html/garbagecollection.html index db44445b99a28..7f8b39b4c7492 100644 --- a/prs/8803/erts-15.0.1/doc/html/garbagecollection.html +++ b/prs/8803/erts-15.0.1/doc/html/garbagecollection.html @@ -137,25 +137,25 @@

                Creating Data

                -

                Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

                Let's look at an example that returns a tuple with the newly created data.

                data(Foo) ->
                -   Cons = [42|Foo],
                -   Literal = {text, "hello world!"},
                -   {tag, Cons, Literal}.

                In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

                On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

                Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

                ...
                -{test_heap,6,1}.
                -{put_list,{integer,42},{x,0},{x,1}}.
                -{put_tuple,3,{x,0}}.
                -{put,{atom,tag}}.
                -{put,{x,1}}.
                -{put,{literal,{text,"hello world!"}}}.
                +

                Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

                Let's look at an example that returns a tuple with the newly created data.

                data(Foo) ->
                +   Cons = [42|Foo],
                +   Literal = {text, "hello world!"},
                +   {tag, Cons, Literal}.

                In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

                On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

                Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

                ...
                +{test_heap,6,1}.
                +{put_list,{integer,42},{x,0},{x,1}}.
                +{put_tuple,3,{x,0}}.
                +{put,{atom,tag}}.
                +{put,{x,1}}.
                +{put,{literal,{text,"hello world!"}}}.
                 return.

                Looking at the assembler code we can see three things: The heap requirement in this function turns out to be only six words, as seen by the {test_heap,6,1} instruction. All the allocations are combined to a single instruction. The bulk of the data {text, "hello world!"} is a literal. Literals, sometimes referred to as constants, are not allocated in the function since they are a part of the module and allocated at load time.

                If there is not enough space available on the heap to satisfy the test_heap instructions request for memory, then a garbage collection is initiated. It may happen immediately in the test_heap instruction, or it can be delayed until a later time depending on what state the process is in. If the garbage collection is delayed, any memory needed will be allocated in heap fragments. Heap fragments are extra memory blocks that are a part of the young heap, but are not allocated in the contiguous area where terms normally reside. See The young heap for more details.

                The collector

                -

                Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

                Garbage collection: initial values

                It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

                After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

                foo(Arg) ->
                -    T = {test, Arg},
                -    {wrapper, T, T, T}.

                Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

                Garbage collection: root set scan

                After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

                Garbage collection: heap scan

                Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

                Garbage collection: heap scan

                When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

                +

                Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

                Garbage collection: initial values

                It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

                After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

                foo(Arg) ->
                +    T = {test, Arg},
                +    {wrapper, T, T, T}.

                Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

                Garbage collection: root set scan

                After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

                Garbage collection: heap scan

                Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

                Garbage collection: heap scan

                When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

                @@ -179,11 +179,11 @@

                Literals

                -

                When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

                if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
                +

                When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

                if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
                   /* literal or non fullsweep - do not copy */
                -} else {
                -  copy(ptr);
                -}

                The erts_is_literal check works differently on different architectures and operating systems.

                On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

                On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

                On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

                This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

                +} else { + copy(ptr); +}

                The erts_is_literal check works differently on different architectures and operating systems.

                On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

                On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

                On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

                This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

                diff --git a/prs/8803/erts-15.0.1/doc/html/inet_cfg.html b/prs/8803/erts-15.0.1/doc/html/inet_cfg.html index 4bc1d8fab5617..39254df1af49d 100644 --- a/prs/8803/erts-15.0.1/doc/html/inet_cfg.html +++ b/prs/8803/erts-15.0.1/doc/html/inet_cfg.html @@ -165,11 +165,11 @@

                The user configuration file is always examined last in the configuration process, making it possible for the user to override any default values or previously made settings. Call inet:get_rc() to view the state of the inet -configuration database.

                The valid configuration parameters are as follows:

                • {file, Format, File}.
                  -  Format = atom()
                  -  File = string()

                  Specify a system file that Erlang is to read configuration data from. Format -tells the parser how the file is to be interpreted:

                  • resolv (Unix resolv.conf)
                  • host_conf_freebsd (FreeBSD host.conf)
                  • host_conf_bsdos (BSDOS host.conf)
                  • host_conf_linux (Linux host.conf)
                  • nsswitch_conf (Unix nsswitch.conf)
                  • hosts (Unix hosts)

                  File is to specify the filename with full path.

                • {resolv_conf, File}.
                  -  File = string()

                  Specify a system file that Erlang is to read resolver configuration from for +configuration database.

                  The valid configuration parameters are as follows:

                  • {file, Format, File}.
                    +  Format = atom()
                    +  File = string()

                    Specify a system file that Erlang is to read configuration data from. Format +tells the parser how the file is to be interpreted:

                    • resolv (Unix resolv.conf)
                    • host_conf_freebsd (FreeBSD host.conf)
                    • host_conf_bsdos (BSDOS host.conf)
                    • host_conf_linux (Linux host.conf)
                    • nsswitch_conf (Unix nsswitch.conf)
                    • hosts (Unix hosts)

                    File is to specify the filename with full path.

                  • {resolv_conf, File}.
                    +  File = string()

                    Specify a system file that Erlang is to 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 can override the configuration parameters nameserver and search depending on the contents of the specified file. They can also change any time @@ -177,61 +177,61 @@

                    in the future. This emulates the old behavior 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 /etc/resolv.conf unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

                  • {hosts_file, File}.
                    -  File = string()

                    Specify a system file that Erlang is to read resolver configuration from for +for this file to some maybe other than /etc.

                  • {hosts_file, File}.
                    +  File = string()

                    Specify a system file that Erlang is to 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 lookup option file is used.

                    If the file is specified as an empty string "", no file is read or monitored in the future. This emulates the old behavior 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 /etc/hosts unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

                  • {registry, Type}.
                    -  Type = atom()

                    Specify a system registry that Erlang is to read configuration data from. -win32 is the only valid option.

                  • {host, IP, Aliases}.
                    -  IP = tuple()

                    Aliases = [string()]

                    Add host entry to the hosts table.

                  • {domain, Domain}.
                    -  Domain = string()

                    Set domain name.

                  • {nameserver, IP [,Port]}.
                    -  IP = tuple()
                    -  Port = integer()

                    Add address (and port, if other than default) of the primary nameserver to use -for inet_res.

                  • {alt_nameserver, IP [,Port]}.
                    -  IP = tuple()
                    -  Port = integer()

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

                  • {search, Domains}.
                    -  Domains = [string()]

                    Add search domains for inet_res.

                  • {lookup, Methods}.
                    -  Methods = [atom()]

                    Specify lookup methods and in which order to try them. The valid methods are +for this file to some maybe other than /etc.

                  • {registry, Type}.
                    +  Type = atom()

                    Specify a system registry that Erlang is to read configuration data from. +win32 is the only valid option.

                  • {host, IP, Aliases}.
                    +  IP = tuple()

                    Aliases = [string()]

                    Add host entry to the hosts table.

                  • {domain, Domain}.
                    +  Domain = string()

                    Set domain name.

                  • {nameserver, IP [,Port]}.
                    +  IP = tuple()
                    +  Port = integer()

                    Add address (and port, if other than default) of the primary nameserver to use +for inet_res.

                  • {alt_nameserver, IP [,Port]}.
                    +  IP = tuple()
                    +  Port = integer()

                    Add address (and port, if other than default) of the secondary nameserver for +inet_res.

                  • {search, Domains}.
                    +  Domains = [string()]

                    Add search domains for inet_res.

                  • {lookup, Methods}.
                    +  Methods = [atom()]

                    Specify lookup methods and in which order to try them. The valid methods are as follows:

                    • native (use system calls)
                    • file (use host data retrieved from system configuration files and/or the user configuration file)
                    • dns (use the Erlang DNS client inet_res for nameserver queries)

                    The lookup method string tries to parse the hostname as an IPv4 or IPv6 string and return the resulting IP address. It is automatically tried first when native is not in the Methods list. To skip it in this case, the pseudo lookup method nostring can be inserted anywhere in the Methods -list.

                  • {cache_size, Size}.
                    -  Size = integer()

                    Set the resolver cache size for dns lookups. native lookups are not -cached. Defaults to 100 DNS records.

                  • {cache_refresh, Time}.
                    -  Time = integer()

                    Set how often (in milliseconds) the resolver cache for inet_res is -refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

                  • {timeout, Time}.
                    -  Time = integer()

                    Set the time to wait until retry (in milliseconds) for DNS queries made by -inet_res. Defaults to 2 seconds.

                  • {retry, N}.
                    -  N = integer()

                    Set the number of DNS queries inet_res will try before giving up. Defaults -to 3.

                  • {servfail_retry_timeout, Time}.
                    -  Time = non_neg_integer()

                    After all name servers have been tried, there is a timeout before the name +list.

                  • {cache_size, Size}.
                    +  Size = integer()

                    Set the resolver cache size for dns lookups. native lookups are not +cached. Defaults to 100 DNS records.

                  • {cache_refresh, Time}.
                    +  Time = integer()

                    Set how often (in milliseconds) the resolver cache for inet_res is +refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

                  • {timeout, Time}.
                    +  Time = integer()

                    Set the time to wait until retry (in milliseconds) for DNS queries made by +inet_res. Defaults to 2 seconds.

                  • {retry, N}.
                    +  N = integer()

                    Set the number of DNS queries inet_res will try before giving up. Defaults +to 3.

                  • {servfail_retry_timeout, Time}.
                    +  Time = non_neg_integer()

                    After all name servers have been tried, there is a timeout before the name servers are tried again. This is to prevent the server from answering the query with what's in the servfail cache, inet_res. Defaults to 1500 milli -seconds .

                  • {inet6, Bool}.
                    +seconds .

                  • {inet6, Bool}.
                       Bool = true | false

                    Tells the DNS client inet_res to look up IPv6 addresses. Defaults to -false.

                  • {usevc, Bool}.
                    +false.

                  • {usevc, Bool}.
                       Bool = true | false

                    Tells the DNS client inet_res to use TCP (Virtual Circuit) instead of UDP. -Defaults to false.

                  • {edns, Version}.
                    +Defaults to false.

                  • {edns, Version}.
                       Version = false | 0

                    Sets the EDNS version that inet_res will use. The only allowed version is -zero. Defaults to false, which means not to use EDNS.

                  • {udp_payload_size, Size}.
                    -  N = integer()

                    Sets the allowed UDP payload size inet_res will advertise in EDNS queries. +zero. Defaults to false, which means not to use EDNS.

                  • {udp_payload_size, Size}.
                    +  N = integer()

                    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; this is not entirely correct, as the advertised UDP payload size of the individual nameserver is what is to be used, but this simple strategy will do until a more intelligent (probing, caching) algorithm needs to be implemented. Default to 1280, which stems from the standard -Ethernet MTU size.

                  • {udp, Module}.
                    -  Module = atom()

                    Tell Erlang to use another primitive UDP module than inet_udp.

                  • {tcp, Module}.
                    -  Module = atom()

                    Tell Erlang to use another primitive TCP module than inet_tcp.

                  • clear_hosts.

                    Clear the hosts table.

                  • clear_ns.

                    Clear the list of recorded nameservers (primary and secondary).

                  • clear_search.

                    Clear the list of search domains.

                  +Ethernet MTU size.

                • {udp, Module}.
                  +  Module = atom()

                  Tell Erlang to use another primitive UDP module than inet_udp.

                • {tcp, Module}.
                  +  Module = atom()

                  Tell Erlang to use another primitive TCP module than inet_tcp.

                • clear_hosts.

                  Clear the hosts table.

                • clear_ns.

                  Clear the list of recorded nameservers (primary and secondary).

                • clear_search.

                  Clear the list of search domains.

                @@ -246,19 +246,19 @@

                (in this example named erl_inetrc, stored in directory ./cfg_files) can then look as follows (Unix):

                %% -- ERLANG INET CONFIGURATION FILE --
                 %% read the hosts file
                -{file, hosts, "/etc/hosts"}.
                +{file, hosts, "/etc/hosts"}.
                 %% add a particular host
                -{host, {134,138,177,105}, ["finwe"]}.
                +{host, {134,138,177,105}, ["finwe"]}.
                 %% do not monitor the hosts file
                -{hosts_file, ""}.
                +{hosts_file, ""}.
                 %% read and monitor nameserver config from here
                -{resolv_conf, "/usr/local/etc/resolv.conf"}.
                +{resolv_conf, "/usr/local/etc/resolv.conf"}.
                 %% enable EDNS
                -{edns,0}.
                +{edns,0}.
                 %% disable caching
                -{cache_size, 0}.
                +{cache_size, 0}.
                 %% specify lookup method
                -{lookup, [file, dns]}.

                And Erlang can, for example, be started as follows:

                % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
                +{lookup, [file, dns]}.

                And Erlang can, for example, be started as follows:

                % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
                diff --git a/prs/8803/erts-15.0.1/doc/html/init.html b/prs/8803/erts-15.0.1/doc/html/init.html index f3690f9ba2e25..554baf201f4ef 100644 --- a/prs/8803/erts-15.0.1/doc/html/init.html +++ b/prs/8803/erts-15.0.1/doc/html/init.html @@ -161,8 +161,8 @@

                initialization process.

              • -extra - Everything following -extra is considered plain arguments and can be retrieved using get_plain_arguments/0.

                Example:

                % erl -extra +A 1 --
                 ...
                -1> init:get_plain_arguments().
                -["+A","1","--"]

                The -extra flag can be passed on the command line, through ERL_*FLAGS or +1> init:get_plain_arguments(). +["+A","1","--"]

              The -extra flag can be passed on the command line, through ERL_*FLAGS or -args_file. It only effects the remaining command-line flags in the entity in which it is passed. If multiple -extra flags are passed they are concatenated using the same order rules as ERL_*FLAGS or -args_file in @@ -216,13 +216,13 @@

              % erl -- a b -children thomas claire -ages 7 3 -- x y
               ...
               
              -1> init:get_plain_arguments().
              -["a","b","x","y"]
              -2> init:get_argument(children).
              -{ok,[["thomas","claire"]]}
              -3> init:get_argument(ages).
              -{ok, [["7","3"]]}
              -4> init:get_argument(silly).
              +1> init:get_plain_arguments().
              +["a","b","x","y"]
              +2> init:get_argument(children).
              +{ok,[["thomas","claire"]]}
              +3> init:get_argument(ages).
              +{ok, [["7","3"]]}
              +4> init:get_argument(silly).
               error

              @@ -524,12 +524,12 @@

              get_argument(Flag)

              Returns all values associated with the command-line user flag Flag.

              If Flag is provided several times, each Values is returned in preserved order. Example:

              % erl -a b c -a d
               ...
              -1> init:get_argument(a).
              -{ok,[["b","c"],["d"]]}

              The following flags are defined automatically and can be retrieved using this +1> init:get_argument(a). +{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this function:

    Returns error if no value is associated with Flag.

    +{ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
  • progname - The name of the program which started Erlang:

    3> init:get_argument(progname).
    +{ok,[["erl"]]}
  • home - The home directory (on Unix, the value of $HOME):

    4> init:get_argument(home).
    +{ok,[["/home/harry"]]}
  • Returns error if no value is associated with Flag.

    diff --git a/prs/8803/erts-15.0.1/doc/html/match_spec.html b/prs/8803/erts-15.0.1/doc/html/match_spec.html index 5e09511160da7..6c58d779c2f7e 100644 --- a/prs/8803/erts-15.0.1/doc/html/match_spec.html +++ b/prs/8803/erts-15.0.1/doc/html/match_spec.html @@ -371,70 +371,70 @@

    Tracing Examples

    -

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    -  [],
    -  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    -  [{ '>', '$1', 3}],
    -  []}]

    Match an argument list of three, where the third argument is either a tuple +

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    +  [],
    +  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    +  [{ '>', '$1', 3}],
    +  []}]

    Match an argument list of three, where the third argument is either a tuple containing argument one and two, or a list beginning with argument one and two -(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    -  [{'orelse',
    -      {'=:=', '$3', {{'$1','$2'}}},
    -      {'and',
    -        {'=:=', '$1', {hd, '$3'}},
    -        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    -  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    - {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in +(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    +  [{'orelse',
    +      {'=:=', '$3', {{'$1','$2'}}},
    +      {'and',
    +        {'=:=', '$1', {hd, '$3'}},
    +        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    +  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    + {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in turn begins with the second argument times two (that is, [{[4,x],y},2] or -[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    -  []}]

    Match three arguments. When all three are equal and are numbers, append the +[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    +  []}]

    Match three arguments. When all three are equal and are numbers, append the process dump to the trace message, otherwise let the trace message be "as is", -but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    -  [{is_number, '$1'}],
    -  [{message, {process_dump}}]},
    - {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single +but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    +  [{is_number, '$1'}],
    +  [{message, {process_dump}}]},
    + {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single MatchVariable or an '_'. To replace the whole parameter list with a single variable is a special case. In all other cases the MatchHead must be a -proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    -  [{'==',{get_tcw},{const, 1}}],
    -  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    -  [{'==',{is_seq_trace},{const, 1}}],
    -  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add -it when it is 'silent':

    [{'$1',
    -  [{'==',{hd, '$1'},verbose}],
    -  [{trace, [silent],[]}]},
    - {'$1',
    -  [{'==',{hd, '$1'},silent}],
    -  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    -  [{'==',{length, '$1'},3}],
    -  [{return_trace}]},
    - {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first -argument is 'trace':

    [{['trace','$2','$3'],
    -  [],
    -  []},
    - {'_',[],[]}]

    +proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    +  [{'==',{get_tcw},{const, 1}}],
    +  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    +  [{'==',{is_seq_trace},{const, 1}}],
    +  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add +it when it is 'silent':

    [{'$1',
    +  [{'==',{hd, '$1'},verbose}],
    +  [{trace, [silent],[]}]},
    + {'$1',
    +  [{'==',{hd, '$1'},silent}],
    +  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    +  [{'==',{length, '$1'},3}],
    +  [{return_trace}]},
    + {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first +argument is 'trace':

    [{['trace','$2','$3'],
    +  [],
    +  []},
    + {'_',[],[]}]

    ETS Examples

    Match all objects in an ETS table, where the first element is the atom -'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    -  [],
    -  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is -'gandalf', and return element 2:

    [{'$1',
    -  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    -  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more +'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    +  [],
    +  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is +'gandalf', and return element 2:

    [{'$1',
    +  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    +  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more efficient to match that key in the MatchHead part than in the MatchConditions part. The search space of the tables is restricted with regards to the MatchHead so that only objects with the matching key are searched.

    Match tuples of three elements, where the second element is either 'merry' or -'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    -  [],
    -  ['$_']},
    - {{'_',pippin,'_'},
    -  [],
    -  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    +'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    +  [],
    +  ['$_']},
    + {{'_',pippin,'_'},
    +  [],
    +  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    diff --git a/prs/8803/erts-15.0.1/doc/html/notes.html b/prs/8803/erts-15.0.1/doc/html/notes.html index 0a5487e3fb655..d3b252d6e6392 100644 --- a/prs/8803/erts-15.0.1/doc/html/notes.html +++ b/prs/8803/erts-15.0.1/doc/html/notes.html @@ -155,17 +155,17 @@

    Improvements and New Features

    -
    • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

      Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

      Own Id: OTP-18568 Aux Id: PR-7174

    • The instrument module can now track allocations on a per-process or per-port basis.

      Own Id: OTP-18577 Aux Id: PR-7236

    • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18594 Aux Id: PR-7274

    • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18639 Aux Id: PR-7348

    • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

      Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

    • The default process limit has been raised to 1048576 processes.

      Own Id: OTP-18699 Aux Id: PR-7388

    • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

      Own Id: OTP-18709 Aux Id: PR-7651

    • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

      Own Id: OTP-18744 Aux Id: PR-7470

    • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

      Own Id: OTP-18774 Aux Id: PR-7110

    • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

      Own Id: OTP-18779 Aux Id: PR-7592

    • -callback attributes have been added to erl_tracer.

      Own Id: OTP-18794 Aux Id: PR-7703

    • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

      Own Id: OTP-18835

    • New functions socket:sendv/* for sending I/O vectors have been added.

      Own Id: OTP-18845

    • Socket options that take string now also accept binaries.

      Own Id: OTP-18849 Aux Id: PR-6510

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • Changed the default value of the command line flag -code_path_choice to strict.

      Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

      Own Id: OTP-18894 Aux Id: PR-7243

    • Added module loading to erl -init_debug printouts.

      Own Id: OTP-18929 Aux Id: PR-8004

    • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

      Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

    • Optimized code loading by moving certain operations from the code server to the caller.

      Own Id: OTP-18941 Aux Id: PR-7981

    • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

      Own Id: OTP-18942

    • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

      Own Id: OTP-18950

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +
      • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

        Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

        Own Id: OTP-18568 Aux Id: PR-7174

      • The instrument module can now track allocations on a per-process or per-port basis.

        Own Id: OTP-18577 Aux Id: PR-7236

      • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18594 Aux Id: PR-7274

      • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18639 Aux Id: PR-7348

      • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

        Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

      • The default process limit has been raised to 1048576 processes.

        Own Id: OTP-18699 Aux Id: PR-7388

      • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

        Own Id: OTP-18709 Aux Id: PR-7651

      • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

        Own Id: OTP-18744 Aux Id: PR-7470

      • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

        Own Id: OTP-18774 Aux Id: PR-7110

      • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

        Own Id: OTP-18779 Aux Id: PR-7592

      • -callback attributes have been added to erl_tracer.

        Own Id: OTP-18794 Aux Id: PR-7703

      • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

        Own Id: OTP-18835

      • New functions socket:sendv/* for sending I/O vectors have been added.

        Own Id: OTP-18845

      • Socket options that take string now also accept binaries.

        Own Id: OTP-18849 Aux Id: PR-6510

      • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

        There are also new APIs to support native coverage without using the cover tool.

        To instrument code for native coverage it must be compiled with the line_coverage option.

        To enable native coverage in the runtime system, start it like so:

        $ erl +JPcover true

        There are also the following new functions for supporting native coverage:

        Own Id: OTP-18856 Aux Id: PR-7856

      • Changed the default value of the command line flag -code_path_choice to strict.

        Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

        Own Id: OTP-18894 Aux Id: PR-7243

      • Added module loading to erl -init_debug printouts.

        Own Id: OTP-18929 Aux Id: PR-8004

      • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

        Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

      • Optimized code loading by moving certain operations from the code server to the caller.

        Own Id: OTP-18941 Aux Id: PR-7981

      • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

        Own Id: OTP-18942

      • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

        Own Id: OTP-18950

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

        Example:

        -record(rec, {a,b,c}).
         
        -update(#rec{a=needs_update,b=N}=R0) ->
        -    R = R0#rec{a=up_to_date},
        +update(#rec{a=needs_update,b=N}=R0) ->
        +    R = R0#rec{a=up_to_date},
             if
                 N < 0 ->
        -            R#rec{c=negative};
        +            R#rec{c=negative};
                 N == 0 ->
        -            R#rec{c=zero};
        +            R#rec{c=zero};
                 N > 0 ->
        -            R#rec{c=positive}
        +            R#rec{c=positive}
             end.

        The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

        Own Id: OTP-18972 Aux Id: PR-8090

      • The obsolete and undocumented support for opening a port to an external resource by passing an atom (or a string) as first argument to open_port(), implemented by the vanilla driver, @@ -3003,9 +3003,9 @@

        has now been removed.

        * POTENTIAL INCOMPATIBILITY *

        Own Id: OTP-16329 Aux Id: OTP-15621

      • The return value when using the httph and httph_bin option to erlang:decode_packet/3 and inet:setopts/2 has been changed to also include the original header unmodified. See erlang:decode_packet/3. Example:

         >
        -      erlang:decode_packet(httph_bin,<<"HELLO:
        -      hi\r\n\r\n">>,[]).
        -      {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

        Own Id: OTP-16347 Aux Id: PR-2466

      • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed + erlang:decode_packet(httph_bin,<<"HELLO: + hi\r\n\r\n">>,[]). + {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

      Own Id: OTP-16347 Aux Id: PR-2466

    • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed connection before nodeup messages of a reestablished connection toward the same node.

      Own Id: OTP-16362

    • Update of sequential tracing to also support other information transfers than message passing.

      Own Id: OTP-16370 Aux Id: OTP-15251, OTP-15232

    • socket: It is now possible to create a socket from an already existing file @@ -10720,12 +10720,12 @@

      viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

      NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
      +not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
                   %% ...
      -            exit(Pid, bang),
      -            erlang:demonitor(Mon),
      +            exit(Pid, bang),
      +            erlang:demonitor(Mon),
                   receive
      -                {'DOWN', Mon , process, Pid, _} -> ok
      +                {'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:
      diff --git a/prs/8803/erts-15.0.1/doc/html/persistent_term.html b/prs/8803/erts-15.0.1/doc/html/persistent_term.html
      index 8b7278f6dc0ab..5a6ae36e2a531 100644
      --- a/prs/8803/erts-15.0.1/doc/html/persistent_term.html
      +++ b/prs/8803/erts-15.0.1/doc/html/persistent_term.html
      @@ -200,9 +200,9 @@ 

      The following example shows how lock contention for ETS tables can be minimized by having one ETS table for each scheduler. The table identifiers for the ETS tables are stored as a single persistent term:

          %% There is one ETS table for each scheduler.
      -    Sid = erlang:system_info(scheduler_id),
      -    Tid = element(Sid, persistent_term:get(?MODULE)),
      -    ets:update_counter(Tid, Key, 1).
      + Sid = erlang:system_info(scheduler_id), + Tid = element(Sid, persistent_term:get(?MODULE)), + ets:update_counter(Tid, Key, 1).

    diff --git a/prs/8803/erts-15.0.1/doc/html/supercarrier.html b/prs/8803/erts-15.0.1/doc/html/supercarrier.html index 6802e18a09108..b1edcbeb6d83d 100644 --- a/prs/8803/erts-15.0.1/doc/html/supercarrier.html +++ b/prs/8803/erts-15.0.1/doc/html/supercarrier.html @@ -229,12 +229,12 @@

    and free entire pages and we don't want to waste an entire page just to hold the block header of the following pages.

    Instead we store the meta information about all the free segments in a dedicated area apart from the sa and sua areas. Every free segment is -represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
    +represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
         RBTNode snode;      /* node in 'stree' */
         RBTNode anode;      /* node in 'atree' */
         char* start;
         char* end;
    -}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation +}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation (best fit), the free segments are organized in a tree sorted by size (stree). We search in this tree at allocation. If no free segment of sufficient size was found, the area (sa or sua) is instead expanded. diff --git a/prs/8803/erts-15.0.1/doc/html/time_correction.html b/prs/8803/erts-15.0.1/doc/html/time_correction.html index ec2b6bb3f8e39..9bc05aac32478 100644 --- a/prs/8803/erts-15.0.1/doc/html/time_correction.html +++ b/prs/8803/erts-15.0.1/doc/html/time_correction.html @@ -547,9 +547,9 @@

    the event occurs.

    Do

    Determine the order of events by saving a tuple containing monotonic time and a strictly monotonically increasing integer as -follows:

    Time = erlang:monotonic_time(),
    -UMI = erlang:unique_integer([monotonic]),
    -EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system +follows:

    Time = erlang:monotonic_time(),
    +UMI = erlang:unique_integer([monotonic]),
    +EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system instance according to creation time. It is important that the monotonic time is in the first element (the most significant element when comparing two-tuples). Using the monotonic time in the tuples, you can calculate time diff --git a/prs/8803/erts-15.0.1/doc/html/tracing.html b/prs/8803/erts-15.0.1/doc/html/tracing.html index 80b18f86a3916..81227bf868191 100644 --- a/prs/8803/erts-15.0.1/doc/html/tracing.html +++ b/prs/8803/erts-15.0.1/doc/html/tracing.html @@ -149,23 +149,23 @@

    to inspecting the stack we can only say where we're going to return to, which is not quite the same thing.

    As an illustration, when the caller option is enabled all trace messages from bar/1 will say that they were called from foo/0, even though it -went through a bunch of other functions on the way:

    foo() ->
    -    lots(),
    +went through a bunch of other functions on the way:

    foo() ->
    +    lots(),
         ok.
     
    -lots() ->
    -    'of'().
    +lots() ->
    +    'of'().
     
    -'of'() ->
    -    indirections().
    +'of'() ->
    +    indirections().
     
    -indirections() ->
    -    bar(10).
    +indirections() ->
    +    bar(10).
     
    -bar(0) ->
    +bar(0) ->
         done;
    -bar(N) ->
    -    bar(N - 1).

    +bar(N) -> + bar(N - 1).

    diff --git a/prs/8803/erts-15.0.1/doc/html/zlib.html b/prs/8803/erts-15.0.1/doc/html/zlib.html index 973399fc23583..4b1f09f19c421 100644 --- a/prs/8803/erts-15.0.1/doc/html/zlib.html +++ b/prs/8803/erts-15.0.1/doc/html/zlib.html @@ -133,18 +133,18 @@

    data. The data format is described by RFC 1950, RFC 1951, and -RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    -ok = zlib:deflateInit(Z,default),
    +RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    +ok = zlib:deflateInit(Z,default),
     
    -Compress = fun(end_of_data, _Cont) -> [];
    -              (Data, Cont) ->
    -                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
    +Compress = fun(end_of_data, _Cont) -> [];
    +              (Data, Cont) ->
    +                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
                end,
    -Compressed = Compress(Read(),Compress),
    -Last = zlib:deflate(Z, [], finish),
    -ok = zlib:deflateEnd(Z),
    -zlib:close(Z),
    -list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where +Compressed = Compress(Read(),Compress), +Last = zlib:deflate(Z, [], finish), +ok = zlib:deflateEnd(Z), +zlib:close(Z), +list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.

    • not_initialized - The stream hasn't been initialized, eg. if inflateInit/1 wasn't called prior to a call to inflate/2.

    • not_on_controlling_process - The stream was used by a process that doesn't control it. Use set_controlling_process/2 if you need to transfer a @@ -853,11 +853,11 @@

      deflate(Z, Data, Flush)

      full too often can seriously degrade the compression.

      If Flush is set to finish, pending input is processed, pending output is flushed, and deflate/3 returns. Afterwards the only possible operations on the stream are deflateReset/1 or deflateEnd/1.

      Flush can be set to finish immediately after -deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      -B1 = zlib:deflate(Z,Data),
      -B2 = zlib:deflate(Z,<< >>,finish),
      -zlib:deflateEnd(Z),
      -list_to_binary([B1,B2])
      +deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      +B1 = zlib:deflate(Z,Data),
      +B2 = zlib:deflate(Z,<< >>,finish),
      +zlib:deflateEnd(Z),
      +list_to_binary([B1,B2])
      @@ -1409,20 +1409,20 @@

      inflateSetDictionary(Z, Dictionary)

      {'EXIT',{{need_dictionary,Adler},_StackTrace}} exception.

      The dictionary chosen by the compressor can be determined from the Adler value returned or thrown by the call to the inflate function. The compressor and decompressor must use the same dictionary (See deflateSetDictionary/2).

      After setting the dictionary the inflate operation should be retried without new -input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      -     case catch zlib:inflate(Z, Compressed) of
      -          {'EXIT',{{need_dictionary,_DictID},_}} ->
      -                 ok = zlib:inflateSetDictionary(Z, Dict),
      -                 Uncompressed = zlib:inflate(Z, []);
      +input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      +     case catch zlib:inflate(Z, Compressed) of
      +          {'EXIT',{{need_dictionary,_DictID},_}} ->
      +                 ok = zlib:inflateSetDictionary(Z, Dict),
      +                 Uncompressed = zlib:inflate(Z, []);
                 Uncompressed ->
                        Uncompressed
            end.
       
      -new_unpack(Z, Compressed, Dict) ->
      -    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      -        {need_dictionary, _DictId, Output} ->
      -            ok = zlib:inflateSetDictionary(Z, Dict),
      -            [Output | zlib:inflate(Z, [])];
      +new_unpack(Z, Compressed, Dict) ->
      +    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      +        {need_dictionary, _DictId, Output} ->
      +            ok = zlib:inflateSetDictionary(Z, Dict),
      +            [Output | zlib:inflate(Z, [])];
               Uncompressed ->
                   Uncompressed
           end.
      @@ -1498,18 +1498,18 @@

      safeInflate(Z, Data)

      desired, and the function will return {finished, Output} once all queued data has been decompressed.

      This function can introduce some output latency (reading input without producing any output).

      If a preset dictionary is required for further decompression, this function -returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      -    Z = zlib:open(),
      -    zlib:inflateInit(Z),
      -    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      -    zlib:inflateEnd(Z),
      -    zlib:close(Z).
      -
      -loop(Z, Handler, {continue, Output}) ->
      -    Handler(Output),
      -    loop(Z, Handler, zlib:safeInflate(Z, []));
      -loop(Z, Handler, {finished, Output}) ->
      -    Handler(Output).
      +returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      +    Z = zlib:open(),
      +    zlib:inflateInit(Z),
      +    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      +    zlib:inflateEnd(Z),
      +    zlib:close(Z).
      +
      +loop(Z, Handler, {continue, Output}) ->
      +    Handler(Output),
      +    loop(Z, Handler, zlib:safeInflate(Z, []));
      +loop(Z, Handler, {finished, Output}) ->
      +    Handler(Output).
      diff --git a/prs/8803/lib/asn1-5.3/doc/html/.build b/prs/8803/lib/asn1-5.3/doc/html/.build index 8d82cf86eab44..cca7f51935adf 100644 --- a/prs/8803/lib/asn1-5.3/doc/html/.build +++ b/prs/8803/lib/asn1-5.3/doc/html/.build @@ -27,7 +27,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-06A31C18.js +dist/search_data-965B670D.js dist/sidebar_items-C28B0719.js index.html notes.html diff --git a/prs/8803/lib/asn1-5.3/doc/html/asn1.epub b/prs/8803/lib/asn1-5.3/doc/html/asn1.epub index 1d65f20ff4dc0acbb4cd33fd130c5af77ec05ff6..93c9414f8a560f849915a0a5e2252165fc02dcea 100644 GIT binary patch delta 41182 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 b)BjWZ@7wKl1oQtJA$J0+{Y6}yz_kAdflm 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 the syntax is correct and that the text represents proper ASN.1 code before generating an abstract syntax tree. The code generator then uses the abstract syntax tree to generate code.

      The generated Erlang files are placed in the current directory or in the -directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      -ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
      +directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      +ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
       Erlang ASN.1 compiling "People.asn"
      ---{generated,"People.asn1db"}--
      ---{generated,"People.hrl"}--
      ---{generated,"People.erl"}--
      +--{generated,"People.asn1db"}--
      +--{generated,"People.hrl"}--
      +--{generated,"People.erl"}--
       ok

      ASN.1 module People is now accepted and the abstract syntax tree is saved in file People.asn1db. The generated Erlang code is compiled using the Erlang compiler and loaded into the Erlang runtime system. There is now an API for -encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 +encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 defined type Person, modifies, and sends them back again:

      receive
      -   {Port,{data,Bytes}} ->
      -       case 'People':decode('Person',Bytes) of
      -           {ok,P} ->
      -               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      -               Port ! {self(),{command,Answer}};
      -           {error,Reason} ->
      -               exit({error,Reason})
      +   {Port,{data,Bytes}} ->
      +       case 'People':decode('Person',Bytes) of
      +           {ok,P} ->
      +               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      +               Port ! {self(),{command,Answer}};
      +           {error,Reason} ->
      +               exit({error,Reason})
              end
           end,

      In this example, a series of bytes is received from an external source and the bytes are then decoded into a valid Erlang term. This was achieved with the call 'People':decode('Person',Bytes), which returned an Erlang value of the ASN.1 type Person. Then an answer was constructed and encoded using 'People':encode('Person',Answer), which takes an instance of a defined ASN.1 -type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      -{'Person',"Some Name",roving,50}
      -3> {ok,Bin} = 'People':encode('Person',Rockstar).
      -{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      -      2,1,50>>}
      -4> {ok,Person} = 'People':decode('Person',Bin).
      -{ok,{'Person',"Some Name",roving,50}}

      +type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      +{'Person',"Some Name",roving,50}
      +3> {ok,Bin} = 'People':encode('Person',Rockstar).
      +{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      +      2,1,50>>}
      +4> {ok,Person} = 'People':decode('Person',Bin).
      +{ok,{'Person',"Some Name",roving,50}}

      @@ -271,16 +271,16 @@

      to manually add tags to certain constructs in order for the ASN.1 specification to be valid. Example of an old-style specification:

      Tags DEFINITIONS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese [0] IA5String,
      -                      dessert [1] IA5String }
      +  Afters ::= CHOICE { cheese [0] IA5String,
      +                      dessert [1] IA5String }
       END

      Without the tags (the numbers in square brackets) the ASN.1 compiler refused to compile the file.

      In 1994 the global tagging mode AUTOMATIC TAGS was introduced. By putting AUTOMATIC TAGS in the module header, the ASN.1 compiler automatically adds tags when needed. The following is the same specification in AUTOMATIC TAGS mode:

      Tags DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese IA5String,
      -                      dessert IA5String }
      +  Afters ::= CHOICE { cheese IA5String,
      +                      dessert IA5String }
       END

      @@ -291,7 +291,7 @@

      and how values are assigned in Erlang.

      ASN.1 has both primitive and constructed types:

      Primitive TypesConstructed Types
      BOOLEANSEQUENCE
      INTEGERSET
      REALCHOICE
      NULLSET OF and SEQUENCE OF
      ENUMERATEDANY
      BIT STRINGANY DEFINED BY
      OCTET STRINGEXTERNAL
      Character StringsEMBEDDED PDV
      OBJECT IDENTIFIERCHARACTER STRING
      Object Descriptor
      TIME Types

      Table: Supported ASN.1 Types

      Note

      The values of each ASN.1 type have their own representation in Erlang, as described in the following sections. Users must provide these values for encoding according to the representation, as shown in the following example:

      Operational ::= BOOLEAN --ASN.1 definition

      In Erlang code it can look as follows:

      Val = true,
      -{ok,Bytes} = MyModule:encode('Operational', Val),

      +{ok,Bytes} = MyModule:encode('Operational', Val),

      @@ -308,11 +308,11 @@

      An ASN.1 INTEGER is represented by an integer in Erlang.

      The concept of subtyping can be applied to integers and to other ASN.1 types. The details of subtyping are not explained here; for more information, see X.680. Various syntaxes are allowed when defining a type as an integer:

      T1 ::= INTEGER
      -T2 ::= INTEGER (-2..7)
      -T3 ::= INTEGER (0..MAX)
      -T4 ::= INTEGER (0<..MAX)
      -T5 ::= INTEGER (MIN<..-99)
      -T6 ::= INTEGER {red(0),blue(1),white(2)}

      The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a +T2 ::= INTEGER (-2..7) +T3 ::= INTEGER (0..MAX) +T4 ::= INTEGER (0<..MAX) +T5 ::= INTEGER (MIN<..-99) +T6 ::= INTEGER {red(0),blue(1),white(2)}

    The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a Named Number List (see T6 in the previous list) is specified.

    The following is an example of Erlang code that assigns values for the types in the previous list:

    T1value = 0,
     T2value = 6,
    @@ -359,7 +359,7 @@ 

    The type BIT STRING can be used to model information that is made up of arbitrary length series of bits. It is intended to be used for selection of flags, not for binary files.

    In ASN.1, BIT STRING definitions can look as follows:

    Bits1 ::= BIT STRING
    -Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING +Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING values in Erlang and as input to the encode functions:

    1. A bitstring. By default, a BIT STRING with no symbolic names is decoded to an Erlang bitstring.
    2. A list of atoms corresponding to atoms in the NamedBitList in the BIT STRING definition. A BIT STRING with symbolic names is always decoded @@ -387,7 +387,7 @@

      OCTET STRING is the simplest of all ASN.1 types. OCTET STRING only moves or transfers, for example, binary files or other unstructured information complying with two rules: the bytes consist of octets and encoding is not required.

      It is possible to have the following ASN.1 type definitions:

      O1 ::= OCTET STRING
      -O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
      +O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
       O2Val = <<"must be exactly 28 chars....">>,

      By default, an OCTET STRING is always represented as an Erlang binary. If the specification has been compiled with option legacy_erlang_types, the encode functions accept both lists and binaries, and the decode functions decode an @@ -408,11 +408,11 @@

      of view, octets are very similar to character strings and are compiled in the same way.

      When PER is used, there is a significant difference in the encoding scheme for OCTET STRINGs and other strings. The constraints specified for a type -are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      -TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
      +are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      +TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
       DigsVal2 = "123",
       TextFileVal1 = "abc...xyz...",
      -TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list +TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list of ASCII values or a list of quadruples. The quadruple representation associates to the Unicode standard representation of characters. The ASCII characters are all represented by quadruples beginning with three zeros like {0,0,0,65} for @@ -421,26 +421,26 @@

      in file PrimStrings.asn1:

      PrimStrings DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
          BMP ::= BMPString
      -END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
      +END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
       ok
      -2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]).
      -{ok,<<30,4,53,54,45,56>>}
      -3> 'PrimStrings':decode('BMP', Bytes1).
      -{ok,[{0,0,53,53},{0,0,45,56}]}
      -4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]).
      -{ok,<<30,4,53,53,0,65>>}
      -5> 'PrimStrings':decode('BMP', Bytes2).
      -{ok,[{0,0,53,53},65]}
      -6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string").
      -{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>}
      -7> 'PrimStrings':decode('BMP', Bytes3).
      -{ok,"BMP string"}

      Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such +2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]). +{ok,<<30,4,53,54,45,56>>} +3> 'PrimStrings':decode('BMP', Bytes1). +{ok,[{0,0,53,53},{0,0,45,56}]} +4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]). +{ok,<<30,4,53,53,0,65>>} +5> 'PrimStrings':decode('BMP', Bytes2). +{ok,[{0,0,53,53},65]} +6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string"). +{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>} +7> 'PrimStrings':decode('BMP', Bytes3). +{ok,"BMP string"}

    Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such binaries can be created directly using the binary syntax or by converting from a list of Unicode code points using function unicode:characters_to_binary/1.

    The following shows examples of how UTF-8 encoded binaries can be created and manipulated:

    1> Gs = "Мой маленький Гном".
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]
    -2> Gbin = unicode:characters_to_binary(Gs).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]
    +2> Gbin = unicode:characters_to_binary(Gs).
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    @@ -448,22 +448,22 @@ 

    <<208,156,208,190,208,185,32,208,188,208,176,208,187,208, 181,208,189,209,140,208,186,208,184,208,185,32,208,147, 208,...>> -4> Gs = unicode:characters_to_list(Gbin). -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080, - 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
    +4> Gs = unicode:characters_to_list(Gbin).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
     BEGIN
        UTF ::= UTF8String
    -END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
    +END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
     ok
    -6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    -{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    -7> {ok,Bin1} = 'UTF':decode('UTF', Bytes1).
    -{ok,<<208,147,208,189,208,190,208,188>>}
    -8> io:format("~ts\n", [Bin1]).
    +6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    +{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    +7> {ok,Bin1} = 'UTF':decode('UTF', Bytes1).
    +{ok,<<208,147,208,189,208,190,208,188>>}
    +8> io:format("~ts\n", [Bin1]).
     Гном
     ok
    -9> unicode:characters_to_list(Bin1).
    -[1043,1085,1086,1084]

    +9> unicode:characters_to_list(Bin1). +[1043,1085,1086,1084]

    @@ -499,15 +499,15 @@

    The structured types of ASN.1 are constructed from other types in a manner similar to the concepts of arrays and structs in C.

    A SEQUENCE in ASN.1 is comparable with a struct in C and a record in Erlang. A -SEQUENCE can be defined as follows:

    Pdu ::= SEQUENCE {
    +SEQUENCE can be defined as follows:

    Pdu ::= SEQUENCE {
        a INTEGER,
        b REAL,
        c OBJECT IDENTIFIER,
    -   d NULL }

    This is a 4-component structure called Pdu. By default, a SEQUENCE is + d NULL }

    This is a 4-component structure called Pdu. By default, a SEQUENCE is represented by a record in Erlang. It can also be represented as a map; see Map representation for SEQUENCE and SET. For each SEQUENCE and SET in an ASN.1 module an Erlang record declaration is -generated. For Pdu, a record like the following is defined:

    -record('Pdu', {a, b, c, d}).

    The record declarations for a module M are placed in a separate M.hrl file.

    Values can be assigned in Erlang as follows:

    MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.

    The decode functions return a record as result when decoding a SEQUENCE or a +generated. For Pdu, a record like the following is defined:

    -record('Pdu', {a, b, c, d}).

    The record declarations for a module M are placed in a separate M.hrl file.

    Values can be assigned in Erlang as follows:

    MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.

    The decode functions return a record as result when decoding a SEQUENCE or a SET.

    A SEQUENCE and a SET can contain a component with a DEFAULT keyword followed by the actual value, which is the default value. The DEFAULT keyword means that the application doing the encoding can omit encoding of the value, @@ -532,21 +532,21 @@

    Seq3 ::= SEQUENCE { bs BIT STRING {a(0), b(1), c(2)} DEFAULT {a, c} } -END

    Example where the BER encoder is able to omit encoding of the default values:

    1> asn1ct:compile('File', [ber]).
    +END

    Example where the BER encoder is able to omit encoding of the default values:

    1> asn1ct:compile('File', [ber]).
     ok
    -2> 'File':encode('Seq1', {'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
    -{ok,<<48,0>>}
    -3> 'File':encode('Seq1', {'Seq1',1,{'Seq2',true,15}}).
    -{ok,<<48,0>>}

    Example with a named BIT STRING where the BER encoder does not omit the -encoding:

    4> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    -{ok,<<48,0>>}
    -5> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    -{ok,<<48,4,128,2,5,160>>}

    The DER encoder omits the encoding for the same BIT STRING:

    6> asn1ct:compile('File', [ber,der]).
    +2> 'File':encode('Seq1', {'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
    +{ok,<<48,0>>}
    +3> 'File':encode('Seq1', {'Seq1',1,{'Seq2',true,15}}).
    +{ok,<<48,0>>}

    Example with a named BIT STRING where the BER encoder does not omit the +encoding:

    4> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    +{ok,<<48,0>>}
    +5> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    +{ok,<<48,4,128,2,5,160>>}

    The DER encoder omits the encoding for the same BIT STRING:

    6> asn1ct:compile('File', [ber,der]).
     ok
    -7> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    -{ok,<<48,0>>}
    -8> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    -{ok,<<48,0>>}

    +7> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT). +{ok,<<48,0>>} +8> 'File':encode('Seq3', {'Seq3',<<16#101:3>>). +{ok,<<48,0>>}

    @@ -582,14 +582,14 @@

    b BOOLEAN OPTIONAL, c IA5String } -END

    Optional fields are to be omitted from the map if they have no value:

    1> asn1ct:compile('File', [per,maps]).
    +END

    Optional fields are to be omitted from the map if they have no value:

    1> asn1ct:compile('File', [per,maps]).
     ok
    -2> {ok,E} = 'File':encode('Seq1', #{a=>0,c=>"string"}).
    -{ok,<<128,1,0,6,115,116,114,105,110,103>>}

    When decoding, optional fields will be omitted from the map:

    3> 'File':decode('Seq1', E).
    -{ok,#{a => 0,c => "string"}}

    Default values can be omitted from the map:

    4> {ok,E2} = 'File':encode('Seq1', #{c=>"string"}).
    -{ok,<<0,6,115,116,114,105,110,103>>}
    -5> 'File':decode('Seq1', E2).
    -{ok,#{a => 42,c => "string"}}

    Note

    It is not allowed to use the atoms asn1_VALUE and asn1_DEFAULT with maps.

    +2> {ok,E} = 'File':encode('Seq1', #{a=>0,c=>"string"}). +{ok,<<128,1,0,6,115,116,114,105,110,103>>}

    When decoding, optional fields will be omitted from the map:

    3> 'File':decode('Seq1', E).
    +{ok,#{a => 0,c => "string"}}

    Default values can be omitted from the map:

    4> {ok,E2} = 'File':encode('Seq1', #{c=>"string"}).
    +{ok,<<0,6,115,116,114,105,110,103>>}
    +5> 'File':decode('Seq1', E2).
    +{ok,#{a => 42,c => "string"}}

    Note

    It is not allowed to use the atoms asn1_VALUE and asn1_DEFAULT with maps.

    @@ -602,8 +602,8 @@

    x REAL, y INTEGER, z OBJECT IDENTIFIER } -END

    It is then possible to assign values as follows:

    TVal1 = {y,17},
    -TVal2 = {z,{0,1,2}},

    A CHOICE value is always represented as the tuple {ChoiceAlternative, Val} +END

    It is then possible to assign values as follows:

    TVal1 = {y,17},
    +TVal2 = {z,{0,1,2}},

    A CHOICE value is always represented as the tuple {ChoiceAlternative, Val} where ChoiceAlternative is an atom denoting the selected choice alternative.

    Extensible CHOICE

    When a CHOICE contains an extension marker and the decoder detects an unknown alternative of the CHOICE, the value is represented as follows:

    {asn1_ExtAlt, BytesForOpenType}

    Here BytesForOpenType is a list of bytes constituting the encoding of the "unknown" CHOICE alternative.

    @@ -669,8 +669,8 @@

    x REAL, y INTEGER, z OBJECT IDENTIFIER } - END

    SEQUENCE b can be encoded as follows in Erlang:

    1> 'EmbeddedExample':encode('B', {'B',[4,5,6,7,8],{x,"7.77"}}).
    -{ok,<<5,56,0,8,3,55,55,55,46,69,45,50>>}

    + END

    SEQUENCE b can be encoded as follows in Erlang:

    1> 'EmbeddedExample':encode('B', {'B',[4,5,6,7,8],{x,"7.77"}}).
    +{ok,<<5,56,0,8,3,55,55,55,46,69,45,50>>}

    @@ -696,10 +696,10 @@

    a INTEGER, b FooType } } -FooType ::= [3] VisibleString

    The following records are generated because of type Emb:

    -record('Emb,{a, b, c}).
    --record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type

    Values of type Emb can be assigned as follows:

    V = #'Emb'{a=["qqqq",[1,2,255]],
    -           b = #'Emb_b'{a=99},
    -           c ={b,"Can you see this"}}.

    For an embedded type of type SEQUENCE/SET in a SEQUENCE/SET, the record +FooType ::= [3] VisibleString

    The following records are generated because of type Emb:

    -record('Emb,{a, b, c}).
    +-record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type

    Values of type Emb can be assigned as follows:

    V = #'Emb'{a=["qqqq",[1,2,255]],
    +           b = #'Emb_b'{a=99},
    +           c ={b,"Can you see this"}}.

    For an embedded type of type SEQUENCE/SET in a SEQUENCE/SET, the record name is extended with an underscore and the component name. If the embedded structure is deeper with the SEQUENCE, SET, or CHOICE types in the line, each component name/alternative name is added to the record name.

    Example:

    Seq ::= SEQUENCE{
    @@ -708,7 +708,7 @@ 

    c INTEGER } } -}

    This results in the following record:

    -record('Seq_a_b',{c}).

    If the structured type has a component with an embedded SEQUENCE OF/SET OF +}

    This results in the following record:

    -record('Seq_a_b',{c}).

    If the structured type has a component with an embedded SEQUENCE OF/SET OF which embedded type in turn is a SEQUENCE/SET, it gives a record with the SEQUENCE OF/SET OF addition as in the following example:

    Seq ::= SEQUENCE {
         a SEQUENCE OF SEQUENCE {
    @@ -717,8 +717,8 @@ 

    c SET OF SEQUENCE { d } -}

    This results in the following records:

    -record('Seq_a_SEQOF'{b}).
    --record('Seq_c_SETOF'{d}).

    A parameterized type is to be considered as an embedded type. Each time such a +}

    This results in the following records:

    -record('Seq_a_SEQOF'{b}).
    +-record('Seq_c_SETOF'{d}).

    A parameterized type is to be considered as an embedded type. Each time such a type is referenced, an instance of it is defined. Thus, in the following example a record with name 'Seq_b' is generated in the .hrl file and is used to hold values:

    Seq ::= SEQUENCE {
    @@ -733,15 +733,15 @@ 

    Recursive Types

    -

    Types that refer to themselves are called recursive types. Example:

    Rec ::= CHOICE {
    +

    Types that refer to themselves are called recursive types. Example:

    Rec ::= CHOICE {
          nothing NULL,
    -     something SEQUENCE {
    +     something SEQUENCE {
               a INTEGER,
               b OCTET STRING,
    -          c Rec }}

    This is allowed in ASN.1 and the ASN.1-to-Erlang compiler supports this -recursive type. A value for this type is assigned in Erlang as follows:

    V = {something,#'Rec_something'{a = 77,
    +          c Rec }}

    This is allowed in ASN.1 and the ASN.1-to-Erlang compiler supports this +recursive type. A value for this type is assigned in Erlang as follows:

    V = {something,#'Rec_something'{a = 77,
                                     b = "some octets here",
    -                                c = {nothing,'NULL'}}}.

    + c = {nothing,'NULL'}}}.

    @@ -750,22 +750,22 @@

    Values can be assigned to an ASN.1 type within the ASN.1 code itself, as opposed to the actions in the previous section where a value was assigned to an ASN.1 type in Erlang. The full value syntax of ASN.1 is supported and X.680 describes -in detail how to assign values in ASN.1. A short example:

    TT ::= SEQUENCE {
    +in detail how to assign values in ASN.1. A short example:

    TT ::= SEQUENCE {
        a INTEGER,
    -   b SET OF OCTET STRING }
    +   b SET OF OCTET STRING }
     
    -tt TT ::= {a 77,b {"kalle","kula"}}

    The value defined here can be used in several ways. It can, for example, be used +tt TT ::= {a 77,b {"kalle","kula"}}

    The value defined here can be used in several ways. It can, for example, be used as the value in some DEFAULT component:

    SS ::= SET {
         s OBJECT IDENTIFIER,
         val TT DEFAULT tt }

    It can also be used from inside an Erlang program. If this ASN.1 code is defined in ASN.1 module Values, the ASN.1 value tt can be reached from Erlang as a -function call to 'Values':tt() as in the following example:

    1> Val = 'Values':tt().
    -{'TT',77,["kalle","kula"]}
    -2> {ok,Bytes} = 'Values':encode('TT',Val).
    -{ok,<<48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,
    -      107,117,108,97>>}
    -4> 'Values':decode('TT',Bytes).
    -{ok,{'TT',77,["kalle","kula"]}}
    +function call to 'Values':tt() as in the following example:

    1> Val = 'Values':tt().
    +{'TT',77,["kalle","kula"]}
    +2> {ok,Bytes} = 'Values':encode('TT',Val).
    +{ok,<<48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,
    +      107,117,108,97>>}
    +4> 'Values':decode('TT',Bytes).
    +{ok,{'TT',77,["kalle","kula"]}}
     5>

    This example shows that a function is generated by the compiler that returns a valid Erlang representation of the value, although the value is of a complex type.

    Furthermore, if the option maps is not used, a macro is generated for each @@ -818,10 +818,10 @@

    object1 | object2}

    You cannot encode a class, object, or object set, only refer to it when defining other ASN.1 entities. Typically you refer to a class as well as to object sets by table constraints and component relation constraints (X.682) in ASN.1 types, -as in the following:

    StartMessage  ::= SEQUENCE {
    -    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
    -    content GENERAL-PROCEDURE.&Message ({GENERAL-PROCEDURES}{@msgId}),
    -    }

    In type StartMessage, the constraint following field content tells that in a +as in the following:

    StartMessage  ::= SEQUENCE {
    +    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
    +    content GENERAL-PROCEDURE.&Message ({GENERAL-PROCEDURES}{@msgId}),
    +    }

    In type StartMessage, the constraint following field content tells that in a value of type StartMessage the value in field content must come from the same object that is chosen by field msgId.

    So, the value #'StartMessage'{msgId="home",content="Any Printable String"} is legal to encode as a StartMessage value. However, the value diff --git a/prs/8803/lib/asn1-5.3/doc/html/asn1_spec.html b/prs/8803/lib/asn1-5.3/doc/html/asn1_spec.html index 1f2f8580b031d..0c787b31da77e 100644 --- a/prs/8803/lib/asn1-5.3/doc/html/asn1_spec.html +++ b/prs/8803/lib/asn1-5.3/doc/html/asn1_spec.html @@ -165,37 +165,37 @@

    exclusive decode is enabled. This function decodes the parts that were left undecoded during the exclusive decode.

    Both functions are described in the following.

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

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

    The result ExclMessage has the same structure as a +follows:

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

    The result ExclMessage has the same structure as a complete decode would have, except for the parts of the top type that were not decoded. The undecoded parts are on their places in the structure on format {TypeKey,UndecodedValue}.

    Each undecoded part that is to be decoded must be fed into function -decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    +decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    Writing an Exclusive Decode Instruction

    -

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
    +

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
     
    -ExclusiveDecodeFunctionName = atom()
    +ExclusiveDecodeFunctionName = atom()
     
    -TypeList = [TopType,ElementList]
    +TypeList = [TopType,ElementList]
     
    -ElementList = [Element]+
    +ElementList = [Element]+
     
    -Element = {Name,parts} |
    -          {Name,undecoded} |
    -          {Name,ElementList}
    +Element = {Name,parts} |
    +          {Name,undecoded} |
    +          {Name,ElementList}
     
    -TopType = atom()
    +TopType = atom()
     
    -Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is +Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is described. TopType is the name of a top-level type in the ASN.1 specification. The action for each component in ElementList is described by one of:

    • {Name,parts}
    • {Name,undecoded}
    • {Name,ElementList}

    The use and effect of the actions are as follows:

    • {Name,undecoded} - Leaves the element undecoded. The type of Name can be any ASN.1 type. The value of element Name is returned as a tuple (as @@ -261,78 +261,78 @@

      ['Button',[{number,undecoded}]]}]}}.

    The following figure shows 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.

    Bytes of a Window:status Message

    Here follows an example of how the module. Note that option no_ok_wrapper is -used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
    +used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
     ok
    -2> rr('GUI').
    -['Action','Button','Status']
    -3> ButtonMsg = #'Button'{number=123,on=true}.
    -#'Button'{number = 123,on = true}
    -4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
    +2> rr('GUI').
    +['Action','Button','Status']
    +3> ButtonMsg = #'Button'{number=123,on=true}.
    +#'Button'{number = 123,on = true}
    +4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
     <<48,6,128,1,123,129,1,255>>
    -5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    -#'Button'{number = {'Button_number',<<128,1,123>>},
    -          on = true}
    -6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    -{'Button_number',<<128,1,123>>}
    -7> 'GUI':decode_part(UndecKey, UndecBytes).
    +5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    +#'Button'{number = {'Button_number',<<128,1,123>>},
    +          on = true}
    +6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    +{'Button_number',<<128,1,123>>}
    +7> 'GUI':decode_part(UndecKey, UndecBytes).
     123
     8> WindowMsg =
    -{status,{'Status',35,
    -   [{'Button',3,true},
    -    {'Button',4,false},
    -    {'Button',5,true},
    -    {'Button',6,true},
    -    {'Button',7,false}],
    +{status,{'Status',35,
    +   [{'Button',3,true},
    +    {'Button',4,false},
    +    {'Button',5,true},
    +    {'Button',6,true},
    +    {'Button',7,false}],
        false,
    -   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    -{status,#'Status'{state = 35,
    -        buttonList = [#'Button'{number = 3,on = true},
    -                      #'Button'{number = 4,on = false},
    -                      #'Button'{number = 5,on = true},
    -                      #'Button'{number = 6,on = true},
    -                      #'Button'{number = 7,on = false}],
    +   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    +{status,#'Status'{state = 35,
    +        buttonList = [#'Button'{number = 3,on = true},
    +                      #'Button'{number = 4,on = false},
    +                      #'Button'{number = 5,on = true},
    +                      #'Button'{number = 6,on = true},
    +                      #'Button'{number = 7,on = false}],
             enabled = false,
    -        actions = {possibleActions,[#'Action'{number = 16,
    -                                              handle = #'Button'{number = 17,on = true}}]}}}
    -9> WindowBytes = 'GUI':encode('Window', WindowMsg).
    +        actions = {possibleActions,[#'Action'{number = 16,
    +                                              handle = #'Button'{number = 17,on = true}}]}}}
    +9> WindowBytes = 'GUI':encode('Window', WindowMsg).
     <<161,65,128,1,35,161,40,48,6,128,1,3,129,1,255,48,6,128,
       1,4,129,1,0,48,6,128,1,5,129,...>>
    -10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    -'GUI':decode_Window_exclusive(WindowBytes).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    +'GUI':decode_Window_exclusive(WindowBytes).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'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,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    -[#'Button'{number = 3,on = true},
    - #'Button'{number = 4,on = false},
    - #'Button'{number = 5,on = true},
    - #'Button'{number = 6,on = true},
    - #'Button'{number = 7,on = false}]
    -12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    -#'Button'{number = 3,on = true}
    -13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +                                                1,255>>}}}
    +11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    +[#'Button'{number = 3,on = true},
    + #'Button'{number = 4,on = false},
    + #'Button'{number = 5,on = true},
    + #'Button'{number = 6,on = true},
    + #'Button'{number = 7,on = false}]
    +12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    +#'Button'{number = 3,on = true}
    +13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'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,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -14> 'GUI':decode_part(ChoiceKey, ChoiceUndec).
    -{possibleActions,[#'Action'{number = 16,
    -                            handle = #'Button'{number = 17,on = true}}]}

    + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

    @@ -369,23 +369,23 @@

    Writing a Selective Decode Instruction

    One or more selective decode functions can be described in a configuration file. -Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
    +Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
     
    -SelectiveDecodeFunctionName = atom()
    +SelectiveDecodeFunctionName = atom()
     
    -TypeList = [TopType|ElementList]
    +TypeList = [TopType|ElementList]
     
     ElementList = Name|ListSelector
     
    -Name = atom()
    +Name = atom()
     
    -ListSelector = [integer()]

    The instruction must be a valid Erlang term terminated by a dot.

    • ModuleName is the same as the name of the ASN.1 specification, but without +ListSelector = [integer()]

    The instruction must be a valid Erlang term terminated by a dot.

    The default StatisticsSpec is:

    • For sequential commands:

      [{"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    • For parallel commands:

      [{"Distribution sequential/parallel", fun sequential_parallel/1},
      + {"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    diff --git a/prs/8803/lib/common_test-1.27/doc/html/ct_property_test_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/ct_property_test_chapter.html index 008935656b424..92b05231ea6c0 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/ct_property_test_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/ct_property_test_chapter.html @@ -147,51 +147,51 @@

    Introductory Example

    Assume that we want to test the lists:sort/1 function.

    We need a property to test the function. In normal way, we create -property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    --export([prop_sort/0]).
    +property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    +-export([prop_sort/0]).
     
     %%% This will include the .hrl file for the installed testing tool:
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
     %%% The property we want to check:
     %%%   For all possibly unsorted lists,
     %%%   the result of lists:sort/1 is sorted.
    -prop_sort() ->
    -    ?FORALL(UnSorted, list(),
    -            is_sorted(lists:sort(UnSorted))
    -           ).
    +prop_sort() ->
    +    ?FORALL(UnSorted, list(),
    +            is_sorted(lists:sort(UnSorted))
    +           ).
     
     %%% Function to check that a list is sorted:
    -is_sorted([]) ->
    +is_sorted([]) ->
         true;
    -is_sorted([_]) ->
    +is_sorted([_]) ->
         true;
    -is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    -    is_sorted([H2|SortedTail]);
    -is_sorted(_) ->
    -    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    --compile(export_all). % Only in tests!
    +is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    +    is_sorted([H2|SortedTail]);
    +is_sorted(_) ->
    +    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    +-compile(export_all). % Only in tests!
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_sort
    -         ].
    +all() -> [prop_sort
    +         ].
     
     %%% First prepare Config and compile the property tests for the found tool:
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         Config.
     
     %%%================================================================
     %%% Test suites
     %%%
    -prop_sort(Config) ->
    -    ct_property_test:quickcheck(
    -      ct_prop:prop_sort(),
    +prop_sort(Config) ->
    +    ct_property_test:quickcheck(
    +      ct_prop:prop_sort(),
           Config
    -     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
    +     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
     .....
     Common Test: Running make in test directories...
     
    @@ -221,13 +221,13 @@ 

    A stateful testing example

    Assume a test that generates some parallel stateful commands, and runs 300 -tests:

    prop_parallel(Config) ->
    -    numtests(300,
    -             ?FORALL(Cmds, parallel_commands(?MODULE),
    +tests:

    prop_parallel(Config) ->
    +    numtests(300,
    +             ?FORALL(Cmds, parallel_commands(?MODULE),
                          begin
    -                         RunResult = run_parallel_commands(?MODULE, Cmds),
    -                         ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
    -                     end)).

    The ct_property_test:present_result/4 is a help function for printing some + RunResult = run_parallel_commands(?MODULE, Cmds), + ct_property_test:present_result(?MODULE, Cmds, RunResult, Config) + end)).

    The ct_property_test:present_result/4 is a help function for printing some statistics in the CommonTest log file.

    Our example test could for example be a simple test of an ftp server, where we perform get, put and delete requests, some of them in parallel. Per default, the result has three sections:

    *** User 2019-12-11 13:28:17.504 ***
    diff --git a/prs/8803/lib/common_test-1.27/doc/html/ct_run_cmd.html b/prs/8803/lib/common_test-1.27/doc/html/ct_run_cmd.html
    index 0c451729c97f4..ee963d0dad6ef 100644
    --- a/prs/8803/lib/common_test-1.27/doc/html/ct_run_cmd.html
    +++ b/prs/8803/lib/common_test-1.27/doc/html/ct_run_cmd.html
    @@ -251,10 +251,10 @@ 

    Run Common Test in Interactive Mode

     ct_run -shell
    -  [-config ConfigFile1 ConfigFile2 ... ConfigFileN]
    -  [-userconfig CallbackModule1 ConfigString1 and CallbackModule2
    -   ConfigString2 and .. and CallbackModuleN ConfigStringN]
    -  [-decrypt_key Key] | [-decrypt_file KeyFile]

    + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    diff --git a/prs/8803/lib/common_test-1.27/doc/html/ct_snmp.html b/prs/8803/lib/common_test-1.27/doc/html/ct_snmp.html index 3a9b8ffe2e60e..203c06e723f06 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/ct_snmp.html +++ b/prs/8803/lib/common_test-1.27/doc/html/ct_snmp.html @@ -150,15 +150,15 @@

    Optional.

  • {agent_target_param_def, [term()] | {data_dir_file, rel_path()}} - Optional.

  • Parameter MgrAgentConfName in the functions is to be a name you allocate in your test suite using a require statement. Example (where -MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be +MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be confused with users.

    SNMP traps, inform, and report messages are handled by the user callback module. For details, see the SNMP application.

    It is recommended to use the .hrl files created by the Erlang/OTP MIB compiler to define the Object Identifiers (OIDs). For example, to get the Erlang node -name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, +name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, config, server, net_if, and so on (for a list of valid parameters and types, see the User's Guide for the SNMP application). -This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    -            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the +This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    +            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the example above). Pass this name as argument SnmpAppConfName to ct_snmp:start/3. ct_snmp specifies default values for some SNMP application configuration parameters (such as {verbosity,trace} for diff --git a/prs/8803/lib/common_test-1.27/doc/html/ct_ssh.html b/prs/8803/lib/common_test-1.27/doc/html/ct_ssh.html index a61cd8f17d514..367eb9e1eec33 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/ct_ssh.html +++ b/prs/8803/lib/common_test-1.27/doc/html/ct_ssh.html @@ -133,14 +133,14 @@

    that have been started on existing SSH connections (that is, when the original connection type is ssh). Whenever the connection type is sftp, use the SSH connection reference only.

    The following options are valid for specifying an SSH/SFTP connection (that is, -can be used as configuration elements):

    [{ConnType, Addr},
    - {port, Port},
    - {user, UserName}
    - {password, Pwd}
    - {user_dir, String}
    - {public_key_alg, PubKeyAlg}
    - {connect_timeout, Timeout}
    - {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    +can be used as configuration elements):

    [{ConnType, Addr},
    + {port, Port},
    + {user, UserName}
    + {password, Pwd}
    + {user_dir, String}
    + {public_key_alg, PubKeyAlg}
    + {connect_timeout, Timeout}
    + {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    diff --git a/prs/8803/lib/common_test-1.27/doc/html/ct_telnet.html b/prs/8803/lib/common_test-1.27/doc/html/ct_telnet.html index 92cae9fbd29d8..596c8f1e84e56 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/ct_telnet.html +++ b/prs/8803/lib/common_test-1.27/doc/html/ct_telnet.html @@ -136,14 +136,14 @@

    true
  • Polling limit (max number of times to poll to get a remaining string terminated) = 0
  • Polling interval (sleep time between polls) = 1 second
  • The TCP_NODELAY option for the telnet socket is disabled (set to false) per default
  • These parameters can be modified by the user with the following configuration -term:

    {telnet_settings, [{connect_timeout,Millisec},
    -                   {command_timeout,Millisec},
    -                   {reconnection_attempts,N},
    -                   {reconnection_interval,Millisec},
    -                   {keep_alive,Bool},
    -                   {poll_limit,N},
    -                   {poll_interval,Millisec},
    -                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test +term:

    {telnet_settings, [{connect_timeout,Millisec},
    +                   {command_timeout,Millisec},
    +                   {reconnection_attempts,N},
    +                   {reconnection_interval,Millisec},
    +                   {keep_alive,Bool},
    +                   {poll_limit,N},
    +                   {poll_interval,Millisec},
    +                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test and ct_telnet retrieves the information automatically.

    keep_alive can be specified per connection, if necessary. For details, see unix_telnet.

    @@ -158,8 +158,8 @@

    such as expect/3. However, ct_telnet can be configured to use a special purpose event handler, implemented in ct_conn_log_h, for logging all Telnet traffic. To use this handler, install a Common Test hook named -cth_conn_log. Example (using the test suite information function):

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection +cth_conn_log. Example (using the test suite information function):

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection protocol, that is, ct_telnet.

    The cth_conn_log hook performs unformatted logging of Telnet data to a separate text file. All Telnet communication is captured and printed, including any data sent from the server. The link to this text file is located at the top @@ -172,15 +172,15 @@

    default value of this option is raw, which results in the behavior described above. If the value is set to html, all Telnet communication is printed to the test case HTML log instead.

    All cth_conn_log hook options described can also be specified in a -configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    -                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook +configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    +                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook options in the test suite.

    Logging Example:

    The following ct_hooks statement causes printing of Telnet traffic to separate logs for the connections server1 and server2. Traffic for any other -connections is logged in the default Telnet log.

    suite() ->
    -    [{ct_hooks,
    -      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry -like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, []}]}].

    +connections is logged in the default Telnet log.

    suite() ->
    +    [{ct_hooks,
    +      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry +like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, []}]}].

    @@ -889,9 +889,9 @@

    expect(Connection, Patterns, Opts)

    instead of only one Match. Also HaltReason is returned.

  • sequence - All patterns must be matched in a sequence. A match is not concluded until all patterns are matched. This option can be interrupted by one or more HaltPatterns. MatchList is always returned, that is, a list of -Match instead of only one Match. Also HaltReason is returned.

  • Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the +Match instead of only one Match. Also HaltReason is returned.

    Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the function returns {error,{nnn,["NNN"]}}. If both "ABC" and "XYZ" are -matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function +matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function returns HaltReason = {nnn,["NNN"]}.

    Options repeat and sequence can be combined to match a sequence multiple times.

    diff --git a/prs/8803/lib/common_test-1.27/doc/html/dependencies_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/dependencies_chapter.html index 03c7d494b29f8..f4b40c8633a53 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/dependencies_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/dependencies_chapter.html @@ -161,65 +161,65 @@

    start and stop functionality separately.) The configuration can also be implemented as a common function, maybe grouped with the start function. Finally, the testing of connecting and disconnecting a client can be grouped -into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -suite() -> [{require,my_server_cfg}].
    +suite() -> [{require,my_server_cfg}].
     
    -init_per_testcase(start_and_stop, Config) ->
    +init_per_testcase(start_and_stop, Config) ->
         Config;
     
    -init_per_testcase(config, Config) ->
    -    [{server_pid,start_server()} | Config];
    +init_per_testcase(config, Config) ->
    +    [{server_pid,start_server()} | Config];
     
    -init_per_testcase(_, Config) ->
    -    ServerPid = start_server(),
    -    configure_server(),
    -    [{server_pid,ServerPid} | Config].
    +init_per_testcase(_, Config) ->
    +    ServerPid = start_server(),
    +    configure_server(),
    +    [{server_pid,ServerPid} | Config].
     
    -end_per_testcase(start_and_stop, _) ->
    +end_per_testcase(start_and_stop, _) ->
         ok;
     
    -end_per_testcase(_, Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    stop_server(ServerPid).
    +end_per_testcase(_, Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    stop_server(ServerPid).
     
     %%% test cases...
     
    -all() -> [start_and_stop, config, connect_and_disconnect].
    +all() -> [start_and_stop, config, connect_and_disconnect].
     
     %% test that starting and stopping works
    -start_and_stop(_) ->
    -    ServerPid = start_server(),
    -    stop_server(ServerPid).
    +start_and_stop(_) ->
    +    ServerPid = start_server(),
    +    stop_server(ServerPid).
     
     %% configuration test
    -config(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    configure_server(ServerPid).
    +config(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    configure_server(ServerPid).
     
     %% test connecting and disconnecting client
    -connect_and_disconnect(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    {ok,SessionId} = my_server:connect(ServerPid),
    -    ok = my_server:disconnect(ServerPid, SessionId).
    +connect_and_disconnect(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    {ok,SessionId} = my_server:connect(ServerPid),
    +    ok = my_server:disconnect(ServerPid, SessionId).
     
     %%% common functions...
     
    -start_server() ->
    -    {ok,ServerPid} = my_server:start(),
    +start_server() ->
    +    {ok,ServerPid} = my_server:start(),
         ServerPid.
     
    -stop_server(ServerPid) ->
    -    ok = my_server:stop(),
    +stop_server(ServerPid) ->
    +    ok = my_server:stop(),
         ok.
     
    -configure_server(ServerPid) ->
    -    ServerCfgData = ct:get_config(my_server_cfg),
    -    ok = my_server:configure(ServerPid, ServerCfgData),
    +configure_server(ServerPid) ->
    +    ServerCfgData = ct:get_config(my_server_cfg),
    +    ok = my_server:configure(ServerPid, ServerCfgData),
         ok.

    @@ -247,40 +247,40 @@

    data is to be saved by finction end_per_suite and read by function init_per_suite in the suite that follows. When passing data between suites, Saver carries the name -of the test suite.

    Example:

    -module(server_b_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +of the test suite.

    Example:

    -module(server_b_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -init_per_suite(Config) ->
    +init_per_suite(Config) ->
         %% read config saved by previous test suite
    -    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
    +    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
         %% extract server identity (comes from server_a_SUITE)
    -    ServerId = proplists:get_value(server_id, OldConfig),
    -    SessionId = connect_to_server(ServerId),
    -    [{ids,{ServerId,SessionId}} | Config].
    +    ServerId = proplists:get_value(server_id, OldConfig),
    +    SessionId = connect_to_server(ServerId),
    +    [{ids,{ServerId,SessionId}} | Config].
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         %% save config for server_c_SUITE (session_id and server_id)
    -    {save_config,Config}
    +    {save_config,Config}
     
     %%% test cases...
     
    -all() -> [allocate, deallocate].
    +all() -> [allocate, deallocate].
     
    -allocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {ok,Handle} = allocate_resource(ServerId, SessionId),
    +allocate(Config) ->
    +    {ServerId,SessionId} = proplists:get_value(ids, Config),
    +    {ok,Handle} = allocate_resource(ServerId, SessionId),
         %% save handle for deallocation test
    -    NewConfig = [{handle,Handle}],
    -    {save_config,NewConfig}.
    -
    -deallocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {allocate,OldConfig} = proplists:get_value(saved_config, Config),
    -    Handle = proplists:get_value(handle, OldConfig),
    -    ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple + NewConfig = [{handle,Handle}], + {save_config,NewConfig}. + +deallocate(Config) -> + {ServerId,SessionId} = proplists:get_value(ids, Config), + {allocate,OldConfig} = proplists:get_value(saved_config, Config), + Handle = proplists:get_value(handle, OldConfig), + ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple {skip_and_save,Reason,ConfigList}.

    The result is that the test case is skipped with Reason printed to the log file (as described earlier) and ConfigList is saved for the next test case. ConfigList can be read using proplists:get_value(saved_config, Config), as @@ -300,22 +300,22 @@

    property. Test case groups are defined through function groups/0 in the test suite (for details, see section Test Case Groups.

    For example, to ensure that if allocate in server_b_SUITE crashes, -deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is -independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, +deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is +independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, dealloc is not executed but marked as SKIPPED in the HTML log. get_resource_status runs no matter what happens to the alloc_and_dealloc cases.

    Test cases in a sequence are executed in order until all succeed or one fails. If one fails, all following cases in the sequence are skipped. The cases in the sequence that have succeeded up to that point are reported as successful in the -log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    -             {scenarioB, [sequence], [testB1, testB2, testB3]}].
    +log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    +             {scenarioB, [sequence], [testB1, testB2, testB3]}].
     
    -all() -> [test1,
    +all() -> [test1,
               test2,
    -          {group,scenarioA},
    +          {group,scenarioA},
               test3,
    -          {group,scenarioB},
    -          test4].

    A sequence group can have subgroups. Such subgroups can have any property, that + {group,scenarioB}, + test4].

    A sequence group can have subgroups. Such subgroups can have any property, that is, they are not required to also be sequences. If you want the status of the subgroup to affect the sequence on the level above, return {return_group_result,Status} from diff --git a/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-1A83014C.js b/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-1A83014C.js deleted file mode 100644 index 99c6d74ae901c..0000000000000 --- a/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-1A83014C.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"ct","doc":"Main user interface for the `Common Test` framework.\n\nThis module implements the command-line interface for running tests and basic\nfunctions for `Common Test` case issues, such as configuration and logging.\n\nThe framework stores configuration values in a property list usually named\n`Config`. The list contains information about the test run added by the\nframework itself and may also contain user-provided values. The configuration is\npassed into individual test cases as well as support functions if defined.\n\nPossible configuration variables include:\n\n- `data_dir` \\- Data file directory\n- `priv_dir` \\- Scratch file directory\n- Whatever added by [`init_per_suite/1`](`c:ct_suite:init_per_suite/1`) or\n [`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) in the test suite.\n\n> #### Warning {: .warning }\n>\n> The `?config` macro, used to receive individual config values from the\n> `Config` property list, is deprecated. Please use `proplists:get_value/2-3`\n> instead.","ref":"ct.html"},{"type":"function","title":"ct.abort_current_testcase/1","doc":"Aborts the currently executing test case. The user must know with certainty\nwhich test case is currently executing. The function is therefore only safe to\ncall from a function that has been called (or synchronously invoked) by the test\ncase.\n\n`Reason`, the reason for aborting the test case, is printed in the test case\nlog.","ref":"ct.html#abort_current_testcase/1"},{"type":"function","title":"ct.add_config/2","doc":"Loads configuration variables using the specified callback module and\nconfiguration string. The callback module is to be either loaded or present in\nthe code path. Loaded configuration variables can later be removed using\nfunction [`ct:remove_config/2`](`remove_config/2`).","ref":"ct.html#add_config/2"},{"type":"function","title":"ct.break/1","doc":"Cancels any active timetrap and pauses the execution of the current test case\nuntil the user calls function `continue/0`. The user can then interact with the\nErlang node running the tests, for example, for debugging purposes or for\nmanually executing a part of the test case. If a parallel group is executing,\n[`ct:break/2`](`break/2`) is to be called instead.\n\nA cancelled timetrap is not automatically reactivated after the break, but must\nbe started explicitly with [`ct:timetrap/1`](`timetrap/1`).\n\nIn order for the break/continue functionality to work, `Common Test` must\nrelease the shell process controlling `stdin`. This is done by setting start\noption `release_shell` to `true`. For details, see section\n[Running Tests from the Erlang Shell or from an Erlang Program](run_test_chapter.md#erlang_shell_or_program)\nin the User's Guide.","ref":"ct.html#break/1"},{"type":"function","title":"ct.break/2","doc":"Works the same way as [`ct:break/1`](`break/1`), only argument `TestCase` makes\nit possible to pause a test case executing in a parallel group. Function\n[`ct:continue/1`](`continue/1`) is to be used to resume execution of `TestCase`.\n\nFor details, see [`ct:break/1`](`break/1`).","ref":"ct.html#break/2"},{"type":"function","title":"ct.capture_get/0","doc":"","ref":"ct.html#capture_get/0"},{"type":"function","title":"ct.capture_get/1","doc":"Returns and purges the list of text strings buffered during the latest session\nof capturing printouts to `stdout`. Log categories that are to be ignored in\n`ListOfStrings` can be specified with `ExclCategories`. If\n`ExclCategories = []`, no filtering takes place.\n\nSee also [`ct:capture_start/0`](`capture_start/0`),\n[`ct:capture_stop/0`](`capture_stop/0`), [`ct:log/3`](`log/3`).","ref":"ct.html#capture_get/1"},{"type":"function","title":"ct.capture_start/0","doc":"Starts capturing all text strings printed to `stdout` during execution of the\ntest case.\n\nSee also [`ct:capture_get/1`](`capture_get/1`),\n[`ct:capture_stop/0`](`capture_stop/0`).","ref":"ct.html#capture_start/0"},{"type":"function","title":"ct.capture_stop/0","doc":"Stops capturing text strings (a session started with `capture_start/0`).\n\nSee also [`ct:capture_get/1`](`capture_get/1`),\n[`ct:capture_start/0`](`capture_start/0`).","ref":"ct.html#capture_stop/0"},{"type":"function","title":"ct.comment/1","doc":"Prints the specified `Comment` in the comment field in the table on the test\nsuite result page.\n\nIf called several times, only the last comment is printed. The test case return\nvalue `{comment,Comment}` overwrites the string set by this function.","ref":"ct.html#comment/1"},{"type":"function","title":"ct.comment/2","doc":"Prints the formatted string in the comment field in the table on the test suite\nresult page.\n\nArguments `Format` and `Args` are used in a call to `io_lib:format/2` to create\nthe comment string. The behavior of [`comment/2`](`comment/2`) is otherwise the\nsame as function [`ct:comment/1`](`comment/1`).","ref":"ct.html#comment/2"},{"type":"function","title":"ct.continue/0","doc":"This function must be called to continue after a test case (not executing in a\nparallel group) has called function [`ct:break/1`](`break/1`).","ref":"ct.html#continue/0"},{"type":"function","title":"ct.continue/1","doc":"This function must be called to continue after a test case has called\n[`ct:break/2`](`break/2`). If the paused test case, `TestCase`, executes in a\nparallel group, this function, rather than `continue/0`, must be used to let the\ntest case proceed.","ref":"ct.html#continue/1"},{"type":"function","title":"ct.decrypt_config_file/2","doc":"Decrypts `EncryptFileName`, previously generated with\n[`ct:encrypt_config_file/2,3`](`encrypt_config_file/2`). The original file\ncontents is saved in the target file. The encryption key, a string, must be\navailable in a text file named `.ct_config.crypt`, either in the current\ndirectory, or the home directory of the user (it is searched for in that order).","ref":"ct.html#decrypt_config_file/2"},{"type":"function","title":"ct.decrypt_config_file/3","doc":"Decrypts `EncryptFileName`, previously generated with\n[`ct:encrypt_config_file/2,3`](`encrypt_config_file/2`). The original file\ncontents is saved in the target file. The key must have the same value as that\nused for encryption.","ref":"ct.html#decrypt_config_file/3"},{"type":"function","title":"ct.encrypt_config_file/2","doc":"Encrypts the source configuration file with DES3 and saves the result in file\n`EncryptFileName`. The key, a string, must be available in a text file named\n`.ct_config.crypt`, either in the current directory, or the home directory of\nthe user (it is searched for in that order).\n\nFor information about using encrypted configuration files when running tests,\nsee section\n[Encrypted Configuration Files](config_file_chapter.md#encrypted_config_files)\nin the User's Guide.\n\nFor details on DES3 encryption/decryption, see application\n[`Crypto`](`e:crypto:index.html`).","ref":"ct.html#encrypt_config_file/2"},{"type":"function","title":"ct.encrypt_config_file/3","doc":"Encrypts the source configuration file with DES3 and saves the result in the\ntarget file `EncryptFileName`. The encryption key to use is either the value in\n`{key,Key}` or the value stored in the file specified by `{file,File}`.\n\nFor information about using encrypted configuration files when running tests,\nsee section\n[Encrypted Configuration Files](config_file_chapter.md#encrypted_config_files)\nin the User's Guide.\n\nFor details on DES3 encryption/decryption, see application\n[`Crypto`](`e:crypto:index.html`).","ref":"ct.html#encrypt_config_file/3"},{"type":"function","title":"ct.fail/1","doc":"Terminates a test case with the specified error `Reason`.","ref":"ct.html#fail/1"},{"type":"function","title":"ct.fail/2","doc":"Terminates a test case with an error message specified by a format string and a\nlist of values (used as arguments to `io_lib:format/2`).","ref":"ct.html#fail/2"},{"type":"function","title":"ct.get_config/1","doc":"","ref":"ct.html#get_config/1"},{"type":"function","title":"ct.get_config/2","doc":"","ref":"ct.html#get_config/2"},{"type":"function","title":"ct.get_config/3","doc":"Reads configuration data values.\n\nReturns the matching values or configuration elements, given a configuration\nvariable key or its associated name (if one has been specified with\n[`ct:require/2`](`require/2`) or a `require` statement).\n\n_Example:_\n\nGiven the following configuration file:\n\n```erlang\n{unix,[{telnet,IpAddr},\n {user,[{username,Username},\n {password,Password}]}]}.\n```\n\nThen:\n\n```erlang\nct:get_config(unix,Default) -> [{telnet,IpAddr},\n {user, [{username,Username}, {password,Password}]}]\nct:get_config({unix,telnet},Default) -> IpAddr\nct:get_config({unix,user,username},Default) -> Username\nct:get_config({unix,ftp},Default) -> Default\nct:get_config(unknownkey,Default) -> Default\n```\n\nIf a configuration variable key has been associated with a name (by\n[`ct:require/2`](`require/2`) or a `require` statement), the name can be used\ninstead of the key to read the value:\n\n```erlang\nct:require(myuser,{unix,user}) -> ok.\nct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]\n```\n\nIf a configuration variable is defined in multiple files, use option `all` to\naccess all possible values. The values are returned in a list. The order of the\nelements corresponds to the order that the configuration files were specified at\nstartup.\n\nIf configuration elements (key-value tuples) are to be returned as result\ninstead of values, use option `element`. The returned elements are then on the\nform `{Required,Value}`.\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:require/1`](`require/1`),\n[`ct:require/2`](`require/2`).","ref":"ct.html#get_config/3"},{"type":"function","title":"ct.get_event_mgr_ref/0","doc":"Gets a reference to the `Common Test` event manager. The reference can be used\nto, for example, add a user-specific event handler while tests are running.\n\n_Example:_\n\n```erlang\ngen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])\n```","ref":"ct.html#get_event_mgr_ref/0"},{"type":"function","title":"ct.get_progname/0","doc":"Returns the command used to start this Erlang instance. If this information\ncould not be found, the string `\"no_prog_name\"` is returned.","ref":"ct.html#get_progname/0"},{"type":"function","title":"ct.get_status/0","doc":"Returns status of ongoing test. The returned list contains information about\nwhich test case is executing (a list of cases when a parallel test case group is\nexecuting), as well as counters for successful, failed, skipped, and total test\ncases so far.","ref":"ct.html#get_status/0"},{"type":"function","title":"ct.get_target_name/1","doc":"Returns the name of the target that the specified connection belongs to.","ref":"ct.html#get_target_name/1"},{"type":"function","title":"ct.get_testspec_terms/0","doc":"Gets a list of all test specification terms used to configure and run this test.","ref":"ct.html#get_testspec_terms/0"},{"type":"function","title":"ct.get_testspec_terms/1","doc":"Reads one or more terms from the test specification used to configure and run\nthis test. `Tag` is any valid test specification tag, for example, `label`,\n`config`, or `logdir`. User-specific terms are also available to read if option\n`allow_user_terms` is set.\n\nAll value tuples returned, except user terms, have the node name as first\nelement.\n\nTo read test terms, use `Tag = tests` (rather than `suites`, `groups`, or\n`cases`). `Value` is then the list of _all_ tests on the form\n`[{Node,Dir,[{TestSpec,GroupsAndCases1},...]},...]`, where\n`GroupsAndCases = [{Group,[Case]}] | [Case]`.","ref":"ct.html#get_testspec_terms/1"},{"type":"function","title":"ct.get_timetrap_info/0","doc":"Reads information about the timetrap set for the current test case. `Scaling`\nindicates if `Common Test` will attempt to compensate timetraps automatically\nfor runtime delays introduced by, for example, tools like cover. `ScaleVal` is\nthe value of the current scaling multiplier (always 1 if scaling is disabled).\nNote the `Time` is not the scaled result.","ref":"ct.html#get_timetrap_info/0"},{"type":"function","title":"ct.get_verbosity/1","doc":"This function returns the verbosity level for the specified logging category.\nSee the [User's Guide](write_test_chapter.md#logging) for details. Use the value\n`default` to read the general verbosity level.","ref":"ct.html#get_verbosity/1"},{"type":"function","title":"ct.install/1","doc":"Installs configuration files and event handlers.\n\nRun this function once before the first test.\n\n_Example:_\n\n```erlang\ninstall([{config,[\"config_node.ctc\",\"config_user.ctc\"]}])\n```\n\nThis function is automatically run by program `ct_run`.","ref":"ct.html#install/1"},{"type":"function","title":"ct.listenv/1","doc":"Performs command `listenv` on the specified Telnet connection and returns the\nresult as a list of key-value pairs.","ref":"ct.html#listenv/1"},{"type":"function","title":"ct.log/1","doc":"Equivalent to [`log(default, ?STD_IMPORTANCE, Format, [], [])`](`log/5`).","ref":"ct.html#log/1"},{"type":"function","title":"ct.log/2","doc":"","ref":"ct.html#log/2"},{"type":"function","title":"ct.log/3","doc":"","ref":"ct.html#log/3"},{"type":"function","title":"ct.log/4","doc":"","ref":"ct.html#log/4"},{"type":"function","title":"ct.log/5","doc":"Prints from a test case to the log file.\n\nThis function is meant for printing a string directly from a test case to the\ntest case log file.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category`, `Importance` and the `no_css` option, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.\n\nCommon Test will not escape special HTML characters (<, > and &) in the text\nprinted with this function, unless the `esc_chars` option is used.","ref":"ct.html#log/5"},{"type":"function","title":"ct.make_priv_dir/0","doc":"If the test is started with option `create_priv_dir` set to `manual_per_tc`, in\norder for the test case to use the private directory, it must first create it by\ncalling this function.","ref":"ct.html#make_priv_dir/0"},{"type":"function","title":"ct.notify/2","doc":"Sends an asynchronous notification of type `Name` with `Data`to the Common Test\nevent manager. This can later be caught by any installed event manager.\n\nSee also `m:gen_event`.","ref":"ct.html#notify/2"},{"type":"function","title":"ct.pal/1","doc":"Equivalent to [`pal(default, ?STD_IMPORTANCE, Format, [])`](`pal/4`).","ref":"ct.html#pal/1"},{"type":"function","title":"ct.pal/2","doc":"","ref":"ct.html#pal/2"},{"type":"function","title":"ct.pal/3","doc":"","ref":"ct.html#pal/3"},{"type":"function","title":"ct.pal/4","doc":"","ref":"ct.html#pal/4"},{"type":"function","title":"ct.pal/5","doc":"Prints and logs from a test case.\n\nThis function is meant for printing a string from a test case, both to the test\ncase log file and to the console.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category` and `Importance`, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.\n\nNote that special characters in the text (<, > and &) will be escaped by Common\nTest before the text is printed to the log file.","ref":"ct.html#pal/5"},{"type":"function","title":"ct.parse_table/1","doc":"Parses the printout from an SQL table and returns a list of tuples.\n\nThe printout to parse is typically the result of a `select` command in SQL. The\nreturned `Table` is a list of tuples, where each tuple is a row in the table.\n\n`Heading` is a tuple of strings representing the headings of each column in the\ntable.","ref":"ct.html#parse_table/1"},{"type":"function","title":"ct.print/1","doc":"Equivalent to [`print(default, ?STD_IMPORTANCE, Format, [], [])`](`print/5`).","ref":"ct.html#print/1"},{"type":"function","title":"ct.print/2","doc":"","ref":"ct.html#print/2"},{"type":"function","title":"ct.print/3","doc":"","ref":"ct.html#print/3"},{"type":"function","title":"ct.print/4","doc":"","ref":"ct.html#print/4"},{"type":"function","title":"ct.print/5","doc":"Prints from a test case to the console.\n\nThis function is meant for printing a string from a test case to the console.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category` and `Importance`, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.","ref":"ct.html#print/5"},{"type":"function","title":"ct.reload_config/1","doc":"Reloads configuration file containing specified configuration key.\n\nThis function updates the configuration data from which the specified\nconfiguration variable was read, and returns the (possibly) new value of this\nvariable.\n\nIf some variables were present in the configuration, but are not loaded using\nthis function, they are removed from the configuration table together with their\naliases.","ref":"ct.html#reload_config/1"},{"type":"function","title":"ct.remaining_test_procs/0","doc":"This function will return the identity of test- and group leader processes that\nare still running at the time of this call. `TestProcs` are processes in the\nsystem that have a Common Test IO process as group leader. `SharedGL` is the\ncentral Common Test IO process, responsible for printing to log files for\nconfiguration functions and sequentially executing test cases. `OtherGLs` are\nCommon Test IO processes that print to log files for test cases in parallel test\ncase groups.\n\nThe process information returned by this function may be used to locate and\nterminate remaining processes after tests have finished executing. The function\nwould typically by called from Common Test Hook functions.\n\nNote that processes that execute configuration functions or test cases are never\nincluded in `TestProcs`. It is therefore safe to use post configuration hook\nfunctions (such as post_end_per_suite, post_end_per_group,\npost_end_per_testcase) to terminate all processes in `TestProcs` that have the\ncurrent group leader process as its group leader.\n\nNote also that the shared group leader (`SharedGL`) must never be terminated by\nthe user, only by Common Test. Group leader processes for parallel test case\ngroups (`OtherGLs`) may however be terminated in post_end_per_group hook\nfunctions.","ref":"ct.html#remaining_test_procs/0"},{"type":"function","title":"ct.remove_config/2","doc":"Removes configuration variables (together with their aliases) that were loaded\nwith specified callback module and configuration string.","ref":"ct.html#remove_config/2"},{"type":"function","title":"ct.require/1","doc":"Checks if the required configuration is available. Arbitrarily deep tuples can\nbe specified as `Required`. Only the last element of the tuple can be a list of\n`SubKey`s.\n\n_Example 1._ Require the variable `myvar`:\n\n```erlang\nok = ct:require(myvar).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,Value}.\n```\n\n_Example 2._ Require key `myvar` with subkeys `sub1` and `sub2`:\n\n```erlang\nok = ct:require({myvar,[sub1,sub2]}).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,[{sub1,Value},{sub2,Value}]}.\n```\n\n_Example 3._ Require key `myvar` with subkey `sub1` with `subsub1`:\n\n```erlang\nok = ct:require({myvar,sub1,sub2}).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,[{sub1,[{sub2,Value}]}]}.\n```\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:get_config/3`](`get_config/3`),\n[`ct:require/2`](`require/2`).","ref":"ct.html#require/1"},{"type":"function","title":"ct.require/2","doc":"Checks if the required configuration is available and gives it a name. The\nsemantics for `Required` is the same as in [`ct:require/1`](`require/1`) except\nthat a list of `SubKey`s cannot be specified.\n\nIf the requested data is available, the subentry is associated with `Name` so\nthat the value of the element can be read with\n[`ct:get_config/1,2`](`get_config/1`) provided `Name` is used instead of the\nwhole `Required` term.\n\n_Example:_\n\nRequire one node with a Telnet connection and an FTP connection. Name the node\n`a`:\n\n```erlang\nok = ct:require(a,{machine,node}).\n```\n\nAll references to this node can then use the node name. For example, a file over\nFTP is fetched like follows:\n\n```erlang\nok = ct:ftp_get(a,RemoteFile,LocalFile).\n```\n\nFor this to work, the configuration file must at least contain:\n\n```erlang\n{machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.\n```\n\n> #### Note {: .info }\n>\n> The behavior of this function changed radically in `Common Test` 1\\.6.2. To\n> keep some backwards compatibility, it is still possible to do:\n> `ct:require(a,{node,[telnet,ftp]}).` This associates the name `a` with the\n> top-level `node` entry. For this to work, the configuration file must at least\n> contain: `{node,[{telnet,IpAddr},{ftp,IpAddr}]}.`\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:get_config/3`](`get_config/3`),\n[`ct:require/1`](`require/1`).","ref":"ct.html#require/2"},{"type":"function","title":"ct.run/1","doc":"Runs all test cases in all suites in the specified directories.\n\nSee also [`ct:run/3`](`run/3`).","ref":"ct.html#run/1"},{"type":"function","title":"ct.run/2","doc":"Runs all test cases in the specified suite.\n\nSee also [`ct:run/3`](`run/3`).","ref":"ct.html#run/2"},{"type":"function","title":"ct.run/3","doc":"Runs the specified test cases.\n\nRequires that [`ct:install/1`](`install/1`) has been run first.\n\nSuites (`*_SUITE.erl`) files must be stored in `TestDir` or `TestDir/test`. All\nsuites are compiled when the test is run.","ref":"ct.html#run/3"},{"type":"function","title":"ct.run_test/1","doc":"Runs tests as specified by the combination of options in `Opts`. The options are\nthe same as those used with program `ct_run`, see\n[Run Tests from Command Line](ct_run_cmd.md#ct_run) in the `ct_run` manual page.\n\nHere a `TestDir` can be used to point out the path to a `Suite`. Option\n`testcase` corresponds to option `-case` in program `ct_run`. Configuration\nfiles specified in `Opts` are installed automatically at startup.\n\n`TestRunnerPid` is returned if `release_shell == true`. For details, see\n[`ct:break/1`](`break/1`).\n\n`Reason` indicates the type of error encountered.","ref":"ct.html#run_test/1"},{"type":"function","title":"ct.run_testspec/1","doc":"Runs a test specified by `TestSpec`. The same terms are used as in test\nspecification files.\n\n`Reason` indicates the type of error encountered.","ref":"ct.html#run_testspec/1"},{"type":"function","title":"ct.set_verbosity/2","doc":"Use this function to set, or modify, the verbosity level for a logging category.\nSee the [User's Guide](write_test_chapter.md#logging) for details. Use the value\n`default` to set the general verbosity level.","ref":"ct.html#set_verbosity/2"},{"type":"function","title":"ct.sleep/1","doc":"This function, similar to `timer:sleep/1` in STDLIB, suspends the test case for\na specified time. However, this function also multiplies `Time` with the\n`multiply_timetraps` value (if set) and under certain circumstances also scales\nup the time automatically if `scale_timetraps` is set to `true` (default is\n`false`).","ref":"ct.html#sleep/1"},{"type":"function","title":"ct.start_interactive/0","doc":"Starts `Common Test` in interactive mode.\n\nFrom this mode, all test case support functions can be executed directly from\nthe Erlang shell. The interactive mode can also be started from the OS command\nline with `ct_run -shell [-config File...]`.\n\nIf any functions (for example, Telnet or FTP) using \"required configuration\ndata\" are to be called from the Erlang shell, configuration data must first be\nrequired with [`ct:require/2`](`require/2`).\n\n_Example:_\n\n```erlang\n> ct:require(unix_telnet, unix).\nok\n> ct_telnet:open(unix_telnet).\n{ok,<0.105.0>}\n> ct_telnet:cmd(unix_telnet, \"ls .\").\n{ok,[\"ls\",\"file1 ...\",...]}\n```","ref":"ct.html#start_interactive/0"},{"type":"function","title":"ct.step/3","doc":"Steps through a test case with the debugger.\n\nSee also [`ct:run/3`](`run/3`).","ref":"ct.html#step/3"},{"type":"function","title":"ct.step/4","doc":"Steps through a test case with the debugger. If option `config` has been\nspecified, breakpoints are also set on the configuration functions in `Suite`.\n\nSee also [`ct:run/3`](`run/3`).","ref":"ct.html#step/4"},{"type":"function","title":"ct.stop_interactive/0","doc":"Exits the interactive mode.\n\nSee also [`ct:start_interactive/0`](`start_interactive/0`).","ref":"ct.html#stop_interactive/0"},{"type":"function","title":"ct.sync_notify/2","doc":"Sends a synchronous notification of type `Name` with `Data` to the `Common Test`\nevent manager. This can later be caught by any installed event manager.\n\nSee also `m:gen_event`.","ref":"ct.html#sync_notify/2"},{"type":"function","title":"ct.testcases/2","doc":"Returns all test cases in the specified suite.","ref":"ct.html#testcases/2"},{"type":"function","title":"ct.timetrap/1","doc":"Sets a new timetrap for the running test case.\n\nIf the argument is `Func`, the timetrap is triggered when this function returns.\n`Func` can also return a new `Time` value, which in that case is the value for\nthe new timetrap.","ref":"ct.html#timetrap/1"},{"type":"function","title":"ct.userdata/2","doc":"Returns any data specified with tag `userdata` in the list of tuples returned\nfrom [`suite/0`](`c:ct_suite:suite/0`).","ref":"ct.html#userdata/2"},{"type":"function","title":"ct.userdata/3","doc":"Returns any data specified with tag `userdata` in the list of tuples returned\nfrom `Suite:group(GroupName)` or `Suite:Case()`.","ref":"ct.html#userdata/3"},{"type":"type","title":"ct.config_key/0","doc":"A configuration key which exists in a configuration file","ref":"ct.html#t:config_key/0"},{"type":"type","title":"ct.conn_log_mod/0","doc":"","ref":"ct.html#t:conn_log_mod/0"},{"type":"type","title":"ct.conn_log_option/0","doc":"","ref":"ct.html#t:conn_log_option/0"},{"type":"type","title":"ct.conn_log_options/0","doc":"Options that can be given to the `cth_conn_log` hook, which is used for logging\nof NETCONF and Telnet connections. See [ct_netconfc](`m:ct_netconfc#Logging`) or\n[ct_telnet](`m:ct_telnet#module-logging`) for description and examples of how to use\nthis hook.","ref":"ct.html#t:conn_log_options/0"},{"type":"type","title":"ct.conn_log_type/0","doc":"","ref":"ct.html#t:conn_log_type/0"},{"type":"type","title":"ct.handle/0","doc":"The identity (handle) of a connection.","ref":"ct.html#t:handle/0"},{"type":"type","title":"ct.key_or_name/0","doc":"","ref":"ct.html#t:key_or_name/0"},{"type":"type","title":"ct.target_name/0","doc":"A name and association to configuration data introduced through a require\nstatement, or a call to [`ct:require/2`](`require/2`), for example,\n`ct:require(mynodename,{node,[telnet]})`.","ref":"ct.html#t:target_name/0"},{"type":"module","title":"ct_cover","doc":"`Common Test` framework code coverage support module.\n\nThis module exports help functions for performing code coverage analysis.","ref":"ct_cover.html"},{"type":"function","title":"ct_cover.add_nodes/1","doc":"Adds nodes to current cover test. Notice that this only works if cover support\nis active.\n\nTo have effect, this function is to be called from `init_per_suite/1` (see\n`m:ct_suite`) before any tests are performed.","ref":"ct_cover.html#add_nodes/1"},{"type":"function","title":"ct_cover.cross_cover_analyse/2","doc":"Accumulates cover results over multiple tests. See section\n[Cross Cover Analysis](cover_chapter.md#cross_cover) in the User's Guide.","ref":"ct_cover.html#cross_cover_analyse/2"},{"type":"function","title":"ct_cover.remove_nodes/1","doc":"Removes nodes from the current cover test.\n\nCall this function to stop cover test on nodes previously added with\n[`ct_cover:add_nodes/1`](`add_nodes/1`). Results on the remote node are\ntransferred to the `Common Test` node.","ref":"ct_cover.html#remove_nodes/1"},{"type":"module","title":"ct_ftp","doc":"FTP client module (based on the `ftp` application).","ref":"ct_ftp.html"},{"type":"function","title":"ct_ftp.cd/2","doc":"Changes directory on remote host.","ref":"ct_ftp.html#cd/2"},{"type":"function","title":"ct_ftp.close/1","doc":"Closes the FTP connection.","ref":"ct_ftp.html#close/1"},{"type":"function","title":"ct_ftp.delete/2","doc":"Deletes a file on remote host.","ref":"ct_ftp.html#delete/2"},{"type":"function","title":"ct_ftp.get/3","doc":"Opens an FTP connection and fetches a file from the remote host.\n\n`RemoteFile` and `LocalFile` must be absolute paths.\n\nThe configuration file must be as for [`ct_ftp:put/3`](`put/3`).\n\nSee also `ct:require/2`.","ref":"ct_ftp.html#get/3"},{"type":"function","title":"ct_ftp.ls/2","doc":"Lists directory `Dir`.","ref":"ct_ftp.html#ls/2"},{"type":"function","title":"ct_ftp.open/1","doc":"Opens an FTP connection to the specified node.\n\nYou can open a connection for a particular `Name` and use the same name as\nreference for all following subsequent operations. If you want the connection to\nbe associated with `Handle` instead (if you, for example, need to open multiple\nconnections to a host), use `Key`, the configuration variable name, to specify\nthe target. A connection without an associated target name can only be closed\nwith the handle value.\n\nFor information on how to create a new `Name`, see `ct:require/2`.","ref":"ct_ftp.html#open/1"},{"type":"function","title":"ct_ftp.put/3","doc":"Opens an FTP connection and sends a file to the remote host.\n\n`LocalFile` and `RemoteFile` must be absolute paths.\n\nIf the target host is a \"special\" node, the FTP address must be specified in the\nconfiguration file as follows:\n\n```erlang\n{node,[{ftp,IpAddr}]}.\n```\n\nIf the target host is something else, for example, a UNIX host, the\nconfiguration file must also include the username and password (both strings):\n\n```erlang\n{unix,[{ftp,IpAddr},\n {username,Username},\n {password,Password}]}.\n```\n\nSee also `ct:require/2`.","ref":"ct_ftp.html#put/3"},{"type":"function","title":"ct_ftp.recv/2","doc":"Fetches a file over FTP.\n\nThe file gets the same name on the local host.\n\nSee also [`ct_ftp:recv/3`](`recv/3`).","ref":"ct_ftp.html#recv/2"},{"type":"function","title":"ct_ftp.recv/3","doc":"Fetches a file over FTP.\n\nThe file is named `LocalFile` on the local host.","ref":"ct_ftp.html#recv/3"},{"type":"function","title":"ct_ftp.send/2","doc":"Sends a file over FTP.\n\nThe file gets the same name on the remote host.\n\nSee also [`ct_ftp:send/3`](`send/3`).","ref":"ct_ftp.html#send/2"},{"type":"function","title":"ct_ftp.send/3","doc":"Sends a file over FTP.\n\nThe file is named `RemoteFile` on the remote host.","ref":"ct_ftp.html#send/3"},{"type":"function","title":"ct_ftp.type/2","doc":"Changes the file transfer type.","ref":"ct_ftp.html#type/2"},{"type":"type","title":"ct_ftp.connection/0","doc":"Reference to opened FTP connection associated to either a `handle` or `target_name`.","ref":"ct_ftp.html#t:connection/0"},{"type":"type","title":"ct_ftp.handle/0","doc":"Handle for a specific FTP connection, see module `m:ct`.","ref":"ct_ftp.html#t:handle/0"},{"type":"behaviour","title":"ct_hooks","doc":"A callback interface on top of Common Test.\n\nThe _Common Test Hook (CTH)_ framework allows extensions of the default behavior\nof `Common Test` by callbacks before and after all test suite calls. It is\nintended for advanced users of `Common Test` who want to abstract out behavior\nthat is common to multiple test suites.\n\nIn brief, CTH allows you to:\n\n- Manipulate the runtime configuration before each suite configuration call.\n- Manipulate the return of all suite configuration calls and by extension the\n result of the test themselves.\n\nThe following sections describe the mandatory and optional CTH functions that\n`Common Test` calls during test execution. For more details, see section\n[Common Test Hooks](ct_hooks_chapter.md) in the User's Guide.\n\nFor information about how to add a CTH to your suite, see section\n[Installing a CTH](ct_hooks_chapter.md#installing) in the User's Guide.\n\n> #### Note {: .info }\n>\n> For a minimal example of a CTH, see section\n> [Example CTH](ct_hooks_chapter.md#example) in the User's Guide.","ref":"ct_hooks.html"},{"type":"callback","title":"ct_hooks.id/1","doc":"The `Id` identifies a CTH instance uniquely. If two CTHs return the same `Id`,\nthe second CTH is ignored and subsequent calls to the CTH are only made to the\nfirst instance. For details, see section\n[Installing a CTH](ct_hooks_chapter.md#installing) in the User's Guide.\n\nThis function is _not_ to have any side effects, as it can be called multiple\ntimes by `Common Test`.\n\nIf not implemented, the CTH acts as if this function returned a call to\n`make_ref/0`.","ref":"ct_hooks.html#c:id/1"},{"type":"callback","title":"ct_hooks.init/2","doc":"This function is always called before any other callback function. Use it to\ninitiate any common state. It is to return a state for this CTH.\n\n`Id` is either the return value of [`ct_hooks:id/1`](`c:id/1`), or a `reference`\n(created using `erlang:make_ref/0` in ERTS) if [`ct_hooks:id/1`](`c:id/1`) is\nnot implemented.\n\n`Priority` is the relative priority of this hook. Hooks with a lower priority\nare executed first. If no priority is specified, it is set to `0`.\n\nFor details about hook execution order, see section\n[CTH Execution Order](ct_hooks_chapter.md#cth_execution_order) in the User's\nGuide.\n\nFor details about when `init` is called, see section\n[CTH Scope](ct_hooks_chapter.md#scope) in the User's Guide.","ref":"ct_hooks.html#c:init/2"},{"type":"callback","title":"ct_hooks.on_tc_fail/4","doc":"This function is called whenever a test case (or configuration function) fails.\nIt is called after the post function is called for the failed test case.\n\nThat is:\n\n- If `init_per_suite` fails, this function is called after\n [`post_init_per_suite`](`c:post_init_per_suite/4`).\n- If a test case fails, this function is called after\n [`post_end_per_testcase`](`c:post_end_per_testcase/5`).\n\nIf the failed test case belongs to a test case group, the second argument is a\ntuple `{FuncName,GroupName}`, otherwise only the function name.\n\nThe data that comes with `Reason` follows the same format as\n[`FailReason`](event_handler_chapter.md#failreason) in event\n[`tc_done`](event_handler_chapter.md#tc_done). For details, see section\n[Event Handling](event_handler_chapter.md#events) in the User's Guide.\n\nIf [`Module:on_tc_fail/4`](`c:on_tc_fail/4`) is not exported, common_test will\nattempt to call `Module:on_tc_fail(TestName, Reason, CTHState)` instead. This is\nfor backwards compatibility.","ref":"ct_hooks.html#c:on_tc_fail/4"},{"type":"callback","title":"ct_hooks.on_tc_skip/4","doc":"This function is called whenever a test case (or configuration function) is\nskipped. It is called after the post function is called for the skipped test\ncase.\n\nThat is:\n\n- If `init_per_group` is skipped, this function is called after\n [`post_init_per_group`](`c:post_init_per_group/5`).\n- If a test case is skipped, this function is called after\n [`post_end_per_testcase`](`c:post_end_per_testcase/5`).\n\nIf the skipped test case belongs to a test case group, the second argument is a\ntuple `{FuncName,GroupName}`, otherwise only the function name.\n\nThe data that comes with `Reason` follows the same format as events\n[`tc_auto_skip`](event_handler_chapter.md#tc_auto_skip) and\n[`tc_user_skip`](event_handler_chapter.md#tc_user_skip) For details, see section\n[Event Handling](event_handler_chapter.md#events) in the User's Guide.\n\nIf [`Module:on_tc_skip/4`](`c:on_tc_skip/4`) is not exported, common_test will\nattempt to call `Module:on_tc_skip(TestName, Reason, CTHState)` instead. This is\nfor backwards compatibility.","ref":"ct_hooks.html#c:on_tc_skip/4"},{"type":"callback","title":"ct_hooks.post_all/3","doc":"This function is called after [`all/0`](`c:ct_suite:all/0`). It is used to\nmodify the set of test cases and test group to be executed, for instance to add\nor remove test cases and groups, change group properties, or even skip all tests\nin the suite.\n\n`Return` is what [`all/0`](`c:ct_suite:all/0`) returned, that is, a list of test\ncases and groups to be executed, or a tuple `{skip,Reason}`.\n\n`GroupDefs` is what [`groups/0`](`c:ct_suite:groups/0`) or the\n[`post_groups/2`](`c:post_groups/2`) hook returned, that is, a list of group\ndefinitions.\n\n`NewReturn` is the possibly modified version of `Return`.\n\nThis function is called only if the CTH is added before `init_per_suite` is run.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.\n\nNotice that for CTHs that are installed by means of the\n[`suite/0`](`c:ct_suite:suite/0`) function, `post_all/2` is called before the\n`c:init/2` hook function. However, for CTHs that are installed by means of the\nCT start flag, the `c:init/2` function is called first.\n\n> #### Note {: .info }\n>\n> Prior to each test execution, Common Test does a simulated test run in order\n> to count test suites, groups and cases for logging purposes. This causes the\n> [`post_all/3`](`c:post_all/3`) hook function to always be called twice. For\n> this reason, side effects are best avoided in this callback.","ref":"ct_hooks.html#c:post_all/3"},{"type":"callback","title":"ct_hooks.post_end_per_group/5","doc":"This function is called after [`end_per_group`](`c:ct_suite:end_per_group/2`) if\nit exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[end_per_group](`c:ct_suite:end_per_group/2`) instead.\n\nIf [`Module:post_end_per_group/5`](`c:post_end_per_group/5`) is not exported,\ncommon_test will attempt to call\n`Module:post_end_per_group(GroupName, Config, Return, CTHState)` instead. This\nis for backwards compatibility.","ref":"ct_hooks.html#c:post_end_per_group/5"},{"type":"callback","title":"ct_hooks.post_end_per_suite/4","doc":"This function is called after [`end_per_suite`](`c:ct_suite:end_per_suite/1`) if\nit exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[`end_per_suite`](`c:ct_suite:end_per_suite/1`) instead.","ref":"ct_hooks.html#c:post_end_per_suite/4"},{"type":"callback","title":"ct_hooks.post_end_per_testcase/5","doc":"This function is called after\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) if it exists. It behaves\nthe same way as [`post_end_per_suite`](`c:post_end_per_suite/4`), but for\nfunction [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) instead.\n\nIf [`Module:post_end_per_testcase/5`](`c:post_end_per_testcase/5`) is not\nexported, common_test will attempt to call\n`Module:post_end_per_testcase(TestcaseName, Config, Return, CTHState)` instead.\nThis is for backwards compatibility.","ref":"ct_hooks.html#c:post_end_per_testcase/5"},{"type":"callback","title":"ct_hooks.post_groups/2","doc":"This function is called after [`groups/0`](`c:ct_suite:groups/0`). It is used to\nmodify the test group definitions, for instance to add or remove groups or\nchange group properties.\n\n`GroupDefs` is what [`groups/0`](`c:ct_suite:groups/0`) returned, that is, a\nlist of group definitions.\n\n`NewGroupDefs` is the possibly modified version of this list.\n\nThis function is called only if the CTH is added before `init_per_suite` is run.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.\n\nNotice that for CTHs that are installed by means of the\n[`suite/0`](`c:ct_suite:suite/0`) function, [`post_groups/2`](`c:post_groups/2`)\nis called before the `c:init/2` hook function. However, for CTHs that are\ninstalled by means of the CT start flag, the `c:init/2` function is called\nfirst.\n\n> #### Note {: .info }\n>\n> Prior to each test execution, Common Test does a simulated test run in order\n> to count test suites, groups and cases for logging purposes. This causes the\n> [`post_groups/2`](`c:post_groups/2`) hook function to always be called twice.\n> For this reason, side effects are best avoided in this callback.","ref":"ct_hooks.html#c:post_groups/2"},{"type":"callback","title":"ct_hooks.post_init_per_group/5","doc":"This function is called after [`init_per_group`](`c:ct_suite:init_per_group/2`)\nif it exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[`init_per_group`](`c:ct_suite:init_per_group/2`) instead.\n\nIf [`Module:post_init_per_group/5`](`c:post_init_per_group/5`) is not exported,\ncommon_test will attempt to call\n`Module:post_init_per_group(GroupName, Config, Return, CTHState)` instead. This\nis for backwards compatibility.","ref":"ct_hooks.html#c:post_init_per_group/5"},{"type":"callback","title":"ct_hooks.post_init_per_suite/4","doc":"This function is called after [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\nif it exists. It typically contains extra checks to ensure that all the correct\ndependencies are started correctly.\n\n`Return` is what [`init_per_suite`](`c:ct_suite:init_per_suite/1`) returned,\nthat is, `{fail,Reason}`, `{skip,Reason}`, a `Config` list, or a term describing\nhow [`init_per_suite`](`c:ct_suite:init_per_suite/1`) failed.\n\n`NewReturn` is the possibly modified return value of\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`). To recover from a failure in\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`), return `ConfigList` with the\n`tc_status` element removed. For more details, see\n[Post Hooks](ct_hooks_chapter.md#post) in section \"Manipulating Tests\" in the\nUser's Guide.\n\n`CTHState` is the current internal state of the CTH.\n\nThis function is called only if the CTH is added before or in `init_per_suite`.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.","ref":"ct_hooks.html#c:post_init_per_suite/4"},{"type":"callback","title":"ct_hooks.post_init_per_testcase/5","doc":"This function is called after\n[`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) if it exists. It behaves\nthe same way as [`post_init_per_suite`](`c:post_init_per_suite/4`), but for\nfunction [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) instead.\n\nIf [`Module:post_init_per_testcase/5`](`c:post_init_per_testcase/5`) is not\nexported, common_test will attempt to call\n`Module:post_init_per_testcase(TestcaseName, Config, Return, CTHState)` instead.\nThis is for backwards compatibility.","ref":"ct_hooks.html#c:post_init_per_testcase/5"},{"type":"callback","title":"ct_hooks.pre_end_per_group/4","doc":"This function is called before [`end_per_group`](`c:ct_suite:end_per_group/2`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`end_per_group`](`c:ct_suite:end_per_group/2`) instead.\n\nIf [`Module:pre_end_per_group/4`](`c:pre_end_per_group/4`) is not exported,\ncommon_test will attempt to call\n`Module:pre_end_per_group(GroupName, EndData, CTHState)` instead. This is for\nbackwards compatibility.","ref":"ct_hooks.html#c:pre_end_per_group/4"},{"type":"callback","title":"ct_hooks.pre_end_per_suite/3","doc":"This function is called before [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`end_per_suite`](`c:ct_suite:end_per_suite/1`) instead.","ref":"ct_hooks.html#c:pre_end_per_suite/3"},{"type":"callback","title":"ct_hooks.pre_end_per_testcase/4","doc":"This function is called before\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) if it exists. It behaves\nthe same way as [`pre_end_per_suite`](`c:pre_end_per_suite/3`), but for function\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) instead.\n\nThis function cannot change the result of the test case by returning skip or\nfail tuples, but it may insert items in `Config` that can be read in\n`end_per_testcase/2` or in\n[`post_end_per_testcase/5`](`c:post_end_per_testcase/5`).\n\nIf [`Module:pre_end_per_testcase/4`](`c:pre_end_per_testcase/4`) is not\nexported, common_test will attempt to call\n`Module:pre_end_per_testcase(TestcaseName, EndData, CTHState)` instead. This is\nfor backwards compatibility.","ref":"ct_hooks.html#c:pre_end_per_testcase/4"},{"type":"callback","title":"ct_hooks.pre_init_per_group/4","doc":"This function is called before [`init_per_group`](`c:ct_suite:init_per_group/2`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`init_per_group`](`c:ct_suite:init_per_group/2`) instead.\n\nIf [`Module:pre_init_per_group/4`](`c:pre_init_per_group/4`) is not exported,\ncommon_test will attempt to call\n`Module:pre_init_per_group(GroupName, InitData, CTHState)` instead. This is for\nbackwards compatibility.","ref":"ct_hooks.html#c:pre_init_per_group/4"},{"type":"callback","title":"ct_hooks.pre_init_per_suite/3","doc":"This function is called before [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\nif it exists. It typically contains initialization/logging that must be done\nbefore `init_per_suite` is called. If `{skip,Reason}` or `{fail,Reason}` is\nreturned, `init_per_suite` and all test cases of the suite are skipped and\n`Reason` printed in the overview log of the suite.\n\n`SuiteName` is the name of the suite to be run.\n\n`InitData` is the original configuration list of the test suite, or a\n`SkipOrFail` tuple if a previous CTH has returned this.\n\n`CTHState` is the current internal state of the CTH.\n\n`Return` is the result of the `init_per_suite` function. If it is\n`{skip,Reason}` or `{fail,Reason}`,\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`) is never called, instead the\ninitiation is considered to be skipped or failed, respectively. If a `NewConfig`\nlist is returned, [`init_per_suite`](`c:ct_suite:init_per_suite/1`) is called\nwith that `NewConfig` list. For more details, see section\n[Pre Hooks](ct_hooks_chapter.md#pre) in the User's Guide.\n\nThis function is called only if the CTH is added before `init_per_suite is run`.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.","ref":"ct_hooks.html#c:pre_init_per_suite/3"},{"type":"callback","title":"ct_hooks.pre_init_per_testcase/4","doc":"This function is called before\n[`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) if it exists. It behaves\nthe same way as [`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for\nfunction [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) instead.\n\nIf [`Module:pre_init_per_testcase/4`](`c:pre_init_per_testcase/4`) is not\nexported, common_test will attempt to call\n`Module:pre_init_per_testcase(TestcaseName, InitData, CTHState)` instead. This\nis for backwards compatibility.\n\nCTHs cannot be added here right now. That feature may be added in a later\nrelease, but it would right now break backwards compatibility.","ref":"ct_hooks.html#c:pre_init_per_testcase/4"},{"type":"callback","title":"ct_hooks.terminate/1","doc":"This function is called at the end of a CTH [scope](ct_hooks_chapter.md#scope).\nThe returned term is ignored.","ref":"ct_hooks.html#c:terminate/1"},{"type":"module","title":"ct_master","doc":"Distributed test execution control for `Common Test`.\n\nThis module exports functions for running `Common Test` nodes on multiple hosts\nin parallel.","ref":"ct_master.html"},{"type":"function","title":"ct_master.abort/0","doc":"Stops all running tests.","ref":"ct_master.html#abort/0"},{"type":"function","title":"ct_master.abort/1","doc":"Stops tests on specified nodes.","ref":"ct_master.html#abort/1"},{"type":"function","title":"ct_master.basic_html/1","doc":"If set to `true`, the `ct_master logs` are written on a primitive HTML format,\nnot using the `Common Test` CSS style sheet.","ref":"ct_master.html#basic_html/1"},{"type":"function","title":"ct_master.get_event_mgr_ref/0","doc":"Gets a reference to the `Common Test` master event manager. The reference can be\nused to, for example, add a user-specific event handler while tests are running.\n\n_Example:_\n\n```erlang\ngen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])\n```","ref":"ct_master.html#get_event_mgr_ref/0"},{"type":"function","title":"ct_master.progress/0","doc":"Returns test progress. If `Status` is `ongoing`, tests are running on the node\nand are not yet finished.","ref":"ct_master.html#progress/0"},{"type":"function","title":"ct_master.run/1","doc":"Run tests on spawned nodes as specified in `TestSpecs` (see `run/4`).\n\nEquivalent to [`run(TestSpecs, false, [], [])`](`run/4`) if\ncalled with TestSpecs being list of strings;\n\nEquivalent to [`run([TS], false, [], [])`](`run/4`) if\ncalled with TS being string.","ref":"ct_master.html#run/1"},{"type":"function","title":"ct_master.run/3","doc":"","ref":"ct_master.html#run/3"},{"type":"function","title":"ct_master.run/4","doc":"Tests are spawned on the nodes as specified in `TestSpecs`. Each specification\nin `TestSpec` is handled separately. However, it is also possible to specify a\nlist of specifications to be merged into one specification before the tests are\nexecuted. Any test without a particular node specification is also executed on\nthe nodes in `InclNodes`. Nodes in the `ExclNodes` list are excluded from the\ntest.","ref":"ct_master.html#run/4"},{"type":"function","title":"ct_master.run_on_node/2","doc":"","ref":"ct_master.html#run_on_node/2"},{"type":"function","title":"ct_master.run_on_node/3","doc":"Tests are spawned on `Node` according to `TestSpecs`.","ref":"ct_master.html#run_on_node/3"},{"type":"function","title":"ct_master.run_test/2","doc":"Tests are spawned on `Node` using `ct:run_test/1`","ref":"ct_master.html#run_test/2"},{"type":"type","title":"ct_master.test_spec/0","doc":"Filename of test spec to be executed.","ref":"ct_master.html#t:test_spec/0"},{"type":"module","title":"ct_netconfc","doc":"NETCONF client module.\n\nNETCONF client module compliant with RFC 6241, NETCONF Configuration Protocol,\nand RFC 6242, Using the NETCONF Configuration Protocol over Secure SHell (SSH),\nand with support for RFC 5277, NETCONF Event Notifications.\n\n[](){: #Connecting }\n\n_Connecting to a NETCONF server_\n\nCall [`connect/1,2`](`connect/1`) to establish a connection to a server, then\npass the returned handle to [`session/1-3`](`session/1`) to establish a NETCONF\nsession on a new SSH channel. Each call to [`session/1-3`](`session/1`)\nestablishes a new session on the same connection, and results in a hello message\nto the server.\n\nAlternately, [`open/1,2`](`open/1`) can be used to establish a single session on\na dedicated connection. (Or, equivalently, [`only_open/1,2`](`only_open/1`)\nfollowed by [`hello/1-3`](`hello/1`).)\n\nConnect/session options can be specified in a configuration file with entries\nlike the following.\n\n```erlang\n{server_id(), [option()]}.\n```\n\nThe `t:server_id/0` or an associated `t:ct:target_name/0` can then be passed to\nthe aforementioned functions to use the referenced configuration.\n\n[](){: #Signaling }\n\n_Signaling_\n\nProtocol operations in the NETCONF protocol are realized as remote procedure\ncalls (RPCs) from client to server and a corresponding reply from server to\nclient. RPCs are sent using like-named functions (eg.\n[`edit_config/3-5`](`edit_config/3`) to send an edit-config RPC), with the\nserver reply as return value. There are functions for each RPC defined in RFC\n6241 and the create-subscription RPC from RFC 5277, all of which are wrappers on\n[`send_rpc/2,3`](`send_rpc/2`), that can be used to send an arbitrary RPC not\ndefined in RFC 6241 or RFC 5277.\n\nAll of the signaling functions have one variant with a `Timeout` argument and\none without, corresponding to an infinite timeout. The latter is inappropriate\nin most cases since a non-response by the server or a missing message-id causes\nthe call to hang indefinitely.\n\n[](){: #Logging }\n\n_Logging_\n\nThe NETCONF server uses `error_logger` for logging of NETCONF traffic. A special\npurpose error handler is implemented in `ct_conn_log_h`. To use this error\nhandler, add the `cth_conn_log` hook in the test suite, for example:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].\n```\n\n`conn_log_mod()` is the name of the `Common Test` module implementing the\nconnection protocol, for example, `ct_netconfc`.\n\nHook option `log_type` specifies the type of logging:\n\n- **`raw`** - The sent and received NETCONF data is logged to a separate text\n file \"as is\" without any formatting. A link to the file is added to the test\n case HTML log.\n\n- **`pretty`** - The sent and received NETCONF data is logged to a separate text\n file with XML data nicely indented. A link to the file is added to the test\n case HTML log.\n\n- **`html (default)`** - The sent and received NETCONF traffic is pretty printed\n directly in the test case HTML log.\n\n- **`silent`** - NETCONF traffic is not logged.\n\nBy default, all NETCONF traffic is logged in one single log file. However,\ndifferent connections can be logged in separate files. To do this, use hook\noption `hosts` and list the names of the servers/connections to be used in the\nsuite. The connections must be named for this to work, that is, they must be\nopened with `open/2`.\n\nOption `hosts` has no effect if `log_type` is set to `html` or `silent`.\n\nThe hook options can also be specified in a configuration file with\nconfiguration variable `ct_conn_log`:\n\n```erlang\n{ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.\n```\n\nFor example:\n\n```erlang\n{ct_conn_log,[{ct_netconfc,[{log_type,pretty},\n {hosts,[ct:key_or_name()]}]}]}\n```\n\n> #### Note {: .info }\n>\n> Hook options specified in a configuration file overwrite the hard-coded hook\n> options in the test suite.\n\n_Logging Example 1:_\n\n[](){: #Logging_example_1 }\n\nThe following `ct_hooks` statement causes pretty printing of NETCONF traffic to\nseparate logs for the connections named `nc_server1` and `nc_server2`. Any other\nconnections are logged to default NETCONF log.\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},\n {hosts,[nc_server1,nc_server2]}]}\n ]}]}].\n```\n\nConnections must be opened as follows:\n\n```erlang\nopen(nc_server1,[...]),\nopen(nc_server2,[...]).\n```\n\n_Logging Example 2:_\n\n[](){: #Logging_example_2 }\n\nThe following configuration file causes raw logging of all NETCONF traffic in to\none single text file:\n\n```erlang\n{ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.\n```\n\nThe `ct_hooks` statement must look as follows:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, []}]}].\n```\n\nThe same `ct_hooks` statement without the configuration file would cause HTML\nlogging of all NETCONF connections in to the test case HTML log.","ref":"ct_netconfc.html"},{"type":"function","title":"ct_netconfc.action/2","doc":"","ref":"ct_netconfc.html#action/2"},{"type":"function","title":"ct_netconfc.action/3","doc":"Executes an action. If the return type is void, `ok` is returned instead of\n`{ok,[simple_xml()]}`.","ref":"ct_netconfc.html#action/3"},{"type":"function","title":"ct_netconfc.close_session/1","doc":"","ref":"ct_netconfc.html#close_session/1"},{"type":"function","title":"ct_netconfc.close_session/2","doc":"Requests graceful termination of the session associated with the client.\n\nWhen a NETCONF server receives a `close-session` request, it gracefully closes\nthe session. The server releases any locks and resources associated with the\nsession and gracefully closes any associated connections. Any NETCONF requests\nreceived after a `close-session` request are ignored.","ref":"ct_netconfc.html#close_session/2"},{"type":"function","title":"ct_netconfc.connect/1","doc":"Opens an SSH connection to a NETCONF server.\n\nIf the server options are specified in a configuration file, use `connect/2`\ninstead.\n\nThe opaque `t:handle/0` reference returned from this function is required as\nconnection identifier when opening sessions over this connection, see\n[`session/1-3`](`session/1`).","ref":"ct_netconfc.html#connect/1"},{"type":"function","title":"ct_netconfc.connect/2","doc":"Open an SSH connection to a named NETCONF server.\n\nIf `KeyOrName` is a configured `t:server_id/0` or a `target_name()` associated\nwith such an Id, then the options for this server are fetched from the\nconfiguration file.\n\nThe options list is added to those of the configuration file. If an option is\nspecified in both lists, the configuration file takes precedence.\n\nIf the server is not specified in a configuration file, use `connect/1` instead.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nconnection identifier when opening sessions over this connection, see\n[`session/1-3`](`session/1`). However, if `KeyOrName` is a `target_name()`, that\nis, if the server is named through a call to `ct:require/2` or a `require`\nstatement in the test suite, then this name can be used instead of `t:handle/0`.","ref":"ct_netconfc.html#connect/2"},{"type":"function","title":"ct_netconfc.copy_config/3","doc":"","ref":"ct_netconfc.html#copy_config/3"},{"type":"function","title":"ct_netconfc.copy_config/4","doc":"Copies configuration data.\n\nWhich source and target options that can be issued depends on the capabilities\nsupported by the server. That is, `:candidate` and/or `:startup` are required.","ref":"ct_netconfc.html#copy_config/4"},{"type":"function","title":"ct_netconfc.create_subscription/2","doc":"","ref":"ct_netconfc.html#create_subscription/2"},{"type":"function","title":"ct_netconfc.create_subscription/3","doc":"Creates a subscription for event notifications by sending an RFC 5277\ncreate-subscription RPC to the server. The calling process receives events as\nmessages of type `t:notification/0`.\n\nFrom RFC 5722, 2.1 Subscribing to Receive Event Notifications:\n\n- **`Stream`** - Indicates which stream of event is of interest. If not present,\n events in the default NETCONF stream are sent.\n\n- **`Filter`** - Indicates which subset of all possible events is of interest.\n The parameter format is the same as that of the filter parameter in the\n NETCONF protocol operations. If not present, all events not precluded by other\n parameters are sent.\n\n- **`StartTime`** - Used to trigger the replay feature and indicate that the\n replay is to start at the time specified. If `StartTime` is not present, this\n is not a replay subscription. It is not valid to specify start times that are\n later than the current time. If `StartTime` is specified earlier than the log\n can support, the replay begins with the earliest available notification. This\n parameter is of type `dateTime` and compliant to RFC 3339. Implementations\n must support time zones.\n\n- **`StopTime`** - Used with the optional replay feature to indicate the newest\n notifications of interest. If `StopTime` is not present, the notifications\n continues until the subscription is terminated. Must be used with and be later\n than `StartTime`. Values of `StopTime` in the future are valid. This parameter\n is of type `dateTime` and compliant to RFC 3339. Implementations must support\n time zones.\n\nSee RFC 5277 for more details. The requirement that `StopTime` must only be used\nwith `StartTime` is not enforced, to allow an invalid request to be sent to the\nserver.\n\nPrior to OTP 22.1, this function was documented as having 15 variants in 6\narities. These are still exported for backwards compatibility, but no longer\ndocumented. The map-based variants documented above provide the same\nfunctionality with simpler arguments.\n\n> #### Note {: .info }\n>\n> create-subscription is no longer the only RPC with which NETCONF notifications\n> can be ordered: RFC 8639 adds establish-subscription and future RFCs may add\n> other methods. Specify a `receiver` option at session creation to provide a\n> destination for incoming notifications independently of a call to\n> [`create_subscription/2,3`](`create_subscription/2`), and use\n> [`send_rpc/2,3`](`send_rpc/2`) to send establish-subscription and other\n> arbitrary RPCs.","ref":"ct_netconfc.html#create_subscription/3"},{"type":"function","title":"ct_netconfc.delete_config/2","doc":"","ref":"ct_netconfc.html#delete_config/2"},{"type":"function","title":"ct_netconfc.delete_config/3","doc":"Deletes configuration data.\n\nThe running configuration cannot be deleted and `:candidate` or `:startup` must\nbe advertised by the server.","ref":"ct_netconfc.html#delete_config/3"},{"type":"function","title":"ct_netconfc.disconnect/1","doc":"Closes the given SSH connection.\n\nIf there are open NETCONF sessions on the connection, these will be brutally\naborted. To avoid this, close each session with\n[`close_session/1,2`](`close_session/1`)","ref":"ct_netconfc.html#disconnect/1"},{"type":"function","title":"ct_netconfc.edit_config/3","doc":"","ref":"ct_netconfc.html#edit_config/3"},{"type":"function","title":"ct_netconfc.edit_config/4","doc":"","ref":"ct_netconfc.html#edit_config/4"},{"type":"function","title":"ct_netconfc.edit_config/5","doc":"Edits configuration data.\n\nBy default only the running target is available, unless the server includes\n`:candidate` or `:startup` in its list of capabilities.\n\n`OptParams` can be used for specifying optional parameters (`default-operation`,\n`test-option`, or `error-option`) to be added to the `edit-config` request. The\nvalue must be a list containing valid simple XML, for example:\n\n```erlang\n[{'default-operation', [\"none\"]},\n {'error-option', [\"rollback-on-error\"]}]\n```\n\nIf `OptParams` is not given, the default value `[]` is used.","ref":"ct_netconfc.html#edit_config/5"},{"type":"function","title":"ct_netconfc.get/2","doc":"","ref":"ct_netconfc.html#get/2"},{"type":"function","title":"ct_netconfc.get/3","doc":"Gets data.\n\nThis operation returns both configuration and state data from the server.\n\nFilter type `xpath` can be used only if the server supports `:xpath`.","ref":"ct_netconfc.html#get/3"},{"type":"function","title":"ct_netconfc.get_capabilities/1","doc":"","ref":"ct_netconfc.html#get_capabilities/1"},{"type":"function","title":"ct_netconfc.get_capabilities/2","doc":"Returns the server capabilities as received in its hello message.","ref":"ct_netconfc.html#get_capabilities/2"},{"type":"function","title":"ct_netconfc.get_config/3","doc":"","ref":"ct_netconfc.html#get_config/3"},{"type":"function","title":"ct_netconfc.get_config/4","doc":"Gets configuration data.\n\nTo be able to access another source than `running`, the server must advertise\n`:candidate` and/or `:startup`.\n\nFilter type `xpath` can be used only if the server supports `:xpath`.","ref":"ct_netconfc.html#get_config/4"},{"type":"function","title":"ct_netconfc.get_event_streams/1","doc":"","ref":"ct_netconfc.html#get_event_streams/1"},{"type":"function","title":"ct_netconfc.get_event_streams/2","doc":"","ref":"ct_netconfc.html#get_event_streams/2"},{"type":"function","title":"ct_netconfc.get_event_streams/3","doc":"Sends a request to get the specified event streams.\n\n`Streams` is a list of stream names. The following filter is sent to the NETCONF\nserver in a `get` request:\n\n```text\n \n \n \n StreamName1 \n \n \n StreamName2 \n \n ...\n \n \n```\n\nIf `Streams` is an empty list, _all_ streams are requested by sending the\nfollowing filter:\n\n```text\n \n \n \n```\n\nIf more complex filtering is needed, use [`ct_netconfc:get/2,3`](`get/2`) and\nspecify the exact filter according to \"XML Schema for Event Notifications\" in\nRFC 5277.","ref":"ct_netconfc.html#get_event_streams/3"},{"type":"function","title":"ct_netconfc.get_session_id/1","doc":"","ref":"ct_netconfc.html#get_session_id/1"},{"type":"function","title":"ct_netconfc.get_session_id/2","doc":"Returns the session Id associated with the specified client.","ref":"ct_netconfc.html#get_session_id/2"},{"type":"function","title":"ct_netconfc.hello/1","doc":"","ref":"ct_netconfc.html#hello/1"},{"type":"function","title":"ct_netconfc.hello/2","doc":"","ref":"ct_netconfc.html#hello/2"},{"type":"function","title":"ct_netconfc.hello/3","doc":"Exchanges `hello` messages with the server. Returns when the server hello has\nbeen received or after the specified timeout.\n\nNote that capabilities for an outgoing hello can be passed directly to `open/2`.","ref":"ct_netconfc.html#hello/3"},{"type":"function","title":"ct_netconfc.kill_session/2","doc":"","ref":"ct_netconfc.html#kill_session/2"},{"type":"function","title":"ct_netconfc.kill_session/3","doc":"Forces termination of the session associated with the supplied session Id.\n\nThe server side must abort any ongoing operations, release any locks and\nresources associated with the session, and close any associated connections.\n\nOnly if the server is in the confirmed commit phase, the configuration is\nrestored to its state before entering the confirmed commit phase. Otherwise, no\nconfiguration rollback is performed.\n\nIf the specified `SessionId` is equal to the current session Id, an error is\nreturned.","ref":"ct_netconfc.html#kill_session/3"},{"type":"function","title":"ct_netconfc.lock/2","doc":"","ref":"ct_netconfc.html#lock/2"},{"type":"function","title":"ct_netconfc.lock/3","doc":"Locks the configuration target.\n\nWhich target parameters that can be used depends on if `:candidate` and/or\n`:startup` are supported by the server. If successful, the configuration system\nof the device is unavailable to other clients (NETCONF, CORBA, SNMP, and so on).\nLocks are intended to be short-lived.\n\nOperation [`kill_session/2,3`](`kill_session/2`) can be used to force the\nrelease of a lock owned by another NETCONF session. How this is achieved by the\nserver side is implementation-specific.","ref":"ct_netconfc.html#lock/3"},{"type":"function","title":"ct_netconfc.only_open/1","doc":"Opens a NETCONF session, but does not send `hello`.\n\nAs `open/1`, but does not send a `hello` message.","ref":"ct_netconfc.html#only_open/1"},{"type":"function","title":"ct_netconfc.only_open/2","doc":"Opens a named NETCONF session, but does not send `hello`.\n\nAs `open/2`, but does not send a `hello` message.","ref":"ct_netconfc.html#only_open/2"},{"type":"function","title":"ct_netconfc.open/1","doc":"Opens a NETCONF session and exchanges `hello` messages.\n\nIf the server options are specified in a configuration file, or if a named\nclient is needed for logging purposes (see section\n[Logging](`m:ct_netconfc#Logging`) in this module), use `open/2` instead.\n\nThe opaque `t:handle/0` reference returned from this function is required as\nclient identifier when calling any other function in this module.","ref":"ct_netconfc.html#open/1"},{"type":"function","title":"ct_netconfc.open/2","doc":"Opens a named NETCONF session and exchanges `hello` messages.\n\nIf `KeyOrName` is a configured `t:server_id/0` or a `target_name()` associated\nwith such an Id, then the options for this server are fetched from the\nconfiguration file.\n\nThe options list is added to those of the configuration file. If an option is\nspecified in both lists, the configuration file take precedence.\n\nIf the server is not specified in a configuration file, use `open/1` instead.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nclient identifier when calling any other function in this module. However, if\n`KeyOrName` is a `target_name()`, that is, if the server is named through a call\nto `ct:require/2` or a `require` statement in the test suite, then this name can\nbe used instead of `t:handle/0`.\n\nSee also `ct:require/2`.","ref":"ct_netconfc.html#open/2"},{"type":"function","title":"ct_netconfc.send/2","doc":"","ref":"ct_netconfc.html#send/2"},{"type":"function","title":"ct_netconfc.send/3","doc":"Sends an XML document to the server.\n\nThe specified XML document is sent \"as is\" to the server. This function can be\nused for sending XML documents that cannot be expressed by other interface\nfunctions in this module.","ref":"ct_netconfc.html#send/3"},{"type":"function","title":"ct_netconfc.send_rpc/2","doc":"","ref":"ct_netconfc.html#send_rpc/2"},{"type":"function","title":"ct_netconfc.send_rpc/3","doc":"Sends a NETCONF `rpc` request to the server.\n\nThe specified XML document is wrapped in a valid NETCONF `rpc` request and sent\nto the server. The `message-id` and namespace attributes are added to element\n`rpc`.\n\nThis function can be used for sending `rpc` requests that cannot be expressed by\nother interface functions in this module.","ref":"ct_netconfc.html#send_rpc/3"},{"type":"function","title":"ct_netconfc.session/1","doc":"","ref":"ct_netconfc.html#session/1"},{"type":"function","title":"ct_netconfc.session/2","doc":"","ref":"ct_netconfc.html#session/2"},{"type":"function","title":"ct_netconfc.session/3","doc":"Opens a NETCONF session as a channel on the given SSH connection, and exchanges\nhello messages with the server.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nclient identifier when calling any other function in this module. However, if\n`KeyOrName` is used and it is a `target_name()`, that is, if the server is named\nthrough a call to `ct:require/2` or a `require` statement in the test suite,\nthen this name can be used instead of `t:handle/0`.","ref":"ct_netconfc.html#session/3"},{"type":"function","title":"ct_netconfc.unlock/2","doc":"","ref":"ct_netconfc.html#unlock/2"},{"type":"function","title":"ct_netconfc.unlock/3","doc":"Unlocks the configuration target.\n\nIf the client earlier has acquired a lock through [`lock/2,3`](`lock/2`), this\noperation releases the associated lock. To access another target than `running`,\nthe server must support `:candidate` and/or `:startup`.","ref":"ct_netconfc.html#unlock/3"},{"type":"type","title":"ct_netconfc.client/0","doc":"Handle to a NETCONF session, as required by signaling functions.","ref":"ct_netconfc.html#t:client/0"},{"type":"type","title":"ct_netconfc.error_reason/0","doc":"","ref":"ct_netconfc.html#t:error_reason/0"},{"type":"opaque","title":"ct_netconfc.handle/0","doc":"Handle to a connection to a NETCONF server as returned by\n[`connect/1,2`](`connect/1`), or to a session as returned by\n[`session/1-3`](`session/1`), [`open/1,2`](`open/1`), or\n[`only_open/1,2`](`only_open/1`).","ref":"ct_netconfc.html#t:handle/0"},{"type":"type","title":"ct_netconfc.host/0","doc":"","ref":"ct_netconfc.html#t:host/0"},{"type":"type","title":"ct_netconfc.netconf_db/0","doc":"","ref":"ct_netconfc.html#t:netconf_db/0"},{"type":"type","title":"ct_netconfc.notification/0","doc":"Event notification messages sent as a result of calls to\n[`create_subscription/2,3`](`create_subscription/2`).","ref":"ct_netconfc.html#t:notification/0"},{"type":"type","title":"ct_netconfc.option/0","doc":"Options `host` and `port` specify the server endpoint to which to connect, and\nare passed directly to [`ssh:connect/4`](`ssh:connect/3`), as are arbitrary ssh\noptions. Common options are `user`, `password` and `user_dir`.\n\nOption `timeout` specifies the number of milliseconds to allow for connection\nestablishment and, if the function in question results in an outgoing hello\nmessage, reception of the server hello. The timeout applies to connection and\nhello independently; one timeout for connection establishment, another for hello\nreception.\n\nOption `receiver` specifies a destination for incoming notification messages; a\nleft operand of the send operator (`!`). If not specified then a process calling\n[`create_subscription/2,3`](`create_subscription/2`) becomes the receiver, but\nexplicitly setting a receiver makes it possible to receive notifications that\nare not ordered by calling this function. Multiple receiver options can be\nspecified.\n\nReceiver options are ignored by connect/1-3.\n\nOption `capability` specifies the content of a corresponding element in an\noutgoing hello message, each option specifying the content of a single element.\nIf no base NETCONF capability is configured then the RFC 4741 1.0 capability,\n\"urn:ietf:params:netconf:base:1.0\", is added, otherwise not. In particular, the\nRFC 6241 1.1 capability must be explicitly configured. NETCONF capabilities can\nbe specified using the shorthand notation defined in RFC 6241, any capability\nstring starting with a colon being prefixed by either \"urn:ietf:params:netconf\"\nor \"urn:ietf:params:netconf:capability\", as appropriate.\n\nCapability options are ignored by connect/1-3 and only_open/1-2, which don't\nresult in an outgoing hello message.","ref":"ct_netconfc.html#t:option/0"},{"type":"type","title":"ct_netconfc.server_id/0","doc":"Identity of connection or session configuration in a configuration file.","ref":"ct_netconfc.html#t:server_id/0"},{"type":"type","title":"ct_netconfc.session_option/0","doc":"","ref":"ct_netconfc.html#t:session_option/0"},{"type":"type","title":"ct_netconfc.simple_xml/0","doc":"Representation of XML, as described in application\n[`xmerl`](`e:xmerl:index.html`).","ref":"ct_netconfc.html#t:simple_xml/0"},{"type":"type","title":"ct_netconfc.stream_data/0","doc":"","ref":"ct_netconfc.html#t:stream_data/0"},{"type":"type","title":"ct_netconfc.stream_name/0","doc":"","ref":"ct_netconfc.html#t:stream_name/0"},{"type":"type","title":"ct_netconfc.streams/0","doc":"Stream information as returned by\n[`get_event_streams/1-3`](`get_event_streams/1`). See RFC 5277, \"XML Schema for\nEvent Notifications\", for detail on the format of the string values.","ref":"ct_netconfc.html#t:streams/0"},{"type":"type","title":"ct_netconfc.xml_attribute_tag/0","doc":"","ref":"ct_netconfc.html#t:xml_attribute_tag/0"},{"type":"type","title":"ct_netconfc.xml_attribute_value/0","doc":"","ref":"ct_netconfc.html#t:xml_attribute_value/0"},{"type":"type","title":"ct_netconfc.xml_attributes/0","doc":"","ref":"ct_netconfc.html#t:xml_attributes/0"},{"type":"type","title":"ct_netconfc.xml_content/0","doc":"","ref":"ct_netconfc.html#t:xml_content/0"},{"type":"type","title":"ct_netconfc.xml_tag/0","doc":"","ref":"ct_netconfc.html#t:xml_tag/0"},{"type":"type","title":"ct_netconfc.xpath/0","doc":"","ref":"ct_netconfc.html#t:xpath/0"},{"type":"type","title":"ct_netconfc.xs_datetime/0","doc":"Date and time of a startTime/stopTime element in an RFC 5277 create-subscription\nrequest. Of XML primitive type `dateTime`, which has the (informal) form\n\n```text\n[-]YYYY-MM-DDThh:mm:ss[.s][Z|(+|-)hh:mm]\n```\n\nwhere `T` and `Z` are literal and `.s` is one or more fractional seconds.","ref":"ct_netconfc.html#t:xs_datetime/0"},{"type":"module","title":"ct_property_test","doc":"Support in Common Test for running property-based tests.\n\nThis module helps running property-based tests in the `Common Test` framework.\nOne (or more) of the property testing tools\n\n- [QuickCheck](http://www.quviq.com),\n- [PropEr](https://proper-testing.github.io) or\n- [Triq](https://github.com/krestenkrab/triq)\n\nis assumed to be installed.\n\nThe idea with this module is to have a `Common Test` test suite calling a\nproperty testing tool with special property test suites as defined by that tool.\nThe tests are collected in the `test` directory of the application. The `test`\ndirectory has a subdirectory `property_test`, where everything needed for the\nproperty tests are collected. The usual Erlang application directory structure\nis assumed.\n\nA typical `Common Test` test suite using `ct_property_test` is organized as\nfollows:\n\n```erlang\n-module(my_prop_test_SUITE).\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\nall() -> [prop_ftp_case].\n\ninit_per_suite(Config) ->\n ct_property_test:init_per_suite(Config).\n\n%%%---- test case\nprop_ftp_case(Config) ->\n ct_property_test:quickcheck(\n ftp_simple_client_server:prop_ftp(),\n Config\n ).\n```\n\nand the the property test module (in this example\n`ftp_simple_client_server.erl`) as almost a usual property testing module (More\nexamples are in [the User's Guide](ct_property_test_chapter.md)):\n\n```erlang\n-module(ftp_simple_client_server).\n-export([prop_ftp/0...]).\n\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n\nprop_ftp() ->\n ?FORALL( ....\n```","ref":"ct_property_test.html"},{"type":"function","title":"ct_property_test.cmnd_names/1","doc":"Returns a list of commands (function calls) generated in the `Cmnd` sequence,\nwithout Module, Arguments and other details.\n\nFor more information see: `present_result/5`.","ref":"ct_property_test.html#cmnd_names/1"},{"type":"function","title":"ct_property_test.init_per_suite/1","doc":"Initializes and extends `Config` for property based testing.\n\nThis function investigates if support is available for either\n[QuickCheck](http://www.quviq.com), [PropEr](https://proper-testing.github.io)\nor [Triq](https://github.com/krestenkrab/triq) and compiles the properties with\nthe first tool found. It is supposed to be called in the\n[`init_per_suite/1`](`init_per_suite/1`) function in a CommonTest test suite.\n\nWhich tools to check for, and in which order could be set with the option\n`{prop_tools, list(eqc|proper|triq)}` in the CommonTest configuration `Config`.\nThe default value is `[eqc, proper, triq]` with `eqc` being the first one\nsearched for.\n\nIf no support is found for any tool, this function returns\n`{skip, Explanation}`.\n\nIn case of other errors, this function returns\n`{fail, Explanation}`.\n\nIf support is found, the option `{property_test_tool,ToolModule}` with the\nselected tool main module name (`eqc`, `proper` or `triq`) is added to the list\n`Config` which then is returned.\n\nThe property tests are assumed to be in a subdirectory named `property_test`.\nAll found Erlang files in that directory are compiled with one of the macros\n`'EQC'`, `'PROPER'` or `'TRIQ'` set, depending on which tool that is first\nfound. This could make parts of the Erlang property tests code to be included or\nexcluded with the macro directives `-ifdef(Macro).` or `-ifndef(Macro).`.\n\nThe file(s) in the `property_test` subdirectory could, or should, include the\nct_property_test include file:\n\n```erlang\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n```\n\nThis included file will:\n\n- Include the correct tool's include file\n- Set the macro `'MOD_eqc'` to the correct module name for the selected tool.\n That is, the macro `'MOD_eqc'` is set to either `eqc`, `proper` or `triq`.","ref":"ct_property_test.html#init_per_suite/1"},{"type":"function","title":"ct_property_test.num_calls/1","doc":"Returns number of command calls in a test case.\n\nFor more information see: `present_result/5`.","ref":"ct_property_test.html#num_calls/1"},{"type":"function","title":"ct_property_test.present_result/4","doc":"","ref":"ct_property_test.html#present_result/4"},{"type":"function","title":"ct_property_test.present_result/5","doc":"Presents the result of _stateful (statem) property testing_ using the aggregate\nfunction in PropEr, QuickCheck or other similar property testing tool.\n\nIt is assumed to be called inside the property called by `quickcheck/2`:\n\n```erlang\n...\nRunResult = run_parallel_commands(?MODULE, Cmds),\nct_property_test:present_result(?MODULE, Cmds, RunResult, Config)\n...\n```\n\nSee the [User's Guide](ct_property_test_chapter.md#stateful1) for an example of\nthe usage and of the default printout.\n\nThe `StatisticsSpec` is a list of the tuples:\n\n- `{Title::string(), CollectFun::fun/1}`\n- `{Title::string(), FrequencyFun::/0, CollectFun::fun/1}`\n\nEach tuple will produce one table in the order of their places in the list.\n\n- `Title` will be the title of one result table\n- `CollectFun` is called with one argument: the `Cmds`. It should return a list\n of the values to be counted. The following pre-defined functions exist:\n - `ct_property_test:cmnd_names/1` returns a list of commands (function calls)\n generated in the `Cmnd` sequence, without Module, Arguments and other\n details.\n - `ct_property_test:num_calls/1` returns a list of the length of commands\n lists\n - `ct_property_test:sequential_parallel/1` returns a list with information\n about sequential and parallel parts from `Tool:parallel_commands/1,2`\n- `FrequencyFun/0` returns a fun/1 which is supposed to take a list of items as\n input, and return an iolist which will be printed as the table. Per default,\n the number of each item is counted and the percentage is printed for each. The\n list \\[a,b,a,a,c] could for example return\n\n ```erlang\n [\"a 60%\\n\",\"b 20%\\n\",\"c 20%\\n\"]\n ```\n\n which will be printed by the `print_fun`. The default `print_fun` will print\n it as:\n\n ```text\n a 60%\n b 20%\n c 20%\n ```\n\nThe default `StatisticsSpec` is:\n\n- For sequential commands:\n\n ```erlang\n [{\"Function calls\", fun cmnd_names/1},\n {\"Length of command sequences\", fun print_frequency_ranges/0,\n fun num_calls/1}]\n ```\n\n- For parallel commands:\n\n ```erlang\n [{\"Distribution sequential/parallel\", fun sequential_parallel/1},\n {\"Function calls\", fun cmnd_names/1},\n {\"Length of command sequences\", fun print_frequency_ranges/0,\n fun num_calls/1}]\n ```","ref":"ct_property_test.html#present_result/5"},{"type":"function","title":"ct_property_test.quickcheck/2","doc":"Calls the selected tool's function for running the `Property`. It is usually and\nby historical reasons called quickcheck, and that is why that name is used in\nthis module (`ct_property_test`).\n\nThe result is returned in a form suitable for `Common Test` test suites.\n\nThis function is intended to be called in test cases in test suites.","ref":"ct_property_test.html#quickcheck/2"},{"type":"function","title":"ct_property_test.sequential_parallel/1","doc":"Returns a list with information about sequential and parallel parts.\n\nFor more information see: `present_result/5`.","ref":"ct_property_test.html#sequential_parallel/1"},{"type":"type","title":"ct_property_test.arguments/0","doc":"","ref":"ct_property_test.html#t:arguments/0"},{"type":"type","title":"ct_property_test.command/0","doc":"","ref":"ct_property_test.html#t:command/0"},{"type":"type","title":"ct_property_test.command_list/0","doc":"","ref":"ct_property_test.html#t:command_list/0"},{"type":"type","title":"ct_property_test.dynamic_state/0","doc":"","ref":"ct_property_test.html#t:dynamic_state/0"},{"type":"type","title":"ct_property_test.function_name/0","doc":"","ref":"ct_property_test.html#t:function_name/0"},{"type":"type","title":"ct_property_test.history/0","doc":"","ref":"ct_property_test.html#t:history/0"},{"type":"type","title":"ct_property_test.init_command/0","doc":"","ref":"ct_property_test.html#t:init_command/0"},{"type":"type","title":"ct_property_test.parallel_testcase/0","doc":"","ref":"ct_property_test.html#t:parallel_testcase/0"},{"type":"type","title":"ct_property_test.set_command/0","doc":"","ref":"ct_property_test.html#t:set_command/0"},{"type":"type","title":"ct_property_test.statem_result/0","doc":"","ref":"ct_property_test.html#t:statem_result/0"},{"type":"type","title":"ct_property_test.symbolic_call/0","doc":"","ref":"ct_property_test.html#t:symbolic_call/0"},{"type":"type","title":"ct_property_test.symbolic_state/0","doc":"","ref":"ct_property_test.html#t:symbolic_state/0"},{"type":"type","title":"ct_property_test.symbolic_var/0","doc":"","ref":"ct_property_test.html#t:symbolic_var/0"},{"type":"module","title":"ct_rpc","doc":"`Common Test` specific layer on Erlang/OTP `rpc`.","ref":"ct_rpc.html"},{"type":"function","title":"ct_rpc.app_node/2","doc":"From a set of candidate nodes determines which of them is running the\napplication `App`. If none of the candidate nodes is running `App`, the function\nmakes the test case calling this function to fail. This function is the same as\ncalling [`app_node(App, Candidates, true)`](`app_node/3`).","ref":"ct_rpc.html#app_node/2"},{"type":"function","title":"ct_rpc.app_node/3","doc":"Same as [`ct_rpc:app_node/2`](`app_node/2`), except that argument `FailOnBadRPC`\ndetermines if the search for a candidate node is to stop if `badrpc` is received\nat some point.","ref":"ct_rpc.html#app_node/3"},{"type":"function","title":"ct_rpc.app_node/4","doc":"Same as [`ct_rpc:app_node/2`](`app_node/2`), except that argument `FailOnBadRPC`\ndetermines if the search for a candidate node is to stop if `badrpc` is received\nat some point.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","ref":"ct_rpc.html#app_node/4"},{"type":"function","title":"ct_rpc.call/4","doc":"","ref":"ct_rpc.html#call/4"},{"type":"function","title":"ct_rpc.call/5","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`.\nReturns either whatever `Function` returns, or `{badrpc, Reason}` if the remote\nprocedure call fails. If `Node` is `{Fun, FunArgs}`, applying `Fun` to `FunArgs`\nis to return a node name.","ref":"ct_rpc.html#call/5"},{"type":"function","title":"ct_rpc.call/6","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`.\nReturns either whatever `Function` returns, or `{badrpc, Reason}` if the remote\nprocedure call fails. If `Node` is `{Fun, FunArgs}`, applying `Fun` to `FunArgs`\nis to return a node name.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","ref":"ct_rpc.html#call/6"},{"type":"function","title":"ct_rpc.cast/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`. No\nresponse is delivered and the process that makes the call is not suspended until\nthe evaluation is completed as in the case of `call/3,4`. If `Node` is\n`{Fun, FunArgs}`, applying `Fun` to `FunArgs` is to return a node name.","ref":"ct_rpc.html#cast/4"},{"type":"function","title":"ct_rpc.cast/5","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`. No\nresponse is delivered and the process that makes the call is not suspended until\nthe evaluation is completed as in the case of `call/3,4`. If `Node` is\n`{Fun, FunArgs}`, applying `Fun` to `FunArgs` is to return a node name.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","ref":"ct_rpc.html#cast/5"},{"type":"module","title":"ct_slave","doc":"`Common Test` framework functions for starting and stopping nodes for\nLarge-Scale Testing.\n\nThis module exports functions used by the `Common Test` Master to start and stop\n\"slave\" nodes. It is the default callback module for the `{init, node_start}`\nterm in the Test Specification.","ref":"ct_slave.html"},{"type":"function","title":"ct_slave.start/1","doc":"Starts an Erlang node with name `Node` on the local host.\n\nSee also [`ct_slave:start/3`](`start/3`).","ref":"ct_slave.html#start/1"},{"type":"function","title":"ct_slave.start/2","doc":"Starts an Erlang node with default options on a specified host, or on the local\nhost with specified options. That is, the call is interpreted as\n[`start(Host, Node)`](`start/2`) when the second argument is atom-valued and\n[`start(Node, Opts)`](`start/2`) when it is list-valued.\n\nSee also [`ct_slave:start/3`](`start/3`).","ref":"ct_slave.html#start/2"},{"type":"function","title":"ct_slave.start/3","doc":"Starts an Erlang node with name `Node` on host `Host` as specified by the\ncombination of options in `Opts`.\n\nOptions `Username` and `Password` are used to log on to the remote host `Host`.\n`Username`, if omitted, defaults to the current username. `Password` is empty by\ndefault.\n\nA list of functions specified in option `Startup` are executed after startup of\nthe node. Notice that all used modules are to be present in the code path on\n`Host`.\n\nThe time-outs are applied as follows:\n\n- **`BootTimeout`** - The time to start the Erlang node, in seconds. Defaults to\n 3 seconds. If the node is not pingable within this time, the result\n `{error, boot_timeout, NodeName}` is returned.\n\n- **`InitTimeout`** - The time to wait for the node until it calls the internal\n callback function informing master about a successful startup. Defaults to 1\n second. In case of a timed out message, the result\n `{error, init_timeout, NodeName}` is returned.\n\n- **`StartupTimeout`** - The time to wait until the node stops to run\n `StartupFunctions`. Defaults to 1 second. If this time-out occurs, the result\n `{error, startup_timeout, NodeName}` is returned.\n\n_Options:_\n\n- **`monitor_master`** - Specifies if the slave node is to be stopped if the\n master node stops. Defaults to `false`.\n\n- **`kill_if_fail`** - Specifies if the slave node is to be killed if a time-out\n occurs during initialization or startup. Defaults to `true`. Notice that the\n node can also be still alive it the boot time-out occurred, but it is not\n killed in this case.\n\n- **`erl_flags`** - Specifies which flags are added to the parameters of the\n executable `erl`.\n\n- **`env`** - Specifies a list of environment variables that will extend the\n environment.\n\n_Special return values:_\n\n- `{error, already_started, NodeName}` if the node with the specified name is\n already started on a specified host.\n- `{error, started_not_connected, NodeName}` if the node is started, but not\n connected to the master node.\n- `{error, not_alive, NodeName}` if the node on which\n [`ct_slave:start/3`](`start/3`) is called, is not alive. Notice that\n `NodeName` is the name of the current node in this case.","ref":"ct_slave.html#start/3"},{"type":"function","title":"ct_slave.stop/1","doc":"Stops the running Erlang node with name `Node` on the local host.","ref":"ct_slave.html#stop/1"},{"type":"function","title":"ct_slave.stop/2","doc":"Stops the running Erlang node with name `Node` on host `Host`.","ref":"ct_slave.html#stop/2"},{"type":"type","title":"ct_slave.start_options/0","doc":"Options used for starting `ct_slave` node.","ref":"ct_slave.html#t:start_options/0"},{"type":"type","title":"ct_slave.stop_options/0","doc":"Options used for stopping `ct_slave` node.","ref":"ct_slave.html#t:stop_options/0"},{"type":"module","title":"ct_snmp","doc":"`Common Test` user interface module for the `SNMP` application.\n\nThe purpose of this module is to simplify SNMP configuration for the test case\nwriter. Many test cases can use default values for common operations and then no\nSNMP configuration files need to be supplied. When it is necessary to change\nparticular configuration parameters, a subset of the relevant SNMP configuration\nfiles can be passed to `ct_snmp` by `Common Test` configuration files. For more\nspecialized configuration parameters, a simple SNMP configuration file can be\nplaced in the test suite data directory. To simplify the test suite,\n`Common Test` keeps track of some of the SNMP manager information. This way the\ntest suite does not have to handle as many input parameters as if it had to\ninterface wthe OTP SNMP manager directly.\n\n_Configurable SNMP Manager and Agent Parameters:_\n\nManager configuration:\n\n- **`[{start_manager, boolean()}`** - Optional. Default is `true`.\n\n- **`{users, [{user_name(), [call_back_module(), user_data()]}]}`** - Optional.\n\n- **`{usm_users, [{usm_user_name(), [usm_config()]}]}`** - Optional. SNMPv3\n only.\n\n- **`{managed_agents,[{agent_name(), [user_name(), agent_ip(), agent_port(), [agent_config()]]}]}`** -\n `managed_agents` is optional.\n\n- **`{max_msg_size, integer()}`** - Optional. Default is `484`.\n\n- **`{mgr_port, integer()}`** - Optional. Default is `5000`.\n\n- **`{engine _id, string()}`** - Optional. Default is `\"mgrEngine\"`.\n\nAgent configuration:\n\n- **`{start_agent, boolean()}`** - Optional. Default is `false`.\n\n- **`{agent_sysname, string()}`** - Optional. Default is `\"ct_test\"`.\n\n- **`{agent_manager_ip, manager_ip()}`** - Optional. Default is `localhost`.\n\n- **`{agent_vsns, list()}`** - Optional. Default is `[v2]`.\n\n- **`{agent_trap_udp, integer()}`** - Optional. Default is `5000`.\n\n- **`{agent_udp, integer()}`** - Optional. Default is `4000`.\n\n- **`{agent_notify_type, atom()}`** - Optional. Default is `trap`.\n\n- **`{agent_sec_type, sec_type()}`** - Optional. Default is `none`.\n\n- **`{agent_passwd, string()}`** - Optional. Default is `\"\"`.\n\n- **`{agent_engine_id, string()}`** - Optional. Default is `\"agentEngine\"`.\n\n- **`{agent_max_msg_size, string()}`** - Optional. Default is `484`.\n\nThe following parameters represents the SNMP configuration files `context.conf`,\n`standard.conf`, `community.conf`, `vacm.conf`, `usm.conf`, `notify.conf`,\n`target_addr.conf`, and `target_params.conf`. Notice that all values in\n`agent.conf` can be modified by the parameters listed above. All these\nconfiguration files have default values set by the `SNMP` application. These\nvalues can be overridden by suppling a list of valid configuration values or a\nfile located in the test suites data directory, which can produce a list of\nvalid configuration values if you apply function `file:consult/1` to the file.\n\n- **`{agent_contexts, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_community, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_sysinfo, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_vacm, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_usm, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_notify_def, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_target_address_def, [term()] | {data_dir_file, rel_path()}}`** -\n Optional.\n\n- **`{agent_target_param_def, [term()] | {data_dir_file, rel_path()}}`** -\n Optional.\n\nParameter `MgrAgentConfName` in the functions is to be a name you allocate in\nyour test suite using a `require` statement. Example (where\n`MgrAgentConfName = snmp_mgr_agent`):\n\n```erlang\nsuite() -> [{require, snmp_mgr_agent, snmp}].\n```\n\nor\n\n```erlang\nct:require(snmp_mgr_agent, snmp).\n```\n\nNotice that USM users are needed for SNMPv3 configuration and are not to be\nconfused with users.\n\nSNMP traps, inform, and report messages are handled by the user callback module.\nFor details, see the [`SNMP`](`e:snmp:index.html`) application.\n\nIt is recommended to use the `.hrl` files created by the Erlang/OTP MIB compiler\nto define the Object Identifiers (OIDs). For example, to get the Erlang node\nname from `erlNodeTable` in the OTP-MIB:\n\n```erlang\nOid = ?erlNodeEntry ++ [?erlNodeName, 1]\n```\n\nFurthermore, values can be set for `SNMP` application configuration parameters,\n`config`, `server`, `net_if`, and so on (for a list of valid parameters and\ntypes, see the [`User's Guide for the SNMP application`](`e:snmp:index.html`)).\nThis is done by defining a configuration data variable on the following form:\n\n```erlang\n{snmp_app, [{manager, [snmp_app_manager_params()]},\n {agent, [snmp_app_agent_params()]}]}.\n```\n\nA name for the data must be allocated in the suite using `require` (see the\nexample above). Pass this name as argument `SnmpAppConfName` to\n[`ct_snmp:start/3`](`start/3`). `ct_snmp` specifies default values for some\n`SNMP` application configuration parameters (such as `{verbosity,trace}` for\nparameter `config`). This set of defaults is merged with the parameters\nspecified by the user. The user values override `ct_snmp` defaults.","ref":"ct_snmp.html"},{"type":"function","title":"ct_snmp.get_next_values/3","doc":"Issues a synchronous SNMP `get next` request.","ref":"ct_snmp.html#get_next_values/3"},{"type":"function","title":"ct_snmp.get_values/3","doc":"Issues a synchronous SNMP `get` request.","ref":"ct_snmp.html#get_values/3"},{"type":"function","title":"ct_snmp.load_mibs/1","doc":"Loads the MIBs into agent `snmp_master_agent`.","ref":"ct_snmp.html#load_mibs/1"},{"type":"function","title":"ct_snmp.register_agents/2","doc":"Explicitly instructs the manager to handle this agent. Corresponds to making an\nentry in `agents.conf`.\n\nThis function tries to register the specified managed agents, without checking\nif any of them exist. To change a registered managed agent, the agent must first\nbe unregistered.","ref":"ct_snmp.html#register_agents/2"},{"type":"function","title":"ct_snmp.register_users/2","doc":"Registers the manager entity (=user) responsible for specific agent(s).\nCorresponds to making an entry in `users.conf`.\n\nThis function tries to register the specified users, without checking if any of\nthem exist. To change a registered user, the user must first be unregistered.","ref":"ct_snmp.html#register_users/2"},{"type":"function","title":"ct_snmp.register_usm_users/2","doc":"Explicitly instructs the manager to handle this USM user. Corresponds to making\nan entry in `usm.conf`.\n\nThis function tries to register the specified users, without checking if any of\nthem exist. To change a registered user, the user must first be unregistered.","ref":"ct_snmp.html#register_usm_users/2"},{"type":"function","title":"ct_snmp.set_info/1","doc":"Returns a list of all successful `set` requests performed in the test case in\nreverse order. The list contains the involved user and agent, the value before\n`set`, and the new value. This is intended to simplify the cleanup in function\n`end_per_testcase`, that is, the undoing of the `set` requests and their\npossible side-effects.","ref":"ct_snmp.html#set_info/1"},{"type":"function","title":"ct_snmp.set_values/4","doc":"Issues a synchronous SNMP `set` request.","ref":"ct_snmp.html#set_values/4"},{"type":"function","title":"ct_snmp.start/2","doc":"","ref":"ct_snmp.html#start/2"},{"type":"function","title":"ct_snmp.start/3","doc":"Starts an SNMP manager and/or agent. In the manager case, registrations of users\nand agents, as specified by the configuration `MgrAgentConfName`, are performed.\nWhen using SNMPv3, called USM users are also registered. Users, `usm_users`, and\nmanaged agents can also be registered later using\n[`ct_snmp:register_users/2`](`register_users/2`),\n[`ct_snmp:register_agents/2`](`register_agents/2`), and\n[`ct_snmp:register_usm_users/2`](`register_usm_users/2`).\n\nThe agent started is called `snmp_master_agent`. Use\n[`ct_snmp:load_mibs/1`](`load_mibs/1`) to load MIBs into the agent.\n\nWith `SnmpAppConfName` SNMP applications can be configured with parameters\n`config`, `mibs`, `net_if`, and so on. The values are merged with (and possibly\noverride) default values set by `ct_snmp`.","ref":"ct_snmp.html#start/3"},{"type":"function","title":"ct_snmp.stop/1","doc":"Stops the SNMP manager and/or agent, and removes all files created.","ref":"ct_snmp.html#stop/1"},{"type":"function","title":"ct_snmp.unload_mibs/1","doc":"Unloads the MIBs from agent `snmp_master_agent`.","ref":"ct_snmp.html#unload_mibs/1"},{"type":"function","title":"ct_snmp.unregister_agents/1","doc":"Unregisters all managed agents.","ref":"ct_snmp.html#unregister_agents/1"},{"type":"function","title":"ct_snmp.unregister_agents/2","doc":"Unregisters the specified managed agents.","ref":"ct_snmp.html#unregister_agents/2"},{"type":"function","title":"ct_snmp.unregister_users/1","doc":"Unregisters all users.","ref":"ct_snmp.html#unregister_users/1"},{"type":"function","title":"ct_snmp.unregister_users/2","doc":"Unregisters the specified users.","ref":"ct_snmp.html#unregister_users/2"},{"type":"function","title":"ct_snmp.unregister_usm_users/1","doc":"Unregisters all USM users.","ref":"ct_snmp.html#unregister_usm_users/1"},{"type":"function","title":"ct_snmp.unregister_usm_users/2","doc":"Unregisters the specified USM users.","ref":"ct_snmp.html#unregister_usm_users/2"},{"type":"type","title":"ct_snmp.agent_config/0","doc":"","ref":"ct_snmp.html#t:agent_config/0"},{"type":"type","title":"ct_snmp.agent_ip/0","doc":"","ref":"ct_snmp.html#t:agent_ip/0"},{"type":"type","title":"ct_snmp.agent_name/0","doc":"","ref":"ct_snmp.html#t:agent_name/0"},{"type":"type","title":"ct_snmp.agent_port/0","doc":"","ref":"ct_snmp.html#t:agent_port/0"},{"type":"type","title":"ct_snmp.call_back_module/0","doc":"","ref":"ct_snmp.html#t:call_back_module/0"},{"type":"type","title":"ct_snmp.error_index/0","doc":"","ref":"ct_snmp.html#t:error_index/0"},{"type":"type","title":"ct_snmp.error_status/0","doc":"","ref":"ct_snmp.html#t:error_status/0"},{"type":"type","title":"ct_snmp.ip/0","doc":"","ref":"ct_snmp.html#t:ip/0"},{"type":"type","title":"ct_snmp.manager_ip/0","doc":"","ref":"ct_snmp.html#t:manager_ip/0"},{"type":"type","title":"ct_snmp.oid/0","doc":"","ref":"ct_snmp.html#t:oid/0"},{"type":"type","title":"ct_snmp.oids/0","doc":"","ref":"ct_snmp.html#t:oids/0"},{"type":"type","title":"ct_snmp.rel_path/0","doc":"","ref":"ct_snmp.html#t:rel_path/0"},{"type":"type","title":"ct_snmp.sec_type/0","doc":"","ref":"ct_snmp.html#t:sec_type/0"},{"type":"type","title":"ct_snmp.snmp_app_agent_params/0","doc":"","ref":"ct_snmp.html#t:snmp_app_agent_params/0"},{"type":"type","title":"ct_snmp.snmp_app_manager_params/0","doc":"","ref":"ct_snmp.html#t:snmp_app_manager_params/0"},{"type":"type","title":"ct_snmp.snmpreply/0","doc":"","ref":"ct_snmp.html#t:snmpreply/0"},{"type":"type","title":"ct_snmp.user_data/0","doc":"","ref":"ct_snmp.html#t:user_data/0"},{"type":"type","title":"ct_snmp.user_name/0","doc":"","ref":"ct_snmp.html#t:user_name/0"},{"type":"type","title":"ct_snmp.usm_config/0","doc":"","ref":"ct_snmp.html#t:usm_config/0"},{"type":"type","title":"ct_snmp.usm_user_name/0","doc":"","ref":"ct_snmp.html#t:usm_user_name/0"},{"type":"type","title":"ct_snmp.value_type/0","doc":"","ref":"ct_snmp.html#t:value_type/0"},{"type":"type","title":"ct_snmp.var_and_val/0","doc":"","ref":"ct_snmp.html#t:var_and_val/0"},{"type":"type","title":"ct_snmp.varbind/0","doc":"","ref":"ct_snmp.html#t:varbind/0"},{"type":"type","title":"ct_snmp.varbinds/0","doc":"","ref":"ct_snmp.html#t:varbinds/0"},{"type":"type","title":"ct_snmp.varsandvals/0","doc":"These data types are described in the documentation for the\n[`SNMP`](`e:snmp:index.html`) application.","ref":"ct_snmp.html#t:varsandvals/0"},{"type":"module","title":"ct_ssh","doc":"SSH/SFTP client module.\n\nThis module uses application `SSH`, which provides detailed information about,\nfor example, functions, types, and options.\n\nArgument `Server` in the SFTP functions is only to be used for SFTP sessions\nthat have been started on existing SSH connections (that is, when the original\nconnection type is `ssh`). Whenever the connection type is `sftp`, use the SSH\nconnection reference only.\n\nThe following options are valid for specifying an SSH/SFTP connection (that is,\ncan be used as configuration elements):\n\n```erlang\n[{ConnType, Addr},\n {port, Port},\n {user, UserName}\n {password, Pwd}\n {user_dir, String}\n {public_key_alg, PubKeyAlg}\n {connect_timeout, Timeout}\n {key_cb, KeyCallbackMod}]\n```\n\n`ConnType = ssh | sftp`.\n\nFor other types, see `m:ssh`.\n\nAll time-out parameters in `ct_ssh` functions are values in milliseconds.","ref":"ct_ssh.html"},{"type":"function","title":"ct_ssh.apread/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#apread/4"},{"type":"function","title":"ct_ssh.apread/5","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#apread/5"},{"type":"function","title":"ct_ssh.apwrite/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#apwrite/4"},{"type":"function","title":"ct_ssh.apwrite/5","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#apwrite/5"},{"type":"function","title":"ct_ssh.aread/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#aread/3"},{"type":"function","title":"ct_ssh.aread/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#aread/4"},{"type":"function","title":"ct_ssh.awrite/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#awrite/3"},{"type":"function","title":"ct_ssh.awrite/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#awrite/4"},{"type":"function","title":"ct_ssh.close/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#close/2"},{"type":"function","title":"ct_ssh.close/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#close/3"},{"type":"function","title":"ct_ssh.connect/1","doc":"","ref":"ct_ssh.html#connect/1"},{"type":"function","title":"ct_ssh.connect/2","doc":"Opens an SSH or SFTP connection using the information associated with `KeyOrName`\n(see `connect/3`).\n\nEquivalent to [`connect(KeyOrName, ConnType, [])`](`connect/3`) if\ncalled with ConnType being atom.\n\nEquivalent to [`connect(KeyOrName, host, ExtraOpts)`](`connect/3`) if\ncalled with ExtraOpts being list.","ref":"ct_ssh.html#connect/2"},{"type":"function","title":"ct_ssh.connect/3","doc":"Opens an SSH or SFTP connection using the information associated with\n`KeyOrName`.\n\nIf `Name` (an alias name for `Key`) is used to identify the connection, this\nname can be used as connection reference for subsequent calls. Only one open\nconnection at a time associated with `Name` is possible. If `Key` is used, the\nreturned handle must be used for subsequent calls (multiple connections can be\nopened using the configuration data specified by `Key`).\n\nFor information on how to create a new `Name`, see `ct:require/2`.\n\n`ConnType` always overrides the type specified in the address tuple in the\nconfiguration data (and in `ExtraOpts`). So it is possible to, for example, open\nan SFTP connection directly using data originally specifying an SSH connection.\nValue `host` means that the connection type specified by the host option (either\nin the configuration data or in `ExtraOpts`) is used.\n\n`ExtraOpts` (optional) are extra SSH options to be added to the configuration\ndata for `KeyOrName`. The extra options override any existing options with the\nsame key in the configuration data. For details on valid SSH options, see\napplication [`SSH`](`e:ssh:index.html`).","ref":"ct_ssh.html#connect/3"},{"type":"function","title":"ct_ssh.del_dir/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#del_dir/2"},{"type":"function","title":"ct_ssh.del_dir/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#del_dir/3"},{"type":"function","title":"ct_ssh.delete/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#delete/2"},{"type":"function","title":"ct_ssh.delete/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#delete/3"},{"type":"function","title":"ct_ssh.disconnect/1","doc":"Closes an SSH/SFTP connection.","ref":"ct_ssh.html#disconnect/1"},{"type":"function","title":"ct_ssh.exec/2","doc":"","ref":"ct_ssh.html#exec/2"},{"type":"function","title":"ct_ssh.exec/3","doc":"Requests server to perform `Command`, (see `exec/4`).\n\nEquivalent to [`exec(SSH, undefined, Command, Timeout)`](`exec/4`) if\ncalled with Command being string.\n\nEquivalent to [`exec(SSH, ChannelId, Command, DefaultTimeout)`](`exec/4`) if\ncalled with ChannelId being integer.","ref":"ct_ssh.html#exec/3"},{"type":"function","title":"ct_ssh.exec/4","doc":"Requests server to perform `Command`. A previously opened session channel is\nused for the request. `Data` is received from the server as a result of the\ncommand.","ref":"ct_ssh.html#exec/4"},{"type":"function","title":"ct_ssh.get_file_info/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#get_file_info/2"},{"type":"function","title":"ct_ssh.get_file_info/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#get_file_info/3"},{"type":"function","title":"ct_ssh.list_dir/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#list_dir/2"},{"type":"function","title":"ct_ssh.list_dir/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#list_dir/3"},{"type":"function","title":"ct_ssh.make_dir/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#make_dir/2"},{"type":"function","title":"ct_ssh.make_dir/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#make_dir/3"},{"type":"function","title":"ct_ssh.make_symlink/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#make_symlink/3"},{"type":"function","title":"ct_ssh.make_symlink/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#make_symlink/4"},{"type":"function","title":"ct_ssh.open/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#open/3"},{"type":"function","title":"ct_ssh.open/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#open/4"},{"type":"function","title":"ct_ssh.opendir/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#opendir/2"},{"type":"function","title":"ct_ssh.opendir/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#opendir/3"},{"type":"function","title":"ct_ssh.position/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#position/3"},{"type":"function","title":"ct_ssh.position/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#position/4"},{"type":"function","title":"ct_ssh.pread/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#pread/4"},{"type":"function","title":"ct_ssh.pread/5","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#pread/5"},{"type":"function","title":"ct_ssh.pwrite/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#pwrite/4"},{"type":"function","title":"ct_ssh.pwrite/5","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#pwrite/5"},{"type":"function","title":"ct_ssh.read/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read/3"},{"type":"function","title":"ct_ssh.read/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read/4"},{"type":"function","title":"ct_ssh.read_file/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_file/2"},{"type":"function","title":"ct_ssh.read_file/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_file/3"},{"type":"function","title":"ct_ssh.read_file_info/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_file_info/2"},{"type":"function","title":"ct_ssh.read_file_info/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_file_info/3"},{"type":"function","title":"ct_ssh.read_link/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_link/2"},{"type":"function","title":"ct_ssh.read_link/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_link/3"},{"type":"function","title":"ct_ssh.read_link_info/2","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_link_info/2"},{"type":"function","title":"ct_ssh.read_link_info/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#read_link_info/3"},{"type":"function","title":"ct_ssh.receive_response/2","doc":"","ref":"ct_ssh.html#receive_response/2"},{"type":"function","title":"ct_ssh.receive_response/3","doc":"Receives expected data from server on the specified session channel\n(see `receive_response/4`).\n\nEquivalent to [`receive_response(SSH, ChannelId, End, DefaultTimeout)`](`receive_response/4`) if\ncalled with End being function.\n\nEquivalent to [`receive_response(SSH, ChannelId, close, Timeout)`](`receive_response/4`) if\ncalled with Timeout being integer.","ref":"ct_ssh.html#receive_response/3"},{"type":"function","title":"ct_ssh.receive_response/4","doc":"Receives expected data from server on the specified session channel.\n\nIf `End == close`, data is returned to the caller when the channel is closed by\nthe server. If a time-out occurs before this happens, the function returns\n`{timeout,Data}` (where `Data` is the data received so far).\n\nIf `End == timeout`, a time-out is expected and `{ok,Data}` is returned both in\nthe case of a time-out and when the channel is closed.\n\nIf `End` is a fun, this fun is called with one argument, the data value in a\nreceived `ssh_cm` message (see `m:ssh_connection`. The fun is to return either\n`true` to end the receiving operation (and have the so far collected data\nreturned) or `false` to wait for more data from the server. Even if a fun is\nsupplied, the function returns immediately if the server closes the channel).","ref":"ct_ssh.html#receive_response/4"},{"type":"function","title":"ct_ssh.rename/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#rename/3"},{"type":"function","title":"ct_ssh.rename/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#rename/4"},{"type":"function","title":"ct_ssh.send/3","doc":"","ref":"ct_ssh.html#send/3"},{"type":"function","title":"ct_ssh.send/4","doc":"Sends data to server on specified session channel (see `send/5`).\n\nEquivalent to [`send(SSH, ChannelId, 0, Data, Timeout)`](`send/5`) if\ncalled with Timeout being integer.\n\nEquivalent to [`send(SSH, ChannelId, Type, Data, DefaultTimeout)`](`send/5`) if\ncalled with Type being integer.","ref":"ct_ssh.html#send/4"},{"type":"function","title":"ct_ssh.send/5","doc":"Sends data to server on specified session channel.","ref":"ct_ssh.html#send/5"},{"type":"function","title":"ct_ssh.send_and_receive/3","doc":"","ref":"ct_ssh.html#send_and_receive/3"},{"type":"function","title":"ct_ssh.send_and_receive/4","doc":"Sends data to server on specified session channel and waits to receive the\nserver response (see `send_and_receive/6`).\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, End, DefaultTimeout)`](`send_and_receive/6`)\nif called with End being function.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, close, Timeout)`](`send_and_receive/6`)\nif called with Timeout being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, close, DefaultTimeout)`](`send_and_receive/6`)\nif called with Type being integer.","ref":"ct_ssh.html#send_and_receive/4"},{"type":"function","title":"ct_ssh.send_and_receive/5","doc":"Sends data to server on specified session channel and waits to receive the\nserver response (see `send_and_receive/6`).\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, End, Timeout)`](`send_and_receive/6`) if\ncalled with Timeout being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, close, Timeout)`](`send_and_receive/6`) if\ncalled with Type being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, End, DefaultTimeout)`](`send_and_receive/6`) if\ncalled with End being function.","ref":"ct_ssh.html#send_and_receive/5"},{"type":"function","title":"ct_ssh.send_and_receive/6","doc":"Sends data to server on specified session channel and waits to receive the\nserver response.\n\nFor details on argument `End`, see\n[`ct_ssh:receive_response/4`](`receive_response/4`).","ref":"ct_ssh.html#send_and_receive/6"},{"type":"function","title":"ct_ssh.session_close/2","doc":"Closes an SSH session channel.","ref":"ct_ssh.html#session_close/2"},{"type":"function","title":"ct_ssh.session_open/1","doc":"","ref":"ct_ssh.html#session_open/1"},{"type":"function","title":"ct_ssh.session_open/2","doc":"Opens a channel for an SSH session.","ref":"ct_ssh.html#session_open/2"},{"type":"function","title":"ct_ssh.sftp_connect/1","doc":"Starts an SFTP session on an already existing SSH connection. `Server`\nidentifies the new session and must be specified whenever SFTP requests are to\nbe sent.","ref":"ct_ssh.html#sftp_connect/1"},{"type":"function","title":"ct_ssh.shell/2","doc":"","ref":"ct_ssh.html#shell/2"},{"type":"function","title":"ct_ssh.shell/3","doc":"Requests that the user's default shell (typically defined in `/etc/passwd` in Unix\nsystems) is executed at the server end.","ref":"ct_ssh.html#shell/3"},{"type":"function","title":"ct_ssh.subsystem/3","doc":"","ref":"ct_ssh.html#subsystem/3"},{"type":"function","title":"ct_ssh.subsystem/4","doc":"Sends a request to execute a predefined subsystem.","ref":"ct_ssh.html#subsystem/4"},{"type":"function","title":"ct_ssh.write/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write/3"},{"type":"function","title":"ct_ssh.write/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write/4"},{"type":"function","title":"ct_ssh.write_file/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write_file/3"},{"type":"function","title":"ct_ssh.write_file/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write_file/4"},{"type":"function","title":"ct_ssh.write_file_info/3","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write_file_info/3"},{"type":"function","title":"ct_ssh.write_file_info/4","doc":"For information and other types, see `m:ssh_sftp`.","ref":"ct_ssh.html#write_file_info/4"},{"type":"type","title":"ct_ssh.connection/0","doc":"Reference to opened SSH/SFTP connection associated to either a `handle` or `target_name`.","ref":"ct_ssh.html#t:connection/0"},{"type":"type","title":"ct_ssh.connection_type/0","doc":"Connection type used for connect.","ref":"ct_ssh.html#t:connection_type/0"},{"type":"type","title":"ct_ssh.handle/0","doc":"Handle for a specific SSH/SFTP connection, see module `m:ct`.","ref":"ct_ssh.html#t:handle/0"},{"type":"type","title":"ct_ssh.ssh_channel_id/0","doc":"Data type representing a channel inside a connection.\n\n\"For `ssh_channel_id`, see module `m:ssh`.\".","ref":"ct_ssh.html#t:ssh_channel_id/0"},{"type":"type","title":"ct_ssh.ssh_data_type_code/0","doc":"The valid values are `0` (\"normal\") and `1` (\"stderr\"), see\n[RFC 4254, Section 5.2](https://tools.ietf.org/html/rfc4254#page-8).","ref":"ct_ssh.html#t:ssh_data_type_code/0"},{"type":"behaviour","title":"ct_suite","doc":"The following section describes the mandatory and optional test suite functions\nthat `Common Test` calls during test execution. For more details, see section\n[Writing Test Suites](write_test_chapter.md) in the User's Guide.","ref":"ct_suite.html"},{"type":"callback","title":"ct_suite.all/0","doc":"Returns the list of all test cases and test case groups in the test suite module\nto be executed.\n\nThis list also specifies the order the cases and groups are\nexecuted by `Common Test`. A test case is represented by an atom, the name of\nthe test case function, or a `testcase` tuple indicating that the test case\nshall be repeated. A test case group is represented by a `group` tuple, where\n`GroupName`, an atom, is the name of the group (defined in\n[`Module:groups/0`](`c:groups/0`)). Execution properties for groups can also be\nspecified, both for a top-level group and for any of its subgroups. Group\nexecution properties specified here override properties in the group definition\n(see [`Module:groups/0`](`c:groups/0`)). (With value `default`, the group\ndefinition properties are used).\n\nIf `{skip, Reason}` is returned, all test cases in the module are skipped and\n`Reason` is printed on the HTML result page.\n\nFor details on groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.","ref":"ct_suite.html#c:all/0"},{"type":"callback","title":"ct_suite.end_per_group/2","doc":"This function is called after the execution of a test case group is finished. It\nis meant to be used for cleaning up after [`Module:init_per_group/2`](`c:init_per_group/2`).\n\nA status value for a nested subgroup can be returned with `{return_group_result, Status}`.\nThe status can be retrieved in [`Module:end_per_group/2`](`c:end_per_group/2`) for the group on\nthe level above. The status is also used by `Common Test` for deciding if\nexecution of a group is to proceed if property `sequence` or `repeat_until_*` is\nset.\n\nFor details about test case groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.\n\nIf this function is defined, then\n[`Module:init_per_group/2`](`c:init_per_group/2`) must also be defined.","ref":"ct_suite.html#c:end_per_group/2"},{"type":"callback","title":"ct_suite.end_per_suite/1","doc":"This function is called as the last test case in the suite. It is meant to be\nused for cleaning up after [`Module:init_per_suite/1`](`c:init_per_suite/1`).\n\nFor information on `save_config`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:init_per_suite/1`](`c:init_per_suite/1`) must also be defined.","ref":"ct_suite.html#c:end_per_suite/1"},{"type":"callback","title":"ct_suite.end_per_testcase/2","doc":"This function is called after each test case, and can be used to clean up after\n[`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and the test case.\n\nAny return value (besides `{fail, Reason}` and `{save_config, SaveConfig}`) is\nignored. By returning `{fail, Reason}`, `TestCase` is marked as faulty (even\nthough it was successful in the sense that it returned a value instead of\nterminating).\n\nFor information on `save_config`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:init_per_testcase/2`](`c:init_per_testcase/2`) must also be defined.","ref":"ct_suite.html#c:end_per_testcase/2"},{"type":"callback","title":"ct_suite.group/1","doc":"The test case group information function. It is supposed to return a list of\ntagged tuples that specify various properties related to the execution of a test\ncase group (that is, its test cases and subgroups). Properties set by\n[`Module:group/1`](`c:group/1`) override properties with the same key that have\nbeen set previously by [`Module:suite/0`](`c:suite/0`).\n\nTag `timetrap` sets the maximum time that each test case is allowed to execute\n(including [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`)). If the timetrap time is\nexceeded, the test case fails with reason `timetrap_timeout`. A `TimeFunc`\nfunction can be used to set a new timetrap by returning a `TimeVal`. It can also\nbe used to trigger a timetrap time-out by, at some point, returning a value\nother than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables required by test cases (or\nconfiguration functions) in the suite. If the required configuration variables\nare not found in any of the configuration files, all test cases in this group\nare skipped. For details about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nWith `userdata`, the user can specify any test case group related information\nthat can be read by calling `ct:userdata/2`.\n\nTag `ct_hooks` specifies the [Common Test Hooks](ct_hooks_chapter.md) to be run\nwith this suite.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test case group information function, see section\n[Group Information Function](write_test_chapter.md#group_info) in the User's\nGuide.","ref":"ct_suite.html#c:group/1"},{"type":"callback","title":"ct_suite.groups/0","doc":"Defines test case groups. For details, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.","ref":"ct_suite.html#c:groups/0"},{"type":"callback","title":"ct_suite.init_per_group/2","doc":"This configuration function is called before execution of a test case group. It\ntypically contains initializations that are common for all test cases and\nsubgroups in the group, and that must only be performed once.\n\n`GroupName` is the name of the group, as specified in the group definition (see\n[`Module:groups/0`](`c:groups/0`)). Parameter `Config` is the configuration data\nthat can be modified. The return value of this function is given as `Config` to\nall test cases and subgroups in the group.\n\nIf `{skip, Reason}` is returned, all test cases in the group are skipped and\n`Reason` is printed in the overview log for the group.\n\nFor information about test case groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.\n\nIf this function is defined, then\n[`Module:end_per_group/2`](`c:end_per_group/2`) must also be defined.","ref":"ct_suite.html#c:init_per_group/2"},{"type":"callback","title":"ct_suite.init_per_suite/1","doc":"This configuration function is called as the first function in the suite. It\ntypically contains initializations that are common for all test cases in the\nsuite, and that must only be done once.\n\nParameter `Config` is the configuration\ndata that can be modified. Whatever is returned from this function is specified\nas `Config` to all configuration functions and test cases in the suite.\n\nIf `{skip, Reason}` is returned, all test cases in the suite are skipped and\n`Reason` is printed in the overview log for the suite.\n\nFor information on `save_config` and `skip_and_save`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:end_per_suite/1`](`c:end_per_suite/1`) must also be defined.","ref":"ct_suite.html#c:init_per_suite/1"},{"type":"callback","title":"ct_suite.init_per_testcase/2","doc":"This function is called before each test case.\n\nArgument `TestCase` is the test case name, and `Config` (list of key-value tuples)\nis the configuration data that can be modified. The `NewConfig` list returned from this\nfunction is given as `Config` to the test case.\n\nIf `{fail, Reason}` is returned, the test case is marked as failed without being executed.\n\nIf `{skip, Reason}` is returned, the test case is skipped and `Reason` is\nprinted in the overview log for the suite.\n\nIf this function is defined, then\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`) must also be defined.","ref":"ct_suite.html#c:init_per_testcase/2"},{"type":"callback","title":"ct_suite.suite/0","doc":"The test suite information function. Returns a list of tagged tuples specifying\nvarious properties related to the execution of this test suite (common for all\ntest cases in the suite).\n\nTag `timetrap` sets the maximum time that each test case is allowed to execute\n(including [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`)). If the timetrap time is\nexceeded, the test case fails with reason `timetrap_timeout`. A `TimeFunc`\nfunction can be used to set a new timetrap by returning a `TimeVal`. It can also\nbe used to trigger a timetrap time-out by, at some point, returning a value\nother than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables required by test cases (or\nconfiguration functions) in the suite. If the required configuration variables\nare not found in any of the configuration files, all test cases are skipped. For\ndetails about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nWith `userdata`, the user can specify any test suite-related information, which\ncan be read by calling `ct:userdata/2`.\n\nTag `ct_hooks` specifies the [Common Test Hooks](ct_hooks_chapter.md) to be run\nwith this suite.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test suite information function, see section\n[Test Suite Information Function](write_test_chapter.md#suite) in the User's\nGuide.","ref":"ct_suite.html#c:suite/0"},{"type":"callback","title":"ct_suite.Testcase/0","doc":"The test case information function. It is supposed to return a list of tagged\ntuples that specify various properties related to the execution of this\nparticular test case. Properties set by [`Module:Testcase/0`](`c:'Testcase'/0`)\noverride properties set previously for the test case by\n[`Module:group/1`](`c:group/1`) or [`Module:suite/0`](`c:suite/0`).\n\nTag `timetrap` sets the maximum time that the test case is allowed to execute.\nIf the timetrap time is exceeded, the test case fails with reason\n`timetrap_timeout`. [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`) are included in the\ntimetrap time. A `TimeFunc` function can be used to set a new timetrap by\nreturning a `TimeVal`. It can also be used to trigger a timetrap time-out by, at\nsome point, returning a value other than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables that are required by the test\ncase (or [`init_per_testcase/2`](`c:init_per_testcase/2`) or\n[`end_per_testcase/2`](`c:end_per_testcase/2`)). If the required configuration\nvariables are not found in any of the configuration files, the test case is\nskipped. For details about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nIf `timetrap` or `require` is not set, the default values specified by\n[`Module:suite/0`](`c:suite/0`) (or [`Module:group/1`](`c:group/1`)) are used.\n\nWith `userdata`, the user can specify any test case-related information that can\nbe read by calling `ct:userdata/3`.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test case information function, see section\n[Test Case Information Function](write_test_chapter.md#info_function) in the\nUser's Guide.","ref":"ct_suite.html#c:Testcase/0"},{"type":"callback","title":"ct_suite.Testcase/1","doc":"The implementation of a test case. Call the functions to test and check the\nresult. If something fails, ensure the function causes a runtime error or call\n[`ct:fail/1,2`](`ct:fail/1`) (which also causes the test case process to\nterminate).\n\nElements from the `Config` list can, for example, be read with\n`proplists:get_value/2` in STDLIB.\n\nPossible return values are:\n\n- **`{fail, Reason}`** - The test case is considered failed, and the `Reason`\n will be logged.\n\n- **`{skip, Reason}`** - The test case is considered skipped, and the `Reason`\n will be logged.\n\n- **`{comment, Comment}`** - The test case is considered successful, and the\n `Comment` will be logged.\n\n- **`{save_config, SaveConfig}`** - The test case is considered successful, and\n the `SaveConfig` will be stored in the `Config` (see section\n [Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\n Guide).\n\n- **`{skip_and_save, Reason, SaveConfig}`** - The test case is considered\n skipped, the `Reason` will be logged, and the `SaveConfig` will be stored in\n the `Config` (see section\n [Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\n Guide).\n\nIf the function returns any other term, the test case is considered successful.\n\nIf the test case function crashes, it is considered failed.\n\nFor details about test case implementation, see section\n[Test Cases](write_test_chapter.md#test_cases) in the User's Guide.","ref":"ct_suite.html#c:Testcase/1"},{"type":"type","title":"ct_suite.ct_config/0","doc":"The configuration data that can be modified.","ref":"ct_suite.html#t:ct_config/0"},{"type":"type","title":"ct_suite.ct_group_def/0","doc":"The test group definition, as returned by [`Module:groups/0`](`c:groups/0`).","ref":"ct_suite.html#t:ct_group_def/0"},{"type":"type","title":"ct_suite.ct_group_props/0","doc":"","ref":"ct_suite.html#t:ct_group_props/0"},{"type":"type","title":"ct_suite.ct_group_props_ref/0","doc":"","ref":"ct_suite.html#t:ct_group_props_ref/0"},{"type":"type","title":"ct_suite.ct_group_ref/0","doc":"","ref":"ct_suite.html#t:ct_group_ref/0"},{"type":"type","title":"ct_suite.ct_group_repeat_type/0","doc":"","ref":"ct_suite.html#t:ct_group_repeat_type/0"},{"type":"type","title":"ct_suite.ct_groupname/0","doc":"The name of the test group.","ref":"ct_suite.html#t:ct_groupname/0"},{"type":"type","title":"ct_suite.ct_hooks/0","doc":"","ref":"ct_suite.html#t:ct_hooks/0"},{"type":"type","title":"ct_suite.ct_info/0","doc":"The test suite information, as returned by [`Module:suite/0`](`c:suite/0`),\n[`Module:group/1`](`c:group/1`) and [`Module:Testcase/0`](`c:'Testcase'/0`).","ref":"ct_suite.html#t:ct_info/0"},{"type":"type","title":"ct_suite.ct_info_required/0","doc":"","ref":"ct_suite.html#t:ct_info_required/0"},{"type":"type","title":"ct_suite.ct_info_required_subkeys/0","doc":"","ref":"ct_suite.html#t:ct_info_required_subkeys/0"},{"type":"type","title":"ct_suite.ct_info_timetrap/0","doc":"","ref":"ct_suite.html#t:ct_info_timetrap/0"},{"type":"type","title":"ct_suite.ct_info_timetrap_fun/0","doc":"","ref":"ct_suite.html#t:ct_info_timetrap_fun/0"},{"type":"type","title":"ct_suite.ct_status/0","doc":"The status value for a nested subgroup.","ref":"ct_suite.html#t:ct_status/0"},{"type":"type","title":"ct_suite.ct_subgroups_def/0","doc":"","ref":"ct_suite.html#t:ct_subgroups_def/0"},{"type":"type","title":"ct_suite.ct_test_def/0","doc":"The test suite definition, as returned by [`Module:all/0`](`c:all/0`).","ref":"ct_suite.html#t:ct_test_def/0"},{"type":"type","title":"ct_suite.ct_test_repeat/0","doc":"","ref":"ct_suite.html#t:ct_test_repeat/0"},{"type":"type","title":"ct_suite.ct_testcase_ref/0","doc":"","ref":"ct_suite.html#t:ct_testcase_ref/0"},{"type":"type","title":"ct_suite.ct_testcase_repeat_prop/0","doc":"","ref":"ct_suite.html#t:ct_testcase_repeat_prop/0"},{"type":"type","title":"ct_suite.ct_testname/0","doc":"The name of the testcase function.","ref":"ct_suite.html#t:ct_testname/0"},{"type":"module","title":"ct_telnet","doc":"`Common Test` specific layer on top of Telnet client `ct_telnet_client.erl`.\n\nUse this module to set up Telnet connections, send commands, and perform string\nmatching on the result. For information about how to use `ct_telnet` and\nconfigure connections, specifically for UNIX hosts, see the `m:unix_telnet`\nmanual page.\n\nDefault values defined in `ct_telnet`:\n\n[](){: #Default_values }\n\n- Connection timeout (time to wait for connection) = 10 seconds\n- Command timeout (time to wait for a command to return) = 10 seconds\n- Max number of reconnection attempts = 3\n- Reconnection interval (time to wait in between reconnection attempts) = 5\n seconds\n- Keep alive (sends NOP to the server every 8 sec if connection is idle) =\n `true`\n- Polling limit (max number of times to poll to get a remaining string\n terminated) = 0\n- Polling interval (sleep time between polls) = 1 second\n- The TCP_NODELAY option for the telnet socket is disabled (set to `false`) per\n default\n\nThese parameters can be modified by the user with the following configuration\nterm:\n\n```erlang\n{telnet_settings, [{connect_timeout,Millisec},\n {command_timeout,Millisec},\n {reconnection_attempts,N},\n {reconnection_interval,Millisec},\n {keep_alive,Bool},\n {poll_limit,N},\n {poll_interval,Millisec},\n {tcp_nodelay,Bool}]}.\n```\n\n`Millisec = integer(), N = integer()`\n\nEnter the `telnet_settings` term in a configuration file included in the test\nand `ct_telnet` retrieves the information automatically.\n\n`keep_alive` can be specified per connection, if necessary. For details, see\n`m:unix_telnet`.","ref":"ct_telnet.html"},{"type":"module","title":"Logging - ct_telnet","doc":"[](){: #Logging }\n\nThe default logging behavior of `ct_telnet` is to print information about\nperformed operations, commands, and their corresponding results to the test case\nHTML log. The following is not printed to the HTML log: text strings sent from\nthe Telnet server that are not explicitly received by a `ct_telnet` function,\nsuch as [`expect/3`](`expect/3`). However, `ct_telnet` can be configured to use\na special purpose event handler, implemented in `ct_conn_log_h`, for logging\n_all_ Telnet traffic. To use this handler, install a `Common Test` hook named\n`cth_conn_log`. Example (using the test suite information function):\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].\n```\n\n`conn_mod()` is the name of the `Common Test` module implementing the connection\nprotocol, that is, `ct_telnet`.\n\nThe `cth_conn_log` hook performs unformatted logging of Telnet data to a\nseparate text file. All Telnet communication is captured and printed, including\nany data sent from the server. The link to this text file is located at the top\nof the test case HTML log.\n\nBy default, data for all Telnet connections is logged in one common file (named\n`default`), which can get messy, for example, if multiple Telnet sessions are\nrunning in parallel. Therefore a separate log file can be created for each\nconnection. To configure this, use hook option `hosts` and list the names of the\nservers/connections to be used in the suite. The connections must be named for\nthis to work (see [`ct_telnet:open/1,2,3,4`](`open/1`)).\n\nHook option `log_type` can be used to change the `cth_conn_log` behavior. The\ndefault value of this option is `raw`, which results in the behavior described\nabove. If the value is set to `html`, all Telnet communication is printed to the\ntest case HTML log instead.\n\nAll `cth_conn_log` hook options described can also be specified in a\nconfiguration file with configuration variable `ct_conn_log`.\n\n_Example:_\n\n```erlang\n{ct_conn_log, [{ct_telnet,[{log_type,raw},\n {hosts,[key_or_name()]}]}]}\n```\n\n> #### Note {: .info }\n>\n> Hook options specified in a configuration file overwrite any hard-coded hook\n> options in the test suite.\n\n[](){: #Logging_example }\n\n_Logging Example:_\n\nThe following `ct_hooks` statement causes printing of Telnet traffic to separate\nlogs for the connections `server1` and `server2`. Traffic for any other\nconnections is logged in the default Telnet log.\n\n```erlang\nsuite() ->\n [{ct_hooks,\n [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].\n```\n\nAs previously explained, this specification can also be provided by an entry\nlike the following in a configuration file:\n\n```erlang\n{ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.\n```\n\nIn this case the `ct_hooks` statement in the test suite can look as follows:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, []}]}].\n```","ref":"ct_telnet.html#module-logging"},{"type":"module","title":"See Also - ct_telnet","doc":"`m:unix_telnet`","ref":"ct_telnet.html#module-see-also"},{"type":"function","title":"ct_telnet.close/1","doc":"Closes the Telnet connection and stops the process managing it.\n\nA connection can be associated with a target name and/or a handle. If\n`Connection` has no associated target name, it can only be closed with the\nhandle value (see [`ct_telnet:open/4`](`open/4`)).","ref":"ct_telnet.html#close/1"},{"type":"function","title":"ct_telnet.cmd/2","doc":"","ref":"ct_telnet.html#cmd/2"},{"type":"function","title":"ct_telnet.cmd/3","doc":"Sends a command through Telnet and waits for prompt.\n\nBy default, this function adds \"\\\\n\" to the end of the specified command. If\nthis is not desired, use option `{newline,false}`. This is necessary, for\nexample, when sending Telnet command sequences prefixed with character Interpret\nAs Command (IAC). Option `{newline,string()}` can also be used if a different\nline end than \"\\\\n\" is required, for instance `{newline,\"\\r\\n\"}`, to add both\ncarriage return and newline characters.\n\nOption `timeout` specifies how long the client must wait for prompt. If the time\nexpires, the function returns `{error,timeout}`. For information about the\ndefault value for the command timeout, see the\n[list of default values](`m:ct_telnet#Default_values`) in the beginning of this\nmodule.","ref":"ct_telnet.html#cmd/3"},{"type":"function","title":"ct_telnet.cmdf/3","doc":"","ref":"ct_telnet.html#cmdf/3"},{"type":"function","title":"ct_telnet.cmdf/4","doc":"Sends a Telnet command and waits for prompt (uses a format string and a list of\narguments to build the command).\n\nFor details, see [`ct_telnet:cmd/3`](`cmd/3`).","ref":"ct_telnet.html#cmdf/4"},{"type":"function","title":"ct_telnet.expect/2","doc":"","ref":"ct_telnet.html#expect/2"},{"type":"function","title":"ct_telnet.expect/3","doc":"Gets data from Telnet and waits for the expected pattern.\n\n`Pattern` can be a POSIX regular expression. The function returns when a pattern\nis successfully matched (at least one, in the case of multiple patterns).\n\n`RxMatch` is a list of matched strings. It looks as follows\n`[FullMatch, SubMatch1, SubMatch2, ...]`, where `FullMatch` is the string\nmatched by the whole regular expression, and `SubMatchN` is the string that\nmatched subexpression number `N`. Subexpressions are denoted with `'(' ')'` in\nthe regular expression.\n\nIf a `Tag` is specified, the returned `Match` also includes the matched `Tag`.\nOtherwise, only `RxMatch` is returned.\n\n_Options:_\n\n- **`idle_timeout`** - Indicates that the function must return if the Telnet\n client is idle (that is, if no data is received) for more than `IdleTimeout`\n milliseconds. Default time-out is 10 seconds.\n\n- **`total_timeout`** - Sets a time limit for the complete `expect` operation.\n After `TotalTimeout` milliseconds, `{error,timeout}` is returned. Default is\n `infinity` (that is, no time limit).\n\n- **`ignore_prompt | no_prompt_check`** - >The function returns when a prompt is\n received, even if no pattern has yet been matched, and\n `{error,{prompt,Prompt}}` is returned. However, this behavior can be modified\n with option `ignore_prompt` or option `no_prompt_check`, which tells `expect`\n to return only when a match is found or after a time-out.\n\n- **`ignore_prompt`** - `ct_telnet` ignores any prompt found. This option is\n useful if data sent by the server can include a pattern matching prompt\n `regexp` (as returned by `TargedMod:get_prompt_regexp/0`), but is not to not\n cause the function to return.\n\n- **`no_prompt_check`** - `ct_telnet` does not search for a prompt at all. This\n is useful if, for example, `Pattern` itself matches the prompt.\n\n- **`wait_for_prompt`** - Forces `ct_telnet` to wait until the prompt string is\n received before returning (even if a pattern has already been matched). This\n is equal to calling\n [`expect(Conn, Patterns++[{prompt,Prompt}], [sequence|Opts])`](`expect/3`).\n Notice that option `idle_timeout` and `total_timeout` can abort the operation\n of waiting for prompt.\n\n- **`repeat | repeat, N`** - The pattern(s) must be matched multiple times. If\n `N` is specified, the pattern(s) are matched `N` times, and the function\n returns `HaltReason = done`. This option can be interrupted by one or more\n `HaltPatterns`. `MatchList` is always returned, that is, a list of `Match`\n instead of only one `Match`. Also `HaltReason` is returned.\n\n- **`sequence`** - All patterns must be matched in a sequence. A match is not\n concluded until all patterns are matched. This option can be interrupted by\n one or more `HaltPatterns`. `MatchList` is always returned, that is, a list of\n `Match` instead of only one `Match`. Also `HaltReason` is returned.\n\n_Example 1:_\n\n```erlang\nexpect(Connection,[{abc,\"ABC\"},{xyz,\"XYZ\"}],[sequence,{halt,[{nnn,\"NNN\"}]}])\n```\n\nFirst this tries to match `\"ABC\"`, and then `\"XYZ\"`, but if `\"NNN\"` appears, the\nfunction returns `{error,{nnn,[\"NNN\"]}}`. If both `\"ABC\"` and `\"XYZ\"` are\nmatched, the function returns `{ok,[AbcMatch,XyzMatch]}`.\n\n_Example 2:_\n\n```erlang\nexpect(Connection,[{abc,\"ABC\"},{xyz,\"XYZ\"}],[{repeat,2},{halt,[{nnn,\"NNN\"}]}])\n```\n\nThis tries to match `\"ABC\"` or `\"XYZ\"` twice. If `\"NNN\"` appears, the function\nreturns `HaltReason = {nnn,[\"NNN\"]}`.\n\nOptions `repeat` and `sequence` can be combined to match a sequence multiple\ntimes.","ref":"ct_telnet.html#expect/3"},{"type":"function","title":"ct_telnet.get_data/1","doc":"Gets all data received by the Telnet client since the last command was sent.\nOnly newline-terminated strings are returned. If the last received string has\nnot yet been terminated, the connection can be polled automatically until the\nstring is complete.\n\nThe polling feature is controlled by the configuration values `poll_limit` and\n`poll_interval` and is by default disabled. This means that the function\nimmediately returns all complete strings received and saves a remaining\nnon-terminated string for a later `get_data` call.","ref":"ct_telnet.html#get_data/1"},{"type":"function","title":"ct_telnet.open/1","doc":"","ref":"ct_telnet.html#open/1"},{"type":"function","title":"ct_telnet.open/2","doc":"Opens a Telnet connection to the specified target host.","ref":"ct_telnet.html#open/2"},{"type":"function","title":"ct_telnet.open/3","doc":"","ref":"ct_telnet.html#open/3"},{"type":"function","title":"ct_telnet.open/4","doc":"Opens a Telnet connection to the specified target host.\n\nThe target data must exist in a configuration file. The connection can be\nassociated with `Name` and/or the returned `Handle`. To allocate a name for the\ntarget, use one of the following alternatives:\n\n- `ct:require/2` in a test case\n- A `require` statement in the suite information function (`suite/0`)\n- A `require` statement in a test case information function\n\nIf you want the connection to be associated with `Handle` only (if you, for\nexample, need to open multiple connections to a host), use `Key`, the\nconfiguration variable name, to specify the target. Notice that a connection\nwithout an associated target name can only be closed with the `Handle` value.\n\n`TargetMod` is a module that exports the functions\n`connect(Ip, Port, KeepAlive, Extra)` and `get_prompt_regexp()` for the\nspecified `TargetType` (for example, `unix_telnet`).\n\nSee also `ct:require/2`.","ref":"ct_telnet.html#open/4"},{"type":"function","title":"ct_telnet.send/2","doc":"","ref":"ct_telnet.html#send/2"},{"type":"function","title":"ct_telnet.send/3","doc":"Sends a Telnet command and returns immediately.\n\nBy default, this function adds \"\\\\n\" to the end of the specified command. If\nthis is not desired, option `{newline,false}` can be used. This is necessary,\nfor example, when sending Telnet command sequences prefixed with character\nInterpret As Command (IAC). Option `{newline,string()}` can also be used if a\ndifferent line end than \"\\\\n\" is required, for instance `{newline,\"\\r\\n\"}`, to\nadd both carriage return and newline characters.\n\nThe resulting output from the command can be read with\n[`ct_telnet:get_data/2`](`get_data/1`) or [`ct_telnet:expect/2,3`](`expect/2`).","ref":"ct_telnet.html#send/3"},{"type":"function","title":"ct_telnet.sendf/3","doc":"","ref":"ct_telnet.html#sendf/3"},{"type":"function","title":"ct_telnet.sendf/4","doc":"Sends a Telnet command and returns immediately (uses a format string and a list\nof arguments to build the command).\n\nFor details, see [`ct_telnet:send/3`](`send/3`).","ref":"ct_telnet.html#sendf/4"},{"type":"type","title":"ct_telnet.connection/0","doc":"Reference to opened Telnet connection associated to either a `handle` or `target_name`.","ref":"ct_telnet.html#t:connection/0"},{"type":"type","title":"ct_telnet.connection_type/0","doc":"Telnet connection_type, valid values: 'telnet' | 'ts1' | 'ts2'.","ref":"ct_telnet.html#t:connection_type/0"},{"type":"type","title":"ct_telnet.handle/0","doc":"Handle for a specific Telnet connection, see module `m:ct`.","ref":"ct_telnet.html#t:handle/0"},{"type":"type","title":"ct_telnet.newline_option/0","doc":"See `cmd/3` for explanation.","ref":"ct_telnet.html#t:newline_option/0"},{"type":"type","title":"ct_telnet.prompt_regexp/0","doc":"Regular expression matching all possible prompts for a specific target type.\n`regexp` must not have any groups, that is, when matching, `re:run/3` (in\nSTDLIB) must return a list with one single element.","ref":"ct_telnet.html#t:prompt_regexp/0"},{"type":"module","title":"ct_testspec","doc":"Parsing of test specifications for `Common Test`.\n\nThis module exports help functions for parsing of test specifications.","ref":"ct_testspec.html"},{"type":"function","title":"ct_testspec.get_tests/1","doc":"Parse the given test specification files and return the tests to run and skip.\n\n[](){: #add_nodes-1 }\n\nIf `SpecsIn=[Spec1,Spec2,...]`, separate tests will be created per\nspecification. If `SpecsIn=[[Spec1,Spec2,...]]`, all specifications will be\nmerge into one test.\n\nFor each test, a `{Specs,Tests}` element is returned, where `Specs` is a list of\nall included test specifications, and `Tests` specifies actual tests to run/skip\nper node.","ref":"ct_testspec.html#get_tests/1"},{"type":"module","title":"unix_telnet","doc":"Callback module for `m:ct_telnet`, for connecting to a Telnet server on a UNIX\nhost.\n\nIt requires the following entry in the configuration file:\n\n```erlang\n{unix,[{telnet,HostNameOrIpAddress},\n {port,PortNum}, % optional\n {username,UserName},\n {password,Password},\n {keep_alive,Bool}]}. % optional\n```\n\nTo communicate through Telnet to the host specified by `HostNameOrIpAddress`,\nuse the interface functions in `m:ct_telnet`, for example, `open(Name)` and\n`cmd(Name,Cmd)`.\n\n`Name` is the name you allocated to the Unix host in your `require` statement,\nfor example:\n\n```erlang\nsuite() -> [{require,Name,{unix,[telnet]}}].\n```\n\nor\n\n```erlang\nct:require(Name,{unix,[telnet]}).\n```\n\nThe \"keep alive\" activity (that is, that `Common Test` sends NOP to the server\nevery 10 seconds if the connection is idle) can be enabled or disabled for one\nparticular connection as described here. It can be disabled for all connections\nusing `telnet_settings` (see `m:ct_telnet`).\n\nThe `{port,PortNum}` tuple is optional and if omitted, default Telnet port 23 is\nused. Also the `keep_alive` tuple is optional, and the value default to `true`\n(enabled).","ref":"unix_telnet.html"},{"type":"module","title":"See Also - unix_telnet","doc":"`m:ct`, `m:ct_telnet`","ref":"unix_telnet.html#module-see-also"},{"type":"function","title":"unix_telnet.connect/7","doc":"Callback for `ct_telnet.erl`.\n\n[](){: #connect-6 }\n\nSetup Telnet connection to a Unix host.","ref":"unix_telnet.html#connect/7"},{"type":"function","title":"unix_telnet.get_prompt_regexp/0","doc":"Callback for `ct_telnet.erl`.\n\nReturns a suitable `regexp` string matching common prompts for users on Unix\nhosts.","ref":"unix_telnet.html#get_prompt_regexp/0"},{"type":"extras","title":"Common Test Application","doc":"\n# Common Test Application\n\nA framework for automated testing of any target nodes.","ref":"common_test_app.html"},{"type":"extras","title":"Description - Common Test Application","doc":"The `Common Test` framework is an environment for implementing and performing\nautomatic and semi-automatic execution of test cases.\n\nIn brief, `Common Test` supports:\n\n- Automated execution of test suites (sets of test cases)\n- Logging of events during execution\n- HTML presentation of test suite results\n- HTML presentation of test suite code\n- Support functions for test suite authors\n- Step-by-step execution of test cases","ref":"common_test_app.html#description"},{"type":"extras","title":"Common Test Release Notes","doc":"\n# Common Test Release Notes","ref":"notes.html"},{"type":"extras","title":"Common_Test 1.27 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-27"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Calls to `ct:capture_start/0` and `ct:capture_stop/0` are now synchronous to ensure that all output is captured.\n\n Own Id: OTP-18658 Aux Id: [PR-7380]\n\n- The order in which multiple hooks are executed can now be reversed after each config function. See [CTH Execution Order](`e:common_test:ct_hooks_chapter.md#cth_execution_order`).\n\n Own Id: OTP-18682 Aux Id: [GH-7397], [PR-7496], ERIERL-43\n\n- The default CSS will now include a basic dark mode handling if it is preferred by the browser.\n\n Own Id: OTP-18761 Aux Id: [PR-7428]\n\n- `-callback` attributes have been added to `m:ct_suite` and `m:ct_hooks`.\n\n Own Id: OTP-18781 Aux Id: [PR-7701]\n\n- The built-in [cth_log_redirect](`e:common_test:ct_hooks_chapter.md#built-in-cths`) hook can now be configured to replace default logger reports in terminal with HTML logs.\n\n Own Id: OTP-18875 Aux Id: [PR-7891]\n\n- Error handling for the `m:ct_property_test` framework has been enhanced.\n\n Own Id: OTP-18881 Aux Id: [PR-7824]\n\n- Enhance test case documentation, making it clear how a test case can be failed.\n\n Own Id: OTP-18892 Aux Id: [PR-7869]\n\n- The failing line in the test source code is now colored to make it easier to find on the screen.\n\n Own Id: OTP-18898 Aux Id: [PR-7917]\n\n- Function specifications and types have been added to all public API functions.\n\n Own Id: OTP-18913\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- The suite execution elapsed time is now included in the index page.\n\n Own Id: OTP-18981 Aux Id: [GH-7972], [PR-8112]\n\n[PR-7380]: https://github.com/erlang/otp/pull/7380\n[GH-7397]: https://github.com/erlang/otp/issues/7397\n[PR-7496]: https://github.com/erlang/otp/pull/7496\n[PR-7428]: https://github.com/erlang/otp/pull/7428\n[PR-7701]: https://github.com/erlang/otp/pull/7701\n[PR-7891]: https://github.com/erlang/otp/pull/7891\n[PR-7824]: https://github.com/erlang/otp/pull/7824\n[PR-7869]: https://github.com/erlang/otp/pull/7869\n[PR-7917]: https://github.com/erlang/otp/pull/7917\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[GH-7972]: https://github.com/erlang/otp/issues/7972\n[PR-8112]: https://github.com/erlang/otp/pull/8112","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.26.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-26-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.26.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-26-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.26 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-26"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- With this change, common_test returns an error when suite with a badly defined\n group is executed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18728 Aux Id: PR-7487, PR-7674\n\n- With this change, stylesheet option is applied to all HTML report pages.\n\n Own Id: OTP-18760\n\n- Update all html tags to be instead.\n\n Own Id: OTP-18799 Aux Id: PR-7695","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- This change fixes docs, so that historically deprecated ?config macro is no\n longer recommended to be used.\n\n Own Id: OTP-18858 Aux Id: PR-7825","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.25.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-25-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- With this change, ct_hooks manual refers to CTH execution order section in\n user guide.\n\n Own Id: OTP-14480 Aux Id: ERIERL-43, OTP-11894, PR-7455\n\n- With this change, Config data from pre_end_per_testcase hook is delivered to\n post_end_per_testcase callback in case of testcase timetrap or linked process\n crash.\n\n Own Id: OTP-18579 Aux Id: GH-7119\n\n- With this change, remaining references to not supported vts tool in ct_run are\n removed (mainly relates to docs and ct_run help message).\n\n Own Id: OTP-18615 Aux Id: PR-7234\n\n- With this change, prompt search functionality in ct_telnet handles unicode\n input.\n\n Own Id: OTP-18664 Aux Id: ERIERL-959\n\n- Expanded the documentation about how to use the `standard_io`,\n `standard_error` and `user` I/O devices.\n\n Added the types [`io:standard_io/0`](`t:io:standard_io/0`),\n `io:standard:error/0` and [`io:user/0`](`t:io:user/0`).\n\n Own Id: OTP-18676 Aux Id: PR-7473 GH-7459","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.25 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-25"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- This change improves Common Test docs (CT hook example code) and adds Emacs\n skeleton with hook code.\n\n Own Id: OTP-18377 Aux Id: PR-6437","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Updated common_test with a more robust way to fetch old releases, while\n ignoring the current release.\n\n Own Id: OTP-18259 Aux Id: PR-5924\n\n- \\- re-write the XML `ct` module documentation into erlang types to make\n Dialyzer able to catch more precise errors\n\n Own Id: OTP-18340\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.24.0.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-24-0-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.24.0.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-24-0-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.24.0.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-24-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- With this change, prompt search functionality in ct_telnet handles unicode\n input.\n\n Own Id: OTP-18664 Aux Id: ERIERL-959","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.24 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-24"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Renamed undocumented macro `CT_PEER/3` to `CT_PEER_REL/3`.\n\n Own Id: OTP-18460","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.23.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-23-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Change timeout to infinity for gen_server calls in cth_log_redirect\n\n Own Id: OTP-18363 Aux Id: ERIERL-879","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.23.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-23-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Fix starting of peer nodes on old releases when the compile server was active\n and the current Erlang installation contained non-latin1 characters in its\n path.\n\n Own Id: OTP-18255 Aux Id: PR-6314","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.23.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-23-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Fix cth_surefire to handle when a suite is not compiled with `debug_info`.\n This bug has been present since Erlang/OTP 25.0.\n\n Own Id: OTP-18208 Aux Id: ERIERL-852 PR-6229","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Common Test now preserves stack traces for throws.\n\n Own Id: OTP-18138 Aux Id: GH-5719, PR-6029","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.23 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-23"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Fix bug when running parallel test cases and together with one or more ct\n hooks that would cause the hook lock process to crash and produce printouts in\n the ct logs.\n\n Own Id: OTP-17881 Aux Id: PR-5581","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Remove unused and undocumented tracer node functionality.\n\n Own Id: OTP-17676 Aux Id: PR-5021\n\n- The new module `peer` supersedes the `slave` module. The `slave` module is now\n deprecated and will be removed in OTP 27.\n\n `peer` contains an extended and more robust API for starting erlang nodes.\n\n Own Id: OTP-17720 Aux Id: PR-5162\n\n- The cth_surefire ct hook has been updated to include the file and line number\n of the executed test case in the xml output.\n\n The performance of the hook has also been improved greatly for test runs with\n many test cases.\n\n Own Id: OTP-17882 Aux Id: PR-5581","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.22.1.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-22-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.22.1.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-22-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.22.1.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-22-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Change timeout to infinity for gen_server calls in cth_log_redirect\n\n Own Id: OTP-18363 Aux Id: ERIERL-879","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.22.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-22-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.22 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-22"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Before this change, group handling grammar was ambiguous and also group paths\n did not support test specs.\n\n Own Id: OTP-17664 Aux Id: GH-5088, PR-5242\n\n- Before this change, it was not possible to link to a particular header entry\n in Common Test log. Change adds right aligned anchor icons in HTML test logs.\n\n Own Id: OTP-17790 Aux Id: PR-5375","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.21 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-21"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Float allowed as multiply_timetraps parameter.\n\n Own Id: OTP-17413 Aux Id: PR-4767\n\n- Remove usage of legacy API macro and functions.\n\n Own Id: OTP-17632 Aux Id: PR-5022","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.20.5 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- An incoming NETCONF notification received before a call to\n ct_netconfc:create_subscription/\\* caused the connection process to fail with\n badarg. Unexpected notifications are now logged in the same way as other\n unexpected messages.\n\n Own Id: OTP-17506","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Add 'receiver' option to ct_netconfc\n\n To allow a destination for incoming NETCONF notifications to be specified at\n sessions creation. Previously, a caller of create_subscription/\\* became the\n destination, but RFC 5277 create-subscription is no longer the only way in\n which NETCONF notifications can be ordered.\n\n Own Id: OTP-17509","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.20.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.20.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The option `release_shell` could crash when used together with the `spec`\n option.\n\n Own Id: OTP-16940 Aux Id: ERL-1335","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- Fixed warnings in code matching on underscore prefixed variables.\n\n Own Id: OTP-17385 Aux Id: OTP-17123","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.20.2.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-2-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.20.2.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- An incoming NETCONF notification received before a call to\n ct_netconfc:create_subscription/\\* caused the connection process to fail with\n badarg. Unexpected notifications are now logged in the same way as other\n unexpected messages.\n\n Own Id: OTP-17506","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Add 'receiver' option to ct_netconfc\n\n To allow a destination for incoming NETCONF notifications to be specified at\n sessions creation. Previously, a caller of create_subscription/\\* became the\n destination, but RFC 5277 create-subscription is no longer the only way in\n which NETCONF notifications can be ordered.\n\n Own Id: OTP-17509","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.20.2.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.20.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Before this change Config leaked between test groups in case of a subgroup was\n skipped (GH-3480).\n\n Own Id: OTP-17347 Aux Id: GH-3480,ERL-1439","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.20.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- A race condition could cause ct_netconfc:open/_ to return a dysfunctional\n handle, resulting in errors when invoking other api functions on it, and\n making it impossible to establish a new connection to the server in question.\n Similar symptoms were possible with open/_ in modules ct_ssh and ct_telnet.\n\n Internal messages from common_test processes could be left in the caller's\n message queue after a timeout when invoking call/\\* in modules ct_netconfc and\n ct_ssh. An internal process used by module ct_telnet could leak memory due to\n stray messages.\n\n Calls to ct_telnet:open/\\* and ct_telnet:get_data/1 could hang indefinitely if\n the TCP connection to the server was lost.\n\n Own Id: OTP-17328 Aux Id: ERIERL-631","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.20 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-20"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Various address sanitizer support.\n\n Own Id: OTP-16959 Aux Id: PR-2965","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.19.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-19-1"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Add behaviour for test suites\n\n Own Id: OTP-17070","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.19 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-19"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The function `ct_property_test:init_tool/1` is added for the cases when the\n user does not want ct_property_test to compile properties. init_tool/1 can be\n used to set the property_test_tool config value.\n\n Own Id: OTP-16029 Aux Id: PR-2145\n\n- The built-in Common Test Hook, `cth_log_redirect`, has been updated to use the\n system `default` Logger handler's configuration instead of its own. See the\n section on [Built-in Hooks](ct_hooks_chapter.md#built-in-cths) in the Common\n Test User's Guide.\n\n Own Id: OTP-16273\n\n- Calls of deprecated functions in the\n [Old Crypto API](`e:crypto:new_api.md#the-old-api`) are replaced by calls of\n their [substitutions](`e:crypto:new_api.md#the-new-api`).\n\n Own Id: OTP-16346","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.18.2.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-18-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.18.2.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-18-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.18.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-18-2"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Document incl_apps cover option\n\n Own Id: OTP-16039 Aux Id: ERL-795\n\n- The `ct_property_test` has now a report function for results of stateful\n testing.\n\n Own Id: OTP-16340\n\n- Don't hide error reasons from user\n\n Own Id: OTP-16364 Aux Id: PR-2480","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.18.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-18-1"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The ct_property_test logging is improved.\n\n Own Id: OTP-16287","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.18 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-18"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Add ct_netconfc support for NETCONF 1.1 (RFC 6241). The 1.1 base capability\n can be sent in hello, and RFC 6242 chunk framing is applied when both client\n and server advertise 1.1 support.\n\n Own Id: OTP-15789\n\n- Correct lib_dir paths in common_tests opaque data structure that is passed to\n ct_release_test callback modules in functions upgrade_init/2,\n upgrade_upgraded/2 and upgrade_downgraded/2. The incorrect paths may cause\n confusion when debugging although it will not cause any incorrect behavior on\n the part of common_test as it is currently not used.\n\n Own Id: OTP-15934","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.17.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-17-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Use `ssh` instead of `rsh` as the default remote shell.\n\n Own Id: OTP-15633 Aux Id: PR-1787","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.17.2.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-17-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.17.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-17-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The test result when a hook function fails is in general the same as if the\n function that the hook is associated with fails. For example, if\n `post_init_per_testcase` fails the result is that the test case is skipped, as\n is the case when `init_per_testcase` fails.This, however, was earlier not true\n for timetrap timeouts or other error situations where the process running the\n hook function was killed. This is now corrected, so the error handling should\n be the same no matter how the hook function fails.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15717 Aux Id: ERIERL-334\n\n- In some rare cases, when two common_test nodes used the same log directory, a\n timing problem could occur which caused common_test to crash because it's log\n cache file was unexpectedly empty. This is now corrected.\n\n Own Id: OTP-15758 Aux Id: ERIERL-342","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Two new common_test hook functions are introduced:\n\n `post_groups/2`, which is called after `Suite:groups/0` \n `post_all/3`, which is called after `Suite:all/0`\n\n These functions allow modifying the return values from the `groups/0` and\n `all/0` functions, respectively.\n\n A new term, `{testcase,TestCase,RepeatProperties}` is now also allowed in the\n return from `all/0`. This can be used for repeating a single test case a\n specific number of times, or until it fails or succeeds once.\n\n Own Id: OTP-14746 Aux Id: ERIERL-143","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.17.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-17-1"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- OTP internal test improvements.\n\n Own Id: OTP-15716","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.17 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-17"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- A bug caused `ct:encrypt_config_file/3` and `ct:decrypt_config_file/3` to fail\n with `badmatch` if input parameter `KeyOrFile` was `{key,string()}`. This is\n now corrected.\n\n Own Id: OTP-15540\n\n- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new variant of the `newline` option to `ct_telnet:cmd/3` and\n `ct_telnet:send/3` is added, which allows to specify a string to append as\n newline indicator on a command. By default, the value is \"\\\\n\", but in some\n cases it is required to be \"\\\\r\\\\n\", which this option allows.\n\n A faulty regular expression given as parameter to `ct_telnet:expect/2,3` would\n earlier crash and look like an internal error in common_test. A better error\n indication is now given, but the test case will still fail.\n\n Own Id: OTP-15229 Aux Id: ERIERL-203\n\n- Since the yang RFC allows more than one top element of config data in an\n `edit-config` element, `ct_netconfc:edit_config/3,4,5` can now take a list of\n XML elements.\n\n Own Id: OTP-15298","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.16.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-16-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The Logger handler cth_log_redirect earlier called the report callback\n (report_cb) before calling the logger formatter. In some cases this would\n fail, since cth_log_redirect could not handle report callbacks with two\n arguments. This is now corrected, so only the formatter will call the report\n callback.\n\n Own Id: OTP-15307","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.16 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-16"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Use the compiler option `nowarn_export_all` to disable `export_all` warnings\n when automatically compiling test suites.\n\n Own Id: OTP-14810\n\n- Use uri_string module instead of http_uri.\n\n Own Id: OTP-14902","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.15.4.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4-4"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The ct_property_test logging is improved.\n\n Own Id: OTP-16287","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.15.4.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.15.4.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The test result when a hook function fails is in general the same as if the\n function that the hook is associated with fails. For example, if\n `post_init_per_testcase` fails the result is that the test case is skipped, as\n is the case when `init_per_testcase` fails.This, however, was earlier not true\n for timetrap timeouts or other error situations where the process running the\n hook function was killed. This is now corrected, so the error handling should\n be the same no matter how the hook function fails.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15717 Aux Id: ERIERL-334\n\n- In some rare cases, when two common_test nodes used the same log directory, a\n timing problem could occur which caused common_test to crash because it's log\n cache file was unexpectedly empty. This is now corrected.\n\n Own Id: OTP-15758 Aux Id: ERIERL-342","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Two new common_test hook functions are introduced:\n\n `post_groups/2`, which is called after `Suite:groups/0` \n `post_all/3`, which is called after `Suite:all/0`\n\n These functions allow modifying the return values from the `groups/0` and\n `all/0` functions, respectively.\n\n A new term, `{testcase,TestCase,RepeatProperties}` is now also allowed in the\n return from `all/0`. This can be used for repeating a single test case a\n specific number of times, or until it fails or succeeds once.\n\n Own Id: OTP-14746 Aux Id: ERIERL-143\n\n- OTP internal test improvements.\n\n Own Id: OTP-15716","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.15.4.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.15.4.0.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.15.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Fixed problem with 'skip_groups' in combination with 'all suites' option in\n test specification.\n\n Own Id: OTP-14953","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.15.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-3"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new function, `ct:remaining_test_procs/0`, returns the identity of test- and\n group leader processes that are still running at the time of the call.\n\n Own Id: OTP-13832\n\n- A \"latest test result\" link is now displayed in the footer of each test index\n page, which performs a jump to the most recently generated test index. This is\n useful for making quick comparisons of results between test runs without\n having to traverse the log file tree.\n\n Own Id: OTP-14281","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.15.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-2"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- General Unicode improvements.\n\n Own Id: OTP-14462","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.15.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- In OTP-20.0, the behavior of c, make, and ct_make was changed so that in some\n cases the beam files by default would be written to the directory where the\n source files were found. This is now changed back to the old behavior so beam\n files are by default written to current directory.\n\n Own Id: OTP-14489 Aux Id: ERL-438","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.15 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-15"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Errors in the documentation for user HTML stylesheets have been corrected.\n\n Own Id: OTP-14332 Aux Id: seq13299\n\n- Internal code change: Calls to `catch` followed by a call to\n `erlang:get_stacktrace/0` has been rewritten to use `try` instead of `catch`\n to make the code future-proof.\n\n Own Id: OTP-14400","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The `ct_slave` modules now handle nodenames in the same way as nodenames\n passed to `-sname`. That means `ct_slave:start('b@127.0.0.1').` will now work.\n\n Own Id: OTP-13806\n\n- Added the new option, `keep_logs`. If setting the value for this option to an\n integer, N, common_test will remove all ct_run.\\* directories in the current\n log directory, except the N newest.\n\n Own Id: OTP-14179\n\n- The existing `ct_netconfc:open/1,2` opens an SSH connection with one SSH\n channel realizing one Netconf session. To allow testing of multiple sessions\n over the same SSH connection, the following functions are added to\n `ct_netconfc`:\n\n \\* `connect/1,2` \\- establish an SSH connection _ `disconnect/1` \\- close the\n given SSH connection _ `session/1,2,3` \\- open an ssh channel on the given\n connection and send 'hello' to start a Netconf session\n\n Own Id: OTP-14284\n\n- Miscellaneous updates due to atoms containing arbitrary Unicode characters.\n\n Own Id: OTP-14285\n\n- The function ct_ssh:shell/2,3 is added.\n\n Own Id: OTP-14415 Aux Id: seq13315","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.14 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-14"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The following corrections and improvements are done in the common_test hook\n handling:\n\n - An extra argument, `Suite`, is added as the first argument to each of the\n following hook callback functions:\n\n - `pre_init_per_group`\n - `post_init_per_group`\n - `pre_end_per_group`\n - `post_end_per_group`\n - `pre_init_per_testcase`\n - `post_init_per_testcase`\n - `pre_end_per_testcase`\n - `post_end_per_testcase`\n - `on_tc_fail`\n - `on_tc_skip`\n\n For backwards compatibility, if the new function is not exported from a hook\n callback module, `common_test` will fall back to the old interface and call\n the function without the `Suite` argument.\n\n - If either `init_per_suite` or `end_per_suite` exists, but not the other,\n then the non-existing function will be reported as failed with reason\n `undef` in the test log. The same goes for `init/end_per_group`. This has\n always been a requirement according to the user's guide, but now\n `common_test` is more explicit in the report.\n - If `init_per_suite` was exported from a test suite, but not `end_per_suite`,\n then `pre/post_end_per_suite` was called with `Suite=ct_framework` instead\n of the correct suite name. This is now corrected.\n - If `end_per_group` was exported from a suite, but not `init_per_group`, then\n `end_per_group` was never called. This is now corrected.\n - Tests that were skipped before calling `pre_init_per_*` got faulty calls to\n the corresponding `post_init_per_*`. E.g. if a test was skipped because\n `suite/0` failed, then `post_init_per_suite` would be called even though\n `pre_init_per_suite` and `init_per_suite` were not called. This is now\n corrected so a `post_*` callback will never be called unless the\n corresponding `pre_*` callback has been called first.\n - Tests that were skipped before or in `init_per_testcase` got faulty calls to\n `pre_end_per_testcase` and `post_end_per_testcase`. This is now corrected so\n `pre/post_end_per_testcase` are not called when `end_per_testcase` is not\n called.\n - If an exit signal causes the test case process to die while running\n `init_per_testcase`, the case was earlier reported as failed with reason\n `{skip,...}`. This is now corrected so the case will be marked as skipped.\n - If an exist signal causes the test case process to die while running\n `end_per_testcase`, the case was earlier marked as failed. This is now\n corrected so the status of the test case is not changed - there is only a\n warning added to the comment field.\n - If a test case was skipped because of option `{force_stop,skip_rest}` or\n because of a failed sequence, then no `tc_start` event would be sent, only\n `tc_done`. This is now corrected so both events are sent.\n - When skipping or failing in a configuration function, the configuration\n function itself would get `{auto_skipped,Reason}`, `{skipped,Reason}` or\n `{failed,Reason}` in the hook callbacks `on_tc_skip` or `on_tc_fail`. The\n other test cases that were skipped as a result of this would only get\n `Reason` in `on_tc_skip`. This is now corrected so even the configuration\n function that caused the skip/fail will only get `Reason` in the hook\n callback.\n\n Own Id: OTP-10599 Aux Id: kunagi-344 \\[255]\n\n- When a test case was skipped by a `skip_cases` statement in a test spec, then\n `cth_surefire` would erroneously mark the previous test case as skipped in the\n xml report. The actually skipped test case would not be present in the xml\n report at all. This is now corrected.\n\n Own Id: OTP-14129 Aux Id: seq13244\n\n- The `multiply_timetraps` and `scale_timetraps` options did not work with test\n specifications, which has been corrected.\n\n Own Id: OTP-14210","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- ct_testspec:get_tests/1 is added. This is used by rebar3 to get all\n directories that must be compiled when running tests from testspec - instead\n of implementing testspec parsing in rebar3.\n\n Own Id: OTP-14132","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.13 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-13"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Some types of printouts to screen during test runs (including\n `ct:print/1,2,3,4`) used the local `user` process as IO device and these\n printouts would not be visible when e.g. running tests via a shell on a remote\n node. A default Common Test group leader process has been introduced to solve\n the problem. This process routes printouts to the group leader of the starting\n process, if available, otherwise to `user`.\n\n Own Id: OTP-13973 Aux Id: ERL-279\n\n- Some Common Test processes, that act as I/O group leaders for test cases,\n would not terminate as expected at the end of test runs. This error has been\n corrected.\n\n Own Id: OTP-14026 Aux Id: ERL-287\n\n- The logging verbosity feature was incorrectly documented. The default\n verbosity levels for test runs is e.g. not 50 (`?STD_VERBOSITY`), but 100\n (`?MAX_VERBOSITY`). Also, some of the examples had errors and flaws. The\n corresponding chapter (5.18) in the User's Guide has been updated.\n\n Own Id: OTP-14044 Aux Id: seq13223","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A feature to let the user specify headings to log printouts has been added.\n The heading is specified as `{heading,string()}` in the `Opts` list argument\n to `ct:pal/3,4,5`, `ct:print/3,4,5`, or `ct:log/3,4,5`. If the heading option\n is omitted, the category name, or `\"User\"`, is used as the heading instead.\n\n Own Id: OTP-14043 Aux Id: seq13226","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.12.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-12-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If the telnet server would pause during transmission of a line of text before\n terminating the line, the `ct_telnet:expect/3` function would print the line\n twice in the test case HTML log. This problem has been fixed.\n\n Own Id: OTP-13730 Aux Id: seq13135\n\n- The functions `ct:set_verbosity/2` and `ct:get_verbosity/1` have been added in\n order to make it possible for test cases, CT Hooks, or test framework\n functions, to modify and read verbosity levels for logging.\n\n Own Id: OTP-13841\n\n- `make` (tools) and `ct_make` (common_test) would crash if an Erlang source\n file contained a `-warning()` directive.\n\n Own Id: OTP-13855","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.12.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-12-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The following modules were missing in common_test.app.src: ct_groups,\n ct_property_test, ct_release_test, ct_webtool, ct_webtool_sup, test_server_gl.\n They have now been added.\n\n Own Id: OTP-13475\n\n- Common Test printed incorrect timestamps for received error reports.\n\n Own Id: OTP-13615 Aux Id: seq13124","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.12.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-12-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The `nodelay` option used to be enabled (`true`) by default for sockets opened\n by the Common Test telnet client. This appeared to cause communication\n problems with telnet servers on some systems, and therefore the option is no\n longer used. Its value may instead be specified in the telnet connection\n settings. See the man page for `ct_telnet` for details. Please note that the\n interface function `connect` in `unix_telnet` has been updated with an extra\n argument and is now `unix_telnet:connect/7`.\n\n Own Id: OTP-13462 Aux Id: seq13077\n\n- Fix bug in cth_surefire: When a pre_init_per_suite hook fails before reaching\n the cth_surefire:pre_init_per_suite, cth_surefire produced incorrect XML.\n\n Own Id: OTP-13513\n\n- The `ct:get_timetrap_info/0` function has been updated to return more\n information about timetrap scaling.\n\n Own Id: OTP-13535\n\n- A problem with stylesheet HTML tags getting incorrectly escaped by Common Test\n has been corrected.\n\n Own Id: OTP-13536\n\n- The `ct_run` start flag `-no_esc_chars` and `ct:run_test/1` start option\n `{esc_chars,Bool}` have been introduced to make it possible to disable\n automatic escaping of characters. Automatic escaping of special HTML\n characters printed with `io:format/1,2` and `ct:pal/1,2,3,4` was introduced in\n Common Test 1.12. The new flag/option may be used to disable this feature for\n backwards compatibility reasons. (The option is also supported in test\n specifications).\n\n Own Id: OTP-13537","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.12 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-12"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- This update fixes the problem with generic printouts in the html log file not\n having special characters escaped. Printouts made with `io:format/2` and\n `ct:pal/2` will now get special characters escaped automatically. Common Test\n will not attempt to escape characters printed with `ct:log/2` since it is\n assumed that the user may want to print html tagged data using this function.\n A new function, `ct:log/5`, has been added, which offers optional escaping of\n characters. The latter function may also be used to print text to the log\n without headers and CSS class wrapping (analogue to `io:format/2`).\n\n Own Id: OTP-13003 Aux Id: seq13005\n\n- Commit 4cf832f1ad163f5b25dd8a6f2d314c169c23c82f erroneously removed logging of\n open and close of netconf connections. This is now corrected.\n\n Own Id: OTP-13386\n\n- The directory to which nodes started with `test_server:start_node/3` writes\n their erl_crash.dump is changed. The crashdumps were earlier written to the\n directory of test_server.beam, but in later versions of Microsoft Windows this\n is no longer writable (even for administrators). The framework (common_test)\n log directory is now used instead.\n\n Own Id: OTP-13388","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- This update makes it possible to specify multiple instances of the same group\n or test case in one test specification term in order to repeat execution.\n Example:\n `{groups, \"./\", my_SUITE, [my_group, my_group], {cases, all}}, or {cases, \"./\", my_SUITE, [my_tc, my_tc, my_tc]}.`\n\n Own Id: OTP-13241 Aux Id: seq12979\n\n- Two new CT hook functions have been added: `post_init_per_testcase/4` and\n `pre_end_per_testcase/3`. With these hook functions, it is possible to perform\n arbitrary actions (including modifications of test execution, test state and\n results) immediately before and after the execution of the test case.\n\n Own Id: OTP-13242 Aux Id: seq12991\n\n- The `ct_netconfc` was earlier very restrictive as to which SSH options the\n user could set. This is now changed, and any SSH option is now allowed. The\n netconf client will simply pass on any option, which it does not recognize, to\n SSH.\n\n Own Id: OTP-13338 Aux Id: seq13053,seq13069","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.11.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-11-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If a ssh package contained more than one netconf end tag, then the second end\n tag was never detected in ct_netconfc:handle_data. Instead it was included in\n the XML data given to the xmerl parser, which then failed. The problem was\n introduced by OTP-13007, and has now been corrected.\n\n Own Id: OTP-13323","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.11.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- When data from the netconf server was split into many ssh packages, the\n netconf client performed really bad. This is now improved.\n\n Own Id: OTP-13007\n\n- In ct_netconfc, if a timer expired 'at the same time' as the server sent the\n rpc-reply, the timeout message might already be in the client's message queue\n when the client removed the timer ref from its 'pending' list. This caused a\n crash in the client since the timer ref could no longer be found when handling\n the timeout message. This problem is now fixed by always flushing the timeout\n message from the message queue when canceling a timer.\n\n Own Id: OTP-13008\n\n- The error logger handler ct_conn_log_h did not respect the 'silent' option,\n and tried to print to an undefined file descriptor. This has been corrected.\n\n Own Id: OTP-13035\n\n- If the user would let the test run proceed after test suite compilation\n failure, Common Test did not set the exit status to indicate failure as\n expected. This has been corrected. Also, the 'abort_if_missing_suites' option\n now makes Common Test abort the test run without asking the user if\n compilation fails, even if access to stdin/stdout exists.\n\n Own Id: OTP-13173 Aux Id: seq12978\n\n- With the Common Test 'create_priv_dir' start option set to 'auto_per_tc', the\n name of the priv directory for a configuration function could clash with the\n name of the priv directory for a test case, which would cause Test Server\n failure. This error has been corrected.\n\n Own Id: OTP-13181","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.11 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The status of an aborted test due to test suite compilation error has changed\n from 'auto_skipped' to 'failed'. This affects both the textual log file, event\n handling and CT hook callbacks. The logging of compilation failures has also\n been improved, especially in the case of multiple test suites failing\n compilation.\n\n Own Id: OTP-10816\n\n- The Test Server source code parser (erl2html2) failed to handle the macro\n tuple in the syntax tree returned by epp_dodger. This error has been\n corrected.\n\n Own Id: OTP-12740\n\n- New options to make it possible to specify ssh_port in a .spec file:\n \\[\\{node_start, [\\{ssh_port, 9999\\}]\\}].\n\n And also to specify additional ssh options like paths to public-key files:\n \\[\\{node_start, [\\{ssh_opts, [\\{user_dir, \"/home/shrek/e2/\"\\}]\\}]\\}].\n\n Own Id: OTP-12809","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Earlier there was no way to add optional parameters like default-operation to\n an edit-config request sent with ct_netconfc:edit_config/3,4, you had to use\n ct_netconfc:send_rpc/2,3. For simplicity and completion, a new optional\n argument, OptParams, is now added to the edit_config function.\n\n Own Id: OTP-10446 Aux Id: kunagi-266 \\[177]\n\n- When running OTP tests using the ts interface, it is now possible to specify\n so called test categories per OTP application. A test category is represented\n by a CT test specification and defines an arbitrary subset of existing test\n suites, groups and cases. Examples of test categories are 'smoke' (smoke\n tests) and 'bench' (benchmarks). (Call ts:help() for more info). Also,\n functions for reading terms from the current test specification during test,\n ct:get_testspec_terms/0 and ct:get_testspec_terms/1, have been implemented.\n\n Own Id: OTP-11962\n\n- Obsolete scripts and make file operations have been removed and the\n installation chapter in the Common Test User's Guide has been updated.\n\n Own Id: OTP-12421\n\n- The 'keep_alive' interval has been reduced to 8 seconds, which is two seconds\n shorter than the default 'idle_timeout' value for ct_telnet:expect/3. This\n way, the telnet server receives a NOP message (which might trigger an action)\n before the operation times out. Also the TCP option 'nodelay' has been enabled\n per default for all telnet connections, in order to reduce the risk for\n communication timeouts.\n\n Own Id: OTP-12678 Aux Id: seq12818\n\n- When the ct_run program is executed without any flags, \"-dir .\" is now used as\n default start flag. Similarly, the option \\{dir,\".\"\\} is used by ct:run_test/1\n if called with an empty list. Also, the help text (ct_run -help) has been\n updated, as well as the Running Tests chapter in the Common Test User's Guide.\n\n Own Id: OTP-12684 Aux Id: seq12865","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.10.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- A fault in the Common Test logger process, that caused the application to\n crash when running on a long name node, has been corrected.\n\n Own Id: OTP-12643\n\n- A 'wait_for_prompt' option in ct_telnet:expect/3 has been introduced which\n forces the function to not return until a prompt string has been received,\n even if other expect patterns have already been found.\n\n Own Id: OTP-12688 Aux Id: seq12818\n\n- If the last expression in a test case causes a timetrap timeout, the stack\n trace is ignored and not printed to the test case log file. This happens\n because the \\{Suite,TestCase,Line\\} info is not available in the stack trace\n in this scenario, due to tail call elimination. Common Test has been modified\n to handle this situation by inserting a \\{Suite,TestCase,last_expr\\} tuple in\n the correct place and printing the stack trace as expected.\n\n Own Id: OTP-12697 Aux Id: seq12848\n\n- Fixed a buffer problem in ct_netconfc which could cause that some messages\n where buffered forever.\n\n Own Id: OTP-12698 Aux Id: seq12844\n\n- The VTS mode in Common Test has been modified to use a private version of the\n Webtool application (ct_webtool).\n\n Own Id: OTP-12704 Aux Id: OTP-10922\n\n- Add possibility to add user capabilities in `ct_netconfc:hello/3`.\n\n Own Id: OTP-12707 Aux Id: seq12846","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.10 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The tests overview file, index.html, did not always get updated correctly\n after a new test run. This was because of a bug in the Common Test log cache\n mechanism which has now been corrected.\n\n Own Id: OTP-11400\n\n- When a successful test case returns, Common Test should, according to the\n documentation, send a tc_done event to the event handlers with Result = ok in\n the data field. However, Common Test sets Result to the return value of the\n test case instead. Common Test has been modified now to comply with the\n documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12279 Aux Id: seq12737, OTP-12531\n\n- A ct_telnet:expect/3 call could never be aborted before an idle_timeout, even\n if total_timeout had been set to a lower value (i.e. a shorter time). This\n problem has been fixed.\n\n Own Id: OTP-12335\n\n- The undocumented return value \\{skipped,Reason\\} from config functions and\n test cases was handled inconsistently. Test cases were e.g. reported as\n \"skipped\" to CT Hook functions, but \"successful\" to event handlers. Now, the\n above return value is consistently handled the same way as \\{skip,Reason\\} and\n this has also been documented.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12359 Aux Id: seq12760\n\n- The Erlang source code to HTML generator would sometimes fail because\n epp:parse_erl_form/1 could not find and expand required macros in included\n header files. The problem has been solved by making sure common_test always\n passes the full include path to epp. Also, a bug that could cause\n erl_syntax:revert/1 to fail because of a badly formed syntax tree has been\n corrected.\n\n Own Id: OTP-12419\n\n- A missing group option in the ct_run help text has been added.\n\n Own Id: OTP-12433 Aux Id: seq12788\n\n- Printouts by means of ct:log/2/3 or ct:pal/2/3 from the hook functions\n on_tc_fail/2 and on_tc_skip/2 would (quite unexpectedly) end up in the\n \"unexpected i/o\" log file instead of in the test case log file. This behaviour\n has been changed so that now, all printouts (including stdio printouts) from\n these hook functions will be routed to the test case log file.\n\n Own Id: OTP-12468\n\n- ct_netconfc:action/3 will now - if the return type is void - accept an RPC\n reply on the form \\{ok,\\[simple_xml()]\\}, and in this event return only the\n atom ok.\n\n Own Id: OTP-12491 Aux Id: seq12797\n\n- OTP-11971 erroneously changed the handling of relative paths for incl_dirs\n specified in the cover spec file. This is now corrected so these are expected\n to be relative to the directory where the cover spec file itself is stored\n\n Own Id: OTP-12498 Aux Id: OTP-11971\n\n- Some test cases have been updated to use ct:sleep/1 instead of timer:sleep/1.\n The reason being that the sleep times need to be scaled to compensate for slow\n execution (e.g. when cover is running).\n\n Own Id: OTP-12574","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Common Test now exports a function, ct:get_event_mgr_ref/0, that returns the\n name of the Common Test event manager. This makes it possible to plug in event\n handlers to the event manager while tests are running (using the gen_event\n API).\n\n Own Id: OTP-12506 Aux Id: seq12802\n\n- When a test case (or configuration function) fails because of an exit signal\n from a linked process, Common Test previously passed only the reason for\n process termination to the CT post hook functions and the event handlers (in\n the tc_done event). This has been changed so that now the tuple\n \\{'EXIT',ReasonForProcessTermination\\} is passed instead. This makes it much\n easier in the CT post hook functions to distinguish a failure of this sort\n from other types of errors and from the return value of a successful test\n case.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12531 Aux Id: OTP-12279\n\n- A new feature has been introduced in ct_telnet:get_data/1 that makes it\n possible to automatically poll the telnet connection in case an incomplete\n string (one that has not yet been terminated by a newline) remains in the\n receive buffer. The polling is controlled by two new telnet config values,\n which are documented in the ct_telnet reference manual. The polling mechanism\n is disabled by default (making the get_data/1 function backwards compatible).\n\n Own Id: OTP-12627","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.9 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The source code to html code generator in Test Server (and Common Test) would\n fail to generate anchors in the html code for functions with non-expandable\n macros, resulting in bad html links to such functions. This correction lets\n the code generator ignore macros that can't be expanded (i.e. not pre-process\n them), so that correct anchors will always be produced.\n\n Own Id: OTP-11766 Aux Id: seq12556\n\n- OTP-11971 erroneously changed the handling of relative paths (import/export\n files) specified in the cover spec file. This is now corrected so these are\n expected to be relative to the directory where the cover spec file itself is\n stored.\n\n Own Id: OTP-12031\n\n- Common Test would sometimes crash while trying to print large amounts of SASL\n reports to log on a computer with a slow file system. This problem (due to an\n error in IO message buffering in ct_logs) has been fixed.\n\n Own Id: OTP-12159\n\n- The common_test telnet client, ct_telnet and friends, had some unstable test\n cases. Some of these were caused by the unix_telnet callback sending an extra\n newline after sending the password. This caused the sever to send an extra\n prompt back which confused the tests. The extra newline is no longer sent.\n\n Also, debug printouts and logging from the telnet client is improved, and some\n test cases are slightly modified in order to stabilize the test.\n\n Own Id: OTP-12329\n\n- ct_netconfc did not expect the return value \\{error,timeout\\} from\n ssh_connection:subsystem/4. This has been corrected.\n\n Own Id: OTP-12334","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new option, `{newline,boolean()}` is added to all functions in `ct_telnet`\n that send data (command strings) to the telnet server. By default, `ct_telnet`\n adds a newline to all command strings, and by setting the new option to\n `false` this behavior is turned off.\n\n Own Id: OTP-12252 Aux Id: seq12730\n\n- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.8.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-8-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Ticket OTP-11971 introduced a runtime dependency towards test_server-3.7.1,\n since the interface between test_server and common_test was changed.\n Erroneously, the common_test.app file was not updated according to this. This\n has now been corrected.\n\n Own Id: OTP-12037","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Warning: this is experimental and may disappear or change without previous\n warning.\n\n Experimental support for running Quickcheck and PropEr tests from common_test\n suites is added to common_test. See the reference manual for the new module\n `ct_property_testing`.\n\n Experimental property tests are added under\n `lib/{inet,ssh}/test/property_test`. They can be run directly or from the\n commont_test suites `inet/ftp_property_test_SUITE.erl` and\n `ssh/test/ssh_property_test_SUITE.erl`.\n\n See the code in the `test` directories and the man page for details.\n\n (Thanks to Tuncer Ayaz for a patch adding Triq)\n\n Own Id: OTP-12119","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.8.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Substrings in long telnet messages would sometimes get wrongly reversed. This\n error has been corrected.\n\n Own Id: OTP-11871 Aux Id: seq12581\n\n- The basic_html logging mode in Common Test (for compatibility with old\n browsers) generated HTML code with unbalanced tags. This has been fixed.\n\n Own Id: OTP-11917 Aux Id: seq12598\n\n- The mechanism for running code cover analysis with common_test has been\n improved. Earlier, if a test run consisted of multiple tests, cover would be\n started and stopped for each test. This would give \"intermediate\" cover logs\n available from the \"Coverage log\" link on the test suite result pages. To\n accumulate cover data over all tests, the 'export' option had to be used in\n the cover spec file. This was not well documented, and the functionality was\n quite confusing.\n\n Using the 'nodes' option in the cover spec file would fail when the test run\n consisted of multiple tests, since the specified nodes would only be included\n in the cover analysis of the first test.\n\n The repeated compilation and analysis of the same modules was also very time\n consuming.\n\n To overcome these problems, ct will now only cover compile and analyze modules\n once per test run, i.e. once for each cover spec file. The log file is\n available via a new button on the top level index page. The old \"Coverage log\"\n links on the test suite result pages still exist, but they all point to the\n same log containing the accumulated result.\n\n Own Id: OTP-11971\n\n- If multiple tests would run simultaneously on different Erlang nodes, writing\n their logs to the same directory, then there would often be entries in the\n all_runs.html log file showing incomplete results (all zeroes) upon\n completion. This problem was caused by a bug in the Common Test log cache\n mechanism, which has been fixed.\n\n Own Id: OTP-11988 Aux Id: seq12611","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.8 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The error generated if a test case process received an exit from a linked\n process while executing init_per_testcase/2, was handled incorrectly by Common\n Test. The problem has been solved, and Common Test now reports this type of\n error correctly, with proper error reason and exit location as well.\n\n Own Id: OTP-11643\n\n- Running a parallel test case group with two or more instances of the same test\n case would result in identical log file names, and one test case instance\n would overwrite the log file of another. This problem has been solved.\n\n Own Id: OTP-11644\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744\n\n- The `cth_surefire` hook would crash in `pre_init_per_suite/3` if a previous\n hook returned `{skip,Reason}` or `{fail,Reason}` instead of a `Config` list.\n This error has been corrected, and `cth_surefire` will now simply propagate\n the received `InitData` value instead.\n\n Own Id: OTP-11811\n\n- Specs of return values are corrected for `ct_netconfc:get/2,3`,\n `ct_netconfc:get_config/3,4`, `ct_netconfc:action/2,3`,\n `ct_netconfc:send_rpc/2,3` and `ct_netconfc:send/2,3`.\n\n Own Id: OTP-11834 Aux Id: seq12574","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- ct_telnet can now log all communication taking place during a telnet session.\n Previously, only information about ct_telnet operations and commands, as well\n as explicitly requested data from the server, was logged.\n\n Furthermore, a logging mechanism based on an Error Logger event handler and a\n dedicated Common Test hook, `cth_conn_log`, now makes it possible to print\n data for individual connections to separate log files. Please see the\n `ct_telnet` reference manual for more information and examples.\n\n Important note: A new argument, `ConnName` has been added to the\n `unix_telnet:connect/5` callback function. This forces users that use private\n ct_telnet callback modules to update their code according to\n `unix_telnet:connect/6`. Please see the `unix_telnet` reference manual and\n source code module for details.\n\n Own Id: OTP-11440 Aux Id: seq12457\n\n- A new timeout option has been introduced for the `ct_telnet:expect/3`\n function. With `{total_timeout,Time}` it's possible to set a time limit for\n the complete expect operation. After `Time` milliseconds, `expect/3` returns\n `{error,timeout}`. The default value used if `total_timeout` is not specified,\n is infinity (i.e. no time limit). Please see the `ct_telnet` reference manual\n for more information.\n\n Own Id: OTP-11689\n\n- Some function specs are corrected or moved and some edoc comments are\n corrected in order to allow use of edoc. (Thanks to Pierre Fenoll)\n\n Own Id: OTP-11702\n\n- Test case group name information has been added to the data sent with\n `tc_user_skip` and `tc_auto_skip` event messages, as well as the data passed\n in calls to the CT Hook functions `on_tc_skip/3` and `on_tc_fail/3`. The\n modification only affects the function name element/argument. This value\n remains an atom if the test case in question does not belong to a test case\n group. Otherwise a tuple `{FuncName,GroupName}` (`{atom(),atom()}`) is passed\n instead.\n\n Note that this change may (depending on the patterns used for matching)\n require modifications of user event handlers and hook modules. Please see the\n Event Handling chapter in the Common Test User's Guide, and the reference\n manual for `ct_hooks`, for details.\n\n Note also that the Test Server framework callback function `report/2` has been\n modified. This change only affects users with test frameworks interfacing Test\n Server rather than Common Test. See the `test_server_ctrl` reference manual\n for details.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-11732 Aux Id: seq12541\n\n- If Common Test can't prompt the user to abort or continue the test run when\n one or more test suites fail to compile, a new option,\n `{abort_if_missing_suites,Bool}`, can be used to specify whether it should\n proceed with the test run, or stop execution. The default value of `Bool` is\n `false` (i.e. to proceed even if suites are missing).\n\n Own Id: OTP-11769","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- common_test: Fix problems reported by Dialyzer.\n\n Own Id: OTP-11525","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.7.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-7-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Return values from group and testcase info functions are now properly checked,\n and associated test cases are auto skipped if a return value is invalid.\n\n Own Id: OTP-10631 Aux Id: kunagi-345 \\[256]\n\n- The way Common Test handles skipping of test cases has been updated. In\n previous versions, returning `{skip,Reason}` from a configuration function\n (such as init_per_suite or init_per_group), resulted in all affected test\n cases getting skipped with status `auto_skipped`. This was inappropriate,\n since this status is supposed to be used to inform that Common Test has taken\n the initiative to skip something (e.g. a test case group if init_per_group\n failed). Therefore, in this version of Common Test, whenever the user skips a\n suite, group, or individual test case (by means of a configuration function or\n test specification term), the affected test cases get the status\n `user_skipped` instead.\n\n This update has meant a few changes that may affect Common Test users in\n various ways:\n\n - The test results and statistics will be affected, which is important to know\n when running regression tests and comparing results to previous test runs.\n - Users that read or parse the textual log file `suite.log` will notice that\n an auto skipped function is now reported as `auto_skipped` rather than\n `skipped` as before.\n - When `require` fails in an info function (such as suite/0 or group/1), all\n affected configuration functions and test cases are marked as\n `auto_skipped`.\n - If Common Test detects an error in the test suite (such as e.g. an invalid\n all/0 function), all affected configuration functions and test cases are\n marked as `auto_skipped`.\n - If a repeated test run session reaches a deadline with `force_stop` enabled,\n all remaining test cases are marked as `auto_skipped` rather than\n `user_skipped` as before.\n - The event messages that Common Test generates during test runs have been\n affected by this update. For details see OTP-11524.\n\n Own Id: OTP-11305 Aux Id: OTP-11524\n\n- Returning \\{skip, Reason\\} from a pre_end_per_group/3 user hook function would\n result in an exit in the Common Test cth_log_redirect hook. This problem has\n been solved.\n\n Own Id: OTP-11409 Aux Id: seq12446\n\n- When the netconf server did not respond to the close-session request, the call\n to ct_netconfc:close_session/2 would hang forever waiting for the netconf\n client to terminate. This has been corrected. The client will now always\n terminate (and take down the connection) if the close-session request times\n out.\n\n Own Id: OTP-11478","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Fix cth_log_redirect.erl to fulfill gen_event behaviour. Thanks to Roberto\n Aloi.\n\n Own Id: OTP-11401\n\n- The first argument of the CT hook callback function `on_tc_skip/3` has been\n modified. When this function is called for `init_per_group` or\n `end_per_group`, the value of the first argument is now\n `{init_per_group,GroupName}` or `{end_per_group,GroupName}`.\n\n Own Id: OTP-11523\n\n- The following modifications have been made to the event messages that Common\n Test sends during test execution:\n\n - For the `tc_auto_skip` event, the value of the `Func` element has changed\n from `end_per_group` to `{end_per_group,GroupName}`.\n - When `require` fails in an info function, such as suite/0 or group/1, the\n init configuration function is now reported as `auto_skipped` instead of\n `skipped`, with the `tc_done` event.\n - When `require` fails in an info function because of a configuration name\n already in use, the `tc_done` event now reports the error with a tuple (of\n size 2) tagged `failed` instead of `skipped`.\n\n Please see the Event Handling chapter in the Common Test User's Guide for\n reference.\n\n Own Id: OTP-11524 Aux Id: OTP-11305","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.7.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-7-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Documentation is added for ct_netconfc:send and ct_netconfc:send_rpc.\n\n Own Id: OTP-11132\n\n- ct_netconfc:create_subscription only allowed one XML element inside the\n 'filter' element. According to RFC5277 it should be allowed to add any number\n of elements inside the filter, so this is now corrected.\n\n Own Id: OTP-11166\n\n- The error handler installed by the Common Test hook cth_log_redirect did not\n respond to init:stop/1/2. This has been corrected.\n\n Own Id: OTP-11175 Aux Id: seq12356\n\n- Calling ct:pal/2 or ct:print/2 when Common Test was not running, would cause\n an exit. This has been changed and the string is now simply printed to stdout\n instead.\n\n Own Id: OTP-11176\n\n- Fixed problem with the cth_log_redirect hook making calls to an undefined\n function in ct_logs.\n\n Own Id: OTP-11238\n\n- When running tests with the 'repeat' option, the Common Test utility process\n did not always terminate quickly enough after a test run, causing the start of\n the next run to fail. A monitor is now used to ensure termination of the\n utility process after each test run.\n\n Own Id: OTP-11244 Aux Id: seq12396\n\n- Test Server installed an error handler (test_server_h) only to be able to\n write the name of the current test case to stdout whenever it received an\n error- or progress report. This functionality was not useful and has been\n removed. The built-in Common Test hook, cth_log_redirect, has instead been\n improved to now also tag all error- and progress reports in the log with\n suite-, group-, and/or test case name.\n\n Own Id: OTP-11263 Aux Id: seq12251","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new log, the \"Pre- and Post Test I/O Log\", has been introduced, which makes\n it possible to capture error- and progress reports, as well as printouts made\n with ct:log/2 and ct:pal/2, before and after a test run. (Some minor\n improvements of the logging system have been made at the same time). Links to\n the new log are found on the Common Test Framework Log page. The Common Test\n User's Guide has been updated with information about the new log and also with\n a new section on how to synchronize external applications with Common Test by\n means of the CT Hook init and terminate functions.\n\n Own Id: OTP-11272","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.7.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-7-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- A design flaw in the generic connection handling in Common Test made it\n impossible to implement a connection handler that could map multiple\n connection names (i.e. configuration variable aliases) to single connection\n pids. This problem has been solved.\n\n Own Id: OTP-10126 Aux Id: kunagi-178 \\[89]\n\n- If a telnet connection is hanging, then a call to ct_telnet:close/1 will time\n out after 5 seconds and the connection process is brutally killed. In some\n cases the connection would not be unregistered and attempts at opening a new\n connection with the same name would make common_test try to reuse the same\n connection since it believed that it was still alive. This has been\n corrected - a killed connection is now always unregistered.\n\n Own Id: OTP-10648 Aux Id: seq12212\n\n- Test performance has been improved by means of a cache for the top level HTML\n index logs (all_runs.html and index.html, in the logdir directory). This\n solves problems with slow start up times and test execution times increasing\n with the number of ct_run directories stored in logdir. The cached index\n entries are stored in RAM during test execution and are saved to file in\n logdir (for faster start up times) whenever a test run finishes.\n\n Own Id: OTP-10855\n\n- Testing of the test specification functionality has been improved and a couple\n of minor bugs have been discovered and corrected.\n\n Own Id: OTP-10857\n\n- Links to the top level index files in some HTML footers had disappeared. This\n error has been corrected. Also, a problem with the suite overview log file not\n being closed properly has been solved.\n\n Own Id: OTP-11046\n\n- Common Test would, in case of timetrap error, print a warning in the log if\n end_per_testcase wasn't implemented in the suite, even though it's an optional\n function. This printout has been removed.\n\n Own Id: OTP-11052","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- If it could not be decided which test case a certain log printout belonged to,\n the common test framework log was earlier used. Such printouts are now instead\n sent to unexpected_io.log.html in test_server so that there is only one place\n to look for \"missing\" printouts.\n\n Own Id: OTP-10494 Aux Id: kunagi-319 \\[230]\n\n- Make cover smarter about finding source from beam.\n\n In particular, search using the source path in module_info if the current\n heuristic fails.\n\n Own Id: OTP-10902\n\n- Add a variant of ct_slave:start/2 that starts a node with specified options on\n the local host.\n\n Own Id: OTP-10920\n\n- Integrate elliptic curve contribution from Andreas Schultz\n\n In order to be able to support elliptic curve cipher suites in SSL/TLS,\n additions to handle elliptic curve infrastructure has been added to public_key\n and crypto.\n\n This also has resulted in a rewrite of the crypto API to gain consistency and\n remove unnecessary overhead. All OTP applications using crypto has been\n updated to use the new API.\n\n Impact: Elliptic curve cryptography (ECC) offers equivalent security with\n smaller key sizes than other public key algorithms. Smaller key sizes result\n in savings for power, memory, bandwidth, and computational cost that make ECC\n especially attractive for constrained environments.\n\n Own Id: OTP-11009\n\n- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016\n\n- A link is added from the red error printout in a test case log (for a failed\n test case) to the full error description at the end of the log. The reason for\n this is that the error description in the red field is sometimes truncated at\n 50 characters in order to keep the log as short and easy to read as possible.\n\n Own Id: OTP-11044 Aux Id: seq12304\n\n- A new option 'no_prompt_check' is added to ct_telnet:expect/3. If this option\n is used, ct_telnet will not wait for a prompt or a newline before attempting\n to match the given pattern.\n\n Own Id: OTP-11095","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.7.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If an event handler installed in the CT Master event manager took too long to\n respond during the termination phase, CT Master crashed because of a timeout\n after 5 secs. This would leave the system in a bad state. The problem has been\n solved by means of a 30 min timeout value and if CT Master gets a timeout\n after that time, it now kills the event manager and shuts down properly.\n\n Own Id: OTP-10634 Aux Id: kunagi-347 \\[258]\n\n- Printing with any of the ct printout functions from an event handler installed\n by Common Test, would cause a deadlock. This problem has been solved.\n\n Own Id: OTP-10826 Aux Id: seq12250\n\n- Using the force_stop flag/option to interrupt a test run caused a crash in\n Common Test. This problem has been solved.\n\n Own Id: OTP-10832","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Removed deprecated run_test program, use ct_run instead.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9052","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- Test case execution time increases with size of test run.\n\n Own Id: OTP-10855","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.7 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Severe errors detected by `test_server` (e.g. if log files directories cannot\n be created) will now be reported to `common_test` and noted in the\n `common_test` logs.\n\n Own Id: OTP-9769 Aux Id: kunagi-202 \\[113]\n\n- The earlier undocumented cross cover feature for accumulating cover data over\n multiple tests has now been fixed and documented.\n\n Own Id: OTP-9870 Aux Id: kunagi-206 \\[117]\n\n- If a busy test case generated lots of error messages,\n cth_log_redirect:post_end_per_testcase would crash with a timeout while\n waiting for the error logger to finish handling all error reports. The default\n timer was 5 seconds. This has now been extended to 5 minutes.\n\n Own Id: OTP-10040 Aux Id: kunagi-173 \\[84]\n\n- When a test case failed because of a timetrap time out, the `Config` data for\n the case was lost in the following call to `end_per_testcase/2`, and also in\n calls to the CT Hook function `post_end_per_testcase/4`. This problem has been\n solved and the `Config` data is now correctly passed to the above functions\n after a timetrap timeout failure.\n\n Own Id: OTP-10070 Aux Id: kunagi-175 \\[86]\n\n- Some calls to deprecated and removed functions in snmp are removed from\n ct_snmp.\n\n Own Id: OTP-10088 Aux Id: kunagi-176 \\[87]\n\n- In test_server, the same process would supervise the currently running test\n case and be group leader (and IO server) for the test case. Furthermore, when\n running parallel test cases, new temporary supervisor/group leader processes\n were spawned and the process that was group leader for sequential test cases\n would not be active. That would lead to several problems:\n\n \\* Processes started by init_per_suite will inherit the group leader of the\n init_per_suite process (and that group leader would not process IO requests\n when parallel test cases was running). If later a parallel test case caused\n such a processto print using (for example) io:format/2, the calling would\n hang.\n\n \\* Similarly, if a process was spawned from a parallel test case, it would\n inherit the temporary group leader for that parallel test case. If that\n spawned process later - when the group of parallel tests have finished -\n attempted to print something, its group leader would be dead and there would\n be `badarg` exception.\n\n Those problems have been solved by having group leaders separate from the\n processes that supervises the test cases, and keeping temporary group leader\n process for parallel test cases alive until no more process in the system use\n them as group leaders.\n\n Also, a new `unexpected_io.log` log file (reachable from the summary page of\n each test suite) has been introduced. All unexpected IO will be printed into\n it(for example, IO to a group leader for a parallel test case that has\n finished).\n\n Own Id: OTP-10101 Aux Id: OTP-10125\n\n- Some bugfixes in `ct_snmp:`\n\n - ct_snmp will now use the value of the 'agent_vsns' config variable when\n setting the 'variables' parameter to snmp application agent configuration.\n Earlier this had to be done separately - i.e. the supported versions had to\n be specified twice.\n - Snmp application failed to write notify.conf since ct_snmp gave the notify\n type as a string instead of an atom. This has been corrected.\n\n Own Id: OTP-10432\n\n- Some bugfixes in `ct_snmp`:\n\n - Functions `register_users/2`, `register_agents/2` and\n `register_usm_users/2`, and the corresponding `unregister_*/1` functions\n were not executable. These are corrected/rewritten.\n - Function `update_usm_users/2` is removed, and an unregister function is\n added instead. Update can now be done with unregister_usm_users and then\n register_usm_users.\n - Functions `unregister_*/2` are added, so specific users/agents/usm users can\n be unregistered.\n - Function `unload_mibs/1` is added for completeness.\n - Overriding configuration files did not work, since the files were written in\n priv_dir instead of in the configuration dir (priv_dir/conf). This has been\n corrected.\n - Arguments to `register_usm_users/2` were faulty documented. This has been\n corrected.\n\n Own Id: OTP-10434 Aux Id: kunagi-264 \\[175]\n\n- Faulty exported specs in common test has been corrected to\n `ct_netconfc:hook_options/0` and [`inet:hostname/0`](`t:inet:hostname/0`)\n\n Own Id: OTP-10601\n\n- The netconf client in common_test did not adjust the window after receiving\n data. Due to this, the client stopped receiving data after a while. This has\n been corrected.\n\n Own Id: OTP-10646","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- It is now possible to let a test specification include other test\n specifications. Included specs can either be joined with the source spec (and\n all other joined specs), resulting in one single test run, or they can be\n executed in separate test runs. Also, a start flag/option, `join_specs`, has\n been introduced, to be used in combination with the `spec` option. With\n `join_specs`, Common Test can be told to either join multiple test\n specifications, or run them separately. Without `join_specs`, the latter\n behaviour is default. Note that this is a change compared to earlier versions\n of Common Test, where specifications could only be joined. More information\n can be found in the Running Tests chapter in the User's Guide (see the Test\n Specifications section).\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9881 Aux Id: kunagi-350 \\[261]\n\n- The `ct_slave:start/3` function now supports an `{env,[{Var,Value}]}` option\n to extend environment for the slave node.\n\n Own Id: OTP-10469 Aux Id: kunagi-317 \\[228]\n\n- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665\n\n- Update common test modules to handle unicode:\n\n - Use UTF-8 encoding for all HTML files, except the HTML version of the test\n suite generated with erl2html2:convert, which will have the same encoding as\n the original test suite (.erl) file.\n - Encode link targets in HTML files with test_server_ctrl:uri_encode/1.\n - Use unicode modifier 't' with ~s when appropriate.\n - Use unicode:characters_to_list and unicode:characters_to_binary for\n conversion between binaries and strings instead of binary_to_list and\n list_to_binary.\n\n Own Id: OTP-10783","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- CT drops error reason when groups/0 crashes.\n\n Own Id: OTP-10631 Aux Id: kunagi-345 \\[256]\n\n- Event handler on a ct_master node causes hanging.\n\n Own Id: OTP-10634 Aux Id: kunagi-347 \\[258]\n\n- CT fails to open telnet conn after a timetrap timeout.\n\n Own Id: OTP-10648 Aux Id: seq12212","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.6.3.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6-3-1"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- The following corrections/changes are done in the cth_surefire hook:\n\n - Earlier there would always be a 'properties' element under the 'testsuites'\n element. This would exist even if there were no 'property' element inside\n it. This has been changed so if there are no 'property' elements to display,\n then there will not be a 'properties' element either.\n - The XML file will now (unless other is specified) be stored in the top log\n directory. Earlier, the default directory would be the current working\n directory for the erlang node, which would mostly, but not always, be the\n top log directory.\n - The 'hostname' attribute in the 'testsuite' element would earlier never have\n the correct value. This has been corrected.\n - The 'errors' attribute in the 'testsuite' element would earlier display the\n number of failed testcases. This has been changed and will now always have\n the value 0, while the 'failures' attribute will show the number of failed\n testcases.\n - A new attribute 'skipped' is added to the 'testsuite' element. This will\n display the number of skipped testcases. These would earlier be included in\n the number of failed test cases.\n - The total number of tests displayed by the 'tests' attribute in the\n 'testsuite' element would earlier include init/end_per_suite and\n init/end_per_group. This is no longer the case. The 'tests' attribute will\n now only count \"real\" test cases.\n - Earlier, auto skipped test cases would have no value in the 'log' attribute.\n This is now corrected.\n - A new attributes 'log' is added to the 'testsuite' element.\n - A new option named 'url_base' is added for this hook. If this option is\n used, a new attribute named 'url' will be added to the 'testcase' and\n 'testsuite' elements.\n\n Own Id: OTP-10589","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.6.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The ct:run_test/1 option 'config' only worked with a single config file, not a\n list of files. This has been fixed.\n\n Own Id: OTP-10495\n\n- ct_netconfc:close_session sometimes returned \\{error,closed\\} because the ssh\n connection was closed (from the server side) before the rpc-reply was received\n by the client. This is normal and cannot be helped. It has been corrected so\n the return will be 'ok' in this case. Other error situations will still give\n \\{error,Reason\\}.\n\n Own Id: OTP-10510 Aux Id: kunagi-320 \\[231]\n\n- ct_netconfc:close_session sometimes returned \\{error,closed\\} or (if the\n connection was named) \\{error,\\{process_down,Pid,normal\\}\\} because the ssh\n connection was closed (from the server side) before the rpc-reply was received\n by the client. This is normal and cannot be helped. It has been corrected so\n the return will be 'ok' in this situation.\n\n Own Id: OTP-10570\n\n- Fix bug where ct:require of same name with same config would return\n name_in_use.\n\n Own Id: OTP-10572","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new test case group search functionality has been implemented that makes\n Common Test search automatically through the group definitions tree (the\n return value of groups/0) and create tests for all paths of nested groups that\n match the specification. It also allows for specifying unique paths to sub\n groups in order to avoid execution of unwanted tests. This new feature can be\n used whenever starting a test run by means of the ct_run program, the\n ct:run_test/1 API function, or a Test Specification. Details can be found in\n the Test Case Group Execution section in the Running Tests chapter.\n\n Own Id: OTP-10466 Aux Id: kunagi-276 \\[187]","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- Restore Config data if lost when test case fails.\n\n Own Id: OTP-10070 Aux Id: kunagi-175 \\[86]\n\n- IO server error in test_server.\n\n Own Id: OTP-10125 Aux Id: OTP-10101, kunagi-177 \\[88]\n\n- Faulty connection handling in common_test.\n\n Own Id: OTP-10126 Aux Id: kunagi-178 \\[89]","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.6.2.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The interactive mode (ct_run -shell) would not start properly. This error has\n been fixed.\n\n Own Id: OTP-10414","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Common_Test 1.6.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If a CT hook function caused a crash, this could in some situations cause\n Common Test to terminate due to an illegal IO operation. This error has been\n corrected.\n\n Own Id: OTP-10050 Aux Id: seq12039\n\n- The Common Test documentation states that timetraps are never active during\n execution of CT hook functions. This was only true for post hook functions,\n not for pre hook functions. The code for CT hooks has been modified to behave\n according to the documentation.\n\n Own Id: OTP-10069\n\n- If a CT hook function would call the exit/1 or throw/1 BIF (possibly\n indirectly, e.g. as a result of a timeout in gen_server:call/3), Common Test\n would hang. This problem has been fixed.\n\n Own Id: OTP-10072 Aux Id: seq12053\n\n- The documentation has been updated with information about how to deal with\n chaining of hooks which return fail/skip.\n\n Own Id: OTP-10077 Aux Id: seq12048\n\n- When ct_hooks called the id/1 functions of multiple hooks, it would reverse\n the order of the hooks and call the proceeding init/2 calls in the wrong\n order. This has been fixed.\n\n Own Id: OTP-10135\n\n- The surefire hook now correctly handles autoskipped initialization and test\n functions.\n\n Own Id: OTP-10158\n\n- The ct:get_status/0 function failed to report status if a parallel test case\n group was running at the time of the call. This has been fixed and the return\n value for the function has been updated. Please see the ct reference manual\n for details.\n\n Own Id: OTP-10172","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The support for \"silent connections\" has been updated to include ssh. Also, a\n silent_connections term has been added to the set of test specification terms.\n\n Own Id: OTP-9625 Aux Id: seq11918\n\n- It is now possible to specify an arbitrarily large tuple as the requires\n config data when using require and ct:get_config. See the ct:get_config and\n ct:require reference manual pages for details about which keys are allowed.\n\n This change introduces a backwards incompatibility in the `ct:require/2`\n interface. Previously when doing `ct:require(a_name,{key,subkey})`, a_name\n would be associated with key. This has been changed to that `a_name` is\n associated with `subkey`. This change also effects using `require` in an\n suite/group/testcase info function.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9626 Aux Id: seq11920\n\n- The ct_run program now sets the OS process exit status before it ends. Value 0\n indicates a successful test result, 1 indicates one or more failed or\n auto-skipped test cases, and 2 indicates test execution failure.\n\n Own Id: OTP-9865 Aux Id: OTP-10087\n\n- It is now possible to sort the HTML tables by clicking on the header elements.\n In order to reset a sorted table, the browser window should simply be\n refreshed. This feature requires that the browser supports javascript, and has\n javascript execution enabled. If the 'ct_run -basic_html' flag is used, no\n javascript code is included in the generated HTML code.\n\n Own Id: OTP-9896 Aux Id: seq12034, OTP-9835\n\n- A netconf client, ct_netconfc, is added to common_test. It supports basic\n netconf functionality over SSH. In order to allow testing of both success and\n failure cases, it is intentionally written to allow non-standard behavior.\n\n Own Id: OTP-10025\n\n- The test specification term \\{define,Constant,Value\\} has been introduced,\n which makes it possible to replace constant names (atom()) with values\n (term()) in arbitrary test specification terms. The 'define' makes the (now\n deprecated) 'alias' term obsolete. More details, including examples, can be\n found in the Test Specifications chapter in the Common Test User's Guide.\n\n Own Id: OTP-10049\n\n- Verbosity levels for log printouts has been added. This makes it possible to\n specify preferred verbosity for different categories of log printouts, as well\n as general printouts (such as standard IO), to allow control over which\n strings get printed and which get ignored. New versions of the Common Test\n logging functions, ct:log, ct:pal and ct:print, have been introduced, with a\n new Importance argument added. The Importance value is compared to the\n verbosity level at runtime. More information can be found in the chapter about\n Logging in the Common Test User's Guide.\n\n Own Id: OTP-10067 Aux Id: seq12050\n\n- The return values of ct:run_test/1 and ct:run_testspec/1 have been changed\n from an uninformative 'ok' (independent of the test outcome) to a value,\n \\{Ok,Failed,\\{UserSkipped,AutoSkipped\\}\\} (all integers), that presents the\n final test case result, or a value, \\{error,Reason\\}, that informs about fatal\n test execution failure. See details in the reference manual for ct.\n\n Own Id: OTP-10087 Aux Id: OTP-9865\n\n- The test specification syntax has been updated with new and missing terms,\n such as 'define', 'verbosity', 'auto_compile', 'stylesheet',\n 'silent_connections', 'basic_html' and 'release_shell'. See the Test\n Specification chapter in the Common Test User's Guide for details.\n\n Own Id: OTP-10089 Aux Id: OTP-10049\n\n- It is now possible to pause execution of a test case, by calling the\n ct:break/1/2 function. Execution is resumed with a call to ct:continue/0/1.\n Break/continue also works for test cases executing in parallel. See the ct\n reference manual for details.\n\n Own Id: OTP-10127\n\n- It is now possible to send user defined events from a testcase which will be\n picked up by the installed event handler.\n\n Own Id: OTP-10157\n\n- A new start option, release_shell, for ct:run_test/1, has been added, which\n makes Common Test release the shell process after the test suite compilation\n phase is finished. For details, see the Running Tests chapter in the User's\n Guide.\n\n Own Id: OTP-10248 Aux Id: OTP-10127","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.6.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Common Test adds the test suite directories to the code path before executing\n the tests. These directories should also be removed from the code path at the\n end of the test run, which, prior to this fix, was not performed.\n\n Own Id: OTP-9595\n\n- An entry is now created in the index.html file (i.e. the overview file for the\n test run) for each repeated test during a test run. This was previously not\n the case. Note that in the top level (logdir) index file, however, only the\n last test result is listed. For example, given the test spec:\n \\[\\{merge_tests,false\\},\\{dirs,\"test1\"\\},\\{dirs,\"test1\"\\}]. In the index file\n for the test run (under Logdir/ct_run.Node.Date.Time), both tests are listed.\n In the top level index file (under Logdir), only the last test is listed (one\n has to find the previous results through the all_runs.html file).\n\n Own Id: OTP-9634 Aux Id: seq11924\n\n- After a test case timeout or abortion, the end_per_testcase function executes\n on a new dedicated process. The group leader for this process should be set to\n the IO server for the test case, which was not done properly. The result of\n this error was that no warnings about end_per_testcase failing or timing out\n were ever printed in the test case log. Also, help functions such as e.g.\n test_server:stop_node/1, attempting to synchronize with the IO server, would\n hang. The fault has been corrected.\n\n Own Id: OTP-9666\n\n- The ct:get_status/0 function would cause the calling process to receive 'DOWN'\n messages if no tests were running at the time of the call. This bug has been\n fixed.\n\n Own Id: OTP-9830 Aux Id: seq11975\n\n- A deadlock situation could occur if Common Test is forwarding error_handler\n printouts to Test Server at the same time a new test case is starting. This\n error has been fixed.\n\n Own Id: OTP-9894\n\n- A link to the ct_run program is now created, as expected, in the installation\n bin directory (default /usr/local/bin) during 'make install'.\n\n Own Id: OTP-9898\n\n- Using the repeat, duration or until option with ct:run_test/1, would cause an\n infinite loop. This has been fixed.\n\n Own Id: OTP-9899\n\n- Two or more test cases executing in parallel and printing to screen at the\n same time with ct:pal/2/3 or ct:print/2/3 could write into each other's\n \"slots\" and create a mess of mixed strings. In order to avoid this, only a\n single IO message is now ever sent per printout call.\n\n Own Id: OTP-9900 Aux Id: OTP-9904\n\n- When a test case was killed because of a timetrap timeout, the current\n location (suite, case and line) was not printed correctly in the log files.\n This has been corrected.\n\n Own Id: OTP-9930 Aux Id: seq12002\n\n- The wrong exit location was printed in the log file when ct:fail/1 or\n ct_fail/2 was called.\n\n Own Id: OTP-9933 Aux Id: seq12002\n\n- Test Server and Common Test would add new error handlers with each test run\n and fail to remove previously added ones. In the case of Test Server, this\n would only happen if SASL was not running on the test node. This has been\n fixed.\n\n Own Id: OTP-9941 Aux Id: seq12009\n\n- If a test case process was terminated due to an exit signal from a linked\n process, Test Server failed to report the correct name of the suite and case\n to the framework. This has been corrected.\n\n Own Id: OTP-9958 Aux Id: OTP-9855\n\n- When starting a test with ct_run and adding a directory to the code path using\n -pa or -pz (preceding -erl_args), Common Test would delete any existing\n directory in the code path with the same base name (see filename:basename/1)\n as the directory being added. This has been fixed.\n\n Own Id: OTP-9964\n\n- If passing two or more directories with the same base name (see\n filename:basename/1) to Common Test with ct_run -pa, only one of the\n directories would actually be added.\n\n Own Id: OTP-9975 Aux Id: seq12019\n\n- Configuration data required by the group info function was deleted before the\n call to post_end_per_group, which made it impossible for the hook function to\n read and use the data in question. This has been fixed.\n\n Own Id: OTP-9989\n\n- Disabling built-in hooks in a test specification was ignored, this has now\n been fixed.\n\n Own Id: OTP-10009\n\n- Various typographical errors corrected in documentation for common_test,\n driver, erl_driver and windows installation instructions. (Thanks to Tuncer\n Ayaz)\n\n Own Id: OTP-10037","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A new optional feature has been introduced that enables Common Test to\n generate priv_dir directory names that are unique for each test case or config\n function. The name of the option/flag is 'create_priv_dir' and it can be set\n to value 'auto_per_run' (which is the default, existing, behaviour), or\n 'auto_per_tc' or 'manual_per_tc'. If 'auto_per_tc' is used, Test Server\n creates a dedicated priv_dir automatically for each test case (which can be\n very expensive in case of many and/or repeated cases). If 'manual_per_tc' is\n used, the user needs to create the priv_dir explicitly by calling the new\n function ct:make_priv_dir/0.\n\n Own Id: OTP-9659 Aux Id: seq11930\n\n- A column for test case group name has been added to the suite overview HTML\n log file.\n\n Own Id: OTP-9730 Aux Id: seq11952\n\n- It is now possible to use the post_end_per_testcase CT hook function to print\n a comment for a test case in the overview log file, even if the test case gets\n killed by a timetrap or unknown exit signal, or if the end_per_testcase\n function times out.\n\n Own Id: OTP-9855 Aux Id: seq11979\n\n- The pre- and post CT hook functions are now always called for all\n configuration functions, even for configuration functions that are not\n implemented in the test suite.\n\n Own Id: OTP-9880 Aux Id: seq11993\n\n- Common Test will now print error information (with a time stamp) in the test\n case log file immediately when a test case fails. This makes it easier to see\n when, in time, the fault actually occurred, and aid the job of locating\n relevant trace and debug printouts in the log.\n\n Own Id: OTP-9904 Aux Id: seq11985, OTP-9900\n\n- Test Server has been modified to check the SASL errlog_type parameter when\n receiving an error logger event, so that it doesn't print reports of type that\n the user has disabled.\n\n Own Id: OTP-9955 Aux Id: seq12013\n\n- The test specification term 'skip_groups' was implemented in Common Test v1.6.\n It was never documented however, which has now been attended to. Please see\n the Test Specifications chapter in the User's Guide for information.\n\n Own Id: OTP-9972\n\n- The Common Test Master has been updated to use a CSS style sheet for the html\n log files.\n\n Own Id: OTP-9973\n\n- If the init_per_group/2 and end_per_group/2 functions are not implemented in\n the test suite, Common Test calls it's own local init- and end functions -\n previously named ct_init_per_group/2 and ct_end_per_group/2 - when a group is\n executed. These functions have been renamed init_per_group/2 and\n end_per_group/2 respectively. Note that this may affect any user event handler\n identifying events by the old names.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9986 Aux Id: OTP-9992\n\n- By specifying a user defined function (\\{M,F,A\\} or fun) as timetrap value,\n either by means of an info function or by calling ct:timetrap/1, it is now\n possible to set a timetrap that will be triggered when the user function\n returns.\n\n Own Id: OTP-9988 Aux Id: OTP-9501, seq11894\n\n- If the optional configuration functions init_per_suite/1 and end_per_suite/1\n are not implemented in the test suite, local Common Test versions of these\n functions are called instead, and will be displayed in the overview log file.\n Any printouts made by the pre- or post_init_per_suite and pre- or\n post_end_per_suite hook functions are saved in the log files for these\n functions.\n\n Own Id: OTP-9992\n\n- A hook has been added to common test which outputs surefire XML for usage\n together with CI tools such as Jenkins. To enable the hook pass '-ct_hooks\n cth_surefire' to ct_run. See the CTH documentation for more details.\n\n Own Id: OTP-9995","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.6 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-6"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A Getting Started chapter has been added to the Common Test User's Guide.\n\n Own Id: OTP-9156\n\n- The test case group info function has been implemented in Common Test. Before\n execution of a test case group, a call is now made to\n `TestSuite:group(GroupName)`. The function returns a list of test properties,\n e.g. to specify timetrap values, require configuration data, etc (analogue to\n the test suite- and test case info function). The scope of the properties set\n by `group(GroupName)` is all test cases and sub-groups of group `GroupName`.\n\n Own Id: OTP-9235\n\n- Common Test hooks are now in a final supported version. The Common Test hooks\n allow you to abstract out initialization behaviour that is common to multiple\n test suites into one place and also extend the behaviour of a suite without\n changing the suite itself. For more information see the Common Test user's\n guide.\n\n Own Id: OTP-9449\n\n- A new built-in common test hook has been added which captures error_logger and\n SASL event and prints them in the testcase log. To disable this (and any other\n built-in hooks) pass 'enable_builtin_hooks false' to common test.\n\n Own Id: OTP-9543\n\n- Common Test now calls info functions also for the `init/end_per_suite/1` and\n `init/end_per_group/2` configuration functions. These can be used e.g. to set\n timetraps and require external configuration data relevant only for the\n configuration functions in question (without affecting properties set for\n groups and test cases in the suite). The info function for\n `init/end_per_suite(Config)` is `init/end_per_suite()`, and for\n `init/end_per_group(GroupName,Config)` it's `init/end_per_group(GroupName)`.\n Info functions cannot be used with `init/end_per_testcase(TestCase, Config)`,\n since these configuration functions execute on the test case process and will\n use the same properties as the test case (i.e. properties set by the test case\n info function, `TestCase()`).\n\n Own Id: OTP-9569\n\n- It's now possible to read the full name of the test case log file during\n execution. One way to do this is to lookup it up as value of the key\n `tc_logfile` in the test case `Config` list (which means it can also be read\n by a pre- or post Common Test hook function). The data is also sent with the\n event `#event{name=tc_logfile,data={{Suite,Func},LogFileName}}`, and can be\n read by any installed event handler.\n\n Own Id: OTP-9676 Aux Id: seq11941\n\n- The look of the HTML log files generated by Common Test and Test Server has\n been improved (and made easier to customize) by means of a CSS file.\n\n Own Id: OTP-9706\n\n- Functions ct:fail(Format, Args) and ct:comment(Format, Args) have been added\n in order to make printouts of formatted error and comment strings easier (no\n need for the user to call io_lib:format/2 explicitly).\n\n Own Id: OTP-9709 Aux Id: seq11951\n\n- The order in which ct hooks are executed for cleanup hooks (i.e. _*end_per*_\n hooks) has been reversed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9774 Aux Id: seq11913\n\n- Printouts to stdout may be captured during test case execution. This is useful\n in order to e.g. read and parse tty printouts from the SUT during test case\n execution (if necessary, say, to determine the outcome of the test). The\n capturing session is started with `ct:capture_start/0`, and stopped with\n `ct:capture_stop/0`. The list of buffered strings is read and purged with\n `ct:capture_get/0/1`. It's possible to filter out printouts made with\n `ct:log/2/3` and `ct:pal/2/3` from the captured list of strings. This is done\n by calling `capture_get/1` with a list of log categories to exclude.\n\n Own Id: OTP-9775\n\n- The syntax for specifying test case groups in the all/0 list has been extended\n to include execution properties for both groups and sub-groups. The properties\n specified in all/0 for a group overrides the properties specified in the group\n declaration (in groups/0). The main purpose of this extension is to make it\n possible to run the same set of tests, but with different properties, without\n having to declare copies of the group in question. Also, the same syntax may\n be used in test specifications in order to change properties of groups at the\n time of execution, without having to edit the test suite. Please see the\n User's Guide for details and examples.\n\n Own Id: OTP-9809 Aux Id: OTP-9235","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Common Test Release Notes","doc":"- Fix problems in CT/TS due to line numbers in exceptions.\n\n Own Id: OTP-9203","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Common_Test 1.5.5 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- An error in how comments are colored in the test suite overview html log file\n has been corrected. As result, a new framework callback function,\n format_comment/1, has been introduced.\n\n Own Id: OTP-9237\n\n- Automatically generated init- and end-configuration functions for test case\n groups caused incorrect execution order of test cases. This has been\n corrected.\n\n Own Id: OTP-9369\n\n- If multiple directories were specified with the 'logdir' flag/option, Common\n Test would crash. This has been fixed so that an error is properly reported\n instead.\n\n Own Id: OTP-9370\n\n- If ct:log/2 was called with bad arguments, this could cause the Common Test IO\n handling process to crash. This fault has been corrected.\n\n Own Id: OTP-9371 Aux Id: OTP-8933\n\n- A bug has been fixed that made Test Server call the end_tc/3 framework\n function with an incorrect module name as first argument.\n\n Own Id: OTP-9379 Aux Id: seq11863\n\n- If a timetrap timeout occurred during execution of a function in a lib module\n (i.e. a function called directly or indirectly from a test case), the Suite\n argument in the end_tc/3 framework callback function would not correctly\n contain the name of the test suite, but the lib module. (This would only\n happen if the lib module was compiled with ct.hrl included). This error has\n been solved.\n\n Own Id: OTP-9398\n\n- Corrections of the vts mode. It will now report errors (about e.g. incorrect\n config files) instead of crashing or hanging. Furthermore, the requirement\n that the test directory name must have a \"\\_test\" suffix has been removed.\n Also, a workaround has been implemented for the limitation that the file\n browser (in many web browsers) will only return the basic file name, not the\n full directory path (which made it impossible to have config files in other\n directories than the main test directory).\n\n Own Id: OTP-9429\n\n- Add a proplist() type\n\n Recently I was adding specs to an API and found that there is no canonical\n proplist() type defined. (Thanks to Ryan Zezeski)\n\n Own Id: OTP-9499\n\n- It is now possible to use the 'step' flag/option to run the debugger for test\n suites that contain test case groups. This previously caused Common Test to\n crash. If 'step config' is specified, breakpoints are now also automatically\n set on init_per_group and end_per_group. Note that breakpoints are always set\n automatically on test case functions and this is true also for grouped cases.\n\n Own Id: OTP-9518 Aux Id: OTP-8933\n\n- The test index page was not refreshed at the start of each test suite which\n made it impossible to follow test execution by means of refreshing the browser\n window (no links to follow). This has been fixed.\n\n Own Id: OTP-9520 Aux Id: OTP-8933\n\n- If a test suite would start with a test case group defined without the\n init_per_group/2 and end_per_group/2 function, init_per_suite/1 would not\n execute initially and logging of the test run would fail. This error has been\n fixed.\n\n Own Id: OTP-9584\n\n- The \"Missing Suites\" link from the top level index page was incorrect and has\n been fixed.\n\n Own Id: OTP-9592","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Various corrections and updates to improve the handling and reporting of\n errors.\n\n Own Id: OTP-8933\n\n- The dir and suite start option can now be used in combination. E.g. executing\n my_SUITE in directory my_tests can either be specified as \"ct_run -suite\n my_tests/my_SUITE\" or as \"ct_run -dir my_tests -suite my_SUITE\". Furthermore,\n the specification: ct:run_test(\\[\\{suite,[\"./my_SUITE\"]\\},\\{testcase,t1\\}]) is\n now interpreted as ct:run_test(\\[\\{suite,\"./my_SUITE\"\\},\\{testcase,t1\\}]),\n i.e. only testcase t1 in test suite my_SUITE - not all cases - will be\n executed.\n\n Own Id: OTP-9155\n\n- A new option, 'logopts', has been introduced, to make it possible to modify\n some aspects of the logging behaviour in Common Test (or Test Server). For\n example, whenever an io printout is made, test_server adds newline (\\\\n) to\n the end of the output string. This may not always be a preferred action and\n can therefore be disabled by means of \"ct_run ... -logopts no_nl\" (or\n ct:run_test(\\[..., \\{logopts,[no_nl]\\}])). A new framework callback function,\n get_logopts/0, has been introduced (see the ct_framework module for details).\n\n Own Id: OTP-9372 Aux Id: OTP-9396\n\n- A new option, 'logopts', has been introduced, to make it possible to modify\n some aspects of the logging behaviour in Common Test (or Test Server). For\n example, if the html version of the test suite source code should not be\n generated during the test run (and consequently be unavailable in the log file\n system), the feature may be disabled by means of \"ct_run ... -logopts no_src\"\n (or ct:run_test(\\[..., \\{logopts,[no_src]\\}])). A new framework callback\n function, get_logopts/0, has been introduced (see the ct_framework module for\n details).\n\n Own Id: OTP-9396 Aux Id: seq11869, OTP-9372\n\n- CT Hooks can now be assigned a priority. The priority of a CTH determines when\n it should execute in relation to other CTHs. The CTH with the lowest priority\n will be executed first, CTHs with equal priority will be executed in the order\n which they were installed.\n\n Own Id: OTP-9445\n\n- It is now possible to use a tuple \\{M,F,A\\}, or a fun, as timetrap\n specification in the suite info function or test case info functions. The\n function must return a valid timeout value, as documented in the common_test\n man page and in the User's Guide.\n\n Own Id: OTP-9501 Aux Id: seq11894\n\n- A new built-in common test hook has been added which captures error_logger and\n SASL event and prints them in the testcase log. To disable this (and any other\n built-in hooks) pass 'enable_builtin_hooks false' to common test.\n\n Own Id: OTP-9543\n\n- Common Test now has the possibility to have built-in hooks which are started\n by default when any test is run. To disable built-in hooks pass\n 'enable_builtin_hooks false' to common test. See the common test hooks\n documentation for more details.\n\n Own Id: OTP-9564","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.5.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- It was previously not possible to use timetrap value 'infinity' with\n ct:timetrap/1. This has been fixed.\n\n Own Id: OTP-9159\n\n- The Common Test VTS mode has been updated to be able to report test results of\n suites that include test case groups (when it would previously crash).\n\n Own Id: OTP-9195\n\n- Common Test now refreshes the very top level index.html page at the start of\n each individual test in a test run, so that progress of the ongoing test can\n be tracked by following the link to its overview page.\n\n Own Id: OTP-9210 Aux Id: OTP-9054\n\n- A bug that made it impossible to cancel the previous timetrap when calling\n ct:timetrap/1 has been corrected.\n\n Own Id: OTP-9233 Aux Id: OTP-9159\n\n- Fix bug which would make cth's to not be removed when out of scope when adding\n a cth in suite/0 and crashing in pre_init_per_suite.\n\n Own Id: OTP-9264","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- It is now possible to return a tuple \\{fail,Reason\\} from init_per_testcase/2.\n The result is that the associated test case gets logged as failed without ever\n executing.\n\n Own Id: OTP-9160 Aux Id: seq11502\n\n- Common Test now accepts, but ignores, empty test case group specifications.\n\n Own Id: OTP-9161","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.5.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Added an option to test specs which allow the execution of tests as is,\n instead of doing merging of tests on the same \"level\". See the merge_tests\n directive the test specification documentation.\n\n Own Id: OTP-9026 Aux Id: seq11768","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Alpha release of Common Test Hooks (CTH). CTHs allow the users of common test\n to abstract out common behaviours from test suites in a much more elegant and\n flexible way than was possible before. Note that the addition of this feature\n may introduce minor changes in the undocumented behaviour of the interface\n between common_test and test_server.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8851","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.5.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Updated ct:get_status documentation to describe no_tests_running return value.\n\n Own Id: OTP-8895 Aux Id: seq11701\n\n- Fixed race condition test failures in the test suites testing common test's\n parallel groups feature.\n\n Own Id: OTP-8921\n\n- The include directive of testspecs now work when used on a remote node.\n\n Own Id: OTP-8935 Aux Id: seq11731","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- ct:parse_table can now handle multiline sql rows\n\n Own Id: OTP-8907 Aux Id: seq11702\n\n- The run_test executable has been renamed to the less generic ct_run to better\n work with other applications. run_test will remain until R16B at which point\n it will be removed.\n\n Own Id: OTP-8936","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.5.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Returning \\{return_group_result,failed\\} from end_per_group in a group that is\n part of a sequence, did not cause the proceeding cases (or groups) to get\n skipped. This has been fixed.\n\n Own Id: OTP-8753 Aux Id: seq11644\n\n- ct:install now works as the documentation describes.\n\n Own Id: OTP-8818 Aux Id: seq-11666","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Common Test has been updated to handle start options and test specification\n terms for test case groups (and test cases in groups). Also, an option named\n 'label', has been added that associates the test run with a name that Common\n Test prints in the overview HTML logs.\n\n Own Id: OTP-8725 Aux Id: OTP-8727\n\n- Andrey Pampukha has been added to the AUTHORS file. Thank you Andrey for your\n work on configuration data handling, Large Scale Testing improvements, and\n other useful updates and fixes.\n\n Own Id: OTP-8803\n\n- The Configuration Data chapter in the User's Guide has been updated.\n\n Own Id: OTP-8804\n\n- Milliseconds are now included in timestamps in Common Test log entries.\n (Thanks to Tomas Johansson.)\n\n Own Id: OTP-8808","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.5 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- Process calls using monitors in Common Test would not clear the inbox of\n remaining DOWN messages. This has been fixed.\n\n Own Id: OTP-8621 Aux Id: seq11560","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- It is now possible for the user to provide specific callback modules that\n handle test configuration data, so that data on arbitrary form can be accessed\n (e.g. by reading files or by communicating with a configuration server\n process). Two default callback modules have been introduced in Common Test:\n ct_config_plain and ct_config_xml. The former is used to handle the\n traditional Common Test configuration files (with terms on key-value tuple\n form) and the latter to handle configuration data on XML representation.\n\n Own Id: OTP-8485\n\n- It is now possible to execute test suites that are not necessarily available\n on the local file system, but have been loaded on the test node in advance\n (e.g. sent as binaries from a remote node and loaded by RPC). A requirement is\n that the no_auto_compile (or \\{auto_compile,false\\}) parameter has been set.\n\n Own Id: OTP-8490 Aux Id: seq11500\n\n- Test Server will now call the end_per_testcase/2 function even if the test\n case has been terminated explicitly (with abort_current_testcase/1), or after\n a timetrap timeout. Under these circumstances the return value of\n end_per_testcase is completely ignored. Therefore the function will not be\n able to change the reason for test case termination by returning\n \\{fail,Reason\\}, nor will it be able to save data with \\{save_config,Data\\}.\n\n Own Id: OTP-8500 Aux Id: seq11521\n\n- It is now possible to use the test specification term 'init' to start Common\n Test nodes automatically, as well as have initial function calls evaluated on\n the nodes. A default callback module for the 'init' term, ct_slave, has been\n introduced to enable Common Test Master to perform host login and node startup\n operations over ssh.\n\n Own Id: OTP-8570\n\n- The run_test script has been replaced by a program (with the same name) which\n can be executed without explicit installation. The start flags are the same as\n for the legacy start script.\n\n Own Id: OTP-8650\n\n- Previously, a repeat property of a test case group specified the number of\n times the group should be repeated after the main test run. I.e. \\{repeat,N\\}\n would case the group to execute 1+N times. To be consistent with the behaviour\n of the run_test repeat option, this has been changed. N now specifies the\n absolute number of executions instead.\n\n Own Id: OTP-8689 Aux Id: seq11502\n\n- With the run_test -erl_args option, it's possible to divide the options on the\n run_test command line into ones that Common Test should process (those\n preceding -erl_args, and ones it should ignore (those succeeding -erl_args).\n Options preceding -erl_args that Common Test doesn't recognize are also\n ignored (i.e. the same behaviour as earlier versions of Common Test).\n\n Own Id: OTP-8690 Aux Id: OTP-8650\n\n- Directories added with -pa or -pz in the pre-erl_args part of the run_test\n command line will be converted from relative to absolute, this to avoid\n problems loading user modules when Common Test switches working directory\n during the test run.\n\n Own Id: OTP-8691 Aux Id: OTP-8650\n\n- The timetrap handling has been made more user controllable by means of new\n start options and new ct interface functions. With the 'multiply_timetraps'\n start option, it's possible to specify a value which all timetrap timeout\n values get multiplied by. This is useful e.g. to extend the timetraps\n temporarily while running cover or trace. The 'scale_timetraps' start option\n switches on or off the Test Server timetrap scaling feature (which tries to\n detect if the tests may benefit from extended timetraps, e.g. due to running\n certain test tools, and performs the scaling automatically). Furthermore, the\n ct:timetrap/1 function has been introduced, which makes it possible to\n set/reset timetraps during test execution. Also, a ct:sleep/1 function is now\n available, which takes the timetrap parameters into account when calculating\n the time to suspend the process.\n\n Own Id: OTP-8693\n\n- A new run_test start option, event_handler_init, has been added that takes a\n start argument which gets passed to the init function of the event handler.\n\n Own Id: OTP-8694","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4.7 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The auto compilation feature of Common Test did not recognize if a header file\n included in a test suite was modified (if the dir start flag/option was used).\n This has been fixed.\n\n Own Id: OTP-8396 Aux Id: seq11488, OTP-8311","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The tc_status value in the Config list for a test case that has failed because\n of a timetrap timeout, has changed from \\{tc_status,timeout\\} to\n \\{tc_status,timetrap_timeout\\}.\n\n Own Id: OTP-8302\n\n- The documentation is now possible to build in an open source environment after\n a number of bugs are fixed and some features are added in the documentation\n build process.\n\n \\- The arity calculation is updated.\n\n \\- The module prefix used in the function names for bif's are removed in the\n generated links so the links will look like\n \"http://www.erlang.org/doc/man/erlang.html#append_element-2\" instead of\n \"http://www.erlang.org/doc/man/erlang.html#erlang:append_element-2\".\n\n \\- Enhanced the menu positioning in the html documentation when a new page is\n loaded.\n\n \\- A number of corrections in the generation of man pages (thanks to Sergei\n Golovan)\n\n \\- The legal notice is taken from the xml book file so OTP's build process can\n be used for non OTP applications.\n\n Own Id: OTP-8343\n\n- It is now possible to include the `ct.hrl` using the -include_lib directive.\n (Thanks to Fred Hebert.)\n\n Own Id: OTP-8379\n\n- The telnet client in Common Test sent \\[IAC,DO,NOP] to the server in attempt\n to keep the connection alive. This is not a valid sequence according to the\n standard, and some telnet servers would terminate the connection because of\n it. The client has been changed to send \\[IAC,NOP] every 10 secs instead,\n which should be a valid sequence. The client does not negotiate this type of\n \"keep alive\" message with the server, and if it causes problems, the user may\n disable the keep alive feature by adding \\{keep_alive,false\\} to the telnet\n configuration data for the server/connection. Please see the ct_telnet and\n unix_telnet manual pages for details.\n\n Own Id: OTP-8450 Aux Id: OTP-8311","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4.6 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If the init_per_testcase/2 function fails, the test case now gets marked and\n counted as auto skipped, not user skipped (which would previously happen).\n\n Own Id: OTP-8289","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201\n\n- For a failed test case, the tc_done event is supposed to report info on the\n form \\{failed,Error\\}. Only Error was reported, however, which has now been\n fixed.\n\n Own Id: OTP-8235 Aux Id: seq-11414\n\n- It is now possible to fail a test case from the end_per_testcase/2 function,\n by returning \\{fail,Reason\\}.\n\n Own Id: OTP-8284\n\n- It is now possible to fail a test case by having the end_tc/3 framework\n function return \\{fail,Reason\\} for the test case.\n\n Own Id: OTP-8285\n\n- The test_server framework API (e.g. the end_tc/3 function) has been modified.\n See the test_server_ctrl documentation for details.\n\n Own Id: OTP-8286 Aux Id: OTP-8285, OTP-8287\n\n- Various updates of the test events have been implemented. The data field for\n some events, such as tc_done and tc_auto_skip has been modified to make\n pattern matching on the data easier and more consistent. Also the order in\n which some events are received has been altered. E.g. the tc_auto_skip event\n for a test case now comes after the tc_done for the failed configuration\n function (not before) which makes more sense. Note that no new events have\n been added and that the event record remains unchanged.\n\n Own Id: OTP-8287 Aux Id: OTP-8235\n\n- The marquee used for test names on the all_runs.html page has been removed on\n request. Note that the test name field has the full text string in a title\n tag, which is displayed when hovering the mouse pointer over it (i.e. if the\n web browser supports title tags).\n\n Own Id: OTP-8288\n\n- It is now possible to refresh the top level index files in an arbitrary log\n directory by specifying a \\{refresh_logs,LogDir\\} tuple in the ct:run_test/1\n options list. Also the -refresh_logs flag for the run_test script has been\n extended to take an optional LogDir argument, i.e. -refresh_logs \\[LogDir]. If\n no LogDir is specified, current working directory is assumed, unless the log\n directory is set with the -logdir flag.\n\n Own Id: OTP-8290\n\n- It was previously required that test suites were located under a test object\n (or OTP application) sub-directory named \"test\" (or under a directory named\n \" \\_test\"). This has been changed so that Common Test now looks for\n suites primarily in a test sub-directory only if the directory exists.\n Otherwise it will assume the suites are stored in the same directory the user\n specifies with e.g. the 'dir' start flag/option.\n\n Own Id: OTP-8294","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4.5 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- The Common Test logger process crashed if a test case in a sequence (declared\n with sequences/0) failed. This fault has been corrected.\n\n Own Id: OTP-8089 Aux Id: seq11334","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Various updates and fixes in Common Test and Test Server.\n\n Own Id: OTP-8045 Aux Id: OTP-8089,OTP-8105,OTP-8163\n\n- Errors in coverage data collection and analysis were difficult to detect. The\n logging has been improved so that more information about e.g. imported and\n missing modules is printed to the html log files.\n\n Own Id: OTP-8163 Aux Id: seq11374\n\n- The Common Test HTML overview pages have been improved. It is now possible to\n see if a test case has been skipped explicitly or because a configuration\n function has failed. Also, the history page (all_runs.html) now has scrolling\n text displaying the test names. The old format (showing names as a truncated\n string) can still be generated by means of the flag/option 'basic_html'.\n\n Own Id: OTP-8177","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4-2"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Various corrections and improvements of Common Test and Test Server.\n\n Own Id: OTP-7981","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4-1"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Minor updates and corrections.\n\n Own Id: OTP-7897","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-4"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- A support client module for SSH and SFTP, ct_ssh, has been introduced in\n Common Test.\n\n Own Id: OTP-7838\n\n- Test case groups have been introduced. With this feature it's possible to\n execute groups (possibly nested) of test cases, each group wrapped with a call\n to function init_per_group/2 and end_per_group/2. Group definitions are done\n by means of the new call-back function groups/0, which should return a list of\n definitions. A group definition contains a name tag, a list of properties and\n a list of test cases (including possible nested group definitions). The\n properties make it possible to execute test cases in parallel, in sequence and\n in shuffled order. It is also possible to repeat test cases according to\n different criteria. The properties can be combined, making it possible to e.g.\n repeat a conf case a certain number of times and execute the test cases in\n different (random) order every time. Available properties are: parallel,\n sequence, shuffle, repeat, repeat_until_all_ok, repeat_until_any_ok,\n repeat_until_any_fail and repeat_until_all_fail. Please see the Common Test\n User's Guide for details.\n\n Own Id: OTP-7839 Aux Id: OTP-7511\n\n- It is now possible to use DES3 encrypted configuration files with Common Test.\n\n Own Id: OTP-7842 Aux Id: OTP-7838\n\n- In previous versions of Common Test, only one FTP connection could be opened\n per configuration target name. This has been updated so that multiple\n connections may be opened. The possibility to use named connections is still\n supported.\n\n Own Id: OTP-7853 Aux Id: OTP-7838\n\n- The Erlang mode for Emacs has been updated with new and modified skeletons for\n Common Test and TS. Syntax for test case groups in Common Test (and conf cases\n with properties in TS) has been added and a new minimal Common Test suite\n skeleton has been introduced.\n\n Own Id: OTP-7856","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.6 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- When running a test which includes all suites in a test directory, if the auto\n compilation would fail for one suite, all following suites would be excluded\n from the test. This was an unwanted behaviour and has been corrected. Now all\n suites will always be compiled and only the failing ones excluded from the\n test (and logged as missing).\n\n Own Id: OTP-7750 Aux Id: OTP-7803\n\n- The step functionality in Common Test (based on interaction with Debugger) was\n broken. This has been fixed, and some new step features have also been added.\n Please see the Common Test User's Guide for details.\n\n Own Id: OTP-7800 Aux Id: seq11106","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- It is now possible for the user to specify include directories that Common\n Test will pass along to the compiler when suite and help modules are being\n compiled (which Common Test performs automatically before running tests).\n\n Own Id: OTP-7803 Aux Id: OTP-7750","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.5 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","doc":"- If the Erlang runtime system was started without access to an erlang shell\n (e.g. -noshell), compilation errors would cause a crash in the Common Test\n application. Without access to a shell, Common Test cannot prompt the user to\n choose to continue or abort the test session, but must assume that the session\n should proceed.\n\n Own Id: OTP-7749 Aux Id: seq11175, seq11180","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- It is now possible for the Common Test user to disable the auto-compile\n feature. This is done by specifying the run_test flag -no_auto_compile, or the\n ct:run_test/1 option \\{auto_compile,false\\}.\n\n Own Id: OTP-7663\n\n- A new function, ct:get_config/3, has been added to Common Test that makes it\n possible to - if a particular config variable has been defined in multiple\n config files - return all matching values for the variable. The order of the\n elements in the returned list is the same as the specified order of the config\n files.\n\n Own Id: OTP-7758 Aux Id: seq11158\n\n- Because a telnet connection was always identified by a config variable alias,\n it was impossible to open multiple connections using the same telnet host data\n entry in the config file. This limitation has been removed by making it\n possible to associate a connection with handle value only (i.e. multiple\n connections may be opened using the same config variable). See\n ct_telnet:open/4 for details.\n\n Own Id: OTP-7781\n\n- A new syntax for defining default config data values has been introduced. In\n previous versions of Common Test, to define and access a default value for a\n config variable (in the suite info- or test case info function), an alias name\n had to be used. With the new syntax you may define default values without\n reference to aliases, like this: \\{default_config,VarName,DefaultValue\\}.\n Please see the User's Guide for more info.\n\n Own Id: OTP-7782\n\n- In previous versions of Common Test, whenever a config variable got associated\n with a name (by means of a require statement), the config variable name was\n replaced with the new name. This introduced unwanted dependencies between test\n cases (e.g. if one test case would introduce a new name, the following test\n cases could no longer access the config data by means of the original\n variable). This functionality has now been updated so that when new names are\n introduced with require, they become aliases (references) instead of\n replacements. Hence, config data elements can always, at any time, be accessed\n by means of the original config variable names.\n\n Own Id: OTP-7783","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.4 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-4"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Common Test now uses the re application instead of the previous rx driver to\n perform regular expression matching on telnet strings. Since re works on all\n supported operating systems, it is now possible to run telnet sessions also on\n platforms such as e.g. Windows (which was not the case with the previous rx\n driver). Note that the rx driver is obsolete from now on, and will be removed\n from Common Test after OTP R12B.\n\n Own Id: OTP-7528","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.3 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-3"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- Various updates and improvements, plus some minor bug fixes, have been\n implemented in Common Test and Test Server.\n\n Own Id: OTP-7112\n\n- It is now possible, by means of the new function ct:abort_current_testcase/1\n or test_server_ctrl:abort_current_testcase/1, to abort the currently executing\n test case.\n\n Own Id: OTP-7518 Aux Id: OTP-7112","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.2 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-2"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The configure test of the rx lib in Common Test was not performed during the\n general OTP application configuration phase. This made e.g. autoconf\n impossible. This has been changed to correspond with the normal OTP build\n procedure.\n\n Own Id: OTP-7379","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Common_Test 1.3.1 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-1"},{"type":"extras","title":"Improvements and New Features - Common Test Release Notes","doc":"- The rx library, included with common_test, failed to build on some\n architectures because the -fPIC compiler option was missing.\n\n Own Id: OTP-7111","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"common_test 1.3.0 - Common Test Release Notes","doc":"","ref":"notes.html#common_test-1-3-0"},{"type":"extras","title":"Introduction","doc":"\n# Introduction","ref":"introduction.html"},{"type":"extras","title":"Scope - Introduction","doc":"`Common Test` is a portable application for automated testing. It is suitable\nfor:\n\n- Black-box testing of target systems of any type (that is, not necessarily\n implemented in Erlang). This is performed through standard O&M interfaces\n (such as SNMP, HTTP, CORBA, and Telnet) and, if necessary, through\n user-specific interfaces (often called test ports).\n- White-box testing of Erlang/OTP programs. This is easily done by calling the\n target API functions directly from the test case functions.\n\n`Common Test` also integrates use of the OTP `m:cover` tool in application Tools\nfor code coverage analysis of Erlang/OTP programs.\n\n`Common Test` executes test suite programs automatically, without operator\ninteraction. Test progress and results are printed to logs in HTML format,\neasily browsed with a standard web browser. `Common Test` also sends\nnotifications about progress and results through an OTP event manager to event\nhandlers plugged in to the system. This way, users can integrate their own\nprograms for, for example, logging, database storing, or supervision with\n`Common Test`.\n\n`Common Test` provides libraries with useful support functions to fill various\ntesting needs and requirements. There is, for example, support for flexible test\ndeclarations through test specifications. There is also support for central\nconfiguration and control of multiple independent test sessions (to different\ntarget systems) running in parallel.","ref":"introduction.html#scope"},{"type":"extras","title":"Prerequisites - Introduction","doc":"It is assumed that the reader is familiar with the Erlang programming language.","ref":"introduction.html#prerequisites"},{"type":"extras","title":"Common Test Basics","doc":"\n# Common Test Basics\n\n[](){: #basics }","ref":"basics_chapter.html"},{"type":"extras","title":"General - Common Test Basics","doc":"The `Common Test` framework is a tool that supports implementation and automated\nexecution of test cases to any types of target systems. `Common Test` is the\nmain tool being used in all testing- and verification activities that are part\nof Erlang/OTP system development and maintenance.\n\nTest cases can be executed individually or in batches. `Common Test` also\nfeatures a distributed testing mode with central control and logging. With this\nfeature, multiple systems can be tested independently in one common session.\nThis is useful, for example, when running automated large-scale regression\ntests.\n\nThe System Under Test (SUT) can consist of one or more target nodes.\n`Common Test` contains a generic test server that, together with other test\nutilities, is used to perform test case execution. The tests can be started from\na GUI, from the OS shell, or from an Erlang shell. _Test suites_ are files\n(Erlang modules) that contain the _test cases_ (Erlang functions) to be\nexecuted. _Support modules_ provide functions that the test cases use to do the\ntests.\n\nIn a black-box testing scenario, `Common Test`\\-based test programs connect to\nthe target system(s) through standard O&M and CLI protocols. `Common Test`\nprovides implementations of, and wrapper interfaces to, some of these protocols\n(most of which exist as standalone components and applications in OTP). The\nwrappers simplify configuration and add verbosity for logging purposes.\n`Common Test` is continuously extended with useful support modules. However,\nnotice that it is a straightforward task to use any Erlang/OTP component for\ntesting purposes with `Common Test`, without needing a `Common Test` wrapper for\nit. It is as simple as calling Erlang functions. A number of target-independent\ninterfaces are supported in `Common Test`, such as Generic Telnet and FTP. These\ncan be specialized or used directly for controlling instruments, traffic load\ngenerators, and so on.\n\n`Common Test` is also a very useful tool for white-box testing Erlang code (for\nexample, module testing), as the test programs can call exported Erlang\nfunctions directly. There is very little overhead required for implementing\nbasic test suites and executing simple tests. For black-box testing Erlang\nsoftware, Erlang RPC and standard O&M interfaces can be used for example.\n\nA test case can handle several connections to one or more target systems,\ninstruments, and traffic generators in parallel to perform the necessary actions\nfor a test. The handling of many connections in parallel is one of the major\nstrengths of `Common Test`, thanks to the efficient support for concurrency in\nthe Erlang runtime system, which `Common Test` users can take great advantage\nof.","ref":"basics_chapter.html#general"},{"type":"extras","title":"Test Suite Organization - Common Test Basics","doc":"Test suites are organized in test directories and each test suite can have a\nseparate data directory. Typically, these files and directories are\nversion-controlled similar to other forms of source code (possibly by a version\ncontrol system like GIT or Subversion). However, `Common Test` does not itself\nput any requirements on (or has any awareness of) possible file and directory\nversions.","ref":"basics_chapter.html#test-suite-organization"},{"type":"extras","title":"Support Libraries - Common Test Basics","doc":"Support libraries contain functions that are useful for all test suites, or for\ntest suites in a specific functional area or subsystem. In addition to the\ngeneral support libraries provided by the `Common Test` framework, and the\nvarious libraries and applications provided by Erlang/OTP, there can also be a\nneed for customized (user specific) support libraries.","ref":"basics_chapter.html#support-libraries"},{"type":"extras","title":"Suites and Test Cases - Common Test Basics","doc":"Testing is performed by running test suites (sets of test cases) or individual\ntest cases. A test suite is implemented as an Erlang module named\n` _SUITE.erl` which contains a number of test cases. A test case is\nan Erlang function that tests one or more things. The test case is the smallest\nunit that the `Common Test` test server deals with.\n\nSets of test cases, called test case groups, can also be defined. A test case\ngroup can have execution properties associated with it. Execution properties\nspecify if the test cases in the group are to be executed in random order, in\nparallel, or in sequence, and if the execution of the group is to be repeated.\nTest case groups can also be nested (that is, a group can, besides test cases,\ncontain subgroups).\n\nBesides test cases and groups, the test suite can also contain configuration\nfunctions. These functions are meant to be used for setting up (and verifying)\nenvironment and state in the SUT (and/or the `Common Test` host node), required\nfor the tests to execute correctly. Examples of operations are: Opening a\nconnection to the SUT, initializing a database, running an installation script,\nand so on. Configuration can be performed per suite, per test case group, and\nper individual test case.\n\nThe test suite module must conform to a [callback interface](`m:ct_suite`)\nspecified by the `Common Test` test server. For details, see section\n[Writing Test Suites](write_test_chapter.md#intro).\n\nA test case is considered successful if it returns to the caller, no matter what\nthe returned value is. However, a few return values have special meaning as\nfollows:\n\n- `{skip,Reason}` indicates that the test case is skipped.\n- `{comment,Comment}` prints a comment in the log for the test case.\n- `{save_config,Config}` makes the `Common Test` test server pass `Config` to\n the next test case.\n\nA test case failure is specified as a runtime error (a crash), no matter what\nthe reason for termination is. If you use Erlang pattern matching effectively,\nyou can take advantage of this property. The result is concise and readable test\ncase functions that look much more like scripts than actual programs. A simple\nexample:\n\n```erlang\nsession(_Config) ->\n {started,ServerId} = my_server:start(),\n {clients,[]} = my_server:get_clients(ServerId),\n MyId = self(),\n connected = my_server:connect(ServerId, MyId),\n {clients,[MyId]} = my_server:get_clients(ServerId),\n disconnected = my_server:disconnect(ServerId, MyId),\n {clients,[]} = my_server:get_clients(ServerId),\n stopped = my_server:stop(ServerId).\n```\n\nAs a test suite runs, all information (including output to `stdout`) is recorded\nin many different log files. A minimum of information is displayed in the user\nconsole (only start and stop information, plus a note for each failed test\ncase).\n\nThe result from each test case is recorded in a dedicated HTML log file, created\nfor the particular test run. An overview page displays each test case\nrepresented by a table row showing total execution time, if the case was\nsuccessful, failed, or skipped, plus an optional user comment. For a failed test\ncase, the reason for termination is also printed in the comment field. The\noverview page has a link to each test case log file, providing simple navigation\nwith any standard HTML browser.\n\n> #### Note {: .info }\n>\n> In the last row where totals are presented the time shown here is a sum of\n> rows, which are above (not accounting for parallel testcases).\n> On the other hand \"Elapsed Time\" is a clock time spent to run testcases.\n>\n\n[](){: #External_Interfaces }","ref":"basics_chapter.html#suites-and-test-cases"},{"type":"extras","title":"External Interfaces - Common Test Basics","doc":"The `Common Test` test server requires that the test suite defines and exports\nthe following mandatory or optional callback functions:\n\n- **`all()`** - Returns a list of all test cases and groups in the suite.\n (Mandatory)\n\n- **`suite()`** - Information function used to return properties for the suite.\n (Optional)\n\n- **`groups()`** - For declaring test case groups. (Optional)\n\n- **`init_per_suite(Config)`** - Suite level configuration function, executed\n before the first test case. (Optional)\n\n- **`end_per_suite(Config)`** - Suite level configuration function, executed\n after the last test case. (Optional)\n\n- **`group(GroupName)`** - Information function used to return properties for a\n test case group. (Optional)\n\n- **`init_per_group(GroupName, Config)`** - Configuration function for a group,\n executed before the first test case. (Optional)\n\n- **`end_per_group(GroupName, Config)`** - Configuration function for a group,\n executed after the last test case. (Optional)\n\n- **`init_per_testcase(TestCase, Config)`** - Configuration function for a\n testcase, executed before each test case. (Optional)\n\n- **`end_per_testcase(TestCase, Config)`** - Configuration function for a\n testcase, executed after each test case. (Optional)\n\nFor each test case, the `Common Test` test server expects the following\nfunctions:\n\n- **Testcasename()** - Information function that returns a list of test case\n properties. (Optional)\n\n- **Testcasename(Config)** - The test case function.","ref":"basics_chapter.html#external-interfaces"},{"type":"extras","title":"Getting Started","doc":"\n# Getting Started","ref":"getting_started_chapter.html"},{"type":"extras","title":"Introduction for Newcomers - Getting Started","doc":"The purpose of this section is to let the newcomer get started in quickly\nwriting and executing some first simple tests with a \"learning by example\"\napproach. Most explanations are left for later sections. If you are not much\ninto \"learning by example\" and prefer more technical details, go ahead and skip\nto the next section.\n\nThis section demonstrates how simple it is to write a basic (yet for many module\ntesting purposes, often sufficiently complex) test suite and execute its test\ncases. This is not necessarily obvious when you read the remaining sections in\nthis User's Guide.\n\n> #### Note {: .info }\n>\n> To understand what is discussed and examplified here, we recommended you to\n> first read section [Common Test Basics](basics_chapter.md#basics).","ref":"getting_started_chapter.html#introduction-for-newcomers"},{"type":"extras","title":"Test Case Execution - Getting Started","doc":"Execution of test cases is handled as follows:\n\n![Successful and Unsuccessful Test Case Execution](assets/tc_execution.gif \"Successful and Unsuccessful Test Case Execution\")\n\nFor each test case that `Common Test` is ordered to execute, it spawns a\ndedicated process on which the test case function starts running. (In parallel\nto the test case process, an idle waiting timer process is started, which is\nlinked to the test case process. If the timer process runs out of waiting time,\nit sends an exit signal to terminate the test case process. This is called a\n_timetrap_).\n\nIn scenario 1, the test case process terminates normally after `case A` has\nfinished executing its test code without detecting any errors. The test case\nfunction returns a value and `Common Test` logs the test case as successful.\n\nIn scenario 2, an error is detected during test `case B` execution. This causes\nthe test `case B` function to generate an exception and, as a result, the test\ncase process exits with reason other than normal. `Common Test` logs this as an\nunsuccessful (Failed) test case.\n\nAs you can understand from the illustration, `Common Test` requires a test case\nto generate a runtime error to indicate failure (for example, by causing a bad\nmatch error or by calling [`exit/1`](`exit/1`), preferably through the help\nfunction [`ct:fail/1,2`](`ct:fail/1`)). A successful execution is indicated by a\nnormal return from the test case function.","ref":"getting_started_chapter.html#test-case-execution"},{"type":"extras","title":"A Simple Test Suite - Getting Started","doc":"As shown in section [Common Test Basics](basics_chapter.md#External_Interfaces),\nthe test suite module implements [callback functions](`m:ct_suite`) (mandatory\nor optional) for various purposes, for example:\n\n- Init/end configuration function for the test suite\n- Init/end configuration function for a test case\n- Init/end configuration function for a test case group\n- Test cases\n\nThe configuration functions are optional. The following example is a test suite\nwithout configuration functions, including one simple test case, to check that\nmodule `mymod` exists (that is, can be successfully loaded by the code server):\n\n```erlang\n-module(my1st_SUITE).\n-compile(export_all).\n\nall() ->\n [mod_exists].\n\nmod_exists(_) ->\n {module,mymod} = code:load_file(mymod).\n```\n\nIf the operation fails, a bad match error occurs that terminates the test case.","ref":"getting_started_chapter.html#a-simple-test-suite"},{"type":"extras","title":"A Test Suite with Configuration Functions - Getting Started","doc":"If you need to perform configuration operations to run your test, you can\nimplement configuration functions in your suite. The result from a configuration\nfunction is configuration data, or `Config`. This is a list of key-value tuples\nthat get passed from the configuration function to the test cases (possibly\nthrough configuration functions on \"lower level\"). The data flow looks as\nfollows:\n\n![Configuration Data Flow in a Suite](assets/config.gif \"Configuration Data Flow in a Suite\")\n\nThe following example shows a test suite that uses configuration functions to\nopen and close a log file for the test cases (an operation that is unnecessary\nand irrelevant to perform by each test case):\n\n```erlang\n-module(check_log_SUITE).\n-export([all/0, init_per_suite/1, end_per_suite/1]).\n-export([check_restart_result/1, check_no_errors/1]).\n\n-define(value(Key,Config), proplists:get_value(Key,Config)).\n\nall() -> [check_restart_result, check_no_errors].\n\ninit_per_suite(InitConfigData) ->\n [{logref,open_log()} | InitConfigData].\n\nend_per_suite(ConfigData) ->\n close_log(?value(logref, ConfigData)).\n\ncheck_restart_result(ConfigData) ->\n TestData = read_log(restart, ?value(logref, ConfigData)),\n {match,_Line} = search_for(\"restart successful\", TestData).\n\ncheck_no_errors(ConfigData) ->\n TestData = read_log(all, ?value(logref, ConfigData)),\n case search_for(\"error\", TestData) of\n {match,Line} -> ct:fail({error_found_in_log,Line});\n nomatch -> ok\n end.\n```\n\nThe test cases verify, by parsing a log file, that our SUT has performed a\nsuccessful restart and that no unexpected errors are printed.\n\nTo execute the test cases in the recent test suite, type the following on the\nUNIX/Linux command line (assuming that the suite module is in the current\nworking directory):\n\n```text\n$ ct_run -dir .\n```\n\nor:\n\n```text\n$ ct_run -suite check_log_SUITE\n```\n\nTo use the Erlang shell to run our test, you can evaluate the following call:\n\n```erlang\n1> ct:run_test([{dir, \".\"}]).\n```\n\nor:\n\n```erlang\n1> ct:run_test([{suite, \"check_log_SUITE\"}]).\n```\n\nThe result from running the test is printed in log files in HTML format (stored\nin unique log directories on a different level). The following illustration\nshows the log file structure:\n\n![HTML Log File Structure](assets/html_logs.gif \"HTML Log File Structure\")","ref":"getting_started_chapter.html#a-test-suite-with-configuration-functions"},{"type":"extras","title":"Questions and Answers - Getting Started","doc":"Here follows some questions that you might have after reading this section with\ncorresponding tips and links to the answers:\n\n- _Question:_ \"How and where can I specify variable data for my tests that must\n not be hard-coded in the test suites (such as hostnames, addresses, and user\n login data)?\"\n\n _Answer:_ See section\n [External Configuration Data](config_file_chapter.md#top).\n\n- _Question:_ \"Is there a way to declare different tests and run them in one\n session without having to write my own scripts? Also, can such declarations be\n used for regression testing?\"\n\n _Answer:_ See section\n [Test Specifications](run_test_chapter.md#test_specifications) in section\n Running Tests and Analyzing Results.\n\n- _Question:_ \"Can test cases and/or test runs be automatically repeated?\"\n\n _Answer:_ Learn more about\n [Test Case Groups](write_test_chapter.md#test_case_groups) and read about\n start flags/options in section [Running Tests](run_test_chapter.md#ct_run) and\n in the Reference Manual.\n\n- _Question:_ \"Does `Common Test` execute my test cases in sequence or in\n parallel?\"\n\n _Answer:_ See [Test Case Groups](write_test_chapter.md#test_case_groups) in\n section Writing Test Suites.\n\n- _Question:_ \"What is the syntax for timetraps (mentioned earlier), and how do\n I set them?\"\n\n _Answer:_ This is explained in the\n [Timetrap Time-Outs](write_test_chapter.md#timetraps) part of section Writing\n Test Suites.\n\n- _Question:_ \"What functions are available for logging and printing?\"\n\n _Answer:_ See [Logging](write_test_chapter.md#logging) in section Writing Test\n Suites.\n\n- _Question:_ \"I need data files for my tests. Where do I store them\n preferably?\"\n\n _Answer:_ See\n [Data and Private Directories](write_test_chapter.md#data_priv_dir).\n\n- _Question:_ \"Can I start with a test suite example, please?\"\n\n _Answer:_ [Welcome\\!](example_chapter.md#top)\n\nYou probably want to get started on your own first test suites now, while at the\nsame time digging deeper into the `Common Test` User's Guide and Reference\nManual. There are much more to learn about the things that have been introduced\nin this section. There are also many other useful features to learn, so please\ncontinue to the other sections and have fun.","ref":"getting_started_chapter.html#questions-and-answers"},{"type":"extras","title":"Installation","doc":"\n# Installation\n\n[](){: #general }","ref":"install_chapter.html"},{"type":"extras","title":"General Information - Installation","doc":"The two main interfaces for running tests with `Common Test` are an executable\nprogram named [`ct_run`](ct_run_cmd.md) and the Erlang module `m:ct`. `ct_run`\nis compiled for the underlying operating system (for example, Unix/Linux or\nWindows) during the build of the Erlang/OTP system, and is installed\nautomatically with other executable programs in the top level `bin` directory of\nErlang/OTP. The `ct` interface functions can be called from the Erlang shell, or\nfrom any Erlang function, on any supported platform.\n\nThe `Common Test` application is installed with the Erlang/OTP system. No extra\ninstallation step is required to start using `Common Test` through the `ct_run`\nexecutable program, and/or the interface functions in the `ct` module.","ref":"install_chapter.html#general-information"},{"type":"extras","title":"Writing Test Suites","doc":"\n# Writing Test Suites\n\n[](){: #intro }","ref":"write_test_chapter.html"},{"type":"extras","title":"Support for Test Suite Authors - Writing Test Suites","doc":"The `m:ct` module provides the main interface for writing test cases. This\nincludes for example, the following:\n\n- Functions for printing and logging\n- Functions for reading configuration data\n- Function for terminating a test case with error reason\n- Function for adding comments to the HTML overview page\n\nFor details about these functions, see module `m:ct`.\n\nThe `Common Test` application also includes other modules named\n`ct_ `, which provide various support, mainly simplified use of\ncommunication protocols such as RPC, SNMP, FTP, Telnet, and others.","ref":"write_test_chapter.html#support-for-test-suite-authors"},{"type":"extras","title":"Test Suites - Writing Test Suites","doc":"A test suite is an ordinary Erlang module that contains test cases. It is\nrecommended that the module has a name on the form `*_SUITE.erl`. Otherwise, the\ndirectory and auto compilation function in `Common Test` cannot locate it (at\nleast not by default).\n\nIt is also recommended that the `ct.hrl` header file is included in all test\nsuite modules.\n\nEach test suite module must export function [`all/0`](`c:ct_suite:all/0`), which\nreturns the list of all test case groups and test cases to be executed in that\nmodule.\n\nThe callback functions to be implemented by the test suite are all listed in\nmodule [ct_suite ](`m:ct_suite`). They are also described in more detail later\nin this User's Guide.","ref":"write_test_chapter.html#test-suites"},{"type":"extras","title":"Init and End per Suite - Writing Test Suites","doc":"Each test suite module can contain the optional configuration functions\n[`init_per_suite/1`](`c:ct_suite:init_per_suite/1`) and\n[`end_per_suite/1`](`c:ct_suite:end_per_suite/1`). If the init function is\ndefined, so must the end function be.\n\nIf `init_per_suite` exists, it is called initially before the test cases are\nexecuted. It typically contains initializations common for all test cases in the\nsuite, which are only to be performed once. `init_per_suite` is recommended for\nsetting up and verifying state and environment on the System Under Test (SUT) or\nthe `Common Test` host node, or both, so that the test cases in the suite\nexecutes correctly. The following are examples of initial configuration\noperations:\n\n- Opening a connection to the SUT\n- Initializing a database\n- Running an installation script\n\n`end_per_suite` is called as the final stage of the test suite execution (after\nthe last test case has finished). The function is meant to be used for cleaning\nup after `init_per_suite`.\n\n`init_per_suite` and `end_per_suite` execute on dedicated Erlang processes, just\nlike the test cases do. The result of these functions is however not included in\nthe test run statistics of successful, failed, and skipped cases.\n\nThe argument to `init_per_suite` is `Config`, that is, the same key-value list\nof runtime configuration data that each test case takes as input argument.\n`init_per_suite` can modify this parameter with information that the test cases\nneed. The possibly modified `Config` list is the return value of the function.\n\nIf `init_per_suite` fails, all test cases in the test suite are skipped\nautomatically (so called _auto skipped_), including `end_per_suite`.\n\nNotice that if `init_per_suite` and `end_per_suite` do not exist in the suite,\n`Common Test` calls dummy functions (with the same names) instead, so that\noutput generated by hook functions can be saved to the log files for these\ndummies. For details, see [Common Test Hooks](ct_hooks_chapter.md#manipulating).\n\n[](){: #per_testcase }","ref":"write_test_chapter.html#init-and-end-per-suite"},{"type":"extras","title":"Init and End per Test Case - Writing Test Suites","doc":"Each test suite module can contain the optional configuration functions\n[`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) and\n[`end_per_testcase/2`](`c:ct_suite:end_per_testcase/2`). If the init function is\ndefined, so must the end function be.\n\nIf `init_per_testcase` exists, it is called before each test case in the suite.\nIt typically contains initialization that must be done for each test case\n(analog to `init_per_suite` for the suite).\n\n`end_per_testcase/2` is called after each test case has finished, enabling\ncleanup after `init_per_testcase`.\n\n> #### Note {: .info }\n>\n> If `end_per_testcase` crashes, however, test results are unaffected. At the\n> same time, this occurrence is reported in the test execution logs.\n\nThe first argument to these functions is the name of the test case. This value\ncan be used with pattern matching in function clauses or conditional expressions\nto choose different initialization and cleanup routines for different test\ncases, or perform the same routine for many, or all, test cases.\n\nThe second argument is the `Config` key-value list of runtime configuration\ndata, which has the same value as the list returned by `init_per_suite`.\n`init_per_testcase/2` can modify this parameter or return it \"as is\". The return\nvalue of `init_per_testcase/2` is passed as parameter `Config` to the test case\nitself.\n\nThe return value of `end_per_testcase/2` is ignored by the test server, with\nexception of the [`save_config`](dependencies_chapter.md#save_config) and `fail`\ntuple.\n\n`end_per_testcase` can check if the test case was successful. (which in turn can\ndetermine how cleanup is to be performed). This is done by reading the value\ntagged with `tc_status` from `Config`. The value is one of the following:\n\n- `ok`\n- `{failed,Reason}`\n\n where `Reason` is `timetrap_timeout`, information from [`exit/1`](`exit/1`),\n or details of a runtime error\n\n- `{skipped,Reason}`\n\n where `Reason` is a user-specific term\n\nFunction `end_per_testcase/2` is even called if a test case terminates because\nof a call to `ct:abort_current_testcase/1`, or after a timetrap time-out.\nHowever, `end_per_testcase` then executes on a different process than the test\ncase function. In this situation, `end_per_testcase` cannot change the reason\nfor test case termination by returning `{fail,Reason}` or save data with\n`{save_config,Data}`.\n\nThe test case is skipped in the following two cases:\n\n- If `init_per_testcase` crashes (called _auto skipped_).\n- If `init_per_testcase` returns a tuple `{skip,Reason}` (called _user\n skipped_).\n\nThe test case can also be marked as failed without executing it by returning a\ntuple `{fail,Reason}` from `init_per_testcase`.\n\n> #### Note {: .info }\n>\n> If `init_per_testcase` crashes, or returns `{skip,Reason}` or `{fail,Reason}`,\n> function `end_per_testcase` is not called.\n\nIf it is determined during execution of `end_per_testcase` that the status of a\nsuccessful test case is to be changed to failed, `end_per_testcase` can return\nthe tuple `{fail,Reason}` (where `Reason` describes why the test case fails).\n\nAs `init_per_testcase` and `end_per_testcase` execute on the same Erlang process\nas the test case, printouts from these configuration functions are included in\nthe test case log file.\n\n[](){: #test_cases }","ref":"write_test_chapter.html#init-and-end-per-test-case"},{"type":"extras","title":"Test Cases - Writing Test Suites","doc":"The smallest unit that the test server is concerned with is a test case. Each\ntest case can test many things, for example, make several calls to the same\ninterface function with different parameters.\n\nThe author can choose to put many or few tests into each test case. Some things\nto keep in mind follows:\n\n- Many small test cases tend to result in extra, and possibly duplicated code,\n as well as slow test execution because of large overhead for initializations\n and cleanups. Avoid duplicated code, for example, by using common help\n functions. Otherwise, the resulting suite becomes difficult to read and\n understand, and expensive to maintain.\n- Larger test cases make it harder to tell what went wrong if it fails. Also,\n large portions of test code risk being skipped when errors occur.\n- Readability and maintainability suffer when test cases become too large and\n extensive. It is not certain that the resulting log files reflect very well\n the number of tests performed.\n\nThe test case function takes one argument, `Config`, which contains\nconfiguration information such as `data_dir` and `priv_dir`. (For details about\nthese, see section\n[Data and Private Directories](write_test_chapter.md#data_priv_dir). The value\nof `Config` at the time of the call, is the same as the return value from\n`init_per_testcase`, mentioned earlier.\n\n> #### Note {: .info }\n>\n> The test case function argument `Config` is not to be confused with the\n> information that can be retrieved from the configuration files (using\n> [`ct:get_config/1/2`](`ct:get_config/1`)). The test case argument `Config` is\n> to be used for runtime configuration of the test suite and the test cases,\n> while configuration files are to contain data related to the SUT. These two\n> types of configuration data are handled differently.\n\nAs parameter `Config` is a list of key-value tuples, that is, a data type called\na property list, it can be handled by the `m:proplists` module. A value can, for\nexample, be searched for and returned with function `proplists:get_value/2`.\nAlso, or alternatively, the general `m:lists` module contains useful functions.\nNormally, the only operations performed on `Config` are insertion (adding a\ntuple to the head of the list) and lookup. To look up a value in the config,\n`proplists:get_value` can be used. For example:\n`PrivDir = proplists:get_value(priv_dir, Config)`.\n\nThe test case result can be customized in several ways. See the manual for\n[`Module:Testcase/1`](`c:ct_suite:'Testcase'/1`) in the `m:ct_suite` module for\ndetails.\n\n[](){: #info_function }","ref":"write_test_chapter.html#test-cases"},{"type":"extras","title":"Test Case Information Function - Writing Test Suites","doc":"For each test case function there can be an extra function with the same name\nbut without arguments. This is the test case information function. It is\nexpected to return a list of tagged tuples that specifies various properties\nregarding the test case.\n\nThe following tags have special meaning:\n\n- **`timetrap`** - Sets the maximum time the test case is allowed to execute. If\n this time is exceeded, the test case fails with reason `timetrap_timeout`.\n Notice that `init_per_testcase` and `end_per_testcase` are included in the\n timetrap time. For details, see section\n [Timetrap Time-Outs](write_test_chapter.md#timetraps).\n\n- **`userdata`** - Specifies any data related to the test case. This data can be\n retrieved at any time using the `ct:userdata/3` utility function.\n\n- **`silent_connections`** - For details, see section\n [Silent Connections](run_test_chapter.md#silent_connections).\n\n- **`require`** - Specifies configuration variables required by the test case.\n If the required configuration variables are not found in any of the test\n system configuration files, the test case is skipped.\n\n A required variable can also be given a default value to be used if the\n variable is not found in any configuration file. To specify a default value,\n add a tuple on the form `{default_config,ConfigVariableName,Value}` to the\n test case information list (the position in the list is irrelevant).\n\n _Examples:_\n\n ```erlang\n testcase1() ->\n [{require, ftp},\n {default_config, ftp, [{ftp, \"my_ftp_host\"},\n {username, \"aladdin\"},\n {password, \"sesame\"}]}}].\n ```\n\n ```erlang\n testcase2() ->\n [{require, unix_telnet, unix},\n {require, {unix, [telnet, username, password]}},\n {default_config, unix, [{telnet, \"my_telnet_host\"},\n {username, \"aladdin\"},\n {password, \"sesame\"}]}}].\n ```\n\nFor more information about `require`, see section\n[Requiring and Reading Configuration Data](config_file_chapter.md#require_config_data)\nin section External Configuration Data and function\n[`ct:require/1/2`](`ct:require/1`).\n\n> #### Note {: .info }\n>\n> Specifying a default value for a required variable can result in a test case\n> always getting executed. This might not be a desired behavior.\n\nIf `timetrap` or `require`, or both, is not set specifically for a particular\ntest case, default values specified by function\n[`suite/0`](`c:ct_suite:suite/0`) are used.\n\nTags other than the earlier mentioned are ignored by the test server.\n\nAn example of a test case information function follows:\n\n```erlang\nreboot_node() ->\n [\n {timetrap,{seconds,60}},\n {require,interfaces},\n {userdata,\n [{description,\"System Upgrade: RpuAddition Normal RebootNode\"},\n {fts,\"http://someserver.ericsson.se/test_doc4711.pdf\"}]}\n ].\n```\n\n[](){: #suite }","ref":"write_test_chapter.html#test-case-information-function"},{"type":"extras","title":"Test Suite Information Function - Writing Test Suites","doc":"Function [`suite/0`](`c:ct_suite:suite/0`) can, for example, be used in a test\nsuite module to set a default `timetrap` value and to `require` external\nconfiguration data. If a test case, or a group information function also\nspecifies any of the information tags, it overrides the default values set by\n`suite/0`. For details, see\n[Test Case Information Function](write_test_chapter.md#info_function) and\n[Test Case Groups](write_test_chapter.md#test_case_groups).\n\nThe following options can also be specified with the suite information list:\n\n- `stylesheet`, see [HTML Style Sheets](run_test_chapter.md#html_stylesheet)\n- `userdata`, see\n [Test Case Information Function](write_test_chapter.md#info_function)\n- `silent_connections`, see\n [Silent Connections](run_test_chapter.md#silent_connections)\n\nAn example of the suite information function follows:\n\n```erlang\nsuite() ->\n [\n {timetrap,{minutes,10}},\n {require,global_names},\n {userdata,[{info,\"This suite tests database transactions.\"}]},\n {silent_connections,[telnet]},\n {stylesheet,\"db_testing.css\"}\n ].\n```\n\n[](){: #test_case_groups }","ref":"write_test_chapter.html#test-suite-information-function"},{"type":"extras","title":"Test Case Groups - Writing Test Suites","doc":"A test case group is a set of test cases sharing configuration functions and\nexecution properties. Test case groups are defined by function\n[`groups/0`](`c:ct_suite:groups/0`) that should return a term having the\nfollowing syntax:\n\n```text\ngroups() -> GroupDefs\n\nTypes:\n\nGroupDefs = [GroupDef]\nGroupDef = {GroupName,Properties,GroupsAndTestCases}\nGroupName = atom()\nGroupsAndTestCases = [GroupDef | {group,GroupName} | TestCase |\n {testcase,TestCase,TCRepeatProps}]\nTestCase = atom()\nTCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]\n```\n\n`GroupName` is the name of the group and must be unique within the test suite\nmodule. Groups can be nested, by including a group definition within the\n`GroupsAndTestCases` list of another group. `Properties` is the list of\nexecution properties for the group. The possible values are as follows:\n\n```erlang\nProperties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]\nShuffle = shuffle | {shuffle,Seed}\nSeed = {integer(),integer(),integer()}\nGroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n repeat_until_any_ok | repeat_until_any_fail\nN = integer() | forever\n```\n\n_Explanations:_\n\n- **`parallel`** - `Common Test` executes all test cases in the group in\n parallel.\n\n- **`sequence`** - The cases are executed in a sequence as described in section\n [Sequences](dependencies_chapter.md#sequences) in section Dependencies Between\n Test Cases and Suites.\n\n- **`shuffle`** - The cases in the group are executed in random order.\n\n- **`repeat, repeat_until_*`** - Orders `Common Test` to repeat execution of all\n the cases in the group a given number of times, or until any, or all, cases\n fail or succeed.\n\n_Example:_\n\n```erlang\ngroups() -> [{group1, [parallel], [test1a,test1b]},\n {group2, [shuffle,sequence], [test2a,test2b,test2c]}].\n```\n\nTo specify in which order groups are to be executed (also with respect to test\ncases that are not part of any group), add tuples on the form\n`{group,GroupName}` to the `all/0` list.\n\n_Example:_\n\n```erlang\nall() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].\n```\n\nExecution properties with a group tuple in `all/0`:\n`{group,GroupName,Properties}` can also be specified. These properties override\nthose specified in the group definition (see `groups/0` earlier). This way, the\nsame set of tests can be run, but with different properties, without having to\nmake copies of the group definition in question.\n\nIf a group contains subgroups, the execution properties for these can also be\nspecified in the group tuple: `{group,GroupName,Properties,SubGroups}` Where,\n`SubGroups` is a list of tuples, `{GroupName,Properties}` or\n`{GroupName,Properties,SubGroups}` representing the subgroups. Any subgroups\ndefined in `groups/0` for a group, that are not specified in the `SubGroups`\nlist, executes with their predefined properties.\n\n_Example:_\n\n```erlang\ngroups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},\n {tests3, [], [t31,t3b]}]}].\n```\n\nTo execute group `tests1` twice with different properties for `tests2` each\ntime:\n\n```erlang\nall() ->\n [{group, tests1, default, [{tests2, [parallel]}]},\n {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].\n```\n\nThis is equivalent to the following specification:\n\n```erlang\nall() ->\n [{group, tests1, default, [{tests2, [parallel]},\n {tests3, default}]},\n {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},\n {tests3, default}]}].\n```\n\nValue `default` states that the predefined properties are to be used.\n\nThe following example shows how to override properties in a scenario with deeply\nnested groups:\n\n```erlang\ngroups() ->\n [{tests1, [], [{group, tests2}]},\n {tests2, [], [{group, tests3}]},\n {tests3, [{repeat,2}], [t3a,t3b,t3c]}].\n\nall() ->\n [{group, tests1, default,\n [{tests2, default,\n [{tests3, [parallel,{repeat,100}]}]}]}].\n```\n\nFor ease of readability, all syntax definitions can be replaced by a function\ncall whose return value should match the expected syntax case.\n\n_Example:_\n\n```erlang\nall() ->\n [{group, tests1, default, test_cases()},\n {group, tests1, default, [shuffle_test(),\n {tests3, default}]}].\ntest_cases() ->\n [{tests2, [parallel]}, {tests3, default}].\n\nshuffle_test() ->\n {tests2, [shuffle,{repeat,10}]}.\n```\n\nThe described syntax can also be used in test specifications to change group\nproperties at the time of execution, without having to edit the test suite. For\nmore information, see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results.\n\nAs illustrated, properties can be combined. If, for example, `shuffle`,\n`repeat_until_any_fail`, and `sequence` are all specified, the test cases in the\ngroup are executed repeatedly, and in random order, until a test case fails.\nThen execution is immediately stopped and the remaining cases are skipped.\n\nBefore execution of a group begins, the configuration function\n[`init_per_group(GroupName, Config)`](`c:ct_suite:init_per_group/2`) is called.\nThe list of tuples returned from this function is passed to the test cases in\nthe usual manner by argument `Config`. `init_per_group/2` is meant to be used\nfor initializations common for the test cases in the group. After execution of\nthe group is finished, function\n[`end_per_group(GroupName, Config)`](`c:ct_suite:end_per_group/2`) is called.\nThis function is meant to be used for cleaning up after `init_per_group/2`. If\nthe init function is defined, so must the end function be.\n\nWhenever a group is executed, if `init_per_group` and `end_per_group` do not\nexist in the suite, `Common Test` calls dummy functions (with the same names)\ninstead. Output generated by hook functions are saved to the log files for these\ndummies. For more information, see section\n[Manipulating Tests](ct_hooks_chapter.md#manipulating) in section Common Test\nHooks.\n\n> #### Note {: .info }\n>\n> `init_per_testcase/2` and `end_per_testcase/2` are always called for each\n> individual test case, no matter if the case belongs to a group or not.\n\nThe properties for a group are always printed in the top of the HTML log for\n`init_per_group/2`. The total execution time for a group is included at the\nbottom of the log for `end_per_group/2`.\n\nTest case groups can be nested so sets of groups can be configured with the same\n`init_per_group/2` and `end_per_group/2` functions. Nested groups can be defined\nby including a group definition, or a group name reference, in the test case\nlist of another group.\n\n_Example:_\n\n```erlang\ngroups() -> [{group1, [shuffle], [test1a,\n {group2, [], [test2a,test2b]},\n test1b]},\n {group3, [], [{group,group4},\n {group,group5}]},\n {group4, [parallel], [test4a,test4b]},\n {group5, [sequence], [test5a,test5b,test5c]}].\n```\n\nIn the previous example, if `all/0` returns group name references in the order\n`[{group,group1},{group,group3}]`, the order of the configuration functions and\ntest cases becomes the following (notice that `init_per_testcase/2` and\n`end_per_testcase/2:` are also always called, but not included in this example\nfor simplification):\n\n```text\ninit_per_group(group1, Config) -> Config1 (*)\n test1a(Config1)\n init_per_group(group2, Config1) -> Config2\n test2a(Config2), test2b(Config2)\n end_per_group(group2, Config2)\n test1b(Config1)\nend_per_group(group1, Config1)\ninit_per_group(group3, Config) -> Config3\n init_per_group(group4, Config3) -> Config4\n test4a(Config4), test4b(Config4) (**)\n end_per_group(group4, Config4)\n init_per_group(group5, Config3) -> Config5\n test5a(Config5), test5b(Config5), test5c(Config5)\n end_per_group(group5, Config5)\nend_per_group(group3, Config3)\n```\n\n(\\*) The order of test case `test1a`, `test1b`, and `group2` is undefined, as\n`group1` has a shuffle property.\n\n(\\*\\*) These cases are not executed in order, but in parallel.\n\nProperties are not inherited from top-level groups to nested subgroups. For\ninstance, in the previous example, the test cases in `group2` are not executed\nin random order (which is the property of `group1`).","ref":"write_test_chapter.html#test-case-groups"},{"type":"extras","title":"Parallel Property and Nested Groups - Writing Test Suites","doc":"If a group has a parallel property, its test cases are spawned simultaneously\nand get executed in parallel. However, a test case is not allowed to execute in\nparallel with `end_per_group/2`, which means that the time to execute a parallel\ngroup is equal to the execution time of the slowest test case in the group. A\nnegative side effect of running test cases in parallel is that the HTML summary\npages are not updated with links to the individual test case logs until function\n`end_per_group/2` for the group has finished.\n\nA group nested under a parallel group starts executing in parallel with previous\n(parallel) test cases (no matter what properties the nested group has). However,\nas test cases are never executed in parallel with `init_per_group/2` or\n`end_per_group/2` of the same group, it is only after a nested group has\nfinished that remaining parallel cases in the previous group become spawned.","ref":"write_test_chapter.html#parallel-property-and-nested-groups"},{"type":"extras","title":"Parallel Test Cases and I/O - Writing Test Suites","doc":"A parallel test case has a private I/O server as its group leader. (For a\ndescription of the group leader concept, see [ERTS](`e:erts:index.html`)). The\ncentral I/O server process, which handles the output from regular test cases and\nconfiguration functions, does not respond to I/O messages during execution of\nparallel groups. This is important to understand to avoid certain traps, like\nthe following:\n\nIf a process, `P`, is spawned during execution of, for example,\n`init_per_suite/1`, it inherits the group leader of the `init_per_suite`\nprocess. This group leader is the central I/O server process mentioned earlier.\nIf, at a later time, _during parallel test case execution_, some event triggers\nprocess `P` to call [`io:format/1/2`](`io:format/1`), that call never returns\n(as the group leader is in a non-responsive state) and causes `P` to hang.","ref":"write_test_chapter.html#parallel-test-cases-and-i-o"},{"type":"extras","title":"Repeated Groups - Writing Test Suites","doc":"[](){: #repeated_groups }\n\nA test case group can be repeated a certain number of times (specified by an\ninteger) or indefinitely (specified by `forever`). The repetition can also be\nstopped too early if any or all cases fail or succeed, that is, if any of the\nproperties `repeat_until_any_fail`, `repeat_until_any_ok`,\n`repeat_until_all_fail`, or `repeat_until_all_ok` is used. If the basic `repeat`\nproperty is used, status of test cases is irrelevant for the repeat operation.\n\nThe status of a subgroup can be returned (`ok` or `failed`), to affect the\nexecution of the group on the level above. This is accomplished by, in\n`end_per_group/2`, looking up the value of `tc_group_properties` in the `Config`\nlist and checking the result of the test cases in the group. If status `failed`\nis to be returned from the group as a result, `end_per_group/2` is to return the\nvalue `{return_group_result,failed}`. The status of a subgroup is taken into\naccount by `Common Test` when evaluating if execution of a group is to be\nrepeated or not (unless the basic `repeat` property is used).\n\nThe value of `tc_group_properties` is a list of status tuples, each with the key\n`ok`, `skipped`, and `failed`. The value of a status tuple is a list with names\nof test cases that have been executed with the corresponding status as result.\n\nThe following is an example of how to return the status from a group:\n\n```erlang\nend_per_group(_Group, Config) ->\n Status = proplists:get_value(tc_group_result, Config),\n case proplists:get_value(failed, Status) of\n [] -> % no failed cases\n {return_group_result,ok};\n _Failed -> % one or more failed\n {return_group_result,failed}\n end.\n```\n\nIt is also possible, in `end_per_group/2`, to check the status of a subgroup\n(maybe to determine what status the current group is to return). This is as\nsimple as illustrated in the previous example, only the group name is stored in\na tuple `{group_result,GroupName}`, which can be searched for in the status\nlists.\n\n_Example:_\n\n```erlang\nend_per_group(group1, Config) ->\n Status = proplists:get_value(tc_group_result, Config),\n Failed = proplists:get_value(failed, Status),\n case lists:member({group_result,group2}, Failed) of\n true ->\n {return_group_result,failed};\n false ->\n {return_group_result,ok}\n end;\n...\n```\n\n> #### Note {: .info }\n>\n> When a test case group is repeated, the configuration functions\n> `init_per_group/2` and `end_per_group/2` are also always called with each\n> repetition.","ref":"write_test_chapter.html#repeated-groups"},{"type":"extras","title":"Shuffled Test Case Order - Writing Test Suites","doc":"The order in which test cases in a group are executed is under normal\ncircumstances the same as the order specified in the test case list in the group\ndefinition. With property `shuffle` set, however, `Common Test` instead executes\nthe test cases in random order.\n\nYou can provide a seed value (a tuple of three integers) with the shuffle\nproperty `{shuffle,Seed}`. This way, the same shuffling order can be created\nevery time the group is executed. If no seed value is specified, `Common Test`\ncreates a \"random\" seed for the shuffling operation (using the return value of\n`erlang:timestamp/0`). The seed value is always printed to the\n`init_per_group/2` log file so that it can be used to recreate the same\nexecution order in a subsequent test run.\n\n> #### Note {: .info }\n>\n> If a shuffled test case group is repeated, the seed is not reset between\n> turns.\n\nIf a subgroup is specified in a group with a `shuffle` property, the execution\norder of this subgroup in relation to the test cases (and other subgroups) in\nthe group, is random. The order of the test cases in the subgroup is however not\nrandom (unless the subgroup has a `shuffle` property).\n\n[](){: #group_info }","ref":"write_test_chapter.html#shuffled-test-case-order"},{"type":"extras","title":"Group Information Function - Writing Test Suites","doc":"The test case group information function, `group(GroupName)`, serves the same\npurpose as the suite- and test case information functions previously described.\nHowever, the scope for the group information function, is all test cases and\nsubgroups in the group in question (`GroupName`).\n\n_Example:_\n\n```erlang\ngroup(connection_tests) ->\n [{require,login_data},\n {timetrap,1000}].\n```\n\nThe group information properties override those set with the suite information\nfunction, and can in turn be overridden by test case information properties. For\na list of valid information properties and more general information, see the\n[Test Case Information Function](write_test_chapter.md#info_function).","ref":"write_test_chapter.html#group-information-function"},{"type":"extras","title":"Information Functions for Init- and End-Configuration - Writing Test Suites","doc":"Information functions can also be used for functions `init_per_suite`,\n`end_per_suite`, `init_per_group`, and `end_per_group`, and they work the same\nway as with the\n[Test Case Information Function](write_test_chapter.md#info_function). This is\nuseful, for example, for setting timetraps and requiring external configuration\ndata relevant only for the configuration function in question (without affecting\nproperties set for groups and test cases in the suite).\n\nThe information function `init/end_per_suite()` is called for\n`init/end_per_suite(Config)`, and information function\n`init/end_per_group(GroupName)` is called for\n`init/end_per_group(GroupName,Config)`. However, information functions cannot be\nused with `init/end_per_testcase(TestCase, Config)`, as these configuration\nfunctions execute on the test case process and use the same properties as the\ntest case (that is, the properties set by the test case information function,\n`TestCase()`). For a list of valid information properties and more general\ninformation, see the\n[Test Case Information Function](write_test_chapter.md#info_function).\n\n[](){: #data_priv_dir }","ref":"write_test_chapter.html#information-functions-for-init-and-end-configuration"},{"type":"extras","title":"Data and Private Directories - Writing Test Suites","doc":"In the data directory, `data_dir`, the test module has its own files needed for\nthe testing. The name of `data_dir` is the name of the test suite followed by\n`\"_data\"`. For example, `\"some_path/foo_SUITE.beam\"` has the data directory\n`\"some_path/foo_SUITE_data/\"`. Use this directory for portability, that is, to\navoid hardcoding directory names in your suite. As the data directory is stored\nin the same directory as your test suite, you can rely on its existence at\nruntime, even if the path to your test suite directory has changed between test\nsuite implementation and execution.\n\n`priv_dir` is the private directory for the test cases. This directory can be\nused whenever a test case (or configuration function) needs to write something\nto file. The name of the private directory is generated by `Common Test`, which\nalso creates the directory.\n\nBy default, `Common Test` creates one central private directory per test run,\nshared by all test cases. This is not always suitable. Especially if the same\ntest cases are executed multiple times during a test run (that is, if they\nbelong to a test case group with property `repeat`) and there is a risk that\nfiles in the private directory get overwritten. Under these circumstances,\n`Common Test` can be configured to create one dedicated private directory per\ntest case and execution instead. This is accomplished with the flag/option\n`create_priv_dir` (to be used with the [`ct_run`](ct_run_cmd.md) program, the\n`ct:run_test/1` function, or as test specification term). There are three\npossible values for this option as follows:\n\n- `auto_per_run`\n- `auto_per_tc`\n- `manual_per_tc`\n\nThe first value indicates the default `priv_dir` behavior, that is, one private\ndirectory created per test run. The two latter values tell `Common Test` to\ngenerate a unique test directory name per test case and execution. If the auto\nversion is used, _all_ private directories are created automatically. This can\nbecome very inefficient for test runs with many test cases or repetitions, or\nboth. Therefore, if the manual version is used instead, the test case must tell\n`Common Test` to create `priv_dir` when it needs it. It does this by calling the\nfunction `ct:make_priv_dir/0`.\n\n> #### Note {: .info }\n>\n> Do not depend on the current working directory for reading and writing data\n> files, as this is not portable. All scratch files are to be written in the\n> `priv_dir` and all data files are to be located in `data_dir`. Also, the\n> `Common Test` server sets the current working directory to the test case log\n> directory at the start of every case.","ref":"write_test_chapter.html#data-and-private-directories"},{"type":"extras","title":"Execution Environment - Writing Test Suites","doc":"Each test case is executed by a dedicated Erlang process. The process is spawned\nwhen the test case starts, and terminated when the test case is finished. The\nconfiguration functions `init_per_testcase` and `end_per_testcase` execute on\nthe same process as the test case.\n\nThe configuration functions `init_per_suite` and `end_per_suite` execute, like\ntest cases, on dedicated Erlang processes.\n\n[](){: #timetraps }","ref":"write_test_chapter.html#execution-environment"},{"type":"extras","title":"Timetrap Time-Outs - Writing Test Suites","doc":"The default time limit for a test case is 30 minutes, unless a `timetrap` is\nspecified either by the suite-, group-, or test case information function. The\ntimetrap time-out value defined by `suite/0` is the value that is used for each\ntest case in the suite (and for the configuration functions `init_per_suite/1`,\n`end_per_suite/1`, `init_per_group/2`, and `end_per_group/2`). A timetrap value\ndefined by `group(GroupName)` overrides one defined by `suite()` and is used for\neach test case in group `GroupName`, and any of its subgroups. If a timetrap\nvalue is defined by `group/1` for a subgroup, it overrides that of its higher\nlevel groups. Timetrap values set by individual test cases (by the test case\ninformation function) override both group- and suite- level timetraps.\n\nA timetrap can also be set or reset dynamically during the execution of a test\ncase, or configuration function. This is done by calling `ct:timetrap/1`. This\nfunction cancels the current timetrap and starts a new one (that stays active\nuntil time-out, or end of the current function).\n\nTimetrap values can be extended with a multiplier value specified at startup\nwith option `multiply_timetraps`. It is also possible to let the test server\ndecide to scale up timetrap time-out values automatically. That is, if tools\nsuch as `cover` or `trace` are running during the test. This feature is disabled\nby default and can be enabled with start option `scale_timetraps`.\n\nIf a test case needs to suspend itself for a time that also gets multiplied by\n`multiply_timetraps` (and possibly also scaled up if `scale_timetraps` is\nenabled), the function `ct:sleep/1` can be used (instead of, for example,\n`timer:sleep/1`).\n\nA function (`fun/0` or `{Mod,Func,Args}` (MFA) tuple) can be specified as\ntimetrap value in the suite-, group- and test case information function, and as\nargument to function `ct:timetrap/1`.\n\n_Examples:_\n\n`{timetrap,{my_test_utils,timetrap,[?MODULE,system_start]}}`\n\n`ct:timetrap(fun() -> my_timetrap(TestCaseName, Config) end)`\n\nThe user timetrap function can be used for two things as follows:\n\n- To act as a timetrap. The time-out is triggered when the function returns.\n- To return a timetrap time value (other than a function).\n\nBefore execution of the timetrap function (which is performed on a parallel,\ndedicated timetrap process), `Common Test` cancels any previously set timer for\nthe test case or configuration function. When the timetrap function returns, the\ntime-out is triggered, _unless_ the return value is a valid timetrap time, such\nas an integer, or a `{SecMinOrHourTag,Time}` tuple (for details, see module\n`m:ct_suite`). If a time value is returned, a new timetrap is started to\ngenerate a time-out after the specified time.\n\nThe user timetrap function can return a time value after a delay. The effective\ntimetrap time is then the delay time _plus_ the returned time.\n\n[](){: #logging }","ref":"write_test_chapter.html#timetrap-time-outs"},{"type":"extras","title":"Logging - Categories and Verbosity Levels - Writing Test Suites","doc":"`Common Test` provides the following three main functions for printing strings:\n\n- `ct:log(Category, Importance, Format, FormatArgs, Opts)`\n- `ct:print(Category, Importance, Format, FormatArgs)`\n- `ct:pal(Category, Importance, Format, FormatArgs)`\n\nThe [`log/1,2,3,4,5`](`ct:log/1`) function prints a string to the test case log\nfile. The [`print/1,2,3,4`](`ct:print/1`) function prints the string to screen.\nThe [`pal/1,2,3,4`](`ct:pal/1`) function prints the same string both to file and\nscreen. The functions are described in module `m:ct`.\n\nThe optional `Category` argument can be used to categorize the log printout.\nCategories can be used for two things as follows:\n\n- To compare the importance of the printout to a specific verbosity level.\n- To format the printout according to a user-specific HTML Style Sheet (CSS).\n\nArgument `Importance` specifies a level of importance that, compared to a\nverbosity level (general and/or set per category), determines if the printout is\nto be visible. `Importance` is any integer in the range 0..99. Predefined\nconstants exist in the `ct.hrl` header file. The default importance level,\n`?STD_IMPORTANCE` (used if argument `Importance` is not provided), is 50. This\nis also the importance used for standard I/O, for example, from printouts made\nwith `io:format/2`, `io:put_chars/1`, and so on.\n\n`Importance` is compared to a verbosity level set by the `verbosity` start\nflag/option. The level can be set per category or generally, or both. If\n`verbosity` is not set by the user, a level of 100 (`?MAX_VERBOSITY` = all\nprintouts visible) is used as default value. `Common Test` performs the\nfollowing test:\n\n```text\nImportance >= (100-VerbosityLevel)\n```\n\nThe constant `?STD_VERBOSITY` has value 50 (see `ct.hrl`). At this level, all\nstandard I/O gets printed. If a lower verbosity level is set, standard I/O\nprintouts are ignored. Verbosity level 0 effectively turns all logging off\n(except from printouts made by `Common Test` itself).\n\nThe general verbosity level is not associated with any particular category. This\nlevel sets the threshold for the standard I/O printouts, uncategorized\n`ct:log/print/pal` printouts, and printouts for categories with undefined\nverbosity level.\n\n_Examples:_\n\nSome printouts during test case execution:\n\n```erlang\nio:format(\"1. Standard IO, importance = ~w~n\", [?STD_IMPORTANCE]),\nct:log(\"2. Uncategorized, importance = ~w\", [?STD_IMPORTANCE]),\n ct:log(info, \"3. Categorized info, importance = ~w\", [?STD_IMPORTANCE]),\n ct:log(info, ?LOW_IMPORTANCE, \"4. Categorized info, importance = ~w\", [?LOW_IMPORTANCE]),\n ct:log(error, ?HI_IMPORTANCE, \"5. Categorized error, importance = ~w\", [?HI_IMPORTANCE]),\n ct:log(error, ?MAX_IMPORTANCE, \"6. Categorized error, importance = ~w\", [?MAX_IMPORTANCE]),\n```\n\nIf starting the test with a general verbosity level of 50 (`?STD_VERBOSITY`):\n\n```text\n$ ct_run -verbosity 50\n```\n\nthe following is printed:\n\n```text\n1. Standard IO, importance = 50\n2. Uncategorized, importance = 50\n3. Categorized info, importance = 50\n5. Categorized error, importance = 75\n6. Categorized error, importance = 99\n```\n\nIf starting the test with:\n\n```text\n$ ct_run -verbosity 1 and info 75\n```\n\nthe following is printed:\n\n```erlang\n3. Categorized info, importance = 50\n4. Categorized info, importance = 25\n6. Categorized error, importance = 99\n```\n\nNote that the category argument is not required in order to only specify the\nimportance of a printout. Example:\n\n```erlang\nct:pal(?LOW_IMPORTANCE, \"Info report: ~p\", [Info])\n```\n\nOr perhaps in combination with constants:\n\n```erlang\n-define(INFO, ?LOW_IMPORTANCE).\n-define(ERROR, ?HI_IMPORTANCE).\n\nct:log(?INFO, \"Info report: ~p\", [Info])\nct:pal(?ERROR, \"Error report: ~p\", [Error])\n```\n\nThe functions `ct:set_verbosity/2` and `ct:get_verbosity/1` may be used to\nmodify and read verbosity levels during test execution.\n\nThe arguments `Format` and `FormatArgs` in `ct:log/print/pal` are always passed\non to the STDLIB function `io:format/3` (For details, see the `m:io` manual\npage).\n\n`ct:pal/4` and `ct:log/5` add headers to strings being printed to the log file.\nThe strings are also wrapped in div tags with a CSS class attribute, so that\nstylesheet formatting can be applied. To disable this feature for a printout\n(i.e. to get a result similar to using `io:format/2`), call `ct:log/5` with the\n`no_css` option.\n\nHow categories can be mapped to CSS tags is documented in section\n[HTML Style Sheets](run_test_chapter.md#html_stylesheet) in section Running\nTests and Analyzing Results.\n\nCommon Test will escape special HTML characters (<, > and &) in printouts to the\nlog file made with `ct:pal/4` and `io:format/2`. In order to print strings with\nHTML tags to the log, use the `ct:log/3,4,5` function. The character escaping\nfeature is per default disabled for `ct:log/3,4,5` but can be enabled with the\n`esc_chars` option in the `Opts` list, see [`ct:log/3,4,5`](`ct:log/5`).\n\nIf the character escaping feature needs to be disabled (typically for backwards\ncompatibility reasons), use the `ct_run` start flag `-no_esc_chars`, or the\n`ct:run_test/1` start option `{esc_chars,Bool}` (this start option is also\nsupported in test specifications).\n\nFor more information about log files, see section\n[Log Files](run_test_chapter.md#log_files) in section Running Tests and\nAnalyzing Results.","ref":"write_test_chapter.html#logging-categories-and-verbosity-levels"},{"type":"extras","title":"Illegal Dependencies - Writing Test Suites","doc":"Even though it is highly efficient to write test suites with the `Common Test`\nframework, mistakes can be made, mainly because of illegal dependencies. Some of\nthe more frequent mistakes from our own experience with running the Erlang/OTP\ntest suites follows:\n\n- Depending on current directory, and writing there:\n\n This is a common error in test suites. It is assumed that the current\n directory is the same as the author used as current directory when the test\n case was developed. Many test cases even try to write scratch files to this\n directory. Instead `data_dir` and `priv_dir` are to be used to locate data and\n for writing scratch files.\n\n- Depending on execution order:\n\n During development of test suites, make no assumptions on the execution order\n of the test cases or suites. For example, a test case must not assume that a\n server it depends on is already started by a previous test case. Reasons for\n this follows:\n\n - The user/operator can specify the order at will, and maybe a different\n execution order is sometimes more relevant or efficient.\n - If the user specifies a whole directory of test suites for the test, the\n execution order of the suites depends on how the files are listed by the\n operating system, which varies between systems.\n - If a user wants to run only a subset of a test suite, there is no way one\n test case could successfully depend on another.\n\n- Depending on Unix:\n\n Running Unix commands through `os:cmd` are likely not to work on non-Unix\n platforms.\n\n- Nested test cases:\n\n Starting a test case from another not only tests the same thing twice, but\n also makes it harder to follow what is being tested. Also, if the called test\n case fails for some reason, so do the caller. This way, one error gives cause\n to several error reports, which is to be avoided.\n\n Functionality common for many test case functions can be implemented in common\n help functions. If these functions are useful for test cases across suites,\n put the help functions into common help modules.\n\n- Failure to crash or exit when things go wrong:\n\n Making requests without checking that the return value indicates success can\n be OK if the test case fails later, but it is never acceptable just to print\n an error message (into the log file) and return successfully. Such test cases\n do harm, as they create a false sense of security when overviewing the test\n results.\n\n- Messing up for subsequent test cases:\n\n Test cases are to restore as much of the execution environment as possible, so\n that subsequent test cases do not crash because of their execution order. The\n function [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) is suitable for\n this.","ref":"write_test_chapter.html#illegal-dependencies"},{"type":"extras","title":"Test Structure","doc":"\n# Test Structure","ref":"test_structure_chapter.html"},{"type":"extras","title":"General - Test Structure","doc":"A test is performed by running one or more test suites. A test suite consists of\ntest cases, configuration functions, and information functions. Test cases can\nbe grouped in so called test case groups. A test suite is an Erlang module and\ntest cases are implemented as Erlang functions. Test suites are stored in test\ndirectories.\n\n[](){: #skipping_test_cases }","ref":"test_structure_chapter.html#general"},{"type":"extras","title":"Skipping Test Cases - Test Structure","doc":"Certain test cases can be skipped, for example, if you know beforehand that a\nspecific test case fails. The reason can be functionality that is not yet\nimplemented, a bug that is known but not yet fixed, or some functionality that\ndoes not work or is not applicable on a specific platform.\n\nTest cases can be skipped in the following ways:\n\n- Using `skip_suites` and `skip_cases` terms in\n [test specifications](run_test_chapter.md#test_specifications).\n- Returning `{skip,Reason}` from function\n [`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) or\n [`init_per_suite/1`](`c:ct_suite:init_per_suite/1`).\n- Returning `{skip,Reason}` from the execution clause of the test case. The\n execution clause is called, so the author must ensure that the test case does\n not run.\n\nWhen a test case is skipped, it is noted as `SKIPPED` in the HTML log.","ref":"test_structure_chapter.html#skipping-test-cases"},{"type":"extras","title":"Definition of Terms - Test Structure","doc":"- **_Auto-skipped test case_** - When a configuration function fails (that is,\n terminates unexpectedly), the test cases depending on the configuration\n function are skipped automatically by `Common Test`. The status of the test\n cases is then \"auto-skipped\". Test cases are also \"auto-skipped\" by\n `Common Test` if the required configuration data is unavailable at runtime.\n\n- **_Configuration function_** - A function in a test suite that is meant to be\n used for setting up, cleaning up, and/or verifying the state and environment\n on the System Under Test (SUT) and/or the `Common Test` host node, so that a\n test case (or a set of test cases) can execute correctly.\n\n- **_Configuration file_** - A file containing data related to a test and/or an\n SUT, for example, protocol server addresses, client login details, and\n hardware interface addresses. That is, any data that is to be handled as\n variable in the suite and not be hard-coded.\n\n- **_Configuration variable_** - A name (an Erlang atom) associated with a data\n value read from a configuration file.\n\n- **`data_dir`** - Data directory for a test suite. This directory contains any\n files used by the test suite, for example, extra Erlang modules, binaries, or\n data files.\n\n- **_Information function_** - A function in a test suite that returns a list of\n properties (read by the `Common Test` server) that describes the conditions\n for executing the test cases in the suite.\n\n- **_Major log file_** - An overview and summary log file for one or more test\n suites.\n\n- **_Minor log file_** - A log file for one particular test case. Also called\n the test case log file.\n\n- **`priv_dir`** - Private directory for a test suite. This directory is to be\n used when the test suite needs to write to files.\n\n- **`ct_run`** - The name of an executable program that can be used as an\n interface for specifying and running tests with `Common Test`.\n\n- **_Test case_** - A single test included in a test suite. A test case is\n implemented as a function in a test suite module.\n\n- **_Test case group_** - A set of test cases sharing configuration functions\n and execution properties. The execution properties specify if the test cases\n in the group are to be executed in random order, in parallel, or in sequence,\n and if the execution of the group is be repeated. Test case groups can also be\n nested. That is, a group can, besides test cases, contain subgroups.\n\n- **_Test suite_** - An Erlang module containing a collection of test cases for\n a specific functional area.\n\n- **_Test directory_** - A directory containing one or more test suite modules,\n that is, a group of test suites.\n\n- **_Argument_ `Config`** - A list of key-value tuples (that is, a property\n list) containing runtime configuration data passed from the configuration\n functions to the test cases.\n\n- **_User-skipped test case_** - The status of a test case explicitly skipped in\n any of the ways described in section\n [Skipping Test Cases](test_structure_chapter.md#skipping_test_cases).","ref":"test_structure_chapter.html#definition-of-terms"},{"type":"extras","title":"Examples and Templates","doc":"\n# Examples and Templates\n\n[](){: #top }","ref":"example_chapter.html"},{"type":"extras","title":"Test Suite Example - Examples and Templates","doc":"The following example test suite shows some tests of a database server:\n\n```erlang\n-module(db_data_type_SUITE).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%% Test server callbacks\n-export([suite/0, all/0,\n init_per_suite/1, end_per_suite/1,\n init_per_testcase/2, end_per_testcase/2]).\n\n%% Test cases\n-export([string/1, integer/1]).\n\n-define(CONNECT_STR, \"DSN=sqlserver;UID=alladin;PWD=sesame\").\n\n%%--------------------------------------------------------------------\n%% COMMON TEST CALLBACK FUNCTIONS\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Returns list of tuples to set default properties\n%% for the suite.\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{minutes,1}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) -> Config1\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Initialization before the suite.\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n {ok, Ref} = db:connect(?CONNECT_STR, []),\n TableName = db_lib:unique_table_name(),\n [{con_ref, Ref },{table_name, TableName}| Config].\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config) -> term()\n%%\n%% Config = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after the suite.\n%%--------------------------------------------------------------------\nend_per_suite(Config) ->\n Ref = proplists:get_value(con_ref, Config),\n db:disconnect(Ref),\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) -> Config1\n%%\n%% TestCase = atom()\n%% Name of the test case that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Initialization before each test case.\n%%--------------------------------------------------------------------\ninit_per_testcase(Case, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:create_table(Ref, TableName, table_type(Case)),\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config) -> term()\n%%\n%% TestCase = atom()\n%% Name of the test case that is finished.\n%% Config = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after each test case.\n%%--------------------------------------------------------------------\nend_per_testcase(_Case, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:delete_table(Ref, TableName),\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases\n%%\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% Name of a test case group.\n%% TestCase = atom()\n%% Name of a test case.\n%%\n%% Description: Returns the list of groups and test cases that\n%% are to be executed.\n%%--------------------------------------------------------------------\nall() ->\n [string, integer].\n\n\n%%--------------------------------------------------------------------\n%% TEST CASES\n%%--------------------------------------------------------------------\n\nstring(Config) ->\n insert_and_lookup(dummy_key, \"Dummy string\", Config).\n\ninteger(Config) ->\n insert_and_lookup(dummy_key, 42, Config).\n\n\ninsert_and_lookup(Key, Value, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:insert(Ref, TableName, Key, Value),\n [Value] = db:lookup(Ref, TableName, Key),\n ok = db:delete(Ref, TableName, Key),\n [] = db:lookup(Ref, TableName, Key),\n ok.\n```","ref":"example_chapter.html#test-suite-example"},{"type":"extras","title":"Test Suite Templates - Examples and Templates","doc":"The Erlang mode for the Emacs editor includes two `Common Test` test suite\ntemplates, one with extensive information in the function headers, and one with\nminimal information. A test suite template provides a quick start for\nimplementing a suite from scratch and gives a good overview of the available\ncallback functions. The two templates follows:\n\n_Large Common Test Suite_\n\n```erlang\n%%%-------------------------------------------------------------------\n%%% File : example_SUITE.erl\n%%% Author :\n%%% Description :\n%%%\n%%% Created :\n%%%-------------------------------------------------------------------\n-module(example_SUITE).\n\n%% Note: This directive should only be used in test suites.\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%%--------------------------------------------------------------------\n%% COMMON TEST CALLBACK FUNCTIONS\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Returns list of tuples to set default properties\n%% for the suite.\n%%\n%% Note: The suite/0 function is only meant to be used to return\n%% default data values, not perform any other operations.\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{minutes,10}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the suite.\n%%\n%% Description: Initialization before the suite.\n%%\n%% Note: This function is free to add any key/value pairs to the Config\n%% variable, but should NOT alter/remove any existing entries.\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config0) -> term() | {save_config,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after the suite.\n%%--------------------------------------------------------------------\nend_per_suite(_Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_group(GroupName, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% GroupName = atom()\n%% Name of the test case group that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding configuration data for the group.\n%% Reason = term()\n%% The reason for skipping all test cases and subgroups in the group.\n%%\n%% Description: Initialization before each test case group.\n%%--------------------------------------------------------------------\ninit_per_group(_GroupName, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_group(GroupName, Config0) ->\n%% term() | {save_config,Config1}\n%%\n%% GroupName = atom()\n%% Name of the test case group that is finished.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding configuration data for the group.\n%%\n%% Description: Cleanup after each test case group.\n%%--------------------------------------------------------------------\nend_per_group(_GroupName, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% TestCase = atom()\n%% Name of the test case that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the test case.\n%%\n%% Description: Initialization before each test case.\n%%\n%% Note: This function is free to add any key/value pairs to the Config\n%% variable, but should NOT alter/remove any existing entries.\n%%--------------------------------------------------------------------\ninit_per_testcase(_TestCase, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config0) ->\n%% term() | {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%%--------------------------------------------------------------------\nend_per_testcase(_TestCase, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: groups() -> [Group]\n%%\n%% Group = {GroupName,Properties,GroupsAndTestCases}\n%% GroupName = atom()\n%% The name of the group.\n%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}]\n%% Group properties that may be combined.\n%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase]\n%% TestCase = atom()\n%% The name of a test case.\n%% Shuffle = shuffle | {shuffle,Seed}\n%% To get cases executed in random order.\n%% Seed = {integer(),integer(),integer()}\n%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n%% repeat_until_any_ok | repeat_until_any_fail\n%% To get execution of cases repeated.\n%% N = integer() | forever\n%%\n%% Description: Returns a list of test case group definitions.\n%%--------------------------------------------------------------------\ngroups() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases | {skip,Reason}\n%%\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% Name of a test case group.\n%% TestCase = atom()\n%% Name of a test case.\n%% Reason = term()\n%% The reason for skipping all groups and test cases.\n%%\n%% Description: Returns the list of groups and test cases that\n%% are to be executed.\n%%--------------------------------------------------------------------\nall() ->\n [my_test_case].\n\n\n%%--------------------------------------------------------------------\n%% TEST CASES\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: TestCase() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Test case info function - returns list of tuples to set\n%% properties for the test case.\n%%\n%% Note: This function is only meant to be used to return a list of\n%% values, not perform any other operations.\n%%--------------------------------------------------------------------\nmy_test_case() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase(Config0) ->\n%% ok | exit() | {skip,Reason} | {comment,Comment} |\n%% {save_config,Config1} | {skip_and_save,Reason,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the test case.\n%% Comment = term()\n%% A comment about the test case that will be printed in the html log.\n%%\n%% Description: Test case function. (The name of it must be specified in\n%% the all/0 list or in a test case group for the test case\n%% to be executed).\n%%--------------------------------------------------------------------\nmy_test_case(_Config) ->\n ok.\n```\n\n_Small Common Test Suite_\n\n```erlang\n%%%-------------------------------------------------------------------\n%%% File : example_SUITE.erl\n%%% Author :\n%%% Description :\n%%%\n%%% Created :\n%%%-------------------------------------------------------------------\n-module(example_SUITE).\n\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%% Info = [tuple()]\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{seconds,30}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config0) -> term() | {save_config,Config1}\n%% Config0 = Config1 = [tuple()]\n%%--------------------------------------------------------------------\nend_per_suite(_Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_group(GroupName, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% GroupName = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_group(_GroupName, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_group(GroupName, Config0) ->\n%% term() | {save_config,Config1}\n%% GroupName = atom()\n%% Config0 = Config1 = [tuple()]\n%%--------------------------------------------------------------------\nend_per_group(_GroupName, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% TestCase = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_testcase(_TestCase, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config0) ->\n%% term() | {save_config,Config1} | {fail,Reason}\n%% TestCase = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\nend_per_testcase(_TestCase, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: groups() -> [Group]\n%% Group = {GroupName,Properties,GroupsAndTestCases}\n%% GroupName = atom()\n%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}]\n%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase]\n%% TestCase = atom()\n%% Shuffle = shuffle | {shuffle,{integer(),integer(),integer()}}\n%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n%% repeat_until_any_ok | repeat_until_any_fail\n%% N = integer() | forever\n%%--------------------------------------------------------------------\ngroups() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases | {skip,Reason}\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% TestCase = atom()\n%% Reason = term()\n%%--------------------------------------------------------------------\nall() ->\n [my_test_case].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase() -> Info\n%% Info = [tuple()]\n%%--------------------------------------------------------------------\nmy_test_case() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase(Config0) ->\n%% ok | exit() | {skip,Reason} | {comment,Comment} |\n%% {save_config,Config1} | {skip_and_save,Reason,Config1}\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%% Comment = term()\n%%--------------------------------------------------------------------\nmy_test_case(_Config) ->\n ok.\n```","ref":"example_chapter.html#test-suite-templates"},{"type":"extras","title":"Running Tests and Analyzing Results","doc":"\n# Running Tests and Analyzing Results","ref":"run_test_chapter.html"},{"type":"extras","title":"Using the Common Test Framework - Running Tests and Analyzing Results","doc":"The `Common Test` framework provides a high-level operator interface for\ntesting, providing the following features:\n\n- Automatic compilation of test suites (and help modules)\n- Creation of extra HTML pages for improved overview.\n- Single-command interface for running all available tests\n- Handling of configuration files specifying data related to the System Under\n Test (SUT) (and any other variable data)\n- Mode for running multiple independent test sessions in parallel with central\n control and configuration","ref":"run_test_chapter.html#using-the-common-test-framework"},{"type":"extras","title":"Automatic Compilation of Test Suites and Help Modules - Running Tests and Analyzing Results","doc":"When `Common Test` starts, it automatically attempts to compile any suites\nincluded in the specified tests. If particular suites are specified, only those\nsuites are compiled. If a particular test object directory is specified (meaning\nall suites in this directory are to be part of the test), `Common Test` runs\nfunction `make:all/1` in the directory to compile the suites.\n\nIf compilation fails for one or more suites, the compilation errors are printed\nto tty and the operator is asked if the test run is to proceed without the\nmissing suites, or be aborted. If the operator chooses to proceed, the tests\nhaving missing suites are noted in the HTML log. If `Common Test` is unable to\nprompt the user after compilation failure (if `Common Test` does not control\n`stdin`), the test run proceeds automatically without the missing suites. This\nbehavior can however be modified with the `ct_run` flag\n`-abort_if_missing_suites`, or the `ct:run_test/1` option\n`{abort_if_missing_suites,TrueOrFalse}`. If `abort_if_missing_suites` is set to\n`true`, the test run stops immediately if some suites fail to compile.\n\nAny help module (that is, regular Erlang module with name not ending with\n\"\\_SUITE\") that resides in the same test object directory as a suite, which is\npart of the test, is also automatically compiled. A help module is not mistaken\nfor a test suite (unless it has a \"\\_SUITE\" name). All help modules in a\nparticular test object directory are compiled, no matter if all or only\nparticular suites in the directory are part of the test.\n\nIf test suites or help modules include header files stored in other locations\nthan the test directory, these include directories can be specified by using\nflag `-include` with [`ct_run`](ct_run_cmd.md), or option `include` with\n`ct:run_test/1`. Also, an include path can be specified with an OS environment\nvariable, `CT_INCLUDE_PATH`.\n\n_Example (bash):_\n\n`$ export CT_INCLUDE_PATH=~testuser/common_suite_files/include:~testuser/common_lib_files/include`\n\n`Common Test` passes all include directories (specified either with flag/option\n`include`, or variable `CT_INCLUDE_PATH` , or both, to the compiler.\n\nInclude directories can also be specified in test specifications, see\n[Test Specifications](run_test_chapter.md#test_specifications).\n\nIf the user wants to run all test suites for a test object (or an OTP\napplication) by specifying only the top directory (for example, with start\nflag/option `dir`), `Common Test` primarily looks for test suite modules in a\nsubdirectory named `test`. If this subdirectory does not exist, the specified\ntop directory is assumed to be the test directory, and test suites are read from\nthere instead.\n\nTo disable the automatic compilation feature, use flag `-no_auto_compile` with\n`ct_run`, or option `{auto_compile,false}` with `ct:run_test/1`. With automatic\ncompilation disabled, the user is responsible for compiling the test suite\nmodules (and any help modules) before the test run. If the modules cannot be\nloaded from the local file system during startup of `Common Test`, the user must\npreload the modules before starting the test. `Common Test` only verifies that\nthe specified test suites exist (that is, that they are, or can be, loaded).\nThis is useful, for example, if the test suites are transferred and loaded as\nbinaries through RPC from a remote node.\n\n[](){: #ct_run }","ref":"run_test_chapter.html#automatic-compilation-of-test-suites-and-help-modules"},{"type":"extras","title":"Running Tests from the OS Command Line - Running Tests and Analyzing Results","doc":"The [`ct_run`](ct_run_cmd.md) program can be used for running tests from the OS\ncommand line, for example, as follows:\n\n- `ct_run -config -dir `\n- `ct_run -config -suite `\n- `ct_run -userconfig -suite `\n- `ct_run -config -suite -group -case `\n\n_Examples:_\n\n```text\n$ ct_run -config $CFGS/sys1.cfg $CFGS/sys2.cfg -dir $SYS1_TEST $SYS2_TEST\n$ ct_run -userconfig ct_config_xml $CFGS/sys1.xml $CFGS/sys2.xml -dir $SYS1_TEST $SYS2_TEST\n$ ct_run -suite $SYS1_TEST/setup_SUITE $SYS2_TEST/config_SUITE\n$ ct_run -suite $SYS1_TEST/setup_SUITE -case start stop\n$ ct_run -suite $SYS1_TEST/setup_SUITE -group installation -case start stop\n```\n\nThe flags `dir`, `suite`, and `group/case` can be combined. For example, to run\n`x_SUITE` and `y_SUITE` in directory `testdir`, as follows:\n\n```text\n$ ct_run -dir ./testdir -suite x_SUITE y_SUITE\n```\n\nThis has the same effect as the following:\n\n```text\n$ ct_run -suite ./testdir/x_SUITE ./testdir/y_SUITE\n```\n\nFor details, see\n[Test Case Group Execution](run_test_chapter.md#group_execution).\n\nThe following flags can also be used with [`ct_run`](ct_run_cmd.md):\n\n- **`-help`** - Lists all available start flags.\n\n- **`-logdir `** - Specifies where the HTML log files are to be written.\n\n- **`-label `** - Associates the test run with a name that\n gets printed in the overview HTML log files.\n\n- **`-refresh_logs`** - Refreshes the top-level HTML index files.\n\n- **`-shell`** - Starts interactive shell mode (described later).\n\n- **`-step [step_opts]`** - Steps through test cases using the Erlang Debugger\n (described later).\n\n- **`-spec `** - Uses test specification as input (described later).\n\n- **`-allow_user_terms`** - Allows user-specific terms in a test specification\n (described later).\n\n- **`-silent_connections [conn_types]`** - , tells `Common Test` to suppress\n printouts for specified connections (described later).\n\n- **`-stylesheet `** - Points out a user HTML style sheet (described\n later).\n\n- **`-cover `** - To perform code coverage test (see\n [Code Coverage Analysis](cover_chapter.md#cover)).\n\n- **`-cover_stop `** - To specify if the `cover` tool is to be stopped\n after the test is completed (see\n [Code Coverage Analysis](cover_chapter.md#cover_stop)).\n\n- **`-event_handler `** - To install\n [event handlers](event_handler_chapter.md#event_handling).\n\n- **`-event_handler_init `** - To install\n [event handlers](event_handler_chapter.md#event_handling) including start\n arguments.\n\n- **`-ct_hooks `** - To install\n [Common Test Hooks](ct_hooks_chapter.md#installing) including start arguments.\n\n- **`-ct_hooks_order [test|config]`** - To modify\n [Common Test Hooks](ct_hooks_chapter.md#installing) execution order.\n\n- **`-enable_builtin_hooks `** - To enable or disable\n [Built-in Common Test Hooks](ct_hooks_chapter.md#builtin_cths). Default is\n `true`.\n\n- **`-include`** - Specifies include directories (described earlier).\n\n- **`-no_auto_compile`** - Disables the automatic test suite compilation feature\n (described earlier).\n\n- **`-abort_if_missing_suites`** - Aborts the test run if one or more suites\n fail to compile (described earlier).\n\n- **`-multiply_timetraps `** - Extends\n [timetrap time-out](write_test_chapter.md#timetraps) values.\n\n- **`-scale_timetraps `** - Enables automatic\n [timetrap time-out](write_test_chapter.md#timetraps) scaling.\n\n- **`-repeat `** - Tells `Common Test` to repeat the tests `n` times\n (described later).\n\n- **`-duration `** - Tells `Common Test` to repeat the tests for duration\n of time (described later).\n\n- **`-until `** - Tells `Common Test` to repeat the tests until\n `stop_time` (described later).\n\n- **`-force_stop [skip_rest]`** - On time-out, the test run is aborted when the\n current test job is finished. If `skip_rest` is provided, the remaining test\n cases in the current test job are skipped (described later).\n\n- **`-decrypt_key `** - Provides a decryption key for\n [encrypted configuration files](config_file_chapter.md#encrypted_config_files).\n\n- **`-decrypt_file `** - Points out a file containing a decryption key\n for\n [encrypted configuration files](config_file_chapter.md#encrypted_config_files).\n\n- **`-basic_html`** - Switches off HTML enhancements that can be incompatible\n with older browsers.\n\n- **`-logopts `** - Enables modification of the logging behavior, see\n [Log options](run_test_chapter.md#logopts).\n\n- **`-verbosity `** - Sets\n [verbosity levels for printouts](write_test_chapter.md#logging).\n\n- **`-no_esc_chars`** - Disables automatic escaping of special HTML characters.\n See the [Logging chapter](write_test_chapter.md#logging).\n\n> #### Note {: .info }\n>\n> Directories passed to `Common Test` can have either relative or absolute\n> paths.\n\n> #### Note {: .info }\n>\n> Any start flags to the Erlang runtime system (application ERTS) can also be\n> passed as parameters to `ct_run`. It is, for example, useful to be able to\n> pass directories to be added to the Erlang code server search path with flag\n> `-pa` or `-pz`. If you have common help- or library modules for test suites\n> (separately compiled), stored in other directories than the test suite\n> directories, these `help/lib` directories are preferably added to the code\n> path this way.\n>\n> _Example:_\n>\n> `$ ct_run -dir ./chat_server -logdir ./chat_server/testlogs -pa $PWD/chat_server/ebin`\n>\n> The absolute path of directory `chat_server/ebin` is here passed to the code\n> server. This is essential because relative paths are stored by the code server\n> as relative, and `Common Test` changes the current working directory of ERTS\n> during the test run.\n\nThe `ct_run` program sets the exit status before shutting down. The following\nvalues are defined:\n\n- `0` indicates a successful testrun, that is, without failed or auto-skipped\n test cases.\n- `1` indicates that one or more test cases have failed, or have been\n auto-skipped.\n- `2` indicates that the test execution has failed because of, for example,\n compilation errors, or an illegal return value from an information function.\n\nIf auto-skipped test cases do not affect the exit status. The default behavior\ncan be changed using start flag:\n\n```text\n-exit_status ignore_config\n```\n\n> #### Note {: .info }\n>\n> Executing `ct_run` without start flags is equal to the command:\n> `ct_run -dir ./`\n\nFor more information about the `ct_run` program, see module\n[`ct_run`](ct_run_cmd.md) and section\n[Installation](install_chapter.md#general).\n\n[](){: #erlang_shell_or_program }","ref":"run_test_chapter.html#running-tests-from-the-os-command-line"},{"type":"extras","title":"Running Tests from the Erlang Shell or from an Erlang Program - Running Tests and Analyzing Results","doc":"`Common Test` provides an Erlang API for running tests. The main (and most\nflexible) function for specifying and executing tests is `ct:run_test/1`. It\ntakes the same start parameters as [`ct_run`](run_test_chapter.md#ct_run), but\nthe flags are instead specified as options in a list of key-value tuples. For\nexample, a test specified with `ct_run` as follows:\n\n`$ ct_run -suite ./my_SUITE -logdir ./results`\n\nis with `ct:run_test/1` specified as:\n\n`1> ct:run_test([{suite,\"./my_SUITE\"},{logdir,\"./results\"}]).`\n\nThe function returns the test result, represented by the tuple\n`{Ok,Failed,{UserSkipped,AutoSkipped}}`, where each element is an integer. If\ntest execution fails, the function returns the tuple `{error,Reason}`, where the\nterm `Reason` explains the failure.\n\nThe default start option `{dir,Cwd}` (to run all suites in the current working\ndirectory) is used if the function is called with an empty list of options.","ref":"run_test_chapter.html#running-tests-from-the-erlang-shell-or-from-an-erlang-program"},{"type":"extras","title":"Releasing the Erlang Shell - Running Tests and Analyzing Results","doc":"During execution of tests started with `ct:run_test/1`, the Erlang shell\nprocess, controlling `stdin`, remains the top-level process of the `Common Test`\nsystem of processes. Consequently, the Erlang shell is not available for\ninteraction during the test run. If this is not desirable, for example, because\nthe shell is needed for debugging purposes or for interaction with the SUT\nduring test execution, set start option `release_shell` to `true` (in the call\nto `ct:run_test/1` or by using the corresponding test specification term,\ndescribed later). This makes `Common Test` release the shell immediately after\nthe test suite compilation stage. To accomplish this, a test runner process is\nspawned to take control of the test execution. The effect is that\n`ct:run_test/1` returns the pid of this process rather than the test result,\nwhich instead is printed to tty at the end of the test run.\n\n> #### Note {: .info }\n>\n> To use the functions [`ct:break/1,2`](`ct:break/1`) and\n> [`ct:continue/0,1`](`ct:continue/0`), `release_shell` _must_ be set to `true`.\n\nFor details, see `ct:run_test/1` manual page.\n\n[](){: #group_execution }","ref":"run_test_chapter.html#releasing-the-erlang-shell"},{"type":"extras","title":"Test Case Group Execution - Running Tests and Analyzing Results","doc":"With the `ct_run` flag, or `ct:run_test/1` option `group`, one or more test case\ngroups can be specified, optionally in combination with specific test cases. The\nsyntax for specifying groups on the command line is as follows:\n\n```text\n$ ct_run -group [-case ]\n```\n\nThe syntax in the Erlang shell is as follows:\n\n```erlang\n1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).\n```\n\nParameter `group_names_or_paths` specifies one or more group names and/or one or\nmore group paths. At startup, `Common Test` searches for matching groups in the\ngroup definitions tree (that is, the list returned from `Suite:groups/0`; for\ndetails, see section [Test Case Groups](write_test_chapter.md#test_case_groups).\n\nGiven a group name, say `g`, `Common Test` searches for all paths leading to\n`g`. By path is meant a sequence of nested groups, which must be followed to get\nfrom the top-level group to `g`. To execute the test cases in group `g`,\n`Common Test` must call the `init_per_group/2` function for each group in the\npath to `g`, and all corresponding `end_per_group/2` functions afterwards. This\nis because the configuration of a test case in `g` (and its `Config` input data)\ndepends on `init_per_testcase(TestCase, Config)` and its return value, which in\nturn depends on `init_per_group(g, Config)` and its return value, which in turn\ndepends on `init_per_group/2` of the group above `g`, and so on, all the way up\nto the top-level group.\n\nThis means that if there is more than one way to locate a group (and its test\ncases) in a path, the result of the group search operation is a number of tests,\nall of which are to be performed. `Common Test` interprets a group specification\nthat consists of a single name as follows:\n\n\"Search and find all paths in the group definitions tree that lead to the\nspecified group and, for each path, create a test that does the following, in\norder:\n\n1. Executes all configuration functions in the path to the specified group.\n1. Executes all, or all matching, test cases in this group.\n1. Executes all, or all matching, test cases in all subgroups of the group.\"\n\nThe user can specify a specific group path with parameter\n`group_names_or_paths`. With this type of specification execution of unwanted\ngroups (in otherwise matching paths), and/or the execution of subgroups can be\navoided. The command line syntax of the group path is a list of group names in\nthe path, for example:\n\n`$ ct_run -suite \"./x_SUITE\" -group [g1,g3,g4] -case tc1 tc5`\n\nThe syntax in the Erlang shell is as follows (requires a list within the groups\nlist):\n\n`1> ct:run_test([{suite,\"./x_SUITE\"}, {group,[[g1,g3,g4]]}, {testcase,[tc1,tc5]}]).`\n\nThe last group in the specified path is the terminating group in the test, that\nis, no subgroups following this group are executed. In the previous example,\n`g4` is the terminating group. Hence, `Common Test` executes a test that calls\nall `init` configuration functions in the path to `g4`, that is, `g1..g3..g4`.\nIt then calls test cases `tc1` and `tc5` in `g4`, and finally all `end`\nconfiguration functions in order `g4..g3..g1`.\n\n> #### Note {: .info }\n>\n> The group path specification does not necessarily have to include _all_ groups\n> in the path to the terminating group. `Common Test` searches for all matching\n> paths if an incomplete group path is specified.\n\n> #### Note {: .info }\n>\n> Group names and group paths can be combined with parameter\n> `group_names_or_paths`. Each element is treated as an individual specification\n> in combination with parameter `cases`. The following examples illustrates\n> this.\n\n_Examples:_\n\n```erlang\n-module(x_SUITE).\n...\n%% The group definitions:\ngroups() ->\n [{top1,[],[tc11,tc12,\n {sub11,[],[tc12,tc13]},\n {sub12,[],[tc14,tc15,\n \t\t {sub121,[],[tc12,tc16]}]}]},\n\n {top2,[],[{group,sub21},{group,sub22}]},\n {sub21,[],[tc21,{group,sub2X2}]},\n {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},\n {sub221,[],[tc21,tc23]},\n {sub2X2,[],[tc21,tc24]}].\n```\n\nThe following executes two tests, one for all cases and all subgroups under\n`top1`, and one for all under `top2`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group all\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,all}]).\n```\n\nUsing `-group top1 top2`, or `{group,[top1,top2]}` gives the same result.\n\nThe following executes one test for all cases and subgroups under `top1`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}]).\n```\n\nThe following runs a test executing `tc12` in `top1` and any subgroup under\n`top1` where it can be found (`sub11` and `sub121`):\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1 -case tc12\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}, {testcase,[tc12]}]).\n```\n\nThe following executes `tc12` _only_ in group `top1`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [top1] -case tc12\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[top1]]}, {testcase,[tc12]}]).\n```\n\nThe following searches `top1` and all its subgroups for `tc16` resulting in that\nthis test case executes in group `sub121`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1 -case tc16\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}, {testcase,[tc16]}]).\n```\n\nUsing the specific path `-group [sub121]` or `{group,[[sub121]]}` gives the same\nresult in this example.\n\nThe following executes two tests, one including all cases and subgroups under\n`sub12`, and one with _only_ the test cases in `sub12`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group sub12 [sub12]\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[sub12,[sub12]]}]).\n```\n\nIn the following example, `Common Test` finds and executes two tests, one for\nthe path from `top2` to `sub2X2` through `sub21`, and one from `top2` to\n`sub2X2` through `sub22`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group sub2X2\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[sub2X2]}]).\n```\n\nIn the following example, by specifying the unique path\n`top2 -> sub21 -> sub2X2`, only one test is executed. The second possible path,\nfrom `top2` to `sub2X2` (from the former example) is discarded:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [sub21,sub2X2]\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[sub21,sub2X2]]}]).\n```\n\nThe following executes only the test cases for `sub22` and in reverse order\ncompared to the group definition:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [sub22] -case tc22 tc21\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).\n```\n\nIf a test case belonging to a group (according to the group definition) is\nexecuted without a group specification, that is, simply by (using the command\nline):\n\n`$ ct_run -suite \"my_SUITE\" -case my_tc`\n\nor (using the Erlang shell):\n\n`1> ct:run_test([{suite,\"my_SUITE\"}, {testcase,my_tc}]).`\n\nthen `Common Test` ignores the group definition and executes the test case in\nthe scope of the test suite only (no group configuration functions are called).\n\nThe group specification feature, as presented in this section, can also be used\nin [Test Specifications](run_test_chapter.md#test_specifications) (with some\nextra features added).","ref":"run_test_chapter.html#test-case-group-execution"},{"type":"extras","title":"Running the Interactive Shell Mode - Running Tests and Analyzing Results","doc":"You can start `Common Test` in an interactive shell mode where no automatic\ntesting is performed. Instead, `Common Test` starts its utility processes,\ninstalls configuration data (if any), and waits for the user to call functions\n(typically test case support functions) from the Erlang shell.\n\nThe shell mode is useful, for example, for debugging test suites, analyzing and\ndebugging the SUT during \"simulated\" test case execution, and trying out various\noperations during test suite development.\n\nTo start the interactive shell mode, start an Erlang shell manually and call\n`ct:install/1` to install any configuration data you might need (use `[]` as\nargument otherwise). Then call `ct:start_interactive/0` to start `Common Test`.\n\nIf you use the `ct_run` program, you can start the Erlang shell and\n`Common Test` in one go by using the flag `-shell` and, optionally, flag\n`-config` and/or `-userconfig`.\n\n_Examples:_\n\n- `ct_run -shell`\n- `ct_run -shell -config cfg/db.cfg`\n- `ct_run -shell -userconfig db_login testuser x523qZ`\n\nIf no configuration file is specified with command `ct_run`, a warning is\ndisplayed. If `Common Test` has been run from the same directory earlier, the\nsame configuration file(s) are used again. If `Common Test` has not been run\nfrom this directory before, no configuration files are available.\n\nIf any functions using \"required configuration data\" (for example, functions\n`ct_telnet` or `ct_ftp`) are to be called from the Erlang shell, first require\nconfiguration data with [`ct:require/1,2`](`ct:require/1`). This is equivalent\nto a `require` statement in the\n[Test Suite Information Function](write_test_chapter.md#suite) or in the\n[Test Case Information Function](write_test_chapter.md#info_function).\n\n_Example:_\n\n```erlang\n1> ct:require(unix_telnet, unix).\nok\n2> ct_telnet:open(unix_telnet).\n{ok,<0.105.0>}\n4> ct_telnet:cmd(unix_telnet, \"ls .\").\n{ok,[\"ls .\",\"file1 ...\",...]}\n```\n\nEverything that `Common Test` normally prints in the test case logs, are in the\ninteractive mode written to a log named `ctlog.html` in directory\n`ct_run. `. A link to this file is available in the file named\n`last_interactive.html` in the directory from which you execute `ct_run`.\nSpecifying a different root directory for the logs than the current working\ndirectory is not supported.\n\nIf you wish to exit the interactive mode (for example, to start an automated\ntest run with `ct:run_test/1`), call function `ct:stop_interactive/0`. This\nshuts down the running `ct` application. Associations between configuration\nnames and data created with `require` are consequently deleted. Function\n`ct:start_interactive/0` takes you back into interactive mode, but the previous\nstate is not restored.","ref":"run_test_chapter.html#running-the-interactive-shell-mode"},{"type":"extras","title":"Step-by-Step Execution of Test Cases with the Erlang Debugger - Running Tests and Analyzing Results","doc":"Using `ct_run -step [opts]`, or by passing option `{step,Opts}` to\n`ct:run_test/1`, the following is possible:\n\n- Get the Erlang Debugger started automatically.\n- Use its graphical interface to investigate the state of the current test case.\n- Execute the test case step-by-step and/or set execution breakpoints.\n\nIf no extra options are specified with flag/option `step`, breakpoints are set\nautomatically on the test cases that are to be executed by `Common Test`, and\nthose functions only. If step option `config` is specified, breakpoints are also\ninitially set on the configuration functions in the suite, that is,\n`init_per_suite/1`, `end_per_suite/1`, `init_per_group/2`, `end_per_group/2`,\n`init_per_testcase/2` and `end_per_testcase/2`.\n\n`Common Test` enables the Debugger auto-attach feature, which means that for\nevery new interpreted test case function that starts to execute, a new trace\nwindow automatically pops up (as each test case executes on a dedicated Erlang\nprocess). Whenever a new test case starts, `Common Test` attempts to close the\ninactive trace window of the previous test case. However, if you prefer\n`Common Test` to leave inactive trace windows, use option `keep_inactive`.\n\nThe step functionality can be used together with flag/option `suite` and `suite`\n\\+ `case/testcase`, but not together with `dir`.\n\n[](){: #test_specifications }","ref":"run_test_chapter.html#step-by-step-execution-of-test-cases-with-the-erlang-debugger"},{"type":"extras","title":"Test Specifications - Running Tests and Analyzing Results","doc":"","ref":"run_test_chapter.html#test-specifications"},{"type":"extras","title":"General Description - Running Tests and Analyzing Results","doc":"The most flexible way to specify what to test, is to use a test specification,\nwhich is a sequence of Erlang terms. The terms are normally declared in one or\nmore text files (see `ct:run_test/1`), but can also be passed to `Common Test`\non the form of a list (see `ct:run_testspec/1`). There are two general types of\nterms: configuration terms and test specification terms.\n\nWith configuration terms it is, for example, possible to do the following:\n\n- Label the test run (similar to `ct_run -label`).\n- Evaluate any expressions before starting the test.\n- Import configuration data (similar to `ct_run -config/-userconfig`).\n- Specify the top-level HTML log directory (similar to `ct_run -logdir`).\n- Enable code coverage analysis (similar to `ct_run -cover`).\n- Install `Common Test Hooks` (similar to `ct_run -ch_hooks`).\n- Install `event_handler` plugins (similar to `ct_run -event_handler`).\n- Specify include directories to be passed to the compiler for automatic\n compilation (similar to `ct_run -include`).\n- Disable the auto-compilation feature (similar to `ct_run -no_auto_compile`).\n- Set verbosity levels (similar to `ct_run -verbosity`).\n\nConfiguration terms can be combined with `ct_run` start flags or `ct:run_test/1`\noptions. The result is, for some flags/options and terms, that the values are\nmerged (for example, configuration files, include directories, verbosity levels,\nand silent connections) and for others that the start flags/options override the\ntest specification terms (for example, log directory, label, style sheet, and\nauto-compilation).\n\nWith test specification terms, it is possible to state exactly which tests to\nrun and in which order. A test term specifies either one or more suites, one or\nmore test case groups (possibly nested), or one or more test cases in a group\n(or in multiple groups) or in a suite.\n\nAny number of test terms can be declared in sequence. `Common Test` compiles by\ndefault the terms into one or more tests to be performed in one resulting test\nrun. A term that specifies a set of test cases \"swallows\" one that only\nspecifies a subset of these cases. For example, the result of merging one term\nspecifying that all cases in suite S are to be executed, with another term\nspecifying only test case X and Y in S, is a test of all cases in S. However, if\na term specifying test case X and Y in S is merged with a term specifying case Z\nin S, the result is a test of X, Y, and Z in S. To disable this behavior, that\nis, to instead perform each test sequentially in a \"script-like\" manner, set\nterm `merge_tests` to `false` in the test specification.\n\nA test term can also specify one or more test suites, groups, or test cases to\nbe skipped. Skipped suites, groups, and cases are not executed and show up in\nthe HTML log files as `SKIPPED`.","ref":"run_test_chapter.html#general-description"},{"type":"extras","title":"Using Multiple Test Specification Files - Running Tests and Analyzing Results","doc":"When multiple test specification files are specified at startup (either with\n`ct_run -spec file1 file2 ...` or `ct:run_test([{spec, [File1,File2,...]}])`),\n`Common Test` either executes one test run per specification file, or joins the\nfiles and performs all tests within one single test run. The first behavior is\nthe default one. The latter requires that start flag/option `join_specs` is\nprovided, for example,\n`run_test -spec ./my_tests1.ts ./my_tests2.ts -join_specs`.\n\nJoining a number of specifications, or running them separately, can also be\naccomplished with (and can be combined with) test specification file inclusion.","ref":"run_test_chapter.html#using-multiple-test-specification-files"},{"type":"extras","title":"Test Specification File Inclusion - Running Tests and Analyzing Results","doc":"With the term `specs`, a test specification can include other specifications. An\nincluded specification can either be joined with the source specification or\nused to produce a separate test run (as with start flag/option `join_specs`\nabove).\n\n_Example:_\n\n```erlang\n%% In specification file \"a.spec\"\n{specs, join, [\"b.spec\", \"c.spec\"]}.\n{specs, separate, [\"d.spec\", \"e.spec\"]}.\n%% Config and test terms follow\n...\n```\n\nIn this example, the test terms defined in files \"b.spec\" and \"c.spec\" are\njoined with the terms in source specification \"a.spec\" (if any). The inclusion\nof specifications \"d.spec\" and \"e.spec\" results in two separate, and\nindependent, test runs (one for each included specification).\n\nOption `join` does not imply that the test terms are merged, only that all tests\nare executed in one single test run.\n\nJoined specifications share common configuration settings, such as the list of\n`config` files or `include` directories. For configurations that cannot be\ncombined, such as settings for `logdir` or `verbosity`, it is up to the user to\nensure there are no clashes when the test specifications are joined.\nSpecifications included with option `separate` do not share configuration\nsettings with the source specification. This is useful, for example, if there\nare clashing configuration settings in included specifications, making it them\nimpossible to join.\n\nIf `{merge_tests,true}` is set in the source specification (which is the default\nsetting), terms in joined specifications are merged with terms in the source\nspecification (according to the description of `merge_tests` earlier).\n\nNotice that it is always the `merge_tests` setting in the source specification\nthat is used when joined with other specifications. Say, for example, that a\nsource specification A, with tests TA1 and TA2, has `{merge_tests,false}` set,\nand that it includes another specification, B, with tests TB1 and TB2, that has\n`{merge_tests,true}` set. The result is that the test series\n`TA1,TA2,merge(TB1,TB2)` is executed. The opposite `merge_tests` settings would\nresult in the test series `merge(merge(TA1,TA2),TB1,TB2)`.\n\nThe term `specs` can be used to nest specifications, that is, have one\nspecification include other specifications, which in turn include others, and so\nno","ref":"run_test_chapter.html#test-specification-file-inclusion"},{"type":"extras","title":"Test Case Groups - Running Tests and Analyzing Results","doc":"When a test case group is specified, the resulting test executes function\n`init_per_group`, followed by all test cases and subgroups (including their\nconfiguration functions), and finally function `end_per_group`. Also, if\nparticular test cases in a group are specified, `init_per_group` and\n`end_per_group`, for the group in question, are called. If a group defined (in\n`Suite:groups/0`) as a subgroup of another group, is specified (or if particular\ntest cases of a subgroup are), `Common Test` calls the configuration functions\nfor the top-level groups and for the subgroup in question (making it possible to\npass configuration data all the way from `init_per_suite` down to the test cases\nin the subgroup).\n\nThe test specification uses the same mechanism for specifying test case groups\nthrough names and paths, as explained in section\n[Test Case Group Execution](run_test_chapter.md#group_execution), with the\naddition of element `GroupSpec`.\n\nElement `GroupSpec` makes it possible to specify group execution properties that\noverrides those in the group definition (that is, in `groups/0`). Execution\nproperties for subgroups might be overridden as well. This feature makes it\npossible to change properties of groups at the time of execution, without having\nto edit the test suite. The same feature is available for `group` elements in\nthe `Suite:all/0` list. For details and examples, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups).","ref":"run_test_chapter.html#test-case-groups"},{"type":"extras","title":"Test Specification Syntax - Running Tests and Analyzing Results","doc":"Test specifications can be used to run tests both in a single test host\nenvironment and in a distributed `Common Test` environment (Large Scale\nTesting). The node parameters in term `init` are only relevant in the latter\n(see section [Test Specifications](ct_master_chapter.md#test_specifications) in\nLarge Scale Testing). For details about the various terms, see the corresponding\nsections in the User's Guide, for example, the following:\n\n- The [`ct_run` program](run_test_chapter.md#ct_run) for an overview of\n available start flags (as most flags have a corresponding configuration term)\n- [Logging](write_test_chapter.md#logging) (for terms `verbosity`, `stylesheet`,\n `basic_html` and `esc_chars`)\n- [External Configuration Data](config_file_chapter.md#top) (for terms `config`\n and `userconfig`)\n- [Event Handling](event_handler_chapter.md#event_handling) (for the\n `event_handler` term)\n- [Common Test Hooks](ct_hooks_chapter.md#installing) (for term `ct_hooks`)\n\n_Configuration terms:_\n\n```erlang\n{merge_tests, Bool}.\n\n{define, Constant, Value}.\n\n{specs, InclSpecsOption, TestSpecs}.\n\n{node, NodeAlias, Node}.\n\n{init, InitOptions}.\n{init, [NodeAlias], InitOptions}.\n\n{label, Label}.\n{label, NodeRefs, Label}.\n\n{verbosity, VerbosityLevels}.\n{verbosity, NodeRefs, VerbosityLevels}.\n\n{stylesheet, CSSFile}.\n{stylesheet, NodeRefs, CSSFile}.\n\n{silent_connections, ConnTypes}.\n{silent_connections, NodeRefs, ConnTypes}.\n\n{multiply_timetraps, N}.\n{multiply_timetraps, NodeRefs, N}.\n\n{scale_timetraps, Bool}.\n{scale_timetraps, NodeRefs, Bool}.\n\n{cover, CoverSpecFile}.\n{cover, NodeRefs, CoverSpecFile}.\n\n{cover_stop, Bool}.\n{cover_stop, NodeRefs, Bool}.\n\n{include, IncludeDirs}.\n{include, NodeRefs, IncludeDirs}.\n\n{auto_compile, Bool},\n{auto_compile, NodeRefs, Bool},\n\n{abort_if_missing_suites, Bool},\n{abort_if_missing_suites, NodeRefs, Bool},\n\n{config, ConfigFiles}.\n{config, ConfigDir, ConfigBaseNames}.\n{config, NodeRefs, ConfigFiles}.\n{config, NodeRefs, ConfigDir, ConfigBaseNames}.\n\n{userconfig, {CallbackModule, ConfigStrings}}.\n{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.\n\n{logdir, LogDir}.\n{logdir, NodeRefs, LogDir}.\n\n{logopts, LogOpts}.\n{logopts, NodeRefs, LogOpts}.\n\n{create_priv_dir, PrivDirOption}.\n{create_priv_dir, NodeRefs, PrivDirOption}.\n\n{event_handler, EventHandlers}.\n{event_handler, NodeRefs, EventHandlers}.\n{event_handler, EventHandlers, InitArgs}.\n{event_handler, NodeRefs, EventHandlers, InitArgs}.\n\n{ct_hooks, CTHModules}.\n{ct_hooks, NodeRefs, CTHModules}.\n\n{ct_hooks_order, CTHOrder}.\n\n{enable_builtin_hooks, Bool}.\n\n{basic_html, Bool}.\n{basic_html, NodeRefs, Bool}.\n\n{esc_chars, Bool}.\n{esc_chars, NodeRefs, Bool}.\n\n{release_shell, Bool}.\n```\n\n_Test terms:_\n\n```erlang\n{suites, Dir, Suites}.\n{suites, NodeRefs, Dir, Suites}.\n\n{groups, Dir, Suite, Groups}.\n{groups, NodeRefs, Dir, Suite, Groups}.\n\n{groups, Dir, Suite, Groups, {cases,Cases}}.\n{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.\n\n{cases, Dir, Suite, Cases}.\n{cases, NodeRefs, Dir, Suite, Cases}.\n\n{skip_suites, Dir, Suites, Comment}.\n{skip_suites, NodeRefs, Dir, Suites, Comment}.\n\n{skip_groups, Dir, Suite, GroupNames, Comment}.\n{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.\n\n{skip_cases, Dir, Suite, Cases, Comment}.\n{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.\n```\n\n[](){: #types } _Types:_\n\n```erlang\nBool = true | false\nConstant = atom()\nValue = term()\nInclSpecsOption = join | separate\nTestSpecs = string() | [string()]\nNodeAlias = atom()\nNode = node()\nNodeRef = NodeAlias | Node | master\nNodeRefs = all_nodes | [NodeRef] | NodeRef\nInitOptions = term()\nLabel = atom() | string()\nVerbosityLevels = integer() | [{Category,integer()}]\nCategory = atom()\nCSSFile = string()\nConnTypes = all | [atom()]\nN = integer()\nCoverSpecFile = string()\nIncludeDirs = string() | [string()]\nConfigFiles = string() | [string()]\nConfigDir = string()\nConfigBaseNames = string() | [string()]\nCallbackModule = atom()\nConfigStrings = string() | [string()]\nLogDir = string()\nLogOpts = [term()]\nPrivDirOption = auto_per_run | auto_per_tc | manual_per_tc\nEventHandlers = atom() | [atom()]\nInitArgs = [term()]\nCTHModules = [CTHModule |\n \t {CTHModule, CTHInitArgs} |\n \t {CTHModule, CTHInitArgs, CTHPriority}]\nCTHModule = atom()\nCTHInitArgs = term()\nCTHOrder = test | config\nDir = string()\nSuites = atom() | [atom()] | all\nSuite = atom()\nGroups = GroupPath | GroupSpec | [GroupSpec] | all\nGroupPath = [[GroupSpec]]\nGroupSpec = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]}\nGroupName = atom()\nGroupNames = GroupName | [GroupName]\nCases = atom() | [atom()] | all\nComment = string() | \"\"\n```\n\nThe difference between the `config` terms above is that with `ConfigDir`,\n`ConfigBaseNames` is a list of base names, that is, without directory paths.\n`ConfigFiles` must be full names, including paths. For example, the following\ntwo terms have the same meaning:\n\n```erlang\n{config, [\"/home/testuser/tests/config/nodeA.cfg\",\n \"/home/testuser/tests/config/nodeB.cfg\"]}.\n\n{config, \"/home/testuser/tests/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n```\n\n> #### Note {: .info }\n>\n> Any relative paths, specified in the test specification, are relative to the\n> directory containing the test specification file if\n> `ct_run -spec TestSpecFile ...` or `ct:run:test([{spec,TestSpecFile},...])`\n> executes the test.\n>\n> The path is relative to the top-level log directory if\n> `ct:run:testspec(TestSpec)` executes the test.","ref":"run_test_chapter.html#test-specification-syntax"},{"type":"extras","title":"Constants - Running Tests and Analyzing Results","doc":"The term `define` introduces a constant that is used to replace the name\n`Constant` with `Value`, wherever it is found in the test specification. This\nreplacement occurs during an initial iteration through the test specification.\nConstants can be used anywhere in the test specification, for example, in any\nlists and tuples, and even in strings and inside the value part of other\nconstant definitions. A constant can also be part of a node name, but that is\nthe only place where a constant can be part of an atom.\n\n> #### Note {: .info }\n>\n> For the sake of readability, the name of the constant must always begin with\n> an uppercase letter, or a `$`, `?`, or `_`. This means that it must always be\n> single quoted (as the constant name is an atom, not text).\n\nThe main benefit of constants is that they can be used to reduce the size (and\navoid repetition) of long strings, such as file paths.\n\n_Examples:_\n\n```erlang\n%% 1a. no constant\n{config, \"/home/testuser/tests/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, \"/home/testuser/tests/suites\", all}.\n\n%% 1b. with constant\n{define, 'TESTDIR', \"/home/testuser/tests\"}.\n{config, \"'TESTDIR'/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, \"'TESTDIR'/suites\", all}.\n\n%% 2a. no constants\n{config, [testnode@host1, testnode@host2], \"../config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, [testnode@host1, testnode@host2], \"../suites\", [x_SUITE, y_SUITE]}.\n\n%% 2b. with constants\n{define, 'NODE', testnode}.\n{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}.\n{config, 'NODES', \"../config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, 'NODES', \"../suites\", [x_SUITE, y_SUITE]}.\n```\n\nConstants make the test specification term `alias`, in previous versions of\n`Common Test`, redundant. This term is deprecated but remains supported in\nupcoming `Common Test` releases. Replacing `alias` terms with `define` is\nstrongly recommended though. An example of such replacement follows:\n\n```erlang\n%% using the old alias term\n{config, \"/home/testuser/tests/config/nodeA.cfg\"}.\n{alias, suite_dir, \"/home/testuser/tests/suites\"}.\n{groups, suite_dir, x_SUITE, group1}.\n\n%% replacing with constants\n{define, 'TestDir', \"/home/testuser/tests\"}.\n{define, 'CfgDir', \"'TestDir'/config\"}.\n{define, 'SuiteDir', \"'TestDir'/suites\"}.\n{config, 'CfgDir', \"nodeA.cfg\"}.\n{groups, 'SuiteDir', x_SUITE, group1}.\n```\n\nConstants can well replace term `node` also, but this still has a declarative\nvalue, mainly when used in combination with `NodeRefs == all_nodes` (see\n[Types](run_test_chapter.md#types)).","ref":"run_test_chapter.html#constants"},{"type":"extras","title":"Example - Running Tests and Analyzing Results","doc":"Here follows a simple test specification example:\n\n```erlang\n{define, 'Top', \"/home/test\"}.\n{define, 'T1', \"'Top'/t1\"}.\n{define, 'T2', \"'Top'/t2\"}.\n{define, 'T3', \"'Top'/t3\"}.\n{define, 'CfgFile', \"config.cfg\"}.\n\n{logdir, \"'Top'/logs\"}.\n\n{config, [\"'T1'/'CfgFile'\", \"'T2'/'CfgFile'\", \"'T3'/'CfgFile'\"]}.\n\n{suites, 'T1', all}.\n{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], \"Not implemented\"}.\n{skip_cases, 'T1', t1A_SUITE, [test3,test4], \"Irrelevant\"}.\n{skip_cases, 'T1', t1C_SUITE, [test1], \"Ignore\"}.\n\n{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.\n{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.\n\n{skip_suites, 'T3', all, \"Not implemented\"}.\n```\n\nThe example specifies the following:\n\n- The specified `logdir` directory is used for storing the HTML log files (in\n subdirectories tagged with node name, date, and time).\n- The variables in the specified test system configuration files are imported\n for the test.\n- The first test to run includes all suites for system `t1`. Suites `t1B` and\n `t1D` are excluded from the test. Test cases `test3` and `test4` in `t1A` and\n `test1` case in `t1C` are also excluded from the test.\n- The second test to run is for system `t2`. The included suites are `t2B` and\n `t2C`. Test cases `test4`, `test1`, and `test7` in suite `t2A` are also\n included. The test cases are executed in the specified order.\n- The last test to run is for system `t3`. Here, all suites are skipped and this\n is explicitly noted in the log files.","ref":"run_test_chapter.html#example"},{"type":"extras","title":"The init Term - Running Tests and Analyzing Results","doc":"With term `init` it is possible to specify initialization options for nodes\ndefined in the test specification. There are options to start the node and to\nevaluate any function on the node. For details, see section\n[Automatic Startup of Test Target Nodes](ct_master_chapter.md#ct_slave) in\nsection Using Common Test for Large Scale Testing.","ref":"run_test_chapter.html#the-init-term"},{"type":"extras","title":"User-Specific Terms - Running Tests and Analyzing Results","doc":"The user can provide a test specification including (for `Common Test`)\nunrecognizable terms. If this is desired, use flag `-allow_user_terms` when\nstarting tests with `ct_run`. This forces `Common Test` to ignore unrecognizable\nterms. In this mode, `Common Test` is not able to check the specification for\nerrors as efficiently as if the scanner runs in default mode. If `ct:run_test/1`\nis used for starting the tests, the relaxed scanner mode is enabled by tuple\n`{allow_user_terms,true}`.","ref":"run_test_chapter.html#user-specific-terms"},{"type":"extras","title":"Reading Test Specification Terms - Running Tests and Analyzing Results","doc":"Terms in the current test specification (that is, the specification that has\nbeen used to configure and run the current test) can be looked up. The function\n[`get_testspec_terms()`](`ct:get_testspec_terms/0`) returns a list of all test\nspecification terms (both configuration terms and test terms), and\n`get_testspec_terms(Tags)` returns the term (or a list of terms) matching the\ntag (or tags) in `Tags`.\n\nFor example, in the test specification:\n\n```erlang\n...\n{label, my_server_smoke_test}.\n{config, \"../../my_server_setup.cfg\"}.\n{config, \"../../my_server_interface.cfg\"}.\n...\n```\n\nAnd in, for example, a test suite or a `Common Test Hook` function:\n\n```erlang\n...\n[{label,[{_Node,TestType}]}, {config,CfgFiles}] =\n ct:get_testspec_terms([label,config]),\n\n[verify_my_server_cfg(TestType, CfgFile) || {Node,CfgFile} <- CfgFiles,\n Node == node()];\n...\n```\n\n[](){: #log_files }","ref":"run_test_chapter.html#reading-test-specification-terms"},{"type":"extras","title":"Log Files - Running Tests and Analyzing Results","doc":"As the execution of the test suites proceed, events are logged in the following\nfour different ways:\n\n- Text to the operator console.\n- Suite-related information is sent to the major log file.\n- Case-related information is sent to the minor log file.\n- The HTML overview log file is updated with test results.\n- A link to all runs executed from a certain directory is written in the log\n named `all_runs.html` and direct links to all tests (the latest results) are\n written to the top-level `index.html`.\n\nTypically the operator, possibly running hundreds or thousands of test cases,\ndoes not want to fill the console with details about, or printouts from,\nspecific test cases. By default, the operator only sees the following:\n\n- A confirmation that the test has started and information about how many test\n cases are executed in total.\n- A small note about each failed test case.\n- A summary of all the run test cases.\n- A confirmation when the test run is complete.\n- Some special information, such as error reports, progress reports, and\n printouts written with `erlang:display/1`, or `io:format/3` specifically\n addressed to a receiver other than [`standard_io`](`t:io:standard_io/0`) (for\n example, the default group leader process `user`).\n\nTo dig deeper into the general results, or the result of a specific test case,\nthe operator can do so by following the links in the HTML presentation and read\nthe major or minor log files. The \"all_runs.html\" page is a good starting point.\nIt is located in `logdir` and contains a link to each test run, including a\nquick overview (with date and time, node name, number of tests, test names, and\ntest result totals).\n\nAn \"index.html\" page is written for each test run (that is, stored in the\n`ct_run` directory tagged with node name, date, and time). This file provides an\noverview of all individual tests performed in the same test run. The test names\nfollow the following convention:\n\n- `TopLevelDir.TestDir` (all suites in `TestDir` executed)\n- `TopLevelDir.TestDir:suites` (specific suites executed)\n- `TopLevelDir.TestDir.Suite` (all cases in `Suite` executed)\n- `TopLevelDir.TestDir.Suite:cases` (specific test cases executed)\n- `TopLevelDir.TestDir.Suite.Case` (only `Case` executed)\n\nThe \"test run index\" page includes a link to the `Common Test` Framework Log\nfile in which information about imported configuration data and general test\nprogress is written. This log file is useful to get snapshot information about\nthe test run during execution. It can also be helpful when analyzing test\nresults or debugging test suites.\n\nThe \"test run index\" page indicates if a test has missing suites (that is,\nsuites that `Common Test` failed to compile). Names of the missing suites can be\nfound in the `Common Test` Framework Log file.\n\nThe major log file shows a detailed report of the test run. It includes test\nsuite and test case names, execution time, the exact reason for failures, and so\non. The information is available in both a file with textual and with HTML\nrepresentation. The HTML file shows a summary that gives a good overview of the\ntest run. It also has links to each individual test case log file for quick\nviewing with an HTML browser.\n\nThe minor log files contain full details of every single test case, each in a\nseparate file. This way, it is straightforward to compare the latest results to\nthat of previous test runs, even if the set of test cases changes. If\napplication SASL is running, its logs are also printed to the current minor log\nfile by the [cth_log_redirect built-in hook](ct_hooks_chapter.md#builtin_cths).\n\nThe full name of the minor log file (that is, the name of the file including the\nabsolute directory path) can be read during execution of the test case. It comes\nas value in tuple `{tc_logfile,LogFileName}` in the `Config` list (which means\nit can also be read by a pre- or post `Common Test Hook` function). Also, at the\nstart of a test case, this data is sent with an event to any installed event\nhandler. For details, see section\n[Event Handling](event_handler_chapter.md#event_handling).\n\nThe log files are written continuously during a test run and links are always\ncreated initially when a test starts. Thevtest progress can therefore be\nfollowed simply by refreshing pages in the HTML browser. Statistics totals are\nnot presented until a test is complete however.\n\n[](){: #logopts }","ref":"run_test_chapter.html#log-files"},{"type":"extras","title":"Log Options - Running Tests and Analyzing Results","doc":"With start flag `logopts` options that modify some aspects of the logging\nbehavior can be specified. The following options are available:\n\n- **`no_src`** - The HTML version of the test suite source code is not generated\n during the test run (and is consequently not available in the log file\n system).\n\n- **`no_nl`** - `Common Test` does not add a newline character `(\\n)` to the end\n of an output string that it receives from a call to, for example,\n `io:format/2`, and which it prints to the test case log.\n\nFor example, if a test is started with:\n\n`$ ct_run -suite my_SUITE -logopts no_nl`\n\nthen printouts during the test made by successive calls to `io:format(\"x\")`,\nappears in the test case log as:\n\n`xxx`\n\ninstead of each `x` printed on a new line, which is the default behavior.\n\n[](){: #table_sorting }","ref":"run_test_chapter.html#log-options"},{"type":"extras","title":"Sorting HTML Table Columns - Running Tests and Analyzing Results","doc":"By clicking the name in the column header of any table (for example, \"Ok\",\n\"Case\", \"Time\", and so on), the table rows are sorted in whatever order makes\nsense for the type of value (for example, numerical for \"Ok\" or \"Time\", and\nalphabetical for \"Case\"). The sorting is performed through JavaScript code,\nautomatically inserted into the HTML log files. `Common Test` uses the\n[jQuery](http://jquery.com) library and the\n[tablesorter](https://mottie.github.io/tablesorter/docs/) plugin, with\ncustomized sorting functions, for this implementation.","ref":"run_test_chapter.html#sorting-html-table-columns"},{"type":"extras","title":"The Unexpected I/O Log - Running Tests and Analyzing Results","doc":"The test suites overview page includes a link to the Unexpected I/O Log. In this\nlog, `Common Test` saves printouts made with [`ct:log/1,2,3,4,5`](`ct:log/2`)\nand [`ct:pal/1,2,3,4,5`](`ct:pal/2`), as well as captured system error- and\nprogress reports, which cannot be associated with particular test cases and\ntherefore cannot be written to individual test case log files. This occurs, for\nexample, if a log printout is made from an external process (not a test case\nprocess), _or_ if an error- or progress report comes in, during a short interval\nwhile `Common Test` is not executing a test case or configuration function, _or_\nwhile `Common Test` is currently executing a parallel test case group.\n\n[](){: #pre_post_test_io_log }","ref":"run_test_chapter.html#the-unexpected-i-o-log"},{"type":"extras","title":"The Pre- and Post Test I/O Log - Running Tests and Analyzing Results","doc":"The `Common Test` Framework Log page includes links to the Pre- and Post Test\nI/O Log. In this log, `Common Test` saves printouts made with `ct:log/1,2,3,4,5`\nand `ct:pal/1,2,3,4,5`, as well as captured system error- and progress reports,\nwhich take place before, and after, the test run. Examples of this are printouts\nfrom a CT hook init- or terminate function, or progress reports generated when\nan OTP application is started from a CT hook init function. Another example is\nan error report generated because of a failure when an external application is\nstopped from a CT hook terminate function. All information in these examples\nends up in the Pre- and Post Test I/O Log. For more information on how to\nsynchronize test runs with external user applications, see section\n[Synchronizing](ct_hooks_chapter.md#synchronizing) in section Common Test Hooks.\n\n> #### Note {: .info }\n>\n> Logging to file with `ct:log/1,2,3,4,5` or `ct:pal/1,2,3,4,5` only works when\n> `Common Test` is running. Printouts with `ct:pal/1,2,3,4,5` are however always\n> displayed on screen.\n\n[](){: #delete_old_logs }","ref":"run_test_chapter.html#the-pre-and-post-test-i-o-log"},{"type":"extras","title":"Delete Old Logs - Running Tests and Analyzing Results","doc":"`Common Test` can automatically delete old log. This is specified with the\n`keep_logs` option. The default value for this option is `all`, which means that\nno logs are deleted. If the value is set to an integer, `N`, `Common Test`\ndeletes all `ct_run. ` directories, except the `N` newest.\n\n[](){: #html_stylesheet }","ref":"run_test_chapter.html#delete-old-logs"},{"type":"extras","title":"HTML Style Sheets - Running Tests and Analyzing Results","doc":"`Common Test` uses an HTML Style Sheet (CSS file) to control the look of the\nHTML log files generated during test runs. If the log files are not displayed\ncorrectly in the browser of your choice, or you prefer a more primitive (\"pre\n`Common Test` v1.6\") look of the logs, use the start flag/option:\n\n```text\nbasic_html\n```\n\nThis disables the use of style sheets and JavaScripts (see\n[Sorting HTML Table Columns](run_test_chapter.md#table_sorting)).\n\n`Common Test` includes an _optional_ feature to allow user HTML style sheets for\ncustomizing printouts. The functions in `ct` that print to a test case HTML log\nfile (`log/3,4,5` and `pal/3,4,5`) accept `Category` as first argument. With\nthis argument a category can be specified that can be mapped to a named `div`\nselector in a CSS rule-set. This is useful, especially for coloring text\ndifferently depending on the type of (or reason for) the printout. Say you want\none particular background color for test system configuration information, a\ndifferent one for test system state information, and finally one for errors\ndetected by the test case functions. The corresponding style sheet can look as\nfollows:\n\n```css\ndiv.sys_config { background:blue }\ndiv.sys_state { background:yellow }\ndiv.error { background:red }\n```\n\nCommon Test prints the text from `ct:log/3,4,5` or `ct:pal/3,4,5` inside a `pre`\nelement nested under the named `div` element. Since the `pre` selector has a\npredefined CSS rule (in file `ct_default.css`) for the attributes `color`,\n`font-family` and `font-size`, if a user wants to change any of the predefined\nattribute settings, a new rule for `pre` must be added to the user stylesheet.\nExample:\n\n```text\ndiv.error pre { color:white }\n```\n\nHere, white text is used instead of the default black for `div.error` printouts\n(and no other attribute settings for `pre` are affected).\n\nTo install the CSS file (`Common Test` inlines the definition in the HTML code),\nthe file name can be provided when executing `ct_run`.\n\n_Example:_\n\n```text\n$ ct_run -dir $TEST/prog -stylesheet $TEST/styles/test_categories.css\n```\n\nCategories in a CSS file installed with flag `-stylesheet` are on a global test\nlevel in the sense that they can be used in any suite that is part of the test\nrun.\n\nStyle sheets can also be installed on a per suite and per test case basis.\n\n_Example:_\n\n```erlang\n-module(my_SUITE).\n...\nsuite() -> [..., {stylesheet,\"suite_categories.css\"}, ...].\n...\nmy_testcase(_) ->\n ...\n ct:log(sys_config, \"Test node version: ~p\", [VersionInfo]),\n ...\n ct:log(sys_state, \"Connections: ~p\", [ConnectionInfo]),\n ...\n ct:pal(error, \"Error ~p detected! Info: ~p\", [SomeFault,ErrorInfo]),\n ct:fail(SomeFault).\n```\n\nIf the style sheet is installed as in this example, the categories are private\nto the suite in question. They can be used by all test cases in the suite, but\ncannot be used by other suites. A suite private style sheet, if specified, is\nused in favor of a global style sheet (one specified with flag `-stylesheet`). A\nstylesheet tuple (as returned by `suite/0` above) can also be returned from a\ntest case information function. In this case the categories specified in the\nstyle sheet can only be used in that particular test case. A test case private\nstyle sheet is used in favor of a suite or global level style sheet.\n\nIn a tuple `{stylesheet,CSSFile}`, if `CSSFile` is specified with a path, for\nexample, `\"$TEST/styles/categories.css\"`, this full name is used to locate the\nfile. However, if only the file name is specified, for example,\n`categories.css`, the CSS file is assumed to be located in the data directory,\n`data_dir`, of the suite. The latter use is recommended, as it is portable\ncompared to hard coding path names in the suite.\n\nArgument `Category` in the previous example can have the value (atom)\n`sys_config` (blue background), `sys_state` (yellow background), or `error`\n(white text on red background).\n\n[](){: #repeating_tests }","ref":"run_test_chapter.html#html-style-sheets"},{"type":"extras","title":"Repeating Tests - Running Tests and Analyzing Results","doc":"You can order `Common Test` to repeat the tests you specify. You can choose to\nrepeat tests a number of times, repeat tests for a specific period of time, or\nrepeat tests until a particular stop time is reached. If repetition is\ncontrolled by time, an action for `Common Test` to take upon time-out can be\nspecified. Either `Common Test` performs all tests in the current run before\nstopping, or it stops when the current test job is finished. Repetition can be\nactivated by `ct_run` start flags, or tuples in the `ct:run:test/1` option list\nargument. The flags (options in parentheses) are the following:\n\n- `-repeat N ({repeat,N})`, where `N` is a positive integer\n- `-duration DurTime ({duration,DurTime})`, where `DurTime` is the duration\n- `-until StopTime ({until,StopTime})`, where `StopTime` is finish time\n- `-force_stop ({force_stop,true})`\n- `-force_stop skip_rest ({force_stop,skip_rest})`\n\n- **`DurTime`** - The duration time is specified as `HHMMSS`, for example,\n `-duration 012030` or `{duration,\"012030\"}`\n\n , which means that the tests are executed and (if time allows) repeated until\n time-out occurs after 1 hour, 20 minutes, and 30 seconds.\n\n- **`StopTime`** - The finish time can be specified as `HHMMSS` and is then\n interpreted as a time today (or possibly tomorrow), but can also be specified\n as `YYMoMoDDHHMMSS`, for example, `-until 071001120000` or\n `{until,\"071001120000\"}`. This means that the tests are executed and (if time\n allows) repeated, until 12 o'clock on the 1st of October 2007.\n\nWhen time-out occurs, `Common Test` never aborts the ongoing test case, as this\ncan leave the SUT in an undefined, and possibly bad, state. Instead\n`Common Test`, by default, finishes the current test run before stopping. If\nflag `force_stop` is specified, `Common Test` stops when the current test job is\nfinished. If flag `force_stop` is specified with `skip_rest`, `Common Test` only\ncompletes the current test case and skips the remaining tests in the test job.\n\n> #### Note {: .info }\n>\n> As `Common Test` always finishes at least the current test case, the time\n> specified with `duration` or `until` is never definitive.\n\nLog files from every repeated test run is saved in normal `Common Test` fashion\n(described earlier).\n\n`Common Test` might later support an optional feature to only store the last\n(and possibly the first) set of logs of repeated test runs, but for now the user\nmust be careful not to run out of disk space if tests are repeated during long\nperiods of time.\n\nFor each test run that is part of a repeated session, information about the\nparticular test run is printed in the `Common Test` Framework Log. The\ninformation includes the repetition number, remaining time, and so on.\n\n_Example 1:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -duration 001000 -force_stop\n```\n\nHere, the suites in test directory `to1`, followed by the suites in `to2`, are\nexecuted in one test run. A time-out event occurs after 10 minutes. As long as\nthere is time left, `Common Test` repeats the test run (that is, starting over\nwith test `to1`). After time-out, `Common Test` stops when the current job is\nfinished (because of flag `force_stop`). As a result, the specified test run can\nbe aborted after test `to1` and before test `to2`.\n\n_Example 2:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -duration 001000 -forces_stop skip_rest\n```\n\nHere, the same tests as in Example 1 are run, but with flag `force_stop` set to\n`skip_rest`. If time-out occurs while executing tests in directory `to1`, the\nremaining test cases in `to1` are skipped and the test is aborted without\nrunning the tests in `to2` another time. If time-out occurs while executing\ntests in directory `to2`, the remaining test cases in `to2` are skipped and the\ntest is aborted.\n\n_Example 3:_\n\n```text\n$ date\nFri Sep 28 15:00:00 MEST 2007\n\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -until 160000\n```\n\nHere, the same test run as in the previous examples are executed (and possibly\nrepeated). However, when the time-out occurs, after 1 hour, `Common Test`\nfinishes the entire test run before stopping (that is, both `to1` and `to2` are\nalways executed in the same test run).\n\n_Example 4:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -repeat 5\n```\n\nHere, the test run, including both the `to1` and the `to2` test, is repeated\nfive times.\n\n> #### Note {: .info }\n>\n> Do not confuse this feature with the `repeat` property of a test case group.\n> The options described here are used to repeat execution of entire test runs,\n> while the `repeat` property of a test case group makes it possible to repeat\n> execution of sets of test cases within a suite. For more information about the\n> latter, see section\n> [Test Case Groups ](write_test_chapter.md#test_case_groups)in section Writing\n> Test Suites.\n\n[](){: #silent_connections }","ref":"run_test_chapter.html#repeating-tests"},{"type":"extras","title":"Silent Connections - Running Tests and Analyzing Results","doc":"The protocol handling processes in `Common Test`, implemented by `ct_telnet`,\n`ct_ssh`, `ct_ftp`, and so on, do verbose printing to the test case logs. This\ncan be switched off with flag `-silent_connections`:\n\n```text\nct_run -silent_connections [conn_types]\n```\n\nHere, `conn_types` specifies SSH, Telnet, FTP, RPC, and/or SNMP.\n\n_Example 1:_\n\n```text\nct_run ... -silent_connections ssh telnet\n```\n\nThis switches off logging for SSH and Telnet connections.\n\n_Example 2:_\n\n```text\nct_run ... -silent_connections\n```\n\nThis switches off logging for all connection types.\n\nFatal communication error and reconnection attempts are always printed, even if\nlogging has been suppressed for the connection type in question. However,\noperations such as sending and receiving data are performed silently.\n\n`silent_connections` can also be specified in a test suite. This is accomplished\nby returning a tuple, `{silent_connections,ConnTypes}`, in the `suite/0` or test\ncase information list. If `ConnTypes` is a list of atoms (SSH, Telnet, FTP, RPC\nand/or SNMP), output for any corresponding connections are suppressed. Full\nlogging is by default enabled for any connection of type not specified in\n`ConnTypes`. Hence, if `ConnTypes` is the empty list, logging is enabled for all\nconnections.\n\n_Example 3:_\n\n```erlang\n-module(my_SUITE).\n\nsuite() -> [..., {silent_connections,[telnet,ssh]}, ...].\n\n...\n\nmy_testcase1() ->\n [{silent_connections,[ssh]}].\n\nmy_testcase1(_) ->\n ...\n\nmy_testcase2(_) ->\n ...\n```\n\nIn this example, `suite/0` tells `Common Test` to suppress printouts from Telnet\nand SSH connections. This is valid for all test cases. However, `my_testcase1/0`\nspecifies that for this test case, only SSH is to be silent. The result is that\n`my_testcase1` gets Telnet information (if any) printed in the log, but not SSH\ninformation. `my_testcase2` gets no information from either connection printed.\n\n`silent_connections` can also be specified with a term in a test specification\n(see section [Test Specifications](run_test_chapter.md#test_specifications) in\nsection Running Tests and Analyzing Results). Connections provided with start\nflag/option `silent_connections` are merged with any connections listed in the\ntest specification.\n\nStart flag/option `silent_connections` and the test specification term override\nany settings made by the information functions inside the test suite.\n\n> #### Note {: .info }\n>\n> In the current `Common Test` version, the `silent_connections` feature only\n> works for Telnet and SSH connections. Support for other connection types can\n> be added in future `Common Test` versions.","ref":"run_test_chapter.html#silent-connections"},{"type":"extras","title":"External Configuration Data","doc":"\n# External Configuration Data\n\n[](){: #top }","ref":"config_file_chapter.html"},{"type":"extras","title":"General - External Configuration Data","doc":"To avoid hard-coding data values related to the test and/or System Under Test\n(SUT) in the test suites, the data can instead be specified through\nconfiguration files or strings that `Common Test` reads before the start of a\ntest run. External configuration data makes it possible to change test\nproperties without modifying the test suites using the data. Examples of\nconfiguration data follows:\n\n- Addresses to the test plant or other instruments\n- User login information\n- Names of files needed by the test\n- Names of programs to be executed during the test\n- Any other variable needed by the test","ref":"config_file_chapter.html#general"},{"type":"extras","title":"Syntax - External Configuration Data","doc":"A configuration file can contain any number of elements of the type:\n\n```erlang\n{CfgVarName,Value}.\n```\n\nwhere\n\n```erlang\nCfgVarName = atom()\nValue = term() | [{CfgVarName,Value}]\n```","ref":"config_file_chapter.html#syntax"},{"type":"extras","title":"Requiring and Reading Configuration Data - External Configuration Data","doc":"[](){: #require_config_data }\n\nIn a test suite, one must _require_ that a configuration variable (`CfgVarName`\nin the previous definition) exists before attempting to read the associated\nvalue in a test case or configuration function.\n\n`require` is an assert statement, which can be part of the\n[Test Suite Information Function](write_test_chapter.md#suite) or\n[Test Case Information Function](write_test_chapter.md#info_function). If the\nrequired variable is unavailable, the test is skipped (unless a default value\nhas been specified, see section\n[Test Case Information Function](write_test_chapter.md#info_function) for\ndetails). Also, function [`ct:require/1/2`](`ct:require/1`) can be called from a\ntest case to check if a specific variable is available. The return value from\nthis function must be checked explicitly and appropriate action be taken\ndepending on the result (for example, to skip the test case if the variable in\nquestion does not exist).\n\nA `require` statement in the test suite information case or test case\ninformation-list is to look like `{require,CfgVarName}` or\n`{require,AliasName,CfgVarName}`. The arguments `AliasName` and `CfgVarName` are\nthe same as the arguments to [`ct:require/1,2`](`ct:require/1`). `AliasName`\nbecomes an alias for the configuration variable, and can be used as reference to\nthe configuration data value. The configuration variable can be associated with\nany number of alias names, but each name must be unique within the same test\nsuite. The two main uses for alias names follows:\n\n- To identify connections (described later).\n- To help adapt configuration data to a test suite (or test case) and improve\n readability.\n\nTo read the value of a configuration variable, use function\n[`get_config/1,2,3`](`ct:get_config/1`).\n\n_Example:_\n\n```erlang\nsuite() ->\n [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].\n\n...\n\ntestcase(Config) ->\n Domain = ct:get_config(domain),\n ...\n```","ref":"config_file_chapter.html#requiring-and-reading-configuration-data"},{"type":"extras","title":"Using Configuration Variables Defined in Multiple Files - External Configuration Data","doc":"If a configuration variable is defined in multiple files and you want to access\nall possible values, use function `ct:get_config/3` and specify `all` in the\noptions list. The values are then returned in a list and the order of the\nelements corresponds to the order that the configuration files were specified at\nstartup.","ref":"config_file_chapter.html#using-configuration-variables-defined-in-multiple-files"},{"type":"extras","title":"Encrypted Configuration Files - External Configuration Data","doc":"[](){: #encrypted_config_files }\n\nConfiguration files containing sensitive data can be encrypted if they must be\nstored in open and shared directories.\n\nTo have `Common Test` encrypt a specified file using function `DES3` in\napplication `Crypto`, call\n[`ct:encrypt_config_file/2,3`](`ct:encrypt_config_file/2`) The encrypted file\ncan then be used as a regular configuration file in combination with other\nencrypted files or normal text files. However, the key for decrypting the\nconfiguration file must be provided when running the test. This can be done with\nflag/option `decrypt_key` or `decrypt_file`, or a key file in a predefined\nlocation.\n\n`Common Test` also provides decryption functions,\n[`ct:decrypt_config_file/2,3`](`ct:decrypt_config_file/2`), for recreating the\noriginal text files.","ref":"config_file_chapter.html#encrypted-configuration-files"},{"type":"extras","title":"Opening Connections Using Configuration Data - External Configuration Data","doc":"Two different methods for opening a connection using the support functions in,\nfor example, `m:ct_ssh`, `m:ct_ftp`, and `m:ct_telnet` follows:\n\n- Using a configuration target name (an alias) as reference.\n- Using the configuration variable as reference.\n\nWhen a target name is used for referencing the configuration data (that\nspecifies the connection to be opened), the same name can be used as connection\nidentity in all subsequent calls related to the connection (also for closing\nit). Only one open connection per target name is possible. If you attempt to\nopen a new connection using a name already associated with an open connection,\n`Common Test` returns the already existing handle so the previously opened\nconnection is used. This feature makes it possible to call the function for\nopening a particular connection whenever useful. An action like this does not\nnecessarily open any new connections unless it is required (which could be the\ncase if, for example, the previous connection has been closed unexpectedly by\nthe server). Using named connections also removes the need to pass handle\nreferences around in the suite for these connections.\n\nWhen a configuration variable name is used as reference to the data specifying\nthe connection, the handle returned as a result of opening the connection must\nbe used in all subsequent calls (also for closing the connection). Repeated\ncalls to the open function with the same variable name as reference results in\nmultiple connections being opened. This can be useful, for example, if a test\ncase needs to open multiple connections to the same server on the target node\n(using the same configuration data for each connection).","ref":"config_file_chapter.html#opening-connections-using-configuration-data"},{"type":"extras","title":"User-Specific Configuration Data Formats - External Configuration Data","doc":"The user can specify configuration data on a different format than key-value\ntuples in a text file, as described so far. The data can, for example, be read\nfrom any files, fetched from the web over HTTP, or requested from a\nuser-specific process. To support this, `Common Test` provides a callback module\nplugin mechanism to handle configuration data.","ref":"config_file_chapter.html#user-specific-configuration-data-formats"},{"type":"extras","title":"Default Callback Modules for Handling Configuration Data - External Configuration Data","doc":"`Common Test` includes default callback modules for handling configuration data\nspecified in standard configuration files (described earlier) and in XML files\nas follows:\n\n- `ct_config_plain` \\- for reading configuration files with key-value tuples\n (standard format). This handler is used to parse configuration files if no\n user callback is specified.\n- `ct_config_xml` \\- for reading configuration data from XML files.","ref":"config_file_chapter.html#default-callback-modules-for-handling-configuration-data"},{"type":"extras","title":"Using XML Configuration Files - External Configuration Data","doc":"An example of an XML configuration file follows:\n\n```xml\n \n \n \"targethost\" \n \"tester\" \n \"letmein\" \n \n \"/test/loadmodules\" \n \n```\n\nOnce read, this file produces the same configuration variables as the following\ntext file:\n\n```erlang\n{ftp_host, [{ftp,\"targethost\"},\n {username,\"tester\"},\n {password,\"letmein\"}]}.\n\n{lm_directory, \"/test/loadmodules\"}.\n```","ref":"config_file_chapter.html#using-xml-configuration-files"},{"type":"extras","title":"Implement a User-Specific Handler - External Configuration Data","doc":"The user-specific handler can be written to handle special configuration file\nformats. The parameter can be either file names or configuration strings (the\nempty list is valid).\n\nThe callback module implementing the handler is responsible for checking the\ncorrectness of configuration strings.\n\nTo validate the configuration strings, the callback module is to have function\n`Callback:check_parameter/1` exported.\n\nThe input argument is passed from `Common Test`, as defined in the test\nspecification, or specified as an option to `ct_run` or `ct:run_test`.\n\nThe return value is to be any of the following values, indicating if the\nspecified configuration parameter is valid:\n\n- `{ok, {file, FileName}}` \\- the parameter is a file name and the file exists.\n- `{ok, {config, ConfigString}}` \\- the parameter is a configuration string and\n it is correct.\n- `{error, {nofile, FileName}}` \\- there is no file with the specified name in\n the current directory.\n- `{error, {wrong_config, ConfigString}}` \\- the configuration string is wrong.\n\nThe function `Callback:read_config/1` is to be exported from the callback module\nto read configuration data, initially before the tests start, or as a result of\ndata being reloaded during test execution. The input argument is the same as for\nfunction `check_parameter/1`.\n\nThe return value is to be either of the following:\n\n- `{ok, Config}` \\- if the configuration variables are read successfully.\n- `{error, {Error, ErrorDetails}}` \\- if the callback module fails to proceed\n with the specified configuration parameters.\n\n`Config` is the proper Erlang key-value list, with possible key-value sublists\nas values, like the earlier configuration file example:\n\n```erlang\n[{ftp_host, [{ftp, \"targethost\"}, {username, \"tester\"}, {password, \"letmein\"}]},\n {lm_directory, \"/test/loadmodules\"}]\n```","ref":"config_file_chapter.html#implement-a-user-specific-handler"},{"type":"extras","title":"Examples of Configuration Data Handling - External Configuration Data","doc":"A configuration file for using the FTP client to access files on a remote host\ncan look as follows:\n\n```erlang\n{ftp_host, [{ftp,\"targethost\"},\n {username,\"tester\"},\n {password,\"letmein\"}]}.\n\n{lm_directory, \"/test/loadmodules\"}.\n```\n\nThe XML version shown earlier can also be used, but it is to be explicitly\nspecified that the `ct_config_xml` callback module is to be used by\n`Common Test`.\n\nThe following is an example of how to assert that the configuration data is\navailable and can be used for an FTP session:\n\n```erlang\ninit_per_testcase(ftptest, Config) ->\n {ok,_} = ct_ftp:open(ftp),\n Config.\n\nend_per_testcase(ftptest, _Config) ->\n ct_ftp:close(ftp).\n\nftptest() ->\n [{require,ftp,ftp_host},\n {require,lm_directory}].\n\nftptest(Config) ->\n Remote = filename:join(ct:get_config(lm_directory), \"loadmodX\"),\n Local = filename:join(proplists:get_value(priv_dir,Config), \"loadmodule\"),\n ok = ct_ftp:recv(ftp, Remote, Local),\n ...\n```\n\nThe following is an example of how the functions in the previous example can be\nrewritten if it is necessary to open multiple connections to the FTP server:\n\n```erlang\ninit_per_testcase(ftptest, Config) ->\n {ok,Handle1} = ct_ftp:open(ftp_host),\n {ok,Handle2} = ct_ftp:open(ftp_host),\n [{ftp_handles,[Handle1,Handle2]} | Config].\n\nend_per_testcase(ftptest, Config) ->\n lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,\n proplists:get_value(ftp_handles,Config)).\n\nftptest() ->\n [{require,ftp_host},\n {require,lm_directory}].\n\nftptest(Config) ->\n Remote = filename:join(ct:get_config(lm_directory), \"loadmodX\"),\n Local = filename:join(proplists:get_value(priv_dir,Config), \"loadmodule\"),\n [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),\n ok = ct_ftp:recv(Handle, Remote, Local),\n ...\n```","ref":"config_file_chapter.html#examples-of-configuration-data-handling"},{"type":"extras","title":"Example of User-Specific Configuration Handler - External Configuration Data","doc":"A simple configuration handling driver, asking an external server for\nconfiguration data, can be implemented as follows:\n\n```erlang\n-module(config_driver).\n-export([read_config/1, check_parameter/1]).\n\nread_config(ServerName)->\n ServerModule = list_to_atom(ServerName),\n ServerModule:start(),\n ServerModule:get_config().\n\ncheck_parameter(ServerName)->\n ServerModule = list_to_atom(ServerName),\n case code:is_loaded(ServerModule) of\n {file, _}->\n {ok, {config, ServerName}};\n false->\n case code:load_file(ServerModule) of\n {module, ServerModule}->\n {ok, {config, ServerName}};\n {error, nofile}->\n {error, {wrong_config, \"File not found: \" ++ ServerName ++ \".beam\"}}\n end\n end.\n```\n\nThe configuration string for this driver can be `config_server`, if the\n`config_server.erl` module that follows is compiled and exists in the code path\nduring test execution:\n\n```erlang\n-module(config_server).\n-export([start/0, stop/0, init/1, get_config/0, loop/0]).\n\n-define(REGISTERED_NAME, ct_test_config_server).\n\nstart()->\n case whereis(?REGISTERED_NAME) of\n undefined->\n spawn(?MODULE, init, [?REGISTERED_NAME]),\n wait();\n _Pid->\n ok\n end,\n ?REGISTERED_NAME.\n\ninit(Name)->\n register(Name, self()),\n loop().\n\nget_config()->\n call(self(), get_config).\n\nstop()->\n call(self(), stop).\n\ncall(Client, Request)->\n case whereis(?REGISTERED_NAME) of\n undefined->\n {error, {not_started, Request}};\n Pid->\n Pid ! {Client, Request},\n receive\n Reply->\n {ok, Reply}\n after 4000->\n {error, {timeout, Request}}\n end\n end.\n\nloop()->\n receive\n {Pid, stop}->\n Pid ! ok;\n {Pid, get_config}->\n {D,T} = erlang:localtime(),\n Pid !\n [{localtime, [{date, D}, {time, T}]},\n {node, erlang:node()},\n {now, erlang:now()},\n {config_server_pid, self()},\n {config_server_vsn, ?vsn}],\n ?MODULE:loop()\n end.\n\nwait()->\n case whereis(?REGISTERED_NAME) of\n undefined->\n wait();\n _Pid->\n ok\n end.\n```\n\nHere, the handler also provides for dynamically reloading of configuration\nvariables. If [`ct:reload_config(localtime)`](`ct:reload_config/1`) is called\nfrom the test case function, all variables loaded with\n`config_driver:read_config/1` are updated with their latest values, and the new\nvalue for variable `localtime` is returned.","ref":"config_file_chapter.html#example-of-user-specific-configuration-handler"},{"type":"extras","title":"Code Coverage Analysis","doc":"\n# Code Coverage Analysis\n\n[](){: #cover }","ref":"cover_chapter.html"},{"type":"extras","title":"General - Code Coverage Analysis","doc":"Although `Common Test` was created primarily for black-box testing, nothing\nprevents it from working perfectly as a white-box testing tool as well. This is\nespecially true when the application to test is written in Erlang. Then the test\nports are easily realized with Erlang function calls.\n\nWhen white-box testing an Erlang application, it is useful to be able to measure\nthe code coverage of the test. `Common Test` provides simple access to the OTP\nCover tool for this purpose. `Common Test` handles all necessary communication\nwith the Cover tool (starting, compiling, analysing, and so on). The\n`Common Test` user only needs to specify the extent of the code coverage\nanalysis.","ref":"cover_chapter.html#general"},{"type":"extras","title":"Use - Code Coverage Analysis","doc":"To specify the modules to be included in the code coverage test, provide a cover\nspecification file. With this file you can point out specific modules or specify\ndirectories containing modules to be included in the analysis. You can also\nspecify modules to be excluded from the analysis.\n\nIf you are testing a distributed Erlang application, it is likely that code you\nwant included in the code coverage analysis gets executed on another Erlang node\nthan the one `Common Test` is running on. If so, you must specify these other\nnodes in the cover specification file or add them dynamically to the code\ncoverage set of nodes. For details on the latter, see module `m:ct_cover`.\n\nIn the cover specification file you can also specify your required level of the\ncode coverage analysis; `details` or `overview`. In detailed mode, you get a\ncoverage overview page, showing per module and total coverage percentages. You\nalso get an HTML file printed for each module included in the analysis showing\nexactly what parts of the code have been executed during the test. In overview\nmode, only the code coverage overview page is printed.\n\nYou can choose to export and import code coverage data between tests. If you\nspecify the name of an export file in the cover specification file,\n`Common Test` exports collected coverage data to this file at the end of the\ntest. You can similarly specify previously exported data to be imported and\nincluded in the analysis for a test (multiple import files can be specified).\nThis way, the total code coverage can be analyzed without necessarily running\nall tests at once.\n\nTo activate the code coverage support, specify the name of the cover\nspecification file as you start `Common Test`. Do this by using flag `-cover`\nwith [`ct_run`](ct_run_cmd.md), for example:\n\n```text\n$ ct_run -dir $TESTOBJS/db -cover $TESTOBJS/db/config/db.coverspec\n```\n\nYou can also pass the cover specification file name in a call to\n`ct:run_test/1`, by adding a `{cover,CoverSpec}` tuple to argument `Opts`.\n\nYou can also enable code coverage in your test specifications (see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results).\n\n[](){: #cover_stop }","ref":"cover_chapter.html#use"},{"type":"extras","title":"Stopping the Cover Tool When Tests Are Completed - Code Coverage Analysis","doc":"By default, the Cover tool is automatically stopped when the tests are\ncompleted. This causes the original (non-cover compiled) modules to be loaded\nback into the test node. If a process at this point still runs old code of any\nof the modules that are cover compiled, meaning that it has not done any fully\nqualified function call after the cover compilation, the process is killed. To\navoid this, set the value of option `cover_stop` to `false`. This means that the\nmodules stay cover compiled. Therefore, this is only recommended if the Erlang\nnodes under test are terminated after the test is completed, or if cover can be\nmanually stopped.\n\nThe option can be set by using flag `-cover_stop` with `ct_run`, by adding\n`{cover_stop,true|false}` to argument `Opts` to `ct:run_test/1`, or by adding a\n`cover_stop` term in the test specification (see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results).","ref":"cover_chapter.html#stopping-the-cover-tool-when-tests-are-completed"},{"type":"extras","title":"The Cover Specification File - Code Coverage Analysis","doc":"","ref":"cover_chapter.html#the-cover-specification-file"},{"type":"extras","title":"General Config - Code Coverage Analysis","doc":"Here follows the general configuration terms that are allowed in a cover\nspecification file:\n\n```erlang\n%% List of Nodes on which cover will be active during test.\n%% Nodes = [atom()]\n{nodes, Nodes}.\n\n%% Files with previously exported cover data to include in analysis.\n%% CoverDataFiles = [string()]\n{import, CoverDataFiles}.\n\n%% Cover data file to export from this session.\n%% CoverDataFile = string()\n{export, CoverDataFile}.\n\n%% Cover analysis level.\n%% Level = details | overview\n{level, Level}.\n\n%% Directories to include in cover.\n%% Dirs = [string()]\n{incl_dirs, Dirs}.\n\n%% Directories, including subdirectories, to include.\n{incl_dirs_r, Dirs}.\n\n%% Specific modules to include in cover.\n%% Mods = [atom()]\n{incl_mods, Mods}.\n\n%% Directories to exclude in cover.\n{excl_dirs, Dirs}.\n\n%% Directories, including subdirectories, to exclude.\n{excl_dirs_r, Dirs}.\n\n%% Specific modules to exclude in cover.\n{excl_mods, Mods}.\n\n%% Cross cover compilation\n%% Tag = atom(), an identifier for a test run\n%% Mod = [atom()], modules to compile for accumulated analysis\n{cross,[{Tag,Mods}]}.\n```\n\nThe terms `incl_dirs_r` and `excl_dirs_r` tell `Common Test` to search the\nspecified directories recursively and include or exclude any module found during\nthe search. The terms `incl_dirs` and `excl_dirs` result in a non-recursive\nsearch for modules (that is, only modules found in the specified directories are\nincluded or excluded).\n\n> #### Note {: .info }\n>\n> Directories containing Erlang modules to be included in a code coverage test\n> must exist in the code server path. Otherwise, the Cover tool fails to\n> recompile the modules. It is not sufficient to specify these directories in\n> the cover specification file for `Common Test`.","ref":"cover_chapter.html#general-config"},{"type":"extras","title":"OTP application Config - Code Coverage Analysis","doc":"When using a cover specification in the testing of an OTP application itself,\nthere is a special incl_app directive that includes the applications modules for\nthe cover compilation.\n\n```erlang\n{incl_app, AppName, Cover :: overview | details}.\n```\n\n> #### Note {: .info }\n>\n> If you desire to also use some other general cover configuration together with\n> this option you should insert the AppName in between the option and its value\n> creating a three tuple.\n\n[](){: #cross_cover }","ref":"cover_chapter.html#otp-application-config"},{"type":"extras","title":"Cross Cover Analysis - Code Coverage Analysis","doc":"The cross cover mechanism allows cover analysis of modules across multiple\ntests. It is useful if some code, for example, a library module, is used by many\ndifferent tests and the accumulated cover result is desirable.\n\nThis can also be achieved in a more customized way by using parameter `export`\nin the cover specification and analysing the result off line. However, the cross\ncover mechanism is a built-in solution that also provides logging.\n\nThe mechanism is easiest explained by an example:\n\nAssume that there are two systems, `s1` and `s2`, that are tested in separate\ntest runs. System `s1` contains a library module `m1` tested by test run `s1`\nand is included in the cover specification of `s1` as follows:\n\n```text\ns1.cover:\n {incl_mods,[m1]}.\n```\n\nWhen analysing code coverage, the result for `m1` can be seen in the cover log\nin the `s1` test result.\n\nNow, imagine that as `m1` is a library module, it is also often used by system\n`s2`. Test run `s2` does not specifically test `m1`, but it can still be\ninteresting to see which parts of `m1` that are covered by the `s2` tests. To do\nthis, `m1` can be included also in the cover specification of `s2` as follows:\n\n```text\ns2.cover:\n {incl_mods,[m1]}.\n```\n\nThis gives an entry for `m1` also in the cover log for test run `s2`. The\nproblem is that this only reflects the coverage by `s2` tests, not the\naccumulated result over `s1` and `s2`. This is where the cross cover mechanism\ncomes in handy.\n\nIf instead the cover specification for `s2` is like the following:\n\n```text\ns2.cover:\n {cross,[{s1,[m1]}]}.\n```\n\nThen `m1` is cover compiled in test run `s2`, but not shown in the coverage log.\nInstead, if `ct_cover:cross_cover_analyse/2` is called after both `s1` and `s2`\ntest runs are completed, the accumulated result for `m1` is available in the\ncross cover log for test run `s1`.\n\nThe call to the analyze function must be as follows:\n\n```erlang\nct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).\n```\n\nHere, `S1LogDir` and `S2LogDir` are the directories named ` .logs` for\neach test respectively.\n\nNotice the tags `s1` and `s2`, which are used in the cover specification file\nand in the call to `ct_cover:cross_cover_analyse/2`. The purpose of these is\nonly to map the modules specified in the cover specification to the log\ndirectory specified in the call to the analyze function. The tag name has no\nmeaning beyond this.","ref":"cover_chapter.html#cross-cover-analysis"},{"type":"extras","title":"Logging - Code Coverage Analysis","doc":"To view the result of a code coverage test, click the button labeled \"COVER LOG\"\nin the top-level index page for the test run.\n\nBefore Erlang/OTP 17.1, if your test run consisted of multiple tests, cover\nwould be started and stopped for each test within the test run. Separate logs\nwould be available through the \"Coverage log\" link on the test suite result\npages. These links are still available, but now they all point to the same page\nas the button on the top-level index page. The log contains the accumulated\nresults for the complete test run. For details about this change, see the\nrelease notes.\n\nThe button takes you to the code coverage overview page. If you have\nsuccessfully performed a detailed coverage analysis, links to each individual\nmodule coverage page are found here.\n\nIf cross cover analysis is performed, and there are accumulated coverage results\nfor the current test, the link \"Coverdata collected over all tests\" takes you to\nthese results.","ref":"cover_chapter.html#logging"},{"type":"extras","title":"Using Common Test for Large-Scale Testing","doc":"\n# Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html"},{"type":"extras","title":"General - Using Common Test for Large-Scale Testing","doc":"Large-scale automated testing requires running multiple independent test\nsessions in parallel. This is accomplished by running some `Common Test` nodes\non one or more hosts, testing different target systems. Configuring, starting,\nand controlling the test nodes independently can be a cumbersome operation. To\naid this kind of automated large-scale testing, `Common Test` offers a master\ntest node component, `Common Test` Master, which handles central configuration\nand control in a system of distributed `Common Test` nodes.\n\nThe `Common Test` Master server runs on one dedicated Erlang node and uses\ndistributed Erlang to communicate with any number of `Common Test` test nodes,\neach hosting a regular `Common Test` server. Test specifications are used as\ninput to specify what to test on which test nodes, using what configuration.\n\nThe `Common Test` Master server writes progress information to HTML log files\nsimilarly to the regular `Common Test` server. The logs contain test statistics\nand links to the log files written by each independent `Common Test` server.\n\nThe `Common Test` Master API is exported by module `m:ct_master`.","ref":"ct_master_chapter.html#general"},{"type":"extras","title":"Use - Using Common Test for Large-Scale Testing","doc":"`Common Test` Master requires all test nodes to be on the same network and share\na common file system. `Common Test` Master cannot start test nodes\nautomatically. The nodes must be started in advance for `Common Test` Master to\nbe able to start test sessions on them.\n\nTests are started by calling [`ct_master:run(TestSpecs)`](`ct_master:run/1`) or\n[`ct_master:run(TestSpecs, InclNodes, ExclNodes)`](`ct_master:run/3`)\n\n`TestSpecs` is either the name of a test specification file (string) or a list\nof test specifications. If it is a list, the specifications are handled (and the\ncorresponding tests executed) in sequence. An element in a `TestSpecs` list can\nalso be list of test specifications. The specifications in such a list are\nmerged into one combined specification before test execution.\n\n_Example:_\n\n```erlang\nct_master:run([\"ts1\",\"ts2\",[\"ts3\",\"ts4\"]])\n```\n\nHere, the tests specified by \"ts1\" run first, then the tests specified by \"ts2\",\nand finally the tests specified by both \"ts3\" and \"ts4\".\n\nThe `InclNodes` argument to `run/3` is a list of node names. Function `run/3`\nruns the tests in `TestSpecs` just like `run/1`, but also takes any test in\n`TestSpecs`, which is not explicitly tagged with a particular node name, and\nexecute it on the nodes listed in `InclNodes`. By using `run/3` this way, any\ntest specification can be used, with or without node information, in a\nlarge-scale test environment.\n\n`ExclNodes` is a list of nodes to be excluded from the test. That is, tests that\nare specified in the test specification to run on a particular node are not\nperformed if that node is listed in `ExclNodes` at runtime.\n\nIf `Common Test` Master fails initially to connect to any of the test nodes\nspecified in a test specification or in the `InclNodes` list, the operator is\nprompted with the option to either start over again (after manually checking the\nstatus of the nodes in question), to run without the missing nodes, or to abort\nthe operation.\n\nWhen tests start, `Common Test` Master displays information to console about the\ninvolved nodes. `Common Test` Master also reports when tests finish,\nsuccessfully or unsuccessfully. If connection is lost to a node, the test on\nthat node is considered finished. `Common Test` Master does not attempt to\nre-establish contact with the failing node.\n\nAt any time, to get the current status of the test nodes, call function\n[`ct_master:progress()`](`ct_master:progress/0`).\n\nTo stop one or more tests, use function\n[`ct_master:abort()`](`ct_master:abort/0`) (to stop all) or\n[`ct_master:abort(Nodes)`](`ct_master:abort/1`).\n\nFor details about the `Common Test` Master API, see module `m:ct_master`.\n\n[](){: #test_specifications }","ref":"ct_master_chapter.html#use"},{"type":"extras","title":"Test Specifications - Using Common Test for Large-Scale Testing","doc":"The test specifications used as input to `Common Test` Master are fully\ncompatible with the specifications used as input to the regular `Common Test`\nserver. The syntax is described in section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results.\n\nAll test specification terms can have a `NodeRefs` element. This element\nspecifies which node or nodes a configuration operation or a test is to be\nexecuted on. `NodeRefs` is defined as follows:\n\n`NodeRefs = all_nodes | [NodeRef] | NodeRef`\n\n`NodeRef = NodeAlias | node() | master`\n\nA `NodeAlias` (`t:atom/0`) is used in a test specification as a reference to a\nnode name (so the node name only needs to be declared once, which also can be\nachieved using constants). The alias is declared with a `node` term as follows:\n\n`{node, NodeAlias, NodeName}`\n\nIf `NodeRefs` has the value `all_nodes`, the operation or test is performed on\nall specified test nodes. (Declaring a term without a `NodeRefs` element has the\nsame effect). If `NodeRefs` has the value `master`, the operation is only\nperformed on the `Common Test` Master node (namely set the log directory or\ninstall an event handler).\n\nConsider the example in section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analysing Results, now extended with node information and\nintended to be executed by `Common Test` Master:\n\n```erlang\n{define, 'Top', \"/home/test\"}.\n{define, 'T1', \"'Top'/t1\"}.\n{define, 'T2', \"'Top'/t2\"}.\n{define, 'T3', \"'Top'/t3\"}.\n{define, 'CfgFile', \"config.cfg\"}.\n{define, 'Node', ct_node}.\n\n{node, node1, 'Node@host_x'}.\n{node, node2, 'Node@host_y'}.\n\n{logdir, master, \"'Top'/master_logs\"}.\n{logdir, \"'Top'/logs\"}.\n\n{config, node1, \"'T1'/'CfgFile'\"}.\n{config, node2, \"'T2'/'CfgFile'\"}.\n{config, \"'T3'/'CfgFile'\"}.\n\n{suites, node1, 'T1', all}.\n{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], \"Not implemented\"}.\n{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], \"Irrelevant\"}.\n{skip_cases, node1, 'T1', t1C_SUITE, [test1], \"Ignore\"}.\n\n{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.\n{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.\n\n{skip_suites, 'T3', all, \"Not implemented\"}.\n```\n\nThis example specifies the same tests as the original example. But now if\nstarted with a call to `ct_master:run(TestSpecName)`, test `t1` is executed on\nnode `ct_node@host_x` (`node1`), test `t2` on `ct_node@host_y` (`node2`) and\ntest `t3` on both `node1` and `node2`. Configuration file `t1` is only read on\n`node1` and configuration file `t2` only on `node2`, while the configuration\nfile `t3` is read on both `node1` and `node2`. Both test nodes write log files\nto the same directory. (However, the `Common Test` Master node uses a different\nlog directory than the test nodes.)\n\nIf the test session is instead started with a call to\n`ct_master:run(TestSpecName, [ct_node@host_z], [ct_node@host_x])`, the result is\nthat test `t1` does not run on `ct_node@host_x` (or any other node) while test\n`t3` runs on both `ct_node@host_y` and `ct_node@host_z`.\n\nA nice feature is that a test specification that includes node information can\nstill be used as input to the regular `Common Test` server (as described in\nsection [Test Specifications](run_test_chapter.md#test_specifications)). The\nresult is that any test specified to run on a node with the same name as the\n`Common Test` node in question (typically `ct@somehost` if started with the\n`ct_run` program), is performed. Tests without explicit node association are\nalways performed too, of course.","ref":"ct_master_chapter.html#test-specifications"},{"type":"extras","title":"Automatic Startup of Test Target Nodes - Using Common Test for Large-Scale Testing","doc":"[](){: #ct_slave }\n\nInitial actions can be started and performed automatically on test target nodes\nusing test specification term `init`.\n\nTwo subterms are supported, `node_start` and `eval`.\n\n_Example:_\n\n```erlang\n{node, node1, node1@host1}.\n{node, node2, node1@host2}.\n{node, node3, node2@host2}.\n{node, node4, node1@host3}.\n{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.\n{init, [node2, node3], {node_start, [{username, \"ct_user\"}, {password, \"ct_password\"}]}}.\n{init, node4, {eval, {module, function, []}}}.\n```\n\nThis test specification declares that `node1@host1` is to be started using the\nuser callback function `callback_module:my_slave_callback/0`, and nodes\n`node1@host2` and `node2@host2` are to be started with the default callback\nmodule `ct_slave`. The specified username and password are used to log on to\nremote host `host2`. Also, function `module:function/0` is evaluated on\n`node1@host3`, and the result of this call is printed to the log.\n\nThe default callback module `m:ct_slave`, has the following features:\n\n- Starting Erlang target nodes on local or remote hosts (application `SSH` is\n used for communication).\n- Ability to start an Erlang emulator with more flags (any flags supported by\n `erl` are supported).\n- Supervision of a node being started using internal callback functions. Used to\n prevent hanging nodes. (Configurable.)\n- Monitoring of the master node by the slaves. A slave node can be stopped if\n the master node terminates. (Configurable.)\n- Execution of user functions after a slave node is started. Functions can be\n specified as a list of `{Module, Function, Arguments}` tuples.\n\n> #### Note {: .info }\n>\n> An `eval` term for the node and `startup_functions` in the `node_start`\n> options list can be specified. In this case, the node is started first, then\n> the `startup_functions` are executed, and finally functions specified with\n> `eval` are called.","ref":"ct_master_chapter.html#automatic-startup-of-test-target-nodes"},{"type":"extras","title":"Event Handling","doc":"\n# Event Handling\n\n[](){: #event_handling }","ref":"event_handler_chapter.html"},{"type":"extras","title":"General - Event Handling","doc":"The operator of a `Common Test` system can receive event notifications\ncontinuously during a test run. For example, `Common Test` reports when a test\ncase starts and stops, the current count of successful, failed, and skipped\ncases, and so on. This information can be used for different purposes such as\nlogging progress and results in another format than HTML, saving statistics to a\ndatabase for report generation, and test system supervision.\n\n`Common Test` has a framework for event handling based on the OTP event manager\nconcept and `gen_event` behavior. When the `Common Test` server starts, it\nspawns an event manager. During test execution the manager gets a notification\nfrom the server when something of potential interest happens. Any event handler\nplugged into the event manager can match on events of interest, take action, or\npass the information on. The event handlers are Erlang modules implemented by\nthe `Common Test` user according to the `gen_event` behavior (for details, see\nmodule `m:gen_event` and section [`gen_event Behaviour`](`e:system:events.md`)\nin OTP Design Principles in the System Documentation).\n\nA `Common Test` server always starts an event manager. The server also plugs in\na default event handler, which only purpose is to relay notifications to a\nglobally registered `Common Test` Master event manager (if a `Common Test`\nMaster server is running in the system). The `Common Test` Master also spawns an\nevent manager at startup. Event handlers plugged into this manager receives the\nevents from all the test nodes, plus information from the `Common Test` Master\nserver.\n\nUser-specific event handlers can be plugged into a `Common Test` event manager,\neither by telling `Common Test` to install them before the test run (described\nlater), or by adding the handlers dynamically during the test run using\n`gen_event:add_handler/3` or `gen_event:add_sup_handler/3`. In the latter\nscenario, the reference of the `Common Test` event manager is required. To get\nit, call `ct:get_event_mgr_ref/0` or (on the `Common Test` Master node)\n`ct_master:get_event_mgr_ref/0`.\n\n[](){: #usage }","ref":"event_handler_chapter.html#general"},{"type":"extras","title":"Use - Event Handling","doc":"Event handlers can be installed by an `event_handler` start flag\n([`ct_run`](ct_run_cmd.md)) or option `ct:run_test/1`, where the argument\nspecifies the names of one or more event handler modules.\n\n_Example:_\n\n`$ ct_run -suite test/my_SUITE -event_handler handlers/my_evh1 handlers/my_evh2 -pa $PWD/handlers`\n\nTo pass start arguments to the event handler init function, use option\n`ct_run -event_handler_init` instead of `-event_handler`.\n\n> #### Note {: .info }\n>\n> All event handler modules must have `gen_event` behavior. These modules must\n> be precompiled and their locations must be added explicitly to the Erlang code\n> server search path (as in the previous example).\n\nAn event_handler tuple in argument `Opts` has the following definition (see\n`ct:run_test/1`):\n\n```erlang\n{event_handler,EventHandlers}\n\nEventHandlers = EH | [EH]\nEH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}\nInitArgs = [term()]\n```\n\nIn the following example, two event handlers for the `my_SUITE` test are\ninstalled:\n\n```erlang\n1> ct:run_test([{suite,\"test/my_SUITE\"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).\n```\n\nEvent handler `my_evh1` is started with `[]` as argument to the init function.\nEvent handler `my_evh2` is started with the name of the current node in the init\nargument list.\n\nEvent handlers can also be plugged in using one of the following\n[test specification](run_test_chapter.md#test_specifications) terms:\n\n- `{event_handler, EventHandlers}`\n- `{event_handler, EventHandlers, InitArgs}`\n- `{event_handler, NodeRefs, EventHandlers}`\n- `{event_handler, NodeRefs, EventHandlers, InitArgs}`\n\n`EventHandlers` is a list of module names. Before a test session starts, the\ninit function of each plugged in event handler is called (with the `InitArgs`\nlist as argument or `[]` if no start arguments are specified).\n\nTo plug in a handler to the `Common Test` Master event manager, specify `master`\nas the node in `NodeRefs`.\n\nTo be able to match on events, the event handler module must include the header\nfile `ct_event.hrl`. An event is a record with the following definition:\n\n`#event{name, node, data}`\n\n- **`name`** - Label (type) of the event.\n\n- **`node`** - Name of the node that the event originated from (only relevant\n for `Common Test` Master event handlers).\n\n- **`data`** - Specific for the event.\n\n[](){: #events }","ref":"event_handler_chapter.html#use"},{"type":"extras","title":"General Events - Event Handling","doc":"The general events are as follows:\n\n- **`#event{name = start_logging, data = LogDir}`** - `LogDir = string()`,\n top-level log directory for the test run.\n\n This event indicates that the logging process of `Common Test` has started\n successfully and is ready to receive I/O messages.\n\n- **`#event{name = stop_logging, data = []}`** - This event indicates that the\n logging process of `Common Test` was shut down at the end of the test run.\n\n- **`#event{name = test_start, data = {StartTime,LogDir}}`** -\n `StartTime = {date(),time()}`, test run start date and time.\n\n `LogDir = string()`, top-level log directory for the test run.\n\n This event indicates that `Common Test` has finished initial preparations and\n begins executing test cases.\n\n- **`#event{name = test_done, data = EndTime}`** - `EndTime = {date(),time()}`,\n date and time the test run finished.\n\n This event indicates that the last test case has been executed and\n `Common Test` is shutting down.\n\n- **`#event{name = start_info, data = {Tests,Suites,Cases}}`** -\n `Tests = integer()`, number of tests.\n\n `Suites = integer()`, total number of suites.\n\n `Cases = integer() | unknown`, total number of test cases.\n\n This event gives initial test run information that can be interpreted as:\n \"This test run will execute `Tests` separate tests, in total containing\n `Cases` number of test cases, in `Suites` number of suites\". However, if a\n test case group with a repeat property exists in any test, the total number of\n test cases cannot be calculated (unknown).\n\n- **`#event{name = tc_start, data = {Suite,FuncOrGroup}}`** - `Suite = atom()`,\n name of the test suite.\n\n `FuncOrGroup = Func | {Conf,GroupName,GroupProperties}`\n\n `Func = atom()`, name of test case or configuration function.\n\n `Conf = init_per_group | end_per_group`, group configuration function.\n\n `GroupName = atom()`, name of the group.\n\n `GroupProperties = list()`, list of execution properties for the group.\n\n This event informs about the start of a test case, or a group configuration\n function. The event is sent also for `init_per_suite` and `end_per_suite`, but\n not for `init_per_testcase` and `end_per_testcase`. If a group configuration\n function starts, the group name and execution properties are also specified.\n\n- **`#event{name = tc_logfile, data = {{Suite,Func},LogFileName}}`** -\n `Suite = atom()`, name of the test suite.\n\n `Func = atom()`, name of test case or configuration function.\n\n `LogFileName = string()`, full name of the test case log file.\n\n This event is sent at the start of each test case (and configuration function\n except `init/end_per_testcase`) and carries information about the full name\n (that is, the file name including the absolute directory path) of the current\n test case log file.\n\n- **`#event{name = tc_done, data = {Suite,FuncOrGroup,Result}}`** - [](){:\n #tc_done } `Suite = atom()`, name of the suite.\n\n `FuncOrGroup = Func | {Conf,GroupName,GroupProperties}`\n\n `Func = atom()`, name of test case or configuration function.\n\n `Conf = init_per_group | end_per_group`, group configuration function.\n\n `GroupName = unknown | atom()`, name of the group (unknown if init- or end\n function times out).\n\n `GroupProperties = list()`, list of execution properties for the group.\n\n `Result = ok | {auto_skipped,SkipReason} | {skipped,SkipReason} | {failed,FailReason}`,\n the result.\n\n [](){: #skipreason }\n `SkipReason = {require_failed,RequireInfo} | {require_failed_in_suite0,RequireInfo} | {failed,{Suite,init_per_testcase,FailInfo}} | UserTerm`,\n why the case was skipped.\n\n [](){: #failreason }\n `FailReason = {error,FailInfo} | {error,{RunTimeError,StackTrace}} | {timetrap_timeout,integer()} | {failed,{Suite,end_per_testcase,FailInfo}}`,\n reason for failure.\n\n `RequireInfo = {not_available,atom() | tuple()}`, why require failed.\n\n `FailInfo = {timetrap_timeout,integer()} | {RunTimeError,StackTrace} | UserTerm`,\n error details.\n\n `RunTimeError = term()`, a runtime error, for example, `badmatch` or `undef`.\n\n `StackTrace = list()`, list of function calls preceding a runtime error.\n\n `UserTerm = term()`, any data specified by user, or [`exit/1`](`exit/1`)\n information.\n\n This event informs about the end of a test case or a configuration function\n (see event `tc_start` for details on element `FuncOrGroup`). With this event\n comes the final result of the function in question. It is possible to\n determine on the top level of `Result` if the function was successful, skipped\n (by the user), or if it failed.\n\n It is also possible to dig deeper and, for example, perform pattern matching\n on the various reasons for skipped or failed. Notice that `{'EXIT',Reason}`\n tuples are translated into `{error,Reason}`. Notice also that if a\n `{failed,{Suite,end_per_testcase,FailInfo}` result is received, the test case\n was successful, but `end_per_testcase` for the case failed.\n\n- **`#event{name = tc_auto_skip, data = {Suite,TestName,Reason}}`** - [](){:\n #tc_auto_skip } `Suite = atom()`, the name of the suite.\n\n `TestName = init_per_suite | end_per_suite | {init_per_group,GroupName} | {end_per_group,GroupName} | {FuncName,GroupName} | FuncName`\n\n `FuncName = atom()`, the name of the test case or configuration function.\n\n `GroupName = atom()`, the name of the test case group.\n\n `Reason = {failed,FailReason} | {require_failed_in_suite0,RequireInfo}`,\n reason for auto-skipping `Func`.\n\n `FailReason = {Suite,ConfigFunc,FailInfo}} | {Suite,FailedCaseInSequence}`,\n reason for failure.\n\n `RequireInfo = {not_available,atom() | tuple()}`, why require failed.\n\n `ConfigFunc = init_per_suite | init_per_group`\n\n `FailInfo = {timetrap_timeout,integer()} | {RunTimeError,StackTrace} | bad_return | UserTerm`,\n error details.\n\n `FailedCaseInSequence = atom()`, the name of a case that failed in a sequence.\n\n `RunTimeError = term()`, a runtime error, for example `badmatch` or `undef`.\n\n `StackTrace = list()`, list of function calls preceding a runtime error.\n\n `UserTerm = term()`, any data specified by user, or [`exit/1`](`exit/1`)\n information.\n\n This event is sent for every test case or configuration function that\n `Common Test` has skipped automatically because of either a failed\n `init_per_suite` or `init_per_group`, a failed `require` in `suite/0`, or a\n failed test case in a sequence. Notice that this event is never received as a\n result of a test case getting skipped because of `init_per_testcase` failing,\n as that information is carried with event `tc_done`. If a failed test case\n belongs to a test case group, the second data element is a tuple\n `{FuncName,GroupName}`, otherwise only the function name.\n\n- **`#event{name = tc_user_skip, data = {Suite,TestName,Comment}}`** - [](){:\n #tc_user_skip } `Suite = atom()`, the name of the suite.\n\n `TestName = init_per_suite | end_per_suite | {init_per_group,GroupName} | {end_per_group,GroupName} | {FuncName,GroupName} | FuncName`\n\n `FuncName = atom()`, the name of the test case or configuration function.\n\n `GroupName = atom()`, the name of the test case group.\n\n `Comment = string()`, why the test case was skipped.\n\n This event specifies that a test case was skipped by the user. It is only\n received if the skip is declared in a test specification. Otherwise, user skip\n information is received as a `{skipped,SkipReason}` result in event `tc_done`\n for the test case. If a skipped test case belongs to a test case group, the\n second data element is a tuple `{FuncName,GroupName}`, otherwise only the\n function name.\n\n- **`#event{name = test_stats, data = {Ok,Failed,Skipped}}`** -\n `Ok = integer()`, current number of successful test cases.\n\n `Failed = integer()`, current number of failed test cases.\n\n `Skipped = {UserSkipped,AutoSkipped}`\n\n `UserSkipped = integer()`, current number of user-skipped test cases.\n\n `AutoSkipped = integer()`, current number of auto-skipped test cases.\n\n This is a statistics event with current count of successful, skipped, and\n failed test cases so far. This event is sent after the end of each test case,\n immediately following event `tc_done`.","ref":"event_handler_chapter.html#general-events"},{"type":"extras","title":"Internal Events - Event Handling","doc":"The internal events are as follows:\n\n- **`#event{name = start_make, data = Dir}`** - `Dir = string()`, running make\n in this directory.\n\n This internal event says that `Common Test` starts compiling modules in\n directory `Dir`.\n\n- **`#event{name = finished_make, data = Dir}`** - `Dir = string()`, finished\n running make in this directory.\n\n This internal event says that `Common Test` is finished compiling modules in\n directory `Dir`.\n\n- **`#event{name = start_write_file, data = FullNameFile}`** -\n `FullNameFile = string(), full name of the file.`\n\n This internal event is used by the `Common Test` Master process to synchronize\n particular file operations.\n\n- **`#event{name = finished_write_file, data = FullNameFile}`** -\n `FullNameFile = string(), full name of the file.`\n\n This internal event is used by the `Common Test` Master process to synchronize\n particular file operations.","ref":"event_handler_chapter.html#internal-events"},{"type":"extras","title":"Notes - Event Handling","doc":"The events are also documented in `ct_event.erl`. This module can serve as an\nexample of what an event handler for the `Common Test` event manager can look\nlike.\n\n> #### Note {: .info }\n>\n> To ensure that printouts to `stdout` (or printouts made with\n> [`ct:log/2,3`](`ct:log/2`) or [`ct:pal,2,3`](`ct:pal/2`)) get written to the\n> test case log file, and not to the `Common Test` framework log, you can\n> synchronize with the `Common Test` server by matching on events `tc_start` and\n> `tc_done`. In the period between these events, all I/O is directed to the test\n> case log file. These events are sent synchronously to avoid potential timing\n> problems (for example, that the test case log file is closed just before an\n> I/O message from an external process gets through). Knowing this, you need to\n> be careful that your `handle_event/2` callback function does not stall the\n> test execution, possibly causing unexpected behavior as a result.","ref":"event_handler_chapter.html#notes"},{"type":"extras","title":"Dependencies between Test Cases and Suites","doc":"\n# Dependencies between Test Cases and Suites","ref":"dependencies_chapter.html"},{"type":"extras","title":"General - Dependencies between Test Cases and Suites","doc":"When creating test suites, it is strongly recommended to not create dependencies\nbetween test cases, that is, letting test cases depend on the result of previous\ntest cases. There are various reasons for this, such as, the following:\n\n- It makes it impossible to run test cases individually.\n- It makes it impossible to run test cases in a different order.\n- It makes debugging difficult (as a fault can be the result of a problem in a\n different test case than the one failing).\n- There are no good and explicit ways to declare dependencies, so it can be\n difficult to see and understand these in test suite code and in test logs.\n- Extending, restructuring, and maintaining test suites with test case\n dependencies is difficult.\n\nThere are often sufficient means to work around the need for test case\ndependencies. Generally, the problem is related to the state of the System Under\nTest (SUT). The action of one test case can change the system state. For some\nother test case to run properly, this new state must be known.\n\nInstead of passing data between test cases, it is recommended that the test\ncases read the state from the SUT and perform assertions (that is, let the test\ncase run if the state is as expected, otherwise reset or fail). It is also\nrecommended to use the state to set variables necessary for the test case to\nexecute properly. Common actions can often be implemented as library functions\nfor test cases to call to set the SUT in a required state. (Such common actions\ncan also be separately tested, if necessary, to ensure that they work as\nexpected). It is sometimes also possible, but not always desirable, to group\ntests together in one test case, that is, let a test case perform a \"scenario\"\ntest (a test consisting of subtests).\n\nConsider, for example, a server application under test. The following\nfunctionality is to be tested:\n\n- Starting the server\n- Configuring the server\n- Connecting a client to the server\n- Disconnecting a client from the server\n- Stopping the server\n\nThere are obvious dependencies between the listed functions. The server cannot\nbe configured if it has not first been started, a client cannot be connected\nuntil the server is properly configured, and so on. If we want to have one test\ncase for each function, we might be tempted to try to always run the test cases\nin the stated order and carry possible data (identities, handles, and so on)\nbetween the cases and therefore introduce dependencies between them.\n\nTo avoid this, we can consider starting and stopping the server for every test.\nWe can thus implement the start and stop action as common functions to be called\nfrom [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) and\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`). (Remember to test the\nstart and stop functionality separately.) The configuration can also be\nimplemented as a common function, maybe grouped with the start function.\nFinally, the testing of connecting and disconnecting a client can be grouped\ninto one test case. The resulting suite can look as follows:\n\n```erlang\n-module(my_server_SUITE).\n-compile(export_all).\n-include_lib(\"ct.hrl\").\n\n%%% init and end functions...\n\nsuite() -> [{require,my_server_cfg}].\n\ninit_per_testcase(start_and_stop, Config) ->\n Config;\n\ninit_per_testcase(config, Config) ->\n [{server_pid,start_server()} | Config];\n\ninit_per_testcase(_, Config) ->\n ServerPid = start_server(),\n configure_server(),\n [{server_pid,ServerPid} | Config].\n\nend_per_testcase(start_and_stop, _) ->\n ok;\n\nend_per_testcase(_, Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n stop_server(ServerPid).\n\n%%% test cases...\n\nall() -> [start_and_stop, config, connect_and_disconnect].\n\n%% test that starting and stopping works\nstart_and_stop(_) ->\n ServerPid = start_server(),\n stop_server(ServerPid).\n\n%% configuration test\nconfig(Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n configure_server(ServerPid).\n\n%% test connecting and disconnecting client\nconnect_and_disconnect(Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n {ok,SessionId} = my_server:connect(ServerPid),\n ok = my_server:disconnect(ServerPid, SessionId).\n\n%%% common functions...\n\nstart_server() ->\n {ok,ServerPid} = my_server:start(),\n ServerPid.\n\nstop_server(ServerPid) ->\n ok = my_server:stop(),\n ok.\n\nconfigure_server(ServerPid) ->\n ServerCfgData = ct:get_config(my_server_cfg),\n ok = my_server:configure(ServerPid, ServerCfgData),\n ok.\n```\n\n[](){: #save_config }","ref":"dependencies_chapter.html#general"},{"type":"extras","title":"Saving Configuration Data - Dependencies between Test Cases and Suites","doc":"Sometimes it is impossible, or infeasible, to implement independent test cases.\nMaybe it is not possible to read the SUT state. Maybe resetting the SUT is\nimpossible and it takes too long time to restart the system. In situations where\ntest case dependency is necessary, CT offers a structured way to carry data from\none test case to the next. The same mechanism can also be used to carry data\nfrom one test suite to the next.\n\nThe mechanism for passing data is called `save_config`. The idea is that one\ntest case (or suite) can save the current value of `Config`, or any list of\nkey-value tuples, so that the next executing test case (or test suite) can read\nit. The configuration data is not saved permanently but can only be passed from\none case (or suite) to the next.\n\nTo save `Config` data, return tuple `{save_config,ConfigList}` from\n`end_per_testcase` or from the main test case function.\n\nTo read data saved by a previous test case, use `proplists:get_value` with a\n`saved_config` key as follows:\n\n`{Saver,ConfigList} = proplists:get_value(saved_config, Config)`\n\n`Saver` (`t:atom/0`) is the name of the previous test case (where the data was\nsaved). The `proplists:get_value` function can be used to extract particular\ndata also from the recalled `ConfigList`. It is strongly recommended that\n`Saver` is always matched to the expected name of the saving test case. This\nway, problems because of restructuring of the test suite can be avoided. Also,\nit makes the dependency more explicit and the test suite easier to read and\nmaintain.\n\nTo pass data from one test suite to another, the same mechanism is used. The\ndata is to be saved by finction [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\nand read by function [`init_per_suite`](`c:ct_suite:init_per_suite/1`) in the\nsuite that follows. When passing data between suites, `Saver` carries the name\nof the test suite.\n\n_Example:_\n\n```erlang\n-module(server_b_SUITE).\n-compile(export_all).\n-include_lib(\"ct.hrl\").\n\n%%% init and end functions...\n\ninit_per_suite(Config) ->\n %% read config saved by previous test suite\n {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),\n %% extract server identity (comes from server_a_SUITE)\n ServerId = proplists:get_value(server_id, OldConfig),\n SessionId = connect_to_server(ServerId),\n [{ids,{ServerId,SessionId}} | Config].\n\nend_per_suite(Config) ->\n %% save config for server_c_SUITE (session_id and server_id)\n {save_config,Config}\n\n%%% test cases...\n\nall() -> [allocate, deallocate].\n\nallocate(Config) ->\n {ServerId,SessionId} = proplists:get_value(ids, Config),\n {ok,Handle} = allocate_resource(ServerId, SessionId),\n %% save handle for deallocation test\n NewConfig = [{handle,Handle}],\n {save_config,NewConfig}.\n\ndeallocate(Config) ->\n {ServerId,SessionId} = proplists:get_value(ids, Config),\n {allocate,OldConfig} = proplists:get_value(saved_config, Config),\n Handle = proplists:get_value(handle, OldConfig),\n ok = deallocate_resource(ServerId, SessionId, Handle).\n```\n\nTo save `Config` data from a test case that is to be skipped, return tuple\n`{skip_and_save,Reason,ConfigList}`.\n\nThe result is that the test case is skipped with `Reason` printed to the log\nfile (as described earlier) and `ConfigList` is saved for the next test case.\n`ConfigList` can be read using `proplists:get_value(saved_config, Config)`, as\ndescribed earlier. `skip_and_save` can also be returned from `init_per_suite`.\nIn this case, the saved data can be read by `init_per_suite` in the suite that\nfollows.","ref":"dependencies_chapter.html#saving-configuration-data"},{"type":"extras","title":"Sequences - Dependencies between Test Cases and Suites","doc":"Sometimes test cases depend on each other so that if one case fails, the\nfollowing tests are not to be executed. Typically, if the `save_config` facility\nis used and a test case that is expected to save data crashes, the following\ncase cannot run. `Common Test` offers a way to declare such dependencies, called\nsequences.\n\nA sequence of test cases is defined as a test case group with a `sequence`\nproperty. Test case groups are defined through function `groups/0` in the test\nsuite (for details, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups).\n\nFor example, to ensure that if `allocate` in `server_b_SUITE` crashes,\n`deallocate` is skipped, the following sequence can be defined:\n\n```erlang\ngroups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].\n```\n\nAssume that the suite contains the test case `get_resource_status` that is\nindependent of the other two cases, then function `all` can look as follows:\n\n```erlang\nall() -> [{group,alloc_and_dealloc}, get_resource_status].\n```\n\nIf `alloc` succeeds, `dealloc` is also executed. If `alloc` fails however,\n`dealloc` is not executed but marked as `SKIPPED` in the HTML log.\n`get_resource_status` runs no matter what happens to the `alloc_and_dealloc`\ncases.\n\nTest cases in a sequence are executed in order until all succeed or one fails.\nIf one fails, all following cases in the sequence are skipped. The cases in the\nsequence that have succeeded up to that point are reported as successful in the\nlog. Any number of sequences can be specified.\n\n_Example:_\n\n```erlang\ngroups() -> [{scenarioA, [sequence], [testA1, testA2]},\n {scenarioB, [sequence], [testB1, testB2, testB3]}].\n\nall() -> [test1,\n test2,\n {group,scenarioA},\n test3,\n {group,scenarioB},\n test4].\n```\n\nA sequence group can have subgroups. Such subgroups can have any property, that\nis, they are not required to also be sequences. If you want the status of the\nsubgroup to affect the sequence on the level above, return\n`{return_group_result,Status}` from\n[`end_per_group/2`](`c:ct_suite:end_per_group/2`), as described in section\n[Repeated Groups](write_test_chapter.md#repeated_groups) in Writing Test Suites.\nA failed subgroup (`Status == failed`) causes the execution of a sequence to\nfail in the same way a test case does.","ref":"dependencies_chapter.html#sequences"},{"type":"extras","title":"Common Test Hooks","doc":"\n# Common Test Hooks","ref":"ct_hooks_chapter.html"},{"type":"extras","title":"General - Common Test Hooks","doc":"The _Common Test Hook (CTH)_ framework allows extensions of the default behavior\nof `Common Test` using hooks before and after all test suite calls. CTHs allow\nadvanced `Common Test` users to abstract out behavior that is common to multiple\ntest suites without littering all test suites with library calls. This can be\nused for logging, starting, and monitoring external systems, building C files\nneeded by the tests, and so on.\n\nIn brief, CTH allows you to do the following:\n\n- Manipulate the runtime configuration before each suite configuration call.\n- Manipulate the return of all suite configuration calls, and in extension, the\n result of the tests themselves.\n\nThe following sections describe how to use CTHs, when they are run, and how to\nmanipulate the test results in a CTH.\n\n> #### Warning {: .warning }\n>\n> When executing within a CTH, all timetraps are shut off. So if your CTH never\n> returns, the entire test run is stalled.\n\n[](){: #installing }","ref":"ct_hooks_chapter.html#general"},{"type":"extras","title":"Installing a CTH - Common Test Hooks","doc":"A CTH can be installed in multiple ways in your test run. You can do it for all\ntests in a run, for specific test suites, and for specific groups within a test\nsuite. If you want a CTH to be present in all test suites within your test run,\nthere are three ways to accomplish that, as follows:\n\n- Add `-ct_hooks` as an argument to [ct_run](run_test_chapter.md#ct_run). To add\n multiple CTHs using this method, append them to each other using the keyword\n `and`, that is, `ct_run -ct_hooks cth1 [{debug,true}] and cth2 ...`.\n- Add tag `ct_hooks` to your\n [Test Specification](run_test_chapter.md#test_specifications).\n- Add tag `ct_hooks` to your call to `ct:run_test/1`.\n\nCTHs can also be added within a test suite. This is done by returning\n`{ct_hooks,[CTH]}` in the configuration list from\n[suite/0](`c:ct_suite:suite/0`),\n[init_per_suite/1](`c:ct_suite:init_per_suite/1`), or\n[init_per_group/2](`c:ct_suite:init_per_group/2`).\n\nIn this case, `CTH` can either be only the module name of the CTH or a tuple\nwith the module name and the initial arguments, and optionally the hook priority\nof the CTH. For example, one of the following:\n\n- `{ct_hooks,[my_cth_module]}`\n- `{ct_hooks,[{my_cth_module,[{debug,true}]}]}`\n- `{ct_hooks,[{my_cth_module,[{debug,true}],500}]}`\n\nNote that regardless of how you install a CTH, its BEAM file must be available\nin the code path when Common Test runs. `ct_run` accepts the `-pa` command line\noption.","ref":"ct_hooks_chapter.html#installing-a-cth"},{"type":"extras","title":"Overriding CTHs - Common Test Hooks","doc":"By default, each installation of a CTH causes a new instance of it to be\nactivated. This can cause problems if you want to override CTHs in test\nspecifications while still having them in the suite information function. The\n[id/1](`c:ct_hooks:id/1`) callback exists to address this problem. By returning\nthe same `id` in both places, `Common Test` knows that this CTH is already\ninstalled and does not try to install it again.\n\n[](){: #cth_execution_order }","ref":"ct_hooks_chapter.html#overriding-cths"},{"type":"extras","title":"CTH Execution Order - Common Test Hooks","doc":"By default, each installed CTH is executed in the order in which they are\ninstalled for init calls, and then reversed for end calls. This order can be\nreferred to as test-centric, as the order is reversed after a testcase is\nexecuted and corresponds to the default value (`test`) of `ct_hooks_order`\noption.\n\nThe installation-based order is not always desired, so `Common Test` allows the\nuser to specify a priority for each hook. The priority can be specified in the\nCTH function [init/2](`c:ct_hooks:init/2`) or when installing the hook. The\npriority specified at installation overrides the priority returned by the CTH.\n\nIn some cases, the reversed order for all end calls is not desired, and instead,\nthe user might prefer the reversed order for post hook calls. Such behavior can\nbe enabled with `ct_hooks_order` option with `config` value. When this option is\nenabled, the execution order is configuration-centric, as the reversed order\nhappens after each configuration function and not in relation to testcase.\n\nNote that the `ct_hooks_order` option is considered as a global framework\nsetting. In case when option is configured multiple times framework with process\nonly the first value.\n\nThe `ct_hooks_order` option can be set as: `ct_run` argument, in test\nspecification or [suite/0](`c:ct_suite:suite/0`) return value.\n\n[](){: #scope }","ref":"ct_hooks_chapter.html#cth-execution-order"},{"type":"extras","title":"CTH Scope - Common Test Hooks","doc":"Once the CTH is installed into a certain test run it remains there until its\nscope is expired. The scope of a CTH depends on when it is installed, see the\nfollowing table. Function [init/2](`c:ct_hooks:init/2`) is called at the\nbeginning of the scope and function [terminate/1](`c:ct_hooks:terminate/1`) is\ncalled when the scope ends.\n\n| _CTH installed in_ | _CTH scope begins before_ | _CTH scope ends after_ |\n| ------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |\n| [ct_run](run_test_chapter.md#ct_run) | the first test suite is to be run | the last test suite has been run |\n| [ct:run_test](`ct:run_test/1`) | the first test suite is run | the last test suite has been run |\n| [Test Specification](run_test_chapter.md#test_specifications) | the first test suite is run | the last test suite has been run |\n| [suite/0](`c:ct_suite:suite/0`) | [pre_init_per_suite/3](`c:ct_hooks:pre_init_per_suite/3`) is called | [post_end_per_suite/4](`c:ct_hooks:post_end_per_suite/4`) has been called for that test suite |\n| [init_per_suite/1](`c:ct_suite:init_per_suite/1`) | [post_init_per_suite/4](`c:ct_hooks:post_init_per_suite/4`) is called | [post_end_per_suite/4](`c:ct_hooks:post_end_per_suite/4`) has been called for that test suite |\n| [init_per_group/2](`c:ct_suite:init_per_group/2`) | [post_init_per_group/5](`c:ct_hooks:post_init_per_group/5`) is called | [post_end_per_group/5](`c:ct_hooks:post_end_per_group/5`) has been called for that group |\n\n_Table: Scope of a CTH_","ref":"ct_hooks_chapter.html#cth-scope"},{"type":"extras","title":"CTH Processes and Tables - Common Test Hooks","doc":"CTHs are run with the same process scoping as normal test suites, that is, a\ndifferent process executes the `init_per_suite` hooks then the `init_per_group`\nor `per_testcase` hooks. So if you want to spawn a process in the CTH, you\ncannot link with the CTH process, as it exits after the post hook ends. Also, if\nyou for some reason need an ETS table with your CTH, you must spawn a process\nthat handles it.","ref":"ct_hooks_chapter.html#cth-processes-and-tables"},{"type":"extras","title":"External Configuration Data and Logging - Common Test Hooks","doc":"Configuration data values in the CTH can be read by calling\n[`ct:get_config/1,2,3`](`ct:get_config/1`) (as explained in section\n[Requiring and Reading Configuration Data](config_file_chapter.md#require_config_data)).\nThe configuration variables in question must, as always, first have been\nrequired by a suite-, group-, or test case information function, or by function\n[`ct:require/1/2`](`ct:require/1`). The latter can also be used in CT hook\nfunctions.\n\nThe CT hook functions can call any logging function in the `ct` interface to\nprint information to the log files, or to add comments in the suite overview\npage.\n\n[](){: #manipulating }","ref":"ct_hooks_chapter.html#external-configuration-data-and-logging"},{"type":"extras","title":"Manipulating Tests - Common Test Hooks","doc":"Through CTHs the results of tests and configuration functions can be\nmanipulated. The main purpose to do this with CTHs is to allow common patterns\nto be abstracted out from test suites and applied to multiple test suites\nwithout duplicating any code. All the callback functions for a CTH follow a\ncommon interface described hereafter.\n\n`Common Test` always calls all available hook functions, even pre- and post\nhooks for configuration functions that are not implemented in the suite. For\nexample, `pre_init_per_suite(x_SUITE, ...)` and\n`post_init_per_suite(x_SUITE, ...)` are called for test suite `x_SUITE`, even if\nit does not export `init_per_suite/1`. With this feature hooks can be used as\nconfiguration fallbacks, and all configuration functions can be replaced with\nhook functions.\n\n[](){: #pre }","ref":"ct_hooks_chapter.html#manipulating-tests"},{"type":"extras","title":"Pre Hooks - Common Test Hooks","doc":"In a CTH, the behavior can be hooked in before the following functions:\n\n- [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\n- [`init_per_group`](`c:ct_suite:init_per_group/2`)\n- [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`)\n- [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`)\n- [`end_per_group`](`c:ct_suite:end_per_group/2`)\n- [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\n\nThis is done in the CTH functions called `pre_ `. These\nfunctions take the arguments `SuiteName`, `Name` (group or test case name, if\napplicable), `Config`, and `CTHState`. The return value of the CTH function is\nalways a combination of a result for the suite/group/test and an updated\n`CTHState`.\n\nTo let the test suite continue on executing, return the configuration list that\nyou want the test to use as the result.\n\nAll pre hooks, except `pre_end_per_testcase/4`, can skip or fail the test by\nreturning a tuple with `skip` or `fail`, and a reason as the result.\n\n_Example:_\n\n```erlang\npre_init_per_suite(SuiteName, Config, CTHState) ->\n case db:connect() of\n {error,_Reason} ->\n {{fail, \"Could not connect to DB\"}, CTHState};\n {ok, Handle} ->\n {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}\n end.\n```\n\n> #### Note {: .info }\n>\n> If you use multiple CTHs, the first part of the return tuple is used as input\n> for the next CTH. So in the previous example the next CTH can get\n> `{fail,Reason}` as the second parameter. If you have many CTHs interacting, do\n> not let each CTH return `fail` or `skip`. Instead, return that an action is to\n> be taken through the `Config` list and implement a CTH that, at the end, takes\n> the correct action.\n\n[](){: #post }","ref":"ct_hooks_chapter.html#pre-hooks"},{"type":"extras","title":"Post Hooks - Common Test Hooks","doc":"In a CTH, behavior can be hooked in after the following functions:\n\n- [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\n- [`init_per_group`](`c:ct_suite:init_per_group/2`)\n- [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`)\n- [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`)\n- [`end_per_group`](`c:ct_suite:end_per_group/2`)\n- [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\n\nThis is done in the CTH functions called `post_ `. These\nfunctions take the arguments `SuiteName`, `Name` (group or test case name, if\napplicable), `Config`, `Return`, and `CTHState`. `Config` in this case is the\nsame `Config` as the testcase is called with. `Return` is the value returned by\nthe testcase. If the testcase fails by crashing, `Return` is\n`{'EXIT',{{Error,Reason},Stacktrace}}`.\n\nThe return value of the CTH function is always a combination of a result for the\nsuite/group/test and an updated `CTHState`. If you do not want the callback to\naffect the outcome of the test, return the `Return` data as it is given to the\nCTH. You can also modify the test result. By returning the `Config` list with\nelement `tc_status` removed, you can recover from a test failure. As in all the\npre hooks, it is also possible to fail/skip the test case in the post hook.\n\n_Example:_\n\n```erlang\npost_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->\n case db:check_consistency() of\n true ->\n %% DB is good, pass the test.\n {proplists:delete(tc_status, Config), CTHState};\n false ->\n %% DB is not good, mark as skipped instead of failing\n {{skip, \"DB is inconsistent!\"}, CTHState}\n end;\npost_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->\n %% Do nothing if tc does not crash.\n {Return, CTHState}.\n```\n\n> #### Note {: .info }\n>\n> Do recover from a testcase failure using CTHs only a last resort. If used\n> wrongly, it can be very difficult to determine which tests that pass or fail\n> in a test run.","ref":"ct_hooks_chapter.html#post-hooks"},{"type":"extras","title":"Skip and Fail Hooks - Common Test Hooks","doc":"After any post hook has been executed for all installed CTHs,\n[on_tc_fail](`c:ct_hooks:on_tc_fail/4`) or\n[on_tc_skip](`c:ct_hooks:on_tc_skip/4`) is called if the testcase failed or was\nskipped, respectively. You cannot affect the outcome of the tests any further at\nthis point.\n\n[](){: #synchronizing }","ref":"ct_hooks_chapter.html#skip-and-fail-hooks"},{"type":"extras","title":"Synchronizing External User Applications with Common Test - Common Test Hooks","doc":"CTHs can be used to synchronize test runs with external user applications. The\ninit function can, for example, start and/or communicate with an application\nthat has the purpose of preparing the SUT for an upcoming test run, or\ninitialize a database for saving test data to during the test run. The terminate\nfunction can similarly order such an application to reset the SUT after the test\nrun, and/or tell the application to finish active sessions and terminate. Any\nsystem error- or progress reports generated during the init- or termination\nstage are saved in the\n[Pre- and Post Test I/O Log](run_test_chapter.md#pre_post_test_io_log). (This is\nalso true for any printouts made with `ct:log/2` and `ct:pal/2`).\n\nTo ensure that `Common Test` does not start executing tests, or closes its log\nfiles and shuts down, before the external application is ready for it,\n`Common Test` can be synchronized with the application. During startup and\nshutdown, `Common Test` can be suspended, simply by having a CTH evaluate a\n`receive` expression in the init- or terminate function. The macros\n`?CT_HOOK_INIT_PROCESS` (the process executing the hook init function) and\n`?CT_HOOK_TERMINATE_PROCESS` (the process executing the hook terminate function)\neach specifies the name of the correct `Common Test` process to send a message\nto. This is done to return from the `receive`. These macros are defined in\n`ct.hrl`.\n\n[](){: #example }","ref":"ct_hooks_chapter.html#synchronizing-external-user-applications-with-common-test"},{"type":"extras","title":"Example CTH - Common Test Hooks","doc":"The following CTH logs information about a test run into a format parseable by\n`file:consult/1` (in Kernel):\n\n```erlang\n%%% Common Test Example Common Test Hook module.\n%%%\n%%% To use this hook, on the command line:\n%%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth\n%%%\n%%% Note `-pa .`: the hook beam file must be in the code path when installing.\n-module(example_cth).\n\n%% Mandatory Callbacks\n-export([init/2]).\n\n%% Optional Callbacks\n-export([id/1]).\n\n-export([pre_init_per_suite/3]).\n-export([post_end_per_suite/4]).\n\n-export([pre_init_per_testcase/4]).\n-export([post_end_per_testcase/5]).\n\n-export([on_tc_skip/4]).\n\n-export([terminate/1]).\n\n%% This hook state is threaded through all the callbacks.\n-record(state, {filename, total, suite_total, ts, tcs, data, skipped}).\n%% This example hook prints its results to a file, see terminate/1.\n-record(test_run, {total, skipped, suites}).\n\n%% Return a unique id for this CTH.\n%% Using the filename means the hook can be used with different\n%% log files to separate timing data within the same test run.\n%% See Installing a CTH for more information.\nid(Opts) ->\n %% the path is relative to the test run directory\n proplists:get_value(filename, Opts, \"example_cth.log\").\n\n%% Always called before any other callback function. Use this to initiate\n%% any common state.\ninit(Id, _Opts) ->\n {ok, #state{filename = Id, total = 0, data = []}}.\n\n%% Called before init_per_suite is called.\npre_init_per_suite(_Suite,Config,State) ->\n {Config, State#state{suite_total = 0, tcs = []}}.\n\n%% Called after end_per_suite.\npost_end_per_suite(Suite,_Config,Return,State) ->\n Data = {suites, Suite, State#state.suite_total,\n lists:reverse(State#state.tcs)},\n {Return, State#state{data = [Data | State#state.data],\n total = State#state.total + State#state.suite_total}}.\n\n%% Called before each init_per_testcase.\npre_init_per_testcase(_Suite,_TC,Config,State) ->\n Now = erlang:monotonic_time(microsecond),\n {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}.\n\n%% Called after each end_per_testcase.\npost_end_per_testcase(Suite,TC,_Config,Return,State) ->\n Now = erlang:monotonic_time(microsecond),\n TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts},\n {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}.\n\n%% Called when a test case is skipped by either user action\n%% or due to an init function failing.\non_tc_skip(_Suite, _TC, _Reason, State) ->\n State#state{skipped = State#state.skipped + 1}.\n\n%% Called when the scope of the CTH is done.\nterminate(State) ->\n %% use append to avoid data loss if the path is reused\n {ok, File} = file:open(State#state.filename, [write, append]),\n io:format(File, \"~p.~n\", [results(State)]),\n file:close(File),\n ok.\n\nresults(State) ->\n #state{skipped = Skipped, data = Data, total = Total} = State,\n #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.\n```\n\n[](){: #builtin_cths }","ref":"ct_hooks_chapter.html#example-cth"},{"type":"extras","title":"Built-In CTHs - Common Test Hooks","doc":"`Common Test` is delivered with some general-purpose CTHs that can be enabled by\nthe user to provide generic testing functionality. Some of these CTHs are\nenabled by default when `common_test` is started to run. They can be disabled by\nsetting `enable_builtin_hooks` to `false` on the command line or in the test\nspecification. The following two CTHs are delivered with `Common Test`:\n\n- **`cth_log_redirect`** - Built-in\n\n Captures all log events that would normally be printed by the default logger\n handler, and prints them to the current test case log. If an event cannot be\n associated with a test case, it is printed in the `Common Test` framework log.\n This happens for test cases running in parallel and events occurring\n in-between test cases.\n\n The log events are handled using a [Logger](`m:logger`) handler called\n cth_log_redirect. The formatting and level is copied from the current\n `default` handler when the cth is started. If you want to use another level\n either change the `default` handler level before starting common_test, or use\n the `logger:set_handler_config/3` API.\n\n This hook supports the following options:\n\n - **`{mode, add}`** - Add `cth_log_redirect` to the default logging handler:\n Logs will be emitted to both standard output via the default handler, and\n into the Common Test HTML logs. This is the default behaviour.\n\n - **`{mode, replace}`** - Replace the `default` logging handler with\n `cth_log_redirect` instead of logging to both the default handler and this\n handler. This effectively silences any logger output which would normally be\n printed to standard output during test runs. To enable this mode, you can\n pass the following options to `ct_run`:\n\n `-enable_builtin_hooks false -ct_hooks cth_log_redirect [{mode,replace}]`\n\n- **`cth_surefire`** - Not built-in\n\n Captures all test results and outputs them as surefire XML into a file. The\n created file is by default called `junit_report.xml`. The file name can be\n changed by setting option `path` for this hook, for example:\n\n `-ct_hooks cth_surefire [{path,\"/tmp/report.xml\"}]`\n\n If option `url_base` is set, an extra attribute named `url` is added to each\n `testsuite` and `testcase` XML element. The value is constructed from\n `url_base` and a relative path to the test suite or test case log,\n respectively, for example:\n\n `-ct_hooks cth_surefire [{url_base, \"http://myserver.com/\"}]`\n\n gives an URL attribute value similar to\n\n `\"http://myserver.com/ct_run.ct@myhost.2012-12-12_11.19.39/ x86_64-unknown-linux-gnu.my_test.logs/run.2012-12-12_11.19.39/suite.log.html\"`\n\n Surefire XML can, for example, be used by Jenkins to display test results.","ref":"ct_hooks_chapter.html#built-in-cths"},{"type":"extras","title":"Some Thoughts about Testing","doc":"\n# Some Thoughts about Testing","ref":"why_test_chapter.html"},{"type":"extras","title":"Goals - Some Thoughts about Testing","doc":"It is not possible to prove that a program is correct by testing. On the\ncontrary, it has been formally proven that it is impossible to prove programs in\ngeneral by testing. Theoretical program proofs or plain examination of code can\nbe viable options for those wishing to certify that a program is correct. The\ntest server, as it is based on testing, cannot be used for certification. Its\nintended use is instead to (cost effectively) _find bugs_. A successful test\nsuite is one that reveals a bug. If a test suite results in OK, then we know\nvery little that we did not know before.","ref":"why_test_chapter.html#goals"},{"type":"extras","title":"What to Test - Some Thoughts about Testing","doc":"There are many kinds of test suites. Some concentrate on calling every function\nor command (in the documented way) in a certain interface. Some others do the\nsame, but use all kinds of illegal parameters, and verify that the server stays\nalive and rejects the requests with reasonable error codes. Some test suites\nsimulate an application (typically consisting of a few modules of an\napplication), some try to do tricky requests in general, and some test suites\neven test internal functions with help of special Load Modules on target.\n\nAnother interesting category of test suites is the one checking that fixed bugs\ndo not reoccur. When a bugfix is introduced, a test case that checks for that\nspecific bug is written and submitted to the affected test suites.\n\nAim for finding bugs. Write whatever test that has the highest probability of\nfinding a bug, now or in the future. Concentrate more on the critical parts.\nBugs in critical subsystems are much more expensive than others.\n\nAim for functionality testing rather than implementation details. Implementation\ndetails change quite often, and the test suites are to be long lived.\nImplementation details often differ on different platforms and versions. If\nimplementation details must be tested, try to factor them out into separate test\ncases. These test cases can later be rewritten or skipped.\n\nAlso, aim for testing everything once, no less, no more. It is not effective\nhaving every test case fail only because one function in the interface changed.","ref":"why_test_chapter.html#what-to-test"},{"type":"extras","title":"Common Test's Property Testing Support: ct_property_test","doc":"\n# Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html"},{"type":"extras","title":"General - Common Test's Property Testing Support: ct_property_test","doc":"The _Common Test Property Testing Support (ct_property_test)_ is an aid to run\nproperty based testing tools in Common Test test suites.\n\nBasic knowledge of property based testing is assumed in the following. It is\nalso assumed that at least one of the following property based testing tools is\ninstalled and available in the library path:\n\n- [QuickCheck](http://www.quviq.com),\n- [PropEr](https://proper-testing.github.io) or\n- [Triq](https://github.com/krestenkrab/triq)\n\n[](){: #supported }","ref":"ct_property_test_chapter.html#general"},{"type":"extras","title":"What Is Supported? - Common Test's Property Testing Support: ct_property_test","doc":"The [ct_property_test](`m:ct_property_test#`) module does the following:\n\n- Compiles the files with property tests in the subdirectory `property_test`\n- Tests properties in those files using the first found Property Testing Tool.\n- Saves the results - that is the printouts - in the usual Common Test Log","ref":"ct_property_test_chapter.html#what-is-supported"},{"type":"extras","title":"Introductory Example - Common Test's Property Testing Support: ct_property_test","doc":"Assume that we want to test the lists:sort/1 function.\n\nWe need a property to test the function. In normal way, we create\n`property_test/ct_prop.erl` module in the `test` directory in our application:\n\n```erlang\n-module(ct_prop).\n-export([prop_sort/0]).\n\n%%% This will include the .hrl file for the installed testing tool:\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n\n%%% The property we want to check:\n%%% For all possibly unsorted lists,\n%%% the result of lists:sort/1 is sorted.\nprop_sort() ->\n ?FORALL(UnSorted, list(),\n is_sorted(lists:sort(UnSorted))\n ).\n\n%%% Function to check that a list is sorted:\nis_sorted([]) ->\n true;\nis_sorted([_]) ->\n true;\nis_sorted([H1,H2|SortedTail]) when H1 = \n is_sorted([H2|SortedTail]);\nis_sorted(_) ->\n false.\n```\n\nWe also need a CommonTest test suite:\n\n```erlang\n-module(ct_property_test_SUITE).\n-compile(export_all). % Only in tests!\n\n-include_lib(\"common_test/include/ct.hrl\").\n\nall() -> [prop_sort\n ].\n\n%%% First prepare Config and compile the property tests for the found tool:\ninit_per_suite(Config) ->\n ct_property_test:init_per_suite(Config).\n\nend_per_suite(Config) ->\n Config.\n\n%%%================================================================\n%%% Test suites\n%%%\nprop_sort(Config) ->\n ct_property_test:quickcheck(\n ct_prop:prop_sort(),\n Config\n ).\n```\n\nWe run it as usual, for example with ct_run in the OS shell:\n\n```text\n..../test$ ct_run -suite ct_property_test_SUITE\n.....\nCommon Test: Running make in test directories...\n\nTEST INFO: 1 test(s), 1 case(s) in 1 suite(s)\n\nTesting lib.common_test.ct_property_test_SUITE: Starting test, 1 test cases\n\n----------------------------------------------------\n2019-12-18 10:44:46.293\nFound property tester proper\nat \"/home/X/lib/proper/ebin/proper.beam\"\n\n\n----------------------------------------------------\n2019-12-18 10:44:46.294\nCompiling in \"/home/..../test/property_test\"\n Deleted: [\"ct_prop.beam\"]\n ErlFiles: [\"ct_prop.erl\"]\n MacroDefs: [{d,'PROPER'}]\n\nTesting lib.common_test.ct_property_test_SUITE: TEST COMPLETE, 1 ok, 0 failed of 1 test cases\n\n....\n```\n\n[](){: #stateful1 }","ref":"ct_property_test_chapter.html#introductory-example"},{"type":"extras","title":"A stateful testing example - Common Test's Property Testing Support: ct_property_test","doc":"Assume a test that generates some parallel stateful commands, and runs 300\ntests:\n\n```erlang\nprop_parallel(Config) ->\n numtests(300,\n ?FORALL(Cmds, parallel_commands(?MODULE),\n begin\n RunResult = run_parallel_commands(?MODULE, Cmds),\n ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)\n end)).\n```\n\nThe `ct_property_test:present_result/4` is a help function for printing some\nstatistics in the CommonTest log file.\n\nOur example test could for example be a simple test of an ftp server, where we\nperform get, put and delete requests, some of them in parallel. Per default, the\nresult has three sections:\n\n```text\n*** User 2019-12-11 13:28:17.504 ***\n\nDistribution sequential/parallel\n\n 57.7% sequential\n 28.0% parallel_2\n 14.3% parallel_1\n\n\n\n*** User 2019-12-11 13:28:17.505 ***\n\nFunction calls\n\n 44.4% get\n 39.3% put\n 16.3% delete\n\n\n\n*** User 2019-12-11 13:28:17.505 ***\n\nLength of command sequences\n\nRange : Number in range\n-------:----------------\n 0 - 4: 8 2.7% <-- min=3\n 5 - 9: 44 14.7%\n10 - 14: 74 24.7%\n15 - 19: 60 20.0% <-- mean=18.7 <-- median=16.0\n20 - 24: 38 12.7%\n25 - 29: 26 8.7%\n30 - 34: 19 6.3%\n35 - 39: 19 6.3%\n40 - 44: 8 2.7%\n45 - 49: 4 1.3% <-- max=47\n ------\n 300\n```\n\nThe first part - _Distribution sequential/parallel_ \\- shows the distribution in\nthe sequential and parallel part of the result of parallel_commands/1. See any\nproperty testing tool for an explanation of this function. The table shows that\nof all commands (get and put in our case), 57.7% are executed in the sequential\npart prior to the parallel part, 28.0% are executed in the first parallel list\nand the rest in the second parallel list.\n\nThe second part - _Function calls_ \\- shows the distribution of the three calls\nin the generated command lists. We see that all of the three calls are executed.\nIf it was so that we thought that we also generated a fourth call, a table like\nthis shows that we failed with that.\n\nThe third and final part - _Length of command sequences_ \\- show statistics of\nthe generated command sequences. We see that the shortest list has three\nelementes while the longest has 47 elements. The mean and median values are also\nshown. Further we could for example see that only 2.7% of the lists (that is\neight lists) only has three or four elements.","ref":"ct_property_test_chapter.html#a-stateful-testing-example"},{"type":"extras","title":"ct_run","doc":"\n# ct_run\n\nProgram used for starting Common Test from the OS command line.","ref":"ct_run_cmd.html"},{"type":"extras","title":"Description - ct_run","doc":"The `ct_run` program is automatically installed with Erlang/OTP and the\n`Common Test` application (for more information, see section\n[Installation](install_chapter.md) in the User's Guide). The program accepts\ndifferent start flags. Some flags trigger `ct_run` to start `Common Test` and\npass on data to it. Some flags start an Erlang node prepared for running\n`Common Test` in a particular mode.\n\nThe interface function `ct:run_test/1`, corresponding to the `ct_run` program,\nis used for starting `Common Test` from the Erlang shell (or an Erlang program).\nFor details, see the `m:ct` manual page.\n\n`ct_run` also accepts Erlang emulator flags. These are used when `ct_run` calls\n`erl` to start the Erlang node (this makes it possible to add directories to the\ncode server path, change the cookie on the node, start more applications, and so\non).\n\nWith the optional flag `-erl_args`, options on the `ct_run` command line can be\ndivided into two groups:\n\n- One group that `Common Test` is to process (those preceding `-erl_args`).\n- One group that `Common Test` is to ignore and pass on directly to the emulator\n (those following `-erl_args`).\n\nOptions preceding `-erl_args` that `Common Test` does not recognize are also\npassed on to the emulator untouched. By `-erl_args` the user can specify flags\nwith the same name, but with different destinations, on the `ct_run` command\nline.\n\nIf flags `-pa` or `-pz` are specified in the `Common Test` group of options\n(preceding `-erl_args`), relative directories are converted to absolute and\nreinserted into the code path by `Common Test`. This is to avoid problems\nloading user modules when `Common Test` changes working directory during test\nruns. However, `Common Test` ignores flags `-pa` and `-pz` following `-erl_args`\non the command line. These directories are added to the code path normally (that\nis, on specified form).\n\nExit status is set before the program ends. Value `0` indicates a successful\ntest result, `1` indicates one or more failed or auto-skipped test cases, and\n`2` indicates test execution failure.\n\nIf `ct_run` is called with option `-help`, it prints all valid start flags to\n`stdout`.\n\n[](){: #ct_run }","ref":"ct_run_cmd.html#description"},{"type":"extras","title":"Run Tests from Command Line - ct_run","doc":"```text\n ct_run -dir TestDir1 TestDir2 .. TestDirN |\n [-dir TestDir] -suite Suite1 Suite2 .. SuiteN\n [-group Groups1 Groups2 .. GroupsN] [-case Case1 Case2 .. CaseN]\n [-step [config | keep_inactive]]\n [-config ConfigFile1 ConfigFile2 .. ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n [-label Label]\n [-logdir LogDir]\n [-logopts LogOpts]\n [-verbosity GenVLevel | [Category1 VLevel1 and\n Category2 VLevel2 and .. CategoryN VLevelN]]\n [-silent_connections [ConnType1 ConnType2 .. ConnTypeN]]\n [-stylesheet CSSFile]\n [-cover CoverCfgFile]\n [-cover_stop Bool]\n [-event_handler EvHandler1 EvHandler2 .. EvHandlerN] |\n [-event_handler_init EvHandler1 InitArg1 and\n EvHandler2 InitArg2 and .. EvHandlerN InitArgN]\n [-include InclDir1 InclDir2 .. InclDirN]\n [-no_auto_compile]\n [-abort_if_missing_suites]\n [-multiply_timetraps Multiplier]\n [-scale_timetraps]\n [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]\n [-repeat N] |\n [-duration HHMMSS [-force_stop [skip_rest]]] |\n [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]\n [-basic_html]\n [-no_esc_chars]\n [-keep_logs all | NLogs]\n [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and ..\n CTHModuleN CTHOptsN]\n [-ct_hooks_order test | config]\n [-exit_status ignore_config]\n [-help]\n```","ref":"ct_run_cmd.html#run-tests-from-command-line"},{"type":"extras","title":"Run Tests using Test Specification - ct_run","doc":"```text\n ct_run -spec TestSpec1 TestSpec2 .. TestSpecN\n [-join_specs]\n [-config ConfigFile1 ConfigFile2 .. ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. and CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n [-label Label]\n [-logdir LogDir]\n [-logopts LogOpts]\n [-verbosity GenVLevel | [Category1 VLevel1 and\n Category2 VLevel2 and .. CategoryN VLevelN]]\n [-allow_user_terms]\n [-silent_connections [ConnType1 ConnType2 .. ConnTypeN]]\n [-stylesheet CSSFile]\n [-cover CoverCfgFile]\n [-cover_stop Bool]\n [-event_handler EvHandler1 EvHandler2 .. EvHandlerN] |\n [-event_handler_init EvHandler1 InitArg1 and\n EvHandler2 InitArg2 and .. EvHandlerN InitArgN]\n [-include InclDir1 InclDir2 .. InclDirN]\n [-no_auto_compile]\n [-abort_if_missing_suites]\n [-multiply_timetraps Multiplier]\n [-scale_timetraps]\n [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]\n [-repeat N] |\n [-duration HHMMSS [-force_stop [skip_rest]]] |\n [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]\n [-basic_html]\n [-no_esc_chars]\n [-keep_logs all | NLogs]\n [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and ..\n CTHModuleN CTHOptsN]\n [-ct_hooks_order test | config]\n [-exit_status ignore_config]\n```","ref":"ct_run_cmd.html#run-tests-using-test-specification"},{"type":"extras","title":"Refresh HTML Index Files - ct_run","doc":"```text\n ct_run -refresh_logs [-logdir LogDir] [-basic_html]\n [-keep_logs all | NLogs]\n```","ref":"ct_run_cmd.html#refresh-html-index-files"},{"type":"extras","title":"Run Common Test in Interactive Mode - ct_run","doc":"```erlang\n ct_run -shell\n [-config ConfigFile1 ConfigFile2 ... ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. and CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n```","ref":"ct_run_cmd.html#run-common-test-in-interactive-mode"},{"type":"extras","title":"Start a Common Test Master Node - ct_run","doc":"```text\n ct_run -ctmaster\n```","ref":"ct_run_cmd.html#start-a-common-test-master-node"},{"type":"extras","title":"See Also - ct_run","doc":"For information about the start flags, see section\n[Running Tests and Analyzing Results](run_test_chapter.md) in the User's Guide.","ref":"ct_run_cmd.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-5DA668F7.js b/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-5DA668F7.js new file mode 100644 index 0000000000000..19ee9f11cb09d --- /dev/null +++ b/prs/8803/lib/common_test-1.27/doc/html/dist/search_data-5DA668F7.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","doc":"Main user interface for the `Common Test` framework.\n\nThis module implements the command-line interface for running tests and basic\nfunctions for `Common Test` case issues, such as configuration and logging.\n\nThe framework stores configuration values in a property list usually named\n`Config`. The list contains information about the test run added by the\nframework itself and may also contain user-provided values. The configuration is\npassed into individual test cases as well as support functions if defined.\n\nPossible configuration variables include:\n\n- `data_dir` \\- Data file directory\n- `priv_dir` \\- Scratch file directory\n- Whatever added by [`init_per_suite/1`](`c:ct_suite:init_per_suite/1`) or\n [`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) in the test suite.\n\n> #### Warning {: .warning }\n>\n> The `?config` macro, used to receive individual config values from the\n> `Config` property list, is deprecated. Please use `proplists:get_value/2-3`\n> instead.","title":"ct","ref":"ct.html"},{"type":"function","doc":"Aborts the currently executing test case. The user must know with certainty\nwhich test case is currently executing. The function is therefore only safe to\ncall from a function that has been called (or synchronously invoked) by the test\ncase.\n\n`Reason`, the reason for aborting the test case, is printed in the test case\nlog.","title":"ct.abort_current_testcase/1","ref":"ct.html#abort_current_testcase/1"},{"type":"function","doc":"Loads configuration variables using the specified callback module and\nconfiguration string. The callback module is to be either loaded or present in\nthe code path. Loaded configuration variables can later be removed using\nfunction [`ct:remove_config/2`](`remove_config/2`).","title":"ct.add_config/2","ref":"ct.html#add_config/2"},{"type":"function","doc":"Cancels any active timetrap and pauses the execution of the current test case\nuntil the user calls function `continue/0`. The user can then interact with the\nErlang node running the tests, for example, for debugging purposes or for\nmanually executing a part of the test case. If a parallel group is executing,\n[`ct:break/2`](`break/2`) is to be called instead.\n\nA cancelled timetrap is not automatically reactivated after the break, but must\nbe started explicitly with [`ct:timetrap/1`](`timetrap/1`).\n\nIn order for the break/continue functionality to work, `Common Test` must\nrelease the shell process controlling `stdin`. This is done by setting start\noption `release_shell` to `true`. For details, see section\n[Running Tests from the Erlang Shell or from an Erlang Program](run_test_chapter.md#erlang_shell_or_program)\nin the User's Guide.","title":"ct.break/1","ref":"ct.html#break/1"},{"type":"function","doc":"Works the same way as [`ct:break/1`](`break/1`), only argument `TestCase` makes\nit possible to pause a test case executing in a parallel group. Function\n[`ct:continue/1`](`continue/1`) is to be used to resume execution of `TestCase`.\n\nFor details, see [`ct:break/1`](`break/1`).","title":"ct.break/2","ref":"ct.html#break/2"},{"type":"function","doc":"","title":"ct.capture_get/0","ref":"ct.html#capture_get/0"},{"type":"function","doc":"Returns and purges the list of text strings buffered during the latest session\nof capturing printouts to `stdout`. Log categories that are to be ignored in\n`ListOfStrings` can be specified with `ExclCategories`. If\n`ExclCategories = []`, no filtering takes place.\n\nSee also [`ct:capture_start/0`](`capture_start/0`),\n[`ct:capture_stop/0`](`capture_stop/0`), [`ct:log/3`](`log/3`).","title":"ct.capture_get/1","ref":"ct.html#capture_get/1"},{"type":"function","doc":"Starts capturing all text strings printed to `stdout` during execution of the\ntest case.\n\nSee also [`ct:capture_get/1`](`capture_get/1`),\n[`ct:capture_stop/0`](`capture_stop/0`).","title":"ct.capture_start/0","ref":"ct.html#capture_start/0"},{"type":"function","doc":"Stops capturing text strings (a session started with `capture_start/0`).\n\nSee also [`ct:capture_get/1`](`capture_get/1`),\n[`ct:capture_start/0`](`capture_start/0`).","title":"ct.capture_stop/0","ref":"ct.html#capture_stop/0"},{"type":"function","doc":"Prints the specified `Comment` in the comment field in the table on the test\nsuite result page.\n\nIf called several times, only the last comment is printed. The test case return\nvalue `{comment,Comment}` overwrites the string set by this function.","title":"ct.comment/1","ref":"ct.html#comment/1"},{"type":"function","doc":"Prints the formatted string in the comment field in the table on the test suite\nresult page.\n\nArguments `Format` and `Args` are used in a call to `io_lib:format/2` to create\nthe comment string. The behavior of [`comment/2`](`comment/2`) is otherwise the\nsame as function [`ct:comment/1`](`comment/1`).","title":"ct.comment/2","ref":"ct.html#comment/2"},{"type":"function","doc":"This function must be called to continue after a test case (not executing in a\nparallel group) has called function [`ct:break/1`](`break/1`).","title":"ct.continue/0","ref":"ct.html#continue/0"},{"type":"function","doc":"This function must be called to continue after a test case has called\n[`ct:break/2`](`break/2`). If the paused test case, `TestCase`, executes in a\nparallel group, this function, rather than `continue/0`, must be used to let the\ntest case proceed.","title":"ct.continue/1","ref":"ct.html#continue/1"},{"type":"function","doc":"Decrypts `EncryptFileName`, previously generated with\n[`ct:encrypt_config_file/2,3`](`encrypt_config_file/2`). The original file\ncontents is saved in the target file. The encryption key, a string, must be\navailable in a text file named `.ct_config.crypt`, either in the current\ndirectory, or the home directory of the user (it is searched for in that order).","title":"ct.decrypt_config_file/2","ref":"ct.html#decrypt_config_file/2"},{"type":"function","doc":"Decrypts `EncryptFileName`, previously generated with\n[`ct:encrypt_config_file/2,3`](`encrypt_config_file/2`). The original file\ncontents is saved in the target file. The key must have the same value as that\nused for encryption.","title":"ct.decrypt_config_file/3","ref":"ct.html#decrypt_config_file/3"},{"type":"function","doc":"Encrypts the source configuration file with DES3 and saves the result in file\n`EncryptFileName`. The key, a string, must be available in a text file named\n`.ct_config.crypt`, either in the current directory, or the home directory of\nthe user (it is searched for in that order).\n\nFor information about using encrypted configuration files when running tests,\nsee section\n[Encrypted Configuration Files](config_file_chapter.md#encrypted_config_files)\nin the User's Guide.\n\nFor details on DES3 encryption/decryption, see application\n[`Crypto`](`e:crypto:index.html`).","title":"ct.encrypt_config_file/2","ref":"ct.html#encrypt_config_file/2"},{"type":"function","doc":"Encrypts the source configuration file with DES3 and saves the result in the\ntarget file `EncryptFileName`. The encryption key to use is either the value in\n`{key,Key}` or the value stored in the file specified by `{file,File}`.\n\nFor information about using encrypted configuration files when running tests,\nsee section\n[Encrypted Configuration Files](config_file_chapter.md#encrypted_config_files)\nin the User's Guide.\n\nFor details on DES3 encryption/decryption, see application\n[`Crypto`](`e:crypto:index.html`).","title":"ct.encrypt_config_file/3","ref":"ct.html#encrypt_config_file/3"},{"type":"function","doc":"Terminates a test case with the specified error `Reason`.","title":"ct.fail/1","ref":"ct.html#fail/1"},{"type":"function","doc":"Terminates a test case with an error message specified by a format string and a\nlist of values (used as arguments to `io_lib:format/2`).","title":"ct.fail/2","ref":"ct.html#fail/2"},{"type":"function","doc":"","title":"ct.get_config/1","ref":"ct.html#get_config/1"},{"type":"function","doc":"","title":"ct.get_config/2","ref":"ct.html#get_config/2"},{"type":"function","doc":"Reads configuration data values.\n\nReturns the matching values or configuration elements, given a configuration\nvariable key or its associated name (if one has been specified with\n[`ct:require/2`](`require/2`) or a `require` statement).\n\n_Example:_\n\nGiven the following configuration file:\n\n```erlang\n{unix,[{telnet,IpAddr},\n {user,[{username,Username},\n {password,Password}]}]}.\n```\n\nThen:\n\n```erlang\nct:get_config(unix,Default) -> [{telnet,IpAddr},\n {user, [{username,Username}, {password,Password}]}]\nct:get_config({unix,telnet},Default) -> IpAddr\nct:get_config({unix,user,username},Default) -> Username\nct:get_config({unix,ftp},Default) -> Default\nct:get_config(unknownkey,Default) -> Default\n```\n\nIf a configuration variable key has been associated with a name (by\n[`ct:require/2`](`require/2`) or a `require` statement), the name can be used\ninstead of the key to read the value:\n\n```erlang\nct:require(myuser,{unix,user}) -> ok.\nct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]\n```\n\nIf a configuration variable is defined in multiple files, use option `all` to\naccess all possible values. The values are returned in a list. The order of the\nelements corresponds to the order that the configuration files were specified at\nstartup.\n\nIf configuration elements (key-value tuples) are to be returned as result\ninstead of values, use option `element`. The returned elements are then on the\nform `{Required,Value}`.\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:require/1`](`require/1`),\n[`ct:require/2`](`require/2`).","title":"ct.get_config/3","ref":"ct.html#get_config/3"},{"type":"function","doc":"Gets a reference to the `Common Test` event manager. The reference can be used\nto, for example, add a user-specific event handler while tests are running.\n\n_Example:_\n\n```erlang\ngen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])\n```","title":"ct.get_event_mgr_ref/0","ref":"ct.html#get_event_mgr_ref/0"},{"type":"function","doc":"Returns the command used to start this Erlang instance. If this information\ncould not be found, the string `\"no_prog_name\"` is returned.","title":"ct.get_progname/0","ref":"ct.html#get_progname/0"},{"type":"function","doc":"Returns status of ongoing test. The returned list contains information about\nwhich test case is executing (a list of cases when a parallel test case group is\nexecuting), as well as counters for successful, failed, skipped, and total test\ncases so far.","title":"ct.get_status/0","ref":"ct.html#get_status/0"},{"type":"function","doc":"Returns the name of the target that the specified connection belongs to.","title":"ct.get_target_name/1","ref":"ct.html#get_target_name/1"},{"type":"function","doc":"Gets a list of all test specification terms used to configure and run this test.","title":"ct.get_testspec_terms/0","ref":"ct.html#get_testspec_terms/0"},{"type":"function","doc":"Reads one or more terms from the test specification used to configure and run\nthis test. `Tag` is any valid test specification tag, for example, `label`,\n`config`, or `logdir`. User-specific terms are also available to read if option\n`allow_user_terms` is set.\n\nAll value tuples returned, except user terms, have the node name as first\nelement.\n\nTo read test terms, use `Tag = tests` (rather than `suites`, `groups`, or\n`cases`). `Value` is then the list of _all_ tests on the form\n`[{Node,Dir,[{TestSpec,GroupsAndCases1},...]},...]`, where\n`GroupsAndCases = [{Group,[Case]}] | [Case]`.","title":"ct.get_testspec_terms/1","ref":"ct.html#get_testspec_terms/1"},{"type":"function","doc":"Reads information about the timetrap set for the current test case. `Scaling`\nindicates if `Common Test` will attempt to compensate timetraps automatically\nfor runtime delays introduced by, for example, tools like cover. `ScaleVal` is\nthe value of the current scaling multiplier (always 1 if scaling is disabled).\nNote the `Time` is not the scaled result.","title":"ct.get_timetrap_info/0","ref":"ct.html#get_timetrap_info/0"},{"type":"function","doc":"This function returns the verbosity level for the specified logging category.\nSee the [User's Guide](write_test_chapter.md#logging) for details. Use the value\n`default` to read the general verbosity level.","title":"ct.get_verbosity/1","ref":"ct.html#get_verbosity/1"},{"type":"function","doc":"Installs configuration files and event handlers.\n\nRun this function once before the first test.\n\n_Example:_\n\n```erlang\ninstall([{config,[\"config_node.ctc\",\"config_user.ctc\"]}])\n```\n\nThis function is automatically run by program `ct_run`.","title":"ct.install/1","ref":"ct.html#install/1"},{"type":"function","doc":"Performs command `listenv` on the specified Telnet connection and returns the\nresult as a list of key-value pairs.","title":"ct.listenv/1","ref":"ct.html#listenv/1"},{"type":"function","doc":"Equivalent to [`log(default, ?STD_IMPORTANCE, Format, [], [])`](`log/5`).","title":"ct.log/1","ref":"ct.html#log/1"},{"type":"function","doc":"","title":"ct.log/2","ref":"ct.html#log/2"},{"type":"function","doc":"","title":"ct.log/3","ref":"ct.html#log/3"},{"type":"function","doc":"","title":"ct.log/4","ref":"ct.html#log/4"},{"type":"function","doc":"Prints from a test case to the log file.\n\nThis function is meant for printing a string directly from a test case to the\ntest case log file.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category`, `Importance` and the `no_css` option, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.\n\nCommon Test will not escape special HTML characters (<, > and &) in the text\nprinted with this function, unless the `esc_chars` option is used.","title":"ct.log/5","ref":"ct.html#log/5"},{"type":"function","doc":"If the test is started with option `create_priv_dir` set to `manual_per_tc`, in\norder for the test case to use the private directory, it must first create it by\ncalling this function.","title":"ct.make_priv_dir/0","ref":"ct.html#make_priv_dir/0"},{"type":"function","doc":"Sends an asynchronous notification of type `Name` with `Data`to the Common Test\nevent manager. This can later be caught by any installed event manager.\n\nSee also `m:gen_event`.","title":"ct.notify/2","ref":"ct.html#notify/2"},{"type":"function","doc":"Equivalent to [`pal(default, ?STD_IMPORTANCE, Format, [])`](`pal/4`).","title":"ct.pal/1","ref":"ct.html#pal/1"},{"type":"function","doc":"","title":"ct.pal/2","ref":"ct.html#pal/2"},{"type":"function","doc":"","title":"ct.pal/3","ref":"ct.html#pal/3"},{"type":"function","doc":"","title":"ct.pal/4","ref":"ct.html#pal/4"},{"type":"function","doc":"Prints and logs from a test case.\n\nThis function is meant for printing a string from a test case, both to the test\ncase log file and to the console.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category` and `Importance`, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.\n\nNote that special characters in the text (<, > and &) will be escaped by Common\nTest before the text is printed to the log file.","title":"ct.pal/5","ref":"ct.html#pal/5"},{"type":"function","doc":"Parses the printout from an SQL table and returns a list of tuples.\n\nThe printout to parse is typically the result of a `select` command in SQL. The\nreturned `Table` is a list of tuples, where each tuple is a row in the table.\n\n`Heading` is a tuple of strings representing the headings of each column in the\ntable.","title":"ct.parse_table/1","ref":"ct.html#parse_table/1"},{"type":"function","doc":"Equivalent to [`print(default, ?STD_IMPORTANCE, Format, [], [])`](`print/5`).","title":"ct.print/1","ref":"ct.html#print/1"},{"type":"function","doc":"","title":"ct.print/2","ref":"ct.html#print/2"},{"type":"function","doc":"","title":"ct.print/3","ref":"ct.html#print/3"},{"type":"function","doc":"","title":"ct.print/4","ref":"ct.html#print/4"},{"type":"function","doc":"Prints from a test case to the console.\n\nThis function is meant for printing a string from a test case to the console.\n\nDefault `Category` is `default`, default `Importance` is `?STD_IMPORTANCE`, and\ndefault value for `FormatArgs` is `[]`.\n\nFor details on `Category` and `Importance`, see section\n[Logging - Categories and Verbosity Levels](write_test_chapter.md#logging) in\nthe User's Guide.","title":"ct.print/5","ref":"ct.html#print/5"},{"type":"function","doc":"Reloads configuration file containing specified configuration key.\n\nThis function updates the configuration data from which the specified\nconfiguration variable was read, and returns the (possibly) new value of this\nvariable.\n\nIf some variables were present in the configuration, but are not loaded using\nthis function, they are removed from the configuration table together with their\naliases.","title":"ct.reload_config/1","ref":"ct.html#reload_config/1"},{"type":"function","doc":"This function will return the identity of test- and group leader processes that\nare still running at the time of this call. `TestProcs` are processes in the\nsystem that have a Common Test IO process as group leader. `SharedGL` is the\ncentral Common Test IO process, responsible for printing to log files for\nconfiguration functions and sequentially executing test cases. `OtherGLs` are\nCommon Test IO processes that print to log files for test cases in parallel test\ncase groups.\n\nThe process information returned by this function may be used to locate and\nterminate remaining processes after tests have finished executing. The function\nwould typically by called from Common Test Hook functions.\n\nNote that processes that execute configuration functions or test cases are never\nincluded in `TestProcs`. It is therefore safe to use post configuration hook\nfunctions (such as post_end_per_suite, post_end_per_group,\npost_end_per_testcase) to terminate all processes in `TestProcs` that have the\ncurrent group leader process as its group leader.\n\nNote also that the shared group leader (`SharedGL`) must never be terminated by\nthe user, only by Common Test. Group leader processes for parallel test case\ngroups (`OtherGLs`) may however be terminated in post_end_per_group hook\nfunctions.","title":"ct.remaining_test_procs/0","ref":"ct.html#remaining_test_procs/0"},{"type":"function","doc":"Removes configuration variables (together with their aliases) that were loaded\nwith specified callback module and configuration string.","title":"ct.remove_config/2","ref":"ct.html#remove_config/2"},{"type":"function","doc":"Checks if the required configuration is available. Arbitrarily deep tuples can\nbe specified as `Required`. Only the last element of the tuple can be a list of\n`SubKey`s.\n\n_Example 1._ Require the variable `myvar`:\n\n```erlang\nok = ct:require(myvar).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,Value}.\n```\n\n_Example 2._ Require key `myvar` with subkeys `sub1` and `sub2`:\n\n```erlang\nok = ct:require({myvar,[sub1,sub2]}).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,[{sub1,Value},{sub2,Value}]}.\n```\n\n_Example 3._ Require key `myvar` with subkey `sub1` with `subsub1`:\n\n```erlang\nok = ct:require({myvar,sub1,sub2}).\n```\n\nIn this case the configuration file must at least contain:\n\n```erlang\n{myvar,[{sub1,[{sub2,Value}]}]}.\n```\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:get_config/3`](`get_config/3`),\n[`ct:require/2`](`require/2`).","title":"ct.require/1","ref":"ct.html#require/1"},{"type":"function","doc":"Checks if the required configuration is available and gives it a name. The\nsemantics for `Required` is the same as in [`ct:require/1`](`require/1`) except\nthat a list of `SubKey`s cannot be specified.\n\nIf the requested data is available, the subentry is associated with `Name` so\nthat the value of the element can be read with\n[`ct:get_config/1,2`](`get_config/1`) provided `Name` is used instead of the\nwhole `Required` term.\n\n_Example:_\n\nRequire one node with a Telnet connection and an FTP connection. Name the node\n`a`:\n\n```erlang\nok = ct:require(a,{machine,node}).\n```\n\nAll references to this node can then use the node name. For example, a file over\nFTP is fetched like follows:\n\n```erlang\nok = ct:ftp_get(a,RemoteFile,LocalFile).\n```\n\nFor this to work, the configuration file must at least contain:\n\n```erlang\n{machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.\n```\n\n> #### Note {: .info }\n>\n> The behavior of this function changed radically in `Common Test` 1\\.6.2. To\n> keep some backwards compatibility, it is still possible to do:\n> `ct:require(a,{node,[telnet,ftp]}).` This associates the name `a` with the\n> top-level `node` entry. For this to work, the configuration file must at least\n> contain: `{node,[{telnet,IpAddr},{ftp,IpAddr}]}.`\n\nSee also [`ct:get_config/1`](`get_config/1`),\n[`ct:get_config/2`](`get_config/2`), [`ct:get_config/3`](`get_config/3`),\n[`ct:require/1`](`require/1`).","title":"ct.require/2","ref":"ct.html#require/2"},{"type":"function","doc":"Runs all test cases in all suites in the specified directories.\n\nSee also [`ct:run/3`](`run/3`).","title":"ct.run/1","ref":"ct.html#run/1"},{"type":"function","doc":"Runs all test cases in the specified suite.\n\nSee also [`ct:run/3`](`run/3`).","title":"ct.run/2","ref":"ct.html#run/2"},{"type":"function","doc":"Runs the specified test cases.\n\nRequires that [`ct:install/1`](`install/1`) has been run first.\n\nSuites (`*_SUITE.erl`) files must be stored in `TestDir` or `TestDir/test`. All\nsuites are compiled when the test is run.","title":"ct.run/3","ref":"ct.html#run/3"},{"type":"function","doc":"Runs tests as specified by the combination of options in `Opts`. The options are\nthe same as those used with program `ct_run`, see\n[Run Tests from Command Line](ct_run_cmd.md#ct_run) in the `ct_run` manual page.\n\nHere a `TestDir` can be used to point out the path to a `Suite`. Option\n`testcase` corresponds to option `-case` in program `ct_run`. Configuration\nfiles specified in `Opts` are installed automatically at startup.\n\n`TestRunnerPid` is returned if `release_shell == true`. For details, see\n[`ct:break/1`](`break/1`).\n\n`Reason` indicates the type of error encountered.","title":"ct.run_test/1","ref":"ct.html#run_test/1"},{"type":"function","doc":"Runs a test specified by `TestSpec`. The same terms are used as in test\nspecification files.\n\n`Reason` indicates the type of error encountered.","title":"ct.run_testspec/1","ref":"ct.html#run_testspec/1"},{"type":"function","doc":"Use this function to set, or modify, the verbosity level for a logging category.\nSee the [User's Guide](write_test_chapter.md#logging) for details. Use the value\n`default` to set the general verbosity level.","title":"ct.set_verbosity/2","ref":"ct.html#set_verbosity/2"},{"type":"function","doc":"This function, similar to `timer:sleep/1` in STDLIB, suspends the test case for\na specified time. However, this function also multiplies `Time` with the\n`multiply_timetraps` value (if set) and under certain circumstances also scales\nup the time automatically if `scale_timetraps` is set to `true` (default is\n`false`).","title":"ct.sleep/1","ref":"ct.html#sleep/1"},{"type":"function","doc":"Starts `Common Test` in interactive mode.\n\nFrom this mode, all test case support functions can be executed directly from\nthe Erlang shell. The interactive mode can also be started from the OS command\nline with `ct_run -shell [-config File...]`.\n\nIf any functions (for example, Telnet or FTP) using \"required configuration\ndata\" are to be called from the Erlang shell, configuration data must first be\nrequired with [`ct:require/2`](`require/2`).\n\n_Example:_\n\n```erlang\n> ct:require(unix_telnet, unix).\nok\n> ct_telnet:open(unix_telnet).\n{ok,<0.105.0>}\n> ct_telnet:cmd(unix_telnet, \"ls .\").\n{ok,[\"ls\",\"file1 ...\",...]}\n```","title":"ct.start_interactive/0","ref":"ct.html#start_interactive/0"},{"type":"function","doc":"Steps through a test case with the debugger.\n\nSee also [`ct:run/3`](`run/3`).","title":"ct.step/3","ref":"ct.html#step/3"},{"type":"function","doc":"Steps through a test case with the debugger. If option `config` has been\nspecified, breakpoints are also set on the configuration functions in `Suite`.\n\nSee also [`ct:run/3`](`run/3`).","title":"ct.step/4","ref":"ct.html#step/4"},{"type":"function","doc":"Exits the interactive mode.\n\nSee also [`ct:start_interactive/0`](`start_interactive/0`).","title":"ct.stop_interactive/0","ref":"ct.html#stop_interactive/0"},{"type":"function","doc":"Sends a synchronous notification of type `Name` with `Data` to the `Common Test`\nevent manager. This can later be caught by any installed event manager.\n\nSee also `m:gen_event`.","title":"ct.sync_notify/2","ref":"ct.html#sync_notify/2"},{"type":"function","doc":"Returns all test cases in the specified suite.","title":"ct.testcases/2","ref":"ct.html#testcases/2"},{"type":"function","doc":"Sets a new timetrap for the running test case.\n\nIf the argument is `Func`, the timetrap is triggered when this function returns.\n`Func` can also return a new `Time` value, which in that case is the value for\nthe new timetrap.","title":"ct.timetrap/1","ref":"ct.html#timetrap/1"},{"type":"function","doc":"Returns any data specified with tag `userdata` in the list of tuples returned\nfrom [`suite/0`](`c:ct_suite:suite/0`).","title":"ct.userdata/2","ref":"ct.html#userdata/2"},{"type":"function","doc":"Returns any data specified with tag `userdata` in the list of tuples returned\nfrom `Suite:group(GroupName)` or `Suite:Case()`.","title":"ct.userdata/3","ref":"ct.html#userdata/3"},{"type":"type","doc":"A configuration key which exists in a configuration file","title":"ct.config_key/0","ref":"ct.html#t:config_key/0"},{"type":"type","doc":"","title":"ct.conn_log_mod/0","ref":"ct.html#t:conn_log_mod/0"},{"type":"type","doc":"","title":"ct.conn_log_option/0","ref":"ct.html#t:conn_log_option/0"},{"type":"type","doc":"Options that can be given to the `cth_conn_log` hook, which is used for logging\nof NETCONF and Telnet connections. See [ct_netconfc](`m:ct_netconfc#Logging`) or\n[ct_telnet](`m:ct_telnet#module-logging`) for description and examples of how to use\nthis hook.","title":"ct.conn_log_options/0","ref":"ct.html#t:conn_log_options/0"},{"type":"type","doc":"","title":"ct.conn_log_type/0","ref":"ct.html#t:conn_log_type/0"},{"type":"type","doc":"The identity (handle) of a connection.","title":"ct.handle/0","ref":"ct.html#t:handle/0"},{"type":"type","doc":"","title":"ct.key_or_name/0","ref":"ct.html#t:key_or_name/0"},{"type":"type","doc":"A name and association to configuration data introduced through a require\nstatement, or a call to [`ct:require/2`](`require/2`), for example,\n`ct:require(mynodename,{node,[telnet]})`.","title":"ct.target_name/0","ref":"ct.html#t:target_name/0"},{"type":"module","doc":"`Common Test` framework code coverage support module.\n\nThis module exports help functions for performing code coverage analysis.","title":"ct_cover","ref":"ct_cover.html"},{"type":"function","doc":"Adds nodes to current cover test. Notice that this only works if cover support\nis active.\n\nTo have effect, this function is to be called from `init_per_suite/1` (see\n`m:ct_suite`) before any tests are performed.","title":"ct_cover.add_nodes/1","ref":"ct_cover.html#add_nodes/1"},{"type":"function","doc":"Accumulates cover results over multiple tests. See section\n[Cross Cover Analysis](cover_chapter.md#cross_cover) in the User's Guide.","title":"ct_cover.cross_cover_analyse/2","ref":"ct_cover.html#cross_cover_analyse/2"},{"type":"function","doc":"Removes nodes from the current cover test.\n\nCall this function to stop cover test on nodes previously added with\n[`ct_cover:add_nodes/1`](`add_nodes/1`). Results on the remote node are\ntransferred to the `Common Test` node.","title":"ct_cover.remove_nodes/1","ref":"ct_cover.html#remove_nodes/1"},{"type":"module","doc":"FTP client module (based on the `ftp` application).","title":"ct_ftp","ref":"ct_ftp.html"},{"type":"function","doc":"Changes directory on remote host.","title":"ct_ftp.cd/2","ref":"ct_ftp.html#cd/2"},{"type":"function","doc":"Closes the FTP connection.","title":"ct_ftp.close/1","ref":"ct_ftp.html#close/1"},{"type":"function","doc":"Deletes a file on remote host.","title":"ct_ftp.delete/2","ref":"ct_ftp.html#delete/2"},{"type":"function","doc":"Opens an FTP connection and fetches a file from the remote host.\n\n`RemoteFile` and `LocalFile` must be absolute paths.\n\nThe configuration file must be as for [`ct_ftp:put/3`](`put/3`).\n\nSee also `ct:require/2`.","title":"ct_ftp.get/3","ref":"ct_ftp.html#get/3"},{"type":"function","doc":"Lists directory `Dir`.","title":"ct_ftp.ls/2","ref":"ct_ftp.html#ls/2"},{"type":"function","doc":"Opens an FTP connection to the specified node.\n\nYou can open a connection for a particular `Name` and use the same name as\nreference for all following subsequent operations. If you want the connection to\nbe associated with `Handle` instead (if you, for example, need to open multiple\nconnections to a host), use `Key`, the configuration variable name, to specify\nthe target. A connection without an associated target name can only be closed\nwith the handle value.\n\nFor information on how to create a new `Name`, see `ct:require/2`.","title":"ct_ftp.open/1","ref":"ct_ftp.html#open/1"},{"type":"function","doc":"Opens an FTP connection and sends a file to the remote host.\n\n`LocalFile` and `RemoteFile` must be absolute paths.\n\nIf the target host is a \"special\" node, the FTP address must be specified in the\nconfiguration file as follows:\n\n```erlang\n{node,[{ftp,IpAddr}]}.\n```\n\nIf the target host is something else, for example, a UNIX host, the\nconfiguration file must also include the username and password (both strings):\n\n```erlang\n{unix,[{ftp,IpAddr},\n {username,Username},\n {password,Password}]}.\n```\n\nSee also `ct:require/2`.","title":"ct_ftp.put/3","ref":"ct_ftp.html#put/3"},{"type":"function","doc":"Fetches a file over FTP.\n\nThe file gets the same name on the local host.\n\nSee also [`ct_ftp:recv/3`](`recv/3`).","title":"ct_ftp.recv/2","ref":"ct_ftp.html#recv/2"},{"type":"function","doc":"Fetches a file over FTP.\n\nThe file is named `LocalFile` on the local host.","title":"ct_ftp.recv/3","ref":"ct_ftp.html#recv/3"},{"type":"function","doc":"Sends a file over FTP.\n\nThe file gets the same name on the remote host.\n\nSee also [`ct_ftp:send/3`](`send/3`).","title":"ct_ftp.send/2","ref":"ct_ftp.html#send/2"},{"type":"function","doc":"Sends a file over FTP.\n\nThe file is named `RemoteFile` on the remote host.","title":"ct_ftp.send/3","ref":"ct_ftp.html#send/3"},{"type":"function","doc":"Changes the file transfer type.","title":"ct_ftp.type/2","ref":"ct_ftp.html#type/2"},{"type":"type","doc":"Reference to opened FTP connection associated to either a `handle` or `target_name`.","title":"ct_ftp.connection/0","ref":"ct_ftp.html#t:connection/0"},{"type":"type","doc":"Handle for a specific FTP connection, see module `m:ct`.","title":"ct_ftp.handle/0","ref":"ct_ftp.html#t:handle/0"},{"type":"behaviour","doc":"A callback interface on top of Common Test.\n\nThe _Common Test Hook (CTH)_ framework allows extensions of the default behavior\nof `Common Test` by callbacks before and after all test suite calls. It is\nintended for advanced users of `Common Test` who want to abstract out behavior\nthat is common to multiple test suites.\n\nIn brief, CTH allows you to:\n\n- Manipulate the runtime configuration before each suite configuration call.\n- Manipulate the return of all suite configuration calls and by extension the\n result of the test themselves.\n\nThe following sections describe the mandatory and optional CTH functions that\n`Common Test` calls during test execution. For more details, see section\n[Common Test Hooks](ct_hooks_chapter.md) in the User's Guide.\n\nFor information about how to add a CTH to your suite, see section\n[Installing a CTH](ct_hooks_chapter.md#installing) in the User's Guide.\n\n> #### Note {: .info }\n>\n> For a minimal example of a CTH, see section\n> [Example CTH](ct_hooks_chapter.md#example) in the User's Guide.","title":"ct_hooks","ref":"ct_hooks.html"},{"type":"callback","doc":"The `Id` identifies a CTH instance uniquely. If two CTHs return the same `Id`,\nthe second CTH is ignored and subsequent calls to the CTH are only made to the\nfirst instance. For details, see section\n[Installing a CTH](ct_hooks_chapter.md#installing) in the User's Guide.\n\nThis function is _not_ to have any side effects, as it can be called multiple\ntimes by `Common Test`.\n\nIf not implemented, the CTH acts as if this function returned a call to\n`make_ref/0`.","title":"ct_hooks.id/1","ref":"ct_hooks.html#c:id/1"},{"type":"callback","doc":"This function is always called before any other callback function. Use it to\ninitiate any common state. It is to return a state for this CTH.\n\n`Id` is either the return value of [`ct_hooks:id/1`](`c:id/1`), or a `reference`\n(created using `erlang:make_ref/0` in ERTS) if [`ct_hooks:id/1`](`c:id/1`) is\nnot implemented.\n\n`Priority` is the relative priority of this hook. Hooks with a lower priority\nare executed first. If no priority is specified, it is set to `0`.\n\nFor details about hook execution order, see section\n[CTH Execution Order](ct_hooks_chapter.md#cth_execution_order) in the User's\nGuide.\n\nFor details about when `init` is called, see section\n[CTH Scope](ct_hooks_chapter.md#scope) in the User's Guide.","title":"ct_hooks.init/2","ref":"ct_hooks.html#c:init/2"},{"type":"callback","doc":"This function is called whenever a test case (or configuration function) fails.\nIt is called after the post function is called for the failed test case.\n\nThat is:\n\n- If `init_per_suite` fails, this function is called after\n [`post_init_per_suite`](`c:post_init_per_suite/4`).\n- If a test case fails, this function is called after\n [`post_end_per_testcase`](`c:post_end_per_testcase/5`).\n\nIf the failed test case belongs to a test case group, the second argument is a\ntuple `{FuncName,GroupName}`, otherwise only the function name.\n\nThe data that comes with `Reason` follows the same format as\n[`FailReason`](event_handler_chapter.md#failreason) in event\n[`tc_done`](event_handler_chapter.md#tc_done). For details, see section\n[Event Handling](event_handler_chapter.md#events) in the User's Guide.\n\nIf [`Module:on_tc_fail/4`](`c:on_tc_fail/4`) is not exported, common_test will\nattempt to call `Module:on_tc_fail(TestName, Reason, CTHState)` instead. This is\nfor backwards compatibility.","title":"ct_hooks.on_tc_fail/4","ref":"ct_hooks.html#c:on_tc_fail/4"},{"type":"callback","doc":"This function is called whenever a test case (or configuration function) is\nskipped. It is called after the post function is called for the skipped test\ncase.\n\nThat is:\n\n- If `init_per_group` is skipped, this function is called after\n [`post_init_per_group`](`c:post_init_per_group/5`).\n- If a test case is skipped, this function is called after\n [`post_end_per_testcase`](`c:post_end_per_testcase/5`).\n\nIf the skipped test case belongs to a test case group, the second argument is a\ntuple `{FuncName,GroupName}`, otherwise only the function name.\n\nThe data that comes with `Reason` follows the same format as events\n[`tc_auto_skip`](event_handler_chapter.md#tc_auto_skip) and\n[`tc_user_skip`](event_handler_chapter.md#tc_user_skip) For details, see section\n[Event Handling](event_handler_chapter.md#events) in the User's Guide.\n\nIf [`Module:on_tc_skip/4`](`c:on_tc_skip/4`) is not exported, common_test will\nattempt to call `Module:on_tc_skip(TestName, Reason, CTHState)` instead. This is\nfor backwards compatibility.","title":"ct_hooks.on_tc_skip/4","ref":"ct_hooks.html#c:on_tc_skip/4"},{"type":"callback","doc":"This function is called after [`all/0`](`c:ct_suite:all/0`). It is used to\nmodify the set of test cases and test group to be executed, for instance to add\nor remove test cases and groups, change group properties, or even skip all tests\nin the suite.\n\n`Return` is what [`all/0`](`c:ct_suite:all/0`) returned, that is, a list of test\ncases and groups to be executed, or a tuple `{skip,Reason}`.\n\n`GroupDefs` is what [`groups/0`](`c:ct_suite:groups/0`) or the\n[`post_groups/2`](`c:post_groups/2`) hook returned, that is, a list of group\ndefinitions.\n\n`NewReturn` is the possibly modified version of `Return`.\n\nThis function is called only if the CTH is added before `init_per_suite` is run.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.\n\nNotice that for CTHs that are installed by means of the\n[`suite/0`](`c:ct_suite:suite/0`) function, `post_all/2` is called before the\n`c:init/2` hook function. However, for CTHs that are installed by means of the\nCT start flag, the `c:init/2` function is called first.\n\n> #### Note {: .info }\n>\n> Prior to each test execution, Common Test does a simulated test run in order\n> to count test suites, groups and cases for logging purposes. This causes the\n> [`post_all/3`](`c:post_all/3`) hook function to always be called twice. For\n> this reason, side effects are best avoided in this callback.","title":"ct_hooks.post_all/3","ref":"ct_hooks.html#c:post_all/3"},{"type":"callback","doc":"This function is called after [`end_per_group`](`c:ct_suite:end_per_group/2`) if\nit exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[end_per_group](`c:ct_suite:end_per_group/2`) instead.\n\nIf [`Module:post_end_per_group/5`](`c:post_end_per_group/5`) is not exported,\ncommon_test will attempt to call\n`Module:post_end_per_group(GroupName, Config, Return, CTHState)` instead. This\nis for backwards compatibility.","title":"ct_hooks.post_end_per_group/5","ref":"ct_hooks.html#c:post_end_per_group/5"},{"type":"callback","doc":"This function is called after [`end_per_suite`](`c:ct_suite:end_per_suite/1`) if\nit exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[`end_per_suite`](`c:ct_suite:end_per_suite/1`) instead.","title":"ct_hooks.post_end_per_suite/4","ref":"ct_hooks.html#c:post_end_per_suite/4"},{"type":"callback","doc":"This function is called after\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) if it exists. It behaves\nthe same way as [`post_end_per_suite`](`c:post_end_per_suite/4`), but for\nfunction [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) instead.\n\nIf [`Module:post_end_per_testcase/5`](`c:post_end_per_testcase/5`) is not\nexported, common_test will attempt to call\n`Module:post_end_per_testcase(TestcaseName, Config, Return, CTHState)` instead.\nThis is for backwards compatibility.","title":"ct_hooks.post_end_per_testcase/5","ref":"ct_hooks.html#c:post_end_per_testcase/5"},{"type":"callback","doc":"This function is called after [`groups/0`](`c:ct_suite:groups/0`). It is used to\nmodify the test group definitions, for instance to add or remove groups or\nchange group properties.\n\n`GroupDefs` is what [`groups/0`](`c:ct_suite:groups/0`) returned, that is, a\nlist of group definitions.\n\n`NewGroupDefs` is the possibly modified version of this list.\n\nThis function is called only if the CTH is added before `init_per_suite` is run.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.\n\nNotice that for CTHs that are installed by means of the\n[`suite/0`](`c:ct_suite:suite/0`) function, [`post_groups/2`](`c:post_groups/2`)\nis called before the `c:init/2` hook function. However, for CTHs that are\ninstalled by means of the CT start flag, the `c:init/2` function is called\nfirst.\n\n> #### Note {: .info }\n>\n> Prior to each test execution, Common Test does a simulated test run in order\n> to count test suites, groups and cases for logging purposes. This causes the\n> [`post_groups/2`](`c:post_groups/2`) hook function to always be called twice.\n> For this reason, side effects are best avoided in this callback.","title":"ct_hooks.post_groups/2","ref":"ct_hooks.html#c:post_groups/2"},{"type":"callback","doc":"This function is called after [`init_per_group`](`c:ct_suite:init_per_group/2`)\nif it exists. It behaves the same way as\n[`post_init_per_suite`](`c:post_init_per_suite/4`), but for function\n[`init_per_group`](`c:ct_suite:init_per_group/2`) instead.\n\nIf [`Module:post_init_per_group/5`](`c:post_init_per_group/5`) is not exported,\ncommon_test will attempt to call\n`Module:post_init_per_group(GroupName, Config, Return, CTHState)` instead. This\nis for backwards compatibility.","title":"ct_hooks.post_init_per_group/5","ref":"ct_hooks.html#c:post_init_per_group/5"},{"type":"callback","doc":"This function is called after [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\nif it exists. It typically contains extra checks to ensure that all the correct\ndependencies are started correctly.\n\n`Return` is what [`init_per_suite`](`c:ct_suite:init_per_suite/1`) returned,\nthat is, `{fail,Reason}`, `{skip,Reason}`, a `Config` list, or a term describing\nhow [`init_per_suite`](`c:ct_suite:init_per_suite/1`) failed.\n\n`NewReturn` is the possibly modified return value of\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`). To recover from a failure in\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`), return `ConfigList` with the\n`tc_status` element removed. For more details, see\n[Post Hooks](ct_hooks_chapter.md#post) in section \"Manipulating Tests\" in the\nUser's Guide.\n\n`CTHState` is the current internal state of the CTH.\n\nThis function is called only if the CTH is added before or in `init_per_suite`.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.","title":"ct_hooks.post_init_per_suite/4","ref":"ct_hooks.html#c:post_init_per_suite/4"},{"type":"callback","doc":"This function is called after\n[`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) if it exists. It behaves\nthe same way as [`post_init_per_suite`](`c:post_init_per_suite/4`), but for\nfunction [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) instead.\n\nIf [`Module:post_init_per_testcase/5`](`c:post_init_per_testcase/5`) is not\nexported, common_test will attempt to call\n`Module:post_init_per_testcase(TestcaseName, Config, Return, CTHState)` instead.\nThis is for backwards compatibility.","title":"ct_hooks.post_init_per_testcase/5","ref":"ct_hooks.html#c:post_init_per_testcase/5"},{"type":"callback","doc":"This function is called before [`end_per_group`](`c:ct_suite:end_per_group/2`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`end_per_group`](`c:ct_suite:end_per_group/2`) instead.\n\nIf [`Module:pre_end_per_group/4`](`c:pre_end_per_group/4`) is not exported,\ncommon_test will attempt to call\n`Module:pre_end_per_group(GroupName, EndData, CTHState)` instead. This is for\nbackwards compatibility.","title":"ct_hooks.pre_end_per_group/4","ref":"ct_hooks.html#c:pre_end_per_group/4"},{"type":"callback","doc":"This function is called before [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`end_per_suite`](`c:ct_suite:end_per_suite/1`) instead.","title":"ct_hooks.pre_end_per_suite/3","ref":"ct_hooks.html#c:pre_end_per_suite/3"},{"type":"callback","doc":"This function is called before\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) if it exists. It behaves\nthe same way as [`pre_end_per_suite`](`c:pre_end_per_suite/3`), but for function\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) instead.\n\nThis function cannot change the result of the test case by returning skip or\nfail tuples, but it may insert items in `Config` that can be read in\n`end_per_testcase/2` or in\n[`post_end_per_testcase/5`](`c:post_end_per_testcase/5`).\n\nIf [`Module:pre_end_per_testcase/4`](`c:pre_end_per_testcase/4`) is not\nexported, common_test will attempt to call\n`Module:pre_end_per_testcase(TestcaseName, EndData, CTHState)` instead. This is\nfor backwards compatibility.","title":"ct_hooks.pre_end_per_testcase/4","ref":"ct_hooks.html#c:pre_end_per_testcase/4"},{"type":"callback","doc":"This function is called before [`init_per_group`](`c:ct_suite:init_per_group/2`)\nif it exists. It behaves the same way as\n[`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for function\n[`init_per_group`](`c:ct_suite:init_per_group/2`) instead.\n\nIf [`Module:pre_init_per_group/4`](`c:pre_init_per_group/4`) is not exported,\ncommon_test will attempt to call\n`Module:pre_init_per_group(GroupName, InitData, CTHState)` instead. This is for\nbackwards compatibility.","title":"ct_hooks.pre_init_per_group/4","ref":"ct_hooks.html#c:pre_init_per_group/4"},{"type":"callback","doc":"This function is called before [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\nif it exists. It typically contains initialization/logging that must be done\nbefore `init_per_suite` is called. If `{skip,Reason}` or `{fail,Reason}` is\nreturned, `init_per_suite` and all test cases of the suite are skipped and\n`Reason` printed in the overview log of the suite.\n\n`SuiteName` is the name of the suite to be run.\n\n`InitData` is the original configuration list of the test suite, or a\n`SkipOrFail` tuple if a previous CTH has returned this.\n\n`CTHState` is the current internal state of the CTH.\n\n`Return` is the result of the `init_per_suite` function. If it is\n`{skip,Reason}` or `{fail,Reason}`,\n[`init_per_suite`](`c:ct_suite:init_per_suite/1`) is never called, instead the\ninitiation is considered to be skipped or failed, respectively. If a `NewConfig`\nlist is returned, [`init_per_suite`](`c:ct_suite:init_per_suite/1`) is called\nwith that `NewConfig` list. For more details, see section\n[Pre Hooks](ct_hooks_chapter.md#pre) in the User's Guide.\n\nThis function is called only if the CTH is added before `init_per_suite is run`.\nFor details, see section [CTH Scope](ct_hooks_chapter.md#scope) in the User's\nGuide.","title":"ct_hooks.pre_init_per_suite/3","ref":"ct_hooks.html#c:pre_init_per_suite/3"},{"type":"callback","doc":"This function is called before\n[`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) if it exists. It behaves\nthe same way as [`pre_init_per_suite`](`c:pre_init_per_suite/3`), but for\nfunction [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) instead.\n\nIf [`Module:pre_init_per_testcase/4`](`c:pre_init_per_testcase/4`) is not\nexported, common_test will attempt to call\n`Module:pre_init_per_testcase(TestcaseName, InitData, CTHState)` instead. This\nis for backwards compatibility.\n\nCTHs cannot be added here right now. That feature may be added in a later\nrelease, but it would right now break backwards compatibility.","title":"ct_hooks.pre_init_per_testcase/4","ref":"ct_hooks.html#c:pre_init_per_testcase/4"},{"type":"callback","doc":"This function is called at the end of a CTH [scope](ct_hooks_chapter.md#scope).\nThe returned term is ignored.","title":"ct_hooks.terminate/1","ref":"ct_hooks.html#c:terminate/1"},{"type":"module","doc":"Distributed test execution control for `Common Test`.\n\nThis module exports functions for running `Common Test` nodes on multiple hosts\nin parallel.","title":"ct_master","ref":"ct_master.html"},{"type":"function","doc":"Stops all running tests.","title":"ct_master.abort/0","ref":"ct_master.html#abort/0"},{"type":"function","doc":"Stops tests on specified nodes.","title":"ct_master.abort/1","ref":"ct_master.html#abort/1"},{"type":"function","doc":"If set to `true`, the `ct_master logs` are written on a primitive HTML format,\nnot using the `Common Test` CSS style sheet.","title":"ct_master.basic_html/1","ref":"ct_master.html#basic_html/1"},{"type":"function","doc":"Gets a reference to the `Common Test` master event manager. The reference can be\nused to, for example, add a user-specific event handler while tests are running.\n\n_Example:_\n\n```erlang\ngen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])\n```","title":"ct_master.get_event_mgr_ref/0","ref":"ct_master.html#get_event_mgr_ref/0"},{"type":"function","doc":"Returns test progress. If `Status` is `ongoing`, tests are running on the node\nand are not yet finished.","title":"ct_master.progress/0","ref":"ct_master.html#progress/0"},{"type":"function","doc":"Run tests on spawned nodes as specified in `TestSpecs` (see `run/4`).\n\nEquivalent to [`run(TestSpecs, false, [], [])`](`run/4`) if\ncalled with TestSpecs being list of strings;\n\nEquivalent to [`run([TS], false, [], [])`](`run/4`) if\ncalled with TS being string.","title":"ct_master.run/1","ref":"ct_master.html#run/1"},{"type":"function","doc":"","title":"ct_master.run/3","ref":"ct_master.html#run/3"},{"type":"function","doc":"Tests are spawned on the nodes as specified in `TestSpecs`. Each specification\nin `TestSpec` is handled separately. However, it is also possible to specify a\nlist of specifications to be merged into one specification before the tests are\nexecuted. Any test without a particular node specification is also executed on\nthe nodes in `InclNodes`. Nodes in the `ExclNodes` list are excluded from the\ntest.","title":"ct_master.run/4","ref":"ct_master.html#run/4"},{"type":"function","doc":"","title":"ct_master.run_on_node/2","ref":"ct_master.html#run_on_node/2"},{"type":"function","doc":"Tests are spawned on `Node` according to `TestSpecs`.","title":"ct_master.run_on_node/3","ref":"ct_master.html#run_on_node/3"},{"type":"function","doc":"Tests are spawned on `Node` using `ct:run_test/1`","title":"ct_master.run_test/2","ref":"ct_master.html#run_test/2"},{"type":"type","doc":"Filename of test spec to be executed.","title":"ct_master.test_spec/0","ref":"ct_master.html#t:test_spec/0"},{"type":"module","doc":"NETCONF client module.\n\nNETCONF client module compliant with RFC 6241, NETCONF Configuration Protocol,\nand RFC 6242, Using the NETCONF Configuration Protocol over Secure SHell (SSH),\nand with support for RFC 5277, NETCONF Event Notifications.\n\n[](){: #Connecting }\n\n_Connecting to a NETCONF server_\n\nCall [`connect/1,2`](`connect/1`) to establish a connection to a server, then\npass the returned handle to [`session/1-3`](`session/1`) to establish a NETCONF\nsession on a new SSH channel. Each call to [`session/1-3`](`session/1`)\nestablishes a new session on the same connection, and results in a hello message\nto the server.\n\nAlternately, [`open/1,2`](`open/1`) can be used to establish a single session on\na dedicated connection. (Or, equivalently, [`only_open/1,2`](`only_open/1`)\nfollowed by [`hello/1-3`](`hello/1`).)\n\nConnect/session options can be specified in a configuration file with entries\nlike the following.\n\n```erlang\n{server_id(), [option()]}.\n```\n\nThe `t:server_id/0` or an associated `t:ct:target_name/0` can then be passed to\nthe aforementioned functions to use the referenced configuration.\n\n[](){: #Signaling }\n\n_Signaling_\n\nProtocol operations in the NETCONF protocol are realized as remote procedure\ncalls (RPCs) from client to server and a corresponding reply from server to\nclient. RPCs are sent using like-named functions (eg.\n[`edit_config/3-5`](`edit_config/3`) to send an edit-config RPC), with the\nserver reply as return value. There are functions for each RPC defined in RFC\n6241 and the create-subscription RPC from RFC 5277, all of which are wrappers on\n[`send_rpc/2,3`](`send_rpc/2`), that can be used to send an arbitrary RPC not\ndefined in RFC 6241 or RFC 5277.\n\nAll of the signaling functions have one variant with a `Timeout` argument and\none without, corresponding to an infinite timeout. The latter is inappropriate\nin most cases since a non-response by the server or a missing message-id causes\nthe call to hang indefinitely.\n\n[](){: #Logging }\n\n_Logging_\n\nThe NETCONF server uses `error_logger` for logging of NETCONF traffic. A special\npurpose error handler is implemented in `ct_conn_log_h`. To use this error\nhandler, add the `cth_conn_log` hook in the test suite, for example:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].\n```\n\n`conn_log_mod()` is the name of the `Common Test` module implementing the\nconnection protocol, for example, `ct_netconfc`.\n\nHook option `log_type` specifies the type of logging:\n\n- **`raw`** - The sent and received NETCONF data is logged to a separate text\n file \"as is\" without any formatting. A link to the file is added to the test\n case HTML log.\n\n- **`pretty`** - The sent and received NETCONF data is logged to a separate text\n file with XML data nicely indented. A link to the file is added to the test\n case HTML log.\n\n- **`html (default)`** - The sent and received NETCONF traffic is pretty printed\n directly in the test case HTML log.\n\n- **`silent`** - NETCONF traffic is not logged.\n\nBy default, all NETCONF traffic is logged in one single log file. However,\ndifferent connections can be logged in separate files. To do this, use hook\noption `hosts` and list the names of the servers/connections to be used in the\nsuite. The connections must be named for this to work, that is, they must be\nopened with `open/2`.\n\nOption `hosts` has no effect if `log_type` is set to `html` or `silent`.\n\nThe hook options can also be specified in a configuration file with\nconfiguration variable `ct_conn_log`:\n\n```erlang\n{ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.\n```\n\nFor example:\n\n```erlang\n{ct_conn_log,[{ct_netconfc,[{log_type,pretty},\n {hosts,[ct:key_or_name()]}]}]}\n```\n\n> #### Note {: .info }\n>\n> Hook options specified in a configuration file overwrite the hard-coded hook\n> options in the test suite.\n\n_Logging Example 1:_\n\n[](){: #Logging_example_1 }\n\nThe following `ct_hooks` statement causes pretty printing of NETCONF traffic to\nseparate logs for the connections named `nc_server1` and `nc_server2`. Any other\nconnections are logged to default NETCONF log.\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},\n {hosts,[nc_server1,nc_server2]}]}\n ]}]}].\n```\n\nConnections must be opened as follows:\n\n```erlang\nopen(nc_server1,[...]),\nopen(nc_server2,[...]).\n```\n\n_Logging Example 2:_\n\n[](){: #Logging_example_2 }\n\nThe following configuration file causes raw logging of all NETCONF traffic in to\none single text file:\n\n```erlang\n{ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.\n```\n\nThe `ct_hooks` statement must look as follows:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, []}]}].\n```\n\nThe same `ct_hooks` statement without the configuration file would cause HTML\nlogging of all NETCONF connections in to the test case HTML log.","title":"ct_netconfc","ref":"ct_netconfc.html"},{"type":"function","doc":"","title":"ct_netconfc.action/2","ref":"ct_netconfc.html#action/2"},{"type":"function","doc":"Executes an action. If the return type is void, `ok` is returned instead of\n`{ok,[simple_xml()]}`.","title":"ct_netconfc.action/3","ref":"ct_netconfc.html#action/3"},{"type":"function","doc":"","title":"ct_netconfc.close_session/1","ref":"ct_netconfc.html#close_session/1"},{"type":"function","doc":"Requests graceful termination of the session associated with the client.\n\nWhen a NETCONF server receives a `close-session` request, it gracefully closes\nthe session. The server releases any locks and resources associated with the\nsession and gracefully closes any associated connections. Any NETCONF requests\nreceived after a `close-session` request are ignored.","title":"ct_netconfc.close_session/2","ref":"ct_netconfc.html#close_session/2"},{"type":"function","doc":"Opens an SSH connection to a NETCONF server.\n\nIf the server options are specified in a configuration file, use `connect/2`\ninstead.\n\nThe opaque `t:handle/0` reference returned from this function is required as\nconnection identifier when opening sessions over this connection, see\n[`session/1-3`](`session/1`).","title":"ct_netconfc.connect/1","ref":"ct_netconfc.html#connect/1"},{"type":"function","doc":"Open an SSH connection to a named NETCONF server.\n\nIf `KeyOrName` is a configured `t:server_id/0` or a `target_name()` associated\nwith such an Id, then the options for this server are fetched from the\nconfiguration file.\n\nThe options list is added to those of the configuration file. If an option is\nspecified in both lists, the configuration file takes precedence.\n\nIf the server is not specified in a configuration file, use `connect/1` instead.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nconnection identifier when opening sessions over this connection, see\n[`session/1-3`](`session/1`). However, if `KeyOrName` is a `target_name()`, that\nis, if the server is named through a call to `ct:require/2` or a `require`\nstatement in the test suite, then this name can be used instead of `t:handle/0`.","title":"ct_netconfc.connect/2","ref":"ct_netconfc.html#connect/2"},{"type":"function","doc":"","title":"ct_netconfc.copy_config/3","ref":"ct_netconfc.html#copy_config/3"},{"type":"function","doc":"Copies configuration data.\n\nWhich source and target options that can be issued depends on the capabilities\nsupported by the server. That is, `:candidate` and/or `:startup` are required.","title":"ct_netconfc.copy_config/4","ref":"ct_netconfc.html#copy_config/4"},{"type":"function","doc":"","title":"ct_netconfc.create_subscription/2","ref":"ct_netconfc.html#create_subscription/2"},{"type":"function","doc":"Creates a subscription for event notifications by sending an RFC 5277\ncreate-subscription RPC to the server. The calling process receives events as\nmessages of type `t:notification/0`.\n\nFrom RFC 5722, 2.1 Subscribing to Receive Event Notifications:\n\n- **`Stream`** - Indicates which stream of event is of interest. If not present,\n events in the default NETCONF stream are sent.\n\n- **`Filter`** - Indicates which subset of all possible events is of interest.\n The parameter format is the same as that of the filter parameter in the\n NETCONF protocol operations. If not present, all events not precluded by other\n parameters are sent.\n\n- **`StartTime`** - Used to trigger the replay feature and indicate that the\n replay is to start at the time specified. If `StartTime` is not present, this\n is not a replay subscription. It is not valid to specify start times that are\n later than the current time. If `StartTime` is specified earlier than the log\n can support, the replay begins with the earliest available notification. This\n parameter is of type `dateTime` and compliant to RFC 3339. Implementations\n must support time zones.\n\n- **`StopTime`** - Used with the optional replay feature to indicate the newest\n notifications of interest. If `StopTime` is not present, the notifications\n continues until the subscription is terminated. Must be used with and be later\n than `StartTime`. Values of `StopTime` in the future are valid. This parameter\n is of type `dateTime` and compliant to RFC 3339. Implementations must support\n time zones.\n\nSee RFC 5277 for more details. The requirement that `StopTime` must only be used\nwith `StartTime` is not enforced, to allow an invalid request to be sent to the\nserver.\n\nPrior to OTP 22.1, this function was documented as having 15 variants in 6\narities. These are still exported for backwards compatibility, but no longer\ndocumented. The map-based variants documented above provide the same\nfunctionality with simpler arguments.\n\n> #### Note {: .info }\n>\n> create-subscription is no longer the only RPC with which NETCONF notifications\n> can be ordered: RFC 8639 adds establish-subscription and future RFCs may add\n> other methods. Specify a `receiver` option at session creation to provide a\n> destination for incoming notifications independently of a call to\n> [`create_subscription/2,3`](`create_subscription/2`), and use\n> [`send_rpc/2,3`](`send_rpc/2`) to send establish-subscription and other\n> arbitrary RPCs.","title":"ct_netconfc.create_subscription/3","ref":"ct_netconfc.html#create_subscription/3"},{"type":"function","doc":"","title":"ct_netconfc.delete_config/2","ref":"ct_netconfc.html#delete_config/2"},{"type":"function","doc":"Deletes configuration data.\n\nThe running configuration cannot be deleted and `:candidate` or `:startup` must\nbe advertised by the server.","title":"ct_netconfc.delete_config/3","ref":"ct_netconfc.html#delete_config/3"},{"type":"function","doc":"Closes the given SSH connection.\n\nIf there are open NETCONF sessions on the connection, these will be brutally\naborted. To avoid this, close each session with\n[`close_session/1,2`](`close_session/1`)","title":"ct_netconfc.disconnect/1","ref":"ct_netconfc.html#disconnect/1"},{"type":"function","doc":"","title":"ct_netconfc.edit_config/3","ref":"ct_netconfc.html#edit_config/3"},{"type":"function","doc":"","title":"ct_netconfc.edit_config/4","ref":"ct_netconfc.html#edit_config/4"},{"type":"function","doc":"Edits configuration data.\n\nBy default only the running target is available, unless the server includes\n`:candidate` or `:startup` in its list of capabilities.\n\n`OptParams` can be used for specifying optional parameters (`default-operation`,\n`test-option`, or `error-option`) to be added to the `edit-config` request. The\nvalue must be a list containing valid simple XML, for example:\n\n```erlang\n[{'default-operation', [\"none\"]},\n {'error-option', [\"rollback-on-error\"]}]\n```\n\nIf `OptParams` is not given, the default value `[]` is used.","title":"ct_netconfc.edit_config/5","ref":"ct_netconfc.html#edit_config/5"},{"type":"function","doc":"","title":"ct_netconfc.get/2","ref":"ct_netconfc.html#get/2"},{"type":"function","doc":"Gets data.\n\nThis operation returns both configuration and state data from the server.\n\nFilter type `xpath` can be used only if the server supports `:xpath`.","title":"ct_netconfc.get/3","ref":"ct_netconfc.html#get/3"},{"type":"function","doc":"","title":"ct_netconfc.get_capabilities/1","ref":"ct_netconfc.html#get_capabilities/1"},{"type":"function","doc":"Returns the server capabilities as received in its hello message.","title":"ct_netconfc.get_capabilities/2","ref":"ct_netconfc.html#get_capabilities/2"},{"type":"function","doc":"","title":"ct_netconfc.get_config/3","ref":"ct_netconfc.html#get_config/3"},{"type":"function","doc":"Gets configuration data.\n\nTo be able to access another source than `running`, the server must advertise\n`:candidate` and/or `:startup`.\n\nFilter type `xpath` can be used only if the server supports `:xpath`.","title":"ct_netconfc.get_config/4","ref":"ct_netconfc.html#get_config/4"},{"type":"function","doc":"","title":"ct_netconfc.get_event_streams/1","ref":"ct_netconfc.html#get_event_streams/1"},{"type":"function","doc":"","title":"ct_netconfc.get_event_streams/2","ref":"ct_netconfc.html#get_event_streams/2"},{"type":"function","doc":"Sends a request to get the specified event streams.\n\n`Streams` is a list of stream names. The following filter is sent to the NETCONF\nserver in a `get` request:\n\n```text\n \n \n \n StreamName1 \n \n \n StreamName2 \n \n ...\n \n \n```\n\nIf `Streams` is an empty list, _all_ streams are requested by sending the\nfollowing filter:\n\n```text\n \n \n \n```\n\nIf more complex filtering is needed, use [`ct_netconfc:get/2,3`](`get/2`) and\nspecify the exact filter according to \"XML Schema for Event Notifications\" in\nRFC 5277.","title":"ct_netconfc.get_event_streams/3","ref":"ct_netconfc.html#get_event_streams/3"},{"type":"function","doc":"","title":"ct_netconfc.get_session_id/1","ref":"ct_netconfc.html#get_session_id/1"},{"type":"function","doc":"Returns the session Id associated with the specified client.","title":"ct_netconfc.get_session_id/2","ref":"ct_netconfc.html#get_session_id/2"},{"type":"function","doc":"","title":"ct_netconfc.hello/1","ref":"ct_netconfc.html#hello/1"},{"type":"function","doc":"","title":"ct_netconfc.hello/2","ref":"ct_netconfc.html#hello/2"},{"type":"function","doc":"Exchanges `hello` messages with the server. Returns when the server hello has\nbeen received or after the specified timeout.\n\nNote that capabilities for an outgoing hello can be passed directly to `open/2`.","title":"ct_netconfc.hello/3","ref":"ct_netconfc.html#hello/3"},{"type":"function","doc":"","title":"ct_netconfc.kill_session/2","ref":"ct_netconfc.html#kill_session/2"},{"type":"function","doc":"Forces termination of the session associated with the supplied session Id.\n\nThe server side must abort any ongoing operations, release any locks and\nresources associated with the session, and close any associated connections.\n\nOnly if the server is in the confirmed commit phase, the configuration is\nrestored to its state before entering the confirmed commit phase. Otherwise, no\nconfiguration rollback is performed.\n\nIf the specified `SessionId` is equal to the current session Id, an error is\nreturned.","title":"ct_netconfc.kill_session/3","ref":"ct_netconfc.html#kill_session/3"},{"type":"function","doc":"","title":"ct_netconfc.lock/2","ref":"ct_netconfc.html#lock/2"},{"type":"function","doc":"Locks the configuration target.\n\nWhich target parameters that can be used depends on if `:candidate` and/or\n`:startup` are supported by the server. If successful, the configuration system\nof the device is unavailable to other clients (NETCONF, CORBA, SNMP, and so on).\nLocks are intended to be short-lived.\n\nOperation [`kill_session/2,3`](`kill_session/2`) can be used to force the\nrelease of a lock owned by another NETCONF session. How this is achieved by the\nserver side is implementation-specific.","title":"ct_netconfc.lock/3","ref":"ct_netconfc.html#lock/3"},{"type":"function","doc":"Opens a NETCONF session, but does not send `hello`.\n\nAs `open/1`, but does not send a `hello` message.","title":"ct_netconfc.only_open/1","ref":"ct_netconfc.html#only_open/1"},{"type":"function","doc":"Opens a named NETCONF session, but does not send `hello`.\n\nAs `open/2`, but does not send a `hello` message.","title":"ct_netconfc.only_open/2","ref":"ct_netconfc.html#only_open/2"},{"type":"function","doc":"Opens a NETCONF session and exchanges `hello` messages.\n\nIf the server options are specified in a configuration file, or if a named\nclient is needed for logging purposes (see section\n[Logging](`m:ct_netconfc#Logging`) in this module), use `open/2` instead.\n\nThe opaque `t:handle/0` reference returned from this function is required as\nclient identifier when calling any other function in this module.","title":"ct_netconfc.open/1","ref":"ct_netconfc.html#open/1"},{"type":"function","doc":"Opens a named NETCONF session and exchanges `hello` messages.\n\nIf `KeyOrName` is a configured `t:server_id/0` or a `target_name()` associated\nwith such an Id, then the options for this server are fetched from the\nconfiguration file.\n\nThe options list is added to those of the configuration file. If an option is\nspecified in both lists, the configuration file take precedence.\n\nIf the server is not specified in a configuration file, use `open/1` instead.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nclient identifier when calling any other function in this module. However, if\n`KeyOrName` is a `target_name()`, that is, if the server is named through a call\nto `ct:require/2` or a `require` statement in the test suite, then this name can\nbe used instead of `t:handle/0`.\n\nSee also `ct:require/2`.","title":"ct_netconfc.open/2","ref":"ct_netconfc.html#open/2"},{"type":"function","doc":"","title":"ct_netconfc.send/2","ref":"ct_netconfc.html#send/2"},{"type":"function","doc":"Sends an XML document to the server.\n\nThe specified XML document is sent \"as is\" to the server. This function can be\nused for sending XML documents that cannot be expressed by other interface\nfunctions in this module.","title":"ct_netconfc.send/3","ref":"ct_netconfc.html#send/3"},{"type":"function","doc":"","title":"ct_netconfc.send_rpc/2","ref":"ct_netconfc.html#send_rpc/2"},{"type":"function","doc":"Sends a NETCONF `rpc` request to the server.\n\nThe specified XML document is wrapped in a valid NETCONF `rpc` request and sent\nto the server. The `message-id` and namespace attributes are added to element\n`rpc`.\n\nThis function can be used for sending `rpc` requests that cannot be expressed by\nother interface functions in this module.","title":"ct_netconfc.send_rpc/3","ref":"ct_netconfc.html#send_rpc/3"},{"type":"function","doc":"","title":"ct_netconfc.session/1","ref":"ct_netconfc.html#session/1"},{"type":"function","doc":"","title":"ct_netconfc.session/2","ref":"ct_netconfc.html#session/2"},{"type":"function","doc":"Opens a NETCONF session as a channel on the given SSH connection, and exchanges\nhello messages with the server.\n\nThe opaque `t:handle/0` reference returned from this function can be used as\nclient identifier when calling any other function in this module. However, if\n`KeyOrName` is used and it is a `target_name()`, that is, if the server is named\nthrough a call to `ct:require/2` or a `require` statement in the test suite,\nthen this name can be used instead of `t:handle/0`.","title":"ct_netconfc.session/3","ref":"ct_netconfc.html#session/3"},{"type":"function","doc":"","title":"ct_netconfc.unlock/2","ref":"ct_netconfc.html#unlock/2"},{"type":"function","doc":"Unlocks the configuration target.\n\nIf the client earlier has acquired a lock through [`lock/2,3`](`lock/2`), this\noperation releases the associated lock. To access another target than `running`,\nthe server must support `:candidate` and/or `:startup`.","title":"ct_netconfc.unlock/3","ref":"ct_netconfc.html#unlock/3"},{"type":"type","doc":"Handle to a NETCONF session, as required by signaling functions.","title":"ct_netconfc.client/0","ref":"ct_netconfc.html#t:client/0"},{"type":"type","doc":"","title":"ct_netconfc.error_reason/0","ref":"ct_netconfc.html#t:error_reason/0"},{"type":"opaque","doc":"Handle to a connection to a NETCONF server as returned by\n[`connect/1,2`](`connect/1`), or to a session as returned by\n[`session/1-3`](`session/1`), [`open/1,2`](`open/1`), or\n[`only_open/1,2`](`only_open/1`).","title":"ct_netconfc.handle/0","ref":"ct_netconfc.html#t:handle/0"},{"type":"type","doc":"","title":"ct_netconfc.host/0","ref":"ct_netconfc.html#t:host/0"},{"type":"type","doc":"","title":"ct_netconfc.netconf_db/0","ref":"ct_netconfc.html#t:netconf_db/0"},{"type":"type","doc":"Event notification messages sent as a result of calls to\n[`create_subscription/2,3`](`create_subscription/2`).","title":"ct_netconfc.notification/0","ref":"ct_netconfc.html#t:notification/0"},{"type":"type","doc":"Options `host` and `port` specify the server endpoint to which to connect, and\nare passed directly to [`ssh:connect/4`](`ssh:connect/3`), as are arbitrary ssh\noptions. Common options are `user`, `password` and `user_dir`.\n\nOption `timeout` specifies the number of milliseconds to allow for connection\nestablishment and, if the function in question results in an outgoing hello\nmessage, reception of the server hello. The timeout applies to connection and\nhello independently; one timeout for connection establishment, another for hello\nreception.\n\nOption `receiver` specifies a destination for incoming notification messages; a\nleft operand of the send operator (`!`). If not specified then a process calling\n[`create_subscription/2,3`](`create_subscription/2`) becomes the receiver, but\nexplicitly setting a receiver makes it possible to receive notifications that\nare not ordered by calling this function. Multiple receiver options can be\nspecified.\n\nReceiver options are ignored by connect/1-3.\n\nOption `capability` specifies the content of a corresponding element in an\noutgoing hello message, each option specifying the content of a single element.\nIf no base NETCONF capability is configured then the RFC 4741 1.0 capability,\n\"urn:ietf:params:netconf:base:1.0\", is added, otherwise not. In particular, the\nRFC 6241 1.1 capability must be explicitly configured. NETCONF capabilities can\nbe specified using the shorthand notation defined in RFC 6241, any capability\nstring starting with a colon being prefixed by either \"urn:ietf:params:netconf\"\nor \"urn:ietf:params:netconf:capability\", as appropriate.\n\nCapability options are ignored by connect/1-3 and only_open/1-2, which don't\nresult in an outgoing hello message.","title":"ct_netconfc.option/0","ref":"ct_netconfc.html#t:option/0"},{"type":"type","doc":"Identity of connection or session configuration in a configuration file.","title":"ct_netconfc.server_id/0","ref":"ct_netconfc.html#t:server_id/0"},{"type":"type","doc":"","title":"ct_netconfc.session_option/0","ref":"ct_netconfc.html#t:session_option/0"},{"type":"type","doc":"Representation of XML, as described in application\n[`xmerl`](`e:xmerl:index.html`).","title":"ct_netconfc.simple_xml/0","ref":"ct_netconfc.html#t:simple_xml/0"},{"type":"type","doc":"","title":"ct_netconfc.stream_data/0","ref":"ct_netconfc.html#t:stream_data/0"},{"type":"type","doc":"","title":"ct_netconfc.stream_name/0","ref":"ct_netconfc.html#t:stream_name/0"},{"type":"type","doc":"Stream information as returned by\n[`get_event_streams/1-3`](`get_event_streams/1`). See RFC 5277, \"XML Schema for\nEvent Notifications\", for detail on the format of the string values.","title":"ct_netconfc.streams/0","ref":"ct_netconfc.html#t:streams/0"},{"type":"type","doc":"","title":"ct_netconfc.xml_attribute_tag/0","ref":"ct_netconfc.html#t:xml_attribute_tag/0"},{"type":"type","doc":"","title":"ct_netconfc.xml_attribute_value/0","ref":"ct_netconfc.html#t:xml_attribute_value/0"},{"type":"type","doc":"","title":"ct_netconfc.xml_attributes/0","ref":"ct_netconfc.html#t:xml_attributes/0"},{"type":"type","doc":"","title":"ct_netconfc.xml_content/0","ref":"ct_netconfc.html#t:xml_content/0"},{"type":"type","doc":"","title":"ct_netconfc.xml_tag/0","ref":"ct_netconfc.html#t:xml_tag/0"},{"type":"type","doc":"","title":"ct_netconfc.xpath/0","ref":"ct_netconfc.html#t:xpath/0"},{"type":"type","doc":"Date and time of a startTime/stopTime element in an RFC 5277 create-subscription\nrequest. Of XML primitive type `dateTime`, which has the (informal) form\n\n```text\n[-]YYYY-MM-DDThh:mm:ss[.s][Z|(+|-)hh:mm]\n```\n\nwhere `T` and `Z` are literal and `.s` is one or more fractional seconds.","title":"ct_netconfc.xs_datetime/0","ref":"ct_netconfc.html#t:xs_datetime/0"},{"type":"module","doc":"Support in Common Test for running property-based tests.\n\nThis module helps running property-based tests in the `Common Test` framework.\nOne (or more) of the property testing tools\n\n- [QuickCheck](http://www.quviq.com),\n- [PropEr](https://proper-testing.github.io) or\n- [Triq](https://github.com/krestenkrab/triq)\n\nis assumed to be installed.\n\nThe idea with this module is to have a `Common Test` test suite calling a\nproperty testing tool with special property test suites as defined by that tool.\nThe tests are collected in the `test` directory of the application. The `test`\ndirectory has a subdirectory `property_test`, where everything needed for the\nproperty tests are collected. The usual Erlang application directory structure\nis assumed.\n\nA typical `Common Test` test suite using `ct_property_test` is organized as\nfollows:\n\n```erlang\n-module(my_prop_test_SUITE).\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\nall() -> [prop_ftp_case].\n\ninit_per_suite(Config) ->\n ct_property_test:init_per_suite(Config).\n\n%%%---- test case\nprop_ftp_case(Config) ->\n ct_property_test:quickcheck(\n ftp_simple_client_server:prop_ftp(),\n Config\n ).\n```\n\nand the the property test module (in this example\n`ftp_simple_client_server.erl`) as almost a usual property testing module (More\nexamples are in [the User's Guide](ct_property_test_chapter.md)):\n\n```erlang\n-module(ftp_simple_client_server).\n-export([prop_ftp/0...]).\n\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n\nprop_ftp() ->\n ?FORALL( ....\n```","title":"ct_property_test","ref":"ct_property_test.html"},{"type":"function","doc":"Returns a list of commands (function calls) generated in the `Cmnd` sequence,\nwithout Module, Arguments and other details.\n\nFor more information see: `present_result/5`.","title":"ct_property_test.cmnd_names/1","ref":"ct_property_test.html#cmnd_names/1"},{"type":"function","doc":"Initializes and extends `Config` for property based testing.\n\nThis function investigates if support is available for either\n[QuickCheck](http://www.quviq.com), [PropEr](https://proper-testing.github.io)\nor [Triq](https://github.com/krestenkrab/triq) and compiles the properties with\nthe first tool found. It is supposed to be called in the\n[`init_per_suite/1`](`init_per_suite/1`) function in a CommonTest test suite.\n\nWhich tools to check for, and in which order could be set with the option\n`{prop_tools, list(eqc|proper|triq)}` in the CommonTest configuration `Config`.\nThe default value is `[eqc, proper, triq]` with `eqc` being the first one\nsearched for.\n\nIf no support is found for any tool, this function returns\n`{skip, Explanation}`.\n\nIn case of other errors, this function returns\n`{fail, Explanation}`.\n\nIf support is found, the option `{property_test_tool,ToolModule}` with the\nselected tool main module name (`eqc`, `proper` or `triq`) is added to the list\n`Config` which then is returned.\n\nThe property tests are assumed to be in a subdirectory named `property_test`.\nAll found Erlang files in that directory are compiled with one of the macros\n`'EQC'`, `'PROPER'` or `'TRIQ'` set, depending on which tool that is first\nfound. This could make parts of the Erlang property tests code to be included or\nexcluded with the macro directives `-ifdef(Macro).` or `-ifndef(Macro).`.\n\nThe file(s) in the `property_test` subdirectory could, or should, include the\nct_property_test include file:\n\n```erlang\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n```\n\nThis included file will:\n\n- Include the correct tool's include file\n- Set the macro `'MOD_eqc'` to the correct module name for the selected tool.\n That is, the macro `'MOD_eqc'` is set to either `eqc`, `proper` or `triq`.","title":"ct_property_test.init_per_suite/1","ref":"ct_property_test.html#init_per_suite/1"},{"type":"function","doc":"Returns number of command calls in a test case.\n\nFor more information see: `present_result/5`.","title":"ct_property_test.num_calls/1","ref":"ct_property_test.html#num_calls/1"},{"type":"function","doc":"","title":"ct_property_test.present_result/4","ref":"ct_property_test.html#present_result/4"},{"type":"function","doc":"Presents the result of _stateful (statem) property testing_ using the aggregate\nfunction in PropEr, QuickCheck or other similar property testing tool.\n\nIt is assumed to be called inside the property called by `quickcheck/2`:\n\n```erlang\n...\nRunResult = run_parallel_commands(?MODULE, Cmds),\nct_property_test:present_result(?MODULE, Cmds, RunResult, Config)\n...\n```\n\nSee the [User's Guide](ct_property_test_chapter.md#stateful1) for an example of\nthe usage and of the default printout.\n\nThe `StatisticsSpec` is a list of the tuples:\n\n- `{Title::string(), CollectFun::fun/1}`\n- `{Title::string(), FrequencyFun::/0, CollectFun::fun/1}`\n\nEach tuple will produce one table in the order of their places in the list.\n\n- `Title` will be the title of one result table\n- `CollectFun` is called with one argument: the `Cmds`. It should return a list\n of the values to be counted. The following pre-defined functions exist:\n - `ct_property_test:cmnd_names/1` returns a list of commands (function calls)\n generated in the `Cmnd` sequence, without Module, Arguments and other\n details.\n - `ct_property_test:num_calls/1` returns a list of the length of commands\n lists\n - `ct_property_test:sequential_parallel/1` returns a list with information\n about sequential and parallel parts from `Tool:parallel_commands/1,2`\n- `FrequencyFun/0` returns a fun/1 which is supposed to take a list of items as\n input, and return an iolist which will be printed as the table. Per default,\n the number of each item is counted and the percentage is printed for each. The\n list \\[a,b,a,a,c] could for example return\n\n ```erlang\n [\"a 60%\\n\",\"b 20%\\n\",\"c 20%\\n\"]\n ```\n\n which will be printed by the `print_fun`. The default `print_fun` will print\n it as:\n\n ```text\n a 60%\n b 20%\n c 20%\n ```\n\nThe default `StatisticsSpec` is:\n\n- For sequential commands:\n\n ```erlang\n [{\"Function calls\", fun cmnd_names/1},\n {\"Length of command sequences\", fun print_frequency_ranges/0,\n fun num_calls/1}]\n ```\n\n- For parallel commands:\n\n ```erlang\n [{\"Distribution sequential/parallel\", fun sequential_parallel/1},\n {\"Function calls\", fun cmnd_names/1},\n {\"Length of command sequences\", fun print_frequency_ranges/0,\n fun num_calls/1}]\n ```","title":"ct_property_test.present_result/5","ref":"ct_property_test.html#present_result/5"},{"type":"function","doc":"Calls the selected tool's function for running the `Property`. It is usually and\nby historical reasons called quickcheck, and that is why that name is used in\nthis module (`ct_property_test`).\n\nThe result is returned in a form suitable for `Common Test` test suites.\n\nThis function is intended to be called in test cases in test suites.","title":"ct_property_test.quickcheck/2","ref":"ct_property_test.html#quickcheck/2"},{"type":"function","doc":"Returns a list with information about sequential and parallel parts.\n\nFor more information see: `present_result/5`.","title":"ct_property_test.sequential_parallel/1","ref":"ct_property_test.html#sequential_parallel/1"},{"type":"type","doc":"","title":"ct_property_test.arguments/0","ref":"ct_property_test.html#t:arguments/0"},{"type":"type","doc":"","title":"ct_property_test.command/0","ref":"ct_property_test.html#t:command/0"},{"type":"type","doc":"","title":"ct_property_test.command_list/0","ref":"ct_property_test.html#t:command_list/0"},{"type":"type","doc":"","title":"ct_property_test.dynamic_state/0","ref":"ct_property_test.html#t:dynamic_state/0"},{"type":"type","doc":"","title":"ct_property_test.function_name/0","ref":"ct_property_test.html#t:function_name/0"},{"type":"type","doc":"","title":"ct_property_test.history/0","ref":"ct_property_test.html#t:history/0"},{"type":"type","doc":"","title":"ct_property_test.init_command/0","ref":"ct_property_test.html#t:init_command/0"},{"type":"type","doc":"","title":"ct_property_test.parallel_testcase/0","ref":"ct_property_test.html#t:parallel_testcase/0"},{"type":"type","doc":"","title":"ct_property_test.set_command/0","ref":"ct_property_test.html#t:set_command/0"},{"type":"type","doc":"","title":"ct_property_test.statem_result/0","ref":"ct_property_test.html#t:statem_result/0"},{"type":"type","doc":"","title":"ct_property_test.symbolic_call/0","ref":"ct_property_test.html#t:symbolic_call/0"},{"type":"type","doc":"","title":"ct_property_test.symbolic_state/0","ref":"ct_property_test.html#t:symbolic_state/0"},{"type":"type","doc":"","title":"ct_property_test.symbolic_var/0","ref":"ct_property_test.html#t:symbolic_var/0"},{"type":"module","doc":"`Common Test` specific layer on Erlang/OTP `rpc`.","title":"ct_rpc","ref":"ct_rpc.html"},{"type":"function","doc":"From a set of candidate nodes determines which of them is running the\napplication `App`. If none of the candidate nodes is running `App`, the function\nmakes the test case calling this function to fail. This function is the same as\ncalling [`app_node(App, Candidates, true)`](`app_node/3`).","title":"ct_rpc.app_node/2","ref":"ct_rpc.html#app_node/2"},{"type":"function","doc":"Same as [`ct_rpc:app_node/2`](`app_node/2`), except that argument `FailOnBadRPC`\ndetermines if the search for a candidate node is to stop if `badrpc` is received\nat some point.","title":"ct_rpc.app_node/3","ref":"ct_rpc.html#app_node/3"},{"type":"function","doc":"Same as [`ct_rpc:app_node/2`](`app_node/2`), except that argument `FailOnBadRPC`\ndetermines if the search for a candidate node is to stop if `badrpc` is received\nat some point.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","title":"ct_rpc.app_node/4","ref":"ct_rpc.html#app_node/4"},{"type":"function","doc":"","title":"ct_rpc.call/4","ref":"ct_rpc.html#call/4"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`.\nReturns either whatever `Function` returns, or `{badrpc, Reason}` if the remote\nprocedure call fails. If `Node` is `{Fun, FunArgs}`, applying `Fun` to `FunArgs`\nis to return a node name.","title":"ct_rpc.call/5","ref":"ct_rpc.html#call/5"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`.\nReturns either whatever `Function` returns, or `{badrpc, Reason}` if the remote\nprocedure call fails. If `Node` is `{Fun, FunArgs}`, applying `Fun` to `FunArgs`\nis to return a node name.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","title":"ct_rpc.call/6","ref":"ct_rpc.html#call/6"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`. No\nresponse is delivered and the process that makes the call is not suspended until\nthe evaluation is completed as in the case of `call/3,4`. If `Node` is\n`{Fun, FunArgs}`, applying `Fun` to `FunArgs` is to return a node name.","title":"ct_rpc.cast/4","ref":"ct_rpc.html#cast/4"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the node `Node`. No\nresponse is delivered and the process that makes the call is not suspended until\nthe evaluation is completed as in the case of `call/3,4`. If `Node` is\n`{Fun, FunArgs}`, applying `Fun` to `FunArgs` is to return a node name.\n\nThe cookie on the client node is set to `Cookie` for this `rpc` operation (used\nto match the server node cookie).","title":"ct_rpc.cast/5","ref":"ct_rpc.html#cast/5"},{"type":"module","doc":"`Common Test` framework functions for starting and stopping nodes for\nLarge-Scale Testing.\n\nThis module exports functions used by the `Common Test` Master to start and stop\n\"slave\" nodes. It is the default callback module for the `{init, node_start}`\nterm in the Test Specification.","title":"ct_slave","ref":"ct_slave.html"},{"type":"function","doc":"Starts an Erlang node with name `Node` on the local host.\n\nSee also [`ct_slave:start/3`](`start/3`).","title":"ct_slave.start/1","ref":"ct_slave.html#start/1"},{"type":"function","doc":"Starts an Erlang node with default options on a specified host, or on the local\nhost with specified options. That is, the call is interpreted as\n[`start(Host, Node)`](`start/2`) when the second argument is atom-valued and\n[`start(Node, Opts)`](`start/2`) when it is list-valued.\n\nSee also [`ct_slave:start/3`](`start/3`).","title":"ct_slave.start/2","ref":"ct_slave.html#start/2"},{"type":"function","doc":"Starts an Erlang node with name `Node` on host `Host` as specified by the\ncombination of options in `Opts`.\n\nOptions `Username` and `Password` are used to log on to the remote host `Host`.\n`Username`, if omitted, defaults to the current username. `Password` is empty by\ndefault.\n\nA list of functions specified in option `Startup` are executed after startup of\nthe node. Notice that all used modules are to be present in the code path on\n`Host`.\n\nThe time-outs are applied as follows:\n\n- **`BootTimeout`** - The time to start the Erlang node, in seconds. Defaults to\n 3 seconds. If the node is not pingable within this time, the result\n `{error, boot_timeout, NodeName}` is returned.\n\n- **`InitTimeout`** - The time to wait for the node until it calls the internal\n callback function informing master about a successful startup. Defaults to 1\n second. In case of a timed out message, the result\n `{error, init_timeout, NodeName}` is returned.\n\n- **`StartupTimeout`** - The time to wait until the node stops to run\n `StartupFunctions`. Defaults to 1 second. If this time-out occurs, the result\n `{error, startup_timeout, NodeName}` is returned.\n\n_Options:_\n\n- **`monitor_master`** - Specifies if the slave node is to be stopped if the\n master node stops. Defaults to `false`.\n\n- **`kill_if_fail`** - Specifies if the slave node is to be killed if a time-out\n occurs during initialization or startup. Defaults to `true`. Notice that the\n node can also be still alive it the boot time-out occurred, but it is not\n killed in this case.\n\n- **`erl_flags`** - Specifies which flags are added to the parameters of the\n executable `erl`.\n\n- **`env`** - Specifies a list of environment variables that will extend the\n environment.\n\n_Special return values:_\n\n- `{error, already_started, NodeName}` if the node with the specified name is\n already started on a specified host.\n- `{error, started_not_connected, NodeName}` if the node is started, but not\n connected to the master node.\n- `{error, not_alive, NodeName}` if the node on which\n [`ct_slave:start/3`](`start/3`) is called, is not alive. Notice that\n `NodeName` is the name of the current node in this case.","title":"ct_slave.start/3","ref":"ct_slave.html#start/3"},{"type":"function","doc":"Stops the running Erlang node with name `Node` on the local host.","title":"ct_slave.stop/1","ref":"ct_slave.html#stop/1"},{"type":"function","doc":"Stops the running Erlang node with name `Node` on host `Host`.","title":"ct_slave.stop/2","ref":"ct_slave.html#stop/2"},{"type":"type","doc":"Options used for starting `ct_slave` node.","title":"ct_slave.start_options/0","ref":"ct_slave.html#t:start_options/0"},{"type":"type","doc":"Options used for stopping `ct_slave` node.","title":"ct_slave.stop_options/0","ref":"ct_slave.html#t:stop_options/0"},{"type":"module","doc":"`Common Test` user interface module for the `SNMP` application.\n\nThe purpose of this module is to simplify SNMP configuration for the test case\nwriter. Many test cases can use default values for common operations and then no\nSNMP configuration files need to be supplied. When it is necessary to change\nparticular configuration parameters, a subset of the relevant SNMP configuration\nfiles can be passed to `ct_snmp` by `Common Test` configuration files. For more\nspecialized configuration parameters, a simple SNMP configuration file can be\nplaced in the test suite data directory. To simplify the test suite,\n`Common Test` keeps track of some of the SNMP manager information. This way the\ntest suite does not have to handle as many input parameters as if it had to\ninterface wthe OTP SNMP manager directly.\n\n_Configurable SNMP Manager and Agent Parameters:_\n\nManager configuration:\n\n- **`[{start_manager, boolean()}`** - Optional. Default is `true`.\n\n- **`{users, [{user_name(), [call_back_module(), user_data()]}]}`** - Optional.\n\n- **`{usm_users, [{usm_user_name(), [usm_config()]}]}`** - Optional. SNMPv3\n only.\n\n- **`{managed_agents,[{agent_name(), [user_name(), agent_ip(), agent_port(), [agent_config()]]}]}`** -\n `managed_agents` is optional.\n\n- **`{max_msg_size, integer()}`** - Optional. Default is `484`.\n\n- **`{mgr_port, integer()}`** - Optional. Default is `5000`.\n\n- **`{engine _id, string()}`** - Optional. Default is `\"mgrEngine\"`.\n\nAgent configuration:\n\n- **`{start_agent, boolean()}`** - Optional. Default is `false`.\n\n- **`{agent_sysname, string()}`** - Optional. Default is `\"ct_test\"`.\n\n- **`{agent_manager_ip, manager_ip()}`** - Optional. Default is `localhost`.\n\n- **`{agent_vsns, list()}`** - Optional. Default is `[v2]`.\n\n- **`{agent_trap_udp, integer()}`** - Optional. Default is `5000`.\n\n- **`{agent_udp, integer()}`** - Optional. Default is `4000`.\n\n- **`{agent_notify_type, atom()}`** - Optional. Default is `trap`.\n\n- **`{agent_sec_type, sec_type()}`** - Optional. Default is `none`.\n\n- **`{agent_passwd, string()}`** - Optional. Default is `\"\"`.\n\n- **`{agent_engine_id, string()}`** - Optional. Default is `\"agentEngine\"`.\n\n- **`{agent_max_msg_size, string()}`** - Optional. Default is `484`.\n\nThe following parameters represents the SNMP configuration files `context.conf`,\n`standard.conf`, `community.conf`, `vacm.conf`, `usm.conf`, `notify.conf`,\n`target_addr.conf`, and `target_params.conf`. Notice that all values in\n`agent.conf` can be modified by the parameters listed above. All these\nconfiguration files have default values set by the `SNMP` application. These\nvalues can be overridden by suppling a list of valid configuration values or a\nfile located in the test suites data directory, which can produce a list of\nvalid configuration values if you apply function `file:consult/1` to the file.\n\n- **`{agent_contexts, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_community, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_sysinfo, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_vacm, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_usm, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_notify_def, [term()] | {data_dir_file, rel_path()}}`** - Optional.\n\n- **`{agent_target_address_def, [term()] | {data_dir_file, rel_path()}}`** -\n Optional.\n\n- **`{agent_target_param_def, [term()] | {data_dir_file, rel_path()}}`** -\n Optional.\n\nParameter `MgrAgentConfName` in the functions is to be a name you allocate in\nyour test suite using a `require` statement. Example (where\n`MgrAgentConfName = snmp_mgr_agent`):\n\n```erlang\nsuite() -> [{require, snmp_mgr_agent, snmp}].\n```\n\nor\n\n```erlang\nct:require(snmp_mgr_agent, snmp).\n```\n\nNotice that USM users are needed for SNMPv3 configuration and are not to be\nconfused with users.\n\nSNMP traps, inform, and report messages are handled by the user callback module.\nFor details, see the [`SNMP`](`e:snmp:index.html`) application.\n\nIt is recommended to use the `.hrl` files created by the Erlang/OTP MIB compiler\nto define the Object Identifiers (OIDs). For example, to get the Erlang node\nname from `erlNodeTable` in the OTP-MIB:\n\n```erlang\nOid = ?erlNodeEntry ++ [?erlNodeName, 1]\n```\n\nFurthermore, values can be set for `SNMP` application configuration parameters,\n`config`, `server`, `net_if`, and so on (for a list of valid parameters and\ntypes, see the [`User's Guide for the SNMP application`](`e:snmp:index.html`)).\nThis is done by defining a configuration data variable on the following form:\n\n```erlang\n{snmp_app, [{manager, [snmp_app_manager_params()]},\n {agent, [snmp_app_agent_params()]}]}.\n```\n\nA name for the data must be allocated in the suite using `require` (see the\nexample above). Pass this name as argument `SnmpAppConfName` to\n[`ct_snmp:start/3`](`start/3`). `ct_snmp` specifies default values for some\n`SNMP` application configuration parameters (such as `{verbosity,trace}` for\nparameter `config`). This set of defaults is merged with the parameters\nspecified by the user. The user values override `ct_snmp` defaults.","title":"ct_snmp","ref":"ct_snmp.html"},{"type":"function","doc":"Issues a synchronous SNMP `get next` request.","title":"ct_snmp.get_next_values/3","ref":"ct_snmp.html#get_next_values/3"},{"type":"function","doc":"Issues a synchronous SNMP `get` request.","title":"ct_snmp.get_values/3","ref":"ct_snmp.html#get_values/3"},{"type":"function","doc":"Loads the MIBs into agent `snmp_master_agent`.","title":"ct_snmp.load_mibs/1","ref":"ct_snmp.html#load_mibs/1"},{"type":"function","doc":"Explicitly instructs the manager to handle this agent. Corresponds to making an\nentry in `agents.conf`.\n\nThis function tries to register the specified managed agents, without checking\nif any of them exist. To change a registered managed agent, the agent must first\nbe unregistered.","title":"ct_snmp.register_agents/2","ref":"ct_snmp.html#register_agents/2"},{"type":"function","doc":"Registers the manager entity (=user) responsible for specific agent(s).\nCorresponds to making an entry in `users.conf`.\n\nThis function tries to register the specified users, without checking if any of\nthem exist. To change a registered user, the user must first be unregistered.","title":"ct_snmp.register_users/2","ref":"ct_snmp.html#register_users/2"},{"type":"function","doc":"Explicitly instructs the manager to handle this USM user. Corresponds to making\nan entry in `usm.conf`.\n\nThis function tries to register the specified users, without checking if any of\nthem exist. To change a registered user, the user must first be unregistered.","title":"ct_snmp.register_usm_users/2","ref":"ct_snmp.html#register_usm_users/2"},{"type":"function","doc":"Returns a list of all successful `set` requests performed in the test case in\nreverse order. The list contains the involved user and agent, the value before\n`set`, and the new value. This is intended to simplify the cleanup in function\n`end_per_testcase`, that is, the undoing of the `set` requests and their\npossible side-effects.","title":"ct_snmp.set_info/1","ref":"ct_snmp.html#set_info/1"},{"type":"function","doc":"Issues a synchronous SNMP `set` request.","title":"ct_snmp.set_values/4","ref":"ct_snmp.html#set_values/4"},{"type":"function","doc":"","title":"ct_snmp.start/2","ref":"ct_snmp.html#start/2"},{"type":"function","doc":"Starts an SNMP manager and/or agent. In the manager case, registrations of users\nand agents, as specified by the configuration `MgrAgentConfName`, are performed.\nWhen using SNMPv3, called USM users are also registered. Users, `usm_users`, and\nmanaged agents can also be registered later using\n[`ct_snmp:register_users/2`](`register_users/2`),\n[`ct_snmp:register_agents/2`](`register_agents/2`), and\n[`ct_snmp:register_usm_users/2`](`register_usm_users/2`).\n\nThe agent started is called `snmp_master_agent`. Use\n[`ct_snmp:load_mibs/1`](`load_mibs/1`) to load MIBs into the agent.\n\nWith `SnmpAppConfName` SNMP applications can be configured with parameters\n`config`, `mibs`, `net_if`, and so on. The values are merged with (and possibly\noverride) default values set by `ct_snmp`.","title":"ct_snmp.start/3","ref":"ct_snmp.html#start/3"},{"type":"function","doc":"Stops the SNMP manager and/or agent, and removes all files created.","title":"ct_snmp.stop/1","ref":"ct_snmp.html#stop/1"},{"type":"function","doc":"Unloads the MIBs from agent `snmp_master_agent`.","title":"ct_snmp.unload_mibs/1","ref":"ct_snmp.html#unload_mibs/1"},{"type":"function","doc":"Unregisters all managed agents.","title":"ct_snmp.unregister_agents/1","ref":"ct_snmp.html#unregister_agents/1"},{"type":"function","doc":"Unregisters the specified managed agents.","title":"ct_snmp.unregister_agents/2","ref":"ct_snmp.html#unregister_agents/2"},{"type":"function","doc":"Unregisters all users.","title":"ct_snmp.unregister_users/1","ref":"ct_snmp.html#unregister_users/1"},{"type":"function","doc":"Unregisters the specified users.","title":"ct_snmp.unregister_users/2","ref":"ct_snmp.html#unregister_users/2"},{"type":"function","doc":"Unregisters all USM users.","title":"ct_snmp.unregister_usm_users/1","ref":"ct_snmp.html#unregister_usm_users/1"},{"type":"function","doc":"Unregisters the specified USM users.","title":"ct_snmp.unregister_usm_users/2","ref":"ct_snmp.html#unregister_usm_users/2"},{"type":"type","doc":"","title":"ct_snmp.agent_config/0","ref":"ct_snmp.html#t:agent_config/0"},{"type":"type","doc":"","title":"ct_snmp.agent_ip/0","ref":"ct_snmp.html#t:agent_ip/0"},{"type":"type","doc":"","title":"ct_snmp.agent_name/0","ref":"ct_snmp.html#t:agent_name/0"},{"type":"type","doc":"","title":"ct_snmp.agent_port/0","ref":"ct_snmp.html#t:agent_port/0"},{"type":"type","doc":"","title":"ct_snmp.call_back_module/0","ref":"ct_snmp.html#t:call_back_module/0"},{"type":"type","doc":"","title":"ct_snmp.error_index/0","ref":"ct_snmp.html#t:error_index/0"},{"type":"type","doc":"","title":"ct_snmp.error_status/0","ref":"ct_snmp.html#t:error_status/0"},{"type":"type","doc":"","title":"ct_snmp.ip/0","ref":"ct_snmp.html#t:ip/0"},{"type":"type","doc":"","title":"ct_snmp.manager_ip/0","ref":"ct_snmp.html#t:manager_ip/0"},{"type":"type","doc":"","title":"ct_snmp.oid/0","ref":"ct_snmp.html#t:oid/0"},{"type":"type","doc":"","title":"ct_snmp.oids/0","ref":"ct_snmp.html#t:oids/0"},{"type":"type","doc":"","title":"ct_snmp.rel_path/0","ref":"ct_snmp.html#t:rel_path/0"},{"type":"type","doc":"","title":"ct_snmp.sec_type/0","ref":"ct_snmp.html#t:sec_type/0"},{"type":"type","doc":"","title":"ct_snmp.snmp_app_agent_params/0","ref":"ct_snmp.html#t:snmp_app_agent_params/0"},{"type":"type","doc":"","title":"ct_snmp.snmp_app_manager_params/0","ref":"ct_snmp.html#t:snmp_app_manager_params/0"},{"type":"type","doc":"","title":"ct_snmp.snmpreply/0","ref":"ct_snmp.html#t:snmpreply/0"},{"type":"type","doc":"","title":"ct_snmp.user_data/0","ref":"ct_snmp.html#t:user_data/0"},{"type":"type","doc":"","title":"ct_snmp.user_name/0","ref":"ct_snmp.html#t:user_name/0"},{"type":"type","doc":"","title":"ct_snmp.usm_config/0","ref":"ct_snmp.html#t:usm_config/0"},{"type":"type","doc":"","title":"ct_snmp.usm_user_name/0","ref":"ct_snmp.html#t:usm_user_name/0"},{"type":"type","doc":"","title":"ct_snmp.value_type/0","ref":"ct_snmp.html#t:value_type/0"},{"type":"type","doc":"","title":"ct_snmp.var_and_val/0","ref":"ct_snmp.html#t:var_and_val/0"},{"type":"type","doc":"","title":"ct_snmp.varbind/0","ref":"ct_snmp.html#t:varbind/0"},{"type":"type","doc":"","title":"ct_snmp.varbinds/0","ref":"ct_snmp.html#t:varbinds/0"},{"type":"type","doc":"These data types are described in the documentation for the\n[`SNMP`](`e:snmp:index.html`) application.","title":"ct_snmp.varsandvals/0","ref":"ct_snmp.html#t:varsandvals/0"},{"type":"module","doc":"SSH/SFTP client module.\n\nThis module uses application `SSH`, which provides detailed information about,\nfor example, functions, types, and options.\n\nArgument `Server` in the SFTP functions is only to be used for SFTP sessions\nthat have been started on existing SSH connections (that is, when the original\nconnection type is `ssh`). Whenever the connection type is `sftp`, use the SSH\nconnection reference only.\n\nThe following options are valid for specifying an SSH/SFTP connection (that is,\ncan be used as configuration elements):\n\n```erlang\n[{ConnType, Addr},\n {port, Port},\n {user, UserName}\n {password, Pwd}\n {user_dir, String}\n {public_key_alg, PubKeyAlg}\n {connect_timeout, Timeout}\n {key_cb, KeyCallbackMod}]\n```\n\n`ConnType = ssh | sftp`.\n\nFor other types, see `m:ssh`.\n\nAll time-out parameters in `ct_ssh` functions are values in milliseconds.","title":"ct_ssh","ref":"ct_ssh.html"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.apread/4","ref":"ct_ssh.html#apread/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.apread/5","ref":"ct_ssh.html#apread/5"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.apwrite/4","ref":"ct_ssh.html#apwrite/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.apwrite/5","ref":"ct_ssh.html#apwrite/5"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.aread/3","ref":"ct_ssh.html#aread/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.aread/4","ref":"ct_ssh.html#aread/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.awrite/3","ref":"ct_ssh.html#awrite/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.awrite/4","ref":"ct_ssh.html#awrite/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.close/2","ref":"ct_ssh.html#close/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.close/3","ref":"ct_ssh.html#close/3"},{"type":"function","doc":"","title":"ct_ssh.connect/1","ref":"ct_ssh.html#connect/1"},{"type":"function","doc":"Opens an SSH or SFTP connection using the information associated with `KeyOrName`\n(see `connect/3`).\n\nEquivalent to [`connect(KeyOrName, ConnType, [])`](`connect/3`) if\ncalled with ConnType being atom.\n\nEquivalent to [`connect(KeyOrName, host, ExtraOpts)`](`connect/3`) if\ncalled with ExtraOpts being list.","title":"ct_ssh.connect/2","ref":"ct_ssh.html#connect/2"},{"type":"function","doc":"Opens an SSH or SFTP connection using the information associated with\n`KeyOrName`.\n\nIf `Name` (an alias name for `Key`) is used to identify the connection, this\nname can be used as connection reference for subsequent calls. Only one open\nconnection at a time associated with `Name` is possible. If `Key` is used, the\nreturned handle must be used for subsequent calls (multiple connections can be\nopened using the configuration data specified by `Key`).\n\nFor information on how to create a new `Name`, see `ct:require/2`.\n\n`ConnType` always overrides the type specified in the address tuple in the\nconfiguration data (and in `ExtraOpts`). So it is possible to, for example, open\nan SFTP connection directly using data originally specifying an SSH connection.\nValue `host` means that the connection type specified by the host option (either\nin the configuration data or in `ExtraOpts`) is used.\n\n`ExtraOpts` (optional) are extra SSH options to be added to the configuration\ndata for `KeyOrName`. The extra options override any existing options with the\nsame key in the configuration data. For details on valid SSH options, see\napplication [`SSH`](`e:ssh:index.html`).","title":"ct_ssh.connect/3","ref":"ct_ssh.html#connect/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.del_dir/2","ref":"ct_ssh.html#del_dir/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.del_dir/3","ref":"ct_ssh.html#del_dir/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.delete/2","ref":"ct_ssh.html#delete/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.delete/3","ref":"ct_ssh.html#delete/3"},{"type":"function","doc":"Closes an SSH/SFTP connection.","title":"ct_ssh.disconnect/1","ref":"ct_ssh.html#disconnect/1"},{"type":"function","doc":"","title":"ct_ssh.exec/2","ref":"ct_ssh.html#exec/2"},{"type":"function","doc":"Requests server to perform `Command`, (see `exec/4`).\n\nEquivalent to [`exec(SSH, undefined, Command, Timeout)`](`exec/4`) if\ncalled with Command being string.\n\nEquivalent to [`exec(SSH, ChannelId, Command, DefaultTimeout)`](`exec/4`) if\ncalled with ChannelId being integer.","title":"ct_ssh.exec/3","ref":"ct_ssh.html#exec/3"},{"type":"function","doc":"Requests server to perform `Command`. A previously opened session channel is\nused for the request. `Data` is received from the server as a result of the\ncommand.","title":"ct_ssh.exec/4","ref":"ct_ssh.html#exec/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.get_file_info/2","ref":"ct_ssh.html#get_file_info/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.get_file_info/3","ref":"ct_ssh.html#get_file_info/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.list_dir/2","ref":"ct_ssh.html#list_dir/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.list_dir/3","ref":"ct_ssh.html#list_dir/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.make_dir/2","ref":"ct_ssh.html#make_dir/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.make_dir/3","ref":"ct_ssh.html#make_dir/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.make_symlink/3","ref":"ct_ssh.html#make_symlink/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.make_symlink/4","ref":"ct_ssh.html#make_symlink/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.open/3","ref":"ct_ssh.html#open/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.open/4","ref":"ct_ssh.html#open/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.opendir/2","ref":"ct_ssh.html#opendir/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.opendir/3","ref":"ct_ssh.html#opendir/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.position/3","ref":"ct_ssh.html#position/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.position/4","ref":"ct_ssh.html#position/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.pread/4","ref":"ct_ssh.html#pread/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.pread/5","ref":"ct_ssh.html#pread/5"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.pwrite/4","ref":"ct_ssh.html#pwrite/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.pwrite/5","ref":"ct_ssh.html#pwrite/5"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read/3","ref":"ct_ssh.html#read/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read/4","ref":"ct_ssh.html#read/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_file/2","ref":"ct_ssh.html#read_file/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_file/3","ref":"ct_ssh.html#read_file/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_file_info/2","ref":"ct_ssh.html#read_file_info/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_file_info/3","ref":"ct_ssh.html#read_file_info/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_link/2","ref":"ct_ssh.html#read_link/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_link/3","ref":"ct_ssh.html#read_link/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_link_info/2","ref":"ct_ssh.html#read_link_info/2"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.read_link_info/3","ref":"ct_ssh.html#read_link_info/3"},{"type":"function","doc":"","title":"ct_ssh.receive_response/2","ref":"ct_ssh.html#receive_response/2"},{"type":"function","doc":"Receives expected data from server on the specified session channel\n(see `receive_response/4`).\n\nEquivalent to [`receive_response(SSH, ChannelId, End, DefaultTimeout)`](`receive_response/4`) if\ncalled with End being function.\n\nEquivalent to [`receive_response(SSH, ChannelId, close, Timeout)`](`receive_response/4`) if\ncalled with Timeout being integer.","title":"ct_ssh.receive_response/3","ref":"ct_ssh.html#receive_response/3"},{"type":"function","doc":"Receives expected data from server on the specified session channel.\n\nIf `End == close`, data is returned to the caller when the channel is closed by\nthe server. If a time-out occurs before this happens, the function returns\n`{timeout,Data}` (where `Data` is the data received so far).\n\nIf `End == timeout`, a time-out is expected and `{ok,Data}` is returned both in\nthe case of a time-out and when the channel is closed.\n\nIf `End` is a fun, this fun is called with one argument, the data value in a\nreceived `ssh_cm` message (see `m:ssh_connection`. The fun is to return either\n`true` to end the receiving operation (and have the so far collected data\nreturned) or `false` to wait for more data from the server. Even if a fun is\nsupplied, the function returns immediately if the server closes the channel).","title":"ct_ssh.receive_response/4","ref":"ct_ssh.html#receive_response/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.rename/3","ref":"ct_ssh.html#rename/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.rename/4","ref":"ct_ssh.html#rename/4"},{"type":"function","doc":"","title":"ct_ssh.send/3","ref":"ct_ssh.html#send/3"},{"type":"function","doc":"Sends data to server on specified session channel (see `send/5`).\n\nEquivalent to [`send(SSH, ChannelId, 0, Data, Timeout)`](`send/5`) if\ncalled with Timeout being integer.\n\nEquivalent to [`send(SSH, ChannelId, Type, Data, DefaultTimeout)`](`send/5`) if\ncalled with Type being integer.","title":"ct_ssh.send/4","ref":"ct_ssh.html#send/4"},{"type":"function","doc":"Sends data to server on specified session channel.","title":"ct_ssh.send/5","ref":"ct_ssh.html#send/5"},{"type":"function","doc":"","title":"ct_ssh.send_and_receive/3","ref":"ct_ssh.html#send_and_receive/3"},{"type":"function","doc":"Sends data to server on specified session channel and waits to receive the\nserver response (see `send_and_receive/6`).\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, End, DefaultTimeout)`](`send_and_receive/6`)\nif called with End being function.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, close, Timeout)`](`send_and_receive/6`)\nif called with Timeout being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, close, DefaultTimeout)`](`send_and_receive/6`)\nif called with Type being integer.","title":"ct_ssh.send_and_receive/4","ref":"ct_ssh.html#send_and_receive/4"},{"type":"function","doc":"Sends data to server on specified session channel and waits to receive the\nserver response (see `send_and_receive/6`).\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, 0, Data, End, Timeout)`](`send_and_receive/6`) if\ncalled with Timeout being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, close, Timeout)`](`send_and_receive/6`) if\ncalled with Type being integer.\n\nEquivalent to\n[`send_and_receive(SSH, ChannelId, Type, Data, End, DefaultTimeout)`](`send_and_receive/6`) if\ncalled with End being function.","title":"ct_ssh.send_and_receive/5","ref":"ct_ssh.html#send_and_receive/5"},{"type":"function","doc":"Sends data to server on specified session channel and waits to receive the\nserver response.\n\nFor details on argument `End`, see\n[`ct_ssh:receive_response/4`](`receive_response/4`).","title":"ct_ssh.send_and_receive/6","ref":"ct_ssh.html#send_and_receive/6"},{"type":"function","doc":"Closes an SSH session channel.","title":"ct_ssh.session_close/2","ref":"ct_ssh.html#session_close/2"},{"type":"function","doc":"","title":"ct_ssh.session_open/1","ref":"ct_ssh.html#session_open/1"},{"type":"function","doc":"Opens a channel for an SSH session.","title":"ct_ssh.session_open/2","ref":"ct_ssh.html#session_open/2"},{"type":"function","doc":"Starts an SFTP session on an already existing SSH connection. `Server`\nidentifies the new session and must be specified whenever SFTP requests are to\nbe sent.","title":"ct_ssh.sftp_connect/1","ref":"ct_ssh.html#sftp_connect/1"},{"type":"function","doc":"","title":"ct_ssh.shell/2","ref":"ct_ssh.html#shell/2"},{"type":"function","doc":"Requests that the user's default shell (typically defined in `/etc/passwd` in Unix\nsystems) is executed at the server end.","title":"ct_ssh.shell/3","ref":"ct_ssh.html#shell/3"},{"type":"function","doc":"","title":"ct_ssh.subsystem/3","ref":"ct_ssh.html#subsystem/3"},{"type":"function","doc":"Sends a request to execute a predefined subsystem.","title":"ct_ssh.subsystem/4","ref":"ct_ssh.html#subsystem/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write/3","ref":"ct_ssh.html#write/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write/4","ref":"ct_ssh.html#write/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write_file/3","ref":"ct_ssh.html#write_file/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write_file/4","ref":"ct_ssh.html#write_file/4"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write_file_info/3","ref":"ct_ssh.html#write_file_info/3"},{"type":"function","doc":"For information and other types, see `m:ssh_sftp`.","title":"ct_ssh.write_file_info/4","ref":"ct_ssh.html#write_file_info/4"},{"type":"type","doc":"Reference to opened SSH/SFTP connection associated to either a `handle` or `target_name`.","title":"ct_ssh.connection/0","ref":"ct_ssh.html#t:connection/0"},{"type":"type","doc":"Connection type used for connect.","title":"ct_ssh.connection_type/0","ref":"ct_ssh.html#t:connection_type/0"},{"type":"type","doc":"Handle for a specific SSH/SFTP connection, see module `m:ct`.","title":"ct_ssh.handle/0","ref":"ct_ssh.html#t:handle/0"},{"type":"type","doc":"Data type representing a channel inside a connection.\n\n\"For `ssh_channel_id`, see module `m:ssh`.\".","title":"ct_ssh.ssh_channel_id/0","ref":"ct_ssh.html#t:ssh_channel_id/0"},{"type":"type","doc":"The valid values are `0` (\"normal\") and `1` (\"stderr\"), see\n[RFC 4254, Section 5.2](https://tools.ietf.org/html/rfc4254#page-8).","title":"ct_ssh.ssh_data_type_code/0","ref":"ct_ssh.html#t:ssh_data_type_code/0"},{"type":"behaviour","doc":"The following section describes the mandatory and optional test suite functions\nthat `Common Test` calls during test execution. For more details, see section\n[Writing Test Suites](write_test_chapter.md) in the User's Guide.","title":"ct_suite","ref":"ct_suite.html"},{"type":"callback","doc":"Returns the list of all test cases and test case groups in the test suite module\nto be executed.\n\nThis list also specifies the order the cases and groups are\nexecuted by `Common Test`. A test case is represented by an atom, the name of\nthe test case function, or a `testcase` tuple indicating that the test case\nshall be repeated. A test case group is represented by a `group` tuple, where\n`GroupName`, an atom, is the name of the group (defined in\n[`Module:groups/0`](`c:groups/0`)). Execution properties for groups can also be\nspecified, both for a top-level group and for any of its subgroups. Group\nexecution properties specified here override properties in the group definition\n(see [`Module:groups/0`](`c:groups/0`)). (With value `default`, the group\ndefinition properties are used).\n\nIf `{skip, Reason}` is returned, all test cases in the module are skipped and\n`Reason` is printed on the HTML result page.\n\nFor details on groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.","title":"ct_suite.all/0","ref":"ct_suite.html#c:all/0"},{"type":"callback","doc":"This function is called after the execution of a test case group is finished. It\nis meant to be used for cleaning up after [`Module:init_per_group/2`](`c:init_per_group/2`).\n\nA status value for a nested subgroup can be returned with `{return_group_result, Status}`.\nThe status can be retrieved in [`Module:end_per_group/2`](`c:end_per_group/2`) for the group on\nthe level above. The status is also used by `Common Test` for deciding if\nexecution of a group is to proceed if property `sequence` or `repeat_until_*` is\nset.\n\nFor details about test case groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.\n\nIf this function is defined, then\n[`Module:init_per_group/2`](`c:init_per_group/2`) must also be defined.","title":"ct_suite.end_per_group/2","ref":"ct_suite.html#c:end_per_group/2"},{"type":"callback","doc":"This function is called as the last test case in the suite. It is meant to be\nused for cleaning up after [`Module:init_per_suite/1`](`c:init_per_suite/1`).\n\nFor information on `save_config`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:init_per_suite/1`](`c:init_per_suite/1`) must also be defined.","title":"ct_suite.end_per_suite/1","ref":"ct_suite.html#c:end_per_suite/1"},{"type":"callback","doc":"This function is called after each test case, and can be used to clean up after\n[`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and the test case.\n\nAny return value (besides `{fail, Reason}` and `{save_config, SaveConfig}`) is\nignored. By returning `{fail, Reason}`, `TestCase` is marked as faulty (even\nthough it was successful in the sense that it returned a value instead of\nterminating).\n\nFor information on `save_config`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:init_per_testcase/2`](`c:init_per_testcase/2`) must also be defined.","title":"ct_suite.end_per_testcase/2","ref":"ct_suite.html#c:end_per_testcase/2"},{"type":"callback","doc":"The test case group information function. It is supposed to return a list of\ntagged tuples that specify various properties related to the execution of a test\ncase group (that is, its test cases and subgroups). Properties set by\n[`Module:group/1`](`c:group/1`) override properties with the same key that have\nbeen set previously by [`Module:suite/0`](`c:suite/0`).\n\nTag `timetrap` sets the maximum time that each test case is allowed to execute\n(including [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`)). If the timetrap time is\nexceeded, the test case fails with reason `timetrap_timeout`. A `TimeFunc`\nfunction can be used to set a new timetrap by returning a `TimeVal`. It can also\nbe used to trigger a timetrap time-out by, at some point, returning a value\nother than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables required by test cases (or\nconfiguration functions) in the suite. If the required configuration variables\nare not found in any of the configuration files, all test cases in this group\nare skipped. For details about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nWith `userdata`, the user can specify any test case group related information\nthat can be read by calling `ct:userdata/2`.\n\nTag `ct_hooks` specifies the [Common Test Hooks](ct_hooks_chapter.md) to be run\nwith this suite.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test case group information function, see section\n[Group Information Function](write_test_chapter.md#group_info) in the User's\nGuide.","title":"ct_suite.group/1","ref":"ct_suite.html#c:group/1"},{"type":"callback","doc":"Defines test case groups. For details, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.","title":"ct_suite.groups/0","ref":"ct_suite.html#c:groups/0"},{"type":"callback","doc":"This configuration function is called before execution of a test case group. It\ntypically contains initializations that are common for all test cases and\nsubgroups in the group, and that must only be performed once.\n\n`GroupName` is the name of the group, as specified in the group definition (see\n[`Module:groups/0`](`c:groups/0`)). Parameter `Config` is the configuration data\nthat can be modified. The return value of this function is given as `Config` to\nall test cases and subgroups in the group.\n\nIf `{skip, Reason}` is returned, all test cases in the group are skipped and\n`Reason` is printed in the overview log for the group.\n\nFor information about test case groups, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups) in the User's Guide.\n\nIf this function is defined, then\n[`Module:end_per_group/2`](`c:end_per_group/2`) must also be defined.","title":"ct_suite.init_per_group/2","ref":"ct_suite.html#c:init_per_group/2"},{"type":"callback","doc":"This configuration function is called as the first function in the suite. It\ntypically contains initializations that are common for all test cases in the\nsuite, and that must only be done once.\n\nParameter `Config` is the configuration\ndata that can be modified. Whatever is returned from this function is specified\nas `Config` to all configuration functions and test cases in the suite.\n\nIf `{skip, Reason}` is returned, all test cases in the suite are skipped and\n`Reason` is printed in the overview log for the suite.\n\nFor information on `save_config` and `skip_and_save`, see section\n[Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\nGuide.\n\nIf this function is defined, then\n[`Module:end_per_suite/1`](`c:end_per_suite/1`) must also be defined.","title":"ct_suite.init_per_suite/1","ref":"ct_suite.html#c:init_per_suite/1"},{"type":"callback","doc":"This function is called before each test case.\n\nArgument `TestCase` is the test case name, and `Config` (list of key-value tuples)\nis the configuration data that can be modified. The `NewConfig` list returned from this\nfunction is given as `Config` to the test case.\n\nIf `{fail, Reason}` is returned, the test case is marked as failed without being executed.\n\nIf `{skip, Reason}` is returned, the test case is skipped and `Reason` is\nprinted in the overview log for the suite.\n\nIf this function is defined, then\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`) must also be defined.","title":"ct_suite.init_per_testcase/2","ref":"ct_suite.html#c:init_per_testcase/2"},{"type":"callback","doc":"The test suite information function. Returns a list of tagged tuples specifying\nvarious properties related to the execution of this test suite (common for all\ntest cases in the suite).\n\nTag `timetrap` sets the maximum time that each test case is allowed to execute\n(including [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`)). If the timetrap time is\nexceeded, the test case fails with reason `timetrap_timeout`. A `TimeFunc`\nfunction can be used to set a new timetrap by returning a `TimeVal`. It can also\nbe used to trigger a timetrap time-out by, at some point, returning a value\nother than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables required by test cases (or\nconfiguration functions) in the suite. If the required configuration variables\nare not found in any of the configuration files, all test cases are skipped. For\ndetails about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nWith `userdata`, the user can specify any test suite-related information, which\ncan be read by calling `ct:userdata/2`.\n\nTag `ct_hooks` specifies the [Common Test Hooks](ct_hooks_chapter.md) to be run\nwith this suite.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test suite information function, see section\n[Test Suite Information Function](write_test_chapter.md#suite) in the User's\nGuide.","title":"ct_suite.suite/0","ref":"ct_suite.html#c:suite/0"},{"type":"callback","doc":"The test case information function. It is supposed to return a list of tagged\ntuples that specify various properties related to the execution of this\nparticular test case. Properties set by [`Module:Testcase/0`](`c:'Testcase'/0`)\noverride properties set previously for the test case by\n[`Module:group/1`](`c:group/1`) or [`Module:suite/0`](`c:suite/0`).\n\nTag `timetrap` sets the maximum time that the test case is allowed to execute.\nIf the timetrap time is exceeded, the test case fails with reason\n`timetrap_timeout`. [`Module:init_per_testcase/2`](`c:init_per_testcase/2`) and\n[`Module:end_per_testcase/2`](`c:end_per_testcase/2`) are included in the\ntimetrap time. A `TimeFunc` function can be used to set a new timetrap by\nreturning a `TimeVal`. It can also be used to trigger a timetrap time-out by, at\nsome point, returning a value other than a `TimeVal`. For details, see section\n[Timetrap Time-Outs](write_test_chapter.md#timetraps) in the User's Guide.\n\nTag `require` specifies configuration variables that are required by the test\ncase (or [`init_per_testcase/2`](`c:init_per_testcase/2`) or\n[`end_per_testcase/2`](`c:end_per_testcase/2`)). If the required configuration\nvariables are not found in any of the configuration files, the test case is\nskipped. For details about the `require` functionality, see function\n[`ct:require/1,2`](`ct:require/1`).\n\nIf `timetrap` or `require` is not set, the default values specified by\n[`Module:suite/0`](`c:suite/0`) (or [`Module:group/1`](`c:group/1`)) are used.\n\nWith `userdata`, the user can specify any test case-related information that can\nbe read by calling `ct:userdata/3`.\n\nOther tuples than the ones defined are ignored.\n\nFor details about the test case information function, see section\n[Test Case Information Function](write_test_chapter.md#info_function) in the\nUser's Guide.","title":"ct_suite.Testcase/0","ref":"ct_suite.html#c:Testcase/0"},{"type":"callback","doc":"The implementation of a test case. Call the functions to test and check the\nresult. If something fails, ensure the function causes a runtime error or call\n[`ct:fail/1,2`](`ct:fail/1`) (which also causes the test case process to\nterminate).\n\nElements from the `Config` list can, for example, be read with\n`proplists:get_value/2` in STDLIB.\n\nPossible return values are:\n\n- **`{fail, Reason}`** - The test case is considered failed, and the `Reason`\n will be logged.\n\n- **`{skip, Reason}`** - The test case is considered skipped, and the `Reason`\n will be logged.\n\n- **`{comment, Comment}`** - The test case is considered successful, and the\n `Comment` will be logged.\n\n- **`{save_config, SaveConfig}`** - The test case is considered successful, and\n the `SaveConfig` will be stored in the `Config` (see section\n [Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\n Guide).\n\n- **`{skip_and_save, Reason, SaveConfig}`** - The test case is considered\n skipped, the `Reason` will be logged, and the `SaveConfig` will be stored in\n the `Config` (see section\n [Saving Configuration Data](dependencies_chapter.md#save_config) in the User's\n Guide).\n\nIf the function returns any other term, the test case is considered successful.\n\nIf the test case function crashes, it is considered failed.\n\nFor details about test case implementation, see section\n[Test Cases](write_test_chapter.md#test_cases) in the User's Guide.","title":"ct_suite.Testcase/1","ref":"ct_suite.html#c:Testcase/1"},{"type":"type","doc":"The configuration data that can be modified.","title":"ct_suite.ct_config/0","ref":"ct_suite.html#t:ct_config/0"},{"type":"type","doc":"The test group definition, as returned by [`Module:groups/0`](`c:groups/0`).","title":"ct_suite.ct_group_def/0","ref":"ct_suite.html#t:ct_group_def/0"},{"type":"type","doc":"","title":"ct_suite.ct_group_props/0","ref":"ct_suite.html#t:ct_group_props/0"},{"type":"type","doc":"","title":"ct_suite.ct_group_props_ref/0","ref":"ct_suite.html#t:ct_group_props_ref/0"},{"type":"type","doc":"","title":"ct_suite.ct_group_ref/0","ref":"ct_suite.html#t:ct_group_ref/0"},{"type":"type","doc":"","title":"ct_suite.ct_group_repeat_type/0","ref":"ct_suite.html#t:ct_group_repeat_type/0"},{"type":"type","doc":"The name of the test group.","title":"ct_suite.ct_groupname/0","ref":"ct_suite.html#t:ct_groupname/0"},{"type":"type","doc":"","title":"ct_suite.ct_hooks/0","ref":"ct_suite.html#t:ct_hooks/0"},{"type":"type","doc":"The test suite information, as returned by [`Module:suite/0`](`c:suite/0`),\n[`Module:group/1`](`c:group/1`) and [`Module:Testcase/0`](`c:'Testcase'/0`).","title":"ct_suite.ct_info/0","ref":"ct_suite.html#t:ct_info/0"},{"type":"type","doc":"","title":"ct_suite.ct_info_required/0","ref":"ct_suite.html#t:ct_info_required/0"},{"type":"type","doc":"","title":"ct_suite.ct_info_required_subkeys/0","ref":"ct_suite.html#t:ct_info_required_subkeys/0"},{"type":"type","doc":"","title":"ct_suite.ct_info_timetrap/0","ref":"ct_suite.html#t:ct_info_timetrap/0"},{"type":"type","doc":"","title":"ct_suite.ct_info_timetrap_fun/0","ref":"ct_suite.html#t:ct_info_timetrap_fun/0"},{"type":"type","doc":"The status value for a nested subgroup.","title":"ct_suite.ct_status/0","ref":"ct_suite.html#t:ct_status/0"},{"type":"type","doc":"","title":"ct_suite.ct_subgroups_def/0","ref":"ct_suite.html#t:ct_subgroups_def/0"},{"type":"type","doc":"The test suite definition, as returned by [`Module:all/0`](`c:all/0`).","title":"ct_suite.ct_test_def/0","ref":"ct_suite.html#t:ct_test_def/0"},{"type":"type","doc":"","title":"ct_suite.ct_test_repeat/0","ref":"ct_suite.html#t:ct_test_repeat/0"},{"type":"type","doc":"","title":"ct_suite.ct_testcase_ref/0","ref":"ct_suite.html#t:ct_testcase_ref/0"},{"type":"type","doc":"","title":"ct_suite.ct_testcase_repeat_prop/0","ref":"ct_suite.html#t:ct_testcase_repeat_prop/0"},{"type":"type","doc":"The name of the testcase function.","title":"ct_suite.ct_testname/0","ref":"ct_suite.html#t:ct_testname/0"},{"type":"module","doc":"`Common Test` specific layer on top of Telnet client `ct_telnet_client.erl`.\n\nUse this module to set up Telnet connections, send commands, and perform string\nmatching on the result. For information about how to use `ct_telnet` and\nconfigure connections, specifically for UNIX hosts, see the `m:unix_telnet`\nmanual page.\n\nDefault values defined in `ct_telnet`:\n\n[](){: #Default_values }\n\n- Connection timeout (time to wait for connection) = 10 seconds\n- Command timeout (time to wait for a command to return) = 10 seconds\n- Max number of reconnection attempts = 3\n- Reconnection interval (time to wait in between reconnection attempts) = 5\n seconds\n- Keep alive (sends NOP to the server every 8 sec if connection is idle) =\n `true`\n- Polling limit (max number of times to poll to get a remaining string\n terminated) = 0\n- Polling interval (sleep time between polls) = 1 second\n- The TCP_NODELAY option for the telnet socket is disabled (set to `false`) per\n default\n\nThese parameters can be modified by the user with the following configuration\nterm:\n\n```erlang\n{telnet_settings, [{connect_timeout,Millisec},\n {command_timeout,Millisec},\n {reconnection_attempts,N},\n {reconnection_interval,Millisec},\n {keep_alive,Bool},\n {poll_limit,N},\n {poll_interval,Millisec},\n {tcp_nodelay,Bool}]}.\n```\n\n`Millisec = integer(), N = integer()`\n\nEnter the `telnet_settings` term in a configuration file included in the test\nand `ct_telnet` retrieves the information automatically.\n\n`keep_alive` can be specified per connection, if necessary. For details, see\n`m:unix_telnet`.","title":"ct_telnet","ref":"ct_telnet.html"},{"type":"module","doc":"[](){: #Logging }\n\nThe default logging behavior of `ct_telnet` is to print information about\nperformed operations, commands, and their corresponding results to the test case\nHTML log. The following is not printed to the HTML log: text strings sent from\nthe Telnet server that are not explicitly received by a `ct_telnet` function,\nsuch as [`expect/3`](`expect/3`). However, `ct_telnet` can be configured to use\na special purpose event handler, implemented in `ct_conn_log_h`, for logging\n_all_ Telnet traffic. To use this handler, install a `Common Test` hook named\n`cth_conn_log`. Example (using the test suite information function):\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].\n```\n\n`conn_mod()` is the name of the `Common Test` module implementing the connection\nprotocol, that is, `ct_telnet`.\n\nThe `cth_conn_log` hook performs unformatted logging of Telnet data to a\nseparate text file. All Telnet communication is captured and printed, including\nany data sent from the server. The link to this text file is located at the top\nof the test case HTML log.\n\nBy default, data for all Telnet connections is logged in one common file (named\n`default`), which can get messy, for example, if multiple Telnet sessions are\nrunning in parallel. Therefore a separate log file can be created for each\nconnection. To configure this, use hook option `hosts` and list the names of the\nservers/connections to be used in the suite. The connections must be named for\nthis to work (see [`ct_telnet:open/1,2,3,4`](`open/1`)).\n\nHook option `log_type` can be used to change the `cth_conn_log` behavior. The\ndefault value of this option is `raw`, which results in the behavior described\nabove. If the value is set to `html`, all Telnet communication is printed to the\ntest case HTML log instead.\n\nAll `cth_conn_log` hook options described can also be specified in a\nconfiguration file with configuration variable `ct_conn_log`.\n\n_Example:_\n\n```erlang\n{ct_conn_log, [{ct_telnet,[{log_type,raw},\n {hosts,[key_or_name()]}]}]}\n```\n\n> #### Note {: .info }\n>\n> Hook options specified in a configuration file overwrite any hard-coded hook\n> options in the test suite.\n\n[](){: #Logging_example }\n\n_Logging Example:_\n\nThe following `ct_hooks` statement causes printing of Telnet traffic to separate\nlogs for the connections `server1` and `server2`. Traffic for any other\nconnections is logged in the default Telnet log.\n\n```erlang\nsuite() ->\n [{ct_hooks,\n [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].\n```\n\nAs previously explained, this specification can also be provided by an entry\nlike the following in a configuration file:\n\n```erlang\n{ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.\n```\n\nIn this case the `ct_hooks` statement in the test suite can look as follows:\n\n```erlang\nsuite() ->\n [{ct_hooks, [{cth_conn_log, []}]}].\n```","title":"Logging - ct_telnet","ref":"ct_telnet.html#module-logging"},{"type":"module","doc":"`m:unix_telnet`","title":"See Also - ct_telnet","ref":"ct_telnet.html#module-see-also"},{"type":"function","doc":"Closes the Telnet connection and stops the process managing it.\n\nA connection can be associated with a target name and/or a handle. If\n`Connection` has no associated target name, it can only be closed with the\nhandle value (see [`ct_telnet:open/4`](`open/4`)).","title":"ct_telnet.close/1","ref":"ct_telnet.html#close/1"},{"type":"function","doc":"","title":"ct_telnet.cmd/2","ref":"ct_telnet.html#cmd/2"},{"type":"function","doc":"Sends a command through Telnet and waits for prompt.\n\nBy default, this function adds \"\\\\n\" to the end of the specified command. If\nthis is not desired, use option `{newline,false}`. This is necessary, for\nexample, when sending Telnet command sequences prefixed with character Interpret\nAs Command (IAC). Option `{newline,string()}` can also be used if a different\nline end than \"\\\\n\" is required, for instance `{newline,\"\\r\\n\"}`, to add both\ncarriage return and newline characters.\n\nOption `timeout` specifies how long the client must wait for prompt. If the time\nexpires, the function returns `{error,timeout}`. For information about the\ndefault value for the command timeout, see the\n[list of default values](`m:ct_telnet#Default_values`) in the beginning of this\nmodule.","title":"ct_telnet.cmd/3","ref":"ct_telnet.html#cmd/3"},{"type":"function","doc":"","title":"ct_telnet.cmdf/3","ref":"ct_telnet.html#cmdf/3"},{"type":"function","doc":"Sends a Telnet command and waits for prompt (uses a format string and a list of\narguments to build the command).\n\nFor details, see [`ct_telnet:cmd/3`](`cmd/3`).","title":"ct_telnet.cmdf/4","ref":"ct_telnet.html#cmdf/4"},{"type":"function","doc":"","title":"ct_telnet.expect/2","ref":"ct_telnet.html#expect/2"},{"type":"function","doc":"Gets data from Telnet and waits for the expected pattern.\n\n`Pattern` can be a POSIX regular expression. The function returns when a pattern\nis successfully matched (at least one, in the case of multiple patterns).\n\n`RxMatch` is a list of matched strings. It looks as follows\n`[FullMatch, SubMatch1, SubMatch2, ...]`, where `FullMatch` is the string\nmatched by the whole regular expression, and `SubMatchN` is the string that\nmatched subexpression number `N`. Subexpressions are denoted with `'(' ')'` in\nthe regular expression.\n\nIf a `Tag` is specified, the returned `Match` also includes the matched `Tag`.\nOtherwise, only `RxMatch` is returned.\n\n_Options:_\n\n- **`idle_timeout`** - Indicates that the function must return if the Telnet\n client is idle (that is, if no data is received) for more than `IdleTimeout`\n milliseconds. Default time-out is 10 seconds.\n\n- **`total_timeout`** - Sets a time limit for the complete `expect` operation.\n After `TotalTimeout` milliseconds, `{error,timeout}` is returned. Default is\n `infinity` (that is, no time limit).\n\n- **`ignore_prompt | no_prompt_check`** - >The function returns when a prompt is\n received, even if no pattern has yet been matched, and\n `{error,{prompt,Prompt}}` is returned. However, this behavior can be modified\n with option `ignore_prompt` or option `no_prompt_check`, which tells `expect`\n to return only when a match is found or after a time-out.\n\n- **`ignore_prompt`** - `ct_telnet` ignores any prompt found. This option is\n useful if data sent by the server can include a pattern matching prompt\n `regexp` (as returned by `TargedMod:get_prompt_regexp/0`), but is not to not\n cause the function to return.\n\n- **`no_prompt_check`** - `ct_telnet` does not search for a prompt at all. This\n is useful if, for example, `Pattern` itself matches the prompt.\n\n- **`wait_for_prompt`** - Forces `ct_telnet` to wait until the prompt string is\n received before returning (even if a pattern has already been matched). This\n is equal to calling\n [`expect(Conn, Patterns++[{prompt,Prompt}], [sequence|Opts])`](`expect/3`).\n Notice that option `idle_timeout` and `total_timeout` can abort the operation\n of waiting for prompt.\n\n- **`repeat | repeat, N`** - The pattern(s) must be matched multiple times. If\n `N` is specified, the pattern(s) are matched `N` times, and the function\n returns `HaltReason = done`. This option can be interrupted by one or more\n `HaltPatterns`. `MatchList` is always returned, that is, a list of `Match`\n instead of only one `Match`. Also `HaltReason` is returned.\n\n- **`sequence`** - All patterns must be matched in a sequence. A match is not\n concluded until all patterns are matched. This option can be interrupted by\n one or more `HaltPatterns`. `MatchList` is always returned, that is, a list of\n `Match` instead of only one `Match`. Also `HaltReason` is returned.\n\n_Example 1:_\n\n```erlang\nexpect(Connection,[{abc,\"ABC\"},{xyz,\"XYZ\"}],[sequence,{halt,[{nnn,\"NNN\"}]}])\n```\n\nFirst this tries to match `\"ABC\"`, and then `\"XYZ\"`, but if `\"NNN\"` appears, the\nfunction returns `{error,{nnn,[\"NNN\"]}}`. If both `\"ABC\"` and `\"XYZ\"` are\nmatched, the function returns `{ok,[AbcMatch,XyzMatch]}`.\n\n_Example 2:_\n\n```erlang\nexpect(Connection,[{abc,\"ABC\"},{xyz,\"XYZ\"}],[{repeat,2},{halt,[{nnn,\"NNN\"}]}])\n```\n\nThis tries to match `\"ABC\"` or `\"XYZ\"` twice. If `\"NNN\"` appears, the function\nreturns `HaltReason = {nnn,[\"NNN\"]}`.\n\nOptions `repeat` and `sequence` can be combined to match a sequence multiple\ntimes.","title":"ct_telnet.expect/3","ref":"ct_telnet.html#expect/3"},{"type":"function","doc":"Gets all data received by the Telnet client since the last command was sent.\nOnly newline-terminated strings are returned. If the last received string has\nnot yet been terminated, the connection can be polled automatically until the\nstring is complete.\n\nThe polling feature is controlled by the configuration values `poll_limit` and\n`poll_interval` and is by default disabled. This means that the function\nimmediately returns all complete strings received and saves a remaining\nnon-terminated string for a later `get_data` call.","title":"ct_telnet.get_data/1","ref":"ct_telnet.html#get_data/1"},{"type":"function","doc":"","title":"ct_telnet.open/1","ref":"ct_telnet.html#open/1"},{"type":"function","doc":"Opens a Telnet connection to the specified target host.","title":"ct_telnet.open/2","ref":"ct_telnet.html#open/2"},{"type":"function","doc":"","title":"ct_telnet.open/3","ref":"ct_telnet.html#open/3"},{"type":"function","doc":"Opens a Telnet connection to the specified target host.\n\nThe target data must exist in a configuration file. The connection can be\nassociated with `Name` and/or the returned `Handle`. To allocate a name for the\ntarget, use one of the following alternatives:\n\n- `ct:require/2` in a test case\n- A `require` statement in the suite information function (`suite/0`)\n- A `require` statement in a test case information function\n\nIf you want the connection to be associated with `Handle` only (if you, for\nexample, need to open multiple connections to a host), use `Key`, the\nconfiguration variable name, to specify the target. Notice that a connection\nwithout an associated target name can only be closed with the `Handle` value.\n\n`TargetMod` is a module that exports the functions\n`connect(Ip, Port, KeepAlive, Extra)` and `get_prompt_regexp()` for the\nspecified `TargetType` (for example, `unix_telnet`).\n\nSee also `ct:require/2`.","title":"ct_telnet.open/4","ref":"ct_telnet.html#open/4"},{"type":"function","doc":"","title":"ct_telnet.send/2","ref":"ct_telnet.html#send/2"},{"type":"function","doc":"Sends a Telnet command and returns immediately.\n\nBy default, this function adds \"\\\\n\" to the end of the specified command. If\nthis is not desired, option `{newline,false}` can be used. This is necessary,\nfor example, when sending Telnet command sequences prefixed with character\nInterpret As Command (IAC). Option `{newline,string()}` can also be used if a\ndifferent line end than \"\\\\n\" is required, for instance `{newline,\"\\r\\n\"}`, to\nadd both carriage return and newline characters.\n\nThe resulting output from the command can be read with\n[`ct_telnet:get_data/2`](`get_data/1`) or [`ct_telnet:expect/2,3`](`expect/2`).","title":"ct_telnet.send/3","ref":"ct_telnet.html#send/3"},{"type":"function","doc":"","title":"ct_telnet.sendf/3","ref":"ct_telnet.html#sendf/3"},{"type":"function","doc":"Sends a Telnet command and returns immediately (uses a format string and a list\nof arguments to build the command).\n\nFor details, see [`ct_telnet:send/3`](`send/3`).","title":"ct_telnet.sendf/4","ref":"ct_telnet.html#sendf/4"},{"type":"type","doc":"Reference to opened Telnet connection associated to either a `handle` or `target_name`.","title":"ct_telnet.connection/0","ref":"ct_telnet.html#t:connection/0"},{"type":"type","doc":"Telnet connection_type, valid values: 'telnet' | 'ts1' | 'ts2'.","title":"ct_telnet.connection_type/0","ref":"ct_telnet.html#t:connection_type/0"},{"type":"type","doc":"Handle for a specific Telnet connection, see module `m:ct`.","title":"ct_telnet.handle/0","ref":"ct_telnet.html#t:handle/0"},{"type":"type","doc":"See `cmd/3` for explanation.","title":"ct_telnet.newline_option/0","ref":"ct_telnet.html#t:newline_option/0"},{"type":"type","doc":"Regular expression matching all possible prompts for a specific target type.\n`regexp` must not have any groups, that is, when matching, `re:run/3` (in\nSTDLIB) must return a list with one single element.","title":"ct_telnet.prompt_regexp/0","ref":"ct_telnet.html#t:prompt_regexp/0"},{"type":"module","doc":"Parsing of test specifications for `Common Test`.\n\nThis module exports help functions for parsing of test specifications.","title":"ct_testspec","ref":"ct_testspec.html"},{"type":"function","doc":"Parse the given test specification files and return the tests to run and skip.\n\n[](){: #add_nodes-1 }\n\nIf `SpecsIn=[Spec1,Spec2,...]`, separate tests will be created per\nspecification. If `SpecsIn=[[Spec1,Spec2,...]]`, all specifications will be\nmerge into one test.\n\nFor each test, a `{Specs,Tests}` element is returned, where `Specs` is a list of\nall included test specifications, and `Tests` specifies actual tests to run/skip\nper node.","title":"ct_testspec.get_tests/1","ref":"ct_testspec.html#get_tests/1"},{"type":"module","doc":"Callback module for `m:ct_telnet`, for connecting to a Telnet server on a UNIX\nhost.\n\nIt requires the following entry in the configuration file:\n\n```erlang\n{unix,[{telnet,HostNameOrIpAddress},\n {port,PortNum}, % optional\n {username,UserName},\n {password,Password},\n {keep_alive,Bool}]}. % optional\n```\n\nTo communicate through Telnet to the host specified by `HostNameOrIpAddress`,\nuse the interface functions in `m:ct_telnet`, for example, `open(Name)` and\n`cmd(Name,Cmd)`.\n\n`Name` is the name you allocated to the Unix host in your `require` statement,\nfor example:\n\n```erlang\nsuite() -> [{require,Name,{unix,[telnet]}}].\n```\n\nor\n\n```erlang\nct:require(Name,{unix,[telnet]}).\n```\n\nThe \"keep alive\" activity (that is, that `Common Test` sends NOP to the server\nevery 10 seconds if the connection is idle) can be enabled or disabled for one\nparticular connection as described here. It can be disabled for all connections\nusing `telnet_settings` (see `m:ct_telnet`).\n\nThe `{port,PortNum}` tuple is optional and if omitted, default Telnet port 23 is\nused. Also the `keep_alive` tuple is optional, and the value default to `true`\n(enabled).","title":"unix_telnet","ref":"unix_telnet.html"},{"type":"module","doc":"`m:ct`, `m:ct_telnet`","title":"See Also - unix_telnet","ref":"unix_telnet.html#module-see-also"},{"type":"function","doc":"Callback for `ct_telnet.erl`.\n\n[](){: #connect-6 }\n\nSetup Telnet connection to a Unix host.","title":"unix_telnet.connect/7","ref":"unix_telnet.html#connect/7"},{"type":"function","doc":"Callback for `ct_telnet.erl`.\n\nReturns a suitable `regexp` string matching common prompts for users on Unix\nhosts.","title":"unix_telnet.get_prompt_regexp/0","ref":"unix_telnet.html#get_prompt_regexp/0"},{"type":"extras","doc":"\n# Common Test Application\n\nA framework for automated testing of any target nodes.","title":"Common Test Application","ref":"common_test_app.html"},{"type":"extras","doc":"The `Common Test` framework is an environment for implementing and performing\nautomatic and semi-automatic execution of test cases.\n\nIn brief, `Common Test` supports:\n\n- Automated execution of test suites (sets of test cases)\n- Logging of events during execution\n- HTML presentation of test suite results\n- HTML presentation of test suite code\n- Support functions for test suite authors\n- Step-by-step execution of test cases","title":"Description - Common Test Application","ref":"common_test_app.html#description"},{"type":"extras","doc":"\n# Common Test Release Notes","title":"Common Test Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Common_Test 1.27 - Common Test Release Notes","ref":"notes.html#common_test-1-27"},{"type":"extras","doc":"- Calls to `ct:capture_start/0` and `ct:capture_stop/0` are now synchronous to ensure that all output is captured.\n\n Own Id: OTP-18658 Aux Id: [PR-7380]\n\n- The order in which multiple hooks are executed can now be reversed after each config function. See [CTH Execution Order](`e:common_test:ct_hooks_chapter.md#cth_execution_order`).\n\n Own Id: OTP-18682 Aux Id: [GH-7397], [PR-7496], ERIERL-43\n\n- The default CSS will now include a basic dark mode handling if it is preferred by the browser.\n\n Own Id: OTP-18761 Aux Id: [PR-7428]\n\n- `-callback` attributes have been added to `m:ct_suite` and `m:ct_hooks`.\n\n Own Id: OTP-18781 Aux Id: [PR-7701]\n\n- The built-in [cth_log_redirect](`e:common_test:ct_hooks_chapter.md#built-in-cths`) hook can now be configured to replace default logger reports in terminal with HTML logs.\n\n Own Id: OTP-18875 Aux Id: [PR-7891]\n\n- Error handling for the `m:ct_property_test` framework has been enhanced.\n\n Own Id: OTP-18881 Aux Id: [PR-7824]\n\n- Enhance test case documentation, making it clear how a test case can be failed.\n\n Own Id: OTP-18892 Aux Id: [PR-7869]\n\n- The failing line in the test source code is now colored to make it easier to find on the screen.\n\n Own Id: OTP-18898 Aux Id: [PR-7917]\n\n- Function specifications and types have been added to all public API functions.\n\n Own Id: OTP-18913\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- The suite execution elapsed time is now included in the index page.\n\n Own Id: OTP-18981 Aux Id: [GH-7972], [PR-8112]\n\n[PR-7380]: https://github.com/erlang/otp/pull/7380\n[GH-7397]: https://github.com/erlang/otp/issues/7397\n[PR-7496]: https://github.com/erlang/otp/pull/7496\n[PR-7428]: https://github.com/erlang/otp/pull/7428\n[PR-7701]: https://github.com/erlang/otp/pull/7701\n[PR-7891]: https://github.com/erlang/otp/pull/7891\n[PR-7824]: https://github.com/erlang/otp/pull/7824\n[PR-7869]: https://github.com/erlang/otp/pull/7869\n[PR-7917]: https://github.com/erlang/otp/pull/7917\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[GH-7972]: https://github.com/erlang/otp/issues/7972\n[PR-8112]: https://github.com/erlang/otp/pull/8112","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.26.2 - Common Test Release Notes","ref":"notes.html#common_test-1-26-2"},{"type":"extras","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.26.1 - Common Test Release Notes","ref":"notes.html#common_test-1-26-1"},{"type":"extras","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.26 - Common Test Release Notes","ref":"notes.html#common_test-1-26"},{"type":"extras","doc":"- With this change, common_test returns an error when suite with a badly defined\n group is executed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18728 Aux Id: PR-7487, PR-7674\n\n- With this change, stylesheet option is applied to all HTML report pages.\n\n Own Id: OTP-18760\n\n- Update all html tags to be instead.\n\n Own Id: OTP-18799 Aux Id: PR-7695","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- This change fixes docs, so that historically deprecated ?config macro is no\n longer recommended to be used.\n\n Own Id: OTP-18858 Aux Id: PR-7825","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.25.1 - Common Test Release Notes","ref":"notes.html#common_test-1-25-1"},{"type":"extras","doc":"- With this change, ct_hooks manual refers to CTH execution order section in\n user guide.\n\n Own Id: OTP-14480 Aux Id: ERIERL-43, OTP-11894, PR-7455\n\n- With this change, Config data from pre_end_per_testcase hook is delivered to\n post_end_per_testcase callback in case of testcase timetrap or linked process\n crash.\n\n Own Id: OTP-18579 Aux Id: GH-7119\n\n- With this change, remaining references to not supported vts tool in ct_run are\n removed (mainly relates to docs and ct_run help message).\n\n Own Id: OTP-18615 Aux Id: PR-7234\n\n- With this change, prompt search functionality in ct_telnet handles unicode\n input.\n\n Own Id: OTP-18664 Aux Id: ERIERL-959\n\n- Expanded the documentation about how to use the `standard_io`,\n `standard_error` and `user` I/O devices.\n\n Added the types [`io:standard_io/0`](`t:io:standard_io/0`),\n `io:standard:error/0` and [`io:user/0`](`t:io:user/0`).\n\n Own Id: OTP-18676 Aux Id: PR-7473 GH-7459","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.25 - Common Test Release Notes","ref":"notes.html#common_test-1-25"},{"type":"extras","doc":"- This change improves Common Test docs (CT hook example code) and adds Emacs\n skeleton with hook code.\n\n Own Id: OTP-18377 Aux Id: PR-6437","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Updated common_test with a more robust way to fetch old releases, while\n ignoring the current release.\n\n Own Id: OTP-18259 Aux Id: PR-5924\n\n- \\- re-write the XML `ct` module documentation into erlang types to make\n Dialyzer able to catch more precise errors\n\n Own Id: OTP-18340\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.24.0.3 - Common Test Release Notes","ref":"notes.html#common_test-1-24-0-3"},{"type":"extras","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.24.0.2 - Common Test Release Notes","ref":"notes.html#common_test-1-24-0-2"},{"type":"extras","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.24.0.1 - Common Test Release Notes","ref":"notes.html#common_test-1-24-0-1"},{"type":"extras","doc":"- With this change, prompt search functionality in ct_telnet handles unicode\n input.\n\n Own Id: OTP-18664 Aux Id: ERIERL-959","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.24 - Common Test Release Notes","ref":"notes.html#common_test-1-24"},{"type":"extras","doc":"- Renamed undocumented macro `CT_PEER/3` to `CT_PEER_REL/3`.\n\n Own Id: OTP-18460","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.23.3 - Common Test Release Notes","ref":"notes.html#common_test-1-23-3"},{"type":"extras","doc":"- Change timeout to infinity for gen_server calls in cth_log_redirect\n\n Own Id: OTP-18363 Aux Id: ERIERL-879","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.23.2 - Common Test Release Notes","ref":"notes.html#common_test-1-23-2"},{"type":"extras","doc":"- Fix starting of peer nodes on old releases when the compile server was active\n and the current Erlang installation contained non-latin1 characters in its\n path.\n\n Own Id: OTP-18255 Aux Id: PR-6314","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.23.1 - Common Test Release Notes","ref":"notes.html#common_test-1-23-1"},{"type":"extras","doc":"- Fix cth_surefire to handle when a suite is not compiled with `debug_info`.\n This bug has been present since Erlang/OTP 25.0.\n\n Own Id: OTP-18208 Aux Id: ERIERL-852 PR-6229","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Common Test now preserves stack traces for throws.\n\n Own Id: OTP-18138 Aux Id: GH-5719, PR-6029","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.23 - Common Test Release Notes","ref":"notes.html#common_test-1-23"},{"type":"extras","doc":"- Fix bug when running parallel test cases and together with one or more ct\n hooks that would cause the hook lock process to crash and produce printouts in\n the ct logs.\n\n Own Id: OTP-17881 Aux Id: PR-5581","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Remove unused and undocumented tracer node functionality.\n\n Own Id: OTP-17676 Aux Id: PR-5021\n\n- The new module `peer` supersedes the `slave` module. The `slave` module is now\n deprecated and will be removed in OTP 27.\n\n `peer` contains an extended and more robust API for starting erlang nodes.\n\n Own Id: OTP-17720 Aux Id: PR-5162\n\n- The cth_surefire ct hook has been updated to include the file and line number\n of the executed test case in the xml output.\n\n The performance of the hook has also been improved greatly for test runs with\n many test cases.\n\n Own Id: OTP-17882 Aux Id: PR-5581","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.22.1.3 - Common Test Release Notes","ref":"notes.html#common_test-1-22-1-3"},{"type":"extras","doc":"* With this change, the last column in common_test testcase log file is modified to now show the total sum of each time in the table rows, and Elapsed Time which is a clock time spent to run above functions. The Elapsed Time is the same time that was previously a total.\n\n Own Id: OTP-18960","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.22.1.2 - Common Test Release Notes","ref":"notes.html#common_test-1-22-1-2"},{"type":"extras","doc":"* Fix how CT finds Erlang/OTP releases for compatability testing. This functionality is only used to test Erlang/OTP.\n\n Own Id: OTP-18932","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.22.1.1 - Common Test Release Notes","ref":"notes.html#common_test-1-22-1-1"},{"type":"extras","doc":"- Change timeout to infinity for gen_server calls in cth_log_redirect\n\n Own Id: OTP-18363 Aux Id: ERIERL-879","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.22.1 - Common Test Release Notes","ref":"notes.html#common_test-1-22-1"},{"type":"extras","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.22 - Common Test Release Notes","ref":"notes.html#common_test-1-22"},{"type":"extras","doc":"- Before this change, group handling grammar was ambiguous and also group paths\n did not support test specs.\n\n Own Id: OTP-17664 Aux Id: GH-5088, PR-5242\n\n- Before this change, it was not possible to link to a particular header entry\n in Common Test log. Change adds right aligned anchor icons in HTML test logs.\n\n Own Id: OTP-17790 Aux Id: PR-5375","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.21 - Common Test Release Notes","ref":"notes.html#common_test-1-21"},{"type":"extras","doc":"- Float allowed as multiply_timetraps parameter.\n\n Own Id: OTP-17413 Aux Id: PR-4767\n\n- Remove usage of legacy API macro and functions.\n\n Own Id: OTP-17632 Aux Id: PR-5022","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.20.5 - Common Test Release Notes","ref":"notes.html#common_test-1-20-5"},{"type":"extras","doc":"- An incoming NETCONF notification received before a call to\n ct_netconfc:create_subscription/\\* caused the connection process to fail with\n badarg. Unexpected notifications are now logged in the same way as other\n unexpected messages.\n\n Own Id: OTP-17506","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add 'receiver' option to ct_netconfc\n\n To allow a destination for incoming NETCONF notifications to be specified at\n sessions creation. Previously, a caller of create_subscription/\\* became the\n destination, but RFC 5277 create-subscription is no longer the only way in\n which NETCONF notifications can be ordered.\n\n Own Id: OTP-17509","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.20.4 - Common Test Release Notes","ref":"notes.html#common_test-1-20-4"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.20.3 - Common Test Release Notes","ref":"notes.html#common_test-1-20-3"},{"type":"extras","doc":"- The option `release_shell` could crash when used together with the `spec`\n option.\n\n Own Id: OTP-16940 Aux Id: ERL-1335","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- Fixed warnings in code matching on underscore prefixed variables.\n\n Own Id: OTP-17385 Aux Id: OTP-17123","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.20.2.3 - Common Test Release Notes","ref":"notes.html#common_test-1-20-2-3"},{"type":"extras","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.20.2.2 - Common Test Release Notes","ref":"notes.html#common_test-1-20-2-2"},{"type":"extras","doc":"- An incoming NETCONF notification received before a call to\n ct_netconfc:create_subscription/\\* caused the connection process to fail with\n badarg. Unexpected notifications are now logged in the same way as other\n unexpected messages.\n\n Own Id: OTP-17506","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add 'receiver' option to ct_netconfc\n\n To allow a destination for incoming NETCONF notifications to be specified at\n sessions creation. Previously, a caller of create_subscription/\\* became the\n destination, but RFC 5277 create-subscription is no longer the only way in\n which NETCONF notifications can be ordered.\n\n Own Id: OTP-17509","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.20.2.1 - Common Test Release Notes","ref":"notes.html#common_test-1-20-2-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.20.2 - Common Test Release Notes","ref":"notes.html#common_test-1-20-2"},{"type":"extras","doc":"- Before this change Config leaked between test groups in case of a subgroup was\n skipped (GH-3480).\n\n Own Id: OTP-17347 Aux Id: GH-3480,ERL-1439","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.20.1 - Common Test Release Notes","ref":"notes.html#common_test-1-20-1"},{"type":"extras","doc":"- A race condition could cause ct_netconfc:open/_ to return a dysfunctional\n handle, resulting in errors when invoking other api functions on it, and\n making it impossible to establish a new connection to the server in question.\n Similar symptoms were possible with open/_ in modules ct_ssh and ct_telnet.\n\n Internal messages from common_test processes could be left in the caller's\n message queue after a timeout when invoking call/\\* in modules ct_netconfc and\n ct_ssh. An internal process used by module ct_telnet could leak memory due to\n stray messages.\n\n Calls to ct_telnet:open/\\* and ct_telnet:get_data/1 could hang indefinitely if\n the TCP connection to the server was lost.\n\n Own Id: OTP-17328 Aux Id: ERIERL-631","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.20 - Common Test Release Notes","ref":"notes.html#common_test-1-20"},{"type":"extras","doc":"- Various address sanitizer support.\n\n Own Id: OTP-16959 Aux Id: PR-2965","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.19.1 - Common Test Release Notes","ref":"notes.html#common_test-1-19-1"},{"type":"extras","doc":"- Add behaviour for test suites\n\n Own Id: OTP-17070","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.19 - Common Test Release Notes","ref":"notes.html#common_test-1-19"},{"type":"extras","doc":"- The function `ct_property_test:init_tool/1` is added for the cases when the\n user does not want ct_property_test to compile properties. init_tool/1 can be\n used to set the property_test_tool config value.\n\n Own Id: OTP-16029 Aux Id: PR-2145\n\n- The built-in Common Test Hook, `cth_log_redirect`, has been updated to use the\n system `default` Logger handler's configuration instead of its own. See the\n section on [Built-in Hooks](ct_hooks_chapter.md#built-in-cths) in the Common\n Test User's Guide.\n\n Own Id: OTP-16273\n\n- Calls of deprecated functions in the\n [Old Crypto API](`e:crypto:new_api.md#the-old-api`) are replaced by calls of\n their [substitutions](`e:crypto:new_api.md#the-new-api`).\n\n Own Id: OTP-16346","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.18.2.2 - Common Test Release Notes","ref":"notes.html#common_test-1-18-2-2"},{"type":"extras","doc":"- OTP internal test fix.\n\n Own Id: OTP-17888","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.18.2.1 - Common Test Release Notes","ref":"notes.html#common_test-1-18-2-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.18.2 - Common Test Release Notes","ref":"notes.html#common_test-1-18-2"},{"type":"extras","doc":"- Document incl_apps cover option\n\n Own Id: OTP-16039 Aux Id: ERL-795\n\n- The `ct_property_test` has now a report function for results of stateful\n testing.\n\n Own Id: OTP-16340\n\n- Don't hide error reasons from user\n\n Own Id: OTP-16364 Aux Id: PR-2480","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.18.1 - Common Test Release Notes","ref":"notes.html#common_test-1-18-1"},{"type":"extras","doc":"- The ct_property_test logging is improved.\n\n Own Id: OTP-16287","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.18 - Common Test Release Notes","ref":"notes.html#common_test-1-18"},{"type":"extras","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add ct_netconfc support for NETCONF 1.1 (RFC 6241). The 1.1 base capability\n can be sent in hello, and RFC 6242 chunk framing is applied when both client\n and server advertise 1.1 support.\n\n Own Id: OTP-15789\n\n- Correct lib_dir paths in common_tests opaque data structure that is passed to\n ct_release_test callback modules in functions upgrade_init/2,\n upgrade_upgraded/2 and upgrade_downgraded/2. The incorrect paths may cause\n confusion when debugging although it will not cause any incorrect behavior on\n the part of common_test as it is currently not used.\n\n Own Id: OTP-15934","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.17.3 - Common Test Release Notes","ref":"notes.html#common_test-1-17-3"},{"type":"extras","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Use `ssh` instead of `rsh` as the default remote shell.\n\n Own Id: OTP-15633 Aux Id: PR-1787","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.17.2.1 - Common Test Release Notes","ref":"notes.html#common_test-1-17-2-1"},{"type":"extras","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.17.2 - Common Test Release Notes","ref":"notes.html#common_test-1-17-2"},{"type":"extras","doc":"- The test result when a hook function fails is in general the same as if the\n function that the hook is associated with fails. For example, if\n `post_init_per_testcase` fails the result is that the test case is skipped, as\n is the case when `init_per_testcase` fails.This, however, was earlier not true\n for timetrap timeouts or other error situations where the process running the\n hook function was killed. This is now corrected, so the error handling should\n be the same no matter how the hook function fails.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15717 Aux Id: ERIERL-334\n\n- In some rare cases, when two common_test nodes used the same log directory, a\n timing problem could occur which caused common_test to crash because it's log\n cache file was unexpectedly empty. This is now corrected.\n\n Own Id: OTP-15758 Aux Id: ERIERL-342","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Two new common_test hook functions are introduced:\n\n `post_groups/2`, which is called after `Suite:groups/0` \n `post_all/3`, which is called after `Suite:all/0`\n\n These functions allow modifying the return values from the `groups/0` and\n `all/0` functions, respectively.\n\n A new term, `{testcase,TestCase,RepeatProperties}` is now also allowed in the\n return from `all/0`. This can be used for repeating a single test case a\n specific number of times, or until it fails or succeeds once.\n\n Own Id: OTP-14746 Aux Id: ERIERL-143","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.17.1 - Common Test Release Notes","ref":"notes.html#common_test-1-17-1"},{"type":"extras","doc":"- OTP internal test improvements.\n\n Own Id: OTP-15716","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.17 - Common Test Release Notes","ref":"notes.html#common_test-1-17"},{"type":"extras","doc":"- A bug caused `ct:encrypt_config_file/3` and `ct:decrypt_config_file/3` to fail\n with `badmatch` if input parameter `KeyOrFile` was `{key,string()}`. This is\n now corrected.\n\n Own Id: OTP-15540\n\n- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new variant of the `newline` option to `ct_telnet:cmd/3` and\n `ct_telnet:send/3` is added, which allows to specify a string to append as\n newline indicator on a command. By default, the value is \"\\\\n\", but in some\n cases it is required to be \"\\\\r\\\\n\", which this option allows.\n\n A faulty regular expression given as parameter to `ct_telnet:expect/2,3` would\n earlier crash and look like an internal error in common_test. A better error\n indication is now given, but the test case will still fail.\n\n Own Id: OTP-15229 Aux Id: ERIERL-203\n\n- Since the yang RFC allows more than one top element of config data in an\n `edit-config` element, `ct_netconfc:edit_config/3,4,5` can now take a list of\n XML elements.\n\n Own Id: OTP-15298","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.16.1 - Common Test Release Notes","ref":"notes.html#common_test-1-16-1"},{"type":"extras","doc":"- The Logger handler cth_log_redirect earlier called the report callback\n (report_cb) before calling the logger formatter. In some cases this would\n fail, since cth_log_redirect could not handle report callbacks with two\n arguments. This is now corrected, so only the formatter will call the report\n callback.\n\n Own Id: OTP-15307","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.16 - Common Test Release Notes","ref":"notes.html#common_test-1-16"},{"type":"extras","doc":"- Use the compiler option `nowarn_export_all` to disable `export_all` warnings\n when automatically compiling test suites.\n\n Own Id: OTP-14810\n\n- Use uri_string module instead of http_uri.\n\n Own Id: OTP-14902","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.15.4.4 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4-4"},{"type":"extras","doc":"- The ct_property_test logging is improved.\n\n Own Id: OTP-16287","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.15.4.3 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4-3"},{"type":"extras","doc":"- If a ct hook is installed in the `suite/0` function in a test suite, then the\n hook's `terminate/1` function would be called several times without it's\n `init/2` function being called first. This is now corrected.\n\n Own Id: OTP-15863 Aux Id: ERIERL-370\n\n- If `init_per_testcase` fails, the test itself is skipped. According to the\n documentation, it should be possible to change the result to failed in a hook\n function. The only available hook function in this case is\n `post_init_per_testcase`, but changing the return value there did not affect\n the test case result. This is now corrected.\n\n Own Id: OTP-15869 Aux Id: ERIERL-350","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.15.4.2 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4-2"},{"type":"extras","doc":"- The test result when a hook function fails is in general the same as if the\n function that the hook is associated with fails. For example, if\n `post_init_per_testcase` fails the result is that the test case is skipped, as\n is the case when `init_per_testcase` fails.This, however, was earlier not true\n for timetrap timeouts or other error situations where the process running the\n hook function was killed. This is now corrected, so the error handling should\n be the same no matter how the hook function fails.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15717 Aux Id: ERIERL-334\n\n- In some rare cases, when two common_test nodes used the same log directory, a\n timing problem could occur which caused common_test to crash because it's log\n cache file was unexpectedly empty. This is now corrected.\n\n Own Id: OTP-15758 Aux Id: ERIERL-342","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Two new common_test hook functions are introduced:\n\n `post_groups/2`, which is called after `Suite:groups/0` \n `post_all/3`, which is called after `Suite:all/0`\n\n These functions allow modifying the return values from the `groups/0` and\n `all/0` functions, respectively.\n\n A new term, `{testcase,TestCase,RepeatProperties}` is now also allowed in the\n return from `all/0`. This can be used for repeating a single test case a\n specific number of times, or until it fails or succeeds once.\n\n Own Id: OTP-14746 Aux Id: ERIERL-143\n\n- OTP internal test improvements.\n\n Own Id: OTP-15716","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.15.4.1 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4-1"},{"type":"extras","doc":"- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.15.4.0.1 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4-0-1"},{"type":"extras","doc":"- The status of a test case which failed with timetrap timeout in\n `end_per_testcase` could not be modified by returning `{fail,Reason}` from a\n `post_end_per_testcase` hook function. This is now corrected.\n\n Own Id: OTP-15584 Aux Id: ERIERL-282","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.15.4 - Common Test Release Notes","ref":"notes.html#common_test-1-15-4"},{"type":"extras","doc":"- Fixed problem with 'skip_groups' in combination with 'all suites' option in\n test specification.\n\n Own Id: OTP-14953","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.15.3 - Common Test Release Notes","ref":"notes.html#common_test-1-15-3"},{"type":"extras","doc":"- A new function, `ct:remaining_test_procs/0`, returns the identity of test- and\n group leader processes that are still running at the time of the call.\n\n Own Id: OTP-13832\n\n- A \"latest test result\" link is now displayed in the footer of each test index\n page, which performs a jump to the most recently generated test index. This is\n useful for making quick comparisons of results between test runs without\n having to traverse the log file tree.\n\n Own Id: OTP-14281","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.15.2 - Common Test Release Notes","ref":"notes.html#common_test-1-15-2"},{"type":"extras","doc":"- General Unicode improvements.\n\n Own Id: OTP-14462","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.15.1 - Common Test Release Notes","ref":"notes.html#common_test-1-15-1"},{"type":"extras","doc":"- In OTP-20.0, the behavior of c, make, and ct_make was changed so that in some\n cases the beam files by default would be written to the directory where the\n source files were found. This is now changed back to the old behavior so beam\n files are by default written to current directory.\n\n Own Id: OTP-14489 Aux Id: ERL-438","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.15 - Common Test Release Notes","ref":"notes.html#common_test-1-15"},{"type":"extras","doc":"- Errors in the documentation for user HTML stylesheets have been corrected.\n\n Own Id: OTP-14332 Aux Id: seq13299\n\n- Internal code change: Calls to `catch` followed by a call to\n `erlang:get_stacktrace/0` has been rewritten to use `try` instead of `catch`\n to make the code future-proof.\n\n Own Id: OTP-14400","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The `ct_slave` modules now handle nodenames in the same way as nodenames\n passed to `-sname`. That means `ct_slave:start('b@127.0.0.1').` will now work.\n\n Own Id: OTP-13806\n\n- Added the new option, `keep_logs`. If setting the value for this option to an\n integer, N, common_test will remove all ct_run.\\* directories in the current\n log directory, except the N newest.\n\n Own Id: OTP-14179\n\n- The existing `ct_netconfc:open/1,2` opens an SSH connection with one SSH\n channel realizing one Netconf session. To allow testing of multiple sessions\n over the same SSH connection, the following functions are added to\n `ct_netconfc`:\n\n \\* `connect/1,2` \\- establish an SSH connection _ `disconnect/1` \\- close the\n given SSH connection _ `session/1,2,3` \\- open an ssh channel on the given\n connection and send 'hello' to start a Netconf session\n\n Own Id: OTP-14284\n\n- Miscellaneous updates due to atoms containing arbitrary Unicode characters.\n\n Own Id: OTP-14285\n\n- The function ct_ssh:shell/2,3 is added.\n\n Own Id: OTP-14415 Aux Id: seq13315","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.14 - Common Test Release Notes","ref":"notes.html#common_test-1-14"},{"type":"extras","doc":"- The following corrections and improvements are done in the common_test hook\n handling:\n\n - An extra argument, `Suite`, is added as the first argument to each of the\n following hook callback functions:\n\n - `pre_init_per_group`\n - `post_init_per_group`\n - `pre_end_per_group`\n - `post_end_per_group`\n - `pre_init_per_testcase`\n - `post_init_per_testcase`\n - `pre_end_per_testcase`\n - `post_end_per_testcase`\n - `on_tc_fail`\n - `on_tc_skip`\n\n For backwards compatibility, if the new function is not exported from a hook\n callback module, `common_test` will fall back to the old interface and call\n the function without the `Suite` argument.\n\n - If either `init_per_suite` or `end_per_suite` exists, but not the other,\n then the non-existing function will be reported as failed with reason\n `undef` in the test log. The same goes for `init/end_per_group`. This has\n always been a requirement according to the user's guide, but now\n `common_test` is more explicit in the report.\n - If `init_per_suite` was exported from a test suite, but not `end_per_suite`,\n then `pre/post_end_per_suite` was called with `Suite=ct_framework` instead\n of the correct suite name. This is now corrected.\n - If `end_per_group` was exported from a suite, but not `init_per_group`, then\n `end_per_group` was never called. This is now corrected.\n - Tests that were skipped before calling `pre_init_per_*` got faulty calls to\n the corresponding `post_init_per_*`. E.g. if a test was skipped because\n `suite/0` failed, then `post_init_per_suite` would be called even though\n `pre_init_per_suite` and `init_per_suite` were not called. This is now\n corrected so a `post_*` callback will never be called unless the\n corresponding `pre_*` callback has been called first.\n - Tests that were skipped before or in `init_per_testcase` got faulty calls to\n `pre_end_per_testcase` and `post_end_per_testcase`. This is now corrected so\n `pre/post_end_per_testcase` are not called when `end_per_testcase` is not\n called.\n - If an exit signal causes the test case process to die while running\n `init_per_testcase`, the case was earlier reported as failed with reason\n `{skip,...}`. This is now corrected so the case will be marked as skipped.\n - If an exist signal causes the test case process to die while running\n `end_per_testcase`, the case was earlier marked as failed. This is now\n corrected so the status of the test case is not changed - there is only a\n warning added to the comment field.\n - If a test case was skipped because of option `{force_stop,skip_rest}` or\n because of a failed sequence, then no `tc_start` event would be sent, only\n `tc_done`. This is now corrected so both events are sent.\n - When skipping or failing in a configuration function, the configuration\n function itself would get `{auto_skipped,Reason}`, `{skipped,Reason}` or\n `{failed,Reason}` in the hook callbacks `on_tc_skip` or `on_tc_fail`. The\n other test cases that were skipped as a result of this would only get\n `Reason` in `on_tc_skip`. This is now corrected so even the configuration\n function that caused the skip/fail will only get `Reason` in the hook\n callback.\n\n Own Id: OTP-10599 Aux Id: kunagi-344 \\[255]\n\n- When a test case was skipped by a `skip_cases` statement in a test spec, then\n `cth_surefire` would erroneously mark the previous test case as skipped in the\n xml report. The actually skipped test case would not be present in the xml\n report at all. This is now corrected.\n\n Own Id: OTP-14129 Aux Id: seq13244\n\n- The `multiply_timetraps` and `scale_timetraps` options did not work with test\n specifications, which has been corrected.\n\n Own Id: OTP-14210","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- ct_testspec:get_tests/1 is added. This is used by rebar3 to get all\n directories that must be compiled when running tests from testspec - instead\n of implementing testspec parsing in rebar3.\n\n Own Id: OTP-14132","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.13 - Common Test Release Notes","ref":"notes.html#common_test-1-13"},{"type":"extras","doc":"- Some types of printouts to screen during test runs (including\n `ct:print/1,2,3,4`) used the local `user` process as IO device and these\n printouts would not be visible when e.g. running tests via a shell on a remote\n node. A default Common Test group leader process has been introduced to solve\n the problem. This process routes printouts to the group leader of the starting\n process, if available, otherwise to `user`.\n\n Own Id: OTP-13973 Aux Id: ERL-279\n\n- Some Common Test processes, that act as I/O group leaders for test cases,\n would not terminate as expected at the end of test runs. This error has been\n corrected.\n\n Own Id: OTP-14026 Aux Id: ERL-287\n\n- The logging verbosity feature was incorrectly documented. The default\n verbosity levels for test runs is e.g. not 50 (`?STD_VERBOSITY`), but 100\n (`?MAX_VERBOSITY`). Also, some of the examples had errors and flaws. The\n corresponding chapter (5.18) in the User's Guide has been updated.\n\n Own Id: OTP-14044 Aux Id: seq13223","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A feature to let the user specify headings to log printouts has been added.\n The heading is specified as `{heading,string()}` in the `Opts` list argument\n to `ct:pal/3,4,5`, `ct:print/3,4,5`, or `ct:log/3,4,5`. If the heading option\n is omitted, the category name, or `\"User\"`, is used as the heading instead.\n\n Own Id: OTP-14043 Aux Id: seq13226","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.12.3 - Common Test Release Notes","ref":"notes.html#common_test-1-12-3"},{"type":"extras","doc":"- If the telnet server would pause during transmission of a line of text before\n terminating the line, the `ct_telnet:expect/3` function would print the line\n twice in the test case HTML log. This problem has been fixed.\n\n Own Id: OTP-13730 Aux Id: seq13135\n\n- The functions `ct:set_verbosity/2` and `ct:get_verbosity/1` have been added in\n order to make it possible for test cases, CT Hooks, or test framework\n functions, to modify and read verbosity levels for logging.\n\n Own Id: OTP-13841\n\n- `make` (tools) and `ct_make` (common_test) would crash if an Erlang source\n file contained a `-warning()` directive.\n\n Own Id: OTP-13855","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.12.2 - Common Test Release Notes","ref":"notes.html#common_test-1-12-2"},{"type":"extras","doc":"- The following modules were missing in common_test.app.src: ct_groups,\n ct_property_test, ct_release_test, ct_webtool, ct_webtool_sup, test_server_gl.\n They have now been added.\n\n Own Id: OTP-13475\n\n- Common Test printed incorrect timestamps for received error reports.\n\n Own Id: OTP-13615 Aux Id: seq13124","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.12.1 - Common Test Release Notes","ref":"notes.html#common_test-1-12-1"},{"type":"extras","doc":"- The `nodelay` option used to be enabled (`true`) by default for sockets opened\n by the Common Test telnet client. This appeared to cause communication\n problems with telnet servers on some systems, and therefore the option is no\n longer used. Its value may instead be specified in the telnet connection\n settings. See the man page for `ct_telnet` for details. Please note that the\n interface function `connect` in `unix_telnet` has been updated with an extra\n argument and is now `unix_telnet:connect/7`.\n\n Own Id: OTP-13462 Aux Id: seq13077\n\n- Fix bug in cth_surefire: When a pre_init_per_suite hook fails before reaching\n the cth_surefire:pre_init_per_suite, cth_surefire produced incorrect XML.\n\n Own Id: OTP-13513\n\n- The `ct:get_timetrap_info/0` function has been updated to return more\n information about timetrap scaling.\n\n Own Id: OTP-13535\n\n- A problem with stylesheet HTML tags getting incorrectly escaped by Common Test\n has been corrected.\n\n Own Id: OTP-13536\n\n- The `ct_run` start flag `-no_esc_chars` and `ct:run_test/1` start option\n `{esc_chars,Bool}` have been introduced to make it possible to disable\n automatic escaping of characters. Automatic escaping of special HTML\n characters printed with `io:format/1,2` and `ct:pal/1,2,3,4` was introduced in\n Common Test 1.12. The new flag/option may be used to disable this feature for\n backwards compatibility reasons. (The option is also supported in test\n specifications).\n\n Own Id: OTP-13537","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.12 - Common Test Release Notes","ref":"notes.html#common_test-1-12"},{"type":"extras","doc":"- This update fixes the problem with generic printouts in the html log file not\n having special characters escaped. Printouts made with `io:format/2` and\n `ct:pal/2` will now get special characters escaped automatically. Common Test\n will not attempt to escape characters printed with `ct:log/2` since it is\n assumed that the user may want to print html tagged data using this function.\n A new function, `ct:log/5`, has been added, which offers optional escaping of\n characters. The latter function may also be used to print text to the log\n without headers and CSS class wrapping (analogue to `io:format/2`).\n\n Own Id: OTP-13003 Aux Id: seq13005\n\n- Commit 4cf832f1ad163f5b25dd8a6f2d314c169c23c82f erroneously removed logging of\n open and close of netconf connections. This is now corrected.\n\n Own Id: OTP-13386\n\n- The directory to which nodes started with `test_server:start_node/3` writes\n their erl_crash.dump is changed. The crashdumps were earlier written to the\n directory of test_server.beam, but in later versions of Microsoft Windows this\n is no longer writable (even for administrators). The framework (common_test)\n log directory is now used instead.\n\n Own Id: OTP-13388","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- This update makes it possible to specify multiple instances of the same group\n or test case in one test specification term in order to repeat execution.\n Example:\n `{groups, \"./\", my_SUITE, [my_group, my_group], {cases, all}}, or {cases, \"./\", my_SUITE, [my_tc, my_tc, my_tc]}.`\n\n Own Id: OTP-13241 Aux Id: seq12979\n\n- Two new CT hook functions have been added: `post_init_per_testcase/4` and\n `pre_end_per_testcase/3`. With these hook functions, it is possible to perform\n arbitrary actions (including modifications of test execution, test state and\n results) immediately before and after the execution of the test case.\n\n Own Id: OTP-13242 Aux Id: seq12991\n\n- The `ct_netconfc` was earlier very restrictive as to which SSH options the\n user could set. This is now changed, and any SSH option is now allowed. The\n netconf client will simply pass on any option, which it does not recognize, to\n SSH.\n\n Own Id: OTP-13338 Aux Id: seq13053,seq13069","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.11.2 - Common Test Release Notes","ref":"notes.html#common_test-1-11-2"},{"type":"extras","doc":"- If a ssh package contained more than one netconf end tag, then the second end\n tag was never detected in ct_netconfc:handle_data. Instead it was included in\n the XML data given to the xmerl parser, which then failed. The problem was\n introduced by OTP-13007, and has now been corrected.\n\n Own Id: OTP-13323","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.11.1 - Common Test Release Notes","ref":"notes.html#common_test-1-11-1"},{"type":"extras","doc":"- When data from the netconf server was split into many ssh packages, the\n netconf client performed really bad. This is now improved.\n\n Own Id: OTP-13007\n\n- In ct_netconfc, if a timer expired 'at the same time' as the server sent the\n rpc-reply, the timeout message might already be in the client's message queue\n when the client removed the timer ref from its 'pending' list. This caused a\n crash in the client since the timer ref could no longer be found when handling\n the timeout message. This problem is now fixed by always flushing the timeout\n message from the message queue when canceling a timer.\n\n Own Id: OTP-13008\n\n- The error logger handler ct_conn_log_h did not respect the 'silent' option,\n and tried to print to an undefined file descriptor. This has been corrected.\n\n Own Id: OTP-13035\n\n- If the user would let the test run proceed after test suite compilation\n failure, Common Test did not set the exit status to indicate failure as\n expected. This has been corrected. Also, the 'abort_if_missing_suites' option\n now makes Common Test abort the test run without asking the user if\n compilation fails, even if access to stdin/stdout exists.\n\n Own Id: OTP-13173 Aux Id: seq12978\n\n- With the Common Test 'create_priv_dir' start option set to 'auto_per_tc', the\n name of the priv directory for a configuration function could clash with the\n name of the priv directory for a test case, which would cause Test Server\n failure. This error has been corrected.\n\n Own Id: OTP-13181","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.11 - Common Test Release Notes","ref":"notes.html#common_test-1-11"},{"type":"extras","doc":"- The status of an aborted test due to test suite compilation error has changed\n from 'auto_skipped' to 'failed'. This affects both the textual log file, event\n handling and CT hook callbacks. The logging of compilation failures has also\n been improved, especially in the case of multiple test suites failing\n compilation.\n\n Own Id: OTP-10816\n\n- The Test Server source code parser (erl2html2) failed to handle the macro\n tuple in the syntax tree returned by epp_dodger. This error has been\n corrected.\n\n Own Id: OTP-12740\n\n- New options to make it possible to specify ssh_port in a .spec file:\n \\[\\{node_start, [\\{ssh_port, 9999\\}]\\}].\n\n And also to specify additional ssh options like paths to public-key files:\n \\[\\{node_start, [\\{ssh_opts, [\\{user_dir, \"/home/shrek/e2/\"\\}]\\}]\\}].\n\n Own Id: OTP-12809","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Earlier there was no way to add optional parameters like default-operation to\n an edit-config request sent with ct_netconfc:edit_config/3,4, you had to use\n ct_netconfc:send_rpc/2,3. For simplicity and completion, a new optional\n argument, OptParams, is now added to the edit_config function.\n\n Own Id: OTP-10446 Aux Id: kunagi-266 \\[177]\n\n- When running OTP tests using the ts interface, it is now possible to specify\n so called test categories per OTP application. A test category is represented\n by a CT test specification and defines an arbitrary subset of existing test\n suites, groups and cases. Examples of test categories are 'smoke' (smoke\n tests) and 'bench' (benchmarks). (Call ts:help() for more info). Also,\n functions for reading terms from the current test specification during test,\n ct:get_testspec_terms/0 and ct:get_testspec_terms/1, have been implemented.\n\n Own Id: OTP-11962\n\n- Obsolete scripts and make file operations have been removed and the\n installation chapter in the Common Test User's Guide has been updated.\n\n Own Id: OTP-12421\n\n- The 'keep_alive' interval has been reduced to 8 seconds, which is two seconds\n shorter than the default 'idle_timeout' value for ct_telnet:expect/3. This\n way, the telnet server receives a NOP message (which might trigger an action)\n before the operation times out. Also the TCP option 'nodelay' has been enabled\n per default for all telnet connections, in order to reduce the risk for\n communication timeouts.\n\n Own Id: OTP-12678 Aux Id: seq12818\n\n- When the ct_run program is executed without any flags, \"-dir .\" is now used as\n default start flag. Similarly, the option \\{dir,\".\"\\} is used by ct:run_test/1\n if called with an empty list. Also, the help text (ct_run -help) has been\n updated, as well as the Running Tests chapter in the Common Test User's Guide.\n\n Own Id: OTP-12684 Aux Id: seq12865","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.10.1 - Common Test Release Notes","ref":"notes.html#common_test-1-10-1"},{"type":"extras","doc":"- A fault in the Common Test logger process, that caused the application to\n crash when running on a long name node, has been corrected.\n\n Own Id: OTP-12643\n\n- A 'wait_for_prompt' option in ct_telnet:expect/3 has been introduced which\n forces the function to not return until a prompt string has been received,\n even if other expect patterns have already been found.\n\n Own Id: OTP-12688 Aux Id: seq12818\n\n- If the last expression in a test case causes a timetrap timeout, the stack\n trace is ignored and not printed to the test case log file. This happens\n because the \\{Suite,TestCase,Line\\} info is not available in the stack trace\n in this scenario, due to tail call elimination. Common Test has been modified\n to handle this situation by inserting a \\{Suite,TestCase,last_expr\\} tuple in\n the correct place and printing the stack trace as expected.\n\n Own Id: OTP-12697 Aux Id: seq12848\n\n- Fixed a buffer problem in ct_netconfc which could cause that some messages\n where buffered forever.\n\n Own Id: OTP-12698 Aux Id: seq12844\n\n- The VTS mode in Common Test has been modified to use a private version of the\n Webtool application (ct_webtool).\n\n Own Id: OTP-12704 Aux Id: OTP-10922\n\n- Add possibility to add user capabilities in `ct_netconfc:hello/3`.\n\n Own Id: OTP-12707 Aux Id: seq12846","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.10 - Common Test Release Notes","ref":"notes.html#common_test-1-10"},{"type":"extras","doc":"- The tests overview file, index.html, did not always get updated correctly\n after a new test run. This was because of a bug in the Common Test log cache\n mechanism which has now been corrected.\n\n Own Id: OTP-11400\n\n- When a successful test case returns, Common Test should, according to the\n documentation, send a tc_done event to the event handlers with Result = ok in\n the data field. However, Common Test sets Result to the return value of the\n test case instead. Common Test has been modified now to comply with the\n documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12279 Aux Id: seq12737, OTP-12531\n\n- A ct_telnet:expect/3 call could never be aborted before an idle_timeout, even\n if total_timeout had been set to a lower value (i.e. a shorter time). This\n problem has been fixed.\n\n Own Id: OTP-12335\n\n- The undocumented return value \\{skipped,Reason\\} from config functions and\n test cases was handled inconsistently. Test cases were e.g. reported as\n \"skipped\" to CT Hook functions, but \"successful\" to event handlers. Now, the\n above return value is consistently handled the same way as \\{skip,Reason\\} and\n this has also been documented.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12359 Aux Id: seq12760\n\n- The Erlang source code to HTML generator would sometimes fail because\n epp:parse_erl_form/1 could not find and expand required macros in included\n header files. The problem has been solved by making sure common_test always\n passes the full include path to epp. Also, a bug that could cause\n erl_syntax:revert/1 to fail because of a badly formed syntax tree has been\n corrected.\n\n Own Id: OTP-12419\n\n- A missing group option in the ct_run help text has been added.\n\n Own Id: OTP-12433 Aux Id: seq12788\n\n- Printouts by means of ct:log/2/3 or ct:pal/2/3 from the hook functions\n on_tc_fail/2 and on_tc_skip/2 would (quite unexpectedly) end up in the\n \"unexpected i/o\" log file instead of in the test case log file. This behaviour\n has been changed so that now, all printouts (including stdio printouts) from\n these hook functions will be routed to the test case log file.\n\n Own Id: OTP-12468\n\n- ct_netconfc:action/3 will now - if the return type is void - accept an RPC\n reply on the form \\{ok,\\[simple_xml()]\\}, and in this event return only the\n atom ok.\n\n Own Id: OTP-12491 Aux Id: seq12797\n\n- OTP-11971 erroneously changed the handling of relative paths for incl_dirs\n specified in the cover spec file. This is now corrected so these are expected\n to be relative to the directory where the cover spec file itself is stored\n\n Own Id: OTP-12498 Aux Id: OTP-11971\n\n- Some test cases have been updated to use ct:sleep/1 instead of timer:sleep/1.\n The reason being that the sleep times need to be scaled to compensate for slow\n execution (e.g. when cover is running).\n\n Own Id: OTP-12574","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Common Test now exports a function, ct:get_event_mgr_ref/0, that returns the\n name of the Common Test event manager. This makes it possible to plug in event\n handlers to the event manager while tests are running (using the gen_event\n API).\n\n Own Id: OTP-12506 Aux Id: seq12802\n\n- When a test case (or configuration function) fails because of an exit signal\n from a linked process, Common Test previously passed only the reason for\n process termination to the CT post hook functions and the event handlers (in\n the tc_done event). This has been changed so that now the tuple\n \\{'EXIT',ReasonForProcessTermination\\} is passed instead. This makes it much\n easier in the CT post hook functions to distinguish a failure of this sort\n from other types of errors and from the return value of a successful test\n case.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12531 Aux Id: OTP-12279\n\n- A new feature has been introduced in ct_telnet:get_data/1 that makes it\n possible to automatically poll the telnet connection in case an incomplete\n string (one that has not yet been terminated by a newline) remains in the\n receive buffer. The polling is controlled by two new telnet config values,\n which are documented in the ct_telnet reference manual. The polling mechanism\n is disabled by default (making the get_data/1 function backwards compatible).\n\n Own Id: OTP-12627","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.9 - Common Test Release Notes","ref":"notes.html#common_test-1-9"},{"type":"extras","doc":"- The source code to html code generator in Test Server (and Common Test) would\n fail to generate anchors in the html code for functions with non-expandable\n macros, resulting in bad html links to such functions. This correction lets\n the code generator ignore macros that can't be expanded (i.e. not pre-process\n them), so that correct anchors will always be produced.\n\n Own Id: OTP-11766 Aux Id: seq12556\n\n- OTP-11971 erroneously changed the handling of relative paths (import/export\n files) specified in the cover spec file. This is now corrected so these are\n expected to be relative to the directory where the cover spec file itself is\n stored.\n\n Own Id: OTP-12031\n\n- Common Test would sometimes crash while trying to print large amounts of SASL\n reports to log on a computer with a slow file system. This problem (due to an\n error in IO message buffering in ct_logs) has been fixed.\n\n Own Id: OTP-12159\n\n- The common_test telnet client, ct_telnet and friends, had some unstable test\n cases. Some of these were caused by the unix_telnet callback sending an extra\n newline after sending the password. This caused the sever to send an extra\n prompt back which confused the tests. The extra newline is no longer sent.\n\n Also, debug printouts and logging from the telnet client is improved, and some\n test cases are slightly modified in order to stabilize the test.\n\n Own Id: OTP-12329\n\n- ct_netconfc did not expect the return value \\{error,timeout\\} from\n ssh_connection:subsystem/4. This has been corrected.\n\n Own Id: OTP-12334","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new option, `{newline,boolean()}` is added to all functions in `ct_telnet`\n that send data (command strings) to the telnet server. By default, `ct_telnet`\n adds a newline to all command strings, and by setting the new option to\n `false` this behavior is turned off.\n\n Own Id: OTP-12252 Aux Id: seq12730\n\n- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.8.2 - Common Test Release Notes","ref":"notes.html#common_test-1-8-2"},{"type":"extras","doc":"- Ticket OTP-11971 introduced a runtime dependency towards test_server-3.7.1,\n since the interface between test_server and common_test was changed.\n Erroneously, the common_test.app file was not updated according to this. This\n has now been corrected.\n\n Own Id: OTP-12037","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Warning: this is experimental and may disappear or change without previous\n warning.\n\n Experimental support for running Quickcheck and PropEr tests from common_test\n suites is added to common_test. See the reference manual for the new module\n `ct_property_testing`.\n\n Experimental property tests are added under\n `lib/{inet,ssh}/test/property_test`. They can be run directly or from the\n commont_test suites `inet/ftp_property_test_SUITE.erl` and\n `ssh/test/ssh_property_test_SUITE.erl`.\n\n See the code in the `test` directories and the man page for details.\n\n (Thanks to Tuncer Ayaz for a patch adding Triq)\n\n Own Id: OTP-12119","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.8.1 - Common Test Release Notes","ref":"notes.html#common_test-1-8-1"},{"type":"extras","doc":"- Substrings in long telnet messages would sometimes get wrongly reversed. This\n error has been corrected.\n\n Own Id: OTP-11871 Aux Id: seq12581\n\n- The basic_html logging mode in Common Test (for compatibility with old\n browsers) generated HTML code with unbalanced tags. This has been fixed.\n\n Own Id: OTP-11917 Aux Id: seq12598\n\n- The mechanism for running code cover analysis with common_test has been\n improved. Earlier, if a test run consisted of multiple tests, cover would be\n started and stopped for each test. This would give \"intermediate\" cover logs\n available from the \"Coverage log\" link on the test suite result pages. To\n accumulate cover data over all tests, the 'export' option had to be used in\n the cover spec file. This was not well documented, and the functionality was\n quite confusing.\n\n Using the 'nodes' option in the cover spec file would fail when the test run\n consisted of multiple tests, since the specified nodes would only be included\n in the cover analysis of the first test.\n\n The repeated compilation and analysis of the same modules was also very time\n consuming.\n\n To overcome these problems, ct will now only cover compile and analyze modules\n once per test run, i.e. once for each cover spec file. The log file is\n available via a new button on the top level index page. The old \"Coverage log\"\n links on the test suite result pages still exist, but they all point to the\n same log containing the accumulated result.\n\n Own Id: OTP-11971\n\n- If multiple tests would run simultaneously on different Erlang nodes, writing\n their logs to the same directory, then there would often be entries in the\n all_runs.html log file showing incomplete results (all zeroes) upon\n completion. This problem was caused by a bug in the Common Test log cache\n mechanism, which has been fixed.\n\n Own Id: OTP-11988 Aux Id: seq12611","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.8 - Common Test Release Notes","ref":"notes.html#common_test-1-8"},{"type":"extras","doc":"- The error generated if a test case process received an exit from a linked\n process while executing init_per_testcase/2, was handled incorrectly by Common\n Test. The problem has been solved, and Common Test now reports this type of\n error correctly, with proper error reason and exit location as well.\n\n Own Id: OTP-11643\n\n- Running a parallel test case group with two or more instances of the same test\n case would result in identical log file names, and one test case instance\n would overwrite the log file of another. This problem has been solved.\n\n Own Id: OTP-11644\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744\n\n- The `cth_surefire` hook would crash in `pre_init_per_suite/3` if a previous\n hook returned `{skip,Reason}` or `{fail,Reason}` instead of a `Config` list.\n This error has been corrected, and `cth_surefire` will now simply propagate\n the received `InitData` value instead.\n\n Own Id: OTP-11811\n\n- Specs of return values are corrected for `ct_netconfc:get/2,3`,\n `ct_netconfc:get_config/3,4`, `ct_netconfc:action/2,3`,\n `ct_netconfc:send_rpc/2,3` and `ct_netconfc:send/2,3`.\n\n Own Id: OTP-11834 Aux Id: seq12574","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- ct_telnet can now log all communication taking place during a telnet session.\n Previously, only information about ct_telnet operations and commands, as well\n as explicitly requested data from the server, was logged.\n\n Furthermore, a logging mechanism based on an Error Logger event handler and a\n dedicated Common Test hook, `cth_conn_log`, now makes it possible to print\n data for individual connections to separate log files. Please see the\n `ct_telnet` reference manual for more information and examples.\n\n Important note: A new argument, `ConnName` has been added to the\n `unix_telnet:connect/5` callback function. This forces users that use private\n ct_telnet callback modules to update their code according to\n `unix_telnet:connect/6`. Please see the `unix_telnet` reference manual and\n source code module for details.\n\n Own Id: OTP-11440 Aux Id: seq12457\n\n- A new timeout option has been introduced for the `ct_telnet:expect/3`\n function. With `{total_timeout,Time}` it's possible to set a time limit for\n the complete expect operation. After `Time` milliseconds, `expect/3` returns\n `{error,timeout}`. The default value used if `total_timeout` is not specified,\n is infinity (i.e. no time limit). Please see the `ct_telnet` reference manual\n for more information.\n\n Own Id: OTP-11689\n\n- Some function specs are corrected or moved and some edoc comments are\n corrected in order to allow use of edoc. (Thanks to Pierre Fenoll)\n\n Own Id: OTP-11702\n\n- Test case group name information has been added to the data sent with\n `tc_user_skip` and `tc_auto_skip` event messages, as well as the data passed\n in calls to the CT Hook functions `on_tc_skip/3` and `on_tc_fail/3`. The\n modification only affects the function name element/argument. This value\n remains an atom if the test case in question does not belong to a test case\n group. Otherwise a tuple `{FuncName,GroupName}` (`{atom(),atom()}`) is passed\n instead.\n\n Note that this change may (depending on the patterns used for matching)\n require modifications of user event handlers and hook modules. Please see the\n Event Handling chapter in the Common Test User's Guide, and the reference\n manual for `ct_hooks`, for details.\n\n Note also that the Test Server framework callback function `report/2` has been\n modified. This change only affects users with test frameworks interfacing Test\n Server rather than Common Test. See the `test_server_ctrl` reference manual\n for details.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-11732 Aux Id: seq12541\n\n- If Common Test can't prompt the user to abort or continue the test run when\n one or more test suites fail to compile, a new option,\n `{abort_if_missing_suites,Bool}`, can be used to specify whether it should\n proceed with the test run, or stop execution. The default value of `Bool` is\n `false` (i.e. to proceed even if suites are missing).\n\n Own Id: OTP-11769","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- common_test: Fix problems reported by Dialyzer.\n\n Own Id: OTP-11525","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.7.4 - Common Test Release Notes","ref":"notes.html#common_test-1-7-4"},{"type":"extras","doc":"- Return values from group and testcase info functions are now properly checked,\n and associated test cases are auto skipped if a return value is invalid.\n\n Own Id: OTP-10631 Aux Id: kunagi-345 \\[256]\n\n- The way Common Test handles skipping of test cases has been updated. In\n previous versions, returning `{skip,Reason}` from a configuration function\n (such as init_per_suite or init_per_group), resulted in all affected test\n cases getting skipped with status `auto_skipped`. This was inappropriate,\n since this status is supposed to be used to inform that Common Test has taken\n the initiative to skip something (e.g. a test case group if init_per_group\n failed). Therefore, in this version of Common Test, whenever the user skips a\n suite, group, or individual test case (by means of a configuration function or\n test specification term), the affected test cases get the status\n `user_skipped` instead.\n\n This update has meant a few changes that may affect Common Test users in\n various ways:\n\n - The test results and statistics will be affected, which is important to know\n when running regression tests and comparing results to previous test runs.\n - Users that read or parse the textual log file `suite.log` will notice that\n an auto skipped function is now reported as `auto_skipped` rather than\n `skipped` as before.\n - When `require` fails in an info function (such as suite/0 or group/1), all\n affected configuration functions and test cases are marked as\n `auto_skipped`.\n - If Common Test detects an error in the test suite (such as e.g. an invalid\n all/0 function), all affected configuration functions and test cases are\n marked as `auto_skipped`.\n - If a repeated test run session reaches a deadline with `force_stop` enabled,\n all remaining test cases are marked as `auto_skipped` rather than\n `user_skipped` as before.\n - The event messages that Common Test generates during test runs have been\n affected by this update. For details see OTP-11524.\n\n Own Id: OTP-11305 Aux Id: OTP-11524\n\n- Returning \\{skip, Reason\\} from a pre_end_per_group/3 user hook function would\n result in an exit in the Common Test cth_log_redirect hook. This problem has\n been solved.\n\n Own Id: OTP-11409 Aux Id: seq12446\n\n- When the netconf server did not respond to the close-session request, the call\n to ct_netconfc:close_session/2 would hang forever waiting for the netconf\n client to terminate. This has been corrected. The client will now always\n terminate (and take down the connection) if the close-session request times\n out.\n\n Own Id: OTP-11478","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Fix cth_log_redirect.erl to fulfill gen_event behaviour. Thanks to Roberto\n Aloi.\n\n Own Id: OTP-11401\n\n- The first argument of the CT hook callback function `on_tc_skip/3` has been\n modified. When this function is called for `init_per_group` or\n `end_per_group`, the value of the first argument is now\n `{init_per_group,GroupName}` or `{end_per_group,GroupName}`.\n\n Own Id: OTP-11523\n\n- The following modifications have been made to the event messages that Common\n Test sends during test execution:\n\n - For the `tc_auto_skip` event, the value of the `Func` element has changed\n from `end_per_group` to `{end_per_group,GroupName}`.\n - When `require` fails in an info function, such as suite/0 or group/1, the\n init configuration function is now reported as `auto_skipped` instead of\n `skipped`, with the `tc_done` event.\n - When `require` fails in an info function because of a configuration name\n already in use, the `tc_done` event now reports the error with a tuple (of\n size 2) tagged `failed` instead of `skipped`.\n\n Please see the Event Handling chapter in the Common Test User's Guide for\n reference.\n\n Own Id: OTP-11524 Aux Id: OTP-11305","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.7.3 - Common Test Release Notes","ref":"notes.html#common_test-1-7-3"},{"type":"extras","doc":"- Documentation is added for ct_netconfc:send and ct_netconfc:send_rpc.\n\n Own Id: OTP-11132\n\n- ct_netconfc:create_subscription only allowed one XML element inside the\n 'filter' element. According to RFC5277 it should be allowed to add any number\n of elements inside the filter, so this is now corrected.\n\n Own Id: OTP-11166\n\n- The error handler installed by the Common Test hook cth_log_redirect did not\n respond to init:stop/1/2. This has been corrected.\n\n Own Id: OTP-11175 Aux Id: seq12356\n\n- Calling ct:pal/2 or ct:print/2 when Common Test was not running, would cause\n an exit. This has been changed and the string is now simply printed to stdout\n instead.\n\n Own Id: OTP-11176\n\n- Fixed problem with the cth_log_redirect hook making calls to an undefined\n function in ct_logs.\n\n Own Id: OTP-11238\n\n- When running tests with the 'repeat' option, the Common Test utility process\n did not always terminate quickly enough after a test run, causing the start of\n the next run to fail. A monitor is now used to ensure termination of the\n utility process after each test run.\n\n Own Id: OTP-11244 Aux Id: seq12396\n\n- Test Server installed an error handler (test_server_h) only to be able to\n write the name of the current test case to stdout whenever it received an\n error- or progress report. This functionality was not useful and has been\n removed. The built-in Common Test hook, cth_log_redirect, has instead been\n improved to now also tag all error- and progress reports in the log with\n suite-, group-, and/or test case name.\n\n Own Id: OTP-11263 Aux Id: seq12251","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new log, the \"Pre- and Post Test I/O Log\", has been introduced, which makes\n it possible to capture error- and progress reports, as well as printouts made\n with ct:log/2 and ct:pal/2, before and after a test run. (Some minor\n improvements of the logging system have been made at the same time). Links to\n the new log are found on the Common Test Framework Log page. The Common Test\n User's Guide has been updated with information about the new log and also with\n a new section on how to synchronize external applications with Common Test by\n means of the CT Hook init and terminate functions.\n\n Own Id: OTP-11272","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.7.2 - Common Test Release Notes","ref":"notes.html#common_test-1-7-2"},{"type":"extras","doc":"- A design flaw in the generic connection handling in Common Test made it\n impossible to implement a connection handler that could map multiple\n connection names (i.e. configuration variable aliases) to single connection\n pids. This problem has been solved.\n\n Own Id: OTP-10126 Aux Id: kunagi-178 \\[89]\n\n- If a telnet connection is hanging, then a call to ct_telnet:close/1 will time\n out after 5 seconds and the connection process is brutally killed. In some\n cases the connection would not be unregistered and attempts at opening a new\n connection with the same name would make common_test try to reuse the same\n connection since it believed that it was still alive. This has been\n corrected - a killed connection is now always unregistered.\n\n Own Id: OTP-10648 Aux Id: seq12212\n\n- Test performance has been improved by means of a cache for the top level HTML\n index logs (all_runs.html and index.html, in the logdir directory). This\n solves problems with slow start up times and test execution times increasing\n with the number of ct_run directories stored in logdir. The cached index\n entries are stored in RAM during test execution and are saved to file in\n logdir (for faster start up times) whenever a test run finishes.\n\n Own Id: OTP-10855\n\n- Testing of the test specification functionality has been improved and a couple\n of minor bugs have been discovered and corrected.\n\n Own Id: OTP-10857\n\n- Links to the top level index files in some HTML footers had disappeared. This\n error has been corrected. Also, a problem with the suite overview log file not\n being closed properly has been solved.\n\n Own Id: OTP-11046\n\n- Common Test would, in case of timetrap error, print a warning in the log if\n end_per_testcase wasn't implemented in the suite, even though it's an optional\n function. This printout has been removed.\n\n Own Id: OTP-11052","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- If it could not be decided which test case a certain log printout belonged to,\n the common test framework log was earlier used. Such printouts are now instead\n sent to unexpected_io.log.html in test_server so that there is only one place\n to look for \"missing\" printouts.\n\n Own Id: OTP-10494 Aux Id: kunagi-319 \\[230]\n\n- Make cover smarter about finding source from beam.\n\n In particular, search using the source path in module_info if the current\n heuristic fails.\n\n Own Id: OTP-10902\n\n- Add a variant of ct_slave:start/2 that starts a node with specified options on\n the local host.\n\n Own Id: OTP-10920\n\n- Integrate elliptic curve contribution from Andreas Schultz\n\n In order to be able to support elliptic curve cipher suites in SSL/TLS,\n additions to handle elliptic curve infrastructure has been added to public_key\n and crypto.\n\n This also has resulted in a rewrite of the crypto API to gain consistency and\n remove unnecessary overhead. All OTP applications using crypto has been\n updated to use the new API.\n\n Impact: Elliptic curve cryptography (ECC) offers equivalent security with\n smaller key sizes than other public key algorithms. Smaller key sizes result\n in savings for power, memory, bandwidth, and computational cost that make ECC\n especially attractive for constrained environments.\n\n Own Id: OTP-11009\n\n- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016\n\n- A link is added from the red error printout in a test case log (for a failed\n test case) to the full error description at the end of the log. The reason for\n this is that the error description in the red field is sometimes truncated at\n 50 characters in order to keep the log as short and easy to read as possible.\n\n Own Id: OTP-11044 Aux Id: seq12304\n\n- A new option 'no_prompt_check' is added to ct_telnet:expect/3. If this option\n is used, ct_telnet will not wait for a prompt or a newline before attempting\n to match the given pattern.\n\n Own Id: OTP-11095","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.7.1 - Common Test Release Notes","ref":"notes.html#common_test-1-7-1"},{"type":"extras","doc":"- If an event handler installed in the CT Master event manager took too long to\n respond during the termination phase, CT Master crashed because of a timeout\n after 5 secs. This would leave the system in a bad state. The problem has been\n solved by means of a 30 min timeout value and if CT Master gets a timeout\n after that time, it now kills the event manager and shuts down properly.\n\n Own Id: OTP-10634 Aux Id: kunagi-347 \\[258]\n\n- Printing with any of the ct printout functions from an event handler installed\n by Common Test, would cause a deadlock. This problem has been solved.\n\n Own Id: OTP-10826 Aux Id: seq12250\n\n- Using the force_stop flag/option to interrupt a test run caused a crash in\n Common Test. This problem has been solved.\n\n Own Id: OTP-10832","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Removed deprecated run_test program, use ct_run instead.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9052","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Test case execution time increases with size of test run.\n\n Own Id: OTP-10855","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.7 - Common Test Release Notes","ref":"notes.html#common_test-1-7"},{"type":"extras","doc":"- Severe errors detected by `test_server` (e.g. if log files directories cannot\n be created) will now be reported to `common_test` and noted in the\n `common_test` logs.\n\n Own Id: OTP-9769 Aux Id: kunagi-202 \\[113]\n\n- The earlier undocumented cross cover feature for accumulating cover data over\n multiple tests has now been fixed and documented.\n\n Own Id: OTP-9870 Aux Id: kunagi-206 \\[117]\n\n- If a busy test case generated lots of error messages,\n cth_log_redirect:post_end_per_testcase would crash with a timeout while\n waiting for the error logger to finish handling all error reports. The default\n timer was 5 seconds. This has now been extended to 5 minutes.\n\n Own Id: OTP-10040 Aux Id: kunagi-173 \\[84]\n\n- When a test case failed because of a timetrap time out, the `Config` data for\n the case was lost in the following call to `end_per_testcase/2`, and also in\n calls to the CT Hook function `post_end_per_testcase/4`. This problem has been\n solved and the `Config` data is now correctly passed to the above functions\n after a timetrap timeout failure.\n\n Own Id: OTP-10070 Aux Id: kunagi-175 \\[86]\n\n- Some calls to deprecated and removed functions in snmp are removed from\n ct_snmp.\n\n Own Id: OTP-10088 Aux Id: kunagi-176 \\[87]\n\n- In test_server, the same process would supervise the currently running test\n case and be group leader (and IO server) for the test case. Furthermore, when\n running parallel test cases, new temporary supervisor/group leader processes\n were spawned and the process that was group leader for sequential test cases\n would not be active. That would lead to several problems:\n\n \\* Processes started by init_per_suite will inherit the group leader of the\n init_per_suite process (and that group leader would not process IO requests\n when parallel test cases was running). If later a parallel test case caused\n such a processto print using (for example) io:format/2, the calling would\n hang.\n\n \\* Similarly, if a process was spawned from a parallel test case, it would\n inherit the temporary group leader for that parallel test case. If that\n spawned process later - when the group of parallel tests have finished -\n attempted to print something, its group leader would be dead and there would\n be `badarg` exception.\n\n Those problems have been solved by having group leaders separate from the\n processes that supervises the test cases, and keeping temporary group leader\n process for parallel test cases alive until no more process in the system use\n them as group leaders.\n\n Also, a new `unexpected_io.log` log file (reachable from the summary page of\n each test suite) has been introduced. All unexpected IO will be printed into\n it(for example, IO to a group leader for a parallel test case that has\n finished).\n\n Own Id: OTP-10101 Aux Id: OTP-10125\n\n- Some bugfixes in `ct_snmp:`\n\n - ct_snmp will now use the value of the 'agent_vsns' config variable when\n setting the 'variables' parameter to snmp application agent configuration.\n Earlier this had to be done separately - i.e. the supported versions had to\n be specified twice.\n - Snmp application failed to write notify.conf since ct_snmp gave the notify\n type as a string instead of an atom. This has been corrected.\n\n Own Id: OTP-10432\n\n- Some bugfixes in `ct_snmp`:\n\n - Functions `register_users/2`, `register_agents/2` and\n `register_usm_users/2`, and the corresponding `unregister_*/1` functions\n were not executable. These are corrected/rewritten.\n - Function `update_usm_users/2` is removed, and an unregister function is\n added instead. Update can now be done with unregister_usm_users and then\n register_usm_users.\n - Functions `unregister_*/2` are added, so specific users/agents/usm users can\n be unregistered.\n - Function `unload_mibs/1` is added for completeness.\n - Overriding configuration files did not work, since the files were written in\n priv_dir instead of in the configuration dir (priv_dir/conf). This has been\n corrected.\n - Arguments to `register_usm_users/2` were faulty documented. This has been\n corrected.\n\n Own Id: OTP-10434 Aux Id: kunagi-264 \\[175]\n\n- Faulty exported specs in common test has been corrected to\n `ct_netconfc:hook_options/0` and [`inet:hostname/0`](`t:inet:hostname/0`)\n\n Own Id: OTP-10601\n\n- The netconf client in common_test did not adjust the window after receiving\n data. Due to this, the client stopped receiving data after a while. This has\n been corrected.\n\n Own Id: OTP-10646","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- It is now possible to let a test specification include other test\n specifications. Included specs can either be joined with the source spec (and\n all other joined specs), resulting in one single test run, or they can be\n executed in separate test runs. Also, a start flag/option, `join_specs`, has\n been introduced, to be used in combination with the `spec` option. With\n `join_specs`, Common Test can be told to either join multiple test\n specifications, or run them separately. Without `join_specs`, the latter\n behaviour is default. Note that this is a change compared to earlier versions\n of Common Test, where specifications could only be joined. More information\n can be found in the Running Tests chapter in the User's Guide (see the Test\n Specifications section).\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9881 Aux Id: kunagi-350 \\[261]\n\n- The `ct_slave:start/3` function now supports an `{env,[{Var,Value}]}` option\n to extend environment for the slave node.\n\n Own Id: OTP-10469 Aux Id: kunagi-317 \\[228]\n\n- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665\n\n- Update common test modules to handle unicode:\n\n - Use UTF-8 encoding for all HTML files, except the HTML version of the test\n suite generated with erl2html2:convert, which will have the same encoding as\n the original test suite (.erl) file.\n - Encode link targets in HTML files with test_server_ctrl:uri_encode/1.\n - Use unicode modifier 't' with ~s when appropriate.\n - Use unicode:characters_to_list and unicode:characters_to_binary for\n conversion between binaries and strings instead of binary_to_list and\n list_to_binary.\n\n Own Id: OTP-10783","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- CT drops error reason when groups/0 crashes.\n\n Own Id: OTP-10631 Aux Id: kunagi-345 \\[256]\n\n- Event handler on a ct_master node causes hanging.\n\n Own Id: OTP-10634 Aux Id: kunagi-347 \\[258]\n\n- CT fails to open telnet conn after a timetrap timeout.\n\n Own Id: OTP-10648 Aux Id: seq12212","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.6.3.1 - Common Test Release Notes","ref":"notes.html#common_test-1-6-3-1"},{"type":"extras","doc":"- The following corrections/changes are done in the cth_surefire hook:\n\n - Earlier there would always be a 'properties' element under the 'testsuites'\n element. This would exist even if there were no 'property' element inside\n it. This has been changed so if there are no 'property' elements to display,\n then there will not be a 'properties' element either.\n - The XML file will now (unless other is specified) be stored in the top log\n directory. Earlier, the default directory would be the current working\n directory for the erlang node, which would mostly, but not always, be the\n top log directory.\n - The 'hostname' attribute in the 'testsuite' element would earlier never have\n the correct value. This has been corrected.\n - The 'errors' attribute in the 'testsuite' element would earlier display the\n number of failed testcases. This has been changed and will now always have\n the value 0, while the 'failures' attribute will show the number of failed\n testcases.\n - A new attribute 'skipped' is added to the 'testsuite' element. This will\n display the number of skipped testcases. These would earlier be included in\n the number of failed test cases.\n - The total number of tests displayed by the 'tests' attribute in the\n 'testsuite' element would earlier include init/end_per_suite and\n init/end_per_group. This is no longer the case. The 'tests' attribute will\n now only count \"real\" test cases.\n - Earlier, auto skipped test cases would have no value in the 'log' attribute.\n This is now corrected.\n - A new attributes 'log' is added to the 'testsuite' element.\n - A new option named 'url_base' is added for this hook. If this option is\n used, a new attribute named 'url' will be added to the 'testcase' and\n 'testsuite' elements.\n\n Own Id: OTP-10589","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.6.3 - Common Test Release Notes","ref":"notes.html#common_test-1-6-3"},{"type":"extras","doc":"- The ct:run_test/1 option 'config' only worked with a single config file, not a\n list of files. This has been fixed.\n\n Own Id: OTP-10495\n\n- ct_netconfc:close_session sometimes returned \\{error,closed\\} because the ssh\n connection was closed (from the server side) before the rpc-reply was received\n by the client. This is normal and cannot be helped. It has been corrected so\n the return will be 'ok' in this case. Other error situations will still give\n \\{error,Reason\\}.\n\n Own Id: OTP-10510 Aux Id: kunagi-320 \\[231]\n\n- ct_netconfc:close_session sometimes returned \\{error,closed\\} or (if the\n connection was named) \\{error,\\{process_down,Pid,normal\\}\\} because the ssh\n connection was closed (from the server side) before the rpc-reply was received\n by the client. This is normal and cannot be helped. It has been corrected so\n the return will be 'ok' in this situation.\n\n Own Id: OTP-10570\n\n- Fix bug where ct:require of same name with same config would return\n name_in_use.\n\n Own Id: OTP-10572","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new test case group search functionality has been implemented that makes\n Common Test search automatically through the group definitions tree (the\n return value of groups/0) and create tests for all paths of nested groups that\n match the specification. It also allows for specifying unique paths to sub\n groups in order to avoid execution of unwanted tests. This new feature can be\n used whenever starting a test run by means of the ct_run program, the\n ct:run_test/1 API function, or a Test Specification. Details can be found in\n the Test Case Group Execution section in the Running Tests chapter.\n\n Own Id: OTP-10466 Aux Id: kunagi-276 \\[187]","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Restore Config data if lost when test case fails.\n\n Own Id: OTP-10070 Aux Id: kunagi-175 \\[86]\n\n- IO server error in test_server.\n\n Own Id: OTP-10125 Aux Id: OTP-10101, kunagi-177 \\[88]\n\n- Faulty connection handling in common_test.\n\n Own Id: OTP-10126 Aux Id: kunagi-178 \\[89]","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.6.2.1 - Common Test Release Notes","ref":"notes.html#common_test-1-6-2-1"},{"type":"extras","doc":"- The interactive mode (ct_run -shell) would not start properly. This error has\n been fixed.\n\n Own Id: OTP-10414","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Common_Test 1.6.2 - Common Test Release Notes","ref":"notes.html#common_test-1-6-2"},{"type":"extras","doc":"- If a CT hook function caused a crash, this could in some situations cause\n Common Test to terminate due to an illegal IO operation. This error has been\n corrected.\n\n Own Id: OTP-10050 Aux Id: seq12039\n\n- The Common Test documentation states that timetraps are never active during\n execution of CT hook functions. This was only true for post hook functions,\n not for pre hook functions. The code for CT hooks has been modified to behave\n according to the documentation.\n\n Own Id: OTP-10069\n\n- If a CT hook function would call the exit/1 or throw/1 BIF (possibly\n indirectly, e.g. as a result of a timeout in gen_server:call/3), Common Test\n would hang. This problem has been fixed.\n\n Own Id: OTP-10072 Aux Id: seq12053\n\n- The documentation has been updated with information about how to deal with\n chaining of hooks which return fail/skip.\n\n Own Id: OTP-10077 Aux Id: seq12048\n\n- When ct_hooks called the id/1 functions of multiple hooks, it would reverse\n the order of the hooks and call the proceeding init/2 calls in the wrong\n order. This has been fixed.\n\n Own Id: OTP-10135\n\n- The surefire hook now correctly handles autoskipped initialization and test\n functions.\n\n Own Id: OTP-10158\n\n- The ct:get_status/0 function failed to report status if a parallel test case\n group was running at the time of the call. This has been fixed and the return\n value for the function has been updated. Please see the ct reference manual\n for details.\n\n Own Id: OTP-10172","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The support for \"silent connections\" has been updated to include ssh. Also, a\n silent_connections term has been added to the set of test specification terms.\n\n Own Id: OTP-9625 Aux Id: seq11918\n\n- It is now possible to specify an arbitrarily large tuple as the requires\n config data when using require and ct:get_config. See the ct:get_config and\n ct:require reference manual pages for details about which keys are allowed.\n\n This change introduces a backwards incompatibility in the `ct:require/2`\n interface. Previously when doing `ct:require(a_name,{key,subkey})`, a_name\n would be associated with key. This has been changed to that `a_name` is\n associated with `subkey`. This change also effects using `require` in an\n suite/group/testcase info function.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9626 Aux Id: seq11920\n\n- The ct_run program now sets the OS process exit status before it ends. Value 0\n indicates a successful test result, 1 indicates one or more failed or\n auto-skipped test cases, and 2 indicates test execution failure.\n\n Own Id: OTP-9865 Aux Id: OTP-10087\n\n- It is now possible to sort the HTML tables by clicking on the header elements.\n In order to reset a sorted table, the browser window should simply be\n refreshed. This feature requires that the browser supports javascript, and has\n javascript execution enabled. If the 'ct_run -basic_html' flag is used, no\n javascript code is included in the generated HTML code.\n\n Own Id: OTP-9896 Aux Id: seq12034, OTP-9835\n\n- A netconf client, ct_netconfc, is added to common_test. It supports basic\n netconf functionality over SSH. In order to allow testing of both success and\n failure cases, it is intentionally written to allow non-standard behavior.\n\n Own Id: OTP-10025\n\n- The test specification term \\{define,Constant,Value\\} has been introduced,\n which makes it possible to replace constant names (atom()) with values\n (term()) in arbitrary test specification terms. The 'define' makes the (now\n deprecated) 'alias' term obsolete. More details, including examples, can be\n found in the Test Specifications chapter in the Common Test User's Guide.\n\n Own Id: OTP-10049\n\n- Verbosity levels for log printouts has been added. This makes it possible to\n specify preferred verbosity for different categories of log printouts, as well\n as general printouts (such as standard IO), to allow control over which\n strings get printed and which get ignored. New versions of the Common Test\n logging functions, ct:log, ct:pal and ct:print, have been introduced, with a\n new Importance argument added. The Importance value is compared to the\n verbosity level at runtime. More information can be found in the chapter about\n Logging in the Common Test User's Guide.\n\n Own Id: OTP-10067 Aux Id: seq12050\n\n- The return values of ct:run_test/1 and ct:run_testspec/1 have been changed\n from an uninformative 'ok' (independent of the test outcome) to a value,\n \\{Ok,Failed,\\{UserSkipped,AutoSkipped\\}\\} (all integers), that presents the\n final test case result, or a value, \\{error,Reason\\}, that informs about fatal\n test execution failure. See details in the reference manual for ct.\n\n Own Id: OTP-10087 Aux Id: OTP-9865\n\n- The test specification syntax has been updated with new and missing terms,\n such as 'define', 'verbosity', 'auto_compile', 'stylesheet',\n 'silent_connections', 'basic_html' and 'release_shell'. See the Test\n Specification chapter in the Common Test User's Guide for details.\n\n Own Id: OTP-10089 Aux Id: OTP-10049\n\n- It is now possible to pause execution of a test case, by calling the\n ct:break/1/2 function. Execution is resumed with a call to ct:continue/0/1.\n Break/continue also works for test cases executing in parallel. See the ct\n reference manual for details.\n\n Own Id: OTP-10127\n\n- It is now possible to send user defined events from a testcase which will be\n picked up by the installed event handler.\n\n Own Id: OTP-10157\n\n- A new start option, release_shell, for ct:run_test/1, has been added, which\n makes Common Test release the shell process after the test suite compilation\n phase is finished. For details, see the Running Tests chapter in the User's\n Guide.\n\n Own Id: OTP-10248 Aux Id: OTP-10127","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.6.1 - Common Test Release Notes","ref":"notes.html#common_test-1-6-1"},{"type":"extras","doc":"- Common Test adds the test suite directories to the code path before executing\n the tests. These directories should also be removed from the code path at the\n end of the test run, which, prior to this fix, was not performed.\n\n Own Id: OTP-9595\n\n- An entry is now created in the index.html file (i.e. the overview file for the\n test run) for each repeated test during a test run. This was previously not\n the case. Note that in the top level (logdir) index file, however, only the\n last test result is listed. For example, given the test spec:\n \\[\\{merge_tests,false\\},\\{dirs,\"test1\"\\},\\{dirs,\"test1\"\\}]. In the index file\n for the test run (under Logdir/ct_run.Node.Date.Time), both tests are listed.\n In the top level index file (under Logdir), only the last test is listed (one\n has to find the previous results through the all_runs.html file).\n\n Own Id: OTP-9634 Aux Id: seq11924\n\n- After a test case timeout or abortion, the end_per_testcase function executes\n on a new dedicated process. The group leader for this process should be set to\n the IO server for the test case, which was not done properly. The result of\n this error was that no warnings about end_per_testcase failing or timing out\n were ever printed in the test case log. Also, help functions such as e.g.\n test_server:stop_node/1, attempting to synchronize with the IO server, would\n hang. The fault has been corrected.\n\n Own Id: OTP-9666\n\n- The ct:get_status/0 function would cause the calling process to receive 'DOWN'\n messages if no tests were running at the time of the call. This bug has been\n fixed.\n\n Own Id: OTP-9830 Aux Id: seq11975\n\n- A deadlock situation could occur if Common Test is forwarding error_handler\n printouts to Test Server at the same time a new test case is starting. This\n error has been fixed.\n\n Own Id: OTP-9894\n\n- A link to the ct_run program is now created, as expected, in the installation\n bin directory (default /usr/local/bin) during 'make install'.\n\n Own Id: OTP-9898\n\n- Using the repeat, duration or until option with ct:run_test/1, would cause an\n infinite loop. This has been fixed.\n\n Own Id: OTP-9899\n\n- Two or more test cases executing in parallel and printing to screen at the\n same time with ct:pal/2/3 or ct:print/2/3 could write into each other's\n \"slots\" and create a mess of mixed strings. In order to avoid this, only a\n single IO message is now ever sent per printout call.\n\n Own Id: OTP-9900 Aux Id: OTP-9904\n\n- When a test case was killed because of a timetrap timeout, the current\n location (suite, case and line) was not printed correctly in the log files.\n This has been corrected.\n\n Own Id: OTP-9930 Aux Id: seq12002\n\n- The wrong exit location was printed in the log file when ct:fail/1 or\n ct_fail/2 was called.\n\n Own Id: OTP-9933 Aux Id: seq12002\n\n- Test Server and Common Test would add new error handlers with each test run\n and fail to remove previously added ones. In the case of Test Server, this\n would only happen if SASL was not running on the test node. This has been\n fixed.\n\n Own Id: OTP-9941 Aux Id: seq12009\n\n- If a test case process was terminated due to an exit signal from a linked\n process, Test Server failed to report the correct name of the suite and case\n to the framework. This has been corrected.\n\n Own Id: OTP-9958 Aux Id: OTP-9855\n\n- When starting a test with ct_run and adding a directory to the code path using\n -pa or -pz (preceding -erl_args), Common Test would delete any existing\n directory in the code path with the same base name (see filename:basename/1)\n as the directory being added. This has been fixed.\n\n Own Id: OTP-9964\n\n- If passing two or more directories with the same base name (see\n filename:basename/1) to Common Test with ct_run -pa, only one of the\n directories would actually be added.\n\n Own Id: OTP-9975 Aux Id: seq12019\n\n- Configuration data required by the group info function was deleted before the\n call to post_end_per_group, which made it impossible for the hook function to\n read and use the data in question. This has been fixed.\n\n Own Id: OTP-9989\n\n- Disabling built-in hooks in a test specification was ignored, this has now\n been fixed.\n\n Own Id: OTP-10009\n\n- Various typographical errors corrected in documentation for common_test,\n driver, erl_driver and windows installation instructions. (Thanks to Tuncer\n Ayaz)\n\n Own Id: OTP-10037","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new optional feature has been introduced that enables Common Test to\n generate priv_dir directory names that are unique for each test case or config\n function. The name of the option/flag is 'create_priv_dir' and it can be set\n to value 'auto_per_run' (which is the default, existing, behaviour), or\n 'auto_per_tc' or 'manual_per_tc'. If 'auto_per_tc' is used, Test Server\n creates a dedicated priv_dir automatically for each test case (which can be\n very expensive in case of many and/or repeated cases). If 'manual_per_tc' is\n used, the user needs to create the priv_dir explicitly by calling the new\n function ct:make_priv_dir/0.\n\n Own Id: OTP-9659 Aux Id: seq11930\n\n- A column for test case group name has been added to the suite overview HTML\n log file.\n\n Own Id: OTP-9730 Aux Id: seq11952\n\n- It is now possible to use the post_end_per_testcase CT hook function to print\n a comment for a test case in the overview log file, even if the test case gets\n killed by a timetrap or unknown exit signal, or if the end_per_testcase\n function times out.\n\n Own Id: OTP-9855 Aux Id: seq11979\n\n- The pre- and post CT hook functions are now always called for all\n configuration functions, even for configuration functions that are not\n implemented in the test suite.\n\n Own Id: OTP-9880 Aux Id: seq11993\n\n- Common Test will now print error information (with a time stamp) in the test\n case log file immediately when a test case fails. This makes it easier to see\n when, in time, the fault actually occurred, and aid the job of locating\n relevant trace and debug printouts in the log.\n\n Own Id: OTP-9904 Aux Id: seq11985, OTP-9900\n\n- Test Server has been modified to check the SASL errlog_type parameter when\n receiving an error logger event, so that it doesn't print reports of type that\n the user has disabled.\n\n Own Id: OTP-9955 Aux Id: seq12013\n\n- The test specification term 'skip_groups' was implemented in Common Test v1.6.\n It was never documented however, which has now been attended to. Please see\n the Test Specifications chapter in the User's Guide for information.\n\n Own Id: OTP-9972\n\n- The Common Test Master has been updated to use a CSS style sheet for the html\n log files.\n\n Own Id: OTP-9973\n\n- If the init_per_group/2 and end_per_group/2 functions are not implemented in\n the test suite, Common Test calls it's own local init- and end functions -\n previously named ct_init_per_group/2 and ct_end_per_group/2 - when a group is\n executed. These functions have been renamed init_per_group/2 and\n end_per_group/2 respectively. Note that this may affect any user event handler\n identifying events by the old names.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9986 Aux Id: OTP-9992\n\n- By specifying a user defined function (\\{M,F,A\\} or fun) as timetrap value,\n either by means of an info function or by calling ct:timetrap/1, it is now\n possible to set a timetrap that will be triggered when the user function\n returns.\n\n Own Id: OTP-9988 Aux Id: OTP-9501, seq11894\n\n- If the optional configuration functions init_per_suite/1 and end_per_suite/1\n are not implemented in the test suite, local Common Test versions of these\n functions are called instead, and will be displayed in the overview log file.\n Any printouts made by the pre- or post_init_per_suite and pre- or\n post_end_per_suite hook functions are saved in the log files for these\n functions.\n\n Own Id: OTP-9992\n\n- A hook has been added to common test which outputs surefire XML for usage\n together with CI tools such as Jenkins. To enable the hook pass '-ct_hooks\n cth_surefire' to ct_run. See the CTH documentation for more details.\n\n Own Id: OTP-9995","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.6 - Common Test Release Notes","ref":"notes.html#common_test-1-6"},{"type":"extras","doc":"- A Getting Started chapter has been added to the Common Test User's Guide.\n\n Own Id: OTP-9156\n\n- The test case group info function has been implemented in Common Test. Before\n execution of a test case group, a call is now made to\n `TestSuite:group(GroupName)`. The function returns a list of test properties,\n e.g. to specify timetrap values, require configuration data, etc (analogue to\n the test suite- and test case info function). The scope of the properties set\n by `group(GroupName)` is all test cases and sub-groups of group `GroupName`.\n\n Own Id: OTP-9235\n\n- Common Test hooks are now in a final supported version. The Common Test hooks\n allow you to abstract out initialization behaviour that is common to multiple\n test suites into one place and also extend the behaviour of a suite without\n changing the suite itself. For more information see the Common Test user's\n guide.\n\n Own Id: OTP-9449\n\n- A new built-in common test hook has been added which captures error_logger and\n SASL event and prints them in the testcase log. To disable this (and any other\n built-in hooks) pass 'enable_builtin_hooks false' to common test.\n\n Own Id: OTP-9543\n\n- Common Test now calls info functions also for the `init/end_per_suite/1` and\n `init/end_per_group/2` configuration functions. These can be used e.g. to set\n timetraps and require external configuration data relevant only for the\n configuration functions in question (without affecting properties set for\n groups and test cases in the suite). The info function for\n `init/end_per_suite(Config)` is `init/end_per_suite()`, and for\n `init/end_per_group(GroupName,Config)` it's `init/end_per_group(GroupName)`.\n Info functions cannot be used with `init/end_per_testcase(TestCase, Config)`,\n since these configuration functions execute on the test case process and will\n use the same properties as the test case (i.e. properties set by the test case\n info function, `TestCase()`).\n\n Own Id: OTP-9569\n\n- It's now possible to read the full name of the test case log file during\n execution. One way to do this is to lookup it up as value of the key\n `tc_logfile` in the test case `Config` list (which means it can also be read\n by a pre- or post Common Test hook function). The data is also sent with the\n event `#event{name=tc_logfile,data={{Suite,Func},LogFileName}}`, and can be\n read by any installed event handler.\n\n Own Id: OTP-9676 Aux Id: seq11941\n\n- The look of the HTML log files generated by Common Test and Test Server has\n been improved (and made easier to customize) by means of a CSS file.\n\n Own Id: OTP-9706\n\n- Functions ct:fail(Format, Args) and ct:comment(Format, Args) have been added\n in order to make printouts of formatted error and comment strings easier (no\n need for the user to call io_lib:format/2 explicitly).\n\n Own Id: OTP-9709 Aux Id: seq11951\n\n- The order in which ct hooks are executed for cleanup hooks (i.e. _*end_per*_\n hooks) has been reversed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9774 Aux Id: seq11913\n\n- Printouts to stdout may be captured during test case execution. This is useful\n in order to e.g. read and parse tty printouts from the SUT during test case\n execution (if necessary, say, to determine the outcome of the test). The\n capturing session is started with `ct:capture_start/0`, and stopped with\n `ct:capture_stop/0`. The list of buffered strings is read and purged with\n `ct:capture_get/0/1`. It's possible to filter out printouts made with\n `ct:log/2/3` and `ct:pal/2/3` from the captured list of strings. This is done\n by calling `capture_get/1` with a list of log categories to exclude.\n\n Own Id: OTP-9775\n\n- The syntax for specifying test case groups in the all/0 list has been extended\n to include execution properties for both groups and sub-groups. The properties\n specified in all/0 for a group overrides the properties specified in the group\n declaration (in groups/0). The main purpose of this extension is to make it\n possible to run the same set of tests, but with different properties, without\n having to declare copies of the group in question. Also, the same syntax may\n be used in test specifications in order to change properties of groups at the\n time of execution, without having to edit the test suite. Please see the\n User's Guide for details and examples.\n\n Own Id: OTP-9809 Aux Id: OTP-9235","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Fix problems in CT/TS due to line numbers in exceptions.\n\n Own Id: OTP-9203","title":"Known Bugs and Problems - Common Test Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Common_Test 1.5.5 - Common Test Release Notes","ref":"notes.html#common_test-1-5-5"},{"type":"extras","doc":"- An error in how comments are colored in the test suite overview html log file\n has been corrected. As result, a new framework callback function,\n format_comment/1, has been introduced.\n\n Own Id: OTP-9237\n\n- Automatically generated init- and end-configuration functions for test case\n groups caused incorrect execution order of test cases. This has been\n corrected.\n\n Own Id: OTP-9369\n\n- If multiple directories were specified with the 'logdir' flag/option, Common\n Test would crash. This has been fixed so that an error is properly reported\n instead.\n\n Own Id: OTP-9370\n\n- If ct:log/2 was called with bad arguments, this could cause the Common Test IO\n handling process to crash. This fault has been corrected.\n\n Own Id: OTP-9371 Aux Id: OTP-8933\n\n- A bug has been fixed that made Test Server call the end_tc/3 framework\n function with an incorrect module name as first argument.\n\n Own Id: OTP-9379 Aux Id: seq11863\n\n- If a timetrap timeout occurred during execution of a function in a lib module\n (i.e. a function called directly or indirectly from a test case), the Suite\n argument in the end_tc/3 framework callback function would not correctly\n contain the name of the test suite, but the lib module. (This would only\n happen if the lib module was compiled with ct.hrl included). This error has\n been solved.\n\n Own Id: OTP-9398\n\n- Corrections of the vts mode. It will now report errors (about e.g. incorrect\n config files) instead of crashing or hanging. Furthermore, the requirement\n that the test directory name must have a \"\\_test\" suffix has been removed.\n Also, a workaround has been implemented for the limitation that the file\n browser (in many web browsers) will only return the basic file name, not the\n full directory path (which made it impossible to have config files in other\n directories than the main test directory).\n\n Own Id: OTP-9429\n\n- Add a proplist() type\n\n Recently I was adding specs to an API and found that there is no canonical\n proplist() type defined. (Thanks to Ryan Zezeski)\n\n Own Id: OTP-9499\n\n- It is now possible to use the 'step' flag/option to run the debugger for test\n suites that contain test case groups. This previously caused Common Test to\n crash. If 'step config' is specified, breakpoints are now also automatically\n set on init_per_group and end_per_group. Note that breakpoints are always set\n automatically on test case functions and this is true also for grouped cases.\n\n Own Id: OTP-9518 Aux Id: OTP-8933\n\n- The test index page was not refreshed at the start of each test suite which\n made it impossible to follow test execution by means of refreshing the browser\n window (no links to follow). This has been fixed.\n\n Own Id: OTP-9520 Aux Id: OTP-8933\n\n- If a test suite would start with a test case group defined without the\n init_per_group/2 and end_per_group/2 function, init_per_suite/1 would not\n execute initially and logging of the test run would fail. This error has been\n fixed.\n\n Own Id: OTP-9584\n\n- The \"Missing Suites\" link from the top level index page was incorrect and has\n been fixed.\n\n Own Id: OTP-9592","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Various corrections and updates to improve the handling and reporting of\n errors.\n\n Own Id: OTP-8933\n\n- The dir and suite start option can now be used in combination. E.g. executing\n my_SUITE in directory my_tests can either be specified as \"ct_run -suite\n my_tests/my_SUITE\" or as \"ct_run -dir my_tests -suite my_SUITE\". Furthermore,\n the specification: ct:run_test(\\[\\{suite,[\"./my_SUITE\"]\\},\\{testcase,t1\\}]) is\n now interpreted as ct:run_test(\\[\\{suite,\"./my_SUITE\"\\},\\{testcase,t1\\}]),\n i.e. only testcase t1 in test suite my_SUITE - not all cases - will be\n executed.\n\n Own Id: OTP-9155\n\n- A new option, 'logopts', has been introduced, to make it possible to modify\n some aspects of the logging behaviour in Common Test (or Test Server). For\n example, whenever an io printout is made, test_server adds newline (\\\\n) to\n the end of the output string. This may not always be a preferred action and\n can therefore be disabled by means of \"ct_run ... -logopts no_nl\" (or\n ct:run_test(\\[..., \\{logopts,[no_nl]\\}])). A new framework callback function,\n get_logopts/0, has been introduced (see the ct_framework module for details).\n\n Own Id: OTP-9372 Aux Id: OTP-9396\n\n- A new option, 'logopts', has been introduced, to make it possible to modify\n some aspects of the logging behaviour in Common Test (or Test Server). For\n example, if the html version of the test suite source code should not be\n generated during the test run (and consequently be unavailable in the log file\n system), the feature may be disabled by means of \"ct_run ... -logopts no_src\"\n (or ct:run_test(\\[..., \\{logopts,[no_src]\\}])). A new framework callback\n function, get_logopts/0, has been introduced (see the ct_framework module for\n details).\n\n Own Id: OTP-9396 Aux Id: seq11869, OTP-9372\n\n- CT Hooks can now be assigned a priority. The priority of a CTH determines when\n it should execute in relation to other CTHs. The CTH with the lowest priority\n will be executed first, CTHs with equal priority will be executed in the order\n which they were installed.\n\n Own Id: OTP-9445\n\n- It is now possible to use a tuple \\{M,F,A\\}, or a fun, as timetrap\n specification in the suite info function or test case info functions. The\n function must return a valid timeout value, as documented in the common_test\n man page and in the User's Guide.\n\n Own Id: OTP-9501 Aux Id: seq11894\n\n- A new built-in common test hook has been added which captures error_logger and\n SASL event and prints them in the testcase log. To disable this (and any other\n built-in hooks) pass 'enable_builtin_hooks false' to common test.\n\n Own Id: OTP-9543\n\n- Common Test now has the possibility to have built-in hooks which are started\n by default when any test is run. To disable built-in hooks pass\n 'enable_builtin_hooks false' to common test. See the common test hooks\n documentation for more details.\n\n Own Id: OTP-9564","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.5.4 - Common Test Release Notes","ref":"notes.html#common_test-1-5-4"},{"type":"extras","doc":"- It was previously not possible to use timetrap value 'infinity' with\n ct:timetrap/1. This has been fixed.\n\n Own Id: OTP-9159\n\n- The Common Test VTS mode has been updated to be able to report test results of\n suites that include test case groups (when it would previously crash).\n\n Own Id: OTP-9195\n\n- Common Test now refreshes the very top level index.html page at the start of\n each individual test in a test run, so that progress of the ongoing test can\n be tracked by following the link to its overview page.\n\n Own Id: OTP-9210 Aux Id: OTP-9054\n\n- A bug that made it impossible to cancel the previous timetrap when calling\n ct:timetrap/1 has been corrected.\n\n Own Id: OTP-9233 Aux Id: OTP-9159\n\n- Fix bug which would make cth's to not be removed when out of scope when adding\n a cth in suite/0 and crashing in pre_init_per_suite.\n\n Own Id: OTP-9264","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- It is now possible to return a tuple \\{fail,Reason\\} from init_per_testcase/2.\n The result is that the associated test case gets logged as failed without ever\n executing.\n\n Own Id: OTP-9160 Aux Id: seq11502\n\n- Common Test now accepts, but ignores, empty test case group specifications.\n\n Own Id: OTP-9161","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.5.3 - Common Test Release Notes","ref":"notes.html#common_test-1-5-3"},{"type":"extras","doc":"- Added an option to test specs which allow the execution of tests as is,\n instead of doing merging of tests on the same \"level\". See the merge_tests\n directive the test specification documentation.\n\n Own Id: OTP-9026 Aux Id: seq11768","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Alpha release of Common Test Hooks (CTH). CTHs allow the users of common test\n to abstract out common behaviours from test suites in a much more elegant and\n flexible way than was possible before. Note that the addition of this feature\n may introduce minor changes in the undocumented behaviour of the interface\n between common_test and test_server.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8851","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.5.2 - Common Test Release Notes","ref":"notes.html#common_test-1-5-2"},{"type":"extras","doc":"- Updated ct:get_status documentation to describe no_tests_running return value.\n\n Own Id: OTP-8895 Aux Id: seq11701\n\n- Fixed race condition test failures in the test suites testing common test's\n parallel groups feature.\n\n Own Id: OTP-8921\n\n- The include directive of testspecs now work when used on a remote node.\n\n Own Id: OTP-8935 Aux Id: seq11731","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- ct:parse_table can now handle multiline sql rows\n\n Own Id: OTP-8907 Aux Id: seq11702\n\n- The run_test executable has been renamed to the less generic ct_run to better\n work with other applications. run_test will remain until R16B at which point\n it will be removed.\n\n Own Id: OTP-8936","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.5.1 - Common Test Release Notes","ref":"notes.html#common_test-1-5-1"},{"type":"extras","doc":"- Returning \\{return_group_result,failed\\} from end_per_group in a group that is\n part of a sequence, did not cause the proceeding cases (or groups) to get\n skipped. This has been fixed.\n\n Own Id: OTP-8753 Aux Id: seq11644\n\n- ct:install now works as the documentation describes.\n\n Own Id: OTP-8818 Aux Id: seq-11666","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Common Test has been updated to handle start options and test specification\n terms for test case groups (and test cases in groups). Also, an option named\n 'label', has been added that associates the test run with a name that Common\n Test prints in the overview HTML logs.\n\n Own Id: OTP-8725 Aux Id: OTP-8727\n\n- Andrey Pampukha has been added to the AUTHORS file. Thank you Andrey for your\n work on configuration data handling, Large Scale Testing improvements, and\n other useful updates and fixes.\n\n Own Id: OTP-8803\n\n- The Configuration Data chapter in the User's Guide has been updated.\n\n Own Id: OTP-8804\n\n- Milliseconds are now included in timestamps in Common Test log entries.\n (Thanks to Tomas Johansson.)\n\n Own Id: OTP-8808","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.5 - Common Test Release Notes","ref":"notes.html#common_test-1-5"},{"type":"extras","doc":"- Process calls using monitors in Common Test would not clear the inbox of\n remaining DOWN messages. This has been fixed.\n\n Own Id: OTP-8621 Aux Id: seq11560","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- It is now possible for the user to provide specific callback modules that\n handle test configuration data, so that data on arbitrary form can be accessed\n (e.g. by reading files or by communicating with a configuration server\n process). Two default callback modules have been introduced in Common Test:\n ct_config_plain and ct_config_xml. The former is used to handle the\n traditional Common Test configuration files (with terms on key-value tuple\n form) and the latter to handle configuration data on XML representation.\n\n Own Id: OTP-8485\n\n- It is now possible to execute test suites that are not necessarily available\n on the local file system, but have been loaded on the test node in advance\n (e.g. sent as binaries from a remote node and loaded by RPC). A requirement is\n that the no_auto_compile (or \\{auto_compile,false\\}) parameter has been set.\n\n Own Id: OTP-8490 Aux Id: seq11500\n\n- Test Server will now call the end_per_testcase/2 function even if the test\n case has been terminated explicitly (with abort_current_testcase/1), or after\n a timetrap timeout. Under these circumstances the return value of\n end_per_testcase is completely ignored. Therefore the function will not be\n able to change the reason for test case termination by returning\n \\{fail,Reason\\}, nor will it be able to save data with \\{save_config,Data\\}.\n\n Own Id: OTP-8500 Aux Id: seq11521\n\n- It is now possible to use the test specification term 'init' to start Common\n Test nodes automatically, as well as have initial function calls evaluated on\n the nodes. A default callback module for the 'init' term, ct_slave, has been\n introduced to enable Common Test Master to perform host login and node startup\n operations over ssh.\n\n Own Id: OTP-8570\n\n- The run_test script has been replaced by a program (with the same name) which\n can be executed without explicit installation. The start flags are the same as\n for the legacy start script.\n\n Own Id: OTP-8650\n\n- Previously, a repeat property of a test case group specified the number of\n times the group should be repeated after the main test run. I.e. \\{repeat,N\\}\n would case the group to execute 1+N times. To be consistent with the behaviour\n of the run_test repeat option, this has been changed. N now specifies the\n absolute number of executions instead.\n\n Own Id: OTP-8689 Aux Id: seq11502\n\n- With the run_test -erl_args option, it's possible to divide the options on the\n run_test command line into ones that Common Test should process (those\n preceding -erl_args, and ones it should ignore (those succeeding -erl_args).\n Options preceding -erl_args that Common Test doesn't recognize are also\n ignored (i.e. the same behaviour as earlier versions of Common Test).\n\n Own Id: OTP-8690 Aux Id: OTP-8650\n\n- Directories added with -pa or -pz in the pre-erl_args part of the run_test\n command line will be converted from relative to absolute, this to avoid\n problems loading user modules when Common Test switches working directory\n during the test run.\n\n Own Id: OTP-8691 Aux Id: OTP-8650\n\n- The timetrap handling has been made more user controllable by means of new\n start options and new ct interface functions. With the 'multiply_timetraps'\n start option, it's possible to specify a value which all timetrap timeout\n values get multiplied by. This is useful e.g. to extend the timetraps\n temporarily while running cover or trace. The 'scale_timetraps' start option\n switches on or off the Test Server timetrap scaling feature (which tries to\n detect if the tests may benefit from extended timetraps, e.g. due to running\n certain test tools, and performs the scaling automatically). Furthermore, the\n ct:timetrap/1 function has been introduced, which makes it possible to\n set/reset timetraps during test execution. Also, a ct:sleep/1 function is now\n available, which takes the timetrap parameters into account when calculating\n the time to suspend the process.\n\n Own Id: OTP-8693\n\n- A new run_test start option, event_handler_init, has been added that takes a\n start argument which gets passed to the init function of the event handler.\n\n Own Id: OTP-8694","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4.7 - Common Test Release Notes","ref":"notes.html#common_test-1-4-7"},{"type":"extras","doc":"- The auto compilation feature of Common Test did not recognize if a header file\n included in a test suite was modified (if the dir start flag/option was used).\n This has been fixed.\n\n Own Id: OTP-8396 Aux Id: seq11488, OTP-8311","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The tc_status value in the Config list for a test case that has failed because\n of a timetrap timeout, has changed from \\{tc_status,timeout\\} to\n \\{tc_status,timetrap_timeout\\}.\n\n Own Id: OTP-8302\n\n- The documentation is now possible to build in an open source environment after\n a number of bugs are fixed and some features are added in the documentation\n build process.\n\n \\- The arity calculation is updated.\n\n \\- The module prefix used in the function names for bif's are removed in the\n generated links so the links will look like\n \"http://www.erlang.org/doc/man/erlang.html#append_element-2\" instead of\n \"http://www.erlang.org/doc/man/erlang.html#erlang:append_element-2\".\n\n \\- Enhanced the menu positioning in the html documentation when a new page is\n loaded.\n\n \\- A number of corrections in the generation of man pages (thanks to Sergei\n Golovan)\n\n \\- The legal notice is taken from the xml book file so OTP's build process can\n be used for non OTP applications.\n\n Own Id: OTP-8343\n\n- It is now possible to include the `ct.hrl` using the -include_lib directive.\n (Thanks to Fred Hebert.)\n\n Own Id: OTP-8379\n\n- The telnet client in Common Test sent \\[IAC,DO,NOP] to the server in attempt\n to keep the connection alive. This is not a valid sequence according to the\n standard, and some telnet servers would terminate the connection because of\n it. The client has been changed to send \\[IAC,NOP] every 10 secs instead,\n which should be a valid sequence. The client does not negotiate this type of\n \"keep alive\" message with the server, and if it causes problems, the user may\n disable the keep alive feature by adding \\{keep_alive,false\\} to the telnet\n configuration data for the server/connection. Please see the ct_telnet and\n unix_telnet manual pages for details.\n\n Own Id: OTP-8450 Aux Id: OTP-8311","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4.6 - Common Test Release Notes","ref":"notes.html#common_test-1-4-6"},{"type":"extras","doc":"- If the init_per_testcase/2 function fails, the test case now gets marked and\n counted as auto skipped, not user skipped (which would previously happen).\n\n Own Id: OTP-8289","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201\n\n- For a failed test case, the tc_done event is supposed to report info on the\n form \\{failed,Error\\}. Only Error was reported, however, which has now been\n fixed.\n\n Own Id: OTP-8235 Aux Id: seq-11414\n\n- It is now possible to fail a test case from the end_per_testcase/2 function,\n by returning \\{fail,Reason\\}.\n\n Own Id: OTP-8284\n\n- It is now possible to fail a test case by having the end_tc/3 framework\n function return \\{fail,Reason\\} for the test case.\n\n Own Id: OTP-8285\n\n- The test_server framework API (e.g. the end_tc/3 function) has been modified.\n See the test_server_ctrl documentation for details.\n\n Own Id: OTP-8286 Aux Id: OTP-8285, OTP-8287\n\n- Various updates of the test events have been implemented. The data field for\n some events, such as tc_done and tc_auto_skip has been modified to make\n pattern matching on the data easier and more consistent. Also the order in\n which some events are received has been altered. E.g. the tc_auto_skip event\n for a test case now comes after the tc_done for the failed configuration\n function (not before) which makes more sense. Note that no new events have\n been added and that the event record remains unchanged.\n\n Own Id: OTP-8287 Aux Id: OTP-8235\n\n- The marquee used for test names on the all_runs.html page has been removed on\n request. Note that the test name field has the full text string in a title\n tag, which is displayed when hovering the mouse pointer over it (i.e. if the\n web browser supports title tags).\n\n Own Id: OTP-8288\n\n- It is now possible to refresh the top level index files in an arbitrary log\n directory by specifying a \\{refresh_logs,LogDir\\} tuple in the ct:run_test/1\n options list. Also the -refresh_logs flag for the run_test script has been\n extended to take an optional LogDir argument, i.e. -refresh_logs \\[LogDir]. If\n no LogDir is specified, current working directory is assumed, unless the log\n directory is set with the -logdir flag.\n\n Own Id: OTP-8290\n\n- It was previously required that test suites were located under a test object\n (or OTP application) sub-directory named \"test\" (or under a directory named\n \" \\_test\"). This has been changed so that Common Test now looks for\n suites primarily in a test sub-directory only if the directory exists.\n Otherwise it will assume the suites are stored in the same directory the user\n specifies with e.g. the 'dir' start flag/option.\n\n Own Id: OTP-8294","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4.5 - Common Test Release Notes","ref":"notes.html#common_test-1-4-5"},{"type":"extras","doc":"- The Common Test logger process crashed if a test case in a sequence (declared\n with sequences/0) failed. This fault has been corrected.\n\n Own Id: OTP-8089 Aux Id: seq11334","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Various updates and fixes in Common Test and Test Server.\n\n Own Id: OTP-8045 Aux Id: OTP-8089,OTP-8105,OTP-8163\n\n- Errors in coverage data collection and analysis were difficult to detect. The\n logging has been improved so that more information about e.g. imported and\n missing modules is printed to the html log files.\n\n Own Id: OTP-8163 Aux Id: seq11374\n\n- The Common Test HTML overview pages have been improved. It is now possible to\n see if a test case has been skipped explicitly or because a configuration\n function has failed. Also, the history page (all_runs.html) now has scrolling\n text displaying the test names. The old format (showing names as a truncated\n string) can still be generated by means of the flag/option 'basic_html'.\n\n Own Id: OTP-8177","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4.2 - Common Test Release Notes","ref":"notes.html#common_test-1-4-2"},{"type":"extras","doc":"- Various corrections and improvements of Common Test and Test Server.\n\n Own Id: OTP-7981","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4.1 - Common Test Release Notes","ref":"notes.html#common_test-1-4-1"},{"type":"extras","doc":"- Minor updates and corrections.\n\n Own Id: OTP-7897","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.4 - Common Test Release Notes","ref":"notes.html#common_test-1-4"},{"type":"extras","doc":"- A support client module for SSH and SFTP, ct_ssh, has been introduced in\n Common Test.\n\n Own Id: OTP-7838\n\n- Test case groups have been introduced. With this feature it's possible to\n execute groups (possibly nested) of test cases, each group wrapped with a call\n to function init_per_group/2 and end_per_group/2. Group definitions are done\n by means of the new call-back function groups/0, which should return a list of\n definitions. A group definition contains a name tag, a list of properties and\n a list of test cases (including possible nested group definitions). The\n properties make it possible to execute test cases in parallel, in sequence and\n in shuffled order. It is also possible to repeat test cases according to\n different criteria. The properties can be combined, making it possible to e.g.\n repeat a conf case a certain number of times and execute the test cases in\n different (random) order every time. Available properties are: parallel,\n sequence, shuffle, repeat, repeat_until_all_ok, repeat_until_any_ok,\n repeat_until_any_fail and repeat_until_all_fail. Please see the Common Test\n User's Guide for details.\n\n Own Id: OTP-7839 Aux Id: OTP-7511\n\n- It is now possible to use DES3 encrypted configuration files with Common Test.\n\n Own Id: OTP-7842 Aux Id: OTP-7838\n\n- In previous versions of Common Test, only one FTP connection could be opened\n per configuration target name. This has been updated so that multiple\n connections may be opened. The possibility to use named connections is still\n supported.\n\n Own Id: OTP-7853 Aux Id: OTP-7838\n\n- The Erlang mode for Emacs has been updated with new and modified skeletons for\n Common Test and TS. Syntax for test case groups in Common Test (and conf cases\n with properties in TS) has been added and a new minimal Common Test suite\n skeleton has been introduced.\n\n Own Id: OTP-7856","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.6 - Common Test Release Notes","ref":"notes.html#common_test-1-3-6"},{"type":"extras","doc":"- When running a test which includes all suites in a test directory, if the auto\n compilation would fail for one suite, all following suites would be excluded\n from the test. This was an unwanted behaviour and has been corrected. Now all\n suites will always be compiled and only the failing ones excluded from the\n test (and logged as missing).\n\n Own Id: OTP-7750 Aux Id: OTP-7803\n\n- The step functionality in Common Test (based on interaction with Debugger) was\n broken. This has been fixed, and some new step features have also been added.\n Please see the Common Test User's Guide for details.\n\n Own Id: OTP-7800 Aux Id: seq11106","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- It is now possible for the user to specify include directories that Common\n Test will pass along to the compiler when suite and help modules are being\n compiled (which Common Test performs automatically before running tests).\n\n Own Id: OTP-7803 Aux Id: OTP-7750","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.5 - Common Test Release Notes","ref":"notes.html#common_test-1-3-5"},{"type":"extras","doc":"- If the Erlang runtime system was started without access to an erlang shell\n (e.g. -noshell), compilation errors would cause a crash in the Common Test\n application. Without access to a shell, Common Test cannot prompt the user to\n choose to continue or abort the test session, but must assume that the session\n should proceed.\n\n Own Id: OTP-7749 Aux Id: seq11175, seq11180","title":"Fixed Bugs and Malfunctions - Common Test Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- It is now possible for the Common Test user to disable the auto-compile\n feature. This is done by specifying the run_test flag -no_auto_compile, or the\n ct:run_test/1 option \\{auto_compile,false\\}.\n\n Own Id: OTP-7663\n\n- A new function, ct:get_config/3, has been added to Common Test that makes it\n possible to - if a particular config variable has been defined in multiple\n config files - return all matching values for the variable. The order of the\n elements in the returned list is the same as the specified order of the config\n files.\n\n Own Id: OTP-7758 Aux Id: seq11158\n\n- Because a telnet connection was always identified by a config variable alias,\n it was impossible to open multiple connections using the same telnet host data\n entry in the config file. This limitation has been removed by making it\n possible to associate a connection with handle value only (i.e. multiple\n connections may be opened using the same config variable). See\n ct_telnet:open/4 for details.\n\n Own Id: OTP-7781\n\n- A new syntax for defining default config data values has been introduced. In\n previous versions of Common Test, to define and access a default value for a\n config variable (in the suite info- or test case info function), an alias name\n had to be used. With the new syntax you may define default values without\n reference to aliases, like this: \\{default_config,VarName,DefaultValue\\}.\n Please see the User's Guide for more info.\n\n Own Id: OTP-7782\n\n- In previous versions of Common Test, whenever a config variable got associated\n with a name (by means of a require statement), the config variable name was\n replaced with the new name. This introduced unwanted dependencies between test\n cases (e.g. if one test case would introduce a new name, the following test\n cases could no longer access the config data by means of the original\n variable). This functionality has now been updated so that when new names are\n introduced with require, they become aliases (references) instead of\n replacements. Hence, config data elements can always, at any time, be accessed\n by means of the original config variable names.\n\n Own Id: OTP-7783","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.4 - Common Test Release Notes","ref":"notes.html#common_test-1-3-4"},{"type":"extras","doc":"- Common Test now uses the re application instead of the previous rx driver to\n perform regular expression matching on telnet strings. Since re works on all\n supported operating systems, it is now possible to run telnet sessions also on\n platforms such as e.g. Windows (which was not the case with the previous rx\n driver). Note that the rx driver is obsolete from now on, and will be removed\n from Common Test after OTP R12B.\n\n Own Id: OTP-7528","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.3 - Common Test Release Notes","ref":"notes.html#common_test-1-3-3"},{"type":"extras","doc":"- Various updates and improvements, plus some minor bug fixes, have been\n implemented in Common Test and Test Server.\n\n Own Id: OTP-7112\n\n- It is now possible, by means of the new function ct:abort_current_testcase/1\n or test_server_ctrl:abort_current_testcase/1, to abort the currently executing\n test case.\n\n Own Id: OTP-7518 Aux Id: OTP-7112","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.2 - Common Test Release Notes","ref":"notes.html#common_test-1-3-2"},{"type":"extras","doc":"- The configure test of the rx lib in Common Test was not performed during the\n general OTP application configuration phase. This made e.g. autoconf\n impossible. This has been changed to correspond with the normal OTP build\n procedure.\n\n Own Id: OTP-7379","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Common_Test 1.3.1 - Common Test Release Notes","ref":"notes.html#common_test-1-3-1"},{"type":"extras","doc":"- The rx library, included with common_test, failed to build on some\n architectures because the -fPIC compiler option was missing.\n\n Own Id: OTP-7111","title":"Improvements and New Features - Common Test Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"common_test 1.3.0 - Common Test Release Notes","ref":"notes.html#common_test-1-3-0"},{"type":"extras","doc":"\n# Introduction","title":"Introduction","ref":"introduction.html"},{"type":"extras","doc":"`Common Test` is a portable application for automated testing. It is suitable\nfor:\n\n- Black-box testing of target systems of any type (that is, not necessarily\n implemented in Erlang). This is performed through standard O&M interfaces\n (such as SNMP, HTTP, CORBA, and Telnet) and, if necessary, through\n user-specific interfaces (often called test ports).\n- White-box testing of Erlang/OTP programs. This is easily done by calling the\n target API functions directly from the test case functions.\n\n`Common Test` also integrates use of the OTP `m:cover` tool in application Tools\nfor code coverage analysis of Erlang/OTP programs.\n\n`Common Test` executes test suite programs automatically, without operator\ninteraction. Test progress and results are printed to logs in HTML format,\neasily browsed with a standard web browser. `Common Test` also sends\nnotifications about progress and results through an OTP event manager to event\nhandlers plugged in to the system. This way, users can integrate their own\nprograms for, for example, logging, database storing, or supervision with\n`Common Test`.\n\n`Common Test` provides libraries with useful support functions to fill various\ntesting needs and requirements. There is, for example, support for flexible test\ndeclarations through test specifications. There is also support for central\nconfiguration and control of multiple independent test sessions (to different\ntarget systems) running in parallel.","title":"Scope - Introduction","ref":"introduction.html#scope"},{"type":"extras","doc":"It is assumed that the reader is familiar with the Erlang programming language.","title":"Prerequisites - Introduction","ref":"introduction.html#prerequisites"},{"type":"extras","doc":"\n# Common Test Basics\n\n[](){: #basics }","title":"Common Test Basics","ref":"basics_chapter.html"},{"type":"extras","doc":"The `Common Test` framework is a tool that supports implementation and automated\nexecution of test cases to any types of target systems. `Common Test` is the\nmain tool being used in all testing- and verification activities that are part\nof Erlang/OTP system development and maintenance.\n\nTest cases can be executed individually or in batches. `Common Test` also\nfeatures a distributed testing mode with central control and logging. With this\nfeature, multiple systems can be tested independently in one common session.\nThis is useful, for example, when running automated large-scale regression\ntests.\n\nThe System Under Test (SUT) can consist of one or more target nodes.\n`Common Test` contains a generic test server that, together with other test\nutilities, is used to perform test case execution. The tests can be started from\na GUI, from the OS shell, or from an Erlang shell. _Test suites_ are files\n(Erlang modules) that contain the _test cases_ (Erlang functions) to be\nexecuted. _Support modules_ provide functions that the test cases use to do the\ntests.\n\nIn a black-box testing scenario, `Common Test`\\-based test programs connect to\nthe target system(s) through standard O&M and CLI protocols. `Common Test`\nprovides implementations of, and wrapper interfaces to, some of these protocols\n(most of which exist as standalone components and applications in OTP). The\nwrappers simplify configuration and add verbosity for logging purposes.\n`Common Test` is continuously extended with useful support modules. However,\nnotice that it is a straightforward task to use any Erlang/OTP component for\ntesting purposes with `Common Test`, without needing a `Common Test` wrapper for\nit. It is as simple as calling Erlang functions. A number of target-independent\ninterfaces are supported in `Common Test`, such as Generic Telnet and FTP. These\ncan be specialized or used directly for controlling instruments, traffic load\ngenerators, and so on.\n\n`Common Test` is also a very useful tool for white-box testing Erlang code (for\nexample, module testing), as the test programs can call exported Erlang\nfunctions directly. There is very little overhead required for implementing\nbasic test suites and executing simple tests. For black-box testing Erlang\nsoftware, Erlang RPC and standard O&M interfaces can be used for example.\n\nA test case can handle several connections to one or more target systems,\ninstruments, and traffic generators in parallel to perform the necessary actions\nfor a test. The handling of many connections in parallel is one of the major\nstrengths of `Common Test`, thanks to the efficient support for concurrency in\nthe Erlang runtime system, which `Common Test` users can take great advantage\nof.","title":"General - Common Test Basics","ref":"basics_chapter.html#general"},{"type":"extras","doc":"Test suites are organized in test directories and each test suite can have a\nseparate data directory. Typically, these files and directories are\nversion-controlled similar to other forms of source code (possibly by a version\ncontrol system like GIT or Subversion). However, `Common Test` does not itself\nput any requirements on (or has any awareness of) possible file and directory\nversions.","title":"Test Suite Organization - Common Test Basics","ref":"basics_chapter.html#test-suite-organization"},{"type":"extras","doc":"Support libraries contain functions that are useful for all test suites, or for\ntest suites in a specific functional area or subsystem. In addition to the\ngeneral support libraries provided by the `Common Test` framework, and the\nvarious libraries and applications provided by Erlang/OTP, there can also be a\nneed for customized (user specific) support libraries.","title":"Support Libraries - Common Test Basics","ref":"basics_chapter.html#support-libraries"},{"type":"extras","doc":"Testing is performed by running test suites (sets of test cases) or individual\ntest cases. A test suite is implemented as an Erlang module named\n` _SUITE.erl` which contains a number of test cases. A test case is\nan Erlang function that tests one or more things. The test case is the smallest\nunit that the `Common Test` test server deals with.\n\nSets of test cases, called test case groups, can also be defined. A test case\ngroup can have execution properties associated with it. Execution properties\nspecify if the test cases in the group are to be executed in random order, in\nparallel, or in sequence, and if the execution of the group is to be repeated.\nTest case groups can also be nested (that is, a group can, besides test cases,\ncontain subgroups).\n\nBesides test cases and groups, the test suite can also contain configuration\nfunctions. These functions are meant to be used for setting up (and verifying)\nenvironment and state in the SUT (and/or the `Common Test` host node), required\nfor the tests to execute correctly. Examples of operations are: Opening a\nconnection to the SUT, initializing a database, running an installation script,\nand so on. Configuration can be performed per suite, per test case group, and\nper individual test case.\n\nThe test suite module must conform to a [callback interface](`m:ct_suite`)\nspecified by the `Common Test` test server. For details, see section\n[Writing Test Suites](write_test_chapter.md#intro).\n\nA test case is considered successful if it returns to the caller, no matter what\nthe returned value is. However, a few return values have special meaning as\nfollows:\n\n- `{skip,Reason}` indicates that the test case is skipped.\n- `{comment,Comment}` prints a comment in the log for the test case.\n- `{save_config,Config}` makes the `Common Test` test server pass `Config` to\n the next test case.\n\nA test case failure is specified as a runtime error (a crash), no matter what\nthe reason for termination is. If you use Erlang pattern matching effectively,\nyou can take advantage of this property. The result is concise and readable test\ncase functions that look much more like scripts than actual programs. A simple\nexample:\n\n```erlang\nsession(_Config) ->\n {started,ServerId} = my_server:start(),\n {clients,[]} = my_server:get_clients(ServerId),\n MyId = self(),\n connected = my_server:connect(ServerId, MyId),\n {clients,[MyId]} = my_server:get_clients(ServerId),\n disconnected = my_server:disconnect(ServerId, MyId),\n {clients,[]} = my_server:get_clients(ServerId),\n stopped = my_server:stop(ServerId).\n```\n\nAs a test suite runs, all information (including output to `stdout`) is recorded\nin many different log files. A minimum of information is displayed in the user\nconsole (only start and stop information, plus a note for each failed test\ncase).\n\nThe result from each test case is recorded in a dedicated HTML log file, created\nfor the particular test run. An overview page displays each test case\nrepresented by a table row showing total execution time, if the case was\nsuccessful, failed, or skipped, plus an optional user comment. For a failed test\ncase, the reason for termination is also printed in the comment field. The\noverview page has a link to each test case log file, providing simple navigation\nwith any standard HTML browser.\n\n> #### Note {: .info }\n>\n> In the last row where totals are presented the time shown here is a sum of\n> rows, which are above (not accounting for parallel testcases).\n> On the other hand \"Elapsed Time\" is a clock time spent to run testcases.\n>\n\n[](){: #External_Interfaces }","title":"Suites and Test Cases - Common Test Basics","ref":"basics_chapter.html#suites-and-test-cases"},{"type":"extras","doc":"The `Common Test` test server requires that the test suite defines and exports\nthe following mandatory or optional callback functions:\n\n- **`all()`** - Returns a list of all test cases and groups in the suite.\n (Mandatory)\n\n- **`suite()`** - Information function used to return properties for the suite.\n (Optional)\n\n- **`groups()`** - For declaring test case groups. (Optional)\n\n- **`init_per_suite(Config)`** - Suite level configuration function, executed\n before the first test case. (Optional)\n\n- **`end_per_suite(Config)`** - Suite level configuration function, executed\n after the last test case. (Optional)\n\n- **`group(GroupName)`** - Information function used to return properties for a\n test case group. (Optional)\n\n- **`init_per_group(GroupName, Config)`** - Configuration function for a group,\n executed before the first test case. (Optional)\n\n- **`end_per_group(GroupName, Config)`** - Configuration function for a group,\n executed after the last test case. (Optional)\n\n- **`init_per_testcase(TestCase, Config)`** - Configuration function for a\n testcase, executed before each test case. (Optional)\n\n- **`end_per_testcase(TestCase, Config)`** - Configuration function for a\n testcase, executed after each test case. (Optional)\n\nFor each test case, the `Common Test` test server expects the following\nfunctions:\n\n- **Testcasename()** - Information function that returns a list of test case\n properties. (Optional)\n\n- **Testcasename(Config)** - The test case function.","title":"External Interfaces - Common Test Basics","ref":"basics_chapter.html#external-interfaces"},{"type":"extras","doc":"\n# Getting Started","title":"Getting Started","ref":"getting_started_chapter.html"},{"type":"extras","doc":"The purpose of this section is to let the newcomer get started in quickly\nwriting and executing some first simple tests with a \"learning by example\"\napproach. Most explanations are left for later sections. If you are not much\ninto \"learning by example\" and prefer more technical details, go ahead and skip\nto the next section.\n\nThis section demonstrates how simple it is to write a basic (yet for many module\ntesting purposes, often sufficiently complex) test suite and execute its test\ncases. This is not necessarily obvious when you read the remaining sections in\nthis User's Guide.\n\n> #### Note {: .info }\n>\n> To understand what is discussed and examplified here, we recommended you to\n> first read section [Common Test Basics](basics_chapter.md#basics).","title":"Introduction for Newcomers - Getting Started","ref":"getting_started_chapter.html#introduction-for-newcomers"},{"type":"extras","doc":"Execution of test cases is handled as follows:\n\n![Successful and Unsuccessful Test Case Execution](assets/tc_execution.gif \"Successful and Unsuccessful Test Case Execution\")\n\nFor each test case that `Common Test` is ordered to execute, it spawns a\ndedicated process on which the test case function starts running. (In parallel\nto the test case process, an idle waiting timer process is started, which is\nlinked to the test case process. If the timer process runs out of waiting time,\nit sends an exit signal to terminate the test case process. This is called a\n_timetrap_).\n\nIn scenario 1, the test case process terminates normally after `case A` has\nfinished executing its test code without detecting any errors. The test case\nfunction returns a value and `Common Test` logs the test case as successful.\n\nIn scenario 2, an error is detected during test `case B` execution. This causes\nthe test `case B` function to generate an exception and, as a result, the test\ncase process exits with reason other than normal. `Common Test` logs this as an\nunsuccessful (Failed) test case.\n\nAs you can understand from the illustration, `Common Test` requires a test case\nto generate a runtime error to indicate failure (for example, by causing a bad\nmatch error or by calling [`exit/1`](`exit/1`), preferably through the help\nfunction [`ct:fail/1,2`](`ct:fail/1`)). A successful execution is indicated by a\nnormal return from the test case function.","title":"Test Case Execution - Getting Started","ref":"getting_started_chapter.html#test-case-execution"},{"type":"extras","doc":"As shown in section [Common Test Basics](basics_chapter.md#External_Interfaces),\nthe test suite module implements [callback functions](`m:ct_suite`) (mandatory\nor optional) for various purposes, for example:\n\n- Init/end configuration function for the test suite\n- Init/end configuration function for a test case\n- Init/end configuration function for a test case group\n- Test cases\n\nThe configuration functions are optional. The following example is a test suite\nwithout configuration functions, including one simple test case, to check that\nmodule `mymod` exists (that is, can be successfully loaded by the code server):\n\n```erlang\n-module(my1st_SUITE).\n-compile(export_all).\n\nall() ->\n [mod_exists].\n\nmod_exists(_) ->\n {module,mymod} = code:load_file(mymod).\n```\n\nIf the operation fails, a bad match error occurs that terminates the test case.","title":"A Simple Test Suite - Getting Started","ref":"getting_started_chapter.html#a-simple-test-suite"},{"type":"extras","doc":"If you need to perform configuration operations to run your test, you can\nimplement configuration functions in your suite. The result from a configuration\nfunction is configuration data, or `Config`. This is a list of key-value tuples\nthat get passed from the configuration function to the test cases (possibly\nthrough configuration functions on \"lower level\"). The data flow looks as\nfollows:\n\n![Configuration Data Flow in a Suite](assets/config.gif \"Configuration Data Flow in a Suite\")\n\nThe following example shows a test suite that uses configuration functions to\nopen and close a log file for the test cases (an operation that is unnecessary\nand irrelevant to perform by each test case):\n\n```erlang\n-module(check_log_SUITE).\n-export([all/0, init_per_suite/1, end_per_suite/1]).\n-export([check_restart_result/1, check_no_errors/1]).\n\n-define(value(Key,Config), proplists:get_value(Key,Config)).\n\nall() -> [check_restart_result, check_no_errors].\n\ninit_per_suite(InitConfigData) ->\n [{logref,open_log()} | InitConfigData].\n\nend_per_suite(ConfigData) ->\n close_log(?value(logref, ConfigData)).\n\ncheck_restart_result(ConfigData) ->\n TestData = read_log(restart, ?value(logref, ConfigData)),\n {match,_Line} = search_for(\"restart successful\", TestData).\n\ncheck_no_errors(ConfigData) ->\n TestData = read_log(all, ?value(logref, ConfigData)),\n case search_for(\"error\", TestData) of\n {match,Line} -> ct:fail({error_found_in_log,Line});\n nomatch -> ok\n end.\n```\n\nThe test cases verify, by parsing a log file, that our SUT has performed a\nsuccessful restart and that no unexpected errors are printed.\n\nTo execute the test cases in the recent test suite, type the following on the\nUNIX/Linux command line (assuming that the suite module is in the current\nworking directory):\n\n```text\n$ ct_run -dir .\n```\n\nor:\n\n```text\n$ ct_run -suite check_log_SUITE\n```\n\nTo use the Erlang shell to run our test, you can evaluate the following call:\n\n```erlang\n1> ct:run_test([{dir, \".\"}]).\n```\n\nor:\n\n```erlang\n1> ct:run_test([{suite, \"check_log_SUITE\"}]).\n```\n\nThe result from running the test is printed in log files in HTML format (stored\nin unique log directories on a different level). The following illustration\nshows the log file structure:\n\n![HTML Log File Structure](assets/html_logs.gif \"HTML Log File Structure\")","title":"A Test Suite with Configuration Functions - Getting Started","ref":"getting_started_chapter.html#a-test-suite-with-configuration-functions"},{"type":"extras","doc":"Here follows some questions that you might have after reading this section with\ncorresponding tips and links to the answers:\n\n- _Question:_ \"How and where can I specify variable data for my tests that must\n not be hard-coded in the test suites (such as hostnames, addresses, and user\n login data)?\"\n\n _Answer:_ See section\n [External Configuration Data](config_file_chapter.md#top).\n\n- _Question:_ \"Is there a way to declare different tests and run them in one\n session without having to write my own scripts? Also, can such declarations be\n used for regression testing?\"\n\n _Answer:_ See section\n [Test Specifications](run_test_chapter.md#test_specifications) in section\n Running Tests and Analyzing Results.\n\n- _Question:_ \"Can test cases and/or test runs be automatically repeated?\"\n\n _Answer:_ Learn more about\n [Test Case Groups](write_test_chapter.md#test_case_groups) and read about\n start flags/options in section [Running Tests](run_test_chapter.md#ct_run) and\n in the Reference Manual.\n\n- _Question:_ \"Does `Common Test` execute my test cases in sequence or in\n parallel?\"\n\n _Answer:_ See [Test Case Groups](write_test_chapter.md#test_case_groups) in\n section Writing Test Suites.\n\n- _Question:_ \"What is the syntax for timetraps (mentioned earlier), and how do\n I set them?\"\n\n _Answer:_ This is explained in the\n [Timetrap Time-Outs](write_test_chapter.md#timetraps) part of section Writing\n Test Suites.\n\n- _Question:_ \"What functions are available for logging and printing?\"\n\n _Answer:_ See [Logging](write_test_chapter.md#logging) in section Writing Test\n Suites.\n\n- _Question:_ \"I need data files for my tests. Where do I store them\n preferably?\"\n\n _Answer:_ See\n [Data and Private Directories](write_test_chapter.md#data_priv_dir).\n\n- _Question:_ \"Can I start with a test suite example, please?\"\n\n _Answer:_ [Welcome\\!](example_chapter.md#top)\n\nYou probably want to get started on your own first test suites now, while at the\nsame time digging deeper into the `Common Test` User's Guide and Reference\nManual. There are much more to learn about the things that have been introduced\nin this section. There are also many other useful features to learn, so please\ncontinue to the other sections and have fun.","title":"Questions and Answers - Getting Started","ref":"getting_started_chapter.html#questions-and-answers"},{"type":"extras","doc":"\n# Installation\n\n[](){: #general }","title":"Installation","ref":"install_chapter.html"},{"type":"extras","doc":"The two main interfaces for running tests with `Common Test` are an executable\nprogram named [`ct_run`](ct_run_cmd.md) and the Erlang module `m:ct`. `ct_run`\nis compiled for the underlying operating system (for example, Unix/Linux or\nWindows) during the build of the Erlang/OTP system, and is installed\nautomatically with other executable programs in the top level `bin` directory of\nErlang/OTP. The `ct` interface functions can be called from the Erlang shell, or\nfrom any Erlang function, on any supported platform.\n\nThe `Common Test` application is installed with the Erlang/OTP system. No extra\ninstallation step is required to start using `Common Test` through the `ct_run`\nexecutable program, and/or the interface functions in the `ct` module.","title":"General Information - Installation","ref":"install_chapter.html#general-information"},{"type":"extras","doc":"\n# Writing Test Suites\n\n[](){: #intro }","title":"Writing Test Suites","ref":"write_test_chapter.html"},{"type":"extras","doc":"The `m:ct` module provides the main interface for writing test cases. This\nincludes for example, the following:\n\n- Functions for printing and logging\n- Functions for reading configuration data\n- Function for terminating a test case with error reason\n- Function for adding comments to the HTML overview page\n\nFor details about these functions, see module `m:ct`.\n\nThe `Common Test` application also includes other modules named\n`ct_ `, which provide various support, mainly simplified use of\ncommunication protocols such as RPC, SNMP, FTP, Telnet, and others.","title":"Support for Test Suite Authors - Writing Test Suites","ref":"write_test_chapter.html#support-for-test-suite-authors"},{"type":"extras","doc":"A test suite is an ordinary Erlang module that contains test cases. It is\nrecommended that the module has a name on the form `*_SUITE.erl`. Otherwise, the\ndirectory and auto compilation function in `Common Test` cannot locate it (at\nleast not by default).\n\nIt is also recommended that the `ct.hrl` header file is included in all test\nsuite modules.\n\nEach test suite module must export function [`all/0`](`c:ct_suite:all/0`), which\nreturns the list of all test case groups and test cases to be executed in that\nmodule.\n\nThe callback functions to be implemented by the test suite are all listed in\nmodule [ct_suite ](`m:ct_suite`). They are also described in more detail later\nin this User's Guide.","title":"Test Suites - Writing Test Suites","ref":"write_test_chapter.html#test-suites"},{"type":"extras","doc":"Each test suite module can contain the optional configuration functions\n[`init_per_suite/1`](`c:ct_suite:init_per_suite/1`) and\n[`end_per_suite/1`](`c:ct_suite:end_per_suite/1`). If the init function is\ndefined, so must the end function be.\n\nIf `init_per_suite` exists, it is called initially before the test cases are\nexecuted. It typically contains initializations common for all test cases in the\nsuite, which are only to be performed once. `init_per_suite` is recommended for\nsetting up and verifying state and environment on the System Under Test (SUT) or\nthe `Common Test` host node, or both, so that the test cases in the suite\nexecutes correctly. The following are examples of initial configuration\noperations:\n\n- Opening a connection to the SUT\n- Initializing a database\n- Running an installation script\n\n`end_per_suite` is called as the final stage of the test suite execution (after\nthe last test case has finished). The function is meant to be used for cleaning\nup after `init_per_suite`.\n\n`init_per_suite` and `end_per_suite` execute on dedicated Erlang processes, just\nlike the test cases do. The result of these functions is however not included in\nthe test run statistics of successful, failed, and skipped cases.\n\nThe argument to `init_per_suite` is `Config`, that is, the same key-value list\nof runtime configuration data that each test case takes as input argument.\n`init_per_suite` can modify this parameter with information that the test cases\nneed. The possibly modified `Config` list is the return value of the function.\n\nIf `init_per_suite` fails, all test cases in the test suite are skipped\nautomatically (so called _auto skipped_), including `end_per_suite`.\n\nNotice that if `init_per_suite` and `end_per_suite` do not exist in the suite,\n`Common Test` calls dummy functions (with the same names) instead, so that\noutput generated by hook functions can be saved to the log files for these\ndummies. For details, see [Common Test Hooks](ct_hooks_chapter.md#manipulating).\n\n[](){: #per_testcase }","title":"Init and End per Suite - Writing Test Suites","ref":"write_test_chapter.html#init-and-end-per-suite"},{"type":"extras","doc":"Each test suite module can contain the optional configuration functions\n[`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) and\n[`end_per_testcase/2`](`c:ct_suite:end_per_testcase/2`). If the init function is\ndefined, so must the end function be.\n\nIf `init_per_testcase` exists, it is called before each test case in the suite.\nIt typically contains initialization that must be done for each test case\n(analog to `init_per_suite` for the suite).\n\n`end_per_testcase/2` is called after each test case has finished, enabling\ncleanup after `init_per_testcase`.\n\n> #### Note {: .info }\n>\n> If `end_per_testcase` crashes, however, test results are unaffected. At the\n> same time, this occurrence is reported in the test execution logs.\n\nThe first argument to these functions is the name of the test case. This value\ncan be used with pattern matching in function clauses or conditional expressions\nto choose different initialization and cleanup routines for different test\ncases, or perform the same routine for many, or all, test cases.\n\nThe second argument is the `Config` key-value list of runtime configuration\ndata, which has the same value as the list returned by `init_per_suite`.\n`init_per_testcase/2` can modify this parameter or return it \"as is\". The return\nvalue of `init_per_testcase/2` is passed as parameter `Config` to the test case\nitself.\n\nThe return value of `end_per_testcase/2` is ignored by the test server, with\nexception of the [`save_config`](dependencies_chapter.md#save_config) and `fail`\ntuple.\n\n`end_per_testcase` can check if the test case was successful. (which in turn can\ndetermine how cleanup is to be performed). This is done by reading the value\ntagged with `tc_status` from `Config`. The value is one of the following:\n\n- `ok`\n- `{failed,Reason}`\n\n where `Reason` is `timetrap_timeout`, information from [`exit/1`](`exit/1`),\n or details of a runtime error\n\n- `{skipped,Reason}`\n\n where `Reason` is a user-specific term\n\nFunction `end_per_testcase/2` is even called if a test case terminates because\nof a call to `ct:abort_current_testcase/1`, or after a timetrap time-out.\nHowever, `end_per_testcase` then executes on a different process than the test\ncase function. In this situation, `end_per_testcase` cannot change the reason\nfor test case termination by returning `{fail,Reason}` or save data with\n`{save_config,Data}`.\n\nThe test case is skipped in the following two cases:\n\n- If `init_per_testcase` crashes (called _auto skipped_).\n- If `init_per_testcase` returns a tuple `{skip,Reason}` (called _user\n skipped_).\n\nThe test case can also be marked as failed without executing it by returning a\ntuple `{fail,Reason}` from `init_per_testcase`.\n\n> #### Note {: .info }\n>\n> If `init_per_testcase` crashes, or returns `{skip,Reason}` or `{fail,Reason}`,\n> function `end_per_testcase` is not called.\n\nIf it is determined during execution of `end_per_testcase` that the status of a\nsuccessful test case is to be changed to failed, `end_per_testcase` can return\nthe tuple `{fail,Reason}` (where `Reason` describes why the test case fails).\n\nAs `init_per_testcase` and `end_per_testcase` execute on the same Erlang process\nas the test case, printouts from these configuration functions are included in\nthe test case log file.\n\n[](){: #test_cases }","title":"Init and End per Test Case - Writing Test Suites","ref":"write_test_chapter.html#init-and-end-per-test-case"},{"type":"extras","doc":"The smallest unit that the test server is concerned with is a test case. Each\ntest case can test many things, for example, make several calls to the same\ninterface function with different parameters.\n\nThe author can choose to put many or few tests into each test case. Some things\nto keep in mind follows:\n\n- Many small test cases tend to result in extra, and possibly duplicated code,\n as well as slow test execution because of large overhead for initializations\n and cleanups. Avoid duplicated code, for example, by using common help\n functions. Otherwise, the resulting suite becomes difficult to read and\n understand, and expensive to maintain.\n- Larger test cases make it harder to tell what went wrong if it fails. Also,\n large portions of test code risk being skipped when errors occur.\n- Readability and maintainability suffer when test cases become too large and\n extensive. It is not certain that the resulting log files reflect very well\n the number of tests performed.\n\nThe test case function takes one argument, `Config`, which contains\nconfiguration information such as `data_dir` and `priv_dir`. (For details about\nthese, see section\n[Data and Private Directories](write_test_chapter.md#data_priv_dir). The value\nof `Config` at the time of the call, is the same as the return value from\n`init_per_testcase`, mentioned earlier.\n\n> #### Note {: .info }\n>\n> The test case function argument `Config` is not to be confused with the\n> information that can be retrieved from the configuration files (using\n> [`ct:get_config/1/2`](`ct:get_config/1`)). The test case argument `Config` is\n> to be used for runtime configuration of the test suite and the test cases,\n> while configuration files are to contain data related to the SUT. These two\n> types of configuration data are handled differently.\n\nAs parameter `Config` is a list of key-value tuples, that is, a data type called\na property list, it can be handled by the `m:proplists` module. A value can, for\nexample, be searched for and returned with function `proplists:get_value/2`.\nAlso, or alternatively, the general `m:lists` module contains useful functions.\nNormally, the only operations performed on `Config` are insertion (adding a\ntuple to the head of the list) and lookup. To look up a value in the config,\n`proplists:get_value` can be used. For example:\n`PrivDir = proplists:get_value(priv_dir, Config)`.\n\nThe test case result can be customized in several ways. See the manual for\n[`Module:Testcase/1`](`c:ct_suite:'Testcase'/1`) in the `m:ct_suite` module for\ndetails.\n\n[](){: #info_function }","title":"Test Cases - Writing Test Suites","ref":"write_test_chapter.html#test-cases"},{"type":"extras","doc":"For each test case function there can be an extra function with the same name\nbut without arguments. This is the test case information function. It is\nexpected to return a list of tagged tuples that specifies various properties\nregarding the test case.\n\nThe following tags have special meaning:\n\n- **`timetrap`** - Sets the maximum time the test case is allowed to execute. If\n this time is exceeded, the test case fails with reason `timetrap_timeout`.\n Notice that `init_per_testcase` and `end_per_testcase` are included in the\n timetrap time. For details, see section\n [Timetrap Time-Outs](write_test_chapter.md#timetraps).\n\n- **`userdata`** - Specifies any data related to the test case. This data can be\n retrieved at any time using the `ct:userdata/3` utility function.\n\n- **`silent_connections`** - For details, see section\n [Silent Connections](run_test_chapter.md#silent_connections).\n\n- **`require`** - Specifies configuration variables required by the test case.\n If the required configuration variables are not found in any of the test\n system configuration files, the test case is skipped.\n\n A required variable can also be given a default value to be used if the\n variable is not found in any configuration file. To specify a default value,\n add a tuple on the form `{default_config,ConfigVariableName,Value}` to the\n test case information list (the position in the list is irrelevant).\n\n _Examples:_\n\n ```erlang\n testcase1() ->\n [{require, ftp},\n {default_config, ftp, [{ftp, \"my_ftp_host\"},\n {username, \"aladdin\"},\n {password, \"sesame\"}]}}].\n ```\n\n ```erlang\n testcase2() ->\n [{require, unix_telnet, unix},\n {require, {unix, [telnet, username, password]}},\n {default_config, unix, [{telnet, \"my_telnet_host\"},\n {username, \"aladdin\"},\n {password, \"sesame\"}]}}].\n ```\n\nFor more information about `require`, see section\n[Requiring and Reading Configuration Data](config_file_chapter.md#require_config_data)\nin section External Configuration Data and function\n[`ct:require/1/2`](`ct:require/1`).\n\n> #### Note {: .info }\n>\n> Specifying a default value for a required variable can result in a test case\n> always getting executed. This might not be a desired behavior.\n\nIf `timetrap` or `require`, or both, is not set specifically for a particular\ntest case, default values specified by function\n[`suite/0`](`c:ct_suite:suite/0`) are used.\n\nTags other than the earlier mentioned are ignored by the test server.\n\nAn example of a test case information function follows:\n\n```erlang\nreboot_node() ->\n [\n {timetrap,{seconds,60}},\n {require,interfaces},\n {userdata,\n [{description,\"System Upgrade: RpuAddition Normal RebootNode\"},\n {fts,\"http://someserver.ericsson.se/test_doc4711.pdf\"}]}\n ].\n```\n\n[](){: #suite }","title":"Test Case Information Function - Writing Test Suites","ref":"write_test_chapter.html#test-case-information-function"},{"type":"extras","doc":"Function [`suite/0`](`c:ct_suite:suite/0`) can, for example, be used in a test\nsuite module to set a default `timetrap` value and to `require` external\nconfiguration data. If a test case, or a group information function also\nspecifies any of the information tags, it overrides the default values set by\n`suite/0`. For details, see\n[Test Case Information Function](write_test_chapter.md#info_function) and\n[Test Case Groups](write_test_chapter.md#test_case_groups).\n\nThe following options can also be specified with the suite information list:\n\n- `stylesheet`, see [HTML Style Sheets](run_test_chapter.md#html_stylesheet)\n- `userdata`, see\n [Test Case Information Function](write_test_chapter.md#info_function)\n- `silent_connections`, see\n [Silent Connections](run_test_chapter.md#silent_connections)\n\nAn example of the suite information function follows:\n\n```erlang\nsuite() ->\n [\n {timetrap,{minutes,10}},\n {require,global_names},\n {userdata,[{info,\"This suite tests database transactions.\"}]},\n {silent_connections,[telnet]},\n {stylesheet,\"db_testing.css\"}\n ].\n```\n\n[](){: #test_case_groups }","title":"Test Suite Information Function - Writing Test Suites","ref":"write_test_chapter.html#test-suite-information-function"},{"type":"extras","doc":"A test case group is a set of test cases sharing configuration functions and\nexecution properties. Test case groups are defined by function\n[`groups/0`](`c:ct_suite:groups/0`) that should return a term having the\nfollowing syntax:\n\n```text\ngroups() -> GroupDefs\n\nTypes:\n\nGroupDefs = [GroupDef]\nGroupDef = {GroupName,Properties,GroupsAndTestCases}\nGroupName = atom()\nGroupsAndTestCases = [GroupDef | {group,GroupName} | TestCase |\n {testcase,TestCase,TCRepeatProps}]\nTestCase = atom()\nTCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]\n```\n\n`GroupName` is the name of the group and must be unique within the test suite\nmodule. Groups can be nested, by including a group definition within the\n`GroupsAndTestCases` list of another group. `Properties` is the list of\nexecution properties for the group. The possible values are as follows:\n\n```erlang\nProperties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]\nShuffle = shuffle | {shuffle,Seed}\nSeed = {integer(),integer(),integer()}\nGroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n repeat_until_any_ok | repeat_until_any_fail\nN = integer() | forever\n```\n\n_Explanations:_\n\n- **`parallel`** - `Common Test` executes all test cases in the group in\n parallel.\n\n- **`sequence`** - The cases are executed in a sequence as described in section\n [Sequences](dependencies_chapter.md#sequences) in section Dependencies Between\n Test Cases and Suites.\n\n- **`shuffle`** - The cases in the group are executed in random order.\n\n- **`repeat, repeat_until_*`** - Orders `Common Test` to repeat execution of all\n the cases in the group a given number of times, or until any, or all, cases\n fail or succeed.\n\n_Example:_\n\n```erlang\ngroups() -> [{group1, [parallel], [test1a,test1b]},\n {group2, [shuffle,sequence], [test2a,test2b,test2c]}].\n```\n\nTo specify in which order groups are to be executed (also with respect to test\ncases that are not part of any group), add tuples on the form\n`{group,GroupName}` to the `all/0` list.\n\n_Example:_\n\n```erlang\nall() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].\n```\n\nExecution properties with a group tuple in `all/0`:\n`{group,GroupName,Properties}` can also be specified. These properties override\nthose specified in the group definition (see `groups/0` earlier). This way, the\nsame set of tests can be run, but with different properties, without having to\nmake copies of the group definition in question.\n\nIf a group contains subgroups, the execution properties for these can also be\nspecified in the group tuple: `{group,GroupName,Properties,SubGroups}` Where,\n`SubGroups` is a list of tuples, `{GroupName,Properties}` or\n`{GroupName,Properties,SubGroups}` representing the subgroups. Any subgroups\ndefined in `groups/0` for a group, that are not specified in the `SubGroups`\nlist, executes with their predefined properties.\n\n_Example:_\n\n```erlang\ngroups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},\n {tests3, [], [t31,t3b]}]}].\n```\n\nTo execute group `tests1` twice with different properties for `tests2` each\ntime:\n\n```erlang\nall() ->\n [{group, tests1, default, [{tests2, [parallel]}]},\n {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].\n```\n\nThis is equivalent to the following specification:\n\n```erlang\nall() ->\n [{group, tests1, default, [{tests2, [parallel]},\n {tests3, default}]},\n {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},\n {tests3, default}]}].\n```\n\nValue `default` states that the predefined properties are to be used.\n\nThe following example shows how to override properties in a scenario with deeply\nnested groups:\n\n```erlang\ngroups() ->\n [{tests1, [], [{group, tests2}]},\n {tests2, [], [{group, tests3}]},\n {tests3, [{repeat,2}], [t3a,t3b,t3c]}].\n\nall() ->\n [{group, tests1, default,\n [{tests2, default,\n [{tests3, [parallel,{repeat,100}]}]}]}].\n```\n\nFor ease of readability, all syntax definitions can be replaced by a function\ncall whose return value should match the expected syntax case.\n\n_Example:_\n\n```erlang\nall() ->\n [{group, tests1, default, test_cases()},\n {group, tests1, default, [shuffle_test(),\n {tests3, default}]}].\ntest_cases() ->\n [{tests2, [parallel]}, {tests3, default}].\n\nshuffle_test() ->\n {tests2, [shuffle,{repeat,10}]}.\n```\n\nThe described syntax can also be used in test specifications to change group\nproperties at the time of execution, without having to edit the test suite. For\nmore information, see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results.\n\nAs illustrated, properties can be combined. If, for example, `shuffle`,\n`repeat_until_any_fail`, and `sequence` are all specified, the test cases in the\ngroup are executed repeatedly, and in random order, until a test case fails.\nThen execution is immediately stopped and the remaining cases are skipped.\n\nBefore execution of a group begins, the configuration function\n[`init_per_group(GroupName, Config)`](`c:ct_suite:init_per_group/2`) is called.\nThe list of tuples returned from this function is passed to the test cases in\nthe usual manner by argument `Config`. `init_per_group/2` is meant to be used\nfor initializations common for the test cases in the group. After execution of\nthe group is finished, function\n[`end_per_group(GroupName, Config)`](`c:ct_suite:end_per_group/2`) is called.\nThis function is meant to be used for cleaning up after `init_per_group/2`. If\nthe init function is defined, so must the end function be.\n\nWhenever a group is executed, if `init_per_group` and `end_per_group` do not\nexist in the suite, `Common Test` calls dummy functions (with the same names)\ninstead. Output generated by hook functions are saved to the log files for these\ndummies. For more information, see section\n[Manipulating Tests](ct_hooks_chapter.md#manipulating) in section Common Test\nHooks.\n\n> #### Note {: .info }\n>\n> `init_per_testcase/2` and `end_per_testcase/2` are always called for each\n> individual test case, no matter if the case belongs to a group or not.\n\nThe properties for a group are always printed in the top of the HTML log for\n`init_per_group/2`. The total execution time for a group is included at the\nbottom of the log for `end_per_group/2`.\n\nTest case groups can be nested so sets of groups can be configured with the same\n`init_per_group/2` and `end_per_group/2` functions. Nested groups can be defined\nby including a group definition, or a group name reference, in the test case\nlist of another group.\n\n_Example:_\n\n```erlang\ngroups() -> [{group1, [shuffle], [test1a,\n {group2, [], [test2a,test2b]},\n test1b]},\n {group3, [], [{group,group4},\n {group,group5}]},\n {group4, [parallel], [test4a,test4b]},\n {group5, [sequence], [test5a,test5b,test5c]}].\n```\n\nIn the previous example, if `all/0` returns group name references in the order\n`[{group,group1},{group,group3}]`, the order of the configuration functions and\ntest cases becomes the following (notice that `init_per_testcase/2` and\n`end_per_testcase/2:` are also always called, but not included in this example\nfor simplification):\n\n```text\ninit_per_group(group1, Config) -> Config1 (*)\n test1a(Config1)\n init_per_group(group2, Config1) -> Config2\n test2a(Config2), test2b(Config2)\n end_per_group(group2, Config2)\n test1b(Config1)\nend_per_group(group1, Config1)\ninit_per_group(group3, Config) -> Config3\n init_per_group(group4, Config3) -> Config4\n test4a(Config4), test4b(Config4) (**)\n end_per_group(group4, Config4)\n init_per_group(group5, Config3) -> Config5\n test5a(Config5), test5b(Config5), test5c(Config5)\n end_per_group(group5, Config5)\nend_per_group(group3, Config3)\n```\n\n(\\*) The order of test case `test1a`, `test1b`, and `group2` is undefined, as\n`group1` has a shuffle property.\n\n(\\*\\*) These cases are not executed in order, but in parallel.\n\nProperties are not inherited from top-level groups to nested subgroups. For\ninstance, in the previous example, the test cases in `group2` are not executed\nin random order (which is the property of `group1`).","title":"Test Case Groups - Writing Test Suites","ref":"write_test_chapter.html#test-case-groups"},{"type":"extras","doc":"If a group has a parallel property, its test cases are spawned simultaneously\nand get executed in parallel. However, a test case is not allowed to execute in\nparallel with `end_per_group/2`, which means that the time to execute a parallel\ngroup is equal to the execution time of the slowest test case in the group. A\nnegative side effect of running test cases in parallel is that the HTML summary\npages are not updated with links to the individual test case logs until function\n`end_per_group/2` for the group has finished.\n\nA group nested under a parallel group starts executing in parallel with previous\n(parallel) test cases (no matter what properties the nested group has). However,\nas test cases are never executed in parallel with `init_per_group/2` or\n`end_per_group/2` of the same group, it is only after a nested group has\nfinished that remaining parallel cases in the previous group become spawned.","title":"Parallel Property and Nested Groups - Writing Test Suites","ref":"write_test_chapter.html#parallel-property-and-nested-groups"},{"type":"extras","doc":"A parallel test case has a private I/O server as its group leader. (For a\ndescription of the group leader concept, see [ERTS](`e:erts:index.html`)). The\ncentral I/O server process, which handles the output from regular test cases and\nconfiguration functions, does not respond to I/O messages during execution of\nparallel groups. This is important to understand to avoid certain traps, like\nthe following:\n\nIf a process, `P`, is spawned during execution of, for example,\n`init_per_suite/1`, it inherits the group leader of the `init_per_suite`\nprocess. This group leader is the central I/O server process mentioned earlier.\nIf, at a later time, _during parallel test case execution_, some event triggers\nprocess `P` to call [`io:format/1/2`](`io:format/1`), that call never returns\n(as the group leader is in a non-responsive state) and causes `P` to hang.","title":"Parallel Test Cases and I/O - Writing Test Suites","ref":"write_test_chapter.html#parallel-test-cases-and-i-o"},{"type":"extras","doc":"[](){: #repeated_groups }\n\nA test case group can be repeated a certain number of times (specified by an\ninteger) or indefinitely (specified by `forever`). The repetition can also be\nstopped too early if any or all cases fail or succeed, that is, if any of the\nproperties `repeat_until_any_fail`, `repeat_until_any_ok`,\n`repeat_until_all_fail`, or `repeat_until_all_ok` is used. If the basic `repeat`\nproperty is used, status of test cases is irrelevant for the repeat operation.\n\nThe status of a subgroup can be returned (`ok` or `failed`), to affect the\nexecution of the group on the level above. This is accomplished by, in\n`end_per_group/2`, looking up the value of `tc_group_properties` in the `Config`\nlist and checking the result of the test cases in the group. If status `failed`\nis to be returned from the group as a result, `end_per_group/2` is to return the\nvalue `{return_group_result,failed}`. The status of a subgroup is taken into\naccount by `Common Test` when evaluating if execution of a group is to be\nrepeated or not (unless the basic `repeat` property is used).\n\nThe value of `tc_group_properties` is a list of status tuples, each with the key\n`ok`, `skipped`, and `failed`. The value of a status tuple is a list with names\nof test cases that have been executed with the corresponding status as result.\n\nThe following is an example of how to return the status from a group:\n\n```erlang\nend_per_group(_Group, Config) ->\n Status = proplists:get_value(tc_group_result, Config),\n case proplists:get_value(failed, Status) of\n [] -> % no failed cases\n {return_group_result,ok};\n _Failed -> % one or more failed\n {return_group_result,failed}\n end.\n```\n\nIt is also possible, in `end_per_group/2`, to check the status of a subgroup\n(maybe to determine what status the current group is to return). This is as\nsimple as illustrated in the previous example, only the group name is stored in\na tuple `{group_result,GroupName}`, which can be searched for in the status\nlists.\n\n_Example:_\n\n```erlang\nend_per_group(group1, Config) ->\n Status = proplists:get_value(tc_group_result, Config),\n Failed = proplists:get_value(failed, Status),\n case lists:member({group_result,group2}, Failed) of\n true ->\n {return_group_result,failed};\n false ->\n {return_group_result,ok}\n end;\n...\n```\n\n> #### Note {: .info }\n>\n> When a test case group is repeated, the configuration functions\n> `init_per_group/2` and `end_per_group/2` are also always called with each\n> repetition.","title":"Repeated Groups - Writing Test Suites","ref":"write_test_chapter.html#repeated-groups"},{"type":"extras","doc":"The order in which test cases in a group are executed is under normal\ncircumstances the same as the order specified in the test case list in the group\ndefinition. With property `shuffle` set, however, `Common Test` instead executes\nthe test cases in random order.\n\nYou can provide a seed value (a tuple of three integers) with the shuffle\nproperty `{shuffle,Seed}`. This way, the same shuffling order can be created\nevery time the group is executed. If no seed value is specified, `Common Test`\ncreates a \"random\" seed for the shuffling operation (using the return value of\n`erlang:timestamp/0`). The seed value is always printed to the\n`init_per_group/2` log file so that it can be used to recreate the same\nexecution order in a subsequent test run.\n\n> #### Note {: .info }\n>\n> If a shuffled test case group is repeated, the seed is not reset between\n> turns.\n\nIf a subgroup is specified in a group with a `shuffle` property, the execution\norder of this subgroup in relation to the test cases (and other subgroups) in\nthe group, is random. The order of the test cases in the subgroup is however not\nrandom (unless the subgroup has a `shuffle` property).\n\n[](){: #group_info }","title":"Shuffled Test Case Order - Writing Test Suites","ref":"write_test_chapter.html#shuffled-test-case-order"},{"type":"extras","doc":"The test case group information function, `group(GroupName)`, serves the same\npurpose as the suite- and test case information functions previously described.\nHowever, the scope for the group information function, is all test cases and\nsubgroups in the group in question (`GroupName`).\n\n_Example:_\n\n```erlang\ngroup(connection_tests) ->\n [{require,login_data},\n {timetrap,1000}].\n```\n\nThe group information properties override those set with the suite information\nfunction, and can in turn be overridden by test case information properties. For\na list of valid information properties and more general information, see the\n[Test Case Information Function](write_test_chapter.md#info_function).","title":"Group Information Function - Writing Test Suites","ref":"write_test_chapter.html#group-information-function"},{"type":"extras","doc":"Information functions can also be used for functions `init_per_suite`,\n`end_per_suite`, `init_per_group`, and `end_per_group`, and they work the same\nway as with the\n[Test Case Information Function](write_test_chapter.md#info_function). This is\nuseful, for example, for setting timetraps and requiring external configuration\ndata relevant only for the configuration function in question (without affecting\nproperties set for groups and test cases in the suite).\n\nThe information function `init/end_per_suite()` is called for\n`init/end_per_suite(Config)`, and information function\n`init/end_per_group(GroupName)` is called for\n`init/end_per_group(GroupName,Config)`. However, information functions cannot be\nused with `init/end_per_testcase(TestCase, Config)`, as these configuration\nfunctions execute on the test case process and use the same properties as the\ntest case (that is, the properties set by the test case information function,\n`TestCase()`). For a list of valid information properties and more general\ninformation, see the\n[Test Case Information Function](write_test_chapter.md#info_function).\n\n[](){: #data_priv_dir }","title":"Information Functions for Init- and End-Configuration - Writing Test Suites","ref":"write_test_chapter.html#information-functions-for-init-and-end-configuration"},{"type":"extras","doc":"In the data directory, `data_dir`, the test module has its own files needed for\nthe testing. The name of `data_dir` is the name of the test suite followed by\n`\"_data\"`. For example, `\"some_path/foo_SUITE.beam\"` has the data directory\n`\"some_path/foo_SUITE_data/\"`. Use this directory for portability, that is, to\navoid hardcoding directory names in your suite. As the data directory is stored\nin the same directory as your test suite, you can rely on its existence at\nruntime, even if the path to your test suite directory has changed between test\nsuite implementation and execution.\n\n`priv_dir` is the private directory for the test cases. This directory can be\nused whenever a test case (or configuration function) needs to write something\nto file. The name of the private directory is generated by `Common Test`, which\nalso creates the directory.\n\nBy default, `Common Test` creates one central private directory per test run,\nshared by all test cases. This is not always suitable. Especially if the same\ntest cases are executed multiple times during a test run (that is, if they\nbelong to a test case group with property `repeat`) and there is a risk that\nfiles in the private directory get overwritten. Under these circumstances,\n`Common Test` can be configured to create one dedicated private directory per\ntest case and execution instead. This is accomplished with the flag/option\n`create_priv_dir` (to be used with the [`ct_run`](ct_run_cmd.md) program, the\n`ct:run_test/1` function, or as test specification term). There are three\npossible values for this option as follows:\n\n- `auto_per_run`\n- `auto_per_tc`\n- `manual_per_tc`\n\nThe first value indicates the default `priv_dir` behavior, that is, one private\ndirectory created per test run. The two latter values tell `Common Test` to\ngenerate a unique test directory name per test case and execution. If the auto\nversion is used, _all_ private directories are created automatically. This can\nbecome very inefficient for test runs with many test cases or repetitions, or\nboth. Therefore, if the manual version is used instead, the test case must tell\n`Common Test` to create `priv_dir` when it needs it. It does this by calling the\nfunction `ct:make_priv_dir/0`.\n\n> #### Note {: .info }\n>\n> Do not depend on the current working directory for reading and writing data\n> files, as this is not portable. All scratch files are to be written in the\n> `priv_dir` and all data files are to be located in `data_dir`. Also, the\n> `Common Test` server sets the current working directory to the test case log\n> directory at the start of every case.","title":"Data and Private Directories - Writing Test Suites","ref":"write_test_chapter.html#data-and-private-directories"},{"type":"extras","doc":"Each test case is executed by a dedicated Erlang process. The process is spawned\nwhen the test case starts, and terminated when the test case is finished. The\nconfiguration functions `init_per_testcase` and `end_per_testcase` execute on\nthe same process as the test case.\n\nThe configuration functions `init_per_suite` and `end_per_suite` execute, like\ntest cases, on dedicated Erlang processes.\n\n[](){: #timetraps }","title":"Execution Environment - Writing Test Suites","ref":"write_test_chapter.html#execution-environment"},{"type":"extras","doc":"The default time limit for a test case is 30 minutes, unless a `timetrap` is\nspecified either by the suite-, group-, or test case information function. The\ntimetrap time-out value defined by `suite/0` is the value that is used for each\ntest case in the suite (and for the configuration functions `init_per_suite/1`,\n`end_per_suite/1`, `init_per_group/2`, and `end_per_group/2`). A timetrap value\ndefined by `group(GroupName)` overrides one defined by `suite()` and is used for\neach test case in group `GroupName`, and any of its subgroups. If a timetrap\nvalue is defined by `group/1` for a subgroup, it overrides that of its higher\nlevel groups. Timetrap values set by individual test cases (by the test case\ninformation function) override both group- and suite- level timetraps.\n\nA timetrap can also be set or reset dynamically during the execution of a test\ncase, or configuration function. This is done by calling `ct:timetrap/1`. This\nfunction cancels the current timetrap and starts a new one (that stays active\nuntil time-out, or end of the current function).\n\nTimetrap values can be extended with a multiplier value specified at startup\nwith option `multiply_timetraps`. It is also possible to let the test server\ndecide to scale up timetrap time-out values automatically. That is, if tools\nsuch as `cover` or `trace` are running during the test. This feature is disabled\nby default and can be enabled with start option `scale_timetraps`.\n\nIf a test case needs to suspend itself for a time that also gets multiplied by\n`multiply_timetraps` (and possibly also scaled up if `scale_timetraps` is\nenabled), the function `ct:sleep/1` can be used (instead of, for example,\n`timer:sleep/1`).\n\nA function (`fun/0` or `{Mod,Func,Args}` (MFA) tuple) can be specified as\ntimetrap value in the suite-, group- and test case information function, and as\nargument to function `ct:timetrap/1`.\n\n_Examples:_\n\n`{timetrap,{my_test_utils,timetrap,[?MODULE,system_start]}}`\n\n`ct:timetrap(fun() -> my_timetrap(TestCaseName, Config) end)`\n\nThe user timetrap function can be used for two things as follows:\n\n- To act as a timetrap. The time-out is triggered when the function returns.\n- To return a timetrap time value (other than a function).\n\nBefore execution of the timetrap function (which is performed on a parallel,\ndedicated timetrap process), `Common Test` cancels any previously set timer for\nthe test case or configuration function. When the timetrap function returns, the\ntime-out is triggered, _unless_ the return value is a valid timetrap time, such\nas an integer, or a `{SecMinOrHourTag,Time}` tuple (for details, see module\n`m:ct_suite`). If a time value is returned, a new timetrap is started to\ngenerate a time-out after the specified time.\n\nThe user timetrap function can return a time value after a delay. The effective\ntimetrap time is then the delay time _plus_ the returned time.\n\n[](){: #logging }","title":"Timetrap Time-Outs - Writing Test Suites","ref":"write_test_chapter.html#timetrap-time-outs"},{"type":"extras","doc":"`Common Test` provides the following three main functions for printing strings:\n\n- `ct:log(Category, Importance, Format, FormatArgs, Opts)`\n- `ct:print(Category, Importance, Format, FormatArgs)`\n- `ct:pal(Category, Importance, Format, FormatArgs)`\n\nThe [`log/1,2,3,4,5`](`ct:log/1`) function prints a string to the test case log\nfile. The [`print/1,2,3,4`](`ct:print/1`) function prints the string to screen.\nThe [`pal/1,2,3,4`](`ct:pal/1`) function prints the same string both to file and\nscreen. The functions are described in module `m:ct`.\n\nThe optional `Category` argument can be used to categorize the log printout.\nCategories can be used for two things as follows:\n\n- To compare the importance of the printout to a specific verbosity level.\n- To format the printout according to a user-specific HTML Style Sheet (CSS).\n\nArgument `Importance` specifies a level of importance that, compared to a\nverbosity level (general and/or set per category), determines if the printout is\nto be visible. `Importance` is any integer in the range 0..99. Predefined\nconstants exist in the `ct.hrl` header file. The default importance level,\n`?STD_IMPORTANCE` (used if argument `Importance` is not provided), is 50. This\nis also the importance used for standard I/O, for example, from printouts made\nwith `io:format/2`, `io:put_chars/1`, and so on.\n\n`Importance` is compared to a verbosity level set by the `verbosity` start\nflag/option. The level can be set per category or generally, or both. If\n`verbosity` is not set by the user, a level of 100 (`?MAX_VERBOSITY` = all\nprintouts visible) is used as default value. `Common Test` performs the\nfollowing test:\n\n```text\nImportance >= (100-VerbosityLevel)\n```\n\nThe constant `?STD_VERBOSITY` has value 50 (see `ct.hrl`). At this level, all\nstandard I/O gets printed. If a lower verbosity level is set, standard I/O\nprintouts are ignored. Verbosity level 0 effectively turns all logging off\n(except from printouts made by `Common Test` itself).\n\nThe general verbosity level is not associated with any particular category. This\nlevel sets the threshold for the standard I/O printouts, uncategorized\n`ct:log/print/pal` printouts, and printouts for categories with undefined\nverbosity level.\n\n_Examples:_\n\nSome printouts during test case execution:\n\n```erlang\nio:format(\"1. Standard IO, importance = ~w~n\", [?STD_IMPORTANCE]),\nct:log(\"2. Uncategorized, importance = ~w\", [?STD_IMPORTANCE]),\n ct:log(info, \"3. Categorized info, importance = ~w\", [?STD_IMPORTANCE]),\n ct:log(info, ?LOW_IMPORTANCE, \"4. Categorized info, importance = ~w\", [?LOW_IMPORTANCE]),\n ct:log(error, ?HI_IMPORTANCE, \"5. Categorized error, importance = ~w\", [?HI_IMPORTANCE]),\n ct:log(error, ?MAX_IMPORTANCE, \"6. Categorized error, importance = ~w\", [?MAX_IMPORTANCE]),\n```\n\nIf starting the test with a general verbosity level of 50 (`?STD_VERBOSITY`):\n\n```text\n$ ct_run -verbosity 50\n```\n\nthe following is printed:\n\n```text\n1. Standard IO, importance = 50\n2. Uncategorized, importance = 50\n3. Categorized info, importance = 50\n5. Categorized error, importance = 75\n6. Categorized error, importance = 99\n```\n\nIf starting the test with:\n\n```text\n$ ct_run -verbosity 1 and info 75\n```\n\nthe following is printed:\n\n```erlang\n3. Categorized info, importance = 50\n4. Categorized info, importance = 25\n6. Categorized error, importance = 99\n```\n\nNote that the category argument is not required in order to only specify the\nimportance of a printout. Example:\n\n```erlang\nct:pal(?LOW_IMPORTANCE, \"Info report: ~p\", [Info])\n```\n\nOr perhaps in combination with constants:\n\n```erlang\n-define(INFO, ?LOW_IMPORTANCE).\n-define(ERROR, ?HI_IMPORTANCE).\n\nct:log(?INFO, \"Info report: ~p\", [Info])\nct:pal(?ERROR, \"Error report: ~p\", [Error])\n```\n\nThe functions `ct:set_verbosity/2` and `ct:get_verbosity/1` may be used to\nmodify and read verbosity levels during test execution.\n\nThe arguments `Format` and `FormatArgs` in `ct:log/print/pal` are always passed\non to the STDLIB function `io:format/3` (For details, see the `m:io` manual\npage).\n\n`ct:pal/4` and `ct:log/5` add headers to strings being printed to the log file.\nThe strings are also wrapped in div tags with a CSS class attribute, so that\nstylesheet formatting can be applied. To disable this feature for a printout\n(i.e. to get a result similar to using `io:format/2`), call `ct:log/5` with the\n`no_css` option.\n\nHow categories can be mapped to CSS tags is documented in section\n[HTML Style Sheets](run_test_chapter.md#html_stylesheet) in section Running\nTests and Analyzing Results.\n\nCommon Test will escape special HTML characters (<, > and &) in printouts to the\nlog file made with `ct:pal/4` and `io:format/2`. In order to print strings with\nHTML tags to the log, use the `ct:log/3,4,5` function. The character escaping\nfeature is per default disabled for `ct:log/3,4,5` but can be enabled with the\n`esc_chars` option in the `Opts` list, see [`ct:log/3,4,5`](`ct:log/5`).\n\nIf the character escaping feature needs to be disabled (typically for backwards\ncompatibility reasons), use the `ct_run` start flag `-no_esc_chars`, or the\n`ct:run_test/1` start option `{esc_chars,Bool}` (this start option is also\nsupported in test specifications).\n\nFor more information about log files, see section\n[Log Files](run_test_chapter.md#log_files) in section Running Tests and\nAnalyzing Results.","title":"Logging - Categories and Verbosity Levels - Writing Test Suites","ref":"write_test_chapter.html#logging-categories-and-verbosity-levels"},{"type":"extras","doc":"Even though it is highly efficient to write test suites with the `Common Test`\nframework, mistakes can be made, mainly because of illegal dependencies. Some of\nthe more frequent mistakes from our own experience with running the Erlang/OTP\ntest suites follows:\n\n- Depending on current directory, and writing there:\n\n This is a common error in test suites. It is assumed that the current\n directory is the same as the author used as current directory when the test\n case was developed. Many test cases even try to write scratch files to this\n directory. Instead `data_dir` and `priv_dir` are to be used to locate data and\n for writing scratch files.\n\n- Depending on execution order:\n\n During development of test suites, make no assumptions on the execution order\n of the test cases or suites. For example, a test case must not assume that a\n server it depends on is already started by a previous test case. Reasons for\n this follows:\n\n - The user/operator can specify the order at will, and maybe a different\n execution order is sometimes more relevant or efficient.\n - If the user specifies a whole directory of test suites for the test, the\n execution order of the suites depends on how the files are listed by the\n operating system, which varies between systems.\n - If a user wants to run only a subset of a test suite, there is no way one\n test case could successfully depend on another.\n\n- Depending on Unix:\n\n Running Unix commands through `os:cmd` are likely not to work on non-Unix\n platforms.\n\n- Nested test cases:\n\n Starting a test case from another not only tests the same thing twice, but\n also makes it harder to follow what is being tested. Also, if the called test\n case fails for some reason, so do the caller. This way, one error gives cause\n to several error reports, which is to be avoided.\n\n Functionality common for many test case functions can be implemented in common\n help functions. If these functions are useful for test cases across suites,\n put the help functions into common help modules.\n\n- Failure to crash or exit when things go wrong:\n\n Making requests without checking that the return value indicates success can\n be OK if the test case fails later, but it is never acceptable just to print\n an error message (into the log file) and return successfully. Such test cases\n do harm, as they create a false sense of security when overviewing the test\n results.\n\n- Messing up for subsequent test cases:\n\n Test cases are to restore as much of the execution environment as possible, so\n that subsequent test cases do not crash because of their execution order. The\n function [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`) is suitable for\n this.","title":"Illegal Dependencies - Writing Test Suites","ref":"write_test_chapter.html#illegal-dependencies"},{"type":"extras","doc":"\n# Test Structure","title":"Test Structure","ref":"test_structure_chapter.html"},{"type":"extras","doc":"A test is performed by running one or more test suites. A test suite consists of\ntest cases, configuration functions, and information functions. Test cases can\nbe grouped in so called test case groups. A test suite is an Erlang module and\ntest cases are implemented as Erlang functions. Test suites are stored in test\ndirectories.\n\n[](){: #skipping_test_cases }","title":"General - Test Structure","ref":"test_structure_chapter.html#general"},{"type":"extras","doc":"Certain test cases can be skipped, for example, if you know beforehand that a\nspecific test case fails. The reason can be functionality that is not yet\nimplemented, a bug that is known but not yet fixed, or some functionality that\ndoes not work or is not applicable on a specific platform.\n\nTest cases can be skipped in the following ways:\n\n- Using `skip_suites` and `skip_cases` terms in\n [test specifications](run_test_chapter.md#test_specifications).\n- Returning `{skip,Reason}` from function\n [`init_per_testcase/2`](`c:ct_suite:init_per_testcase/2`) or\n [`init_per_suite/1`](`c:ct_suite:init_per_suite/1`).\n- Returning `{skip,Reason}` from the execution clause of the test case. The\n execution clause is called, so the author must ensure that the test case does\n not run.\n\nWhen a test case is skipped, it is noted as `SKIPPED` in the HTML log.","title":"Skipping Test Cases - Test Structure","ref":"test_structure_chapter.html#skipping-test-cases"},{"type":"extras","doc":"- **_Auto-skipped test case_** - When a configuration function fails (that is,\n terminates unexpectedly), the test cases depending on the configuration\n function are skipped automatically by `Common Test`. The status of the test\n cases is then \"auto-skipped\". Test cases are also \"auto-skipped\" by\n `Common Test` if the required configuration data is unavailable at runtime.\n\n- **_Configuration function_** - A function in a test suite that is meant to be\n used for setting up, cleaning up, and/or verifying the state and environment\n on the System Under Test (SUT) and/or the `Common Test` host node, so that a\n test case (or a set of test cases) can execute correctly.\n\n- **_Configuration file_** - A file containing data related to a test and/or an\n SUT, for example, protocol server addresses, client login details, and\n hardware interface addresses. That is, any data that is to be handled as\n variable in the suite and not be hard-coded.\n\n- **_Configuration variable_** - A name (an Erlang atom) associated with a data\n value read from a configuration file.\n\n- **`data_dir`** - Data directory for a test suite. This directory contains any\n files used by the test suite, for example, extra Erlang modules, binaries, or\n data files.\n\n- **_Information function_** - A function in a test suite that returns a list of\n properties (read by the `Common Test` server) that describes the conditions\n for executing the test cases in the suite.\n\n- **_Major log file_** - An overview and summary log file for one or more test\n suites.\n\n- **_Minor log file_** - A log file for one particular test case. Also called\n the test case log file.\n\n- **`priv_dir`** - Private directory for a test suite. This directory is to be\n used when the test suite needs to write to files.\n\n- **`ct_run`** - The name of an executable program that can be used as an\n interface for specifying and running tests with `Common Test`.\n\n- **_Test case_** - A single test included in a test suite. A test case is\n implemented as a function in a test suite module.\n\n- **_Test case group_** - A set of test cases sharing configuration functions\n and execution properties. The execution properties specify if the test cases\n in the group are to be executed in random order, in parallel, or in sequence,\n and if the execution of the group is be repeated. Test case groups can also be\n nested. That is, a group can, besides test cases, contain subgroups.\n\n- **_Test suite_** - An Erlang module containing a collection of test cases for\n a specific functional area.\n\n- **_Test directory_** - A directory containing one or more test suite modules,\n that is, a group of test suites.\n\n- **_Argument_ `Config`** - A list of key-value tuples (that is, a property\n list) containing runtime configuration data passed from the configuration\n functions to the test cases.\n\n- **_User-skipped test case_** - The status of a test case explicitly skipped in\n any of the ways described in section\n [Skipping Test Cases](test_structure_chapter.md#skipping_test_cases).","title":"Definition of Terms - Test Structure","ref":"test_structure_chapter.html#definition-of-terms"},{"type":"extras","doc":"\n# Examples and Templates\n\n[](){: #top }","title":"Examples and Templates","ref":"example_chapter.html"},{"type":"extras","doc":"The following example test suite shows some tests of a database server:\n\n```erlang\n-module(db_data_type_SUITE).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%% Test server callbacks\n-export([suite/0, all/0,\n init_per_suite/1, end_per_suite/1,\n init_per_testcase/2, end_per_testcase/2]).\n\n%% Test cases\n-export([string/1, integer/1]).\n\n-define(CONNECT_STR, \"DSN=sqlserver;UID=alladin;PWD=sesame\").\n\n%%--------------------------------------------------------------------\n%% COMMON TEST CALLBACK FUNCTIONS\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Returns list of tuples to set default properties\n%% for the suite.\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{minutes,1}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) -> Config1\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Initialization before the suite.\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n {ok, Ref} = db:connect(?CONNECT_STR, []),\n TableName = db_lib:unique_table_name(),\n [{con_ref, Ref },{table_name, TableName}| Config].\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config) -> term()\n%%\n%% Config = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after the suite.\n%%--------------------------------------------------------------------\nend_per_suite(Config) ->\n Ref = proplists:get_value(con_ref, Config),\n db:disconnect(Ref),\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) -> Config1\n%%\n%% TestCase = atom()\n%% Name of the test case that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Initialization before each test case.\n%%--------------------------------------------------------------------\ninit_per_testcase(Case, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:create_table(Ref, TableName, table_type(Case)),\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config) -> term()\n%%\n%% TestCase = atom()\n%% Name of the test case that is finished.\n%% Config = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after each test case.\n%%--------------------------------------------------------------------\nend_per_testcase(_Case, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:delete_table(Ref, TableName),\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases\n%%\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% Name of a test case group.\n%% TestCase = atom()\n%% Name of a test case.\n%%\n%% Description: Returns the list of groups and test cases that\n%% are to be executed.\n%%--------------------------------------------------------------------\nall() ->\n [string, integer].\n\n\n%%--------------------------------------------------------------------\n%% TEST CASES\n%%--------------------------------------------------------------------\n\nstring(Config) ->\n insert_and_lookup(dummy_key, \"Dummy string\", Config).\n\ninteger(Config) ->\n insert_and_lookup(dummy_key, 42, Config).\n\n\ninsert_and_lookup(Key, Value, Config) ->\n Ref = proplists:get_value(con_ref, Config),\n TableName = proplists:get_value(table_name, Config),\n ok = db:insert(Ref, TableName, Key, Value),\n [Value] = db:lookup(Ref, TableName, Key),\n ok = db:delete(Ref, TableName, Key),\n [] = db:lookup(Ref, TableName, Key),\n ok.\n```","title":"Test Suite Example - Examples and Templates","ref":"example_chapter.html#test-suite-example"},{"type":"extras","doc":"The Erlang mode for the Emacs editor includes two `Common Test` test suite\ntemplates, one with extensive information in the function headers, and one with\nminimal information. A test suite template provides a quick start for\nimplementing a suite from scratch and gives a good overview of the available\ncallback functions. The two templates follows:\n\n_Large Common Test Suite_\n\n```erlang\n%%%-------------------------------------------------------------------\n%%% File : example_SUITE.erl\n%%% Author :\n%%% Description :\n%%%\n%%% Created :\n%%%-------------------------------------------------------------------\n-module(example_SUITE).\n\n%% Note: This directive should only be used in test suites.\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%%--------------------------------------------------------------------\n%% COMMON TEST CALLBACK FUNCTIONS\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Returns list of tuples to set default properties\n%% for the suite.\n%%\n%% Note: The suite/0 function is only meant to be used to return\n%% default data values, not perform any other operations.\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{minutes,10}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the suite.\n%%\n%% Description: Initialization before the suite.\n%%\n%% Note: This function is free to add any key/value pairs to the Config\n%% variable, but should NOT alter/remove any existing entries.\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config0) -> term() | {save_config,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%%\n%% Description: Cleanup after the suite.\n%%--------------------------------------------------------------------\nend_per_suite(_Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_group(GroupName, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% GroupName = atom()\n%% Name of the test case group that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding configuration data for the group.\n%% Reason = term()\n%% The reason for skipping all test cases and subgroups in the group.\n%%\n%% Description: Initialization before each test case group.\n%%--------------------------------------------------------------------\ninit_per_group(_GroupName, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_group(GroupName, Config0) ->\n%% term() | {save_config,Config1}\n%%\n%% GroupName = atom()\n%% Name of the test case group that is finished.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding configuration data for the group.\n%%\n%% Description: Cleanup after each test case group.\n%%--------------------------------------------------------------------\nend_per_group(_GroupName, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%%\n%% TestCase = atom()\n%% Name of the test case that is about to run.\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the test case.\n%%\n%% Description: Initialization before each test case.\n%%\n%% Note: This function is free to add any key/value pairs to the Config\n%% variable, but should NOT alter/remove any existing entries.\n%%--------------------------------------------------------------------\ninit_per_testcase(_TestCase, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config0) ->\n%% term() | {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%%--------------------------------------------------------------------\nend_per_testcase(_TestCase, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: groups() -> [Group]\n%%\n%% Group = {GroupName,Properties,GroupsAndTestCases}\n%% GroupName = atom()\n%% The name of the group.\n%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}]\n%% Group properties that may be combined.\n%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase]\n%% TestCase = atom()\n%% The name of a test case.\n%% Shuffle = shuffle | {shuffle,Seed}\n%% To get cases executed in random order.\n%% Seed = {integer(),integer(),integer()}\n%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n%% repeat_until_any_ok | repeat_until_any_fail\n%% To get execution of cases repeated.\n%% N = integer() | forever\n%%\n%% Description: Returns a list of test case group definitions.\n%%--------------------------------------------------------------------\ngroups() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases | {skip,Reason}\n%%\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% Name of a test case group.\n%% TestCase = atom()\n%% Name of a test case.\n%% Reason = term()\n%% The reason for skipping all groups and test cases.\n%%\n%% Description: Returns the list of groups and test cases that\n%% are to be executed.\n%%--------------------------------------------------------------------\nall() ->\n [my_test_case].\n\n\n%%--------------------------------------------------------------------\n%% TEST CASES\n%%--------------------------------------------------------------------\n\n%%--------------------------------------------------------------------\n%% Function: TestCase() -> Info\n%%\n%% Info = [tuple()]\n%% List of key/value pairs.\n%%\n%% Description: Test case info function - returns list of tuples to set\n%% properties for the test case.\n%%\n%% Note: This function is only meant to be used to return a list of\n%% values, not perform any other operations.\n%%--------------------------------------------------------------------\nmy_test_case() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase(Config0) ->\n%% ok | exit() | {skip,Reason} | {comment,Comment} |\n%% {save_config,Config1} | {skip_and_save,Reason,Config1}\n%%\n%% Config0 = Config1 = [tuple()]\n%% A list of key/value pairs, holding the test case configuration.\n%% Reason = term()\n%% The reason for skipping the test case.\n%% Comment = term()\n%% A comment about the test case that will be printed in the html log.\n%%\n%% Description: Test case function. (The name of it must be specified in\n%% the all/0 list or in a test case group for the test case\n%% to be executed).\n%%--------------------------------------------------------------------\nmy_test_case(_Config) ->\n ok.\n```\n\n_Small Common Test Suite_\n\n```erlang\n%%%-------------------------------------------------------------------\n%%% File : example_SUITE.erl\n%%% Author :\n%%% Description :\n%%%\n%%% Created :\n%%%-------------------------------------------------------------------\n-module(example_SUITE).\n\n-compile(export_all).\n\n-include_lib(\"common_test/include/ct.hrl\").\n\n%%--------------------------------------------------------------------\n%% Function: suite() -> Info\n%% Info = [tuple()]\n%%--------------------------------------------------------------------\nsuite() ->\n [{timetrap,{seconds,30}}].\n\n%%--------------------------------------------------------------------\n%% Function: init_per_suite(Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_suite(Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_suite(Config0) -> term() | {save_config,Config1}\n%% Config0 = Config1 = [tuple()]\n%%--------------------------------------------------------------------\nend_per_suite(_Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_group(GroupName, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% GroupName = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_group(_GroupName, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_group(GroupName, Config0) ->\n%% term() | {save_config,Config1}\n%% GroupName = atom()\n%% Config0 = Config1 = [tuple()]\n%%--------------------------------------------------------------------\nend_per_group(_GroupName, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: init_per_testcase(TestCase, Config0) ->\n%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}\n%% TestCase = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\ninit_per_testcase(_TestCase, Config) ->\n Config.\n\n%%--------------------------------------------------------------------\n%% Function: end_per_testcase(TestCase, Config0) ->\n%% term() | {save_config,Config1} | {fail,Reason}\n%% TestCase = atom()\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%%--------------------------------------------------------------------\nend_per_testcase(_TestCase, _Config) ->\n ok.\n\n%%--------------------------------------------------------------------\n%% Function: groups() -> [Group]\n%% Group = {GroupName,Properties,GroupsAndTestCases}\n%% GroupName = atom()\n%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}]\n%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase]\n%% TestCase = atom()\n%% Shuffle = shuffle | {shuffle,{integer(),integer(),integer()}}\n%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |\n%% repeat_until_any_ok | repeat_until_any_fail\n%% N = integer() | forever\n%%--------------------------------------------------------------------\ngroups() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: all() -> GroupsAndTestCases | {skip,Reason}\n%% GroupsAndTestCases = [{group,GroupName} | TestCase]\n%% GroupName = atom()\n%% TestCase = atom()\n%% Reason = term()\n%%--------------------------------------------------------------------\nall() ->\n [my_test_case].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase() -> Info\n%% Info = [tuple()]\n%%--------------------------------------------------------------------\nmy_test_case() ->\n [].\n\n%%--------------------------------------------------------------------\n%% Function: TestCase(Config0) ->\n%% ok | exit() | {skip,Reason} | {comment,Comment} |\n%% {save_config,Config1} | {skip_and_save,Reason,Config1}\n%% Config0 = Config1 = [tuple()]\n%% Reason = term()\n%% Comment = term()\n%%--------------------------------------------------------------------\nmy_test_case(_Config) ->\n ok.\n```","title":"Test Suite Templates - Examples and Templates","ref":"example_chapter.html#test-suite-templates"},{"type":"extras","doc":"\n# Running Tests and Analyzing Results","title":"Running Tests and Analyzing Results","ref":"run_test_chapter.html"},{"type":"extras","doc":"The `Common Test` framework provides a high-level operator interface for\ntesting, providing the following features:\n\n- Automatic compilation of test suites (and help modules)\n- Creation of extra HTML pages for improved overview.\n- Single-command interface for running all available tests\n- Handling of configuration files specifying data related to the System Under\n Test (SUT) (and any other variable data)\n- Mode for running multiple independent test sessions in parallel with central\n control and configuration","title":"Using the Common Test Framework - Running Tests and Analyzing Results","ref":"run_test_chapter.html#using-the-common-test-framework"},{"type":"extras","doc":"When `Common Test` starts, it automatically attempts to compile any suites\nincluded in the specified tests. If particular suites are specified, only those\nsuites are compiled. If a particular test object directory is specified (meaning\nall suites in this directory are to be part of the test), `Common Test` runs\nfunction `make:all/1` in the directory to compile the suites.\n\nIf compilation fails for one or more suites, the compilation errors are printed\nto tty and the operator is asked if the test run is to proceed without the\nmissing suites, or be aborted. If the operator chooses to proceed, the tests\nhaving missing suites are noted in the HTML log. If `Common Test` is unable to\nprompt the user after compilation failure (if `Common Test` does not control\n`stdin`), the test run proceeds automatically without the missing suites. This\nbehavior can however be modified with the `ct_run` flag\n`-abort_if_missing_suites`, or the `ct:run_test/1` option\n`{abort_if_missing_suites,TrueOrFalse}`. If `abort_if_missing_suites` is set to\n`true`, the test run stops immediately if some suites fail to compile.\n\nAny help module (that is, regular Erlang module with name not ending with\n\"\\_SUITE\") that resides in the same test object directory as a suite, which is\npart of the test, is also automatically compiled. A help module is not mistaken\nfor a test suite (unless it has a \"\\_SUITE\" name). All help modules in a\nparticular test object directory are compiled, no matter if all or only\nparticular suites in the directory are part of the test.\n\nIf test suites or help modules include header files stored in other locations\nthan the test directory, these include directories can be specified by using\nflag `-include` with [`ct_run`](ct_run_cmd.md), or option `include` with\n`ct:run_test/1`. Also, an include path can be specified with an OS environment\nvariable, `CT_INCLUDE_PATH`.\n\n_Example (bash):_\n\n`$ export CT_INCLUDE_PATH=~testuser/common_suite_files/include:~testuser/common_lib_files/include`\n\n`Common Test` passes all include directories (specified either with flag/option\n`include`, or variable `CT_INCLUDE_PATH` , or both, to the compiler.\n\nInclude directories can also be specified in test specifications, see\n[Test Specifications](run_test_chapter.md#test_specifications).\n\nIf the user wants to run all test suites for a test object (or an OTP\napplication) by specifying only the top directory (for example, with start\nflag/option `dir`), `Common Test` primarily looks for test suite modules in a\nsubdirectory named `test`. If this subdirectory does not exist, the specified\ntop directory is assumed to be the test directory, and test suites are read from\nthere instead.\n\nTo disable the automatic compilation feature, use flag `-no_auto_compile` with\n`ct_run`, or option `{auto_compile,false}` with `ct:run_test/1`. With automatic\ncompilation disabled, the user is responsible for compiling the test suite\nmodules (and any help modules) before the test run. If the modules cannot be\nloaded from the local file system during startup of `Common Test`, the user must\npreload the modules before starting the test. `Common Test` only verifies that\nthe specified test suites exist (that is, that they are, or can be, loaded).\nThis is useful, for example, if the test suites are transferred and loaded as\nbinaries through RPC from a remote node.\n\n[](){: #ct_run }","title":"Automatic Compilation of Test Suites and Help Modules - Running Tests and Analyzing Results","ref":"run_test_chapter.html#automatic-compilation-of-test-suites-and-help-modules"},{"type":"extras","doc":"The [`ct_run`](ct_run_cmd.md) program can be used for running tests from the OS\ncommand line, for example, as follows:\n\n- `ct_run -config -dir `\n- `ct_run -config -suite `\n- `ct_run -userconfig -suite `\n- `ct_run -config -suite -group -case `\n\n_Examples:_\n\n```text\n$ ct_run -config $CFGS/sys1.cfg $CFGS/sys2.cfg -dir $SYS1_TEST $SYS2_TEST\n$ ct_run -userconfig ct_config_xml $CFGS/sys1.xml $CFGS/sys2.xml -dir $SYS1_TEST $SYS2_TEST\n$ ct_run -suite $SYS1_TEST/setup_SUITE $SYS2_TEST/config_SUITE\n$ ct_run -suite $SYS1_TEST/setup_SUITE -case start stop\n$ ct_run -suite $SYS1_TEST/setup_SUITE -group installation -case start stop\n```\n\nThe flags `dir`, `suite`, and `group/case` can be combined. For example, to run\n`x_SUITE` and `y_SUITE` in directory `testdir`, as follows:\n\n```text\n$ ct_run -dir ./testdir -suite x_SUITE y_SUITE\n```\n\nThis has the same effect as the following:\n\n```text\n$ ct_run -suite ./testdir/x_SUITE ./testdir/y_SUITE\n```\n\nFor details, see\n[Test Case Group Execution](run_test_chapter.md#group_execution).\n\nThe following flags can also be used with [`ct_run`](ct_run_cmd.md):\n\n- **`-help`** - Lists all available start flags.\n\n- **`-logdir `** - Specifies where the HTML log files are to be written.\n\n- **`-label `** - Associates the test run with a name that\n gets printed in the overview HTML log files.\n\n- **`-refresh_logs`** - Refreshes the top-level HTML index files.\n\n- **`-shell`** - Starts interactive shell mode (described later).\n\n- **`-step [step_opts]`** - Steps through test cases using the Erlang Debugger\n (described later).\n\n- **`-spec `** - Uses test specification as input (described later).\n\n- **`-allow_user_terms`** - Allows user-specific terms in a test specification\n (described later).\n\n- **`-silent_connections [conn_types]`** - , tells `Common Test` to suppress\n printouts for specified connections (described later).\n\n- **`-stylesheet `** - Points out a user HTML style sheet (described\n later).\n\n- **`-cover `** - To perform code coverage test (see\n [Code Coverage Analysis](cover_chapter.md#cover)).\n\n- **`-cover_stop `** - To specify if the `cover` tool is to be stopped\n after the test is completed (see\n [Code Coverage Analysis](cover_chapter.md#cover_stop)).\n\n- **`-event_handler `** - To install\n [event handlers](event_handler_chapter.md#event_handling).\n\n- **`-event_handler_init `** - To install\n [event handlers](event_handler_chapter.md#event_handling) including start\n arguments.\n\n- **`-ct_hooks `** - To install\n [Common Test Hooks](ct_hooks_chapter.md#installing) including start arguments.\n\n- **`-ct_hooks_order [test|config]`** - To modify\n [Common Test Hooks](ct_hooks_chapter.md#installing) execution order.\n\n- **`-enable_builtin_hooks `** - To enable or disable\n [Built-in Common Test Hooks](ct_hooks_chapter.md#builtin_cths). Default is\n `true`.\n\n- **`-include`** - Specifies include directories (described earlier).\n\n- **`-no_auto_compile`** - Disables the automatic test suite compilation feature\n (described earlier).\n\n- **`-abort_if_missing_suites`** - Aborts the test run if one or more suites\n fail to compile (described earlier).\n\n- **`-multiply_timetraps `** - Extends\n [timetrap time-out](write_test_chapter.md#timetraps) values.\n\n- **`-scale_timetraps `** - Enables automatic\n [timetrap time-out](write_test_chapter.md#timetraps) scaling.\n\n- **`-repeat `** - Tells `Common Test` to repeat the tests `n` times\n (described later).\n\n- **`-duration `** - Tells `Common Test` to repeat the tests for duration\n of time (described later).\n\n- **`-until `** - Tells `Common Test` to repeat the tests until\n `stop_time` (described later).\n\n- **`-force_stop [skip_rest]`** - On time-out, the test run is aborted when the\n current test job is finished. If `skip_rest` is provided, the remaining test\n cases in the current test job are skipped (described later).\n\n- **`-decrypt_key `** - Provides a decryption key for\n [encrypted configuration files](config_file_chapter.md#encrypted_config_files).\n\n- **`-decrypt_file `** - Points out a file containing a decryption key\n for\n [encrypted configuration files](config_file_chapter.md#encrypted_config_files).\n\n- **`-basic_html`** - Switches off HTML enhancements that can be incompatible\n with older browsers.\n\n- **`-logopts `** - Enables modification of the logging behavior, see\n [Log options](run_test_chapter.md#logopts).\n\n- **`-verbosity `** - Sets\n [verbosity levels for printouts](write_test_chapter.md#logging).\n\n- **`-no_esc_chars`** - Disables automatic escaping of special HTML characters.\n See the [Logging chapter](write_test_chapter.md#logging).\n\n> #### Note {: .info }\n>\n> Directories passed to `Common Test` can have either relative or absolute\n> paths.\n\n> #### Note {: .info }\n>\n> Any start flags to the Erlang runtime system (application ERTS) can also be\n> passed as parameters to `ct_run`. It is, for example, useful to be able to\n> pass directories to be added to the Erlang code server search path with flag\n> `-pa` or `-pz`. If you have common help- or library modules for test suites\n> (separately compiled), stored in other directories than the test suite\n> directories, these `help/lib` directories are preferably added to the code\n> path this way.\n>\n> _Example:_\n>\n> `$ ct_run -dir ./chat_server -logdir ./chat_server/testlogs -pa $PWD/chat_server/ebin`\n>\n> The absolute path of directory `chat_server/ebin` is here passed to the code\n> server. This is essential because relative paths are stored by the code server\n> as relative, and `Common Test` changes the current working directory of ERTS\n> during the test run.\n\nThe `ct_run` program sets the exit status before shutting down. The following\nvalues are defined:\n\n- `0` indicates a successful testrun, that is, without failed or auto-skipped\n test cases.\n- `1` indicates that one or more test cases have failed, or have been\n auto-skipped.\n- `2` indicates that the test execution has failed because of, for example,\n compilation errors, or an illegal return value from an information function.\n\nIf auto-skipped test cases do not affect the exit status. The default behavior\ncan be changed using start flag:\n\n```text\n-exit_status ignore_config\n```\n\n> #### Note {: .info }\n>\n> Executing `ct_run` without start flags is equal to the command:\n> `ct_run -dir ./`\n\nFor more information about the `ct_run` program, see module\n[`ct_run`](ct_run_cmd.md) and section\n[Installation](install_chapter.md#general).\n\n[](){: #erlang_shell_or_program }","title":"Running Tests from the OS Command Line - Running Tests and Analyzing Results","ref":"run_test_chapter.html#running-tests-from-the-os-command-line"},{"type":"extras","doc":"`Common Test` provides an Erlang API for running tests. The main (and most\nflexible) function for specifying and executing tests is `ct:run_test/1`. It\ntakes the same start parameters as [`ct_run`](run_test_chapter.md#ct_run), but\nthe flags are instead specified as options in a list of key-value tuples. For\nexample, a test specified with `ct_run` as follows:\n\n`$ ct_run -suite ./my_SUITE -logdir ./results`\n\nis with `ct:run_test/1` specified as:\n\n`1> ct:run_test([{suite,\"./my_SUITE\"},{logdir,\"./results\"}]).`\n\nThe function returns the test result, represented by the tuple\n`{Ok,Failed,{UserSkipped,AutoSkipped}}`, where each element is an integer. If\ntest execution fails, the function returns the tuple `{error,Reason}`, where the\nterm `Reason` explains the failure.\n\nThe default start option `{dir,Cwd}` (to run all suites in the current working\ndirectory) is used if the function is called with an empty list of options.","title":"Running Tests from the Erlang Shell or from an Erlang Program - Running Tests and Analyzing Results","ref":"run_test_chapter.html#running-tests-from-the-erlang-shell-or-from-an-erlang-program"},{"type":"extras","doc":"During execution of tests started with `ct:run_test/1`, the Erlang shell\nprocess, controlling `stdin`, remains the top-level process of the `Common Test`\nsystem of processes. Consequently, the Erlang shell is not available for\ninteraction during the test run. If this is not desirable, for example, because\nthe shell is needed for debugging purposes or for interaction with the SUT\nduring test execution, set start option `release_shell` to `true` (in the call\nto `ct:run_test/1` or by using the corresponding test specification term,\ndescribed later). This makes `Common Test` release the shell immediately after\nthe test suite compilation stage. To accomplish this, a test runner process is\nspawned to take control of the test execution. The effect is that\n`ct:run_test/1` returns the pid of this process rather than the test result,\nwhich instead is printed to tty at the end of the test run.\n\n> #### Note {: .info }\n>\n> To use the functions [`ct:break/1,2`](`ct:break/1`) and\n> [`ct:continue/0,1`](`ct:continue/0`), `release_shell` _must_ be set to `true`.\n\nFor details, see `ct:run_test/1` manual page.\n\n[](){: #group_execution }","title":"Releasing the Erlang Shell - Running Tests and Analyzing Results","ref":"run_test_chapter.html#releasing-the-erlang-shell"},{"type":"extras","doc":"With the `ct_run` flag, or `ct:run_test/1` option `group`, one or more test case\ngroups can be specified, optionally in combination with specific test cases. The\nsyntax for specifying groups on the command line is as follows:\n\n```text\n$ ct_run -group [-case ]\n```\n\nThe syntax in the Erlang shell is as follows:\n\n```erlang\n1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).\n```\n\nParameter `group_names_or_paths` specifies one or more group names and/or one or\nmore group paths. At startup, `Common Test` searches for matching groups in the\ngroup definitions tree (that is, the list returned from `Suite:groups/0`; for\ndetails, see section [Test Case Groups](write_test_chapter.md#test_case_groups).\n\nGiven a group name, say `g`, `Common Test` searches for all paths leading to\n`g`. By path is meant a sequence of nested groups, which must be followed to get\nfrom the top-level group to `g`. To execute the test cases in group `g`,\n`Common Test` must call the `init_per_group/2` function for each group in the\npath to `g`, and all corresponding `end_per_group/2` functions afterwards. This\nis because the configuration of a test case in `g` (and its `Config` input data)\ndepends on `init_per_testcase(TestCase, Config)` and its return value, which in\nturn depends on `init_per_group(g, Config)` and its return value, which in turn\ndepends on `init_per_group/2` of the group above `g`, and so on, all the way up\nto the top-level group.\n\nThis means that if there is more than one way to locate a group (and its test\ncases) in a path, the result of the group search operation is a number of tests,\nall of which are to be performed. `Common Test` interprets a group specification\nthat consists of a single name as follows:\n\n\"Search and find all paths in the group definitions tree that lead to the\nspecified group and, for each path, create a test that does the following, in\norder:\n\n1. Executes all configuration functions in the path to the specified group.\n1. Executes all, or all matching, test cases in this group.\n1. Executes all, or all matching, test cases in all subgroups of the group.\"\n\nThe user can specify a specific group path with parameter\n`group_names_or_paths`. With this type of specification execution of unwanted\ngroups (in otherwise matching paths), and/or the execution of subgroups can be\navoided. The command line syntax of the group path is a list of group names in\nthe path, for example:\n\n`$ ct_run -suite \"./x_SUITE\" -group [g1,g3,g4] -case tc1 tc5`\n\nThe syntax in the Erlang shell is as follows (requires a list within the groups\nlist):\n\n`1> ct:run_test([{suite,\"./x_SUITE\"}, {group,[[g1,g3,g4]]}, {testcase,[tc1,tc5]}]).`\n\nThe last group in the specified path is the terminating group in the test, that\nis, no subgroups following this group are executed. In the previous example,\n`g4` is the terminating group. Hence, `Common Test` executes a test that calls\nall `init` configuration functions in the path to `g4`, that is, `g1..g3..g4`.\nIt then calls test cases `tc1` and `tc5` in `g4`, and finally all `end`\nconfiguration functions in order `g4..g3..g1`.\n\n> #### Note {: .info }\n>\n> The group path specification does not necessarily have to include _all_ groups\n> in the path to the terminating group. `Common Test` searches for all matching\n> paths if an incomplete group path is specified.\n\n> #### Note {: .info }\n>\n> Group names and group paths can be combined with parameter\n> `group_names_or_paths`. Each element is treated as an individual specification\n> in combination with parameter `cases`. The following examples illustrates\n> this.\n\n_Examples:_\n\n```erlang\n-module(x_SUITE).\n...\n%% The group definitions:\ngroups() ->\n [{top1,[],[tc11,tc12,\n {sub11,[],[tc12,tc13]},\n {sub12,[],[tc14,tc15,\n \t\t {sub121,[],[tc12,tc16]}]}]},\n\n {top2,[],[{group,sub21},{group,sub22}]},\n {sub21,[],[tc21,{group,sub2X2}]},\n {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},\n {sub221,[],[tc21,tc23]},\n {sub2X2,[],[tc21,tc24]}].\n```\n\nThe following executes two tests, one for all cases and all subgroups under\n`top1`, and one for all under `top2`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group all\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,all}]).\n```\n\nUsing `-group top1 top2`, or `{group,[top1,top2]}` gives the same result.\n\nThe following executes one test for all cases and subgroups under `top1`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}]).\n```\n\nThe following runs a test executing `tc12` in `top1` and any subgroup under\n`top1` where it can be found (`sub11` and `sub121`):\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1 -case tc12\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}, {testcase,[tc12]}]).\n```\n\nThe following executes `tc12` _only_ in group `top1`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [top1] -case tc12\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[top1]]}, {testcase,[tc12]}]).\n```\n\nThe following searches `top1` and all its subgroups for `tc16` resulting in that\nthis test case executes in group `sub121`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group top1 -case tc16\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[top1]}, {testcase,[tc16]}]).\n```\n\nUsing the specific path `-group [sub121]` or `{group,[[sub121]]}` gives the same\nresult in this example.\n\nThe following executes two tests, one including all cases and subgroups under\n`sub12`, and one with _only_ the test cases in `sub12`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group sub12 [sub12]\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[sub12,[sub12]]}]).\n```\n\nIn the following example, `Common Test` finds and executes two tests, one for\nthe path from `top2` to `sub2X2` through `sub21`, and one from `top2` to\n`sub2X2` through `sub22`:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group sub2X2\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[sub2X2]}]).\n```\n\nIn the following example, by specifying the unique path\n`top2 -> sub21 -> sub2X2`, only one test is executed. The second possible path,\nfrom `top2` to `sub2X2` (from the former example) is discarded:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [sub21,sub2X2]\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[sub21,sub2X2]]}]).\n```\n\nThe following executes only the test cases for `sub22` and in reverse order\ncompared to the group definition:\n\n```text\n$ ct_run -suite \"x_SUITE\" -group [sub22] -case tc22 tc21\n```\n```erlang\n1> ct:run_test([{suite,\"x_SUITE\"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).\n```\n\nIf a test case belonging to a group (according to the group definition) is\nexecuted without a group specification, that is, simply by (using the command\nline):\n\n`$ ct_run -suite \"my_SUITE\" -case my_tc`\n\nor (using the Erlang shell):\n\n`1> ct:run_test([{suite,\"my_SUITE\"}, {testcase,my_tc}]).`\n\nthen `Common Test` ignores the group definition and executes the test case in\nthe scope of the test suite only (no group configuration functions are called).\n\nThe group specification feature, as presented in this section, can also be used\nin [Test Specifications](run_test_chapter.md#test_specifications) (with some\nextra features added).","title":"Test Case Group Execution - Running Tests and Analyzing Results","ref":"run_test_chapter.html#test-case-group-execution"},{"type":"extras","doc":"You can start `Common Test` in an interactive shell mode where no automatic\ntesting is performed. Instead, `Common Test` starts its utility processes,\ninstalls configuration data (if any), and waits for the user to call functions\n(typically test case support functions) from the Erlang shell.\n\nThe shell mode is useful, for example, for debugging test suites, analyzing and\ndebugging the SUT during \"simulated\" test case execution, and trying out various\noperations during test suite development.\n\nTo start the interactive shell mode, start an Erlang shell manually and call\n`ct:install/1` to install any configuration data you might need (use `[]` as\nargument otherwise). Then call `ct:start_interactive/0` to start `Common Test`.\n\nIf you use the `ct_run` program, you can start the Erlang shell and\n`Common Test` in one go by using the flag `-shell` and, optionally, flag\n`-config` and/or `-userconfig`.\n\n_Examples:_\n\n- `ct_run -shell`\n- `ct_run -shell -config cfg/db.cfg`\n- `ct_run -shell -userconfig db_login testuser x523qZ`\n\nIf no configuration file is specified with command `ct_run`, a warning is\ndisplayed. If `Common Test` has been run from the same directory earlier, the\nsame configuration file(s) are used again. If `Common Test` has not been run\nfrom this directory before, no configuration files are available.\n\nIf any functions using \"required configuration data\" (for example, functions\n`ct_telnet` or `ct_ftp`) are to be called from the Erlang shell, first require\nconfiguration data with [`ct:require/1,2`](`ct:require/1`). This is equivalent\nto a `require` statement in the\n[Test Suite Information Function](write_test_chapter.md#suite) or in the\n[Test Case Information Function](write_test_chapter.md#info_function).\n\n_Example:_\n\n```erlang\n1> ct:require(unix_telnet, unix).\nok\n2> ct_telnet:open(unix_telnet).\n{ok,<0.105.0>}\n4> ct_telnet:cmd(unix_telnet, \"ls .\").\n{ok,[\"ls .\",\"file1 ...\",...]}\n```\n\nEverything that `Common Test` normally prints in the test case logs, are in the\ninteractive mode written to a log named `ctlog.html` in directory\n`ct_run. `. A link to this file is available in the file named\n`last_interactive.html` in the directory from which you execute `ct_run`.\nSpecifying a different root directory for the logs than the current working\ndirectory is not supported.\n\nIf you wish to exit the interactive mode (for example, to start an automated\ntest run with `ct:run_test/1`), call function `ct:stop_interactive/0`. This\nshuts down the running `ct` application. Associations between configuration\nnames and data created with `require` are consequently deleted. Function\n`ct:start_interactive/0` takes you back into interactive mode, but the previous\nstate is not restored.","title":"Running the Interactive Shell Mode - Running Tests and Analyzing Results","ref":"run_test_chapter.html#running-the-interactive-shell-mode"},{"type":"extras","doc":"Using `ct_run -step [opts]`, or by passing option `{step,Opts}` to\n`ct:run_test/1`, the following is possible:\n\n- Get the Erlang Debugger started automatically.\n- Use its graphical interface to investigate the state of the current test case.\n- Execute the test case step-by-step and/or set execution breakpoints.\n\nIf no extra options are specified with flag/option `step`, breakpoints are set\nautomatically on the test cases that are to be executed by `Common Test`, and\nthose functions only. If step option `config` is specified, breakpoints are also\ninitially set on the configuration functions in the suite, that is,\n`init_per_suite/1`, `end_per_suite/1`, `init_per_group/2`, `end_per_group/2`,\n`init_per_testcase/2` and `end_per_testcase/2`.\n\n`Common Test` enables the Debugger auto-attach feature, which means that for\nevery new interpreted test case function that starts to execute, a new trace\nwindow automatically pops up (as each test case executes on a dedicated Erlang\nprocess). Whenever a new test case starts, `Common Test` attempts to close the\ninactive trace window of the previous test case. However, if you prefer\n`Common Test` to leave inactive trace windows, use option `keep_inactive`.\n\nThe step functionality can be used together with flag/option `suite` and `suite`\n\\+ `case/testcase`, but not together with `dir`.\n\n[](){: #test_specifications }","title":"Step-by-Step Execution of Test Cases with the Erlang Debugger - Running Tests and Analyzing Results","ref":"run_test_chapter.html#step-by-step-execution-of-test-cases-with-the-erlang-debugger"},{"type":"extras","doc":"","title":"Test Specifications - Running Tests and Analyzing Results","ref":"run_test_chapter.html#test-specifications"},{"type":"extras","doc":"The most flexible way to specify what to test, is to use a test specification,\nwhich is a sequence of Erlang terms. The terms are normally declared in one or\nmore text files (see `ct:run_test/1`), but can also be passed to `Common Test`\non the form of a list (see `ct:run_testspec/1`). There are two general types of\nterms: configuration terms and test specification terms.\n\nWith configuration terms it is, for example, possible to do the following:\n\n- Label the test run (similar to `ct_run -label`).\n- Evaluate any expressions before starting the test.\n- Import configuration data (similar to `ct_run -config/-userconfig`).\n- Specify the top-level HTML log directory (similar to `ct_run -logdir`).\n- Enable code coverage analysis (similar to `ct_run -cover`).\n- Install `Common Test Hooks` (similar to `ct_run -ch_hooks`).\n- Install `event_handler` plugins (similar to `ct_run -event_handler`).\n- Specify include directories to be passed to the compiler for automatic\n compilation (similar to `ct_run -include`).\n- Disable the auto-compilation feature (similar to `ct_run -no_auto_compile`).\n- Set verbosity levels (similar to `ct_run -verbosity`).\n\nConfiguration terms can be combined with `ct_run` start flags or `ct:run_test/1`\noptions. The result is, for some flags/options and terms, that the values are\nmerged (for example, configuration files, include directories, verbosity levels,\nand silent connections) and for others that the start flags/options override the\ntest specification terms (for example, log directory, label, style sheet, and\nauto-compilation).\n\nWith test specification terms, it is possible to state exactly which tests to\nrun and in which order. A test term specifies either one or more suites, one or\nmore test case groups (possibly nested), or one or more test cases in a group\n(or in multiple groups) or in a suite.\n\nAny number of test terms can be declared in sequence. `Common Test` compiles by\ndefault the terms into one or more tests to be performed in one resulting test\nrun. A term that specifies a set of test cases \"swallows\" one that only\nspecifies a subset of these cases. For example, the result of merging one term\nspecifying that all cases in suite S are to be executed, with another term\nspecifying only test case X and Y in S, is a test of all cases in S. However, if\na term specifying test case X and Y in S is merged with a term specifying case Z\nin S, the result is a test of X, Y, and Z in S. To disable this behavior, that\nis, to instead perform each test sequentially in a \"script-like\" manner, set\nterm `merge_tests` to `false` in the test specification.\n\nA test term can also specify one or more test suites, groups, or test cases to\nbe skipped. Skipped suites, groups, and cases are not executed and show up in\nthe HTML log files as `SKIPPED`.","title":"General Description - Running Tests and Analyzing Results","ref":"run_test_chapter.html#general-description"},{"type":"extras","doc":"When multiple test specification files are specified at startup (either with\n`ct_run -spec file1 file2 ...` or `ct:run_test([{spec, [File1,File2,...]}])`),\n`Common Test` either executes one test run per specification file, or joins the\nfiles and performs all tests within one single test run. The first behavior is\nthe default one. The latter requires that start flag/option `join_specs` is\nprovided, for example,\n`run_test -spec ./my_tests1.ts ./my_tests2.ts -join_specs`.\n\nJoining a number of specifications, or running them separately, can also be\naccomplished with (and can be combined with) test specification file inclusion.","title":"Using Multiple Test Specification Files - Running Tests and Analyzing Results","ref":"run_test_chapter.html#using-multiple-test-specification-files"},{"type":"extras","doc":"With the term `specs`, a test specification can include other specifications. An\nincluded specification can either be joined with the source specification or\nused to produce a separate test run (as with start flag/option `join_specs`\nabove).\n\n_Example:_\n\n```erlang\n%% In specification file \"a.spec\"\n{specs, join, [\"b.spec\", \"c.spec\"]}.\n{specs, separate, [\"d.spec\", \"e.spec\"]}.\n%% Config and test terms follow\n...\n```\n\nIn this example, the test terms defined in files \"b.spec\" and \"c.spec\" are\njoined with the terms in source specification \"a.spec\" (if any). The inclusion\nof specifications \"d.spec\" and \"e.spec\" results in two separate, and\nindependent, test runs (one for each included specification).\n\nOption `join` does not imply that the test terms are merged, only that all tests\nare executed in one single test run.\n\nJoined specifications share common configuration settings, such as the list of\n`config` files or `include` directories. For configurations that cannot be\ncombined, such as settings for `logdir` or `verbosity`, it is up to the user to\nensure there are no clashes when the test specifications are joined.\nSpecifications included with option `separate` do not share configuration\nsettings with the source specification. This is useful, for example, if there\nare clashing configuration settings in included specifications, making it them\nimpossible to join.\n\nIf `{merge_tests,true}` is set in the source specification (which is the default\nsetting), terms in joined specifications are merged with terms in the source\nspecification (according to the description of `merge_tests` earlier).\n\nNotice that it is always the `merge_tests` setting in the source specification\nthat is used when joined with other specifications. Say, for example, that a\nsource specification A, with tests TA1 and TA2, has `{merge_tests,false}` set,\nand that it includes another specification, B, with tests TB1 and TB2, that has\n`{merge_tests,true}` set. The result is that the test series\n`TA1,TA2,merge(TB1,TB2)` is executed. The opposite `merge_tests` settings would\nresult in the test series `merge(merge(TA1,TA2),TB1,TB2)`.\n\nThe term `specs` can be used to nest specifications, that is, have one\nspecification include other specifications, which in turn include others, and so\nno","title":"Test Specification File Inclusion - Running Tests and Analyzing Results","ref":"run_test_chapter.html#test-specification-file-inclusion"},{"type":"extras","doc":"When a test case group is specified, the resulting test executes function\n`init_per_group`, followed by all test cases and subgroups (including their\nconfiguration functions), and finally function `end_per_group`. Also, if\nparticular test cases in a group are specified, `init_per_group` and\n`end_per_group`, for the group in question, are called. If a group defined (in\n`Suite:groups/0`) as a subgroup of another group, is specified (or if particular\ntest cases of a subgroup are), `Common Test` calls the configuration functions\nfor the top-level groups and for the subgroup in question (making it possible to\npass configuration data all the way from `init_per_suite` down to the test cases\nin the subgroup).\n\nThe test specification uses the same mechanism for specifying test case groups\nthrough names and paths, as explained in section\n[Test Case Group Execution](run_test_chapter.md#group_execution), with the\naddition of element `GroupSpec`.\n\nElement `GroupSpec` makes it possible to specify group execution properties that\noverrides those in the group definition (that is, in `groups/0`). Execution\nproperties for subgroups might be overridden as well. This feature makes it\npossible to change properties of groups at the time of execution, without having\nto edit the test suite. The same feature is available for `group` elements in\nthe `Suite:all/0` list. For details and examples, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups).","title":"Test Case Groups - Running Tests and Analyzing Results","ref":"run_test_chapter.html#test-case-groups"},{"type":"extras","doc":"Test specifications can be used to run tests both in a single test host\nenvironment and in a distributed `Common Test` environment (Large Scale\nTesting). The node parameters in term `init` are only relevant in the latter\n(see section [Test Specifications](ct_master_chapter.md#test_specifications) in\nLarge Scale Testing). For details about the various terms, see the corresponding\nsections in the User's Guide, for example, the following:\n\n- The [`ct_run` program](run_test_chapter.md#ct_run) for an overview of\n available start flags (as most flags have a corresponding configuration term)\n- [Logging](write_test_chapter.md#logging) (for terms `verbosity`, `stylesheet`,\n `basic_html` and `esc_chars`)\n- [External Configuration Data](config_file_chapter.md#top) (for terms `config`\n and `userconfig`)\n- [Event Handling](event_handler_chapter.md#event_handling) (for the\n `event_handler` term)\n- [Common Test Hooks](ct_hooks_chapter.md#installing) (for term `ct_hooks`)\n\n_Configuration terms:_\n\n```erlang\n{merge_tests, Bool}.\n\n{define, Constant, Value}.\n\n{specs, InclSpecsOption, TestSpecs}.\n\n{node, NodeAlias, Node}.\n\n{init, InitOptions}.\n{init, [NodeAlias], InitOptions}.\n\n{label, Label}.\n{label, NodeRefs, Label}.\n\n{verbosity, VerbosityLevels}.\n{verbosity, NodeRefs, VerbosityLevels}.\n\n{stylesheet, CSSFile}.\n{stylesheet, NodeRefs, CSSFile}.\n\n{silent_connections, ConnTypes}.\n{silent_connections, NodeRefs, ConnTypes}.\n\n{multiply_timetraps, N}.\n{multiply_timetraps, NodeRefs, N}.\n\n{scale_timetraps, Bool}.\n{scale_timetraps, NodeRefs, Bool}.\n\n{cover, CoverSpecFile}.\n{cover, NodeRefs, CoverSpecFile}.\n\n{cover_stop, Bool}.\n{cover_stop, NodeRefs, Bool}.\n\n{include, IncludeDirs}.\n{include, NodeRefs, IncludeDirs}.\n\n{auto_compile, Bool},\n{auto_compile, NodeRefs, Bool},\n\n{abort_if_missing_suites, Bool},\n{abort_if_missing_suites, NodeRefs, Bool},\n\n{config, ConfigFiles}.\n{config, ConfigDir, ConfigBaseNames}.\n{config, NodeRefs, ConfigFiles}.\n{config, NodeRefs, ConfigDir, ConfigBaseNames}.\n\n{userconfig, {CallbackModule, ConfigStrings}}.\n{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.\n\n{logdir, LogDir}.\n{logdir, NodeRefs, LogDir}.\n\n{logopts, LogOpts}.\n{logopts, NodeRefs, LogOpts}.\n\n{create_priv_dir, PrivDirOption}.\n{create_priv_dir, NodeRefs, PrivDirOption}.\n\n{event_handler, EventHandlers}.\n{event_handler, NodeRefs, EventHandlers}.\n{event_handler, EventHandlers, InitArgs}.\n{event_handler, NodeRefs, EventHandlers, InitArgs}.\n\n{ct_hooks, CTHModules}.\n{ct_hooks, NodeRefs, CTHModules}.\n\n{ct_hooks_order, CTHOrder}.\n\n{enable_builtin_hooks, Bool}.\n\n{basic_html, Bool}.\n{basic_html, NodeRefs, Bool}.\n\n{esc_chars, Bool}.\n{esc_chars, NodeRefs, Bool}.\n\n{release_shell, Bool}.\n```\n\n_Test terms:_\n\n```erlang\n{suites, Dir, Suites}.\n{suites, NodeRefs, Dir, Suites}.\n\n{groups, Dir, Suite, Groups}.\n{groups, NodeRefs, Dir, Suite, Groups}.\n\n{groups, Dir, Suite, Groups, {cases,Cases}}.\n{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.\n\n{cases, Dir, Suite, Cases}.\n{cases, NodeRefs, Dir, Suite, Cases}.\n\n{skip_suites, Dir, Suites, Comment}.\n{skip_suites, NodeRefs, Dir, Suites, Comment}.\n\n{skip_groups, Dir, Suite, GroupNames, Comment}.\n{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.\n\n{skip_cases, Dir, Suite, Cases, Comment}.\n{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.\n```\n\n[](){: #types } _Types:_\n\n```erlang\nBool = true | false\nConstant = atom()\nValue = term()\nInclSpecsOption = join | separate\nTestSpecs = string() | [string()]\nNodeAlias = atom()\nNode = node()\nNodeRef = NodeAlias | Node | master\nNodeRefs = all_nodes | [NodeRef] | NodeRef\nInitOptions = term()\nLabel = atom() | string()\nVerbosityLevels = integer() | [{Category,integer()}]\nCategory = atom()\nCSSFile = string()\nConnTypes = all | [atom()]\nN = integer()\nCoverSpecFile = string()\nIncludeDirs = string() | [string()]\nConfigFiles = string() | [string()]\nConfigDir = string()\nConfigBaseNames = string() | [string()]\nCallbackModule = atom()\nConfigStrings = string() | [string()]\nLogDir = string()\nLogOpts = [term()]\nPrivDirOption = auto_per_run | auto_per_tc | manual_per_tc\nEventHandlers = atom() | [atom()]\nInitArgs = [term()]\nCTHModules = [CTHModule |\n \t {CTHModule, CTHInitArgs} |\n \t {CTHModule, CTHInitArgs, CTHPriority}]\nCTHModule = atom()\nCTHInitArgs = term()\nCTHOrder = test | config\nDir = string()\nSuites = atom() | [atom()] | all\nSuite = atom()\nGroups = GroupPath | GroupSpec | [GroupSpec] | all\nGroupPath = [[GroupSpec]]\nGroupSpec = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]}\nGroupName = atom()\nGroupNames = GroupName | [GroupName]\nCases = atom() | [atom()] | all\nComment = string() | \"\"\n```\n\nThe difference between the `config` terms above is that with `ConfigDir`,\n`ConfigBaseNames` is a list of base names, that is, without directory paths.\n`ConfigFiles` must be full names, including paths. For example, the following\ntwo terms have the same meaning:\n\n```erlang\n{config, [\"/home/testuser/tests/config/nodeA.cfg\",\n \"/home/testuser/tests/config/nodeB.cfg\"]}.\n\n{config, \"/home/testuser/tests/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n```\n\n> #### Note {: .info }\n>\n> Any relative paths, specified in the test specification, are relative to the\n> directory containing the test specification file if\n> `ct_run -spec TestSpecFile ...` or `ct:run:test([{spec,TestSpecFile},...])`\n> executes the test.\n>\n> The path is relative to the top-level log directory if\n> `ct:run:testspec(TestSpec)` executes the test.","title":"Test Specification Syntax - Running Tests and Analyzing Results","ref":"run_test_chapter.html#test-specification-syntax"},{"type":"extras","doc":"The term `define` introduces a constant that is used to replace the name\n`Constant` with `Value`, wherever it is found in the test specification. This\nreplacement occurs during an initial iteration through the test specification.\nConstants can be used anywhere in the test specification, for example, in any\nlists and tuples, and even in strings and inside the value part of other\nconstant definitions. A constant can also be part of a node name, but that is\nthe only place where a constant can be part of an atom.\n\n> #### Note {: .info }\n>\n> For the sake of readability, the name of the constant must always begin with\n> an uppercase letter, or a `$`, `?`, or `_`. This means that it must always be\n> single quoted (as the constant name is an atom, not text).\n\nThe main benefit of constants is that they can be used to reduce the size (and\navoid repetition) of long strings, such as file paths.\n\n_Examples:_\n\n```erlang\n%% 1a. no constant\n{config, \"/home/testuser/tests/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, \"/home/testuser/tests/suites\", all}.\n\n%% 1b. with constant\n{define, 'TESTDIR', \"/home/testuser/tests\"}.\n{config, \"'TESTDIR'/config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, \"'TESTDIR'/suites\", all}.\n\n%% 2a. no constants\n{config, [testnode@host1, testnode@host2], \"../config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, [testnode@host1, testnode@host2], \"../suites\", [x_SUITE, y_SUITE]}.\n\n%% 2b. with constants\n{define, 'NODE', testnode}.\n{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}.\n{config, 'NODES', \"../config\", [\"nodeA.cfg\",\"nodeB.cfg\"]}.\n{suites, 'NODES', \"../suites\", [x_SUITE, y_SUITE]}.\n```\n\nConstants make the test specification term `alias`, in previous versions of\n`Common Test`, redundant. This term is deprecated but remains supported in\nupcoming `Common Test` releases. Replacing `alias` terms with `define` is\nstrongly recommended though. An example of such replacement follows:\n\n```erlang\n%% using the old alias term\n{config, \"/home/testuser/tests/config/nodeA.cfg\"}.\n{alias, suite_dir, \"/home/testuser/tests/suites\"}.\n{groups, suite_dir, x_SUITE, group1}.\n\n%% replacing with constants\n{define, 'TestDir', \"/home/testuser/tests\"}.\n{define, 'CfgDir', \"'TestDir'/config\"}.\n{define, 'SuiteDir', \"'TestDir'/suites\"}.\n{config, 'CfgDir', \"nodeA.cfg\"}.\n{groups, 'SuiteDir', x_SUITE, group1}.\n```\n\nConstants can well replace term `node` also, but this still has a declarative\nvalue, mainly when used in combination with `NodeRefs == all_nodes` (see\n[Types](run_test_chapter.md#types)).","title":"Constants - Running Tests and Analyzing Results","ref":"run_test_chapter.html#constants"},{"type":"extras","doc":"Here follows a simple test specification example:\n\n```erlang\n{define, 'Top', \"/home/test\"}.\n{define, 'T1', \"'Top'/t1\"}.\n{define, 'T2', \"'Top'/t2\"}.\n{define, 'T3', \"'Top'/t3\"}.\n{define, 'CfgFile', \"config.cfg\"}.\n\n{logdir, \"'Top'/logs\"}.\n\n{config, [\"'T1'/'CfgFile'\", \"'T2'/'CfgFile'\", \"'T3'/'CfgFile'\"]}.\n\n{suites, 'T1', all}.\n{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], \"Not implemented\"}.\n{skip_cases, 'T1', t1A_SUITE, [test3,test4], \"Irrelevant\"}.\n{skip_cases, 'T1', t1C_SUITE, [test1], \"Ignore\"}.\n\n{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.\n{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.\n\n{skip_suites, 'T3', all, \"Not implemented\"}.\n```\n\nThe example specifies the following:\n\n- The specified `logdir` directory is used for storing the HTML log files (in\n subdirectories tagged with node name, date, and time).\n- The variables in the specified test system configuration files are imported\n for the test.\n- The first test to run includes all suites for system `t1`. Suites `t1B` and\n `t1D` are excluded from the test. Test cases `test3` and `test4` in `t1A` and\n `test1` case in `t1C` are also excluded from the test.\n- The second test to run is for system `t2`. The included suites are `t2B` and\n `t2C`. Test cases `test4`, `test1`, and `test7` in suite `t2A` are also\n included. The test cases are executed in the specified order.\n- The last test to run is for system `t3`. Here, all suites are skipped and this\n is explicitly noted in the log files.","title":"Example - Running Tests and Analyzing Results","ref":"run_test_chapter.html#example"},{"type":"extras","doc":"With term `init` it is possible to specify initialization options for nodes\ndefined in the test specification. There are options to start the node and to\nevaluate any function on the node. For details, see section\n[Automatic Startup of Test Target Nodes](ct_master_chapter.md#ct_slave) in\nsection Using Common Test for Large Scale Testing.","title":"The init Term - Running Tests and Analyzing Results","ref":"run_test_chapter.html#the-init-term"},{"type":"extras","doc":"The user can provide a test specification including (for `Common Test`)\nunrecognizable terms. If this is desired, use flag `-allow_user_terms` when\nstarting tests with `ct_run`. This forces `Common Test` to ignore unrecognizable\nterms. In this mode, `Common Test` is not able to check the specification for\nerrors as efficiently as if the scanner runs in default mode. If `ct:run_test/1`\nis used for starting the tests, the relaxed scanner mode is enabled by tuple\n`{allow_user_terms,true}`.","title":"User-Specific Terms - Running Tests and Analyzing Results","ref":"run_test_chapter.html#user-specific-terms"},{"type":"extras","doc":"Terms in the current test specification (that is, the specification that has\nbeen used to configure and run the current test) can be looked up. The function\n[`get_testspec_terms()`](`ct:get_testspec_terms/0`) returns a list of all test\nspecification terms (both configuration terms and test terms), and\n`get_testspec_terms(Tags)` returns the term (or a list of terms) matching the\ntag (or tags) in `Tags`.\n\nFor example, in the test specification:\n\n```erlang\n...\n{label, my_server_smoke_test}.\n{config, \"../../my_server_setup.cfg\"}.\n{config, \"../../my_server_interface.cfg\"}.\n...\n```\n\nAnd in, for example, a test suite or a `Common Test Hook` function:\n\n```erlang\n...\n[{label,[{_Node,TestType}]}, {config,CfgFiles}] =\n ct:get_testspec_terms([label,config]),\n\n[verify_my_server_cfg(TestType, CfgFile) || {Node,CfgFile} <- CfgFiles,\n Node == node()];\n...\n```\n\n[](){: #log_files }","title":"Reading Test Specification Terms - Running Tests and Analyzing Results","ref":"run_test_chapter.html#reading-test-specification-terms"},{"type":"extras","doc":"As the execution of the test suites proceed, events are logged in the following\nfour different ways:\n\n- Text to the operator console.\n- Suite-related information is sent to the major log file.\n- Case-related information is sent to the minor log file.\n- The HTML overview log file is updated with test results.\n- A link to all runs executed from a certain directory is written in the log\n named `all_runs.html` and direct links to all tests (the latest results) are\n written to the top-level `index.html`.\n\nTypically the operator, possibly running hundreds or thousands of test cases,\ndoes not want to fill the console with details about, or printouts from,\nspecific test cases. By default, the operator only sees the following:\n\n- A confirmation that the test has started and information about how many test\n cases are executed in total.\n- A small note about each failed test case.\n- A summary of all the run test cases.\n- A confirmation when the test run is complete.\n- Some special information, such as error reports, progress reports, and\n printouts written with `erlang:display/1`, or `io:format/3` specifically\n addressed to a receiver other than [`standard_io`](`t:io:standard_io/0`) (for\n example, the default group leader process `user`).\n\nTo dig deeper into the general results, or the result of a specific test case,\nthe operator can do so by following the links in the HTML presentation and read\nthe major or minor log files. The \"all_runs.html\" page is a good starting point.\nIt is located in `logdir` and contains a link to each test run, including a\nquick overview (with date and time, node name, number of tests, test names, and\ntest result totals).\n\nAn \"index.html\" page is written for each test run (that is, stored in the\n`ct_run` directory tagged with node name, date, and time). This file provides an\noverview of all individual tests performed in the same test run. The test names\nfollow the following convention:\n\n- `TopLevelDir.TestDir` (all suites in `TestDir` executed)\n- `TopLevelDir.TestDir:suites` (specific suites executed)\n- `TopLevelDir.TestDir.Suite` (all cases in `Suite` executed)\n- `TopLevelDir.TestDir.Suite:cases` (specific test cases executed)\n- `TopLevelDir.TestDir.Suite.Case` (only `Case` executed)\n\nThe \"test run index\" page includes a link to the `Common Test` Framework Log\nfile in which information about imported configuration data and general test\nprogress is written. This log file is useful to get snapshot information about\nthe test run during execution. It can also be helpful when analyzing test\nresults or debugging test suites.\n\nThe \"test run index\" page indicates if a test has missing suites (that is,\nsuites that `Common Test` failed to compile). Names of the missing suites can be\nfound in the `Common Test` Framework Log file.\n\nThe major log file shows a detailed report of the test run. It includes test\nsuite and test case names, execution time, the exact reason for failures, and so\non. The information is available in both a file with textual and with HTML\nrepresentation. The HTML file shows a summary that gives a good overview of the\ntest run. It also has links to each individual test case log file for quick\nviewing with an HTML browser.\n\nThe minor log files contain full details of every single test case, each in a\nseparate file. This way, it is straightforward to compare the latest results to\nthat of previous test runs, even if the set of test cases changes. If\napplication SASL is running, its logs are also printed to the current minor log\nfile by the [cth_log_redirect built-in hook](ct_hooks_chapter.md#builtin_cths).\n\nThe full name of the minor log file (that is, the name of the file including the\nabsolute directory path) can be read during execution of the test case. It comes\nas value in tuple `{tc_logfile,LogFileName}` in the `Config` list (which means\nit can also be read by a pre- or post `Common Test Hook` function). Also, at the\nstart of a test case, this data is sent with an event to any installed event\nhandler. For details, see section\n[Event Handling](event_handler_chapter.md#event_handling).\n\nThe log files are written continuously during a test run and links are always\ncreated initially when a test starts. Thevtest progress can therefore be\nfollowed simply by refreshing pages in the HTML browser. Statistics totals are\nnot presented until a test is complete however.\n\n[](){: #logopts }","title":"Log Files - Running Tests and Analyzing Results","ref":"run_test_chapter.html#log-files"},{"type":"extras","doc":"With start flag `logopts` options that modify some aspects of the logging\nbehavior can be specified. The following options are available:\n\n- **`no_src`** - The HTML version of the test suite source code is not generated\n during the test run (and is consequently not available in the log file\n system).\n\n- **`no_nl`** - `Common Test` does not add a newline character `(\\n)` to the end\n of an output string that it receives from a call to, for example,\n `io:format/2`, and which it prints to the test case log.\n\nFor example, if a test is started with:\n\n`$ ct_run -suite my_SUITE -logopts no_nl`\n\nthen printouts during the test made by successive calls to `io:format(\"x\")`,\nappears in the test case log as:\n\n`xxx`\n\ninstead of each `x` printed on a new line, which is the default behavior.\n\n[](){: #table_sorting }","title":"Log Options - Running Tests and Analyzing Results","ref":"run_test_chapter.html#log-options"},{"type":"extras","doc":"By clicking the name in the column header of any table (for example, \"Ok\",\n\"Case\", \"Time\", and so on), the table rows are sorted in whatever order makes\nsense for the type of value (for example, numerical for \"Ok\" or \"Time\", and\nalphabetical for \"Case\"). The sorting is performed through JavaScript code,\nautomatically inserted into the HTML log files. `Common Test` uses the\n[jQuery](http://jquery.com) library and the\n[tablesorter](https://mottie.github.io/tablesorter/docs/) plugin, with\ncustomized sorting functions, for this implementation.","title":"Sorting HTML Table Columns - Running Tests and Analyzing Results","ref":"run_test_chapter.html#sorting-html-table-columns"},{"type":"extras","doc":"The test suites overview page includes a link to the Unexpected I/O Log. In this\nlog, `Common Test` saves printouts made with [`ct:log/1,2,3,4,5`](`ct:log/2`)\nand [`ct:pal/1,2,3,4,5`](`ct:pal/2`), as well as captured system error- and\nprogress reports, which cannot be associated with particular test cases and\ntherefore cannot be written to individual test case log files. This occurs, for\nexample, if a log printout is made from an external process (not a test case\nprocess), _or_ if an error- or progress report comes in, during a short interval\nwhile `Common Test` is not executing a test case or configuration function, _or_\nwhile `Common Test` is currently executing a parallel test case group.\n\n[](){: #pre_post_test_io_log }","title":"The Unexpected I/O Log - Running Tests and Analyzing Results","ref":"run_test_chapter.html#the-unexpected-i-o-log"},{"type":"extras","doc":"The `Common Test` Framework Log page includes links to the Pre- and Post Test\nI/O Log. In this log, `Common Test` saves printouts made with `ct:log/1,2,3,4,5`\nand `ct:pal/1,2,3,4,5`, as well as captured system error- and progress reports,\nwhich take place before, and after, the test run. Examples of this are printouts\nfrom a CT hook init- or terminate function, or progress reports generated when\nan OTP application is started from a CT hook init function. Another example is\nan error report generated because of a failure when an external application is\nstopped from a CT hook terminate function. All information in these examples\nends up in the Pre- and Post Test I/O Log. For more information on how to\nsynchronize test runs with external user applications, see section\n[Synchronizing](ct_hooks_chapter.md#synchronizing) in section Common Test Hooks.\n\n> #### Note {: .info }\n>\n> Logging to file with `ct:log/1,2,3,4,5` or `ct:pal/1,2,3,4,5` only works when\n> `Common Test` is running. Printouts with `ct:pal/1,2,3,4,5` are however always\n> displayed on screen.\n\n[](){: #delete_old_logs }","title":"The Pre- and Post Test I/O Log - Running Tests and Analyzing Results","ref":"run_test_chapter.html#the-pre-and-post-test-i-o-log"},{"type":"extras","doc":"`Common Test` can automatically delete old log. This is specified with the\n`keep_logs` option. The default value for this option is `all`, which means that\nno logs are deleted. If the value is set to an integer, `N`, `Common Test`\ndeletes all `ct_run. ` directories, except the `N` newest.\n\n[](){: #html_stylesheet }","title":"Delete Old Logs - Running Tests and Analyzing Results","ref":"run_test_chapter.html#delete-old-logs"},{"type":"extras","doc":"`Common Test` uses an HTML Style Sheet (CSS file) to control the look of the\nHTML log files generated during test runs. If the log files are not displayed\ncorrectly in the browser of your choice, or you prefer a more primitive (\"pre\n`Common Test` v1.6\") look of the logs, use the start flag/option:\n\n```text\nbasic_html\n```\n\nThis disables the use of style sheets and JavaScripts (see\n[Sorting HTML Table Columns](run_test_chapter.md#table_sorting)).\n\n`Common Test` includes an _optional_ feature to allow user HTML style sheets for\ncustomizing printouts. The functions in `ct` that print to a test case HTML log\nfile (`log/3,4,5` and `pal/3,4,5`) accept `Category` as first argument. With\nthis argument a category can be specified that can be mapped to a named `div`\nselector in a CSS rule-set. This is useful, especially for coloring text\ndifferently depending on the type of (or reason for) the printout. Say you want\none particular background color for test system configuration information, a\ndifferent one for test system state information, and finally one for errors\ndetected by the test case functions. The corresponding style sheet can look as\nfollows:\n\n```css\ndiv.sys_config { background:blue }\ndiv.sys_state { background:yellow }\ndiv.error { background:red }\n```\n\nCommon Test prints the text from `ct:log/3,4,5` or `ct:pal/3,4,5` inside a `pre`\nelement nested under the named `div` element. Since the `pre` selector has a\npredefined CSS rule (in file `ct_default.css`) for the attributes `color`,\n`font-family` and `font-size`, if a user wants to change any of the predefined\nattribute settings, a new rule for `pre` must be added to the user stylesheet.\nExample:\n\n```text\ndiv.error pre { color:white }\n```\n\nHere, white text is used instead of the default black for `div.error` printouts\n(and no other attribute settings for `pre` are affected).\n\nTo install the CSS file (`Common Test` inlines the definition in the HTML code),\nthe file name can be provided when executing `ct_run`.\n\n_Example:_\n\n```text\n$ ct_run -dir $TEST/prog -stylesheet $TEST/styles/test_categories.css\n```\n\nCategories in a CSS file installed with flag `-stylesheet` are on a global test\nlevel in the sense that they can be used in any suite that is part of the test\nrun.\n\nStyle sheets can also be installed on a per suite and per test case basis.\n\n_Example:_\n\n```erlang\n-module(my_SUITE).\n...\nsuite() -> [..., {stylesheet,\"suite_categories.css\"}, ...].\n...\nmy_testcase(_) ->\n ...\n ct:log(sys_config, \"Test node version: ~p\", [VersionInfo]),\n ...\n ct:log(sys_state, \"Connections: ~p\", [ConnectionInfo]),\n ...\n ct:pal(error, \"Error ~p detected! Info: ~p\", [SomeFault,ErrorInfo]),\n ct:fail(SomeFault).\n```\n\nIf the style sheet is installed as in this example, the categories are private\nto the suite in question. They can be used by all test cases in the suite, but\ncannot be used by other suites. A suite private style sheet, if specified, is\nused in favor of a global style sheet (one specified with flag `-stylesheet`). A\nstylesheet tuple (as returned by `suite/0` above) can also be returned from a\ntest case information function. In this case the categories specified in the\nstyle sheet can only be used in that particular test case. A test case private\nstyle sheet is used in favor of a suite or global level style sheet.\n\nIn a tuple `{stylesheet,CSSFile}`, if `CSSFile` is specified with a path, for\nexample, `\"$TEST/styles/categories.css\"`, this full name is used to locate the\nfile. However, if only the file name is specified, for example,\n`categories.css`, the CSS file is assumed to be located in the data directory,\n`data_dir`, of the suite. The latter use is recommended, as it is portable\ncompared to hard coding path names in the suite.\n\nArgument `Category` in the previous example can have the value (atom)\n`sys_config` (blue background), `sys_state` (yellow background), or `error`\n(white text on red background).\n\n[](){: #repeating_tests }","title":"HTML Style Sheets - Running Tests and Analyzing Results","ref":"run_test_chapter.html#html-style-sheets"},{"type":"extras","doc":"You can order `Common Test` to repeat the tests you specify. You can choose to\nrepeat tests a number of times, repeat tests for a specific period of time, or\nrepeat tests until a particular stop time is reached. If repetition is\ncontrolled by time, an action for `Common Test` to take upon time-out can be\nspecified. Either `Common Test` performs all tests in the current run before\nstopping, or it stops when the current test job is finished. Repetition can be\nactivated by `ct_run` start flags, or tuples in the `ct:run:test/1` option list\nargument. The flags (options in parentheses) are the following:\n\n- `-repeat N ({repeat,N})`, where `N` is a positive integer\n- `-duration DurTime ({duration,DurTime})`, where `DurTime` is the duration\n- `-until StopTime ({until,StopTime})`, where `StopTime` is finish time\n- `-force_stop ({force_stop,true})`\n- `-force_stop skip_rest ({force_stop,skip_rest})`\n\n- **`DurTime`** - The duration time is specified as `HHMMSS`, for example,\n `-duration 012030` or `{duration,\"012030\"}`\n\n , which means that the tests are executed and (if time allows) repeated until\n time-out occurs after 1 hour, 20 minutes, and 30 seconds.\n\n- **`StopTime`** - The finish time can be specified as `HHMMSS` and is then\n interpreted as a time today (or possibly tomorrow), but can also be specified\n as `YYMoMoDDHHMMSS`, for example, `-until 071001120000` or\n `{until,\"071001120000\"}`. This means that the tests are executed and (if time\n allows) repeated, until 12 o'clock on the 1st of October 2007.\n\nWhen time-out occurs, `Common Test` never aborts the ongoing test case, as this\ncan leave the SUT in an undefined, and possibly bad, state. Instead\n`Common Test`, by default, finishes the current test run before stopping. If\nflag `force_stop` is specified, `Common Test` stops when the current test job is\nfinished. If flag `force_stop` is specified with `skip_rest`, `Common Test` only\ncompletes the current test case and skips the remaining tests in the test job.\n\n> #### Note {: .info }\n>\n> As `Common Test` always finishes at least the current test case, the time\n> specified with `duration` or `until` is never definitive.\n\nLog files from every repeated test run is saved in normal `Common Test` fashion\n(described earlier).\n\n`Common Test` might later support an optional feature to only store the last\n(and possibly the first) set of logs of repeated test runs, but for now the user\nmust be careful not to run out of disk space if tests are repeated during long\nperiods of time.\n\nFor each test run that is part of a repeated session, information about the\nparticular test run is printed in the `Common Test` Framework Log. The\ninformation includes the repetition number, remaining time, and so on.\n\n_Example 1:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -duration 001000 -force_stop\n```\n\nHere, the suites in test directory `to1`, followed by the suites in `to2`, are\nexecuted in one test run. A time-out event occurs after 10 minutes. As long as\nthere is time left, `Common Test` repeats the test run (that is, starting over\nwith test `to1`). After time-out, `Common Test` stops when the current job is\nfinished (because of flag `force_stop`). As a result, the specified test run can\nbe aborted after test `to1` and before test `to2`.\n\n_Example 2:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -duration 001000 -forces_stop skip_rest\n```\n\nHere, the same tests as in Example 1 are run, but with flag `force_stop` set to\n`skip_rest`. If time-out occurs while executing tests in directory `to1`, the\nremaining test cases in `to1` are skipped and the test is aborted without\nrunning the tests in `to2` another time. If time-out occurs while executing\ntests in directory `to2`, the remaining test cases in `to2` are skipped and the\ntest is aborted.\n\n_Example 3:_\n\n```text\n$ date\nFri Sep 28 15:00:00 MEST 2007\n\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -until 160000\n```\n\nHere, the same test run as in the previous examples are executed (and possibly\nrepeated). However, when the time-out occurs, after 1 hour, `Common Test`\nfinishes the entire test run before stopping (that is, both `to1` and `to2` are\nalways executed in the same test run).\n\n_Example 4:_\n\n```text\n$ ct_run -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -repeat 5\n```\n\nHere, the test run, including both the `to1` and the `to2` test, is repeated\nfive times.\n\n> #### Note {: .info }\n>\n> Do not confuse this feature with the `repeat` property of a test case group.\n> The options described here are used to repeat execution of entire test runs,\n> while the `repeat` property of a test case group makes it possible to repeat\n> execution of sets of test cases within a suite. For more information about the\n> latter, see section\n> [Test Case Groups ](write_test_chapter.md#test_case_groups)in section Writing\n> Test Suites.\n\n[](){: #silent_connections }","title":"Repeating Tests - Running Tests and Analyzing Results","ref":"run_test_chapter.html#repeating-tests"},{"type":"extras","doc":"The protocol handling processes in `Common Test`, implemented by `ct_telnet`,\n`ct_ssh`, `ct_ftp`, and so on, do verbose printing to the test case logs. This\ncan be switched off with flag `-silent_connections`:\n\n```text\nct_run -silent_connections [conn_types]\n```\n\nHere, `conn_types` specifies SSH, Telnet, FTP, RPC, and/or SNMP.\n\n_Example 1:_\n\n```text\nct_run ... -silent_connections ssh telnet\n```\n\nThis switches off logging for SSH and Telnet connections.\n\n_Example 2:_\n\n```text\nct_run ... -silent_connections\n```\n\nThis switches off logging for all connection types.\n\nFatal communication error and reconnection attempts are always printed, even if\nlogging has been suppressed for the connection type in question. However,\noperations such as sending and receiving data are performed silently.\n\n`silent_connections` can also be specified in a test suite. This is accomplished\nby returning a tuple, `{silent_connections,ConnTypes}`, in the `suite/0` or test\ncase information list. If `ConnTypes` is a list of atoms (SSH, Telnet, FTP, RPC\nand/or SNMP), output for any corresponding connections are suppressed. Full\nlogging is by default enabled for any connection of type not specified in\n`ConnTypes`. Hence, if `ConnTypes` is the empty list, logging is enabled for all\nconnections.\n\n_Example 3:_\n\n```erlang\n-module(my_SUITE).\n\nsuite() -> [..., {silent_connections,[telnet,ssh]}, ...].\n\n...\n\nmy_testcase1() ->\n [{silent_connections,[ssh]}].\n\nmy_testcase1(_) ->\n ...\n\nmy_testcase2(_) ->\n ...\n```\n\nIn this example, `suite/0` tells `Common Test` to suppress printouts from Telnet\nand SSH connections. This is valid for all test cases. However, `my_testcase1/0`\nspecifies that for this test case, only SSH is to be silent. The result is that\n`my_testcase1` gets Telnet information (if any) printed in the log, but not SSH\ninformation. `my_testcase2` gets no information from either connection printed.\n\n`silent_connections` can also be specified with a term in a test specification\n(see section [Test Specifications](run_test_chapter.md#test_specifications) in\nsection Running Tests and Analyzing Results). Connections provided with start\nflag/option `silent_connections` are merged with any connections listed in the\ntest specification.\n\nStart flag/option `silent_connections` and the test specification term override\nany settings made by the information functions inside the test suite.\n\n> #### Note {: .info }\n>\n> In the current `Common Test` version, the `silent_connections` feature only\n> works for Telnet and SSH connections. Support for other connection types can\n> be added in future `Common Test` versions.","title":"Silent Connections - Running Tests and Analyzing Results","ref":"run_test_chapter.html#silent-connections"},{"type":"extras","doc":"\n# External Configuration Data\n\n[](){: #top }","title":"External Configuration Data","ref":"config_file_chapter.html"},{"type":"extras","doc":"To avoid hard-coding data values related to the test and/or System Under Test\n(SUT) in the test suites, the data can instead be specified through\nconfiguration files or strings that `Common Test` reads before the start of a\ntest run. External configuration data makes it possible to change test\nproperties without modifying the test suites using the data. Examples of\nconfiguration data follows:\n\n- Addresses to the test plant or other instruments\n- User login information\n- Names of files needed by the test\n- Names of programs to be executed during the test\n- Any other variable needed by the test","title":"General - External Configuration Data","ref":"config_file_chapter.html#general"},{"type":"extras","doc":"A configuration file can contain any number of elements of the type:\n\n```erlang\n{CfgVarName,Value}.\n```\n\nwhere\n\n```erlang\nCfgVarName = atom()\nValue = term() | [{CfgVarName,Value}]\n```","title":"Syntax - External Configuration Data","ref":"config_file_chapter.html#syntax"},{"type":"extras","doc":"[](){: #require_config_data }\n\nIn a test suite, one must _require_ that a configuration variable (`CfgVarName`\nin the previous definition) exists before attempting to read the associated\nvalue in a test case or configuration function.\n\n`require` is an assert statement, which can be part of the\n[Test Suite Information Function](write_test_chapter.md#suite) or\n[Test Case Information Function](write_test_chapter.md#info_function). If the\nrequired variable is unavailable, the test is skipped (unless a default value\nhas been specified, see section\n[Test Case Information Function](write_test_chapter.md#info_function) for\ndetails). Also, function [`ct:require/1/2`](`ct:require/1`) can be called from a\ntest case to check if a specific variable is available. The return value from\nthis function must be checked explicitly and appropriate action be taken\ndepending on the result (for example, to skip the test case if the variable in\nquestion does not exist).\n\nA `require` statement in the test suite information case or test case\ninformation-list is to look like `{require,CfgVarName}` or\n`{require,AliasName,CfgVarName}`. The arguments `AliasName` and `CfgVarName` are\nthe same as the arguments to [`ct:require/1,2`](`ct:require/1`). `AliasName`\nbecomes an alias for the configuration variable, and can be used as reference to\nthe configuration data value. The configuration variable can be associated with\nany number of alias names, but each name must be unique within the same test\nsuite. The two main uses for alias names follows:\n\n- To identify connections (described later).\n- To help adapt configuration data to a test suite (or test case) and improve\n readability.\n\nTo read the value of a configuration variable, use function\n[`get_config/1,2,3`](`ct:get_config/1`).\n\n_Example:_\n\n```erlang\nsuite() ->\n [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].\n\n...\n\ntestcase(Config) ->\n Domain = ct:get_config(domain),\n ...\n```","title":"Requiring and Reading Configuration Data - External Configuration Data","ref":"config_file_chapter.html#requiring-and-reading-configuration-data"},{"type":"extras","doc":"If a configuration variable is defined in multiple files and you want to access\nall possible values, use function `ct:get_config/3` and specify `all` in the\noptions list. The values are then returned in a list and the order of the\nelements corresponds to the order that the configuration files were specified at\nstartup.","title":"Using Configuration Variables Defined in Multiple Files - External Configuration Data","ref":"config_file_chapter.html#using-configuration-variables-defined-in-multiple-files"},{"type":"extras","doc":"[](){: #encrypted_config_files }\n\nConfiguration files containing sensitive data can be encrypted if they must be\nstored in open and shared directories.\n\nTo have `Common Test` encrypt a specified file using function `DES3` in\napplication `Crypto`, call\n[`ct:encrypt_config_file/2,3`](`ct:encrypt_config_file/2`) The encrypted file\ncan then be used as a regular configuration file in combination with other\nencrypted files or normal text files. However, the key for decrypting the\nconfiguration file must be provided when running the test. This can be done with\nflag/option `decrypt_key` or `decrypt_file`, or a key file in a predefined\nlocation.\n\n`Common Test` also provides decryption functions,\n[`ct:decrypt_config_file/2,3`](`ct:decrypt_config_file/2`), for recreating the\noriginal text files.","title":"Encrypted Configuration Files - External Configuration Data","ref":"config_file_chapter.html#encrypted-configuration-files"},{"type":"extras","doc":"Two different methods for opening a connection using the support functions in,\nfor example, `m:ct_ssh`, `m:ct_ftp`, and `m:ct_telnet` follows:\n\n- Using a configuration target name (an alias) as reference.\n- Using the configuration variable as reference.\n\nWhen a target name is used for referencing the configuration data (that\nspecifies the connection to be opened), the same name can be used as connection\nidentity in all subsequent calls related to the connection (also for closing\nit). Only one open connection per target name is possible. If you attempt to\nopen a new connection using a name already associated with an open connection,\n`Common Test` returns the already existing handle so the previously opened\nconnection is used. This feature makes it possible to call the function for\nopening a particular connection whenever useful. An action like this does not\nnecessarily open any new connections unless it is required (which could be the\ncase if, for example, the previous connection has been closed unexpectedly by\nthe server). Using named connections also removes the need to pass handle\nreferences around in the suite for these connections.\n\nWhen a configuration variable name is used as reference to the data specifying\nthe connection, the handle returned as a result of opening the connection must\nbe used in all subsequent calls (also for closing the connection). Repeated\ncalls to the open function with the same variable name as reference results in\nmultiple connections being opened. This can be useful, for example, if a test\ncase needs to open multiple connections to the same server on the target node\n(using the same configuration data for each connection).","title":"Opening Connections Using Configuration Data - External Configuration Data","ref":"config_file_chapter.html#opening-connections-using-configuration-data"},{"type":"extras","doc":"The user can specify configuration data on a different format than key-value\ntuples in a text file, as described so far. The data can, for example, be read\nfrom any files, fetched from the web over HTTP, or requested from a\nuser-specific process. To support this, `Common Test` provides a callback module\nplugin mechanism to handle configuration data.","title":"User-Specific Configuration Data Formats - External Configuration Data","ref":"config_file_chapter.html#user-specific-configuration-data-formats"},{"type":"extras","doc":"`Common Test` includes default callback modules for handling configuration data\nspecified in standard configuration files (described earlier) and in XML files\nas follows:\n\n- `ct_config_plain` \\- for reading configuration files with key-value tuples\n (standard format). This handler is used to parse configuration files if no\n user callback is specified.\n- `ct_config_xml` \\- for reading configuration data from XML files.","title":"Default Callback Modules for Handling Configuration Data - External Configuration Data","ref":"config_file_chapter.html#default-callback-modules-for-handling-configuration-data"},{"type":"extras","doc":"An example of an XML configuration file follows:\n\n```xml\n \n \n \"targethost\" \n \"tester\" \n \"letmein\" \n \n \"/test/loadmodules\" \n \n```\n\nOnce read, this file produces the same configuration variables as the following\ntext file:\n\n```erlang\n{ftp_host, [{ftp,\"targethost\"},\n {username,\"tester\"},\n {password,\"letmein\"}]}.\n\n{lm_directory, \"/test/loadmodules\"}.\n```","title":"Using XML Configuration Files - External Configuration Data","ref":"config_file_chapter.html#using-xml-configuration-files"},{"type":"extras","doc":"The user-specific handler can be written to handle special configuration file\nformats. The parameter can be either file names or configuration strings (the\nempty list is valid).\n\nThe callback module implementing the handler is responsible for checking the\ncorrectness of configuration strings.\n\nTo validate the configuration strings, the callback module is to have function\n`Callback:check_parameter/1` exported.\n\nThe input argument is passed from `Common Test`, as defined in the test\nspecification, or specified as an option to `ct_run` or `ct:run_test`.\n\nThe return value is to be any of the following values, indicating if the\nspecified configuration parameter is valid:\n\n- `{ok, {file, FileName}}` \\- the parameter is a file name and the file exists.\n- `{ok, {config, ConfigString}}` \\- the parameter is a configuration string and\n it is correct.\n- `{error, {nofile, FileName}}` \\- there is no file with the specified name in\n the current directory.\n- `{error, {wrong_config, ConfigString}}` \\- the configuration string is wrong.\n\nThe function `Callback:read_config/1` is to be exported from the callback module\nto read configuration data, initially before the tests start, or as a result of\ndata being reloaded during test execution. The input argument is the same as for\nfunction `check_parameter/1`.\n\nThe return value is to be either of the following:\n\n- `{ok, Config}` \\- if the configuration variables are read successfully.\n- `{error, {Error, ErrorDetails}}` \\- if the callback module fails to proceed\n with the specified configuration parameters.\n\n`Config` is the proper Erlang key-value list, with possible key-value sublists\nas values, like the earlier configuration file example:\n\n```erlang\n[{ftp_host, [{ftp, \"targethost\"}, {username, \"tester\"}, {password, \"letmein\"}]},\n {lm_directory, \"/test/loadmodules\"}]\n```","title":"Implement a User-Specific Handler - External Configuration Data","ref":"config_file_chapter.html#implement-a-user-specific-handler"},{"type":"extras","doc":"A configuration file for using the FTP client to access files on a remote host\ncan look as follows:\n\n```erlang\n{ftp_host, [{ftp,\"targethost\"},\n {username,\"tester\"},\n {password,\"letmein\"}]}.\n\n{lm_directory, \"/test/loadmodules\"}.\n```\n\nThe XML version shown earlier can also be used, but it is to be explicitly\nspecified that the `ct_config_xml` callback module is to be used by\n`Common Test`.\n\nThe following is an example of how to assert that the configuration data is\navailable and can be used for an FTP session:\n\n```erlang\ninit_per_testcase(ftptest, Config) ->\n {ok,_} = ct_ftp:open(ftp),\n Config.\n\nend_per_testcase(ftptest, _Config) ->\n ct_ftp:close(ftp).\n\nftptest() ->\n [{require,ftp,ftp_host},\n {require,lm_directory}].\n\nftptest(Config) ->\n Remote = filename:join(ct:get_config(lm_directory), \"loadmodX\"),\n Local = filename:join(proplists:get_value(priv_dir,Config), \"loadmodule\"),\n ok = ct_ftp:recv(ftp, Remote, Local),\n ...\n```\n\nThe following is an example of how the functions in the previous example can be\nrewritten if it is necessary to open multiple connections to the FTP server:\n\n```erlang\ninit_per_testcase(ftptest, Config) ->\n {ok,Handle1} = ct_ftp:open(ftp_host),\n {ok,Handle2} = ct_ftp:open(ftp_host),\n [{ftp_handles,[Handle1,Handle2]} | Config].\n\nend_per_testcase(ftptest, Config) ->\n lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,\n proplists:get_value(ftp_handles,Config)).\n\nftptest() ->\n [{require,ftp_host},\n {require,lm_directory}].\n\nftptest(Config) ->\n Remote = filename:join(ct:get_config(lm_directory), \"loadmodX\"),\n Local = filename:join(proplists:get_value(priv_dir,Config), \"loadmodule\"),\n [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),\n ok = ct_ftp:recv(Handle, Remote, Local),\n ...\n```","title":"Examples of Configuration Data Handling - External Configuration Data","ref":"config_file_chapter.html#examples-of-configuration-data-handling"},{"type":"extras","doc":"A simple configuration handling driver, asking an external server for\nconfiguration data, can be implemented as follows:\n\n```erlang\n-module(config_driver).\n-export([read_config/1, check_parameter/1]).\n\nread_config(ServerName)->\n ServerModule = list_to_atom(ServerName),\n ServerModule:start(),\n ServerModule:get_config().\n\ncheck_parameter(ServerName)->\n ServerModule = list_to_atom(ServerName),\n case code:is_loaded(ServerModule) of\n {file, _}->\n {ok, {config, ServerName}};\n false->\n case code:load_file(ServerModule) of\n {module, ServerModule}->\n {ok, {config, ServerName}};\n {error, nofile}->\n {error, {wrong_config, \"File not found: \" ++ ServerName ++ \".beam\"}}\n end\n end.\n```\n\nThe configuration string for this driver can be `config_server`, if the\n`config_server.erl` module that follows is compiled and exists in the code path\nduring test execution:\n\n```erlang\n-module(config_server).\n-export([start/0, stop/0, init/1, get_config/0, loop/0]).\n\n-define(REGISTERED_NAME, ct_test_config_server).\n\nstart()->\n case whereis(?REGISTERED_NAME) of\n undefined->\n spawn(?MODULE, init, [?REGISTERED_NAME]),\n wait();\n _Pid->\n ok\n end,\n ?REGISTERED_NAME.\n\ninit(Name)->\n register(Name, self()),\n loop().\n\nget_config()->\n call(self(), get_config).\n\nstop()->\n call(self(), stop).\n\ncall(Client, Request)->\n case whereis(?REGISTERED_NAME) of\n undefined->\n {error, {not_started, Request}};\n Pid->\n Pid ! {Client, Request},\n receive\n Reply->\n {ok, Reply}\n after 4000->\n {error, {timeout, Request}}\n end\n end.\n\nloop()->\n receive\n {Pid, stop}->\n Pid ! ok;\n {Pid, get_config}->\n {D,T} = erlang:localtime(),\n Pid !\n [{localtime, [{date, D}, {time, T}]},\n {node, erlang:node()},\n {now, erlang:now()},\n {config_server_pid, self()},\n {config_server_vsn, ?vsn}],\n ?MODULE:loop()\n end.\n\nwait()->\n case whereis(?REGISTERED_NAME) of\n undefined->\n wait();\n _Pid->\n ok\n end.\n```\n\nHere, the handler also provides for dynamically reloading of configuration\nvariables. If [`ct:reload_config(localtime)`](`ct:reload_config/1`) is called\nfrom the test case function, all variables loaded with\n`config_driver:read_config/1` are updated with their latest values, and the new\nvalue for variable `localtime` is returned.","title":"Example of User-Specific Configuration Handler - External Configuration Data","ref":"config_file_chapter.html#example-of-user-specific-configuration-handler"},{"type":"extras","doc":"\n# Code Coverage Analysis\n\n[](){: #cover }","title":"Code Coverage Analysis","ref":"cover_chapter.html"},{"type":"extras","doc":"Although `Common Test` was created primarily for black-box testing, nothing\nprevents it from working perfectly as a white-box testing tool as well. This is\nespecially true when the application to test is written in Erlang. Then the test\nports are easily realized with Erlang function calls.\n\nWhen white-box testing an Erlang application, it is useful to be able to measure\nthe code coverage of the test. `Common Test` provides simple access to the OTP\nCover tool for this purpose. `Common Test` handles all necessary communication\nwith the Cover tool (starting, compiling, analysing, and so on). The\n`Common Test` user only needs to specify the extent of the code coverage\nanalysis.","title":"General - Code Coverage Analysis","ref":"cover_chapter.html#general"},{"type":"extras","doc":"To specify the modules to be included in the code coverage test, provide a cover\nspecification file. With this file you can point out specific modules or specify\ndirectories containing modules to be included in the analysis. You can also\nspecify modules to be excluded from the analysis.\n\nIf you are testing a distributed Erlang application, it is likely that code you\nwant included in the code coverage analysis gets executed on another Erlang node\nthan the one `Common Test` is running on. If so, you must specify these other\nnodes in the cover specification file or add them dynamically to the code\ncoverage set of nodes. For details on the latter, see module `m:ct_cover`.\n\nIn the cover specification file you can also specify your required level of the\ncode coverage analysis; `details` or `overview`. In detailed mode, you get a\ncoverage overview page, showing per module and total coverage percentages. You\nalso get an HTML file printed for each module included in the analysis showing\nexactly what parts of the code have been executed during the test. In overview\nmode, only the code coverage overview page is printed.\n\nYou can choose to export and import code coverage data between tests. If you\nspecify the name of an export file in the cover specification file,\n`Common Test` exports collected coverage data to this file at the end of the\ntest. You can similarly specify previously exported data to be imported and\nincluded in the analysis for a test (multiple import files can be specified).\nThis way, the total code coverage can be analyzed without necessarily running\nall tests at once.\n\nTo activate the code coverage support, specify the name of the cover\nspecification file as you start `Common Test`. Do this by using flag `-cover`\nwith [`ct_run`](ct_run_cmd.md), for example:\n\n```text\n$ ct_run -dir $TESTOBJS/db -cover $TESTOBJS/db/config/db.coverspec\n```\n\nYou can also pass the cover specification file name in a call to\n`ct:run_test/1`, by adding a `{cover,CoverSpec}` tuple to argument `Opts`.\n\nYou can also enable code coverage in your test specifications (see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results).\n\n[](){: #cover_stop }","title":"Use - Code Coverage Analysis","ref":"cover_chapter.html#use"},{"type":"extras","doc":"By default, the Cover tool is automatically stopped when the tests are\ncompleted. This causes the original (non-cover compiled) modules to be loaded\nback into the test node. If a process at this point still runs old code of any\nof the modules that are cover compiled, meaning that it has not done any fully\nqualified function call after the cover compilation, the process is killed. To\navoid this, set the value of option `cover_stop` to `false`. This means that the\nmodules stay cover compiled. Therefore, this is only recommended if the Erlang\nnodes under test are terminated after the test is completed, or if cover can be\nmanually stopped.\n\nThe option can be set by using flag `-cover_stop` with `ct_run`, by adding\n`{cover_stop,true|false}` to argument `Opts` to `ct:run_test/1`, or by adding a\n`cover_stop` term in the test specification (see section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results).","title":"Stopping the Cover Tool When Tests Are Completed - Code Coverage Analysis","ref":"cover_chapter.html#stopping-the-cover-tool-when-tests-are-completed"},{"type":"extras","doc":"","title":"The Cover Specification File - Code Coverage Analysis","ref":"cover_chapter.html#the-cover-specification-file"},{"type":"extras","doc":"Here follows the general configuration terms that are allowed in a cover\nspecification file:\n\n```erlang\n%% List of Nodes on which cover will be active during test.\n%% Nodes = [atom()]\n{nodes, Nodes}.\n\n%% Files with previously exported cover data to include in analysis.\n%% CoverDataFiles = [string()]\n{import, CoverDataFiles}.\n\n%% Cover data file to export from this session.\n%% CoverDataFile = string()\n{export, CoverDataFile}.\n\n%% Cover analysis level.\n%% Level = details | overview\n{level, Level}.\n\n%% Directories to include in cover.\n%% Dirs = [string()]\n{incl_dirs, Dirs}.\n\n%% Directories, including subdirectories, to include.\n{incl_dirs_r, Dirs}.\n\n%% Specific modules to include in cover.\n%% Mods = [atom()]\n{incl_mods, Mods}.\n\n%% Directories to exclude in cover.\n{excl_dirs, Dirs}.\n\n%% Directories, including subdirectories, to exclude.\n{excl_dirs_r, Dirs}.\n\n%% Specific modules to exclude in cover.\n{excl_mods, Mods}.\n\n%% Cross cover compilation\n%% Tag = atom(), an identifier for a test run\n%% Mod = [atom()], modules to compile for accumulated analysis\n{cross,[{Tag,Mods}]}.\n```\n\nThe terms `incl_dirs_r` and `excl_dirs_r` tell `Common Test` to search the\nspecified directories recursively and include or exclude any module found during\nthe search. The terms `incl_dirs` and `excl_dirs` result in a non-recursive\nsearch for modules (that is, only modules found in the specified directories are\nincluded or excluded).\n\n> #### Note {: .info }\n>\n> Directories containing Erlang modules to be included in a code coverage test\n> must exist in the code server path. Otherwise, the Cover tool fails to\n> recompile the modules. It is not sufficient to specify these directories in\n> the cover specification file for `Common Test`.","title":"General Config - Code Coverage Analysis","ref":"cover_chapter.html#general-config"},{"type":"extras","doc":"When using a cover specification in the testing of an OTP application itself,\nthere is a special incl_app directive that includes the applications modules for\nthe cover compilation.\n\n```erlang\n{incl_app, AppName, Cover :: overview | details}.\n```\n\n> #### Note {: .info }\n>\n> If you desire to also use some other general cover configuration together with\n> this option you should insert the AppName in between the option and its value\n> creating a three tuple.\n\n[](){: #cross_cover }","title":"OTP application Config - Code Coverage Analysis","ref":"cover_chapter.html#otp-application-config"},{"type":"extras","doc":"The cross cover mechanism allows cover analysis of modules across multiple\ntests. It is useful if some code, for example, a library module, is used by many\ndifferent tests and the accumulated cover result is desirable.\n\nThis can also be achieved in a more customized way by using parameter `export`\nin the cover specification and analysing the result off line. However, the cross\ncover mechanism is a built-in solution that also provides logging.\n\nThe mechanism is easiest explained by an example:\n\nAssume that there are two systems, `s1` and `s2`, that are tested in separate\ntest runs. System `s1` contains a library module `m1` tested by test run `s1`\nand is included in the cover specification of `s1` as follows:\n\n```text\ns1.cover:\n {incl_mods,[m1]}.\n```\n\nWhen analysing code coverage, the result for `m1` can be seen in the cover log\nin the `s1` test result.\n\nNow, imagine that as `m1` is a library module, it is also often used by system\n`s2`. Test run `s2` does not specifically test `m1`, but it can still be\ninteresting to see which parts of `m1` that are covered by the `s2` tests. To do\nthis, `m1` can be included also in the cover specification of `s2` as follows:\n\n```text\ns2.cover:\n {incl_mods,[m1]}.\n```\n\nThis gives an entry for `m1` also in the cover log for test run `s2`. The\nproblem is that this only reflects the coverage by `s2` tests, not the\naccumulated result over `s1` and `s2`. This is where the cross cover mechanism\ncomes in handy.\n\nIf instead the cover specification for `s2` is like the following:\n\n```text\ns2.cover:\n {cross,[{s1,[m1]}]}.\n```\n\nThen `m1` is cover compiled in test run `s2`, but not shown in the coverage log.\nInstead, if `ct_cover:cross_cover_analyse/2` is called after both `s1` and `s2`\ntest runs are completed, the accumulated result for `m1` is available in the\ncross cover log for test run `s1`.\n\nThe call to the analyze function must be as follows:\n\n```erlang\nct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).\n```\n\nHere, `S1LogDir` and `S2LogDir` are the directories named ` .logs` for\neach test respectively.\n\nNotice the tags `s1` and `s2`, which are used in the cover specification file\nand in the call to `ct_cover:cross_cover_analyse/2`. The purpose of these is\nonly to map the modules specified in the cover specification to the log\ndirectory specified in the call to the analyze function. The tag name has no\nmeaning beyond this.","title":"Cross Cover Analysis - Code Coverage Analysis","ref":"cover_chapter.html#cross-cover-analysis"},{"type":"extras","doc":"To view the result of a code coverage test, click the button labeled \"COVER LOG\"\nin the top-level index page for the test run.\n\nBefore Erlang/OTP 17.1, if your test run consisted of multiple tests, cover\nwould be started and stopped for each test within the test run. Separate logs\nwould be available through the \"Coverage log\" link on the test suite result\npages. These links are still available, but now they all point to the same page\nas the button on the top-level index page. The log contains the accumulated\nresults for the complete test run. For details about this change, see the\nrelease notes.\n\nThe button takes you to the code coverage overview page. If you have\nsuccessfully performed a detailed coverage analysis, links to each individual\nmodule coverage page are found here.\n\nIf cross cover analysis is performed, and there are accumulated coverage results\nfor the current test, the link \"Coverdata collected over all tests\" takes you to\nthese results.","title":"Logging - Code Coverage Analysis","ref":"cover_chapter.html#logging"},{"type":"extras","doc":"\n# Using Common Test for Large-Scale Testing","title":"Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html"},{"type":"extras","doc":"Large-scale automated testing requires running multiple independent test\nsessions in parallel. This is accomplished by running some `Common Test` nodes\non one or more hosts, testing different target systems. Configuring, starting,\nand controlling the test nodes independently can be a cumbersome operation. To\naid this kind of automated large-scale testing, `Common Test` offers a master\ntest node component, `Common Test` Master, which handles central configuration\nand control in a system of distributed `Common Test` nodes.\n\nThe `Common Test` Master server runs on one dedicated Erlang node and uses\ndistributed Erlang to communicate with any number of `Common Test` test nodes,\neach hosting a regular `Common Test` server. Test specifications are used as\ninput to specify what to test on which test nodes, using what configuration.\n\nThe `Common Test` Master server writes progress information to HTML log files\nsimilarly to the regular `Common Test` server. The logs contain test statistics\nand links to the log files written by each independent `Common Test` server.\n\nThe `Common Test` Master API is exported by module `m:ct_master`.","title":"General - Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html#general"},{"type":"extras","doc":"`Common Test` Master requires all test nodes to be on the same network and share\na common file system. `Common Test` Master cannot start test nodes\nautomatically. The nodes must be started in advance for `Common Test` Master to\nbe able to start test sessions on them.\n\nTests are started by calling [`ct_master:run(TestSpecs)`](`ct_master:run/1`) or\n[`ct_master:run(TestSpecs, InclNodes, ExclNodes)`](`ct_master:run/3`)\n\n`TestSpecs` is either the name of a test specification file (string) or a list\nof test specifications. If it is a list, the specifications are handled (and the\ncorresponding tests executed) in sequence. An element in a `TestSpecs` list can\nalso be list of test specifications. The specifications in such a list are\nmerged into one combined specification before test execution.\n\n_Example:_\n\n```erlang\nct_master:run([\"ts1\",\"ts2\",[\"ts3\",\"ts4\"]])\n```\n\nHere, the tests specified by \"ts1\" run first, then the tests specified by \"ts2\",\nand finally the tests specified by both \"ts3\" and \"ts4\".\n\nThe `InclNodes` argument to `run/3` is a list of node names. Function `run/3`\nruns the tests in `TestSpecs` just like `run/1`, but also takes any test in\n`TestSpecs`, which is not explicitly tagged with a particular node name, and\nexecute it on the nodes listed in `InclNodes`. By using `run/3` this way, any\ntest specification can be used, with or without node information, in a\nlarge-scale test environment.\n\n`ExclNodes` is a list of nodes to be excluded from the test. That is, tests that\nare specified in the test specification to run on a particular node are not\nperformed if that node is listed in `ExclNodes` at runtime.\n\nIf `Common Test` Master fails initially to connect to any of the test nodes\nspecified in a test specification or in the `InclNodes` list, the operator is\nprompted with the option to either start over again (after manually checking the\nstatus of the nodes in question), to run without the missing nodes, or to abort\nthe operation.\n\nWhen tests start, `Common Test` Master displays information to console about the\ninvolved nodes. `Common Test` Master also reports when tests finish,\nsuccessfully or unsuccessfully. If connection is lost to a node, the test on\nthat node is considered finished. `Common Test` Master does not attempt to\nre-establish contact with the failing node.\n\nAt any time, to get the current status of the test nodes, call function\n[`ct_master:progress()`](`ct_master:progress/0`).\n\nTo stop one or more tests, use function\n[`ct_master:abort()`](`ct_master:abort/0`) (to stop all) or\n[`ct_master:abort(Nodes)`](`ct_master:abort/1`).\n\nFor details about the `Common Test` Master API, see module `m:ct_master`.\n\n[](){: #test_specifications }","title":"Use - Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html#use"},{"type":"extras","doc":"The test specifications used as input to `Common Test` Master are fully\ncompatible with the specifications used as input to the regular `Common Test`\nserver. The syntax is described in section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analyzing Results.\n\nAll test specification terms can have a `NodeRefs` element. This element\nspecifies which node or nodes a configuration operation or a test is to be\nexecuted on. `NodeRefs` is defined as follows:\n\n`NodeRefs = all_nodes | [NodeRef] | NodeRef`\n\n`NodeRef = NodeAlias | node() | master`\n\nA `NodeAlias` (`t:atom/0`) is used in a test specification as a reference to a\nnode name (so the node name only needs to be declared once, which also can be\nachieved using constants). The alias is declared with a `node` term as follows:\n\n`{node, NodeAlias, NodeName}`\n\nIf `NodeRefs` has the value `all_nodes`, the operation or test is performed on\nall specified test nodes. (Declaring a term without a `NodeRefs` element has the\nsame effect). If `NodeRefs` has the value `master`, the operation is only\nperformed on the `Common Test` Master node (namely set the log directory or\ninstall an event handler).\n\nConsider the example in section\n[Test Specifications](run_test_chapter.md#test_specifications) in section\nRunning Tests and Analysing Results, now extended with node information and\nintended to be executed by `Common Test` Master:\n\n```erlang\n{define, 'Top', \"/home/test\"}.\n{define, 'T1', \"'Top'/t1\"}.\n{define, 'T2', \"'Top'/t2\"}.\n{define, 'T3', \"'Top'/t3\"}.\n{define, 'CfgFile', \"config.cfg\"}.\n{define, 'Node', ct_node}.\n\n{node, node1, 'Node@host_x'}.\n{node, node2, 'Node@host_y'}.\n\n{logdir, master, \"'Top'/master_logs\"}.\n{logdir, \"'Top'/logs\"}.\n\n{config, node1, \"'T1'/'CfgFile'\"}.\n{config, node2, \"'T2'/'CfgFile'\"}.\n{config, \"'T3'/'CfgFile'\"}.\n\n{suites, node1, 'T1', all}.\n{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], \"Not implemented\"}.\n{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], \"Irrelevant\"}.\n{skip_cases, node1, 'T1', t1C_SUITE, [test1], \"Ignore\"}.\n\n{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.\n{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.\n\n{skip_suites, 'T3', all, \"Not implemented\"}.\n```\n\nThis example specifies the same tests as the original example. But now if\nstarted with a call to `ct_master:run(TestSpecName)`, test `t1` is executed on\nnode `ct_node@host_x` (`node1`), test `t2` on `ct_node@host_y` (`node2`) and\ntest `t3` on both `node1` and `node2`. Configuration file `t1` is only read on\n`node1` and configuration file `t2` only on `node2`, while the configuration\nfile `t3` is read on both `node1` and `node2`. Both test nodes write log files\nto the same directory. (However, the `Common Test` Master node uses a different\nlog directory than the test nodes.)\n\nIf the test session is instead started with a call to\n`ct_master:run(TestSpecName, [ct_node@host_z], [ct_node@host_x])`, the result is\nthat test `t1` does not run on `ct_node@host_x` (or any other node) while test\n`t3` runs on both `ct_node@host_y` and `ct_node@host_z`.\n\nA nice feature is that a test specification that includes node information can\nstill be used as input to the regular `Common Test` server (as described in\nsection [Test Specifications](run_test_chapter.md#test_specifications)). The\nresult is that any test specified to run on a node with the same name as the\n`Common Test` node in question (typically `ct@somehost` if started with the\n`ct_run` program), is performed. Tests without explicit node association are\nalways performed too, of course.","title":"Test Specifications - Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html#test-specifications"},{"type":"extras","doc":"[](){: #ct_slave }\n\nInitial actions can be started and performed automatically on test target nodes\nusing test specification term `init`.\n\nTwo subterms are supported, `node_start` and `eval`.\n\n_Example:_\n\n```erlang\n{node, node1, node1@host1}.\n{node, node2, node1@host2}.\n{node, node3, node2@host2}.\n{node, node4, node1@host3}.\n{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.\n{init, [node2, node3], {node_start, [{username, \"ct_user\"}, {password, \"ct_password\"}]}}.\n{init, node4, {eval, {module, function, []}}}.\n```\n\nThis test specification declares that `node1@host1` is to be started using the\nuser callback function `callback_module:my_slave_callback/0`, and nodes\n`node1@host2` and `node2@host2` are to be started with the default callback\nmodule `ct_slave`. The specified username and password are used to log on to\nremote host `host2`. Also, function `module:function/0` is evaluated on\n`node1@host3`, and the result of this call is printed to the log.\n\nThe default callback module `m:ct_slave`, has the following features:\n\n- Starting Erlang target nodes on local or remote hosts (application `SSH` is\n used for communication).\n- Ability to start an Erlang emulator with more flags (any flags supported by\n `erl` are supported).\n- Supervision of a node being started using internal callback functions. Used to\n prevent hanging nodes. (Configurable.)\n- Monitoring of the master node by the slaves. A slave node can be stopped if\n the master node terminates. (Configurable.)\n- Execution of user functions after a slave node is started. Functions can be\n specified as a list of `{Module, Function, Arguments}` tuples.\n\n> #### Note {: .info }\n>\n> An `eval` term for the node and `startup_functions` in the `node_start`\n> options list can be specified. In this case, the node is started first, then\n> the `startup_functions` are executed, and finally functions specified with\n> `eval` are called.","title":"Automatic Startup of Test Target Nodes - Using Common Test for Large-Scale Testing","ref":"ct_master_chapter.html#automatic-startup-of-test-target-nodes"},{"type":"extras","doc":"\n# Event Handling\n\n[](){: #event_handling }","title":"Event Handling","ref":"event_handler_chapter.html"},{"type":"extras","doc":"The operator of a `Common Test` system can receive event notifications\ncontinuously during a test run. For example, `Common Test` reports when a test\ncase starts and stops, the current count of successful, failed, and skipped\ncases, and so on. This information can be used for different purposes such as\nlogging progress and results in another format than HTML, saving statistics to a\ndatabase for report generation, and test system supervision.\n\n`Common Test` has a framework for event handling based on the OTP event manager\nconcept and `gen_event` behavior. When the `Common Test` server starts, it\nspawns an event manager. During test execution the manager gets a notification\nfrom the server when something of potential interest happens. Any event handler\nplugged into the event manager can match on events of interest, take action, or\npass the information on. The event handlers are Erlang modules implemented by\nthe `Common Test` user according to the `gen_event` behavior (for details, see\nmodule `m:gen_event` and section [`gen_event Behaviour`](`e:system:events.md`)\nin OTP Design Principles in the System Documentation).\n\nA `Common Test` server always starts an event manager. The server also plugs in\na default event handler, which only purpose is to relay notifications to a\nglobally registered `Common Test` Master event manager (if a `Common Test`\nMaster server is running in the system). The `Common Test` Master also spawns an\nevent manager at startup. Event handlers plugged into this manager receives the\nevents from all the test nodes, plus information from the `Common Test` Master\nserver.\n\nUser-specific event handlers can be plugged into a `Common Test` event manager,\neither by telling `Common Test` to install them before the test run (described\nlater), or by adding the handlers dynamically during the test run using\n`gen_event:add_handler/3` or `gen_event:add_sup_handler/3`. In the latter\nscenario, the reference of the `Common Test` event manager is required. To get\nit, call `ct:get_event_mgr_ref/0` or (on the `Common Test` Master node)\n`ct_master:get_event_mgr_ref/0`.\n\n[](){: #usage }","title":"General - Event Handling","ref":"event_handler_chapter.html#general"},{"type":"extras","doc":"Event handlers can be installed by an `event_handler` start flag\n([`ct_run`](ct_run_cmd.md)) or option `ct:run_test/1`, where the argument\nspecifies the names of one or more event handler modules.\n\n_Example:_\n\n`$ ct_run -suite test/my_SUITE -event_handler handlers/my_evh1 handlers/my_evh2 -pa $PWD/handlers`\n\nTo pass start arguments to the event handler init function, use option\n`ct_run -event_handler_init` instead of `-event_handler`.\n\n> #### Note {: .info }\n>\n> All event handler modules must have `gen_event` behavior. These modules must\n> be precompiled and their locations must be added explicitly to the Erlang code\n> server search path (as in the previous example).\n\nAn event_handler tuple in argument `Opts` has the following definition (see\n`ct:run_test/1`):\n\n```erlang\n{event_handler,EventHandlers}\n\nEventHandlers = EH | [EH]\nEH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}\nInitArgs = [term()]\n```\n\nIn the following example, two event handlers for the `my_SUITE` test are\ninstalled:\n\n```erlang\n1> ct:run_test([{suite,\"test/my_SUITE\"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).\n```\n\nEvent handler `my_evh1` is started with `[]` as argument to the init function.\nEvent handler `my_evh2` is started with the name of the current node in the init\nargument list.\n\nEvent handlers can also be plugged in using one of the following\n[test specification](run_test_chapter.md#test_specifications) terms:\n\n- `{event_handler, EventHandlers}`\n- `{event_handler, EventHandlers, InitArgs}`\n- `{event_handler, NodeRefs, EventHandlers}`\n- `{event_handler, NodeRefs, EventHandlers, InitArgs}`\n\n`EventHandlers` is a list of module names. Before a test session starts, the\ninit function of each plugged in event handler is called (with the `InitArgs`\nlist as argument or `[]` if no start arguments are specified).\n\nTo plug in a handler to the `Common Test` Master event manager, specify `master`\nas the node in `NodeRefs`.\n\nTo be able to match on events, the event handler module must include the header\nfile `ct_event.hrl`. An event is a record with the following definition:\n\n`#event{name, node, data}`\n\n- **`name`** - Label (type) of the event.\n\n- **`node`** - Name of the node that the event originated from (only relevant\n for `Common Test` Master event handlers).\n\n- **`data`** - Specific for the event.\n\n[](){: #events }","title":"Use - Event Handling","ref":"event_handler_chapter.html#use"},{"type":"extras","doc":"The general events are as follows:\n\n- **`#event{name = start_logging, data = LogDir}`** - `LogDir = string()`,\n top-level log directory for the test run.\n\n This event indicates that the logging process of `Common Test` has started\n successfully and is ready to receive I/O messages.\n\n- **`#event{name = stop_logging, data = []}`** - This event indicates that the\n logging process of `Common Test` was shut down at the end of the test run.\n\n- **`#event{name = test_start, data = {StartTime,LogDir}}`** -\n `StartTime = {date(),time()}`, test run start date and time.\n\n `LogDir = string()`, top-level log directory for the test run.\n\n This event indicates that `Common Test` has finished initial preparations and\n begins executing test cases.\n\n- **`#event{name = test_done, data = EndTime}`** - `EndTime = {date(),time()}`,\n date and time the test run finished.\n\n This event indicates that the last test case has been executed and\n `Common Test` is shutting down.\n\n- **`#event{name = start_info, data = {Tests,Suites,Cases}}`** -\n `Tests = integer()`, number of tests.\n\n `Suites = integer()`, total number of suites.\n\n `Cases = integer() | unknown`, total number of test cases.\n\n This event gives initial test run information that can be interpreted as:\n \"This test run will execute `Tests` separate tests, in total containing\n `Cases` number of test cases, in `Suites` number of suites\". However, if a\n test case group with a repeat property exists in any test, the total number of\n test cases cannot be calculated (unknown).\n\n- **`#event{name = tc_start, data = {Suite,FuncOrGroup}}`** - `Suite = atom()`,\n name of the test suite.\n\n `FuncOrGroup = Func | {Conf,GroupName,GroupProperties}`\n\n `Func = atom()`, name of test case or configuration function.\n\n `Conf = init_per_group | end_per_group`, group configuration function.\n\n `GroupName = atom()`, name of the group.\n\n `GroupProperties = list()`, list of execution properties for the group.\n\n This event informs about the start of a test case, or a group configuration\n function. The event is sent also for `init_per_suite` and `end_per_suite`, but\n not for `init_per_testcase` and `end_per_testcase`. If a group configuration\n function starts, the group name and execution properties are also specified.\n\n- **`#event{name = tc_logfile, data = {{Suite,Func},LogFileName}}`** -\n `Suite = atom()`, name of the test suite.\n\n `Func = atom()`, name of test case or configuration function.\n\n `LogFileName = string()`, full name of the test case log file.\n\n This event is sent at the start of each test case (and configuration function\n except `init/end_per_testcase`) and carries information about the full name\n (that is, the file name including the absolute directory path) of the current\n test case log file.\n\n- **`#event{name = tc_done, data = {Suite,FuncOrGroup,Result}}`** - [](){:\n #tc_done } `Suite = atom()`, name of the suite.\n\n `FuncOrGroup = Func | {Conf,GroupName,GroupProperties}`\n\n `Func = atom()`, name of test case or configuration function.\n\n `Conf = init_per_group | end_per_group`, group configuration function.\n\n `GroupName = unknown | atom()`, name of the group (unknown if init- or end\n function times out).\n\n `GroupProperties = list()`, list of execution properties for the group.\n\n `Result = ok | {auto_skipped,SkipReason} | {skipped,SkipReason} | {failed,FailReason}`,\n the result.\n\n [](){: #skipreason }\n `SkipReason = {require_failed,RequireInfo} | {require_failed_in_suite0,RequireInfo} | {failed,{Suite,init_per_testcase,FailInfo}} | UserTerm`,\n why the case was skipped.\n\n [](){: #failreason }\n `FailReason = {error,FailInfo} | {error,{RunTimeError,StackTrace}} | {timetrap_timeout,integer()} | {failed,{Suite,end_per_testcase,FailInfo}}`,\n reason for failure.\n\n `RequireInfo = {not_available,atom() | tuple()}`, why require failed.\n\n `FailInfo = {timetrap_timeout,integer()} | {RunTimeError,StackTrace} | UserTerm`,\n error details.\n\n `RunTimeError = term()`, a runtime error, for example, `badmatch` or `undef`.\n\n `StackTrace = list()`, list of function calls preceding a runtime error.\n\n `UserTerm = term()`, any data specified by user, or [`exit/1`](`exit/1`)\n information.\n\n This event informs about the end of a test case or a configuration function\n (see event `tc_start` for details on element `FuncOrGroup`). With this event\n comes the final result of the function in question. It is possible to\n determine on the top level of `Result` if the function was successful, skipped\n (by the user), or if it failed.\n\n It is also possible to dig deeper and, for example, perform pattern matching\n on the various reasons for skipped or failed. Notice that `{'EXIT',Reason}`\n tuples are translated into `{error,Reason}`. Notice also that if a\n `{failed,{Suite,end_per_testcase,FailInfo}` result is received, the test case\n was successful, but `end_per_testcase` for the case failed.\n\n- **`#event{name = tc_auto_skip, data = {Suite,TestName,Reason}}`** - [](){:\n #tc_auto_skip } `Suite = atom()`, the name of the suite.\n\n `TestName = init_per_suite | end_per_suite | {init_per_group,GroupName} | {end_per_group,GroupName} | {FuncName,GroupName} | FuncName`\n\n `FuncName = atom()`, the name of the test case or configuration function.\n\n `GroupName = atom()`, the name of the test case group.\n\n `Reason = {failed,FailReason} | {require_failed_in_suite0,RequireInfo}`,\n reason for auto-skipping `Func`.\n\n `FailReason = {Suite,ConfigFunc,FailInfo}} | {Suite,FailedCaseInSequence}`,\n reason for failure.\n\n `RequireInfo = {not_available,atom() | tuple()}`, why require failed.\n\n `ConfigFunc = init_per_suite | init_per_group`\n\n `FailInfo = {timetrap_timeout,integer()} | {RunTimeError,StackTrace} | bad_return | UserTerm`,\n error details.\n\n `FailedCaseInSequence = atom()`, the name of a case that failed in a sequence.\n\n `RunTimeError = term()`, a runtime error, for example `badmatch` or `undef`.\n\n `StackTrace = list()`, list of function calls preceding a runtime error.\n\n `UserTerm = term()`, any data specified by user, or [`exit/1`](`exit/1`)\n information.\n\n This event is sent for every test case or configuration function that\n `Common Test` has skipped automatically because of either a failed\n `init_per_suite` or `init_per_group`, a failed `require` in `suite/0`, or a\n failed test case in a sequence. Notice that this event is never received as a\n result of a test case getting skipped because of `init_per_testcase` failing,\n as that information is carried with event `tc_done`. If a failed test case\n belongs to a test case group, the second data element is a tuple\n `{FuncName,GroupName}`, otherwise only the function name.\n\n- **`#event{name = tc_user_skip, data = {Suite,TestName,Comment}}`** - [](){:\n #tc_user_skip } `Suite = atom()`, the name of the suite.\n\n `TestName = init_per_suite | end_per_suite | {init_per_group,GroupName} | {end_per_group,GroupName} | {FuncName,GroupName} | FuncName`\n\n `FuncName = atom()`, the name of the test case or configuration function.\n\n `GroupName = atom()`, the name of the test case group.\n\n `Comment = string()`, why the test case was skipped.\n\n This event specifies that a test case was skipped by the user. It is only\n received if the skip is declared in a test specification. Otherwise, user skip\n information is received as a `{skipped,SkipReason}` result in event `tc_done`\n for the test case. If a skipped test case belongs to a test case group, the\n second data element is a tuple `{FuncName,GroupName}`, otherwise only the\n function name.\n\n- **`#event{name = test_stats, data = {Ok,Failed,Skipped}}`** -\n `Ok = integer()`, current number of successful test cases.\n\n `Failed = integer()`, current number of failed test cases.\n\n `Skipped = {UserSkipped,AutoSkipped}`\n\n `UserSkipped = integer()`, current number of user-skipped test cases.\n\n `AutoSkipped = integer()`, current number of auto-skipped test cases.\n\n This is a statistics event with current count of successful, skipped, and\n failed test cases so far. This event is sent after the end of each test case,\n immediately following event `tc_done`.","title":"General Events - Event Handling","ref":"event_handler_chapter.html#general-events"},{"type":"extras","doc":"The internal events are as follows:\n\n- **`#event{name = start_make, data = Dir}`** - `Dir = string()`, running make\n in this directory.\n\n This internal event says that `Common Test` starts compiling modules in\n directory `Dir`.\n\n- **`#event{name = finished_make, data = Dir}`** - `Dir = string()`, finished\n running make in this directory.\n\n This internal event says that `Common Test` is finished compiling modules in\n directory `Dir`.\n\n- **`#event{name = start_write_file, data = FullNameFile}`** -\n `FullNameFile = string(), full name of the file.`\n\n This internal event is used by the `Common Test` Master process to synchronize\n particular file operations.\n\n- **`#event{name = finished_write_file, data = FullNameFile}`** -\n `FullNameFile = string(), full name of the file.`\n\n This internal event is used by the `Common Test` Master process to synchronize\n particular file operations.","title":"Internal Events - Event Handling","ref":"event_handler_chapter.html#internal-events"},{"type":"extras","doc":"The events are also documented in `ct_event.erl`. This module can serve as an\nexample of what an event handler for the `Common Test` event manager can look\nlike.\n\n> #### Note {: .info }\n>\n> To ensure that printouts to `stdout` (or printouts made with\n> [`ct:log/2,3`](`ct:log/2`) or [`ct:pal,2,3`](`ct:pal/2`)) get written to the\n> test case log file, and not to the `Common Test` framework log, you can\n> synchronize with the `Common Test` server by matching on events `tc_start` and\n> `tc_done`. In the period between these events, all I/O is directed to the test\n> case log file. These events are sent synchronously to avoid potential timing\n> problems (for example, that the test case log file is closed just before an\n> I/O message from an external process gets through). Knowing this, you need to\n> be careful that your `handle_event/2` callback function does not stall the\n> test execution, possibly causing unexpected behavior as a result.","title":"Notes - Event Handling","ref":"event_handler_chapter.html#notes"},{"type":"extras","doc":"\n# Dependencies between Test Cases and Suites","title":"Dependencies between Test Cases and Suites","ref":"dependencies_chapter.html"},{"type":"extras","doc":"When creating test suites, it is strongly recommended to not create dependencies\nbetween test cases, that is, letting test cases depend on the result of previous\ntest cases. There are various reasons for this, such as, the following:\n\n- It makes it impossible to run test cases individually.\n- It makes it impossible to run test cases in a different order.\n- It makes debugging difficult (as a fault can be the result of a problem in a\n different test case than the one failing).\n- There are no good and explicit ways to declare dependencies, so it can be\n difficult to see and understand these in test suite code and in test logs.\n- Extending, restructuring, and maintaining test suites with test case\n dependencies is difficult.\n\nThere are often sufficient means to work around the need for test case\ndependencies. Generally, the problem is related to the state of the System Under\nTest (SUT). The action of one test case can change the system state. For some\nother test case to run properly, this new state must be known.\n\nInstead of passing data between test cases, it is recommended that the test\ncases read the state from the SUT and perform assertions (that is, let the test\ncase run if the state is as expected, otherwise reset or fail). It is also\nrecommended to use the state to set variables necessary for the test case to\nexecute properly. Common actions can often be implemented as library functions\nfor test cases to call to set the SUT in a required state. (Such common actions\ncan also be separately tested, if necessary, to ensure that they work as\nexpected). It is sometimes also possible, but not always desirable, to group\ntests together in one test case, that is, let a test case perform a \"scenario\"\ntest (a test consisting of subtests).\n\nConsider, for example, a server application under test. The following\nfunctionality is to be tested:\n\n- Starting the server\n- Configuring the server\n- Connecting a client to the server\n- Disconnecting a client from the server\n- Stopping the server\n\nThere are obvious dependencies between the listed functions. The server cannot\nbe configured if it has not first been started, a client cannot be connected\nuntil the server is properly configured, and so on. If we want to have one test\ncase for each function, we might be tempted to try to always run the test cases\nin the stated order and carry possible data (identities, handles, and so on)\nbetween the cases and therefore introduce dependencies between them.\n\nTo avoid this, we can consider starting and stopping the server for every test.\nWe can thus implement the start and stop action as common functions to be called\nfrom [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`) and\n[`end_per_testcase`](`c:ct_suite:end_per_testcase/2`). (Remember to test the\nstart and stop functionality separately.) The configuration can also be\nimplemented as a common function, maybe grouped with the start function.\nFinally, the testing of connecting and disconnecting a client can be grouped\ninto one test case. The resulting suite can look as follows:\n\n```erlang\n-module(my_server_SUITE).\n-compile(export_all).\n-include_lib(\"ct.hrl\").\n\n%%% init and end functions...\n\nsuite() -> [{require,my_server_cfg}].\n\ninit_per_testcase(start_and_stop, Config) ->\n Config;\n\ninit_per_testcase(config, Config) ->\n [{server_pid,start_server()} | Config];\n\ninit_per_testcase(_, Config) ->\n ServerPid = start_server(),\n configure_server(),\n [{server_pid,ServerPid} | Config].\n\nend_per_testcase(start_and_stop, _) ->\n ok;\n\nend_per_testcase(_, Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n stop_server(ServerPid).\n\n%%% test cases...\n\nall() -> [start_and_stop, config, connect_and_disconnect].\n\n%% test that starting and stopping works\nstart_and_stop(_) ->\n ServerPid = start_server(),\n stop_server(ServerPid).\n\n%% configuration test\nconfig(Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n configure_server(ServerPid).\n\n%% test connecting and disconnecting client\nconnect_and_disconnect(Config) ->\n ServerPid = proplists:get_value(server_pid, Config),\n {ok,SessionId} = my_server:connect(ServerPid),\n ok = my_server:disconnect(ServerPid, SessionId).\n\n%%% common functions...\n\nstart_server() ->\n {ok,ServerPid} = my_server:start(),\n ServerPid.\n\nstop_server(ServerPid) ->\n ok = my_server:stop(),\n ok.\n\nconfigure_server(ServerPid) ->\n ServerCfgData = ct:get_config(my_server_cfg),\n ok = my_server:configure(ServerPid, ServerCfgData),\n ok.\n```\n\n[](){: #save_config }","title":"General - Dependencies between Test Cases and Suites","ref":"dependencies_chapter.html#general"},{"type":"extras","doc":"Sometimes it is impossible, or infeasible, to implement independent test cases.\nMaybe it is not possible to read the SUT state. Maybe resetting the SUT is\nimpossible and it takes too long time to restart the system. In situations where\ntest case dependency is necessary, CT offers a structured way to carry data from\none test case to the next. The same mechanism can also be used to carry data\nfrom one test suite to the next.\n\nThe mechanism for passing data is called `save_config`. The idea is that one\ntest case (or suite) can save the current value of `Config`, or any list of\nkey-value tuples, so that the next executing test case (or test suite) can read\nit. The configuration data is not saved permanently but can only be passed from\none case (or suite) to the next.\n\nTo save `Config` data, return tuple `{save_config,ConfigList}` from\n`end_per_testcase` or from the main test case function.\n\nTo read data saved by a previous test case, use `proplists:get_value` with a\n`saved_config` key as follows:\n\n`{Saver,ConfigList} = proplists:get_value(saved_config, Config)`\n\n`Saver` (`t:atom/0`) is the name of the previous test case (where the data was\nsaved). The `proplists:get_value` function can be used to extract particular\ndata also from the recalled `ConfigList`. It is strongly recommended that\n`Saver` is always matched to the expected name of the saving test case. This\nway, problems because of restructuring of the test suite can be avoided. Also,\nit makes the dependency more explicit and the test suite easier to read and\nmaintain.\n\nTo pass data from one test suite to another, the same mechanism is used. The\ndata is to be saved by finction [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\nand read by function [`init_per_suite`](`c:ct_suite:init_per_suite/1`) in the\nsuite that follows. When passing data between suites, `Saver` carries the name\nof the test suite.\n\n_Example:_\n\n```erlang\n-module(server_b_SUITE).\n-compile(export_all).\n-include_lib(\"ct.hrl\").\n\n%%% init and end functions...\n\ninit_per_suite(Config) ->\n %% read config saved by previous test suite\n {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),\n %% extract server identity (comes from server_a_SUITE)\n ServerId = proplists:get_value(server_id, OldConfig),\n SessionId = connect_to_server(ServerId),\n [{ids,{ServerId,SessionId}} | Config].\n\nend_per_suite(Config) ->\n %% save config for server_c_SUITE (session_id and server_id)\n {save_config,Config}\n\n%%% test cases...\n\nall() -> [allocate, deallocate].\n\nallocate(Config) ->\n {ServerId,SessionId} = proplists:get_value(ids, Config),\n {ok,Handle} = allocate_resource(ServerId, SessionId),\n %% save handle for deallocation test\n NewConfig = [{handle,Handle}],\n {save_config,NewConfig}.\n\ndeallocate(Config) ->\n {ServerId,SessionId} = proplists:get_value(ids, Config),\n {allocate,OldConfig} = proplists:get_value(saved_config, Config),\n Handle = proplists:get_value(handle, OldConfig),\n ok = deallocate_resource(ServerId, SessionId, Handle).\n```\n\nTo save `Config` data from a test case that is to be skipped, return tuple\n`{skip_and_save,Reason,ConfigList}`.\n\nThe result is that the test case is skipped with `Reason` printed to the log\nfile (as described earlier) and `ConfigList` is saved for the next test case.\n`ConfigList` can be read using `proplists:get_value(saved_config, Config)`, as\ndescribed earlier. `skip_and_save` can also be returned from `init_per_suite`.\nIn this case, the saved data can be read by `init_per_suite` in the suite that\nfollows.","title":"Saving Configuration Data - Dependencies between Test Cases and Suites","ref":"dependencies_chapter.html#saving-configuration-data"},{"type":"extras","doc":"Sometimes test cases depend on each other so that if one case fails, the\nfollowing tests are not to be executed. Typically, if the `save_config` facility\nis used and a test case that is expected to save data crashes, the following\ncase cannot run. `Common Test` offers a way to declare such dependencies, called\nsequences.\n\nA sequence of test cases is defined as a test case group with a `sequence`\nproperty. Test case groups are defined through function `groups/0` in the test\nsuite (for details, see section\n[Test Case Groups](write_test_chapter.md#test_case_groups).\n\nFor example, to ensure that if `allocate` in `server_b_SUITE` crashes,\n`deallocate` is skipped, the following sequence can be defined:\n\n```erlang\ngroups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].\n```\n\nAssume that the suite contains the test case `get_resource_status` that is\nindependent of the other two cases, then function `all` can look as follows:\n\n```erlang\nall() -> [{group,alloc_and_dealloc}, get_resource_status].\n```\n\nIf `alloc` succeeds, `dealloc` is also executed. If `alloc` fails however,\n`dealloc` is not executed but marked as `SKIPPED` in the HTML log.\n`get_resource_status` runs no matter what happens to the `alloc_and_dealloc`\ncases.\n\nTest cases in a sequence are executed in order until all succeed or one fails.\nIf one fails, all following cases in the sequence are skipped. The cases in the\nsequence that have succeeded up to that point are reported as successful in the\nlog. Any number of sequences can be specified.\n\n_Example:_\n\n```erlang\ngroups() -> [{scenarioA, [sequence], [testA1, testA2]},\n {scenarioB, [sequence], [testB1, testB2, testB3]}].\n\nall() -> [test1,\n test2,\n {group,scenarioA},\n test3,\n {group,scenarioB},\n test4].\n```\n\nA sequence group can have subgroups. Such subgroups can have any property, that\nis, they are not required to also be sequences. If you want the status of the\nsubgroup to affect the sequence on the level above, return\n`{return_group_result,Status}` from\n[`end_per_group/2`](`c:ct_suite:end_per_group/2`), as described in section\n[Repeated Groups](write_test_chapter.md#repeated_groups) in Writing Test Suites.\nA failed subgroup (`Status == failed`) causes the execution of a sequence to\nfail in the same way a test case does.","title":"Sequences - Dependencies between Test Cases and Suites","ref":"dependencies_chapter.html#sequences"},{"type":"extras","doc":"\n# Common Test Hooks","title":"Common Test Hooks","ref":"ct_hooks_chapter.html"},{"type":"extras","doc":"The _Common Test Hook (CTH)_ framework allows extensions of the default behavior\nof `Common Test` using hooks before and after all test suite calls. CTHs allow\nadvanced `Common Test` users to abstract out behavior that is common to multiple\ntest suites without littering all test suites with library calls. This can be\nused for logging, starting, and monitoring external systems, building C files\nneeded by the tests, and so on.\n\nIn brief, CTH allows you to do the following:\n\n- Manipulate the runtime configuration before each suite configuration call.\n- Manipulate the return of all suite configuration calls, and in extension, the\n result of the tests themselves.\n\nThe following sections describe how to use CTHs, when they are run, and how to\nmanipulate the test results in a CTH.\n\n> #### Warning {: .warning }\n>\n> When executing within a CTH, all timetraps are shut off. So if your CTH never\n> returns, the entire test run is stalled.\n\n[](){: #installing }","title":"General - Common Test Hooks","ref":"ct_hooks_chapter.html#general"},{"type":"extras","doc":"A CTH can be installed in multiple ways in your test run. You can do it for all\ntests in a run, for specific test suites, and for specific groups within a test\nsuite. If you want a CTH to be present in all test suites within your test run,\nthere are three ways to accomplish that, as follows:\n\n- Add `-ct_hooks` as an argument to [ct_run](run_test_chapter.md#ct_run). To add\n multiple CTHs using this method, append them to each other using the keyword\n `and`, that is, `ct_run -ct_hooks cth1 [{debug,true}] and cth2 ...`.\n- Add tag `ct_hooks` to your\n [Test Specification](run_test_chapter.md#test_specifications).\n- Add tag `ct_hooks` to your call to `ct:run_test/1`.\n\nCTHs can also be added within a test suite. This is done by returning\n`{ct_hooks,[CTH]}` in the configuration list from\n[suite/0](`c:ct_suite:suite/0`),\n[init_per_suite/1](`c:ct_suite:init_per_suite/1`), or\n[init_per_group/2](`c:ct_suite:init_per_group/2`).\n\nIn this case, `CTH` can either be only the module name of the CTH or a tuple\nwith the module name and the initial arguments, and optionally the hook priority\nof the CTH. For example, one of the following:\n\n- `{ct_hooks,[my_cth_module]}`\n- `{ct_hooks,[{my_cth_module,[{debug,true}]}]}`\n- `{ct_hooks,[{my_cth_module,[{debug,true}],500}]}`\n\nNote that regardless of how you install a CTH, its BEAM file must be available\nin the code path when Common Test runs. `ct_run` accepts the `-pa` command line\noption.","title":"Installing a CTH - Common Test Hooks","ref":"ct_hooks_chapter.html#installing-a-cth"},{"type":"extras","doc":"By default, each installation of a CTH causes a new instance of it to be\nactivated. This can cause problems if you want to override CTHs in test\nspecifications while still having them in the suite information function. The\n[id/1](`c:ct_hooks:id/1`) callback exists to address this problem. By returning\nthe same `id` in both places, `Common Test` knows that this CTH is already\ninstalled and does not try to install it again.\n\n[](){: #cth_execution_order }","title":"Overriding CTHs - Common Test Hooks","ref":"ct_hooks_chapter.html#overriding-cths"},{"type":"extras","doc":"By default, each installed CTH is executed in the order in which they are\ninstalled for init calls, and then reversed for end calls. This order can be\nreferred to as test-centric, as the order is reversed after a testcase is\nexecuted and corresponds to the default value (`test`) of `ct_hooks_order`\noption.\n\nThe installation-based order is not always desired, so `Common Test` allows the\nuser to specify a priority for each hook. The priority can be specified in the\nCTH function [init/2](`c:ct_hooks:init/2`) or when installing the hook. The\npriority specified at installation overrides the priority returned by the CTH.\n\nIn some cases, the reversed order for all end calls is not desired, and instead,\nthe user might prefer the reversed order for post hook calls. Such behavior can\nbe enabled with `ct_hooks_order` option with `config` value. When this option is\nenabled, the execution order is configuration-centric, as the reversed order\nhappens after each configuration function and not in relation to testcase.\n\nNote that the `ct_hooks_order` option is considered as a global framework\nsetting. In case when option is configured multiple times framework with process\nonly the first value.\n\nThe `ct_hooks_order` option can be set as: `ct_run` argument, in test\nspecification or [suite/0](`c:ct_suite:suite/0`) return value.\n\n[](){: #scope }","title":"CTH Execution Order - Common Test Hooks","ref":"ct_hooks_chapter.html#cth-execution-order"},{"type":"extras","doc":"Once the CTH is installed into a certain test run it remains there until its\nscope is expired. The scope of a CTH depends on when it is installed, see the\nfollowing table. Function [init/2](`c:ct_hooks:init/2`) is called at the\nbeginning of the scope and function [terminate/1](`c:ct_hooks:terminate/1`) is\ncalled when the scope ends.\n\n| _CTH installed in_ | _CTH scope begins before_ | _CTH scope ends after_ |\n| ------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |\n| [ct_run](run_test_chapter.md#ct_run) | the first test suite is to be run | the last test suite has been run |\n| [ct:run_test](`ct:run_test/1`) | the first test suite is run | the last test suite has been run |\n| [Test Specification](run_test_chapter.md#test_specifications) | the first test suite is run | the last test suite has been run |\n| [suite/0](`c:ct_suite:suite/0`) | [pre_init_per_suite/3](`c:ct_hooks:pre_init_per_suite/3`) is called | [post_end_per_suite/4](`c:ct_hooks:post_end_per_suite/4`) has been called for that test suite |\n| [init_per_suite/1](`c:ct_suite:init_per_suite/1`) | [post_init_per_suite/4](`c:ct_hooks:post_init_per_suite/4`) is called | [post_end_per_suite/4](`c:ct_hooks:post_end_per_suite/4`) has been called for that test suite |\n| [init_per_group/2](`c:ct_suite:init_per_group/2`) | [post_init_per_group/5](`c:ct_hooks:post_init_per_group/5`) is called | [post_end_per_group/5](`c:ct_hooks:post_end_per_group/5`) has been called for that group |\n\n_Table: Scope of a CTH_","title":"CTH Scope - Common Test Hooks","ref":"ct_hooks_chapter.html#cth-scope"},{"type":"extras","doc":"CTHs are run with the same process scoping as normal test suites, that is, a\ndifferent process executes the `init_per_suite` hooks then the `init_per_group`\nor `per_testcase` hooks. So if you want to spawn a process in the CTH, you\ncannot link with the CTH process, as it exits after the post hook ends. Also, if\nyou for some reason need an ETS table with your CTH, you must spawn a process\nthat handles it.","title":"CTH Processes and Tables - Common Test Hooks","ref":"ct_hooks_chapter.html#cth-processes-and-tables"},{"type":"extras","doc":"Configuration data values in the CTH can be read by calling\n[`ct:get_config/1,2,3`](`ct:get_config/1`) (as explained in section\n[Requiring and Reading Configuration Data](config_file_chapter.md#require_config_data)).\nThe configuration variables in question must, as always, first have been\nrequired by a suite-, group-, or test case information function, or by function\n[`ct:require/1/2`](`ct:require/1`). The latter can also be used in CT hook\nfunctions.\n\nThe CT hook functions can call any logging function in the `ct` interface to\nprint information to the log files, or to add comments in the suite overview\npage.\n\n[](){: #manipulating }","title":"External Configuration Data and Logging - Common Test Hooks","ref":"ct_hooks_chapter.html#external-configuration-data-and-logging"},{"type":"extras","doc":"Through CTHs the results of tests and configuration functions can be\nmanipulated. The main purpose to do this with CTHs is to allow common patterns\nto be abstracted out from test suites and applied to multiple test suites\nwithout duplicating any code. All the callback functions for a CTH follow a\ncommon interface described hereafter.\n\n`Common Test` always calls all available hook functions, even pre- and post\nhooks for configuration functions that are not implemented in the suite. For\nexample, `pre_init_per_suite(x_SUITE, ...)` and\n`post_init_per_suite(x_SUITE, ...)` are called for test suite `x_SUITE`, even if\nit does not export `init_per_suite/1`. With this feature hooks can be used as\nconfiguration fallbacks, and all configuration functions can be replaced with\nhook functions.\n\n[](){: #pre }","title":"Manipulating Tests - Common Test Hooks","ref":"ct_hooks_chapter.html#manipulating-tests"},{"type":"extras","doc":"In a CTH, the behavior can be hooked in before the following functions:\n\n- [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\n- [`init_per_group`](`c:ct_suite:init_per_group/2`)\n- [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`)\n- [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`)\n- [`end_per_group`](`c:ct_suite:end_per_group/2`)\n- [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\n\nThis is done in the CTH functions called `pre_ `. These\nfunctions take the arguments `SuiteName`, `Name` (group or test case name, if\napplicable), `Config`, and `CTHState`. The return value of the CTH function is\nalways a combination of a result for the suite/group/test and an updated\n`CTHState`.\n\nTo let the test suite continue on executing, return the configuration list that\nyou want the test to use as the result.\n\nAll pre hooks, except `pre_end_per_testcase/4`, can skip or fail the test by\nreturning a tuple with `skip` or `fail`, and a reason as the result.\n\n_Example:_\n\n```erlang\npre_init_per_suite(SuiteName, Config, CTHState) ->\n case db:connect() of\n {error,_Reason} ->\n {{fail, \"Could not connect to DB\"}, CTHState};\n {ok, Handle} ->\n {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}\n end.\n```\n\n> #### Note {: .info }\n>\n> If you use multiple CTHs, the first part of the return tuple is used as input\n> for the next CTH. So in the previous example the next CTH can get\n> `{fail,Reason}` as the second parameter. If you have many CTHs interacting, do\n> not let each CTH return `fail` or `skip`. Instead, return that an action is to\n> be taken through the `Config` list and implement a CTH that, at the end, takes\n> the correct action.\n\n[](){: #post }","title":"Pre Hooks - Common Test Hooks","ref":"ct_hooks_chapter.html#pre-hooks"},{"type":"extras","doc":"In a CTH, behavior can be hooked in after the following functions:\n\n- [`init_per_suite`](`c:ct_suite:init_per_suite/1`)\n- [`init_per_group`](`c:ct_suite:init_per_group/2`)\n- [`init_per_testcase`](`c:ct_suite:init_per_testcase/2`)\n- [`end_per_testcase`](`c:ct_suite:end_per_testcase/2`)\n- [`end_per_group`](`c:ct_suite:end_per_group/2`)\n- [`end_per_suite`](`c:ct_suite:end_per_suite/1`)\n\nThis is done in the CTH functions called `post_ `. These\nfunctions take the arguments `SuiteName`, `Name` (group or test case name, if\napplicable), `Config`, `Return`, and `CTHState`. `Config` in this case is the\nsame `Config` as the testcase is called with. `Return` is the value returned by\nthe testcase. If the testcase fails by crashing, `Return` is\n`{'EXIT',{{Error,Reason},Stacktrace}}`.\n\nThe return value of the CTH function is always a combination of a result for the\nsuite/group/test and an updated `CTHState`. If you do not want the callback to\naffect the outcome of the test, return the `Return` data as it is given to the\nCTH. You can also modify the test result. By returning the `Config` list with\nelement `tc_status` removed, you can recover from a test failure. As in all the\npre hooks, it is also possible to fail/skip the test case in the post hook.\n\n_Example:_\n\n```erlang\npost_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->\n case db:check_consistency() of\n true ->\n %% DB is good, pass the test.\n {proplists:delete(tc_status, Config), CTHState};\n false ->\n %% DB is not good, mark as skipped instead of failing\n {{skip, \"DB is inconsistent!\"}, CTHState}\n end;\npost_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->\n %% Do nothing if tc does not crash.\n {Return, CTHState}.\n```\n\n> #### Note {: .info }\n>\n> Do recover from a testcase failure using CTHs only a last resort. If used\n> wrongly, it can be very difficult to determine which tests that pass or fail\n> in a test run.","title":"Post Hooks - Common Test Hooks","ref":"ct_hooks_chapter.html#post-hooks"},{"type":"extras","doc":"After any post hook has been executed for all installed CTHs,\n[on_tc_fail](`c:ct_hooks:on_tc_fail/4`) or\n[on_tc_skip](`c:ct_hooks:on_tc_skip/4`) is called if the testcase failed or was\nskipped, respectively. You cannot affect the outcome of the tests any further at\nthis point.\n\n[](){: #synchronizing }","title":"Skip and Fail Hooks - Common Test Hooks","ref":"ct_hooks_chapter.html#skip-and-fail-hooks"},{"type":"extras","doc":"CTHs can be used to synchronize test runs with external user applications. The\ninit function can, for example, start and/or communicate with an application\nthat has the purpose of preparing the SUT for an upcoming test run, or\ninitialize a database for saving test data to during the test run. The terminate\nfunction can similarly order such an application to reset the SUT after the test\nrun, and/or tell the application to finish active sessions and terminate. Any\nsystem error- or progress reports generated during the init- or termination\nstage are saved in the\n[Pre- and Post Test I/O Log](run_test_chapter.md#pre_post_test_io_log). (This is\nalso true for any printouts made with `ct:log/2` and `ct:pal/2`).\n\nTo ensure that `Common Test` does not start executing tests, or closes its log\nfiles and shuts down, before the external application is ready for it,\n`Common Test` can be synchronized with the application. During startup and\nshutdown, `Common Test` can be suspended, simply by having a CTH evaluate a\n`receive` expression in the init- or terminate function. The macros\n`?CT_HOOK_INIT_PROCESS` (the process executing the hook init function) and\n`?CT_HOOK_TERMINATE_PROCESS` (the process executing the hook terminate function)\neach specifies the name of the correct `Common Test` process to send a message\nto. This is done to return from the `receive`. These macros are defined in\n`ct.hrl`.\n\n[](){: #example }","title":"Synchronizing External User Applications with Common Test - Common Test Hooks","ref":"ct_hooks_chapter.html#synchronizing-external-user-applications-with-common-test"},{"type":"extras","doc":"The following CTH logs information about a test run into a format parseable by\n`file:consult/1` (in Kernel):\n\n```erlang\n%%% Common Test Example Common Test Hook module.\n%%%\n%%% To use this hook, on the command line:\n%%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth\n%%%\n%%% Note `-pa .`: the hook beam file must be in the code path when installing.\n-module(example_cth).\n\n%% Mandatory Callbacks\n-export([init/2]).\n\n%% Optional Callbacks\n-export([id/1]).\n\n-export([pre_init_per_suite/3]).\n-export([post_end_per_suite/4]).\n\n-export([pre_init_per_testcase/4]).\n-export([post_end_per_testcase/5]).\n\n-export([on_tc_skip/4]).\n\n-export([terminate/1]).\n\n%% This hook state is threaded through all the callbacks.\n-record(state, {filename, total, suite_total, ts, tcs, data, skipped}).\n%% This example hook prints its results to a file, see terminate/1.\n-record(test_run, {total, skipped, suites}).\n\n%% Return a unique id for this CTH.\n%% Using the filename means the hook can be used with different\n%% log files to separate timing data within the same test run.\n%% See Installing a CTH for more information.\nid(Opts) ->\n %% the path is relative to the test run directory\n proplists:get_value(filename, Opts, \"example_cth.log\").\n\n%% Always called before any other callback function. Use this to initiate\n%% any common state.\ninit(Id, _Opts) ->\n {ok, #state{filename = Id, total = 0, data = []}}.\n\n%% Called before init_per_suite is called.\npre_init_per_suite(_Suite,Config,State) ->\n {Config, State#state{suite_total = 0, tcs = []}}.\n\n%% Called after end_per_suite.\npost_end_per_suite(Suite,_Config,Return,State) ->\n Data = {suites, Suite, State#state.suite_total,\n lists:reverse(State#state.tcs)},\n {Return, State#state{data = [Data | State#state.data],\n total = State#state.total + State#state.suite_total}}.\n\n%% Called before each init_per_testcase.\npre_init_per_testcase(_Suite,_TC,Config,State) ->\n Now = erlang:monotonic_time(microsecond),\n {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}.\n\n%% Called after each end_per_testcase.\npost_end_per_testcase(Suite,TC,_Config,Return,State) ->\n Now = erlang:monotonic_time(microsecond),\n TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts},\n {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}.\n\n%% Called when a test case is skipped by either user action\n%% or due to an init function failing.\non_tc_skip(_Suite, _TC, _Reason, State) ->\n State#state{skipped = State#state.skipped + 1}.\n\n%% Called when the scope of the CTH is done.\nterminate(State) ->\n %% use append to avoid data loss if the path is reused\n {ok, File} = file:open(State#state.filename, [write, append]),\n io:format(File, \"~p.~n\", [results(State)]),\n file:close(File),\n ok.\n\nresults(State) ->\n #state{skipped = Skipped, data = Data, total = Total} = State,\n #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.\n```\n\n[](){: #builtin_cths }","title":"Example CTH - Common Test Hooks","ref":"ct_hooks_chapter.html#example-cth"},{"type":"extras","doc":"`Common Test` is delivered with some general-purpose CTHs that can be enabled by\nthe user to provide generic testing functionality. Some of these CTHs are\nenabled by default when `common_test` is started to run. They can be disabled by\nsetting `enable_builtin_hooks` to `false` on the command line or in the test\nspecification. The following two CTHs are delivered with `Common Test`:\n\n- **`cth_log_redirect`** - Built-in\n\n Captures all log events that would normally be printed by the default logger\n handler, and prints them to the current test case log. If an event cannot be\n associated with a test case, it is printed in the `Common Test` framework log.\n This happens for test cases running in parallel and events occurring\n in-between test cases.\n\n The log events are handled using a [Logger](`m:logger`) handler called\n cth_log_redirect. The formatting and level is copied from the current\n `default` handler when the cth is started. If you want to use another level\n either change the `default` handler level before starting common_test, or use\n the `logger:set_handler_config/3` API.\n\n This hook supports the following options:\n\n - **`{mode, add}`** - Add `cth_log_redirect` to the default logging handler:\n Logs will be emitted to both standard output via the default handler, and\n into the Common Test HTML logs. This is the default behaviour.\n\n - **`{mode, replace}`** - Replace the `default` logging handler with\n `cth_log_redirect` instead of logging to both the default handler and this\n handler. This effectively silences any logger output which would normally be\n printed to standard output during test runs. To enable this mode, you can\n pass the following options to `ct_run`:\n\n `-enable_builtin_hooks false -ct_hooks cth_log_redirect [{mode,replace}]`\n\n- **`cth_surefire`** - Not built-in\n\n Captures all test results and outputs them as surefire XML into a file. The\n created file is by default called `junit_report.xml`. The file name can be\n changed by setting option `path` for this hook, for example:\n\n `-ct_hooks cth_surefire [{path,\"/tmp/report.xml\"}]`\n\n If option `url_base` is set, an extra attribute named `url` is added to each\n `testsuite` and `testcase` XML element. The value is constructed from\n `url_base` and a relative path to the test suite or test case log,\n respectively, for example:\n\n `-ct_hooks cth_surefire [{url_base, \"http://myserver.com/\"}]`\n\n gives an URL attribute value similar to\n\n `\"http://myserver.com/ct_run.ct@myhost.2012-12-12_11.19.39/ x86_64-unknown-linux-gnu.my_test.logs/run.2012-12-12_11.19.39/suite.log.html\"`\n\n Surefire XML can, for example, be used by Jenkins to display test results.","title":"Built-In CTHs - Common Test Hooks","ref":"ct_hooks_chapter.html#built-in-cths"},{"type":"extras","doc":"\n# Some Thoughts about Testing","title":"Some Thoughts about Testing","ref":"why_test_chapter.html"},{"type":"extras","doc":"It is not possible to prove that a program is correct by testing. On the\ncontrary, it has been formally proven that it is impossible to prove programs in\ngeneral by testing. Theoretical program proofs or plain examination of code can\nbe viable options for those wishing to certify that a program is correct. The\ntest server, as it is based on testing, cannot be used for certification. Its\nintended use is instead to (cost effectively) _find bugs_. A successful test\nsuite is one that reveals a bug. If a test suite results in OK, then we know\nvery little that we did not know before.","title":"Goals - Some Thoughts about Testing","ref":"why_test_chapter.html#goals"},{"type":"extras","doc":"There are many kinds of test suites. Some concentrate on calling every function\nor command (in the documented way) in a certain interface. Some others do the\nsame, but use all kinds of illegal parameters, and verify that the server stays\nalive and rejects the requests with reasonable error codes. Some test suites\nsimulate an application (typically consisting of a few modules of an\napplication), some try to do tricky requests in general, and some test suites\neven test internal functions with help of special Load Modules on target.\n\nAnother interesting category of test suites is the one checking that fixed bugs\ndo not reoccur. When a bugfix is introduced, a test case that checks for that\nspecific bug is written and submitted to the affected test suites.\n\nAim for finding bugs. Write whatever test that has the highest probability of\nfinding a bug, now or in the future. Concentrate more on the critical parts.\nBugs in critical subsystems are much more expensive than others.\n\nAim for functionality testing rather than implementation details. Implementation\ndetails change quite often, and the test suites are to be long lived.\nImplementation details often differ on different platforms and versions. If\nimplementation details must be tested, try to factor them out into separate test\ncases. These test cases can later be rewritten or skipped.\n\nAlso, aim for testing everything once, no less, no more. It is not effective\nhaving every test case fail only because one function in the interface changed.","title":"What to Test - Some Thoughts about Testing","ref":"why_test_chapter.html#what-to-test"},{"type":"extras","doc":"\n# Common Test's Property Testing Support: ct_property_test","title":"Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html"},{"type":"extras","doc":"The _Common Test Property Testing Support (ct_property_test)_ is an aid to run\nproperty based testing tools in Common Test test suites.\n\nBasic knowledge of property based testing is assumed in the following. It is\nalso assumed that at least one of the following property based testing tools is\ninstalled and available in the library path:\n\n- [QuickCheck](http://www.quviq.com),\n- [PropEr](https://proper-testing.github.io) or\n- [Triq](https://github.com/krestenkrab/triq)\n\n[](){: #supported }","title":"General - Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html#general"},{"type":"extras","doc":"The [ct_property_test](`m:ct_property_test#`) module does the following:\n\n- Compiles the files with property tests in the subdirectory `property_test`\n- Tests properties in those files using the first found Property Testing Tool.\n- Saves the results - that is the printouts - in the usual Common Test Log","title":"What Is Supported? - Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html#what-is-supported"},{"type":"extras","doc":"Assume that we want to test the lists:sort/1 function.\n\nWe need a property to test the function. In normal way, we create\n`property_test/ct_prop.erl` module in the `test` directory in our application:\n\n```erlang\n-module(ct_prop).\n-export([prop_sort/0]).\n\n%%% This will include the .hrl file for the installed testing tool:\n-include_lib(\"common_test/include/ct_property_test.hrl\").\n\n%%% The property we want to check:\n%%% For all possibly unsorted lists,\n%%% the result of lists:sort/1 is sorted.\nprop_sort() ->\n ?FORALL(UnSorted, list(),\n is_sorted(lists:sort(UnSorted))\n ).\n\n%%% Function to check that a list is sorted:\nis_sorted([]) ->\n true;\nis_sorted([_]) ->\n true;\nis_sorted([H1,H2|SortedTail]) when H1 = \n is_sorted([H2|SortedTail]);\nis_sorted(_) ->\n false.\n```\n\nWe also need a CommonTest test suite:\n\n```erlang\n-module(ct_property_test_SUITE).\n-compile(export_all). % Only in tests!\n\n-include_lib(\"common_test/include/ct.hrl\").\n\nall() -> [prop_sort\n ].\n\n%%% First prepare Config and compile the property tests for the found tool:\ninit_per_suite(Config) ->\n ct_property_test:init_per_suite(Config).\n\nend_per_suite(Config) ->\n Config.\n\n%%%================================================================\n%%% Test suites\n%%%\nprop_sort(Config) ->\n ct_property_test:quickcheck(\n ct_prop:prop_sort(),\n Config\n ).\n```\n\nWe run it as usual, for example with ct_run in the OS shell:\n\n```text\n..../test$ ct_run -suite ct_property_test_SUITE\n.....\nCommon Test: Running make in test directories...\n\nTEST INFO: 1 test(s), 1 case(s) in 1 suite(s)\n\nTesting lib.common_test.ct_property_test_SUITE: Starting test, 1 test cases\n\n----------------------------------------------------\n2019-12-18 10:44:46.293\nFound property tester proper\nat \"/home/X/lib/proper/ebin/proper.beam\"\n\n\n----------------------------------------------------\n2019-12-18 10:44:46.294\nCompiling in \"/home/..../test/property_test\"\n Deleted: [\"ct_prop.beam\"]\n ErlFiles: [\"ct_prop.erl\"]\n MacroDefs: [{d,'PROPER'}]\n\nTesting lib.common_test.ct_property_test_SUITE: TEST COMPLETE, 1 ok, 0 failed of 1 test cases\n\n....\n```\n\n[](){: #stateful1 }","title":"Introductory Example - Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html#introductory-example"},{"type":"extras","doc":"Assume a test that generates some parallel stateful commands, and runs 300\ntests:\n\n```erlang\nprop_parallel(Config) ->\n numtests(300,\n ?FORALL(Cmds, parallel_commands(?MODULE),\n begin\n RunResult = run_parallel_commands(?MODULE, Cmds),\n ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)\n end)).\n```\n\nThe `ct_property_test:present_result/4` is a help function for printing some\nstatistics in the CommonTest log file.\n\nOur example test could for example be a simple test of an ftp server, where we\nperform get, put and delete requests, some of them in parallel. Per default, the\nresult has three sections:\n\n```text\n*** User 2019-12-11 13:28:17.504 ***\n\nDistribution sequential/parallel\n\n 57.7% sequential\n 28.0% parallel_2\n 14.3% parallel_1\n\n\n\n*** User 2019-12-11 13:28:17.505 ***\n\nFunction calls\n\n 44.4% get\n 39.3% put\n 16.3% delete\n\n\n\n*** User 2019-12-11 13:28:17.505 ***\n\nLength of command sequences\n\nRange : Number in range\n-------:----------------\n 0 - 4: 8 2.7% <-- min=3\n 5 - 9: 44 14.7%\n10 - 14: 74 24.7%\n15 - 19: 60 20.0% <-- mean=18.7 <-- median=16.0\n20 - 24: 38 12.7%\n25 - 29: 26 8.7%\n30 - 34: 19 6.3%\n35 - 39: 19 6.3%\n40 - 44: 8 2.7%\n45 - 49: 4 1.3% <-- max=47\n ------\n 300\n```\n\nThe first part - _Distribution sequential/parallel_ \\- shows the distribution in\nthe sequential and parallel part of the result of parallel_commands/1. See any\nproperty testing tool for an explanation of this function. The table shows that\nof all commands (get and put in our case), 57.7% are executed in the sequential\npart prior to the parallel part, 28.0% are executed in the first parallel list\nand the rest in the second parallel list.\n\nThe second part - _Function calls_ \\- shows the distribution of the three calls\nin the generated command lists. We see that all of the three calls are executed.\nIf it was so that we thought that we also generated a fourth call, a table like\nthis shows that we failed with that.\n\nThe third and final part - _Length of command sequences_ \\- show statistics of\nthe generated command sequences. We see that the shortest list has three\nelementes while the longest has 47 elements. The mean and median values are also\nshown. Further we could for example see that only 2.7% of the lists (that is\neight lists) only has three or four elements.","title":"A stateful testing example - Common Test's Property Testing Support: ct_property_test","ref":"ct_property_test_chapter.html#a-stateful-testing-example"},{"type":"extras","doc":"\n# ct_run\n\nProgram used for starting Common Test from the OS command line.","title":"ct_run","ref":"ct_run_cmd.html"},{"type":"extras","doc":"The `ct_run` program is automatically installed with Erlang/OTP and the\n`Common Test` application (for more information, see section\n[Installation](install_chapter.md) in the User's Guide). The program accepts\ndifferent start flags. Some flags trigger `ct_run` to start `Common Test` and\npass on data to it. Some flags start an Erlang node prepared for running\n`Common Test` in a particular mode.\n\nThe interface function `ct:run_test/1`, corresponding to the `ct_run` program,\nis used for starting `Common Test` from the Erlang shell (or an Erlang program).\nFor details, see the `m:ct` manual page.\n\n`ct_run` also accepts Erlang emulator flags. These are used when `ct_run` calls\n`erl` to start the Erlang node (this makes it possible to add directories to the\ncode server path, change the cookie on the node, start more applications, and so\non).\n\nWith the optional flag `-erl_args`, options on the `ct_run` command line can be\ndivided into two groups:\n\n- One group that `Common Test` is to process (those preceding `-erl_args`).\n- One group that `Common Test` is to ignore and pass on directly to the emulator\n (those following `-erl_args`).\n\nOptions preceding `-erl_args` that `Common Test` does not recognize are also\npassed on to the emulator untouched. By `-erl_args` the user can specify flags\nwith the same name, but with different destinations, on the `ct_run` command\nline.\n\nIf flags `-pa` or `-pz` are specified in the `Common Test` group of options\n(preceding `-erl_args`), relative directories are converted to absolute and\nreinserted into the code path by `Common Test`. This is to avoid problems\nloading user modules when `Common Test` changes working directory during test\nruns. However, `Common Test` ignores flags `-pa` and `-pz` following `-erl_args`\non the command line. These directories are added to the code path normally (that\nis, on specified form).\n\nExit status is set before the program ends. Value `0` indicates a successful\ntest result, `1` indicates one or more failed or auto-skipped test cases, and\n`2` indicates test execution failure.\n\nIf `ct_run` is called with option `-help`, it prints all valid start flags to\n`stdout`.\n\n[](){: #ct_run }","title":"Description - ct_run","ref":"ct_run_cmd.html#description"},{"type":"extras","doc":"```text\n ct_run -dir TestDir1 TestDir2 .. TestDirN |\n [-dir TestDir] -suite Suite1 Suite2 .. SuiteN\n [-group Groups1 Groups2 .. GroupsN] [-case Case1 Case2 .. CaseN]\n [-step [config | keep_inactive]]\n [-config ConfigFile1 ConfigFile2 .. ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n [-label Label]\n [-logdir LogDir]\n [-logopts LogOpts]\n [-verbosity GenVLevel | [Category1 VLevel1 and\n Category2 VLevel2 and .. CategoryN VLevelN]]\n [-silent_connections [ConnType1 ConnType2 .. ConnTypeN]]\n [-stylesheet CSSFile]\n [-cover CoverCfgFile]\n [-cover_stop Bool]\n [-event_handler EvHandler1 EvHandler2 .. EvHandlerN] |\n [-event_handler_init EvHandler1 InitArg1 and\n EvHandler2 InitArg2 and .. EvHandlerN InitArgN]\n [-include InclDir1 InclDir2 .. InclDirN]\n [-no_auto_compile]\n [-abort_if_missing_suites]\n [-multiply_timetraps Multiplier]\n [-scale_timetraps]\n [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]\n [-repeat N] |\n [-duration HHMMSS [-force_stop [skip_rest]]] |\n [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]\n [-basic_html]\n [-no_esc_chars]\n [-keep_logs all | NLogs]\n [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and ..\n CTHModuleN CTHOptsN]\n [-ct_hooks_order test | config]\n [-exit_status ignore_config]\n [-help]\n```","title":"Run Tests from Command Line - ct_run","ref":"ct_run_cmd.html#run-tests-from-command-line"},{"type":"extras","doc":"```text\n ct_run -spec TestSpec1 TestSpec2 .. TestSpecN\n [-join_specs]\n [-config ConfigFile1 ConfigFile2 .. ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. and CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n [-label Label]\n [-logdir LogDir]\n [-logopts LogOpts]\n [-verbosity GenVLevel | [Category1 VLevel1 and\n Category2 VLevel2 and .. CategoryN VLevelN]]\n [-allow_user_terms]\n [-silent_connections [ConnType1 ConnType2 .. ConnTypeN]]\n [-stylesheet CSSFile]\n [-cover CoverCfgFile]\n [-cover_stop Bool]\n [-event_handler EvHandler1 EvHandler2 .. EvHandlerN] |\n [-event_handler_init EvHandler1 InitArg1 and\n EvHandler2 InitArg2 and .. EvHandlerN InitArgN]\n [-include InclDir1 InclDir2 .. InclDirN]\n [-no_auto_compile]\n [-abort_if_missing_suites]\n [-multiply_timetraps Multiplier]\n [-scale_timetraps]\n [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]\n [-repeat N] |\n [-duration HHMMSS [-force_stop [skip_rest]]] |\n [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]\n [-basic_html]\n [-no_esc_chars]\n [-keep_logs all | NLogs]\n [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and ..\n CTHModuleN CTHOptsN]\n [-ct_hooks_order test | config]\n [-exit_status ignore_config]\n```","title":"Run Tests using Test Specification - ct_run","ref":"ct_run_cmd.html#run-tests-using-test-specification"},{"type":"extras","doc":"```text\n ct_run -refresh_logs [-logdir LogDir] [-basic_html]\n [-keep_logs all | NLogs]\n```","title":"Refresh HTML Index Files - ct_run","ref":"ct_run_cmd.html#refresh-html-index-files"},{"type":"extras","doc":"```erlang\n ct_run -shell\n [-config ConfigFile1 ConfigFile2 ... ConfigFileN]\n [-userconfig CallbackModule1 ConfigString1 and CallbackModule2\n ConfigString2 and .. and CallbackModuleN ConfigStringN]\n [-decrypt_key Key] | [-decrypt_file KeyFile]\n```","title":"Run Common Test in Interactive Mode - ct_run","ref":"ct_run_cmd.html#run-common-test-in-interactive-mode"},{"type":"extras","doc":"```text\n ct_run -ctmaster\n```","title":"Start a Common Test Master Node - ct_run","ref":"ct_run_cmd.html#start-a-common-test-master-node"},{"type":"extras","doc":"For information about the start flags, see section\n[Running Tests and Analyzing Results](run_test_chapter.md) in the User's Guide.","title":"See Also - ct_run","ref":"ct_run_cmd.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/common_test-1.27/doc/html/event_handler_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/event_handler_chapter.html index 43793ff64dd33..0c55e1c340807 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/event_handler_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/event_handler_chapter.html @@ -168,12 +168,12 @@

    ct_run -event_handler_init instead of -event_handler.

    Note

    All event handler modules must have gen_event behavior. These modules must be precompiled and their locations must be added explicitly to the Erlang code server search path (as in the previous example).

    An event_handler tuple in argument Opts has the following definition (see -ct:run_test/1):

    {event_handler,EventHandlers}
    +ct:run_test/1):

    {event_handler,EventHandlers}
     
    -EventHandlers = EH | [EH]
    -EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
    -InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are -installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. +EventHandlers = EH | [EH] +EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs} +InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are +installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    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 using one of the following test specification terms:

    • {event_handler, EventHandlers}
    • {event_handler, EventHandlers, InitArgs}
    • {event_handler, NodeRefs, EventHandlers}
    • {event_handler, NodeRefs, EventHandlers, InitArgs}

    EventHandlers is a list of module names. Before a test session starts, the diff --git a/prs/8803/lib/common_test-1.27/doc/html/example_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/example_chapter.html index 33b57f7a2fd37..9ba9b94518921 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/example_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/example_chapter.html @@ -131,19 +131,19 @@

    Test Suite Example

    -

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
     %% Test server callbacks
    --export([suite/0, all/0,
    +-export([suite/0, all/0,
              init_per_suite/1, end_per_suite/1,
    -         init_per_testcase/2, end_per_testcase/2]).
    +         init_per_testcase/2, end_per_testcase/2]).
     
     %% Test cases
    --export([string/1, integer/1]).
    +-export([string/1, integer/1]).
     
    --define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
    +-define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
     
     %%--------------------------------------------------------------------
     %% COMMON TEST CALLBACK FUNCTIONS
    @@ -158,8 +158,8 @@ 

    %% Description: Returns list of tuples to set default properties %% for the suite. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,1}}]. +suite() -> + [{timetrap,{minutes,1}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> Config1 @@ -169,10 +169,10 @@

    %% %% 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]. +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) -> term() @@ -182,9 +182,9 @@

    %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(Config) -> - Ref = proplists:get_value(con_ref, Config), - db:disconnect(Ref), +end_per_suite(Config) -> + Ref = proplists:get_value(con_ref, Config), + db:disconnect(Ref), ok. %%-------------------------------------------------------------------- @@ -197,10 +197,10 @@

    %% %% Description: Initialization before each test case. %%-------------------------------------------------------------------- -init_per_testcase(Case, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(table_name, Config), - ok = db:create_table(Ref, TableName, table_type(Case)), +init_per_testcase(Case, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(table_name, Config), + ok = db:create_table(Ref, TableName, table_type(Case)), Config. %%-------------------------------------------------------------------- @@ -213,10 +213,10 @@

    %% %% Description: Cleanup after each test case. %%-------------------------------------------------------------------- -end_per_testcase(_Case, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(table_name, Config), - ok = db:delete_table(Ref, TableName), +end_per_testcase(_Case, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(table_name, Config), + ok = db:delete_table(Ref, TableName), ok. %%-------------------------------------------------------------------- @@ -231,28 +231,28 @@

    %% Description: Returns the list of groups and test cases that %% are to be executed. %%-------------------------------------------------------------------- -all() -> - [string, integer]. +all() -> + [string, integer]. %%-------------------------------------------------------------------- %% TEST CASES %%-------------------------------------------------------------------- -string(Config) -> - insert_and_lookup(dummy_key, "Dummy string", Config). +string(Config) -> + insert_and_lookup(dummy_key, "Dummy string", Config). -integer(Config) -> - insert_and_lookup(dummy_key, 42, Config). +integer(Config) -> + insert_and_lookup(dummy_key, 42, Config). -insert_and_lookup(Key, Value, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(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), +insert_and_lookup(Key, Value, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(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.

    @@ -270,12 +270,12 @@

    %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). %% Note: This directive should only be used in test suites. --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% COMMON TEST CALLBACK FUNCTIONS @@ -293,8 +293,8 @@

    %% Note: The suite/0 function is only meant to be used to return %% default data values, not perform any other operations. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,10}}]. +suite() -> + [{timetrap,{minutes,10}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -310,7 +310,7 @@

    %% 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) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- @@ -321,7 +321,7 @@

    %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -337,7 +337,7 @@

    %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -351,7 +351,7 @@

    %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. %%-------------------------------------------------------------------- @@ -370,7 +370,7 @@

    %% 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) -> +init_per_testcase(_TestCase, Config) -> Config. %%-------------------------------------------------------------------- @@ -386,7 +386,7 @@

    %% %% Description: Cleanup after each test case. %%-------------------------------------------------------------------- -end_per_testcase(_TestCase, _Config) -> +end_per_testcase(_TestCase, _Config) -> ok. %%-------------------------------------------------------------------- @@ -410,8 +410,8 @@

    %% %% Description: Returns a list of test case group definitions. %%-------------------------------------------------------------------- -groups() -> - []. +groups() -> + []. %%-------------------------------------------------------------------- %% Function: all() -> GroupsAndTestCases | {skip,Reason} @@ -427,8 +427,8 @@

    %% Description: Returns the list of groups and test cases that %% are to be executed. %%-------------------------------------------------------------------- -all() -> - [my_test_case]. +all() -> + [my_test_case]. %%-------------------------------------------------------------------- @@ -447,8 +447,8 @@

    %% Note: This function is only meant to be used to return a list of %% values, not perform any other operations. %%-------------------------------------------------------------------- -my_test_case() -> - []. +my_test_case() -> + []. %%-------------------------------------------------------------------- %% Function: TestCase(Config0) -> @@ -466,7 +466,7 @@

    %% the all/0 list or in a test case group for the test case %% to be executed). %%-------------------------------------------------------------------- -my_test_case(_Config) -> +my_test_case(_Config) -> ok.

    Small Common Test Suite

    %%%-------------------------------------------------------------------
     %%% File    : example_SUITE.erl
     %%% Author  :
    @@ -474,18 +474,18 @@ 

    %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% Function: suite() -> Info %% Info = [tuple()] %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{seconds,30}}]. +suite() -> + [{timetrap,{seconds,30}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -493,14 +493,14 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_suite(Config) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- %% Function: end_per_suite(Config0) -> term() | {save_config,Config1} %% Config0 = Config1 = [tuple()] %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -510,7 +510,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -519,7 +519,7 @@

    %% GroupName = atom() %% Config0 = Config1 = [tuple()] %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. %%-------------------------------------------------------------------- @@ -529,7 +529,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_testcase(_TestCase, Config) -> +init_per_testcase(_TestCase, Config) -> Config. %%-------------------------------------------------------------------- @@ -539,7 +539,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -end_per_testcase(_TestCase, _Config) -> +end_per_testcase(_TestCase, _Config) -> ok. %%-------------------------------------------------------------------- @@ -554,8 +554,8 @@

    %% repeat_until_any_ok | repeat_until_any_fail %% N = integer() | forever %%-------------------------------------------------------------------- -groups() -> - []. +groups() -> + []. %%-------------------------------------------------------------------- %% Function: all() -> GroupsAndTestCases | {skip,Reason} @@ -564,15 +564,15 @@

    %% TestCase = atom() %% Reason = term() %%-------------------------------------------------------------------- -all() -> - [my_test_case]. +all() -> + [my_test_case]. %%-------------------------------------------------------------------- %% Function: TestCase() -> Info %% Info = [tuple()] %%-------------------------------------------------------------------- -my_test_case() -> - []. +my_test_case() -> + []. %%-------------------------------------------------------------------- %% Function: TestCase(Config0) -> @@ -582,7 +582,7 @@

    %% Reason = term() %% Comment = term() %%-------------------------------------------------------------------- -my_test_case(_Config) -> +my_test_case(_Config) -> ok.

    diff --git a/prs/8803/lib/common_test-1.27/doc/html/getting_started_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/getting_started_chapter.html index d159fca0e91ee..32b2cd95f2307 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/getting_started_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/getting_started_chapter.html @@ -169,14 +169,14 @@

    the test suite module implements callback functions (mandatory or optional) for various purposes, for example:

    • Init/end configuration function for the test suite
    • Init/end configuration function for a test case
    • Init/end configuration function for a test case group
    • Test cases

    The configuration functions are optional. The following example is a test suite without configuration functions, including one simple test case, to check that -module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    --compile(export_all).
    +module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    +-compile(export_all).
     
    -all() ->
    -    [mod_exists].
    +all() ->
    +    [mod_exists].
     
    -mod_exists(_) ->
    -    {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    @@ -189,33 +189,33 @@

    through configuration functions on "lower level"). The data flow looks as follows:

    Configuration Data Flow in a Suite

    The following example shows a test suite that uses configuration functions to open and close a log file for the test cases (an operation that is unnecessary -and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    --export([all/0, init_per_suite/1, end_per_suite/1]).
    --export([check_restart_result/1, check_no_errors/1]).
    +and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    +-export([all/0, init_per_suite/1, end_per_suite/1]).
    +-export([check_restart_result/1, check_no_errors/1]).
     
    --define(value(Key,Config), proplists:get_value(Key,Config)).
    +-define(value(Key,Config), proplists:get_value(Key,Config)).
     
    -all() -> [check_restart_result, check_no_errors].
    +all() -> [check_restart_result, check_no_errors].
     
    -init_per_suite(InitConfigData) ->
    -    [{logref,open_log()} | InitConfigData].
    +init_per_suite(InitConfigData) ->
    +    [{logref,open_log()} | InitConfigData].
     
    -end_per_suite(ConfigData) ->
    -    close_log(?value(logref, ConfigData)).
    +end_per_suite(ConfigData) ->
    +    close_log(?value(logref, ConfigData)).
     
    -check_restart_result(ConfigData) ->
    -    TestData = read_log(restart, ?value(logref, ConfigData)),
    -    {match,_Line} = search_for("restart successful", TestData).
    +check_restart_result(ConfigData) ->
    +    TestData = read_log(restart, ?value(logref, ConfigData)),
    +    {match,_Line} = search_for("restart successful", TestData).
     
    -check_no_errors(ConfigData) ->
    -    TestData = read_log(all, ?value(logref, ConfigData)),
    -    case search_for("error", TestData) of
    -        {match,Line} -> ct:fail({error_found_in_log,Line});
    +check_no_errors(ConfigData) ->
    +    TestData = read_log(all, ?value(logref, ConfigData)),
    +    case search_for("error", TestData) of
    +        {match,Line} -> ct:fail({error_found_in_log,Line});
             nomatch -> ok
         end.

    The test cases verify, by parsing a log file, that our SUT has performed a successful restart and that no unexpected errors are printed.

    To execute the test cases in the recent test suite, type the following on the UNIX/Linux command line (assuming that the suite module is in the current -working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored +working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored in unique log directories on a different level). The following illustration shows the log file structure:

    HTML Log File Structure

    diff --git a/prs/8803/lib/common_test-1.27/doc/html/run_test_chapter.html b/prs/8803/lib/common_test-1.27/doc/html/run_test_chapter.html index c63d8a3dbdab9..68db6e8ef0729 100644 --- a/prs/8803/lib/common_test-1.27/doc/html/run_test_chapter.html +++ b/prs/8803/lib/common_test-1.27/doc/html/run_test_chapter.html @@ -279,7 +279,7 @@

    With the ct_run flag, or ct:run_test/1 option group, one or more test case groups can be specified, optionally in combination with specific test cases. The -syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or +syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or more group paths. At startup, Common Test searches for matching groups in the group definitions tree (that is, the list returned from Suite:groups/0; for details, see section Test Case Groups.

    Given a group name, say g, Common Test searches for all paths leading to @@ -311,30 +311,30 @@

    paths if an incomplete group path is specified.

    Note

    Group names and group paths can be combined with parameter group_names_or_paths. Each element is treated as an individual specification in combination with parameter cases. The following examples illustrates -this.

    Examples:

    -module(x_SUITE).
    +this.

    Examples:

    -module(x_SUITE).
     ...
     %% The group definitions:
    -groups() ->
    -  [{top1,[],[tc11,tc12,
    -             {sub11,[],[tc12,tc13]},
    -             {sub12,[],[tc14,tc15,
    -       		 {sub121,[],[tc12,tc16]}]}]},
    -
    -   {top2,[],[{group,sub21},{group,sub22}]},
    -   {sub21,[],[tc21,{group,sub2X2}]},
    -   {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},
    -   {sub221,[],[tc21,tc23]},
    -   {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under -top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under -top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that -this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same +groups() -> + [{top1,[],[tc11,tc12, + {sub11,[],[tc12,tc13]}, + {sub12,[],[tc14,tc15, + {sub121,[],[tc12,tc16]}]}]}, + + {top2,[],[{group,sub21},{group,sub22}]}, + {sub21,[],[tc21,{group,sub2X2}]}, + {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]}, + {sub221,[],[tc21,tc23]}, + {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under +top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under +top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that +this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same result in this example.

    The following executes two tests, one including all cases and subgroups under -sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for +sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for the path from top2 to sub2X2 through sub21, and one from top2 to -sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path +sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path top2 -> sub21 -> sub2X2, only one test is executed. The second possible path, -from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order -compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is +from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order +compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is executed without a group specification, that is, simply by (using the command line):

    $ ct_run -suite "my_SUITE" -case my_tc

    or (using the Erlang shell):

    1> ct:run_test([{suite,"my_SUITE"}, {testcase,my_tc}]).

    then Common Test ignores the group definition and executes the test case in the scope of the test suite only (no group configuration functions are called).

    The group specification feature, as presented in this section, can also be used @@ -362,12 +362,12 @@

    configuration data with ct:require/1,2. This is equivalent to a require statement in the Test Suite Information Function or in the -Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
    +Test Case Information Function.

    Example:

    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, are in the +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, are in the interactive mode written to a log named ctlog.html in directory ct_run.<timestamp>. A link to this file is available in the file named last_interactive.html in the directory from which you execute ct_run. @@ -454,8 +454,8 @@

    included specification can either be joined with the source specification or used to produce a separate test run (as with start flag/option join_specs above).

    Example:

    %% In specification file "a.spec"
    -{specs, join, ["b.spec", "c.spec"]}.
    -{specs, separate, ["d.spec", "e.spec"]}.
    +{specs, join, ["b.spec", "c.spec"]}.
    +{specs, separate, ["d.spec", "e.spec"]}.
     %% Config and test terms follow
     ...

    In this example, the test terms defined in files "b.spec" and "c.spec" are joined with the terms in source specification "a.spec" (if any). The inclusion @@ -517,154 +517,154 @@

    available start flags (as most flags have a corresponding configuration term)
  • Logging (for terms verbosity, stylesheet, basic_html and esc_chars)
  • External Configuration Data (for terms config and userconfig)
  • Event Handling (for the -event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
    +event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
     
    -{define, Constant, Value}.
    +{define, Constant, Value}.
     
    -{specs, InclSpecsOption, TestSpecs}.
    +{specs, InclSpecsOption, TestSpecs}.
     
    -{node, NodeAlias, Node}.
    +{node, NodeAlias, Node}.
     
    -{init, InitOptions}.
    -{init, [NodeAlias], InitOptions}.
    +{init, InitOptions}.
    +{init, [NodeAlias], InitOptions}.
     
    -{label, Label}.
    -{label, NodeRefs, Label}.
    +{label, Label}.
    +{label, NodeRefs, Label}.
     
    -{verbosity, VerbosityLevels}.
    -{verbosity, NodeRefs, VerbosityLevels}.
    +{verbosity, VerbosityLevels}.
    +{verbosity, NodeRefs, VerbosityLevels}.
     
    -{stylesheet, CSSFile}.
    -{stylesheet, NodeRefs, CSSFile}.
    +{stylesheet, CSSFile}.
    +{stylesheet, NodeRefs, CSSFile}.
     
    -{silent_connections, ConnTypes}.
    -{silent_connections, NodeRefs, ConnTypes}.
    +{silent_connections, ConnTypes}.
    +{silent_connections, NodeRefs, ConnTypes}.
     
    -{multiply_timetraps, N}.
    -{multiply_timetraps, NodeRefs, N}.
    +{multiply_timetraps, N}.
    +{multiply_timetraps, NodeRefs, N}.
     
    -{scale_timetraps, Bool}.
    -{scale_timetraps, NodeRefs, Bool}.
    +{scale_timetraps, Bool}.
    +{scale_timetraps, NodeRefs, Bool}.
     
    -{cover, CoverSpecFile}.
    -{cover, NodeRefs, CoverSpecFile}.
    +{cover, CoverSpecFile}.
    +{cover, NodeRefs, CoverSpecFile}.
     
    -{cover_stop, Bool}.
    -{cover_stop, NodeRefs, Bool}.
    +{cover_stop, Bool}.
    +{cover_stop, NodeRefs, Bool}.
     
    -{include, IncludeDirs}.
    -{include, NodeRefs, IncludeDirs}.
    +{include, IncludeDirs}.
    +{include, NodeRefs, IncludeDirs}.
     
    -{auto_compile, Bool},
    -{auto_compile, NodeRefs, Bool},
    +{auto_compile, Bool},
    +{auto_compile, NodeRefs, Bool},
     
    -{abort_if_missing_suites, Bool},
    -{abort_if_missing_suites, NodeRefs, Bool},
    +{abort_if_missing_suites, Bool},
    +{abort_if_missing_suites, NodeRefs, Bool},
     
    -{config, ConfigFiles}.
    -{config, ConfigDir, ConfigBaseNames}.
    -{config, NodeRefs, ConfigFiles}.
    -{config, NodeRefs, ConfigDir, ConfigBaseNames}.
    +{config, ConfigFiles}.
    +{config, ConfigDir, ConfigBaseNames}.
    +{config, NodeRefs, ConfigFiles}.
    +{config, NodeRefs, ConfigDir, ConfigBaseNames}.
     
    -{userconfig, {CallbackModule, ConfigStrings}}.
    -{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
    +{userconfig, {CallbackModule, ConfigStrings}}.
    +{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
     
    -{logdir, LogDir}.
    -{logdir, NodeRefs, LogDir}.
    +{logdir, LogDir}.
    +{logdir, NodeRefs, LogDir}.
     
    -{logopts, LogOpts}.
    -{logopts, NodeRefs, LogOpts}.
    +{logopts, LogOpts}.
    +{logopts, NodeRefs, LogOpts}.
     
    -{create_priv_dir, PrivDirOption}.
    -{create_priv_dir, NodeRefs, PrivDirOption}.
    +{create_priv_dir, PrivDirOption}.
    +{create_priv_dir, NodeRefs, PrivDirOption}.
     
    -{event_handler, EventHandlers}.
    -{event_handler, NodeRefs, EventHandlers}.
    -{event_handler, EventHandlers, InitArgs}.
    -{event_handler, NodeRefs, EventHandlers, InitArgs}.
    +{event_handler, EventHandlers}.
    +{event_handler, NodeRefs, EventHandlers}.
    +{event_handler, EventHandlers, InitArgs}.
    +{event_handler, NodeRefs, EventHandlers, InitArgs}.
     
    -{ct_hooks, CTHModules}.
    -{ct_hooks, NodeRefs, CTHModules}.
    +{ct_hooks, CTHModules}.
    +{ct_hooks, NodeRefs, CTHModules}.
     
    -{ct_hooks_order, CTHOrder}.
    +{ct_hooks_order, CTHOrder}.
     
    -{enable_builtin_hooks, Bool}.
    +{enable_builtin_hooks, Bool}.
     
    -{basic_html, Bool}.
    -{basic_html, NodeRefs, Bool}.
    +{basic_html, Bool}.
    +{basic_html, NodeRefs, Bool}.
     
    -{esc_chars, Bool}.
    -{esc_chars, NodeRefs, Bool}.
    +{esc_chars, Bool}.
    +{esc_chars, NodeRefs, Bool}.
     
    -{release_shell, Bool}.

    Test terms:

    {suites, Dir, Suites}.
    -{suites, NodeRefs, Dir, Suites}.
    +{release_shell, Bool}.

    Test terms:

    {suites, Dir, Suites}.
    +{suites, NodeRefs, Dir, Suites}.
     
    -{groups, Dir, Suite, Groups}.
    -{groups, NodeRefs, Dir, Suite, Groups}.
    +{groups, Dir, Suite, Groups}.
    +{groups, NodeRefs, Dir, Suite, Groups}.
     
    -{groups, Dir, Suite, Groups, {cases,Cases}}.
    -{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.
    +{groups, Dir, Suite, Groups, {cases,Cases}}.
    +{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.
     
    -{cases, Dir, Suite, Cases}.
    -{cases, NodeRefs, Dir, Suite, Cases}.
    +{cases, Dir, Suite, Cases}.
    +{cases, NodeRefs, Dir, Suite, Cases}.
     
    -{skip_suites, Dir, Suites, Comment}.
    -{skip_suites, NodeRefs, Dir, Suites, Comment}.
    +{skip_suites, Dir, Suites, Comment}.
    +{skip_suites, NodeRefs, Dir, Suites, Comment}.
     
    -{skip_groups, Dir, Suite, GroupNames, Comment}.
    -{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.
    +{skip_groups, Dir, Suite, GroupNames, Comment}.
    +{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.
     
    -{skip_cases, Dir, Suite, Cases, Comment}.
    -{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.

    Types:

    Bool            = true | false
    -Constant        = atom()
    -Value           = term()
    +{skip_cases, Dir, Suite, Cases, Comment}.
    +{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.

    Types:

    Bool            = true | false
    +Constant        = atom()
    +Value           = term()
     InclSpecsOption = join | separate
    -TestSpecs       = string() | [string()]
    -NodeAlias       = atom()
    -Node            = node()
    +TestSpecs       = string() | [string()]
    +NodeAlias       = atom()
    +Node            = node()
     NodeRef         = NodeAlias | Node | master
    -NodeRefs        = all_nodes | [NodeRef] | NodeRef
    -InitOptions     = term()
    -Label           = atom() | string()
    -VerbosityLevels = integer() | [{Category,integer()}]
    -Category        = atom()
    -CSSFile         = string()
    -ConnTypes       = all | [atom()]
    -N               = integer()
    -CoverSpecFile   = string()
    -IncludeDirs     = string() | [string()]
    -ConfigFiles     = string() | [string()]
    -ConfigDir       = string()
    -ConfigBaseNames = string() | [string()]
    -CallbackModule  = atom()
    -ConfigStrings   = string() | [string()]
    -LogDir          = string()
    -LogOpts         = [term()]
    +NodeRefs        = all_nodes | [NodeRef] | NodeRef
    +InitOptions     = term()
    +Label           = atom() | string()
    +VerbosityLevels = integer() | [{Category,integer()}]
    +Category        = atom()
    +CSSFile         = string()
    +ConnTypes       = all | [atom()]
    +N               = integer()
    +CoverSpecFile   = string()
    +IncludeDirs     = string() | [string()]
    +ConfigFiles     = string() | [string()]
    +ConfigDir       = string()
    +ConfigBaseNames = string() | [string()]
    +CallbackModule  = atom()
    +ConfigStrings   = string() | [string()]
    +LogDir          = string()
    +LogOpts         = [term()]
     PrivDirOption   = auto_per_run | auto_per_tc | manual_per_tc
    -EventHandlers   = atom() | [atom()]
    -InitArgs        = [term()]
    -CTHModules      = [CTHModule |
    -       	    {CTHModule, CTHInitArgs} |
    -       	    {CTHModule, CTHInitArgs, CTHPriority}]
    -CTHModule       = atom()
    -CTHInitArgs     = term()
    +EventHandlers   = atom() | [atom()]
    +InitArgs        = [term()]
    +CTHModules      = [CTHModule |
    +       	    {CTHModule, CTHInitArgs} |
    +       	    {CTHModule, CTHInitArgs, CTHPriority}]
    +CTHModule       = atom()
    +CTHInitArgs     = term()
     CTHOrder        = test | config
    -Dir             = string()
    -Suites          = atom() | [atom()] | all
    -Suite           = atom()
    -Groups          = GroupPath | GroupSpec | [GroupSpec] | all
    -GroupPath       = [[GroupSpec]]
    -GroupSpec       = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]}
    -GroupName       = atom()
    -GroupNames      = GroupName | [GroupName]
    -Cases           = atom() | [atom()] | all
    -Comment         = string() | ""

    The difference between the config terms above is that with ConfigDir, +Dir = string() +Suites = atom() | [atom()] | all +Suite = atom() +Groups = GroupPath | GroupSpec | [GroupSpec] | all +GroupPath = [[GroupSpec]] +GroupSpec = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]} +GroupName = atom() +GroupNames = GroupName | [GroupName] +Cases = atom() | [atom()] | all +Comment = string() | ""

    The difference between the config terms above is that with ConfigDir, ConfigBaseNames is a list of base names, that is, without directory paths. ConfigFiles must be full names, including paths. For example, the following -two terms have the same meaning:

    {config, ["/home/testuser/tests/config/nodeA.cfg",
    -          "/home/testuser/tests/config/nodeB.cfg"]}.
    +two terms have the same meaning:

    {config, ["/home/testuser/tests/config/nodeA.cfg",
    +          "/home/testuser/tests/config/nodeB.cfg"]}.
     
    -{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.

    Note

    Any relative paths, specified in the test specification, are relative to the +{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.

    Note

    Any relative paths, specified in the test specification, are relative to the directory containing the test specification file if ct_run -spec TestSpecFile ... or ct:run:test([{spec,TestSpecFile},...]) executes the test.

    The path is relative to the top-level log directory if @@ -684,36 +684,36 @@

    an uppercase letter, or a $, ?, or _. This means that it must always be single quoted (as the constant name is an atom, not text).

    The main benefit of constants is that they can be used to reduce the size (and avoid repetition) of long strings, such as file paths.

    Examples:

    %% 1a. no constant
    -{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, "/home/testuser/tests/suites", all}.
    +{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, "/home/testuser/tests/suites", all}.
     
     %% 1b. with constant
    -{define, 'TESTDIR', "/home/testuser/tests"}.
    -{config, "'TESTDIR'/config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, "'TESTDIR'/suites", all}.
    +{define, 'TESTDIR', "/home/testuser/tests"}.
    +{config, "'TESTDIR'/config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, "'TESTDIR'/suites", all}.
     
     %% 2a. no constants
    -{config, [testnode@host1, testnode@host2], "../config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, [testnode@host1, testnode@host2], "../suites", [x_SUITE, y_SUITE]}.
    +{config, [testnode@host1, testnode@host2], "../config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, [testnode@host1, testnode@host2], "../suites", [x_SUITE, y_SUITE]}.
     
     %% 2b. with constants
    -{define, 'NODE', testnode}.
    -{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}.
    -{config, 'NODES', "../config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, 'NODES', "../suites", [x_SUITE, y_SUITE]}.

    Constants make the test specification term alias, in previous versions of +{define, 'NODE', testnode}. +{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}. +{config, 'NODES', "../config", ["nodeA.cfg","nodeB.cfg"]}. +{suites, 'NODES', "../suites", [x_SUITE, y_SUITE]}.

    Constants make the test specification term alias, in previous versions of Common Test, redundant. This term is deprecated but remains supported in upcoming Common Test releases. Replacing alias terms with define is strongly recommended though. An example of such replacement follows:

    %% using the old alias term
    -{config, "/home/testuser/tests/config/nodeA.cfg"}.
    -{alias, suite_dir, "/home/testuser/tests/suites"}.
    -{groups, suite_dir, x_SUITE, group1}.
    +{config, "/home/testuser/tests/config/nodeA.cfg"}.
    +{alias, suite_dir, "/home/testuser/tests/suites"}.
    +{groups, suite_dir, x_SUITE, group1}.
     
     %% replacing with constants
    -{define, 'TestDir', "/home/testuser/tests"}.
    -{define, 'CfgDir', "'TestDir'/config"}.
    -{define, 'SuiteDir', "'TestDir'/suites"}.
    -{config, 'CfgDir', "nodeA.cfg"}.
    -{groups, 'SuiteDir', x_SUITE, group1}.

    Constants can well replace term node also, but this still has a declarative +{define, 'TestDir', "/home/testuser/tests"}. +{define, 'CfgDir', "'TestDir'/config"}. +{define, 'SuiteDir', "'TestDir'/suites"}. +{config, 'CfgDir', "nodeA.cfg"}. +{groups, 'SuiteDir', x_SUITE, group1}.

    Constants can well replace term node also, but this still has a declarative value, mainly when used in combination with NodeRefs == all_nodes (see Types).

    @@ -721,25 +721,25 @@

    Example

    -

    Here follows a simple test specification example:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    +

    Here follows a simple test specification example:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
     
    -{logdir, "'Top'/logs"}.
    +{logdir, "'Top'/logs"}.
     
    -{config, ["'T1'/'CfgFile'", "'T2'/'CfgFile'", "'T3'/'CfgFile'"]}.
    +{config, ["'T1'/'CfgFile'", "'T2'/'CfgFile'", "'T3'/'CfgFile'"]}.
     
    -{suites, 'T1', all}.
    -{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +{suites, 'T1', all}.
    +{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    The example specifies the following:

    • The specified logdir directory is used for storing the HTML log files (in +{skip_suites, 'T3', all, "Not implemented"}.

    The example specifies the following:

    For more information about require, see section +test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    +    [{require, ftp},
    +     {default_config, ftp, [{ftp, "my_ftp_host"},
    +                            {username, "aladdin"},
    +                            {password, "sesame"}]}}].
    testcase2() ->
    +    [{require, unix_telnet, unix},
    +     {require, {unix, [telnet, username, password]}},
    +     {default_config, unix, [{telnet, "my_telnet_host"},
    +                             {username, "aladdin"},
    +                             {password, "sesame"}]}}].

    For more information about require, see section Requiring and Reading Configuration Data in section External Configuration Data and function ct:require/1/2.

    Note

    Specifying a default value for a required variable can result in a test case always getting executed. This might not be a desired behavior.

    If timetrap or require, or both, is not set specifically for a particular test case, default values specified by function -suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    -    [
    -     {timetrap,{seconds,60}},
    -     {require,interfaces},
    -     {userdata,
    -         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    -          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    -    ].

    +suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    +    [
    +     {timetrap,{seconds,60}},
    +     {require,interfaces},
    +     {userdata,
    +         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    +          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    +    ].

    @@ -302,14 +302,14 @@

    Test Case Information Function and Test Case Groups.

    The following options can also be specified with the suite information list:

    An example of the suite information function follows:

    suite() ->
    -    [
    -     {timetrap,{minutes,10}},
    -     {require,global_names},
    -     {userdata,[{info,"This suite tests database transactions."}]},
    -     {silent_connections,[telnet]},
    -     {stylesheet,"db_testing.css"}
    -    ].

    +Silent Connections

    An example of the suite information function follows:

    suite() ->
    +    [
    +     {timetrap,{minutes,10}},
    +     {require,global_names},
    +     {userdata,[{info,"This suite tests database transactions."}]},
    +     {silent_connections,[telnet]},
    +     {stylesheet,"db_testing.css"}
    +    ].

    @@ -331,20 +331,20 @@

    TCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]

    GroupName is the name of the group and must be unique within the test suite module. Groups can be nested, by including a group definition within the GroupsAndTestCases list of another group. Properties is the list of -execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    -Shuffle = shuffle | {shuffle,Seed}
    -Seed = {integer(),integer(),integer()}
    +execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    +Shuffle = shuffle | {shuffle,Seed}
    +Seed = {integer(),integer(),integer()}
     GroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |
                       repeat_until_any_ok | repeat_until_any_fail
    -N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in +N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in parallel.

    • sequence - The cases are executed in a sequence as described in section Sequences in section Dependencies Between Test Cases and Suites.

    • shuffle - The cases in the group are executed in random order.

    • repeat, repeat_until_* - Orders Common Test to repeat execution of all the cases in the group a given number of times, or until any, or all, cases -fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    -             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test +fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    +             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test cases that are not part of any group), add tuples on the form -{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: +{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: {group,GroupName,Properties} can also be specified. These properties override those specified in the group definition (see groups/0 earlier). This way, the same set of tests can be run, but with different properties, without having to @@ -353,33 +353,33 @@

    SubGroups is a list of tuples, {GroupName,Properties} or {GroupName,Properties,SubGroups} representing the subgroups. Any subgroups defined in groups/0 for a group, that are not specified in the SubGroups -list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    -                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each -time:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]},
    -                              {tests3, default}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    -                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply -nested groups:

    groups() ->
    -   [{tests1, [], [{group, tests2}]},
    -    {tests2, [], [{group, tests3}]},
    -    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    -
    -all() ->
    -   [{group, tests1, default,
    -     [{tests2, default,
    -       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function -call whose return value should match the expected syntax case.

    Example:

    all() ->
    -   [{group, tests1, default, test_cases()},
    -    {group, tests1, default, [shuffle_test(),
    -                              {tests3, default}]}].
    -test_cases() ->
    -   [{tests2, [parallel]}, {tests3, default}].
    -
    -shuffle_test() ->
    -   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group +list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    +                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each +time:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]},
    +                              {tests3, default}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    +                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply +nested groups:

    groups() ->
    +   [{tests1, [], [{group, tests2}]},
    +    {tests2, [], [{group, tests3}]},
    +    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    +
    +all() ->
    +   [{group, tests1, default,
    +     [{tests2, default,
    +       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function +call whose return value should match the expected syntax case.

    Example:

    all() ->
    +   [{group, tests1, default, test_cases()},
    +    {group, tests1, default, [shuffle_test(),
    +                              {tests3, default}]}].
    +test_cases() ->
    +   [{tests2, [parallel]}, {tests3, default}].
    +
    +shuffle_test() ->
    +   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group properties at the time of execution, without having to edit the test suite. For more information, see section Test Specifications in section @@ -405,13 +405,13 @@

    bottom of the log for end_per_group/2.

    Test case groups can be nested so sets of groups can be configured with the same init_per_group/2 and end_per_group/2 functions. Nested groups can be defined by including a group definition, or a group name reference, in the test case -list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    -                                  {group2, [], [test2a,test2b]},
    -                                  test1b]},
    -             {group3, [], [{group,group4},
    -                           {group,group5}]},
    -             {group4, [parallel], [test4a,test4b]},
    -             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order +list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    +                                  {group2, [], [test2a,test2b]},
    +                                  test1b]},
    +             {group3, [], [{group,group4},
    +                           {group,group5}]},
    +             {group4, [parallel], [test4a,test4b]},
    +             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order [{group,group1},{group,group3}], the order of the configuration functions and test cases becomes the following (notice that init_per_testcase/2 and end_per_testcase/2: are also always called, but not included in this example @@ -484,25 +484,25 @@

    account by Common Test when evaluating if execution of a group is to be repeated or not (unless the basic repeat property is used).

    The value of tc_group_properties is a list of status tuples, each with the key ok, skipped, and failed. The value of a status tuple is a list with names -of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    case proplists:get_value(failed, Status) of
    -        [] ->                                   % no failed cases
    -            {return_group_result,ok};
    +of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    case proplists:get_value(failed, Status) of
    +        [] ->                                   % no failed cases
    +            {return_group_result,ok};
             _Failed ->                              % one or more failed
    -            {return_group_result,failed}
    +            {return_group_result,failed}
         end.

    It is also possible, in end_per_group/2, to check the status of a subgroup (maybe to determine what status the current group is to return). This is as simple as illustrated in the previous example, only the group name is stored in a tuple {group_result,GroupName}, which can be searched for in the status -lists.

    Example:

    end_per_group(group1, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    Failed = proplists:get_value(failed, Status),
    -    case lists:member({group_result,group2}, Failed) of
    +lists.

    Example:

    end_per_group(group1, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    Failed = proplists:get_value(failed, Status),
    +    case lists:member({group_result,group2}, Failed) of
               true ->
    -              {return_group_result,failed};
    +              {return_group_result,failed};
               false ->
    -              {return_group_result,ok}
    +              {return_group_result,ok}
         end;
     ...

    Note

    When a test case group is repeated, the configuration functions init_per_group/2 and end_per_group/2 are also always called with each @@ -534,9 +534,9 @@

    The test case group information function, group(GroupName), serves the same purpose as the suite- and test case information functions previously described. However, the scope for the group information function, is all test cases and -subgroups in the group in question (GroupName).

    Example:

    group(connection_tests) ->
    -   [{require,login_data},
    -    {timetrap,1000}].

    The group information properties override those set with the suite information +subgroups in the group in question (GroupName).

    Example:

    group(connection_tests) ->
    +   [{require,login_data},
    +    {timetrap,1000}].

    The group information properties override those set with the suite information function, and can in turn be overridden by test case information properties. For a list of valid information properties and more general information, see the Test Case Information Function.

    @@ -666,23 +666,23 @@

    (except from printouts made by Common Test itself).

    The general verbosity level is not associated with any particular category. This level sets the threshold for the standard I/O printouts, uncategorized ct:log/print/pal printouts, and printouts for categories with undefined -verbosity level.

    Examples:

    Some printouts during test case execution:

    io:format("1. Standard IO, importance = ~w~n", [?STD_IMPORTANCE]),
    -ct:log("2. Uncategorized, importance = ~w", [?STD_IMPORTANCE]),
    - ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]),
    - ct:log(info, ?LOW_IMPORTANCE, "4. Categorized info, importance = ~w", [?LOW_IMPORTANCE]),
    - ct:log(error, ?HI_IMPORTANCE, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
    - ct:log(error, ?MAX_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),

    If starting the test with a general verbosity level of 50 (?STD_VERBOSITY):

    $ ct_run -verbosity 50

    the following is printed:

    1. Standard IO, importance = 50
    +verbosity level.

    Examples:

    Some printouts during test case execution:

    io:format("1. Standard IO, importance = ~w~n", [?STD_IMPORTANCE]),
    +ct:log("2. Uncategorized, importance = ~w", [?STD_IMPORTANCE]),
    + ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]),
    + ct:log(info, ?LOW_IMPORTANCE, "4. Categorized info, importance = ~w", [?LOW_IMPORTANCE]),
    + ct:log(error, ?HI_IMPORTANCE, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
    + ct:log(error, ?MAX_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),

    If starting the test with a general verbosity level of 50 (?STD_VERBOSITY):

    $ ct_run -verbosity 50

    the following is printed:

    1. Standard IO, importance = 50
     2. Uncategorized, importance = 50
     3. Categorized info, importance = 50
     5. Categorized error, importance = 75
     6. Categorized error, importance = 99

    If starting the test with:

    $ ct_run -verbosity 1 and info 75

    the following is printed:

    3. Categorized info, importance = 50
     4. Categorized info, importance = 25
     6. Categorized error, importance = 99

    Note that the category argument is not required in order to only specify the -importance of a printout. Example:

    ct:pal(?LOW_IMPORTANCE, "Info report: ~p", [Info])

    Or perhaps in combination with constants:

    -define(INFO, ?LOW_IMPORTANCE).
    --define(ERROR, ?HI_IMPORTANCE).
    +importance of a printout. Example:

    ct:pal(?LOW_IMPORTANCE, "Info report: ~p", [Info])

    Or perhaps in combination with constants:

    -define(INFO, ?LOW_IMPORTANCE).
    +-define(ERROR, ?HI_IMPORTANCE).
     
    -ct:log(?INFO, "Info report: ~p", [Info])
    -ct:pal(?ERROR, "Error report: ~p", [Error])

    The functions ct:set_verbosity/2 and ct:get_verbosity/1 may be used to +ct:log(?INFO, "Info report: ~p", [Info]) +ct:pal(?ERROR, "Error report: ~p", [Error])

    The functions ct:set_verbosity/2 and ct:get_verbosity/1 may be used to modify and read verbosity levels during test execution.

    The arguments Format and FormatArgs in ct:log/print/pal are always passed on to the STDLIB function io:format/3 (For details, see the io manual page).

    ct:pal/4 and ct:log/5 add headers to strings being printed to the log file. diff --git a/prs/8803/lib/compiler-8.5.1/doc/html/beam_ssa.html b/prs/8803/lib/compiler-8.5.1/doc/html/beam_ssa.html index 0a647041a82f4..0d1b2e03e29a3 100644 --- a/prs/8803/lib/compiler-8.5.1/doc/html/beam_ssa.html +++ b/prs/8803/lib/compiler-8.5.1/doc/html/beam_ssa.html @@ -188,8 +188,8 @@

    br ^common_end_of_catch common_end_of_catch: - @tmp = phi { @catched_val, ^landing_pad_block }, - { @successful_result, ^protected_blockN } + @tmp = phi { @catched_val, ^landing_pad_block }, + { @successful_result, ^protected_blockN } @result_of_catch_expr = catch_end @tag, @tmp

    Just as for a try-catch expression all code that can cause an exception in one of the protected blocks must have explicit control flow edges to the landing pad block.

    @@ -234,7 +234,7 @@

    Variable Naming

    A variable name in BEAM SSA is either an atom or a non-negative -integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler +integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler transforms maintain a counter, the cnt-field in the b_function and opt_st records, which is incremented each time a new variable or label is created. In the following description the value of the diff --git a/prs/8803/lib/compiler-8.5.1/doc/html/compile.html b/prs/8803/lib/compiler-8.5.1/doc/html/compile.html index 29c40c36dcfa2..0de90f5c799a3 100644 --- a/prs/8803/lib/compiler-8.5.1/doc/html/compile.html +++ b/prs/8803/lib/compiler-8.5.1/doc/html/compile.html @@ -153,7 +153,7 @@

    Options given in the compile() attribute in the source code take precedence over options given to the compiler, which in turn take precedence over options given in the environment.

    A later compiler option takes precedence over an earlier one in the -option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless +option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless the source code for module something contains a compile(nowarn_missing_spec) attribute.

    Change

    In Erlang/OTP 26 and earlier, the option order was the opposite of what is described here.

    @@ -177,14 +177,14 @@

    which functions to inline, or {inline,[{Name,Arity},...]} to have the compiler inline all calls to the given functions. If the option is given inside a compile directive in an Erlang module, {Name,Arity} can be written as -Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
    +Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
     
    -pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to +pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to be inlined. Default is 24, which keeps the size of the inlined code roughly the same as the un-inlined version (only relatively small functions are inlined).

    Example:

    %% Aggressive inlining - will increase code size.
    --compile(inline).
    --compile({inline_size,100}).

    +-compile(inline). +-compile({inline_size,100}).

    @@ -932,10 +932,10 @@

    file(File, Options)

    function definitions. This is the preferred method of enabling and disabling features, since it is a local property of a module.

  • makedep - Produces a Makefile rule to track headers dependencies. No object file is produced.

    By default, this rule is written to <File>.Pbeam. However, if option -binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
    +binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
     
    --include_lib("eunit/include/eunit.hrl").
    --include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
    +-include_lib("eunit/include/eunit.hrl").
    +-include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
       /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
       header.hrl
  • makedep_side_effect - The dependencies are created as a side effect to the normal compilation process. This means that the object file will also be @@ -1001,7 +1001,7 @@

    file(File, Options)

    before Erlang/OTP R14A when calling a local function with the same name as an auto-imported BIF without module prefix.

    If the BIF is to be called, use the erlang module prefix in the call, not {no_auto_import,[{F,A}, ...]}.

    If this option is written in the source code, as a -compile directive, the -syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly +syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly smaller output file.

  • no_lint - Skips the pass that checks for errors and warnings. Only applicable together with the from_abstr option. This is mainly for implementations of other languages on top of Erlang, which have already done diff --git a/prs/8803/lib/compiler-8.5.1/doc/html/compiler.epub b/prs/8803/lib/compiler-8.5.1/doc/html/compiler.epub index e7a33b21c55313e4786ab6b7efdc13c9e01abf84..fdc91f74119dca3c3425c75f640713334d050f5e 100644 GIT binary patch delta 19197 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 Ca%1`c delta 19165 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 Fixed Bugs and Malfunctions

  • -
    • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

      As an example, consider this module:

      -module(t).
      --export([f/0]).
      +
      • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

        As an example, consider this module:

        -module(t).
        +-export([f/0]).
         
        -f() ->
        -    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
        +f() ->
        +    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
         ** exception error: bad generator ok
        -     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
        +     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
         <<>>

        Own Id: OTP-18703 Aux Id: GH-7494, PR-7538

      • The documentation for the preprocessor now mentions that defined(Name) can be called in the condition for an -if or -elif directive to test whether Name is the name of a defined macro. (This feature was implemented in OTP 21.)

        If a function call in an -if or -elif with a name that is not the name of a guard BIF, there would not be a compilation error, but would instead cause the lines following the directive to be skipped. This has now been changed to be a compilation error.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18784 Aux Id: GH-7706, PR-7726

      @@ -163,39 +163,39 @@

      Improvements and New Features

      Own Id: OTP-18680 Aux Id: PR-7491, PR-8086, ERIERL-967

    • Improved the performance of the alias analysis pass.

      Own Id: OTP-18714 Aux Id: PR-7528, GH-7432

    • -spec attributes are now used for documentation.

      Own Id: OTP-18801 Aux Id: PR-7739

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • EEP-59 - Documentation Attributes has been implemented.

      Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

      • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

      • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

      • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

      • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • The order in which the compiler looks up options has changed.

      When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

      Example:

      If some_module.erl has the following attribute:

      -compile([nowarn_missing_spec]).

      and the compiler is invoked like so:

      % erlc +warn_missing_spec some_module.erl

      no warnings will be issued for functions that do not have any specs.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +spec attributes are missing in documented functions, types, and callbacks.

    • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

    • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

    Own Id: OTP-18916 Aux Id: PR-7936

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • The order in which the compiler looks up options has changed.

    When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

    Example:

    If some_module.erl has the following attribute:

    -compile([nowarn_missing_spec]).

    and the compiler is invoked like so:

    % erlc +warn_missing_spec some_module.erl

    no warnings will be issued for functions that do not have any specs.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

  • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

    Example:

    -record(rec, {a,b,c}).
     
    -update(#rec{a=needs_update,b=N}=R0) ->
    -    R = R0#rec{a=up_to_date},
    +update(#rec{a=needs_update,b=N}=R0) ->
    +    R = R0#rec{a=up_to_date},
         if
             N < 0 ->
    -            R#rec{c=negative};
    +            R#rec{c=negative};
             N == 0 ->
    -            R#rec{c=zero};
    +            R#rec{c=zero};
             N > 0 ->
    -            R#rec{c=positive}
    +            R#rec{c=positive}
         end.

    The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

    Own Id: OTP-18972 Aux Id: PR-8090

  • Improved the match context reuse optimization slightly, allowing match contexts to be passed as-is to bit_size/1 and byte_size/1.

    Own Id: OTP-18987

  • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

    The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

    You can use nowarn_deprecated_callback to silence the warning.

    Own Id: OTP-19010 Aux Id: PR-8205

  • diff --git a/prs/8803/lib/compiler-8.5.1/doc/html/ssa_checks.html b/prs/8803/lib/compiler-8.5.1/doc/html/ssa_checks.html index 24d0cdc2a04bf..a3760e113a6e5 100644 --- a/prs/8803/lib/compiler-8.5.1/doc/html/ssa_checks.html +++ b/prs/8803/lib/compiler-8.5.1/doc/html/ssa_checks.html @@ -142,32 +142,32 @@

    SSA checks are embedded in the source code as comments starting with with one of %ssa%, %%ssa% or %%%ssa%. This is a short introduction the syntax, for the full syntax please refer to the -ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
    +ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa%   ret(#{}).
    -  #{}.

    will check that t0/0 returns the literal #{}. If we want to check -that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
    +  #{}.

    will check that t0/0 returns the literal #{}. If we want to check +that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
     %ssa% (X, _) when post_ssa_opt ->
     %ssa%   ret(X).
       A.

    Note how we match the first formal parameter using X. The reason for having our own formal parameters for the SSA check, is that we don't want to introduce new identifiers at the Erlang level to support SSA-level checks. Consider if t1/2 had been defined as t1([A|As], B) we would have had to introduce a new identifier for the aggregate -value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must +value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must succeed), fail and xfail (the check must fail). Omitting <expected-result> is parsed as an implicit pass.

    <formals> is a comma-separated list of variables.

    <pipeline-location> specifies when in the compiler pipeline to run the checks. For now the only supported value for <pipeline-location> is post_ssa_opt which runs the checks after the ssa_opt pass.

    <checks> is a comma-separated list of matches against the BEAM SSA -code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA -representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
    +code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA +representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
     
    -switch(<value>, <fail-label>, [{<label>,<value>},...])
    +switch(<value>, <fail-label>, [{<label>,<value>},...])
     
    -ret(<value>)
    +ret(<value>)
     
     label <value>

    where <value> is a literal or a variable.

    A check can also include an assertion on operation annotations. The assertion is written as a map-like pattern following the argument -list, for example:

    t0() ->
    +list, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa% _ = call(fun return_int/0) { result_type => {t_integer,{17,17}},
     %ssa%                              location => {_,32} },
    @@ -175,9 +175,9 @@ 

    %ssa% result_type => {t_tuple,2,true,#{1 => {t_integer,{1,1}}, %ssa% 2 => {t_integer,{2,2}}}} %ssa% }. - X = return_int(), - Y = return_tuple(), - {X, Y}.

    + X = return_int(), + Y = return_tuple(), + {X, Y}.

    diff --git a/prs/8803/lib/crypto-5.5/doc/html/crypto.epub b/prs/8803/lib/crypto-5.5/doc/html/crypto.epub index 0867312d619002c80e854d56ee8f9c611e2efdad..b3db02a426bb4c743a6143365d40771781bacb42 100644 GIT binary patch delta 21448 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%0Dm61wE7N{`HUCA~td`QC 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 delta 21385 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 Mif6lj(_aYiFT2N^7ytkO diff --git a/prs/8803/lib/crypto-5.5/doc/html/crypto.html b/prs/8803/lib/crypto-5.5/doc/html/crypto.html index 98322ef8d27c1..0e6a96be5fcaf 100644 --- a/prs/8803/lib/crypto-5.5/doc/html/crypto.html +++ b/prs/8803/lib/crypto-5.5/doc/html/crypto.html @@ -595,7 +595,7 @@

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -3131,7 +3131,7 @@

    rsa_params()

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -5548,9 +5548,9 @@

    rand_seed()

    BN_rand_range).

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5616,9 +5616,9 @@

    rand_seed_alg(Alg)

    generate cryptographically strong random numbers.

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5650,12 +5650,12 @@

    rand_seed_alg(Alg, Seed)

    Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

    Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % [1; 42]
    -FloatValue = rand:uniform(),     % [0.0; 1.0[
    -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % Same values
    -FloatValue = rand:uniform().     % again
    +rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % [1; 42]
    +FloatValue = rand:uniform(),     % [0.0; 1.0[
    +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % Same values
    +FloatValue = rand:uniform().     % again
    @@ -6120,12 +6120,12 @@

    info()

    -

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    -#{compile_type => normal,
    +

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    +#{compile_type => normal,
       cryptolib_version_compiled => "OpenSSL 3.0.0 7 sep 2021",
       cryptolib_version_linked => "OpenSSL 3.0.0 7 sep 2021",
       link_type => dynamic,
    -  otp_crypto_version => "5.0.2"}
    +  otp_crypto_version => "5.0.2"}
     2>

    More association types than documented may be present in the map.

    @@ -6193,8 +6193,8 @@

    info_lib()

    Get the name and version of the libraries used by crypto.

    Name is the name of the library. VerNum is the numeric version according to the library's own versioning scheme. VerStr contains a text variant of the -version.

    > info_lib().
    -[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL +version.

    > info_lib().
    +[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL header files (openssl/opensslv.h) used when crypto was compiled. The text variant represents the libcrypto library used at runtime. In earlier OTP versions both numeric and text was taken from the library.

    diff --git a/prs/8803/lib/crypto-5.5/doc/html/engine_keys.html b/prs/8803/lib/crypto-5.5/doc/html/engine_keys.html index d249037511256..0397cb3a9fc6d 100644 --- a/prs/8803/lib/crypto-5.5/doc/html/engine_keys.html +++ b/prs/8803/lib/crypto-5.5/doc/html/engine_keys.html @@ -161,13 +161,13 @@

    Sign with an engine stored private key

    This example shows how to construct a key reference that is used in a sign -operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
    +operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
     ...
    -{ok,#Ref<0.2399045421.3028942852.173962>}
    -2> PrivKey = #{engine => EngineRef,
    -               key_id => "id of the private key in Engine"}.
    +{ok,#Ref<0.2399045421.3028942852.173962>}
    +2> PrivKey = #{engine => EngineRef,
    +               key_id => "id of the private key in Engine"}.
     ...
    -3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
    +3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
     <<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
       207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    @@ -177,10 +177,10 @@

    Here the signature and message in the last example is verifyed using the public key. The public key is stored in an engine, only to exemplify that it is -possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    -                 key_id => "id of the public key in Engine"}.
    +possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    +                 key_id => "id of the public key in Engine"}.
     ...
    -5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
    +5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
     true
     6>

    @@ -189,11 +189,11 @@

    Using a password protected private key

    The same example as the first sign example, except that a password protects the -key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
    +key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
                       key_id => "id of the pwd protected private key in Engine",
    -		  password => "password"}.
    +		  password => "password"}.
     ...
    -7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    +7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
     <<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
       175,106,77,241,141,120,72,149,181,181,194,154,175,76,
       223,...>>
    diff --git a/prs/8803/lib/crypto-5.5/doc/html/engine_load.html b/prs/8803/lib/crypto-5.5/doc/html/engine_load.html
    index 6fe2b6f81a82d..23a2a8beaa509 100644
    --- a/prs/8803/lib/crypto-5.5/doc/html/engine_load.html
    +++ b/prs/8803/lib/crypto-5.5/doc/html/engine_load.html
    @@ -152,35 +152,35 @@ 

    Dynamically load an engine from default directory

    If the engine is located in the OpenSSL/LibreSSL installation engines -directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    - {ok, #Ref}

    +directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    + {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the -library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    - {ok, #Ref}

    +library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    + {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine -methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    -{ok, #Ref}
    -4> ok = crypto:engine_register(Engine, [engine_method_digests]).
    +methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    +{ok, #Ref}
    +4> ok = crypto:engine_register(Engine, [engine_method_digests]).
     ok

    @@ -189,19 +189,19 @@

    5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>, - <<"/some/path/otp_test_engine.so">>). - {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
    +check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    +                                               <<"/some/path/otp_test_engine.so">>).
    + {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
      ok

    To unload it use crypto:engine_unload/1 which removes the references to the -engine.

     6> crypto:engine_unload(Engine).
    +engine.

     6> crypto:engine_unload(Engine).
      ok

    List all engines currently loaded

    -
     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +
     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    diff --git a/prs/8803/lib/crypto-5.5/doc/html/new_api.html b/prs/8803/lib/crypto-5.5/doc/html/new_api.html index 06513ca68f6e0..c60396d534f98 100644 --- a/prs/8803/lib/crypto-5.5/doc/html/new_api.html +++ b/prs/8803/lib/crypto-5.5/doc/html/new_api.html @@ -192,41 +192,41 @@

    initialises the crypto context. One or more calls crypto_update/2 does the actual encryption or decryption for each block.

    This example shows first the encryption of two blocks and then decryptions of the cipher text, but divided into three blocks just to show that it is possible -to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
    +to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
     	ok
     	2> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
     	3> IV = <<0:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
    +	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
     	#Ref<0.3768901617.1128660993.124047>
    -	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    +	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
     	<<67,44,216,166,25,130,203,5,66,6,162>>
    -	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    +	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
     	<<16,79,94,115,234,197,94,253,16,144,151,41>>
     	7>
    -	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
    +	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
     	#Ref<0.3768901617.1128660994.124255>
    -	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    +	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
     	<<"First b">>
    -	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    -        94,253,16,144,151>>).
    +	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    +        94,253,16,144,151>>).
     	<<"ytesSecond byte">>
    -	10> crypto:crypto_update(StateDec, <<41>>).
    +	10> crypto:crypto_update(StateDec, <<41>>).
     	<<"s">>
     	11>

    Note that the internal data that the StateEnc and StateDec references are destructivly updated by the calls to crypto_update/2. This is to gain time in the calls of the nifs interfacing the cryptolib. In a loop where the state is saved in the loop's state, it also saves one update of the loop state per crypto operation.

    For example, a simple server receiving text parts to encrypt and send the result -back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    -	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
    +back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    +	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
     
    -	crypto_loop(State) ->
    +	crypto_loop(State) ->
     	receive
    -        {Text, Requester} ->
    -        Requester ! crypto:crypto_update(State, Text),
    -	loop(State)
    +        {Text, Requester} ->
    +        Requester ! crypto:crypto_update(State, Text),
    +	loop(State)
     	end.

    @@ -239,9 +239,9 @@

    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] - 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] + 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). <<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234, 197,94,253,16,144,151,41>> 5>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one @@ -257,14 +257,14 @@

    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] 4> AAD = <<"Some additional auth data">>. <<"Some additional auth data">> - 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). - {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, + 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). + {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, 192,103,176,90,104,15,71,158>>, - <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} + <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} 6>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one single binary: <<"First bytesSecond bytes">>.

    @@ -274,21 +274,21 @@

    	1> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
    +	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
     	#Ref<0.2424664121.2781478916.232610>
    -	3> crypto:mac_update(StateMac, <<"First bytes">>).
    +	3> crypto:mac_update(StateMac, <<"First bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	4> crypto:mac_update(StateMac, " ").
    +	4> crypto:mac_update(StateMac, " ").
     	#Ref<0.2424664121.2781478916.232610>
    -	5> crypto:mac_update(StateMac, <<"last bytes">>).
    +	5> crypto:mac_update(StateMac, <<"last bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	6> crypto:mac_final(StateMac).
    +	6> crypto:mac_final(StateMac).
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    +	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	8> v(7) == v(6).
    +	8> v(7) == v(6).
     	true
     	9>

    diff --git a/prs/8803/lib/debugger-5.4/doc/html/debugger.epub b/prs/8803/lib/debugger-5.4/doc/html/debugger.epub index 3c5a101067cdc218ef2e28d8d29220d0cd903c94..1d5917f794647f3c855b0b3f9cad5e1a2ce34e98 100644 GIT binary patch delta 10077 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 E2QFQ5#sB~S delta 10142 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

    dgEPHC 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 diff --git a/prs/8803/lib/debugger-5.4/doc/html/debugger_chapter.html b/prs/8803/lib/debugger-5.4/doc/html/debugger_chapter.html index 4b6106cf343cb..448d9c06512b2 100644 --- a/prs/8803/lib/debugger-5.4/doc/html/debugger_chapter.html +++ b/prs/8803/lib/debugger-5.4/doc/html/debugger_chapter.html @@ -164,12 +164,12 @@

    To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    -2:   case get_file(Module,Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    +2:   case get_file(Module,Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    @@ -208,13 +208,13 @@ 

    returns unbound or {value,Value}.

    Conditional Break Dialog Window

    Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

    Example:

    A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    --export([c_break/1]).
    +equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    +-export([c_break/1]).
     
    -c_break(Bindings) ->
    -    case int:get_binding('N', Bindings) of
    -        {value, 3} ->
    +c_break(Bindings) ->
    +    case int:get_binding('N', Bindings) of
    +        {value, 3} ->
                 true;
             _ ->
                 false
    @@ -235,12 +235,12 @@ 

    The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

    1> catch a+1.
    -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
    -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
    -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
    -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
    -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
    -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

    Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which diff --git a/prs/8803/lib/debugger-5.4/doc/html/i.html b/prs/8803/lib/debugger-5.4/doc/html/i.html index 8dcde90ff5239..33324e6c52152 100644 --- a/prs/8803/lib/debugger-5.4/doc/html/i.html +++ b/prs/8803/lib/debugger-5.4/doc/html/i.html @@ -134,9 +134,9 @@

    interpreted processes and break points.

    It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

    The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

    1> ii(t).
    -{module,t}
    -2> iaa([init]).
    +they can be called without the i: prefix. For example:

    1> ii(t).
    +{module,t}
    +2> iaa([init]).
     true
    diff --git a/prs/8803/lib/debugger-5.4/doc/html/int.html b/prs/8803/lib/debugger-5.4/doc/html/int.html index dbfbda9bbf3f7..effce50ce6e90 100644 --- a/prs/8803/lib/debugger-5.4/doc/html/int.html +++ b/prs/8803/lib/debugger-5.4/doc/html/int.html @@ -686,7 +686,7 @@

    auto_attach(Flags, Function)

    Sets when and how to attach automatically to a process executing code in interpreted modules.

    By default when the interpreter is started, automatic attach is disabled.

    If Flags is an empty list, automatic attach is disabled.

    Otherwise Flags should be a list containing at least one of the following flags:

    • init - Attach when a process for the first time calls an interpreted -function.
    • break - Attach whenever a process reaches a breakpoint.
    • exit - Attach when a process terminates.

    When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    +function.
  • break - Attach whenever a process reaches a breakpoint.
  • exit - Attach when a process terminates.
  • When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    diff --git a/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.epub b/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.epub index b0b01e6a546d232b9fa2c4e5ed72f94b3744f6ef..0c1ccab954876ef036fea347f5b9e4ac122843a0 100644 GIT binary patch delta 8809 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 PlvqdzBAC6`zgPZ0dP}nY delta 8843 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 K9>4tV0`WiM-qec# diff --git a/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.html b/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.html index cca0179f22cfa..e8d6933721a90 100644 --- a/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.html +++ b/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer.html @@ -270,13 +270,13 @@

    repeating options which would otherwise need to be given explicitly to Dialyzer on every invocation.

    The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    -        {default_apps,[stdlib,kernel,erts]},
    -        {default_warning_apps,[stdlib]}
    -      }.
    -      {warnings, [no_improper_lists]}.
    -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    +filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    +        {default_apps,[stdlib,kernel,erts]},
    +        {default_warning_apps,[stdlib]}
    +      }.
    +      {warnings, [no_improper_lists]}.
    +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    @@ -284,13 +284,13 @@

    Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source file:

    -dialyzer(no_improper_lists).

    Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also +line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

    Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

    -dialyzer(unmatched_returns).
    diff --git a/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer_chapter.html b/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer_chapter.html index e45626182a8cf..130e3603d8303 100644 --- a/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer_chapter.html +++ b/prs/8803/lib/dialyzer-5.2/doc/html/dialyzer_chapter.html @@ -209,29 +209,29 @@

    deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
    +follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
     %% Dialyzer will infer: foo(integer()) -> string().
    -foo(N) ->
    -    integer_to_list(N).

    Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

    Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

    some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
      The success typing is some_module:foo
    -          (integer()) -> string()
    +          (integer()) -> string()
      But the spec is some_module:foo
    -          (boolean()) -> string()
    - They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
    +          (boolean()) -> string()
    + They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
     %% Dialyzer will infer: bar(a | b) -> binary().
    -bar(a) -> <<"a">>;
    -bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameter.epub b/prs/8803/lib/diameter-2.4/doc/html/diameter.epub
    index 66360c148f318047b679d7743a4a8852ce82965c..870f729d9fbe66ac95af73fcaebebbd3cb88ad19 100644
    GIT binary patch
    delta 32339
    zcmY(JV{|UcvaZ7!+qP}nww=t_cD~q|v2EM7ZQHhIlDqag_v|}vkI{dg?os{keXFag
    z=mWCi0}@VA1{4e$=sycfl{Ov@AA-5`!0ewL&rA>cA7VoBzob6C1^7QGQ5xjGtkDAm
    z#^qla>PGgz7aJSgYC-;mzdgDB3yVA-;s1ph;Y|O93*qvhQ2)f#YSn8$_D`gWruyHb
    zM6GB-u%sfojzr&RLO{x*%h|(lq{r)B`>DQUOizc$m(#~)CKHVw*`lGSz*R}YL{3Pt
    z^Rs0FEqav4J?Dy93T}2*7AePXl!W>6BP%!bKHtG#^!o4g>DWVx!Xmac
    zLFG0d^clf`efi8dQ*ACqNWPx-Ijl^Ak=WcJiA%a7MS^slm9yi$5wi4VA{N3~;mZ_c
    z8>qbxLK)Cutu&ZR0
    zf8HA4eVev>1P~Ur!4M)tn;16(!%~H{fv7mfH}-znwF%L^KO|9A?{W2fPzX8<$busC
    zo}&@yUHXhOkJFL+z;HjMBxRA1KP(gX=%4S_P#hy6*DR)XRDdU(ToxS>I}6j;rA%3}
    zzdSHj;v@?3N?*9B;(Ob4s%pZ3EMKH)-u*$EN3~i}2SD9|0qRWjFSydel`-6`qWs1o
    zfA}keM`HGrs2*@pBdxFrheN{T+kWcVG`dO3@kGmbE`2eZ%N2eaN2Kmo%0fjCYgLPb|AW_sRX6%bhm^YkLXl+)WtH^WkZIeDRD@
    zb{ByQuzzD9^Xg*}5q_58((=h`KA4kh{IKsl@BuamVts-Cggo)<`)$g_G+AU*0dt>^
    z#(M1Vho&a#*{=1HCOf5XC8)+x7`pZMK*NZz{C3iHlTKY^A>fgR&2S6;%B2uXN6vF1
    zc;j3~oCl{a#>M!V9Z`)gf8e`yYM=WffXbr|7O5`5p;qc-PylQZ
    z!-K>%uRXdHQ&RZkEINj`e5NnQuQ(f81U7K=ei%mIf@Fj;1NeYd&NX
    zW(-vUH*hqBTm#b!N}Lm66`ZUOA1nyD
    z_os%Xl>pxkLpxdEEEV5%gQTf;&bFKxbV~yRfwy!^B2=xBw-04f>5oGKd2u|BjBh|!
    z!9-O#Z|Is>!EXC1pGeas+_-jD@b6x-?j4FRw1~kD9k7Ze@-_`003jArr+*-c63&yQ
    zWpw|G5sWRr@{#pox64Q-D!E)t;q=CSnMqP*>?X~YqZshZ;m;k`+cBUo_Uz%9tT=2l
    z<6AhYDB4bUyRGK*R#3z%r0w40`p|ZW3a=xCU5%pv(zWoR26(ka`$F@
    zA$~=R1@C@OJ%rzI^avj(qYkVQ?!Ixb-4oRub{Q(IRCkZ?XWsKc`gD^c^ks`GxE{XM
    z3W19f+D7RhO=@psmZrIg=2iD>zp4K~C~Q#+19-*~FwSD%W8KB^`=D6~$-{ov
    zy2DJNlx+v9O+Y#Pm%7VvGD`Y&VqKyy*r;Q8uBKIJx)!9yMa!3HJ?X*>4AK3RJNj?O
    z+4|1JI`8P+;6DPqdZWGHoTiEA?@vw(xh?knY`?k@lpxJAX$R*;&4VJpK}0U<0%6wE
    zo{jjhV%Ohi8539e1~9sKabdSaTkO?w7zp@1MfpW5zm^IZXaV()25Ubc{}Fc7e`Fo<
    zKf<2)7SH&<%G$_~knlf3K9tD%U-**
    z|MzCZ5+2yUuzZc-zi@X=`hO&!_VoWjv(yz(j|AsvH%ktllxL%;rK9G;_>%?4Wkk5rym+{X}>9s{4>*Q
    zoDWj3cebx7oyg6ulwD2w>tIx>##>Ag(%OlPUe;-SyV%rV^XJR#g(x2SSXBJsIGCOM
    zm5GPvF_VG>sgb?ij}~*EX_771u>^8@{O%+&OIdE5hlr&DN=<0WjMtoLpG%2$LHFn=
    zJVCT!-I3;m)g)uwa*717?JMb$^6kLgg)d(V=*5=PCgMkV^jRt-YBw#{Y}(IC>ykOw
    z1;>Rala|SujYx~nWar{&)F72ED?*A>cVJX3#a=xNj>ozo)dpfSltkGJI|-nC*4;zy
    z3W$?L-%%F-L)=CapskK#m_=4_KvgwXjT~WrkVgD
    zjp}{OG@SaTO<$m`slD#KKw+MkjFzgHzQ7sfx$}qJDk1LpY(&M*NenPI6*7fKwg~B6
    z4=dDX?t{?{f~*BZBT5OQZT&eWH4~&{Ua}_`f7^z7KX>i5uidIlxGm=89r!TIy0p;r^{$H%5$qlFC6LZ
    zUqwti`qiD5{%CG$msj2a#&8yZ9ia=_g~m@=vj?pBYbXeS>i}a7d>pLADU^JN0N;`c
    z3@SmO-}h9*_hRo|#g^YvpT^!!+qCgmcR+23;6RW>t2a$IV)%>O9c)3{NwFAx|bR1H>Yx{9s}vv#Rf0>v;gV5y(BCYLF&5_Qm)Q
    z#3bcTu^R-ydfLO)I2sF*Gz_09$I$#r=h~f
    zms_ibizTWw6y!u^u8}iLxQDPZej}6fu_gmVr&FtJGbw)fO}zg;gBt&_PJbISmwk*R
    z{7RVdmdwyRjg+E4*tkj?-g_Xno!#PGd`DB-<^{+Ta8n>=Yn^7)Qr&Aod#5Zy0n#^F
    zuVM7f(yginngHt%|Dz9Kv)joFS#~WgLMLN77auFFLaA
    zY_T#8c%B7Sx<)XRC&GyPSgfM0b{nLso@#{$$RjhTtTW0uJ9y^fn+bAix
    z0+4I64e{X!oBADQRYf#?TiLV&>pGxO>Tlm1VHO66G;0?fZMMjTQS5mF%jZpO3?Wf~
    z6*L(CAp#*UN%|Lr#_xSIDCaaLk@fUC2!Ht@mJF|8eL*;5XBl(DGCUO)EOEML>2_#P
    z-Z0g0l5sU{m>}Rch&>qiP!+NwBcvj5M;laGm01Q^P^gn&W0%Nc0~>ZO0)sfl>Y}v=cPFNPuAV-j|7%dxyuFI1Kz8&9N8!B-XL?q5FJ?CK
    z19KT{t`DYu7lG#*0odXE`|)&H!@Rp)j-=UJQWZqUuzEM#&hSnOaLrW8|r4QcC@z&vPDD7-=V~E@jHS
    zWD&7I6+5Px^6%hZlTtcILt`vE%d8+)Hhq8|P-AdM{tVgBTZzT{vm+-TZp)Ch8%CML
    zAgh&)cyiYAl+=>P^=z=eMdd5~o^+N!b(R{$H$;uVJ2z9m)&{w=_sm+`Q(keP4Ny9KgPTGChR^^B7#(r7+@6P5#XasF
    zq?nvmG2%X`qh#c6VMqYfn!fP%GVn;HQ$r$6Lgrzx-nrd8{9R89Fyt52*pf>H^2uK(
    zHeex<0{x6+<1(k+J}%{~X1n?nwJNdR$Whm8l*_{naY!^I{^Q5*+k`N11r1O-Y8E4Z`cCvHD=>Ek;enE(SI++JmqSO*gu_53axRx&PG$
    z^O=F_y~WpO7)|_(Y&e$7XMheYIwU!+y{GL@i9
    z2lQyi5os~Z0LT9$31(V%`oS1*OqJQe;`OE8#&5hPI%03>A|YMIbVsWGrr$h%LlUor
    zVa@L8lM66n^IxZ6w9)ftr*mD*|AXA$zhR%Qzt@WJ`E0pb@s?upI~2oO6exQS*-4bI
    zoIW!9VH(@o2U#G`|LAGq#>6a9=TpjbU10RWH<21G@wIPV6}6+FW8&;4r#?956E0C@
    zbJ{kfS!1iM$uA{j+Ct!>U)33N;tY=lX5hDU{}BLcC`Y$=uPauk9q36-j>SF%EuU+!
    zs+v-Jgq4R}?<_C#oZ#xG>*tZ?ZP9Zb+C8_?vet6304<@!aqrzD^Z9)W#>ILCKF2vX
    zi0)RUX`r{YI~M$NrRq7?IrsbI6D;O$v+yeK8G()O+8!4!d`=waJ2__Hb9Tvnbn8G+
    zY7k&Gh~q2wS1pG{Yv=SE2GutL5YW%hl_tP`lO6HPAom~-BqnD358Ze}3^_<7_&SJ<
    z^-2e5s1YV+L`%eYlCZL44C}71gp~Z1XakLqCXXSM;a3OGHXnb2mwAocE+t~
    z25gAC1?2`N6x?JUosXXPg?x8CA0At9Gw|T3oFU#%sUe=c?kY~_jp0>vz5o0i&I$nh
    zjX5&HN^nC8#f1W5HP#I%W#P%7*QvzbD|!~o+$vFT87d$SP-8NCS|YH@x$^7x2H5a9
    zFzP0y1WDU)4OAxf)bf5F6ynAufd86^*(Uh#ZqsxLf!hdsrFPsdIQWZ!Q5vB(Ply&<
    z^_aC{V!ix=HC!YzOmxrwp!ZO)y$4_lEbfg#S;0@)|5mUV0(85j7zYKnmNkzUz9dfj
    zCrvfG2K-4yu=uw->xQ7{P#`vzEtv}@gcHdjr5fsuWYPjXqENt22`mGZMxHU};_bG2
    zpT`jA_OVn7)+sxBspD0m?nykPd7?qpQ-r>&W!4%NlaE+cRB(iYP=kW*U0oKuH=5=(^f3$Zt
    zZ-KNR+b(;*r=!O?;AlQTN)iyhM#Yg#6|tux@VQE9#5dwKPFz8fU#oE=^Y-h&6P?&S
    zfhV|Q-DV!N(;mm-_4~oQF1y~O|8kR6-QG--rK>cpM|34_3UwM9v23dP<1Xd&9m91H
    zISkgbMN!59j`SB8QwIyZGxr2-shqIU-0f!JJiEUJx*

    aC9ng*F0bh>zH+7D_+(c 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 delta 32156 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 u*!VIK=eR>}m=|GWlZydXpnT&!Q#0sViWe?qnZ diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameter.html b/prs/8803/lib/diameter-2.4/doc/html/diameter.html index b4809bda67574..58de0773fef95 100644 --- a/prs/8803/lib/diameter-2.4/doc/html/diameter.html +++ b/prs/8803/lib/diameter-2.4/doc/html/diameter.html @@ -229,14 +229,14 @@

    containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is selected if the CER/CEA received from the peer offers it.

  • {'Acct-Application-Id', [Unsigned32()]}

  • {'Vendor-Specific-Application-Id', [Grouped()]}

  • {'Firmware-Revision',Unsigned32()}

  • Note that each tuple communicates one or more AVP values. It is an error to specify duplicate tuples.

  • eval() = {M,F,A} | fun() | [eval() | A] - An expression that can be -evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    -    apply(M, F, T ++ A);
    -eval([[F|A] | T]) ->
    -    eval([F | T ++ A]);
    -eval([F|A]) ->
    -    apply(F, A);
    -eval(F) ->
    -    eval([F]).

    Applying an eval() E to an argument list A is meant +evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    +    apply(M, F, T ++ A);
    +eval([[F|A] | T]) ->
    +    eval([F | T ++ A]);
    +eval([F|A]) ->
    +    apply(F, A);
    +eval(F) ->
    +    eval([F]).

    Applying an eval() E to an argument list A is meant in the sense of eval([E|A]).

    Warning

    Beware of using fun expressions of the form fun Name/Arity in situations in which the fun is not short-lived and code is to be upgraded at runtime since any processes retaining such a fun will have a reference to old code. @@ -279,10 +279,10 @@

    service_event() record. Can have one of the following types.

    • start

    • stop - The service is being started or stopped. No event precedes a start event. No event follows a stop event, and this event implies the -termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      -Peer   = diameter_app:peer()
      -Config = {connect|listen, [transport_opt()]}
      -Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of +termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      +Peer   = diameter_app:peer()
      +Config = {connect|listen, [transport_opt()]}
      +Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of (down) the OKAY state. If a #diameter_packet{} is present in an up event then there has been a capabilities exchange on a newly established transport connection and the record contains the received CER or CEA.

      Note that a single up or down event for a given peer corresponds to @@ -308,20 +308,20 @@

      Pkt = #diameter_packet{}

  • An incoming CER contained errors and has been answered with the indicated result code. Caps contains values for the local node only. Pkt contains the CER in question.

  • {'CER', timeout} - An expected CER was not received within -capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    -Caps = #diameter_caps{}
    -Pkt  = #diameter_packet{}
    -ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An +capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    +Caps = #diameter_caps{}
    +Pkt  = #diameter_packet{}
    +ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An integer-valued Result indicates the result code sent by the peer. Caps contains pairs of values for the local node and remote peer. Pkt contains the CEA in question. In the case of rejection by a capabilities callback, the tuple contains the rejecting callback.

  • {'CEA', Caps, Pkt}

    Caps = #diameter_caps{}
     Pkt  = #diameter_packet{}

    An incoming CEA contained errors and has been rejected. Caps contains only values for the local node. Pkt contains the CEA in question.

  • {'CEA', timeout} - An expected CEA was not received within -capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    -PeerRef = diameter_app:peer_ref()
    +capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    +PeerRef = diameter_app:peer_ref()
     From, To = initial | okay | suspect | down | reopen
    -Config = {connect|listen, [transport_opt()]}

    An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared +Config = {connect|listen, [transport_opt()]}

  • An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared to receive info fields of forms other than the above.

  • service_name() = term() - Name of a service as passed to start_service/2 and with which the service is identified. There can be at most one service with a given name on a given node. Note that @@ -569,10 +569,10 @@

    which a started transport process should be terminated if it has not yet established a connection. For example, the following options on a connecting transport request a connection with one peer over SCTP or another (typically -the same) over TCP.

    {transport_module, diameter_sctp}
    -{transport_config, SctpOpts, 5000}
    -{transport_module, diameter_tcp}
    -{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing +the same) over TCP.

    {transport_module, diameter_sctp}
    +{transport_config, SctpOpts, 5000}
    +{transport_module, diameter_tcp}
    +{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing a transport process as defined in diameter_transport. Defaults to diameter_tcp.

    Multiple transport_module and transport_config options are allowed. The @@ -2597,13 +2597,13 @@

    remove_transport(SvcName, Pred)

    Remove previously added transports.

    Pred determines which transports to remove. An arity-3-valued Pred removes all transports for which Pred(Ref, Type, Opts) returns true, where Type and Opts are as passed to add_transport/2 and Ref is as returned by it. -The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    -Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    -Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    -Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    -Pred = true:                          fun(_, _, _) -> true end
    -Pred = false:                         fun(_, _, _) -> false end
    -Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be +The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    +Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    +Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    +Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    +Pred = true:                          fun(_, _, _) -> true end
    +Pred = false:                         fun(_, _, _) -> false end
    +Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be terminated. Whether or not a DPR message is sent to a peer is controlled by value of disconnect_cb configured on the transport.

    @@ -2647,52 +2647,52 @@

    service_info(SvcName, Option)

    containing both configuration and information about established peer connections. An example return value with for a client service with Origin-Host "client.example.com" configured with a single transport connected -to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    -  {type,connect},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{ip,{127,0,0,1}},
    -                               {raddr,{127,0,0,1}},
    -                               {rport,3868},
    -                               {reuseaddr,true}]}]},
    -  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    -  {peer,{<0.67.0>,-576460736357885808}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{0,193}},
    -         {product_name,{"Client","Server"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[0]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.69.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},48758}},
    -         {peer,{{127,0,0,1},3868}},
    -         {statistics,[{recv_oct,656},
    -                      {recv_cnt,6},
    -                      {recv_max,148},
    -                      {recv_avg,109},
    -                      {recv_dvi,19},
    -                      {send_oct,836},
    -                      {send_cnt,6},
    -                      {send_max,184},
    -                      {send_avg,139},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,258,0},recv},3},
    -               {{{0,258,1},send},3},
    -               {{{0,258,0},recv,{'Result-Code',2001}},3},
    -               {{{0,257,0},recv},1},
    -               {{{0,257,1},send},1},
    -               {{{0,257,0},recv,{'Result-Code',2001}},1},
    -               {{{0,280,1},recv},2},
    -               {{{0,280,0},send},2},
    -               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options +to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    +  {type,connect},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{ip,{127,0,0,1}},
    +                               {raddr,{127,0,0,1}},
    +                               {rport,3868},
    +                               {reuseaddr,true}]}]},
    +  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    +  {peer,{<0.67.0>,-576460736357885808}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{0,193}},
    +         {product_name,{"Client","Server"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[0]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.69.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},48758}},
    +         {peer,{{127,0,0,1},3868}},
    +         {statistics,[{recv_oct,656},
    +                      {recv_cnt,6},
    +                      {recv_max,148},
    +                      {recv_avg,109},
    +                      {recv_dvi,19},
    +                      {send_oct,836},
    +                      {send_cnt,6},
    +                      {send_max,184},
    +                      {send_avg,139},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,258,0},recv},3},
    +               {{{0,258,1},send},3},
    +               {{{0,258,0},recv,{'Result-Code',2001}},3},
    +               {{{0,257,0},recv},1},
    +               {{{0,257,1},send},1},
    +               {{{0,257,0},recv,{'Result-Code',2001}},1},
    +               {{{0,280,1},recv},2},
    +               {{{0,280,0},send},2},
    +               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options the corresponding transport_opt() list passed to add_transport/2. The watchdog entry shows the state of a connection's RFC 3539 watchdog state machine. The peer entry identifies the @@ -2711,55 +2711,55 @@

    service_info(SvcName, Option)

    transport configuration.

    A listening transport presents its information slightly differently since there may be multiple accepted connections for the same transport_ref(). The transport info returned -by a server with a single client connection might look as follows.

    [[{ref,#Ref<0.0.0.61>},
    -  {type,listen},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{reuseaddr,true},
    -                               {ip,{127,0,0,1}},
    -                               {port,3868}]}]},
    -  {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},
    -            {peer,{<0.58.0>,-576460638229179167}},
    -            {apps,[{0,common}]},
    -            {caps,[{origin_host,{"server.example.com","client.example.com"}},
    -                   {origin_realm,{"example.com","example.com"}},
    -                   {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -                   {vendor_id,{193,0}},
    -                   {product_name,{"Server","Client"}},
    -                   {origin_state_id,{[],[]}},
    -                   {supported_vendor_id,{[],[]}},
    -                   {auth_application_id,{[0],[0]}},
    -                   {inband_security_id,{[],[]}},
    -                   {acct_application_id,{[],[]}},
    -                   {vendor_specific_application_id,{[],[]}},
    -                   {firmware_revision,{[],[]}},
    -                   {avp,{[],[]}}]},
    -            {port,[{owner,<0.62.0>},
    -                   {module,diameter_tcp},
    -                   {socket,{{127,0,0,1},3868}},
    -                   {peer,{{127,0,0,1},48758}},
    -                   {statistics,[{recv_oct,1576},
    -                                {recv_cnt,16},
    -                                {recv_max,184},
    -                                {recv_avg,98},
    -                                {recv_dvi,26},
    -                                {send_oct,1396},
    -                                {send_cnt,16},
    -                                {send_max,148},
    -                                {send_avg,87},
    -                                {send_pend,0}]}]}],
    -           [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},
    -  {statistics,[{{{0,280,0},recv},7},
    -               {{{0,280,1},send},7},
    -               {{{0,280,0},recv,{'Result-Code',2001}},7},
    -               {{{0,258,1},recv},3},
    -               {{{0,258,0},send},3},
    -               {{{0,258,0},send,{'Result-Code',2001}},3},
    -               {{{0,280,1},recv},5},
    -               {{{0,280,0},send},5},
    -               {{{0,280,0},send,{'Result-Code',2001}},5},
    -               {{{0,257,1},recv},1},
    -               {{{0,257,0},send},1},
    -               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    The information presented here is as in the connect case except that the +by a server with a single client connection might look as follows.

    [[{ref,#Ref<0.0.0.61>},
    +  {type,listen},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{reuseaddr,true},
    +                               {ip,{127,0,0,1}},
    +                               {port,3868}]}]},
    +  {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},
    +            {peer,{<0.58.0>,-576460638229179167}},
    +            {apps,[{0,common}]},
    +            {caps,[{origin_host,{"server.example.com","client.example.com"}},
    +                   {origin_realm,{"example.com","example.com"}},
    +                   {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +                   {vendor_id,{193,0}},
    +                   {product_name,{"Server","Client"}},
    +                   {origin_state_id,{[],[]}},
    +                   {supported_vendor_id,{[],[]}},
    +                   {auth_application_id,{[0],[0]}},
    +                   {inband_security_id,{[],[]}},
    +                   {acct_application_id,{[],[]}},
    +                   {vendor_specific_application_id,{[],[]}},
    +                   {firmware_revision,{[],[]}},
    +                   {avp,{[],[]}}]},
    +            {port,[{owner,<0.62.0>},
    +                   {module,diameter_tcp},
    +                   {socket,{{127,0,0,1},3868}},
    +                   {peer,{{127,0,0,1},48758}},
    +                   {statistics,[{recv_oct,1576},
    +                                {recv_cnt,16},
    +                                {recv_max,184},
    +                                {recv_avg,98},
    +                                {recv_dvi,26},
    +                                {send_oct,1396},
    +                                {send_cnt,16},
    +                                {send_max,148},
    +                                {send_avg,87},
    +                                {send_pend,0}]}]}],
    +           [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},
    +  {statistics,[{{{0,280,0},recv},7},
    +               {{{0,280,1},send},7},
    +               {{{0,280,0},recv,{'Result-Code',2001}},7},
    +               {{{0,258,1},recv},3},
    +               {{{0,258,0},send},3},
    +               {{{0,258,0},send,{'Result-Code',2001}},3},
    +               {{{0,280,1},recv},5},
    +               {{{0,280,0},send},5},
    +               {{{0,280,0},send,{'Result-Code',2001}},5},
    +               {{{0,257,1},recv},1},
    +               {{{0,257,0},send},1},
    +               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    The information presented here is as in the connect case except that the client connections are grouped under an accept tuple.

    Whether or not the transport_opt() pool_size has been configured affects the format of the listing in the case of a connecting transport, since a value greater than 1 implies multiple transport @@ -2770,54 +2770,54 @@

    service_info(SvcName, Option)

    This is a flat view of transport info which lists only active connections and for which Diameter-level statistics are accumulated only for the lifetime of the transport connection. A return value for the server above might look as -follows.

    [[{ref,#Ref<0.0.0.61>},
    -  {type,accept},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{reuseaddr,true},
    -                               {ip,{127,0,0,1}},
    -                               {port,3868}]}]},
    -  {watchdog,{<0.56.0>,-576460739249514012,okay}},
    -  {peer,{<0.58.0>,-576460638229179167}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"server.example.com","client.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{193,0}},
    -         {product_name,{"Server","Client"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.62.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},3868}},
    -         {peer,{{127,0,0,1},48758}},
    -         {statistics,[{recv_oct,10124},
    -                      {recv_cnt,132},
    -                      {recv_max,184},
    -                      {recv_avg,76},
    -                      {recv_dvi,9},
    -                      {send_oct,10016},
    -                      {send_cnt,132},
    -                      {send_max,148},
    -                      {send_avg,75},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,280,0},recv},62},
    -               {{{0,280,1},send},62},
    -               {{{0,280,0},recv,{'Result-Code',2001}},62},
    -               {{{0,258,1},recv},3},
    -               {{{0,258,0},send},3},
    -               {{{0,258,0},send,{'Result-Code',2001}},3},
    -               {{{0,280,1},recv},66},
    -               {{{0,280,0},send},66},
    -               {{{0,280,0},send,{'Result-Code',2001}},66},
    -               {{{0,257,1},recv},1},
    -               {{{0,257,0},send},1},
    -               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    Note that there may be multiple entries with the same ref, in contrast to +follows.

    [[{ref,#Ref<0.0.0.61>},
    +  {type,accept},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{reuseaddr,true},
    +                               {ip,{127,0,0,1}},
    +                               {port,3868}]}]},
    +  {watchdog,{<0.56.0>,-576460739249514012,okay}},
    +  {peer,{<0.58.0>,-576460638229179167}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"server.example.com","client.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{193,0}},
    +         {product_name,{"Server","Client"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.62.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},3868}},
    +         {peer,{{127,0,0,1},48758}},
    +         {statistics,[{recv_oct,10124},
    +                      {recv_cnt,132},
    +                      {recv_max,184},
    +                      {recv_avg,76},
    +                      {recv_dvi,9},
    +                      {send_oct,10016},
    +                      {send_cnt,132},
    +                      {send_max,148},
    +                      {send_avg,75},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,280,0},recv},62},
    +               {{{0,280,1},send},62},
    +               {{{0,280,0},recv,{'Result-Code',2001}},62},
    +               {{{0,258,1},recv},3},
    +               {{{0,258,0},send},3},
    +               {{{0,258,0},send,{'Result-Code',2001}},3},
    +               {{{0,280,1},recv},66},
    +               {{{0,280,0},send},66},
    +               {{{0,280,0},send,{'Result-Code',2001}},66},
    +               {{{0,257,1},recv},1},
    +               {{{0,257,0},send},1},
    +               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    Note that there may be multiple entries with the same ref, in contrast to transport info.

  • statistics - Return a {{Counter, Ref}, non_neg_integer()} list of counter values. Ref can be either a transport_ref() or a @@ -2829,12 +2829,12 @@

    service_info(SvcName, Option)

    configuration associated with a single peer, as passed to add_transport/2. The returned list is empty if the peer is unknown. Otherwise it contains the ref, type and options tuples as in transport and connections info -above. For example:

    [{ref,#Ref<0.0.0.61>},
    - {type,accept},
    - {options,[{transport_module,diameter_tcp},
    -           {transport_config,[{reuseaddr,true},
    -                              {ip,{127,0,0,1}},
    -                              {port,3868}]}]}]
  • +above. For example:

    [{ref,#Ref<0.0.0.61>},
    + {type,accept},
    + {options,[{transport_module,diameter_tcp},
    +           {transport_config,[{reuseaddr,true},
    +                              {ip,{127,0,0,1}},
    +                              {port,3868}]}]}]
    diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameter_app.html b/prs/8803/lib/diameter-2.4/doc/html/diameter_app.html index c706374d337a8..8d192dfc2a4a8 100644 --- a/prs/8803/lib/diameter-2.4/doc/html/diameter_app.html +++ b/prs/8803/lib/diameter-2.4/doc/html/diameter_app.html @@ -719,12 +719,12 @@

    handle_request(Packet, SvcName, Peer)

    diameter:start_service/2) is determined by the Application Identifier in the header of the incoming request message, the selected module being the one whose corresponding dictionary declares itself as defining either the application in -question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    -                 avps   = [#diameter_avp{}],
    -                 msg    = record() | undefined,
    -                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    -                 bin    = binary(),
    -                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the +question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    +                 avps   = [#diameter_avp{}],
    +                 msg    = record() | undefined,
    +                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    +                 bin    = binary(),
    +                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the relay application. Otherwise it contains the record representing the request as outlined in diameter_dict(4).

    The errors field specifies any results codes identifying errors found while decoding the request. This is used to set Result-Code and/or Failed-AVP in a diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameter_codec.html b/prs/8803/lib/diameter-2.4/doc/html/diameter_codec.html index 43ef5f01ae216..2a1beca9640b8 100644 --- a/prs/8803/lib/diameter-2.4/doc/html/diameter_codec.html +++ b/prs/8803/lib/diameter-2.4/doc/html/diameter_codec.html @@ -139,7 +139,7 @@

    results may differ from those returned by the functions documented here, depending on configuration.

    The header() and packet() records below are defined in diameter.hrl, -which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from +which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from dictionary file compilation.

    diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameter_dict.html b/prs/8803/lib/diameter-2.4/doc/html/diameter_dict.html index 76c8eaadbe84b..ed430b3935047 100644 --- a/prs/8803/lib/diameter-2.4/doc/html/diameter_dict.html +++ b/prs/8803/lib/diameter-2.4/doc/html/diameter_dict.html @@ -309,14 +309,14 @@

    an incoming request.

    In cases in which there is a choice between string() and binary() types for OctetString() and derived types, the representation is determined by the value of diameter:service_opt() -string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    -Integer32()   = -2147483647..2147483647
    -Integer64()   = -9223372036854775807..9223372036854775807
    -Unsigned32()  = 0..4294967295
    -Unsigned64()  = 0..18446744073709551615
    -Float32()     = '-infinity' | float() | infinity
    -Float64()     = '-infinity' | float() | infinity
    -Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large +string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    +Integer32()   = -2147483647..2147483647
    +Integer64()   = -9223372036854775807..9223372036854775807
    +Unsigned32()  = 0..4294967295
    +Unsigned64()  = 0..18446744073709551615
    +Float32()     = '-infinity' | float() | infinity
    +Float64()     = '-infinity' | float() | infinity
    +Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large floats (in absolute value) are equivalent to infinity or '-infinity' and excessively large integers result in encode failure. The records for grouped AVPs are as discussed in the previous section.

    Derived AVP Data Formats

    Address() = OctetString()
    @@ -324,14 +324,14 @@ 

    while an IPv6 address is parsed in any of the formats specified by section 2.2 of RFC 2373, "Text Representation of Addresses". An IPv4 tuple() has length 4 and contains values of type 0..255. An IPv6 tuple() has length 8 and contains -values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
    +values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
     
     where
     
    -  date() = {Year, Month, Day}
    -  time() = {Hour, Minute, Second}
    +  date() = {Year, Month, Day}
    +  time() = {Hour, Minute, Second}
     
    -  Year   = integer()
    +  Year   = integer()
       Month  = 1..12
       Day    = 1..31
       Hour   = 0..23
    @@ -359,8 +359,8 @@ 

    diameter respectively. The grammar of an OctetString-valued DiameterURI() is as specified in section 4.3 of RFC 6733. The record representation is used on decode.

    Enumerated() = Integer32()

    On encode, values can be specified using the macros defined in a dictionary's -hrl file.

    IPFilterRule()  = OctetString()
    -QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    +hrl file.

    IPFilterRule()  = OctetString()
    +QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    diff --git a/prs/8803/lib/diameter-2.4/doc/html/diameterc_cmd.html b/prs/8803/lib/diameter-2.4/doc/html/diameterc_cmd.html index d1a3807666a2b..3a8f23d812352 100644 --- a/prs/8803/lib/diameter-2.4/doc/html/diameterc_cmd.html +++ b/prs/8803/lib/diameter-2.4/doc/html/diameterc_cmd.html @@ -131,7 +131,7 @@

    Synopsis

    -
    diameterc [<options>] <file>

    +
    diameterc [<options>] <file>

    diff --git a/prs/8803/lib/edoc-1.3.1/doc/html/edoc_doclet_markdown.html b/prs/8803/lib/edoc-1.3.1/doc/html/edoc_doclet_markdown.html index 82749c42b0c22..a43de1ae77ac2 100644 --- a/prs/8803/lib/edoc-1.3.1/doc/html/edoc_doclet_markdown.html +++ b/prs/8803/lib/edoc-1.3.1/doc/html/edoc_doclet_markdown.html @@ -128,8 +128,8 @@

    -

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    -       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    +

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    +       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    diff --git a/prs/8803/lib/eldap-1.2.13/doc/html/eldap.epub b/prs/8803/lib/eldap-1.2.13/doc/html/eldap.epub index fa5e55667bbfea8e0f389803cc39e59c7ab915c3..ee4b0e362c34d6a0b11c1ad128ade59adb8e96b9 100644 GIT binary patch delta 8221 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 delta 8224 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 diff --git a/prs/8803/lib/eldap-1.2.13/doc/html/eldap.html b/prs/8803/lib/eldap-1.2.13/doc/html/eldap.html index 21c0fa381e18c..091c715c9947d 100644 --- a/prs/8803/lib/eldap-1.2.13/doc/html/eldap.html +++ b/prs/8803/lib/eldap-1.2.13/doc/html/eldap.html @@ -977,13 +977,13 @@

    add(Handle, Dn, Attributes)

    -

    Add an entry. The entry must not exist.

      add(Handle,
    +

    Add an entry. The entry must not exist.

      add(Handle,
           "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -       [{"objectclass", ["person"]},
    -        {"cn", ["Bill Valentine"]},
    -        {"sn", ["Valentine"]},
    -        {"telephoneNumber", ["545 555 00"]}]
    -     )
    +
    [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
    @@ -1295,7 +1295,7 @@

    extensibleMatch(MatchValue, OptionalAttrs)< -

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and +

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

    @@ -1513,9 +1513,9 @@

    modify(Handle, Dn, ModifyOps)

    -

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    +

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    @@ -1836,8 +1836,8 @@

    paged_result_control(PageSize)

    paged_result_control(PageSize) -> {control, "1.2.840.113556.1.4.319", true, binary()}

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size for use in -search/3, for example:

    Control = eldap:paged_result_control(50),
    -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    +search/3, for example:

    Control = eldap:paged_result_control(50),
    +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    @@ -1871,12 +1871,12 @@

    paged_result_control(PageSize, Cookie)

    paged_result_control(PageSize, Cookie) -> {control, "1.2.840.113556.1.4.319", true, binary()}

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

    For example:

    PageSize = 50,
    -Control1 = eldap:paged_result_control(PageSize),
    -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
    +Control1 = eldap:paged_result_control(PageSize),
    +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
     %% retrieve the returned cookie from the search results
    -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    -Control2 = eldap:paged_result_control(PageSize, Cookie1),
    -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
    +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    +Control2 = eldap:paged_result_control(PageSize, Cookie1),
    +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
     %% etc
    @@ -1996,8 +1996,8 @@

    search(Handle, SearchOptions)

    Search the directory with the supplied the SearchOptions.

    The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

    diff --git a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei.html b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei.html index 98d77adb039e5..8e1f0c2e10bf8 100644 --- a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei.html +++ b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei.html @@ -151,30 +151,30 @@

    Data Types

    -
    • ei_term

      typedef struct {
      +
      • ei_term

        typedef struct {
             char ei_type;
             int arity;
             int size;
        -    union {
        +    union {
           long i_val;
           double d_val;
        -  char atom_name[MAXATOMLEN_UTF8];
        +  char atom_name[MAXATOMLEN_UTF8];
           erlang_pid pid;
           erlang_port port;
           erlang_ref ref;
        -    } value;
        -} ei_term;

        Structure written by ei_decode_ei_term(). The + } value; +} ei_term;

      Structure written by ei_decode_ei_term(). The ei_type field is the type of the term which equals to what ei_get_type() sets *type to.

    • ei_x_buff - A dynamically resized buffer. It is a struct with two fields of interest for the user:

      • char *buff - Pointer to the dynamically allocated buffer.

      • int index - Offset to the next byte to write which also equals the amount of bytes currently written.

      An ei_x_buff is initialized by calling either ei_x_new() or ei_x_new_with_version(). The memory used by an initialized ei_x_buff is released by calling -ei_x_free().

    • erlang_char_encoding

      typedef enum {
      +ei_x_free().

    • erlang_char_encoding

      typedef enum {
           ERLANG_ASCII = 1,
           ERLANG_LATIN1 = 2,
           ERLANG_UTF8 = 4
      -} erlang_char_encoding;

      The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. +} erlang_char_encoding;

    The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. Latin-1 and UTF-8 are different extensions of 7-bit ASCII. All 7-bit ASCII characters are valid Latin-1 and UTF-8 characters. ASCII and Latin-1 both represent each character by one byte. An UTF-8 character can consist of 1-4 @@ -190,7 +190,7 @@

    ei_cmp_pids()

    -
    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -199,7 +199,7 @@

    ei_cmp_ports()

    -
    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -208,7 +208,7 @@

    ei_cmp_refs()

    -
    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a +

    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -216,15 +216,15 @@

    ei_decode_atom()

    -
    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed at p. At most MAXATOMLEN bytes can be placed in the buffer.

    ei_decode_atom_as()

    -
    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    -  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    +  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed in buffer at p of length plen bytes.

    The wanted string encoding is specified by want. The original encoding used in the binary format (Latin-1 or UTF-8) can be obtained from *was. The encoding of the resulting string (7-bit ASCII, @@ -239,7 +239,7 @@

    ei_decode_bignum()

    -
    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this +

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this function, the ei library must be configured and compiled to use the GMP library.

    @@ -247,7 +247,7 @@

    ei_decode_binary()

    -
    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual +

    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual size of the binary. Notice that ei_decode_binary() assumes that there is enough room for the binary. The size required can be fetched by ei_get_type().

    @@ -256,8 +256,8 @@

    ei_decode_bitstring()

    -
    int ei_decode_bitstring(const char *buf, int *index, const char **pp,
    -  unsigned int *bitoffsp, size_t *nbitsp);

    Decodes a bit string from the binary format.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +

      int ei_decode_bitstring(const char *buf, int *index, const char **pp,
      +  unsigned int *bitoffsp, size_t *nbitsp);

      Decodes a bit string from the binary format.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -273,14 +273,14 @@

        ei_decode_boolean()

        -
        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, true decodes 1 and false decodes 0.

        ei_decode_char()

        -
        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C compilers and system can define char to be signed.

        @@ -289,14 +289,14 @@

        ei_decode_double()

        -
        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary format.

        ei_decode_ei_term()

        -
        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is @@ -314,7 +314,7 @@

        free_fun()

        -
        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a @@ -324,7 +324,7 @@

        ei_decode_iodata()

        -
        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -345,7 +345,7 @@

        ei_decode_list_header()

        -
        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use @@ -355,21 +355,21 @@

        ei_decode_long()

        -
        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        -
        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the binary format.

        ei_decode_map_header()

        -
        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity is zero, it is an empty map. A correctly encoded map does not have duplicate @@ -379,25 +379,25 @@

        ei_decode_pid()

        -
        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        +
        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        -
        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        +
        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        -
        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        +
        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        -
        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of +

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of integers between 0 and 255. Notice that as the string is just a list, sometimes lists are encoded as strings by term_to_binary/1, even if it was not intended.

        The string is copied to p, and enough space must be allocated. The returned @@ -408,34 +408,34 @@

        ei_decode_trace()

        -
        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        +
        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        -
        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple +

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple elements follow in order in the buffer.

        ei_decode_ulong()

        -
        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, +

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        -
        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) integer from the binary format.

        ei_decode_version()

        -
        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be +

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be the first token in a binary term.

        @@ -460,7 +460,7 @@

        ei_x_encode_atom_len()

        -
        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in +

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in Latin-1 encoding. Only up to MAXATOMLEN-1 bytes are encoded. The name is to be NULL-terminated, except for the ei_x_encode_atom_len() function.

        @@ -486,11 +486,11 @@

        ei_x_encode_atom_len_as()

        -
        int ei_encode_atom_as(char *buf, int *index, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with +

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with character encoding from_enc (ASCII, Latin-1, or UTF-8). The name must either be NULL-terminated or a function variant with a len parameter must be used.

        The encoding fails if p is not a valid string in encoding from_enc.

        Argument to_enc is ignored. As from Erlang/OTP 20 the encoding is always done @@ -506,7 +506,7 @@

        ei_x_encode_bignum()

        -
        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei +

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei library must be configured and compiled to use the GMP library.

        @@ -519,7 +519,7 @@

        ei_x_encode_binary()

        -
        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes +

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes length.

        @@ -532,7 +532,7 @@

        ei_x_encode_bitstring()

        -
        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first +

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first bitoffs bits of the data at p are unused. The first byte which is part of the bit string is p[bitoffs/8]. The bitoffs%8 most significant bits of the first byte p[bitoffs/8] are unused.

        The number of bytes which is part of the bit string is @@ -550,7 +550,7 @@

        ei_x_encode_boolean()

        -
        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p +

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p is zero.

        @@ -563,7 +563,7 @@

        ei_x_encode_char()

        -
        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For +

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For historical reasons the integer argument is of type char. Your C code is to consider the specified argument to be of type unsigned char even if the C compilers and system may define char to be signed.

        @@ -578,7 +578,7 @@

        ei_x_encode_double()

        -
        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        +
        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        @@ -590,7 +590,7 @@

        ei_x_encode_empty_list()

        -
        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        +
        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        @@ -602,7 +602,7 @@

        ei_x_encode_fun()

        -
        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun +

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun structure. The erlang_fun is not freed automatically, the free_fun is to be called if the fun is not needed after encoding.

        @@ -616,23 +616,23 @@

        ei_x_encode_list_header()

        -
        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the +

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the elements (actually its arity cons cells) and the tail of the list. Lists and tuples are encoded recursively, so that a list can contain another list or -tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        -ei_encode_atom(buf, &i, "c");
        -ei_encode_atom(buf, &i, "d");
        -ei_encode_list_header(buf, &i, 1);
        -ei_encode_atom(buf, &i, "e");
        -ei_encode_atom(buf, &i, "f");
        -ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number +tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        +ei_encode_atom(buf, &i, "c");
        +ei_encode_atom(buf, &i, "d");
        +ei_encode_list_header(buf, &i, 1);
        +ei_encode_atom(buf, &i, "e");
        +ei_encode_atom(buf, &i, "f");
        +ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number of elements in advance. But indeed there is a way. Notice that the list [a, b, c] can be written as [a | [b | [c]]]. Using this, a list can be -written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        -    ei_x_encode_list_header(&x, 1);
        -    ei_x_encode_ulong(&x, i); /* just an example */
        -}
        -ei_x_encode_empty_list(&x);

        +written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        +    ei_x_encode_list_header(&x, 1);
        +    ei_x_encode_ulong(&x, i); /* just an example */
        +}
        +ei_x_encode_empty_list(&x);

        @@ -644,7 +644,7 @@

        ei_x_encode_long()

        -
        int ei_encode_long(char *buf, int *index, long p);
        int ei_x_encode_long(ei_x_buff* x, long p);

        Encodes a long integer in the binary format. If the code is 64 bits, the +

        int ei_encode_long(char *buf, int *index, long p);
        int ei_x_encode_long(ei_x_buff* x, long p);

        Encodes a long integer in the binary format. If the code is 64 bits, the function ei_encode_long() is the same as ei_encode_longlong().

        @@ -657,7 +657,7 @@

        ei_x_encode_longlong()

        -
        int ei_encode_longlong(char *buf, int *index, long long p);
        int ei_x_encode_longlong(ei_x_buff* x, long long p);

        Encodes a GCC long long or Visual C++ __int64 (64-bit) integer in the binary +

        int ei_encode_longlong(char *buf, int *index, long long p);
        int ei_x_encode_longlong(ei_x_buff* x, long long p);

        Encodes a GCC long long or Visual C++ __int64 (64-bit) integer in the binary format.

        @@ -670,13 +670,13 @@

        ei_x_encode_map_header()

        -
        int ei_encode_map_header(char *buf, int *index, int arity);
        int ei_x_encode_map_header(ei_x_buff* x, int arity);

        Encodes a map header, with a specified arity. The next arity*2 terms encoded +

        int ei_encode_map_header(char *buf, int *index, int arity);
        int ei_x_encode_map_header(ei_x_buff* x, int arity);

        Encodes a map header, with a specified arity. The next arity*2 terms encoded will be the keys and values of the map encoded in the following order: -K1, V1, K2, V2, ..., Kn, Vn.

        For example, to encode the map #{a => "Apple", b => "Banana"}:

        ei_x_encode_map_header(&x, 2);
        -ei_x_encode_atom(&x, "a");
        -ei_x_encode_string(&x, "Apple");
        -ei_x_encode_atom(&x, "b");
        -ei_x_encode_string(&x, "Banana");

        A correctly encoded map cannot have duplicate keys.

        Available since OTP 17.0

        +K1, V1, K2, V2, ..., Kn, Vn.

        For example, to encode the map #{a => "Apple", b => "Banana"}:

        ei_x_encode_map_header(&x, 2);
        +ei_x_encode_atom(&x, "a");
        +ei_x_encode_string(&x, "Apple");
        +ei_x_encode_atom(&x, "b");
        +ei_x_encode_string(&x, "Banana");

        A correctly encoded map cannot have duplicate keys.

        Available since OTP 17.0

        @@ -688,7 +688,7 @@

        ei_x_encode_pid()

        -
        int ei_encode_pid(char *buf, int *index, const erlang_pid *p);
        int ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p);

        Encodes an Erlang process identifier (pid) in the binary format. Parameter p +

        int ei_encode_pid(char *buf, int *index, const erlang_pid *p);
        int ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p);

        Encodes an Erlang process identifier (pid) in the binary format. Parameter p points to an erlang_pid structure which should either have been obtained earlier with ei_decode_pid(), ei_self() or created by @@ -704,7 +704,7 @@

        ei_x_encode_port()

        -
        int ei_encode_port(char *buf, int *index, const erlang_port *p);
        int ei_x_encode_port(ei_x_buff* x, const erlang_port *p);

        Encodes an Erlang port in the binary format. Parameter p points to an +

        int ei_encode_port(char *buf, int *index, const erlang_port *p);
        int ei_x_encode_port(ei_x_buff* x, const erlang_port *p);

        Encodes an Erlang port in the binary format. Parameter p points to an erlang_port structure which should have been obtained earlier with ei_decode_port(),

        @@ -718,7 +718,7 @@

        ei_x_encode_ref()

        -
        int ei_encode_ref(char *buf, int *index, const erlang_ref *p);
        int ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p);

        Encodes an Erlang reference in the binary format. Parameter p points to an +

        int ei_encode_ref(char *buf, int *index, const erlang_ref *p);
        int ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p);

        Encodes an Erlang reference in the binary format. Parameter p points to an erlang_ref structure which either should have been obtained earlier with ei_decode_ref(), or created by ei_make_ref().

        @@ -745,7 +745,7 @@

        ei_x_encode_string_len()

        -
        int ei_encode_string(char *buf, int *index, const char *p);
        int ei_encode_string_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_string(ei_x_buff* x, const char *p);
        int ei_x_encode_string_len(ei_x_buff* x, const char* s, int len);

        Encodes a string in the binary format. (A string in Erlang is a list, but is +

        int ei_encode_string(char *buf, int *index, const char *p);
        int ei_encode_string_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_string(ei_x_buff* x, const char *p);
        int ei_x_encode_string_len(ei_x_buff* x, const char* s, int len);

        Encodes a string in the binary format. (A string in Erlang is a list, but is encoded as a character array in the binary format.) The string is to be NULL-terminated, except for the ei_x_encode_string_len() function.

        @@ -759,7 +759,7 @@

        ei_x_encode_trace()

        -
        int ei_encode_trace(char *buf, int *index, const erlang_trace *p);
        int ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p);

        Encodes an Erlang trace token in the binary format. Parameter p points to a +

        int ei_encode_trace(char *buf, int *index, const erlang_trace *p);
        int ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p);

        Encodes an Erlang trace token in the binary format. Parameter p points to a erlang_trace structure which should have been obtained earlier with ei_decode_trace().

        @@ -773,13 +773,13 @@

        ei_x_encode_tuple_header()

        -
        int ei_encode_tuple_header(char *buf, int *index, int arity);
        int ei_x_encode_tuple_header(ei_x_buff* x, int arity);

        Encodes a tuple header, with a specified arity. The next arity terms encoded +

        int ei_encode_tuple_header(char *buf, int *index, int arity);
        int ei_x_encode_tuple_header(ei_x_buff* x, int arity);

        Encodes a tuple header, with a specified arity. The next arity terms encoded will be the elements of the tuple. Tuples and lists are encoded recursively, so -that a tuple can contain another tuple or list.

        For example, to encode the tuple {a, {b, {}}}:

        ei_encode_tuple_header(buf, &i, 2);
        -ei_encode_atom(buf, &i, "a");
        -ei_encode_tuple_header(buf, &i, 2);
        -ei_encode_atom(buf, &i, "b");
        -ei_encode_tuple_header(buf, &i, 0);

        +that a tuple can contain another tuple or list.

        For example, to encode the tuple {a, {b, {}}}:

        ei_encode_tuple_header(buf, &i, 2);
        +ei_encode_atom(buf, &i, "a");
        +ei_encode_tuple_header(buf, &i, 2);
        +ei_encode_atom(buf, &i, "b");
        +ei_encode_tuple_header(buf, &i, 0);

        @@ -791,7 +791,7 @@

        ei_x_encode_ulong()

        -
        int ei_encode_ulong(char *buf, int *index, unsigned long p);
        int ei_x_encode_ulong(ei_x_buff* x, unsigned long p);

        Encodes an unsigned long integer in the binary format. If the code is 64 bits, +

        int ei_encode_ulong(char *buf, int *index, unsigned long p);
        int ei_x_encode_ulong(ei_x_buff* x, unsigned long p);

        Encodes an unsigned long integer in the binary format. If the code is 64 bits, the function ei_encode_ulong() is the same as ei_encode_ulonglong().

        @@ -804,7 +804,7 @@

        ei_x_encode_ulonglong()

        -
        int ei_encode_ulonglong(char *buf, int *index, unsigned long long p);
        int ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p);

        Encodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +

        int ei_encode_ulonglong(char *buf, int *index, unsigned long long p);
        int ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p);

        Encodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) integer in the binary format.

        @@ -817,14 +817,14 @@

        ei_x_encode_version()

        -
        int ei_encode_version(char *buf, int *index);
        int ei_x_encode_version(ei_x_buff* x);

        Encodes a version magic number for the binary format. Must be the first token in +

        int ei_encode_version(char *buf, int *index);
        int ei_x_encode_version(ei_x_buff* x);

        Encodes a version magic number for the binary format. Must be the first token in a binary term.

        ei_get_type()

        -
        int ei_get_type(const char *buf, const int *index, int *type, int *size);

        Returns the type in *type and size in *size of the encoded term. For strings +

        int ei_get_type(const char *buf, const int *index, int *type, int *size);

        Returns the type in *type and size in *size of the encoded term. For strings and atoms, size is the number of characters not including the terminating NULL. For binaries and bitstrings, *size is the number of bytes. For lists, tuples and maps, *size is the arity of the object. For bignum integers, @@ -857,7 +857,7 @@

        ei_init()

        -
        int ei_init(void);

        Initialize the ei library. This function should be called once (and only once) +

        int ei_init(void);

        Initialize the ei library. This function should be called once (and only once) before calling any other functionality in the ei library.

        On success zero is returned. On failure a posix error code is returned.

        Available since OTP 21.3

        @@ -870,7 +870,7 @@

        ei_s_print_term()

        -
        int ei_print_term(FILE* fp, const char* buf, int* index);
        int ei_s_print_term(char** s, const char* buf, int* index);

        Prints a term, in clear text, to the file specified by fp, or the buffer +

        int ei_print_term(FILE* fp, const char* buf, int* index);
        int ei_s_print_term(char** s, const char* buf, int* index);

        Prints a term, in clear text, to the file specified by fp, or the buffer pointed to by s. It tries to resemble the term printing in the Erlang shell.

        In ei_s_print_term(), parameter s is to point to a dynamically (malloc) allocated string of BUFSIZ bytes or a NULL pointer. The string can be reallocated (and *s can be updated) by this function if the result is more @@ -883,7 +883,7 @@

        ei_set_compat_rel()

        -
        void ei_set_compat_rel(unsigned release_number);

        In general, the ei library is guaranteed to be compatible with other +

        void ei_set_compat_rel(unsigned release_number);

        In general, the ei library is guaranteed to be compatible with other Erlang/OTP components that are 2 major releases older or newer than the ei library itself.

        Sometimes an exception to the above rule has to be made to make new features (or even bug fixes) possible. A call to ei_set_compat_rel(release_number) sets the @@ -908,7 +908,7 @@

        ei_skip_term()

        -
        int ei_skip_term(const char* buf, int* index);

        Skips a term in the specified buffer; recursively skips elements of lists and +

        int ei_skip_term(const char* buf, int* index);

        Skips a term in the specified buffer; recursively skips elements of lists and tuples, so that a full term is skipped. This is a way to get the size of an Erlang term.

        buf is the buffer.

        index is updated to point right after the term in the buffer.

        Note

        This can be useful when you want to hold arbitrary terms: skip them and copy the binary term data to some buffer.

        Returns 0 on success, otherwise -1.

        @@ -923,7 +923,7 @@

        ei_x_append_buf()

        -
        int ei_x_append(ei_x_buff* x, const ei_x_buff* x2);
        int ei_x_append_buf(ei_x_buff* x, const char* buf, int len);

        Appends data at the end of buffer x.

        +
        int ei_x_append(ei_x_buff* x, const ei_x_buff* x2);
        int ei_x_append_buf(ei_x_buff* x, const char* buf, int len);

        Appends data at the end of buffer x.

        @@ -935,7 +935,7 @@

        ei_x_format_wo_ver()

        -
        int ei_x_format(ei_x_buff* x, const char* fmt, ...);
        int ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... );

        Formats a term, given as a string, to a buffer. Works like a sprintf for Erlang +

        int ei_x_format(ei_x_buff* x, const char* fmt, ...);
        int ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... );

        Formats a term, given as a string, to a buffer. Works like a sprintf for Erlang terms. fmt contains a format string, with arguments like ~d, to insert terms from variables. The following formats are supported (with the C types given):

        ~a  An atom, char*
         ~c  A character, char
        @@ -945,14 +945,14 @@ 

        ~u A unsigned long integer, unsigned long int ~f A float, float ~d A double float, double float -~p An Erlang pid, erlang_pid*

        For example, to encode a tuple with some stuff:

        ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159)
        -encodes the tuple {numbers,12,3.14159}

        ei_x_format_wo_ver() formats into a buffer, without the initial version byte.

        Change

        Since OTP 26.2 maps can be encoded with syntax like "#{k1 => v1, k2 => v2}".

        +~p An Erlang pid, erlang_pid*

    For example, to encode a tuple with some stuff:

    ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159)
    +encodes the tuple {numbers,12,3.14159}

    ei_x_format_wo_ver() formats into a buffer, without the initial version byte.

    Change

    Since OTP 26.2 maps can be encoded with syntax like "#{k1 => v1, k2 => v2}".

    ei_x_free()

    -
    int ei_x_free(ei_x_buff* x);

    Deallocates the dynamically allocated content of the buffer referred by x. +

    int ei_x_free(ei_x_buff* x);

    Deallocates the dynamically allocated content of the buffer referred by x. After deallocation, the buff field is set to NULL.

    @@ -965,7 +965,7 @@

    ei_x_new_with_version()

    -
    int ei_x_new(ei_x_buff* x);
    int ei_x_new_with_version(ei_x_buff* x);

    Initialize the dynamically realizable buffer referred to by x. The fields of +

    int ei_x_new(ei_x_buff* x);
    int ei_x_new_with_version(ei_x_buff* x);

    Initialize the dynamically realizable buffer referred to by x. The fields of the structure pointed to by parameter x is filled in, and a default buffer is allocated. ei_x_new_with_version() also puts an initial version byte, which is used in the binary format (so that ei_x_encode_version() will not be needed.)

    diff --git a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_connect.html b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_connect.html index 285e44751a4e1..c9f124750794f 100644 --- a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_connect.html +++ b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_connect.html @@ -241,36 +241,36 @@

    • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
      +ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
           int flags;
      -    int (*socket)(void **ctx, void *setup_ctx);
      -    int   (*close)(void *ctx);
      -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
      -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
      -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
      -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
      -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
      -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
      -    int (*handshake_packet_header_size)(void *ctx, int *sz);
      -    int (*connect_handshake_complete)(void *ctx);
      -    int (*accept_handshake_complete)(void *ctx);
      -    int (*get_fd)(void *ctx, int *fd);
      -} ei_socket_callbacks;

      Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

    Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    -    char ipadr[4]; /* Ip v4 address in network byte order */
    -    char nodename[MAXNODELEN];
    -} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
    +found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    +    char ipadr[4]; /* Ip v4 address in network byte order */
    +    char nodename[MAXNODELEN];
    +} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
         unsigned s_addr; /* Ip v4 address in network byte order */
    -} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
    +} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
         long msgtype;
         erlang_pid from;
         erlang_pid to;
    -    char toname[MAXATOMLEN+1];
    -    char cookie[MAXATOMLEN+1];
    +    char toname[MAXATOMLEN+1];
    +    char cookie[MAXATOMLEN+1];
         erlang_trace token;
    -} erlang_msg;

    Information about a message received via +} erlang_msg;

  • Information about a message received via ei_receive_msg() or friends.

    @@ -295,15 +295,15 @@

    ei_gethostbyname_r()

    -
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    -  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    -  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    +
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    +  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    +  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    ei_accept()

    -
    int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

    Used by a server process to accept a connection from a client process.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously +
      int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

      Used by a server process to accept a connection from a client process.

      • ec is the C-node structure.
      • listensock is an open socket descriptor on which listen() has previously been called.
      • conp is a pointer to an ErlConnect struct.

      On success, conp is filled in with the address and node name of the connecting client and a file descriptor is returned. On failure, ERL_ERROR is returned and erl_errno is set to EIO.

      @@ -312,14 +312,14 @@

      ei_accept_tmo()

      -
      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the +

      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the description at the beginning of this manual page.

      ei_close_connection()

      -
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      +
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      @@ -343,7 +343,7 @@

      ei_xconnect_host_port()

      -
      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of +

      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of the remote node to be specified. ei_connect() provides an alternative interface and determines the information from the node name provided. The ei_xconnect_host_port() function provides yet another alternative that will @@ -359,12 +359,12 @@

      #define IP_ADDR "150.236.14.75" /*** Variant 1 ***/ -int fd = ei_connect(&ec, NODE); +int fd = ei_connect(&ec, NODE); /*** Variant 2 ***/ struct in_addr addr; -addr.s_addr = inet_addr(IP_ADDR); -fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    +addr.s_addr = inet_addr(IP_ADDR); +fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    @@ -388,11 +388,11 @@

    ei_connect_xinit_ussi()

    -
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    -  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    -  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    +  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
       const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation,
    -  ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the + ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the server. One of them must be called before other functions that works on the ei_cnode type or a file descriptor associated with a connection to another node is used.

    • ec is a structure containing information about the C-node. It is used in @@ -415,20 +415,20 @@

      see the relevant system documentation.

      These functions return a negative value indicating that an error occurred.

      Example 1:

      unsigned n = 0;
       struct in_addr addr;
       ei_cnode ec;
      -addr.s_addr = inet_addr("150.236.14.75");
      -if (ei_connect_xinit(&ec,
      +addr.s_addr = inet_addr("150.236.14.75");
      +if (ei_connect_xinit(&ec,
                            "chivas",
                            "madonna",
                            "madonna@chivas.du.etx.ericsson.se",
                            &addr;
                            "cookie...",
      -                     n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Example 2:

      if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Available since OTP 21.3

      + n++) < 0) { + fprintf(stderr,"ERROR when initializing: %d",erl_errno); + exit(-1); +}

    Example 2:

    if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
    +    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
    +    exit(-1);
    +}

    Available since OTP 21.3

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

    ei_xconnect_host_port_tmo()

    -
    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and +

    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and ei_xconnect_host_port with an optional time-out argument, see the description at the beginning of this manual page.

    Available since OTP 23.0

    @@ -466,7 +466,7 @@

    ei_set_tracelevel()

    -
    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity +

    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity levels. A higher level means more information. See also section Debug Information.

    These functions are not thread safe.

    Available since OTP R13B04

    @@ -480,7 +480,7 @@

    ei_xlisten()

    -
    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for +

    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for accepting connections from client processes.

    • ec is the C-node structure.
    • adr is local interface to bind to.
    • port is a pointer to an integer containing the port number to bind to. If *port equals 0 when calling ei_listen(), the socket will be bound to an ephemeral port. On success, ei_listen() will update the value of *port to @@ -495,7 +495,7 @@

      ei_make_pid()

      -
      int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

      Creates a new process identifier in the argument pid. This process identifier +

      int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

      Creates a new process identifier in the argument pid. This process identifier refers to a conseptual process residing on the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

      The C-node identified by ec must have been initialized and must have received @@ -508,7 +508,7 @@

      ei_make_ref()

      -
      int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

      Creates a new reference in the argument ref. This reference originates from +

      int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

      Creates a new reference in the argument ref. This reference originates from the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

      The C-node identified by ec must have been initialized and must have received a name prior to the call to ei_make_ref(). Initialization of the C-node is @@ -520,7 +520,7 @@

      ei_publish()

      -
      int ei_publish(ei_cnode *ec, int port);

      Used by a server process to register with the local name server EPMD, thereby +

      int ei_publish(ei_cnode *ec, int port);

      Used by a server process to register with the local name server EPMD, thereby allowing other processes to send messages by using the registered name. Before calling either of these functions, the process should have called bind() and listen() on an open socket.

      • ec is the C-node structure.
      • port is the local name to register, and is to be the same as the port number @@ -533,14 +533,14 @@

        ei_publish_tmo()

        -
        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the +

        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the description at the beginning of this manual page.

        ei_receive()

        -
        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external +

        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external format.

        • fd is an open descriptor to an Erlang connection. It is obtained from a previous ei_connect or ei_accept.
        • bufp is a buffer large enough to hold the expected message.
        • bufsize indicates the size of bufp.

        If a tick occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it is still alive, the function returns @@ -553,7 +553,7 @@

        ei_receive_encoded()

        -
        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface +

        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface compiler and with code following examples in the same application.

        In essence, the function performs the same operation as ei_xreceive_msg, but instead of using an ei_x_buff, the function expects a pointer to a character pointer (mbufp), where the character pointer is to point to a memory area @@ -569,8 +569,8 @@

        ei_receive_encoded_tmo()

        -
        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        -  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the +

        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        +  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the description at the beginning of this manual page.

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

        ei_xreceive_msg()

        -
        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in +

        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in x to grow, but ei_receive_msg fails if the message is larger than the pre-allocated buffer in x.

        • fd is an open descriptor to an Erlang connection.
        • msg is a pointer to an erlang_msg structure and contains information on the message received.
        • x is buffer obtained from ei_x_new.

        On success, the functions return ERL_MSG and the @@ -603,33 +603,33 @@

        ei_xreceive_msg_tmo()

        -
        int ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned imeout_ms);
        int ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned timeout_ms);

        Equivalent to ei_receive_msg and ei_xreceive_msg with an optional time-out +

        int ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned imeout_ms);
        int ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned timeout_ms);

        Equivalent to ei_receive_msg and ei_xreceive_msg with an optional time-out argument, see the description at the beginning of this manual page.

        ei_receive_tmo()

        -
        int ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms);

        Equivalent to ei_receive with an optional time-out argument, see the +

        int ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms);

        Equivalent to ei_receive with an optional time-out argument, see the description at the beginning of this manual page.

        ei_reg_send()

        -
        int ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int len);

        Sends an Erlang term to a registered process.

        • fd is an open descriptor to an Erlang connection.
        • server_name is the registered name of the intended recipient.
        • buf is the buffer containing the term in binary format.
        • len is the length of the message in bytes.

        Returns 0 if successful, otherwise -1. In the latter case it sets +

        int ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int len);

        Sends an Erlang term to a registered process.

        • fd is an open descriptor to an Erlang connection.
        • server_name is the registered name of the intended recipient.
        • buf is the buffer containing the term in binary format.
        • len is the length of the message in bytes.

        Returns 0 if successful, otherwise -1. In the latter case it sets erl_errno to EIO.

        Example:

        Send the atom "ok" to the process "worker":

        ei_x_buff x;
        -ei_x_new_with_version(&x);
        -ei_x_encode_atom(&x, "ok");
        -if (ei_reg_send(&ec, fd, x.buff, x.index) < 0)
        -    handle_error();

        +ei_x_new_with_version(&x); +ei_x_encode_atom(&x, "ok"); +if (ei_reg_send(&ec, fd, x.buff, x.index) < 0) + handle_error();

    ei_reg_send_tmo()

    -
    int ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf, int len,
    -  unsigned timeout_ms);

    Equivalent to ei_reg_send with an optional time-out argument, see the +

    int ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf, int len,
    +  unsigned timeout_ms);

    Equivalent to ei_reg_send with an optional time-out argument, see the description at the beginning of this manual page.

    @@ -654,10 +654,10 @@

    ei_rpc_from()

    -
    int ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen, ei_x_buff *x);
    int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen);
    int ei_xrpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen, int flags);
    int ei_rpc_from(ei_cnode *ec, int fd, int timeout, erlang_msg *msg, ei_x_buff *x);

    Supports calling Erlang functions on remote nodes. ei_rpc_to() sends an RPC +

    int ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen, ei_x_buff *x);
    int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen);
    int ei_xrpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen, int flags);
    int ei_rpc_from(ei_cnode *ec, int fd, int timeout, erlang_msg *msg, ei_x_buff *x);

    Supports calling Erlang functions on remote nodes. ei_rpc_to() sends an RPC request to a remote node and ei_rpc_from() receives the results of such a call. ei_rpc() combines the functionality of these two functions by sending an RPC request and waiting for the results.

    The ei_xrpc_to() function is equivalent to ei_rpc_to() when its flags @@ -705,25 +705,25 @@

    functions set erl_errno to one of the following:

    • EIO - I/O error.

    • ETIMEDOUT - Time-out expired.

    • EAGAIN - Temporary error: Try again.

    Example:

    Check to see if an Erlang process is alive:

    int index = 0, is_alive;
     ei_x_buff args, result;
     
    -ei_x_new(&result);
    -ei_x_new(&args);
    -ei_x_encode_list_header(&args, 1);
    -ei_x_encode_pid(&args, &check_pid);
    -ei_x_encode_empty_list(&args);
    +ei_x_new(&result);
    +ei_x_new(&args);
    +ei_x_encode_list_header(&args, 1);
    +ei_x_encode_pid(&args, &check_pid);
    +ei_x_encode_empty_list(&args);
     
    -if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    -           args.buff, args.index, &result) < 0)
    -    handle_error();
    +if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    +           args.buff, args.index, &result) < 0)
    +    handle_error();
     
    -if (ei_decode_version(result.buff, &index) < 0
    -    || ei_decode_bool(result.buff, &index, &is_alive) < 0)
    -    handle_error();

    +if (ei_decode_version(result.buff, &index) < 0 + || ei_decode_bool(result.buff, &index, &is_alive) < 0) + handle_error();

    ei_self()

    -
    erlang_pid * ei_self(ei_cnode *ec);

    Retrieves a generic pid of the C-node. Every C-node has a (pseudo) pid used in +

    erlang_pid * ei_self(ei_cnode *ec);

    Retrieves a generic pid of the C-node. Every C-node has a (pseudo) pid used in ei_send_reg, ei_rpc(), and others. This is contained in a field in the ec structure. Do not modify this structure.

    On success a pointer to the process identifier is returned. On failure NULL is returned and erl_errno is set.

    The C-node identified by ec must have been initialized and must have received @@ -736,28 +736,28 @@

    ei_send()

    -
    int ei_send(int fd, erlang_pid* to, char* buf, int len);

    Sends an Erlang term to a process.

    • fd is an open descriptor to an Erlang connection.
    • to is the pid of the intended recipient of the message.
    • buf is the buffer containing the term in binary format.
    • len is the length of the message in bytes.

    Returns 0 if successful, otherwise -1. In the latter case it sets +

    int ei_send(int fd, erlang_pid* to, char* buf, int len);

    Sends an Erlang term to a process.

    • fd is an open descriptor to an Erlang connection.
    • to is the pid of the intended recipient of the message.
    • buf is the buffer containing the term in binary format.
    • len is the length of the message in bytes.

    Returns 0 if successful, otherwise -1. In the latter case it sets erl_errno to EIO.

    ei_send_encoded()

    -
    int ei_send_encoded(int fd, erlang_pid* to, char* buf, int len);

    Works exactly as ei_send, the alternative name is retained for backward +

    int ei_send_encoded(int fd, erlang_pid* to, char* buf, int len);

    Works exactly as ei_send, the alternative name is retained for backward compatibility. The function will not be removed without prior notice.

    ei_send_encoded_tmo()

    -
    int ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send_encoded with an optional time-out argument, see the +

    int ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send_encoded with an optional time-out argument, see the description at the beginning of this manual page.

    ei_send_reg_encoded()

    -
    int ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len);

    This function is retained for compatibility with code generated by the interface +

    int ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len);

    This function is retained for compatibility with code generated by the interface compiler and with code following examples in the same application.

    The function works as ei_reg_send with one exception. Instead of taking ei_cnode as first argument, it takes a second argument, an erlang_pid, which is to be the process identifier of the sending process (in the Erlang @@ -768,15 +768,15 @@

    ei_send_reg_encoded_tmo()

    -
    int ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf,
    -  int len, unsigned timeout_ms);

    Equivalent to ei_send_reg_encoded with an optional time-out argument, see the +

    int ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf,
    +  int len, unsigned timeout_ms);

    Equivalent to ei_send_reg_encoded with an optional time-out argument, see the description at the beginning of this manual page.

    ei_send_tmo()

    -
    int ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send with an optional time-out argument, see the description +

    int ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send with an optional time-out argument, see the description at the beginning of this manual page.

    @@ -795,7 +795,7 @@

    ei_thisalivename()

    -
    const char * ei_thisnodename(ei_cnode *ec);
    const char * ei_thishostname(ei_cnode *ec);
    const char * ei_thisalivename(ei_cnode *ec);

    Can be used to retrieve information about the C-node. These values are initially +

    const char * ei_thisnodename(ei_cnode *ec);
    const char * ei_thishostname(ei_cnode *ec);
    const char * ei_thisalivename(ei_cnode *ec);

    Can be used to retrieve information about the C-node. These values are initially set with ei_connect_init() or ei_connect_xinit().

    These function simply fetch the appropriate field from the ec structure. Read the field directly will probably be safe for a long time, so these functions are not really needed.

    @@ -804,7 +804,7 @@

    ei_unpublish()

    -
    int ei_unpublish(ei_cnode *ec);

    Can be called by a process to unregister a specified node from EPMD on the local +

    int ei_unpublish(ei_cnode *ec);

    Can be called by a process to unregister a specified node from EPMD on the local host. This is, however, usually not allowed, unless EPMD was started with flag -relaxed_command_check, which it normally is not.

    To unregister a node you have published, you should close the descriptor that was returned by ei_publish().

    Warning

    This function is deprecated and will be removed in a future release.

    ec is the node structure of the node to unregister.

    If the node was successfully unregistered from EPMD, the function returns 0. @@ -814,7 +814,7 @@

    ei_unpublish_tmo()

    -
    int ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms);

    Equivalent to ei_unpublish with an optional time-out argument, see the +

    int ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms);

    Equivalent to ei_unpublish with an optional time-out argument, see the description at the beginning of this manual page.

    diff --git a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_global.html b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_global.html index 36c0d0b194f07..ee55ba750c1de 100644 --- a/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_global.html +++ b/prs/8803/lib/erl_interface-5.5.2/doc/html/ei_global.html @@ -132,7 +132,7 @@

    ei_global_names()

    -
    char **ei_global_names(ei_cnode *ec, int fd, int *count);

    Retrieves a list of all known global names.

    diff --git a/prs/8803/lib/inets-9.2/doc/html/httpd.html b/prs/8803/lib/inets-9.2/doc/html/httpd.html index eef281f0bff96..f3fc2ec20dd34 100644 --- a/prs/8803/lib/inets-9.2/doc/html/httpd.html +++ b/prs/8803/lib/inets-9.2/doc/html/httpd.html @@ -236,36 +236,36 @@

    level error under the hierarchical logger domain: [otp, inets, httpd, ServerID, error] The built in logger formatting function produces log entries from the error -reports:

    #{server_name => string()
    +reports:

    #{server_name => string()
       protocol => internal | 'TCP' | 'TLS' | 'HTTP',
       transport => "TCP" | "TLS", %% Present when protocol = 'HTTP'
    -  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
    -  peer => inet:peername(),
    -  host => inet:hostname(),
    -  reason => term()
    -}

    An example of a log entry with only default settings of logger

    =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
    +  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
    +  peer => inet:peername(),
    +  host => inet:hostname(),
    +  reason => term()
    +}

    An example of a log entry with only default settings of logger

    =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
        Server: My Server
      Protocol: HTTP
     Transport: TLS
           URI: /not_there
          Host: 127.0.1.1:80
          Peer: 127.0.0.1:45253
    -   Reason: [{statuscode,404},{description,"Object Not Found"}]

    Using this option makes mod_log and mod_disk_log error logs redundant.

    Add the filter

    {fun logger_filters:domain/2,
    -    {log,equal,[otp,inets, httpd, ServerID, error]}

    to appropriate logger handler to handle the events. For example to write the + Reason: [{statuscode,404},{description,"Object Not Found"}]

    Using this option makes mod_log and mod_disk_log error logs redundant.

    Add the filter

    {fun logger_filters:domain/2,
    +    {log,equal,[otp,inets, httpd, ServerID, error]}

    to appropriate logger handler to handle the events. For example to write the error log from an httpd server with a ServerID of my_server to a file -you can use the following sys.config:

    [{kernel,
    - [{logger,
    -  [{handler, http_error_test, logger_std_h,
    -    #{config => #{ file => "log/http_error.log" },
    -      filters => [{inets_httpd, {fun logger_filters:domain/2,
    -                                 {log, equal,
    -                                  [otp, inets, httpd, my_server, error]
    -                                 }}}],
    -      filter_default => stop }}]}]}].

    or if you want to add it to the default logger via an API:

    logger:add_handler_filter(default,
    +you can use the following sys.config:

    [{kernel,
    + [{logger,
    +  [{handler, http_error_test, logger_std_h,
    +    #{config => #{ file => "log/http_error.log" },
    +      filters => [{inets_httpd, {fun logger_filters:domain/2,
    +                                 {log, equal,
    +                                  [otp, inets, httpd, my_server, error]
    +                                 }}}],
    +      filter_default => stop }}]}]}].

    or if you want to add it to the default logger via an API:

    logger:add_handler_filter(default,
                               inets_httpd,
    -                          {fun logger_filters:domain/2,
    -                           {log, equal,
    -                            [otp, inets, httpd, my_server, error]}}).
  • {log_format, common | combined}
    Defines if access logs are to be written according to the common log format + {fun logger_filters:domain/2, + {log, equal, + [otp, inets, httpd, my_server, error]}}).

  • {log_format, common | combined}
    Defines if access logs are to be written according to the common log format or the extended common log format. The common format is one line looking like this: remotehost rfc931 authuser [date] "request" status bytes.

    Here:

    • remotehost - Remote.

    • rfc931 - The remote username of the client (RFC 931).

    • authuser - The username used for authentication.

    • [date] - Date and time of the request @@ -275,7 +275,7 @@

      remotehost rfc931 authuser [date] "request" status bytes "referer" "user_agent"

      In addition to the earlier:

      • "referer" - The URL the client was on before requesting the URL (if it could not be determined, a minus sign is placed in this field).

      • "user_agent" - The software the client claims to be using (if it could not be determined, a minus sign is placed in this field).

      This affects the access logs written by mod_log and mod_disk_log.

    • {error_log_format, pretty | compact}
      Default is pretty. If the error log is meant to be read directly by a human, -pretty is the best option.

      pretty has a format corresponding to:

      io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

      compact has a format corresponding to:

      io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

      This affects the error logs written by mod_log and mod_disk_log.

    +pretty is the best option.

    pretty has a format corresponding to:

    io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

    compact has a format corresponding to:

    io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

    This affects the error logs written by mod_log and mod_disk_log.

  • @@ -284,15 +284,15 @@

    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be stored in the local file system instead of the document_root location. URLs with a path beginning with url-path is mapped to local files beginning with -directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file +directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file /ftp/pub/image/foo.gif.

    • {re_write, {Re, Replacement}}
      Re = string() and Replacement = string(). re_write allows documents to be stored in the local file system instead of the document_root location. URLs are rewritten by re:replace/3 to produce a path in the local -file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file +file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file /home/bob/public/foo.gif.

    • {directory_index, [string()]}
      directory_index specifies a list of resources to look for if a client requests a directory using a / at the end of the directory name. file depicts the name of a file in the directory. Several files can be given, in -which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return +which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return http://your.server.org/docs/index.html or http://your.server.org/docs/welcome.html if index.html does not exist.

    @@ -320,7 +320,7 @@

    method. The method is either GET or POST, as defined in RFC 1945. It propagates the URL and file path of the requested document using the standard CGI PATH_INFO and -PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    +PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    @@ -328,7 +328,7 @@

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks all URLs matching url-path as erl scheme scripts. A matching URL is mapped -into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would +into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would refer to httpd_example:yahoo/3 or, if that does not exist, httpd_example:yahoo/2 and http://your.server.org/cgi-bin/example/other:yahoo would not be allowed to execute.

    • {erl_script_nocache, boolean()}
      If erl_script_nocache is set to true, the server adds HTTP header fields @@ -378,7 +378,7 @@

      Authentication Properties - Requires mod_auth

      -

      {directory, {path(), [{property(), term()}]}}

      The properties for directories are as follows:

      • {allow_from, all | [RegxpHostString]}
        Defines a set of hosts to be granted access to a given directory, for example:

        {allow_from, ["123.34.56.11", "150.100.23"]}

        The host 123.34.56.11 and all machines on the 150.100.23 subnet are +

        {directory, {path(), [{property(), term()}]}}

        The properties for directories are as follows:

        • {allow_from, all | [RegxpHostString]}
          Defines a set of hosts to be granted access to a given directory, for example:

          {allow_from, ["123.34.56.11", "150.100.23"]}

          The host 123.34.56.11 and all machines on the 150.100.23 subnet are allowed access.

        • {deny_from, all | [RegxpHostString]}
          Defines a set of hosts to be denied access to a given directory, for example:

          {deny_from, ["123.34.56.11", "150.100.23"]}

          The host 123.34.56.11 and all machines on the 150.100.23 subnet are not allowed access.

        • {auth_type, plain | dets | mnesia}
          Sets the type of authentication database that is used for the directory. The key difference between the different methods is that dynamic data can be saved @@ -413,7 +413,7 @@

          Security Properties - Requires mod_security

          -

          {security_directory, {path(), [{property(), term()}]}}

          The properties for the security directories are as follows:

          • {data_file, path()}
            Name of the security data file. The filename can either be absolute or +

            {security_directory, {path(), [{property(), term()}]}}

            The properties for the security directories are as follows:

            • {data_file, path()}
              Name of the security data file. The filename can either be absolute or relative to the server_root. This file is used to store persistent data for module mod_security.

            • {max_retries, integer()}
              Specifies the maximum number of attempts to authenticate a user before the user is blocked out. If a user successfully authenticates while blocked, the @@ -430,10 +430,10 @@

              Web server API data types

              -

              The Erlang web server API data types are as follows:

              ModData = #mod{}
              +

              The Erlang web server API data types are as follows:

              ModData = #mod{}
               
              --record(mod, {
              -    data = [],
              +-record(mod, {
              +    data = [],
                   socket_type = ip_comm,
                   socket,
                   config_db,
              @@ -442,10 +442,10 @@ 

              request_uri, http_version, request_line, - parsed_header = [], + parsed_header = [], entity_body, connection -}).

              To access the record in your callback-module use:

              -include_lib("inets/include/httpd.hrl").

              The fields of record mod have the following meaning:

              • data - Type [{InteractionKey,InteractionValue}] is used to propagate +}).

              To access the record in your callback-module use:

              -include_lib("inets/include/httpd.hrl").

              The fields of record mod have the following meaning:

              • data - Type [{InteractionKey,InteractionValue}] is used to propagate data between modules. Depicted interaction_data() in function type declarations.

              • socket_type - socket_type() indicates whether it is an IP socket or an ssl socket.

              • socket - The socket, in format ip_comm or ssl, depending on diff --git a/prs/8803/lib/inets-9.2/doc/html/inets.epub b/prs/8803/lib/inets-9.2/doc/html/inets.epub index 3f8ce450681058cef71ffe586f724f4689f9e022..575cecd08022eca1b30d6fe56f068dbd0337ae51 100644 GIT binary patch delta 31523 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

                PvqZsX2MvwYx}^vJdB~pYs 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 delta 31664 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 diff --git a/prs/8803/lib/inets-9.2/doc/html/inets_services.html b/prs/8803/lib/inets-9.2/doc/html/inets_services.html index ac6b8f19e796d..3cae923e38fba 100644 --- a/prs/8803/lib/inets-9.2/doc/html/inets_services.html +++ b/prs/8803/lib/inets-9.2/doc/html/inets_services.html @@ -141,7 +141,7 @@

                unless the service is started with the standalone option. In this case the service is linked to the calling process and all OTP application features, such as soft upgrade, are lost.

                Services to be configured for startup at application startup are to be put into -the Erlang node configuration file on the following form:

                [{inets, [{services, ListofConfiguredServices}]}].

                For details of what to put in the list of configured services, see the +the Erlang node configuration file on the following form:

                [{inets, [{services, ListofConfiguredServices}]}].

                For details of what to put in the list of configured services, see the documentation for the services to be configured.

                diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html index caa947853db61..57630f0d8109e 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html @@ -2,10 +2,10 @@ - + All Classes (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html index a7f37d4fa35f6..dc4e78f166418 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html @@ -2,10 +2,10 @@ - + All Classes (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html index 486f1241a1b09..cf54002603141 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html @@ -2,10 +2,10 @@ - + All Packages (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html index ce72d1dcae6fa..8f16720f315a1 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html @@ -2,10 +2,10 @@ - + AbstractConnection (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html index 7cc843db80b5e..d11027d9ce157 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html @@ -2,10 +2,10 @@ - + AbstractNode (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html index 4fc722da5cc7c..cff885326952d 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html @@ -2,10 +2,10 @@ - + GenericQueue (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html index 2b6b54b41435e..547362067cf06 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html @@ -2,10 +2,10 @@ - + OtpAuthException (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html index b3beceaf8526c..7f63790b36bc0 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html @@ -2,10 +2,10 @@ - + OtpConnection (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html index d748058f6c798..e50c8161ab25b 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html @@ -2,10 +2,10 @@ - + OtpCookedConnection (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html index 65d7286fd73fa..8eba3189ba649 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html @@ -2,10 +2,10 @@ - + OtpEpmd (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html index 1e4bdd8b02c8e..18bad556cf920 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html @@ -2,10 +2,10 @@ - + OtpErlangAtom (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html index a8f7e73b5a924..5df62c2660246 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html @@ -2,10 +2,10 @@ - + OtpErlangBinary (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html index 5a6fd9d1e70e9..9e19e0ea39f36 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html @@ -2,10 +2,10 @@ - + OtpErlangBitstr (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html index f8a2e34197e7c..424c6c9e47070 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html @@ -2,10 +2,10 @@ - + OtpErlangBoolean (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html index 641b7c68dca49..50c1eef659c66 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html @@ -2,10 +2,10 @@ - + OtpErlangByte (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html index 2b09dceb3bce0..53c3cfc8fc38d 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html @@ -2,10 +2,10 @@ - + OtpErlangChar (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html index d40b66c43081d..ea01673609866 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html @@ -2,10 +2,10 @@ - + OtpErlangDecodeException (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html index 6c929886bec8d..5c4a448517792 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html @@ -2,10 +2,10 @@ - + OtpErlangDouble (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html index 30a0dd3efcb94..9896436e2746f 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html @@ -2,10 +2,10 @@ - + OtpErlangException (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html index 0d3dcb13e515e..128ca3ab2b628 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html @@ -2,10 +2,10 @@ - + OtpErlangExit (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html index bcb45e9158e50..7295098d1eeb4 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html @@ -2,10 +2,10 @@ - + OtpErlangExternalFun (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html index 09fd1dd1a8910..8eddc6fc7fa91 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html @@ -2,10 +2,10 @@ - + OtpErlangFloat (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html index cfb03a63a1be2..7d4c852728fb9 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html @@ -2,10 +2,10 @@ - + OtpErlangFun (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html index 65b5467bf8553..7c8640ab812ec 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html @@ -2,10 +2,10 @@ - + OtpErlangInt (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html index 8eec7eae4a784..6908bff851e10 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html @@ -2,10 +2,10 @@ - + OtpErlangList.SubList (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html index dd534596f1e75..604c892885ee7 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html @@ -2,10 +2,10 @@ - + OtpErlangList (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html index f1f48b4d9f106..e2ed9fb63a3e1 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html @@ -2,10 +2,10 @@ - + OtpErlangLong (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html index 05909b627a13d..604e94a8e93fc 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html @@ -2,10 +2,10 @@ - + OtpErlangMap (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html index 4497f4bd650fa..a814de03fd5e4 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html @@ -2,10 +2,10 @@ - + OtpErlangObject.Hash (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html index a46f99f8810ec..a27c084386b5c 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html @@ -2,10 +2,10 @@ - + OtpErlangObject (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html index 69719bcef251c..8af40b79d1b32 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html @@ -2,10 +2,10 @@ - + OtpErlangPid (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html index b5cd19d7dda63..693ad0d2ab5e6 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html @@ -2,10 +2,10 @@ - + OtpErlangPort (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html index e35f26d6ef672..0e7165fb7384b 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html @@ -2,10 +2,10 @@ - + OtpErlangRangeException (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html index eae116f71814c..68ecd2d9da701 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html @@ -2,10 +2,10 @@ - + OtpErlangRef (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html index dc483ea2b9678..2f70bb820be39 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html @@ -2,10 +2,10 @@ - + OtpErlangShort (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html index 949bfd56341f6..20f7e8cc787dd 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html @@ -2,10 +2,10 @@ - + OtpErlangString (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html index 8a413cfe23909..fd9ee326c177a 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html @@ -2,10 +2,10 @@ - + OtpErlangTuple (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html index a214ef2f62445..83a9252a1b1fc 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html @@ -2,10 +2,10 @@ - + OtpErlangUInt (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html index 95438d5af0db0..7cd9aabfee8cb 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html @@ -2,10 +2,10 @@ - + OtpErlangUShort (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html index c5af500678799..c8946ad4f1d7f 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html @@ -2,10 +2,10 @@ - + OtpException (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html index 3862f0608c27d..d762ffafa3201 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html @@ -2,10 +2,10 @@ - + OtpExternal (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html index f3952c804169b..b95371970ece3 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html @@ -2,10 +2,10 @@ - + OtpGenericTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html index 432f8da8f0858..1647b6f0053fc 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html @@ -2,10 +2,10 @@ - + OtpInputStream (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html index 4f41e54cb8cc7..ef279c410501c 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html @@ -2,10 +2,10 @@ - + OtpLocalNode (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html index b80dfdd808e70..642e9697980c9 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html @@ -2,10 +2,10 @@ - + OtpMbox (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html index 336be70e8e0c2..a3d248173ef99 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html @@ -2,10 +2,10 @@ - + OtpMsg (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html index 035b9d8ce189c..f6105ab399344 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html @@ -2,10 +2,10 @@ - + OtpNode.Acceptor (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html index 45406d9689245..7101a4afb8447 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html @@ -2,10 +2,10 @@ - + OtpNode.Mailboxes (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html index bb42669cb1eb8..3ae9a4696f633 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html @@ -2,10 +2,10 @@ - + OtpNode (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html index ea5223fc68418..9d8476c944ef7 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html @@ -2,10 +2,10 @@ - + OtpNodeStatus (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html index 4b740e9054c4e..613b21c040af5 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html @@ -2,10 +2,10 @@ - + OtpOutputStream (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html index 21d591ce779b0..50929daf31046 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html @@ -2,10 +2,10 @@ - + OtpPeer (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html index d94a83fdf33d6..a4515ba29de6a 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html @@ -2,10 +2,10 @@ - + OtpSelf (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html index 2bb713a38f7bc..88983865f9a42 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html @@ -2,10 +2,10 @@ - + OtpServer (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html index dc289e6b5246f..2f8945fab9013 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html @@ -2,10 +2,10 @@ - + OtpServerSocketTransport (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html index 4d5c5b14ada4e..75461131da3aa 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html @@ -2,10 +2,10 @@ - + OtpServerTransport (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html index 4826e887a9de2..0abd98278be74 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html @@ -2,10 +2,10 @@ - + OtpSocketTransport (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html index 241974926e67b..33ffdcb0a061b 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html @@ -2,10 +2,10 @@ - + OtpSocketTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html index 6dc3729937e64..13af12ccaf85f 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html @@ -2,10 +2,10 @@ - + OtpTransport (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html index c4cf5d964438a..e46dfb6d05179 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html @@ -2,10 +2,10 @@ - + OtpTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html index cd1d795b1e8c0..5dba7123c06db 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html @@ -2,10 +2,10 @@ - + com.ericsson.otp.erlang (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html index ba405b5099b08..6cacec5a5f777 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html @@ -2,10 +2,10 @@ - + com.ericsson.otp.erlang Class Hierarchy (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html index 78376696308c0..4da6b325a619d 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html @@ -2,10 +2,10 @@ - + Constant Field Values (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html index ebae772849f18..8e0f7c2fb363f 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html @@ -2,10 +2,10 @@ - + Deprecated List (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html index e362562be9d70..ac904ca58056e 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html @@ -2,10 +2,10 @@ - + API Help (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html index be3852c672418..3a4164bc97f33 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html @@ -2,10 +2,10 @@ - + Index (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index.html index 932dc185ec16c..a37279f5110ca 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/index.html @@ -2,7 +2,7 @@ - + Java-Erlang Interface Library diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip index 585a32bd71b94706f563dfa2373f3a2d011b8b6d..ddbae3808dd4c56fc4a5daf163b97b7beb444e96 100644 GIT binary patch delta 30 kcmbQLHC2l@z?+#xgn@&DgMl|hXCv - + Class Hierarchy (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip index 964eb687739670b1545ef699996d0c4cc0e13e25..9e0a8dd7715c11ceea225eccf51cfa82c465e2aa 100644 GIT binary patch delta 28 hcmaFI_>Pe`z?+#xgn@&DgMl|hXCm(eW)QW&4**;J27~|r delta 28 hcmaFI_>Pe`z?+#xgn@&DgCQnTdm`@yW)QW&4*+5y2Pyyn diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html index a6f199ff29af4..9d85f965c5472 100644 --- a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html +++ b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html @@ -2,10 +2,10 @@ - + Serialized Form (Java-Erlang Interface Library) - + diff --git a/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip b/prs/8803/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip index 5795609b4a87ef74f03c03b2c8353ac313a112f1..2bc4f10088c05d163e2c54ac2404c0cf56a25ddd 100644 GIT binary patch delta 30 kcmdnYvYCZ9z?+#xgn@&DgMl|hXCvR delta 30 kcmdnYvYCZ9z?+#xgn@&DgCQnTdn4}+MrI&A`30jl0A@x9YXATM diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/app.html b/prs/8803/lib/kernel-10.0.1/doc/html/app.html index 724cc9ee6a713..4118e3404c4ab 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/app.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/app.html @@ -144,41 +144,41 @@

                The application resource file is to be called Application.app, where Application is the application name. The file is to be located in directory ebin for the application.

                The file must contain a single Erlang term, which is called an application -specification:

                {application, Application,
                -  [{description,  Description},
                -   {id,           Id},
                -   {vsn,          Vsn},
                -   {modules,      Modules},
                -   {maxP,         MaxP},
                -   {maxT,         MaxT},
                -   {registered,   Names},
                -   {included_applications, Apps},
                -   {optional_applications, Apps},
                -   {applications, Apps},
                -   {env,          Env},
                -   {mod,          Start},
                -   {start_phases, Phases},
                -   {runtime_dependencies, RTDeps}]}.
                +specification:

                {application, Application,
                +  [{description,  Description},
                +   {id,           Id},
                +   {vsn,          Vsn},
                +   {modules,      Modules},
                +   {maxP,         MaxP},
                +   {maxT,         MaxT},
                +   {registered,   Names},
                +   {included_applications, Apps},
                +   {optional_applications, Apps},
                +   {applications, Apps},
                +   {env,          Env},
                +   {mod,          Start},
                +   {start_phases, Phases},
                +   {runtime_dependencies, RTDeps}]}.
                 
                              Value                Default
                              -----                -------
                -Application  atom()               -
                -Description  string()             ""
                -Id           string()             ""
                -Vsn          string()             ""
                -Modules      [Module]             []
                -MaxP         int()                infinity
                -MaxT         int()                infinity
                -Names        [Name]               []
                -Apps         [App]                []
                -Env          [{Par,Val}]          []
                -Start        {Module,StartArgs}   []
                -Phases       [{Phase,PhaseArgs}]  undefined
                -RTDeps       [ApplicationVersion] []
                -
                -Module = Name = App = Par = Phase = atom()
                -Val = StartArgs = PhaseArgs = term()
                -ApplicationVersion = string()
                • Application - Application name.

                For the application controller, all keys are optional. The respective default +Application atom() - +Description string() "" +Id string() "" +Vsn string() "" +Modules [Module] [] +MaxP int() infinity +MaxT int() infinity +Names [Name] [] +Apps [App] [] +Env [{Par,Val}] [] +Start {Module,StartArgs} [] +Phases [{Phase,PhaseArgs}] undefined +RTDeps [ApplicationVersion] [] + +Module = Name = App = Par = Phase = atom() +Val = StartArgs = PhaseArgs = term() +ApplicationVersion = string()

                • Application - Application name.

                For the application controller, all keys are optional. The respective default values are used for any omitted keys.

                The functions in systools require more information. If they are used, the following keys are mandatory:

                • description
                • vsn
                • modules
                • registered
                • applications

                The other keys are ignored by systools.

                • description - A one-line description of the application.

                • id - Product identification, or similar.

                • vsn - Version of the application.

                • modules - All modules introduced by this application. systools uses this list when generating start scripts and tar files. A module can only be @@ -211,7 +211,7 @@

                  Module:start_phase(Phase,Type,PhaseArgs) for each start phase defined by key start_phases. Only after this extended start procedure, application:start(Application) returns.

                  Start phases can be used to synchronize startup of an application and its -included applications. In this case, key mod must be specified as follows:

                  {mod, {application_starter,[Module,StartArgs]}}

                  The application master then calls Module:start/2 for the primary +included applications. In this case, key mod must be specified as follows:

                  {mod, {application_starter,[Module,StartArgs]}}

                  The application master then calls Module:start/2 for the primary application, followed by calls to Module:start_phase/3 for each start phase (as defined for the primary application), both for the primary application and for each of its included applications, for which the start phase is defined.

                  This implies that for an included application, the set of start phases must be diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/application.html b/prs/8803/lib/kernel-10.0.1/doc/html/application.html index f5510577f8f6f..24f6cb811136a 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/application.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/application.html @@ -1653,7 +1653,7 @@

                  load(AppDescr, Distributed)

                  restart the application on another node. If Time is not specified, it defaults to 0 and the application is restarted immediately.

                  Nodes is a list of node names where the application can run, in priority from left to right. Node names can be grouped using tuples to indicate that they have -the same priority.

                  Example:

                  Nodes = [cp1@cave, {cp2@cave, cp3@cave}]

                  This means that the application is preferably to be started at cp1@cave. If +the same priority.

                  Example:

                  Nodes = [cp1@cave, {cp2@cave, cp3@cave}]

                  This means that the application is preferably to be started at cp1@cave. If cp1@cave is down, the application is to be started at cp2@cave or cp3@cave.

                  If Distributed == default, the value for the application in the Kernel configuration parameter distributed is used.

                  diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/code.html b/prs/8803/lib/kernel-10.0.1/doc/html/code.html index f88b65635eb37..4ca829336fdd4 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/code.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/code.html @@ -193,11 +193,11 @@

                  mnesia-4.4.7, the archive file must be named mnesia-4.4.7.ez and it must contain a top directory named mnesia-4.4.7. If the version part of the name is omitted, it must also be omitted in the archive. That is, a mnesia.ez archive -must contain a mnesia top directory.

                  An archive file for an application can, for example, be created like this:

                  zip:create("mnesia-4.4.7.ez",
                  -	["mnesia-4.4.7"],
                  -	[{cwd, code:lib_dir()},
                  -	 {compress, all},
                  -	 {uncompress,[".beam",".app"]}]).

                  Any file in the archive can be compressed, but to speed up the access of +must contain a mnesia top directory.

                  An archive file for an application can, for example, be created like this:

                  zip:create("mnesia-4.4.7.ez",
                  +	["mnesia-4.4.7"],
                  +	[{cwd, code:lib_dir()},
                  +	 {compress, all},
                  +	 {uncompress,[".beam",".app"]}]).

                  Any file in the archive can be compressed, but to speed up the access of frequently read files, it can be a good idea to store beam and app files uncompressed in the archive.

                  Normally the top directory of an application is located in library directory $OTPROOT/lib or in a directory referred to by environment variable ERL_LIBS. @@ -1875,10 +1875,10 @@

                  atomic_load(Modules)

                  the code already exists.

                • sticky_directory - The object code resides in a sticky directory.

                • pending_on_load - A previously loaded module contains an -on_load function that never finished.

                If it is important to minimize the time that an application is inactive while changing code, use prepare_loading/1 and finish_loading/1 instead of -atomic_load/1. Here is an example:

                {ok,Prepared} = code:prepare_loading(Modules),
                +atomic_load/1. Here is an example:

                {ok,Prepared} = code:prepare_loading(Modules),
                 %% Put the application into an inactive state or do any
                 %% other preparation needed before changing the code.
                -ok = code:finish_loading(Prepared),
                +ok = code:finish_loading(Prepared),
                 %% Resume the application.
                @@ -2431,8 +2431,8 @@

                get_object_code(Module)

                code for the module. This is useful if code is to be loaded on a remote node in a distributed system. For example, loading module Module on a node Node is done as follows:

                ...
                -{_Module, Binary, Filename} = code:get_object_code(Module),
                -erpc:call(Node, code, load_binary, [Module, Filename, Binary]),
                +{_Module, Binary, Filename} = code:get_object_code(Module),
                +erpc:call(Node, code, load_binary, [Module, Filename, Binary]),
                 ...
                @@ -2551,7 +2551,7 @@

                lib_dir()

                Returns the library directory, $OTPROOT/lib, where $OTPROOT is the root -directory of Erlang/OTP.

                Example:

                1> code:lib_dir().
                +directory of Erlang/OTP.

                Example:

                1> code:lib_dir().
                 "/usr/local/otp/lib"
                @@ -2590,7 +2590,7 @@

                lib_dir(Name)

                /usr/local/otp/lib/mnesia-4.2.2/ebin is returned. This means that the library directory for an application is the same, regardless if the application resides in an archive or not.

                Warning

                Archives are experimental. In a future release, they can be removed or -their behavior can change.

                Example:

                > code:lib_dir(mnesia).
                +their behavior can change.

                Example:

                > code:lib_dir(mnesia).
                 "/usr/local/otp/lib/mnesia-4.23"

                Returns {error, bad_name} if Name is not the name of an application under $OTPROOT/lib or on a directory referred to through environment variable ERL_LIBS. Fails with an exception if Name has the wrong type.

                Warning

                For backward compatibility, Name is also allowed to be a string. That will @@ -2633,7 +2633,7 @@

                lib_dir(Name, SubDir)

                situation is different. Some of the subdirectories can reside as regular directories while others reside in an archive file. It is not checked whether this directory exists.

                Instead of using this function, use code:lib_dir/1 -and filename:join/2.

                Example:

                1> filename:join(code:lib_dir(megaco), "priv").
                +and filename:join/2.

                Example:

                1> filename:join(code:lib_dir(megaco), "priv").
                 "/usr/local/otp/lib/megaco-3.9.1.1/priv"

                Fails with an exception if Name or SubDir has the wrong type.

                @@ -3092,7 +3092,7 @@

                root_dir()

                Returns the root directory of Erlang/OTP, which is the directory where it is -installed.

                Example:

                1> code:root_dir().
                +installed.

                Example:

                1> code:root_dir().
                 "/usr/local/otp"
                diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/config.html b/prs/8803/lib/kernel-10.0.1/doc/html/config.html index 2161b1c06a7a8..98e6369c869c1 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/config.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/config.html @@ -152,9 +152,9 @@

                File Syntax

                -

                The configuration file is to be called Name.config, where Name is any name.

                File .config contains a single Erlang term and has the following syntax:

                [{Application1, [{Par11, Val11}, ...]},
                +

                The configuration file is to be called Name.config, where Name is any name.

                File .config contains a single Erlang term and has the following syntax:

                [{Application1, [{Par11, Val11}, ...]},
                  ...
                - {ApplicationN, [{ParN1, ValN1}, ...]}].
                • Application = atom() - Application name.

                • Par = atom() - Name of a configuration parameter.

                • Val = term() - Value of a configuration parameter.

                + {ApplicationN, [{ParN1, ValN1}, ...]}].

                • Application = atom() - Application name.

                • Par = atom() - Name of a configuration parameter.

                • Val = term() - Value of a configuration parameter.

                diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/eep48_chapter.html b/prs/8803/lib/kernel-10.0.1/doc/html/eep48_chapter.html index 1533542b635bb..ea240625bae6a 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/eep48_chapter.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/eep48_chapter.html @@ -154,20 +154,20 @@

                In both storages, the documentation is written in the exactly same format: an Erlang term serialized to binary via term_to_binary/1. The term can be optionally -compressed when serialized. It must follow the type specification below:

                {docs_v1,
                - Anno :: erl_anno:anno(),
                - BeamLanguage :: atom(),
                - Format :: binary(),
                - ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,
                - Metadata :: map(),
                +compressed when serialized. It must follow the type specification below:

                {docs_v1,
                + Anno :: erl_anno:anno(),
                + BeamLanguage :: atom(),
                + Format :: binary(),
                + ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,
                + Metadata :: map(),
                  Docs ::
                -   [{{Kind, Name, Arity},
                -     Anno :: erl_anno:anno(),
                -     Signature :: [binary()],
                -     Doc :: #{DocLanguage := DocValue} | none | hidden,
                -     Metadata :: map()
                -    }]} when DocLanguage :: binary(),
                -             DocValue :: binary() | term()

                where in the root tuple we have:

                • Anno - annotation (line, column, file) of the definition itself (see + [{{Kind, Name, Arity}, + Anno :: erl_anno:anno(), + Signature :: [binary()], + Doc :: #{DocLanguage := DocValue} | none | hidden, + Metadata :: map() + }]} when DocLanguage :: binary(), + DocValue :: binary() | term()

                where in the root tuple we have:

                • Anno - annotation (line, column, file) of the definition itself (see erl_anno)

                • BeamLanguage - an atom representing the language, for example: erlang, elixir, lfe, alpaca, and so on

                • Format - the mime type of the documentation, such as <<"text/markdown">> or <<"application/erlang+html">>. For details of the format used by Erlang diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/erl_epmd.html b/prs/8803/lib/kernel-10.0.1/doc/html/erl_epmd.html index 09f258b8fec7e..892c481ff9637 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/erl_epmd.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/erl_epmd.html @@ -361,8 +361,8 @@

                  names(Host)

                  Called by net_adm:names/0. Host defaults to the localhost. Returns the names and associated port numbers of the Erlang nodes that epmd registered at the specified host. Returns {error, address} if epmd is not -operational.

                  Example:

                  (arne@dunn)1> erl_epmd:names(localhost).
                  -{ok,[{"arne",40262}]}
                  +operational.

                  Example:

                  (arne@dunn)1> erl_epmd:names(localhost).
                  +{ok,[{"arne",40262}]}
                  diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/erpc.html b/prs/8803/lib/kernel-10.0.1/doc/html/erpc.html index 189ba8e35a016..5d3f8b92697bf 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/erpc.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/erpc.html @@ -1221,20 +1221,20 @@

                  multicall(Nodes, Module, Function, Args, Ti selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, however, not utilize this -optimization.

                  my_multicall(Nodes, Module, Function, Args) ->
                  -  ReqIds = lists:map(fun (Node) ->
                  -                       erpc:send_request(Node, Module, Function, Args)
                  +optimization.

                  my_multicall(Nodes, Module, Function, Args) ->
                  +  ReqIds = lists:map(fun (Node) ->
                  +                       erpc:send_request(Node, Module, Function, Args)
                                        end,
                  -                     Nodes),
                  -  lists:map(fun (ReqId) ->
                  +                     Nodes),
                  +  lists:map(fun (ReqId) ->
                                 try
                  -                {ok, erpc:receive_response(ReqId, infinity)}
                  +                {ok, erpc:receive_response(ReqId, infinity)}
                                 catch
                                   Class:Reason ->
                  -                  {Class, Reason}
                  +                  {Class, Reason}
                                 end
                               end,
                  -            ReqIds).

                  If an erpc operation fails, but it is unknown if the function is/will be + ReqIds).

                  If an erpc operation fails, but it is unknown if the function is/will be applied (that is, a timeout, connection loss, or an improper Nodes list), the caller will not receive any further information about the result if/when the applied function completes. If the applied function communicates with the @@ -1392,9 +1392,9 @@

                  receive_response(RequestId, Timeout)

                  performance. call() can utilize a selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, -however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  -  RequestId = erpc:send_request(Node, Module, Function, Args),
                  -  erpc:receive_response(RequestId, Timeout).

                  If the erpc operation fails, but it is unknown if the function is/will be +however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  +  RequestId = erpc:send_request(Node, Module, Function, Args),
                  +  erpc:receive_response(RequestId, Timeout).

                  If the erpc operation fails, but it is unknown if the function is/will be applied (that is, a timeout, or a connection loss), the caller will not receive any further information about the result if/when the applied function completes. If the applied function explicitly communicates with the calling process, such @@ -1697,9 +1697,9 @@

                  send_request/4

                  performance. call() can utilize a selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, -however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  -  RequestId = erpc:send_request(Node, Module, Function, Args),
                  -  erpc:receive_response(RequestId, Timeout).

                  Fails with an {erpc, badarg} error exception if:

                  • Node is not an atom.
                  • Module is not an atom.
                  • Function is not an atom.
                  • Args is not a list. Note that the list is not verified to be a proper list +however, not utilize this optimization.

                    my_call(Node, Module, Function, Args, Timeout) ->
                    +  RequestId = erpc:send_request(Node, Module, Function, Args),
                    +  erpc:receive_response(RequestId, Timeout).

                    Fails with an {erpc, badarg} error exception if:

                    • Node is not an atom.
                    • Module is not an atom.
                    • Function is not an atom.
                    • Args is not a list. Note that the list is not verified to be a proper list at the client side.

                    Note

                    You cannot make any assumptions about the process that will perform the apply(). It may be a server, or a freshly spawned process.

                    Equivalent to erpc:send_request(Node, erlang, apply, [Fun,[]]), Label, RequestIdCollection).

                    Fails with an {erpc, badarg} error exception if:

                    • Node is not an atom.
                    • Fun is not a fun of zero arity.
                    • RequestIdCollection is detected not to be request identifier collection.

                    Note

                    You cannot make any assumptions about the process that will perform the diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/file.html b/prs/8803/lib/kernel-10.0.1/doc/html/file.html index 2f9890599bd60..c9a1824c8fc30 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/file.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/file.html @@ -180,31 +180,31 @@

                    improve performance for small reads and writes. However, the overhead won't disappear completely and it's best to keep the number of file operations to a minimum. As a contrived example, the following function writes 4MB in 2.5 -seconds when tested:

                    create_file_slow(Name) ->
                    -    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    -    create_file_slow_1(Fd, 4 bsl 20),
                    -    file:close(Fd).
                    +seconds when tested:

                    create_file_slow(Name) ->
                    +    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    +    create_file_slow_1(Fd, 4 bsl 20),
                    +    file:close(Fd).
                     
                    -create_file_slow_1(_Fd, 0) ->
                    +create_file_slow_1(_Fd, 0) ->
                         ok;
                    -create_file_slow_1(Fd, M) ->
                    -    ok = file:write(Fd, <<0>>),
                    -    create_file_slow_1(Fd, M - 1).

                    The following functionally equivalent code writes 128 bytes per call to +create_file_slow_1(Fd, M) -> + ok = file:write(Fd, <<0>>), + create_file_slow_1(Fd, M - 1).

                    The following functionally equivalent code writes 128 bytes per call to write/2 and so does the same work in 0.08 seconds, which is roughly 30 times -faster:

                    create_file(Name) ->
                    -    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    -    create_file_1(Fd, 4 bsl 20),
                    -    file:close(Fd),
                    +faster:

                    create_file(Name) ->
                    +    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    +    create_file_1(Fd, 4 bsl 20),
                    +    file:close(Fd),
                         ok.
                     
                    -create_file_1(_Fd, 0) ->
                    +create_file_1(_Fd, 0) ->
                         ok;
                    -create_file_1(Fd, M) when M >= 128 ->
                    -    ok = file:write(Fd, <<0:(128)/unit:8>>),
                    -    create_file_1(Fd, M - 128);
                    -create_file_1(Fd, M) ->
                    -    ok = file:write(Fd, <<0:(M)/unit:8>>),
                    -    create_file_1(Fd, M - 1).

                    When writing data it's generally more efficient to write a list of binaries +create_file_1(Fd, M) when M >= 128 -> + ok = file:write(Fd, <<0:(128)/unit:8>>), + create_file_1(Fd, M - 128); +create_file_1(Fd, M) -> + ok = file:write(Fd, <<0:(M)/unit:8>>), + create_file_1(Fd, M - 1).

                    When writing data it's generally more efficient to write a list of binaries rather than a list of integers. It is not needed to flatten a deep list before writing. On Unix hosts, scatter output, which writes a set of buffers in one operation, is used when possible. In this way @@ -1978,8 +1978,8 @@

                    consult(Filename)

                    For a list of typical error codes, see open/2.

                  • {error, {Line, Mod, Term}} - An error occurred when interpreting the Erlang terms in the file. To convert the three-element tuple to an English description of the error, use format_error/1.

                  Example:

                  f.txt:  {person, "kalle", 25}.
                  -        {person, "pelle", 30}.
                  1> file:consult("f.txt").
                  -{ok,[{person,"kalle",25},{person,"pelle",30}]}

                  The encoding of Filename can be set by a comment, as described in + {person, "pelle", 30}.

                1> file:consult("f.txt").
                +{ok,[{person,"kalle",25},{person,"pelle",30}]}

                The encoding of Filename can be set by a comment, as described in epp.

                @@ -3336,7 +3336,7 @@

                read_file_info(File, Opts)

                Retrieves information about a file. Returns {ok, FileInfo} if successful, otherwise {error, Reason}.

                FileInfo is a record file_info, defined in the Kernel include file file.hrl. -Include the following directive in the module from which the function is called:

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

                The time type returned in atime, mtime, and ctime is dependent on the time +Include the following directive in the module from which the function is called:

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

                The time type returned in atime, mtime, and ctime is dependent on the time type set in Opts :: {time, Type} as follows:

                • local - Returns local time.

                • universal - Returns universal time.

                • posix - Returns seconds since or before Unix time epoch, which is 1970-01-01 00:00 UTC.

                Default is {time, local}.

                If the option raw is set, the file server is not called and only information about local files is returned. Note that this will break this module's atomicity @@ -4026,7 +4026,7 @@

                write_file_info(Filename, FileInfo, Opts)Changes file information. Returns ok if successful, otherwise {error, Reason}.

                FileInfo is a record file_info, defined in the Kernel include file file.hrl. Include the following directive in the module from -which the function is called:

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

                The time type set in atime, mtime, and ctime depends on the time type set +which the function is called:

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

                The time type set in atime, mtime, and ctime depends on the time type set in Opts :: {time, Type} as follows:

                • local - Interprets the time set as local.

                • universal - Interprets it as universal time.

                • posix - Must be seconds since or before Unix time epoch, which is 1970-01-01 00:00 UTC.

                Default is {time, local}.

                If the option raw is set, the file server is not called and only information about local files is returned.

                The following fields are used from the record, if they are specified:

                • atime = date_time/0 | non_neg_integer/0 - The last time the file was diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/gen_sctp.html b/prs/8803/lib/kernel-10.0.1/doc/html/gen_sctp.html index 4bcd7ba32e700..6459da9e85ff2 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/gen_sctp.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/gen_sctp.html @@ -136,7 +136,7 @@

                  lksctp-tools-1.0.6

                • Briefly on Solaris 10
                • SUSE Linux Enterprise Server 10 Service Pack 1 (x86_64) kernel 2.6.16.54-0.2.3-smp with lksctp-tools-1.0.7
                • FreeBSD 8.2

                This module was written for one-to-many style sockets (type seqpacket). With the addition of peeloff/2, one-to-one style sockets (type stream) -were introduced.

                Record definitions for this module can be found using:

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

                These record definitions use the "new" spelling 'adaptation', +were introduced.

                Record definitions for this module can be found using:

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

                These record definitions use the "new" spelling 'adaptation', not the deprecated 'adaption', regardless of which spelling the underlying C API uses.

                @@ -181,31 +181,31 @@

                buffer for this socket. Sending errors would occur for datagrams larger than val(recbuf). Setting this option also adjusts the size of the driver buffer (see buffer above).

              • {sctp_module, module()} - Overrides which callback module is used. -Defaults to inet_sctp for IPv4 and inet6_sctp for IPv6.

              • {sctp_rtoinfo, #sctp_rtoinfo{}}

                #sctp_rtoinfo{
                -      assoc_id = assoc_id(),
                -      initial  = integer(),
                -      max      = integer(),
                -      min      = integer()
                -}

                Determines retransmission time-out parameters, in milliseconds, for the +Defaults to inet_sctp for IPv4 and inet6_sctp for IPv6.

              • {sctp_rtoinfo, #sctp_rtoinfo{}}

                #sctp_rtoinfo{
                +      assoc_id = assoc_id(),
                +      initial  = integer(),
                +      max      = integer(),
                +      min      = integer()
                +}

                Determines retransmission time-out parameters, in milliseconds, for the association(s) specified by assoc_id.

                assoc_id = 0 (default) indicates the whole endpoint. See RFC 2960 and Sockets API Extensions for SCTP -for the exact semantics of the field values.

              • {sctp_associnfo, #sctp_assocparams{}}

                #sctp_assocparams{
                -      assoc_id                 = assoc_id(),
                -      asocmaxrxt               = integer(),
                -      number_peer_destinations = integer(),
                -      peer_rwnd                = integer(),
                -      local_rwnd               = integer(),
                -      cookie_life              = integer()
                -}

                Determines association parameters for the association(s) specified by +for the exact semantics of the field values.

              • {sctp_associnfo, #sctp_assocparams{}}

                #sctp_assocparams{
                +      assoc_id                 = assoc_id(),
                +      asocmaxrxt               = integer(),
                +      number_peer_destinations = integer(),
                +      peer_rwnd                = integer(),
                +      local_rwnd               = integer(),
                +      cookie_life              = integer()
                +}

                Determines association parameters for the association(s) specified by assoc_id.

                assoc_id = 0 (default) indicates the whole endpoint. See Sockets API Extensions for SCTP -for the discussion of their semantics. Rarely used.

              • {sctp_initmsg, #sctp_initmsg{}}

                #sctp_initmsg{
                -     num_ostreams   = integer(),
                -     max_instreams  = integer(),
                -     max_attempts   = integer(),
                -     max_init_timeo = integer()
                -}

                Determines the default parameters that this socket tries to negotiate +for the discussion of their semantics. Rarely used.

              • {sctp_initmsg, #sctp_initmsg{}}

                #sctp_initmsg{
                +     num_ostreams   = integer(),
                +     max_instreams  = integer(),
                +     max_attempts   = integer(),
                +     max_init_timeo = integer()
                +}

                Determines the default parameters that this socket tries to negotiate with its peer while establishing an association with it. Is to be set after open/* but before the first connect/*. #sctp_initmsg{} can also be used as ancillary data with the first call of @@ -222,52 +222,52 @@

                performance reasons only.

              • {sctp_i_want_mapped_v4_addr, true|false} - Turns on|off automatic mapping of IPv4 addresses into IPv6 ones (if the socket address family is AF_INET6).

              • {sctp_maxseg, integer()} - Determines the maximum chunk size if message -fragmentation is used. If 0, the chunk size is limited by the Path MTU only.

              • {sctp_primary_addr, #sctp_prim{}}

                #sctp_prim{
                -      assoc_id = assoc_id(),
                -      addr     = {IP, Port}
                -}
                - IP = ip_address()
                - Port = port_number()

                For the association specified by assoc_id, {IP,Port} must be one of the +fragmentation is used. If 0, the chunk size is limited by the Path MTU only.

              • {sctp_primary_addr, #sctp_prim{}}

                #sctp_prim{
                +      assoc_id = assoc_id(),
                +      addr     = {IP, Port}
                +}
                + IP = ip_address()
                + Port = port_number()

                For the association specified by assoc_id, {IP,Port} must be one of the peer addresses. This option determines that the specified address is treated -by the local SCTP stack as the primary address of the peer.

              • {sctp_set_peer_primary_addr, #sctp_setpeerprim{}}

                #sctp_setpeerprim{
                -      assoc_id = assoc_id(),
                -      addr     = {IP, Port}
                -}
                - IP = ip_address()
                - Port = port_number()

                When set, informs the peer to use {IP, Port} as the primary address of the -local endpoint for the association specified by assoc_id.

              • {sctp_adaptation_layer, #sctp_setadaptation{}}

                #sctp_setadaptation{
                -      adaptation_ind = integer()
                -}

                When set, requests that the local endpoint uses the value specified by +by the local SCTP stack as the primary address of the peer.

              • {sctp_set_peer_primary_addr, #sctp_setpeerprim{}}

                #sctp_setpeerprim{
                +      assoc_id = assoc_id(),
                +      addr     = {IP, Port}
                +}
                + IP = ip_address()
                + Port = port_number()

                When set, informs the peer to use {IP, Port} as the primary address of the +local endpoint for the association specified by assoc_id.

              • {sctp_adaptation_layer, #sctp_setadaptation{}}

                #sctp_setadaptation{
                +      adaptation_ind = integer()
                +}

                When set, requests that the local endpoint uses the value specified by adaptation_ind as the Adaptation Indication parameter for establishing new associations. For details, see RFC 2960 and -Sockets API Extensions for SCTP.

              • {sctp_peer_addr_params, #sctp_paddrparams{}}

                #sctp_paddrparams{
                -      assoc_id   = assoc_id(),
                -      address    = {IP, Port},
                -      hbinterval = integer(),
                -      pathmaxrxt = integer(),
                -      pathmtu    = integer(),
                -      sackdelay  = integer(),
                -      flags      = list()
                -}
                -IP = ip_address()
                -Port = port_number()

                Determines various per-address parameters for the association specified by +Sockets API Extensions for SCTP.

              • {sctp_peer_addr_params, #sctp_paddrparams{}}

                #sctp_paddrparams{
                +      assoc_id   = assoc_id(),
                +      address    = {IP, Port},
                +      hbinterval = integer(),
                +      pathmaxrxt = integer(),
                +      pathmtu    = integer(),
                +      sackdelay  = integer(),
                +      flags      = list()
                +}
                +IP = ip_address()
                +Port = port_number()

                Determines various per-address parameters for the association specified by assoc_id and the peer address address (the SCTP protocol supports multi-homing, so more than one address can correspond to a specified association).

                • hbinterval - Heartbeat interval, in milliseconds

                • pathmaxrxt - Maximum number of retransmissions before this address is considered unreachable (and an alternative address is selected)

                • pathmtu - Fixed Path MTU, if automatic discovery is disabled (see flags below)

                • sackdelay - Delay, in milliseconds, for SAC messages (if the delay is -enabled, see flags below)

                • flags - The following flags are available:

                  • hb_enable - Enables heartbeat

                  • hb_disable - Disables heartbeat

                  • hb_demand - Initiates heartbeat immediately

                  • pmtud_enable - Enables automatic Path MTU discovery

                  • pmtud_disable - Disables automatic Path MTU discovery

                  • sackdelay_enable - Enables SAC delay

                  • sackdelay_disable - Disables SAC delay

              • {sctp_default_send_param, #sctp_sndrcvinfo{}}

                #sctp_sndrcvinfo{
                -      stream     = integer(),
                -      ssn        = integer(),
                -      flags      = list(),
                -      ppid       = integer(),
                -      context    = integer(),
                -      timetolive = integer(),
                -      tsn        = integer(),
                -      cumtsn     = integer(),
                -      assoc_id   = assoc_id()
                -}

                #sctp_sndrcvinfo{} is used both in this socket option, and as +enabled, see flags below)

              • flags - The following flags are available:

                • hb_enable - Enables heartbeat

                • hb_disable - Disables heartbeat

                • hb_demand - Initiates heartbeat immediately

                • pmtud_enable - Enables automatic Path MTU discovery

                • pmtud_disable - Disables automatic Path MTU discovery

                • sackdelay_enable - Enables SAC delay

                • sackdelay_disable - Disables SAC delay

            • {sctp_default_send_param, #sctp_sndrcvinfo{}}

              #sctp_sndrcvinfo{
              +      stream     = integer(),
              +      ssn        = integer(),
              +      flags      = list(),
              +      ppid       = integer(),
              +      context    = integer(),
              +      timetolive = integer(),
              +      tsn        = integer(),
              +      cumtsn     = integer(),
              +      assoc_id   = assoc_id()
              +}

              #sctp_sndrcvinfo{} is used both in this socket option, and as ancillary data while sending or receiving SCTP messages. When set as an option, it provides default values for subsequent send calls on the association specified by assoc_id.

              assoc_id = 0 (default) indicates the whole endpoint.

              The following fields typically must be specified by the sender:

              • sinfo_stream - Stream number (0-base) within the association to send @@ -276,7 +276,7 @@

                data

              • eof - Gracefully shuts down the current association, with flushing of unsent data

              Other fields are rarely used. For complete information, see RFC 2960 and -Sockets API Extensions for SCTP.

          • {sctp_events, #sctp_event_subscribe{}}

            #sctp_event_subscribe{
            +Sockets API Extensions for SCTP.

        • {sctp_events, #sctp_event_subscribe{}}

          #sctp_event_subscribe{
                   data_io_event          = true | false,
                   association_event      = true | false,
                   address_event          = true | false,
          @@ -285,42 +285,42 @@ 

          shutdown_event = true | false, partial_delivery_event = true | false, adaptation_layer_event = true | false -}

          This option determines which SCTP Events that are to be +}

          This option determines which SCTP Events that are to be received (through recv/*) along with the data. The only exception is data_io_event, which enables or disables receiving of #sctp_sndrcvinfo{} ancillary data, not events. By default, all flags except adaptation_layer_event are enabled, although sctp_data_io_event and association_event are used by the driver -itself and not exported to the user level.

        • {sctp_delayed_ack_time, #sctp_assoc_value{}}

          #sctp_assoc_value{
          -      assoc_id    = assoc_id(),
          -      assoc_value = integer()
          -}

          Rarely used. Determines the ACK time (specified by assoc_value, in +itself and not exported to the user level.

        • {sctp_delayed_ack_time, #sctp_assoc_value{}}

          #sctp_assoc_value{
          +      assoc_id    = assoc_id(),
          +      assoc_value = integer()
          +}

          Rarely used. Determines the ACK time (specified by assoc_value, in milliseconds) for the specified association or the whole endpoint if -assoc_value = 0 (default).

        • {sctp_status, #sctp_status{}}

          #sctp_status{
          -      assoc_id            = assoc_id(),
          -      state               = atom(),
          -      rwnd                = integer(),
          -      unackdata           = integer(),
          -      penddata            = integer(),
          -      instrms             = integer(),
          -      outstrms            = integer(),
          -      fragmentation_point = integer(),
          -      primary             = #sctp_paddrinfo{}
          -}

          This option is read-only. It determines the status of the SCTP association +assoc_value = 0 (default).

        • {sctp_status, #sctp_status{}}

          #sctp_status{
          +      assoc_id            = assoc_id(),
          +      state               = atom(),
          +      rwnd                = integer(),
          +      unackdata           = integer(),
          +      penddata            = integer(),
          +      instrms             = integer(),
          +      outstrms            = integer(),
          +      fragmentation_point = integer(),
          +      primary             = #sctp_paddrinfo{}
          +}

          This option is read-only. It determines the status of the SCTP association specified by assoc_id. The following are the possible values of state (the state designations are mostly self-explanatory):

          • sctp_state_empty - Default. Means that no other state is active.

          • sctp_state_closed

          • sctp_state_cookie_wait

          • sctp_state_cookie_echoed

          • sctp_state_established

          • sctp_state_shutdown_pending

          • sctp_state_shutdown_sent

          • sctp_state_shutdown_received

          • sctp_state_shutdown_ack_sent

          Semantics of the other fields:

          • sstat_rwnd - Current receiver window size of the association

          • sstat_unackdata - Number of unacked data chunks

          • sstat_penddata - Number of data chunks pending receipt

          • sstat_instrms - Number of inbound streams

          • sstat_outstrms - Number of outbound streams

          • sstat_fragmentation_point - Message size at which SCTP fragmentation occurs

          • sstat_primary - Information on the current primary peer address (see -below for the format of #sctp_paddrinfo{})

        • {sctp_get_peer_addr_info, #sctp_paddrinfo{}}

          #sctp_paddrinfo{
          -      assoc_id  = assoc_id(),
          -      address   = {IP, Port},
          +below for the format of #sctp_paddrinfo{})

      • {sctp_get_peer_addr_info, #sctp_paddrinfo{}}

        #sctp_paddrinfo{
        +      assoc_id  = assoc_id(),
        +      address   = {IP, Port},
               state     = inactive | active | unconfirmed,
        -      cwnd      = integer(),
        -      srtt      = integer(),
        -      rto       = integer(),
        -      mtu       = integer()
        -}
        -IP = ip_address()
        -Port = port_number()

        This option is read-only. It determines the parameters specific to + cwnd = integer(), + srtt = integer(), + rto = integer(), + mtu = integer() +} +IP = ip_address() +Port = port_number()

        This option is read-only. It determines the parameters specific to the peer address specified by address within the association specified by assoc_id. Field address fmust be set by the caller; all other fields are filled in on return. If assoc_id = 0 (default), the address @@ -334,119 +334,119 @@

        SCTP Examples

        Example of an Erlang SCTP server that receives SCTP messages -and prints them on the standard output:

        -module(sctp_server).
        +and prints them on the standard output:

        -module(sctp_server).
         
        --export([server/0,server/1,server/2]).
        --include_lib("kernel/include/inet.hrl").
        --include_lib("kernel/include/inet_sctp.hrl").
        -
        -server() ->
        -    server(any, 2006).
        -
        -server([Host,Port]) when is_list(Host), is_list(Port) ->
        -    {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),
        -    io:format("~w -> ~w~n", [Host, IP]),
        -    server([IP, list_to_integer(Port)]).
        -
        -server(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,
        -                      is_integer(Port) ->
        -    {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),
        -    io:format("Listening on ~w:~w. ~w~n", [IP,Port,S]),
        -    ok     = gen_sctp:listen(S, true),
        -    server_loop(S).
        -
        -server_loop(S) ->
        -    case gen_sctp:recv(S) of
        -    {error, Error} ->
        -        io:format("SCTP RECV ERROR: ~p~n", [Error]);
        +-export([server/0,server/1,server/2]).
        +-include_lib("kernel/include/inet.hrl").
        +-include_lib("kernel/include/inet_sctp.hrl").
        +
        +server() ->
        +    server(any, 2006).
        +
        +server([Host,Port]) when is_list(Host), is_list(Port) ->
        +    {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),
        +    io:format("~w -> ~w~n", [Host, IP]),
        +    server([IP, list_to_integer(Port)]).
        +
        +server(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,
        +                      is_integer(Port) ->
        +    {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),
        +    io:format("Listening on ~w:~w. ~w~n", [IP,Port,S]),
        +    ok     = gen_sctp:listen(S, true),
        +    server_loop(S).
        +
        +server_loop(S) ->
        +    case gen_sctp:recv(S) of
        +    {error, Error} ->
        +        io:format("SCTP RECV ERROR: ~p~n", [Error]);
             Data ->
        -        io:format("Received: ~p~n", [Data])
        +        io:format("Received: ~p~n", [Data])
             end,
        -    server_loop(S).

        Example of an Erlang SCTP client interacting with the above server. + server_loop(S).

        Example of an Erlang SCTP client interacting with the above server. Note that in this example the client creates an association with the server with 5 outbound streams. Therefore, sending of "Test 0" over stream 0 succeeds, but sending of "Test 5" over stream 5 fails. The client then aborts the association, which results in that -the corresponding event is received on the server side.

        -module(sctp_client).
        +the corresponding event is received on the server side.

        -module(sctp_client).
         
        --export([client/0, client/1, client/2]).
        --include_lib("kernel/include/inet.hrl").
        --include_lib("kernel/include/inet_sctp.hrl").
        -
        -client() ->
        -    client([localhost]).
        -
        -client([Host]) ->
        -    client(Host, 2006);
        -
        -client([Host, Port]) when is_list(Host), is_list(Port) ->
        -    client(Host,list_to_integer(Port)),
        -    init:stop().
        -
        -client(Host, Port) when is_integer(Port) ->
        -    {ok,S}     = gen_sctp:open(),
        -    {ok,Assoc} = gen_sctp:connect
        -        (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),
        -    io:format("Connection Successful, Assoc=~p~n", [Assoc]),
        -
        -    io:write(gen_sctp:send(S, Assoc, 0, <<"Test 0">>)),
        -    io:nl(),
        -    timer:sleep(10000),
        -    io:write(gen_sctp:send(S, Assoc, 5, <<"Test 5">>)),
        -    io:nl(),
        -    timer:sleep(10000),
        -    io:write(gen_sctp:abort(S, Assoc)),
        -    io:nl(),
        -
        -    timer:sleep(1000),
        -    gen_sctp:close(S).

        A simple Erlang SCTP client that uses the connect_init API:

        -module(ex3).
        +-export([client/0, client/1, client/2]).
        +-include_lib("kernel/include/inet.hrl").
        +-include_lib("kernel/include/inet_sctp.hrl").
        +
        +client() ->
        +    client([localhost]).
        +
        +client([Host]) ->
        +    client(Host, 2006);
        +
        +client([Host, Port]) when is_list(Host), is_list(Port) ->
        +    client(Host,list_to_integer(Port)),
        +    init:stop().
        +
        +client(Host, Port) when is_integer(Port) ->
        +    {ok,S}     = gen_sctp:open(),
        +    {ok,Assoc} = gen_sctp:connect
        +        (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),
        +    io:format("Connection Successful, Assoc=~p~n", [Assoc]),
        +
        +    io:write(gen_sctp:send(S, Assoc, 0, <<"Test 0">>)),
        +    io:nl(),
        +    timer:sleep(10000),
        +    io:write(gen_sctp:send(S, Assoc, 5, <<"Test 5">>)),
        +    io:nl(),
        +    timer:sleep(10000),
        +    io:write(gen_sctp:abort(S, Assoc)),
        +    io:nl(),
        +
        +    timer:sleep(1000),
        +    gen_sctp:close(S).

        A simple Erlang SCTP client that uses the connect_init API:

        -module(ex3).
         
        --export([client/4]).
        --include_lib("kernel/include/inet.hrl").
        --include_lib("kernel/include/inet_sctp.hrl").
        -
        -client(Peer1, Port1, Peer2, Port2)
        -  when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->
        -    {ok,S}     = gen_sctp:open(),
        -    SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},
        -    ActiveOpt = {active, true},
        -    Opts = [SctpInitMsgOpt, ActiveOpt],
        -    ok = gen_sctp:connect(S, Peer1, Port1, Opts),
        -    ok = gen_sctp:connect(S, Peer2, Port2, Opts),
        -    io:format("Connections initiated~n", []),
        -    client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).
        -
        -client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->
        +-export([client/4]).
        +-include_lib("kernel/include/inet.hrl").
        +-include_lib("kernel/include/inet_sctp.hrl").
        +
        +client(Peer1, Port1, Peer2, Port2)
        +  when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->
        +    {ok,S}     = gen_sctp:open(),
        +    SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},
        +    ActiveOpt = {active, true},
        +    Opts = [SctpInitMsgOpt, ActiveOpt],
        +    ok = gen_sctp:connect(S, Peer1, Port1, Opts),
        +    ok = gen_sctp:connect(S, Peer2, Port2, Opts),
        +    io:format("Connections initiated~n", []),
        +    client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).
        +
        +client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->
             receive
        -        {sctp, S, Peer1, Port1, {_Anc, SAC}}
        -          when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->
        -            io:format("Association 1 connect result: ~p. AssocId: ~p~n",
        -                      [SAC#sctp_assoc_change.state,
        -                       SAC#sctp_assoc_change.assoc_id]),
        -            client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,
        -                        Peer2, Port2, AssocId2);
        -
        -        {sctp, S, Peer2, Port2, {_Anc, SAC}}
        -          when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->
        -            io:format("Association 2 connect result: ~p. AssocId: ~p~n",
        -                      [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),
        -            client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,
        -                       SAC#sctp_assoc_change.assoc_id);
        -
        -        {sctp, S, Peer1, Port1, Data} ->
        -            io:format("Association 1: received ~p~n", [Data]),
        -            client_loop(S, Peer1, Port1, AssocId1,
        -                        Peer2, Port2, AssocId2);
        -
        -        {sctp, S, Peer2, Port2, Data} ->
        -            io:format("Association 2: received ~p~n", [Data]),
        -            client_loop(S, Peer1, Port1, AssocId1,
        -                        Peer2, Port2, AssocId2);
        +        {sctp, S, Peer1, Port1, {_Anc, SAC}}
        +          when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->
        +            io:format("Association 1 connect result: ~p. AssocId: ~p~n",
        +                      [SAC#sctp_assoc_change.state,
        +                       SAC#sctp_assoc_change.assoc_id]),
        +            client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,
        +                        Peer2, Port2, AssocId2);
        +
        +        {sctp, S, Peer2, Port2, {_Anc, SAC}}
        +          when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->
        +            io:format("Association 2 connect result: ~p. AssocId: ~p~n",
        +                      [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),
        +            client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,
        +                       SAC#sctp_assoc_change.assoc_id);
        +
        +        {sctp, S, Peer1, Port1, Data} ->
        +            io:format("Association 1: received ~p~n", [Data]),
        +            client_loop(S, Peer1, Port1, AssocId1,
        +                        Peer2, Port2, AssocId2);
        +
        +        {sctp, S, Peer2, Port2, Data} ->
        +            io:format("Association 2: received ~p~n", [Data]),
        +            client_loop(S, Peer1, Port1, AssocId1,
        +                        Peer2, Port2, AssocId2);
         
                 Other ->
        -            io:format("Other ~p~n", [Other]),
        -            client_loop(S, Peer1, Port1, AssocId1,
        -                        Peer2, Port2, AssocId2)
        +            io:format("Other ~p~n", [Other]),
        +            client_loop(S, Peer1, Port1, AssocId1,
        +                        Peer2, Port2, AssocId2)
         
             after 5000 ->
                     ok
        @@ -1445,16 +1445,16 @@ 

        connect(Socket, Addr, Port, Opts, Timeout)<

        The result of connect/* is an #sctp_assoc_change{} event that contains, in particular, the new Association ID: -l

        #sctp_assoc_change{
        -      state             = atom(),
        -      error             = integer(),
        -      outbound_streams  = integer(),
        -      inbound_streams   = integer(),
        -      assoc_id          = assoc_id()
        -}

        The number of outbound and inbound streams for the association -can be set by giving an sctp_initmsg option to connect as in:

        connect(Socket, Ip, Port>,
        -      [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,
        -                                   max_instreams=MaxInStreams}}])

        All options Opt are set on the socket before the association is attempted. +l

        #sctp_assoc_change{
        +      state             = atom(),
        +      error             = integer(),
        +      outbound_streams  = integer(),
        +      inbound_streams   = integer(),
        +      assoc_id          = assoc_id()
        +}

        The number of outbound and inbound streams for the association +can be set by giving an sctp_initmsg option to connect as in:

        connect(Socket, Ip, Port>,
        +      [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,
        +                                   max_instreams=MaxInStreams}}])

        All options Opt are set on the socket before the association is attempted. If an option record has undefined field values, the options record is first read from the socket for those values. In effect, Opt option records only need to define field values to change @@ -1938,7 +1938,7 @@

        open/1

        and with reasonably large kernel and driver buffers.

        When the socket is in passive mode, data can be received through the recv/1,2 calls.

        When the socket is in active mode, -data received data is delivered to the controlling process as messages:

        {sctp, Socket, FromIP, FromPort, {AncData, Data}}

        See recv/1,2 for a description of the message fields.

        Note

        This message format unfortunately differs slightly from the +data received data is delivered to the controlling process as messages:

        {sctp, Socket, FromIP, FromPort, {AncData, Data}}

        See recv/1,2 for a description of the message fields.

        Note

        This message format unfortunately differs slightly from the gen_udp message format with ancillary data, and from the recv/1,2 return tuple format.

        @@ -2200,39 +2200,39 @@

        recv(Socket, Timeout)

        Possible SCTP events

    -

    @@ -539,19 +539,19 @@

    level notice or more severe, are logged to the terminal via the default handler. To also log info events, you can either change the primary log level to info:

    1> logger:set_primary_config(level, info).
    -ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
    +ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
     ok

    This allows info events to pass through to the default handler, and be printed to the terminal as well. If there are many info events, it can be useful to print these to a file instead.

    First, set the log level of the default handler to notice, preventing it from -printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
    +printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
     ok

    Then, add a new handler which prints to file. You can use the handler module -logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    -#{config => #{file => "./info.log"},level => info}
    -5> logger:add_handler(myhandler, logger_std_h, Config).
    +logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    +#{config => #{file => "./info.log"},level => info}
    +5> logger:add_handler(myhandler, logger_std_h, Config).
     ok

    Since filter_default defaults to log, this handler now receives all log events. If you want info events only in the file, you must add a filter to stop -all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    -                             {fun logger_filters:level/2, {stop, neq, info}}).
    +all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    +                             {fun logger_filters:level/2, {stop, neq, info}}).
     ok

    See section Filters for more information about the filters and the filter_default configuration parameter.

    @@ -576,48 +576,48 @@

    database.

    When logger:get_config/0 or logger:get_handler_config/0,1 is called, Logger calls HModule:filter_config(Config). This function must return the -handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    --export([log/2]).
    +handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    +-export([log/2]).
     
    -log(LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log +log(LogEvent, #{formatter := {FModule, FConfig}}) -> + io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log events are printed directly from the client process.

    For information and examples of overload protection, please refer to section Protecting the Handler from Overload, and the implementation of logger_std_h and logger_disk_log_h .

    The following is a simpler example of a handler which logs to a file through one -single process:

    -module(myhandler2).
    --export([adding_handler/1, removing_handler/1, log/2]).
    --export([init/1, handle_call/3, handle_cast/2, terminate/2]).
    +single process:

    -module(myhandler2).
    +-export([adding_handler/1, removing_handler/1, log/2]).
    +-export([init/1, handle_call/3, handle_cast/2, terminate/2]).
     
    -adding_handler(Config) ->
    -    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    -    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    -    {ok, Config#{config => MyConfig#{pid => Pid}}}.
    +adding_handler(Config) ->
    +    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    +    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    +    {ok, Config#{config => MyConfig#{pid => Pid}}}.
     
    -removing_handler(#{config := #{pid := Pid}}) ->
    -    gen_server:stop(Pid).
    +removing_handler(#{config := #{pid := Pid}}) ->
    +    gen_server:stop(Pid).
     
    -log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    -    gen_server:cast(Pid, {log, LogEvent, Config}).
    +log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    +    gen_server:cast(Pid, {log, LogEvent, Config}).
     
    -init(#{file := File}) ->
    -    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    -    {ok, #{file => File, fd => Fd}}.
    +init(#{file := File}) ->
    +    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    +    {ok, #{file => File, fd => Fd}}.
     
    -handle_call(_, _, State) ->
    -    {reply, {error, bad_request}, State}.
    +handle_call(_, _, State) ->
    +    {reply, {error, bad_request}, State}.
     
    -handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    -    do_log(Fd, LogEvent, Config),
    -    {noreply, State}.
    +handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    +    do_log(Fd, LogEvent, Config),
    +    {noreply, State}.
     
    -terminate(_Reason, #{fd := Fd}) ->
    -    _ = file:close(Fd),
    +terminate(_Reason, #{fd := Fd}) ->
    +    _ = file:close(Fd),
         ok.
     
    -do_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    String = FModule:format(LogEvent, FConfig),
    -    io:put_chars(Fd, String).

    +do_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) -> + String = FModule:format(LogEvent, FConfig), + io:put_chars(Fd, String).

    @@ -683,11 +683,11 @@

    performance reasons, the client processes must never be blocked by synchronous log requests. It is possible, perhaps, that dropping or flushing events is still acceptable, since it does not affect the performance of the client processes -sending the log events.

    A configuration example:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    +sending the log events.

    A configuration example:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
                                      sync_mode_qlen => 100,
                                      drop_mode_qlen => 1000,
    -                                 flush_qlen => 2000}}).

    + flush_qlen => 2000}}).

    @@ -701,11 +701,11 @@

    disables it.

    Defaults to true.

  • burst_limit_max_count - This is the maximum number of events to handle within a burst_limit_window_time time frame. After the limit is reached, successive events are dropped until the end of the time frame.

    Defaults to 500 events.

  • burst_limit_window_time - See the previous description of -burst_limit_max_count.

    Defaults to 1000 milliseconds.

  • A configuration example:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +burst_limit_max_count.

    Defaults to 1000 milliseconds.

    A configuration example:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      burst_limit_enable => true,
                                      burst_limit_max_count => 20,
    -                                 burst_limit_window_time => 500}}).

    + burst_limit_window_time => 500}}).

    @@ -741,11 +741,11 @@

    forwards the event to the proxy on the remote node.

    When receiving a log event, either from the emulator or from a remote node, the proxy calls the Logger API to log the event.

    The proxy process is overload protected in the same way as described in section Protecting the Handler from Overload, -but with the following default values:

        #{sync_mode_qlen => 500,
    +but with the following default values:

        #{sync_mode_qlen => 500,
           drop_mode_qlen => 1000,
           flush_qlen => 5000,
           burst_limit_enable => false,
    -      overload_kill_enable => false}

    For log events from the emulator, synchronous message passing mode is not + overload_kill_enable => false}

    For log events from the emulator, synchronous message passing mode is not applicable, since all messages are passed asynchronously by the emulator. Drop mode is achieved by setting the system_logger to undefined, forcing the emulator to drop events until it is set back to the proxy pid again.

    The proxy uses erlang:send_nosuspend/2 when sending log events to a remote diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/logger_cookbook.html b/prs/8803/lib/kernel-10.0.1/doc/html/logger_cookbook.html index c1b22de3fe131..502e4b3f14718 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/logger_cookbook.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/logger_cookbook.html @@ -144,19 +144,19 @@

    -
    1> logger:i(primary).
    +
    1> logger:i(primary).
     Primary configuration:
         Level: notice
         Filter Default: log
         Filters:
    -        (none)

    It is also possible to fetch the configuration using + (none)

    It is also possible to fetch the configuration using logger:get_primary_config().

    See also

    -
    2> logger:i(handlers).
    +
    2> logger:i(handlers).
     Handler configuration:
         Id: default
             Module: logger_std_h
    @@ -173,10 +173,10 @@ 

    @@ -233,17 +233,17 @@

    Since single line logging is the default of the built-in formatter you only have to provide the empty map as the configuration. The example below uses the sys.config to change the formatter configuration.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter, #{ }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter, #{ }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, an error").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, an error").
     1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error

    However, if you just want to change it for the current session you can also do -that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
    +that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
     ok
    -2> logger:error("Oh noes, another error").
    +2> logger:error("Oh noes, another error").
     1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error

    See also

    @@ -251,14 +251,14 @@

    Add file and line number to log entries

    You can change what is printed to the log by using the formatter template:

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter,
    -        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter,
    +        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
     1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors

    Note that file and line have to be added in the metadata by the caller of logger:log/3 as otherwise Logger will not know from where it was called. The file and line number are automatically added if you use the ?LOG_ERROR macros @@ -275,18 +275,18 @@

    Instead of printing the logs to stdout we print them to a rotating file log.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ config => #{ file => "log/erlang.log",
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ config => #{ file => "log/erlang.log",
                           max_no_bytes => 4096,
    -                      max_no_files => 5},
    -         formatter => {logger_formatter, #{}}}}]}]}].
    +                      max_no_files => 5},
    +         formatter => {logger_formatter, #{}}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     ok
    -2> erlang:halt().
    +2> erlang:halt().
     $ cat log/erlang.log
     2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors

    See also

    @@ -296,24 +296,24 @@

    Add a handler that prints debug log events to a file, while the default handler prints only up to notice level events to standard out.

    $ cat sys.config
    -[{kernel,
    -  [{logger_level, all},
    -   {logger,
    -    [{handler, default, logger_std_h,
    -      #{ level => notice }},
    -     {handler, debug, logger_std_h,
    -      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -         config => #{ file => "log/debug.log" } }}
    -    ]}]}].
    +[{kernel,
    +  [{logger_level, all},
    +   {logger,
    +    [{handler, default, logger_std_h,
    +      #{ level => notice }},
    +     {handler, debug, logger_std_h,
    +      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +         config => #{ file => "log/debug.log" } }}
    +    ]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     =ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===
     Oh noes, even more errors
     ok
    -2> logger:debug("A debug event").
    +2> logger:debug("A debug event").
     ok
    -3> erlang:halt().
    +3> erlang:halt().
     $ cat log/debug.log
     2019-10-09T14:41:03.680541+02:00 debug: A debug event

    In the configuration above we first raise the primary log level to max in order for the debug log events to get to the handlers. Then we configure the default @@ -321,13 +321,13 @@

    See also

    @@ -343,7 +343,7 @@

    What to log and how

    The simplest way to log something is by using the Logger macros and give a -report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
    +report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
         dst: {8,8,4,4}
         src: {8,8,8,8}
         status: 418
    @@ -355,14 +355,14 @@ 

    If you want to do structured logging, but still want to have some control of how the final log message is formatted you can give a report_cb as part of the -metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    -                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    -                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    -                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    -                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
    +metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    +                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    +                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    +                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    +                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
                end,
    -?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },
    -           #{ report_cb => ReportCB }).

    This will print the following:

    =ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===
    +?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },
    +           #{ report_cb => ReportCB }).

    This will print the following:

    =ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===
     What: http_error
     Status: 418
     Src: 8.8.8.8 (dns.google)
    @@ -383,22 +383,22 @@ 

    If we only want debug messages from a specific process it is possible to do this with a filter like this:

    %% Initial setup to use a filter for the level filter instead of the primary level
    -PrimaryLevel = maps:get(level, logger:get_primary_config()),
    -ok = logger:add_primary_filter(primary_level,
    -    {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),
    -logger:set_primary_config(filter_default, stop),
    -logger:set_primary_config(level, all),
    +PrimaryLevel = maps:get(level, logger:get_primary_config()),
    +ok = logger:add_primary_filter(primary_level,
    +    {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),
    +logger:set_primary_config(filter_default, stop),
    +logger:set_primary_config(level, all),
     
     %% Test that things work as they should
    -logger:notice("Notice should be logged"),
    -logger:debug("Should not be logged"),
    +logger:notice("Notice should be logged"),
    +logger:debug("Should not be logged"),
     
     %% Add the filter to allow PidToLog to send debug events
    -PidToLog = self(),
    -PidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent;
    -               (_LogEvent, _) -> ignore end,
    -ok = logger:add_primary_filter(pid, {PidFilter,[]}),
    -logger:debug("Debug should be logged").

    There is a bit of setup needed to allow filters to decide whether a specific +PidToLog = self(), +PidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent; + (_LogEvent, _) -> ignore end, +ok = logger:add_primary_filter(pid, {PidFilter,[]}), +logger:debug("Debug should be logged").

    There is a bit of setup needed to allow filters to decide whether a specific process should be allowed to log. This is because the default primary log level is notice and it is enforced before the primary filters. So in order for the pid filter to be useful we have to raise the primary log level to all and then add @@ -415,11 +415,11 @@

    Domains are used to specify which subsystem a certain log event originates from. The default handler will by default only log events with the domain [otp] or without a domain. If you would like to include SSL log events into the default -handler log you could do this:

    1> logger:add_handler_filter(default,ssl_domain,
    -  {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).
    -2> application:ensure_all_started(ssl).
    -{ok,[crypto,asn1,public_key,ssl]}
    -3> ssl:connect("www.erlang.org",443,[{log_level,debug}]).
    +handler log you could do this:

    1> logger:add_handler_filter(default,ssl_domain,
    +  {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).
    +2> application:ensure_all_started(ssl).
    +{ok,[crypto,asn1,public_key,ssl]}
    +3> ssl:connect("www.erlang.org",443,[{log_level,debug}]).
     %% lots of text

    See also

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/logger_disk_log_h.html b/prs/8803/lib/kernel-10.0.1/doc/html/logger_disk_log_h.html index 3deba4fa5f096..527e8dc54998f 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/logger_disk_log_h.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/logger_disk_log_h.html @@ -164,12 +164,12 @@

    and the disk_log handler, and are documented in the User's Guide.

    Notice that when changing the configuration of the handler in runtime, the disk_log options (file, type, max_no_files, max_no_bytes) must not be -modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      type => wrap,
                                      max_no_files => 4,
                                      max_no_bytes => 10000,
    -                                 filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when + filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when starting an Erlang node, change the Kernel default logger to use logger_disk_log_h. Example:

    erl -kernel logger '[{handler,default,logger_disk_log_h,
                           #{config => #{file => "./system_disk_log"}}}]'

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/logger_filters.html b/prs/8803/lib/kernel-10.0.1/doc/html/logger_filters.html index bef210516450e..8e30acb6838db 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/logger_filters.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/logger_filters.html @@ -251,8 +251,8 @@

    domain(LogEvent, Extra)

    events from, for example, a specific functional area. This allows filtering or other specialized treatment in a Logger handler.

    A domain field must be a list of atoms, creating smaller and more specialized domains as the list grows longer. The greatest domain is [], which comprises -all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    -D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 +all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    +D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 is a sub-domain D1. Both D1 and D2 are sub-domains of [].

    The above domains are used for logs originating from Erlang/OTP. D1 specifies that the log event comes from Erlang/OTP in general, and D2 indicates that the log event is a so called SASL report.

    The Extra parameter to the domain/2 function is specified when @@ -267,11 +267,11 @@

    domain(LogEvent, Extra)

    filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, decide if the event is allowed or not.

    Log events that do not contain any domain field, match only when Compare is -equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
    +equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
     ok
    -2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
    +2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
     ...
    -3> logger:add_handler_filter(h1, no_sasl, Filter).
    +3> logger:add_handler_filter(h1, no_sasl, Filter).
     ok
    @@ -316,9 +316,9 @@

    level(LogEvent, Extra)

    filter matches if the value of Operator is:

    • neq - and the compare function returns lt or gt.

    • eq - and the compare function returns eq.

    • lt - and the compare function returns lt.

    • gt - and the compare function returns gt.

    • lteq - and the compare function returns lt or eq.

    • gteq - and the compare function returns gt or eq.

    If the filter matches and Action is log, the log event is allowed. If the filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, will decide if the -event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    -Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    -logger:add_handler_filter(h1, debug_only, Filter).
    +event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    +Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    +logger:add_handler_filter(h1, debug_only, Filter).
     ok
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/logger_std_h.html b/prs/8803/lib/kernel-10.0.1/doc/html/logger_std_h.html index c3d241f189a18..1d0646ced3011 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/logger_std_h.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/logger_std_h.html @@ -185,9 +185,9 @@

    protection behaviour. The same parameters are used both in the standard handler and the disk_log handler, and are documented in the User's Guide.

    Notice that if changing the configuration of the handler in runtime, the type, -file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    -                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, +file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
    +                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, to log to file instead of standard_io, change the Kernel default logger configuration. Example:

    erl -kernel logger '[{handler,default,logger_std_h,
                           #{config => #{file => "./log.log"}}}]'

    An example of how to replace the standard handler with a disk_log handler at diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/net.html b/prs/8803/lib/kernel-10.0.1/doc/html/net.html index ae96899c4232c..7a8be8a3ab923 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/net.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/net.html @@ -565,13 +565,13 @@

    ifaddrs_filter_fun()

    Interface address filtering selector function/0.

    For each ifaddrs entry, return either true to keep the entry or false to discard the entry.

    For example, to get an interface list which only contains -non-loopback inet interfaces:

    net:getifaddrs(
    -    fun (#{ addr  := #{family := inet},
    -            flags := Flags}) ->
    -          not lists:member(loopback, Flags);
    -        (_) ->
    +non-loopback inet interfaces:

    net:getifaddrs(
    +    fun (#{ addr  := #{family := inet},
    +            flags := Flags}) ->
    +          not lists:member(loopback, Flags);
    +        (_) ->
               false
    -    end).
    +
    end).
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/net_adm.html b/prs/8803/lib/kernel-10.0.1/doc/html/net_adm.html index 2fb2c9b832f90..7c60f38e52c76 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/net_adm.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/net_adm.html @@ -491,8 +491,8 @@

    names(Host)

    Returns the names and associated port numbers of the Erlang nodes that epmd -registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    -{ok,[{"arne",40262}]}
    +registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    +{ok,[{"arne",40262}]}
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/net_kernel.html b/prs/8803/lib/kernel-10.0.1/doc/html/net_kernel.html index 2f91c5b70b77f..58c2d1a355c43 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/net_kernel.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/net_kernel.html @@ -132,9 +132,9 @@

    operational for distributed Erlang to work. The purpose of this process is to implement parts of the BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

    An Erlang node is started using command-line flag -name or -sname:

    $ erl -sname foobar

    It is also possible to call net_kernel:start(foobar, #{}) -directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    -{ok,<0.64.0>}
    -(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is +directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    +{ok,<0.64.0>}
    +(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is foobar@Host, where Host is the short name of the host (not the fully qualified domain name). If started with flag -name, the node name is foobar@Host, where Host is the fully qualified domain name. For more @@ -668,13 +668,13 @@

    monitor_nodes(Flag, Options)

    delivered before a nodeup message due to a new connection to the same node. Prior to OTP 23.0, this was not guaranteed to be the case.

    The format of the node status change messages depends on Options. If Options is the empty list or if net_kernel:monitor_nodes/1 is called, the format is as -follows:

    {nodeup, Node} | {nodedown, Node}
    -  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe +follows:

    {nodeup, Node} | {nodedown, Node}
    +  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe for status change messages for visible nodes. That is, only nodes that appear in the result of erlang:nodes/0.

    If Options equals anything other than the empty list, the format of the status -change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    -  Node = node()
    -  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. +change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    +  Node = node()
    +  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. If Options is a map, Info will also be a map. If Options is a list, Info will also be a list.

    When Options is a map, currently the following associations are allowed:

    • connection_id => boolean() - If the value of the association equals true, a connection_id => ConnectionId association will be included in the @@ -708,23 +708,23 @@

      monitor_nodes(Flag, Options)

      {node_type, visible} tuple will be included in the Info list.

    • nodedown_reason - The tuple {nodedown_reason, Reason} will be included in the Info list for nodedown messages.

      See the documentation of the nodedown_reason => boolean() association -above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
    +above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
     ok
    -(a@localhost)2> flush().
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067552,node_type => visible}}
    -Shell got {nodeup,c@localhost,
    -                  #{connection_id => 13892107,node_type => hidden}}
    -Shell got {nodedown,b@localhost,
    -                    #{connection_id => 3067552,node_type => visible,
    -                      nodedown_reason => connection_closed}}
    -Shell got {nodedown,c@localhost,
    -                    #{connection_id => 13892107,node_type => hidden,
    -                      nodedown_reason => net_tick_timeout}}
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067553,node_type => visible}}
    +(a@localhost)2> flush().
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067552,node_type => visible}}
    +Shell got {nodeup,c@localhost,
    +                  #{connection_id => 13892107,node_type => hidden}}
    +Shell got {nodedown,b@localhost,
    +                    #{connection_id => 3067552,node_type => visible,
    +                      nodedown_reason => connection_closed}}
    +Shell got {nodedown,c@localhost,
    +                    #{connection_id => 13892107,node_type => hidden,
    +                      nodedown_reason => net_tick_timeout}}
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067553,node_type => visible}}
     ok
    -(a@localhost)3>
    +
    (a@localhost)3>
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/notes.html b/prs/8803/lib/kernel-10.0.1/doc/html/notes.html index b3c66f2607491..d6709678c7e8a 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/notes.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/notes.html @@ -3919,12 +3919,12 @@

    viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

    NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
    +not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
                 %% ...
    -            exit(Pid, bang),
    -            erlang:demonitor(Mon),
    +            exit(Pid, bang),
    +            erlang:demonitor(Mon),
                 receive
    -                {'DOWN', Mon, process, Pid, _} -> ok
    +                {'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:
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/os.html b/prs/8803/lib/kernel-10.0.1/doc/html/os.html
    index 2dc6de88822a4..8b50df2db374d 100644
    --- a/prs/8803/lib/kernel-10.0.1/doc/html/os.html
    +++ b/prs/8803/lib/kernel-10.0.1/doc/html/os.html
    @@ -656,13 +656,13 @@ 

    cmd(Command, Options)

    Executes Command in a command shell of the target OS, captures the standard -output and standard error of the command, and returns this result as a string.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    -DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another +output and standard error of the command, and returns this result as a string.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    +DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another program can differ, compared with the standard output of the command when called directly from an OS command shell.

    The possible options are:

    • max_size - The maximum size of the data returned by the os:cmd call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

      > os:cmd("cat /dev/zero", #{ max_size => 20 }).
      -[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    +can return a very large, possibly infinite, result.

    > os:cmd("cat /dev/zero", #{ max_size => 20 }).
    +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    @@ -952,7 +952,7 @@

    perf_counter(Unit)

    resolution timestamp.

    This counter is read directly from the hardware or operating system with the same guarantees. This means that two consecutive calls to the function are not guaranteed to be monotonic, though it most likely will be. The performance -counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
    +counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
     176525861
     2> T2 - T1.
     10004
    @@ -1123,16 +1123,16 @@

    timestamp()

    allows you to log time stamps in high resolution and consistent with the time in the rest of the OS.

    Example of code formatting a string in 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).
    --export([format_utc_timestamp/0]).
    -format_utc_timestamp() ->
    -    TS = {_,_,Micro} = os:timestamp(),
    -    {{Year,Month,Day},{Hour,Minute,Second}} =
    -calendar:now_to_universal_time(TS),
    -    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    -    "Aug","Sep","Oct","Nov","Dec"}),
    -    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    -    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
    +HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    +-export([format_utc_timestamp/0]).
    +format_utc_timestamp() ->
    +    TS = {_,_,Micro} = os:timestamp(),
    +    {{Year,Month,Day},{Hour,Minute,Second}} =
    +calendar:now_to_universal_time(TS),
    +    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    +    "Aug","Sep","Oct","Nov","Dec"}),
    +    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    +    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
     29 Apr 2009  9:55:30.051711

    OS system time can also be retrieved by system_time/0 and system_time/1.

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/pg.html b/prs/8803/lib/kernel-10.0.1/doc/html/pg.html index 07059afbefc3c..3ef4019f3a9fb 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/pg.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/pg.html @@ -870,7 +870,7 @@

    monitor_scope(Scope)

    Subscribes the caller to updates from the specified scope.

    Returns content of the entire scope and a reference to match the upcoming notifications.

    Whenever any group membership changes, an update message is sent to the -subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    +subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/rpc.html b/prs/8803/lib/kernel-10.0.1/doc/html/rpc.html index 1e3397167c49d..ca5a6e3ae45a1 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/rpc.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/rpc.html @@ -1079,10 +1079,10 @@

    multicall(Nodes, Module, Function, Args, Ti return values, or {badrpc, Reason} for failing calls. Timeout is a time (integer) in milliseconds, or infinity.

    The following example is useful when new object code is to be loaded on all nodes in the network, and indicates some side effects that RPCs can produce:

    %% Find object code for module Mod
    -{Mod, Bin, File} = code:get_object_code(Mod),
    +{Mod, Bin, File} = code:get_object_code(Mod),
     
     %% and load it on all nodes including this one
    -{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
    +{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
     
     %% and then maybe check the ResL list.

    Note

    If you want the ability to distinguish between results, you may want to consider using the erpc:multicall() function from the diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/seq_trace.html b/prs/8803/lib/kernel-10.0.1/doc/html/seq_trace.html index c98b5c29c08a4..6fe138ca44381 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/seq_trace.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/seq_trace.html @@ -141,9 +141,9 @@

    Trace Messages Sent to the System Tracer

    The format of the messages is one of the following, depending on if flag -timestamp of the trace token is set to true or false:

    {seq_trace, Label, SeqTraceInfo, TimeStamp}

    or

    {seq_trace, Label, SeqTraceInfo}

    Where:

    Label = int()
    -TimeStamp = {Seconds, Milliseconds, Microseconds}
    -  Seconds = Milliseconds = Microseconds = int()

    SeqTraceInfo can have the following formats:

    • {send, Serial, From, To, Message} - Used when a process From with its +timestamp of the trace token is set to true or false:

      {seq_trace, Label, SeqTraceInfo, TimeStamp}

      or

      {seq_trace, Label, SeqTraceInfo}

      Where:

      Label = int()
      +TimeStamp = {Seconds, Milliseconds, Microseconds}
      +  Seconds = Milliseconds = Microseconds = int()

      SeqTraceInfo can have the following formats:

      • {send, Serial, From, To, Message} - Used when a process From with its trace token flag send set to true has sent information. To may be a process identifier, a registered name on a node represented as {NameAtom, NodeAtom}, or a node name represented as an atom. From may be a @@ -287,68 +287,68 @@

        Example of Use

        This example gives a rough idea of how the new primitives can be used and what -kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        --compile(export_all).
        +kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        +-compile(export_all).
         
        -loop(Port) ->
        +loop(Port) ->
             receive
        -        {Port,Message} ->
        -            seq_trace:set_token(label,17),
        -            seq_trace:set_token('receive',true),
        -            seq_trace:set_token(print,true),
        -            seq_trace:print(17,"**** Trace Started ****"),
        -            call_server ! {self(),the_message};
        -        {ack,Ack} ->
        +        {Port,Message} ->
        +            seq_trace:set_token(label,17),
        +            seq_trace:set_token('receive',true),
        +            seq_trace:set_token(print,true),
        +            seq_trace:print(17,"**** Trace Started ****"),
        +            call_server ! {self(),the_message};
        +        {ack,Ack} ->
                     ok
             end,
        -    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
        +    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
             receive
        -        {PortController,Message} ->
        -            Ack = {received, Message},
        -            seq_trace:print(17,"We are here now"),
        -            PortController ! {ack,Ack}
        +        {PortController,Message} ->
        +            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 can be like this:

        17:<0.30.0> Info {0,1} WITH
        +    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
         "**** Trace Started ****"
        -17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        -{<0.30.0>,the_message}
        -17:<0.31.0> Info {2,3} WITH
        +17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        +{<0.30.0>,the_message}
        +17:<0.31.0> Info {2,3} WITH
         "We are here now"
        -17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        -{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can -look like this:

        tracer() ->
        +17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        +{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can +look like this:

        tracer() ->
             receive
        -        {seq_trace,Label,TraceInfo} ->
        -           print_trace(Label,TraceInfo,false);
        -        {seq_trace,Label,TraceInfo,Ts} ->
        -           print_trace(Label,TraceInfo,Ts);
        +        {seq_trace,Label,TraceInfo} ->
        +           print_trace(Label,TraceInfo,false);
        +        {seq_trace,Label,TraceInfo,Ts} ->
        +           print_trace(Label,TraceInfo,Ts);
                 _Other -> ignore
             end,
        -    tracer().
        -
        -print_trace(Label,TraceInfo,false) ->
        -    io:format("~p:",[Label]),
        -    print_trace(TraceInfo);
        -print_trace(Label,TraceInfo,Ts) ->
        -    io:format("~p ~p:",[Label,Ts]),
        -    print_trace(TraceInfo).
        -
        -print_trace({print,Serial,From,_,Info}) ->
        -    io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]);
        -print_trace({'receive',Serial,From,To,Message}) ->
        -    io:format("~p Received ~p FROM ~p WITH~n~p~n",
        -              [To,Serial,From,Message]);
        -print_trace({send,Serial,From,To,Message}) ->
        -    io:format("~p Sent ~p TO ~p WITH~n~p~n",
        -              [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that -process as the system tracer can look like this:

        start() ->
        -    Pid = spawn(?MODULE,tracer,[]),
        -    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        -    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        -    P = spawn(?MODULE, loop, [port]),
        -    register(call_server, spawn(?MODULE, loop, [])),
        -    start(),
        -    P ! {port,message}.
        +
        tracer(). + +print_trace(Label,TraceInfo,false) -> + io:format("~p:",[Label]), + print_trace(TraceInfo); +print_trace(Label,TraceInfo,Ts) -> + io:format("~p ~p:",[Label,Ts]), + print_trace(TraceInfo). + +print_trace({print,Serial,From,_,Info}) -> + io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]); +print_trace({'receive',Serial,From,To,Message}) -> + io:format("~p Received ~p FROM ~p WITH~n~p~n", + [To,Serial,From,Message]); +print_trace({send,Serial,From,To,Message}) -> + io:format("~p Sent ~p TO ~p WITH~n~p~n", + [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that +process as the system tracer can look like this:

        start() ->
        +    Pid = spawn(?MODULE,tracer,[]),
        +    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        +    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        +    P = spawn(?MODULE, loop, [port]),
        +    register(call_server, spawn(?MODULE, loop, [])),
        +    start(),
        +    P ! {port,message}.

    @@ -937,11 +937,11 @@

    set_token(Token)

    tracing is disabled, otherwise Token should be an Erlang term returned from get_token/0 or set_token/1. set_token/1 can be used to temporarily exclude message passing from the trace by setting the -trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
    +trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
                                         % old value
     % do something that should not be part of the trace
    -io:format("Exclude the signalling caused by this~n"),
    -seq_trace:set_token(OldToken), % activate the trace token again
    +io:format("Exclude the signalling caused by this~n"),
    +seq_trace:set_token(OldToken), % activate the trace token again
     ...

    Returns the previous value of the trace token.

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/socket.html b/prs/8803/lib/kernel-10.0.1/doc/html/socket.html index 877840bbdecf1..1445877bbb0a3 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/socket.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/socket.html @@ -172,8 +172,8 @@

    completion_info/0 and the received completion message.

    The compiler may then optimize a following receive statement to only scan the messages that arrive after the reference/0 is created. If the message queue is large this is a big optimization.

    The reference/0 has to be unique for the call.

    Repeating an Operation on a select Systems

    Onselect systems, if a call would be repeated before the select -message has been received it replaces the call in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    -    {error, timeout} = socket:accept(LSock, 500),
    +message has been received it replaces the call in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    +    {error, timeout} = socket:accept(LSock, 500),
         :

    Above, Handle is no longer valid once the second accept/2, call has been made (the first call is automatically canceled). After the second accept/2 call returns {error, timeout}, @@ -206,28 +206,28 @@

    Examples

    -
    client(SAddr, SPort) ->
    -   {ok, Sock} = socket:open(inet, stream, tcp),
    -   ok = socket:connect(Sock, #{family => inet,
    +
    client(SAddr, SPort) ->
    +   {ok, Sock} = socket:open(inet, stream, tcp),
    +   ok = socket:connect(Sock, #{family => inet,
                                    addr   => SAddr,
    -                               port   => SPort}),
    +                               port   => SPort}),
        Msg = <<"hello">>,
    -   ok = socket:send(Sock, Msg),
    -   ok = socket:shutdown(Sock, write),
    -   {ok, Msg} = socket:recv(Sock),
    -   ok = socket:close(Sock).
    -
    -server(Addr, Port) ->
    -   {ok, LSock} = socket:open(inet, stream, tcp),
    -   ok = socket:bind(LSock, #{family => inet,
    +   ok = socket:send(Sock, Msg),
    +   ok = socket:shutdown(Sock, write),
    +   {ok, Msg} = socket:recv(Sock),
    +   ok = socket:close(Sock).
    +
    +server(Addr, Port) ->
    +   {ok, LSock} = socket:open(inet, stream, tcp),
    +   ok = socket:bind(LSock, #{family => inet,
                                  port   => Port,
    -                             addr   => Addr}),
    -   ok = socket:listen(LSock),
    -   {ok, Sock} = socket:accept(LSock),
    -   {ok, Msg} = socket:recv(Sock),
    -   ok = socket:send(Sock, Msg),
    -   ok = socket:close(Sock),
    -   ok = socket:close(LSock).
    +
    addr => Addr}), + ok = socket:listen(LSock), + {ok, Sock} = socket:accept(LSock), + {ok, Msg} = socket:recv(Sock), + ok = socket:send(Sock, Msg), + ok = socket:close(Sock), + ok = socket:close(LSock).
    @@ -4795,7 +4795,7 @@

    ioctl/2

    (since OTP 26.1).

    Result; a boolean/0.

  • tcp_info - Get miscellaneous TCP related information for a connected socket (since OTP 26.1).

    Result; a map/0 with information items as key-value pairs.

  • Note

    Not all requests are supported by all platforms. To see if a ioctl request is supported on the current platform:

          Request = nread,
    -      true = socket:is_supported(ioctl_requests, Request),
    +      true = socket:is_supported(ioctl_requests, Request),
           :
    @@ -4959,7 +4959,7 @@

    is_supported(Key1)

    Check if a socket feature is supported.

    Returns true if supports/0 has a {Key1, true} tuple or a {Key1, list()} tuple in its returned list, -otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(local),
    +otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(local),
    @@ -4990,7 +4990,7 @@

    is_supported(Key1, Key2)

    Check if a socket feature is supported.

    Returns true if supports(Key1) has a {Key2, true} tuple -in its returned list, otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(msg_flags, errqueue),
    +in its returned list, otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(msg_flags, errqueue),
    @@ -5088,7 +5088,7 @@

    monitor(Socket)

    Start a socket monitor.

    If the Socket doesn't exist or when later the monitor is triggered, a 'DOWN' message is sent to the process that called monitor/1 -with the following pattern:

    	    {'DOWN', MonitorRef, socket, Socket, Info}

    Info is the termination reason of the socket or nosock if +with the following pattern:

    	    {'DOWN', MonitorRef, socket, Socket, Info}

    Info is the termination reason of the socket or nosock if Socket did not exist when the monitor was started.

    Making several calls to socket:monitor/1 for the same Socket is not an error; each call creates an independent monitor instance.

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/socket_usage.html b/prs/8803/lib/kernel-10.0.1/doc/html/socket_usage.html index fe0d752abdb2e..0297c37e99fc0 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/socket_usage.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/socket_usage.html @@ -186,47 +186,47 @@

    Example

    This example is intended to show how to create a simple (echo) server -(and client).

    -module(example).
    +(and client).

    -module(example).
     
    --export([client/2, client/3]).
    --export([server/0, server/1, server/2]).
    +-export([client/2, client/3]).
    +-export([server/0, server/1, server/2]).
     
     
     %% ======================================================================
     
     %% === Client ===
     
    -client(#{family := Family} = ServerSockAddr, Msg)
    -  when is_list(Msg) orelse is_binary(Msg) ->
    -    {ok, Sock} = socket:open(Family, stream, default),
    -    ok         = maybe_bind(Sock, Family),
    -    ok         = socket:connect(Sock, ServerSockAddr),
    -    client_exchange(Sock, Msg);
    +client(#{family := Family} = ServerSockAddr, Msg)
    +  when is_list(Msg) orelse is_binary(Msg) ->
    +    {ok, Sock} = socket:open(Family, stream, default),
    +    ok         = maybe_bind(Sock, Family),
    +    ok         = socket:connect(Sock, ServerSockAddr),
    +    client_exchange(Sock, Msg);
     
    -client(ServerPort, Msg)
    -  when is_integer(ServerPort) andalso (ServerPort > 0) ->
    +client(ServerPort, Msg)
    +  when is_integer(ServerPort) andalso (ServerPort > 0) ->
         Family   = inet, % Default
    -    Addr     = get_local_addr(Family), % Pick an address
    -    SockAddr = #{family => Family,
    +    Addr     = get_local_addr(Family), % Pick an address
    +    SockAddr = #{family => Family,
     		 addr   => Addr,
    -		 port   => ServerPort},
    -    client(SockAddr, Msg).
    -
    -client(ServerPort, ServerAddr, Msg)
    -  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
    -       is_tuple(ServerAddr) ->
    -    Family   = which_family(ServerAddr),
    -    SockAddr = #{family => Family,
    +		 port   => ServerPort},
    +    client(SockAddr, Msg).
    +
    +client(ServerPort, ServerAddr, Msg)
    +  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
    +       is_tuple(ServerAddr) ->
    +    Family   = which_family(ServerAddr),
    +    SockAddr = #{family => Family,
     		 addr   => ServerAddr,
    -		 port   => ServerPort},
    -    client(SockAddr, Msg).
    +		 port   => ServerPort},
    +    client(SockAddr, Msg).
     
     %% Send the message to the (echo) server and wait for the echo to come back.
    -client_exchange(Sock, Msg) when is_list(Msg) ->
    -    client_exchange(Sock, list_to_binary(Msg));
    -client_exchange(Sock, Msg) when is_binary(Msg) ->
    -    ok = socket:send(Sock, Msg, infinity),
    -    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
    +client_exchange(Sock, Msg) when is_list(Msg) ->
    +    client_exchange(Sock, list_to_binary(Msg));
    +client_exchange(Sock, Msg) when is_binary(Msg) ->
    +    ok = socket:send(Sock, Msg, infinity),
    +    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
         ok.
     
     
    @@ -234,188 +234,188 @@ 

    %% === Server === -server() -> +server() -> %% Make system choose port (and address) - server(0). + server(0). %% This function return the port and address that it actually uses, %% in case server/0 or server/1 (with a port number) was used to start it. -server(#{family := Family, addr := Addr, port := _} = SockAddr) -> - {ok, Sock} = socket:open(Family, stream, tcp), - ok = socket:bind(Sock, SockAddr), - ok = socket:listen(Sock), - {ok, #{port := Port}} = socket:sockname(Sock), - Acceptor = start_acceptor(Sock), - {ok, {Port, Addr, Acceptor}}; +server(#{family := Family, addr := Addr, port := _} = SockAddr) -> + {ok, Sock} = socket:open(Family, stream, tcp), + ok = socket:bind(Sock, SockAddr), + ok = socket:listen(Sock), + {ok, #{port := Port}} = socket:sockname(Sock), + Acceptor = start_acceptor(Sock), + {ok, {Port, Addr, Acceptor}}; -server(Port) when is_integer(Port) -> +server(Port) when is_integer(Port) -> Family = inet, % Default - Addr = get_local_addr(Family), % Pick an address - SockAddr = #{family => Family, + Addr = get_local_addr(Family), % Pick an address + SockAddr = #{family => Family, addr => Addr, - port => Port}, - server(SockAddr). - -server(Port, Addr) - when is_integer(Port) andalso (Port >= 0) andalso - is_tuple(Addr) -> - Family = which_family(Addr), - SockAddr = #{family => Family, + port => Port}, + server(SockAddr). + +server(Port, Addr) + when is_integer(Port) andalso (Port >= 0) andalso + is_tuple(Addr) -> + Family = which_family(Addr), + SockAddr = #{family => Family, addr => Addr, - port => Port}, - server(SockAddr). + port => Port}, + server(SockAddr). %% --- Echo Server - Acceptor --- -start_acceptor(LSock) -> - Self = self(), - {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end), +start_acceptor(LSock) -> + Self = self(), + {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end), receive - {'DOWN', MRef, process, Pid, Info} -> - erlang:error({failed_starting_acceptor, Info}); - {Pid, started} -> + {'DOWN', MRef, process, Pid, Info} -> + erlang:error({failed_starting_acceptor, Info}); + {Pid, started} -> %% Transfer ownership - socket:setopt(LSock, otp, owner, Pid), - Pid ! {self(), continue}, - erlang:demonitor(MRef), + socket:setopt(LSock, otp, owner, Pid), + Pid ! {self(), continue}, + erlang:demonitor(MRef), Pid end. -acceptor_init(Parent, LSock) -> - Parent ! {self(), started}, +acceptor_init(Parent, LSock) -> + Parent ! {self(), started}, receive - {Parent, continue} -> + {Parent, continue} -> ok end, - acceptor_loop(LSock). - -acceptor_loop(LSock) -> - case socket:accept(LSock, infinity) of - {ok, ASock} -> - start_handler(ASock), - acceptor_loop(LSock); - {error, Reason} -> - erlang:error({accept_failed, Reason}) + acceptor_loop(LSock). + +acceptor_loop(LSock) -> + case socket:accept(LSock, infinity) of + {ok, ASock} -> + start_handler(ASock), + acceptor_loop(LSock); + {error, Reason} -> + erlang:error({accept_failed, Reason}) end. %% --- Echo Server - Handler --- -start_handler(Sock) -> - Self = self(), - {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end), +start_handler(Sock) -> + Self = self(), + {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end), receive - {'DOWN', MRef, process, Pid, Info} -> - erlang:error({failed_starting_handler, Info}); - {Pid, started} -> + {'DOWN', MRef, process, Pid, Info} -> + erlang:error({failed_starting_handler, Info}); + {Pid, started} -> %% Transfer ownership - socket:setopt(Sock, otp, owner, Pid), - Pid ! {self(), continue}, - erlang:demonitor(MRef), + socket:setopt(Sock, otp, owner, Pid), + Pid ! {self(), continue}, + erlang:demonitor(MRef), Pid end. -handler_init(Parent, Sock) -> - Parent ! {self(), started}, +handler_init(Parent, Sock) -> + Parent ! {self(), started}, receive - {Parent, continue} -> + {Parent, continue} -> ok end, - handler_loop(Sock, undefined). + handler_loop(Sock, undefined). %% No "ongoing" reads %% The use of 'nowait' here is clearly *overkill* for this use case, %% but is intended as an example of how to use it. -handler_loop(Sock, undefined) -> - case socket:recv(Sock, 0, nowait) of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); +handler_loop(Sock, undefined) -> + case socket:recv(Sock, 0, nowait) of + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); - {select, SelectInfo} -> - handler_loop(Sock, SelectInfo); + {select, SelectInfo} -> + handler_loop(Sock, SelectInfo); - {completion, CompletionInfo} -> - handler_loop(Sock, CompletionInfo); + {completion, CompletionInfo} -> + handler_loop(Sock, CompletionInfo); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {error, Reason} -> + erlang:error({recv_failed, Reason}) end; %% This is the standard (asyncronous) behaviour. -handler_loop(Sock, {select_info, recv, SelectHandle}) -> +handler_loop(Sock, {select_info, recv, SelectHandle}) -> receive - {'$socket', Sock, select, SelectHandle} -> - case socket:recv(Sock, 0, nowait) of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); + {'$socket', Sock, select, SelectHandle} -> + case socket:recv(Sock, 0, nowait) of + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); - {select, NewSelectInfo} -> - handler_loop(Sock, NewSelectInfo); + {select, NewSelectInfo} -> + handler_loop(Sock, NewSelectInfo); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {error, Reason} -> + erlang:error({recv_failed, Reason}) end end; %% This is the (asyncronous) behaviour on platforms that support 'completion', %% currently only Windows. -handler_loop(Sock, {completion_info, recv, CompletionHandle}) -> +handler_loop(Sock, {completion_info, recv, CompletionHandle}) -> receive - {'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} -> + {'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} -> case CompletionStatus of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); + {error, Reason} -> + erlang:error({recv_failed, Reason}) end end. -echo(Sock, Data) when is_binary(Data) -> - ok = socket:send(Sock, Data, infinity), - io:format("** ECHO **" - "~n~s~n", [binary_to_list(Data)]). +echo(Sock, Data) when is_binary(Data) -> + ok = socket:send(Sock, Data, infinity), + io:format("** ECHO **" + "~n~s~n", [binary_to_list(Data)]). %% ====================================================================== %% === Utility functions === -maybe_bind(Sock, Family) -> - maybe_bind(Sock, Family, os:type()). +maybe_bind(Sock, Family) -> + maybe_bind(Sock, Family, os:type()). -maybe_bind(Sock, Family, {win32, _}) -> - Addr = get_local_addr(Family), - SockAddr = #{family => Family, +maybe_bind(Sock, Family, {win32, _}) -> + Addr = get_local_addr(Family), + SockAddr = #{family => Family, addr => Addr, - port => 0}, - socket:bind(Sock, SockAddr); -maybe_bind(_Sock, _Family, _OS) -> + port => 0}, + socket:bind(Sock, SockAddr); +maybe_bind(_Sock, _Family, _OS) -> ok. %% The idea with this is extract a "usable" local address %% that can be used even from *another* host. And doing %% so using the net module. -get_local_addr(Family) -> +get_local_addr(Family) -> Filter = - fun(#{addr := #{family := Fam}, - flags := Flags}) -> - (Fam =:= Family) andalso (not lists:member(loopback, Flags)); - (_) -> + fun(#{addr := #{family := Fam}, + flags := Flags}) -> + (Fam =:= Family) andalso (not lists:member(loopback, Flags)); + (_) -> false end, - {ok, [SockAddr|_]} = net:getifaddrs(Filter), - #{addr := #{addr := Addr}} = SockAddr, + {ok, [SockAddr|_]} = net:getifaddrs(Filter), + #{addr := #{addr := Addr}} = SockAddr, Addr. -which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) -> +which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) -> inet; -which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) -> +which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) -> inet6.

    diff --git a/prs/8803/lib/kernel-10.0.1/doc/html/trace.html b/prs/8803/lib/kernel-10.0.1/doc/html/trace.html index d716d43b83b30..a76bbb53fd1ad 100644 --- a/prs/8803/lib/kernel-10.0.1/doc/html/trace.html +++ b/prs/8803/lib/kernel-10.0.1/doc/html/trace.html @@ -146,23 +146,23 @@

    messages. Several sessions can exist at the same time without interfering with each other. When a trace session is destroyed, all its trace settings are automatically cleaned up.

    Example:

    %% Create a tracer process that will receive the trace events
    -1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
    +1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
     <0.91.0>
     %% Create a session using the Tracer
    -2> Session = trace:session_create(my_session, Tracer, []).
    -{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
    +2> Session = trace:session_create(my_session, Tracer, []).
    +{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
     %% Setup call tracing on self()
    -3> trace:process(Session, self(), true, [call]).
    +3> trace:process(Session, self(), true, [call]).
     1
     %% Setup call tracing on lists:seq/2
    -4> trace:function(Session, {lists,seq,2}, [], []).
    +4> trace:function(Session, {lists,seq,2}, [], []).
     1
     %% Call the traced function
    -5> lists:seq(1, 10).
    -{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
    -[1,2,3,4,5,6,7,8,9,10] % The return value
    +5> lists:seq(1, 10).
    +{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
    +[1,2,3,4,5,6,7,8,9,10] % The return value
     %% Cleanup the trace session
    -6> trace:session_destroy(Session).
    +6> trace:session_destroy(Session).
     ok

    @@ -1322,9 +1322,9 @@

    recv(Session, MatchSpec, FlagList)

    Match Specifications in Erlang in the User's Guide for the ERTS application.

  • true - Enable tracing for all received messages (to 'receive' traced processes). Any match specification is removed. This is the default.

  • false - Disable tracing for all received messages. Any match -specification is removed.

  • Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
    +specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
     1

    Note

    A match specification for 'receive' trace can use all guard and body functions except caller, is_seq_trace, get_seq_token, set_seq_token, enable_trace, disable_trace, trace, silent, and process_dump.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive @@ -1375,10 +1375,10 @@

      send(Session, MatchSpec, FlagList)

      Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all sent messages (from send traced processes). Any match specification is removed.

    • false - Disable tracing for all sent messages. Any match specification -is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    -1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
    +is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    +1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
     1

    Note

    A match specification for send trace can use all guard and body functions except caller.

    Fails by raising an error exception with an error reason of:

    or to make it even easier, assuming a measure shall be done on all the codecs (as above):

            % erl -noshell -pa <path-megaco-ebin-dir> \\
                   -pa <path-to-meas-module-dir> \\
                   -s megaco_codec_meas -s init stop

    When run as above (this will take some time), the measurement process is done @@ -199,10 +199,10 @@

    value.

    Both these tools use the message package (time_test.msgs) provided with the tool(s), although it can run on any message package as long as it has the same structure.

    Message package file

    This is simply an erlang compatible text-file with the following structure: -{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    -messages_list() = [{message_name(), message()}]
    -message_name() = atom()
    -message() = binary()

    The codec name is the name of the codec with which all messages in the +{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    +messages_list() = [{message_name(), message()}]
    +message_name() = atom()
    +message() = binary()

    The codec name is the name of the codec with which all messages in the message_list() has been encoded.

    This file can be exported to a file structure by calling the export_messages function. This can be usefull if a measurement shall be done with an external tool. Exporting the diff --git a/prs/8803/lib/megaco-4.6/doc/html/megaco_encode.html b/prs/8803/lib/megaco-4.6/doc/html/megaco_encode.html index 5367d1f2ac91b..35de3fa075e96 100644 --- a/prs/8803/lib/megaco-4.6/doc/html/megaco_encode.html +++ b/prs/8803/lib/megaco-4.6/doc/html/megaco_encode.html @@ -158,75 +158,75 @@

    format using long keywords and an indentation style like the text examples in the Megaco/H.248 specification).

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty, well -indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    -   Transaction = 9998 {
    -           Context = - {
    -                   ServiceChange = ROOT {
    -                           Services {
    +indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    +   Transaction = 9998 {
    +           Context = - {
    +                   ServiceChange = ROOT {
    +                           Services {
                                        Method = Restart,
                                        ServiceChangeAddress = 55555,
                                        Profile = ResGW/1,
                                        Reason = "901 Cold Boot"
    -                           }
    -                   }
    -           }
    -   }

    Then the compact version without indentation and with short keywords:

    
    +                           }
    +                   }
    +           }
    +   }

    Then the compact version without indentation and with short keywords:

    
        !/1 [124.124.124.222]
        T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}

    And the programmers view of the same message. First a list of ActionRequest records are constructed and then it is sent with one of the send functions in -the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    -  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    -                              serviceChangeAddress = {portNumber, 55555},
    +the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    +  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    +                              serviceChangeAddress = {portNumber, 55555},
                                   serviceChangeReason  = "901 Cold Boot",
    -                              serviceChangeProfile = Prof},
    -  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    -                                serviceChangeParms = Parm},
    -  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    -                              commandRequests = {serviceChangeReq, Req}}],
    -  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
    +                              serviceChangeProfile = Prof},
    +  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    +                                serviceChangeParms = Parm},
    +  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    +                              commandRequests = {serviceChangeReq, Req}}],
    +  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
        asn1_NOVALUE,
    -   {'Message',
    +   {'Message',
         1,
    -    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    -    {transactions,
    -     [
    -      {transactionRequest,
    -       {'TransactionRequest',
    +    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    +    {transactions,
    +     [
    +      {transactionRequest,
    +       {'TransactionRequest',
              9998,
    -         [{'ActionRequest',
    +         [{'ActionRequest',
                0,
                asn1_NOVALUE,
                asn1_NOVALUE,
    -           [
    -            {'CommandRequest',
    -             {serviceChangeReq,
    -              {'ServiceChangeRequest',
    -               [
    -                {megaco_term_id, false, ["root"]}],
    -                {'ServiceChangeParm',
    +           [
    +            {'CommandRequest',
    +             {serviceChangeReq,
    +              {'ServiceChangeRequest',
    +               [
    +                {megaco_term_id, false, ["root"]}],
    +                {'ServiceChangeParm',
                      restart,
    -                 {portNumber, 55555},
    +                 {portNumber, 55555},
                      asn1_NOVALUE,
    -                 {'ServiceChangeProfile', "resgw", version = 1},
    +                 {'ServiceChangeProfile', "resgw", version = 1},
                      "901 MG Cold Boot",
                      asn1_NOVALUE,
                      asn1_NOVALUE,
                      asn1_NOVALUE
    -                }
    -              }
    -             },
    +                }
    +              }
    +             },
                  asn1_NOVALUE,
                  asn1_NOVALUE
    -            }
    -           ]
    -          }
    -         ]
    -       }
    -      }
    -     ]
    -    }
    -   }
    -  }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes + } + ] + } + ] + } + } + ] + } + } + }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes both pretty as well as compact text.
    • megaco_compact_text_encoder - encodes messages into compact text format, decodes both pretty as well as compact text.
    • megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder implements the fastest of the BER encoders/decoders. Recommended binary codec.
    • megaco_ber_encoder - encode/decode ASN.1 BER messages.
    • megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format diff --git a/prs/8803/lib/megaco-4.6/doc/html/megaco_examples.html b/prs/8803/lib/megaco-4.6/doc/html/megaco_examples.html index 2f9a0f1ef785a..c4849746bba2a 100644 --- a/prs/8803/lib/megaco-4.6/doc/html/megaco_examples.html +++ b/prs/8803/lib/megaco-4.6/doc/html/megaco_examples.html @@ -159,10 +159,10 @@

      erl -pa ../../../megaco/ebin -s megaco_filter -s megaco megaco_simple_mg:start().

    or simply 'gmake mg'.

    If you "only" want to start a single MG which tries to connect an MG on a host named "baidarka", you may use one of these functions (instead of the -megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    -      megaco_simple_mg:start_tcp_binary("baidarka", []).
    -      megaco_simple_mg:start_udp_text("baidarka", []).
    -      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be +megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    +      megaco_simple_mg:start_tcp_binary("baidarka", []).
    +      megaco_simple_mg:start_udp_text("baidarka", []).
    +      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be enabled and an interactive sequence chart tool to be started. This may be quite useful in order to visualize how your MG interacts with the Megaco/H.248 protocol stack.

    The event traces may alternatively be directed to a file for later analyze. By diff --git a/prs/8803/lib/megaco-4.6/doc/html/megaco_performance.html b/prs/8803/lib/megaco-4.6/doc/html/megaco_performance.html index c1e8fda4776af..f5e6d8cfaf6ee 100644 --- a/prs/8803/lib/megaco-4.6/doc/html/megaco_performance.html +++ b/prs/8803/lib/megaco-4.6/doc/html/megaco_performance.html @@ -162,19 +162,19 @@

    built-in functions.

    The actual encoded messages have been collected in one directory per encoding type, containing one file per encoded message.

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty -printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    -  Transaction = 9998 {
    -    Context = - {
    -      ServiceChange = ROOT {
    -        Services {
    +printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    +  Transaction = 9998 {
    +    Context = - {
    +      ServiceChange = ROOT {
    +        Services {
               Method = Restart,
               ServiceChangeAddress = 55555,
               Profile = ResGW/1,
               Reason = "901 MG Cold Boot"
    -        }
    -      }
    -    }
    -  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
    +        }
    +      }
    +    }
    +  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
       C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}

    diff --git a/prs/8803/lib/megaco-4.6/doc/html/megaco_user.html b/prs/8803/lib/megaco-4.6/doc/html/megaco_user.html index f2b584c223ea7..471e300d1a307 100644 --- a/prs/8803/lib/megaco-4.6/doc/html/megaco_user.html +++ b/prs/8803/lib/megaco-4.6/doc/html/megaco_user.html @@ -133,7 +133,7 @@

    list of the callback functions. For example, the handle_connect function takes by default two arguments:

            handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as [SomePid,SomeTableRef], the callback function is expected to have these (in -this case two) extra arguments last in the argument list:

            handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. +this case two) extra arguments last in the argument list:

            handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. handle_unexpected_trans/4). The functions which takes this argument will be called if and only if one of the functions receive_message/5 or @@ -144,10 +144,10 @@

    DATA TYPES

    -
    action_request() = #'ActionRequest'{}
    -action_reply() = #'ActionReply'{}
    -error_desc() = #'ErrorDescriptor'{}
    -segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" +

    action_request() = #'ActionRequest'{}
    +action_reply() = #'ActionReply'{}
    +error_desc() = #'ErrorDescriptor'{}
    +segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" connection and may be reused after a reconnect (disconnect + connect).

    protocol_version() = integer()

    Is the actual protocol version. In most cases the protocol version is retrieved from the processed message, but there are exceptions:

    In these cases, the ProtocolVersion default version is obtained from the static diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia.epub b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia.epub index b2c77f7b63447231cafd272c8abe5f94d7a99f03..59f63360aa5a81a4cc8b1d96f43f99706c28b1bd 100644 GIT binary patch delta 108139 zcmX`RQ*qDuDeT*60Vu zC;VTqRh0678ygQrQNdyU?bOX5q{0J!NHF|w1;{K(1c;&-mCYJyhHR35V`;Lfw}6i* zgt3WkX_G0IT5yeH_zpZx{KfG4Yst0)(Iys5t=Rq0`}%&b42Ue8_kDMlTue1vI0M3b zL^T^mb4)3CLQ*jbAEOe2DwOpC~hlWaH1T$CTCGQj7g z7IIY{`)fMK591d)H_r(Hm)TgrZ5l#rS9~wS5N-;_k-d{WmTur38aikKD4;z&h)MSa zHHg?wXIa@GkFgY2&hj1cm`Jaf$)w{V@`J@e2OIOLzZI80P+;!ee9rJ>B>FM3+>B(q7gB7_9um(3%MkZ z0T4K15z_|TPS`T67?SF>X+!+?j?BOopd>wV-4qEhgFD0eE6nV4#L8u&WN~qo!&Azl zm5w>&_Y5N9a5C&tAwuh-Qj4d`sR*tVMaFdK-XqaC#F5wzsg6Sec)n$%-01;7aI{uj zK}GwzV77d1Uq?8sLQ!PN#A3+~O$cxr0js!*i2D)6`O{MtgK|JMahjKiZ49-H1sE5e z+d|lsX={Ta2YGlkziAROci(9Oo@R2oPmV(?C7SW#bd*7NsWXXd&mUUc1rqOAI{d%| zqe06atEsY#)aFCE);AoXnZP}JJ*t65MFZOO%77_`S_LShZnZ6;XLsbO{Uv2zz%Le1 z*4k18^bmbS(q?Q!6;)O4t5E>mn) zkji1Z&m2AVgRPTXAMG`0c&n-n0nbJc(fL-DIu8oXJ36c|1@hw3xbOw(R7)zxGP^Pv zxJD>N<#V`+2!f>D<+45QO46MxBYM}r%CJfQpz80^=dECt@2>3Dkk&d(@F#GQhIPzA zb?r&Q-_!lFdj`ir+*~nZ$DW(x!MatYI;`p~T@WECiNxHGqcar@+;{5321KTRf~R&? zYQ9!G`idwOGkW-dIFX13?^xLmmalxadOA4Uk6tGshx_W?JoU)mv>*nSQ!!5TX={{7 zf%bPaArmn*)E8Sd5P#0)&1=Np4 zU+K-ueb^n#Cy7cLRh7nY15P>dJX2L`8*kw4iV5pd*)XIX5ZRv~q%zN8A_fHloU3mi|Ix zZXj?d-Zc)>K?(Z{KtO9_vGjm>3g^)Xce;YT{mM8W%uIm`?4J}^fa03r1QTYA-My6*cr`GkK%=bu)`*~8R5h^y z!|Ka$1%Mcsu%gkxJu^C)%!CcDzX`?&Rh1TI0@;vH>BqJ~;8drdA!{_Q4q2BFb*DSh$X4<;BxRVw%QqNvaK zXX5{GG{!%MhWQUi1A`P;|Hr3|EecPt|E1qrEw=vy&$M6>{tG^uG5sG%YhDQs`yWnj zcWIiU0d85*{NED1bt@d;a0K-`FVCzmKN@*%aAmTd9DO;5SyaUs|7Z)ub{>!3j*_wI zh^@2OQ_5wxo4vD`VxpLWZuQBf&XUR6E4SBI#-8;sk*Phcq2kCyE!9nhbt(*&p9Kk% zDDoGs`)RCBO!~WMCA-k|f-DHCb-k!xDjIsCjH4QiCPp;JG5Z`qK*P^UWa#$c2%KeF z5H*r5YadsLJkw=-P_s}X`(TrHklq8DC~eEdZ@Wj$h4%VR=a&p>gGPQa1429N){+dr z^}}k-w&TTq;G+4d`A_grJ8CwMo>VA%mLync~Xy>VW>NrLiZ;iP1 zRtg!8H#=?|5M&)NC=e@dAI%zCa`M109Mg{a`@uFt>YhF#a`r5(tU6$uUbwt#40T5< z(LmvGpljR`$6I%=AR!}R+y{rn-9EVems+)C*AHtdb|AELOgON3o_@w&&J#DY~}K0+Ozon0r^quqLDVAvn4`mxoQmG)<@ zgn;(wN7uuj;RK0Jr-*@Rg$V;6XYCgO&jAH{B`%4MnHAp@Fuh{e`@cw&t$_~*Ns9U| z8Y6PAIO$=4NHZp}Is|Wan{{y3&W8sD2X&{c77h6Kis=Jg{}Hv5-1qS02z~3OwCw3Q z{-C{nuIC=R5&MeVcBi5h`bj9<=mQz}_b$R$9Ji3>G&8QlyBy`0Sg#8>f94XhFE&^y zRi*TM>6yXbN1VjmzDHZMs_jbFM zU$_(($g(u)38Oigkl86qG568NMBAtcFT*3kiF%UWYngw_UND>*o;< zA^2i~KWlM3+4!UnSboU0cIrVj|o z>-Wv*ZV+7Gz`ZJ|n0ANv59fU75N*-+nHUzNd`o_{%J~Fex^`|fC0k^g>^TJK#Cpy-e z)?x9c934U)8V1)&k?~<#s06t1i**jqQZknnkAQTHX*_&F^jEEWoQAu)=e5e8m38Ur zOceqQdk>Pb7Ey1cO*uzcR6k8<9ZZ^vq`DXSfhO2EpV?l$QzhigH_okzR zduE730s8yD6ESKfbs{N~Dn4UZVfv%jcclpz+UBCu+Uy)&NI)wE`;p_Tu zOPPOyh@Ph~bHq+pfwalJA65!5XTnJ76^l?x!`OoSF#SSqBW*c~0lsp!gg?<`ImBv# zl+>UuNVE_Xib7%h;3K`lXk2bB(QKtut+=^4a0hAa5Nvm4XVKL>apZ7uJ>tIc@RX5AWUtoIFnUFeXnGb$3^Bo}zPIzu?Z~ z&22#H52gXqLsXD;%8=_u=IPJSgQ}B&R&L^tXFqrUOQlGIwu9O(r*^88kC4Aq;tHrA(M2S-Amo7R=qNP7>kgZp`I)<3MSUQ>AtLz0s=1 z&Z-A@C>vp+;^`M)`;)YA{_L$(!J|!XHSPCD137wRi81_T+bcWP9D@H1c7DjPBfiqi zlY{Pn_iAPjaoISyyl=HLLvaUxtaDAvt~tgoL(U84NY(09EA}@i2*~$$ldiw>As5=W zabAc^@Bz}TIq^EzCLfd+^LFR3Wv3*N3z`54lsuk{45I=-Uf~lje$(h3k!-P^VlgR$ z-M^7K<~!>gF_?kz$F(5_=Sv?BOWx^fcqj^2Fz*HtToIBltTB1q1e@6DA|}y8TD5&bC#4y5|;80nr-U3hWYpxLAVB2M~<@ z#ZB}^OML{;sXbjQ^xdsDsCG1D#zaZ69b3Dz{oxY0xI@Mei|7)`-zKL+>Wd&tf#Hr@ z7sekn%NT?TWmYzAHRHs#b%48XZR@)Gc>?pAv8YhUie`F!-lgw07Q%^e5e{dfL@@*(_ooU#2V=5ULXS`K-ENThcE0q76RvD_ zrw%rl17kTCxP0@ktnI%Pybz%-ww_HzAxwR@sbIX?g*23zo13d6xJTKr)}p2AR+BvD zU2ZVp;US(X6HrVReHvK=w8J>I%3BU=dTj{RnWZKo1qZ&Qq@&K5`b`6-r#^q?QI#k_ zY0TsR;!{UflSp02U1~_+(M8I|ZQK;5H9$2o-x)UW^I;1iV-7%@)g6pfumJ_1kpZj4Im^ zCDgj06d(gTnHZ_)3bflgF$Me~>?>E=_`4Obbp0-GAV%cQ*szZ{8N7NeJTQR6a~pkGsaxiU&* z@ZzWFJ17vg#|7>eE&6$l7y}Lsg=flW&eC_9ouH+)I@G=F8twZ@YmBy~scF#&M>90Q zZ)u&gMFlIa(ci4Vy%}(1UIavdTT=5SGBlOSqSZ$)Ck_qAO--hwikc_Q;_|uRD5T*= zwwcDuJ9n+ggHirVQa{O6|ASf@vs(wDW;9W>0F8p!4*?fHb%fs31q664S*#cSAa<1bN&V1-Gaq{beNh z=>S?Uf_I6^1+I2Qk1}+h!*gfzH)V*B*wb7>nIAB@@p*#!qqF+SD6VIQ1@8<&*V)>} zP>gtU1|^&D67KGkm2m&>^zriOv;W?6O_6c!gefo&r$sO_l<{-|uW32*W9RE^OmBTt zitwlxNNZamVDZ?x+b#74hino>goRZLb@{pNr8)VixB>qSCu&ioN@Luh<3s-<-Prl-(#VeLaj8;iRf{NOx0 zYn+$U?e}i=gqF1r=j6?$%ddMrTEjhT!3ntX>&eYmKQBc$7%1qq?Ga$LWgz`Xq@x+2I5SQ6(eATgnV}5G~f^kAL#V019+O95W_ zuz|}}>J}HQeJ)+!r^y1J7w+kJrZlWPD&G{5y@He_Goxi1-WeiA z%fMXL_uFDPI^Wb{p?b%1{*Al9IY8`}$JKeIl(%&bi>FHEDd;%*6|Q_>46AVh*9oXy zpj7(m?8QUu&F)P}0x|9Roxj)0S_J+vHFN9!q+3$XvU~nv1k9IK@FeH%oI^}PHb>hn zJBZ;+w8}GzfCr2EiT^J@Frtw}R2qG}HKpXNd9a-EbDBZ&kWtu5OosEA$ z_OoyY%bf)KF^rMNTJ`9GKL8xfEn*NTa9^990Datpdh}JnVW(8w8ibB2zG-=2)aIA( zi;N3Ev*|5z`ud=(8Sqh-xTF>)EX9GjPPkZP5x(zO_-mh@G3RMG_q3-uI!CxTgBek6 zg`jGp8K0Wa&iH$T&UEE%Vpgx@q!;}E6ax1JYwjnRf#ygysseD!bu751V<@<5rGkixM3>#bQtG$o)Kc%4QBcyxVDxLk&LLk)hIlxd@= zpk4J--=wl}+4WEqI~^O85BN8o9bhK) zfcx1XbJBR#`l3HPI-oHj_ayiVV!Y?F7q@2HD|jnrpO5{U!}s0-5Aw>dWZxi{*s#ry z8oqdb+=CA|T2GQazM}*ErA-B}dBvqzsuBeAV7wsU9=DHL);oD&)|^pgSRB;RXp2*+ z^xk>WxBoM(g+W#2&S}(SURZ6$1AtT*2&@-lwTmGJ8?~!-8oJof)AZ{bJ05D1_fS2q z>>Cb(0VADM*ibm~v!vXkj^b6qHSuhnnl3#j8QPsv>c3R4=jJqLkx$>t!nD%n8sc+` z;uk@=bz)T4SqO}PviO0uJ37rX1c-*)}I&d4Kptl>sXMNO(}g!B47PDplT02@TOY;w$|Z14l7puhgA(H z3p*tav8_LSc33o?%B){G5#aY)lL_iyB>I_e*t3L9C<{r@MY5Whfn-I)Qklky)fNHN zyptN%I9}5&$)`nuGw0VWH;$$&vuZ10F z67$lorFQs&rlPYI%gogbxwbqLvIM_Sqt~25P8HFm6~#Q^hL5n^Gk`4peNq|oHKSkm zaXL!>V08|&NF>)OPQu*y8_Iq>cd1!;*GleX+}aK(dAqypo6T%An%Em!YC#NwvvI-? zS^5h67&#s~NvAoz`v8$00dr=H0dm(R@X3PG$at&O?Vx%k(SU5C5?gfrVyg--S!^0m zvv&89pT0rS_-63ak^tDj2Btq?HS0RVZ{}X*s;HA5$~=ipnqn=EpPN2q-VG`Z9->%H z4V!&n(3J$ALSE@(3AcGJLvp@`y#ks>|!$@+4i_*=Y4N8+&A7R9zVPmU%}b zTdFlcQp^`A$k=D7qd4nl&ZT1dMuOLi3 zh}@76yfKwrSwkC2^D6-dB2;KghlLSHdryF;4=A80&?bvfi?ntau`9=fTcOYpv=IN97fWzy7g=|<|T?2 zmlV0bdhVmxnY1u4%2ssR+anKXztrzCfgHJV5VLc_55SOIa?l)LX|4u#+O5t@z;^at z45r)9M#dF!J;T4hDVJ)2sCl@cLO}XF570nhex95})=jQ3;Hj)kIq&=R?cBnZ)2kw` zGnUmY_I&MO+k#X{#V=ItC0r(uWk2#8>_6;qq}!jc$b!=SfSH60LqV76kYxpA$~OZj zTFatM53)p4lOE0*YT1!x32d*_f@V>RK7_XTPuaD*>ngDK3}Jy`Z?g38CeMsV;Q*i@ z07dE`v|D-VZqISV-j(c55WX}V3{@(61)Mv0hCaoxGG>T8;;#`bpy8(j>|5C1h+Eq{ zK9HTX^M2Nk^SqPnAe>7!GcT=7GH$uzvXr;X^$oRy52bM#>YIql ztTp%Tp&);h0+%_bh2#o4b?Fe3_*=a+Q2oUXEjB(+`+)$-VlIX8%m0Q zLZU4e(QpA{QWZs5#GcWQZG2Pt(oR(Qdo-;uQ9M@|#k#iTONZgbCf+RD{7)Y7d)$YW z#(mZlJ`X`01g2$D4&*~ER@o}-pYcxczr2PI?X+Qt1)BOUY*wi%cWil`*yIdTKh3F>e?Q;6&GKWCRef2 zQqg+d&Poi$R|&KR^Em9<=okE+e+0-;nY>`8vcc(A-KL_2lN8AVDX`Ldu(q8 z_yjlRoMSZVwfgL#Qps&_o@00^61of8g{saGA^Bl?wbJd}UkLk%|G5s|-&?x+&YN5q zL94YSJoz@P{L$#tiu}?db7f}uV84frB1larCdd?$=wz1(W3F3o5<4^=Bxu!AEcA)8 z`;OWJPx&Jw5$50EZd?ITT%&x{WLs;>7_Mf$v#xCcEu6w0)vuN+3JAJRDGc|Nv9-73 zZ}<0)0nHstkKX*B^t#$Lf-4$W ztTP~MYvBS61`hRUUmTcCcUY~n>EzFWvgZT@>j~tz>MtquFAB4X%LV0JYN}fz;^c$H zI;9}U==!7Eh@usRL@Jf#P4_?jvRN-Sls z>21c2KM_AITwdgDE8GYpCLa-m+~3=VDx^>^dy4?&_ta8}GE_8j$x|qzmWm|l0CioQ z)>s4Q zUXeMEBwuw(ma+C`?(Wf%xG46Sp5xzGDoF~1d_jXq+tyJp_vTemR9RCP^p$Rsr0mIV z#1#MruL&e01u{1zGIzG8|06HZwf`JU?yr34fPYleK)u0}iS=Zs2gDp52Z$vFnW{vy zm(4Pt4FXI-t1Jn-6+%3=6K5$bZ5wZ$hAr5EURt-)1>vM~Joyk9ui2V(GhdhyNY*yv zDQv@RybM+OO1rXd@_-sialI+;NK#wz`YK>A;vlO7N?Ume2g(9Rtv^{SMqk7b&3C`AATX8AGTmFXMF=8o(VM1lc$oK( zT<~Cs2U_exTG@>Av-B>F>bN@f>*RQ#8B1*^p$R==TJdbmtKH2zL;v15V45|e(yX>W z|4_dwqAo{{pn@oN$EyzmJ+WjAGPFg8IZPmaDKz^M{j;ZB-r3ujRMrWD{2y1;Xg5rh z+ZF`G00r!qIhGJ7laGyuql2afEC~4jABeK@^nnKfh4@cW>c7*FuA}oN5879aasMJ% zEY__&(91h(iFGawV-r|ghXn{?7ne;XyU!z@k-VNX z!&5vHc2&pP$Qf>bUOxBfGGLOPEF(8RJuCtOfp>`WLlPc(GJ?XfqN9cHv}hkcb+g4Z zXSrU=n$koPBYbtM`VF9QoIBAR2%6?0O9@B(jmr0xg2@icIUTnNAnS#2`f;z5Qr6GC=M z$xE5?ruV2(Zz#$w+*4^A3C`}RU=0JBLXSir%O-T%#2j{%c7QIN^AN!tvymQhg$`X_ zENsS-T?xks#DOge2kv5PMIxVL?W~<L5-GI+odKRlr2@7Z zb-BulRhEH_=9n(%JR3A&F`Xdxudb^*zxX#~395?$^hE;SNxiei# zzQK~zd2zYA3_zLs(2lPnmiFZQF-K`13YOaZBOGa`$uCjyh-5{Qql01&)#w*4S)-eg znGEH;_ihk-G{XiPYA%hTu^8JBcw}_S(+u;PCA+#g36MaJR<7chASzJW;|INosF?dw z_Zka=)!zW686gVx%1RYj{AR7&=6P91M%UWkvU6Z@<$wj~+Y6n5x)J=}V?F=4_G<_O zPwi37OrW)aL3S2=k%t9OUF5->iG3M@)9Hqjm#;Xc#Jxsu-DDQIbCu%IFF+Z3CRT46=%6$QJcU5N-ShmYwbR5g5 z+~33&nMSOinC^JQqn#H#27KFOfG`<$6y`wipEvdR!dQdEr(fYOAugu4tinN<-~Gnj zv;a*ul#@4mZ34FmJ};04<#CLdNSb!ZFT#`~xsx@Xvtjajk@`LY>G>bR&Ab!$v|MTy za4{IY*5$TzR#i4-kobCBbS{3Cg?$076cK6|Rb-0w82GU1mWCtHxG@}?jEAVnnxfIXe*%!f z!L3}w$Fmdib_~tzCsYjcRPb{O8^1uS1e+tqt8x%nPZ|b8-p8aqBHEVeTVDMm@+D$oOks>e4 z!bcVn{Ss_EABKeNGE*pT$4P)K!%E@cM@%Mf3Kd?$qJT;joo+ZxqRydDc+6^X5S zZ7}T$xj;!+Yp@q&0ou!5?ZyjsIIO(y6Ik{xDvyN<1 z<+x~lUgVNQN9BLld|9U3ISybUan-ATRb1HGb0zv~xb~POyT&~&uVBTz+wK`*%VXCp zDr-Cod&@>pv_>>9+ORb?%ohE5>?bqxMx}GA#N#4Wj|$iU2?~+G;oPFlwm@vNsLRD* zhSEmMn#jt?DqU{wHQ%bP03uw(y#KSIQrZ4iW(OYHN1lLh(Ea21_yZshfM*sN)O3L+ zSY$PFId55a5wLFZ{?rS75eB~7OB4VLeZ~Ba(0|k;r%-Z6c`f=RVDN11@3DIK_&NWa zs1%pbD_IQy#LD*u{eON#5aNA>}wuabaXzZlqZinyc&WLWhzO6Y%MM2bW{#jhsa+D^RVD{jPxm!$8jd zD2-Hr=Fq-pCIAqmNKzpEYhzmuB>`6sL-FI3pMU++3Wn}?0t~bV0$+W+nPw0wV|Zn9 z$=u%HNl!O>2;zm*%^Z)+Gr4}o;w#rqyC#Z^R!7y<=OZ+^V*YLJ_!OvL6>fsL@>~G? z*JAI|`KJQ8Q2wbvQ5%tZP_G7#^Nyy3x>hfmh^t9J#MNLOZj*$x0ficQ1mDwau`&hA}Ze zQX@t!>uUX=OAhNad?>F&221l^s^6F@XUT5mr97@C%oQzHt!7P*g`S`!qJ-B?(!@wz zWWZII#8xZHreD`-=#7dA^L{98P1i72@TdmBAT&PYXS-;SETGhbZeM|d_r5Nyll?$p zQi%p(Qy22By+wuyd4I`;r@OC3Ke@uw*n&1JMiBz0Ez`v_wGH2L;<-;&25;IXb{W-Fs)MRI(WF<^kaFnS&I7 z;*!hf3kdtkqlG~OQ%F15PE+WKhWsjcf6hJWDUsA1prf7}4cbrz^EJ`1FcJ*w*x%AK zV-TFHiJdAKYqT2iLv_WUp6hpKEsQ#{&cd82@RR7L?|RU@hHRd z{Emx=yfU>ujz6EfW6S&uimJm4u~QW=6Sb1uw|;`e2}g`0xkMoMs&EH7%<2NFhV2)s zE=YdY#S~s95r(zg9K0!#AQmd&pU@%J&J^oNeZHYqt)A~Siuo|~u)PB#(~<`qYm6>z zCN=2x0;>*-cQ7wTpEjqDQAlIwgOnqMjH*B3(z!N`^C%)B;xAeB4$6yAAwvehY>h=| zU_?MFP|F7^!SD#gu|HX9e-qS)L)llrYFKSL+_2O)v^cht{fQ|0$ga<$#Ny#SPv5HS3;XDFzxa5uO!6 z)7I|Dw-#}MoeZZ~@2M-MDj$*t>?+gbHqM95Xh^R0Yh*CVE~C zbIqj%s^4tC8@ZovJTn3OTzw>U$+{D%R|n>)?y-)_S0^eP?6?QDAiu(@;zhjETA!w` z-j!N`@QP{`T)5lvUGnCe!HwSIX=#WGcx^p4PA+^KM{d1TrYdfna%%+t)R0!|Rbcct zn_4NRteh4$xGR@Ae7j>pE+@4oX6vA?-EZ+V!w#4ES|2}XkugC164b$kXM#)WZMyHZ z)E5-VYKGDU;o_?tH>S}loyDiknB54yG5mSUskTj*sRy&yJ6_mQZVx@gHCT7_4l668 zyZz=MMqI# z94!HQXG@yM^RyT$X832>xO2KVZ(eFHOfY{wS7iHohY{|1Roz&U;o1DrW;z4 zj%86TybE;)D&Ifdsn5#eL?!mGA){%+K+eg)v`i%d;lsos`DoAt9|=-7qM3eh<8qoc2@(h+V0jPbZi!nY2d8s%eS|Os;Y|%=2L9fd)vIEW>+v$ zZYQ}93yH=l4180C><`|==^N$f(?+49O}K4*z9fK8SpBW~7v|$-V=Q&+wIzUaQL7R9 z&qLuV9A$IDGqn@O+hVYqfYlQI4N9O&gbhqfPnH=g+=W}5R`RpDz!Q|*=WUZSD4}9W z&Qfog_SSbtL$R?mm9!V;U1B}y~aN?p!fmq;fB$*DPHh%^pZb=zV z&Io|s;!3Pk(`ERO7DauWz&BZ~vREpBvx% z&#fh86GwBo$Q1VJ%HobJ7;9&D#z-DF<@27|AM7-GT|*asl#xe&1kHM10wnyTqPP$T z$oZaNdW?L18QQ;d)ke;#1;24t2Zx7YblU)nB?@JBf#2o#G%-8Bk?1}fSxdg-gC;%` z^^_Yzysyq(k*1SCK10`(h)J0utfux86i?Jkyb1b`Mbh$^*0Kujs1m(b@Yiys1LqaKDGIC!GcXAe(TL#x+2CQ^KNvin9)R92U9z|2!Ol~m%+&@aG$ zo%+jk#h?GYn24KqdOGrgYKa2bt)G1>2R{;@5{5tv#uT$nIGe>UnSP^u=d?{i9=Td@ z!@?hAT4eiL3mlG$J86gyGt^e7@fTx|-Mc&t2$1)7y@rfUJ$?LuK@Y!D3>|YfDWTtc zr*1g~OKPPy^(RO5)w|Gc(UyX-2VBH$&*QOGUzTdJ^TQ6?rP_DY>YiS423DWB_HbdX zkVFwA6`91Si>%34X-30LbM_v-?KpAMmzTy?rj%Lr#}W=yaTuCqmu^ZnNgd&-)m%&F zVs?eEP|gOZZBgz8PIBU#F}9W>k`d>>tQgoH;~NbNz5CZglKCG+Nr*%A0~j!BS44BC zLkr(rVOpnW{ML?j*B9t)Cc&=XJ>h`5b@HIy!^hfxXiD7Ap&4yc?9_Vi9Ar!kp}ccG z&@nM5XFeGj((cfrbXOU6=0DG>$r4arp-!eaH2FjaW6bkS|LTE4t{1)dtK>pe@ID)( zX>&CR+;351vxGnTnZ~2|01BO@dFF{@Vq(?a;QNZOQ(&uUUw+$K4(d(gx|BY(@%HEH zK`yUs)T2LZd^-5`bk^?~$|r@ieC1mSfc?Qz*wz%G-{1*LYq0D>TMzaHEnpRl4oNX! z0lD)R$P{~7AvLfF7w~+I=$ro&$y<~r8l*tV?K#2O9B2VXVX49bBGw|9t3bk|+X2y7 z%ZHwknqg;GGm7oll_Ayy?;OUUvm#^Ly(Sja27q=|Kn5LjG$%GohOYNQ3saZHQL6p{ z2#!huehjGr>_;m+dyX(fi2Tz6F&@}}4R<%XupAzq`t9YLt_jGpThYv}o!aif&D`LS z3nk2I{Mv&|Zck86ERr}U$GL*%k-DlJ12m`ith5PVm+2UzHHwB9NSZr>#C#n7gpa$# zRKE|sr9Nm%GuQkpafbsP(7(-HLP=r1{r9274`(Lw%J&-!&^c z;Htc6g~Rz#aL{CEA!lU3_z^s?*VgPA0S<0!^Y>+)6rs^S;g>s>nxT zg@~;ZryeymLd`9k6NjfQ;#0_}l-VWYyY#=mIlg$`AKD zRBRF!P@YZ`SwgxxrPAF0IPCqz@y0O9rPEp8AIK2~ z_SB_wd6fv|P?)9{80Q$eJyO`8d|< z-tgf$ap3q1by#bCv>rNZb#8JW5H2iQL+BPG(*XrogmEM$kbEkLA91V325(V zi$Sk#mizJ~_kGHpk+PVLwr<7-!e_>fzf;DlkXSFMaVX=-igA)B!#FXhx|^Mw^|P5x ziuLiIaxW8z_2L1YS1HWh_2BSL8I;2D2kr-Iq%E}c8uZv?+x+QL1iYPZJC_L(mPe5H zYMF`=owPu$;49f77~EXZ?8Zg_fYf#$8E*lS+AtOR2R}De3ZNPVdOr|0fJ2ME{nq?l zRf&5v6ZKVgLs=ikp406bxuB#i8a#vsvUzV_ty)Iu*zck-c&^-WI4xCg(7m2Y-i}2G z#6{mjN9IzT)Mr8!%x;23UZr;-9L^m_B}39irAVfu7!CcL?F>29D&xTqAQ2S0dgA?w zh1L-=rcJH^y8IvOzoOC(0UP zMxm*~X^^S4d?+6ZLbf&^ZGz6cri$axq!t{Aar_hJq2MFEi}&^@Idx$TM@tfSsEXHv z&fTFH7Yc3~4230=sTEQVum%o9>GAskQh}n>0Tw-Zl?Jm<03G`rC>PkQ&g&%4I1Y|U$re1JOsd_;m3oZXY2?*tFaOAp)h=s#Ii-sc@8fl@txyNEv7X0JpUy=-&P@3;yxh z*-L$WDBX;R!bJ=MzMPp+l#!Ju}1K+9#uhjTeNr$>P&qz?*xuK z?cX%bU-1ycaW!aSYx!hb$IFm%R>w*NuF|xMb96Lv7CmQRJA&=zH)~S;*7J7HuAkQx z$3b^xm<)=oeF)bM_@$Tfu3wxyhjL46KTWgbLT_rKw~Vz-^){mSX*&s1hZ>=W37JKd zJkfzlpt>1H(=m?jGj0032+1OhpcgZUzt?XoA&L%ek2RFpPcfA}MQncP{EXMgFO|Vj zVl{ogf@d>rb$UY1XUJGn2V6#PocVJC=~Q7RxoX8vTt!C<_|@wY?S$mm+q7-lwr$(C?Mgjq zJ1cD)m9}kE+P3Xe@7{55#QAW3!-`mQ_BncM!>bd2KAO#ZBxZA~F!K_M&XR*= zAg#0mrw=g7?M7t=gLOc_i2>`A$BbtT$y$Lz1CCcX!P*#(YDRnD8Zq}vowPtl7H$<* zO}5HW(ZKtq6Mm%v-OkWEB)CbRvvxD~fP`zRJRA5Khy^t)mIR8W1V~t2p?M8PqIG+3 zaZ7-^jZ57=Yu=iw zh#Y9QGH?ocKV!KjA9Q}CT!$HV)phhzKN;iQLMCX6x;dodbBnmAYsNnE()MaQHOD~B zRe}-uw3Roam&lJ($>@CjRuy~jml(#a3DiAA5=>uj`1d79u7*HvR#1uWjH-%~Rz-cy z8vx*z6>rr~#wV>$V{=K^82~YQDU7HtR=MWTHU{BDX{^&{Pah_WoC47r-Kj+*)j-{s zr=vD9?rAX&rYCfJcRi_|jkM#c^!^ZfBaU1o8$SE+D|<7h&Zpv*>y9R0)u1ja-R$qe zL#T$i^Gsvs>-qEX(bLmaRhs6B6FkoYH8ud1(yg@V3RRG1FSITm0WOK_jWggFQFQ;; zv8oPQ@oxwV%X1rAg+kVM`1;MpNk+_PTL8zRyeIhm!+I4sb*RKW=*roPt9L5#jd>^QBxtxq6T8wOTT4$-q;VlExcHQS)@PJfXdA&?~b zSHB^Xe`Ya=*3mekQ85`7xtxTk?ol|k%xv1gG^{*&xERh)b{GL8n)LRZeF>aN^$L^c{IDX{nm@6X&6uH8< zx43e{gprUL9NHz10zvYfRTw`?CWR*q_qb0vb-3FqsH=%1mUG;TR#gdT0J&evT4|&B zZezrcIC_gf(FPRbFNAeMGW$V_a=@o;`w#?!QtO4NH%pqt3&bHD;Y-+WGLkzuw4^E z2W^(9W+?+bYgVmXfidEM_0>X39z;n^46dvij>itZu5UK9(0TG=E6P|C;DpaMzOU^_ zHkn(kz8~}!xH6cR3Wr-7Eu)x!uc2mND83hnskUIpqbu8$vF%i$av$}X=d%x{d4 z`4RATWO=)_7i&^(aV^Ts4agKtdD2LQ+;I{_c}JF4Sgti zeVvy->?WQ8Gvd+0PCOyh088H{Ix+ULH9bc^&ig-Q^5t44i8s=q27x8F7Kn`8fS@8K z#*}=8c#?Ct?Mo3_Ifz<(C_ZM1xx{59#S}wgN-bY!lo^ezpY$4#QyRp=s+!j%Eb$eKdbWNs7+iVLaCl=O+Z!Wuvg{9x2LAm7r$t!CFFxWfZh z{RoPo6qCBokYdGNbC0k*2Kek>wt{-_ir>M{m^v7b5Z(wW$E7?*X=t?1#wsT5$5a*J zpB>hvu9gi3bi0`(v_#WB@&~UT7){YH6TUtCf4MjMUsMRYc|(^7ZGg?d9`Ovbu;$6Q4W`$!*&ofcpL}p?&OAZm(f0g zYELo%W1khIS5CdBcaeId*(H7g-WL61rFilhMGMjMug!j`0lJ(R?M}oIN(r9T)9h3d zJN2#rYQJAtWR|z*?RZJgqJ7swucHjFPp|t2T%iA7+i$uX%F3xM1$8QGgDf3JI|O^g ze6B}~+on%#;OeRkZMU9ef-g$w`hf#il1MIqM?#2ywY;oDf%8`~^pq<}lvIHJWShNr zO!`0a6@qQUvo!h!rsRRnXrLGpSk4Jeu1z7Le3;FyUg+$WAAAO>y_3N7#X6%q5X#tF z-h@Xxh66u$yGdEp*qeLZ?J%~7iXE*~UoyDhEZwNYcr)*>8`rvVyWr?db&{|#>ZR}6*A`x1aW8Yrxi-6QJ@1q1k-aOXgL zaQ>wT`ojN75sarlJ-jM~C0Y&SnE1~~qp4EcTb`afTX+9X!r^}>AtPh$F(>2x;l@@8 zb%osZZE|rCjw@lBGs}ffPh@h$qazV^vs=${CCv$6XMCNGiNVOY=?;UE>Hbi?TjJec z293;G$1*C_Tdub^GIIz!f%=Oh`|MBtkTExWhy6o4D5UqSf?;XNT*QLM&(fRNsN}rm z=au6n^GX(oADP&^pg~FUq|VRGWT$0vfTVQo+PQ!~$MbJJekOiQJ%4A&KIE=nCG9=} zj3y%NWe?ew*vT({me8YxEw9N8R9@=rYt0Sqvwfj(keW$uf*}qY7xN)N^)d|yEi-&) zu(j0}u*I*D3Xl01gb|Unr7XDoQjXPX*9NfnP2S)XvJ*M4?|#KH?1ecYQL-jjC8Mq2 z0&Kf$v!A;=ysYVsiAc*3W2nY&g|Zs0N(49Ore&L-VoY;@xs0E#s-hyWkB%>yANy~|W?jm9En1wOa zTy2V{uwq3fWJyhUJ69AE9<4&nOiH+C3z$o%f@g@(QeM9b4elTQg2H222AVhh+_-fK zd5fJ#vP!IuB41s+?;;jAryG&3!l|tIy%VYa?Nd;-+w?Bg}AJARtyBoRX5YM4QtLSR2NFWkMbnGPu-7 z+Aa(@NLZPx1N+NYAn7((V8n=3*gH#1e=ZwQ;UwFW)1UkGGckq;0ULp}sRUvC%@=!V z>w|h}<1R}XH|DVVRSxYH6U}2w1Sq9KzD2kjgkvsFEy}0}0moI_!zR5o6g|v+VCXq+ zL7L?|a&A{i({u)`{>5w8JsU?>4%$cjh6WZ(#vc_otpTCzM_FA=pdpvAeynPA1cmrF zEQa&{rJ9I^{%wNmBum|g3dFW@TkZkk;BLL!yPkj zpKH=8t~{*XYgwC<>7()MKuanhEcb3tGTGR2y`IL2t{t44M`{*hk}4BwO{hgi?a4Oz z4RUt`j}ibP?yGHqQzx`19f;mop+}2%^vF_UG}b_$>#WS%$7VLlmgvfC-wD;oGAEf8 z!DD8u1BZfdj^q*}T*wd%1u)m@t}N0EmmC9%7o)r%BfB4cygLL0JUJul>=35Ovm*>w zNwc)V?;v&P2$NbDQXu!6=~_qDs7%Wg&_;jbYGj6?ja(WRdlXz$dsyVaXsQj0f5$sD zmqA(eXRzgm_J8-DeH_O+n2tuwkAAjs@9Qf8Tkq>H_V+ldaj{4}CR4AAg3KZ&JFMU1 z2S#3r)6$VBj`}Q8)Pn*}n;>$OhY9EXAeu!4ca!}#2mzWpzmo0%olIMtBF3`uaimcyw>H-gN zWUNDE-CSIvPtAhY?0rrpMSFL1mkhuK`N)cT?k2m|BcdCv#$H|8bLes?AU8r}P-&n{ z3W%V$ZUvOOj~b87>D%nk`8u`XXYmC~3)a-tO}>LnyaQP`!TeBDitb%!RSu-6R{>+Q zn@S`<^|b)et`gDi^Ln~M%j9S{3=GX#+MFCi3_Z?j5^mW&L1+`}9j{lytr7+Qh3v0J z)F)yahIlLbS;w1Q+kyraM$i-S#Bd?}tFfj4jQ|)PpbqL;>!fhfRAhj~GlVx7a-$G{ zghI#dV4wbqUfUWo^0{zq33KRwIT?%prhr?T`fcl%CPziKmYCcbj19HDqt2E_Q%>oo zmvpO+A5&D1HWzdec@`09_A2O?vwC5Q4Cc&7nrHNo3^YKCmks;g4br*Z8rKQ)%kB-> z|epSH$orzWZWV&c=o9Di39ASI!MHke}-2F+s9S@rp?K(Dltva%wQTB!6SOdTN#%W$!*gH*a>15kR!#b;B3f;O1+t1E5fG?eT zl~X;6LO-}RwDy&Km7g~6pT-)hriYqs4}wndDwhom1uN3x)n*q%+5>gsu1yV^LEusz zC>ZcOTw7XW&w*8u_LA3d^ku4ooK>2W6A>TfatZ8gi`ZN8Y^zL}lLcE_mLj!4`C9}9 zwG=<1i}U2_EE#T|CF`9#6-uibfK$r|^!6a(=c`4x4aY_8dNpmg_Q@?#U?F@Tm_w|M zt#!T5VF{a$`=eWT;Zat}t6~L}Oc8-tuh)IGiI1%AfdY&&?#_DQV?8KA8NjGYU-!qg?5Xs>Sl!!A^!w5Bc-!M$) zQ&L5by3ukyhLCa_&g33AK&`71cSA-@vI05Ok4aHVf^dNc{=f$oVQvC?!K}STnM;8r z5YO9XClc~6y`-BQabcTkrSWDzY^+-p%p-ASfTFl1j9b_s5$`3eTwh=u;C(*0E5h;6Z{IBC2*=5ZV78C0QqRg@?3p#BnsanyKs zw|hz4syk{Oj-zPtkVZ7f{HWQ*m1Eb8pGKUg@ft71em!hRr5D1}6nW6CGGA;Sy?Myu z!4VV2ZzUr;UPl%faOlC=xE?_2@>cQa{v>au(CRxtU(nQ%DSyIh=fnDk_&DWQwX)rK zI8;KiosTJnXGPg|OjcbMn9OZa94xs`L9dO05xhS48Hb_}vfUn`>f%J-zsq~~hA)dF zV4HjM9)u!Z6A@nNmNF(Lzc{D$d#*gKko%9V)nk&4%y`!&;8%Q?7(ys_wvWs}y1i^} z`BBQ;@N{*9Rbuoe4o+)yU%j@=IQ7h8p<08`s0F`k%w3jctG_%tSmVB9KV4<|6hhM+ zx@`es!FPPnNI{`!H0%>*Hw93|gh{j!a435?7sDd<g4 z$_C|tfBvygea@IJdGINezcXgkA{M=d>S0SBCN#u4jsh>-JIT|wVx}13utcw*kWuAS zkh}8WaN~gYzb)jYk~#6+25w}kp|r` zF6nzXz~a@Tip;(j|3d^E=Q6iEG#R^aBdN?`JUKI%O(wN0_AJo`FO6ubI!DBXb;Tqp zjdm2f2&4#`juz6s}LVZDClF%X)yEO0udGwKd)jOAS zSa{QBQ3x|4l&he#gNoD!Dzl(`Bv(q3#&Wy{z(DDW6nBlAx=SyrHMr6bye$Xx0%#9t z1B5fDWke^{bxpJa72L#h1ZSsVcXS%f$V$_t#uRCvAoSS=p^(w>I{grND5ZLiGFtSn z)g$Sa>M!-0bw4+9AiZ*Y%ZzpWiwRTH@vyuWqurjzf||LcZI?p2oinYU%3WV>zMPOR zK=P%8N@Q!d4Mwb3DpZ!Wp7zo9Naq!EY)o`mo(d3U9zJ8W-dUX#5-*_;AjqT79QP!e zv8IS-2p#;1Il`LSUyXO|U!y=e`R8jV(W6c64fMl1!{(e4JQTl7{8Vz&R&?9MT?d#i z+BgF)8O>W@Cy;5>%P=!+LU8pt4y*qF5Dxw&ReR7PmT}ODSmOP7eJ7%TA$$_)?9gW3 zD;n}e4#TCB+w26gd;QpBOQ`EK(OX%Zz7pp>bB8d4+!;KWf}SlRaZ>a#^pMH%`Y_Qc zro-1IIV2pc!uYBXc->Pbw>?>D+UyLGCml#C$t_Q@%3@3h+s>O2%*^F>vO$9cpl%8I zMFnJPk1;_t5Gj%!&2QvmE)`HkGLu5$v4rMf^He=-$ZR%{b#&^2 z1me6BC~tu54VdpGKeQ&zu7r3Y~BLN0g=$j)6VBKEzT zJ?vwvQIMPIx259^l=6DM>~PD_GsqoA*?8SRO}Up9odJEP3>9&Bv|*+Z&=J>(^Gb;w zuhYltpWkYf9O061?q>`W{ud2xey^@pP0Q9wB^*~MuAO}Ro&AK}p*@7oYba8zTkJ>! zz7^Ydi%&@2((SZH;g`7vBD;Gh3;m=;^ShY>8uM2|32T2ouUdBu zf6l^hFn6XoF!LJE?n8VgD|QGi9?5PWJx}`bIx83zktS<;3N=%PE0?<%b%+g1!p*Vb6s-P%4d4f&=&0g zEiM4T>W>K(huu~WoM^w4WptI83mLj3 z?fZ_W+DDBbM2N3c!5lwJ_XP-sIgwc`kn21zF@(W7! zZX+_kEQA~v1)ZvExJ95YFolS#EUD7YQ6Eb>EOoZhg7*WqXEt;siyn(P3vqh|cIfPJ zVF0m@^kUKMG;;|jMNdWe16$(THvCmbPCvuFkH*7u= zsUPe-jh8*360X>k)4AxSnJWd1a2*I-9cH=EoS+b23{7jME>kZ!?nfd1t`q!#2sTWE zByH0q_a%5zCFB&PkOKOS6GsOo4N?%oYvfoWC8lohCD6C3P)T+wp}oZ9L8cV=XT-pK z9*Mkas?6wCVh6#JG-s-kBmJspg;UIwIW)d37c@}? zzh~)qCwh;P%ZWWB!DmbsbYu#Z0>w_F7RCPHzO^mrsy=>+u#i6Ym4G5JAVDitztD2# z*QqE>1yoawo+du6QXNne>34YnpI5q^vW|6!fVk03DMGmFkunm$ZI(#XL`yEk&)j6khnr87Mb{c7*%|h z$TG{H?ly&GXMPThw-GQJv93rNQ5@QQT>{KV>t_6?T^Y8FDc{>QN~;OBzqW9%O?fzX zy^OO*vQyIt!U{be{L|3ocQv(U0v6$Oj&TW~&+HayU?B=6K6Wm3I;NJ8u>e!%n=ec6}amW=dUQ9d~=XgF?cv}_?7Q-Qt($68QptUY2C~#VV`i-)j z4OG>sJtBiuPY2|OBo!tr>N+Z=Jnk!@TMJA543nfYVs^xGbTs*H{%juhvTt^Jsi6R1 zW}h7*vHq+!I&QRaGs$JVapW1o6q~%mON-w;M1OE7TJx2_=e0XZA7~0EXtM(op8k1& zMAzdc$8mmnc=>+Az2Q-`)n1yDll^75AW3(&MnDeGS7rlvUR;UY9Opvm#W?uu?Nw8P>!J(%06pz; z8mQfxmmJc_`!cF0L51$13^)`9-3duJiN{1t(hsE=BDJ#q?F$rq&jPS*O)GGkuV9@; z9dtc)MWtn~9!@J%!WyV1_$&9*7wFkrHc9-FNCjooGdS=}SpybTI9?+bYxM!lU2&XX zFD^6fe1BeaBKER5^Ml1^;^oA|Q%IIko_sBqTPgB1U<`iq*~nMKN-FQVszSdo(b>=k zabPs7R>a0Ct@^rW^C7wG!yYt|d%zUcp{CiDR4SD+n#LUrcuH0JG-OP(T#aXO;1+h4 ziE=Sr7~Hn#raE;8fxl`4Zd(98zsAP01!EI4Vt!0n7q`+mNUj6|!1P|)xdhEX3<>rt za!{^%8asS=tR&ZymFqg!+$&x@IFpz|n@s0*eV%Nm8Gvx!EX78{wrc{7kGe=YByb#m72+*sfI zFIIl3z2Sh$jO2F%(5(Jc3KV0=Dy1)p1xLZW0}}atAC&LXwLMh1VqoVe68h@d1q`0R zr(n6XKyxl2rd((`o6Y^K=i%kV1vl%zJqhjS#p1-i_*nck)n+myKbAB{_uT0k5>=@@ zg&RHm51(1Ef~%&1#(#+i8klXqG91)YG8K)K1hz)D&)syI3Ut$zj}jf!*4H`~;Pd`#?E;-*gauPS z=GD3Rfwd#>fz;i4j^YM%)B^QXMYm$|__1U6P(|6Yp#KsJF)OLK6i{gf|Saz?)x=S)~R zauvDMxH}7ya+1_VKp}!IHdAPRTZ(=|x+HNf=W5KKT%KxfyViH%q5pS_09un8xp67D zBC)pd&IWfJ*#nif?GHFlH_l8JP6nmMGk#zVgB0j;PqdLim^x(0lO1%Vy-Dz07ooKxtedws?9PezFOtfn83>s70x}h0%mrarDk~=t z>Zf)%%`ndAhGYT=SPRIWN=QeIqEdgNX|(+c0Eg=VU-j?e{P{G^1F=9eP&3Zz(5)Ub z8F}pZxHlE9FoFx+J-)$i_|wAAU8FG(scieEYo;#hQmSr+4Oi`aT^Ka*@#k0Of;<$? z5yCr9?KjqrfVh zz!KJOQ>D%zsryGlcTTQF`;A6zn=iQtEcu%9f8LLVv^E@YIg$KodxEq;#X+p>rF$s; zM3T^}91>dte-sEQLp@$gO{S-@OKW>%efxybzAY!wy3%udCj_8ddL2*gO*uuwknwK+ zVOM=z1tg0w*(x^hkdnL7<>ByGxf%d+%?A7X_kaXH27S3EP7R5xeo6QgoGe>39kyWE zk~@rq)^e{#@I&*jVDn3B@5K3Y76CjOWTM))HVi1?KCr(iN9q=2(r%L%Qd$@;GoN*n zQD-M*)P6inh(=Cet#*k9dMO7nwiJf@b%d;*r~4b@J1RmJO<_OSHio(L0YDkcd0@4_@79<|di zn>zvSb~#WI6;L6$3WFQ17W!p6uNsLoBW66bNaF=i`g&qfi?C1uRcg_b*i$6K0X-XB z24>Nb?kf?PJT@wwM9#J;yRLxqy=><+JGOa>C9zJJq!_im(Eyg^p|g!<_PP1|$+8cSv@z80zYx8)@AHWuE4iS5fTG%>xIaPeCqER+%x38JqIhTO zK@%e9lbB45cu=R1AXnn#+5+s|B;u=(?}RTN7?s*Sv$d%n)=#Msw2}Z-)&eKB6D1&% z+8&tXY&=u6M&z~qV^G`{#VkzR<1I;g>hCae3~e1&UHOFmA8C8j4|*0M*faN0Y2@X} zQyJK1V_=RgTgKC~qQ|}=*kAU*2i@Vq{=MPCd~o*_fq%#_QB`AaJ4-F4_WoGDFJo#( z0JnZ<%j*4VloKVzCNu&N{_>DWYXsrktMnWlAenMj{^Q-`r_W8@;SrXfpI-DNUCj3wK3jl-J)X^&Y}#BJ3UIHUzFN71#Le_L#=V$+lx z1k%XX+y{3(y!12gRbrQ{DmJ&sj>8sGP>!5Xp9$26*PpNYi8@(J#AefkkHj^^@YU@ILTR+j8ep0iIc-ndSV(sww!qkk0{!qnu4bf1{FQbI zV!;kfik0iK&_pE1X|y+T{@9kJh>>#(lS=KaQo_GZhHju$ zsLDta@7tqbOT-4ya{1Bi$+|}yc{NVv6rH^?!@xV$IUodxbLpEmc`Ok4lYseGb50P= zV5gCIDMrX+=RUfPUyYb;!uOf81avd}d$XI8NKX?)X}*23RWU%}yk$*vy1De0%>EZJ&mv29UJ zGF?>DQJexuvt+CI8p0isEpbv$i9G$&%|Q|UD!oV$$-zDq?sK>RrF^}8stw!-P=uIcckL)J!8|9)>W;)wy>ae&G{-j10$5v*WH)j zPs;Cj{1K|yc)pt6(bN=Lqx{7EDzA2taHg$s9#zT!U%e>mXoyh~HZD`X*L7F&AfrVs z?5oMmaGt71-2eFlPHF$|xHk72Mg)8v-pQZKdEZPP+-(rzuz*oFz?dp3AaRBnH%d*K zrk3;aU+dGFT!ExA(X{L?I49!puJb0&b5s==1uy#|dN!dm8DG~qC1;LvlDzd^EY^Ij9&Y{YT%w+*A+kDw?y_LxaOiaL zR1$rU<%(*XC|g5B;@bJEC;0;8wu}Yvs&8Hvg}tlN_SR?HFN2qw>I^y+MCUe6(fr%B zw29hzTTsca@x?gSoy1a)hbfBJ8Gh<4gi-zxgt0A@==Zc6J*)?C45R(<=5JmKx>{Gb zT4CmbRWYoKB%(<9Tg$8*q-zP{f?}lv3qmxleoUT3Bwg4|6%cxpuFB#uy&Z+n7j6JB{mKjX2JuGF$^MDTTT&;T$XIDQalibvNK2Gt$M<15-oUGx))e2E>4Ji zTlQUhccMNLS)3eiDdm)C>&7K#oK`SFge6JwP$cVK>C|Zkem&9=5|<`;Cdo=^pE>|J zk!oB30=2H~ZXM!Xow!z98Fd2yQsWTZAF2tiB(N(&nfxr>zqmN1;+d)>RCK-xlKj^|;>7vo?%&TddhXW8jK zKRi|}B#0{S2$70EO#s;klqXgqJOln#e;g7LQZTEoV?soQh~tBlOzX<0Z*s}9NR75% zkJf&h#Q*k|7-GO{4S-%}#p)^mBP|c!KdFx~xw}^&?*(b%!Wv%!m``NyO_0f1hC>>!ooX!K6D4AR7%hm+Z1QdDU!~4gf2_gdhv;7Qm%E4n)xA3 z7cRs7NsATuAZZPr$xkv8v>DnndX?;MpUgq3O7Akyc|}=u(ioqy(3He$jdyUhli>|1 zcL7lX1g%@)5Z>E7^?`?IofUPbZeOU2<)qA!5dvGS-zADa)eEsr zy^3y44Bj6@tnFge(DiQXoY&~#_y&Jur27bb3l}c#Nidj}i4D)4G_^yMzOOND)7+Yv zwmHpP>h@vl+mSJ~eh&7tCK1%P++qtaJg8=`7G)hnH3KyOgCl%U;9VEoKT9^DuYO^p zl0^r5*IsOV#reG=#@!4lGKm(0Tk~Fkn+(#U4zzs!TC&-?T<_wKw6lw*elOM24cIsL z21A#2>g%GVZ=MQ40Rb+a%>)p9&mi}TIcz?9R_E!2TS_O)oBYIPjUY&cfH@p8FTRz~SInVRS2j^*aAO`<}i& zDdX>4yU{q?Lmk#PCpWe@v-@k5!z{@=gG5h>?z1`PT$c^ESol`Fg;rx@?A$Mio)KPx(>jo&m&?Y47SZf5iFeYD8(7)M|5c4oYi>Afa{PBg zHOU8Q2h!6mU;r()r6IUyLm_*aVa($RE2d9 zA_bj@jnQ7`$Wt|+;%LBw5e8&}j`34C)}GJPW87map9}*|8%S6#yM(OI*IWT zb%2LSy{%h)haGNVVDwxDThTEaw%vvyG_twYnwlBZcJCt+5;WTLqiZ#k3I@Ns;w_U^ zG*d3cr`7>&9Mvl1B21%u6WQ!k)ZWy`bsc+t55+SA;}G?B%b1nKSVItsaOY-RNJC}dyEzm z^)-QQ^(8x31CF0NZoO#@fb;O}AH7)*-PG>g`C0*(GlvLddsSY!Pl-G;y>s*BFPqIn zwGdI%;AJs&iKP#JSJ@1`ive6Vm28Htuc*pz|2~Uv`%Wox#PIrBt^VmfA3rZIH$Ol3 z$MyK)uym#%4k}CD7U5#LrRl{6TN$)D^6*;^f37Kn13f|Y-~)6<$ZeL>O)IxYLcoLe z9wxxrUmFvZK@b;RSb@~%oH+ihEj!PSv$e$M zy+aY)O-c7-r(kJT^uc?%tJGa zDPxUUAm^0G6ME}J*E{cK^V8$y>v4|dJz=NB4uj=p?+^7&&DbGv;+_IJOX2MEcepi` zMDz=TxoYc42lCS*U6@9Ombnln1Z6PocjLVdg^8?gnQ$Q5vAwSw1lt&-uemey5DDOZ zfM4}KF`kTH90%e@)40xw66bTo!C9|Bd!I{7w+U-}v^j}?cwtGCkEngT()X}%O$b;# zqhq`eq9Z`K8yVwZH<+CSb6UL%91y7}xC)Aua4@OBTcC&p+zqZe;k~cSy^)YWVcbO| z-yKuGFVzi3$25pexvNEs6sAJ8!wYaK!L?&aVj+eP_>kF{L8LNsM!zCWo#y(%lIp)Z z6R?dGBOZoe#9fUhs06HqU<%>UNk-#$T&`ZRtUIt-X&g2Q455_|1vfn%lUKnAtb2Zh zzCs2eq=MozKc=sdCEC_E94X`m%UhlEy+Qt8dyTX|#(M13(zdaIsQ~{E<<{T-lv^F> z|0%aB`ox3QG!D!rGkHK3$naU{TE&wKu)>J*$=6L}6LF;1m>I4CJKV)&vT@m5+V{p^ zb7a50wr53iC6fj9e7SqSPF7@-*7Sz@!2k&#dQz@97Rwlv%1!?%xCRqx7amS`2g4EP z`Fl|JWhsLu-mJ&Wq%wCv_P@E2DXXc<@VWWuEff}BzdjDq{@?(k1K8-U>|WCn#Fj)S zYmDw{N*CsaT*%=ISjY|SM%cJzQ7quNH5VFuY{wD~ldu)W_pR6j@M0+wceWQut!ESl zxs&BotK6heHtB@#j=n-=#`eEXZ>`+wIfR_vl2_G%JC&q=W1*r<4_RAX$}lA}TU;QS zWlk#${>H^M#tV}(B~1uBn7rX^-C^vF-Q3oxmu6$6W9G4Tyuy+{;)-D3jwQV>hVb1 z#04f$pUoLkWhpAD7p(&O9oYmLlLrnfJE`I#OrN7NIL4mhHsb;%;&c$Z+WG3{*C?1N zCf;>MiY{T#MWc3~JjtDrvHKn+1dk}8WEd%lC=lMb6clZx#2uqbhW_l2MVZ+Sgmu%g z;W+}?&JrWSJ^IWf%1H3(ISResrQa3Iit z3wc`=;Zi8Ho(B$1evSYeeHj2GQGb}Ux}xg+ukMG*M@X~G%l?J$d=OpVrFPi)l>~ql z*EBsY*ejQL&|1!%MrSGWwpKzsMLjq=d5vCCPCEAm_9!WZlv=JU*DLT){){UE)0oiQ zlAUQhbwQby4bp?}9A34TUjPutTs0D3|CK}g`iYZnUjcL|kPoH|kOTms;~Waoo=C$s zWPyyjS(^|D=?h|bm46yG03^A>yiPUKMfHqRO{sg}ky5GS_hdl7L9c>mgCU^buT-f%K?okD?r%`t-zlpMUTlMXTSsF7lYWI^$et~(5WmHaRTV%r(a9DpD%X0;Y}Zhh zU=IPw&+OT23jI&7%bnEHH+2laXGx5IW$CK<>-Sb~ue7%zTmqwLte|6Wt{rt_*^oUi ze(>mKSV7o0{p+`vkRfM8jn8qTpWrsZ#P-Fk>Of1uFHk#wihxdf1G_3*H}=rSS(IxC z+}I0akTQ!l23&w(cOM@d@2&tG=2-?!bDpMC5iY0E-0g#eylEfMvBM6A!_?TtW7VTI zm-Vpw&4d3SKKJ=h>iSxMDV%LQC?jdB1)H!$A+};dZ-8_gj*7*Yq{}}>Pk2@@%7D0Y zaMAlzdzS3tmnVO&XGIEwrS(3y}N>8Ndp;|#fNK6}IalRd||ogCtXCI)846dk`I znb*I~E!j{OCk-)z%?xfgG-H7~tkZ31x*E-7DF=`L0Sr+0dD&(>6ypMH5U8Q9gO;uu zIXr5?nhj`I{;kKYtS_0XDGQM;9)+}#&v+H=eVtd&Cy*s}3lL2QZ}YfbUZ29QHE3T# z2t8hA-1HtSN$hTXsEYo|6tiP)93$bFGQ>Y}57huu%@LI}G7pc-w1MizUn>v4>BR?j z*SN58RtS%CwaHD$p3khXmm(+*I+iy)!x#nC?*jB=_mvYi*%arM2T+c^nc5l|ZQ-Va zO9I0a{B~3SfHwwl9|P9+-4mH@*Rj{IHPih7+v@Eva2{osP6#_JxyMtkBA2S|lfT70 z!@%(3D6a(-eTehZm#|GkHQs&2(1s0hH4mh-RrZh7?9DASs>yM_=2w38opvzv>B z{|vAhL_~6xcja=9G0iq=r(8 zcJ;e&%B*0F=t;$Wtm^k{c8-9|+BK0v?BF6261yv?%5QrTHkV|&-njE{^6goE1_C5F zR>7)2`RaP{fJ+P~)#gWG<5hgi99IIrXFEGyHY`}f;ix}pct zvF6;{JA6U@S3$l*PgeuJV`-VZrA!YdK6^OQjvm zVcd&+rD%u)Dbiwy7HJaEE_Gv&BS9Z14cR(-_MT~*z@B9pn((V`Pm+f;2XO&o?ZTit zNo~|H>zJO-KEiRK3yQG=By5^d+K+?H%9J{n=+{F>+xo-%l$ghINH`?$S0Q@rTd25A zwD&Dz!^Peu!Z?dV=`zG>)h^3=XEexFRojl&*z_6^epzSSMWKm!!NbOfH}Lzl)YPI_ zEnMX~i6DI6HZMMlmc*LtCns<0bpZD6STn#NIhJpiC*Xu_wJpT}^XhUK3SI?OGB-eU zspA|MHm2<&#i%*`G(=eQqH`JLSu!`FMvQ(`2bxPuxJ2Ji=btH)@GKIQ)S6I-le2YO zi?dal(Bb+1LO>Dx72*Ndjt~A*S2a8+wH6BXB|mrI)Ben(BXYzM_(^pD~eN~ zF5&BVh$^x4IF)MwU>s5{uOoLdQ)^k`_iMV7Ml}Bx;hvTFB1qkB!i9kU23I@w>MXf*vu49kNY6!q$o4gJ?SeU2ohKbUax-1v1YG$)%5Ku$I5#%Dg+ue}-N8U!6_ z&7Q!o43>%XG=)hnXdpbP&mUA)g0#7p08$N8wGeg=9&W(Hl@gh4P`lH*35R zUquzEuJsDrgDVVIQ@#V=Nd+6E_*$i8vv?jU%)Ti@{0+fkaG`-GONN~aHouS6{YK?Q ztG~1B9@{VpVE>D}NDXXTqtKvYwi4)wh(H{vWc^G-t6Sq{DX>dEALM+;B0_clo8i${ zMh2{&r1n!wUAY3956@JlsdKN^OLxnDazn(#h^00u)(N_04uZ?)eGPP-J1StknDRA1 z3Wd)q=GV%7Y<0jVD(}Hq=!tD?9>Ro#&%u0ZB`QwrzngU#+jKmA|0p6TnZ4#t;`p&_V~g31UWv z+r<`6Q&BZ&wN~&Z4ltu6<6G2b%mR$?jdR$0fGo6WB5ueF-NY0be|Y>HiRh#;iXods z-$hARtR&U!MS0cM+34po`=ynXpEbGgFTpC|66iw^%kVAHAKT_PW^k zf0%?&%~*Qr0GHIv@E$u(3<1c@P-_SS;>P)nL(XZ{Yd4w<5MygP(W9zaI3do@wO0lR zAPKEuSPwgfqyb6-TTqO+r+c2csUVPj#!&W=nd$6gKb86QGBeispqO^U34UuQfP^V~ zQEVs~3A$`^FpBAzq9m6dS;sXBeP3tMH|7#ObgEeN4@GN|=s)1dD?2bo7WftYr%#VE zSW{vY1d=$tR-)k~W^^s`Br+|et{Hg=0DoD?rv2#0rt2wrJdj8&`YSMNFdd(7n5=)J zhUl;`f@<+W6-kPRO1uk_TxNwS!IX-dm>HOy>hX)1EdpPB^u4w(nbZb^j?`q+jL&)y zJ;}YBusr;re0Now1jVnGey3Bvq_EG~C9Oqx1XiaqQVYV%rTJ#W--gF5qH%T_FkzK| zWqRk!)s%x|qv-k<7^L^g4;NTz{~EG~8GjB&9P+z1CtI~vq3B6dp@s=2894Hw2B=te?nOyKOfzcFmhgYkkk6#v&=>=IY{-3Fv zsab#dDZOgMK;q0&^0RbuRp@G+IDxM^g*f9?MXkDG98?-BWslGz>!9Ki02#%!YC$a6 zu$jCpC8b2HPbh4po8C!JaxOgwlXwJHU1aWexQwY&lOZuvG(-bm1DOoYJQ#F(3O>tH*G_91TRydJr`zY{c=~*Q{|Z~= z&E+yFvjm{-t*6IB=+l!`VkffTsK|b`^nU=cKu*776v42wAGY?x#2r5bj~n>YWAq>a zmyZen5(MghwEwG#)I4UH{>9{3>?;U%9vkwST^+5}%Z)$GSR=?T751DA7NdUa+T}ni(dUlYT1a z_R&uKIKiEWy`Rv(9R7RAFN%MQ#bVTIBWLMNVK%}HZJ4E)1l|ZDqgrs7FH%snPPaWNTrk0 zb!F;us?yu|;>nXIj~-oKUq7B+oX3l^!Gq()51)0~!z1d?+UN7cq=Y|Zh2Q1kb*8N7 znIIBu+f>Sta2bB+trLGYyrn%$6qqRL7cK&SpekV>MIl~YNrWwmDzTZ#o)o}Y5&$FH`eB5CbX&+Ax`8CZk^?RUYpzLJh+)s-k==*3 zgYmh8^$}|p+>pv*O$bKY16z0jvgX+Qff}MW@2mo|pCt{N+#Fhf<@Yx@l z$l6i^4Ll#={06X@@EN3&<(Drj&pyc8WCr|bXcM$@kZ2u(b;2lnCr2OBxP=m01RlWE z30Zh(BEUA&J}!U@9x?0TkA&Fvi23hH$ttA8hy%pF@hx4RuMQw=l9K}ya1)cF#Y;{R1$^fB^K zlYnc|jt|kkhhg=S2;9rereI$&Oj?@_J4h?*{2Ln*0_6*W~;y|U1sqQ{t zKG^=k02m5uAPZ#LZOm(^v80G#W}13i_ML)YSpk0-K}DjC_0;MadB$|`T_pFtJF2U?@G2@L`_&&Un};jA7h^F zaFu^rnC0KW{9!Lbg${|}eg;kxCncE^!XO|pXY)S>0g`e0DcgC?*}K8yDrr^$OKEQh4RQ|mU_72K~gq~%0@ad{DNIt$&4eo$q&5kCUwHP9R zLI7Jpf?AQI0a1yC5^GdD#EFkk1`iP)(jR|5ACsY}lkz<53OcE9%C@9o-Y(_3*?1%m z9m3mHQsjq_)RElb8JbRE}K|je{bZrjSV!*_XJu<)OprU`b z36;)gzX+8{CU0uREsbotX5URBgFCL>KIiiR{xKN2>njdQ6(83`MiUnkk(*SlRAWZ_ zkZU|XH;w)NJLMZ1tJOMlFfZq(22F}e6t@|uNbq?mA@`V#U(h-6{vrm5$#4qZL@##`kpl}Cw)D$C8m*~?|YFeqD?He|C zhX?ncA@Wt%C8nc^Jy!3tK-rIx+T8U`YaA`3;AW633}1eFT>8H4S+%ZxD>*1V2<(kT z$RNy6S)hzJ6y+7Zr|7zXwuc-(vs2NxaJ^3JurpOF7DrXZr9DaN%8o=dMc04zX-LDW zk;!5Y*C=cqC`D|-8ck-w73U;ve-CAPoYKwWQ~A*8{ejLuKmUFN0cPSC%iUYQHiA&$ z)G#eulT*|lA38W+Qa)NwcBQQc*_^ws>`L(M1_p)XZaei2blmQ?7;EK?zoe+@SUUeHgxewa^o&30KU&gsIzT| z`@~cQNO}c9iwNCF&=+r^B|@$X0K$e z-PBO)a(ZqdTV%dmy5jZ4y(g)Ee`D8Ys(s1&@3pHC|iT#QhnVaKH7#M=-b< zGXbYx?8gpeJvv)|4JGfuOdfhwXn$B$zc%9LA1b}7F#->0RM3iNOYSIZ8yx8UA4a@h z4QI8&{J8UVl3{pn=e>Vt{jEO3hX1^>P=D*gsMHb(m+y7FdN6P0s5;D;k>3<*S<_vl z9nC@)+h*I;cN7@E>p(pp)jWz@RD*6ni*{4uUSi(WxTnDkzD4XaAqTQ`iQKIvA~S5( z5OW(BCLVXkxrs4(4m`*H+f&x_!Z?!{-D}SL zz3E=zf-U^^Q)5zNPp9Rd;zh) zpHxCR+y2cZq?7aCQ$qSGk1ip7JpW%xNN4lcC?WmB_5u7C00030|IAryZzH!A{XV~f zP=LY)Y^m`ENwD<_SfFXMNSXp$1NpZ(H34k_e}9G^FC`lVflQaLlu>ImL)4R(ur;5=AJuUQ%GeS0Kjp40)SKD5eHEeOvj70tbQC3N*>#%{Z0 z_s=qgS6qNDH;7coI9nE?FK}N?QEcpka+lz9&xdhb=T}bi^ULi_NT=oHMpu zL^%PLe@|w2Wd8bfFiKIUjdK#2CL$M}vhg5J`53i;EPBw8AwZli9DG2B&Zr4fc`vCQ zoX^Gk+y^6%;ng%Z^ALZQAQB{{XBbFi5&zA+)T731e4dfU&GYL4V!62be20u@M*9H@ zv!G0sW{x<1j(XP_Iu}isV6Cd69~{rcss(7Nf4$}IhsM{Yz~#V-#ChCX4J_f*opcrE zS4>XpVq|>0y3lT%$Cxt=u7xLq$3l4{$w5iUEBL68~ zzkU;EmfzDr@Vl7L=To`aLE(WbC#_6(zYA)cQ*#teDX-Z7HJqCg>xvVr(k|>T``kY< zf4Pp5{do!YcVa32-LV`b*%c?*I}=Cq0R;CEmXb`HwC4dd0Mhhn${tMORL+oFZ5?>1 zM_O>0j4^2xqDQinXnsS1i-|wMh1I@+*Z{%hCU3unOu5pPj!;b8t27j;_6an|892q# zu8}!3udiFg9VLN!lmx~uA|Rn|KmbUfe<4Ib(c7em)#Vh>6#!u3hA`j5`4VwfT9?rJ z2mr*lTYhgNoPqrkUL07M@YOz2NR;{VUWK?7D-|kOH9tkBjr9HErRebsTOLl*O-rL| zPV61}6GVrpSh@i^N5}(V|ONE-D>QGx#;jBu%#|l_Fknf?RpI_e-!e; z>WaA@MBvaQJ--orqU4uAwuHd;9jevd)-sbplAskw=m}<{pg}-~9{Jo%UC7;-U_Fqd z_Jqw>s+283W$yDoFhs~wE2P(MqsvV}Cx&Vv42He{D~iaAxWfzLPQ_JU-kU*(UKG79 z4vYSfqsxRLGS@B6OypmU=@S06tvWXSHJP{lfsmX&hz;nn>#5>B>)Df zv@g?UAzCICtTa^QSqumE&5;!uU2$952JzH&5Xa}IV~fwzXg4N0DS^3de=F3BSX#(H zbzP*k>*FRqip*YaD&CpWpptwO{XAMGjx{c_x7mDe4_(?Zm!d?-OW3_eCfCH83K=@2 zGUa|Q{xK}8e92(jLG2=bCJ&1e9?W?dPTpWvR_oTT+r;ch?sxQa~vkW zaCFl_FV8;8m36$b!>sA8`7~N`ptY=}u3_7`_~AjByzc5(PUCe`lAH9UiT0o!8(Tb` zW#dx#*oE=|?8*1zRaA3i%foiOC67F}-|0`DeFO-+5Sa1Cy3;!!f7kVn_kP8w5Ivt4 z(ZStX>hm&x{?oFN(0uglJqt6Em|yt8)_%G)M9MD_vQo7=Rmynwm~rFVY~F&`s@c3$ zIT=PyGQm|}F8Xb(&M(m*kxbc}`-nPhZ3pwm=+oHZh=?Z%cW`PT$%`zp*3O@30Y3U< z^BL=7jI+OdXl?i#f1itgM*M&J(w0l$`+oC2{dtcHgC;h4WF_zNk^FfEgYqCe*SEoR z$FnA5u$(6Nj$NOJ*Ve=#G5HQtiA$5^R>^JzNF9wJ#)>B;-0gYgU+`+bL)aY7CwwFy zO->)+9w6`k0ssL2|I}G+Z{xTT{;pp^_=;`<_yxP!-P>*xe*;C^YlEWKqRq7*io&3! zk;O(LbtDzXci8`aGeb$164{ZH^bJUM9cf6;44;|jA$>JbI#(Jd%R+-w@^hlB->o#< z`^CG6KSPmuZ%_; zUs>(gKzdU|f0s0^h;!-ORlEM1pMg$RCSCCyZ|b$@;@S(GOdHQ@6$M&BBD@imgRl_I zDP)-c7Iq>vR!F^z(7-kh2LBhiT3*sGewHG$kX}tf-1Ga)7x`D+=qJlTKOg1k>_)Dq z;t#Mp@8qi&^v}PqjQ=IshEMFJ(h)~023Ns3+YH?FF|t|6TflsKQ5xqIO@O)ZR^EZd zgvhW37=I#4u$YP>a;5-b@Gr>|;E&An!JV6nzh{^KKLH~F5tk!C0d-c7>|Qe@L_=xL zIkyI(;lXN7uCW`b)ep^-Jz#hTc^Y6EQ8{X%iZTbRR39>#fR`$tigiUrTtKnL!sJb* zSvcr6d5$_ul$-4=hdapk&rhmgjMFdPj+gF00VxJS?5Q|^YnL5C0ULkcP;bQQH&l3? z8Qk>W7$G&I*W0ZJb0ZJAoi=(`oCcB7!rizgPnN??{zROd#w-06@DL^Blrok3FCgXU zUcMm4=qa3>wq^bN9mPqHF1WdM8TTQ7bUBe(!vnJgb40WTriYr46Y7gkQUj6MDmU?M z;L4|J;eq+1_SL7#2(&`0EQE%uSu1EK*_|2Ephxte9kT~F--Z+MVN%(e>mqy`2<4*3x>6^vj;QW;HZ)E|T_o=uJE`4d2bwUAQ0cV%jLIH*XKTDTiLjh2KF2<*U?8C1A z72BFlq}_4zf2CxMai?qf+~85Nu5MxH#+@e`>qipmWTcN>cW*Zw;iAfWAx?x!t|ozL zG*Yq)nvXwDcrcI6-gWF|{B}kHv~n}H5055|Qw{C`}*Udo`D3MTLBY>OYW?!xaPtIv2k}`#sUShz-}k z5<;@dsHGH-308ba3aY<;pjk;}jS5Q)Fu$VYBWA?(ARC6&4NcxC&R1V)1|P#DEld0Q zMu?TCbmUT05bf3u;hB`~VCw5VH2ltiedEOMm(@f8V1MVK=Q^D%Ls~+;4UZKlN#tx} zO;ygQ{4UO22;$%0FcK-34LH~SC zz~{}NrnB+BmCN=3^6>E71slBSaZkTICnpDxe$e-5uwDEIn@q?3iz7{@ zKq>#KedZ{FpK|m3|2WI0=*}YaLhPaR4US3` z-4}${`|oGYupuW90!{=-n=7#A)MH81)b~Q+{-i+@0yd%d~35lGYBgq4Ra% zu;k_|%css1wNX#ow--P`c0Pn00030|Lj=7 zj(^)A5WVkLASzX@)N~goj+1u7z3Qc^_8wt8N$A>O0ag-K{rBQ@4=dGpW#T%Hx)(>n zOc>t0;qgoh2}ZE{TT?Pg@9QVxIWuO3OH4mCjmr(Ddo3(92ce8vHrZ-bl@pPza1tl+ zU6dqCG9j40YYH+3Q&XjeYmtKXtT4xPNM1}^cu^eJS3!+g2sLIsQo~rmACK$c3XGZ|aSKC^s?yiNk$DJ5<`+Lc z;%DTz4t>BA1tM&-HM3%Nx`6lD&mo`OW4SH@~)!655qX~>xsN}8Q0QGW_{ z4S?OwWY2o%(Sak$6g` zWWMk!rNs0*aHX@5fAn>DBVF9iCVy|Y_OtI)K#fr@zXz6fY_(OF`8BeTLjlru#vt;b zS_n)@A3YXcp2$<4mJEC)xCmi=67DC&aM=39&1LY>hi%WQ_Xpa{5jOzanFrg}pxC1| zy%yvv977WG=vg}iL!4fhsqcJ<-U%tyd|ZvQR_PDm-H-jGcQH*~#dNY5uYZ^>MkA)@ z5qCLaQC+q;#(#1KRHaJ>)=#(l?)Trj5EUh4tTI|>){8H6>wl3v4A3jk0oa|UrVf(WAVG>nIgU$jLv4;lp6qn^bQiD`|f7@ynxzkFd_u4N%hZ9k!i@$!Mn| z$&^s)7%4TrLJnPP>wnQ`O%mg>U172f4y)R>&b7499B_%AWLni3X-Ld5TC3j7Dm+{1 zyFcYJi369R3Y2(YGQ{ONa^WbZy4nqgr3HgltstGyiz zl;>`5r)q>jojD4;?LeS(AYjDT_YTCk#n%q(v=M@Vgxqd~)K@HE03zZ^4lwdKrK2`r z2;;#~8!#4f`jW8Qvc*Wo<0CiGVhmj5daoy|WdJ1V8paUhq)Y~b86QjrLyZ2IOfu}B z$#go-B-pn)hbdlDOJTp*5{&!IQL(Q~vCqt&DH03|ePIfkwuUcEUJ?a)md9?r?GFH# zQA+_7e;Oyb-b*4#3#D+B7MivnN-=9`ZEdsC>ULIkOzD5`?5<=>u@p(ZkZUOf$5_wI z&OGz%?5q@{@%0(xGz+iICy4|FxbbtJ#8lJCO35Oh@c72Rn4Mo;oL`*3c{{nh^uv?! zR#$%bSDRJlhj(<*?k^15e&6^Z>G1TCZI6oVfA6DMI2{umW;1!c(jPi(Jkp+1?gmjpCXem1b-4FobDWfxPFfPfB%^%;n-w7U}T` zeBE8ApQzSMWk>mZ2}O4*scRkShc}}XhU_xIQkES-?As1vQ|^c7&!qpOEA+Nowp}qi ze|ul~Jl(!~iT?5=zvFw%ah>$tmv1pVi`m2cvkG?g)sc;6bkT0LR!4>RzwcRB=l|lK zWrF+SJ?l9(!t6iRxt`ooFVqALX}wMGERr$9f4RcXWJZh+8fm`fdOL|^7O`AUXckY_ zRB>6rghmkqFpo5Q(BSXF#JX~sO%e>1e`hPFBT5p*mN)*Zqg*C(&D2Ej?B04qf4q96 zxcz;S`UIWONy6ipWjDT71@kc-?qp2uzk2Rw1*}aO4*AxFLogijs|$zR+HlMx8&1g- zo({&5BJeZ8iVh|@gaGjbCC08jAT;Kpcf+*8$`}lE~0kl|PPp}R%Kp&eS z-ZlsB`Vy`m&3%bCu$Mqi0T_Rrjfiw9MJ)PAEo)YfJ(f;DG8q`B3R!#2iy?Hgd;`AKJH09dMmDDnl0;c49xnVfK2X;^en(iaEvn>@M&4A0+ zR1{RZz$Ic8scs8ibtQk8+5yxiPOx7HxiMK(uyUHN@^pMeg;F>v7@&Sj7A=6Xba56G=r!5^pf#=udp;5AfjjPYBGw5NaM=YwZJHWZx{ndSn; zCOj(_R;e0DLZMWx5uZu6?)d}>h&e>3s8I~T*y%!LhQFnfsb}zGGOaE>5r#4)zt}>I z(G;>l3Si4Z7%FgeZ@&>R8wL$^|CTV^VfdHtwlHB2EGjeubC(3OGx3(1p=+@FcSFl- zC2mP5FkhWeZP$M(@))MINY{F0@3gmvc6OD(wUy>!=`^$JBzItVgy#-j28YM$KL7v#|Nq=sU60$w6@BNg z7$`ts7m|NAYcFcoSqs>>4Qe1s(b#PtiefP$hvHyK4l_fpRt@ssd+wbXk(5d8I!IBV zFS`;obLW1Zd+t!1dMRX`3D<31YIW0UQ#-NkT2UKOn)FWByCr>)Wzt$%JDJiF;aX$m zPA!G8A~jW|ThUn4n$(m|NUMad?@f8HvbA_usPuoXF}iMrRjt&uvb-eenoPDTPnbqo z$!fPoY?Z)Q{8T{*9+_If)=UMXTfYN;tXn7VbN<@OZK{sZ)f<6+URs}x)V&1h+~KwL{vSe3tBR5gy3 z>xZJP$}h;~TlUVyrlx+Nr5q_0T3z_X&Uc$)_tgTDp8O(2HX!GM(qjsybDPrn6-` zj-^ktUiVMaK~R{KR4QP(p!~k4SU06krCW=?aTuTG>VY9}Y|=TEcO`k1 zU1!SD>`55pD))wSr7JhrrQZCbP&KDR!^g6R)q_eq(v-?g-NWpX6V-9S?q%IZBV2z6 zPecy|1IK|iUInWv)2bk4tMH=|GCoE9rph_m=o-1NX`4-?sPGV_&d)=pp6)^3!-zRU zf*J^cRX=qk0-*ppbd{!PiDN{_f)tw#j4h4Kl1Z_Eir`rIP`3r8yci(cQXqe7qf}3(Q(e2;!M2O9&S(4S>QTDCXJqUwa(Yrm zYdaO~-IIekv8h}MkjDBap7vw#TTk#eL!o2W#U>!yLo;*8k2l}n zrl!%##r>4KlS?!0($lrnN2;b&gpevr&_a~033~}WC#9&?jWu11n?4mCrx37T}S5EHu}Fsc{q@qQR*;Bai0{5+?M?LINtb3K7{Wy(_3I!8{V&7{EWI zCZ=n#U3s+XAjHCJ25s@AM<{7a4X`3pA^X@0`-XASA!gDN4tNZCvE(y)0<}dh5-ayH zxjekiLUD9tEKY8iPmI?RoyLC=GVFTH_xnfLrf1?mop47XY$!8Y6rpJydoH8SAxmB9MSWF1%id*4cw z=CHydvt{l%$j80RkEwIL>q2B3X|WRkHQlwm zqPPB#2)p8DVAQD*tUrIno&rJaC6a)qvw#;W71zN_&=qa?UT0i0J~=^{2`qP(d;~om zIt1nCQrHgo0t?x4*Xq=ffyq7SO9$BjGzXb+s#Ru`&msmtA_G1IR?XG;R0D}P14=+b zk_=QDMM@UZFP_~<;@U7Or0`J_?gP0@xst)Ka!u{<*u=(3c?*9ka=Z1Zx!9l?0Lk@( z_y*t?ljz1<@Gi=KALUar2In$AQHcYQNEK6wv!*BDu4`H9moW=n7Xg);04b!Jl5=@6B6cYdt>h$ zF}1$o7m^?=hTnU6OSc=utWX5SRWCg^i_H&sdVNt`MGWjK@Jw~Fb+^AeDpl^~!Sz!d zXYv!5j#mLBe|uFY{IFk43UM*l2XxxBG|WY3WP6`ojGXpD=bAZ6SlTIdu% zSQScAbuKoE=t1m@b2|%~0ax(P9dE)m9e=W#pRcL~Ox1E#=nTZ^?SiHx;NOMjQ-Evq z50h*iHgQ(wqh*@>_N{xZ_jVyj9;XNOt%^k~<6Y%RXyT`9;(>ur#U<4cH? zn^p+wXg3{kry9^?RAA{*#5Dd^Y%pi{VOfJcTk0m2v1-Zn6z*U~-jfrj#UV2pH~_ig zd7S_TpnV8u`T@qfB?f;&pi{~*oej4tYXRToe^9gxAz>nqV>2QnBNJC8V4|Eg@`G6t zc>!kZifLocUSj+#se`9W@poDNa%=(~rjs6jf`MlWK+uG2kH!x!cY9?A{8essNqC05 zV#Ye5H$yW|Uz!Ka2);}_qhChX-<7;mRK6J79Zl^JPPvUyRc}2k9B-mIbP%YUuB4oJ zf1DyGV>0m0@HLNx&yRh`1AUee#|T&VTdxMF8Ooz646@K2U~1(r8XK#|+>lJ@8k8}y zl7;sNDF{SI2OI%souf%**=>JPK+MsqW+9Mqa<#LjYgW`6US9s;)#dBgm%qPST`o4y zrZ&}!&4*tj?D^ED{bD1gg>6<}?%Ja6T0=8*1ec>733lT zK3m?)8F`Ow`psQD=Vr8cx)J}J<9>Z)&{O-IKCEZ z=cj-`SS$U&97&hH=|S=u%>CYW#1HcL)T$p~KzmfOqsQ*b@Z* z>i5iRk8sV~IkB^H8_6P`VHQu?f4vd>_Kz-`8VrLfaG~Rsk*YR-dXRJ*1K_}y|5?j? z{p!`_)mN97uU`HJEpsev3eW!o00960>{xA2+b|IR&abe{K$}D;Y3U2l=F2{z!8Qq` zeVC@oP29$7Vn?>ii?;puozs^wEl!CS3T#wWswTPf-E;R`9tU6J0QDOxe?o1%zl;!UKOWgd$L zxYzCahX=mjZFx-`yterr&#L=tS^TXtdSijh8Da~{p^t-|9d!8%G877~>5X=9=3X*M zNmLo8LlFS%)hQnk8~e~e``2+p;?k3#t}jKPde^9I-lYoB#Kr^XTvn^SxQubb|Dz{^W}?I zEp?^E0e;G>W74TkWn1-KmT%gZxAvi}CrA_x)oi3f$wpK*E5~wVf13z6xNvb+JF}n6 z?DP+69-hAMGChsehULpCM>%BAN4xkop;>O#dKT)%gjrp__$5QD9b*&1aGN;a}daQmLLI(0_t?0yGRmo4IYl?sF-%R8)-_Wbe1716JjcxkGF(q z3R6Si+H@aHf1tze*XW&Q$A@pvheo%nt<>>{Hf8?%tuAB&Y8pNVk#j@_5v zzo)$s9dC5d8Z}TRp~y%`n;5ml`MuixB_M&G`fLII!{{q?+Zj{UI}W^lsk8^&G$m}W zT%QLe-p@;;YGjxTf-me^2hyQsD^_aMUPnn6kA-x!fAtEi^cFNZ&CfjPsbhU{J;&R{-wOxVfz);3V6S!#_BPDH?!V5#T+$DP zTQy2v7}xjwU+lgfTL*9IefIh(@e=?5|Nrb+ZExE)5dN-Tad6)O$4TtGH}QvIEjD07 zhpojve;Sl@ia1N8MpAK%ZU22oQnKYtisRJo+HPNzSR#*i&po^svN!9E;c{OWOpGt> z6QYc1ebv*tH)f$!rtM?bq@p+ebCdC+H~twTsp22FUM#d9$r$NRq3BtR->0Y%l2Sy5 zOQ9iWCQ5<9r5#oa;v(Y$d*h#&F{nf(1K2g=e?l8zSq922q=5@CEX=T7zJJbR)s!^rFpd*fCqe(Z%GwJ?Z{AtFus4^o|Lvaw*wfJ}nc z2|rpOekm~G36Gcsr=A<5jua0ucE+ZJp3E{iu`r^XP{y)0Z+rw`^rAfAKKFfG4%;WS2tc3{L)=dkY7|(2Ae6O;9L# z!(+mobZnYItR*z9A4i=N%dxhz zl2rMNbPcp+3}Ifc)hg-5xTJEx0%E`Kg6ITNv^Tg4$%Be{)3>NxN=Y z06MDlz$hkk#tc%~0PhTYIYNK=))voPGo)@jNlHPd9g!Y+kXYO4q zSr&UdzUqyR&yGf;(eU_q@31$1*_GgtV3c#j4t4sQ7-!`*3HlgCUu~#J(DpteLC>DS zJ4fkFCVo01(D)~h^T|EFgNqeY7;C!%z!HhQGNpkqu27b>Pt*C)SDE z2&pN>1QBnGaBi3Cf6uhjutAwc{y1qvRFAry)Vj&m3F~SHI&)*44p+~Q+}T8kwjFS( zkvidM>g&hfOO|ot&Zc6XBuHJq38;2dJS+`TBD9qz`gXJLx>b9YU~}Ly`OUaV-I-Zk zjQYb1FWk1~v=UdKq|B>N|E=_RdU|#+JU%%*J6TsBPef~bf4lXZ^Yn15)uZ+77pVGY znc`Q;^7W1FnyTD$vzEnEw(E@|&J?o=B)v@oz`krde+ z6p~Smg9O{=e^(a-{&s{LTSM9Ne!L|=XuUjsFd8IHRQCEsENZC%ysye6E7aaaEe`eX zoEk_`UAo!ZJxDSsw^JFpi_!0p?Q{!nuRb~%ogWU5&JTv?_tr=LR`218KdfZ<8vp?R z|IAriZ`(E$e%G%c)S?%_u@mRgrbz^>>n%XLVNHfTe+)xFOUD*hiBv_ZjuGU)?;KK6 z&c`2K6PW${=!;`&B`?-h2q634`x{QqIx-yFunP8j>S`p=en-aaRP;cI>dK^0LK%tkkt0Z=$O+T)iC+LfZXhM!XuQrWB z6#;%_IeuorWejXu$j}HS*(u$tBnp`b33t4<`&fu7CzpU`0V{vz!o=*9vp9z-Rymt< z!|T|j$)l8Lb)_c%qT&&jq*lA!j#tZTYxj6CL?0^;HK2VFKv{o-x5!)Zx`HcU->w7n~XRBqD)Hje>;2Oh@jZ}TWls7sSF&P3_NiF~XT1AW7Qo}0?dyxdEiD(a8qiEC!7zz?kfo0qn z$R*?2aZJdc$q^QT4s$Vq$OE1y0&-*x+1+bgR>+R-2~W8!c!E5hIDv()b<@S=n~&$OtD4a$R8=X~9jtc+ zYIM+HOm(}{+csh2eqnnJVII%#YX1z3rF|+4{veBV0+(NC0Y3vVWS5trXaN;}t)s2% znl5KuRdYE^ay_aX0|wu~{fbkcS-5g?f1h0=rnC%^rC`|PsqIr(-xG?Os0gn!$Zb~2kgg?9&@ME+(4DQKEVvbQ2IIm0 z;Go8QilyD-a)DMyV!9wH3UxSt^ii>$3zW3u0yBJ)K!ud;4Oma5<~BblOgK^qj1>Q- zL{!<-%JX@S3?1$D_lR;)GjlNf?E)ioZ?(i~Ra4{yrm8C^mawb(b(jA(zN2PG9Ix8zpwSVQA^=mY{Q^g%q4z<}i3Nj_Z}-K2Hl)$UnILNN zj_iAS^|T@Zf!ey{@m{sYTIbDUm2@C=cP?@=9aYjo+v!qcD-UDL7KFO&wc1h2Iy___ zfC%l}@=BU%mf&; zJsMqwG0zT5GTDVTAJ5BwD`Lv?3ihfacx#M7D+t+K+a#rMvsTrI{`mMS`&vLQzyZM% zt(r5x!*`u>Y_Y}4{d!U6=Nb;#J*zw^7Y)Wsjm~wC8Au8c#$Mp48&L!+j}`;AP=$wS zX;<2x%6Qtk(>3jX@6oE#i#CyEam$_li-wM&Ns!Vl}6UZc(>bLfokP&D@UlZeqb0Bi&YL ztk7!%L7=Gq6L}kd7MPs$RSCBIcD{RWV9L?h<*u?#%B)?IJPa%451-KsZ1{Jp~ zrD!yAl*1c)ySq!IsOaD=(P7}m@3oO{kKw?zFQHv(*+(~jO_3@80!7Bap45CdCnQ+Y z&U~r-Z9U(#maO;aX?(bQbg;X(`|<_7#c6%KDgEG*PaY!f`DV`ngB^NP()9?K;lJ%Z z27VY!;|IX>qfbN|>eqio)!5YcimFjkxAO)B)9oP!{@{zGhOoXDNv@x5=k-zE`82)X zxGlZo?NM@nR3q>o00030|Lj>?Z`(E$e)q2+6rgAUUlPZ0v&< z*iZb*=c(rp>z?mCpVU3K{xrnEOuaV}P(w%0N@nSQhzCn=dUrjaUEf^azaPy#|Bv2_ zZax3k-ixN5|E{6f@!|P|$pG+As_=K}KSe;oOfbWxAPY(&1>w?51ZYmjA0v~*S2T`S z8`$f~jpr}y>VsP@VlKe*bL)qL-PuY593%w@Bvo?D1JJ}+v}GL2 z9aeM1-9D#=U+>R@=#Wy`^ih`TB_P35*H0>i~37sRJ}K9`ad9l zW7B)!m5hHY8T+4%xBnF~_V)CnWSggb+Ay27L-xw;f5SmLd*${SkiByIOK!guEE-Cq zb7g9_6Y~l4xSONv4IK+|D=Gp)(=^`aV|x*CP`k`Ax^ONDP!<)F`?x+#*&YXXQ~*1P zy5u=aKo~vDBXXrt6`*b^e34Me#D0{23xT1_&|0EQlK5Yq3k=FwmSi~lOVu6ysLhCg zU1e!5Gjf6GGBG@90IlTDri++y2!{2xdB+}&OX(lV9}^o>pzLxXI{`;84CRuIm@6h* z5!uo>gCk-n!C=c}mYdoonFb75PGC??0C|-!#lR+ChFg0oo<(VuWMt?zuS0HsyGdel z+pe_>qq54Ds>Pu?#i6P=EE6E$VF(HY1F{CQ0}!^7Y9HnWBTb7w%$v;efich)?NF-v z&2)<(SZOeo7S&_&h-FE1rwV@t&sAM%NDQEW!0#DHlndDlkzd^G1_bP9}z99{0L z1h?MpHpOUGh;nUreQmo6BdEN83K#!)`!E~?5YjAm#$lh*u2%pb%RRXLmn5QFbVxLfsoE3dpSzh6 zM=nGuL*x?E@TA{m@i;7GhaRC*7cyaTi$s7U0&;h~LXGdK}yIWbHy&C!g9cG~XbB7&5a?0BYsRaG4G^d`C-onM{N z@966IG>X6Pvgn7VMaw9LW@GX3>sk4;XUzbhahZ(b+w~zsb|bQGT6O~8Zp3L;$zU=@ z9tH{h0IWb$zx%xK&~X%UAhPsJl5_zUdtv}TA zS@UbhD(j+4oqEx)BYS=@G9^+Ge5OnPgV9zjhh801{j z>Kr9b2C}5&D*V#CYmF7pP2XqH_j-OV28UME(jO;qi}(YRE08=vDCbJTG2<4zEjm4EK7A&i8t~xybOl zVjqB)IQgn^LNC!nu$#`lb)1~N#K~8V6C?9tGQ)CWe-q1u%M>4jz2@trbPAi>t`MGG zY_|fqXz5`#H;p^=ll~+hb>rv4)2-|?;7PCEW%ss*_K2~ag1oV=URSbi*|2d&UG=QB z1BsW$N%bSyVx`WGwH0o~j#$A16Fha|;=q!BP)occs~uLrG-<_^RC1LYXQdWTYZ(Y1 z=O~@Xe;}52|1oG?tZ?m~QmfZAL>0 zAvX@5?Oc=u!}6A*z>=g-T4~b7H5|=IK^Z2FoRr-bmV+^axyFnHjmt78kMlAYuUr#p zNRN9X&U)(gdeY}$U@=&Zy$1Cm2KBB%r{q~PKV9p7O-+(e$>Id=^dYBn3nz9(&GhiJ z9oK*7??AKxP#H`1-q1fNvNultNZVSgM5=SD{mdn7JwL9YKnwo`w_0`qAp#B+R4iG( zC4b=$DgXfWv6KH|7nh)T0StdCr{ZQRr{ZRHcnbgl1ONa400aO4006{UU2oes7Jb*R z;Hto)1^m$@?Pi*B475!O>|#5!Xfx>UQ$b6V#f?O1Ny?6==zpJcNl}(kJ7Whewl7Jf z%lmomxtHqfFIT_5z4_0-u32u&Vjj)t2fHf^WiI2~+WKNTU9Z=Z_1S-<(#z?|t5>h4 zcO(;&&_%)3@-h}GX5DWQbN`%*3sEHBC)bkEEN>k zLKtRq!5}OXW~`_UTj#>PmP;ko5=v(jO>jsmltaXGZ)rBAcXO78`g4^=q_Ec2QuDGT z4RF&~-6WQ5amyx3ek+iUEE5{uGgB1}xnvk$aar&MWw|1^qM$|S3A=&TtSX9XO_$Dk z0WbpgfR=j!A%D~G4kpHY+zJHKZGFas1_bJRGpK#C?^Ir`gdS6)#4WaEc%`L#J}zTq zOY(6p(^M!xST};)lFkCWqaUW`DjXz?$J<1HY!gW$fYUTTZ9zq7SD9QkXlFuJl^uo| zvjN^p222Jlrl@6CGGB53I|=c~)FP3*@QL?OYHM%sOCnaG+nfWYNpi+Lu)Qo%jv;Ki zX9ldpmm;E8CT|6Yycc}xm%@7iB{^$R6!cR9^+lC9&z?;j0_yp1NC@=+fziWgG>8Do z+ra%>mY^(^DmLT*PZD7aT%cY9lw~II$6~{mAbbHBe*tyN5!DJ%sv6VN4Ck3cXYiq; zgsz<1P!dNEu4XUgf+e(A&1I9!eTz!o^m35^p2Z?Y3hox#l1&nST zlP&AGym-iwQlG_8-e{dmDl*j`_9%vdN%jt&iaTD`g&4JBb!Cif$%>-sph9&qvTO=? zCXgkRf2|gps>{||f;p;M_+BwB(J=#n`qKn^D9=DK4UwCPsMyL9@F~Z+gkNX2{driR^(nGdPB-@Y7@6hK1tkAYsb~} zB;K8Kf8=5y{PY(H{uArdvu;pw6hTSCto)sbmnpFxMWU?jrpNBmHKzkvN}J#&K$-A{ ze=YF}zG#CG%q;^w%w$Hxi;nI zkgRnBu&#Z~WSrvOc{W{qc8+yr0zYxQe{r*?=Gg1N`+B$CZ+w2;r@e%1+CkRbaI91! zMt$b%|smF1YLGQR~y${uHSc>fV$%x zPYS{HVSe{S4|W?*wDjoso?a7byeFTNs@_b`9`^j6IC(!}?{rm;*iAKv!^4p-c_esn zvRMXYt`T-ilC2&T_Y2-s13vV|f7_dZyX5Z%?H79WwKql_BkL8dA!sv4+qf5OFAaXr zbzXyoyhCt|tBU%Lc1a+v1TUJw$m?0|i00S5 zJu|GCUiY`Vu5D@NiII9`CO-f0^6P5xs2O zda+w2d zM!1WbpJr~EN~*Hf(g-)ye}$v$1p@D?WlV3aEk7Uw}js)BucDb+jg_2 zmBc;yfJ?Pbf5Gb4&ta70TrIlh7`e}|XbCW!7E%e(vd zpB)ZFvAuz{9~}6tyZd;pfk52y1)A~SJN!-B2R@K<%ujOt@pLOT-WrAneM9kS>pqCg zL^;3q-zaeB!yo>+7Q+hC=hvoY{>ymmM+$u>x{OtYV)rkhbvz%pSI)t6#X)z@-Cb|% z*lm&HrLLNKOc(Bxf0NUfKb^lkKRX>`^?ADM5PeHWZg%UNk9Iv@$8&bHeYE_SefE*x z?_r-*t$6Vm*So&K)+!K2z^Y%V4KT*rriHq?J$aZL`Z*K+Mgdl$R3aYS5J=Sod-NWKb}X9f&3o;00960 zyjg8;+_(|`u3teY=$#Ghi+Amuot!OPuDL6Wo-f74MGF*#!Iiix))J|blsDVJ|GhIq z>SYtHv-UY>eR$L|L_?@K%xA0uW$v=ml>o|Ea^xWDw z(M2}&s*01zE|FWY* -dJfh`toz!f^^O-iqz6U7r;Ep||AS()!;9Y;8}Y#z{xzdh z$~ZZh4_nSM?)Z3RbX|>Qb`j5J^Ot9*FHeu>)HBl)XM~4_+=-QEHDlR51t1EaTvI+aU z6-+Pp*bSwWb_}6df?Ju$*a5dpx+pb*wwEf^f67Yhgi0m+z7TFLgrc20V^rpyOkK?j ziufU0fPE7F*$8wLHR=Y{oK@OdxsZi)8wPbpg0&TfWtuq+x|m)ocA%F_wD^#a+T6HJC8o!5G8hmq`+8XF;F>Q+ zf9zKf8?kGB4NneRMDQf?LY7>xP8+_0big8vKKF^4u%E$4@qw3B0ZKUg?aft}GOr*b zzoS9(GHKI>KYh-)PrJg!wi2m?dZ*A1%A@T;vKPN;T_orEoMAyweUz}Eh}(h^sgqib zbHOvIR#cpAuwM)avc{TZXdx?ZB|^#|1}u4!eNdnFP7ln$afWz$>mZQE0qSM8FB8f8VPs zp&%PonXsvW>QF06a;r6$m7TDkI8cKJ4^*Y&Qekmf$5jflV9-yd06;Z+P1rT*@Edc3 zpMl3L*yMK(%UuoFv>qN+LYur>{0A_=E+JJ80cP02yUVwS7`2i^XzQwnai(}FC<>gx zJiiV3NG>VRK0A#$sHktuV&l0Ce=QjqocBH*?%%O_Fp_XoKxBW19KHL6&tEv!4=pP>dQrHtP^}eb%Rtw|+GF^8QrZIGNT3e>YJRcI6vN z;3mWeP(R>}V79G%JFB5!poZNha%=ryu!uJQDmM3BJ1h|Gs2sxX5kk1f@yC>Y_qL}+ zecW%goL+$1uG3jNf?xrBw%fuDkZg4lnuC|ewbrvLeT;DI?49aAg;QiLBA}fSwcEB80SR${jRqf`5!ACFHI@~g^sy&t&~Lik=-0?I6=DbN z4c)G*YNS2HoI?e{FNIA!lfl`}@96E1SMOWmY4a9SUjkY)?#AaZf2Mv*>q6I}x8v}3 zzrHmn^7T5`d)$s)^^Z8hOspMWNRyQPw~nki$$X@tPuoJsq0+ z8zNg6u56l%lD7+`f&}n_niv*aQS>-MR-Ej>sR9!chAiZVfH}K?8L(`%k>xOKwo7r) zuxu?|&TwWS&@VVlf1;n5k%=WZmr?afL}KYX07+u)FKb0vWIM(?8cc7z*6HjEQ(b@Y z0h;&=jI#Y1Zqgfwu(p9`Osy2gf}G{?pl@#* zNAW?VWEkv#T_^h7kWiy*T^AWvszesvpfIj&$bO;W1b|aVf90@Jp)rbbAu?nrq3)#7 z3NtiemkRs6z?RiL#xMZzC8W^6^e^v3|LthFl@B_%bz*|^0PHS_ewGGKPOb;UTmW=w zUr$Jt(JRBl@gP4Ydg#DD=3}4!F(7XI1lo9%s;@^Um#rC)hWEavu!eTf%rVi-FEFP< zCxdWO1OxYXf3-Q7o0z+B&I6=Z!Xfr<0yo6TU;G1aqsR!q&=q7+ z0Ei7#Cd>62pFqjM0jM<#AdMwv1>h7{g{lfe#Gujqhm~v(-x!y{Rf`|&t*9#Dn&Hil z)V>m|h-f2UVmZIVNbl3$C3HV%)Ehr6sV$}r?6>fIfB$7|*r@ybiX$400D?lY<{OIv z^9R4p-V;b`qHF7Gt7!mM-al0(%~BWgNnP7w6DYRrh7GdU+IJzqNMXPYdjWQ?Q-8G@ttDO~Mv_$+z3rOTDX&%O!vwNAnV?2CZYu zg0FDE!ggsyHhMy$@R}!#t!ZuWY#Ob#xy1l>tF-Fw7rMjBR+hkuuK#b{DZn{M`*)9y zGF1;y2woaBEjZXhWYAu9cs7VA4xbD~Az;>Le@uI9zw0^lMecYVoI%+g8E3GXg|u6L z5@GuTAbkJ;`x^WyjqPD{5ZJbR@!V#^EZUwSA!n4S2aUsX6daHRp)2-xeQ-Ju7qQau z_O0xyVzshx3{L3;5+?_gx5L>tEBE~~|LJ0DZrtx)`Q_>CWPW_|-Rx{U+i^MnpwK){ zfBv=ek4zq*&vT*Q1JC14{P$CWvFnn3GI+@z(1b^iuQWpA#j77BK=lHK$j^>Fy4S;f z0|_KGYUb|Gh$o}5WxD{PXDt8(CZ0%c(6;^Za6CUdoqcz5_UdR5l>Y|+0RR8wnZb_R zAP|Pn-KU5+RISvg0kVnR?xKBZcB;y`1ILoIf^HL-?SHLZ$ZC^*o2;IBDU{) z_cappu(@5KcVkP$byRkck*|IUMxBXhjgn3^PM$6*919GO5%D1uWGxZusxQ-Y}l>`$e&au|u< zG1L2Jv5ZKc)&sD*(m6AnUfnXQ>ubxXb~0TvjOQs?=@BTc^PnzWs>+AZb7c$>@A7=( zXEwaV^LT+LHi+c8yosbO%%AiEe_>I1aDimx3KfvLozfA~+`|!Sj3dxp9+p69{+{49 zrsuq$;Wb@>vSMt3@}+$tng#Jvoza($SHA%1e62CLR+Z0Jx(9MVo9TyYS7a=WZC&9g zXlHg$$Q}!T>=6ao_#WmykgdvrY<)M#g5^3R5y9CC!&!>z^gN|XCoS6ne~ECFqwJOW z=SX6)eIFbJ?P=VbPCb{2b4>OqaSO5t%_PS2a2>YK-*vo3L_5nfS?R}O+=m_h`=cN1 zp%94VnJG_qQ=e1mZpu(CvUj55-4r_0l&-looa?nMtU|eLori(&UH%5*H6jwfUbk)G zv>4;y(C@fq+ZL!=XB4J$f7UMng0mGW-QvFois3AW&IpIG@jd5K6_qY7w$+8BpzYgw z-OOJA00960#93W$+c*||*RLQnz#s+eIA4>dom7}kXMruSGg#~dn1`YWXo&uI)S0~f+AL8W8^~}_~e@d?DH%kj{%$vB5 zlgYN{t2l|+*w6NZSjH`%F12dvsm$KQ=Vw}|qIr3ns#*%Or-BFQ z@iI<6jOoFDTFUA4uJ{r4ahUmO&Jkra4r*Tq5Uc0Q_MavYw|Qk4n( zsWpDr$y>u@Q8dPCZbdd>HW$pU6w4&SX_W>5FfEMC1XC5BE*3(I%CZWlmzZWH60URMjbY_!OjRZKTd#CFBssS>_g z2aU<&b8f_h;dt7m#X@O(l$ErS7xI6?sTnos)(TdMe@~WKS^9I#+E`K2eq*_&ute9K<&gR&E-M6sAAibiS$yYS&rafGs}+9f zYq#j=MHhIU(8+Lo0Z+iub7k`oPB>=Mrl{3rp;hTZ6#W0bVmv6S7Hq2mzd8ki7h4hH zUg)*^Kx*(6g$4(Z-D#s;peZe^glcLLK}`m)7Kl81e@`L9Ch>`vbpijA!@Zm9LZ+0! zn+CafEt)E&(+oCq8zDtx-4s~d#SAw4baQgx8k`~8^zugvNl_1aQhNDhjNXwQbS@j5 zyMr^F*ty90Jp`h-Dk~`>YnZa+I)fU9q^&5|TpZj6Ux-}|Q04^d*jR?B`soBw^=5w1 z6SIpMe{G$*XgXaZJJiX=%6rl0c^`|fP3YOlP+^Mm*EwM0ylAELT`=zNP_=_&d}SQ7 z-_*cnr#MsE`IpK^SPJq0*Ya~lnC=z=-_fU1kpZ&eu7L@6)-)G91AsWX&>8;S_`Y1B z?55E4u4Ne4GQ85#J)f2_U{dmFE;Hogo7n0Ge`a0Jq?18j!JlDQu>h?&`Q6K8{|++S zMiX7n@^k#I{fb?jHeWkfY7w0+R8goEeF`po?Gv9m*YLEG-w9|S9OB0et*kOsh@d4Z ze!x@G5cQEh`Ff1qIN$Epl21>su3lYTp1r!9o{rF(r#9`|#$Chd>&{^~sGalUFF*hK zf4jp};L8v?(p<^Zfp2Jy9(8$Ph4x!JB&Gr@6bBgUYygBFm?JvP?W(Z)zU{Z%v=KBu zY^q4E3z^(_kad{pu%9|33WEA_tE7A0_o2*ppP)~%Ln=jqzL3EXN`n8>Hwin?p(Qt+ zXv0X@q{@Wy~lmYA>e`IS<`~n{}1uT2-nsn;pafihnEY$jI#?w7c)mvDOtCeKz}TGXB%hS`OXh{SMXB}8UGLx{~X7oe8=fYN6@ zi{)u9LEAD)@W!<19X-K3NQqkAue?G6mdv~Kk z%%V2mJcK&@>5}O|;dS(ZWeV~k**~J3XgPRfq;1@4oZ@^>rT;B5VRkl*{39`^oE#t% z%emQTB3&_fES4x(?+XXt!4+X^2TgAOM+v1`^ zo}%TN2B^IBS8kIlZ9$Yfe|#H(HuxnKw*;ZyJ+srto%wJ*)zt>((JSNYr2~to?`o8J zY{5ZhHKPf^0}yt{n+{_XndkAn?~Kvrm1gL{E{S?t(%^~+^lDuNlbX^+0g6zWRU5#! z;+2D4!mFUfR&VejWN%$DZ&ysBhv@1c6=(okOOM3d8*gNZuBSQ12DHxN4R8foZ8S~!q&mWm3Ti>IfWsn?$sFxhTT`hrC`)A$x$h>v@tBGX# z{nGyU*f@TyLhwyA7} zpT48{4gSwBIssf)ZjSPY|L1y^Ur;0ZgJ}KWhU6OEqM;k&u)p>FpE}*d^-*Gud@yia z(G9ZgAAXuRpl3Z@1f?y+144lYXTZT$RY%nV!wKw;7J%Q}e-oK=cPnFC-cIeu&E_|5 z7QRQP=whI@#6ds~{f!TuX*TpxoxJzWx*aMFc+3K~J>z-HljFyOZer2!CYI`TZDq=! zLoqV1|17jtdh*%ijrH#O?9aY6O+9hv-_ne0@}WWycrp3#@#B{-Us{Q9m|{y|9gmLa z>np7BQ;#`Nf30_dGrXa}f75^6K*KW{4lF@bz(%$!IGrnyXs?Ljrs(L1>2?M>xphCd zK{r`UwXAI*Or6_fH#khSKuWa@J9fVGbH%g4>uLLXx0&MhJ>PDg_|C~=H$%=rv&1tu zOWa}PJ@mm-ca7oNqu)4Pu;1z>-3B+((JwRICElUKfAH(4!SKz|*O0$-0c<&MM-h?S z<}UyM0RR8gS#56{HxmB7zk*PKYXYn#*ol)~P7&Zkk!#UQP^4-5At(%Lmy!r`$t}sX ztSj>0J2NDASMjbT87;0g3`1V=W#*aJXSO!l3HNF~s~7V|E#^ut=7lK*D-?I`^+akV zwU{h^f8*X%vdEda`81#5iUpG^<~M?^8eMp4G!u8CXuNRDHANwuTQy4U<}*BU{Me-`kbpXDbS0e@lGMJu3iWFFhdBKk<#RtP~#A%9#^_ z4N4ady4IbL(}w}Qvg`j!=X)A)rr-hUGi-tH#4i7dt46fg`=(aHO&K9fI7+?Vhd8_C zN|vu$Wa|<0`duw@_5uE;({r}n2s@%KE=*EX4M@EdOh`b@CVQY8y5Y@EB(?KwZ~-6* ze>a!cy@d>{Ft~Qf*9ma;wOH{+kp~>OcuMY8FWwn13lYuVSPQU$+Z-tr-lL6&D5`4; z4lu%ql%;gVwb5#KU6@)57f;B@$6S);D)<~h2ml{aVic1BQ8(cH(Lnzb*5Fp7lmD|? z*z5+}E0~<4FCHOD2R$pehAVEt>=@!pf9Wl^JEogz89XA!Sq2v|xG1f~bQ!`-|*Xs!bS+r9i&+Caclf~TCfK^<&oh;aVe}+%? zpX=3Ru^RfKp0JX8ezvxzsn2Bjdh-0`i{~#cFE5{;pPf$@Pad=B>CmPz(dx>q3Y zuaP|&gP%c_CW|+x+yhX(K4m>Y*65Sh1;b%~_VzQ{TaFUOl{b~%5t(9J! ztlhK6K=K@l$d9e_|yki}OF~po_<7_~|iN4tmN1BLBs_;qo!w@ZxXg z4bL8<;pyIR`4{pAsQ2Z`3cP%bGko=bb%uupJKcsa$8&%7kfm-W3!z64f7tqetlg;} z;l#>L*8QI&<{vBWhYlMHhG}{p8ZGFvu*t%f4;f&m0CbPOu{v~m#G(dUf3}amft%&$ z`Lj>I^yw>gx`P|YE8AW_Hp9d1V2@j{Z_HNQ3Y#A(&c&yk4M^sqR=_J{kK<;YBnKH$ z?2reSy^UTIsU#5*>f<%aj${}(uVy81Oj%GH9hn^w>eR05_E8r3^4DoYORfVkNKL$B zTi_wxNqA9UtGXm^Kti|Ne|e0s5~B)aDrfIt1+wX*xNBNGNWE!50FPZbA@k&Ejn-2q$wg(F;s#Gc-h+z(uX;yVg@^3@ z)!XoFZx9mY3geL4I44mQ*b00m{lB@_4Z z;R+lB0dGbwirf3VeK@v0{?djPMLxF>`fGth4pa}UC2cTK97eTlu(b$RS+U_3(uJ^K zYFUH8qVP1zeF*ofKZ_aV%64V6li z!I_m=10Pp{vRVjxK(hg0_cje+b4)l}Uj6ye%rKg>HkzZ0MmY~ok3Ql_Po8$Z_-(kL zjQehJHW#LkqRarZ0$M9CQXa^eq_dR?VP^t{_^%=%8P12=f1yU-f(H_Qhh2Xh0}fX< zRUOPnnWN3SX&Rf&IonvVg1(80!Srt9EA<6#yAB0mc0L(4SlIBYxAX~!jD~pH7HhsZ zC71W6WA|Nv21ZWoJ9Y@+XvLV22}H_Aoa_x&2X};3kPsl>peNJFyH}(+Z9Kz`ZOGs# zxT%E8Krskle^D8W(`1}(4PRY^Iqf@T35hAF$!8R-*&5_ceh3xhtud&h)| znOnF0Q5<1YGFnLiN20{T#b95IZfxk|L^0H&#z7wge{P`-2mqZTBa!w-hM(Q`*-;Mu zgOif5skq|A9jzgYO+`?416NmS zmxl_Ae~#78WFezQ{qf>s-gV#`j={te5@yIJvx|o_&;Ht8&dIwj2w{;G)FKH>F)dK& zhfWCAptk#slHhJf=@PD3Yb=1&B!!L+-w{A+r){{X;#$^?q7)CFf_tf_J2P9jAC`ckvhnAMvd znJ~7KX*<-aIvZKYe;(|h&qK+kqu2v8loj${CAXuJ1ZQ}#1<9DL6p6yDv7itWa@ z9+$u}Z?FW?v5?psEq`sO^`y5A)V2-_z9+~4J%U5Az!MhPy*H4E$Bi~y>hj>`W3Z(T ze!0)j!e(T?N2eWU77%y5CrJ zDIk;)6teeDH8?3%Xna5BLL*X}7&5&#ti8tT0AZ$gRN!~5Z)G1^;7M<|Q3-6*iRK^z zA^Uf-E{VUjmOR=*KiUx3COT))EGjE1N9e|>#RN12-e+4~_ zN2$zc0!(N_NfySVGKtIN>zo2zmWpc4q=48OLCT5NcRmxG3F;>e3=_FL$r*WW#>~9)(#vSh z1T(#C&uY7qT*?4`E`wF@esXY2&cBufvGe^%D`$3v|;+hv=NxiS^wvcxcv! z@X^@yxJJ=jD(aOIiA*^K`~@pnSwsxgGeangOpH-%S{Yi$1JDXBD(&9BN`Dl!q=huZ z2CYqe&BK}&1#MkvU|*HN@2~+74a~sQ0wPUHG^5Hx%z`js@Z*5dvza1=f0ID>ce|{> zkbsiY3d6auiC1(+RE7bQUS6SO)*4CYs4LWmb7#a^659`c-$ngrN3H?f8(F-x4(O7m z43q3~0yY{bENf>qNjPuz)1VD<%b<3|GX!%M!hN3sI0GoGBXja>!;0Z{xWsM66v|v_ z<55mA0VW&_x?R{Z#sVM}e>b|-UQ2epYY6|LN^B@Sn=Dl{8PXI5Ltu`|yYmY{H6xE0 z#&R4k=ceHQ)O$IZJvt!w)la_E5&!J;_e_Kn$ zh)J;P`NB`&UjAgtMpF0H|)+wQE!)%qB* z4GiIJ*{#YR>nWMFZU293S)_hamuyeKKI~L_?k9C%>Vn=cLs!u_x{Yop*ONb`_YMOT z*7t)KT@DmU#&r6a%97d6_0HtSJ>-R-e7-ow?iMI|3$2H@f5fz>!jBlR$w1;wzrTc6Y2}#x=;pxxK#(Zw3OeJ|d3NK5U2X4AuuT zy&Y=M?&@-^WDT_YVSYVF{BZd994598io;9o4HL*Wdv&wJLp^;oL-=MUX~uJK2mLeQ z6%Nhyh*IBqf7c_5yWbG+%l#*`Emv+nu~$inxNb@b@IQ106g#%G7pIL1+YQ|f&U@uD z`b1X&a(ehH=aSp=i}CsR=JM)ta4ylN%JcVW5gi8m&n4T7_SERMucy1T=y|raPi3}B zym(}9aEbQ|P)h>@6aWAK2mlpSELrpx$4%5d006F#li_9;m;Ryw3m3VgrH|Yr0|>wt|r;i;G06mrA1n9Dn$`m%qF?|NZqT$!%H0y)k}} z>#~q$LUU`Y<0zWVX5nlYDm{(*qtPh3Mj47i#|4wq3FVTK<+mPjKhDH4uj-36J0h(z zXKApvcND40&=?fPIcI6?G{+^kj3hbJhT93PZ5BMGBx)C}umz7_achN~k~fxV%Tp4N zQgS00xqsRZ2g7hMjvBce1|=)`gig8SnpveONtCo)f``-VmntDwd*N_D?5{i(LS7O( zuRzQ4Ya1oTP@;J;p~lV&ZgS4;BG+8=Y(i6EY=j91Tq7F6;Pl;_^LMAehE8{3*d$t1 zmKdGfRC)3I==slQZ{LM~10v(75rT3!XP?J`mVd%Ffj~&eiBy_HN+}OZu1h9T^3iz% z2UWr5$3!a0PvFs~9vDZPaSw5i7Ql}$R5~X~!3@-W%`|nASff4>>2eVse^!P@D$4s1 zb`_6V3k!8x(?<5aX=E`+2EQOz#pk&&#PGxlC5ez$tF%tIA!AHv5tEQm5l-VXSLtzt zYkx7B37Zop3BP7#1wf_DvI}N-NSx8dV_|v_3)fsGKo=p2%{j?bQK%Uv(E2t{$SemT zx4Kd#rAkF6K+&q6D2m!x;1DNQObb;TfL={CE0IyKQYY55-j^vYbL7r++n3+SbOFchIj)pmXwIAxpie4Q)dgEZx^xI1fPa0f z6e0Tgz%kjhE`w&~1ewwSXaeBe5JjoZN6D*^R_@*4qkZGRdi<)v!|=44a`t9KxwnH$SX;&7>}uy>C20Dh@y z4Nap}xkmb&7X{LSnYN+YMuABfuQ@B(C9f;e3}s3nDrunNFi@oegl=Mjv$dAuy3KiQ z4P+lr?a8L48I8%N=V%Vx`lx`HpvzR*qU9F=w6?Fx<442M$>R^TvL}%(tA8k~<>kEj z+bwn2>uq{2Y1~xICy0u=MhvDf39A6R?qKh5czAR;8Xg6G8h_v6>G|oivt8`{;9b=c zhlcV-7TOp`wU1hv(Re=`bz$BKx@!<0N1*iE{$})Wcy5SH(6}ou;$PQ6M_my&cA>QO z1snGsA04jYu=7_3G_Q8ar+Q!3~(-eS+~6}yDnJ>orc@J_1~)cyIi!~ZJjl*=N?S8o)d z?(@w9Uj6rcooJpYoqBJvDoN^U?rOPNV1R?e&X+x%IQRy53GrpVUP@m2(xLlR#!Wta zO*#y|bvg_Wh7W=cFis|uj!I8<7?E$>e=&T6?z(er*YVZ(@9XD(0RRC1|J+#LZ`(Ey ze%D_?s6d+nmYvv5+Io(#ZplL*G7M`6mmjGCKYs`P{pw4TR1wC#ru9~1(E z7JmppD{8Gkt5OIiyyrZfdNuRZ4s8lvE#(VA5t5V|8qJj~i-@Ji;o<(#=;-Cq>(R^T zU=+q5cJK)X_p6YZ)QwfT)AUDQ*tL;G(L65yE7)JOz<#HeH=+u1X8P(TL2(;n(_&qQ@c=)NXHXp7-hQm%B zGJ32I+0F2G2Ib!%7J#4FAZ_P`?)%8l_b`#OFh1}-m>ETdrio!vc;A~6ndi)y)_=>B z*UjBVzwdpenM(CD{nrO16y$|p$uLpKDqc@xxaPL&OOfFhD<_9zY z6TTXsODG#p`xvj+yN*urB3jhzHP?MO;s=e|j%(7xwcz*g;es;btu&L$S4El(yp%+; z<35em8$aAW*y#>A>~e>c>la{y1b=hGk3!+Ih~ElgGNuV!(Y)Z$!(TvVl5@FWVovJf z5~_d{pb-BYQbeGLCnb+3oW&E!<97xMa)8VDoxDc_r;1b5)=O<5CuqKAelk-scP{?^ zg#0bv~F0yLu}Wr{p&e)0LNPOL{38GlPM!bHjv zYCz++dMRDKX(dKtKoV2JNCJy=e=@MCY^F1;(|JP#EC^tnOHv(PZ9Yse!zgF}Vop-H zj2v4K+c{*qBydT2NeyBcOeo0|%y7nB7X7QtDNO1cvjf>P~Jf#{eG;HA>dWC#1Zb9X{}Te;qj{)hSlh)K6BO$v=zB)5yS)!FWREGvzX57V0f=uI@vwvxkoK;fFTz)??>0Zp+E$Zg~%tta0~XYvwMgqd78K@?@H ze<|kHqdY_wV>HTGnty^g4vi`??a6>S%b2PC*yK$ES0;>4D^E3jBEe=ud=~MW=2kj$ zFxL2OOd3L<=2SSspvb30gK?nOUuUgt9=XP2+8 z0U$Gazqw!L_%Ckf6UV43y52eqp)ejQs5@9F^Z~Z0IDBJd?*ezR92a^Pau-6cnm}~= z9{`sDuK^T)ieo2^Q%6A7wZ(w77`9+9MQ6~`vBgCqRg%hOMgRK_Ny&CHNwK_WKntXC zNS^!0%lQnU9?blN1vC7)ia`RQ_@iS9KqMqoGr?8NGDQ}kZvi;YfdT?tGtEGq&qQK{ zFG&O$l{&>4!W2mp0Av=52uPSvr7k?i6UM;{oS2;X zW-@r-!p70djY4uOR!`bv zd~Vhj2746-eUnG`DaTLoh_L9wi(tt(LENB?Z+&NfM0m14}+We%o_Bm z{iQN2cp<3aPJ6*mg#+aG(gDOoMBX?DX12#o@{dgd#;N_k&n}CPftny{j03Y6YzYP}b;DB#F2+?ymEN zW75vS9YsLkdaCJyDmb6{Suo2a1P_d+^cwPvfJ`V>gJ?;)!ivL%#|7qVJ42Zl^otBU z80XXrT=-S9nP*+-ucXMczCp_H~Zs!B*HFDUU`tu#2S8o%`d(%OlC zV=wsH;KZDZmM&OGKKfT@z~G=m^@=7`-gjvL?mE<-#e#R49w|gxTi<5LeA@@?2Q{$_ z>SAd#-ogGHHSABkm2~HObKI~uSxr1UBcuJEZ1%K0Bu3vKBu*M2Q9Lp_N5yFaDxT*+ zt<`QHRQovG9vmmn2#)^?9g_xhtRKvO9i!u{`9ALs9Q7w+v$yS`G5P+^jcEfi${wd< zU<{8sMn)4b=5^QA6Arfr$MpLH$FQjpSa+md!{doYpu2;^gg4*o)iK=fCA!N~)U}@2 zHJX+&GnC6#msxh9iro?HFBAO8Ea9^5HwWZrUfth*KtVM2@xmzC_{CIz&-|gx1XbI_1h<(`0FP5V4`Z5*i$uG{X037=v>(0T zH>bqpLs|E8MXszxJ2WsUb@}kO6Osk*ge;ke!!17zNm2Iq%B0qnBO(y#3`>=uOT=())Nx^DaH<4b#Fk4iQ0_SgY}B-f+u@*K1<}q*(sW1q@A2yH zc)nkqrGF86R}WdW7?Q+)aCac7^&3w>Dz(~W+nT&uDv&1Z?*btTv651gtzIqv`o^(; z>)ros^j(OD{tsp)>AUTNWt8OQi_!G;OS4~J`$@!9=&Mi~Q2Q>NLE(>EVpq3$D{wDx zp!;vP^z`WL_;fNlola^gL$vhc+shC8=&QU6>zs3sfgF=8DqERJJt|R(4iR$u?I>8yS$&3;wK0&HH`g zsl?SPBRN-);6Z5a8m!^))oJo+yPYVmDW1?(|w9_+DXbP8kNlzUOXvC zDxw@;cIC6*+|HTE%rOq;p#(Qf71@5X=IzqjEVZ;BDgysuHH@AP<0RR8gSzB-0HW+>PuOL{g zO@PXZZ?WAudRh8VU@Zo;0|pd@!AO+Fg(5YQYGMrg@B64rnhYXcX;~H(c1o5-z>*8RoUP}Rv(;)j52iRe*@U_vBHGv^iaF8x0&5(-{G*iS$5`fYdOyw- zuTONXE-*@eh{wfg_oisvb^ZoNqfyrdk>ZF6W_m|3b0m3aQ)k!^9&)4;yxeuy$EJkf z)tOa{qg+tUh{Ng|S1n>iiJ@CVt~l+T-rUuA=se8}F89=7Gx7-As#5UJ)mCIhUL4$9IyPU z(WJiQ_P=9%6IKZ!reZ?;A}EY=n^Pc#aRvKck&xGXp3Qd$SkwvN;ivfoN5Tks%JBi9 z&|ief0Vhp&Gm{q)UH$baz3L_$l$?+V@8`?iigk~(7IP05qpYK_7obE4Glh?YvRVjp zh4=f*g=O}6EaFkwS^4_FCq zhV=P!p}7RekQN2TKFHsgU1SMj!MH>Me`ehuh1|mb8V2IoStgvYfYi`Peb-4uq1eL1 zPrv2a^o~Xq*nF=oiEl|ysgj%E0Q1+NL~Jc--W~{!suG-E?U=YkdGos_rU$^<;X(Qm zrPJ1%JuK=+(HLO-%X^GcitP9ff>^9}!Vq1C)gM$!TJaDx2laPRF*Gys>M&%8sg^1{maw{35r3&(@DWf~X=zog zzDF^=D{0T-z`eBoYPbM~)o!A{6o+jyr0+nS1To2_esU8*BOO|4 zPB{phJH{!G(HAALI6hjH3$<9OUpsS@;Kvna%&?0QX@5$=VqbSI&08*btczZwJiO%!Q_i}ccXiv?e!XP$Kh z34mPsH||q7_ck0wEL4HvRV9gXYdahQeO!ZKuY-mGI~^2G#wv7=*s#jM_KMzv!1`s3 z)6rO{`v;4jhRjY1_NE&_u=K1;&V!a*5J!KNrox86W{XBIWEjAyIE(rAg|NN(Yu|8( z>&MTQsZSWk14V_-D9$HX26it4M&rV@ zQ{iv`aK&+fdd56|{BhI^n$`Q=t>fNB_gp;%M8E}^&z9(_2X-9U;di~vVE`5j{X6w`^wNeCLts#42f{4X@iK@S_3Hv8zifqcR~ zc)3OZsEXfcbirtK@BG4uq7JQAn2i``Q;A~DLM7{Q}op{?dVSwy>31!W%BMd^rxzZA#t<(noZ<1#Hq%3 z_bjwLgz)Jr;(t!yfQF(x2?vtTbj`n~LYP8QB#B&w6!Q*XJwR(q z3uaVsN&l?-^)TsYeblTzK3G=qaWL`GAg6K>5K1&R^Ir5cIc84~g%!xyr5lK8{dmK9 zy)X)nHR$iO3UP}>p%J-}KV^&CwPxTcUJ%?%kxl*+C_1V87I89xqk0ALohgGmoViE| zlX*K;UQNcLqaS}@>E6vvW{wI8D*&ab{abQchMcl<0Iv@zvPCeTWUFc!Ct&-yb2XLk zCZnF=V;l>EmXLDHD;1&wH5jh-6yZKydzw;o5Ufi%!b^|y9bUrtCb}9~Pk8p~tmaV{ zW08MJ_C#FeRxoje=1gsbPHK*pZe~G0(9{qc7FE99NNP)?B#`?esE@Q{|5Zcm>p`&WZ&#|Zkg ztG8H(Vi~wzi7Q3#H5Vccy-mZc3fog&Y*^j>(a|AGJk}&9%64G9-j$t~jq@s_h2whe z)tP=Yb0qwC61Kqj10Rb)8X%o{+}@E<1~b`m$4%;abrN^QiAdLnM?G_rO-7LlIdbPS zq?PW@b-dBo+$*sD1ldJ>}dQvFiq;?V>aLlRT2oOL%a8@hRAFiyOO( zJ}@|}U_Tj0qgTgBxkwp*|5@kYAyc()N|PjbQLZ8ibGc_HZ-VQK6JWTPaWk}Taxuh5yy9(=_@Z-Mi3N=Sk{UWJO%%k(T@76I`xDo==&S)rPioE>dQ#8+ z)#k8#yEP3qMdEHTGuER}`>KlQ7=eMK(x3Mkhd;_ZBRCPE*;HHt7P~0uO~^h4PE{kO zg|?rexkoL7#W{um0&tUX3@82@7ak^d$!QiU%GA6+)(1U}GR&PQ=R%EzF8;Bi{6upZ zu`63bA1taAC&gH|a>*quH6?Ba53C}wi-c3EPYcTXNs}1PB+z6W<{^$p2b)`Z_s>J1 z=3wL!Bc=968!w`V+9Sk;0c^R*aDsMZBEQFy!1><4WD7?!SOAx*`0y@FF&iY#Ahl}H zt-NRxGDFafPNm~P6f;?xbx~GPYI`Lyb?PrfdOfL?KHn=@gR`;PCEj51f$GE#ubiuT zfdLWo&f6XOXWza)-E1?P6s9|SbWMmM84SuZ=ZtWmlOR&cy8UqZkyVe!#m7pGBJl8N zfs{sAWr;u=4uEqWk#c%8N=0TxdMNknV4nsx@D&%f9`%B|&Tup^k9ScpMQ!GHV zcUQ`_P);?wBHZ7(I@XO;=a)03B&_r%y=9xuU%@CN?{)v}-h7i>M|$(ocy&}JgY$uu z<4HYkGAA(ONYc*g#jMPnOkDlUsNjGtLP-{k#U#GP@#@w@>gnK@8A;Z8_$?pYg zDOL^*cM64M#M{&M#Ezi=y5ciA9bt%;RI2$j__HhQbrj9t zgPIY0*d2lYk$L>b*Zv@UNLh_!-3WVD|0cUIS9@J()0UNjm7Z zujkFU_{-dUQ%|+~-sH6XO-BY^e)C~}D{lY_DzIc}UH~N7xKU3+hJhD9K7oFAR(2#r ziO_=!_L=|DEULbwj(zx>?0JmP0*Sx}o8-|w;TU?o@MyPFeGvS=DgP7Mf;qys)cMFu zs8%ckq)&t${(!blAoih4Q?GPVbfJMelbloz?q4E_j>TM$79DqoLzL;(*f{j}S)BlZ z=aS>54e6{JsE{t-2MKsD1wy9AhX2+ctMioB?3XMpIU!C8JM5e zcD>y4nVlDT(!Z`vj%do@jx_DtsZzMn3b&wkb4p=m9(?owod%!Aa*>)$OcSz)rC5{` zUKB~I-LP;o3bbNQ5grluW=oROE+~#!!OsFg;Bf@u4)QXKq(qla0^;8|TL*mkp&cpL z754&}WCOw3Wrt<1Peap`GKWU-7Q^-I?#)dVsK9O-nMM7n{)gP#SZ2F3y7&l5>xnKx z>chIM&4FQLvVkJj@eepBrM1X)U7TMn5<585uA);VcKhlVh&!mXeaK`R?Wy*ga?iKM zTtTV${fE#$Q>n1Hr7&zQdntfq`N{{mgX`N36F*X=0c`kD zT^I*u2xNn#blaW^X4jEr)C6%mrI2+s;+McQDng%3A+VarchH$k0z^E zuPFySp<%fA0_bUY<$vMT8b4SRW#V6JGx`!qjmUHFdpbry7k~7h`3hjw&;zN2?n8P8 zQFQ&X5tcs?Ino53_&P6Avt_?@UW@(F{8q7o?P+heMc!q4YNE+g zmb(M>?Ymb>?2e+?YP|L#JWLsOMYx)7-&3+0CF?ywnsegx%sK&&)db6KbZ{{zZDl))uXx_c>T_X}&!hAEM1m;gp>jM>M!Vf-Ms0CuRjW*_Xzf! z5*|XsX>j-{lDToix3Ymx;B7Cln5-l~=gUvAzAB`VUuT_CyUtL~L3g0fwsXa5bM&m@ z`*D>)lpp>J-XOOmKW8JW{dLveTf?5FG(O;2A(U&h7YzmoNHk!dc(UZ}KOHn6-Id)X znLW~EJf8D~`HI#5)q8a0@f%Bajrhb(vqD4GXAL~gtU*e(*}Y=pZc20%sT1KGYGeGM z6-Km9NMzDVc8*xXyj=Ch3l?iQP-~F7YnJ*M{_2?DFXOQtrJ8tG7-{XUXN$>H(ORs|T1AE_MHWF}Zp%ob*VKyGLf=3s0Cip<^AKJf8T z5yt&SfKMaXhXnFrc8>E$Q14Sj!oi~NrT{bPqW`m85^m z{|2_&!Mh2N$_;M%XA{2{tnwG zumxFYsYudgAm~*nfSr-T>9KD_^rin4``a}?g##rKXoB;%_Z6iLi0)z9>It~`>t7ts z{w*=*8dT}MkaFF@FE}>QIVqYR`(_MA?ni0vD7N2s(N1Uds zl;??`oz6%OldLyTFba!_#WmjGRw0BobG&eI|IKz>Lhu@%wr!-z*x;+y_0_w^+J%)5 zJ+*LxyZ3KPp}-cWCOQ8jylr)au~5xO^VTqBOBAr5cOU)ue*+T-i{pO2}=1v^!AbO9A6dH~*)!-f$mPDzNQ4i2vh+9X}u zjRx9LjujOsH=&a?p?DN(7~8DOEve;F2lP$M{rbK5nw8sSz$#DCcP_w#}ytk6bn9s`8p zGC-tTFBe+NA=y?bjK2qwQbQFa3ADG}*!Ot|;(L(y<+-ww9htLD$}yKJSKeflGcIx) zUi2EPTno)ypD3wM<4|hRj+aXa(dXL?>m`qR4&S99t?6VFlBE&(iCNaI;(P1{sVuok zl_az}8|!G)#1y8ON3_H{wGG=8^9WhO5)f`CuU(8`l~XK$KN;^o5=NEXi&XaH4zYi` zQDYeVL5DlJ=CC%aNDP}TNN>w?FH2732MnXS#xr91lE>~uoHOy|e+)M~G zs*P|al?)!Lys$bUq=|Ncuro9Hn94@Js4Qx+WcygkqLPfOAeoqV2DS?Ghj5Ul8gRss z9mZ1lSCmE#)h1*9QSK|gv`|^BNUMhuL!#6UgE>*T=pfe^L-(_3;~+>hk{U2*R~xb3 zvF3?}*hKAPUQCu}0&gMAm5MmWQ-fQ_Vp}J zY=+L3{pPcBuWxpYDpa$sbZZGV3t;R2hSb@#^wVqcZfm<*Vb#5u&d(<5os09;Yl$Q3 zRBg9eNJAR_nt%u8SXxRG!DsNGz`ZS9tE00G6hqQYW13_SuYL7qjI8P;o`=e(VGdsX zddHq$vL&dtBj(UU1*th6vGHno8oC!l+H|wSwZj}>0I%+}?EEFlQH2wN18`?3rd`Qc z#SwC1X+KTJ`Q36XXi-?*TD8ur_YIab%eFSA;NmXYWyf{pW7 z?Xq2Tp}y?5YP>^Yxn-|aUdNKE_1Wk*ay+I=6YQE+?4^n5Q{rIiXL-)clP-K{l= z7XM<+gcF~2IFohwFqWtNeETvW`iU(H3bg(;J+Z76eH-~F+<54ls_?~?H8QwOQ zJTqvB^(L^w!}1XEy)`QrOpk>p|G7(rh1X`l>M&CJQ$#6DSsi*UP8!Y&dIZP{@?gaZ zhQ}Q0xX<*r^7KVI`baE6a zmn239B-p(uV?@3IFk+JClHU`6FMQRS_mx8$)B=oYdJrs}xkO&~YX!JZRnAO8@3Q0+ zb^oS^{!UY_4m0y_?z{BWO+isDDbcHP-UKbl1##4kCBv(f>2vRVj9n)8>;;n z^*n15-%rS{<7AXa4Z&OT$gSvrpcr!_f7#|Dffj*;V9Tp^p6x2{@8f!NEKUEy5XgSy zNPNOnPyg9z<%7et?wso+T7lY}Pt%Kho~bO&ZJ%5ld?zG#(^CBV#&wef_bHJuD(Nj)fAOIW(8f*q*B!N)TOP?JznWV%zgtNc|e z8w#gFp*d9`rT^aIOrE+@jQ^AWHikShg)8C?l)Vb@)kFj}+IFc>p0B|k2B_iBhK%hO z>*Sr!16BY2h!eJ*#UU|b%r6Sm>2`k{F3KxZAsel096d+-9kzp7l`3beNGoj@SH6X= zx2XSFQ#Mu40u2Ud5N9tVLiU;;zxsp_78iSh?${4H@yc_=Zc9`rQwi6{eUwcqV;im= z7dZlW{EWGOMIK(dFg%w=g6n5Ymm%K91qj$G?Qwo(MbM)Q{ClXiwV00n1Lo&0U+uh~ z!&=eSkOAuD8A(70@IeKR#g+J)eF^bYa!gS=F1+lDMu2L&sqqG18d}*#OfMh2#A$pz zuHxz~{)`Dmxf=b4H^koVC{DMc$g<8ttg#4)xju4`H{3$*6&i$Gp}(Yl%XO|T(deDh z90z0nB4_s~hfhD=tQvWi8|G=_mZbLq`S1AnzYzx60PsA7->|GtUZYjAfwp)cs1_k; zli9&UxkbhiP`{~3(bh5FeliRsqvONtlBhRDFgUwnd7u0HW5k7CE^G=}r~!Q}?{dU) zjr@oW2*MI9^c+C4_nLx6Rwunmqr5x@x9*Hta%T1Y2?_nTy@p6%`^M!|C06sS?J&Y~ ztn>jl9pfIq0&_ZqT~0q+(;qnm3-cdzS7@h&DpxW1ky#~$=%++9t<5+HVn8IKDA*XrE65%J`R9hilmdcZ(DDWpk?9Mp z@A^pL*b1!DN(dtt+ZD-?hl>hRERKD}I9gepk_eyEqhQIDpVw!&AkUGd!>h+DE9i^f zPtiA&vIBf1kVuwCZla1%=a9zKoeCt$8_hTcNU!0-7-=0bp?q5$8X?N_10{e(spF+o z|IWMog&w-qS2T2Jg$M9)3u%xk1V^P6W!OV3(Xk7<4B~qKw)?99_Ymtv+m)MuyzH(PuECVx24a_0N3%7UuGJE9zzlp4l%6Zp96y*e zgn0!_9mqm8xWOA*Y5MDMV9w6CHl7qbVWfriBANNh$k%D$I1;cN&3(L!Wj=Z4Lka6U z@0fA=W@7?<^S%GxJop@U7(dY`u-Qa8GBUX7ky&T8c1g^YLep;5{>LDSjD&eDNNol+ zDmlW)UPx*-^vq;I6vvV!sg)N`1p+O&g-)lLxM(@n91OL@2n$I)h4adomcni1QRR}= zVIum|YX0`%t=Q^N!i7&YvembwZN^>` zI`u1v@F2f1*nE?T&w{fL1~b6CZbs}dj_MyA{`?05>M0oK^=@gO2;{3CTBGFk@!YBj z?>jWp?ZJTO-39U8rlgnY{?2O()iN*#U_(B3imqs@X_2Egr2Hxcn@+V-zj~FTR^-CCwN1hwk_p;KG@v z*_&bg>E~50kV6va*+d`1Xwe1mf$5u(Vgy-Nc4Br|%N1C^xQ`Bu*9JLkZG@YIlVqEd zeI1;^y&zH~jM{K#VreW)_GQ(|V*^X)7C^RWxbX*#EWM>L?1g zj#_n2JI+Km?j-Dy>H!~6szrMR{0>!nx)i(6w7=&0t}nsWkqCO;!gMOsIBH7Pxlkss zp~%LPeGtQJ8{%Q@*%3=r_nyF4&CA7hWgGO@C|74_qpc|uXgY3AGFmde zz198xD0H~~R#@(Vh;Ot)fpI8OPM`JJZq9z6!nXSJaWCcf*)hL6zR=WSXXMUc>1JFY zMMXmA$v3?@!|Y2e|0a}Fg&0Gw=c%-RUO#hMO0(=WT$vip3qpk_93LNV3J9E35W-8y zz+X-zPRt=h)cDW3xiRw!V0|oHKLp$ik7vu3K`~s)BmXIXM933D@+m_`7IM>W{3*Mo zR=VeefI!m2zt9R*qASj$(CI2;wEnT2|GIo0e>q_7dk{qN9v$WHH;SVMh5=2MiX1*C zDa{kII`!f4S3qx+k*u|YDk8p3<@v1dMxvK}dR%VI-5g-OR?rXtw-2KtdkBKnKKR_D zpAjGtskiapjBu!bR`EI>P?7f@i}bi?ZAX~E0bXcSUs&L43ZNRyjKt_K0~*18Y;RC~ z@)hxuK@xi5=`u+&P-Hm*TS!w4L~$}mwg|#3R1)#K$cM0P3nn0>$sk&=W=Ar)k%}r7 z*jQe*(sra$1G%ATplMQ5hkew{lcHZB9$dfCs`cw>KY7ocM4M_`|<7OPPV#s@fcRSumU@`{VEkyv~;@w6%v#`_{jDiR5rt zFB;076{w*AH=cXcy+fH^8ZquSF8|JHE77<;jro(rzIf86)pn+EjQLGx#HJQS&i<`Z zu*=vlSesv7OLmUw9xW;z0D()@_r6>gKhsdNy;FPy4rE0or4q4VN1*&Dh^9$0VX~$X`-N(eC1~cdV5;qwItI7W> z^?;1=>({g0ZZ$MieffQ4NJ{1*j!c^H&KS>q%A>P;z6}wMbqEOddXplUSv(W|@#jFf zdS%`dRA+DvSkp$6Aiby)`sA;mY9uH$a7tAv`f?(*i$+2Byp-N1vO6>NIY62DrQDA+ zTXbg1wbaob4tndH=?dcE%&aD!IQL|uakfh8(Jp4mrd-?MTX;4qZ&7U14(q{2xJz|Q z`LfGeXS2!9O3@fK!(?dpG&2J&RV{h%35K}Ls2!ZwB(+xzy=&-6DXR8Jk88rkj{Yb< z!11qt$W$a>K70i{JH;Fs8Nd;Iz9M)1(zc5$$}Iub396M!1#FOC6l{&i2OU?#>Mx$W}(!gsp2>;l_7t@f0Ng!(84az#)sIH%%`l! z>&37Ck=8bJ4Zl$YQ8bG{$s?`qXqHayl%}~WRu5eJC>PA0Gzjqa0-{fNN#X`{D40=> zkOsbYB~Dj;V&aq}OaGKyGBtfO#6)Cg9W&8;px@zPbVfN?Wv=c(m4L0?2-IwuQ9gp# zUc(isc+_x+^n&Kz^>`jaG}WAU|Bp*zQGL^Xo)HN!t#610?Pt+kWH=6yMTQ?d0Gi<2 zNyMs~U~NrTOR^5oENl9@UKtJNHfbik5P2X{oo;R4_Ws&nmE9`{C~#us&A(W5(^n^4 zS>cmZ^Ia-YQFt1psG%I~?QtkJ(S>*SkwTo8HLm%Tve`*spo|zHAYe$PGQGoIJQV&D zkY!l3iz#px?e_UX`K~agmC8TUfwevndHoU2jOw1F<9Q1(PfP+~3-KLv%`3+Q7Zx#V zLCrE2*iuU79}=!=#*h+!fa-KXhO(+q@)BHq7Nnj6QQU;s>ITw#0J+(Br`RRsh1Qct zU%fe;=(yfEPxKA|S*VL(kzBPLW_3F^yX?3bZEU*NQ47*B%02why?AiSvDo4@Q1raO z8JqfZ3qS)HtUnASZt_~Vw+&%mon-Z>Ps7V7yR4l%d){UxW!AkYn%`|( zP|Nj=!m^Ag|M3&Sp#JT!D3_sNS!!wvRiGHe3 zdeW?o;EK1TOV=jHYOilZ#sJ5VNCT<9{Toh(TKWvw=K&SXD@*#x-U2PIhIz2w_KhQ( zhB)Y;rzll(Jp-*vE$ADmnD1(H8PF!k|Aov&Mu%EgjA|<@2}>d36U7BQR|m37tPF+y zJW@gh{3}ms?#x`X>LHiO9sW07AYa^=0Y9OB6+D$1j>X!@CRXT1&DX1)dNX%D_J!(} zMrj-%Ex^*NM#ze|kVrP#k+~5_h!zlH7NOQk993&#F3>AAOYiYskkk%i=fSWGa~_^c zEjU4G`6YmAFf&!I>-WrUq!y=TLCeU(NJYCx`Uek#G)E>`4cVZV@qObws~abiRBnHt z)fR%{ACXQDg(QJv*7uN;3-j7vT}$!2as0m|anWxE8m~iq;Tv12BVMN<85wm3vkd>o zxS0aB3rzpNPR(YnU0^i`#Q*p?3&LH9>XCqex(k6)@?L<^QH<%`ESzj@R8^pXK>yd+ zIeh$+KIx)&u?CXNI;eF~q`?B#&xqOJ*3=@AC^%aikpJynXhZRbu$;VtJVHR!uaJlT znb&o=Ky16~>+@o-=J}X1P7@n1@&UZ6E-}S8Q$iCiz@Sy-XiA=~^PAiTj;lCFcihO{{ za4^BsOS!_EC{v8|se;-=rJYw#o56dhI{3$aQc+162V#!T*i{?>*AC46U z>`u9_!0ccB{xbsWSN!+nYHujVjJeO{fFybZQoyNxq(j7|-#KOMw0Z04-R&7dY5D;( z3dj)Fl++j{q?e8aD>T*_%Rn6i6SU)!1e+L2ty6+X$3zS?n}nTa5YW-d{@zt@`gv<< zHHZ|c_TI_OONL9XeLnB!zSWsHV3ruDR?7$R_hzy`WP$MasmWEK6o?dWSdg#`QN1hG zlwnb+TCs?;9o>rTytx&o8mCVL&rxi^0obyR9szraiPQovI{Rm`Ri+qB9`6d9E{WEc zbP{dcH2q`8T3w?uTxq0ZGZ7qWTd2r?C#idvR-{77##>ALXui)`NpPU`G&rU1tdX*l zvFsBK*Twx+pF815h%s-G#i$&}d^LR4LR2Fl3fmIFceO>TkfQPZTlROHK!q)H0hKBr zLdfOaQXLkBi|cQrBWScR4O1kMg@he4VJcibj^I0A@!-)NQSDjpnUsWFx`hhQ4LzaA zk{zuh7(pduoTtuxy@mo8E}itzT{SFoY0r%87{>w&IKO>1KgpI@7rX2ud8X?9xxnzT zLF`%2c2DfB3;3h?(n zF2xbFqh5y*?aH&Ag29u?%TI--Y09?%r702>( zjHo-X#Jze597fo{>|qs2h?!){jDhSyGA%rToD*L3`cyAnzMtOWf3nULWVERmZ!D)D zF3`rpwo!c9bptj|;km`5>NB@Yan_ZjsTQCZZPEkFGw0T0sPgcMMqATQDRd}WxTTo- zyB;V7$yxPF>0Y2)E$~G%0IFNAKx?C$?B;0GYz?j3i4>wo zX^n87pW?@OB+Aa%Jc=aNOUR9*8DNIf>v^#DA-4BN@tg8;n{lwt0C75Rp0~bWD}GC{ zgm23Nwy0XW&6-9SHP9P38=gQ~&LFIP1s*t_D_qFpHzg?jmZ@oYkIWYNPVPR41~n)C zzTM>ylj+?yD%WiFO4<8&wZ$i=OJ37TS;(Mv1?{lMr-0io0$LOwSdKs0nuC1fUFFwIV`>gWxvA^Ff zs+1+O8lC4#i;G<&GJ5DO#eY=1O*+<~I{%!nr}TxI=%&0=j~?pNzrYHf@&(4D6i;M7 zoIMZ(VOan+$FeyMkt5HgOi3-&BVnmxdPAeHLT_n$*sr4)!->Nd&qz%1=0{3B#Fx$B zEcQ1a$)UK8>A|uN9@o6`FMCN-fkw+l(a(V9LIN=;Wj3|AyENYaLJa!e^Gm03#EIKn zk6l1>trm2#FbY2NGx@AgQm#Gj7##QB|J^jiK0p8{&*1Ge1p0?)O}EbWJ9nCW0Qd1S zL~2!}`<&21J!vYS*1>qiNG-AG)@!dF9p~Eq5?v<_ZQ_!_(O3|b|0)2^t*yG!6aHvbO3!KZKg22c~o50U7=B#aicv} z4He2OdtRaoJ4z00^6&4_OCn=Dn{u%_v<}U1M{(mAMYDjsTMqIwetFyaDeN5n#%OdU zztYX2$a_@ke(O$jh=Hu)!f~^bPI?gF>HQ4A3}<^1C-_FzS4@S^Rj!{kq(10(>pu@@ zeN4U$5nZZZniHrtt3@za71BLy>3unfJ6rzTwmrXrhHG8|ha5?r3ExU~{`*^bp}8F~ zFNox`)SX}HMyX*t-{87t#xU5=B6QbFMq`uGCfh&7du*%qidiVa=-WJ)|(exct z(GbgF1=#mkq`ralUQ`+Je5QWwee_~Da4cD)A=+n+Qd8|Hw*EtQKm#9(RG=ZO z4~hcObFe$OCRh(SiAV{}ChCbM44|jn)^q<+ zBqy=KpJu1|wfcmI!@6METpTxTcP1==u{GdtEFtA{7$5DnsbDb#jWs*IlJ73XC(sV!NQF z>XgTVe!-%KmM%Ot>a>KSeBWRfF!71hOa!sf7QV~QOJ$%m?|m<>(~vjBpfi20H6p8H zpSr<;>lbW#X!W=*%FX;+1(4!y=3#mV-(2hI3mvmGiSHCMXY|aXUMOQ|(Rm?fh{LE| zB)d&LUt)nnR@gQ5N5CFc$XE?=|Kf5Kxu-tN(M)LDo`q;w7rqGIbzCj6ue4lh#2nAh zGj863hcyd_k`?xnp0h5wm#Tb0vY=f0rK{Acsx(Z5--0@#vph5U4zMgY&3XOgS;2Wn zIYYLB=-hVg7Brd5fQ|ZMq2OsQ=H|SZHBG77?tKqMUo0zrSlTj|$>3`%ip6luN-Q=A zdt)l|jW%7Ae%yk%EP3X%qfYd&ky=}*I8Beq-A{rK2yP55+`bPw>4^834iOnIPAzj; zP#!B#oF;Lg5WM9g6r=kbq!cM|_ALo};MR(7H3?`z6_6!HQKo1slL{c}k8kel zV8HsORUxY01Vgx6C{)Zl^F~Q}4W|>EKlS3&MA)~$X8EenU%L+L%V0PEKoERiEEJ23 zb3u{OVElq-^y_KlyY&2KXE4kt6RHD)zrM*~X}BSB>TikV65QmO0F1!zx0c37Nx`z_ zug2aU0|6TK%Rev^3q|yII;IQEgMbZ1MxQurJ?KP}w8QQbIy*4a0g*uplhmxOm; zGh=xJEB2l$WA>6wv`0LESD$+C%uoBhOvfJ#X#j-`X?;oLu;+9~T?{6X3UawV;xc}O zryt=e!GcG=gl#%oW~5tYdF~`&ZW32gmZCysvP@xJsWU`xmH!-pf>d$kbHl7M&gfK? zXnhUy`CRK$(x|LU9fB0atcNnt1w)tq;4;K~TnDnY9nT_TVp5VHKl20Gb5QTx?A!3|s%?+F& z%7)gqX_>d_%*>NQ9V#BHtRN1>-3 zVi-1R&C3x*9oJhU*Nj6F>Uq{ujDedifdvN);OIm>kOOWHlm-l9(VhaZ;VL24UpPy! zBlDcM0L2i{li+KkI>ESs>;xFpkh@9JA+QR)I7kx#TfE(Huka~x55On@i}uZ-pe1CC zz=6Bir%(kGRTRXS0;~-uM<*lmqYV3Oy>qptgoZ>d`xU>i(Kpj> z;-&5y4jIvE=aYAC^L$%`@{IPaCYyLkk^>^&Mv`2-&+}PE0jqlOy1PRvhYv7{h)WW5gp3)BD^Fo#c=7;GbYNy;(jYm z<#DmBcNKR6t7)_e_Kr^a(em;YcW$W`6tFb1TX-?j_Mv2gp~(2wAuZ@wVMbN!4@7{km93h;X-lhq&r~XOOEcX}z%4Wh=o5_f>-La`_P9dfS zj+|TIE*7PnZb55so>>u8HaVLXnhjC4Pu0Ouri8YI1s?@M zsfgI(T16~b{8yvntM1yhs9KX>_7X+t{8B^$#Phuv43-|I3mi4~V&TtgN%>#$o*rp{ zkKAyrbo-_Ow-PcWj}ja6BzT*1CEe(GriqDRbu%xPL2BE#5dP_d{5%sNiU`~3f8_g- zS-&9L%y z3aM(AN$6)LsqT8FBR~8^(p$Ewr4ad3xyVXB+~W`SrsfGpt~=)b6XuBXNu--A27Q(X zODEV&dZUikgxHV>Y_eY!j-e64EK;tOiPTfx~ebbtWP zVVyk;$=@|ldbbIY6}|^)J{}eOr&ew#5@WLSR}N`0U$A7{#s6hg!D@ms^~rK#0Rhpm z{XnWvQvMwSgP|Dxf94uvFF$jQqumvdbaB6{MZ@u*wYR}fc(W0mBDQ4r%oAW+u_>bv zDM|9rUePNORpFJZYqw`;30zl~o2Sp?aZL*8oa6-_+(Zyfy)$=-XK8&TygMKpxV+Nr`ahd}%JR`Eg@|X-mA_Ki?N05ACCL zTwp7`MpXUCGf?LvgCY;YY~1al z5l7y2aHvO&n$A$-U^oYhVj!XH7&}2x&|Ps-dO6|M24d3s8d^XBviB6SP}+fzIqZL0 zwGx*I?G~81R;Kcn6me>G25vcsr!a}xkKJRJo+t$$R5*t;=*iC`jd0ewUu!58xgk$e zTjpdbUtFZ`yf!5%4dYoT_Jn{yuu@nUcXwLFQVubam}=2jiSoAaVC{4S)-`-13!vIA z#cV&K^6ntW)wE*)fwG3lan4H$`D7^6X4oY3N((;P`eJj3ph$EoDH0u$7H68H&e5}(}CCnBN86_uaYM7NRB>nVt+NpGCXA0Lf)Gh%7FrQ<@ zLNsdg{yQryUue6=7~cR(#G- zDv7U1|0e?Y>SION>r^yr81J-Pw!!TWjbQW^lchLN;`8v+YJ}zO7hu;^JLH6$crM1h z&Q{icFgEy`X#OHcscm!A<3&%`M_&&>|l zh?81e=1(tPAx|TPuMCx5j)y1HXWh7tu&Uu@IZCA9`!J*%k(va@*itbgebPB_iTfeg97-ztGT??_)&u zepZj=$CS+!e#N9@WnvQZS2Xt0A5;5R$IwK)yUj!3#ni5?b=E|G*8|(Y*Z!P2zbVom zeLl~cmB&Y%b-~gpWsDtv`usdCpBEv4RF|kcd_3L(7zouluGS%{gMDQO$PO3y1GLUb z*9Os_%}VWEhd=Z9PM<3EFydICBBqt&#`<#qObE;4OCW;ykKh^Kq5u_|j5`*EA5@QF zyMj2|1wg&b96+pHf|chHwBoq$U{>!`(Y#P#gm4Akg7l`P4m%$nrBsmuk8HI1B{nTM`3*e%y35|`7Ou}l(e?q17UN8e`7)vyWB6U z%)I`rB*Mc9emDrBEx}Sgh4Y_$M=WT}E5-3bIiR#Fc`o!Tmv!IpJh-QyfPLx?f(tL` zItaJ!@-2$uGu?t$4xt;A&!cP6al|7SOIl1B>-4EGwJ4w#LSp7ygc&A~9siH&tzSU> zOa_n3zIAs|@Xu>(Fb0&wDsAw{VrYbz8Apv)NIeRq7AIs54}`w3ccUJVz;M4^7Po+` ztQbO<(yN|aqJUcnB@#Kl5PV^tbzgORRx}iH;CW3_Y`=frBoLf#(exK1Rx8$74&&sy zAC;MH^>4DXZ#yF1zuIc@V0ef(j2@kO0?(aKYEK~KrZEG7T1k0l_yl9AK@Vl@>$ZRz- z>3~Kq?pIe(O1-coa-PCa{sJY`M+VrBiZdGAk7rLgZ9B#cIQ5mBU7d_1f_8)j!wRP- zcnv5|{DkvBiP4}_{AHwx18sFa5FU`V%06+SxdrUX?3R&ITm zE|$Onn7MBu!f^zB;%4;BB{W?D9TOB|-(%Brf`AmJCd8zI#vR@O5-foUK|*bniEyKX zWZ0qogLV!nxK`q>wh|0xl*N({ZG}GpyChJqCMWgX zSE$7`)5yhAHB-KL0WQfZjN<9-zh{5trslE%DE&71e{7xeSKwjW?Xzv$wr$sBYqE_A z-)!5q?MV|S+pei5+tcZJ-uL`));j;gweI`E-uvSs=@~`OC;20vJ32#k+>tnu@Wi3_ z&q`O$=+iw8$DA#xR9!0<%}Vco{a)u8ipql`U!bmA`Yb^d#hTkCEC{YWQ`6a#foxVY z>-JTZ^>rq?Na5|r-P&febl6!jWI=}0^K;*xHx>rA%>?tc42h8Kay!IZF1wFxm0~+V?uS8$q|!(f+N8?SRRg8qF?w!GF9jCY#F4WhgdWyYzFPkk7pU5{ zHCLFQU|hB-wRaqp_hQ38-+B7_qK*S^A^p(M*Aa$i)z?R;7iXR_CGCdUAI2VFe?n{m z=B|uBrI`tUIr?jzwge(MASdVv3m^t7fD9CPs^I7(Ipyx-_mldX4t~rw!9XN#i|l>j zx%Rca#c%R;erLYU)nNIyMA8ScE%xRe6lxBlku4^i#-C2~OjgAqMgFVe# z(~l^0!Iq0MDgwR}V5W~2D4yV#5L8E4f~uv)8T_bGTOtx4O3dQafyR_B0I;fQle7)= zDQM3t$z@5=QYF!oV3S{egz!tzG0#&L?xyxiH_g^~ zjd#GPu7Yp7@CQ|xH55Y@0oU4=@?*~9@Xr9n%|P8b!HI&Qv6ymh&-r6wlGfg;Y+`yC ziH4_@2Ng3(ez}Ap9wu{U)KXlJ-T1p)c#oaek5Px@F=tG zNgwu^JidhiNx&EK@bFO|E-PW<)^R4fB86QhVAEUY8O>rN)aU^jY^=WO$|&$Y0b2;> zHHRIa8GZK7TI%gA<+zCWl^usSc>Lt|+7SoTZJdZ#3BCOIX0tt`8Ne`XWX8Y+tupIp zqiHoSY-q_n2Cz&2+z$rHDR;9+ivrKYT_OQ#GSTBca8LeV#}Lhpa#lT}qokoI0l^ zV)kqiqOC>14q=Y*j?y!E;GO6D$jVcJRJgo|a%%gaMt(;leB%f@LSlrwS3_UPYCTKW+x_QD!e{gh*S)(3j>vxbH4R%DK z4?9fF4~iK{G7ds{DRs=~4|pHh@%d(9>aj<20QAunkgE_A-8+9w)70^`-UPriKmVP( zo`olPKs`ttCG+a6)|Hikrd;uV!2f6T`~n4j2_-N_X0El=^Eg-|#pKpoO=?l0sebG? zfwzyz=PufqhOZK0w0sg$>w8=`M;?V%oU15Wf7~Cv`8)5pt~i=2@))+)C)ZG@I;g~c zp;cPA8 zB|DS)=d)SbH^(s$%^{VM?;$$DA~FoI=n_zfuSm`Lk`?o3?g;i&BYrhr+9^LtTuylk ztf5MlNs`Asq+D>(7)n)pH7XRXxnYt6?{Eo#^ySaL2B5w9gjYxq`JtZcIQg|e{2Mx6 zt=z@)B=`YOxHCcqqB6c}X=Vj3p)+3!_V4fE+9HW3S;!^lM%Q>WRz|H7&ss)o{fwhl zs@Wxi(&dBF%-kSigoOx$4{_t?`U8fcQ2aNb{E<+g8>l5}MbK-J*lX3K<5)d_KrZd} zI0MV}I6rgG!QQn;$?4)+{>^goznJzpgh8HTD7Ctbh}dk#O%XF8GQDhq#h;)*Yb+JgoVLHy~8~Lf!%+1`_)^} zreu`0T+5}ZW1DGS^D9mro-!NfQs2N{KdctAU4tq;z4?3@%2y*&HkXCE` z>%dai>2zOoEJIp{!Q@^F_|1@BtOW+4eWo2;O=6{eSfUF^z3(gE?CEEL_p`TIz4@t# z^QB&x5Mhy13kmbLMN5es$ysKLIP*KvFo{niF#gbw<6qP9hA<~Il0<*$N2}~WwYTxy zy-}&T^Lrhxx&X0NWWUd)6Yl@Meup~UO21eza`))zur)|%I6`^@@K^(k153g6%v8%` zt&-8Qu|l3b381KqzR)5$*lrbc(!D|}PdRT^y6l6po_VE?XAT0{B)}^E%g0{FvHMR$ z;=TF_^foHk-pM|_y(AVcQN0korU%Z!t?3*i5FZcoGmZ(A?LZ||;<>%e&b8irVIh zstfS&(NcDSHRF|cU}xh7%^(wS#w1{wyxjB^<)KiJV@Gj5ZNlf$@Q{N#%}t9!=2Mbj zi`~42^dH0-%xx3yT`eAGkSPvGKBoN8sZ<*Fc*XKHOEKFcYbZUcsBGa-=24Ze#xa>m zRV~pFAr1&S1CpCu1ZO>I?f*{xptLDBm!yC>!MQWo{~JeYtGbAEDEROAcDhrwv}^Pa zq*Hf6Bs@0elz}BI-0Gx{Ni|~Xs!R(4=s}2hNsBa+5T}H9h4(A^1qmsA01aKBw;;~|uL3EGAaK81uhU0aN#8hRJuu2wL=sF+C8`Spx>GH8 zA4S?mJ!e;<5bjO$_XDDBs=d6uc18`=_nV2ZS4*HS;AE4Lav$rWG6TD=U^grz`o4`+ z9zOle7;sT@z$bavv1@zIjlvFLJV%i;GW~m1Tm_{OYzL$N;`rL(-IZU}6qamO1^u#O zNT^pf{iBcm8R~y52~&>iEEvL$0HjN~O=?=~u1CMFz(s@2QdwI#kw>&)F!(ppaZ~J& zs*kH?pOf*KL<8yoC}^ZIe}Ce>Cm&)1^kty?nSzdHHT2(QDLjg)7~J6H?)JUB7#e2v5{L_ z{Z0dOb199^U+|Wdx2H`oY^)^+b79)Gq zWeUt%dQd1t8E=20JuNmazj1BFg>Ko#)Fu$vISs58`oACI3y-=75ys<+K8P5xW|WX% zD%TnBncP~YP}Q!4g$TCd52f4xAsE_J{?+IIZ*{q1wqOm$`2`-;@6*rS@*tn2WwWMa z?rh`As>jk!8BNHpNKh6>j~Mu*{?xMZyw&vb-^Kqq#$G3XQCOHZ%(GnW4vrU98`GWn z{Pg`(&eQ!<&hN2)plIcEaJfEX76g6+_}@-X^gsIpp|g6DrLX+~7(N&sClLo8`a}P~ zhN^U+H~89z+TXuU+?R_6hxw7#mL)Kd*fJ-b#+iOn`6X8LXsGhq<#OFV4MU zpEc4ULKNo@vDN+xFoNo}wn*JdYeVzjJbf#LDp^f&U8$_!(|Go*L^d6ok3G6REGDcw z?ZuE4z<#3O#Rnp8RJrGsg*aq>kU3krAw0w6TRX3!c7nL*?PUZ8?*nPE~vLuf*pCn z`R+5hhF70&?f0TTADsz=-HOXh$QM74{gHQjCHA$7U=>Mxbmt%%zhr|DF?Bz}K8X2C z@wj{zHvrusVU`ttU?J7H%(##2lEgxqchX3N16G@AV>M`Ml6cKF$UvdHR`SHMQ*!d* z;f{>W+%!u3IdnqW;NUxG6Ia6Rj+EPj8~@@1F}*=2P6^xD12VyhC$m2KBiBF9I#{10 z{?(Vyd7C=nE!gmK#W%nbEPrhbN5XKGtB0MYJz)=TJ(?pDYqJlI z(X{RZ9p`OAx@_cErr3Wg?LuqktI|;X)B1uizH{)IkbtGrp@7i>36>#C9~n+UVhDRH zF}~BM4LS@5!o=($_3CHxA!k+Y*5|C$YVu`tN?)BDdNXqlx$p7`!lg1Td=JMxMCOp&Ptza`s5#zjIIDQh zj!@u*<_?W)l6D;U$Q(UMr%5az8ax&mA@)UOBy0SE#PDs5u61X8D5@DfhA$oR zPuct|TJ$3;*KplN%ltK%j(G5i01+#1n5xHMQK(e_Qkxfh;pw`DFL+Oln z8l;Jb0og~AlgBygk?1~ci)-CFdG39ge8Y1>a*3&Q(LU`Om21ewD9+uqjv`POXn4=L zW#O$E)^yOPV-frLGh#g;f&$HvdVij$iJC7KUEXxjtAR`<_Cs~h9^a#?3ESpZ+r1Bl z)vLA05&cAEP9*$YGKV&%SVknpNUP)jBOleN{o_I>g$e=!S@^#?QIr4AJw*czj2xPi z*&Twy9xfd~17idq&OT1BM+5T&%ezabK?h?7RZrJO2a^VUNiRSL;{e5NUqT1V0tIzy zcftf?1O=vVPUl3A51*|^i$6Y^rpF9CG~>S63w*9OMAk~!q9c$Nw?y1r8`otx-E`R>f2t@j6ZG z1i%--z34ObTRHf01=)%~lE1H{m!8?StSiI*pXhh|E0^mR^p!9cVs4BOv%R42`1Q8K zwoDnbK5Y5`ct-0kR2nnBY7eYj%@!#*E(ZlrFDMlXi8 zjplP&)b)eg?8Nfpf&q&h>)-!M?hK;QSuy;UjZn$x;c7iB+BYuO|A?9oP@CvHh?^1vgX&XZ-3qgeEEE`TSEN~OH1 zHJst=X5=0|%_V@Sr{JW?;cE$rQjMlOaQ+e#?H8lD_t`e_K8(m#io5BV5y*&nMKAED@c38pPq@Wd zpkGn7ZgnU7Furic*>VFWT>| z;4Q5J+wGPnRV(sa)E|J}0y85}d)h56Ry4(BO5Q@g@jH8Jd&|At4LQ+1V)5H&B(na zGw%5cPJ_f7H3Y{8v6vW0I*5;(TRmK1OYz&*AZgdU0qnOD-H{H}>Nb%_BG#JD4L>jC z=(L>(&!`C$qWH+BNnhIow|&QlA4G3E8H5q6YDV??%ueWx2 z)g@>|Jg?6_X%ldKWsZ7Mi}T!me6)}M-w$q6=i7fQApT)r77)b1mZmUsTli{XkQ=^A zFhlYgXSqcVq_$!~^|z~4Ml>+r>GLvDU81Vx%8Tx+x9QGq{fe;V!x4Wn&2Ob?9ZW3a z-ou=IozG7W!QYfPb8AYivSl-wo!RtC7R-dYm8jBz^o$;tsVdf&T|DfJ9;aCP&~ZZZ z>^A2Ok!_LYsHUjqH_nEIPTO~)lc+>>mBIr}8#_ zI*JeAUEib$9(=Eoc9G;7_hB+!|%dm`kcm0`LLEpqbROvCh`m&p=fQaGGjm; zAqC@_4>^|geg*UL(f6=rQW}qR&ba}HcNbonz)kjo2NilFOKCK=w6$LAh6wYoHJeLI z64DVQ{d6Y8+EPwA2>V-pZee_?iazN_Zm~EJ7TPAjOj{KC2Q9NNz4e7`L+XxTfEUMY znZN@!KTuP@y-CxGn(MgF-?vy}qA#L8Y66;qV*Ns=#gh?KRGD3mVVSugK)`5YM0y;s zj*4SAj*{d>-TVcr6L(%D@i?Vwgl(=3_P&*ZMEv8IaM=weLB{rna(^nt}7 zd=EK@h9amN`KBYj$1>q@i=9WQl$`lY%}7UBTXk&|GnI{wkwQ8~Gc|Ta{I9MG6yd=1 zaDj6*J+;naucxsX7|iQx7PzuPHI+ATU4|_95__$2;`cMjOF|Q)mjt~v&IOytfIlPX zHmIWMtZlEXCHKXNA46sSt)<2j{BHk!u}M5t zBR??Uw6^ZAlxcA@%>x3W~}hUt8g?S%DL<<#0Y|BE}GI zlSZ#Mj3veV9oDZZ#@faD&okQRBBg~^$IKJiCqUut)#A^T0;;V#*=-8u`HiM}3q|}z zA2zmn1ZP!3`fQjIH|J+XnNE|GP_N$fI|}qaw0*P_ zq6LxvJ(NQQ=~65_W;;UqsA`EcUsj|tq-(!h)uO_i^HCq`iLF$DgE$$+Nu)scR=-Ac zy7ehFpyMnu#hNxEb1`>l6+2woq?@G>gOjUtCR(j@0kH&y=x0#}Hhbstp=>LdPL~mv z*iPCwEWb^q9LdJBw7~VCROIH`#f-Ik;_WQg6lEp{-KM9ssGMn0_utGCPI9<8dhb)D zKGqe>4o#R^LOOpX0^$uu*G%G@Hyall24VjBjX7zbQr*g?RhI_e-%NP)GF64iv#4*1 zPuI1abzJuvIRv*V1}csDB(BhKo@*U923ZqZwAboQ3#W<2SPr$ju0wD0E#^q~+n~fI zw*|@O6zXV?-7Cb#B`KaRJ@;u0ysLqIa=~%>G%*-1;F;BPg;&-C%_7-2g_5Z=&>SIV zrTWp{O8K7OD#;z5Ycp}PjOF!yAroY>j8%glAZ@5u;Ldk~mn!gmOF&59d!(yghuT|6 z*L!4EYiODRr$PYv{f>-iLj%U4Ud;c$-ng$Dwe7~&je6TZbk=H(WGyRxb*3j=}Ub0pPeg5>%bxx8#_aaawv4y+!AFzcrNVv?-9*g<11JSa5< zqQF|itPxHN1w)bD`|m$m=XSEFXSpt$IfMbn!ljss15_$%YMJB|88_JjMIB#NJNh}f zYerR1gsn^Hxim^z_q~ILrZ@rz! zxh3P66j)QG2zHN0GAJrH8Q6QFjC;b>(RWh6yj^{k4R(`-54`Sta3+(kN5cWhgYNo! zSz-Rdmn>ik9<$*O17Hvhkk?Eh|LlNJg9h_(6j2lw-k;2!UC)E13XaXtB@&sV>ckP@ zH`GXG5D-miPR3Z3h^#m?D$-k)>RuM(G)NfB7IY@X*0?sd9v7TvBhk%L$%DNcI1ved z9^h);6;=6fiahouFFFof&g^@B(VmlJ2|nACOf&uswG$1d!kq5Io4ri!*xvw7wAN9# zYW(I-OXD1prp7WD26B@opoatOZ8A>cLE-E@8n+IrFhADc^&KB6Z0#}JErIe2uHWF+&euSykiad!{p&n**UpN_=>$AORN#oC@nu6)D6>t4}+?zqp zN6L z3{&|o)#rkS*WMlr4B`KG4txIb>U^2rPYy=*f6aX9r{rKHz&?eQp%PZYkV7`v^wBr!aV;baK$cuX>&AY$!jIV0b^{PPB1NSH;K>ru`oX4DD-jmt5Q3( zD#u*ymAtNc{`p{lF68ydtjVx`^o;uZSz2;2HnX8Zo%K`z)=!2~9U|lu+=xpxs%PS8 zugbp`z2wr^z(WwFp#S~J+R(B;%dfCgxpC7G{_<2f)kFHz9=Oq9Dh8<;XwxJ^C_*{T z>X=*Is6-j!y1Y1IVO-%nrTw!!0&;qH0d2bC9E4>=2?s?Ls37HfWjm%iqS$-^LSlPl zn$}JX6SePJDk~;QKEfzUsiWY;T&1`4rDC@Gzbl7tfPz^eg|X>G7l^@=o73Yv<$Pt~ zIB!S#)nlaOU*T1|E- zJl=jDLb;3V3@3p$Visu!MCW(KSc< z>3mj4&FgFQ2D=$AQaO$Pm|r5wat4l6AequifG!4VkAILB5la@AAXcQJg&jUnZlA^cy#@mm35&1z-D=4W||km&&kx?0^4|WFolR zf`qkxdktO>Fkfv8V9ftwB8@f;kuJ^SKjqTPBu=?otyHKR*+)M;G-*e5H651Y<*C^O z0d!H2H$Xk7X{^z2lAl#7e?Ln4tLNTwOLpDMp-vB0(?e*$MqyStS~R3iLv9-POp-(G zV`}n02MUhPYRsQ>MP|V3sd>%MKUS1BE7nFSWE+QK5M7Q^y~LhhbY9u1^YzvaU?w|` z><2f?Q&%fpub+bS4C#ia+6Q%Tcp#=R0sN|>4&)OtTZUAb8){1R!D^{s74Wd}yp$8) zW(&Sx0CHWvOVS4fM)aMwj0*601Q0#dV~>pe5lx|nTufr;c)tddn=+Bx>S)nqzV!tj zRJ$#PL@3;V{qR?ZzxAyf%H(K}>=z!RckNexBl{SxMs}11ty!UB#;-w*9+3!V1s0mc z7z?P-%NF`JrVS~?d6kS(%^kTHZ1c&+Cr9Z26mZB0wq@C(2a>Y0MVIs8mGf#;58#>!*4w@|wQ0rU=h@P3Wea*g_eVNx6PphI*Zh9r%4* z8t;*9hg>;B8Y+u(p>g{eMu*^D(><4Ua*L#@|nP-?$+euM(P|4@B^8}zK%CL z;UM&H+`8yNdCmwX>cW6OeWC>_qW@F$ zSY-d_uu*DbuJ?f|lF&8FEh0@cnwpvpI9K$BQn{VKiDGBx*cawfj|J^$n<->-KIk2! z{}L+nXMiq)oEyw_8s^u=7}R=J1_h;$&XQm5A)d{KkpnGhHwG-rJ?_X%@}07=F|X2g zsO55u_mH!Vp=n5T9%qS?@~rW>+d!=q7tXIkL+|RohRj2~Y1&vzudnO5fFiBe365XH z1y1`9J03_0K?5X{iH}p>jOuUttTs2P+4WZ^{O)2RY>Y?3@weAP0IefMVk0Q32PJZ6 zPqCYqt=R*gIZG|*)++N>Jz?Vk)|c&FgwfnR*tg<-gJshmmxdR9LEV*1Ej`!tNyI!0 zZHS8hoM6v3^$hX|9rx@PVx+0!R{ZnxUxlIAb26I{9F+Q|`;I&1P> zqhi?9CR&gn1PbQ!BB4}L>mN#ol6z!So_M-i8~!l{F8K?%zkLRD7^MbG?E!Jag7b6j zSeEK+5=gd{-zketM?`Fvl72YfBHsq!F5y-!{9GL{vjVw|^b@pmp;|OCH%!Ot@q$Du6DddY7+IlODvp^cv83 zn{kAs1jAfIOX9Oe2AS)+OOw!?J3JATwL@vHbQ3K3Db3rB{34>Jnn_b}V`Lpd5LHDS zm0)uHHworK1@Kt<*-4F6by#gkg6?`3Pmpm|CQx0YXa+p|{;{;pB$1$lqk&f^l-LTLzyAB8b+U0h%Hh~QVISuJ{wNb6 z#mafFfEWyC2vl9x#oC?W8-!W8s*8H5*~a4pfqP)#1AvHiv55UUWf7)fWH*gRnmS?; z9C`B>Tet88^h(7A9t3y(1moL4(=i;SiXJx>wGC-@($sdhUm!=R$B(k^v2WwdScN~= zN}tn~+H)7%&)O{N>Zg7qJqYyf`|^}lZ7X73%-I1sj|(bT6`+BqE$bevgi<~ zX?r&d*15F4T8)HDsnAyUbQvs482^mBp31*l&U>Ki+Zo41mk6!3luZL(lsbAgCwP_} zmx)1Zopm(aKb515dxlrFzNHigr`CDnZSeIjm-)ouoPjzEOpy^^J zFr~3kg};GNr~Cd_4As2@->2&(hPLMbK6Sh!?%;vJ;lx(!&qm)(1B%P;c#wSG^j)h0 zNlIY<44K|dhm3&W=ARs&J$`%^**Mhn6gJc{+bf(+x9YeZzA4};Ce*e_x$&x)4OBo__#bl zB0@w9Rn~c)#q2k=cLABWPxS8gU=ex8%rB2+s!z$K+85ul4m=E&#pM zO2B8{`|UN;^#;aNCF{p*F`-eVE7z8F^*&}%T|Zt`r~vP*JyI%jUlUWzTOW3*&k5jm zVKBN!x-CYDof6^yv&M_o@N%83o&%7 z{?NSL>tz4S5Zssg;ERX=p9x*;U(kO*;4TqJRBtN~s_2Ghz+3qTH~Tp!oilXISF#fu zcH!vi$MUT(`j!b{zDOu%tq#UB0;Zk5s64dL$nna_THiGqL}F~o0Bk=iJLd$p@bSsC zauAZxeZbW@<;AFdmI=&80$g#uCSA}Kj2PgNg~!mt$7okSS3?VRwK~hD$syQ2K6Zv&knr{G+?J!-i5j*@{x@ zrls6EX+Fy0gW_m`ChCL?n_CSqCv_F`WOK>=(yDYtec1NFuXxbWjh(-y0tUFo(|}W` z1wT)0sucR0g>yLAajWw;Bx@sLw5f20F!p&`7W|N`qVD~qM%qCdN(7<8q z_sLwGhE})JJ1@MtvDBY_Z44r;>my1^%V(npEpODrIsW}T*+s6_dvcMUN!8V?2E}&J zWfbH0_=iyBy|t4!6vHyL#p@-;s(>Q!){VujALKH5nzzypmO^A|RVlMR3wKm)#@FDI zG(SjtN;RdH|3J02PyuurfbMoAu%dryZL9*BvketP5M@CHpcm91Ka}h)B#7(2r@4-z zm!g-qx)qr!@kAcoqZ+Ad>yt9*E&kqEf0&VaOUNnNTw?#l$X-#lBhc&l4oEuBUSMfO zb*~%eJ8<^GQ-oqZ9r z5xe4wCkjj=KcZGa75*X&n<{^GVH0%4^lm__Iaqs(SEz?^H5-Fj4-nn7jhM=gV15byt}V(LMQDHX9uBv266%%@wnq zo%Duu=xV_42<|J2ajGtz0m}lP2f9(*{#236sX0@)%Pp2Ig}s~xd0q6`WbEH~9Cr%&$zWgbS~oS)aQbNqzD3 z7_w?lZ4U-M82;cgMC_1+x31c1KbY+sOi*uU@N;d=c5ib5ebKDj-uaPa?`7){yG^?U zBR%HPqP}oM_l=t5a;!1zo?T`?_U5b$OBdx$6BH3KxySY*fS|`A`pP3WvQVwCm*u}U z+O#god(FN=UzltNoGn6yQP*o4h;D9? zre7dnkZkmN>03gjxX`X0vfB`>7R87P_o<+d*CP=Ier^CFm7{n z*zdX6$q2e3EJerc9?)lIe}>JI;AGG zJ;mt+USOoaa~AE$%6yC^uC}~5o`81&Zqog)Nv`&sonL|5#5TQW5w7>Q&qp)3$JG`& z1CtIjnEr{vbMul{GCn>8E*BJT0o8Bf3B3+N;`3ap#tmB*c{TrFSLDeF&Iwd{V84tA z(A*uK9Nx(VAynuX#RCx|ZfueT=8pO}(0^?f!C2Gfd&vU+boyls zKE4GCFHUHf?M7wms|GnW+{zxq(R$70*Yu}=i9%Q6PV|j#8~HgQV&Y>>>psw3$HPYxCt!Q`QBBxH)iYV;D3NijXK|y; z8G<8cvLx--(#KoF*|(JDY$X(8e8Lzv6w@0JE5^q6UZKYjbUN8hkdY)Kaf8O)tJ<M? zw3WisHLKaG)yWH6UQ;&$Qlx*0H}fTn<4W0wqY39Q2{u>pHQZ~(_4BHSM~k$m5yR4b zl1-2{cTOpkcPkX5(g(4)*PP+5mj6mU z$!0oke;b>19e8};+7uQ{LMCID-4iJcf^HGxrAmpID!X&^`;*{tLW)^@YDc&By?Hd* zH#5WOBmSKi868%WZI=s-r+u5EDKi~y&>4Cy^`bwP?U%lZTG$f|-|u&Vntw-4EtTB% zI;VU0ruN#b+zl?iAhsvX08DwkUXOp*;+0(vvVChO`8=B(QZ~;uIUP4`Y!%@F`s*F9GaWcT&YQMSpfXzjalzo1yY9eR z=9~?;4w8rNArD!c(ILTp%APpw6|EUO_1JEUlr`LO?c#1Uo8*^r);w6n-~oJvz?VA+TulvEy1~rG-p5oD)Bbe z_#}K&<{R7Q>>l2PLs+z$+~rFae_*oQX%z1p=DfA;D3|IU4U9gF*tnUtR%Q^r$5&2* zoHZ%$$YsVF%RqD#S9Y`BfjKB^eMh-#1g(8lV)!u)n^9Mox&gY`7X zrd5c0h+YqEJGHifXdC0|QahB=iUf{2DQ?uHx|xg`CVHdo%B)S!V5jYB5P=ad^y)J{ z%?v^Y^H}G?QRs&&cXn%hO*YynuYkSbR7sGGKf)ObiTH_6O4`+y`Xt7FxjKiq9dO#t z!&H}9c(?8aj9^Y??+=nbEAUz9)fS?$_yuoSWzz=FUh0WnvDfuKx{T8K$AiK%O|A)( z`1-NP6%LIL@Zbm_KtTZX0?kblo9^{L^i_#L6#e>s=*8B_u=sFaDghFUK{Id8$Oba{+w#ESutThoX*!vLhQuObQl2TH42Xfw zY?a}emQ3&ODd~!)|2(hBM^>}~suZimqh%<1SHPTdbv^{Qg_Yi<+i|%-_JJQ2OkHa( z)t!#Og;hRf_>4m!LD~6L?5EnsMRPf`(R<(4Kdp;4W$MQb6CZ@JuuB=_Lf){HD^Cj? zycIUY*C4e=!Q*9A?19 zz!Jv|T`RzM9lF<_oQrV7uYX@G$D(r0<&_#>yPkXL>w7556FbwYea?D(vM)}c1Lr0~ zbcj*?1IpMnnplEVkloM!%`j=9R+lNIr0s_r@inZBm&PwgHIEC$4|n4h<2}nT;qR_` zSK71{2D6U@BgE~*Z)<-C)1U_CQy>zoG=jq8wkV=fSCvT0R`Pgf7%42WNQRfdcSM^InWYbh_S&5B zlVlgC+cwiy@lXj9Y;&CrE~62c?HD<&MG7Fn+tw>+!58_QbU_(v4I)^Fsf+ccUQnwJ zzLl}c?p|6i2bb|8f{|MB7Tsh=D5xI-U?e-DxxR#EE%iAdIXqd`73$J|F?WJVLUr9K z=w<3V+dxg=K!Z2A%B&M%!dbo0of)N@9&eP+%d{=>AK@qt;=@dswgy z2nbC+?IncEPqRZzo0(r3ftSOtuA;I>F^B?Bb&(;C z8Duu;z8nkIXi$c!B%cI<_Qq!J*ecA+>U=)eL*TN5%euqMVu@uH38_k6^rOP;8{!7j zSej;45}B@RjNvs5*TsAU4-oQ)Hdf7~uWS*~Q;)&AQl?W%+it^C(XI6X9aXzAP zU4>-jmRt0ov>+RSczQH|VI5QFohUBFZ_S^(p+ZG-x1j;Upb^u<=xq-~3S9epDd_Dg zp;dn|ys+$c?gv#3FZCWazX*o!YOvX=^Q^?d5*S!xk{(F9unj2C6?4^?E+cQxZQX!Q zSpU*zRZ06MdvhThF&H>rYdBE9*U!{Jq*daDb$*K9BedZ3%24{yeaB!m9JgUmXq{A^AR1sZA2*G^u@ztmj;REAQ_ncrF1BIt7r_-m4CY8! zA2wXpNNbPM>g1p;4{=lfICn!F?SHyH_L-j%%>D-<32U$3F(}t{jwAT=)ZA^w3yRm+ zjWVF9S@7uwkiRhU2;d2Iz*24hhzW#x6(AxUy>zL+c-$%wxN#En*z*4E_wl{E>@9?5 zk3>xlCrS>W%89$iwi3T`bo4Kig3rc34^vDirieKe!W9X8Tb44+>5B8$UPJ#q)4yFiyQEYWh63TX(`9%s~mGfuydHT51@e~?9Yu5Dp8q+Jc zyx%dt)CQ`w&};$6f36v=Q0&V}^Z-^O7v-_Nfrh*Iv`@x`yW#h0)1i7xuUE=`rfz z8&m*_RSAYz{B8@E5wwwLA!}L-ct(XJO#0+@3PuKlLNx03?au=mvMHMqo(IpQBAvJ+ zJj;D-Nrpg-_sCC+t3M!B%#y?Yl40JGjXu5gaU~xeH9q}l{tVrH-n^C!se873hW+!h zpjB_w=lk-$bhb8Z=IvpZiv5WEho6>iWeezz!)Ty$ju1T7q3S=z9c5&I=EF&WqIaAiv^5j6{x& z-<7!`PY?Wg>cJU5Glk*`d;HL%3Q%m8_rlQoWRZL{HD$`GxBZOH{J!Wt*NW|L3+R@# zV$)^Sk!7;ZPT3ftytP1f%k-#>;qcMtc<*fpMQ=X@{_Bk2=DXXHw~59P!?ghLj7=lp$RX_+T@ zJ{xmRtW>cfiXNEP2%%t-`MhbhmW;!zi1y>!MahbVtp;yI1O6^_o}%wDLr*hvk4Zgo z3+q58hyqUYjIoT+{@atwQNnp!K>){Zy#dv@l1?r&M2L(5NC_$kVOUPKC15I=Gvl{Z zaez9jZk!h9K%n|mlWiBRdEMAm!fX!y;51$@82~3X^Q$-q9TF96-Yj}F>@di0JW!zD z5StImQUx(GOj_k$R#`%_aH0$L`%w$xI3M?=9H|r;Edoq;x~K{I6eWy~%w9T)oa|<; zy%h@b){pV6{gCD{md46SRR9t^QpO_+chNUA(_~>Un1i9|E5+nn9me|MoBS_RdwA=J z>1G8wa8}v%{d@9bTChFi97Sa&^50se%3+7xv@eq0HjuX3_~tRctMwhk^Hu5!NoTT( z0g8{70g_{naG(J7Im$9c9JNuxg~^jkGjXb229&d4t5)h^Os53{8W; z62Y`A*hZz>4-7(B=(qkJCL=njgf@!i7=695uEL!-4?V^X7NypB6Y-Uh9(R^#BzJ|o z7t_OnS%7PQO4)AD(Ym_(8?>)xC{}u6*o!MSzTQ64)~vd%n~-23cfvi)`K3oo@1Fhm zCtl35_YAynjFB0ZC?J_E)WCG^HOh3st?Jgs!7o`I^9=$1c_P+Da>06(17}dh)@{1Zml^~MW}MKsr%%JyXet)0BVNjQs6g+1Ce-q$6#mM zpjNt26PET=5TIx9l9#%Zc`rdSi5B?6pFfwx%A#M)1iB0-%Y<7)7mf9|#cZPeE#NB$ zo>O(lSZmEa&1WKAbNgm{-Mr0P&Y5_p1xFatpCG&aX(zY)ov@3-e-|ZqT5Z=#0Bcc*-N}h0ec^a{|EMW+R8DgWEufuFa{Im$r6xd;+fPWT2RZ)pscc&h96_S^qsV@T2$;~^E+uV@#}(0X1ILZ`Ey89* zHY{Q+X~}95c1TpF?2NF}4+B4gn{X}h`K>-imWswO;f>lA%;2z%iqCISPQuW>#@g)u zCsdvG2z*qoBDsxk)>Sj%2{{7^^OQ!rD{sOm4%NYtgPy59{-f)!vEF9hcz>rCXv}IZeY?B>H z`k*V#H0-P@(TYqujbgV4n_d=mRt2jqx;?{GJ>b47FFtB<5sEIkj&{4h9&;K3A+R+# zeKG)W&c}Axv``oQQLDQ*h;WVGI&6PFY+3UiykM=YFf0)odTmnb2jFUzY~SUiCXOV9 zpy z25ZCQHs~si6ROecHnrwwSnI_I6qUEkhL`+5U43O(-C7eauyLojySuv{Nd@A}_Gj z-vIk|N}}f#2grr3C_#W0W$(RE-t=&PAT}ASdYPW94{xECk~7BlmJ#HNrsR2R&gT5( zBN8tS!t#qN&bQ6gYG_f-W|}5$E=W2H2oS3Fl_fPtB4pPaQu!s&jn{82M-byD>mqxaKhi6EK3ci(^p1e zLG^J!79b>e`*MOK(+sJheTXbwVdgpFvLbaP8id-i!bam8w|<>6!Q_ONvbs&vaP8&%3Ohj-Xe6^F}c}#ry z)u)QYH&SZ(te7!v14m94mgN@~r!K6tKTI;GRb@pV$|kOwed}S%rRZ)N#E8+u8;@<1 zcJKo?9!9uDK<{G8A>LT}s|{52G)s^@+Nsb@iJzb^p+6B_!=a}ktb>z4_)a&ILt+4i z_s!Z^8O7axBScdu$ftvNkeu+U6cfoI&!TOl5>S1=WJltO%J0=hJAAWr+&&EF>G65YDcTeXyHm3wKc6^{R ze*)>DJw#G8zjVdMfQ$_L9j_K|lK}b`VEr>wgs#5uH^CK`hu{Ve^PoZViMb3omi1JO zoo2S$K>4^}U_tRJ8JS2=RTo2qm`5Z{t|w>4j)`B>jT1m(7M}?w5jFxoC zx+eBtgJUguXIm?3o##oy-#Olycl+r0ErKRbjPzTWROi{78RyuxhKPKGt;xoYFMMea z{aeIvCEcq*;Luet!ei_et>Mil1i6-V&TJUum^IR=I6dHK>h(cfgn4<#d|+;iU4!wI z9lY|ADvxjK?$MPQsC$TjOX5rrtMHgyv=0R?j zp2~xp0~u-+ukD!7)U-Q4pd2sjl#>q^zmb4RMIq#vdP~<~O`(m~AK7F;%BxF3O^HGE z)>9Xc`M{e$%v{M+o$bwj;H;irA}4csuh%iGFk?_}2)ORg(&XmHRch+okF|>PNM5~MHkKhjQ5IM@E z1$^=K^0*}YY~+9C@vd7EgH?98R4H`4dvSy$blqS&ikx*37?{0ZI7_6}m z!w8=#A}AnI0uJ1V!G)>O1gGu8(10k4;y6XI3AWj>95_C50U<}O%kmFD2qk-19M#wA zs;%!jfh%J)4J%*lF>B(*I{N)?LUpdN>FVO!p;MGD?Kf&a$)RyS?Ak&f=urEs4UcN% zV6PtpU8>>1>(jT`gAAd6UNB`=2z5x$LbNA;jH~C@r8A_dhSYL|XI?H_>k${Xoz&sH8ECnE~V?L{M1YDNCoR0z|crB$Mq_tF-#Zas|K!0eOUMv`@Fy>$X%Fxf@Y3`Pz zzVw&Rt1&Vda;yGmGN(jQ4L3inL?&r!7gJMM0}Ld#DrT#JX6y9T1+`t_f7QIWs6 z_R+dcf67qd-y$9l>W_yD_(AxrIA{~e46ne=$^I}oLKd(snBC4Wk$F0sn(BAA*4@%1 z81Qj+bKXdOcJvaXvGWjy1RgX4?;eT0tMM8O^Qb}QgR(~X^wrD9b=$D1>TJqlnt|H% zosMha))?8^qw-e9y9sz`k*S36UB6vnd@|1dg>v2?!Jd?gX6!1r&lk5N4F)y&J9F)0 z&2F-6Li9gx7aH=@l=qJ_-_6#&WnQn0G0O4VLh*3vvdYw!Wij3rZ$beL;Mb>#4edUe z@@-!vO=I25RIQe3EKMD#KK>lCSbVP94the|JgS@Nt8-P3RpotKh9vsBPD`acgmV3y zGve9rTff_tjPbpj2aeEB*!g;OZy&^|j#^L+`d9YPueL4t;G8d5%%4{6^}Z4NrPp5= z!=An34|0LGNTacn8Nwq5!7H(^cHFz&M8S?cx*9Du;n@{JdSs5wX&t<*yeJ;FHKa%y z+nO+~=aJR{&F=JLUW1EdezNz`sn~?!~Q~c z1dY)B`u*H#Ds!J9P`aI5(w9%uFJ^(ZT_j7n48rR0N}N8h)e>uXQW=gCpr+ohxy_3k%f^+gf!*wy#p zIpfBn!Y|*0LUqi^CM;xUCM0JZvQ3`LaO^z32x~@=9U0c47)I5Q_E_s!C;#b>s6OrZqt7_M7Cu9+`vPp7rFix2p5FjsDgGY+&~pj$nSnChGv z7t&mWfrBq$n4sgpm6tF=Ahe1?b1^E|w!!LSS%yd@`L2=ZZ$LBhnaLHhSC9iDJ$`Dc zYxO*lq}{Fh;XN!L@#3SFml;B@+3Rguv#_tsfvAPE8CaisBNo4#Kx;}RS1-_C95?#q z3Geb7pqSLy3{h-%AU>I&3cU%dAFS^DSe5LtRf#{5nk5SLDr{`S1^yqIi^~KT_Ciyw1?Lj>!1!q$ZAb) zd`k(Erk6Y6g}H^!2MNZQnFcmyaUXq9!Ak^NU&=Y8HEm0G3R}BUSW|l-;99Gvefb6( z7FZ3XN<1^M40B3r5CTZV@Q@aCIsEB8_!IwLfoYJuM%DPk2}AnNUl%qaoQ3!V=hRf% z8w;WUd-X_o*`8i$=o_f6l~=>C_H)FN6VK3rb0E4V%L5s|7!WvryZ_ci(-6`rh|?3r zPvwI)knRP=B{5$jL3s!P(55xy$Kdj<0$?qJD=qV4TQuW=cx-PJwG%O4dkkE+IQ{So zaM|;%AK4AX!t}<)e#mRfi#^x&R$89EJvA2dKHu8DfPgn4egUr5Niwl-)|Lw<_9m_m zXKYBz5QUmlL2^z$spB0>#iHjY@}u$dcMqI;;vfmT-d>QwK0Zd~salA{{d7aN4fnL^f*$Q4^8)=Y_B2P6FbF1 zR_y5bPYyCM#WCnr1w`Mga-Xi&n6%_SYoa7A>i4;42no95N!Ck7Dx;y_x!E#06{cLi zT0C^rzE$buzwc=$X*25haqWk)jxR+z-x1MfbY#35=7>kIBES6IzW6N>l&(FrQcwV? zYdiP`59HO(d5LEc{6j$mC!N98L-X`pIp$HVkHJW@QPq(Dgdz|sPjK9aJ;_9j~@9K9wG-@jUPA)z==5c`A_1nW1&)3c_Ut`v&oYE+i0j%M>A3T#A{mV0YeU zr;m;Eb?{8NV3~XC&%2!Tx#$lQBaL$k{w2W17&Zi%CZ+_OH_A@jsShnh?c}*pR>080loK?K_uy|Xu>G!RKC5?fw%!Y zc!GJ=yd}e_21Gb8>BL_8GN1N!(gXy2A&RW&lJ82b1D29Pd~B#2Wcy8DPe~>h)Axd= zIgnrrP9*SZL)|Ghuay^k)A?_0S*U=gz=CsC^2-DpxsKZxt z`GgWJ&A)s|)I+|HULKj|oU)R6wHAY}jLSJXAV;cMEPd!`@YzUy=oh*i!KckQ1cuRb z>Xy4MB|P8P74Ra*hPgTs578D;%mlSjs^k~t!v{K5UdATq!r}wF3dv?WKlxH^37hho zlAkm=C+A&!j0!VWjI$S3dryl~LoVdQr$MJ+J)!Csh&!m971@=wjMS{YNZ|-Vsk32T z%ih8WE31So!xytQ^ay=+{f?1VPK*M9*n-=YdW63spWz$x?qN*HKwFbd$~%Y* zVR#G^l@j>&fPeURnKKxak!f)G7hYcV*)6}j+A<}s7aC$xMD^VZU7tk>S()oQ_h}4O zw8gv(SE6;=-13A*xyoQuM&6{Xkf)Lr-=tK{XULCMTB3RSCUp>EbUWy7n}uadbpK-o zdA?E#Ct>jyE2xE|GjshL=*`I*myVDM-_!;=smdD!mnr&t%Qq=#*OM44sigx?J`P1k z8$pK8%jP*yv7KbK0p0zXqo`Zpb8gS|O0)%yuj?+EGxJ(=FBKS;220N&X@O=09}IRs z3keXQ!mqG@DyN!U*3RuRX}U`>lLB=L2ur(%ar1+3a<*)Ra_yAffNb7ZnE0?J2Q#Lv zt7k6V4i%;P@Tt6q=M9rm$itLiF&8N$M$$** zH(yd37GwZ6vdc+0v}Nn}XQXMuBlWkW=MjGYO6ZANx`&5d-wi@krcTu`=3Rlr?URV= zo$amHZ(<`&W-_ZMgXH1#Vx4`tg-uRft$vX#p*Hsw5h>%zZdy{HTM}y@S8OB`LTU%%*te-w&FIXbQqHvQ?}KtIs@00@V3r=1rN*d@XvF znxr1@KQX&%46>54f}io-a*LgnNnt!0Lo;@JBK#JlEiC@zv2pIL&aUm9X<|69t(EEN z<>V%Vbx(A!SumW>UORkqd1USG9^exYFeg_@>dq(B#nednj%41!o2Jbnhuw^%MPKag z!j$OkZ8g34dlXN}qeHef!K059cr(v72Lb2{(z9n6_@FCwiv~rJ!VOD$sA+*j`KJm= zj@#%8*}+pmcA;QTB8n?up>=b8U|wD1te!<+VfYWRoM-{TrWK3nf6x4SbWc!U@4p^`4;xulb$>Kf#s`$gdNK?9{rr`c!~74&%mkH#ZVshYvpu-Tk4s|Q_-UF z9@vYL(+%ew>WA=!&;f7*DS$?AGqu3~47I`6{A&0p40W>YEXf%dgfQYO8fLXe0s980 zl+|m@X_(@&G*5m*-t*`6UT}qIFn%CCrzGqvdAOq!9(R`I-Qg(}uTy7t6fr_iS>R02 z*wD2!5T}uc44?=N%8peTi#LvyE#8%+CD?_RgcM_GZO)1|7bi;PoM_FIuz4{Y{4AY4 z!xu_e0$y4~5s+DGwr3T@pVPrV1QvgVC&74&ODqdyMV8HAnDQnL^|bKyz({7`b1AVt zC;z`Qnspsif5>A#WgFMHenxhG89gS40;jlVRQQIq6dB}somZM4`@+LmSXm8l(dMn{`ql2HbS5Q=&|!@V0=sfO$Aj|1FwH6P1ETF?x?qzdw3UUl-sY2KatyG zn^WYg5ihg!b49w06Mob~TpI-!oomIU-8t>9b<><$~ z#at>Wybq|$yb}KhOL^;>d&a#>B1GD9%CUKnU7u|VQSi=t(tU-1U0#xyR=@hV@!cn# z&WY0dL0i8i-<>xijPiC14~r;{4RU8l*bckDikh5qJ~!my)4YmVV_k_SuIM-7nD6eM z^KLy4%Bm1(82aI;xO6?0gZE>df4&9bZD4$|BThA_zKOJ63z|F#{A~5DUG(jU#d`9# z>brmw$}%3E;0Yz=Ghx@w5Lx&79LEf#6Ye(DFyg> zOe;Lp43t(1LZFVDO;gLFC48mCMcQY*P!rUZVs6IJOb%M%M1pw9;5wxZuCP#pTD2jL zX?HG=QSz9JLX-Y^h#6BbE*IXbRtY!L&Q)d@kFJstkC3`t7c{+uG0rtz{m>_#oiq&< ze5tTbF#+^iM3#`bHU4-r+%Y9jK}!4$#58#G<_1hoHhd+kAw(X{%{W}7oi0mhN;?AP zEQD2pi=0m^o4lH20}(-%ngMWQU$Cs95i$Efn+!u(7Hlj#Q<4KCg_uz_h=go5H?T@M zhHNQe`X~xfbFDF81DdVYh-r6Z`m_jZ$t!GK)=r$nt5Y{@MJ{tBI@o9?4oPP^B7r%W z$gzn3S!J$p%IwN(d>uSiM$6t(l~puEdSB zM^QSiE6rO4Y_E~szYC6xt2q|~!Z%)NXxeGI9o=KIxbhu@Go6b!8NmC7BRHX7fsAjz z6+JQNP_IVN#P)e{DtXz4sVs~-muqvygw_PG$Og3M+{uRbnUcFdY&>>79ZG6L1q%Hb z7Cfe`FpGgUTVg{#ddA}b;xkQCE;+nYOu%mRDGL9TVKdI@47g)Go7X7~&Mr9F+o4`{ z-KcQY4(3}W0rckN2;mKvHd3(-e!;Il9e=_M-t78if0B|gUZ zgiI)bfb%rwsD3*R+`AfPJA@m?d##0;%mex$+gAh8ge+I37awpBh&DYk`CHe2-n;Yf zxT6kQ!?(8cgPq7(r0F;21Sg4+nj6r3OGfm^_bxZaOe*|!w*LM5Eo|P@B*;9q@tq!& z0)jUbddqMv;u-4Gv-yqurpNMlMpl#>+=Q?!!&spKU0 zz@yqgX&Z{*fZe0^PZJDd=9{uLuBrBfXrvpnG=e$EB<&$FuyLjYBB1Rq`TRj;`YwlP z59Y87EvwUsye$Y$mBb7XM3_6sUnQ%6u3I2_4-N)8iOIZIzE_|_ zV|}?)pve}G@h#`jjKNCR0MheEm{`g31{_NPt$4oRheRsEFGh+@jeuyFm2Sgd0X?{^ z?B)ZwEhV%k{BPHc;y^fcU)^ui=Y!xfECLQo1}HHKh1 zx0{S>Aq>nxx~Uk~Oo~-Pb^9YJ+3!gwoJU=fLLHS0mk$kzJcxT3g&-S6dKmqKUtId$ z;~KvgXo~OY(&T-w3kB%G!T`Rz%Pn&3>%y3vnRQ!fo-hSJqASk45M(~GpmqQi8$orA z&ydf)&WeqCi*gP}xrVD!tCkmX(%!Z?xW^@o&Fb9On|Q(z#1ncpwp`1Ho%DuR9{%`W zXM)=x32Ax}r;ROi03H;;3ymxICnrGge-pwRxwrrq=)YkGNdV^`*hCVb0zmqQ^fjzY zBd7)3C=H+l{XdFVtM^_gP|&b1&rhh|yLzy4{2~Wt*bB)p!#tCVb8aA_u1(o-o(B7I zWrEK;LSMw9+tOpG`_n@K8VgG1{L=O0k=AUW)kbg6#(Hw^9CXOmyRUTvl|cQ3shD#f zy+!tMyOgprO#BRfEwGU;+i)fuzI2w`x`!-a*Cx4Bl5IWl@=lfDu+U?kkIfxs0 zfW2W4Ba~+^lA{VV*)WDNqTp00km7fS`!dOMUGPR@&ep~qU8;@MK^8YcIxI2(QwS6C zcA*D*AVb*v;b>HfJRJMMF7TTro%H*69%Z(q3b%NLLiC-uG(}CxB=&anCU$Jg(<-zz z4z!&DE;IV*iWytpBaG^I>J*z#?jR=G-5CLS$ka!zGlTu!3Em*9JB2yS=>t%29oDYH z6cddmMTW+=3`&MsGOy3VALH$GfACR2jy3{&&XM(BeqQ5wYDFVh-H|GROm+%`1qssx zk4;n%tl&vUOiXslg9V8bzVx(yWG<>f8(DJa;0JKqAS69u>>x~BH$g}LKnA^PJBe5_ z#9dfGut14u(%LviHq1b_-{Bu|G0uQSYIg}k;zD8du10Et!Q1T@LI2Qya`#Sv>{%Df{@kw@~OU{-d_ zmOb4(la3cH;VJNOwLxP>`DAf{qsJYJUb2}{J!=v8HEY|#Z8orBJ_d#SewFmn({l9t z5;MgK{l)zd-J`{HKy7Z0y@#=mzrXJg-=oFlPHgk!GKTwY_EHL86{wAUT;C;d3>2VK z(D7H%1aPw)fcZ}v9LfRa@P21UuMvRde=zvk2r&2??KTFy{)3{L0Fr*A`6d9CfB2BW zlO_O?-^iH>fcI}i&h)=Xwkd%7j|}2Jsh8VBM+Ckx1ql6te=E~61Bm~P)SCe${zmZ4 z0V02p-+A2ZTsOi1_B99a{lUrqF=DhDBFS$91!aH<14Zz%{%<*5WZZ@XIrq0gBe@LPJ)#cw2{8zcd|9FW94z&7Lr+!QS zF3N!h4HbZszU6pZ8-bZ7 zP@17SS#{P*4wG3$V`-%9h#tr=AlSnok5Xg+zl)Qblh^yf+Q5^#k4vqK zL8P*6?Ec~6q!!@$v!QuQPQV0(i`X_mrQHfj3U&nSL$@natN;_6Tt{F|RmMZOqJ~XD z!PJ3+LYvcWelzI41IxEvMJSF*pX@l;o5Op8Osd*91Y=dz z0Z5>~Ct};f=Dn=tq!?kMNHCh{a32Q)pmZl|5_T`NIDd-9WI!rONtog_R2Nk#V;;hR zWk&TOp;=(I301oS?pBi*;}A8OQF!0x++KV zEPszlpZRz}W@6p3MB5hz|Ag703dN1uQwOvgU9N#b~QuO9#fbI=z9;DTAB$YV@$ z#vT}BBvcOY*eddTROTUfnM;GUZPihYrx$7=Uj0+|y`^qIsO{Gk*8O~G*MSAH&>v{q zztDP3M72caZv6gpb=AmOCH|qq_5SiqnEIcrX}|X=c&i}LRUj|UnB75p033st`1PBr z)#LWI6QE8swgm&A4xo@wk8IM|V$IjR)yCl3+%58aD94W7+^=-q8*Gm~nN3un`id!7 zV81Su&_$YarR;1)rK?Yl!`xyVoF#bAr{@ZilGI zTdYM}_tmNOBVnkV$}*|80of}Si`wGd(>?Tm65Rf3O(@{hvreuuV^|&|W57M!b~pP0 zZZB_#_WJZFWD$jS<%Fi3F?35O9NmLRlnSM?Y9Vnt5*HD?bU=hH0ak&~`7{3J^ay}YH2 zy^DO>B@yZ$2ihBQbQ)RdbkhzHgQ84_e(7(Ok2yVPlFoBuxIn>*c@+Mu`1463!t47#baRC_r2_mqQsd-HRh7|TBH z$euLaMG^7q0{Ba3!^Q)xEKK*7#yZ|Ui`swiGe6E9;k7-;sYOm0vzB)l33q{!Z-4m_ zg&=*x_Cbzn3*_l4QWP-&aY&2<1BXFNZi)mhh?aqDY}cEm@b=__1GP;~p)$xTARXvu zB%@=A%9^H*h2V93!_TcH<}5(7(T7LfYUh~zT98u=15~23N{NQouKzL$xxPvp-Fm`l zif%2SA2+l8h>Kh3YwYXm`<`1s4r|8*-f(@(;AzKQvvu!}yM@;~!b7ed+s%V8k7r{}T}-WLdZ?FMb z0`{nhWqxws7GUe>HJ=DJUa8`3Rj}*ES~qJ|He2qkCgv)>k#;d{;hj%92wg=o>5roD zub3D7|2P`uA45a@$I(fCGK~Mrr;RN#&yfE^zqM*i{|BC`LBhcON52&6v5E1ZKtP|r z(-8N7(UCdmJS<#nZB$htfk6L1ns1~ut^kGnueiX8hK)RF(~RQ(?twOMg#v7dA^qg# z8U5YY0-qfy#f#O=_=8j?s#xZ3;RCJ%UtLd>HZLSi*D0;V80qseeVv#{k&yVObcLYK zl+N5Ox7Slb3QcJgZEej3WG(P-!5Z3`oETFuBxLJIx+VK~3IRw%q&sU|4#h z2qEtn3-Yc+H4}sgP9sebp#%U60+Y%B@{`3EUPLL36nI9MXTUs@Ok>s{11i+uN=VSSI&KL6XxJv-xc+y`DBOwDq zOP7;jNY&^^KDvf03Y(VR*C+sVQbkgdapD8147A(NJ=u%plbnCTQ_D3dcZ~05j%- zU2i1;0p#RtC^IrMVU+?K5o?VyLR`V=wW%9h(Shv`);p#(z%wb0vG1JE`;qh zv>u5Zg0w^{Y$9FzgDx##*m;e&u7P{o?Jf_JMmU_5dNn=}suBQjlm<}fp4)F)9)rCc zZ4)E)la_NQM)tf8639-%v2fq(R3$2_>^WTpq(XO{odDTu-?`WoAs*#5(dx8NSSF*R z1e0S=b~naDj59h7jQPXqrPnC83ufn9InmD&rRc&yh9Z3Cl^=s6fBPq2Tn_~2hk8&7 z$ju^>XOsDr;vN9=89mQuIU$&Gkpdz^Kj@g*A{n$+@_4XAPykr$xeWvfDb^M12}V#G z#Nk>L@P!t9FFPKc^7wBf_#Sxz(Q?gr=fJn>8y(1Y5#mZDW4YZ>Hg==aTeBW?-qXo?!`233w6uhLqZUqg0mz}fVK_N$6=!%9mTzGU|Kur;9? z)NNQQbO~T4Tx;ErumtHT#?nI@B?&TSuAU`?+9xot&nx3{O>biz>#C%B3L2Wbgf*&@ zv^w*z*ag486r64eGzASOWGYI>GF2w2&(o28`)JR#^S`Hxkz5ju=KWdJ`*CSq>o~I8 z+o+*99d7aTM2M_DW}*8yCkx_n+zo`Z#(qknSQc>PaP+S5!s9Bt>2jiEkZPUW_NeC_ z6u^$a`IL1S`0V$D^;vNxW+r528&i$l%Eq!f)bU*lTl#j5<7;(b zl?xEcr5I;ycKrzA>#A#inaU=ut?9`&*I)S{r>L*)lWc8P!Qexsu&Ex&@1qBg2(9_) zC3AF9UeDY+#i0~~rQ;xbr$50c-z$CJoGafj!LPRwc2uak3&>vowZ&;;-MkdOyM$|? zI_tP4RvWbT>P($wbdX}aC+jdxKU4W+s|*Fh9ps zte&lCw)5uZ=-G{)QmD3#Np3{qglE6ji!<&38!X?tr1a{XI>?{r$z4DB$(Xj`9}wSO zI(iz#j@4sl(>wtZPq8I-fYAaOc>_Gn!ths{+MmnI*&9_(@=15key=V@k*Q!`=VywQ zo==v)7{0sLbK8Qtf*W3<(nqbB3_=b6e!VONDo%+G+sh32f@=o!elgIKLbSkX8~(p z?12pdn4Q$hXrPVFNVq;*lzJ=NB-&PLE{$MJ+&8J~)e78_#&=chzZAu;Zp)n-*W;Yv z++;-77=R|%clb^-Ac%F=_RBc*x6fiLW$VZwgDyX5AS9yeBtv62(S$a&x5S-UzFVBX-Lf{^<}Pg= zC9^<85gFzwh=dZTBmqO#C@VADm`aJJc_i9mc8FEB5!o-FW*pg)1$g9@;d{L$2K9%_ zdNR@Ja}Sz)hMN$46C#QJ9qAm({U*&i5bJe14nKy_HRmyKJ?&%XQv7xDLj6vHH)?ZE z3EllaQA@VJBQ-~2kk12XjdKLLl_?Ix2YV^%0_o8o?O08_ya7v}=NEaEtTdu>G{;Ip z^WCrK15@%V>{qn?4XZ%zZ9$d6sEH%-B0`L5z|w68FPr=5h6HZwHpiD_1GKq_eyM0L zTlTT>d7M)uSj32IxrkFFPNCEj#^g;6sJaD4nq&r;=YQ946mhOs*CD`RdL?$38LRyZ zbk<4Q67C>EL;>}mQpF|8O|@*F!1%UMr>O~p?NP3Tf0qNTnCn!i+t+mE6NMQd($vJc zsZK#)>?z}&Nh6gC+q->jvjwL!9MDX-Ok1LvhpEF9G$=H{OKf(9e#a(!`%}>@+T@~83f4KwOs!F_)C4n5YO>066r0B zbj(Fbns`FP9Iq#H{2=-eW{nnSfHEptcp!T0^htDifa{dGKtEZJXa35XVvy`V*z0_y z&-I&f3HAs5MxI%=zU5Ddw^-W9@4J?dT!vs{`EF=MieTlPVlbQS^Eljt%j`%v@ zPunErMQG;twpR+Ao{I|T*c6IC??csbRjrPMVCnkCXv$;A*u^d*$Y4si{wJXVgp|}h zHzmJ%%a@hi_)H1%f^!oRMZ0$&(3lXb-^jDpc{YfXLHWr(8fo&wg(uQGAYUm_kA;1Rkl5nw!$6@RwQ z<>~?vZ$#woifl3#KE|C1KZxo7W`9-Xgzxzyb$V^UdQsLQ!%E~uvX2>sr_>@+q*fz8 z9bkr%#@{R9rSSP%K#(a|n2@#pMdtH!baPuy8u3vAGy?}}Y08Y)&3?lQ-kV2lqZ5|2 zg|1!)?28Lr2Bg+fpJw4ngiW`AQ2(;ZiI3xE|GG;1*Tj0e*s0atC`BZMDeG{jDdJ+T zATyipsqm;23|(66#E`azSuQO}&N}5N;W~Uk1BM*5sEviVm;h9&y&l)l@K~@Rj$UN$ z1Y&Cgg8XDzy@y1c7z-|QJqdCa8#HgPW@$j>@~=CWN^AU9>IsES7#eqq8oNm@3znC^ zOIx32mE5CytQ5_>9~2rK1brjUMJq~4JWmiRpe~~_b2f%4E3nJXw_1Q)l;Ezd2g>~TPww#_d_kFKF}0_LM$+`<<~@2hU1 zyO##);Wu$-5ViJnwS0h0&|Y}lFE3TNtk1!^D^466PW9#dYQDplXL0f6@olzqf}b3K zjHL7tVNvhbHS4{*2axb%U7ZJ~!3};(rB!J?8qHQ;OkPfj|GY+-$t5<1KgicdytSxydkBZd2AUvd*(>9cD zKpx?*jK7isbc2pQ5$jO=6L1u{vu(}*C?1T8ShgEtD@Oae`~%FAnv;Lvx;%cKpR!tS zrf0UN^bDAF`mUzQtjVdrR-a1Kt4eieR*;)4N1RzTzcyvfHLCPS7zA_Z#UN2v5Vy;B z;d8u|SR{eZ>9%6^V^<)Ezu|pD;kE&A#_*B1Rt@hfr?MxY!1MOuj!MMk4!4;A`W8}F z9!}Bi>Cv+!%lOp`;3HTRopi>kt}%qZ5%8Id1gV08qB)su7>X!Zk%Er~)8txbM$K*> z(H1;Vn30cO`LP9lzOZt{XTGl*h)|2*5|1W7dv6DbqpuUnL9Uo3c=^h;7x*nr-d{^X zabV{Ri#XM@oqWkPh!qc{p^ra+$Zhrgsy{zH;7{^SuOG@v=UcDI=XA&xO7!N}h#(4S5=E0s{ zU3|T--(Py?uL+5Gz2+w|wrz@j_fFV7H0W!dyx?4R;k)*zZ8{IIQ>CYXQOO`^e$d&F zJP23#K4EZX(;o72@?Aq1%z%cHfGd%9OxoFu>{zBQ7c4}z*`wW1FeMh+PSKVQm%T2O zRr#Wv%3g=SC|9{6cr3_;V%>I1-b0TX?qeQQ3yA>pMzO&^nZ7_$8W>z2MFxCIi4MD{ zR4QN%5WVDt3EotAQjP2Y)vH|l_+fX~74&pLn^^DU*hk` z1D?6hk7xAvsiI#*2L0|A3?l<}uiN-wABbzIb$dfIAaz&3Y~l3?Tw%5tuXGGot%ec6 z)RrvH(l`38s*ud8>A$K}t-b+3jkN*mD1Z$%w67X{!8QR#FrEXpHM__~V*XqfV*bj&yD6R!k+jo6$i} z=FI7`5noc2C6m;iF(H2GevFR?z52B~;e?D2jZ1`h$DufEOx7FCN)+c8b|g;7liD`* z#iA4GLT5+j*O6lae5`&qbF=J{iVp<-cDl`br3d|$m?sYme*eGy1kL+-70oTE(L0TPZBPE*sR7e7R&Db%BPNv`SwY0O3{U?!X;M<~NL z{Gz#DvNXp1Qsf3kAuquQy$ z6g##ej4DlmTUeq#*E;FMOuU~9b$Tn@9m+GAJ4pw|u(pFfS|VPfOgn)xO{+UFeQ^9n zhFo@@#3jhVW=p17-}|vZtvTI3FKIg+9hf8OIh`3`BKCm!)gW=)c%}SVy>DztWlH*y z>*G)Fz~LZv*|dY_QNTLutd_~+$rKal);;e)Hxoyv)13k~e`>;&Gj^bXFl}OA1^Pps z#NYf0gLHm`2i%eB8k=>8E_egs|46e;O*N7e?XX5X(j(c>0vP87w z(sd@Pe%CrD6mQJxd(-P)c>LbY*PD-m)AG!reU$tRYuHH{$YJsIZ76cX!rzOHcopCP zYBpL8k?w)W2LMRNK?|^^;@_t5%0dQHLxVF;IhHh3 z#)Tw@CZ!~FF7MCz=IV< zy3&H|u{CNoR7rW8BW%-b)Z>Yr2t~O)Id~H}Fzv4_NOuaZz>kddS7q!@GZD%HWOyUQ z6ZuP}$t{)7=rJ6Dp=Mv~0s}(#18M?11PN89OO{I#eZCQZG|G}k9<9-n1rif*-JpcLc6ip}2fNAx znTg-DWvn)lGhvi@N7{nWwi!(=SsLr1(m#z?L6M&MD!mSFSubNt;ZW=_Upg-NX0DB3&L#I$V4cwKG2$JwJM*E7b z+4gI9>CO|wI`%<%_&r>>46f~B2trxfEDNs>}DTKn{h2h zGbXKp_}g-jkfm>54c(kNw{&Vv2J~tKGjS%pH5WFne6ir7&%mJ^uD}zcHBwS5hlj0$ zl;kRMWT^&$&kKe`4?599P&pL9CRzQGQG3yDJ*YY3CZ19=B%D-ZA(c==Q7i#aN8zPv zXx?x|uVHI8hEkUfZ-i18$?Pb6kkNgi2e#JdVUk)r_jNWRv~`!+iyTgG&(zo{S3bdv zaHtnHIL1+EPc;@pp)RkSoKbxKw#e4x43^eCCSSCdhtgR(m9PI&SQ_Xue5#T4oe8wF za-_B}_>r{NUuYhcOhCj+KKTF~$*nTHKFfNeFQ3hY`Y9JjHiPIf*Wm~bw5d-LI$pv~ zJ!#6?Q>+TUHutM!4cq{I|MMY!el|5X>^9jDd{@*FXb?z7YwRzYb6jZujw;Wh{mvwy z7d4zkY9^9NfRZ#-{&m*sE}>g!CpxBN(pinaJe=sv?QF(T9I>3{5he_1;#}lJ+#B{Q z3`hR(jU6~@tbVJvo}v#jG8%QNG)bV>^of|EkDXpVL9cuoyFWyQ>vfTY#Q7HaxqYp} zFxD60IF!M@Qhe@Ersy*iyPvzOigkG1M4suyWme>pmf-jlcqKW}laZQJk6Ym*`em_O zCM{=;Ll$iPPBE#C%g+ONAS*pv1${-R(`9n!C?>)yvdvD#lld<2%R5UVf`ECrJ*8^m&+Gz5FB^DLmpYSWNZmxIylC5`!8Y zr15JP-on*dJlGNt<1Lf%*d;dGJy;v0>_4|uMR-{PDEnzG}bx#4cmwo*fiTow|20P3Z%W^7JGG&O9R><2nzQHzf0A zCQtVzTrngvhUm8k&bWkB!HG5}MDG8_!onmQVgmC>U*)>CgOEa%rMrXw=v0Oz(QzWX zwn}XDl4N}OVj2ji5KE&|H9IqU1p~LAa^A9f^Rr|9`ICzrAG$+8-KtWb zg_39wrmhq)3QTQ5=-Ec;(Y9B$QAD2+4K0VR zP@#{FvMpSU8hg|L&aJ&&LhP?r08BxQ7(rCgEL^!PXe$(ZC&|H3XcP#3$Va2} zR9$ldVLV#=)CE{K(~W~ZPV-WO%OnfaEy57Bwh(C}A;gKcx@lHOBJ3!>pQ^mtB?q-g zgg8n23kan6^7|om9j~9E!j1WD15+_UPe`+IkT%McUg>2YBj<{Z~9V>hve?9fh2K&3n5vMZz?W!8Gr-p?$ z+`I$TSDD$fKM&o1s|9huqt{%`pz`y>> zPW{g^sCi+(!GZKs(;HX@hDN(9o^;%?vB)@k1-g<{SBD1pG7I(MtVb?8-Fq*AWc{y; z8k+HS^kiR4_x-jPGwQ23S%mpTUNa%o*~szI!<8eqa`9yHLpHnaWh+u(pCp%@gM8e4u_qDO@ zdF}N?Lk5r)r}qYOd@@d|kT1f}jC_KXow!dcp|9;=L^JNtz?Ff+pMx_~y0`4#ol2TL zBt2_T!p?>kF^9)8?(O`wPGakWc@O?> z&IT)jfrI9z48PA}34=i$!xk|Pl9}9J{7YLZC6b;77EC2%GaJg5rR#4|Eg}1v#8R|w$Ig{}Iyu_N6$cY5axr6$3FZAkxg*R>LS zO$5$JSENW91a}WCgOG_jjWkpR$@k?-J!!P?Uy>`E4}m{%iff?LH&FRC|wb;&I~5}-)% zGqIhzuCg~q^f&8C{a^_hUJb)@g?&KEJUQnZp&*^cDeCIvDpJlb%~GTgM+!C}QyqKt zy1uH`M`sg4MmAK9EcNxOClQ0)Spx7OGnQiUKrQAmiP1uYJ-jfL&|*~6E1%#7T!|>o zjL>_kVqK64D3hX|!)_`_ndVB);PIm42+F=a*&rl^FWEy#c7}P6W*pqaSX)5wENY6* zA0bb$fQo8Z>;WOCgU4gGB-& zzf=Z1$&L%R`;kmmNmVT>knO(tM_IZ}-ldOOcw^mH9NS#Hf<6(6rX;!^VR?E+>^?Q3 z0XpyK`_TO%rh}ias-NJ1r&55*m_&MIt*+xJ=fx`UC?BaZ1zzDH?ETFj5_P7L;XVSq z2(U=7V~)t*pXF1Esq*y+M9K=que`#t%Jr)v+_bCn4T=E^%BWz+ourJ(g&L@qktM4V ze`zk5_(m0q*X%Ik@~fa4fvaNZUk^&yh;xg?`Xy=bX+*$Rh!u}Gw4(vRtfeA}wQ<R{z!T??0Qu;cm0ZwD>?*nr-uye*0 zxoM1$@3^g8z;q6_K-m0Y@r=17NJT^}(-E@BLLnkT3XX=aB3n9-+IeH*@@Xn*8|ttptGOS;m%OD>shd{9mjJ((U=07>sUpIJ@Vf&Jo8ke4Vq>8CuJ!^9fz2 ztqrw|y|>Lb#o3H>El4ohiY@p%*6% zxsS~w^FMx7>Q}h|S=ZVyj?A79f!I&TCh+evmmRt!GFffnemxi~xMI?l7njm^e-01F z9+L9pWAiw9v5mw0nl6xdi_C^E=S-U}e6|cerU3BEkl;N4-d7~Jb^T||z%k#9bg4P% z&7e!qwrg^4mzBHEB!qTUz>k+W!w1(7-Sr>{6g7ce^;)h^ukeDo`w~3t`HtuWcjcYk z6&@h!;U)O%I@8x95cf(ou8udmHHgpHI_Rn3YOEjAhKstb{==AiAXOY5vdD~PpKR$! zcHs{c&MlFRvNkA|pW^mjyxL-``ny(m~e|W(@%+vls5Ii{}$!raGC!Jut3NgJ`G(GB2yo&su2T0fzSRd z4U-XPQNO3h!ATJ%fqTXM+j21EaAh+nJ4QP2#X;G zlyH}ZZQKD1!gsE|AsA%9;`RJiH+rny;07)i;VVcWJOmZHBfA+g_v*A8^=|J&bWSln z$(pn)L7yJB_wdXl&x40jDf{G6pyNrj&Wap^C8l{uQ>@`xGi6(cv6OlLG={q7U)1xB0SKp+>lf!Y)(<`bfL?5L*|W&Y=q-jCy#E13TrX z9ycH(lFT$r4TU%4YnOU5V@dStpRd2Xexzs+C`#tG9D(EpSey@6qA=I~wExN_`vo$s zOpY&ii#QSq0w%~}%7HH0B)3lp5a9bVYmcC4NQK89XJ!;|L+#VoR9oj@D4<=PUdf=I zZ9MO9K%dK6M_?FVhp9o_VcZ%d{u5c3BMyksDRClRs3C>(d0Q0SS1eu>XFy2gX{6)b z9yS(PVoG%ce-ujthuP{ES*bB(AIF@_MB>=kEE3xTEeg*Rrp%+{%jft_CvYxg@AyyD z=dP68CWp@!cCa~Mk1ATkpZ--;r&uwqzar7qu5g7~ylyhe_2}8a1|EZRM)G7+Yyz+a zSF+3Hr_?3b#<&!E+K48cIf<1CP!SwN6FL=3=Qi;wKD z^FK48oP`7q3v=w-zP`vKZkaWpWepg=%)G)SQ(JDKRTtTENX&zN4k{KS9(EJqxHAkw zmh#j-|D*kj5;uUqqW;G5P6Lvshzu|fvr%rjyN5z>#A3xP=;-Z}3)&RSQt@`?L?G-p zWa5VXLH-c4=e{_%Z8rb&k4pRP4HYj!3dz%kE1>#&5yb$7adD2~6IHK3f9)%g>jD%v7jv#rtHuISl- z`mUut^>yE{rq%e~6rzWzC!@|odpgnL*b>8zyg$emp>%oV&<0*(HaS@r@Hj3aGJ(4%((VGbFWabkC9 z59E|{*0jx>Q|qd{CtEGFEFW5B)^*<;Z|CkAG>k3wV%1wKC~-Xtop zpXZE71_DHGzj*i}Wncb_0koL{A(N7OtuTPHArL!yH6u@t!4hC}{Pz$iaaL9+43yEU ziG61^u7FK@4|i8$@bZ$N+EBu}MQIQ>^Hxrj`->_>A?OV|Pf60baHva8cF(FvDDgc- z0tF!t4J5*tpO<1WMenC)N9G;V7EE>(6zd9d@#=c3(7`_D=1;VT2NGUSvmM;Fw?Z)p zGp*_<_MRycK4k@RY3 zWI6aONhurjip@J!&YbG7Z4aKEvm!H zMtPTnIK`xF6U^v%zahZZ%SoOa_Yr+fBFxd**Hxo8oCebq9niQ;NGB zFjL$1;|eep?TwX*y)+|HFI9uu?-*aE{(&CioZf-v7lZdiBkzR~t;4HvW5Q;VnqlOM zQ~&#YLDJWThX(WG#~tFZdwQi3Fjb7-+qTwS+k^k&fkvF$`|=IooB!!{zy4YO*?VbC zDH}hW)q^3iPL~(9Wk6Xyy`u;3a9=!K;CORZXaaadtUO7WM#vt@=ec8dz49k!&@ZnP-i8BUrmPOsW`4i&>+Y6^ zDg&N_Tpld_a>I=~=x9U5W)a^%pH>D}uD1=uxb6n}eV4P+>zSvmaxVlm{m$Xu!T;-& zU#9<$?-F|Rfs&Fit5!HmVz=JEyzd|X96JbHFe;mEz}hT)Nmqq%Be!`3a?jC_6%6Jm z%QXGToO^dd$X-!kl)9o)j;jQP=-CGFG|WxV-}VtSG4u8l2#)A~E)_iFteZ!@{X*Vw z4jA1?s_RY&=c#_8-k>H9Zgw5Mwt&r0b6cp$$O$%LonYNssd{+M>`{B9=ic#B=jhYiWX7Z}9){%jq{kyHpaecYJGhO`dOm3`%X1VlCJAW+SPi3+j~nj);sj zJ^4mUo$!Dhtg=SCIrV!~Llg&u`+z!|Wm4tj8xAqf)_GO?2VN?E@>0kLEoOhvM^IyH z;dx#sL8l9Ob=QeO@XWCjXP?504vA8Jf$h#kjR!BI_$)Uy7*-#{a436kW*f*?2U=0P zUJmlA@@M7V*wJ{bC>7^d^Z&t&^X~vtc1N9!T!z~#vB9hraWl{pu#f@B7aEYF!w7uh z#g!uTI6|On63XlL5IQuy8&02^#^WoGZgCxDuJbVgCo)lB0BzvOlObf&=mxH-=S0X% z$gr}m97M5g%Mh-IunVElSQj_x*%0z?_6Bj3hWYQc)Wb852WfCa_Lq~ul&Ssg6&PIY z4-Xin6@Z*Q+tNjH(_>G99})(XA1rd|J3$e|bx-g`dS*zjy}nfa!s_U#)>*vb7zrb} z9!zW7s%-zeo)rLcHjiGOQ)!6K=?$utP6YGdG?V){P(^`dnC$$Pjv@|llZiB5DW!u7 zqq@n3$Ia}9d%uB4UcTcd_CryYz2ser-sfwH_+f18LkRxqb_goCJ23?~1Oa;g{=Y8J zqQ;K(1_OfMj=rG^1?{9X@{d%D$fY67u-@?L28LjBipF9>OtH(w@b`~M8uA)qY}zsAmhVr1gUJUSX+O6dDe*-Nf%b+z7mBJ# zf(P}wFM6X@Na=!+Ae;Px4`bW{%ARv4svjuF{Wu^EXV3my4XnSHa8~_>bPYIGo4Cyw zLO#gn^`J4vySW`ykrS!#Ek7I$PK4yw98FTfFcye>Qd0FWHZ@qk`SKBB4~aV8U06r7 z_fL7{uZr=2@fqlt6VRmbUV-SaZ!n{Mug~T5sicQtUjW)nrQLm$<5G;P72YF5z5tqW z)9_|F?1&OOXYr2#(;=PfLrUWLpM5cA^Tv~J4s!-|K4rj=@p9ub#3Tt$*58<-!(Z{g z*~uh^+N+iFW5X_l3OJ>NSM!AXA?~lS495d3KAxd{Kz4sDYCUE17KZgyN(mL_s?K07 z36%5k3>mM{#W8~W%3^t(v$>K9bTUh{^EExv2o~2vbINC34FE+)^a)O2lOQ*0?E%GJrNZ2FghZV57D4hU(6UolxAHSVJzXjjsO^Y7*DLjh?Tu9 z5z744L~`J3=BuSGAw%+mzo9HuU~CRhxM*xuI^ZEWytr&YMjES{qmxXFEp82UVhP-2 z;Rn}ue-oGCR^pzAkO$w2ZKx~sb7p6_A|`*6QF4z1P#HBNx#!$eD8xv;9MYd5qphp8 zF?TYdB2q~zz_zMp#{?fbx(kTxFnX_Pn`t|LB+WI} zm>^UcXxT}Yq+%Lf9EjzN?M&Hb;>fh(!dNZB!JGt*A|)Y3n!#9zIW-!&L0T^@c3dJu ztIm|E(6DIZhkcTWDK~di#_5}zN?hNWV%!-Op;?DqW$ zqy%X_npCJ0mD{)9Z3tMbuf?^vI24@?@h)MIgSFAPO*>YS2@NDMS}TRfI|}{PFU!L=gDJ&4p-#^o!dH z9J|`1F0Sws(vUA1KZzYYH+xvORv`d90pR6jdrNvPSKinIUhnBC( z6pJbrZlwWHt4*8?OgiluFE&7e`r!2Hx6gL}jy$#aC(P~xo0R{#^o!02+j*jzLdXYI zKZW@HR!{IpT}H%IfPQp(CNMw874WUwJ>C`D?QEC$MpqKmjral|Osbd}K6uuEQUo0K z0U?m6cZ{H%U34zQREn7oVVOJ3a>dP8THf0Gp=q(2<#i!U+iD#3p%lPM70)g~Nl5r_ zSrucE!a#K}?LtMvDccwP1M_b{}H%Q+Qz(PrwR}8^12l!$5us zM;9<&wipTvW1W{^6^2az0j#@lJ-zl_6oKWPWwtfU!cFj$0tGY~LF&ORM2;fO*7<fq10Ex|q!i1kqkef~J0Iidg8zrBb84(4T(oU$+qR94ZFFqg zW+y9l(y?vZwr$&X(&5S8=e*qe57tAis+#qUIcB7xRlhCdEmgGljks&ML5hSJ(oC;+ zR$zl7R_9vGsaQITvG}#!9wiURM4AOQ^3)q}ugpOW#H}L$0Uss}WVm%8dZ>Tf98O}j zPqsWr8aQ;++w9pPz{d0s0`jjK8Zs5*aA0rxrTNp1gp}=1y8%}#@QoCLJtEuXXj=D! zRwx8k8goBBzsVrO0;m94YQf!!GL{QNmkWIUt*eB<$OL;hjjwZ4ol+qo^BVvnF5TprFLt=2kxl*&SExf>vbQ^M*;E}Uj>b~A_6QLRp_ zfKLBHkXyoBfeyct?Gb0?+Qb=8X&4w<^k(+&zjhA*Wct(~$}$ z_6>NbvRPd8kB-5ni)9?!RrwJC0$z-eLW z;X!CX7PamB;9qHvy^8|SKr;C+TcL+g;yYewYI+zYY0w5%*CuqzIqXjijq9t-{9Xp<&42%x=g#Z{4sW)lIeYhPJ#IcwFe?*(6P_U7Vv68> zd|)l}MDyMV=Y5Ht!Fu22ll!k4or>Ln>LU<`q*M*gUcCv3DB4Tex+k@0oR4T{iR-~z z7EP4=-H{pag5Wz_V%sXw<#%&;$>^{G2E0P`lD?-<4sZ4F>o=uZZIM>@^b+i07;v}( zlHW$Q*aKm)oEM@>=(VM3am5QCYI+g^i?>WyT6td0F9*)PR`nbf*SZUCpe8{bu5qF_ zb~e2Hmuzcnq3j}OK1H3{o2s_?Z1+k@x8aCltZF|I|C22iHD>G=n9#a!YD%NnY*B)T z9p`_Fhp3ng3tSF@RQD*H8gdC#j+_Y$v(O;-842986aY4v2b-h@n>42W9-S_ZoluRU zApP~KSK5tl#GstuoqFPrj43NTXv}t=Qk2_0a+9U2-+F&qG?za2S7YkqiZI-xGf6s; zZp0m1O-`D8J8IJ!g8+#~Q?pN`vE&t+60feKFV`N;K>&p2d|C;5w=E*oEe!8}SV~BV z?`)1-^Q?&HiYn!c%$rP*G4*uUVuAPb>ulR(q1tHyAV@J#;?lou6Nc?^UxMk}ym`yu zvC83<5)+W;@BzW0vBnF-og%pwq5#O_=R z#*l|NMgYsk0(C89UsOI)_eZ7c=IU!$dJ{0C1=F=vbZK&(MR)Q+<}Wu^&Y?5_W46tP zWvcc>g&<_ z#Volog#MN-bm_=+jB)Yz;~((<#$=(ND1kO|^AAlta89^ksE(Xmo74>_QCGZ08(SRU znrL9gGwk%Mz3zs;!Wc3z+sbm9wDw=D$R*|X_q?})0C&Ws>!%iHJ;us0=eSJSQ^*fi zrds9lgU#WRY-<#_i8e~xUHw4IZcg3yh$CitHk>ADvq5vmQ?rm4gTY6~^r?!w77b9{o%jpj$nL~PJeB}re$v|s zm7{l_ta@GA7oj%8Dx>dom$hjBCkF|7O1pDaA<_27=&%E#Bf$!QS#qTm@JkxnHLK|6 zVn?6?!&8>sLDH9x^7`6))rL99V}ag-xu?Ky(`}b>nE2zSvZwyz*=L{#*lm#PWC2<~ zS63dH8Ta{xZ!%ytEN;Ob05q@_`ucqL2^~kD^mYF>f3{#gl^Atvb9Ayco z?V>?yj6{Zf*BqxLe2C@BoPk9;NhMp(uI6a1=OPEP6 zP`+XFoo!+|+!gyhMI%K>k^Kqsu}4G~f*hUWJpGc3@4Q|W>YN4hJ=m8M)&iGnc0_mf zWrQB%)CuqSfZ-U|Lwr{!Ch*Un$rS^-$s?}85#2$~+bF>{JjmBp*jI>bWTKRVTLSmH z?cRqntQXAxMv6%d!0-QL3g49)A{7HkARfyMa{6{rjXAeof^~Qce?Iu1NP+SDKanB^ z^S_b8f;!n|Oe~adu#P<5{bg&*-TjZJtB!>+CDU>ih;QlW zoPYrd^7xI9hy<5qa)69f_1ZauFUNDD&K4^lrjD;GWG`~3XHlCsKckT_d&xtlId+13 z-4c4Fkoh&4p3+N=ZM7*Phde(7e3(|;P5{JVFoMd2BH|a~9CeWQPH@|kh&*LR-L40|CCNR+Ix7717@xB%_0>dfb^b`MK> zLn6|Wmnf>STfvM5i=rS!+*|mzl6<3M_*ULFG4+C(y^1=mG1qz8-8c}Gm&N+Dfop{- z=?D5C`L2Y?u??>@p}0N-dkyG})Mh-r0BIHROMl!*7;aL=H#yjStz~9}5^FY;+=fI% zkJI1%17c-~sc{Oo>;MbdLJ^=QndN7&j(DntkZ38gS^Np8fLDQ1*SXTLCQQ0820eVO|txyJW6v$V)- zoH2n%?^|7aFq1Uk3mg$e#CFVCq#5DX(G_en@gLqDMH3dH9Dt3LsGKmMN3&;NMg!YN zul5uIvLXu3Byk*VCRz{A4GMbc$u%ZbnYS)egS~dhI|b_W8S|IXrfiX z#wupB>hUm)O6U&qI|wL$Eao7;PR&2T0Q%BWG6|)C?QLnT1voIvPzIu>vrIAy22cmz zT74U}%}p~3^)(%yK84|i zR?odH?2TAcsYZ`+@=8-gMl6F;3|I5?R_th&_~URc;*H z?}RXe`l`l3wKB7!*(9-Vcv?9T7~^LqrH)xwHJ%3fVA}FMl5dIDb!D)|U0IyjeuM9w zN1q4rmOA6XQ)AyvygTAjKeoHPGXsFN3KxsyV*>rU2nZuWg46mves=hk7%d%%!ie_* zMJ;I0O(R6s?;*lDABZO5or47b4MG4Yy)+g790aE@Yk21-gTgW1-wm&5|9MycHRvW7 zgz`d0HT;p?&bcW24&cHoqDBbGVgnVgZHf%>i&+M^M$y$PuWgXtmK60+?CZ00jESj` z3VrVhWEh|JcG6yW|4%uwcRdt$2Bc);Ww^_82Tr|~S(I8xOzJgMDZ#7xsL|U=g@RqPS7;>?gR`wFgiWl_d7!~^C<9WuQQ*fMz&7UO z@;b<$2$CU>2eu8-s=}rOEEHh0hbFXhsf*fLL74&`Qv<(A-EfI&dLO{K!TqRvB9rZ-YXw1(8>G zYvFLpj)ZIAsW))b{Q${&3Z?LzO?P3yI9iS9ux`?&{oBve=0ENH8~e>x-6wr4<|830?4Qop{T z_FnI1WUl?&;zYaaiq|bt?WmbPb5>lk&ibfZZMZ_%qpeCM1XR`)2@Qsyb6KtbI;idk z1is^>t^6&_Q>QvT6a1X77|p^pg|jEaHOH1TU9_@nB3=fPv5TKsO7kwbykxG)ndIbB zzR-P8BtNUQ2e64o?Fj*jOX^I?;8i*xOj5vBY} z+8M+KKFc34BU7)&EG!QfSKM`Zh;^eMK(EQo!$uXk3y3dAL%2!^V;^<9J+uh1V0OvZ zs8$C%rB=-P%F$XXZ@vPCY#L8$rWy8||F`XR8-+2D^jgvi`-K>u#9TKROfJmr00fZK zXY32jv_Ns*X)xczNxI0I_NIh-zeIip6C1rj4%#;`iB_iZi$r(3AXoOO=&dxQ_se%+ zPac3R1$d}(HYbI}D3QXv8)U~u@fW({48LID)|q(&|ggocIeRkLyvHYJ0M z0LzrnesZuI&hz{`%I>RG8@tl&{Sbg!?(zzT^1%3`6L9777+`@ zz&vO4k^@po8p7xUfw4w#)G207UYoJNg9`JGL$HnXLgv!nlsP!k`#l2o)(4l734q;= z7HZho(@>(6$k6;Y#=6UlGkchbaZyl#PB?r`66%ST$jbw2*nzMjZ&nEU6r6f7;E8LI zhL}VC*k?d1Vb-cF9<>!4x6_EQZ zxN~HfffU7sW#xZcuPDg`d-(lD1V{w;ozx;N=uN;Vf$9#!o|s;AnDOh0HrMY-b137t z@@gNXv<&UTJ9?8=hW*4VS7Yiu?odbcG#0OHy^RT4|w;%^BVI)(BE$q_8rM z*C1@YAfp&^+;9t-N4MCM$<@;sj?`q35-9Mk(at09Iuh0FUa0$0?fd8C@eBH$60jCsh;rk#M28bj zhs?3iT0hhFE zT{jzi5}@`9pE+Oz5dixZr!!(3&NAXoDE)N0br76M7ch-_u<0=2`xok62F;<7*Ln}E zck9e&g}-?>5uhr?T!a6Vd4Qiu>INA~OUo4;H7)THe!^~hdy?cH-ss`+Q@4aD(!0$9 z+450H>r7D{u{wa`PXLjKaY~o1HSO2HaB^pXG*K_(M?b?3jEmjyud=XCJ&!IlDbN>RRY|7V` zyq9*zT>{=0raP?l^8#LOI5`BrTnK5C*h%{@MI+oo5^B#WSMIDR z$HHK{IG@aEIRHTMUs$xsAO}Z*Iy(I7OhFjK*I-m^|3Seh>>cQm`M~#&?TG4)Yz&!> zzb+SFL4Fe076Dtg%e(h^JQhe@ER$C3vYh&I@mw>q$7nQ&b7Jm@2Jz{@cj7hJ&$S>3PfaZ4pYa&}F8K>Rh+fq21wLVUH~Xt% zsYj}|K)@F=;oWQAW9GI(yXwD$hr75wXNtEK&!To;vth)qA96(@Fb&PlrM+D7dUJzn z&k$`0d9l&zQkVWlWd&+Ut(JK}RS-wQzJ!z273m>^0EFzQ?&}5MoYT=Cxp8T*uv66exvtayT*T*#)kQY44-jaH9 zuv?Et+#XUYCHxT`a@>E^_ZK+3uIxAY!Njd@oV_ZVRSY%@r@D>S7~Ag7Y6TrmzDZIW zG{nu5Er4ZqtdJ&NiZ~wHyv_g2ROhYs4dC8J8)*+S)bO`Z2qrLrOEW`C(X)%>&m)2W z8RMQ3W23Thd??kLv1m^2%I|Ej9MdhET>=`;2PEUzdbiqf0ErClVVl4HQswSKc8YpKHdht&la$ zz)hcwA{`YRP~(&A5wjmxYN0s5>%}zc9d6Xu4|-oXW6S#Z?5fCAyG~8s<1fw11fJ56 z$~{m-e#>ZFR$F#jtr2#=y3UC&X|F1*4hSKZhMReE5<>3IvoR3{KVSxy zT-|ctyDVOm>LVG+4HZ2Kk|luFNL0s;!tOJmH9HRi;bU&+BXG~mt(~T0P!bdGBA1_8Ow=f27%aX6%a_!%srF39P;n_ zM1M#BbAHej3dhyUkpqXY2PXzmuppoQY*YzuS+!jL^Onu+&4VpiP2Y%99%0|ecA?d(`L0T$zawP*Yr)@NDZh2m>VdsIgka|SEL}+}V^Ty^^4Q^e2=Uy3Godg;M zwDAv6md#MOwXIyt6TWU@J;|E03{u#1BL*I^$%lL{EM%SE0l-uV`AnCZoHomRG%Nf$ zCVey$q_4>pXkHxwjUs&#Ti*(GZ~b!tO^-(Oooa&;_MhdGHZhWWCF$BBgpJ$p?rdcD zuN(yQ&!08=6Uv>I-Q;5opR@;Lhj*@x&#xwbe&NN$FzO*wa$DU!Zf$T9HaEWf9CrPO zr2FZdqcS4_d~Vb$Kal)I88V8C@}j{}FzuK)?4zgqi!4M^2D5;b}D)ecaVV9c&oC3<+v9>!SMtvS9)}|kK6EEg90-0ZLTV_v0 ztf{jAoGem9PgvS=y5&k`Ay#c_S-%$B4U}UfP>8EY2#dj2_eUx(WvcL?8{`lcOxvhe z$EF9?PXC93$H`bZ{vY`w$81w3#DGUjB;BGd770b5`?9110-ow$*aUOwnX=l=QP_FC zrh%+YLP#I+vDSyns-S!N)r`5wIDAq(HdR-^oUtbswFDj7@Iu46VWjkec3xI&cQuYX zrP_=YAi0ni^XSQuOr>d5tQKy&dEcinT{6oOdKp&CO4BVFzTJ*fZ0jn{Aqj=~$Ary3 z@5-SkN6KAjXC#D^5w}ngS5Fh}X=J;DW$XGIr}SBO@p!7V15HtJ3CY?le(FRIo|zp` z$Ws78iKz(oUeI&okYTmjb6|x9?rDd$m^VNoFUG<`E3Tv#2Zds<{F4alYroyx22gDze? zDeq?KtV^kSoYjZfcoACzG!U>qSsNW zi35$hvE*Y%-Y_yT8(V;F6ZLt5>itm6X{)s1?CYteY8H-l%np+SM1>mp_>Df44~Jh# zzc^?C6qrogiKZGK9ineo#6GxTla%~hZzTe)o_`mFa8q#6w#1?PQXnZK}fC1C|nvuwlpJ8Nd`SXTvT>jjq(1yk>9TGg&bL6J`-NRi)Pk3nhS$2wy z&siZJ)@;&KiL%fjxd^oiQ0zJ$`Cw8Da7s0W3|ug5&mn(g%vqw#c{0)6ao1_B%L8e+3_0&=PxqKM( zP>-_IlZ6F!_YVYz3+DD_l*zM2*|G6=FrK^8=vXsazUGo95oHz_!0AI5+-aR8wl4eL z0>s`BBv}{wG>BYU16|>iDFh~T#)<-d;s?em=iu4UQAKaTh`>@3M!!_GPxf1BUv0g%ZO&5wV5^bbyS<< zgmvwTI}Upo_>21PasTXe2>rc;lf(XLAQfX>&i3|2jE$B3HZT41Qm%iNXG6txI$4p?+_%6b6dcF0B!27^$RVSiV?q+hG!7TMxm}v{i_<;#rlNE8A(lkw}))U~l;Ru`&MdN!Bd}2DMhnyjfu2oey{bya;4!>Ida2}2Qz5C>_4~f~h11$2)HVx;1bLpBkI?gA5gMj&#wu}=^ zV{`Um|Uu_-WINPrTD!6 zK@*Tb>{s!E+)3INj<{QPln84<bf{twqzI4aZ`VP=Ghn~?KI??{Zm_9| zzq7pLP1Ah-?Ad&OPyQbV%KHf;489KUp!cEFqNxnLRSWz%%c$*VNEP81H_eP2p&~_7 z&3XC5fi|L0A}@{BExZP1g&p3toy540Crnc2_!{5t%R5>iXyCoZf_DazE>84;} zON6u3!~xBpbF%y6Sq{XUC|JrjaALs_k0$1eRV6kh)3o5D!r812d6JfOoX%|>?9_^22w+z=_b zsfsofQLa+4gJ!P{GcnNa1+j`sRFVydFqONsS(0H@;C9sh7|eRA0Hs4HIa-{tlPK+D zCdI>cI_o7k_;}V)&uFG#NRUm2-{{3t-0GzgK#`?f8B(t_l7GgMKtyCWL08b>`zdr7 zUg!137@$xjit!g%kMlNso^d5Ag%Af>QI+-wgB_gB9{UkA!knNoD?sGptd)1md%`3W zO>P3i)i*tCK|jlXYQFiU;kN#2EkavF=|?)`ZE7(KBEg$UJ3hX%X^^V9KO>Vw@9KX=T$tR?+8&>*LgMQ8bJ zgu(`MoTIx!@ETn$$Rj@;M*A4ZH$Cb^s<9V~1NKtA80p-~LOl?p02b#rJco2{{$4;p zhQmy`JGG8NUDC(Uw{sJkZO`nnaH(@)V500MUQRd@y#zUgiz0l9@ia9Unh^(RAXqh_ z{<^}-E7aH&K-WkRV(K`*{*b#+k$(ll;ct&?7Ys;iFwF5B4EaI~ZTr~`3h4}a<;T0% zikUc3`5hrr;fEC<^MLZiLiks|uSJtxY;2NxgLb07c`P(kc6FvJ6s#?boBR zOryVvUP6P_crAX|>#SIvd0?caf%_-5QAT%f^5i{0fJQE?u_e#(%)N1v8b4~~688r& zYr7*$jOHHw>GY_OgMxxR7v4==@pzh|)L|blHO@Gd6=0)8vu`&)F4cB>|D|WVD5(a* zx9HekcX*W^Yblu$!e(uUX8%O%`c_JyE7M1;%WvSOEOhzTj1>jZ+d_QoP2@QKq@UK- z9-bsl0Nz6%2F832{z6FM1K;l`o6C^A?^IWD{Zr$w=N@cHUO_KO3Yu=fC*p z=GsrMQ2!pH)KT=VTkf=}%kp#@CB*w}{Sz%(Intyvuo3BA+^epKCjZ=GTxK}4FzmD* zx6vQMG;k)JuKgMrQcuAzZ$HBkTe(uq-U$6Mg2U8+RE0!)BEfiUIDa)v!Q5@YA(kwh zIk2U}QKCI^QdPDTDN)bccyM{L6Yx0|ZYF~?jsze68xr~J^3CFt!Qs(F`*;=n!Li2J zwu$~SX9dVuB*gFf!?zU&g6|$+TQ-ZWW7Og{@6Co|M+%=%IMxLM2ejxM@mZs}nGpSsMcQ-|6ne}1t zeBjlpWAvsK1);oNPlU<+HOgUz#GP84yKvXptYfzGhD$VjvfIk%-t8M%Cui&2dAA+j z`?3A}9ND%xrFxe|PeRAitgTweeO>Ze9WK_eGerE2ulx=6S={-G)7g4^)pF0((Ycqt(d2nUx+FGox*)mGm zc1Z!&fRLabLd>M8k4&bbC>(o0)GtKM-Fr+e;{ zHTqv~4!6;bcmAqrt5!Of4qpy`+J0F+sAhZ@4>Y?2+Ej#o2X_4;wa2B{s8<%!J_z4& zBsN5Qoh46RdCH~%4@Bsf4mjpZ;#hk+PmOYoE`QSZJ1sDJ#p0CseBb7%VtFUVi_-!f zBL6gT|1)HF3j?F$bhwcYt7+eE1WPNQX|t|{N#oE)MpmfGaGGC%u5#+Yb#t&*xTs3* zjqJ<;=nmusfswQ_)P+`|6NX0dP`vF{F#~nyT-34+NJKdFN{M2J^)2xa7jmm41)IDj z#&v;@)d%t)UvAn8&xZoPMbG&im5nAX$PI>Cr$Xi>F{d*hEJtIj800FK-+Qfz29}zf zi|fG>^MtsmhpA^jM7!HiQnhUpni(VA9dm*J=ug}9C;Njj^T4k(@{jTt&Qo$n^6HWx zbJ1?%9s9gXHcrMd?cYa43AvNrWngO4}w2;8O??`jYxDhu=;=iWA>^Cc1RNkcy) zVE&_?fkMZZpC%wvZyMs#g(OYn_S3$3y=MO71$xsrGc5;^&}?~%4pee7@K>kCq@29* zsx>>Oz-b%%48+4lIG$(Dv50z`MLvZ~LU+4GY;Pd;nCg?8;3@tRj-0L(z0s~f{qPwI-8-L;>4I}|EZ=Z8WL_+xB2 zYlHEhUvolssO>W?kNi7r|E{jr9%otJVt0ydFj(yO>Zot3Mh}VO_T(zTy{G6cZ1ll*?*1DWE9kI)qv#StlASrnwE*2ywD6HaS)KtBl>*l5# z6hLyR#XAkl8=0gC*9mN*f4RrA5m7!F6Zn6IkTi>_1q)SDcCdk|0ROjU^#2>V7BzK$ zj9eH#D>b|2y+nQMY6m983ya9H6lWxnQ;in&R2Y$Bf-;Rm$t3J#rXyIBfE{lssboBE z$NI5>=R7H@JKr6V?Sio%?Mlwp$HfHrm<_|eL4d%hE<+(VG^=&w0hJa*O2N?{o#dIP z%k9_a`zgW>^j(p$(9s8(2@BbjJ+R|mI8MIw;?(6=w4!Oyln~MkAFAZFx)(@e}azEWtGU+JjaI<|fHaGIr zF{}nxD3&QRO2hH!XeI=aVrEjwfxDrWiwt{AeF-~z`c<-Y%w(*r#+FQfaw6 zZwM(CxWI%+Uk>YnLd2)%sgmStkQ#5SDJi(Xv^XqwVTN|7QrK_YrXjuJEJE+rsI5U@ zwM^YkDVw;!1gd|t29;R~ifTnFz!Jk7L8EfOVPz(ioaE`VlmKIPkV|xurAW8)3Oy;~zLIUtv;oW|*YG{(9Pud40VH9p!?VpYAsKcqo#h6_ zL5eb%u&TF%XB8lW^TwD5N`texwjM+mnTVq-2U2SG#IrZt3az^EwP)}qi9fu|t~j*$ zO)vN_diE?Q;2SxT*y#K3J=CQSpYA>Lhh18LOrkvgC>Dq#Yf%}>S#tV|eBUy-g`fxu z1eG7KzTyVb+e7SwPT+bGw?!zT)lLolr9>>^vvEKT)WDknrAdy33fB9@vJ*sD9 zoXBKeU8F6Cp1{L-$i-@iE2!!b-yjTd7s00WnLWW;rlBo7vf%&>n&+paa|{2Zh$Ii7 zWFV@9I>ADIY*z9b&A;k(08M2Xm)Xp)gru7-0{DJct~ZAY*BkAe2s2q-kIFXhD92vd!J3>(ikJ_GNqiAEEqHV?Tu*LWVsZuvriJ=Gp8f!36SYAT?uW|dI=NmqY+_QltK+&JR`+PI_ z)Ou8aE%P`T9^_9ZOW&ouMTPDHmOb651nO!)M7&z{ocv_wQ`7-6DjCfTH{J)3k>UwA zB$f%$sZ(>^NaCzA9ebE3zXgI?C%+&Nu7w&@_O4rt&Xsd3{qAg#uwNG}IS?rTQr9&o zkOQfLUDz@{alH}|D9ks|=rZOQT+n}Pv3`YGuC445m!?$D@C}tpcignsphk;XFrFm` zq}~H4=z#w^2s* z0oW8}hjSzO02ksS(VZ~;tMF7*a$CY4clR^KF(}5R%AehhCXrS3sz`dk5RB6{FROon z?fay2=f8^y;`{H+n4Q)8Z(2-5m8%)UkC8}<^RjBYnyZn^uLsrncN@Py1XdsQpI-Gv zlLV+OS1xb_PPidB6hE}w0I<&*QS)`0!t>|Wv*NQJfB>}_ehSy%ffabu_RdIqE4PBW z5RmM^xoV+b1@BuE{zZA)8hM&DGGUG*|In!}**C|uw(nboBU}4ABq)LG>IXC$MZ~i z{sW!R5MZm+2S#HUmd>2op29TMG@=cGiV*cq~jl&0h7$k+o+M&}=nhoAqtZ`5MhrBe!8h48T?Ty*{pI=VX}3;4$Er|WHEZCN&( zc6geva-(8v@x5NgWr)7a%GS-kSs^ouOcTSXGyFQIs-bNpNj=B=1wzZ?vZx|*dNnG( z1^9k~DqYZ0k97X!lBxUvvQ$EB%(TkF}hTX{EZg^d%&lJE>A{Yidz#gtM z8ni7zK%UB(I@GvcTv)p@RS96T>7X3Os_7FD9bofcB#B+wjz=sbuPC@Ug_GUCP+<7o zj*E3M*h@@t?<;ckujh=QqiYgkUj0D~kgL5EyPN`~a8z*pPPLA7#S_FoI19WY7uD_M z5iC2f;@R=%*V8o)x4y|K5Gui1h>#i-26+Vu%FDm*kikBLI&QpWRMq#fX|XRCarG(v zmu-nJ4wZh9P_iWJBlOs`nX3=qT@fw9y9$OW;x#)23``P%s0%(+g-F8_;J6dB5_r(i z)a(uL`=hK|T7I(8zd+4Ilk5VnI=L(Pq|TxaKfA+bVWJ6$!;4cus)w+5qiTvVD!YYM zGtQ}iGD(BZ0mqCv-V!r&zI*-O!t$b~w*AH^y6;I17F92akgMfkYlfT&2=zQT#_ATt z1<<=9+E5r?1ZV;)oVkSr)%wo%&7>F!z;-^l>rUh$R`PJN&G&@oget8%V>%+)l%BJQ z>9RO6>1Q*iaUP}^cg~5n$!MObEWUWDLk+88vohU9Ih#36f3k2ciHFTtb11qk6+3S3 zMU2{mVaYC;BFdJFR{OWkq~0c<{<-xW15H`==5M^@J5}1P2Qfb5&ZIxT$9XZ&DU8fE ztE4*QlGC^o|>lHs2yQ{+0DVAMqM&8xF^^THNddf zh}y=Y8_7|5Y14+2+{P&As{f&1CMC14W3`DrSMslhXGqOapMY$bFtH6w&269&uxk6Fs%~Q9y=W`!T9szT64Q}u2hS6KQ#C2R*L+_OA<%2 ztDL-D=*3s?$czaJ-m1ocHZ3bym1!2Tm^!m2*IsZnjSr|nooutFI_?BIN!BTx8gO42 zLBO==mWmf6nD?0oc29ZrHppGgig}HWT`aSbT$?bFzOUC6Alp}~N16-l2^2)|Qi>kr zvLC|<8uo>$+*Q9I-Fnl`~(SvC3lAns?YdM~1vg)S$+53HbNWZhN>Bd96_W zka~=|(e!l67^OXZVA;<~ZgI*zH_?zYD-wnxhGN>mRk|G#S0~0{VCAKDJ3{ia3o*S( z_#C^`;c$^GfG&3^Vsp%He~+EEt$}z>u0VUEZ>1|zyF@%OYfG*9+S8FK8%_W=B=puJ z1*XhH^$Jx&YdC3d%Jw7;REW_~TqFL;Z7`G5-A7;;n}DhNK;>EyUq!kTS2-0f$wwd* z96u)Dmtw*SNGi!SDK!{f{A!sFPi&vcK1xWs;Hq^TfO5l!u|FHh$aU!F8b;zPjEG=- zZ6?9uI1A;^V{YKYIQk>tlgk!+r`58rK{8fL7KSl$IwjGkef9=XW1Xm5ofnfT53OPC z8lObc0rTf)pGGQ3xWXBAt5 zfmh%9!$Xl{9rtguEZYcN-}au&lryr(?Ojcej*{Lh5pAM06p$oP8u>fVsFz2;eEL~? zv7~Yysi*P0@o}c0IpJL%Ylz1DQHb79BDS6)z<4>@p%fSx|2Wufsgg{H(?!BDX8N3eH$?d7S?6DPJARj)#Q{git7!9vgyv zo0rsfOk^r{}HjU;Gq25`T5>c+D5A+*4Jb}GVf!^wTirII&ZmG8c z&?G{~N34+zv9eK;gIFQpEytHzjjt#`U{=eY4#d_CDg`EfEoTKWQn@O%7qLuqT zznLYReDE;O1e=B2Ej0%h?_ArBu32`NGCOD4NEL1)T$wy}0;TSSVu3IP95Fxz<$y8R z0?DOJNrr(?%fD7_!bKa$Z}t++hu_KcQcIy-gEi54B_L_IMgU6^W7%$wMN*nlF6r+#oAe3sb zh4WVk2V3p%KkIOQ2#QaYO%{k8-3Dg6Oczt!>b!ScMX(U(^e_(;lD$N44dmfXK;dEo zxv;f-ov@B|`ro*&{Ma-Xs^vp9C#Y^>#J{Yuj?_Rs`-G_%Cb#3K8oNYb3rmvEnRi?~ zcf5D;w@n=R?IF5}6p`J3%`UD-b+}kesTducu^IwPQpr3zP=j>PkWIaOVL+rHi^5)V zMbB^`oZ!eQ$tZHcg1ZHRAnFQE0UA5#9!{ciex{;P8BvtBt)lhS&!A5Zc<6XMGNSo2 zO-J4>6)I?4^4IemqaH#s?8p;93f0eBs|s?VaE{Myn%M9t#&p?;q0OkmSC%oq1b17y z>`8&7H$Qthi$S&WPJ4HnQ0qUm*4w>=q_n!SqbnXLcmA;o(Z;buaY= zw_aZly@#yV@yZs`Hk6aYS&yk*l5eNaaZHbji2wRlh+_`npkQ&`2Hrb%x$l$tER#Ro zf`*3Eo=I?>i6L7d(3;wxHT|^Gi9amHYAr0`5GD=ejjoJId_a5l<{6x@H~tZKGzLSl zRbHG9JNo4sahv{O%Cel@1b{|yi(}qA+t%2l8rftWwvZlm^fJINz)jYn_6jkb~sq-SmQt(7jv=c zKHo3^Q4EEAz&^L|t!N1s^Gpk7HYeC@lClU(6^La`?X7G2j+8Lu0GLv+qAAwZ34(HU zf5CU^XVe(sAOvI5RLz2na;#8x>J791Ufm2Om?H`EC0dVIkUd$P6?bP=#&U%eNux14 zOFsE_5(o&&vvJ5xYcq7N8wgpVv#9@g_=k8>vyo;_|fjXc}j-QXX(GkE*UdR}R#y6imKj~}Mz)(MJv zNZi!el-%d`73f1vH2(X413L2Ve*gdg|NrD!Yp>fj68)}UK`20R1K7Tg^d@O~uYv3q z#Rl7^MUw7*SS$)!8e7~;iHbq%sa37XP&dixJFFG!gc$pVu zmApB(r7V^={97biT6-Ip@$$*o^I{z@T_p=E6Q@iuzEz~s$@!*#GIcpu>1}**{mu2| zBfvrfBzMEynk{5&x!;ZIrNce#9(DJyy=hy>fVm2xCph97$C z#0_t0&r*d}1;xv+Uf0Hb`>NWhVk4Ys_AC|)5#BU{#O1}sg>Wh-%d2o^qk~^`kh-P9{J0Z0-LaR5_JqNC3z>%h$Ush&Q$vmfufo4%!+~o1|^@-5-8@ zIZ(sytfRa|$=1rrl_mj&L?){g=Sw|jXA4=DS|!pewunw~bYco870d}1u1UJOYQ3Jx zH`J2?I75RmQ)nL{^_L|AgbrC`l9NeeOTSv;~sXge66IanXDX2A`qEH;E- zv^}te*I}!F+>oGFr8KAYni6MmP!a8YJ%evXHLoZk(5+S7ItlziaRGpE9JU?CF3d<- z7YTWY1b!ZES=|uNz110155^bl96$h|3p*3rOd+-uSclL4&_vdj8ff7824l+YsZ0Ip8R!b39wwwd;E0bKBi zSr30C#I{Gwe@{wQAtgo}Aoh)K>GEuS0AZ7y9GD!Od5hnfUjlXiTFh8~91DQ|A5C!=b3(b@eV`2-tWSzNWOyys zQt9B8S}$+3@_9vy3?Y9ThbCe1HgmbY*VE&F{4yR-K4HU?-qN%0>*Btcf31(@)vXYtG)ilB=2cGwt5Dw)ge-Fu?W~l$a|0K`{k? z_h$0}*88UN?`^PmR3;?!EW3kG*Ofu?@s(l*>*PZ#HLt5a>_J2O#!pDmL&8(-UzyddT1Y-r_KgVcRJb z+kP>}R>bMDi3RreR_@x^K(qWtp~y3I*oGX{QRJvc&M!Nt=xsu!^Vu&#Ws=G3T5(Gw zo37b+lgQwXYq!t&e1LxpM(+EHgHpxEHIdQ8#Z2TTRcqCl(LUrFkIzkGKYXWud_!Zk z+GGyq<=oVuNl}U7HUkw2J`bh5rz#rQRG~=f-9r4850=rFWrq$db_Fv^SzB{f4AqK! z;Y5#ggdouD(**I0`eJ;#R23-P!5uZlNYo|z^pu)bs%QI_&E4a{{bz`L)pd#KWMWU% z`z%oQW282BebX98%P6=R!O(4KR{9?I#>(@pQDx4aoWovSOirV8t2j@%5 zN9)PHwDll6=dLSzAoz9zgFUH4NW6UM#fcwSTyw_~-JE9+ z@Vi`M=D=KnNMmir1G`9x~Gwy=r&Gce)J&JQ2K;AYH!1e|`cA3K!w={p81Z^FoYe~RbN4cae593teoRZByS-VEnEF z^?X$GC~i>=x&bYJ+E0mt#JsO@Pl6eIi`ZvE4rJ>Rxm!y_X4tGD<~A-&JnfEi8)Nbu zd5-y78*>yejQufiqs|Q~{xPJI(etG0h_EVciuU?NSSH?@9yN~SgIZBM1_1QPo zz9~4_va2I-z#aF-o?8ppjX7D)gLwJw*m1hN6z1{z4-Z$;*7P*$y&J~d*9C~ zA@d(hYh53I`U(xw{)l#G|K7T>bzY)kaP7@=#a~buXA+}(&6&S99TYykf8`D)G&ddr zKS_m>#D$!1n}H}wQ83T`j}?%ImlszLuO2^o^vwwcWVq=+zJS)SLc>aHskeE(oGlB{7r3vc zC^q&%xl8c5=fgOz^DC$M`Q>&dq|@?pqpM08Fm^43x?X6$9mS7+QEAVF0eL)I-f)%q zCvi)am!LNRb^@R5w-`79903gN_uu{S>gwCCzx&~rKsf=He-CDNWd8ckV3eXx8|Nf4 zO++p{W#d7d@-b=wS@fVGLx4D4IQW1Lolz5}@?KIqIG>C6xerDj!>eg-<{|zpK_o~@ z&oGe4BL16ssYi|3_&g(xo9EX9#By=<`3@P+jP?T*W zPFk7neizg>r{*Y{QeLtDYdAM0))gmKrCr!x_PKvze{vlq`|}d)Z^TmkyJI;>vMWxq zcP5VJ0|@RTEG3yXY0m>_0Ho>Dls%ZlshlCV+B)!1kF?-08Dr8YM2}=C(fo!27ZZPi z3#)wtu>pe1P2PSDnR2Bo9if=GS7|6x?GtE_GjNKfT_ba7USGF}J4yoeC<%;RL_k8_ zfB=v{e?y3XqPIyAtIH{%D*(X64Pm~A^CjY}v@W6b5des9xBT8lI0O47yg0Bh;j4Y5 zkSO!zy$W$FRw`7mYJQ4L8|nMSOVQ&Owmh7qo0dk`oY*_`Cx{MHv2+7;lz@~ROw_>+ z9fgbgj6*T+qK6q&u;RJ=2#K_&Sn z`gycW9BW);Z?pN{9=fz+E=7rum#}+{Os4Wy<|r{C!wf`I5o5gW5&>Odzz* z2+S4WS@oN)pKu4rltiGQ>FWnwwLE1}4RD9cld%#M2`1$~<&jaY(*|8V>eH9Le;kz1 zhnhY@qU+Q1`J(%(^@@H$WxuFwxuDr?5i$Rq=QvD$;pnD=UY>oFE9-b=hgs8G^J%o? zKx@#BLsdEM2ooW|>>Bsb|x6YW7eHnw;=%f_Yfu?yt`*pu(atElG4mWSRkL}iax#pZWP+={T=d&monN9sBAK!` z_Yrm2+79NA(WkM+5fM)k?%>owk{4NGt(`y70(|tz<}=pE7-xU^(Aw}J)@?2B`EX?j0D`;EDH@z$&ZP$ez($a?-y?`7qLlTdAX3w`Q@TqUY5)2 zRQL=m2#LSi2n(^Xi4#iGbK&JWhbewkPNbENy)qhYd}Xy`1L;i>e_hhFBF?3ASMB<5 zegQgJnRLZ-ys6ioi)$}%GHpDsRTO9iiSR~L4#Gk-r;uU(TiA)zSRwT;LIc}482n%4 zYI#Y&_*sg~LV7g`anJ8FU*w;4qn|7X{d|?d-pN-l=wJR=8UGuy4WHOc zr6Z1146cH6wi&qTF=exmw}AQfqBPDangDa*t-J$^36Wt7F#bf8U@;X%ZfMP9x%Lv zJPk07s2sIWMVSLust=h=z)O`+#k!&*E}&RrVe+QZEF5&3JV%`+%FT9`!yV-N=OaD(Gq~x$F+yraueVzd=0+ZJJ8kr? zI1M7Dg}ZT0o-Bu({E0X@jaT|D;2}!LDP=16UqH&yy?jB8(Nj1%ZOi)kJBpJYU2t>j zGVVkE=yD>nh6iQ~=7?wwOb<07C)5|8qy{3hRc_+jz?Dzc!UOY1?W<3f5ol&tSqKeR zvsTbfvO6=RL67J`J7y1Vz6~eh!=$n`*G2d?5XwnKR+WkLu!>DZR5EVw`eV+1ZYuB7 zRD3VK8@4r_NW0_a|4PXi<4)J|xxu4kUERXYjXO^?){i9A$w(i&?%r-V!bO$$LYxSd zTulPgXryEpG#`JQ@L(RBz3te|`0b1YXys;XA0AB_ryK+x&H@2WmXX-U_1V~2GJ`K? z7~U;UfK#aEl~w$FR!oRNByz1Alj`R!ZRt|!PM7#X!xB2`^Jf{m(fH4V1LJ<=Q^D%Ls~+;4UZKl zN#tx}O;ygQ{64(<;>!>3KU{qNeuiz}Y-o_fs&&=c#a6As9&l+o^n5#6ij&Dimnr}08mF_CF$ncdJno9 z@l&zSZVS2kOn>4$3f6>%t_?02N~Hm!#RHg4a=H}mU2k&Bdj%Nso&N73J!NZglB<_N z;o?_cTwMJ6%Zm^1XoE&Vp)&}f@be)U_Zq>=aXh9nj(hs)IXO9i^n<=fgYDu!*kn5H zzdO=o3Y7A%+Gma;_$fEf|Bti${z#U0rn3Jtd47L5&wuj+t@*|X8S^(`j_xc%FT@^7 z-{7cJ(S1R9z5jmZ3>$I+A>c%Sw7CL%PCb@HO?@vE?vLA^+}xVT$K9DOyiBV`ENSf^ z8#-SH4ohynvV7`HQ5*HNeR}~EgvUPCeUQgid_v*ZM&mBF-D=dFtyyQ*SCK~l0ssL2 z|Lj;zkAK@B5WVMDASzX@)O2Gf&PTi9UiDH{dyg=lBy?@C04s^A{`cZ^4=dGpW#T$S z-HRh(CJb-h@OUPL0L|(Boi3>$_w^I8oNB$sB_^Mm#>EzsgW?97gHT2d9q*K^$}!K@ zIG)FoNwQc*t8s+MyQUzmG0|13nc^uZM=l?l#(xi(pr&z&$s6C5S~d`4^3x~iS08(- zbN9ymy!z{PpRy)BoBK)Tbbwbz{L(}UX(eYdJ5usUTLGK0ga5Er68wG_2e`7Yl}#gu zBTsV}FS?ivN>v&8klcILpg zH7IdtO|J#{3MZe$9D3Fc!4Rj{b?Q4GqIY~sH4m$CHZuJItoyOQ=v_<~uVOl0hJP!j z%V5OxGUBcR7S&aYWBey)KvmjgVDogl?|%QC_^4;i zF3&Iw0R}2%i~AT>=oL^8YwI!}?NP2TcGquh_h-QuQ26gJC6VhxVF0(1C<*3T;@4)u z`jjXbqf$`A_P*D>sKuy!qsGdY@PGQx*Hd8#ui{;yaNNpe>>b3dc%$s{D}x^qTx4*( z4C>hBWnKd4Z@7O000960?3qDNgD@1w@B0*_2cwDTMqy0dnt1kNjCayOo#-eFt(lAQ zyUXspCVkAVI4>N=UU_~0zJL1zr50pMSTMg<8!p*=e+}|ASMBeTuzRhWu76t_5)@qX zaMjcwo3JbvB$=fXnvN41htZg@i>|2lL8AbA)H7cKF`W@LVGEo8%NN4LT2w-6`w2}5 zJMW6BO2Q`H!?8=N>oUlp?RdQgwTd1-{+2~zX%0hf*71#M| zRxjT~jwp2mlp02a1>Kr?FLh-&rFYPDJnzeK0UmtO#e+Kj8czHB^|D* z%!X$wN|*Wj4%?rz<9kcdHUTE}8$c^#6m22q>(>>25Ia<6->53MaDPMB>Qac!-00+L zZ>I*zbGNr+HG-hd97VnDK#J)=3K8GXI}qX)UpuhZMo0}LU1T3g$!w7Q*@9aH+> zJG(2{QY=N1FXUPZ!70e^1&+$S;Bbh1>k$R|9$ z^)IilPS3C2U7lY|E-w7=XuQ>>AO6*5mHFX4owxf7gSOw-en>hzea|)rMfUeWEF6!C z4zroOUFwe=HXdouDe}WKW58*L&kwCu3qMo`)%L57+P+Se#(4tp!?og?9h7Ek@i2sG zSAo2jtxrmIlz+_R{7)9?@d;dY*Xbv!HB;F^K3_x8ol5FjNBZIID1{-rOt6$?2M~MR zL2SzX@brcBe{hAayJg!I!;ANo&(rPu*XS?L@;koA9M(zSfB6=}vzR^3KC57t?+$D< zql z@j)ZaS6puj}-`$%-m23z*O-VgTlmW{(>DZJ1bBF0)C3q4I3$bVNy_*y7fI zbCAnKu9%t#o;_G^=#N*A6t}-mQlFp`I!SmOv+UN_s$f2*!<~$&{a4T3tbnyC!y(_e za0rG&et&i0kUJZWd1S*WnZnZ{Im6F9yaR%4tqfLdNX#Hoe9q#4Q1We&Sr(`uKU$@e zBmC)@0B`4QuZW1pvC~u8i?SaSxge9SU@5Sdd^6WVdHNyGXScVh3Qg2 zv?MxVWKk~YZK-y9bo!X+RJ_rOWMIu@$Q3Fd*#?VK&U=4p(z}JShFL0}o?i3m!~HWig18Ex1lihmxz52QIJ&A3>C9 zwjF)^ILrWAEU+h7hZ&%c^$>6CJ$HQx*N^7D#2eU`Jx&1_e>@uz=|YNF^pRYG2E^%* z7em}#3=o(>sv*&-Ms&}+8xWmpMAye56=L?lHqa-h9j@lQ$M^oQ+82MD#emASnDwZw z&0+*=&U{F7t0RXqCuH={mx99#Y@0KKp4oY6NC$1e2Q^b1AV#dQj~_w4wV3g2A^Rw* zBlpNZF*8^mf8HkycC()u3t2T{;;6`RR3x==j+BEnK3GYyGDB#}qJ(A~QV2XKqQnlL zm>E6`@XK;(zbKXq9@+U6$I*mE54q$xd(i2NRqJGF#Aj_Zwqqh7&lsM;9g zw-#wnf632#&w#8cIw>;E1&U30RxYekHIRftsahjGlWg7d5fTt{h>lUC7=p3Wg~|+n z3nf#};KyWIU3wx6WlDarg&3nLWP=pI7KJcW;OgFPBVaZR8tVQnVYtKaFW+uq!X8;v zXa?pk31(;FEj2^eVE6Bume)$$l2Bm2I-%OGe^cZ!ZcnrRt{T#YfSjZfA2}~2Pqg|K zTY=q{XoxrHb!N1T=dPg+@7~Vz<96rj5VRXEw@6bXkenwSt3A@vQLGf ze^)AkZNEr)W?pW%VuEAEv|;m(MMxUA6Y@j(#?MJmRt?$~eEO38rQ?vU^~&C9ZwKw{ zDuHV&&BM}ZX4^^b&DPo-R6@A(Bt@1@n{Z)A5>FS%WoF)Wl^(X*GCqvBvGEAc9l8wm zkJWzw00960+*w_ZUy`N53)>JD{CiHS|VI)tlX)kFjl0ds&p$FYg&_<(g|sm(Dj`u?^L!H?+TUPe>O(f zt+1+lB#BwdrqR%Luz{QTulooT0EiB zWh%+LI`tOpB{a&R9QFy*C@Wd*)`+bV_==w@2*D#$E7+Q;V07zu;E#3dRgEXhT54qPNmns(T5e|6DpuA0ra2hm99=m*;FWTk>-(9nN?{%|}j+I5wJ zYoHk|jTVS2DGICdw~MOAv2uN1v{m^9*?hy^xp=g;3tg9R?PBBCzv)*# z`BPVme=fzf-MN1~y}F=Ho2v`CSqk__yMa426e=s@+FtF{)UCR26R7(LfBod+6&x*H zUJmr)Sc**Nxw5KGRif!^*^XoB)2!G1({vCNCS^HBE+#|BIyaRHSS~2P?Co`8>|u4U(vCEx za#MFOyW~W5T(Emtx6ugKf58*cL&3mtV2xM7s>-w~NZBgkOBeP`E>)*52 zqnm?eY*J9;f}GlHJ{pk{^a!1cgXsvTGPWW(7CzK%K`Ac=$hH)Sf7&S3lj&5~?q;y< z;@SCZKV3aa_xFs9okdPh%4lt;qP=@^Fef&ZD*@72|0ERb(qq_O!TDiENa(8lRrd@ivmikE5l!_2iWeHk{vNd5Zq35I& z)w;2!YjNGDqT}?Ee<|lV1AC#IiZ-EyRoVhPl8=SvIxsbk!b3DTRcGY!oI%2bK3PaW z#a1CAd!=^;btRZbf*S+)ht$M$Ew(Frk*I6izj*P|04fB!lTB6f9e?o>`kNJN8DBJW*{HGJ{ zD9JZ+Y(}F`0>-z22T-{jafHj^!-y1-jm!_M-tEwte6Z_)GE8vXkfAKubwC)G^aKP) zZ=q=h`{18kI{5Mr$oxPq2wr_M9#3P0kEDmnE+Io6a%Rkur3j6i$}1QirA0F-mXr@% z8>RDo5rUayf1M*KGbzX|RHGYSKEMEu>y}?FUyPD)U+AgFY6R;~f3c@P5POLvpy@2&g-XSB@Dg-I z8@|&S*Njh25M~0)oh2VZPlpac`MDIf1HQmQw%oNkb!1?22l~=Mb^y&mW}Ir38RfHx z!H>v*4}n#4H9plqBF=ykkdPz;l}3@0h4hPOHo^#FsxitJ3KbA zaZ=uZe~R2}eQGW?Xa+!XeJ{QR_{Ai;_7=R0^4~}Kl#Ic-%uiI}KqOMdRAPCK6yD^( zsx@d#Fnh@nq*+6j+{Bn=9-AAdke^`!#IC@#oaR*zaBg=gnfByR2yO;_fgH{JJK`o~4>pFPB z^9*^WN_->j^PlvZ&^Q1;`tN-p&>rs}Qjr)d@PcCGW&%D~J#ZuqOj7I=rd^$~r3X>U zde?CaJ66qf-9hBhIYH*hkX8oja_TTAp3G3lBSVZCIgL|1%uKAFwtX?`n0b+L6fzdI^b?&ZPtQygdVBbSR;0VDxCm#|j>7=LytboO=u<8jhzkTPx&Ep&<> ztO_NmIv1Nn^dR=dxt#^gfGhatmN#LWjz3w=&sWs~rfRt=bOz$|c0p4T@b5zNDZn-Q zhe@`M8_5pDmQNKQ2d7?L(6UW}kYD02Vm|mW7NFObtB)AbRzq*g6s}>|jkJcT8~u#|&->fcS&IjP$hFs#4L}VSg4rJ=*miTZ`{_R|;~{dK+Zo_!1)J zrWJxZ+D%8?ss=O}6fq^8{9Ts69GifL>7>V>VBnbo5Hum%qw#~w-Co%Nf0bKZ5}qNi zn6Xai&Ctx#m*zn;f-e)#=$Fy;cO`EXl`qD2M^ih5Q*L8a)msk>$D3#l9R%v8D=8-) zrpU>d47@XZ&12#7V;}NBpJl``!qxrOtA7D%hVp0%gDi9hm|FRZ#>T2KHzX6f24zgF zWa0fm3Ifs50Y|`D=V(${cGI5}5OcJuSqNmDTbGx8qV^qaeQ&dq4?bR+&b$Nl=qpc7=D?Tr^RE4|ij!2rEqTLn)8_PO<5j9DvM`(5Ne8_EROs$D} zsWPX&+k&JH_)Qo*O@68_=1e+%_J3{A+?lyGRdO70{n$Br;V?%G0&9tV;JS3^!11+M zJ3j>k!dmHj=198qO%IB%#h=Zd?pT(IzZ1mBL6;J9Q{#Voyh9-14IS=g2fU+i!JZ)a zSHEXodxUG=&WW9s+ejAi46}IB?v3ELe{|W@U>H<^3mvbFRJHlzy`e)j6+>*v2k%Nz@v!t?(C00960>{we*+b|S<-> z-0n8phrMp!KlGY7cw_TBnOFDMviRF%^wt8GGsG5@LmvmbyXf*aWGEC|(;MyJ%)Mli zlBhCFM=sd5aqzv!NGTjBk6$3`hUYzQ{D1#6fvo9 zE9cOunSWiE9_c;||2A;&LbD`6j3a{dpL9HMbUwpDNEEG-&X#H1vy`X=?Lsi@>*bqQ zEp?^M0e;G>W74TkWn1-Kwr|?ExAvi}CrA{H)O@T$$;MPRE638eO#~cVxHzkw*-vJ6 z`iC_SPv3W$p2lj+@_*%&qa3p5qg{NP&@8uVJqz_>!mKV|{F14&UH$Sm2MFJ$N}WmA zcIuS&qiC4Z|4zO5HpRLX`QqDz!XxV!-{CA$r+_i9!i@^15sHYyPbT3SH<9s?5v{4@ zUP^QrGd{)ZiAeK?_F`xfvu;{ ze&0=dD>~ljpbcuEOhS>dkTx-Di}Odd=Sx5WJ@v%`{KxS(=(aPas&^cC{aWb^xNS<< zKDj;*N_<$9M%BnL7X)9}wF#sn%TcVdh!r{ z5P!gea|W5h^dc+-YR-l?nJMxo8gq=z{$V)jl;X#p`B4jl*aTwIWN)BdW1jMuS#X-U3F=t!2oq;)M(D{rmoqLd$tYt*3u!=Lj9N3r^Es5LQmG0| z0!Hf!z?+O!+VE=xjZ6{XGIf$r7_QJGIDdq1=TK=9OY0&GHI$P%ChS z^F~7H?Hsr-EH)L(VJ6iTBvK$mbFXmiZURg|M5aqxKxopB3nK}c6lahzok1?;RaNRC zd~k|%B1L{jg~?Q7;|y&Ao*~Vrb3J#(yR# zmAvK&;Z8cX%^=nin${3zf#FHb#(@LOjpRz3fcR1n!V9Pt;;NDe+sLr5I_>mAr-BvO z*jY=e{YAP4+A@YPZ`SIR^kVv=k>K{5bL|`wW*BIrDsmekLe71oaz?PfWVx1bCFG3u zj2#=)F9??6m0K8YEv$Q1e)>E&uYW~VM5vx$n%4_GBFq@kk)+q6uZglY$-Ym8VDRz8|=?xn`v|<%> z#}4OMd~wC38Yc33eokdYz9h+h%YJYMdyS;on_g?|%Q10nOo z7=To?kv+2#Oj(tiz?o$S`SB1dbU|ha-$@rg3U-C<9ZmaDC3{vW%WF-qxORi=M+}^u zg(TWsSGhpt(4>8mR*p+?Mm}u-$7WGdh70bNtpPsAV)EvO6|^DF&iCny|J~+_Hj;MT zsswaY3Bf2Pbj}P?&XM6qNq^`!0=8`8@BPykNxIl5-NlV-dy?l_=d3iGESbOk9IF29q<#r{mM3qw$>qK;zA>!?1VEHg?6MOd6{| zuT2{F%=vG3TJllxM*YCX_8s%?t@)D^`9k!*`_ZkOsu+G*IJ%wm6>v>~cT{Z8uKWb1_WwSNP>xv@!ytLI1VY$8J2 z4!G1vop5~R>&HJTmUH9IrV^f}NL{}PsCHC5sti&hw3R0Mc5~pmReP3TbKo-h&A7?j znORee`ojw^+_vVl5?7$4Eb3SPt@LC`w=JL@`UUX)T9CJZ&b%pO#0cOS5YYr)ke?cK($YGa2M2DU7c zBAq(q6zUcZP%Ej5Jqb(v&^+PkR5 zq5iE?11aiDH+#DWX)fh`aQCpZo%!NG0@n2wpxv-0!ybkqprvDrt3;|IRmTYO-**lvDRL^wcIpCa3tP3wbNSA9 zE|h}7@knP}2FLWt!h~ym;xGMxwf(NOA85F2yQTc#q-#sc6KK1a`N7WWbEVP?sdh0T z^I60VKUn0d$PPqw;vY`ON6#ly{ChC*gR3roT@UUZy?AwhV!!rfzZG`TBeLJt>wVaP z>o0bV;g8ro-ra7m?RV)1?+czsyZGAWQ#Up}jvV>H-#c%bZerMjg?V+df0FHyxT)}i z$>i`ZuJ081USUr*;+U9M|9=>dc8BpvCyf1E{bx@}_Zf7Nn4g(-H)xOVf_A&%A$A^r z30m+DX)jxM&8fvD5Vrc;i}+JNc+}+_q*taTCTLfVURc zU5VaTsCRExJr2F-K%tkknuYQGcrZjCD-SiGeG%jNqDVm+vV03)1-jC{&hq{&gHX&x$O*f0 z&yfA%?Y6^dNrW~`&3m-HD}z*S(*w4Q0f7e|#@lc6C{CzLlQPasktH^E1|uirqFvBc z8J*?>W-ot5Fa=31|NmM=tLsw3OAC9E1jm;_X8|81gUAD(CjxS04cXmmd+mN}2;ma* zU_BqQ3`N^~vC+zrjd`?NFoiu9(*m7d1V!{HHvD2|81Ud zxo~T|W;lk!QT;CwGx~zu=uxD?5rt?ZWCWK(y7Ys$pU=-M;(uz$A8Pi#5D^R+nQH5Y zkaLx%+>wfmLX*8tRoX=KRcivHOFgYv;_YV8sXlEjI@%yRx+Og2vfv5wcsKzTzSd1= z=WjlqzOHIUqfk|)Sa-1A6{yj)!eR z8O$x+D?}m zTX`5`wjk7HuhouH*5M)h07Pi#mRHhDvjnF@Ak}#7@(zmw(2yijIH2xZq-%^FFhqih zDoec_Qi$rhV4ELSqes-tZqeu>jCuB?B$Hie^YOI2e8?h+=JdMD zUA5$je+t8ZeZ8PM1>`q7aCT@v&Rk(F!s4JYVa_1=1SVF|_9p-` zu7a~_r<%qE>TBD?fKCi}_zb@mg8Cq4IghBa*doqIylW$6dT$uDYXrWxDOO9G=vH-$ zCB%)o-OTM+?)JPK0I6_MMVd1jSd4hes7I@dkhDzeF^PS%Rahk ze~L``7br3Y_N3;!IU&KCcH&Fr@9X)dwPd?TPvgTEFDBEY@zIpt;<(!2!J~>3Rgr@Xvl91K$m%$sJ(&(I=t}_1nLqYHaFzMb#*&`*{O`>2??i{myFe$THE9$0oE_sqSC zp_C3Rw0)YlQi5V1kJZ?cE6K?Q+W+1o+0NQKzQk#|rR@yM%;FrK%ct+i=TqFJN+>5@ zM3q`ON;$5UbO%zwa$-JlE1xHhJFI)YcU)5U-1t)vfv4-e5ua*0dXXYcM$BJ1f3xYs z!~A+NTU?KB9ruskix!UiOYcQ<$NkVy?6`P7@q`cfCz1F&ai2pVLCQVN1Sd;MLJ7gj zi8&}n$DcwSM^`k8)>}BJ$;@$=W_96~@rZG7+|2s1uzUYZHy@61s7oa1RB}bofEWY9 zIH3bgHxXc3iMtHv#8kpGNNN&se~zewO>7hb^%;M0+yVKVIpe>?E?6I07?&dkwBr6Aqslj4ptR;9t`en!-Eo654%8_Hbe}yz5AR~%E z5#&Bs5xQGBTsT!aaIe_22C_WXJ?DYrV(xx)A}wzp?(U~I)0?{y^5%W5N5_3i`6ap& zJ$>tW(+jym{+?4~ZR<6K!L&y2Ui3FTQ~L?_SZL2czxO@pEP1F`qWj59=|;%fBN7)4 zYK!_yWR$%(YW_bUW7B)!e~pZPD;fKrjEnyY8GC#BL3rEeL((vtwL|vC?SI2Td;P}k zGa!58_Ltm#Em#zkM(4`ZY$oOt=5aem*Be?EWLA{>geFOJ$j0_O;-Ge!WpwUb5TIU| zPwwOTFlBoj+))AS1?rNQGzPBKFpJ2fLREmeDfdMJDPr?cCIp5ye?w!5GD+ZnStc;3 z=cRFqv%iqt(U01UaM)LtW-=oah&B_=;s(%4{!F@v83TVgx7 z4cQ4edht*$nTVNUG8K^>jZ!!wh7t^ROr)8qS&}NikmUph)dY}N*-{Lwvt_uor{bBH zR!K$#cJn&qww)vflNFeZA$`ECISs0ao#{z~f_eO#n?`E4KG|NS~GP}MpU4;>3R)vj!f4qGd4txk`8d>Aos1m53 zM;w!n!BNzk#P^bEjd-G0A0p5g!B3^R9;gOE`EN`i%k5QKrQND*i-#vGnpw8vihyCG zmG2aCSoa~Oz-$F9PJ~j-f-Ulx*d7YcbB1TrvHlJk$5eaaT5Ns=Pj`{8YFpyq(7qI zq&sv-6pg4n5age|nc-wMwKzsXYzI{3H#q777cpkI!i?7FZf&C?6Hl8O=JUnFe0D#* zeQ3O1=~{HjQN!My)ealq9jVhN93r)94rPBDr`4w6f3gLQmP>)}N$z^+NQ1J zns(`#SwoGu30F-cTG2RN*Uew9%X+IP72ZYtX55%L?yOc9oKNraPw#ES^Y7<=*k5WA zKa+ROUq84fVAMNYlUBrV>wmEOF098+U{Q0T9VZ_)K5)M$R?VmO6RUT2#(90wgZk#2 zciqj`6_C|mxxNDa?aRDhT3xd2vePTs-Hf5tI!SULN3fO@> z2##We>9Ao8r&hjLO>LyKN@F9}%rr0mmymG*6@R$-Wv`hdU>G_e*t$F{KpzcSI@yFN zQXr)`Mz{ZcN6Kz&OjJx&Y4?!4L}AF|$M25E`;Kvg=4vu5;z^+~o+K(oNCY$HI?CA+ zs{&99Cg%~9nn@#AiPw=-Q9LmPliR5>i()Pljm+RwsMXXk!8AuR8QN+4lZyyaRX^h494RTM+BvH1A)y!_d-W&qH*Oh)m|=8z$~ zbe&UlCJnT0W81c!bZpzUZ9Dm5+qP{x9d~TIqmJ#9|D1>WbRX-nsz#04ReP;Dk+oLo zc>*0c4p^&AnXoMgAfP|rdv4~O(42{y9%PbSfiaFs&Cu#G)+7aCS!S^(pzE_nVsgSrVs0|#Rg!Q@IuS)yX5Nf@aJXSiF&Bd3;FIjuh&C5`{H>dG%zysj!5u+h9RDqeIHM!hbZXG3j-Y3Cs}#( zK95%jtsiS%TTN2g&XvpK-rP)Q5yi_yX@X{1p9HY%Mx0NV8_!0Q6NlmO6~)0eFP@g- zhA;NNuGCMcoLCab$u;)V|CX<4-flgV)4l1>&W`NOMQOhsgV`ek44vVVD4~vnraA*d z(x#D=$&uB2bmurhxKx{!tpEi_dk8j$>ZyuJ6cEMEC=)eJ!=UUctoj8rDKnX5&9Y?) zCUp-uG{J(0g5Xm*PbR+t|CXq4-qy=Pb*HY|i?6u57YmT>v$KY#CQxayFa!pU3g3hT zPU6X1+?(Fyk;4X=($jGCv4Qy{<;e_^i{Co1A9862kVE6#TTTt0@Bl`wB!=mcd^9U9 zb$LufaQ;%!JHJ`zBL_%Jx2#m~f<_)opOxC-nqn)omD`8h8=*$xiVjgxwRCxOb2kxM zIoYnwglzXIjyl55JKF-I?miSkuoXg`6FefwIZEV9m$P;hUMG6lL-kQJ?PHJmK|nkR zaChi5Gc;r>TVO0!4g#EA5(qYEwq3YZ%Xt5>$4VS}lo#K=zLvJX3P0b+O?PEnJa*oz zLHC;^;1t+>Axz&WnD(}nrVzOn)7rXUad0eZbS&z;iRtC+tQ>pYzPWhn9f)+S>bUl; zUQCOH?V>9HdqyVL<4``JY(sXR9q5crjL78p9&<9YFqXN{l>^utWjkeWiPvoU($x3iBT*Un_70NEO~m7J zdF@Pze02+4NdUo`8_6y$--4vn+_Jgkj!hxZno0BGWDb3#xGJe~+ix5^Cv%$W+QwbW z1{~P%n5&Mgq~K;5oX*Pb8kz_ca2PnhP*@qJa(L+` zb$guUN{IQcVmU7=HL|7hg9Aqlxt?&A!m*a#A##%}rUhK>-q_frgvqB+JC?(9X6SP^ z(AgG;7u|KgbNeCZAq36n))m6Ogc5t*?j$x=w8@ooRW3Qw8}2_k!a(RhFxz$9fr&v7 z%(ZB>YFYYw;Ant=9vjn<_kl6f2TVbs0nk98{~x64Z!Mc2JuUhVz+;d`a3APCf>6t$ z=MXq)4OpACTkJq=LjhQ#NW6wzT1J^bA^77tPbLayBJ*|z3p$Ijt#s<0_jyak>?yr^ zcW3A0J%5$1-HbWj{2_QdJ(MNg$==S7Ik!%|8ZdG0s(g0*@UmR3vFMW&DRo-3XYGXz zi{5(!(M-d2wRG_Wal<3Y~GptOrfn(w-K- z8Bn6EPNmt^*I$L={%q{*&Ca!>NmtTk=B{^`g8uBDg@yWyK5A-h&5c-=Aq1ZJMB6mo zi6%BzdC#Pfn)WdHLV?hMUk{Mc(Ja&`)lx(Mi~Eew>;3P?^zQEWm(?AisX62qOa$|CdHvX?ncg9=KpHGhmR)Mhh#}A71FziH4E$TEF7+Yev=1xPTH0WRI zOJTLn`}$L*N!HM%zoIBO$4?5dfvlqI#WJEqYrAd`FFRUxQw2~k?tZM90WT@LZ z%*gxEB_-0J;jc3*qr!AqVs@RhZothtN!p7F#7?2R16OKjqO8TzXT5=$K-}Zgfqj69 z0m(NA6r;XdFkp*zexo4}VCO!+D*W0mRQ0!^`O3s2b!?|@q-CCcbw|h3jt+IpDis47 z?7=$8bHP1-3^CJcoRV1a9FZSu6iK2$BY-A12R?Pu3g}X4 zR*rxaP>kSo3-m!#%qVWhjHlCyeSd-y1a4Ev%lHMVY-Q!xGrz)T_CzG0^|&|+>A>*% zgE6lZiT92wXya!&Dw?cqY2n)tu~4lXAKC6yS5n*X$cCWt(yE}*nYx^0+iDK)4u~bB z{V+tliq#k@$5nmSim@Ol)_FW>uDrA`jhCX9Q<K z^Yus{kSpaU+XY8dK}jK6uLdOgWxuV_BAePS2)bofa}Z3a?Sd|V%!Y7(1_n;Fcetc9 zQn+cS2kVwGWD86-L7RnxaDU4Ps`{Ot?+$F#?0M9PVgWC>je&NO+YIN+LK=Z+1nhvq z{mt`6I6F(IVIw5*BcZ?;6WZVQQl@+VD%~u5Xa1=d7xLDwyC=i^-AKvyYg&OH=z3yK zc8c=3Sa-c$=UPdH{`h?h7@f|`GN}i>zPNPnzkPMfe?n=pg4A*uZd8uMdM%VOvylZI zWMhZ4-7=w-$;wsVkt#qcv_(1x-jJhH$i{#Eca9~{@$@g_=cLiu!)o<{I}NwWf(&6~ zktywks|f2|46M@I`;AyJ%7inmM6osKE$yG9#?@u||JDo~Uy+jo_KC?r#h-v5Ij{m3 zF4_D8;)k2AK6Zbd$v;6|j1eufZO@=(MRE>6cl`^gW3TJf?RQ`Ub_?gqLkqh2{J4s| zx@6C@Je$Ae>!n!oRN$vn>&?sKzj_6Ay7T|Nb5@1dm~D*|9!{!vC+T=?+6*_TOKO`= zro%^dh0#+9;d>ejXy*X+nAk9K^M6d4OnI~@=C{JXJaT?eNC0)LQYNS?)Blg>&;l4XGS^rykxdwch) zYi5EEd2sOoND!`+k07EX0Ful(0IFYgPORQ;@KY$ztEYPbU~2zM;-SguV#Gc5hWeBa zS43vqaVpl*Y zrgBnShIC625Z{2SnaK*io0w9ov$V5VjJT65kV~jD$P-{kWF$O>2zEvJMkBEv47dHt zEs~9hmPmMKSR_~9T~B)z)N2ujH;k0oQhfgJ7L5Td7^k4fWXKhhs4L4=J9+hz=IcI>;h^d zzv^Ntj z@ZmxqhF&sTFE{;>e!CWr_9pL&T@5pGWgvXv$!}ku6MPaCe3jF^xwF!^Nirs*$M%@P zuq6QK=j9UM^Lkx;UB{}Poo^F)pvUiAuXEtvc=AP`T_1d!zcX-Om+~+B1&;&y3?n9b zAVv3c{XhLg&(Df}iyh^^vNcu5 z3dGY$x05lCTS!^@lcDZ59uDDE!0_On^cMOoN+l_^LtEgtk40FDdbZ@uhMP5j>`D6o z?&LVrBCMsg{?IL_;l8rALwe?xM+Vk@zcVTs@XWXBbXRlT+3HjjU30C5PMJ)ch}(#b zg#E||X+zrfiL>B66%Bl*k9>3XD6;Y`)rfs_fH*4d>lg-@K22efk30EHYmVXJ*T>e= zFv;wVQ!x0WkT+}4!^=gG|9b+k&1e7E+Xd{fq^JpL@?bb6e|U7L$lAGBDobcNWN7~| zZ4!eEv$<%<7n`gMP3yx9D&KdWsyzxlAiG}5e%yK(EzG;t+|0>^1+%1lQ69mCcBf`i z$^Kp8j{*wWXd{NSiu8yq+-h+AKC8Y8Gvm+2_dpSV+bBZ7#-_(Hdg zE14#l+G8k)$wRiA~`&R-`%zw*`KZda)p#Q(CIP zRdrFfvN;yUSg^xd!iQc_$4ayM%X(_;UAq>j&oF-=va$g6Fag7&G=7BlJ!~=KOqw?5 z6p>Fs=&XS;yO2|zdXwXldv5J=$)1|QAD_Gv;JL2xsSK&%%WMqj4_J%PJEQeN2SVp8_4 zf18?6pGYCCZ}tMKTy<&a7%n=bg)rdW=FxyE%~DVEWPoRX%ouf6181)c z7fV|vdqjT&L#%<9OcD>k@pyXNJ|PwVKsoL7+?Zz27{SE?e`TC_5ED+2gKt=rGee@g z#cJ8|rWXRpKSOUC=b4O~i%kk{kh`fpy+Ql)V+N>d>Y5kV=g%Via%L?^-C2E{JXRN~ zrmQ43c*gLmpzy5ER_xoaA!jW%cP~}ZiyGTVDcZ0%;MK-K?5ScLpk=ITOaefxsUpTk z1!F9h5@^th!{Vp8L-f)gsgG(2e_W3O=p6E8Zi4{1r4YT>Fq97HTi_)`PtuG_n%!w@ zDy#~l_Q);mU0k}N>Hg^H?KXUj2zONkqh~1Mt-}`+>3*Nh#Uh3)4{do$LA%v;ZJr=Q zU|;vmA+`itH@vLi^s&~JW*WbkWP{!vgBuPAU2~hMI!Q)8VSj6sPsSL72?ybr=YlK* zDR_Wl8~|H!+|MPZfZ9+c5Yn8u5H?Frr(q~%GGb$j2b3i;eeg^7XD*`04S3I%_;w}KsTsu+&4g25O+}1AA`jDg9qHao$9u+!S z0Or!~hP9}oVdSO*Q%HIAj07fAVgax}>+pX9%&KGQ!i}2sqJqQBY|fm+e!&L%4;leb zK7Yr^(hYXTRB4c)$m{}3qSyemXeUW4`!Jr-7Pw#EQp3S zAo7@7m9b#s;zDR9alU&q1p)AZkG~yS;tA0P&gMU#7K?)GdhPH=AQO{}8bIB1PhCWW zW9!`XOf@S}v^;}{I@*ZeL&H#kv$Kk}G6yuxOPTeG{a5wW6iGhHaPJFXXZKWg zQr`tepPlA0BunGyeQH;C4|JC57}0w%0Pl3i@jb9f#WKX`3a*6)WDJ@*;oLh)sp#wo zWIYWcX%eXg%sHY~ST%$+Z^QcSPrf2pEL9yM2M3H6eQHVjv5bq3_3JFgDqs8ZoF++ z;RK{U$E!g%^Q7$6mQ(^qcT~aj^ax%JgQbCt6RWzkh=KkZrn8-;)Ta-h;haehB22hRk1;!@*09LzM(t5ZWw9Hl7} zIJpXX@Mrq8I+?{NcyUWI zM+>a?zZK7gzHUKNZ&S}f6`x`wp* z^7Jpct1ql&rtDYzc;rvGw9k;KYVWBS{c0v5cU>yk_OBOw56xHle@}S^Qm#ZFmG(fF z(ErJQ0e~0@c{v7>9l@|AboHtNFKi7X1xZ|>RIoH63);ONiLBjoqgcbMuZIZ=ml@BR z4dJ1JN^eEc3IB>rwdz2qUhu##N1mTai>!GtVZRzi`2L(nd{TrGy&Fmy>#m%t^yDzB zz*y%}da{SfwSw8)!I`<-z)&yNZIc=nocw`0JK-Ql?%Hm)rLf{2QWfqxU9{0FwlYw~ z08VOjK)@_)RDUvqh^E8qDBPrYN z-t!4BFMlU5SAR~P-tUQ%>dc=(8&G#j`7>!>R(C`tPqdv>b4ISM^f? znY~d83Vi|qf0W+_qZ8$J-8HeO!&BL+8p>;Y=)8jQ*9S+R83Z3=rK$>rAo%Rx^E**h zC|5-I0(eLJ-xdM=0HT2{F4B`$pDdtiaAon54O0$f`iHNozKG;vW;IM@0NQ$Tg;cqe zn+o>lZm_DayCR&p@?N3d31sQ!dPUfT)4Ollx$K^X*-f*wz79onQQM3oWfQbZr=fkR z76r0=IXqARwvib{hPr2$CKPFk2~7DKbar&gs=BC#t2M2Bl`su5Wiv@Kd+s`#MY$Jg zCVt`%pt`R0y>O12aVS3qkj8IvP~0+;RH2^;pV&}L(hJZwsg<;$TuxfimRvQPP=lzo z++{4=^E~EYwm)sv9yhZS9nCQ>dm?G0{Sr^VS?>DTX7Zn?%VNcq>xt8~3`$g%B=;nI zL)F`NUuEc>p!k!|e(DV;YL%!phN)E=R_jukhu%l6qSvC!M#jehxU|At{%vq8E%;w_ z6gG%zI2vdyEgIE09veMWHH@|!cT~s~&Q9$XA`74VX@Hqd_C2n7l9Itj`JburQ zVURV~oLo4BcEac~FzPigoxQoz0T5Y6h=Wdb`s2R{n%#RKi+gQAL%2^h4yrpfi)GYh z0Ok9$XAy%KkLre?_|RI^y@3NdI1{#b;W&JEj%~^oUfc{b(w%rpP5gRoi2+VdQgF#6 zCNvnCSz@{XSX1=E-NE?7cSnI*j!fhWQM~u2uCr#HTBqgjTcE4|J7{^`7*-BGwJnSm zu0K_|7)mF;t#pA`pna_kfEXh6|1&q4QYs8a|MLqdFR4w5@GO~eY%TWr(w_eH|(}*vm*ETa8{uAebIylaAO9AZ&hb@KG<#-3+(2#9|Enz zLskYt%L<8=WeXGnoI%PxeXXqNxB8%CpAEHv#I8s7bDQcw$G!hNtSRIogA4g}DlG_H zzbj&NDO4*oiqMGB`w<5dr+|IWb3k*<6%upgT285h@Im(1GKc{gDh22#C>J7%)&iRQ z7?rgEDqrW;+kY7YyR34SvJ3nu3$yY?Gb=)hxG8G1j#;L4W}j-x&+G=vAF7tp^2$8D zdXj0uKvWJwx6$S~jW!!|XY0N%sVuEUD|4|FY5m8{_NT!DPvKhzqf_|Pa73W!N|E1$ z5}1o?DuQzOk9sZ%w(8WfaBE%dICvr?qA1G%V&WYe6$!6f#QHkV7n>OMIP4W54JP?< zSHFfBV(7zPy|A1Wo-FNfALA^&^FT>ZxD2yrMHLWvASON0n=*BQI}8r`^oK6VGkA5J z&J=yjvCIjDNl=Dkr6c|Xg&}2|@e9H~1DDQvV@xgT2DO=`?6ul0@OX!KC7^I{zEDsB zn0Wj+@t)HNiAleLs|P~#hHdq_jS47~Bu#a6oXw#!C|kmoskl`g#&EFHN>Dh)V>EZv z;c=AoRQF*$TZDPEo>O-~PHeoxgJrI1SY?TVb(#2&3JMP*`)THxx39=_v(EK4h+#OY z7ZGUGDyoYWeP^}3TwSI1VM}GAMf6(%*PpR4%+XoCut?{(i49 zMf-b+sdZ1)PEpT%sb8z(A?s&McZk1poSg$?=}z2>BV9+38Z?UxgBf{!+v_ab#rS=F|DnyDFRj;OWkY6B;y9FN;N*%3rLhue_>mca(f zP9jJ+Tfcn18h%~Zmv?Op@Oqnx^tu`%KkCJ@#M5(**BG%9cR&t(d2SlTP~3y`J?AoS z^en*ft&uA!$XM$l2kOUG8!GF)Q3)c`{AvaErLE)rhoavqZTkp8DEzd7esBKMDUGiq zP!5D>XodT6N8YNZoqC5IJ*&0?fEP!>aAF_)Kb_xTo)Bn=p0fVn|M9#=Kd@(gI(Uta zPM&JMW?*>Q>kF1EN1P7Iw?*)c&?dd__$*0hk(XDvxkhrZ??sD|60SNOd5Q6Ic(p+M zlcaY#ufQT1C$uDku%|9#xcsH%!Or4<|7}f@>EG=tz{?s(SdHYHa<+p5$ctYZ!OZsO z_jm9e=xHoKnf-jTCzBGr6Ju|4A?p+ZdFmpaoiBH=@(=F6zn2H%n4DGmf&u7G-?>J0z&)_UJg* zq}^0&%{b}1i^2CeJVgHjKDH;j!rE2dZ<}9Zv&By5sk^W$=$()fh8+(@EVAJJRLLDg zn(f1+K?#}%>}DZ$?oMBB3$is?dm>BC^|&%wP8DPRTnIp$v}F1=d0hr|^M^J&*y_oB zymGJ}X7y-5fiO~B3;4c#ytpxDEMfNTNwEGjoUM6^7h+^_H%L=Dx|clC}lI3jf8k*;zXrcVfa1< zVVwtOdyg$%y_>R5?|Jnc3ciQOjTgix1zHD{`Q%qjcLZ;HjoqV;m-7xe3~Tk%N%q0G zXIN?LS18x>MlX+mMZ=fBXExdWuE4gO4ido{LP8A94yo2%AY!AOn z>%4r2#*|pEHoJAJs&gxyEVX7~hfBSMGHvCE?IY|npe#vj=FesMF^EP@#uigQs_o+G zkW6uA2d3Czs7W0)%>GuH(s_gKUgF|dUF>7gpLL(X-1%e+hYnSSoK``ui{m>qUJki)Gk&jVYk^UbQ2+-e(TeV{JGqL=8A~MQL9RHNx_1 zsbc7F0bI{DKoPwU0kYq}IYyh5JymHfa$L)rTlY&*gC!r`I0R^yY5f^lU!eWzCa2; z4%i~du&;8viNLbJ*8RO#wAXYKh=kg+MlQvKu#`tATwz}VzI(8v(>dAz*OwaF3f)@x z9POhoq{>u@_ELJB@%N@e*`B>18^WeObQiWzVL0Q$c}t4tQsk}#6e8uml68v zCN`*6iwe=~MJ9Xm^1^a}nr>Hq?V59-0w8Sm(Y$RV#!qQhbAqpbO?z<(v&omQ+xxb> zdTJ^?U4xO4!J^tiVg13^b}_~B(bnyDWaZnn&GxfC z4`gH60Z97=Tdg*umWDp(2-TuL3&hl+6w|`y`G7j%13PMBjpAg0VN_N!FF)9r9AHsB zWpGhYU2gd!In<2vo+Kstp6S^?R_WPi{I=M+IiSYLyM|{3NbCST_VMZjGUgw^8GI__ z?mG?6wC|@cb_)3XQEqQeokNWfu>Ukzy;_QQG&Zxi_<9U^EsuI{94-qo%F7EEhkc{7 zZE83cfmovk+AemeLC7U&te8)`1ROH%nZKHS9V{yNy-DX@okHAAwynlb-+1z@9b){u zHfOvFnN~nMIaiqxCv#Dv-9v90b841PDvqIYA1|KT5wDL_O^Seeyu~q-V1digXhz{I zqpOIG`x6J{X1(h6P8IF@n%z=Jz8Z*CLb21xcav~M)s3lP(cR03y7 zZT4sYS$~k)VxuQ0-C-pP7-Psu@VaBYL;5fjq^8`Lz2QnBBK{yvQ#B9RaeR=_&g4u% z2OB>Wzo<+;Dq@jy3N9zU9uy1E@FS`j5_$T1v-4!f3K8ub;w)jGkwOD+12Z8jOlZj) zcn~iE{Q)tPsC$VYkOha`19CV7g|M9_e)sxzfQ$(aWG6-+Jn=ga#@EIRv=)jb&eDf` zsqZC#E`!=g;mV?gE79ZH(hsSr|LX{KC8o>J#xMdh8<~v-;{px+Wh8k=Kx4d{W;M{b zFDcG8Z?;#PO7so+(XBMwsyuH``hE)=-?O*}jqqC#9EqwA{Wd0431EbBvrY}RF)@nG zP2eqPVBF7vy`|U94r_#H$qw|-a1n~VJf!(} z*@18xu9(ZFn5)Y&<^J^Hlr-<*pVvwBZYb!Qv1C7FYiub39c7JdFi3DgDBLWJuIEOlNm%FkQ^{wR3vxJ zzgepIjoq`Vnf2$JXCH^`qLZiMi|$Z98^JW%0e=!UGd;)IljtXniAN9zos=?7!xlym zrWa%c|K}$ItoDDq@@oRzPj;k@{NJ%Wj&7w0UKI_ent)4L3>NDpLPq{$J;=U&EID3c zqcGp54sYIjxYZ|T`5iYQsOXvk3@Obht3Y7^SK$VTR(y8ppl;AonGWOXMj+*6G;VHR z382c{w*8_g8!e6~WnNF1r^Xd3@7f~-MT2VS3wZpFw!iYmp+l@-@`w9dU86vDV@s;! zZI*#+WdI8@*qL-KmBaB|(I}9IQu9jYY7a;jBU{Qv_X;&P_IdS~n_#3e#PjXMyvr7( z0&Y*#381w(_v_BT|0Mo#z6=nd?QBO!ea>_cqz|w-G=MEMCamGo1MDjvOWNU=+TvjO zkxWAf1`9R!prii{;!6HLRL|yf^K!hWUQ-TF5&XI0teSpsi!EuT>iY=b4z7cAuI3D!aL*!Q7>k>1Cd+5dXydj}f`7 zA?I+&j?{ah0k*ApuW{s%5y_i`qlo2x(!js=xvds*sVfb$<7re_V)n=kK zG>IcQ6+QOOf>{K;8G#RrlGLM!d)4q1u$fAWLy4JaVj3d7bBsi;d3FdrO4AULj6PCm z2!jI8v;b#vUZ9|FQ5ZHpLiPP>w(EH?&SDyrrQFP3xS~m93CMphfco<8B~Zfy1%$i0 zuJNoIiQ2qHLY;zlS(S*m%C{JQI>HfDx01dLuRV5%&x_KWo1sM3aDjh-hyI}_2|EuZ zP7$LRrD~gjr#}R?48`blci1fv$Xh81W&I6NEAKlooK;3$t5<2bn=&Y11WJUH5!ebY znw4THo*JG(Z8Wqu23%}`E2c~t2>5&LtrbNKOuot$=3;?be;QVS1xnFNCNY7>iejgv zQGs|elhN#GCh*c5`!*Y<3+lBQEoCSP*uz9{y0l*s@B~dT>waYug}h9rFqo zk9_kzR|ULP`RPRx^qRyeC(BB#iS%>1e{NeM(8SR9yp%EW)|09R%>X%KFBA|pHqFUv zjmA-sYiXKV-mdX5Ls_vuA4hoIb~bDn;U>S?nL^slG)(bVYr%k^|$~( zdo}Naa5KZnAbv)X#q~RT=1e+^`)}!McnGQ*!eGp4?{9v<%eRuOh{D61TMvWM`7Ipl(uHHBQ-b59_S2Jq-7-dPP7m}jTm@-?nc zLUGzo`C$@S!cn=~Rx-*+F=JSoR&_%daM z9X3xHr8Qc8Eoh9fvsHLz9Cxbam>OD=x)V7@7l0o!ti+ik8oLD_oRsP-ZK3NtU9*rv zCaujdIK2M&Ohc^k>FA1tu#yKu%owSsT446t8jE5=HQ$q=Y=Q~S!FA%EX;bILURue- zJ`@64ha79@`E)h?+TCm*T;9!Ui$YH$6C-b5)#K^^@lmefup0^hCP}V94szzS$R7<% zQyF3p6qFo~RLv5Rrbd*hlc7+)8}tH&R2#&g6s4I^*q>&zLUf8x8&F_S?IMyI zgj@0(W_3%_ECxnCvqmNWD2IvDOhO{Lqbq2_!u~WE(z{E3E-b37C3bRxBC`CUM%_X( z)T%KHCOf4pivRQ^On`Kz8Rnmx1kU2Av7rYdjJi(Q00v={Y?q|UB1IS3f=9c&1TO?( zd$(F?>C`CMfFdO42&vvpx!Jib&_JkQu!LI-g;&2vkbYh-lPe%vkpO0 zB<H}7OeX4BIeNrvV@0#U0Dnsw&vFAlG9gexP@C zYT<|bLX##dJ&5T)&@82(b8sw$vG6riTzaGPC`1Dkpt0sl^zR3W;f1<-PWXG0MVDyE zQ{?np_XQ$UIBA%PY~^a?HVBG;Kv*wryH!&lQOGteF!JbSJR9z4pF)EM-huZ%Avt^+lam&6R z#Tn<%TVJ%3aluKpo1Mq&cvJ#r6iTmb5}RTKvIN)}q>jalA1;moRwwhs+iHqx($b^< zIl*ZQ+!EmD=KTi=iUZi(KYLwo)_7lgpXsh5 zM}R+$rE6i1vnFh1DZUlryc+63bzLRmj}tsw4Zb|xzu7{`EO64${oP+T9M?r+|4-QJ z0v5o2#mCRBJ8X0^i(sjLm8^hS--ZFdkLM|$rzK`>#4oDCZuFM0Gcz zPG4XUgi8U~wLRP6jNv}-QaKA4?e_=`h6Hm64u2PQT2mU@6#h0LOyK6VyY6K`A--Nd z-mYNzfKzqKZufYSct<-qg%xCf^W8qy^%M_w>@l(Ivg;06x07$xNPAg-29d?DJHuH6iJ@#GLD@P!bD$)x^PQ3d1^h}Zg5Qs-s2r(;$ClL~jS zoyarwc|ZJ>UE`aZ`cODPgmYx@(`xT#>}Jq{$_?A>ecY{rc-L*&vdd+wKOvB9%@g9+ z&;j16*X*{JA8=`VO!ut-##f%OddW$-x}OHs|9tP0XH`g%?`_viC39=N z*`i|_*jGB4%9F?Q1?>rWVKHDNXY@Op`=mLfAnYT<4>RDw7Y{Fn6oSN}T(puXE%%8T z=eX*}>J#$V?sUI+vHo~|yzd7}s{}?v#OIM)^p0z=pAaGBhO>c4C#?h)01SWmKbA^W zK^^KZdRMElW)HRGywf;!fL#@n4Zp0dMkavp`tcr54`@EeetG;xZy6znb;)DNZBZ?_ zMs0>VL@gs?R;KU0(Rv&nI2tijkBT<)(fJ3GX=MW? zTM?w2rM}Sd>hqC<$aCzwMsAUnPuXO6iT4 zj~Ek%D1g55ci3&*a;Z`TfuLH%{ntmX&?`p-_#P#@Z8cGjQMW<3OGH zL)b6St6Z4$2{G8Qj{pe6A&o;9XtP5r!ox@J)p=@t(P;19zg>tD9|cOAPIBHI7#{@u zx{BsKspiVBRg%ep=}D6ATjh=3hvA!$Jln()dRGa~pCGmgh5-8)B`RNxTOA?UQPx1( zEKEG_7ua!GX9i5!KT>+S!srPgXb1TsQBY{NB}ca*&7L4$A3K6VVI48M6WBPMYB@!1 z`qrRaLicR<$(c!=F1OEw4&TJ!Uo>!9Ov%X7<~cLLk?;=aT&OwFP={2Q1=!@&Do0xP z(X$qA#(YiVnt&u^3gt9KP@Mi{nX_{_T4of`qzn{s6wQ+NfxIxiejPixFka}mcB}^r5`_`TYycQ-L@DWr1Z@JWbW7L|sh154 zGlPM|I@Q{(*2Sqf&yDqE!Ke%HD7#O1 zpU1;DTLEw@)PL5=p^}DT(zezz2ZdNYH7o=68^Q{?q&ML`3hm6=2Hg3S1_N*QkM{N< zcuYIjb%gjp*2uX~Il(!4!kPQ$K$xH3GP4ZyoCbj@y=PQV~26xgK=(aj783!2&H&wz}Jz(18HU$V_w^mA|=ZHhGH2c)tvB=DsF}$Q1`^MtxI8Eg8uHU^g&!5{;;=X z0^sE+Vz$?2LT%ObBdsPYwe8=R99zj%OqI7RGZ$8bq%w8hvlBlmk0}3@IjD3TH(MXd z$)&$Ox}oVA)Zb$#d#KKN(Ra+;*^ryDjUL5vDHK{Fy)?m?#}LdqY4iK}@N;i&F#=qE zidOfLCaUOq4!NO>|q z;U%4X-8%D&*g`BOG+RaqXix*Fh|mDCRX`CS^6<&R<#ek*22u>cJv>VyBDi0053j1u zl)h3ZNxAdCID0FD4bN77&5jq?f{ zCdTHgX%If>5F*(U-<1OjX9*2QB$9@MV5n1l>{StRg#`*?3-P5)Smq5Z#q-drs|tY> z9o!M#A+pqiGz<(um^?I6$M6;WZ$6htN}xJ&)PG0cwE}JoTk@O8fSr&F_~GnvSS*-I zuF_{3_eu)_c~C_K(hvX%yBY{Y6exGW9)>vDkrf>9i^N~~64x0EqsPiZbZWxBKnz9* zc~l{ia!{z^#(Xu%O@??81=t80>O^VS+MR?YQR!+}4|U35Rj95Qf;`2r6P-P+S9SNH zCX>^H_+o;4-qxo%)|~laUaZsTqKGl(4>(ad0S9Q+LNP_cCL@4-5+s!S*4#qgh&M9` zf*4pFQT~srbzVn?hjeKSuU(SkqsKE#UTg#j%Fjb0Z#D7~H>BDd-C9=e8k~N3l7)@P zWTLl)z2CCqX$+i_{BIf-0|x~nk6F%DSKX{Y9{AR?D%4%F@kuPzwGO{b`>sHrg0nOs z+!|Z3uMGhRxK9Ae9qF?BUM}mk>>7%^+{Af*1$Lhe0+e9~M3i#)1S&%8+~R{8VDwp+ zf)#5I#40~Ld&Ia!3$U^8(709jQ%!*k9`Uh`SN>}Ryhlpo=Jw0N+qX>~4hr~j%|}jr z(8HGs6H``T6Lk+gzI{g@N7+6;M?4NTkc+q$8&BSOC|7`obr}9rFc=h_%)g z+=Ht_OzRlqdk|P(O$tMEnLF#j07}j_ZJ(RR#X*d*CcT~W1zSmIgPfQwPWp8$N;A@X z3@4W(q+hI7XZhA{ zHKl;|y|B9>2goU9C)Y^LnOJWITl5_LKzgHSa80V`9#95r?a@mo#ik%ji%QEj($8m4 zHxJ(3`kjS-sNU-E8f};yoht-1H~&Lu$<+C7Tb*nT32^0^F9zfyWLoUj_4DPsdI8TT zhu-)6*uLo7x$l`eGQWPmhM1@xU*?=1FDt{wx3D!AL}Fm}q<3%R{pc6$&M z31Zi`rwn2ISaR|Hx~ZlNc2Vi|u72OHgu$_z=1C3!4lTn}YkiV+A{7#V+h~g{T0B^y zW?+$gRj@gV1oO#keQ*0m6KVNX?Q_YhW>`uEz?5Fq)NC!?)+@a+9-u7rU?FGizX71k zlh&noQHFxYLlpK|HH42hV3^K6&-z_mU023*lBx`qd1w9rDQ~lTVc9QUsD$KK<07$_ zxU6l2zxa@%I6c+2{;2RycBZvK7p>;ii>oTn9T3&Mpe+GtQ*fH$meLX{Zt5JGq6D8X zRouzw|fBWT6sT`YB`5M59Q+5Az?-K(i1YPg%`3YwyZ|62$x?rd=iE71k(ciQ_qR^Du2F9_6=>XM*kBo5;`RlUIgXze= zWpZ)q+YZjFT{MOF83!lc%m+Or?6^!rb4M^2iKKV-$1wPPVhQfSDLH_jtu&N=uNFBc z1K4s5XHB2eGKo?ORu?EVl~>F}GZ7;y8{wX0+aq`l%NJ(j)9}HkgCn@uQrU z)Hud?HMP*&Q2vuX_<%M`GPN#q{Af>dmalad>-el#w6j0?3kkpE@qeg#r|3+hZCg9G zZL?y#V%s(-TcbHs(9}7`;DkJGD&RU(68Q^s=`F z_t?nxr@(?z(xDT4z_0Wpadxhbj2D?xIZ?h>zpujWIG?RSLjZ}_MsTkwq4GWHPFMal z$x>f(iQln)jjvP?IRprxGdWTITY6W}4q(voqj9rOUYxLha@yYv%-e2&@`(bh%RJ%8 zUIIA@MO%wQZOzmX@N=@EdMGj#`?>5nb$Y*|6Lj&SC`2jcOCBfR&CnE+O4rv%ZOgMpDF=BljxcsOsqsqQ*BZ=UUx1G}_MbXe0u>sPz9Q5zgc zp@Tx(VPivU(=OkyCP;K*^_L&m@(}E8$Bft_J-4UnlJmofk_njqyoB)bC9kL*5UIt? z6W)E#)|LGjJ^KiPHe`ZQCWxGzyX2p+!Ug5$_dQ%g)u&K%;!0&G z^X1T(Bnf(IF=e#*rxMhwJE`B2SfY1g^Yr<<-fiYfOeQ6e(Zw!_9F5}GMX+`M+^RW% zjGt$-H`PJpk!4xGHFgqip)2dAbQD2@Ua?`c%K*aY@DnsY+bjJy!HME6SK2IeNJL$z z*Bj(pf&_KaRc3*}GtrZ}s^Hd`6IVunBt$LV3NzUdy)%@mgtRT*xBctFeLOQW1A5JS z5nK`$0)lSPH?8Vd?~eNS3THsn2=D=1J;qR{zqa!s4n^c;qUlwU#M`<@YV%eI4Q^*- zG6Br<>L*g#Nz(mp_IYDwhWYa^ z@}(!nHj47JJB<;84LmIYZV$2CHHleC_bnOJQ)^)M-l8m#?DK1tm5rs?YCOTY=)_^=A@{qj2T?1UOdT*pJR1iZS3;IfQuVty~~wKH=}` zdNp{vp)|y$Ns;Xik4xA4O?_jHJe3l8FNy|U^WNc;3Blh*a6xuAE!1Ez9tS*l1xVmP ztof*B_G2EBID7Eurl{itzbL92BwC3ckW8lfU!S zfjS+oUX}42uG)#4D*Qq!ijZbC^f-ljxd(%v2aN5vP&?QvQal5LsR!N4diH+8={3wo z;UXNK&iI(HJ(R=fG6!RPuc$IY0VjJ_6-=*T|l$I*|wo@ zG|4nZ12vBRPz(-3nq&b(iH|!W{qV>rt>MaQSR3|iwn){gM?`&K?)HOh?fv)F=8Y~( zPU9q)f38B_haX5bkYbA}(UDG6V~w9$0}+Wp<5*Sd8I0?~y6yFF@Mv?60B#htrTgmu zexPbS}|t$LjwX>JBZ(mp#hKS)QUg~YzpQp7MuG&3($oh-E#MBVyX0sC}@*6PC@`Q zwY0IzKz8l@MnMMdr8{}&0o17G*KtS50tTQtd4C1Zum46g4{0dMlX4*agrLjAK%LINY_Ud=f#bjeP0ZKA&Jh)!7fIMA3FM$&(Qr`a#YBfELC_XGJp zh{y`GJwin@L#;w{(Ko;GELZI$%m|ET%&EnB1i(7s(Itd4 zu3D)yJU3wBL82KoaG`Z2&$vcWrSse7n|?>Zt!1H^paamI{;k)cha{4Hj*ix4v~vnO-;PtSA0A(He)R$`&j!uNXxSmA#~clcSk$qOwoCE`uIihe5%V^n!=- zwyy#9p$0hpb^^eU-06~pP3zZ~H6C3CYO2>`EJ7L&W62)l-JK{nCU1JkZE+y^#nofz zW7gedNAq9eGc*j}>*gZcsaX22oNh|qcufyRz~b7lsz&=znG{@fwR^lqnTWAW4{_ud zrFP;HYU{GYt!=QEb-tw*!Wj<&ibrOceSX3kN&qE)@7D3)P(w^{ICJKGTv;I5btO`_ zr_uj7!7HmofRVa?8`?&GY&u^4!zSFN^%dPZj}HDD43{=nEev7vG=cI;Z6@!{!A`(h)XBcPghC zemOwe3q_X$`|+WqaNO7-!xhat2zsYOER-uDHu>)rE-SHsKp={}TO|p@*cdATD@FcM zjdE_fpwxs14WY&r?cdt%XKuDf1LO(bY?MU=rzu`mW9@^J@RdX}pCR)5t0lz6gEp(k z^8sQO`M$I33oHp}>HT1Fk_uWbr_dA~s!CA>-9m#-dzN3MnJK zG0M&*nMjk*ieH|~kAbz6^O%C9XCsFin3c`CBuA!X&XE1Tim#z!66!F7a(z;uK(UEe z8$f&x5K=>?mE7_84Aqzl+2AHHTIpv3b5y&5dHw~Q&E6hhkQT@0JkE4*R*|pij0*we zmgXGV0xYKb#p zRUm)JjYTEI(P4eZ{*{7CbubW1FWQwNvGcABecy5-E0C^HaM_jb+ zp*ptc`MB`Ws9E?I?9Z594xphBugd~-&Bu~T_J@8QS5Oql`PMV0Ncnligrvf_Z0WEq zmOh+UBwYN3A;v!-RJ3oK$1hh-KCUP*$fhA9fL0g5mzp0?YL(8QPsLLx)Yxv>ajT=k zKFONYY&bv{h5N^Sd+5=aDhG|i-b@@3kq+Q#SkvLfUApOH_eSSf0+BWv#u8{o5P$p}}}4YE~qQ$Fi`H*TO+2 zXp=3WMOMC+2;x}bJ^xkBTKx?GqpEQtM=vmDvBUn)sp|TU%tCSdD-)adVwB`;s|fr+ zK^pr0qJ8JfcDLI>H0PD(ZXM+1zuM7%EbaeEoxl3Av{jCLODxqD9|pjIpbnp3^V3NoGuimC1h zVr#l@-8or|IGc4p zorq3hRc2k(G4b*O@H>6m)&{uZWJKzlT#k5n; z(2P5sTaEYx)f33{5C%s|?jp16@?yeuy@V==keg}ZcIttE-I;bW#4}>3X>^L?bbjA3 zu^1%a2+i|LZ${UL`w`vuR{e*Ew9gffs^Nmuk|$wgCihA5E(}RVS$BIv7UtncOVAmV z9Hxt;2uZ%ct)tk9?4XHJ64P|Gn;|GwlOI3=?~n7UZq1Ty)5xm{hV$Yt)QQYc0uzZQ zl?m93eWexP9e(oh*jzXeVvH9AONSvmEprBWvV1Wtns*qkZ+CBEIx!A*$-peop{70| zh(>p{FR`)$QR9g=NaDl1rqN=0bnG8xl)Ej+Zw6-JYu8wBD(odV2B}`^*nLA`#y9OgOcs z*@8pIHVh}I@~%)YcViTY(v%2Tt$Yi-iZhrW+rXea|FblwSD-lQhrsh=$k=f`!G z*;DG=ACbkFK6^3Ocq^iwS31b{Js7=2-?=)nT!GrGy^x(1Jx#g4JG@h{(zk4uZoW{Q z|1O+&$;sD!l@=p=rPE##z~;Y- z8)8Lkzbzap(^pDa7+IXMhqVC-lZx>o2B>H9PDA%c@kZg-(rIx5|DNQ{37}| z3|ad{-mZCFOaKR#^<+fQ@8@!9q3KtuoQtd6w{dI3BAmfz#qeS+o0vJz`f4JZ+8!u| z9J|AY_b5q7lFq0JUm zYX^(sym;;BFAzi$trY*T7V|QV>KGibN*Oj7IoG&)nKH$y1Kemw277)t=#8rFYI|&G zT#)S~$fp=;=|Ha!`}UeCReu10t(omnaAaD;Ki%A_(v@%c-?YJb!!He`C*;nva}xQR zNaPDK)tRzueum^N`g)5~6x>JpbZ6+1Drp&s4wK8EP~a8MGDD)q8CDEdMu!P>nrHJBFhJ4cW|=nv38BF-HK#?g(qeUt{Wu z)5To4Oaa#>);IEEL!^h$&tG3t2@Cy22tf?Vn6Jf=f7|Wj@JbsJ1uHwSuW40XqvE_pxnS!la0Zd@uH`5bcqH-z?C3gIfKqXu$zeE6f;3?LlYeu zLE4!)ge3J=aSeTZl7t98`D8r8=zQ-8Qm41!^=|A$cd9- z1E>hun3UP$_kg_@@k}7LD@)UrNpZ%-6Og8Ph#T!o(3k!CZHZ~OH4jjLf1I^2{SN^U zGcWi{bLw~BA|bn@F|Qt&I4-cuZ*!>>-hliN2`vlom&+#*u~J{j()tpKEye2l*bKJn zO(S2AZPrgki&NkKb|H&tvQ7((NFmoBFwyCbmTNCGEf!~>j9F>K!d}-@PZVtb65`O9 z@k732vRD_d{#hE6DFf)IS3KReN9WDd@16P?C66D`P02C#=2y9?Gu*sq@RE$fDSs-4 zwbDVV+=ZuNnh48Eb{h-j=ceQIl@`6 zgNx~D*Oz-8jf5tW{XAY;7l(HxZL+S-MpM-d$3I4}t|604BEUEkGI@&qDbg8lazn1n zra?xKEu({%2CT!_-fP`^j_c+5lofxwyPNN$!}F0w?WS$=$~EpUhTkkiCpc1LKZ}uxUfi%P4wYuCQhnmY0gc0nMO$7jK}6qgGwi?ZQP`YiiL%9iC=sl*xb5WbDG^-WgrkCK&&c?@XXg z<+R8!EdHJ{;LSh>Ry0uN9VAw|yoVdzZ!bRl`MQdf4|uY8lI6xQKVn^9yu?lcCoicJ z6GmGf#fff{Xw_C`%;hR>aUoc5)7=gLBD3QvqtQztl2iP{0*Ov@ir<%?dCp`dQ&9?) z*tLG9_@|7PD-VW7cnNwQea~-FU1!RU7xRzAVVGJI?P&|qdG-gnn&h7(iDo}V;y8s( z`hzkeDZsekD1FD9O*^$zIF;hp#HJBuEBLw>I%3N&-#;bj6z=dk3^boO_0r1o7}*7vK+ZF46k2@flVDuzdF|#&F+g@W@AiG+(EX#!QQTog*HX0VaRj$%Os4j@P~iX_zf9 z2Z9?01p|0Zw?#Ly2uC$;DDEpm3GKhkRa`-5md?`*Tv6K@|5*uLC+$|Bwp%Fs|MKnu z-;0|6-;5M1&wOqyhQ8%u8l%qkd_AO^x-QfZ3oA0FP3lJycjzwo?hZ{l^a#%S7a>II z8)tL6(Q}<8{5A`#!-N4c`C4*BDiwsg(TJ*g(gJjMIH3X=bHI21W$qnJ`fG$tea0V)uP~=))<)y) zbM2#1Mt!SF-9D>5!9xX>#cyNMkBMs~hfQSNXh;2U)ec1#z>h%q(V7Tf9GuzUDg2N3 z5AKPDT>W`-^fRj~sWPJ8CsJk)9kAc{|3R`mM1S{>%Ymdujj-@@QUVJ7Va0?)qu%CN zf72A^!-|oX>hdFeIx*w48#sUHVAFA`MmhJtKNQJrB;Y)@a8--;oCQ3cQvak=a%0a- zufEp9ij~eJ&&i2;{*B!bSLSw-vcSu68O&`rSnTzzNpjuDg)@L`>cG$SENUje;{kRR zsGP)}h&2W{E|)KkBLNP1vJ2i0SkWgd@^nzAz^;SVfjj9bEA-^MxmBwY<0ss>lpiN7 zR`|}-^3O6+hY+zvmBK)7E86l=n1Tgj&FNNUi>Xm)iUfl&OzGLtOiq=?oWp*b5LpDp z&o^kDNzFUo7dy_*b8YQU^&8c-qju@Ewy z8;V@4`?^@ZN$wv!uaUl0Kef@RpS;lqS*3TCDri4UhXJsn%*lyY_BMx3i z4jw}aRO};`W&X5KsiC(@EEz!7Ue)fF%3!_*gMoIozRQ z`q26soC17SX7#f7pg`{RHqMs$EtX|1S|MMq(D((u_Q*hpxZ*w%Zy_O-?&FlMi!OWR z5TH74Vuit%hyUfuXH*=1;x@k?SM&9ke9DKQ;*ZtgkF<0;$8r+&i=_euPTgcAKlhQ5yVw(V9#CN3vBER}pEjLGRs z>~TH1Kd6lKn+N|iD&l6bCoxR9dIqFA5NSSY5?)}z8zU|a$Foj_c?Lnl8zbu{{Nn!g z!JQkI@Nd8kA)&G?muhCoswz@Ki34`fAKm3hqK^agySS~~%)uWl6P>$Kupj`;PEO<<7}wX z9Cc&CjmcR`2~-+c;KA!5=R-vw>C)wMoKW)BMN;4toTv&OFD~uomGJP8&V~Y9z{406 z&`Sp}0!S)~z)MKIWJ#P-1E$WhIhjHEW-4^|XhHR!91|jYZAlLxmw2-$01CH|8k7UQ zMu&WpGhbZK;r@=Hgo1PC^9tBg-wyEBq~o9E!J#oWW^ZHaVAh~J^iA^w$!hFr#Bm;B z61YipI4}X7HZ4$9MWG@f5_HMpU+oq=?O^*awPlQL8zBVQL{%tMgCl?Eb!{M)>DUEa zhtc06HV*QzPKaMMyahP~0mX5sAm?yFX0250prSS+iY7wCd5oYww6*tDX!S-Ew_qFG zhxzW9R+hU236WrNn3e$$n^G9+IL2*|Wk}OSXioP;4Jo2YsM4L$!%_)oG9>%+b=nhc zk-+oFxh#4-XIY`8S!|W>`LsZCGd3mX3-RQA-?7)*7~A40(vDbPfYTOHL9yxU<^3ep z1zXJVcAZt#^=MElTI~2a`lf&q^ClfMFW4U-hzeyP#hOHB`QO9SJmxaSA)DO}bn5O9 zUeY{H^hv+Ajv)s^W3GPTno`SBe`D7R^-PMy@yh+gacf>KEH9YNL4iK)3EWBdN|Z#R zk4l!g#X$DiVm`r4Kt|mlyE*82=@6TmNIbx2sNb=%{BsfK`@!1t?r60B{e%)QFlkqC zZyGsq2|W)j+`^p6XU0!7w=LhJd`vL)1na?L9Q$-h-nakoWVE0=-^LSU#XDBTO2JQE;0cp$7S>(Zx@P&-2g6UTnIN=yrhrWUFM!g zp$K)SE3^;>5&ytTbCIGuS6W{dv2_2`oBcMI7ZLgOima!>;btL~aRrzIa6ut)oT6m6 zewMjGY&k;k^~WtN1LfVg1ZQreF;<&Kxz>`9PwcXgGSHKac(hxnTX)0@q;6B<68h2A zsi3oH@Vfd^v+?tway_T>Z->AjBk%U)BsC=$n2nP_k)8aP61LJjiib zJauGF$=b3?+FJ!3#(Jhs28Uhwo|dtz?g3Znum%HE9g00dy^6Icz!$k7*{2iPYk6Jw z81R%7=v02Qg&P=yHo38!5b1LkcsayU7`_E1yy6}Tfwf_kpf3hJg)phsPDA1zi!i`n z#*_#4su0tb)3#o^Uea*RrtV|1@q{y>%bJO_>{8W9`_ToAtfr z1?oH1S|^+=8>6Pgo@h91j6YZyw!7Z`^sK$J@ljIk_CjR3NQ}HAR!yD$+GNSBOyybq zIo<#HEz1Fb=L7Y_yr59_6xRoX3r4`75WpN%V?k(fx3nu1$tXEQxqkbECR}PoQfb$O zSZf6IVM-nEx8E<+=eXC43t5_5)tI2PYH;4ZZT71^zZr4jGB@3$2i|N5x+AqOti zB1GzV_?QtD8o0lXTrNJ&MX$EHd_@8b>(l^8B;Tyla|sp-r6(VwLN2e=s)Ff^v|Wjl z&a}5%sIHOTd`S42E#}|73zerI<8mJ& zy^a?}_-z_PAoCFiXn6LjVw~k55vzC5dnmA}S8A_19Z*yBmn!!mXl+BAK)nDkXuP98 z*NK3t)6){`yX%q-0$6}^zRyccl!+5k3Mg2}NrlEsW8H#SY$S+CMYR29WnfUq+eBU? zYS_|2po{%RBGSQ8sf^LkGaw-BtP^>{QHZIGFa*qg2JQ_Je^KJM{PbcJMJtbcERlVJ z$S8j5h!cbG!6MKb+`_%6L<8VrVf6LR(|Hc}$#d{L5@u9XuZ$6hyt>2XC(YS(YA_z3 zuwvP!*wzL=HEiNZKWDFL@+X|Q2|>!^3vsEYO{$KaGI!ZHB^m#M8&*2l)9!ES>==OZ zeic@ym;ERavieYmuNdLH+i37XtQ%qZD}Iq?+fj&<cd~s zHIe~k0$Ix|jqMX%Q#-iL8oC4S&_12`^jg98NHcPH{?JM;zV(c_)f37rGgTk+D15U(2e2D&fe_Vuh1)rU2F| zW`S{7e7GT|cKr@$<}m<64TeN?R9YoVo77-Gy_8Cu<1G2&j(56*lao053J%LTu_Wiz z^4Y9qYd<7Zu@Q|UjR>`OJF@uGXV?9=bJ8NiK#A{|wWy*TngP5CA>BrjB@u+mP|$&6 zkF8O#A@l^6iYIPAL*`pybd`{Ob2~MkPIk?0IJ4Sa?1dChr6_>bq)*k|h*<)-e!Faghdt$alzMUX>wV?D`;x~6XYjHhxiW(H#A0=5C>FH1YFWDa`j;(+^3BE zuGvY0brg%n$y2~$z3b@L3=xQV2~ScxM-Wu*Inx!y!_l~&sHVVNyLKUN@Y!ar&8iB| z{#SYdk8osk$2QAJCiJPAg?#h7t%J)#N4a3MqICvVXsNPoilLTf#5xUB5zHkvL*XEq^9dPt*R-pMrGE1CH_zzXg=-HxC<%a8w)VYZ~cZMVkwGc49O z^q6n5m}LhC*(@vObDk$qv(VlyDd$cAE#P(qnDChXQ0#MMCqyW5Q=(dM5CyZG+_pbI zWabIs-X-VxPbreRaR|>*z;HV$CArLfwY(Oc2XSEw?VcF;D&4&|RrdZJf zd{CPP3uFuT?X4@QMuFrLv$dl|8xvkqN#h#lFY~|@lX?c}@xX#LD^vf@ztAQ^$Mi4r zh1lv1$Z7?-`ShUNrR9azlgH3}KK$EdwQ-*01CC(1I+R{?(PfC!<RogQ3G?J9k`Yxt_aAZVy?H&YUAC$NC<-;bEwA~PrN`Ia}H*ds5tR_{GwsU)(U0pgR>WLsQ>lno!TPPIVY?3_`6OXVsNs1dR6xaPYSC zqhd`)$-uJeQy~}ceZt4mJg^AWQ5yzZI@9YG#&A->@^Cp*=ZLvm3)O%P&q~07SyhN= zDJcq0H1dta23BeW85gZUVkL-=RR$puDlS@*UywSTUOS+>`32=glH6Y<+@pc3RMj%O z7~jc)l&=4|@L5yiVut>&va4PJK*|Ey_|y$t9v&A`<&+g)4i07X%EPMNG>>i(1>X4r ztQO%qw@%o+p=!VG1hPmv8BNP-Jafzi%y)k zlBR~FANb(KeV*Hwt$j!!*(tnOq2YWqDDJ?cNA1dp&VDabbavKNTg_r2<*W%}yM+9@ zfyV0yU&O{%+L-kz$j|yx;|b>fW9CeS*afDC{9n9BE6*;l8pMA=APJRs{H?)p5w=5Tsr(C! zA%FJLC06D31XN_zWHA6?Ad+t0R~}a};?cdn_wTF2`q$HnB#o@xIOnihf2bKKIpZ6! z!22zm@6`GDF(dPM@DKuscS3bcQ`e6i?`l1u9rumNBm zihB~+QK&?$6||$+5&?TbVJHV+42K&$!&Lu%C&`o`eJY^!QEL}AB74$|k$}?s7r-)0 z1Aj{VI3U2eNiDcZZ_(c*`OutDK<^Yr@=d^W3EvH85J&q*w!4G5#ti~6`vj5FVWakR z(w%}2ygw;o=Uhgw@!vOjM5y=GB>-D!6H)_O5DuC~WJK9JN?Sz=6hMxnk|YMd`;(HH zXNTO0SgrKjeP6%!?miHE8#cMKksV+dT-yqjz;>A$jP;v{|V!* zCHBJi8S4xO!2tgvgYktRA&n|PT(Y$ECn4t`9dbgbU9653pJ;!=#<%bZ$OZ`PYs%Rv zWF;saj^4$|Cm-K}nSYY0-X10Eos5|RPH536O)f=D!uK`1no;|Cxobyvj zZ6NagQ-(e;CyeBV*R>U(fCHeSK?lSIozcaW@N`a z-d@5L_1*kLUuIqEv5VrFZVcc8BftT%V?EnFv9l^P#`9rR{Ckg%>WUrNeE5 zqD@@WxT6c8NK&)e!T>lvpAsoc!Vjb+$XcG%w>gLTbnTQPW&r?D@4Pei>RZ%Z8X6l?; zCTzneVb5LMAzyllI;>CtY?X6>`RumL^kL1?(P)L>C@B4!f5{ zHd{Ik@8jj?odAUuyVLc#KkO>^k}Mft^0?I&Q7-4c)v9$kew3)|#3tj^f3ZW?4F5SC zb22Zb3cU=t_}b3yFZ!Gc3)@jSOxFsIS>z~^Rl!!xU@_vnLdlvQ4x(w6(Ed zrU?7)Jk0@flDisja1HbNC%i^>?7jV}+is%Sl2+R2%ru$6YWi_JrM(#zvF-f5Z$#6i z#|)^(uDw&GS>{p2zVtlodue-b&smCM$mgqhjJRc}c?`K->Ej|@>9Euu$(_x?Q&r`c z(K{@ec4?%87kvOy?M0}tq(A@sRLjp2Gk$cHP*s1gU^La;%@|R9%(*oqeHf{})_@^R zaM8ZbEJ^~j?=S!rb0A5{rNMa3H!c9s%m8^VG+ui_l8iODs&RR`O!P&(5Tx84s3ZD7 zEgpY@6wxHB)UK(|)5OG@c{{T3v4avMv<2v9a>J2(kFB(a9}(vcY_;{Zo+bL+~^QiZvH=nm~6POz?oYqF1PMjI|}3fjMp4P(!+AtR6Gi?&WraPns&#z zkn6#nh*`^zF7FhT302O~;GXG=(7{1+k69CH#R^dc8}$?&y~Z>kGb`e)!R=D^Hs)51 zlU5DPKcd4sW|ZHn8f)ZpwZvh|1s1Q2M?7GXcboMPLH7ie=S>?I^fCSYjsdr_=2@H4 zSs+)_-=nJhZnJ$ZezpGJIvU+U3{eDE`87#lv}Q0Z7fQ)dOXNE^vb!^o_I85V>^mfW z`|938`&`@@eq^7%=G>NwHLpaK3XxeQ zA34+2U;}{rUUVXAxtHc8Poxb7z|wfT$JkiC=0E)s6oi}9rvNVrcRq-AYU=#O^OCv| zMJ|CROc2wseompsG|VZXL32yw>@!m>dL#{(YzB$1hSPL6^k<}G&S z!ja;*;=*1KNPuR;Gu>hP6bao@imfbE6}ApIi8T;cZZmvUy@mboi`_;q?I}bg$gdhg z9yjlky~;W>`AZa&-=h#jRu$LiAs zZmQ;3*gajf|Ac|KreP+hw5vGh*P~w4E2C!!PMn@p^~y{wbigw|3vYyA-R%5=Y~7Uv zPQ>}1B6OIG!Qp4&v(p~ou;_F+=$Ruo*XZ7m`kI$aJ^^rBWH!teGQY;GKX~~;$1YD1 zILnK4zbi^9m2jGO-<8@EGHPp{)~lAt&-o<9y>&#sZ;Bzanng2C`*LZ5Xs|O))1JKB z^t;===GXf|D<>J9(ik??TiggfibIK#pzJh@CMG)V^mbB^{ET zEj6qmaKc+K_dO;bi3-Ip)|B=DH4|=Fsig-S1#}vW(Q)Re0kVj|$*|k)g?V3bw5_JJ zTYaFlTJ8m-n5ImFfrMK-KWMO;DU0pWRxW>=5(r5UoZox=R_43HCm9aJuznq_Y2R_U zBe064xXH=pB9SXm{NQDuN|>Q}WcY7z$36tS)ND|=QZ2m}EEdGf4@c2}58@=b%nk`2 z9P(W>-cX>K8YxIe4;8E_Lw6BtC#-d8s7y9~$HDpieFhn+7C)sp?0sDtN9zyW$jtmx zgc?cHUTxUmNVM&)USg;|H~@*cx_>&$`5g z!3`iTJbNfm33Ig)rcfpT1gL`hLmR<8o83$fA;0&7ngp$+q&2kolSn9hqX`&XP^zds zcQ9F%^{RCx@?jJ#iV!D`?!PWe0>P89%vvm42teLVF@x?NI{?a}D+&TSe}8`?$GL}d zEg72|aV2+yQG;4pzArc7zD~*2nW?gpGZ~PEe|nUm1$z<*m=4f@szm{DB3*8*m5X4I zCwPQ&lF>eMc%@L>9OErF>jkmD;2A?QlSc2z(u5TH5lnmIWL@q=wD4XBYDhLBKsmPdl0V||wUfmv^*mscsG1&gq zl>Sex{r#U>D?o&tXWHtJ-#i3Pe4F$X7H5i58qLmNoOyY28aG`MdL!Lf;#{V)CX zD6@2>M0tv~GKmS-)xfC5m%A$L@%o$&HQWyWt%o}81h5u(h1t`JpLsY@VY1%(PEUOg zFTH@C%Wzz2nn9Z?!~2jkKEyL`5&O|OBrQ|wt z|1$g=1}6Ek)_QkE@m$#ww$L3?FYV8XzBLS7YJb)<_v^dJ8cwb4`p{tpdv5NWztG)tkfK@# zG_rVJqVxKf5HBpNir_+YR`}GpJvL_6YA+7|D4r_RZpuB+FdXNbRF@^#6Bc0V^EP0rlp&~IL0N+B%)zsHXfo7~2*|xk zNcbJG^R1`)1@fPZUaj0|J4l4~(@a5?C({i}W)rt$rtz0?n@j{TBJrR=fVC-p_p}L9 zZmWry0)S+PZrbJY>~_bd?v zN~SvM=`-z$0VFWX6azd@gd*cn4E&P=SsLl=3I<&^*_ZMy5nWP0pMmiKmBye;_lwfU z3+>HyJNkNIw_P~&R?rIM1!Q-efw#&S+h~D1Oiihv;9caUd(=oWj`$pMO*bEt7q`xI)yxi=pUsnah%3dXP`p0>a})oeGnHFkg@7MvEh<`1=$^b~XL z>zZf6H4&|VnOd%km5?NO@$>4+4e>Uqe+AQSruOUOF+qeoygSgp{ik5SvK7TIYyJQ& zB1MhoEQ%cWTIA&9Hi|t$GD6>&P!oy41;_IWsY#|H4qH?0ZU0Tv}? zp&)@!8asyxfncnpzC%SId_^qy+@nctnX*$Za9fqMpvX7mT<3}EJx5M8>hAl2N(WiP zw`s4+cVgyo#P|N3WXO4(r1!Rkn-)!wS2#y0zxz?J=AohDWJ(iI_(dK3A#~^&lyd)O zM$5I%buf_~8A(0-5~hZizI>BX1dtFDC>5(Sl|c#Em4}f93FFuo>kfv3&c_`#G1LNj zJ9<8<<0ozXlNmfp!V|u1;_n*^8wq{C_B(D7pmE#ILm9Q&8)hyUC8DE25in0s$I0@f zfmu=Fp!b12a;=2HHUFylkSGC{wmsYe^~0CA84T>%?lWVR_D8%hDW_q$0rD)qil7Z6 zZ*~?a=+z_VafYI`C?MCl7P&1+QzALP#D=hihmLp==hq0p!*XCou_lL2vK6g`-#Na~ z$)%2o@KMz}pux9ofBG37XmT0HBN1LG0iu0J2nsyjm6L{#0%nSq01C3jPUHUQ^FO$- zaSmvLt(#@hy-X@weM6S8fP^~gzswEOI8seN6J#0VA<>96yYtDiW9yx(D%cRUqJG+t zg3YJ|KZ_$76Yfd8LGQ{{3xdZOp3Rnpf~{6jA&MFHnBWB2vmIY`+5@(TWlV~>2zGA~ z&)dC_WqXP{X9W{ve6_X4pyE!d7d`m(h-8Sz{VDoabN`fzPf23(#J z5b7jnzRG7Rj;g4xfHD2F5y38wi73~0j?0W_V=M>cl9{s8Ae{+t8+wQ+R1J#iH(qqYu63aA40dA~or7w+Zs$h}h_pBNSKS zWQnI)ka^2Q*og`s2~ETHfxXzC3vp@GOoB*w!*^KJI+CbafKjz(h=$IWSM|{18g{OT zI_vpYUIp-~X6NpGX-L(;HrOGx%7jEU2tb z(XiJT-;d&#e?u?qi1SV@N(K*P(B+SKaLtvP!k3!cMSMn=ODQs*+CPZcIrRF4oi>21?0tbf%2xa}ZYa63{`DeOx|sM`C|ww~P%k)QUcx zHH}eP26ul8((pDB>boXwnQvNIn+JDWe}jv4!}?vMN-gh}TemfW@ijCzl+u0fGt@rF z=afC@uhdLp6I;U0DeZO`hbFoD(9GtfbSVhFyTvPw6c@ zmH~>Ee<8TVlXp=&dOjHh;aeM5ZVMlv4eUjVP*gCQquur?L(Yf#5jl=}Jb(dF|GSf^ zBuTHFA92Z>u0{qX%-9gNP$3S^ zF4FfXo-iwKo+dZ0l`~dNkRi3lo=P2-A;p&~;VUtZWChnBPt59;l(qwJnk(GHl$e1} zF$h3FV{(5ZT5BucwvlfX#lJWWUaI@ldlX9A4FISF zKL=(r2rL6#uPnX)Q|V4M|B^-eX!E{z8ytrGql66$v5-;XRG>-Kp;eLM5xf{YD6pdaC)PH?XGF$bsiAN_F`Dd6V|oA;MU1hs_tw z3+zT{O=&c+*LBWo%f35@Z^mpi`H-D?`vy-QJwG>|*R=V<(vo}qOa^UxDF=^uSlmxszQStXIjmXi_bRS>z&UD6|xvz;o_FTM-eLrFa-Yz0*s=spf!u?u_jW_N4 z4)}ayG%B>NGFS@@k|MYTA|kb$@(QvAX~Kt);)Qtc9r{?7f z;viXSl#(qR#|4~ue5A>?0ek7D@hQZ?TmYNq5#iqAFmMNw5~CwUWr4{l+XCgS2MI$( z=;Vubr3fQAq`XGJlMr3r^OkcfJ{Z~Cp|u91&3iLgKaf1rrKzVuyX zs?u5|I~~0xqtNnZEWsdBOX7TT;8xA9z4^5iOJ$|Zw6Dj z72($?ds|`R?N}FH_f<-BHxSNcy~u=~{%)MT051mHcD(6&xM(ncu?>Is3<}1AA>i)& zhl=R2)8;E|-fZ2=?r#b-sf;m^GO3C}LsvRjf`(n~InzM2Cw3hQ$*uUX<>q$pd3vkm zBd&0r{|vV21+N@*kD?=kz^qx32R^0#JOxuhjUpUeiLHA9I-qi zmN=Nporp%Pq)FP~wI-?jdsqZT0HH^58?vfVx+AjwXvQ@zHvZA|&jvyC5fx*?Z!io# z%9%#YH3uaUy?SH1F~y`Jw>#S|6vsC?mH6x?Lf{Zr$@HaFk}W1>&jflX@VZC7#1OL) znNhL$LHyg)O=MBBAUryx5WpC>ws5SBUjGkC1frYisi65i2&&iLBUAU-HRCKgZNH(s*)Kjj`1s?}~srZOiQ+()KEi&b<)VXM_DDZ}u$c(jI$NI<&`3sSV7c0mE^anp9G)dTW(M36L$ z_9s0VZ9LDot5{uag8VzXl0qy_`agK!&?!y`Sn*-`;egSRYbKj_NZ_N&^ACMN@p0Hb z*moUf90pWI7)znCi|jNb+%V@`@@tn9kB@8}LI4t!z}ciSvx3bk%(}kJ9RX}=CTRIt zFCz^rR$g6H-8g`SKztbzxPAP5gA@&tnWIt&%w)>VZ{VvO=GdH7tht0bJnW*+yv74c zE%KEUPpt-~Q#zf%9NB$(U|QZu_BR>wqO*Aq&k%UPbD1983FkEgT{FpTZPotAsND-W z=n$WENhy%^v$ZT@-PtpS(JO0s!Oeoc^Zdlo8VGc`4JjaBOn!|-4Glko6JyGm&^%^A zL(t@N6RM$>(+uh_>5ZL0*b!7_~WnyO_H zq-N@}84R}JQpLrRl6#uY4AW8wgN6wZLMd9<2*TGuc6f!s;q247cD#cbJL*AJ2u z6Yhm~w`c&olxt&I2cEKLAG!9?bO~~Bigm`uk#g#Nw__CJT6Q9STgr^*n3c2M9Q!E( z`-}csw$Z-(G<#T_lxydWeObvwYskX-hQPsl8p?QOC*b`fWW+I3x1>4v!IsJ=!P!t} zB*Uo9%+j!+t`NfzlGmKqq<8P%v2zapOk_=lSSBDvYzgEt@c7H#nQAICrV5Z7K--J= zzV)sk=^eD8*ug{rySd!V>i_Qhi{ZcP&r!xq?7t05$m%UxiUf9mDA89&tDzPNM)X=gweb{cA#;>f@`?t#Dtp9H(AeT~RlwvYlcK z;I^t||6LA>Nl9U1{kNy5@teInn%T zBhra1prp;wt|N&Gd-9o==MT#f455)vk48dpum>X5VupU}k|*Qt zorMG%)(wth<(N&I(3A<2wp`lch)Z`Sfant>9-x39__qhlr;l?74~qXEgpi3}`v?C; zz@nMD<&Y&V`Ve=N$%viTS~BIh(9EU(T(MUJm}eLsEu!{KQu-$lHb38Y8D*cK*Ti2t zcA=PE$~#s*L?CDj2+B4159}%r`GX9&H#*KGE7&FLIk=5PynF<(NtuvI-8-o^;P&39 zz@sc_+@oxfu-p7=|4MSPVlnS-1r;#5Y2jsH_#@Sn#=*tRVeaO7LNMxt_hML$Yk4eM7qk%sD`c%)4Wh1p&eiy$jT zvjF$#(&Av%yum4z_!E(N?Usj$qf3QDPQx{bUY3X~II11aD26Yc$)pz!G&b;NedfP? zeoC!eQB$av?kfIUn>If=u2bYBK5vx7r~dSk{nrXuGh`ANb|Pe+*IFwGV5YACv4?Cs zTe9w1jPMgdnuCH`z=Vk8fHc65$(c6mg_$(;2W5@wF%OYPpc`pkDUx_aBUWu4-oVp( z>1mm^=j+zfd-n@<$nWf#rXvjXpgcJ zWaHM6XM!yLm=?>-#0rE_%wvz5(;$7j<1N%dGCkRh@ZgW>YE{)`GTa{?I&=b;>~It8 zj(ynAV5Z@d zVp`yjz?AI(ekz(()UWtIW?7nbqF2q;;b6dc#=SB++gK)YksATsA3r)fTpE?C?z`PU zc4n-O`-O!a*0VyuS)L3wc!Ff?D0CwIocl;*#YW@qYElH(wRknk zN-T34iVWdX^tn2kA?XS65>_@(xX2%wnvH>Bzt8$i*l0x_MI}hZ1b>v|Li!P*Yt=H& z;RI}S3Qnc+!QK=np3s)b))IDFS@oobS5uL%s2mzXZg-i8b}?`2lMo)tcA|aao|=iR z!DAT!V+U26EAlrryY{Et2+N?E8&nAc)6N?Hd@s|A;Zo8HG(oGy!{nm?=3J%DTn$26K5CUTA1&D;}pq6n@2`c(W8nmOA>z z4}TUYg@6RR{6^&Sd{9*0?%2)O4kXPWz$-0J6db&3X}8A(K{#4UXpL?w%dbMx9t5S( zQkP#{i61Lz|J*qh*$PXa8*6@bi#h6nE>MFO!Bid3$5KdV{_xJqFff|&r zPG5;Yvh*bXD2w`(s1ZG1Ti@VuRg zOwPGLK7>{W7Gj-A@W9sQ?c!8gmyN~AeBm8Y$4Kp)nHc`>QYn&Oho(n?U zXkKxE_(u?vp}rrJsj37k;l&DRq|6)17DaI52h*SNw%V*4%CIn`+ttvK_*P8*w}8o8 zqiPY&$aW1zk*o%kCjYO9Vt;TDfTp$1hlgHE>=yY*y*dP)7Y4bE5axD}RSrrkW&1d= z(g7?6ib7zNd&(YTI>+XPG^Hs<>E=Ss@;)$M-)sI~ZDq5F;14bU|N6@8v%*Z8t$S&TnzI>Wf;#kLagATdyt zwc zX~vy(hozMQ`i5g6mo&Nt5Vt%2ld_T1jh;*Js>N_0eWC1aQEti<`((B4A8JH%Xh;6N zz1H`~cDqkG@5{RW%(b)riH4lDfAIN#IUeL>hW=^2i#p1x@Ia-kQNMECyL`$(uiHI3 zn?+lk4RR)&DzVQSJ6@>4*-$(VDcGwDo9&#mj2ANs1ur513Iz--pkYaUq1T&6C65kYNlT0YIXd$K+rCge2?ME_K$8>C3NJda{Ek6~}| z_I^@cFcYf+98w`r1*G0Ul=3kOJ_JYV0%>)E{}CE2B81f|zNR5k<-Ph# z#}xz{G%_l+mO`Oe9Zet;Dnkd;ZxSnb0_9Z-zx&90V#t{?AE$3JU!db`2!p=)Q-8tJ z@*JmnN?I(Iw!(s0zVm)1J{zc=d$glGrz zAqPHELO|-qj*2A^!>22jLW$xdamTeoVF4Y$QAd5I66Ln_)P8A6yd0Rku|a>)wuN`} z`ss<1%gQ=H^*OwiTl>%oo`6vO*ov+)xX*Qd8<)`h3Q{%e`3?a6x(=}(+!^f~Wizbv zf#mu5S-i4pT-r)yZuKbj$;jfB_HM{$#s1OY&6%H+1l6qOHXk!vUKz-GpuRgnV(ALI zJFZr%Qzk+5%t*F4^8N2%!Yhs4f0HMYUus_wghi%Q?@Y_K;xDQYb`z~;am+kHkzds+7N>97 zDeFcXUoe9lt}kIWSbu1wRgM|fpt+eor$oEn1>DUX)x$Qa19*nGOOsKc8bpIq9<)Uq zTYCrKjq(A7aGGiY(A_b0mPQ$$&p-G}aFl=-nO>y9@0m_%oVsOqVkxmCg06uNJ*rQc z@DJd8I5B;fxs#V|)>;XNc>Xn^L^2g}Jm!ras}pBD6Xogp0RJ=UBmV$D-Mw!)n;AzU z_*=o`B1-TpGe>WuQs|2`h4%W%76(tp4rbU`%(-l1oq|^+8GYCFw1RZeJfQP%Z5tBqr6C}~jEK2Bv zxSy_sj{-D|mz+vC?GfO%Xq#izwQ%SAk%7pzhkJ~va#H`tHjjGXSvmUIscgbo@xK4w zdGhe69z(l9yP_ZJ>6+LH2w95sT5q_-(L})on<90%{LVluANwOD_yW_dvhbJHQ0t>N znuS+{!ZFQEd3J>J!{V_1sc?D}=U|Hc|78}{M2>xGkwgXp0x$SKu294Ok1O;y3J3`# zJA*42sVziWAPNW_=yBGsv_=#VcM!eXG#XS824J-`ZB!5m;E}WGfo+r3`R^jrEe;*HFELy=&1Y`lis8(WV>50iaF zc#Qgjx-He!;CtR}FsLR4mA?$LRPapjD>deUA=YsKCX@OfSB@LWwu8+tHy@G|(?LIX zLwbril7<~y%Xv+f9Vydx&=2?GHFt3i>6C%(5f9B3cH56Uc2J{>jAsFEzvX48w}l*& zZ`8%wQHE{x6uWs35tlqW&PH4ADz?(=XU%`?v==!vo7CM-mIZoAPC(bQD^5|w#^q~4 zjB*#C8q`CiXSMp1^~~?fe^jaYLFRAQeWO`r)cOelYwI07WS)SdE!2afh>#=(J!k7( zr+W8EAaoDK&=ZHhCaj&oo3=ZqtU|s%!}m16zW~-gzs-Ab&kZw^Jl3|#D;AQCwH6%H zD5epN<6SO`+MiIkuj;;>5u@S3pZ_U%bfZw2(0o_)k%?(wYFZbsT5E0bRWW=}Qq>4V zLv6@whI~w9&3>mg{%p&3MG;Tnp|G@|e<)hWkW-xQcwcu=6-6@WRYsA~bgJe0G}5ziR%;lM(HUl}6@{(2bz~M)hgdZaCO%!9*t6s$7WX}( zCsZ-zM?)D}Ld4Eju%?U*jr#u08Ul zp(IHZ_ysU21VGjP;gtnr>Y%0uFxW_ponrNu9ihvaLW#F66m)1tas%VzRj~Lk@zOPE z1*2e(I3p%xct=cc$(Wd}ytjb6EzBEx+Zu4vxtwi z#)Pu@bk^#J5!Gyq^<^7M6z#mBrSmpiIml_Qw7-N|z~$FQQMW!Z039*|RP`U`AHEm# zz^u*?9S(zORyfRFsBKV(bV)Xe>s?0$pP+9DfX}P*r~)}5XU@pVq}vfO=z5Kp*e%4l zz_e^tL}U`KhC3JT|0rV~gYuEx-!Z-m>82Et+E1fUd?{@6DRrIj*R-MNDvrU6%j{ zu*u?mqW!StNro5HO4{EooZc(G_C^JThTh#h3o-|pGI@;hS8ry;+p9VmC5260H#}8k zL}N%UKTb_u0A<1X*xP}EsbB-+Sf(OwM=l;R07m}#4-$5}E%6P2#$3y>U{!df!JMZ_ zSL2l|=nES()#4}Ezw}2$5^4{{ATIXWmOk0drB9nvRHKuIC{lF@Q^RWcXncp{oz1-q zG0$S>mgY{$5o_>}NeQjO-d0xpTfOeE;U{K20F%X4TgwI>O=xr13i5D*yZ@&O!D?<| zNK4HXQP5?29rX#2zz1N660{%b@8g^M^&dI4rKx29&n)5>s&9w|AJE*GT51hhMF4ci zU4h*#o_m;FZi#Cn;a&c`+n`Mf_Q2JY6>8yGu2t50(|f~ndhJwTrIld)5%F6pMeBfi zjP#If_4EDUZX3HO+KO9CW?`v_So`3dI74stwCTJbT^NFMnEl=Pj$(Iogq&-VN1dydr$!w7p?4Snl+0Y|fQn#t%0R zd5SyKeuTa)PMG%TKKj%u&xbGa*|C7rE{`f$7B3(!NPHvJ?;l#zWQ1ze9ANwCRU?qQ zaa|q{czj?PGWi8D=&VvMv zRKogCVYk5uR}x`Y<^!66*-sP8V+UF!O)OBPd+Boh#QY zNX{-jlVqv=os2rbhZ}!9PA_e;OMB<4^iI~lD`$CE!18H~tv?WOZX5fGpS#`08tbj| zvgmsDLl`bh-2QH^3+3?qN}4sRrE*LY1l$@!-KE5mdkV= z`BDcCyRFkHQS8balAP2(KduJ+cDUIJkO*ntIiIu(r601hOcOz2BDN39taMK49%$lfD7A>!>x4raeKGcVK(^Xy->_``adsoPdGlX?SfK!xu zRaN~C114+ks>XxzMOwLFZ(-T0Ftb=VDaM(CnkMWA{9h)KOHCz(pnng1MPCSD^>3bc zbPkf=ez!QNsvC_*m=rchR*a?}{jqbb>q%rMGq&+w13lWP+uinc*BFLD5AQDK(%y+m z#4uU^^j4A&`CWkG$y9Uhp>j9pls!trsy%HEJo-IM@S!4Vr>3qS?ooM)Ma&BfN3S-g zsYc{vh;Rv+{(xn|MNUrz88YttDjUu+I;s^>gP73+Z6SgF_in1 zy@DlJ6}%VD-JuNSZ>N0LBH1p|M{P@-;aZfCHh#tXoD-?#f{)H@PePpx0_?>kOe!yi zapD7-{V8RcCK*GS5%O>vzLl>17T%qu4W20~DM-aO3(BL0ut)0;gc%Bm+~jy)G=N_Q z-|j5Xg4j+qqpePFBhdA1lh_ReU&?7NKyO&23ua(OZJgjgo&UG4^}nwU-yOe@d5d+z^$nkOJygDC z!z!rAC##0pSzA19lY%~9?kje=_-9R zbJa=kR1{QluwTwYQy@tJmY)>lA7-Y z17JxK232XLjxktCzmPb;()DZ~+fJaHV?JnS<^b9jY$ShQag&lzi>0JVJB#m1Y5A#I zQ!L0{F)DaM?OuW`rV^7oZykTH`-YAdN+-xPA7%l+>&$;7`pz3-;|_U?>f~?p%R!tW z8I~D%2Jw_yGzhM8P^M7MpreKuM3RL|55G>D9{Yqu%zt*3ouMVI3a&=W68 zaR7LAt6*1IYlqJp5ywpSDZja~`>l*XzmQRERLWzj&s_B~MytH2(p7aB(;^k+v`etG z$z@075{h6|WJ{1CUptt{rKmZkqU(S$Z-|zM-A#KP=WeiQah(4h4CcfNV?OA3GVK*R z;Aym%7VO6HL<1$^JsSGf0|DCrcf%G4Xafv?*{lGc(de3y;9aJwA*Wa*% z5Epy){7WE9T8ix{$MaU=`P;tbg>&No!V_+W=!X+tA=VR5XE9$q_@)86(SxGlg9G@I z<|)i-Vc_mrT99kR!b&1*S8;mF$E=rwNBv?FESRBh_10-A)X&PhsPUuAEq4T7IuZ^W zV?6TasfA)g`XE_8JI^-7QI46-D^R7G_l>s#<2te9+0wvDll@*^5O*m_7fhYDXzTNR zeF!om`xxz$A^&b^>bZ$h+wFX8Yy~Wor{p@dT>j)b>2H*(d9{Z*Y%Q0Jbs6dg^=73~ z_zZiVbdKHec>0ai@tx_RxtJr7Z0dGH=3GK`y1Az%j>`O#WB*kfU1J9j1__ZwZ+yVl zno_nlTFml?mT{#|0{&C@lbIUR$$HTdJf#jqb8hMF=+kiGQ%wy120wItqn60RVqT0UM~+V_~wHC$pj%VW&dI z9)R{Bq%!L*7FQRr1e@yecr<~Cs{Jtlhf_*J7KL?_txheOP*?mwoeh^+kNIUvNPccQ zU!dAFNm*Bd8S%LPzW#dV@h?$fc$JS!T>Y;}y{b4DRy9ueR%SjNSl)K_hK`N^7J&ec zz&5_3l{493>1b`f-5}|UA7M7N0tCN}^s$C?$jWevN>ma+sK7TpK8NHODtKXGy(}s& zZ=A(2RRbx7O#v#t(NC_#1D*uK zR-0T^Og~)bgN;xw)8R=J&GuJ<_nj`tA(3ke>RKx5#lcoaYAVq=L6_buiqdqxc zcnkrU5A;|=Xm=Ku$_mdL4wF`EWw;Oeo7_kDr$i&t0Yguhq+D9DTG5v!sK$kU58}`i zp9zVfVPgRCk}I?}QG8WySZ6JBFe$ZFf-c9_O3h>gjHdV>4UT=H&cuGs*ShG>oh^KA zx(^G+O^z)>TpVfb-fE*U1evyAn-MSJGpe zN;5VPg3Pl={9G-$HsBpne;_&KdN20U|I4J?x(A1~I=`$+@Ee z8M)|Iz-$?eIp5oE&%{`hj_-}M-d!1bA81l$?0QU)B|?82mUXhA;4(6le2`SIcd@mU zZH{;v3~eOgzG#FMalnkwO~<)BQ(7JKO|K@2vWs5dR7;2X@D)0L!fB7j0>24mosaj`@HuA;G2jJ?;P`!WwkH^u3#HiL_Z0l}!caK+D8g%?+!w9@`d%!r! zf(GxfZ|kT7YG+2E!<I zIQj0)(^UFHYTTv`(f$#z;9a_9{a4UwC2dk!#dL|(AZhp3Xgj8VFWpLaYNN#g^WOfJ z&NJ)5xD2Z9OY&9_Uf%m<8|k;ZN=clpiQ_-s?m`dEmhAvwBp~yssc&ILo12Xeol-VI zux~_eNR%7e@5<<_X`D2t+kmhHdqK_Q^vp@@dd)3YZqo-D>&Y2YJ8QzteAX&+}AR!*i9BsbZnU;d)fFUC0 zNp_pC)Ky}ZsII{@feayWw49zwGj3$}DzkD%@ocDO!>i03y`d=46{2h7eR%|utl=?4 zWeqq{rJp%(0f_L}pUwe#Gw8u5RatMLxr8NfWhJa@4ezP_Ux$?3Sw#e-^p}usV5lC2 zNPZ&NZ_FfQv}}4TWTPZYOeL2EZq+L6CGA66QB`RliInVy?%PcXPH3i=W};?vUZQnD zQZFVGvacJSLg`oOFi_@=|0b}LLbLwsHyoCBN^EEHONnII-y@}DEC)c{j3fH8Myh0~ zU%02_2t8TA^u&k3&Nd0?IXHvzHFSXxv)?pnK3IGF=N>&lvE4MpbWYy|$(VARtjH2+ zAmnJWXSO*>MY<&NFYhnAW=yPRV{jxX0fhH^s#>aT3Yj%%T4^Z$Tqze&UO9DuyU^mt z$M&{z79|on{g%O_!9r(&P_A;bqQOvum+L*Jjq16I4bY@T=hFw+#59(gGYl8RX_SVm zkAHRcex2LXk^SN}if`FD-AMsUq^5lY#@|g^8v&=L)*#VL9V#}1sgE7!>EVaQGM|3A z5}qI_A}Yoe^%tPr2$w>mU998*5i)e|I%Vu(tM6PtF28n8G-JVk=4A404KB2fATonW zwBjUp%6Krxh-U!|a9tR)2&<2XZPLR4&Ee=`R7i!ePWY0+!0FKbE(#M=fCqSHh;Pp( zD_HP!?Ea&y_@BstUca@1RBNnMJ-ZPFP7jvL*0Vmrj(aGL9f7^|fqq6k`F}!) zA4R5n>_h?veX{hGDAK~QdoY|WBjNr6(_C3P;20u^xo4kT7*@(=()FwaNJA@MwJfU| za!TDDLoBy;Op+D)yKqof*K`RtQVQJ;WuMBa-NeGi%|DOwzId3I+tMY#kJ3zRD2uFe z4!OpmP1C!Gb)4%egB{Y1_C^-M#mLro(2W#Dxt{`V2%?q_+Q?8G${V}Y2AXWa&D-*s z-A2-i9Vk50Gw^UeW`w2Nx8Wt)$n^|di}dX|FStEy8)K>Y(Es=jZ7*`nT$F%VzbDxO z5Q?K?LN)@f#y3g`%vcND7vBh+%lbQIb~w2@jiKV)6Byi9pGWT<-4ohx_(6Q`bpwk6 zFj4^FbpqA%rV$Pf!yne?&9=N&k)&C?8cRDZM;gv7X?!<0k7$m`H8~qY8hgU3Q696z(`r{*$ z{ryb$c6{f%*G848V*Fkp!PBdJYSX!>K0+g^8^ERt>*??!m?fX{)Boe9`$Ozq3si-Ivw3@#FNZ4ep)9ppcRMbMcb!*WBSO`z zI-~S_-o*aJRtLTpSo3-`}J^!aDjx%P?Rk9BU zeslNa-JnqT*Rd~Vv6wGslP>Z#60)6!r~<4=-_FkApY{_3;PCj153pgjHm(I!;j5ct z4Z^(;*XXy6b*U^AZW7PuY zZ6L=Q{#Y38(q1d>b-P)334h=ut!101xw1{cjMLN5C2w*alSQvd)Z3+zsj%-?GuCs) z{<~=dZB3>3#ZnkT?`UkAN(HAB-&|W*@cQz|cKaz#Uqr+-S8<`I)1kVPcXDMawNAe3 zPbSUq3)(Umeo5iVEyk>HRn0<^tvmnj2vK7ea=r&9e|Tm43W+ zCwe|?NtaWejw)}&h{&Nz)wm+b@Ml4KNU-L(H?)7=erQFcHtHU zJECh_uh53Q*Sdk(9*hMOuZM z8h4sku9lLzGOc=3qK2EBp-YSaY|&H(+R7U?9s2J973;aN1Si-`Az|gkl`HwVux3&&c_F0K&JZ}6|qdtDvG2(yxiHqToJ7G6o|(HK$EfW_p<~Y zBXb;iQ+0o55Y~wq5&a*41|nJG)zuFGW%JhKH0TGbp-yMzmgM|m@9M(**$dZuJ9WW! z2PVqQ`hCO0fhWon0``Do+>q`WMV&9hWA#3Q<0Mp0tC@1v9@C+>tnnjs%+ zSEg#Tj)_}M{yb#FHM?m0)_N06>Ap}!msBTmz7|^E93&ZsF?pX~Y_Xh8gLzQ4>c8VW zJV8%=fWaVJ=yuUJgh_CqU+uD5;VhPf@e2;fAir`+Vn2*&hB%?}sv z?Dj0C@siO|8b=}uj*OoznFiso3mL#jvya%>U~xQseF7pL&(-%*H*^});@v@bRO-s; zDCH}_Zj?ej*{3cVg<0uCynWCsJF|nZnwml<7hzJL3+{ zH9>O-*txIf>_P;tcQ^>I9)p*Mc$1^oTTr?S((pY%hyWgwXouF8qfKztB}DM}eDiQp z@0Mm+*0VQzf;Wh40xrYr0-U@axsJK4hj3<=bS3hjE>`+Kv%BU$}{11=6h+7e0b8Tyjk-WKfot`b5Z>;fflcKVyk z*Q1iHM}U!%Cuf9M$$~?|P7xH(O*~`)x=@W?oW}MAM}`FwUTzYo0NZL9qNsV3KqFSn zg>?B+sOHNY*h4|x7%jpRrwI+PdET}cl{G(s+c2+=NH`sbBpGQW1axXyPoc|9V z5P+oZCFo-jqK)7KI;k@&m^#iz=%iz3C59w_--NscxAuBBOc${*yXze6u3=$75|Ri5 z(SHSH>gK{&fwLfS7~X*Pjcf@W_FK=oGGe6XN;#!v_koe&)#t$$T_G+sw`xSLhl`dh zACP!c9h~p@Gc&Ns0U7oY1_=#eX>O4;!d=9)Jv0_?SX6L2>Rmhuh0#EGSG~iF1hb#Z z!pxH43>Za3O~B!w%c+Hoc%u0EUg!~+BzM_`v$Kn}%Qt|T^LVTObGw|6^KS=$Iap*y zbN*PQKTyXWbjJYHX6OZi1qra<ts~@RfHu&UW5^(OfHP_15ey*bNp~|Rh#br( z+c*gQ$MTi_i}l!d!xdIc%A>n1>&~yNE}Pz_!!y#;o@>FPiJ{*A zFo~X0{;MQove1IxDcP1u~T~(t!Z6pzFi&7^eQQS=t#WiUKy0i<!|-5=FXs}-H#Zlr+BV@@vrIS)=k!Z(4p#|9Eb+;Yr^_Y` zTEs4)%5GD(r|=auv}qF~fm!_#72r_EEwz}Vy*31JnvElG7~*ZLqIqtR+4aeF z|1k#HV=(NQ8tCu7ZwUlY)wVhNd=KbbLg{|nG!FMI%rreHoC0iGFZY3rs~u|YIjMO= z93R9G@E>#K^(O>JGeR98Sg=GVH3AC=oJhnb97MvbX}hrK<*7POt*^o4sY_^1 zE;S^}Eb%raLy8C;h@i-l40TOmYS-w9XlY79jxf87&4$1js5fk8ucOnzhr17Q$)67Y zu6VX$R4?B<(*V{+*9N*Thl-$2LLIeup{8^~%;FWg@vGU)?K!HMW+z%uR93j*L>Uo% zC#3HL#W5j9jAw!jV(RM+XIzPtdEd`&$awmI!U@;9CKrOAO(|=tf(D{+$LN`KZH7vm zWbH6l(J)v)?Sq5QHq`l{X4;J9#GQ(*2L{ zZbi1GaKc^o;5~EgAe&QoRj;5BwC#-MKmNB*1C${s6p)7ow~UxbpEbABlPEEamBF__ zweFgjTLVr|m?q(vl@bQx(&R+Q7@$Xzy5+5K{=8Iy&Y|{Z{^n^T^Yi>D_y_DM{>L54 zaFf7}1c2xMag)lNcpE_K3ILfjCTkec(#=8U#Ax zgjYS-epj=n7mpv#D}rsaHK6dH^McMZv#FYsUO-EcZz?W-7pPNuV;{%2f^8c^-jB!I zkK2cS%O-!$ntj+66Cq9~319FDrgHCYhM|Sd6zdtR{JJ;O3gC;{&A_1hQPz0oi%K_r z+H1p-M1QdkZX*fgo_kW~%$byKG-_~7PzWNi*Vek=>&}wk^*v_I#pVS#3f3{R#BAz3 z4=~;@ar*PU66FO`qu+91y|LRCBU}l$70%kuB%LAAdR6#D}Z|J6zwvn}{i(swmsA~rUb9a5qQZaA< z2HcueQ7N3_MZYC@eX|?UC|X{$6V|arc`QZ7C}}`fnI>Z92`f}^{&D!IJu$OV0sz+E z2h#Q4HGZMj3B=*RqO?F6uR_BIF%ZpaIiZ@c=VSvSmtYUk1R5Tt zQ%3u>p>W_!L)m^BE8A2R+VVYQhe$2gJt9yH2uQJpf1qOI%-B!ajxnT59Cx=&{~>Mw zvgEvyF-G(=|3nq^lk}Qb{>kx{awT*U?N}KjF^-l6=$C08m{WZq6io{@4M1=hO?7DZ z(Qi-8oIBF6lETbCoU?E|q=>9~1qgNmMA5d3FO*H5%s;7z@C+QdZVF5UY1ZP}E)SEK zaTjIjPebiPLRn6HXrT8(+2Nhka+TBgYxrNu@uDHTl$T> z5~32KTl5!&=-V+1v*M5a|u4wzxL40TRADHO@espOvJ@1x=2 z28jo!abNRcpVR(q&3v+dnXBP{8xqCXY`O@wwJM||EoMqWRd54YQ2=}y*fJDDCk{)U zbCr^*zIGwoLQ8+esiBsIm!>jBj6?dQNJgzh0(7Q!!D7+^?U;Qy2|ybyG)(RwIhCJH zKeqb|g*5|){*CA(>TAANVW61s1~DlR@V-#cu01cE zgagg`GW*+i*`f2M4ac=V{i=q8gJe2yD*y_MtMMS-=Sk~|g^ z^d-*(`SsCzI+&s1wSubRHp2!7tQFmB*G-XUUW-K3A{)=IQ$XAP+DbX>E^hOl{d48c z`%W~R)NOs3vMSCI7q4zu6nN{2{9r6a?UpICs+4-GE2>XEUT39b8q3(K+%Etl7w+md z7OwENr^cTO?>|z=jwoJ#1ao3r)ZjRAXMTP=$8akxq9aYVFD43b+PR06O63Ye09Q)! zaNFCsgXY4kasrNXc!z3~HkB{Kse@6VoKZ>=hB}+@4e`oM9HoDw?q;7gEVAK(?hfVM zNC~{yyrZI#H7o7I(403KKW^>LT^AmMSqxtbgK=mEd@p{*9JTG;n!N6jr+ZvbL13Rf zc(~wpP4zTvx(D444?V59o>IL$DO_boohMCW&?;$O+L*}B2>G|bA7t1_W57)#B;uZMEYC{4 z+YIs{h5>$OUt4_dTrF4Z1$*slH-J0@)bK9ckL~^pMtO6R$*<3CU({91CJ^Iut!Tvz zTv3chPOLCy4A@|-;uCeZOK71>)mqemhYJah**5 zd{O%bVZ*|rsCPuRHGmG^B`}ZB7HTjj$Z%!_3y|-T2s`-{pA|zX(x__$Cv%T z9VX!CA1g)ap9qEfhdD*+PJ<7>AeCEWwfJ)2#C7PmW8m1DVg!qnqYyToNIEhbsQ>Xx zzT}iQr)XH%aRbdXV;A!yrn)c640*{c#fsouejk|XcJLrrqZpfO)0521HOG&rDEQWz z;C;~i+?z4yXga@|c{2H{(0!|NDz>WkS_805SkWuD=!`ZQ738S$6}nu+xFo(4CNe&& zz8!_#eb#)eMSPs|-TMAo&f(@k-b_EYpaS3RF$jJcuu^gZIk(NT*nW;!sqQ+2EPh>G zU-=CFX-SBzHO!#O2w>hOsh3#BThYzqX2Q=|gG*nnLppSXwSgr}v@8|04);F4@&owQ z@aX*j#Zi>W-vSPvF7zgt`2w;|#Oc|5tt!s9`^%*OF5UiEH?>saimt)m{>qj6JfiJx6L=lu-?cXW7wVnPXqGk*?=w7ib3943ZYKzA zncNmwf-B{0I}QWI7z7(G3-wLDG!9VZU|2Dr#)$z@9rCz-?h_Gq zwu9oaevSO3g5pDrbCO3Bg_2By$Hz&8eI|pvhvLya!^{?9BgM`YTnNeyj}%UGMID{A z#7R`M+e#9S7FEVXa$^V@B+ryVYK$Lb5K2yL*WR2b#P57c>>7bKPcSsn%>b0ZK%gYp zptF>}!LSUK4nbP}Hfc~4Db%5Ao^VeK9ofM6gOp>Qp$cL2FQnmIVpaugaDX!_S4TXV zK_(Aw!e044>V64krJj8fGex6gE0n)LM?@r-P2xxLy?%i3)GZ8IePLCNO;O3O6b=y$)qT{2DOb7F+3n>aU*qbLdluOD*qDZ-Ye|1X5NvG2ZkF+76B zYc4js5c4We(5^{go0;i51aN()P`O5nazMxXZ|34`L-Wx}S>?�fJ9Nc980Z;0Vm# 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 specifies the types of the SNMP keys.

  • attributes. The names of the attributes for the records that are inserted in the table.

  • For information about the complete set of table properties and their details, see mnesia:create_table/2.

    This Reference Manual uses a table of persons to illustrate various examples. -The following record definition is assumed:

    -record(person, {name,
    +The following record definition is assumed:

    -record(person, {name,
                      age = 0,
                      address = unknown,
                      salary = 0,
    -                 children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to + children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to start to read about mnesia:create_table/2, mnesia:lock/2, and mnesia:activity/4 before you continue and learn about the rest.

    Writing or deleting in transaction-context creates a local copy of each modified record during the transaction. During iteration, that is, mnesia:foldl/4, @@ -2865,7 +2865,7 @@

    change_table_copy_type(Tab, Node, To)

    -

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at +

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at Node.

    This function can also be used to change the storage type of the table named schema. The schema table can only have ram_copies or disc_copies as the storage type. If the storage type of the schema is ram_copies, no other table @@ -3116,22 +3116,22 @@

    create_table(Name, Opts)

    back end storage. Backend can currently be ets or dets. Properties is a list of options sent to the back end storage during table creation. Properties cannot contain properties already used by Mnesia, such as type -or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    -       {storage_properties,
    -        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, +or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    +       {storage_properties,
    +        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, or bag. Default is set. In a set, all records have unique keys. In a bag, several records can have the same key, but the record content is unique. If a non-unique record is stored, the old conflicting records are overwritten.

    Notice that currently ordered_set is not supported for disc_only_copies.

  • {local_content, Bool}, where Bool is true or false. Default is false.

  • For example, the following call creates the person table (defined earlier) and -replicates it on two nodes:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on +replicates it on two nodes:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on attribute address of all the person records that are inserted in the table, -the following code would be issued:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {index, [address]},
    -     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as +the following code would be issued:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {index, [address]},
    +     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as {index, [2]} and {attributes, [name, age, address, salary, children]}, respectively.

    mnesia:create_table/2 writes records into the table schema. This function, and all other schema manipulation functions, are implemented with the normal @@ -5381,10 +5381,10 @@

    select(Tab, Spec, LockKind)

    argument. Default is read. The return value depends on MatchSpec.

    Notice that for best performance, select is to be used before any modifying operations are done on that table in the same transaction. That is, do not use write or delete before a select.

    In its simplest forms, the match_spec look as follows:

    • MatchSpec = [MatchFunction]
    • MatchFunction = {MatchHead, [Guard], [Result]}
    • MatchHead = tuple() | record()

    • Guard = {"Guardtest name", ...}
    • Result = "Term construct"

    For a complete description of select, see the ERTS -User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    -Guard = {'>', '$2', 30},
    +User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    +Guard = {'>', '$2', 30},
     Result = '$1',
    -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    +
    mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    @@ -5679,9 +5679,9 @@

    snmp_open_table(Tab, Snmp)

    specified as a tuple of atoms describing the types. The only significant type is fix_string. This means that a string has a fixed size.

    For example, the following causes table person to be ordered as an SNMP table:

    mnesia:snmp_open_table(person, [{key, string}])

    Consider the following schema for a table of company employees. Each employee is identified by department number and name. The other table column stores the -telephone number:

    mnesia:create_table(employee,
    -    [{snmp, [{key, {integer, string}}]},
    -     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and +telephone number:

    mnesia:create_table(employee,
    +    [{snmp, [{key, {integer, string}}]},
    +     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and telno.

    An option is to have table columns that are not visible through the SNMP protocol. These columns must be the last columns of the table. In the previous example, the SNMP table could have columns department and name only. The @@ -6284,17 +6284,17 @@

    transaction(Fun, Args, Retries)

    transaction is terminated and the function transaction/1 returns the tuple {aborted, Reason}.

    If all is going well, {atomic, ResultOfFun} is returned, where ResultOfFun is the value of the last expression in Fun.

    A function that adds a family to the database can be written as follows if there -is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    -    ChildOids = lists:map(fun oid/1, Children),
    -    Trans = fun() ->
    -        mnesia:write(F#person{children = ChildOids}),
    -        mnesia:write(M#person{children = ChildOids}),
    -        Write = fun(Child) -> mnesia:write(Child) end,
    -        lists:foreach(Write, Children)
    +is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    +    ChildOids = lists:map(fun oid/1, Children),
    +    Trans = fun() ->
    +        mnesia:write(F#person{children = ChildOids}),
    +        mnesia:write(M#person{children = ChildOids}),
    +        Write = fun(Child) -> mnesia:write(Child) end,
    +        lists:foreach(Write, Children)
         end,
    -    mnesia:transaction(Trans).
    +    mnesia:transaction(Trans).
     
    -oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one +oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one transaction ensures that either the whole family is added to the database, or the whole transaction terminates. For example, if the last child is badly formatted, or the executing process terminates because of an 'EXIT' signal @@ -6302,17 +6302,17 @@

    transaction(Fun, Args, Retries)

    where half a family is added can never occur.

    It is also useful to update the database within a transaction if several processes concurrently update the same records. For example, the function raise(Name, Amount), which adds Amount to the salary field of a person, is -to be implemented as follows:

    raise(Name, Amount) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:wread({person, Name}) of
    -            [P] ->
    +to be implemented as follows:

    raise(Name, Amount) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:wread({person, Name}) of
    +            [P] ->
                     Salary = Amount + P#person.salary,
    -                P2 = P#person{salary = Salary},
    -                mnesia:write(P2);
    +                P2 = P#person{salary = Salary},
    +                mnesia:write(P2);
                 _ ->
    -                mnesia:abort("No such person")
    +                mnesia:abort("No such person")
             end
    -    end).

    When this function executes within a transaction, several processes running on + end).

    When this function executes within a transaction, several processes running on different nodes can concurrently execute the function raise/2 without interfering with each other.

    Since Mnesia detects deadlocks, a transaction can be restarted any number of times and therefore the Fun shall not have any side effects such as waiting diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_a.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_a.html index 57fbca3c456ea..2565b03cf7a78 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_a.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_a.html @@ -159,11 +159,11 @@

    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --module(mnesia_backup). +-module(mnesia_backup). --include_lib("kernel/include/file.hrl"). +-include_lib("kernel/include/file.hrl"). --export([ +-export([ %% Write access open_write/1, write/2, @@ -174,105 +174,105 @@

    open_read/1, read/1, close_read/1 - ]). + ]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Backup callback interface --record(backup, {tmp_file, file, file_desc}). +-record(backup, {tmp_file, file, file_desc}). %% Opens backup media for write %% %% Returns {ok, OpaqueData} or {error, Reason} -open_write(OpaqueData) -> +open_write(OpaqueData) -> File = OpaqueData, - Tmp = lists:concat([File,".BUPTMP"]), - file:delete(Tmp), - case disk_log:open([{name, make_ref()}, - {file, Tmp}, - {repair, false}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; - {error, Reason} -> - {error, Reason} + Tmp = lists:concat([File,".BUPTMP"]), + file:delete(Tmp), + case disk_log:open([{name, make_ref()}, + {file, Tmp}, + {repair, false}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; + {error, Reason} -> + {error, Reason} end. %% Writes BackupItems to the backup media %% %% Returns {ok, OpaqueData} or {error, Reason} -write(OpaqueData, BackupItems) -> +write(OpaqueData, BackupItems) -> B = OpaqueData, - case disk_log:log_terms(B#backup.file_desc, BackupItems) of + case disk_log:log_terms(B#backup.file_desc, BackupItems) of ok -> - {ok, B}; - {error, Reason} -> - abort_write(B), - {error, Reason} + {ok, B}; + {error, Reason} -> + abort_write(B), + {error, Reason} end. %% Closes the backup media after a successful backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -commit_write(OpaqueData) -> +commit_write(OpaqueData) -> B = OpaqueData, - case disk_log:sync(B#backup.file_desc) of + case disk_log:sync(B#backup.file_desc) of ok -> - case disk_log:close(B#backup.file_desc) of + case disk_log:close(B#backup.file_desc) of ok -> - file:delete(B#backup.file), - case file:rename(B#backup.tmp_file, B#backup.file) of + file:delete(B#backup.file), + case file:rename(B#backup.tmp_file, B#backup.file) of ok -> - {ok, B#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, B#backup.file}; + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end. %% Closes the backup media after an interrupted backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -abort_write(BackupRef) -> - Res = disk_log:close(BackupRef#backup.file_desc), - file:delete(BackupRef#backup.tmp_file), +abort_write(BackupRef) -> + Res = disk_log:close(BackupRef#backup.file_desc), + file:delete(BackupRef#backup.tmp_file), case Res of ok -> - {ok, BackupRef#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, BackupRef#backup.file}; + {error, Reason} -> + {error, Reason} end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Restore callback interface --record(restore, {file, file_desc, cont}). +-record(restore, {file, file_desc, cont}). %% Opens backup media for read %% %% Returns {ok, OpaqueData} or {error, Reason} -open_read(OpaqueData) -> +open_read(OpaqueData) -> File = OpaqueData, - case file:read_file_info(File) of - {error, Reason} -> - {error, Reason}; + case file:read_file_info(File) of + {error, Reason} -> + {error, Reason}; _FileInfo -> %% file exists - case disk_log:open([{file, File}, - {name, make_ref()}, - {repair, false}, - {mode, read_only}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, {badbytes, 0}} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, _} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {error, Reason} -> - {error, Reason} + case disk_log:open([{file, File}, + {name, make_ref()}, + {repair, false}, + {mode, read_only}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, {badbytes, 0}} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, _} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {error, Reason} -> + {error, Reason} end end. @@ -281,30 +281,30 @@

    %% Returns {ok, OpaqueData, BackupItems} or {error, Reason} %% %% BackupItems == [] is interpreted as eof -read(OpaqueData) -> +read(OpaqueData) -> R = OpaqueData, Fd = R#restore.file_desc, - case disk_log:chunk(Fd, R#restore.cont) of - {error, Reason} -> - {error, {"Possibly truncated", Reason}}; + case disk_log:chunk(Fd, R#restore.cont) of + {error, Reason} -> + {error, {"Possibly truncated", Reason}}; eof -> - {ok, R, []}; - {Cont, []} -> - read(R#restore{cont = Cont}); - {Cont, BackupItems, _BadBytes} -> - {ok, R#restore{cont = Cont}, BackupItems}; - {Cont, BackupItems} -> - {ok, R#restore{cont = Cont}, BackupItems} + {ok, R, []}; + {Cont, []} -> + read(R#restore{cont = Cont}); + {Cont, BackupItems, _BadBytes} -> + {ok, R#restore{cont = Cont}, BackupItems}; + {Cont, BackupItems} -> + {ok, R#restore{cont = Cont}, BackupItems} end. %% Closes the backup media after restore %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -close_read(OpaqueData) -> +close_read(OpaqueData) -> R = OpaqueData, - case disk_log:close(R#restore.file_desc) of - ok -> {ok, R#restore.file}; - {error, Reason} -> {error, Reason} + case disk_log:close(R#restore.file_desc) of + ok -> {ok, R#restore.file}; + {error, Reason} -> {error, Reason} end.

    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_b.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_b.html index 0f7094e3cfae8..10f567207d285 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_b.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_b.html @@ -131,10 +131,10 @@

    mnesia_access Callback Behavior

    -
    -module(mnesia_frag).
    +
    -module(mnesia_frag).
     
     %% Callback functions when accessed within an activity
    --export([
    +-export([
     	 lock/4,
     	 write/5, delete/5, delete_object/5,
     	 read/5, match_object/5, all_keys/4,
    @@ -143,230 +143,230 @@ 

    foldl/6, foldr/6, table_info/4, first/3, next/4, prev/4, last/3, clear_table/4 - ]).

    %% Callback functions which provides transparent
    +       ]).
    %% Callback functions which provides transparent
     %% access of fragmented tables from any activity
     %% access context.
     
    -lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    -    case frag_names(Tab) of
    -	[Tab] ->
    -	    mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
    +lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
    +    case frag_names(Tab) of
    +	[Tab] ->
    +	    mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
     	Frags ->
    -	    DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    -			 F <- Frags],
    -	    mnesia_lib:uniq(lists:append(DeepNs))
    +	    DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
    +			 F <- Frags],
    +	    mnesia_lib:uniq(lists:append(DeepNs))
         end;
     
    -lock(ActivityId, Opaque, LockItem, LockKind) ->
    -    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
    +lock(ActivityId, Opaque, LockItem, LockKind) ->
    +    mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
     
    -write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
    +write(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
     
    -delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
    +delete(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
     
    -delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    -    Frag = record_to_frag_name(Tab, Rec),
    -    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
    +delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
    +    Frag = record_to_frag_name(Tab, Rec),
    +    mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
     
    -read(ActivityId, Opaque, Tab, Key, LockKind) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
    +read(ActivityId, Opaque, Tab, Key, LockKind) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
     
    -match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    -    MatchSpec = [{HeadPat, [], ['$_']}],
    -    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
    +    MatchSpec = [{HeadPat, [], ['$_']}],
    +    select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
     
    -select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    -    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
    +select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
    +    do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
     
     
    -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    -    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
    +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) ->
    +    init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind).
     
     
    -all_keys(ActivityId, Opaque, Tab, LockKind) ->
    -    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    -	     || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +all_keys(ActivityId, Opaque, Tab, LockKind) ->
    +    Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
    +	     || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -clear_table(ActivityId, Opaque, Tab, Obj) ->
    -    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
    +clear_table(ActivityId, Opaque, Tab, Obj) ->
    +    [mnesia:clear_table(ActivityId, Opaque, Frag, Obj)  || Frag <- frag_names(Tab)],
         ok.
     
    -index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
    +index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
         Match =
    -	[mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    -	 || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +	[mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
    +	 || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
    +index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
         Match =
    -	[mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    -	     || Frag <- frag_names(Tab)],
    -    lists:append(Match).
    +	[mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
    +	     || Frag <- frag_names(Tab)],
    +    lists:append(Match).
     
    -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -		   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +		   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
     	   end,
    -    lists:foldl(Fun2, Acc, frag_names(Tab)).
    +    lists:foldl(Fun2, Acc, frag_names(Tab)).
     
    -foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -		   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    +    Fun2 = fun(Frag, A) ->
    +		   mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
     	   end,
    -    lists:foldr(Fun2, Acc, frag_names(Tab)).
    +    lists:foldr(Fun2, Acc, frag_names(Tab)).
     
    -table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    -    Frag = key_to_frag_name(Tab, Key),
    -    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    -table_info(ActivityId, Opaque, Tab, Item) ->
    -    table_info2(ActivityId, Opaque, Tab, Tab, Item).
    +table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
    +    Frag = key_to_frag_name(Tab, Key),
    +    table_info2(ActivityId, Opaque, Tab, Frag, Item);
    +table_info(ActivityId, Opaque, Tab, Item) ->
    +    table_info2(ActivityId, Opaque, Tab, Tab, Item).
     
    -table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
    +table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
         case Item of
     	size ->
    -	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -	    lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
    +	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +	    lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
     	memory ->
    -	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    -	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
    +	    SumFun = fun({_, Size}, Acc) -> Acc + Size end,
    +	    lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
     	base_table ->
    -	    lookup_prop(Tab, base_table);
    +	    lookup_prop(Tab, base_table);
     	node_pool ->
    -	    lookup_prop(Tab, node_pool);
    +	    lookup_prop(Tab, node_pool);
     	n_fragments ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.n_fragments;
     	foreign_key ->
    -	    FH = lookup_frag_hash(Tab),
    +	    FH = lookup_frag_hash(Tab),
     	    FH#frag_state.foreign_key;
     	foreigners ->
    -	    lookup_foreigners(Tab);
    +	    lookup_foreigners(Tab);
     	n_ram_copies ->
    -	    length(val({Tab, ram_copies}));
    +	    length(val({Tab, ram_copies}));
     	n_disc_copies ->
    -	    length(val({Tab, disc_copies}));
    +	    length(val({Tab, disc_copies}));
     	n_disc_only_copies ->
    -	    length(val({Tab, disc_only_copies}));
    +	    length(val({Tab, disc_only_copies}));
     	n_external_copies ->
    -	    length(val({Tab, external_copies}));
    +	    length(val({Tab, external_copies}));
     
     	frag_names ->
    -	    frag_names(Tab);
    +	    frag_names(Tab);
     	frag_dist ->
    -	    frag_dist(Tab);
    +	    frag_dist(Tab);
     	frag_size ->
    -	    frag_size(ActivityId, Opaque, Tab);
    +	    frag_size(ActivityId, Opaque, Tab);
     	frag_memory ->
    -	    frag_memory(ActivityId, Opaque, Tab);
    +	    frag_memory(ActivityId, Opaque, Tab);
     	_ ->
    -	    mnesia:table_info(ActivityId, Opaque, Frag, Item)
    +	    mnesia:table_info(ActivityId, Opaque, Frag, Item)
         end.
     
    -first(ActivityId, Opaque, Tab) ->
    -    case ?catch_val({Tab, frag_hash}) of
    -	{'EXIT', _} ->
    -	    mnesia:first(ActivityId, Opaque, Tab);
    +first(ActivityId, Opaque, Tab) ->
    +    case ?catch_val({Tab, frag_hash}) of
    +	{'EXIT', _} ->
    +	    mnesia:first(ActivityId, Opaque, Tab);
     	FH ->
     	    FirstFrag = Tab,
    -	    case mnesia:first(ActivityId, Opaque, FirstFrag) of
    +	    case mnesia:first(ActivityId, Opaque, FirstFrag) of
     		'$end_of_table' ->
    -		    search_first(ActivityId, Opaque, Tab, 1, FH);
    +		    search_first(ActivityId, Opaque, Tab, 1, FH);
     		Next ->
     		    Next
     	    end
         end.
     
    -search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
    +search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
         NextN = N + 1,
    -    NextFrag = n_to_frag_name(Tab, NextN),
    -    case mnesia:first(ActivityId, Opaque, NextFrag) of
    +    NextFrag = n_to_frag_name(Tab, NextN),
    +    case mnesia:first(ActivityId, Opaque, NextFrag) of
     	'$end_of_table' ->
    -	    search_first(ActivityId, Opaque, Tab, NextN, FH);
    +	    search_first(ActivityId, Opaque, Tab, NextN, FH);
     	Next ->
     	    Next
         end;
    -search_first(_ActivityId, _Opaque, _Tab, _N, _FH) ->
    +search_first(_ActivityId, _Opaque, _Tab, _N, _FH) ->
         '$end_of_table'.
     
    -last(ActivityId, Opaque, Tab) ->
    -    case ?catch_val({Tab, frag_hash}) of
    -	{'EXIT', _} ->
    -	    mnesia:last(ActivityId, Opaque, Tab);
    +last(ActivityId, Opaque, Tab) ->
    +    case ?catch_val({Tab, frag_hash}) of
    +	{'EXIT', _} ->
    +	    mnesia:last(ActivityId, Opaque, Tab);
     	FH ->
     	    LastN = FH#frag_state.n_fragments,
    -	    search_last(ActivityId, Opaque, Tab, LastN, FH)
    +	    search_last(ActivityId, Opaque, Tab, LastN, FH)
         end.
     
    -search_last(ActivityId, Opaque, Tab, N, FH) when N >= 1 ->
    -    Frag = n_to_frag_name(Tab, N),
    -    case mnesia:last(ActivityId, Opaque, Frag) of
    +search_last(ActivityId, Opaque, Tab, N, FH) when N >= 1 ->
    +    Frag = n_to_frag_name(Tab, N),
    +    case mnesia:last(ActivityId, Opaque, Frag) of
     	'$end_of_table' ->
     	    PrevN = N - 1,
    -	    search_last(ActivityId, Opaque, Tab, PrevN, FH);
    +	    search_last(ActivityId, Opaque, Tab, PrevN, FH);
     	Prev ->
     	    Prev
         end;
    -search_last(_ActivityId, _Opaque, _Tab, _N, _FH) ->
    +search_last(_ActivityId, _Opaque, _Tab, _N, _FH) ->
         '$end_of_table'.
     
    -prev(ActivityId, Opaque, Tab, Key) ->
    -    case ?catch_val({Tab, frag_hash}) of
    -	{'EXIT', _} ->
    -	    mnesia:prev(ActivityId, Opaque, Tab, Key);
    +prev(ActivityId, Opaque, Tab, Key) ->
    +    case ?catch_val({Tab, frag_hash}) of
    +	{'EXIT', _} ->
    +	    mnesia:prev(ActivityId, Opaque, Tab, Key);
     	FH ->
    -	    N = key_to_n(FH, Key),
    -	    Frag = n_to_frag_name(Tab, N),
    -	    case mnesia:prev(ActivityId, Opaque, Frag, Key) of
    +	    N = key_to_n(FH, Key),
    +	    Frag = n_to_frag_name(Tab, N),
    +	    case mnesia:prev(ActivityId, Opaque, Frag, Key) of
     		'$end_of_table' ->
    -		    search_prev(ActivityId, Opaque, Tab, N);
    +		    search_prev(ActivityId, Opaque, Tab, N);
     		Prev ->
     		    Prev
     	    end
         end.
     
    -search_prev(ActivityId, Opaque, Tab, N) when N > 1 ->
    +search_prev(ActivityId, Opaque, Tab, N) when N > 1 ->
         PrevN = N - 1,
    -    PrevFrag = n_to_frag_name(Tab, PrevN),
    -    case mnesia:last(ActivityId, Opaque, PrevFrag) of
    +    PrevFrag = n_to_frag_name(Tab, PrevN),
    +    case mnesia:last(ActivityId, Opaque, PrevFrag) of
     	'$end_of_table' ->
    -	    search_prev(ActivityId, Opaque, Tab, PrevN);
    +	    search_prev(ActivityId, Opaque, Tab, PrevN);
     	Prev ->
     	    Prev
         end;
    -search_prev(_ActivityId, _Opaque, _Tab, _N) ->
    +search_prev(_ActivityId, _Opaque, _Tab, _N) ->
         '$end_of_table'.
     
    -next(ActivityId, Opaque, Tab, Key) ->
    -    case ?catch_val({Tab, frag_hash}) of
    -	{'EXIT', _} ->
    -	    mnesia:next(ActivityId, Opaque, Tab, Key);
    +next(ActivityId, Opaque, Tab, Key) ->
    +    case ?catch_val({Tab, frag_hash}) of
    +	{'EXIT', _} ->
    +	    mnesia:next(ActivityId, Opaque, Tab, Key);
     	FH ->
    -	    N = key_to_n(FH, Key),
    -	    Frag = n_to_frag_name(Tab, N),
    -	    case mnesia:next(ActivityId, Opaque, Frag, Key) of
    +	    N = key_to_n(FH, Key),
    +	    Frag = n_to_frag_name(Tab, N),
    +	    case mnesia:next(ActivityId, Opaque, Frag, Key) of
     		'$end_of_table' ->
    -		    search_next(ActivityId, Opaque, Tab, N, FH);
    +		    search_next(ActivityId, Opaque, Tab, N, FH);
     		Prev ->
     		    Prev
     	    end
         end.
     
    -search_next(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
    +search_next(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
         NextN = N + 1,
    -    NextFrag = n_to_frag_name(Tab, NextN),
    -    case mnesia:first(ActivityId, Opaque, NextFrag) of
    +    NextFrag = n_to_frag_name(Tab, NextN),
    +    case mnesia:first(ActivityId, Opaque, NextFrag) of
     	'$end_of_table' ->
    -	    search_next(ActivityId, Opaque, Tab, NextN, FH);
    +	    search_next(ActivityId, Opaque, Tab, NextN, FH);
     	Next ->
     	    Next
         end;
    -search_next(_ActivityId, _Opaque, _Tab, _N, _FH) ->
    +search_next(_ActivityId, _Opaque, _Tab, _N, _FH) ->
         '$end_of_table'.
    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_c.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_c.html index fd3c26d611de1..00a36fdd8dd75 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_c.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_app_c.html @@ -131,136 +131,136 @@

    mnesia_frag_hash Callback Behavior

    -
    -module(mnesia_frag_hash).
    --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
    +
    -module(mnesia_frag_hash).
    +-compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
     
     %% Fragmented Table Hashing callback functions
    --export([
    +-export([
     	 init_state/2,
     	 add_frag/1,
     	 del_frag/1,
     	 key_to_frag_number/2,
     	 match_spec_to_frag_numbers/2
    -	]).
    -record(hash_state,
    -	{n_fragments,
    +	]).
    -record(hash_state,
    +	{n_fragments,
     	 next_n_to_split,
     	 n_doubles,
    -	 function}).
    +	 function}).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec init_state(Tab, State) -> NewState when
    -      Tab :: atom(),
    -      State :: term(),
    -      NewState :: term().
    -init_state(_Tab, State) when State == undefined ->
    -    #hash_state{n_fragments     = 1,
    +-spec init_state(Tab, State) -> NewState when
    +      Tab :: atom(),
    +      State :: term(),
    +      NewState :: term().
    +init_state(_Tab, State) when State == undefined ->
    +    #hash_state{n_fragments     = 1,
     		next_n_to_split = 1,
     		n_doubles       = 0,
    -		function        = phash2}.
    +		function        = phash2}.
     
    -convert_old_state({hash_state, N, P, L}) ->
    -    #hash_state{n_fragments     = N,
    +convert_old_state({hash_state, N, P, L}) ->
    +    #hash_state{n_fragments     = N,
     		next_n_to_split = P,
     		n_doubles       = L,
    -		function        = phash}.
    +		function        = phash}.
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN + 1,
         NewN = N + 1,
    -    State2 = case power2(L) + 1 of
    +    State2 = case power2(L) + 1 of
     		 P2 when P2 == P ->
    -		     State#hash_state{n_fragments      = NewN,
    +		     State#hash_state{n_fragments      = NewN,
     				      n_doubles        = L + 1,
    -				      next_n_to_split = 1};
    +				      next_n_to_split = 1};
     		 _ ->
    -		     State#hash_state{n_fragments     = NewN,
    -				      next_n_to_split = P}
    +		     State#hash_state{n_fragments     = NewN,
    +				      next_n_to_split = P}
     	     end,
    -    {State2, [SplitN], [NewN]};
    -add_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    add_frag(State).
    +    {State2, [SplitN], [NewN]};
    +add_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    add_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN - 1,
         if
     	P < 1 ->
     	    L2 = L - 1,
    -	    MergeN = power2(L2),
    -	    State2 = State#hash_state{n_fragments     = N - 1,
    +	    MergeN = power2(L2),
    +	    State2 = State#hash_state{n_fragments     = N - 1,
     				      next_n_to_split = MergeN,
    -				      n_doubles       = L2},
    -	    {State2, [N], [MergeN]};
    +				      n_doubles       = L2},
    +	    {State2, [N], [MergeN]};
     	true ->
     	    MergeN = P,
    -	    State2 = State#hash_state{n_fragments     = N - 1,
    -				      next_n_to_split = MergeN},
    -	    {State2, [N], [MergeN]}
    +	    State2 = State#hash_state{n_fragments     = N - 1,
    +				      next_n_to_split = MergeN},
    +	    {State2, [N], [MergeN]}
     	end;
    -del_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    del_frag(State).
    +del_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    del_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec key_to_frag_number(State, Key) -> Fragnum when
    -      State :: term(),
    -      Key :: term(),
    -      Fragnum :: integer().
    -key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash(Key, power2(L + 1)),
    +-spec key_to_frag_number(State, Key) -> Fragnum when
    +      State :: term(),
    +      Key :: term(),
    +      Fragnum :: integer().
    +key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash(Key, power2(L + 1)),
         if
     	A > N ->
    -	    A - power2(L);
    +	    A - power2(L);
     	true ->
     	    A
         end;
    -key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash2(Key, power2(L + 1)) + 1,
    +key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash2(Key, power2(L + 1)) + 1,
         if
     	A > N ->
    -	    A - power2(L);
    +	    A - power2(L);
     	true ->
     	    A
         end;
    -key_to_frag_number(OldState, Key) ->
    -    State = convert_old_state(OldState),
    -    key_to_frag_number(State, Key).
    +key_to_frag_number(OldState, Key) ->
    +    State = convert_old_state(OldState),
    +    key_to_frag_number(State, Key).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    -      State :: term(),
    -      MatchSpec :: ets:match_spec(),
    -      Fragnums :: [integer()].
    -match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
    +-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    +      State :: term(),
    +      MatchSpec :: ets:match_spec(),
    +      Fragnums :: [integer()].
    +match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
         case MatchSpec of
    -	[{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    -	    KeyPat = element(2, HeadPat),
    -	    case has_var(KeyPat) of
    +	[{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    +	    KeyPat = element(2, HeadPat),
    +	    case has_var(KeyPat) of
     		false ->
    -		    [key_to_frag_number(State, KeyPat)];
    +		    [key_to_frag_number(State, KeyPat)];
     		true ->
    -		    lists:seq(1, N)
    +		    lists:seq(1, N)
     	    end;
     	_ ->
    -	    lists:seq(1, N)
    +	    lists:seq(1, N)
         end;
    -match_spec_to_frag_numbers(OldState, MatchSpec) ->
    -    State = convert_old_state(OldState),
    -    match_spec_to_frag_numbers(State, MatchSpec).
    +match_spec_to_frag_numbers(OldState, MatchSpec) ->
    +    State = convert_old_state(OldState),
    +    match_spec_to_frag_numbers(State, MatchSpec).
     
    -power2(Y) ->
    +power2(Y) ->
         1 bsl Y. % trunc(math:pow(2, Y)).
    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap2.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap2.html index 53889bbd04605..d8ece202a5482 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap2.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap2.html @@ -137,21 +137,21 @@

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    unix> erl -mnesia dir '"/tmp/funky"'
    -Erlang (BEAM) emulator version 4.9
    +Erlang (BEAM) emulator version 4.9
     
    -Eshell V4.9  (abort with ^G)
    +Eshell V4.9  (abort with ^G)
     1>
    -1> mnesia:create_schema([node()]).
    +1> mnesia:create_schema([node()]).
     ok
    -2> mnesia:start().
    +2> mnesia:start().
     ok
    -3> mnesia:create_table(funky, []).
    -{atomic,ok}
    -4> mnesia:info().
    +3> mnesia:create_table(funky, []).
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <---
     ---> Processes waiting for locks <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     funky          : with 0 records occupying 269 words of mem
    @@ -159,17 +159,17 @@ 

    ===> 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] +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: [] +0 transactions waits for other nodes: [] ok

    In this example, the following actions are performed:

    • Step 1: The Erlang system is started from the UNIX prompt with a flag -mnesia dir '"/tmp/funky"', which indicates in which directory to store the data.
    • Step 2: A new empty schema is initialized on the local node by evaluating @@ -229,28 +229,28 @@

      Defining Structure and Content

      First the record definitions are entered into a text file named company.hrl. -This file defines the following structure for the example database:

      -record(employee, {emp_no,
      +This file defines the following structure for the example database:

      -record(employee, {emp_no,
                          name,
                          salary,
                          sex,
                          phone,
      -                   room_no}).
      +                   room_no}).
       
      --record(dept, {id,
      -               name}).
      +-record(dept, {id,
      +               name}).
       
      --record(project, {name,
      -                  number}).
      +-record(project, {name,
      +                  number}).
       
       
      --record(manager, {emp,
      -                  dept}).
      +-record(manager, {emp,
      +                  dept}).
       
      --record(at_dep, {emp,
      -                 dept_id}).
      +-record(at_dep, {emp,
      +                 dept_id}).
       
      --record(in_proj, {emp,
      -                  proj_name}).

      The structure defines six tables in the database. In Mnesia, the function +-record(in_proj, {emp, + proj_name}).

      The structure defines six tables in the database. In Mnesia, the function mnesia:create_table(Name, ArgList) creates 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 @@ -267,28 +267,28 @@

      The following shell interaction starts Mnesia and initializes the schema for the Company database:

      % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
      -Erlang (BEAM) emulator version 4.9
      +Erlang (BEAM) emulator version 4.9
       
      -Eshell V4.9  (abort with ^G)
      -1> mnesia:create_schema([node()]).
      +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:

      -include_lib("stdlib/include/qlc.hrl").
      --include("company.hrl").
      -
      -init() ->
      -    mnesia:create_table(employee,
      -                        [{attributes, record_info(fields, employee)}]),
      -    mnesia:create_table(dept,
      -                        [{attributes, record_info(fields, dept)}]),
      -    mnesia:create_table(project,
      -                        [{attributes, record_info(fields, project)}]),
      -    mnesia:create_table(manager, [{type, bag},
      -                                  {attributes, record_info(fields, manager)}]),
      -    mnesia:create_table(at_dep,
      -                         [{attributes, record_info(fields, at_dep)}]),
      -    mnesia:create_table(in_proj, [{type, bag},
      -                                  {attributes, record_info(fields, in_proj)}]).

      +2> mnesia:start(). +ok

    The following program module creates and populates previously defined tables:

    -include_lib("stdlib/include/qlc.hrl").
    +-include("company.hrl").
    +
    +init() ->
    +    mnesia:create_table(employee,
    +                        [{attributes, record_info(fields, employee)}]),
    +    mnesia:create_table(dept,
    +                        [{attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                        [{attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {attributes, record_info(fields, manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj, [{type, bag},
    +                                  {attributes, record_info(fields, in_proj)}]).

    @@ -302,13 +302,13 @@

    the format mnesia:create_schema(DiscNodeList) and initiates a new schema. In this example, a non-distributed system using only one node is created. Schemas are fully explained in Define a Schema.
  • mnesia:start(). This function starts Mnesia and is fully -explained in Start Mnesia.
  • Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    -{atomic,ok}
    -4> mnesia:info().
    +explained in Start Mnesia.

    Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <---
     ---> Processes waiting for locks <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     in_proj        : with 0 records occuping 269 words of mem
    @@ -321,19 +321,19 @@ 

    ===> 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 = [] +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] + [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: [] +0 transactions waits for other nodes: [] ok

    A set of tables is created. The function mnesia:create_table(Name, ArgList) creates the required database tables. The options available with ArgList are explained in @@ -347,32 +347,32 @@

    transactions have been committed, as six successful transactions were run when creating the tables.

    To write a function that 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) ->
    +following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
         Ename = Emp#employee.name,
    -    Fun = fun() ->
    -                  mnesia:write(Emp),
    -                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    -                  mnesia:write(AtDep),
    -                  mk_projs(Ename, ProjNames)
    +    Fun = fun() ->
    +                  mnesia:write(Emp),
    +                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    +                  mnesia:write(AtDep),
    +                  mk_projs(Ename, ProjNames)
               end,
    -    mnesia:transaction(Fun).
    +    mnesia:transaction(Fun).
     
     
    -mk_projs(Ename, [ProjName|Tail]) ->
    -    mnesia:write(#in_proj{emp = Ename, proj_name = ProjName}),
    -    mk_projs(Ename, Tail);
    -mk_projs(_, []) -> ok.
    • The insert_emp/3 arguments are as follows:
      1. Emp is an employee record.
      2. DeptId is the identity of the department where the employee works.
      3. ProjNames is a list of the names of the projects where the employee +mk_projs(Ename, [ProjName|Tail]) -> + mnesia:write(#in_proj{emp = Ename, proj_name = ProjName}), + mk_projs(Ename, Tail); +mk_projs(_, []) -> ok.
    • The insert_emp/3 arguments are as follows:
      1. Emp is an employee record.
      2. DeptId is the identity of the department where the employee works.
      3. ProjNames is a list of the names of the projects where the employee works.

    The function insert_emp/3 creates a Functional Object (Fun). 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:

    • A Fun either succeeds or fails.
    • Code that manipulates the same data records can be run concurrently without -the different processes interfering with each other.

    The function can be used as follows:

    Emp = #employee{emp_no = 104732,
    +the different processes interfering with each other.

    The function can be used as follows:

    Emp = #employee{emp_no = 104732,
                     name = klacke,
                     salary = 7,
                     sex = male,
                     phone = 98108,
    -                room_no = {221, 015}},
    -insert_emp(Emp, 'B/SFR', [Erlang, mnesia, otp]).

    Note

    For information about Funs, see "Fun Expressions" in section + room_no = {221, 015}}, +insert_emp(Emp, 'B/SFR', [Erlang, mnesia, otp]).

    Note

    For information about Funs, see "Fun Expressions" in section Erlang Reference Manual in System Documentation..

    @@ -400,48 +400,48 @@

    Adding Records and Relationships to Database

    After adding more records to the Company database, the result can be 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}.

    These three tables, employees, dept, and projects, are made up of real +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}.

    These three tables, employees, dept, and projects, are made up of real records. The following database content is stored in the tables and is built on -relationships. These tables are 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 +relationships. These tables are 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 that consists of a tuple. The first element of the tuple identifies a corridor, and the second element identifies the room in that corridor. An alternative is to represent this as a record -record(room, {corr, no}). @@ -453,67 +453,67 @@

    Retrieving data from DBMS is usually to be done with the functions mnesia:read/3 or mnesia:read/1. The following function -raises the salary:

    raise(Eno, Raise) ->
    -    F = fun() ->
    -                [E] = mnesia:read(employee, Eno, write),
    +raises the salary:

    raise(Eno, Raise) ->
    +    F = fun() ->
    +                [E] = mnesia:read(employee, Eno, write),
                     Salary = E#employee.salary + Raise,
    -                New = E#employee{salary = Salary},
    -                mnesia:write(New)
    +                New = E#employee{salary = Salary},
    +                mnesia:write(New)
             end,
    -    mnesia:transaction(F).

    Since it is desired to update the record using the function mnesia:write/1 + mnesia:transaction(F).

    Since it is desired to update the record using the function mnesia:write/1 after the salary has been increased, a write lock (third argument to read) is acquired when the record from the table is read.

    To read the values from the table directly is not always possible. It can be needed to search one or more tables to get the wanted data, and this is done by writing database queries. Queries are always more expensive operations than direct lookups done with mnesia:read/1. Therefore, avoid queries in performance-critical code.

    Two methods are available for writing database queries:

    • Mnesia functions
    • QLC

    Using Mnesia Functions

    The following function extracts the names of the female employees stored in the -database:

    mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).

    select must always run within an activity, such as a transaction. The -following function can be constructed to call from the shell:

    all_females() ->
    -    F = fun() ->
    -		Female = #employee{sex = female, name = '$1', _ = '_'},
    -		mnesia:select(employee, [{Female, [], ['$1']}])
    +database:

    mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).

    select must always run within an activity, such as a transaction. The +following function can be constructed to call from the shell:

    all_females() ->
    +    F = fun() ->
    +		Female = #employee{sex = female, name = '$1', _ = '_'},
    +		mnesia:select(employee, [{Female, [], ['$1']}])
             end,
    -    mnesia:transaction(F).

    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"]}

    For a description of select and its syntax, see + mnesia:transaction(F).

    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"]}

    For a description of select and its syntax, see Pattern Matching.

    Using QLC

    This section contains simple introductory examples only. For a full description of the QLC query language, see the qlc manual page in STDLIB.

    Using QLC can 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),
    -                              E#employee.sex == female]),
    -qlc:e(Q),

    Accessing Mnesia tables from a QLC list comprehension must always be done -within a transaction. Consider the following function:

    females() ->
    -    F = fun() ->
    -		Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    -					      E#employee.sex == female]),
    -		qlc:e(Q)
    +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),
    +                              E#employee.sex == female]),
    +qlc:e(Q),

    Accessing Mnesia tables from a QLC list comprehension must always be done +within a transaction. Consider the following function:

    females() ->
    +    F = fun() ->
    +		Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    +					      E#employee.sex == female]),
    +		qlc:e(Q)
     	end,
    -    mnesia:transaction(F).

    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, this operation is called a + mnesia:transaction(F).

    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, this operation is called a selection, followed by a projection.

    The previous list comprehension expression contains a number of syntactical elements:

    • The first [ bracket is read as "build the list".
    • The || "such that" and the arrow <- is read as "taken from".

    Hence, the previous list comprehension demonstrates the formation of the list E#employee.name such that E is taken from the table of employees, and attribute sex of each record is equal to the atom female.

    The whole list comprehension must be given to the function qlc:q/1.

    List comprehensions with low-level Mnesia functions can be combined in the same transaction. To raise the salary of all female employees, execute the -following:

    raise_females(Amount) ->
    -    F = fun() ->
    -                Q = qlc:q([E || E <- mnesia:table(employee),
    -                                E#employee.sex == female]),
    -		Fs = qlc:e(Q),
    -                over_write(Fs, Amount)
    +following:

    raise_females(Amount) ->
    +    F = fun() ->
    +                Q = qlc:q([E || E <- mnesia:table(employee),
    +                                E#employee.sex == female]),
    +		Fs = qlc:e(Q),
    +                over_write(Fs, Amount)
             end,
    -    mnesia:transaction(F).
    +    mnesia:transaction(F).
     
    -over_write([E|Tail], Amount) ->
    +over_write([E|Tail], Amount) ->
         Salary = E#employee.salary + Amount,
    -    New = E#employee{salary = Salary},
    -    mnesia:write(New),
    -    1 + over_write(Tail, Amount);
    -over_write([], _) ->
    +    New = E#employee{salary = Salary},
    +    mnesia:write(New),
    +    1 + over_write(Tail, Amount);
    +over_write([], _) ->
         0.

    The function raise_females/1 returns the tuple {atomic, Number}, where Number is the number of female employees who received a salary increase. If an error occurs, the value {aborted, Reason} is returned, and Mnesia guarantees -that the salary is not raised for any employee.

    Example:

    33> company:raise_females(33).
    -{atomic,2}
    +that the salary is not raised for any employee.

    Example:

    33> company:raise_females(33).
    +{atomic,2}
    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap3.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap3.html index ba21e378d748a..ae1c02398a0f0 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap3.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap3.html @@ -175,18 +175,18 @@

    changes the format on all records in table Tab. It applies argument Fun to all records in the table. Fun must be a function that takes a record of the old type, and returns the record of the new type. The table key must not be -changed.

    Example:

    -record(old, {key, val}).
    --record(new, {key, val, extra}).
    +changed.

    Example:

    -record(old, {key, val}).
    +-record(new, {key, val, extra}).
     
     Transformer =
    -   fun(X) when record(X, old) ->
    -      #new{key = X#old.key,
    +   fun(X) when record(X, old) ->
    +      #new{key = X#old.key,
                val = X#old.val,
    -           extra = 42}
    +           extra = 42}
        end,
    -{atomic, ok} = mnesia:transform_table(foo, Transformer,
    -                                      record_info(fields, new),
    -                                      new),

    Argument Fun can also be the atom ignore, which indicates that only the +{atomic, ok} = mnesia:transform_table(foo, Transformer, + record_info(fields, new), + new),

    Argument Fun can also be the atom ignore, which indicates that only the metadata about the table is updated. Use of ignore is not recommended (as it creates inconsistencies between the metadata and the actual data) but it is included as a possibility for the user do to an own (offline) transform.

  • mnesia:change_table_copy_type(Tab, Node, ToType) @@ -238,29 +238,29 @@

    when starting the Erlang shell or in the application script. Previously, the following example was used to create the directory for the Company database:

    % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'

  • If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

  • To start the Company database and get it running on the two specified nodes, -enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two -nodes:
    dist_init() ->
    -    mnesia:create_table(employee,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields,
    -						   employee)}]),
    -    mnesia:create_table(dept,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, dept)}]),
    -    mnesia:create_table(project,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, project)}]),
    -    mnesia:create_table(manager, [{type, bag},
    -                                  {ram_copies, [a@gin, b@skeppet]},
    -                                  {attributes, record_info(fields,
    -							   manager)}]),
    -    mnesia:create_table(at_dep,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, at_dep)}]),
    -    mnesia:create_table(in_proj,
    -                        [{type, bag},
    -                         {ram_copies, [a@gin, b@skeppet]},
    -                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because +enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two +nodes:
    dist_init() ->
    +    mnesia:create_table(employee,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields,
    +						   employee)}]),
    +    mnesia:create_table(dept,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {ram_copies, [a@gin, b@skeppet]},
    +                                  {attributes, record_info(fields,
    +							   manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj,
    +                        [{type, bag},
    +                         {ram_copies, [a@gin, b@skeppet]},
    +                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because /ldisc/scratch (the "local" disc) exists on the two different nodes.

    By executing these commands, two Erlang nodes are configured to run the Company database, and therefore, initialize the database. This is required only once when setting up. The next time the system is started, @@ -277,7 +277,7 @@

    Startup Procedure

    -

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. +

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. The alternatives are as follows:

    1. Tables that are only stored locally are initialized from the local Mnesia directory.
    2. Replicated tables that reside locally as well as somewhere else are either initiated from disc or by copying the entire table from the other node, @@ -300,9 +300,9 @@

      from disc at a faster rate. The function forces tables to be loaded from disc regardless of the network situation.

      Thus, it can be assumed that if an application wants to use tables a and b, the application must perform some action similar to following before it can use -the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      -  {timeout, RemainingTabs} ->
      -    panic(RemainingTabs);
      +the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      +  {timeout, RemainingTabs} ->
      +    panic(RemainingTabs);
         ok ->
           synced
       end.

      Warning

      When tables are forcefully loaded from the local disc, all operations that @@ -328,13 +328,13 @@

      key, whereas a table of type bag can have an arbitrary number of records per key. The key for each record is always the first attribute of the record.

      The following example illustrates the difference between type set and -bag:

       f() ->
      -    F = fun() ->
      -          mnesia:write({foo, 1, 2}),
      -          mnesia:write({foo, 1, 3}),
      -          mnesia:read({foo, 1})
      +bag:

       f() ->
      +    F = fun() ->
      +          mnesia:write({foo, 1, 2}),
      +          mnesia:write({foo, 1, 3}),
      +          mnesia:read({foo, 1})
               end,
      -    mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type + mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type set. However, the list [{foo,1,2}, {foo,1,3}] is returned if the table is of type bag.

      Mnesia tables can never contain duplicates of the same record in the same table. Duplicate records have attributes with the same contents and key.

    3. {disc_copies, NodeList}, where NodeList is a list of the nodes where @@ -378,11 +378,11 @@

      table. All records stored in the table must have this name as their first element. record_name defaults to the name of the table. For more information, see -Record Names versus Table Names.

    4. As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an -extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      -                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a +Record Names versus Table Names.

      As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an +extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      +                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a RAM copy on the local node, no extra indexes, and the attributes defaulted to -the list [key,val].

      mnesia:create_table(stuff, [])
      +the list [key,val].

      mnesia:create_table(stuff, [])
    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap4.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap4.html index 652f6c039c4db..5cd3931df476d 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap4.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap4.html @@ -145,14 +145,14 @@

    and delete Mnesia records. The Fun is evaluated as a transaction that either commits or terminates. If a transaction succeeds in executing the Fun, it replicates the action on all nodes involved, or terminates if an error occurs.

    The following example shows a transaction that raises the salary of certain -employee numbers:

    raise(Eno, Raise) ->
    -    F = fun() ->
    -                [E] = mnesia:read(employee, Eno, write),
    +employee numbers:

    raise(Eno, Raise) ->
    +    F = fun() ->
    +                [E] = mnesia:read(employee, Eno, write),
                     Salary = E#employee.salary + Raise,
    -                New = E#employee{salary = Salary},
    -                mnesia:write(New)
    +                New = E#employee{salary = Salary},
    +                mnesia:write(New)
             end,
    -    mnesia:transaction(F).

    The function raise/2 contains a Fun made up of four code lines. This Fun is + mnesia:transaction(F).

    The function raise/2 contains a Fun made up of four code lines. 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 @@ -246,15 +246,15 @@

      The Fun in the transaction is evaluated once more.

      It is therefore 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:

      bad_raise(Eno, Raise) ->
      -    F = fun() ->
      -                [E] = mnesia:read({employee, Eno}),
      +situation:

      bad_raise(Eno, Raise) ->
      +    F = fun() ->
      +                [E] = mnesia:read({employee, Eno}),
                       Salary = E#employee.salary + Raise,
      -                New = E#employee{salary = Salary},
      -                io:format("Trying to write ... ~n", []),
      -                mnesia:write(New)
      +                New = E#employee{salary = Salary},
      +                io:format("Trying to write ... ~n", []),
      +                mnesia:write(New)
               end,
      -    mnesia:transaction(F).

      This transaction can write the text "Trying to write ... " 1000 times to the + mnesia:transaction(F).

      This transaction can write the text "Trying to write ... " 1000 times to the terminal. However, Mnesia guarantees that each 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 that are waiting to execute. As a result, the Mnesia @@ -301,13 +301,13 @@

      fails. Such applications can benefit from using sticky locks instead of the normal locking scheme.

      A sticky lock is a lock that stays in place at a node, after the transaction that first acquired the lock has terminated. To illustrate this, assume that the -following transaction is executed:

      F = fun() ->
      -      mnesia:write(#foo{a = kalle})
      +following transaction is executed:

      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 the following:

      • One network RPC (two messages) to acquire the write lock
      • Three network messages to execute the two-phase commit protocol

      If sticky locks are used, the code must first be changed as follows:

      F = fun() ->
      -      mnesia:s_write(#foo{a = kalle})
      +mnesia:transaction(F).

      The foo table is replicated on the two nodes N1 and N2.

      Normal locking requires the following:

      • One network RPC (two messages) to acquire the write lock
      • Three network messages to execute the two-phase commit protocol

      If sticky locks are used, the code must first be changed as follows:

      F = fun() ->
      +      mnesia:s_write(#foo{a = kalle})
           end,
      -mnesia:transaction(F).

      This code uses the function s_write/1 instead of the +mnesia:transaction(F).

      This code uses the function s_write/1 instead of the function write/1 The function s_write/1 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 a sticky lock is set on node @@ -333,8 +333,8 @@

      following two functions are used to set explicit table locks for read and write operations:

      Alternative syntax for acquisition of table locks is as follows:

      mnesia:lock({table, Tab}, read)
      -mnesia:lock({table, Tab}, write)

      The matching operations in Mnesia can either lock the entire table or only a +on table Tab.

    Alternative syntax for acquisition of table locks is as follows:

    mnesia:lock({table, Tab}, read)
    +mnesia:lock({table, Tab}, write)

    The matching operations in Mnesia can either lock the entire table or only a single record (when the key is bound in the pattern).

    @@ -425,78 +425,78 @@

    necessarily have to be the same as the table name, although this is the case in most of the examples in this User's Guide. If a table is created without property record_name, the following code ensures that all records in the -tables have the same name as the table:

    mnesia:create_table(subscriber, [])

    However, if the table is created with an explicit record name as argument, as +tables have the same name as the table:

    mnesia:create_table(subscriber, [])

    However, if the table is created with an explicit record name as argument, as shown in the following example, subscriber records can be stored 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).

    To access such tables, simplified access functions (as described earlier) cannot +tables regardless of the table names:

    TabDef = [{record_name, subscriber}],
    +mnesia:create_table(my_subscriber, TabDef),
    +mnesia:create_table(your_subscriber, TabDef).

    To access such tables, simplified access functions (as described earlier) cannot be used. For example, writing a subscriber record into a table requires the function mnesia:write/3 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 simple code illustrates the relationship between the simplified +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 simple code illustrates the relationship between the simplified access functions used in most of the examples and their more flexible -counterparts:

    mnesia:dirty_write(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:dirty_write(Tab, Record).
    +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({Tab, Key}) ->
    +  mnesia:dirty_delete(Tab, Key).
     
    -mnesia:dirty_delete_object(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:dirty_delete_object(Tab, Record)
    +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_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_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_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: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: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:s_write(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:write(Tab, Record, sticky_write).
     
    -mnesia:delete({Tab, Key}) ->
    -  mnesia:delete(Tab, Key, write).
    +mnesia:delete({Tab, Key}) ->
    +  mnesia:delete(Tab, Key, write).
     
    -mnesia:s_delete({Tab, Key}) ->
    -  mnesia:delete(Tab, Key, sticky_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: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: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:read({Tab, Key}) ->
    +  mnesia:read(Tab, Key, read).
     
    -mnesia:wread({Tab, Key}) ->
    -  mnesia:read(Tab, Key, write).
    +mnesia:wread({Tab, Key}) ->
    +  mnesia:read(Tab, Key, write).
     
    -mnesia:match_object(Pattern) ->
    -  Tab = element(1, Pattern),
    -  mnesia:match_object(Tab, Pattern, read).
    +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).

    +mnesia:index_match_object(Pattern, Attr) -> + Tab = element(1, Pattern), + mnesia:index_match_object(Tab, Pattern, Attr, read).

    @@ -577,28 +577,28 @@

    terminates. So, although a nested transaction returns {atomic, Val}, if the enclosing parent transaction terminates, the entire nested operation terminates.

    The ability to have nested transaction with identical semantics as top-level transaction makes it easier to write library functions that manipulate Mnesia -tables.

    Consider a function that adds a subscriber to a telephony system:

    add_subscriber(S) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:read( ..........

    This function needs to be called as a transaction. Assume that you wish to write +tables.

    Consider a function that adds a subscriber to a telephony system:

    add_subscriber(S) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:read( ..........

    This function needs to be called as a transaction. Assume that you wish to write a function that both calls the function add_subscriber/1 and is in itself protected by the context of a transaction. By calling add_subscriber/1 from within another transaction, a nested transaction is created.

    Also, different activity access contexts can be mixed while nesting. However, the dirty ones (async_dirty, sync_dirty, and ets) inherit the transaction semantics if they are called inside a transaction and thus grab locks and use -two or three phase commit.

    Example:

    add_subscriber(S) ->
    -    mnesia:transaction(fun() ->
    +two or three phase commit.

    Example:

    add_subscriber(S) ->
    +    mnesia:transaction(fun() ->
            %% Transaction context
    -       mnesia:read({some_tab, some_data}),
    -       mnesia:sync_dirty(fun() ->
    +       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() ->
    +           case mnesia:read( ..) ..end), end).
    +add_subscriber2(S) ->
    +    mnesia:sync_dirty(fun() ->
            %% In dirty context
    -       mnesia:read({some_tab, some_data}),
    -       mnesia:transaction(fun() ->
    +       mnesia:read({some_tab, some_data}),
    +       mnesia:transaction(fun() ->
                %% In a transaction context.
    -           case mnesia:read( ..) ..end), end).

    + case mnesia:read( ..) ..end), end).

    @@ -606,13 +606,13 @@

    When the function mnesia:read/3 cannot be used, Mnesia provides the programmer with several functions for matching records against a pattern. The -most useful ones are the following:

    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) ->
    +most useful ones are the following:

    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 match a Pattern against all records in table Tab. In a mnesia:select call, Pattern is a part of MatchSpecification described in the following. It is not necessarily performed @@ -627,22 +627,22 @@

    occurrences of that variable against the bound value.

    Use 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, as this makes the -code more vulnerable to future changes of the record definition.

    Example:

    Wildpattern = mnesia:table_info(employee, wild_pattern),
    +code more vulnerable to future changes of the record definition.

    Example:

    Wildpattern = mnesia:table_info(employee, wild_pattern),
     %% Or use
    -Wildpattern = #employee{_ = '_'},

    For the employee table, the wild pattern looks as follows:

    {employee, '_', '_', '_', '_', '_',' _'}.

    To constrain the match, it is needed to replace some of the '_' elements. The -code for matching out all female employees looks as follows:

    Pat = #employee{sex = female, _ = '_'},
    -F = fun() -> mnesia:match_object(Pat) end,
    -Females = mnesia:transaction(F).

    The match function can also be used to check the equality of different +Wildpattern = #employee{_ = '_'},

    For the employee table, the wild pattern looks as follows:

    {employee, '_', '_', '_', '_', '_',' _'}.

    To constrain the match, it is needed to replace some of the '_' elements. The +code for matching out all female employees looks as follows:

    Pat = #employee{sex = female, _ = '_'},
    +F = fun() -> mnesia:match_object(Pat) end,
    +Females = mnesia:transaction(F).

    The match function can also be used to check the equality of different attributes. For example, to find all employees with an employee number 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 +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 cannot express constraints other -than equality. To find the names of the male employees on the second floor:

    MatchHead = #employee{name='$1', sex=male, room_no={'$2', '_'}, _='_'},
    -Guard = [{'>=', '$2', 220},{'<', '$2', 230}],
    +than equality. To find the names of the male employees on the second floor:

    MatchHead = #employee{name='$1', sex=male, room_no={'$2', '_'}, _='_'},
    +Guard = [{'>=', '$2', 220},{'<', '$2', 230}],
     Result = '$1',
    -mnesia:select(employee,[{MatchHead, Guard, [Result]}])

    The function select can be used to add more constraints and create output that +mnesia:select(employee,[{MatchHead, Guard, [Result]}])

    The function select can be used to add more constraints and create output that cannot be done with mnesia:match_object/3.

    The second argument to select is a MatchSpecification. A MatchSpecification is a list of MatchFunctions, where each MatchFunction consists of a tuple containing {MatchHead, MatchCondition, MatchBody}:

    • MatchHead is the same pattern as used in mnesia:match_object/3 described @@ -672,8 +672,8 @@

      {traverse, {select, MatchSpecification}} as an option to mnesia:table/2 the user can specify its own view of the table.

    If no options are specified, a read lock is acquired, 100 results are returned -in each chunk, and select is used to traverse the table, that is:

    mnesia:table(Tab) ->
    -    mnesia:table(Tab, [{n_objects, 100},{lock, read}, {traverse, select}]).

    The function mnesia:all_keys(Tab) returns all keys in a +in each chunk, and select is used to traverse the table, that is:

    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.

    @@ -681,10 +681,10 @@

    Iteration

    Mnesia provides the following functions that iterate 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 +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. Fun takes two arguments, the first is a record from the table, and the second is the accumulator. Fun returns a new accumulator.

    The first time Fun is applied, Acc0 is the second argument. The next time Fun is called, the return value from the previous call is used as the second @@ -695,35 +695,35 @@

    write lock is to be acquired.

    These functions can be used to find records in a table when it is impossible to write constraints for the function mnesia:match_object/3, or when you want to perform some action on certain records.

    For example, finding all the employees who have a salary less than 10 can look -as follows:

    find_low_salaries() ->
    +as follows:

    find_low_salaries() ->
       Constraint =
    -       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    -              [Emp | Acc];
    -          (_, Acc) ->
    +       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    +              [Emp | Acc];
    +          (_, Acc) ->
                   Acc
            end,
    -  Find = fun() -> mnesia:foldl(Constraint, [], employee) end,
    -  mnesia:transaction(Find).

    To raise the salary to 10 for everyone with a salary less than 10 and return the -sum of all raises:

    increase_low_salaries() ->
    +  Find = fun() -> mnesia:foldl(Constraint, [], employee) end,
    +  mnesia:transaction(Find).

    To raise the salary to 10 for everyone with a salary less than 10 and return the +sum of all raises:

    increase_low_salaries() ->
        Increase =
    -       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    +       fun(Emp, Acc) when Emp#employee.salary < 10 ->
                   OldS = Emp#employee.salary,
    -              ok = mnesia:write(Emp#employee{salary = 10}),
    +              ok = mnesia:write(Emp#employee{salary = 10}),
                   Acc + 10 - OldS;
    -          (_, Acc) ->
    +          (_, Acc) ->
                   Acc
            end,
    -  IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end,
    -  mnesia:transaction(IncLow).

    Many nice things can be done with the iterator functions but take some caution + IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end, + mnesia:transaction(IncLow).

    Many nice things can be done with the iterator functions but take some caution about performance and memory use 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 generates much 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 type ordered_set:

    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 is only valid for ordered_set +is not of type ordered_set:

    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 is only valid for ordered_set tables, they are synonyms for other tables. 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 the function mnesia:foldl/3 or mnesia:foldr/3 with a write lock. Or the function diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap5.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap5.html index 684504e3db617..6db58aefb294b 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap5.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap5.html @@ -167,9 +167,9 @@

    whether the data resides on the local node or on a remote node.

    Notice that the program runs 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 affect the user programs.

  • It has previously been shown 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 creates a 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 +following function creates a 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 resides on each node in the list.

      Notice that no disc operations are performed when a program executes write operations to these replicas. However, if permanent RAM replicas are required, @@ -222,52 +222,52 @@

      searched for matching records.

      Notice that in ordered_set tables, the records are ordered per fragment, and the order is undefined in results returned by select and match_object, as well as first, next, prev and last.

      The following code illustrates how a Mnesia table is converted to be a -fragmented table and how more fragments are added later:

      Eshell V4.7.3.3  (abort with ^G)
      -(a@sam)1> mnesia:start().
      +fragmented table and how more fragments are added later:

      Eshell V4.7.3.3  (abort with ^G)
      +(a@sam)1> mnesia:start().
       ok
      -(a@sam)2> mnesia:system_info(running_db_nodes).
      -[b@sam,c@sam,a@sam]
      +(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.
      +(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<erl_eval>
      -(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
      +(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.
      +(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<erl_eval>
      -(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.
      +(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<erl_eval>
      -(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>

      +(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>

      @@ -309,64 +309,64 @@

      This property can explicitly be set at table creation. Default is mnesia_frag_hash.

    • {hash_state, Term} - Enables a table-specific parameterization of a generic hash module. This property can explicitly be set at table creation. -Default is undefined.

      Eshell V4.7.3.3  (abort with ^G)
      -(a@sam)1> mnesia:start().
      +Default is undefined.

      Eshell V4.7.3.3  (abort with ^G)
      +(a@sam)1> 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,
      -                              [{frag_properties, SecProps},
      -(a@sam)5>                      {attributes, [sec_key, sec_val]}]).
      -{atomic,ok}
      -(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
      +(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,
      +                              [{frag_properties, SecProps},
      +(a@sam)5>                      {attributes, [sec_key, sec_val]}]).
      +{atomic,ok}
      +(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
       #Fun<erl_eval>
       (a@sam)7> PrimKey = 11.
       11
       (a@sam)8> SecKey = 42.
       42
      -(a@sam)9> mnesia:activity(sync_dirty, Write,
      -                          [{prim_dict, PrimKey, -11}], mnesia_frag).
      +(a@sam)9> mnesia:activity(sync_dirty, Write,
      +                          [{prim_dict, PrimKey, -11}], mnesia_frag).
       ok
      -(a@sam)10> mnesia:activity(sync_dirty, Write,
      -                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
      +(a@sam)10> mnesia:activity(sync_dirty, Write,
      +                           [{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) ->
      -               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
      +(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
      +{atomic,ok}
      +(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
      +               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
       #Fun<erl_eval>
      -(a@sam)13> mnesia:activity(transaction, SecRead,
      -                           [PrimKey, SecKey], mnesia_frag).
      -[{sec_dict,42,11}]
      -(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
      +(a@sam)13> mnesia:activity(transaction, SecRead,
      +                           [PrimKey, SecKey], mnesia_frag).
      +[{sec_dict,42,11}]
      +(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
       #Fun<erl_eval>
      -(a@sam)15> mnesia:activity(sync_dirty, Info,
      -                           [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,
      -                           [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>

    +(a@sam)15> mnesia:activity(sync_dirty, Info, + [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, + [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>

    @@ -496,10 +496,10 @@

    table is ram_copies). The default for the application parameter is opt_disc.

    When schema_location is set to opt_disc, the function mnesia:change_table_copy_type/3 can be used to change the storage type of the -schema. This is illustrated as follows:

    1> mnesia:start().
    +schema. This is illustrated as follows:

    1> mnesia:start().
     ok
    -2> mnesia:change_table_copy_type(schema, node(), disc_copies).
    -{atomic, ok}

    Assuming that the call to mnesia:start/0 does not find any schema to read on +2> mnesia:change_table_copy_type(schema, node(), disc_copies). +{atomic, ok}

    Assuming that the call to mnesia:start/0 does not find any schema to read on the disc, Mnesia starts as a disc-less node, and then change it to a node that use the disc to store the schema locally.

    @@ -723,34 +723,34 @@

    a normal text editor) and later reloaded.

    These functions are much slower than the ordinary store and load functions of Mnesia. However, this is mainly intended for minor experiments and initial prototyping. The major advantage of these functions is that they are easy to -use.

    The format of the text file is as follows:

    {tables, [{Typename, [Options]},
    -{Typename2 ......}]}.
    +use.

    The format of the text file is as follows:

    {tables, [{Typename, [Options]},
    +{Typename2 ......}]}.
     
    -{Typename, Attribute1, Attribute2 ....}.
    -{Typename, Attribute1, Attribute2 ....}.

    Options is a list of {Key,Value} tuples conforming to the options that you +{Typename, Attribute1, Attribute2 ....}. +{Typename, Attribute1, Attribute2 ....}.

    Options is a list of {Key,Value} tuples conforming to the options that you can give to mnesia:create_table/2.

    For example, to start playing with a small database for healthy foods, enter the -following data into file FRUITS:

    {tables,
    - [{fruit, [{attributes, [name, color, taste]}]},
    -  {vegetable, [{attributes, [name, color, taste, price]}]}]}.
    +following data into file FRUITS:

    {tables,
    + [{fruit, [{attributes, [name, color, taste]}]},
    +  {vegetable, [{attributes, [name, color, taste, price]}]}]}.
     
     
    -{fruit, orange, orange, sweet}.
    -{fruit, apple, green, sweet}.
    -{vegetable, carrot, orange, carrotish, 2.55}.
    -{vegetable, potato, yellow, none, 0.45}.

    The following session with the Erlang shell shows how to load the FRUITS +{fruit, orange, orange, sweet}. +{fruit, apple, green, sweet}. +{vegetable, carrot, orange, carrotish, 2.55}. +{vegetable, potato, yellow, none, 0.45}.

    The following session with the Erlang shell shows how to load the FRUITS database:

    % erl
    -Erlang (BEAM) emulator version 4.9
    +Erlang (BEAM) emulator version 4.9
     
    -Eshell V4.9  (abort with ^G)
    -1> mnesia:load_textfile("FRUITS").
    +Eshell V4.9  (abort with ^G)
    +1> mnesia:load_textfile("FRUITS").
     New table fruit
     New table vegetable
    -{atomic,ok}
    -2> mnesia:info().
    +{atomic,ok}
    +2> mnesia:info().
     ---> Processes holding locks <---
     ---> Processes waiting for locks <---
    ----> Pending (remote) transactions <---
    ----> Active (local) transactions <---
    +---> Pending (remote) transactions <---
    +---> Active (local) transactions <---
     ---> Uncertain transactions <---
     ---> Active tables <---
     vegetable      : with 2 records occuping 299 words of mem
    @@ -759,17 +759,17 @@ 

    ===> 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] +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: [] +0 transactions waits for other nodes: [] ok 3>

    It can be seen that the DBMS was initiated from a regular text file.

    @@ -783,20 +783,20 @@

    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, -one project can easily be removed, as the following example illustrates:

    remove_proj(ProjName) ->
    -    F = fun() ->
    -                Ip = qlc:e(qlc:q([X || X <- mnesia:table(in_proj),
    -				       X#in_proj.proj_name == ProjName]
    -				)),
    -                mnesia:delete({project, ProjName}),
    -                del_in_projs(Ip)
    +one project can easily be removed, as the following example illustrates:

    remove_proj(ProjName) ->
    +    F = fun() ->
    +                Ip = qlc:e(qlc:q([X || X <- mnesia:table(in_proj),
    +				       X#in_proj.proj_name == ProjName]
    +				)),
    +                mnesia:delete({project, ProjName}),
    +                del_in_projs(Ip)
             end,
    -    mnesia:transaction(F).
    +    mnesia:transaction(F).
     
    -del_in_projs([Ip|Tail]) ->
    -    mnesia:delete_object(Ip),
    -    del_in_projs(Tail);
    -del_in_projs([]) ->
    +del_in_projs([Ip|Tail]) ->
    +    mnesia:delete_object(Ip),
    +    del_in_projs(Tail);
    +del_in_projs([]) ->
         done.

    In reality, data models are seldom fully normalized. A realistic alternative to a normalized database model would be a data model that is not even in first normal form. Mnesia is suitable for applications such as telecommunications, @@ -811,7 +811,7 @@

    this is the case, a drastically different data model without direct relationships can be chosen. You would then have only the records themselves, and different records could contain either direct references to other records, -or contain other records that are not part of the Mnesia schema.

    The following record definitions can be created:

    -record(employee, {emp_no,
    +or contain other records that are not part of the Mnesia schema.

    The following record definitions can be created:

    -record(employee, {emp_no,
     		   name,
     		   salary,
     		   sex,
    @@ -819,23 +819,23 @@ 

    room_no, dept, projects, - manager}). + manager}). --record(dept, {id, - name}). +-record(dept, {id, + name}). --record(project, {name, +-record(project, {name, number, - location}).

    A record that describes an employee can look as follows:

    Me = #employee{emp_no = 104732,
    +                  location}).

    A record that describes an employee can look as follows:

    Me = #employee{emp_no = 104732,
                    name = klacke,
                    salary = 7,
                    sex = male,
                    phone = 99586,
    -               room_no = {221, 015},
    +               room_no = {221, 015},
                    dept = 'B/SFR',
    -               projects = [erlang, mnesia, otp],
    -               manager = 114872},

    This model has only three different tables, and the employee records contain + projects = [erlang, mnesia, otp], + manager = 114872},

    This model has only three different tables, and the employee records contain references to other records. The record has the following references:

    • 'B/SFR' refers to a dept record.
    • [erlang, mnesia, otp] is a list of three direct references to three different projects records.
    • 114872 refers to another employee record.

    The Mnesia record identifiers ({Tab, Key}) can also be used as references. In this case, attribute dept would be set to value {dept, 'B/SFR'} instead @@ -845,14 +845,14 @@

    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:

    get_emps(Salary, Dep) ->
    -    Q = qlc:q(
    -          [E || E <- mnesia:table(employee),
    +the following code:

    get_emps(Salary, Dep) ->
    +    Q = qlc:q(
    +          [E || E <- mnesia:table(employee),
                     E#employee.salary > Salary,
    -                E#employee.dept == Dep]
    -	 ),
    -    F = fun() -> qlc:e(Q) end,
    -    transaction(F).

    This code is easier to write and to understand, and it also executes much + E#employee.dept == Dep] + ), + F = fun() -> qlc:e(Q) end, + transaction(F).

    This code is easier to write and to understand, and it also executes much faster.

    It is easy to show examples of code that executes faster if a non-normalized data model is used, instead of a normalized model. The main reason is that fewer tables are required. Therefore, data from different tables can more easily be diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap7.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap7.html index 574b2fc89c632..91150c51dd1cc 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap7.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_chap7.html @@ -233,26 +233,26 @@

    for starting Mnesia:

    The following example shows how these tasks are performed:

    Step 1: Start an Erlang session and specify a Mnesia directory for the -database:

    % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
    Erlang (BEAM) emulator version 4.9
    +database:

    % 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()]).
    +Eshell V4.9  (abort with ^G)
    +(klacke@gin)1> mnesia:create_schema([node()]).
     ok
    -(klacke@gin)2>
    +(klacke@gin)2>
     ^Z
     Suspended

    Step 2: You can inspect the Mnesia directory to see what files have been created:

    % 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 more than one node in the function mnesia:create_schema/1 had been specified, identical backup files -would have been created on all nodes.

    Step 3: Start Mnesia:

    (klacke@gin)3>mnesia:start( ).
    +would have been created on all nodes.

    Step 3: Start Mnesia:

    (klacke@gin)3>mnesia:start( ).
     ok

    Step 4: You can 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 there are no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". You also see some files that are for internal use by -Mnesia.

    Step 5: Create a table:

    (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    -{atomic,ok}

    Step 6: You can see the following listing in the Mnesia directory:

    % ls -l /ldisc/scratch/klacke
    +Mnesia.

    Step 5: Create a table:

    (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    +{atomic,ok}

    Step 6: You can 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

    The file foo.DCD has been created. This file will eventually store all data @@ -296,11 +296,11 @@

    the Mnesia data files. For example, dets contains the 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 -the schema file, do as follows;

    {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).

    Warning

    The DAT files must always be opened with option {repair, false}. This +the schema file, do as follows;

    {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).

    Warning

    The DAT files must always be opened with option {repair, false}. This ensures that these files are not automatically repaired. Without this option, the database can become inconsistent, because Mnesia can believe that the files were properly closed. For information about configuration parameter @@ -534,40 +534,40 @@

    located first in the backup.

    The schema itself is a table and is possibly included in the backup. Each node where the schema table resides is regarded as a db_node.

    The following example shows how mnesia:traverse_backup can be used to rename a -db_node in a backup file:

    change_node_name(Mod, From, To, Source, Target) ->
    +db_node in a backup file:

    change_node_name(Mod, From, To, Source, Target) ->
         Switch =
    -        fun(Node) when Node == From -> To;
    -           (Node) when Node == To -> throw({error, already_exists});
    -           (Node) -> Node
    +        fun(Node) when Node == From -> To;
    +           (Node) when Node == To -> throw({error, already_exists});
    +           (Node) -> Node
             end,
         Convert =
    -        fun({schema, db_nodes, Nodes}, Acc) ->
    -                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
    -           ({schema, version, Version}, Acc) ->
    -                {[{schema, version, Version}], Acc};
    -           ({schema, cookie, Cookie}, Acc) ->
    -                {[{schema, cookie, Cookie}], Acc};
    -           ({schema, Tab, CreateList}, Acc) ->
    -                Keys = [ram_copies, disc_copies, disc_only_copies],
    +        fun({schema, db_nodes, Nodes}, Acc) ->
    +                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
    +           ({schema, version, Version}, Acc) ->
    +                {[{schema, version, Version}], Acc};
    +           ({schema, cookie, Cookie}, Acc) ->
    +                {[{schema, cookie, Cookie}], Acc};
    +           ({schema, Tab, CreateList}, Acc) ->
    +                Keys = [ram_copies, disc_copies, disc_only_copies],
                     OptSwitch =
    -                    fun({Key, Val}) ->
    -                            case lists:member(Key, Keys) of
    -                                true -> {Key, lists:map(Switch, Val)};
    -                                false-> {Key, Val}
    +                    fun({Key, Val}) ->
    +                            case lists:member(Key, Keys) of
    +                                true -> {Key, lists:map(Switch, Val)};
    +                                false-> {Key, Val}
                                 end
                         end,
    -                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
    -           (Other, Acc) ->
    -                {[Other], Acc}
    +                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
    +           (Other, Acc) ->
    +                {[Other], Acc}
             end,
    -    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
    +    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
     
    -view(Source, Mod) ->
    -    View = fun(Item, Acc) ->
    -                   io:format("~p.~n",[Item]),
    -                   {[Item], Acc + 1}
    +view(Source, Mod) ->
    +    View = fun(Item, Acc) ->
    +                   io:format("~p.~n",[Item]),
    +                   {[Item], Acc + 1}
                end,
    -    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

    + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

    diff --git a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_registry.html b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_registry.html index 3b13368697448..9925800caf436 100644 --- a/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_registry.html +++ b/prs/8803/lib/mnesia-4.23.2/doc/html/mnesia_registry.html @@ -258,8 +258,8 @@

    create_table(Tab, Opt)

    Warning

    This function is deprecated. Do not use it.

    A wrapper function for mnesia:create_table/2, which creates a table (if there is no existing table) with an appropriate set of attributes. The attributes and TabDef are forwarded to mnesia:create_table/2. For example, if the table -is to reside as disc_only_copies on all nodes, a call looks as follows:

              TabDef = [{{disc_only_copies, node()|nodes()]}],
    -          mnesia_registry:create_table(my_reg, TabDef)
    +is to reside as disc_only_copies on all nodes, a call looks as follows:

              TabDef = [{{disc_only_copies, node()|nodes()]}],
    +          mnesia_registry:create_table(my_reg, TabDef)
    diff --git a/prs/8803/lib/observer-2.16/doc/html/observer.epub b/prs/8803/lib/observer-2.16/doc/html/observer.epub index 4d1d32a53f617711349eba80209a033331d9be62..8c7a0923c4c7b74e482aeb24927ec16c4df6b04a 100644 GIT binary patch delta 31547 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 delta 31617 zcmV)pK%2jfmIs8E2Mth50|W{H00000X;~|g4IT%#Ug2i9Ug424E(vK_D_QEzzfs_k zX(E5OUg2i9Ug2hScnbgl1ONa400aO4006{U|8Lti7XMv;1*c(m31C}sl55h;G48si zLl5g#G#-M(;V{q=W$`MJ8cD@5hW+n*?@^NFMsn(0hbvM$p~&~;^S)EFuU`N3-Qr*G zZ&>Dvd>+j3i#-&%ve#keTzM5m>-BoFKAV4Nvx=rKU%reUa8HPvu5zwc*P&1$YkvzE z{UZ`rqO6uXbYxPdMCtV8Ex^sjw$M6fuPT`*!mu&ZODoJh{Ca;nnZB4sert!O;)S>lS3(KHoi-thwQ@oMlbe5s z*E(kRCzG@D$#lysm+B*Pn-Wer@!+D^+K?HMUx(Iha$z$eT%&GgM0y=2(z*zB9t(qj zj8AXwZWnhqA0~9RA#7tKOUJB)%==%WVv*-|GP7U$f8>32wn zv=hxVWin|W!t!HF_>ECEMPE9l?NT|TlPY#ngQL_8tf0Tg$X%+HcLQGI_;v4*OoMsH zXqB)AQZ|o_r1fzTGHxUvXEI5I0=!Hm5KKwrBTiqoNb?8Z7#*a>^< zz_Wg>q!E_6Ot24?aWEPck6g)%u z@?5V`I1cWC8^JXcO9gio^3s1Pd#v9T5vcMxguwjPapQ&??@vl7bK=>@^~S2GCMcWPHbA0fk(falw+sfh|QW({swqxM2jB7K12DI!oyoB&Lx0t5govFDV%@9J^sKG3I`2(J}&E| zxDw>RV~gP>lF!VGL#O_{)cC#U$ZkEyN7?ZmFep zs@XD{j!tV`5UYO?MJ#kEBuSmQliF9(oUd%1mjm$YSXc|bgp#hgawwqRNC~q?t};5^ zBN9CANYWs5mx*m5K!Zt4ftZ~LFi3XgwoVK~g8TLY;x~+@9T5l%pOd#NFp&*%@tdRR z9zM;M9oQk$q{sp*2qw*q%bKD@+m9PGW}=w??DI(LVNie7V6|J?a3hpttyc3d>K)i$ z5mjhQe=3EtZGodI0iGc^WHjmvoDP;v^`5X-8V)qB zd<~)EgcOY^v=f1^#7Ag`PpeD~PE(8aD}RU!cGbQ0$+_-gw$4voORMIh6DM^#hv<v%+ziV6}mH4>C5eFT4SES;*!kK5eYh;?L-gQ3Lue+72J z{t>j;N$XpSy6pz&pfkvLC(^y1=%HeFsr7gpWO}`|3!>4|hkmuf@xk{zY^Ub|w}02O z8eoQi=!dy+Nzp_UTjeK{sQt<162AoW@KK`U2r-GIO2os2X8ZZghs7;}1Zw_j+4mK+ zyW4+K^LZigoI0|TN8qt-YnfKmEKqVAfsRrC z`+N-0w$WeHXtu$oT(6a%gnWZr@Q?M(=DUB1hk$xGVCcNtQIFgr-I?GZUOKHncc!SN zg%rIqyo3o4EV=RBPRwbFWQ;gYX)gGCW-3o+pgh@l2ZXvNIYK>KGX38VHXu1jaapH8+1u zG=Y8Q^l%WVKX0U1)KUEdiot$FP-w2KXUba?qcdlm`CFKs%M4p!J}CU`0T!kywa$39 zTGlf-6Av7H*57A<*X>#uUAroo*FHpF^^tlVDh+CM1uw(-xE5(=UGZ@4rRaNFhAiQZ zk5@)lX@N%zs4z=U{L+DqJ*ViFp+q-{IQSpFz^kC6W z2Nd0V=q#N7dkCF$K=7zpB^BhILhz(RasN){)=g)!pd_ZInjSacSUsmqh zA$92P_wgf0Ax6YP-uH${eQ@Bc3g>SiI~*bAHoh&azgrSBF`B zk3tvW{I?-gt;i2gE|<@N_3}VihkfxWWq&_B9|<)O>Dyf0w0qPzeA_g(X$TS9|GfuX zm8?<_J)jN_Xb=%ju7vqJy_7mWzrY;a>uoVKXWx9o-biB|dkfPDhY^c6cO}eJirz^T zFcu2f(cA&_k$NOU@VP=jaJ}y-Zhrs(0RR8gSzB+@Fcg00SC~kfHi>nO)AX{f5xgMw zh7fNEO>W|}7OoRwr`3Oi`0pI2TqYDd*i8z&OzY+3J3hDX^Ql}0`yfGg*Rmucxzm49 z%88WApa_y>+xw>Pi#$l+^%G>@;sAh~EWk}^oP z?N3Wym<)0k1FKs&NIv)&ee?;yrNQlyAqCG2DLd!tw(X-WWM_Xo3UTa$vt?jp0$R5N znS8SbAhJ||VryEx%<77{S5{;QtUlOe?s&3wiE1G!r>P<cFPT8&1nq4x(9Da1^z40*mWweGnd>s@rQWR|agcm5 z)l~7Rw<$3-Oo@MEOLyusNZ`z0dkf%fpr)MJnsU)|Q!cuil86kERIwdV6sZkGg6>gS z6)BYxNy%p=M>Kkr6YpmEz5fA zy@jRsbVOZ%#0umK6$a<*PPjMf{1g)~9G_+chM|vA3bB8|yMIB&_{Aaeio?W`r7cnE zhB|f3AC2dBQyr<$>j15+(-|xerHs9>LNBawpKKb&1JS8|u#rz=*TU~0mw4PoX>Vvn zwaBGEB`zw7QnV5Xc#c+_i1m#q_SdbR9Ssi}`!`euyow~-mYkxdoscYPItVxu8B2)* zwE#+js78NIR8-aA#g6crBDpDQo}m>T1im?UHbU=cPC>U6-|^uE6)An#5>XSbHO(;S z0G8LBBhI8kMgAn%`rMUDYb6IkCOg8oHuaH9aoGD!%3UvoQ_FBT^o%P7K#RGW97@&8 z`4fnl*@?u=+>68)|2v5AIHqm!y`aPt=tWT+cZ41$3qyjcA z8XKvAdzK2gYi{48supPbh!h3JxL_kX($`y;1BnfS446-@`K=-G$1q=VEvxqD zF5hof?UWl<-L?Y2KI=Mdb(;P3thEOJ`g$4lXMTfBnaQ->w>28Ohj zkWzmYB?1uy+7=a6cF>hMujOVC57aOD4vG=2>O5~>O8X;usyZDA_xyUT$8l`gYuQ9v zJAIm_h~0;&g~4+Qg61J(hMx=E+<@nuf36F4+dTE~ua~>-WUmA5PWJdDKVM**-qpoe zx{0V^!{4v|F|Ch}9=E2oYcp;qJ&)T-*RX$k%>?265vDEN$>EaFNTFu<@xtf#1`DET z=zRkK0RR8oSX*z~HWYsEuQ=0?p#`GYvV4iVSX+zjA;7i{SobgtLqJQEMMNewlByF7 z`|mrHoW#vU+2q_}i67*c%Hg?x{CLzNsDkA6#XwbrCl}@kX-Sk?1UwItT*x)iU2lJ@ z05YOUxRRo-LY6IpI37;tqhWkL2}koFdD$hUg5;||YoWi+sZNXbPp{oybxS2@UF(}5 zdEu-j9$I|pmx_YquP!Npo|oOut})QVvuHGN@oCLa$fjszi)wP}?$OBNk-}uIUDOzX z+(p3Z<6eXRcC|~h6_wv+wPf5Y=N5m3d+MvRim_V3W@bvt(nW@+K|*Co_{tIxYv*&Z zad#>9YMIy`2#>ZMd)Y8~c5OR-YHd6H+-*DYYTL0#+e)fy$!X>)mrK!^s^hl1(PVA+ zWZ;xyn`O9BXsd6(KA&0Y+n5#&(Hd|3?AZR;#`d2Ctd8x}e@_;jz}R%5 zxW0QcNJU2RtCILEVlcZeYgT6At*B)vHayfql)=3;O*IodEGWqsU!e|w3j&3t`6BqT zPqGjns0>TSuNxs0V|TA4Yu10mbpS*%5*94WC|?9x)-*ulSfgb?ny+17G`-P5^44gD z-%u;O+i-Y~TDR_D0E!r&Rr0=|kc+Yu8?+ke4Ov$u1yzWR0s@LPKaIWkUlQ88eMXn{ z3bZ6C%Ct+TpbMgbsnfgl7b1te=1o+<+;9|Zm@c4YP4Iz~HC4!5s^l=DiLr_IeX)>h zT367Lp1|zLRY^2OE`+V|FACC0ng|{aBCAV!Smi|VG@74Bqwy%SnhWx% zlU@=te{0(?5Pt7pacHD;tm$ee%aXM<3`U_3`vEQN(a5$Ei#d{O$qi-ff1m868w{N@ zX|CJlAv8|!ba&s~>AuTo1Ya3!sL-G*nle~3rRa(&&=L{`N>-X>P?u7`QdVoKk71MZ zG>3}a*1Tfs{Ix2nh|ZgLNDHde1=*130L;twe_a}oXfy)N%}JWBOIQ|kbpkgzYySeS zAeS3<$0}fgCWSdYxrdA`XtCB?TtRhPim39HhsHWppCF^p` zvkMYTX2D_}gwt>wOi6TPlTwOAv?ve@jxmuGmDyv&OXMUpbO$(CBe-S{`B74>StX#! ze}`J6noDt{tcNv9vB2sob@%EG5?Vo`k6zj^v#lxgjYONA2^W#ZQ?6pF<=Wl8S+CyC z9KAJ}GCo}CGv`9{1@|rDZnxB&MBm+lgqPaki^<|FZr^(s-Q&X#uXtf4j)K-JU<)6> z!qc7rGyi|-b-G8W7tgy>gh8L3qS1yWf0h-AM{y~{UGjiEeCEwBoOspJ^wDeSaXMaO zxO*8kL3+}T7h>~Ax76&3P%_VBM9+IKFRYMB5?x^4U3#4J%%`#t8&mvxZO0`(T(6z? z+H2`UwC4|Nrb*U2oeqe-wS!uOL*cXaLKOohD5(S6I8EXdcoIZC-|9Fer((h)|>^ zQgMu;`|Z1zlpMPe-6;J)(bX_wN9O%HJUsVGQ(aO?QbDzT8p<#}pN{ZKJl(urhVh{5 zI;?-$bN#dK^(3Q)MvF?-WyG_m;rQTad~!UVJf1|4Ct>`dXOs)we?QE)f0)<(qwI(A zUYFG}jEN_D^l)K*_1FXiUY*&cVa%1s<7ubGJdEe6DyZpS)j=3P@?i9)_W0{YwXNyq z)wN28@xy;=)eVd0Vf^pXV|Lo@Zbe|q;z{PSqO`_MfOmB`&f3x1n&spz#nf2aUfgva` z|L1Y9f#HgZn*GQV-{JnxiSJX*sBc^O1l;$SvrhbT*08-kN>#?-qpaX>8DA)pac#I< z)LiGp&L>2ug(hXCvN~lMS#kqEKb#PY$`<+YIe-_ajO;l}2u9i?k;4a%W2qys? zH5BBKTzlEFx9c8t<}@_C$!8A%1ZVJ;$^??7Olw-L286;zLsB46!iX+e%I6%3fcd*1 zwgN7-VKf_(S8BIUMBvS|ukqqjmaz!qsS_+me7*TTz zeyXH_`+fK~pd{fE0K{50>f>(jmUM+*5pcA~7yx%R@53LigPYAr;0Ssd1*zWJF2^z@ zH+D3*wWIEc4jYnR*qxaRy6Daix9KK1q8Y#df8-Sc#RJ*Ibi=WNQ3?8y100Cryq2lm zRSF+h)U+y-s-nQuJraiBNuYIA0}|5_w+R4O@nci!4ZAkbaa=;gZQupU_H&mIX%ZrDZ9?QVB-FG9 zxaH0#@E7(Si1H@Uthz#jvJ`M2ElUf&$c;S^Q~;kf>I1!^T+l=yw=Bi5Mx=kzurUiB zH9|F4LZ~GshRi{QhKp{VX*LsW-G#jke_81$17s$E{f3Q)Fo3^nOH{hXWK+0nRC|Og zC4!CMD1kyDoAgIMfOsHmAh6)+)H16U@lXkc**qpiR;U0^9VX&u1^8eXs&)~t7W zvpUf25|2W#{wdoGGs2|H81$zDTifXoSKF>z!cgKkY~2hRDa(NnViiD(g_CPVe+^Bo zB6*Y2WXg)zF?u?JuZ>1D0*MU-44@sE0DOIvztstBjtRrvaNDIBlkOWy(8s_j4Ts@` zJC$Ca)!}foehZ%92dj)8WhxzEyMX@$m5ZTm9T-rL_C39$`E{dlkmqMFQKcK6ZSHl} zz~%uZQ_OZ@qM_*n9xaA6a5y#Ae>BT>HjJo6)rn*SU*}S&vt8Dx?pBv})V4$7rnQro zUkF%}NaIB1s+qObY-iAnnfZa$UKlhl1xRuqY3;W8ddm5tiTANE9#~;Ko8RIi5Vy^7 z;2kboq>EY`J5%B2f(IvB9fSyMJ4DBXrm6LfeeI5;_D!7ixPaqG({z2^e|2lXb_uxq z+RpXwg#wxn$V&+Op)tA(g9>`d>XNu)7GmjA3zz`lPDzE^w=Ij3)KW761VOb6<40Ru z`z@<0F89Xx+{*iK%7WkT>6Am_Zg*cN$A^>2!T!<7I2wB%PT}L&VuhRfTT7JByLsaEn?!oA)n*=&!b8vaM7Jdy{ap63m!m_Wt`AyK9ex zF`N%?xrWztN^ohWG#g=Xad|&dx#dclpw^njcwv+>n!tU)osb(!Qq7jP!HZ7ORIQmF z2`*Po3gmcoOLKR9lm&!pe@;g!PZB0?1FH)bfO^~=6H@oKZ>VJtHi+KCvEX=U+ub?bKN`Z zykS(vP+fyANtwu(g&iwr$z=id|Ljw95tMVMspi9g2lfoq9 zLU3=fA%(%bs3XSO#rPq$nRtPlhG#)@+`_VJzo0HM)EkUNf1{#;zv^(j> zg4~iXsO1oI+*BZ*4qJ7bJf+)YPdDP+Dg@}kAtWJL2zqwVxC1Isfd!tS`W_Nl+OaDS zd2|P!a!&WyQw^oV?bf7f9!@*-gu8o64j~B$mD@7db85k#(vYk$76TIM8`d^12Q*nz z8MARSIH1vIf44=-R(t$kv*>Mc!E zb9c8XpL<<@y_J}^;MXbC)v@}Z>}gk{-ng4on;&a{_q1+nfS(dNu(N%P&w*Uyu_ylj zaCp_>e_1G7&*j#*b+2yST2TED0lGXUh^{(Nb&u!gz_q)!p0%iu@gO=sJ3D(W&-zE% zQTp{ynX6-jE|1CRLk0nlIP5~Gc!e_&>>iCjFpcRdQh+~V9FabS|r-yqaqGXvITGt#_e?M@5o%tpud~~>HXR4%tqa6i2keGEz z{ya`rQ`V1rl=T}r=9qK^gy3sdQYQebYz!?lN}hvJ0ZlcugV3HyWl3ceG-=o+_zv4D z1$2(Cx7DWOW`^SWBHweDl)-fJuIjK#2y~!H0;C(M6f}mg3AAQe)nPVsw`!9i@zmqJ ze@Y6Zj=vSsp;OTiM;deyThG&;GGIaD6%be8JQP}IZCz{uW2^l?9*6b6;EPZf5=+)+ z085xKQE`Z^bjW4G9>(}Fi2f*-+~E@6r{}qVz8Cd8Me`w!J%KEZ8pJ6>J>cuM7b|o` z4(;?CoJg8M7u~#r1MIrO>%>W%R^)AAH`?$W zgR1gp!}Mi0$U#XU?>-6>1(Af|Nta7lNEGa;-7N^|4SZ%bn??ly0Lx_oG8Dz2@QN0i z)t4WWC9{B!aTSp)waOf~iUkL9X@&zXV^JiI0HMnuik&*5w7#TXh)8KD+6yg9s@Y&bk!%9y-oy?vgM|xiIA9IcTn{#jR^?9@<=t$KyJP6foT;BOU## zUCzDBeWrP}eZ-h@sssO44d`0&q_hesB@n&^b8#neOva(oN#xpg!=Ma$@$bujOF8)_ z8NMlJ<&2@K_{E*-P3?OH2e}-YMo5vPha$Dz9;|iCZ^^#UMVC2?Atf!7TXd53` zZpK%lj#8FUov4k3GVxErHOBaMS9iwbt=zfYm!ixe>;`l~sTHQE9~(RasfVs()JS@1 z5czWtYj7?nvx`@g%ZsaNEBSUmLe#$Qzv(mme9~?&d&reOu;JWOZF(@xf8P_Db^L@< z25h79VO!@tIYxy8yVu9Y_Vz=gBXFwHVQ7a6^N#rPDcXO-Mw{B{Q8dD7R~J)kG&zVq z^2X3_I|;J&w$FMTwHcK|;m6q^JRm-IfBzQ%0RR8YSW$1=HV}T-uehl|kpQ+6H))!*iH2-zfdXq+ zr0LTz1eA2L2uq?yQgMu;|9y9q?If!tS87tU4~|Qd$Gh*oJCdJYBz_R37|l=jOeu=s zls_TLgfVA+=|e267|*n-%CU^k{Nw4t(TnNv(aE#%3qROtT4c<3e^}gYTD0&3Xf_s% zpU&*7mNg#Gzoy?f<{8@F{vCHjT*`QeyOXF&eCY#C_8D>a7E&{sttBtW?D~MG?zl z=7@7DAk~pS#(x zcw_zGe6!gqGgPwa0ezOiITS8_UZRCbVTS+=MVKu?Kv>OYOHc)lAjKj=uv$bI?@r*8 z!Di&v+tlD$e+Bh`$14d1GUig{Hf0QQVI^mA2@Bc+qy@s>Kq#X51TJZ2B4ox3-3rTd ztd?jzXF5_vK``?^&NZL`t5sIdb`~4Gyr>E*bG*7#Dl>OzWvtK^W8RtmC-X9MTcyJG zu#;EDLWm%XD68n0r7tx-*?3h#lnNSA2`C!X&Q$|De=_k3Wk;}7mCJ^)GRs!z!5Tdx zy0gOHdpIPDiXk3>i$t1{M}}yRix0oM656eaT?Utm+_8`;6L09anxiJuo-<9JuTt)!G#k*x1@nsUqq8|2E6sBBgq%1F#o^!fl@-QO%OW27P@h)edr`>VPwF+(O2IGKsAbBCC z;#w-o?arE%98xUJJfrqq2es=6Ut%ParDI2mQiEC$t}3p`bqa%Q#u<9I0J^w2XhC~% ze}~t|%)1sD>@;TgUd&gu<#p*`aV@nfathkJ=GIH607u!}`&Pwg?-U=g2sO zdUSMr@{DdR9k-x+DH>wA@j7((s`4#&+ODASrc?u5d)5+k=b{5Y_`3}$O}C9JYIBL4 zwS=(O_DE@bp=^5(c0NHCT3Q_F&Gf;&i7~^$?zDi@ouz+<@ZmwII)uX1B&fOce|Gt> zg~Ig4KL2$2*T>8Ai_5DwZ~uJ#{`}qRo=I)ar5|)2Rzo7_4SMUN_ZwK&;mY$N{owhJ zdf-NWz&C~#n=iW|=^fTl3l?-1{ra7R>)!R@$gs5=cR11}sBT;IL#RMc)JT{%ed$5j z<1lPr*a1eHK>N4^>MP?Clqwk_f1GxDaYC<_wu4Z$h;sefFroDaZ9l}bFAqr3{?M>I z_So1EZ|OV|dP$FgD~mes?`7M4cqs1E_G|DKuo~0VB?xbk-d}62S|#)jy7%Y7md%Fg z;Qfz*?f2lW479xw1{0y}lKHdT7izc$wfyP9a|UD_pLHj0wC=HafEB1V=QZ)#4nD z5i>MSx@S2v$tvU2xmxt9vjLf!ZOmwC=AaUf6;2l4q=8h<(h=*4E0s{dOsN=Tj82Gi zHfwXvO9Oa~WVKKWCpxkEf9KuP+$QjWU}#ltKRb)}B}Nd2Wm;7_-H2tUuLPneE@r*= ztX(O3xt?-IGFo9`JQgKyBlr&h0RR8AS#59QxDo!YUqR@ALjw4vo4p>2oFia+-9v+W z=>p01P#g{cEm0N`iBw4{j=R|Y_Rb6`T23UdQ*406+L1`k`!mnbf5Pn8D%XWzdCjf8 zN~Nl$5^47HjmTF^e3P+8*0r=E*Q!{omTk6Lu4|p&|GU#pWUJ~elf_k9tT*!pmZ$wm zu)#^K=9S=uRGTzQ7+Y~x8Bt!PUp-r1=?7uvApD+I!dltCGLoLpo0M@Q`Mi=vA=Fjs zOb42-mXeNMa{90>e^>oRCmvmzfhhJfh*~Z2U6!nt)m!+#&HmA%g5&mow3Vpq8N0!c z+g&R@_1@rht+$pn{2r_t-|XDFU#(kVIEk?m{KyS+dhdqCVj2I{a=kR2ahYMw5oS|&lQD4SAduu3gzn>Bm_}(Dt?{?&!SlL1N@h) zMa3Tk6OTN1u(y`?VqEUt73T|fTS+j$`iO~wlwn)xDt7%L*x731Y;rbk11*`ckC5yf zZ23Xf;?t*ie>_z}n|-gFhO1&S5iaQza|W87_l`iFz@;EN?;Hc4lCf=PK5G@jnwipf z#OG1Xm~tsqD=Bp+RjE@-8d_Cd?BC7tooOg_=V0Hw1ncKco><3f*aC|sp+e+pY1CVxHD!;!q zI)~~So-hlCmNnm4)>%=^XsP0jNObAHqe0*Xf1-3y_qA3VJ0m9|NDNil8tK3n-YsRP zC@qqhe+p0ni$?^nuW%tiTg<%W#RQ&V)jVH3gt*T-9bEz*f`a1p7NM;aF0TLsNJ|Y? z8jP)F7?Nb*Ym9_$TT%3d^Zqdx?Vw1X236@1ruLIq+g6Ae@) zZy;qaS4;S#e}1Zy&zc=1`Rq;X#~b+|JYovvrWo-@zw7rmf5ftp6X+i+a>3py0vmGu zL^&K$@!~vsGl$aJkd_czuO>3dqngexf1<97VTa!u-p&#JPVDB-*S}up{taZYpELr^ z(z;u*p`Ndt`=<2DBtT$yqK< z-XTR_cV#Keg8eHTU|W&Paz_Fh{wSNSVXAA^fXD!}p$k(x!D1V(>Q$p8h7}W?e`_!> zI7EL>7;LBmFCalK5{m)L8~!%$nkLvA{qDd3G*A)r1)K^QR)`up zPSI0-uZUJ+KxceP9gKqC>5zpD{z~{&z?|NsxI}rB0u4~xr#|&CQAjV3g8}<%j`U^<0XzckcfiR25wwAdJ zlqJxKJqMg@6khrgp#2G*8Mveo90vf6^^GaI2Pjgng=~igg2Wyg7^hX3^dTh)_L3eq zu?z}P@~(E_eI%??-ERnHe>zI@$ThrNU>s){+(Y0EF`r=pP%A|22CUkuC=HHkIKXs+ zaFlE8{*Rynpa4j4RPq+lc$CNOp`6!NlVQBY0C=c)e>>Flpp7IODBLOp`Gg!1?(RW~ ztuSf!!Jmf_@iQMK1o4~q4=9M98p?@2iinb>G=Rh0Yygsct2;d#e?qI0$ku3j+s7V8 zSUf8PIqB!j&UR#5KLlbdc;M3-Nya4i9Ky0kK2~&iG32LaES5#`tEzEa(nqe^!cEYf z)n>p5angE_Mck@jTb2pgSZ@&2kQK-?TKFq08;i+x}kj z(B02TeQ@+KD&H>|e-QYCfh_pIV%nFQE)g$DkFL&EwItZK&cL8OE<<-N9v#-PIlGDR z_LXWO-{MT;O9@}>yA9Uag8j{xbTZr^C&oT-o+`L0?xc=vbltgd9YQ%1D+`dg&%nM9 zqG>0XcQ`ptoA?BT991**cw)vO(cl{p?d``^3i@G~R_=fq~>dggAE8#F6_2OPu0r01RaKL7v# z|Nrb+`ET1c6#m_R1)%{&GWdvdCv$`y$c6$t3N*kl44XkqPcl)8)JV#%*L8pU9x2(8 zGf}l%ck6%!xlHjre((B7JxY~PL*`V(927|kF(eOjAWSgBC?^Zb3m`JVe-xuL4!ubv zV;~WyTHggsa3&ys2wxg%U^23gLc%oBIYcaB5R)Y{b7D~AdI^~uCPkklQW1Dfvz){2 zWR!=KTtT>{Jfp9m$O$M;MH&#JsL&kOxeJ60!imnQSWgvE5E?U^jO^g{qdW+2o5n>F zgopvHZyv2-vw9a7dO}V>*{(i4#J}*AsvK&&weYU`OL5s)aP-bm>3|e za?k^=-!#4qLed%5X%PP0S?DYX-!$5S##ABu;K0v47+QrcJVGJ}zmstn%qa17A@%|A z_7JYIp03Jms>?d+?mrKb_P}=+!W8>upK>|&IHX7R`D#)IN(JGs|37)ZCnbX;9a}EW z!!LwH>Q*OS}Ao$Iy1~b>iC=)DPC#`$6B8p0|^K&c}bAy)qm;OPdc2kDS>V#@Wut zgPM?UYwntQ?-6(Z?iT)W&^VoWH@C1Y7M<6*@Q~19$>#FoAR7=JO*$mi+>3aRguDE& z63xZOK{Qt_ndjao50>NC|2{ii?|h8j_E4jcFHm^=x$83Dz7BJyy#?-lA$|ob4OB(* z&L-V|_(`o(C^8m=+4olT!_z9LMJT*(NuZhq6p-2QXvQF7Z|gk+3knL{K++!zff-T0QY zLESMN-FJhruPwC)N&717od9-hT0DvOVd=qt%Tg`;Fc=&z4tt&d#~;B9z}YW(8VBYbl2s$PY6O3N0Zt&pC^K zsD(Q$TQi}(18}R64B3pPU~S4#A+ANW6EAs(P?Z*$?e-isF6&Of)xyW+-9j$4X7(z< z9R{_9^G;D*rfe@Il5@FaA}yOp1rH~jgP!nDl!)kwoxLjmp1DJi>w8q*qWN)^rLSRb6P%ImCVx0vaI z!O~urtZUP0ynpD`>Z=SamX7_;bqV5rVT;aHbvNMER1gY#l@l(F$p7ueNf3tp&E6OTISP(kQ`lHq_Bu1w8>1&3hYO>62Mu2o;pC zen%S+6v`)zV`Q1o255}+ElDhimVH9&Gsuxt#J-VWvG<(FG06)2ID;pwk}!qC8&W~Y zjovQp7>)bu#9dqeBL>UHPp`YwAFE zH=3vZX-suXB=XN9MK-fM$)p-u{)GZ+cpsXu3tf@ zK#>ly9NTeT+EmyEq`-h-*oS-@hJcpN5)p~iNGeWH^uO z_uLEbtdU4Rh8NT6?ELcVY%(96hVkdCv8lL>ujrd41vlnnXiOM?uQac^?p0xY+_@)= z-~Ll8`@w3SfWPeC&r)vrDATI0M$Z9#8N6wB$fijczw0qC>RMlgaWGiPd_Cz$zRm0h*0oV4XoX$$ zu=T!k%QB36f_Ddh^7Al08WIx2*LN%LjK}`CI~>$FQ7Pb`O5=AG-{iuuOx%NEoEfl8 zE!jdyt{+*UGIPw9N;7!iWmN#uUEvITT?NnACq3&^w;n~& z*BC!3U2@B84s4aH0@gSQU=OB}-$7k5&;^%S$WVba1-F2I;i1A8VsrAXqjBl*?-v!b zi}U%##cX=!s#Ir4J{8+%6#hgM4k^Fe>b_A?{8kw=OmBZ(?b}g`FrIeZz!0Gr=t-F- z9F;5{T}&>8HkN|%dyB=hi_6*UbUvF*4~fN-p|QBF?nf-{6N@*Bm7p_VyeJrTZLTP? zrB)@gE5#&#KKE!%uIz8=;%blC1eJ#@~3hN7faUqm^U8UZ}zh`T<&D4*S z+9##1ILkFGKZYSA3c=pq3s`~1lo<2arBXg~w{U|2X@$(ZQ%970qm{7v2=4KQU)5o2 z0;Uhf!6*lw;wFU6SgY;LP-(fk2R$l;ymNw3lvv+?(!#Be%8+p__$U`?3KBatT?3gR zoMyC!{%kViTe&}5Bd{C?I7*`jke48DFT{ z_ivl~kFk#fx7v~rMdS8Uh{YJ}I916ww`DOFGKGhTF2nfx#-Zm`Rfxpth@4ZdVTU3o%<5=V*!vdWn-~u}bM`x$5HsTruNTuiQX3OC2&93zNZIxE{0?R)( zD1`-WPzZ8CAQ#j^Q!z(O{-{9lCCHjxK^cF4a*tn)@iJ&s?}u}RE>f$A-MFU6>*N}k zJfl2Aj}=fG&l9V(32^Cg%@sRxSOv}>E4l!lQFW_xmw}>hH2!1YpqtMeF_iHU`ruFLC4d7 zZVWFgz$XNv;EhOUYAbS4)Mz25Q)6wQMV7m%g-|ybNbWjtZ~ACPHzr^Vm^ICwS~7q{ zxi+*}BJD&lH3L5Wka)v0XgUHOv{4zc>%BQ;Pn_bA*x-qRYu7lmDlnZZzLK6MDnH|z zEVy&Lps$@8@#K(}>!7tTVxMa1y+uiXLL!qK(i+8NUT((q0+q2u6@{;+$D8tl4)?Tx z_oTPsHH9Uw3)@h;=_L&%7m|2h2f6bBk#}Mdlc%>!IqPpA*nD4 z*D0i!Mv7s{@wusR!k`-Jee5 zgaveePf^Y@E2Zz6^Q%x4g-M$r$84j}H2Q#5+#0LY@nDP405*jWVOAiZ^-DJj|gQ`{RZng-Qi+i;0BAFA7b-=yw~R4;0J{O z_V^&vL(3ajQbJO{bwsxq1YTzudwbOIy;oln=$z1tAW+^C&6}qg7c`=>JfWvE(&aq zl3E*a50l$K9s(Yyllwp+f1bK}PshIi00960%vo)3+cpsX?q9(P=&%A#;`b!2qiw)C zpupaMt)Gg*V5GB6L?$(ovJ>pj?`S)zwdp8PRfG70KS;c{=kCZyM{PyIGnNSnOh{(e zzzqCdfJ~s53ck{ObIyKb%R(krD9La!u3a%<4P;9u3^QxBlZ+e2fAJp|ZH0YcJ7L$T zjz0vk;n5q{tI25Cn^P&WZamW zNJtk&6mL{&7HDmeYn7P!g9%Z=5pqa&e zDF3yk!Q|i|gzTZuf8aiW94)T7Wx$g)JLqRh_fF80Y|Xd8He5ciE$GkbG<~KpsY|5~ z(k?nMh^}>ZL<$DqKZ5!Gkou*{GPQI0g?qlqGw2_U8X^*_u5`GtE@e||3cV;ZX7<`GM|b`91SMp(O`BqjND%|Hv+hEs5M5tb& zaTI@~@G+Kky#-VqOVcjQ#$5uz-5r8kaCZo9!QI^lcXto2L4teG;O-tExVr{^PTudF z`=0;aZ|^m$*LtQ)x_Wx|?wabZPquwnsuP@~5imi5UutVf6Hu*th;~Xi+@VWaSr!}* z`lq*h3gx7!f;RSv3ZySql6_?Q`+#$akmRdu#9Mpmpx~$OyX2Jo`-KhQ@qDB$ZaKf_ zW?mvCRU zr^@-7h*zx-gTDq*X;r`HMc8p8Ruxom^t*|G(fP}<*Cnq znk3$d{**$orCUEtNTGyGAek(3tolq$sRex@<5LSd2~lzZPlX6!6FxvesE+(?^Faf; zE|D+vSdnTs)2X?3vd*D-hkEg2MAsZ#!?H^t%Fy}O5He<~z^-ExmMe4=8pZ`0*1J>8 z<>~w0mfFuILucN%kDwZHfobC#B0R$WR70`@+gCE1O?vqHNt#n#= zbPbHa%)k;JwrTEV)aw_rj*uLE?Y!=|dJ6YE-jN}9Z*J0b z?QBKGx;ej(}mU{^?>8t8wrq~E|pLmfSt?WcdHn6lsT)n_QJHcyW9=^MBSkO@M z4f7(yMQ5HQxZU}bi~iP5DmOQBU9O+bn|i9|Ej8Jr4OuB zi_7iFq^skbhr!*#7sQFsNTYAsCk_VDE~!cqzGOr%Z$T}uuYLdXTSHOxxx1`u5-eqn>mb1;yym!Q z(XWzV@^pq7yIxdNlt!7Xj7NMbu|*6|u}UO8=v%{4MKDcSRQ0*ll@iX6>X4if`Y6uP zs-J+o32hqTx}375Mg3GcEm@9UXzJ(eY`v^6*}C)vGgt=C&!xIlFlUcEQ36Em2bXDb zSc&A~EFaX{7f}lmk5I?W=IOiM7pcJoZj5^O*2O6rRQE3EXcT{rXL>D9`dzHM2_S{< zsMWM3hKdugD5X##T9>34C(F{SC+H|8Sf%KOqE=n4tYU7Ze^XgWo?|nJykhPYw#A$N zD>58wwK{QLoF8x+;gkh3)iOpBXP7u|@mSIf4W987Liv|ME`B06KRm|Wq}`<}hwgS5 zT{?t2I6PeLEL|R7_nSCB?pvSPc`|2Gwjg^NGYt&!%Y*X@xzyN<7{PKQYzzG8k_?*& zMBx*F?tds?Z$|k&f#z#Qri2#<^Fn~QwF3(zW_H4FD*z&yQE=Pr1ZCd6;&SUw4v5W> zN?Iihp2ikOPIs@o=Z<|?+m_s*v-6|xgbrvS!otDs@L=vKrj65%CIfvBKOuBIe9C)s z;WTJk0tU1_5Q9Tujy0HWtNXBT(+c1OmQD%9cYsAVw@Tiscd@BkFll@`<|zu=HxoIH z{f}Fd*1%E}#l?poSpq%?1;f3+dFI=5JJP42KIRK~N3Gn6m$(wb!sVoV$oxeI0Q;?8 z3mtnhcQln>15mgQuNkFtzr)0k4dxG?g#|6Ay)9?L^u>ZslHjy^(=r9~v!*bLnW=bB zP9|Qardl2cogov4L$yY$+^^zyPd!w+f{M7K9f6!;*`E6Xx)5kb7>MIOJKb^mHYjM@ z)|$aPLQIgxuZBP|Uyuf*K|CJGAYPCvD}fHfC51P`_L(cW2~KdjGY20~=IFq~?Ywug*Mx;=$?Ry72Ee|!jjN?Ub&<&@)oXdU zJ6+;N_s-quq&o(BWF_3h2%^0Ve((;X{msW4Bu^`$7}#50lIKH6?7+Nh2{V>Nzqy2L z?$qQGC6a5uD#9%AU>)egdI_=c<)~u!26%pP;%I3@gR>*!WG6%x{g~Wc7ZaP|4(FLJ z%?BTu2$)W-)L@^8^V#bRO?#*dImT=@I)x+YP23kxGb)o|mBnI24&+>(9rP#=`j51p zwZXy`_xiwrHJG=EdS={xP_b`2D(&&^G=D|t)Z3TVlB6>?N@k8!p+IonA=S0p1@3#p zSU0!7-LdN6B4io9ME47!EC192_bG>J_mB0LRfGj+uJsw1i_d=7D=4#lYhZuB$NCB$ zfrlk4WYmn)**O)n1ltNDfHi}V5GpU(Dv|48RDm0^_p369Z@!59T+ z1gEUTV6FgeNT1)qL`jOV5fo)FvH=|@Ycdt23grI@nwv>Y|_o^xh@Ffj8E z-`_E&@NQzE;#BbPVKPy|3jzjr@>t-bQ$Y)Xy_xX77y`!uAXq_BuX7c+!^#ziT+KdP zoWw6Oj2Pmlr|bC&rh3^f+G9ef2Ep*uEkNR?3?VFUnf>tOxjkzlj4TmoK9Ne69B?x! zl-s_styf*M`nujmEuL445`6XXbHc~ZJkQi8k}pZ(HB0K}Unz~xc$vfckfUqA z4r7^Em3bjAug1`~+cC;SV+q%5qmFg@#4+GI=&yNb_HDOTCNqZ5S+yXaO64p^A|OWw z$VOnq+k030O#J3T&NuA;N?oApVphT@!(AsrlNyN?FMW&go=-k8a$=>L$>K*wvkGkw@1PXK8hf9s!IGB!^OQnZ_j*O)F5OsQ^_`;E| z>x03v=#>1G9Hcv`#`5Fn9#&9f!AoM7=50rf-=%qV>V>y(NzMC2d55)>q^i-CtcQ=B zUCbtYHoiQ?9LZNpo!~$_!`-{h+&)DTSA#>sRzIR~-K0I)cw zYZ9Y5K)wHq;mi_|v*Tm&CyV1Y7-p$TwKhULCa!KpC-6@*S$LfxcyRA!GD>Tc%4!Os z1mj)nEQ7;Laeh!ZX?ckJI&x0)&IXy*=W?SCwpxBMyKFqEZZAH$58=u&b9D63Dj=4T zYAa%#@OLL0kBL%~3D>t33e zY2H3k7Bz2eG7KGX*~4cw7lWqc_HF3&Ci_^Efgy+gI{1O#d)Dt1rRRYrB2p1%Ar3x~ z+9@$a;cWsYWo0v!Nu0q8O;!jC61kCtIgHOvXBO>w$Ov+J+V+!gG+Y*q#o?TpyaF=s z2_ysD@=@D!@)YCvjtgn>E#&YBJ2$jp3Qk;{aMr)qnvPCU#P7 zntxu?ma(018(MVgLO3j-@?YPBklR2a3vDN|O9T8*2O5aa%pIK;!auS)xwUzv#H=a) ztS<(eO&=K z7Ligtl>DdyfgJbD5}ZJUaCJm=g9S1Cci!F%=?bdOkf}&MCft*vfaufTQ5UB zLACv;Du7Z_K>g70xTK9wGSw_eY-+LECN3vhD|s3IQYFf3+R6v#HRrf_D^i%lr;XZ8 z9VFL7jeNjjh=2>yK5QjsXkNV()&b1qRKsPH<)SaF)CS#Ex%;ot?cVcfek1-J*p#0; z=gxQ0{SJL0- zSdzvYY0xmBB3S<|7#|$x{_NU*lgF7gv)++d8+KM}0mFRu0K7F+n5#wtOxH!0AVV9_ zjLxoYZ4`AIP<179)hJXfp$5*!qJ`FMY6-nQ?`hVdKUO9`HpqP+QHIO6g&fMz3fGFK z1fK7!o#Ji2>eX~>2zaD94K<`0W*tBoG?4H1g{K9;BGr8YiGO;;+E{=WT8CKAgSmnjU zvGaI{w>>%ck#0f#XdWP8k!L?q;$(&QZEHFB zNtv;->I`ecz91AoV#=IxGB^yHr=zME3`T@5KI?{-Z1+shM7HIq%gjXnM&VS{D>{j+ zxXLAjM#yj%?A59*A={&Obz(Y z&%dV9+j%UgZ|AXS_@Hk8dZz^(g=}pKj^7O*LsRmwO(Fja_Pf56!Rs4oZDiK!qeGqC1Igi+0y2z z8l;Y;mWZdbHYES88bxW*=2iZ^COJ9D5-FW&+3f^i%C>d*YlVDvXLq1?809;+w-;7B zQ}^7SegUGoK;?K$XP;*FlM#z30+m~kQKNw+;?38ob0zvd%b88uXiRw!ceY`q3rRQv z=QP(nlu(utl~=&2{SBpiVhaq6Gj{#8U<%?yT=7jA*bc zBduP5{VQ>JGL}|jG%BxfWZ6VVr&;c$&W|{=*GDD$ture2cLjArNxm4*dJ4m_CvbGoOuJ7t(1u#tOM%Z&K!hMLz>ZLtyP4Xy~ICWArT zvok=Vb3meli2^Z#wc;5^ZhO|fq-(y7rm!dp-{Kpk%2g$|1!k=gu&78Fj1=U)_)}TE zi$=`0?KwBzQeW88qESaQ$J8^9Z_Y&_%y{0MY*>!5cNa z>0@{J7#tHYC>;0)j#)iF^sX~BNsbzv0jI4w2GtFFyz4dU@_gp=ZSU1@@$1&tZnnE1 zQ*btnXSZEmn5cPF7MgB(pAW1S_62>`qendn8AT86O$jkV(P!0pR$Rc6ls@Ai&iZfs z&pfkYo5hUkGx0WpN^#3F?bl>7HGW6(tEm2h>doi!i&9ci{e8F9XqlP}1DwNt`xWdX zIKZ02ZD#6vzU5Q1q;z|-*;(c>L^zsAp1?UqR!Jk(vYV-+YSTe8Ez!F1=z!r4U0-xu zf^;ptG!}g#mabTQGi4j*Q!mUiY-u)eo7Bi$Du1)b~B`?2~2sl3tKKezjtX_Oi z&4d~t7OnWA%&HPF^w-qjmKtu5RWf!+ z99l#i8g1F;oCzTl`4t0gd7J8>cWA-`W`CG_KT9a)JIVACVR#19VWN=4NghLt;K8Fg zb?8lDq>rNP*Y@v`J_2tg>fEHrUdXz_tdDY0{!^Li-Pa{7RdXR+12s5Oiu~DfRHPx5 z8{uoIxKC62(mqrJ93w%bt)yAxs_E}NDw;L<sb0??3l{fLFl18@3$F$o$&GdN%1kY!@dIolxDk5K z2lGdbp#*#fGNA5Mx4-qNhsteE_RGbitWzrP^M;{(ng50ZB4^J7EHhibfmW}#CEhc} z6{Rc2UTS)0L9<{>-SVc_6cqYuKl6FAg(%X0oaM6`GIlFmsGU#hsI-dpeng(!4$2Z5 z$J>*=dK{e$m>`B|3etCF$}0Fq-(Gz}FDop>Jj4L=Kn!MU$zA*1%yc_0{NVx@HnPm_M54Xry_4u4^z0av|gi0*BS4RfuxGr9h(W^iBfeRh?44%y;Jlx+I* zSUwr>ey=z9$#hW#pBdffuF^Cg33~!;H(%woeLkj6zc>0l9%gk9^v0Qf@0`67{5m6E zkHJ!$ATs>pyB<8`iPZ>HCpzIEHD!M!66azqNgPC38RaW@k@s}1G(!6r>n% zUiaIs?#do#hp7nNijHk627iP%CeXNtL2c9k^#X`|N&@w!S?C?F$_O`QiziL%0!XQH z#Z^Ua)3=OITEzQw`qY|Os9L|6p??*0H$R6a+P`e9=Hn|xv=Fix zpf@=Mp<^5!E&OT5L8%-loBl~(_%%j5TfTa-0a|xEX!8`ayX&pUnD26?KT61KS||lS zD&)O+o@BGLs1#c+u$|blg|V3G?oJwJmvebaI!cKS*Hf_;=VqIzw64vKQI$Z`K#~hs zz{!9twh%v~to$Um-??OEXr96P93}!JPBwA-3eT7v=5Ny%>d0;ZfZ%qqYc%4aBv0HVZ=y*ZV9ihjB z`>8;4!Fv@xuh^Z6+ib}8W#0;VyUeN9eZxzZB{$qRwm*=bW{BMSG|P=3ARTZA=N`fV ztc?{T2woGudI-?q3sV#%Mp3|>^GXci;WNg_YcqX8H6pTzh@vQfs8ZOVzzl3kzBV79}E@^Ub<^Mzexw8U}2 zGZg1cXbLUan*6AX+zsK#jXSLPK*kiJ^1fA?Iez3(10LCeMN?56i{cRs(rX+~3m)~O zn%C*9t4c6wVRC`3%c}73wcl;zhiF9b5rU4)jO3>lC7e1 zE?XDP?AtL_^zDx0Y*{%+iHD!z`n^<--fmgpXn@L5^hpJ!BvU1+Hkl(1b5c@sHQ7p$L`bLO6jQLk_;*uaI*d4noJLyWgs~BFR!40 z=EMZEMSPEiYzL0n?hvPB-}P;7@|n?PK061){B!uh>0gQ;yvL)6mZvR(4_Mb@|36>{QcdQ;G)Z` z#?e>b?Q=%gs2-mj<_<%vK{o>FlAOX(RoJxjQY%Os4IamaN^OWP>TC&jWRai&1~HKF z3$F%`;k>NQjP41SXp6z&fL;22T2)8-=OD**tK-v^p5MQp6#C)%W^yrIJ6v^afK`9a za76};ZeXYe!aJ^WoAWGh338|Rqz~g~Mhw=VAJ0CL^%&o{#VoWLIKxLhMq{C;WGs;8 zx$R~;F~YJ8;(UgBYHLIPB5sywq=0JR;Mjnk+j|H%sLf!wqq)s&F*a9XC|j|H zyEAMf6<)^8o^!i_Fz}f(+u25nK(K53I{EnKZr(k(pqBTh`4 z==tz&+#S;IteunqOoP{})qCi_2Gg(8Yc*Q8sCdl4dH+K30Ap8(2-0%qIzqS zw4#;WL3LNwJ}G~jeGE=1Rg(drgBtDhnNLlPL~4xjbFKCeK^TV_sID|I)gKE9O0zxi zAlzdP;fdvm86X&9;K3=B&y_zcMo4M;XTXal5jGP`<`wxzK)jbE_+ZpHtwSQosPpb~ zp!P}#{n#C7y~i0dbo+pdK#rd4RLi)pGRMT={OQ%~Db~ZxnR?*u)c)32N&gGxSf-Psa98LB3M+e_!GK!{- zy`{~apTA)#)MPX0Ev^GA%udl7EHEz#zk_?xq z*aAi#l9qNMA>Da`7U-XNu;yS>vcFIheSy~ysCZ#D28g%#1;n5mjM6(FTzWbTmJAt( zwNkj1@*WC~qZB8kyNZ~8;2lLeLhyhbXQWJ5{`;7x-0$s4+RDhk&o|6bl)%*=noQc1XX z&LGTgQcEu{7$0F>6S5=H+ge7NYfXtEPq~!tCAw~Yh>PCp|~Er>Xb%Twul}drtXn88(dxs zoIeKb4+-(0C#hb)8F?8?rIb>}bXEePjbc(2Qi=O&BO~7DEsfjFQWhO3!>ZCteYcD? zPe5*g^WNuGa@CHH?AEHvL!gW$+AZqmG8M1wE(mF^4*e0YNc=wb%vL+7T(MdPuO5cevgrN zYBW#CaOry?gS4gU8)dWuWz`>Q888j0VxYYZCOkttyA(h9kstofy-#;X)B|34a%GvI zgX)o}RW)GhVLbE`6+P&obi}z|0;`*!CkF|ZzsDUqEKs_wa?jb7rN`B4!&`-T3=mp(0pNzcwLes&%BtxrO-<&bY_Il^=*VVUL9 znX|= zh*f?}P-d%2Glfsuy;}iA-OgGppMM~BH0pm#4Yk?qVb}B@6>l1dg8#@&!X8xpRSaJP z-F;icFu=VgJ3&XY^i;?OwwrU?5#OM}5ygDj? z+sy-Eca~-R-Mb(FtG=ls1uPLk`H;1KE=98Pfo0elER`n2GliyW_`MsObazEXagFLx zZ4J)D6z?!u1b(wQb(?%{81!$&oD|}2l9jYPa(^3sG zaudkQuVxjcn`A%fE9spb2gSgJPb3`B=oL3&>2KjYi?>oi>$(*BrJC`omZ;{5JYUDS zsL3>dMsmN^af}7NrO0`#wrx~uMDnr89pzn*X4#T7&pM2It9`F#JhX=NqmYr1Mr;!% z#yp~2UUdMp1~^JCUnrDD??`A!Ip@ggvi}-}xt>nA3iN}8$ouJ)Ve>8K31=sOs`udB zyo7DF{M%$9l))XFJTV;!gK$f?Z?a|MNr#Pz`Y{A`v1Cee6lu%U75$Sw)>2;V0fP*B zf{h@u7Ns-fX|p}#y=R_KqTvA#N!cWQKu~YKLpwyT&?=Eoc{3N^H|_Bru?StB%{_ka zM_Pw=4~8Ll$xHotrFcJF9xXZ`osx`DhbwXB;Fq_fGe>%KajrU1elPUzA1)J|F`WDK zzXmTl=g=%p+%Fr2o@?sTj0T>j$&26B@OxK3Ek0{VT$86l^A0&bt_~$R&wJ0uN$iWa zshW`z5D}^`j;A zv}^e`=E<>Cii>o88t;02Dkf6V+5mbTW+q$569eYhBO6_m!Chw< zswCUXjv^>u<~sb0xEnXO0M!qnONl;PzY);k+l-JBnb`)pUE2dM+}pD$Ww8CL5EV1x zjto-KHjsrziQ)ajklW0BE$tVFFCcmM5K$Y4LsjwoPE34NCE?Qizpaw&Q}b$>)ancp z^nJ$!eP7Y#fyY5gbL5MRNuJzbyl`XFAF?6DB9Rau9y|}iwk5^(0oJ=^@Y`hHUkyJ5 zLh79>uU_KxBj-iTC=CYsg(D1_$nkGzVPMuZ!`gI~ z8CwX*Q29pHtJS|Ah=Pg*yG3P5oDW`w`qZWAD@l)$&rc~X0v$B-PK6#H3pa7U<*3Ra zM=sUq^N&+6tM%)BXTX(%H>Y`;oU4IRcg#R>ry?{njq>paWpk${4bFzB4jzKQV38^O zyXm=MH-kO=-qMGywd;FtJhW4p5Bce_;f84DU8K|*eAut{jU=fos{AV<`kc^dL1Z7n z)%Wd zu=@LqWQtNYqSDR}!<`}T0G?d+dVhVoPFbZQr4W1VkCJzNf{4FaXDo~lFC6-WaO0f} zO^(5SGL7o|6cKGW5reiu$@IX0C(UH?@pn$7L=#EBB~A2LBdtG&g8!|iO1P=^tCu0) zN_FGI_~R{fyfi>(C^6O{ZRYu^Zf3EB~_yA+@X2^gLz0Z(Nvxa^erW1+77fE^?s+?IOc2} zaSle!-Vj$YDRv^~ED8*VKfSC@6A7lLs+$T;?g0rsEGacP*$`z7n`D_5fXvpu2oV3G;-BQkDMsla}Z z#kckMF?VRlyyfYi+kCV2!{k~nR9|=^ZG@qx%kVgp)kSW4iOymklaEg)bwqTi3RO88i>TIoL%{aG4o{2eVWRN55>7XO~gV#__o z5Bcp_E6u08{!WZwA(^E9U{dx3X-wmXv$g_bO;>U%%fw=BGstk^%hMdM(|(C;kEiXK z-!rKt+f#!A*F6(6U6b@ECHI-40k}@U?v7sbLZk0aFofgYOqGA%tTK?N8vn${ZDs#Hc+EehOWw!bj!3%i(g&$t?~wj@M?%x^RiMyKJ+5tWe=~4`+6HqtVfb5il?Q zq>U|E76moqBWTUZamefnvc{^lb2VL90YTdw;oS8UNWdS3G8yKQmEJ*?eV+xI>)35r zcY@mpjuBIjgbEFz0Y{|oS8;efFZA~m?`5?N=OA762{`6~=|YVQTVVjUoVAi(gg(Q9be+u8{i@)#CdQqKlTt!Gy27YWdayZrtps z*dI@Wlk#?Xfib&~QrE~_o`rz7x80}Wwi}y)yRpt6xTYvXt95w75*ykRdIPtjAKMIm z?R;uF4yoKGsx_)cKku4vBg}gdUMu)@Ydbqv&5Lk{hF3O5#6`qG{Kc6~F_oCs_v;e7 z(%}%@#U|@stKuuym*=M~??;<0zLJhs-Bj9R78r#bX0D-|3GAf9FDxa%L?(*|z}Y5V zVb(Th>vzPCgR;s8Nk*?ejixQ2rXU0Lp)Ls_Hdn|bEhe7v_*iO7kr>e9@4*E!?U-}b1hk+UuNALwf=MX`@XKChT5#v}kp}-aF zT-GB^tP$k|Uj;(iNC^n27L%2?N{zZr##qo>w1jTPJY51%IEb=>P}BVI%duaw z>*y|p-t!n%7gSHlKwTH8z1@x z<;Qk_#gHhNd*Cc!O4=m^gefo`Lw=zc!^TABUqF!T8b3X$p&cv=e2-`E;_JURjZC2r>9Q|EI)fmGc6kqMsXk^L$oQL_{y2uRkkYV}Ebh3d!h? zP7gq$Uw-^jtN*=@^4qY`RvVTQ!KCfTo!%yl2J4_2BnEme0>KX?Qj%j+$?>_KMDH{P zAS0LeBDcXph+`r`hZ=X{y#EI;*8%VghZPe#wLI}8z9Py0w;Gh4W$UUY_zu#2*GF;3 zN=6Sv`>I^{m9dRnH!sNKRYvwcs9pX3AcMxiY^%!4OvR~oX?$?wnzem)?^^np-)v(n zMzm8T9zH|lXxMP{uPkiXRI|`d_+&WIfbyiE`N6gpBD4vjU$Lxiz{H52x`crwe*hwV zOPs!)P)&$hXc@w_PhP-#UWiDz&-5Rm1@iJNz58LJsr&_{1REf*Tk444-;-n2$P|R( z^zP~ZD4yKIJkW=Ofn%J*Y?W<`l5W+*+sjijKXesOXd*u zK}ESGAj1d)s#7gQW3rFsqeco%Na@#|cjkWPgns)!Kw9&!1RB*rit4$zTBHi7#L9XU zr{%Vwj8C5!d++YL%1J!hJfh%{wt+5o0|3;GN^bsL)=CmVJyJ_|$aisM-3cZA>yXKi z0gbwoq#8bQ3V!}}5iHYD`E~Us0w(HAWT&^)KDyR;Rx3_v8d&>wKOk>MW@w~6HaACP~P@gLA>R2KXX z*fUQ14|p|R2>l1lnEO9G2j@;d{spGCpo1v>uG+MN4od&SAk`le^x+@41rwCpR@gRUX}z||6i2S2cZI+Sr6z}t%6NzWqpw)g>6&LPM$ii>92XByDxF(J5-jk6A0L^}jPy2wrTf#y zmu=y`)4l^=)p0=Gk1J5;B2A>lQB3pLk5)zWo%C2k{u8|^Ph>+Q6RTnnni#J2pt%C3 zYWlp2_=mzc3%@>pte>9wIm70q&C&*I{`kLSJAPihyUXD}Px{ikl#a2WnjWg!uPM2m zCTk`XC5f??FUALG6Z2$FDDp+yZE@f1eIuF+O8fuP{A(lyP(kdK2r}dY+(P$yG)A)(JPDFiY2~;E9^o`^q=sx zo*vvwZR3qW%`ew6+Q~&#iJ)!BGIbDLDr~%?bP^+U)!G*zhO$sDI`FF*PeO_gbv8C3 zskuR8W$;j6vV0QGG=C302LS2wZ=;WaoB&kJ*nO zl^ABQMT#FG@*!FT^s6(s6`+ard?7I)(c^frjO2G1;Sdg`Q&INtbc|Spn(qf@hhBNhK49+bA(tc$yuFybdfWDc4wky02g3bl z;N0thHvcnJR}DaP|G>zGpn1$c<7v+w#QG0R;sF{U{R1Cm{u}-P*`$^W3LyS-bEOMJ z|2Iu4ayMx354zM168Q%u>j5SHL0fu2^bl{kc2hz9ApHN6fj1SY7sUJz&i#M;k+9$V zOaJ*4f&whSz!b!U6+baKI~y{(n>*WBtExbOf&OMo^cOjMjA&K%Tg2h`n3 zznU~I<6`rc78&e;84L{dUsCtT{+4RuY-j(!iCz7RV;K`Db&?50`QKvy^pvN_k7BmB z9A6`_U|@Lv;=Yk;FaRR^N0&bxLK4R8v;5W>vTq(o{D0Lp7Y3!q3WJFLTfiTZ;6o_X zMszT+VA217AErrwQol=p{?&=Rf3^6}{PAYzs<&4E`{~Km{=3CScDBwYw$6-p_NM=O z{QlUoWAM$EwW&*Q#lQ9c@^0&<9TN;}?CpC0Fa3WQfKrbQK-mAKKPKEixvNthhTb?% zrA7~dDE{V%N%7BZ&EBKt-E?v=u)i*XfAO75J^wEn{68kaY^YnUdK*vAZx`mjYWH`6 xQjfYoIRB*u{-17QO%>5_d#j%Rb}{^mq&KyC7{vZZslDO1*W-CTZ{rT^{{vbv`-cDk diff --git a/prs/8803/lib/observer-2.16/doc/html/ttb.html b/prs/8803/lib/observer-2.16/doc/html/ttb.html index a48052ee5be25..2f107caaa4afd 100644 --- a/prs/8803/lib/observer-2.16/doc/html/ttb.html +++ b/prs/8803/lib/observer-2.16/doc/html/ttb.html @@ -1908,13 +1908,13 @@

    seq_trigger_ms(Flags)

    is "contaminated" with token seq_trace.

    If Flags = all, all possible flags are set.

    The possible values for SeqTraceFlag are available in seq_trace.

    For a description of the match_spec() syntax, see section Match Specifications in Erlang in ERTS, which explains the general match specification "language".

    Note

    The system tracer for sequential tracing is automatically initiated by ttb -when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)6> ttb:p(all,call).
    -{ok,{[all],[call]}}
    -(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the +when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)6> ttb:p(all,call).
    +{ok,{[all],[call]}}
    +(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the executing process.

    @@ -1953,14 +1953,14 @@

    start_trace(Nodes, Patterns, FlagSpec, Trac

    start_trace(Nodes, Patterns, FlagSpec, Opts) -> Result

    This function is a shortcut allowing to start a trace with one command. Each tuple in Patterns is converted to a list, which in turn is passed to -ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    -                  [{mod, foo, []}, {mod, bar, 2}],
    -                  {all, call},
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    -ttb:tpl(mod, foo, []),
    -ttb:tpl(mod, bar, 2, []),
    -ttb:p(all, call).
    +ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    +                  [{mod, foo, []}, {mod, bar, 2}],
    +                  {all, call},
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    +ttb:tpl(mod, foo, []),
    +ttb:tpl(mod, bar, 2, []),
    +ttb:p(all, call).
    diff --git a/prs/8803/lib/observer-2.16/doc/html/ttb_ug.html b/prs/8803/lib/observer-2.16/doc/html/ttb_ug.html index 4a6df2319bb2a..adedd50cf9f41 100644 --- a/prs/8803/lib/observer-2.16/doc/html/ttb_ug.html +++ b/prs/8803/lib/observer-2.16/doc/html/ttb_ug.html @@ -172,56 +172,56 @@

    Tracing Local Node from Erlang Shell

    -

    The following small module is used in the subsequent example:

    -module(m).
    --export([f/0]).
    -f() ->
    +

    The following small module is used in the subsequent example:

    -module(m).
    +-export([f/0]).
    +f() ->
        receive
    -      From when is_pid(From) ->
    -         Now = erlang:now(),
    -         From ! {self(),Now}
    +      From when is_pid(From) ->
    +         Now = erlang:now(),
    +         From ! {self(),Now}
        end.

    The following example shows the basic use of ttb from the Erlang shell. Default options are used both for starting the tracer and for formatting (the custom fetch directory is however provided). This gives a trace log named Node-ttb in the newly created directory, where Node is the node name. The default handler prints the formatted trace messages in the shell:

    (tiger@durin)47> %% First I spawn a process running my test function
    -(tiger@durin)47> Pid = spawn(m,f,[]).
    +(tiger@durin)47> Pid = spawn(m,f,[]).
     <0.125.0>
    -(tiger@durin)48>
    +(tiger@durin)48>
     (tiger@durin)48> %% Then I start a tracer...
    -(tiger@durin)48> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)49>
    +(tiger@durin)48> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)49>
     (tiger@durin)49> %% and activate the new process for tracing
     (tiger@durin)49> %% function calls and sent messages.
    -(tiger@durin)49> ttb:p(Pid,[call,send]).
    -{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    -(tiger@durin)50>
    +(tiger@durin)49> ttb:p(Pid,[call,send]).
    +{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    +(tiger@durin)50>
     (tiger@durin)50> %% Here I set a trace pattern on erlang:now/0
     (tiger@durin)50> %% The trace pattern is a simple match spec
     (tiger@durin)50> %% indicating that the return value should be
     (tiger@durin)50> %% traced. Refer to the reference_manual for
     (tiger@durin)50> %% the full list of match spec shortcuts
     (tiger@durin)50> %% available.
    -(tiger@durin)51> ttb:tp(erlang,now,return).
    -{ok,[{matched,tiger@durin,1},{saved,1}]}
    -(tiger@durin)52>
    +(tiger@durin)51> ttb:tp(erlang,now,return).
    +{ok,[{matched,tiger@durin,1},{saved,1}]}
    +(tiger@durin)52>
     (tiger@durin)52> %% I run my test (i.e. send a message to
     (tiger@durin)52> %% my new process)
    -(tiger@durin)52> Pid ! self().
    +(tiger@durin)52> Pid ! self().
     <0.72.0>
    -(tiger@durin)53>
    +(tiger@durin)53>
     (tiger@durin)53> %% And then I have to stop ttb in order to flush
     (tiger@durin)53> %% the trace port buffer
    -(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    -{stopped, "fetch"}
    -(tiger@durin)54>
    +(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    +{stopped, "fetch"}
    +(tiger@durin)54>
     (tiger@durin)54> %% Finally I format my trace log
    -(tiger@durin)54> ttb:format("fetch").
    -({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    -({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    -{1031,133451,667611}
    -({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    -{<0.125.0>,{1031,133451,667611}}
    +(tiger@durin)54> ttb:format("fetch").
    +({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    +({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    +{1031,133451,667611}
    +({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    +{<0.125.0>,{1031,133451,667611}}
     ok

    @@ -229,65 +229,65 @@

    Build Your Own Tool

    The following example shows a simple tool for "debug tracing", that is, tracing -of function calls with return values:

    -module(mydebug).
    --export([start/0,trc/1,stop/0,format/1]).
    --export([print/4]).
    +of function calls with return values:

    -module(mydebug).
    +-export([start/0,trc/1,stop/0,format/1]).
    +-export([print/4]).
     %% Include ms_transform.hrl so that I can use dbg:fun2ms/2 to
     %% generate match specifications.
    --include_lib("stdlib/include/ms_transform.hrl").
    +-include_lib("stdlib/include/ms_transform.hrl").
     %%% -------------Tool API-------------
     %%% ----------------------------------
     %%% Star the "mydebug" tool
    -start() ->
    +start() ->
         %% The options specify that the binary log shall be named
         %% <Node>-debug_log and that the print/4 function in this
         %% module shall be used as format handler
    -    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
    +    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
         %% All processes (existing and new) shall trace function calls
         %% We want trace messages to be sorted upon format, which requires
         %% timestamp flag. The flag is however enabled by default in ttb.
    -    ttb:p(all,call).
    +    ttb:p(all,call).
     
     %%% Set trace pattern on function(s)
    -trc(M) when is_atom(M) ->
    -    trc({M,'_','_'});
    -trc({M,F}) when is_atom(M), is_atom(F) ->
    -    trc({M,F,'_'});
    -trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
    +trc(M) when is_atom(M) ->
    +    trc({M,'_','_'});
    +trc({M,F}) when is_atom(M), is_atom(F) ->
    +    trc({M,F,'_'});
    +trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
         %% This match spec shortcut specifies that return values shall
         %% be traced.
    -    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    -    ttb:tpl(MFA,MatchSpec).
    +    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    +    ttb:tpl(MFA,MatchSpec).
     
     %%% Format a binary trace log
    -format(Dir) ->
    -    ttb:format(Dir).
    +format(Dir) ->
    +    ttb:format(Dir).
     
     %%% Stop the "mydebug" tool
    -stop() ->
    -    ttb:stop(return).
    +stop() ->
    +    ttb:stop(return).
     
     %%% --------Internal functions--------
     %%% ----------------------------------
     %%% Format handler
    -print(_Out,end_of_trace,_TI,N) ->
    +print(_Out,end_of_trace,_TI,N) ->
         N;
    -print(Out,Trace,_TI,N) ->
    -    do_print(Out,Trace,N),
    +print(Out,Trace,_TI,N) ->
    +    do_print(Out,Trace,N),
         N+1.
     
    -do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    -    io:format(Out,
    +do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    +    io:format(Out,
                   "~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,
    +              [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,
                   "~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, option file + [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file is used in tracer/2. The logs are therefore fetched to a directory named ttb_upload_debug_log-YYYYMMDD-HHMMSS

    By using option handler when starting the tracer, the information about how to format the file is stored in the trace information file (.ti). This is not @@ -319,9 +319,9 @@

    If the traced node is diskless, ttb must be started from a trace control node with disk access, and option file must be specified to function tracer/2 -with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    -                                   {file,{local,{wrap,"mytrace"}}}).
    -{ok,[mynode@diskless]}

    +with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    +                                   {file,{local,{wrap,"mytrace"}}}).
    +{ok,[mynode@diskless]}

    @@ -341,10 +341,10 @@

    Opts as argument.

    The timer is started with ttb:p/2, so any trace patterns must be set up in advance. ttb:start_trace/4 always sets up all patterns before invoking ttb:p/2.

    The following example shows how to set up a trace that is automatically stopped -and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    -                                [{erlang, now,[]}],
    -                                {all, call},
    -                                [{timer, {5000, format}}]).

    Note

    Because of network and processing delays, the period of tracing is +and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    +                                [{erlang, now,[]}],
    +                                {all, call},
    +                                [{timer, {5000, format}}]).

    Note

    Because of network and processing delays, the period of tracing is approximate.

    @@ -361,22 +361,22 @@

    once overload protection is activated in one of the traced nodes. This is to avoid trace setup being inconsistent between nodes.

    Module:Function provided with option overload must handle three calls: init, check, and stop. init and stop allow some setup and teardown -required by the check. An overload check module can look as follows:

    -module(overload).
    --export([check/1]).
    -
    -check(init) ->
    -    Pid = sophisticated_module:start(),
    -    put(pid, Pid);
    -check(check) ->
    -    get(pid) ! is_overloaded,
    +required by the check. An overload check module can look as follows:

    -module(overload).
    +-export([check/1]).
    +
    +check(init) ->
    +    Pid = sophisticated_module:start(),
    +    put(pid, Pid);
    +check(check) ->
    +    get(pid) ! is_overloaded,
         receive
             Reply ->
                 Reply
         after 5000 ->
                 true
         end;
    -check(stop) ->
    -    get(pid) ! stop.

    Note

    check is always called by the same process, so put and get are possible.

    +check(stop) -> + get(pid) ! stop.

    Note

    check is always called by the same process, so put and get are possible.

    @@ -397,24 +397,24 @@

    behaviour (that is, on diskless nodes) by specifying their own module to handle autostart data storage and retrieval (ttb_autostart_module environment variable of runtime_tools). For information about the API, see module ttb. -The following example shows the default handler:

    -module(ttb_autostart).
    --export([read_config/0,
    +The following example shows the default handler:

    -module(ttb_autostart).
    +-export([read_config/0,
              write_config/1,
    -         delete_config/0]).
    +         delete_config/0]).
     
    --define(AUTOSTART_FILENAME, "ttb_autostart.bin").
    +-define(AUTOSTART_FILENAME, "ttb_autostart.bin").
     
    -delete_config() ->
    -    file:delete(?AUTOSTART_FILENAME).
    +delete_config() ->
    +    file:delete(?AUTOSTART_FILENAME).
     
    -read_config() ->
    -    case file:read_file(?AUTOSTART_FILENAME) of
    -        {ok, Data} -> {ok, binary_to_term(Data)};
    +read_config() ->
    +    case file:read_file(?AUTOSTART_FILENAME) of
    +        {ok, Data} -> {ok, binary_to_term(Data)};
             Error      -> Error
         end.
     
    -write_config(Data) ->
    -    file:write_file(?AUTOSTART_FILENAME, term_to_binary(Data)).

    Note

    Remember that file trace ports buffer the data by default. If the node +write_config(Data) -> + file:write_file(?AUTOSTART_FILENAME, term_to_binary(Data)).

    Note

    Remember that file trace ports buffer the data by default. If the node crashes, trace messages are not flushed to the binary log. If the risk of failure is high, it can be a good idea to flush the buffers every now and then automatically. Passing {flush, MSec} as an option of ttb:tracer/2 flushes @@ -483,22 +483,22 @@

    default handler is used, which prints each trace message as a text line.

  • disable_sort - Indicates that the logs are not to be merged according to time-stamp, but processed one file after another (this can be a bit faster).

  • A format handler is a fun taking four arguments. This fun is called for each trace message in the binary log(s). A simple example that only prints each trace -message can be as follows:

    fun(Fd, Trace, _TraceInfo, State) ->
    -   io:format(Fd, "Trace: ~p~n", [Trace]),
    +message can be as follows:

    fun(Fd, Trace, _TraceInfo, State) ->
    +   io:format(Fd, "Trace: ~p~n", [Trace]),
        State
     end.

    Here, Fd is the file descriptor for the destination file, or the atom standard_io. _TraceInfo contains information from the trace information file (see section Trace Information and File .ti). State is a state variable for the format handler fun. The initial value of variable -State is specified with the handler option, for example:

    ttb:format("tiger@durin-ttb", [{handler, {{Mod,Fun}, initial_state}}])
    +State is specified with the handler option, for example:

    ttb:format("tiger@durin-ttb", [{handler, {{Mod,Fun}, initial_state}}])
                                                          ^^^^^^^^^^^^^

    Another format handler can be used to calculate the time spent by the garbage -collector:

    fun(_Fd,{trace_ts,P,gc_start,_Info,StartTs},_TraceInfo,State) ->
    -      [{P,StartTs}|State];
    -   (Fd,{trace_ts,P,gc_end,_Info,EndTs},_TraceInfo,State) ->
    -      {value,{P,StartTs}} = lists:keysearch(P,1,State),
    -      Time = diff(StartTs,EndTs),
    -      io:format("GC in process ~w: ~w milliseconds~n", [P,Time]),
    -      State -- [{P,StartTs}]
    +collector:

    fun(_Fd,{trace_ts,P,gc_start,_Info,StartTs},_TraceInfo,State) ->
    +      [{P,StartTs}|State];
    +   (Fd,{trace_ts,P,gc_end,_Info,EndTs},_TraceInfo,State) ->
    +      {value,{P,StartTs}} = lists:keysearch(P,1,State),
    +      Time = diff(StartTs,EndTs),
    +      io:format("GC in process ~w: ~w milliseconds~n", [P,Time]),
    +      State -- [{P,StartTs}]
     end

    A more refined version of this format handler is function handle_gc/4 in module multitrace.erl included in directory src of the Observer application.

    The trace message is passed as the second argument (Trace). The possible values of Trace are the following:

    • All trace messages described in erlang:trace/3
    • {drop, N} if IP tracer is used (see dbg:trace_port/2)
    • end_of_trace received once when all trace messages are processed

    By giving the format handler ttb:get_et_handler(), @@ -508,19 +508,19 @@

    directory, but analyze single files instead. To do so, a single file (or list of files) must be passed as the first argument to format/1,2.

    Wrap logs can be formatted one by one or all at once. To format one of the wrap logs in a set, specify the exact file name. To format the whole set of wrap -logs, specify the name with * instead of the wrap count.

    Example:

    Start tracing:

    (tiger@durin)1> ttb:tracer(node(),{file,{wrap,"trace"}}).
    -{ok,[tiger@durin]}
    -(tiger@durin)2> ttb:p(...)
    +logs, specify the name with * instead of the wrap count.

    Example:

    Start tracing:

    (tiger@durin)1> ttb:tracer(node(),{file,{wrap,"trace"}}).
    +{ok,[tiger@durin]}
    +(tiger@durin)2> ttb:p(...)
     ...

    This gives a set of binary logs, for example:

    tiger@durin-trace.0.wrp
     tiger@durin-trace.1.wrp
     tiger@durin-trace.2.wrp
    -...

    Format the whole set of logs:

    1> ttb:format("tiger@durin-trace.*.wrp").
    +...

    Format the whole set of logs:

    1> ttb:format("tiger@durin-trace.*.wrp").
     ....
     ok
    -2>

    Format only the first log:

    1> ttb:format("tiger@durin-trace.0.wrp").
    +2>

    Format only the first log:

    1> ttb:format("tiger@durin-trace.0.wrp").
     ....
     ok
    -2>

    To merge all wrap logs from two nodes:

    1> ttb:format(["tiger@durin-trace.*.wrp","lion@durin-trace.*.wrp"]).
    +2>

    To merge all wrap logs from two nodes:

    1> ttb:format(["tiger@durin-trace.*.wrp","lion@durin-trace.*.wrp"]).
     ....
     ok
     2>

    @@ -547,8 +547,8 @@

    obtained using both the call and return_to flags when tracing. Notice that flag return_to only works with local call trace, that is, when trace patterns are set with ttb:tpl.

    The same result can be obtained by using the flag call only and setting a -match specification on local or global function calls as follows:

    1> dbg:fun2ms(fun(_) -> return_trace(),message(caller()) end).
    -[{'_',[],[{return_trace},{message,{caller}}]}]

    This must however be done with care, as function {return_trace} in the match +match specification on local or global function calls as follows:

    1> dbg:fun2ms(fun(_) -> return_trace(),message(caller()) end).
    +[{'_',[],[{return_trace},{message,{caller}}]}]

    This must however be done with care, as function {return_trace} in the match specification destroys tail recursiveness.

    The modules filter shows each module as a vertical line in the sequence diagram. External function calls/returns are shown as interactions between modules, and internal function calls/returns are shown as activities within a @@ -556,42 +556,42 @@

    diagram. A function calling itself is shown as an activity within a function, and all other function calls are shown as interactions between functions.

    The mods_and_procs and funcs_and_procs filters are equivalent to the modules and functions filters respectively, except that each module or -function can have many vertical lines, one for each process it resides on.

    In the following example, modules foo and bar are used:

    -module(foo).
    --export([start/0,go/0]).
    +function can have many vertical lines, one for each process it resides on.

    In the following example, modules foo and bar are used:

    -module(foo).
    +-export([start/0,go/0]).
     
    -start() ->
    -    spawn(?MODULE, go, []).
    +start() ->
    +    spawn(?MODULE, go, []).
     
    -go() ->
    +go() ->
         receive
             stop ->
                 ok;
             go ->
    -            bar:f1(),
    -            go()
    -    end.
    -module(bar).
    --export([f1/0,f3/0]).
    -f1() ->
    -    f2(),
    +            bar:f1(),
    +            go()
    +    end.
    -module(bar).
    +-export([f1/0,f3/0]).
    +f1() ->
    +    f2(),
         ok.
    -f2() ->
    -    spawn(?MODULE,f3,[]).
    -f3() ->
    +f2() ->
    +    spawn(?MODULE,f3,[]).
    +f3() ->
         ok.

    Setting up the trace:

    (tiger@durin)1> %%First we retrieve the Pid to limit traced processes set
    -(tiger@durin)1> Pid = foo:start().
    +(tiger@durin)1> Pid = foo:start().
     (tiger@durin)2> %%Now we set up tracing
    -(tiger@durin)2> ttb:tracer().
    -(tiger@durin)3> ttb:p(Pid, [call, return_to, procs, set_on_spawn]).
    -(tiger@durin)4> ttb:tpl(bar, []).
    +(tiger@durin)2> ttb:tracer().
    +(tiger@durin)3> ttb:p(Pid, [call, return_to, procs, set_on_spawn]).
    +(tiger@durin)4> ttb:tpl(bar, []).
     (tiger@durin)5> %%Invoke our test function and see output with et viewer
     (tiger@durin)5> Pid ! go.
    -(tiger@durin)6> ttb:stop({format, {handler, ttb:get_et_handler()}}).

    This renders a result similar to the following:

    Filter: "processes"

    Filter: "mods_and_procs"

    Notice that function ttb:start_trace/4 can be used as help as follows:

    (tiger@durin)1> Pid = foo:start().
    -(tiger@durin)2> ttb:start_trace([node()],
    -                                [{bar,[]}],
    -                                {Pid, [call, return_to, procs, set_on_spawn]}
    -                                {handler, ttb:get_et_handler()}).
    +(tiger@durin)6> ttb:stop({format, {handler, ttb:get_et_handler()}}).

    This renders a result similar to the following:

    Filter: "processes"

    Filter: "mods_and_procs"

    Notice that function ttb:start_trace/4 can be used as help as follows:

    (tiger@durin)1> Pid = foo:start().
    +(tiger@durin)2> ttb:start_trace([node()],
    +                                [{bar,[]}],
    +                                {Pid, [call, return_to, procs, set_on_spawn]}
    +                                {handler, ttb:get_et_handler()}).
     (tiger@durin)3> Pid ! go.
    -(tiger@durin)4> ttb:stop(format).

    +(tiger@durin)4> ttb:stop(format).

    @@ -632,76 +632,76 @@

    of {Module,Function,Args}.

    Any existing file ConfigFile is deleted and a new file is created when write_config/2 is called. Option append can be used to add something at the end of an existing configuration file, for example, -ttb:write_config(ConfigFile,What,[append]).

    Example:

    See the content of the history buffer:

    (tiger@durin)191> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)192> ttb:p(self(),[garbage_collection,call]).
    -{ok,{[<0.1244.0>],[garbage_collection,call]}}
    -(tiger@durin)193> ttb:tp(ets,new,2,[]).
    -{ok,[{matched,1}]}
    -(tiger@durin)194> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}}]

    Execute an entry from the history buffer:

    (tiger@durin)195> ttb:ctp(ets,new,2).
    -{ok,[{matched,1}]}
    -(tiger@durin)196> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}}]
    -(tiger@durin)197> ttb:run_history(3).
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}

    Write the content of the history buffer to a configuration file:

    (tiger@durin)198> ttb:write_config("myconfig",all).
    +ttb:write_config(ConfigFile,What,[append]).

    Example:

    See the content of the history buffer:

    (tiger@durin)191> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)192> ttb:p(self(),[garbage_collection,call]).
    +{ok,{[<0.1244.0>],[garbage_collection,call]}}
    +(tiger@durin)193> ttb:tp(ets,new,2,[]).
    +{ok,[{matched,1}]}
    +(tiger@durin)194> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}}]

    Execute an entry from the history buffer:

    (tiger@durin)195> ttb:ctp(ets,new,2).
    +{ok,[{matched,1}]}
    +(tiger@durin)196> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}}]
    +(tiger@durin)197> ttb:run_history(3).
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}

    Write the content of the history buffer to a configuration file:

    (tiger@durin)198> ttb:write_config("myconfig",all).
     ok
    -(tiger@durin)199> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}}]

    Extend an existing configuration:

    (tiger@durin)200> ttb:write_config("myconfig",[{ttb,tp,[ets,delete,1,[]]}],
    -[append]).
    +(tiger@durin)199> ttb:list_config("myconfig").
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}}]

    Extend an existing configuration:

    (tiger@durin)200> ttb:write_config("myconfig",[{ttb,tp,[ets,delete,1,[]]}],
    +[append]).
     ok
    -(tiger@durin)201> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}},
    - {6,{ttb,tp,[ets,delete,1,[]]}}]

    Go back to a previous configuration after stopping Trace Tool Builder:

    (tiger@durin)202> ttb:stop().
    +(tiger@durin)201> ttb:list_config("myconfig").
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}},
    + {6,{ttb,tp,[ets,delete,1,[]]}}]

    Go back to a previous configuration after stopping Trace Tool Builder:

    (tiger@durin)202> ttb:stop().
     ok
    -(tiger@durin)203> ttb:run_config("myconfig").
    -ttb:tracer(tiger@durin,[]) ->
    -{ok,[tiger@durin]}
    +(tiger@durin)203> ttb:run_config("myconfig").
    +ttb:tracer(tiger@durin,[]) ->
    +{ok,[tiger@durin]}
     
    -ttb:p(<0.1244.0>,[garbage_collection,call]) ->
    -{ok,{[<0.1244.0>],[garbage_collection,call]}}
    +ttb:p(<0.1244.0>,[garbage_collection,call]) ->
    +{ok,{[<0.1244.0>],[garbage_collection,call]}}
     
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}
     
    -ttb:ctp(ets,new,2) ->
    -{ok,[{matched,1}]}
    +ttb:ctp(ets,new,2) ->
    +{ok,[{matched,1}]}
     
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}
     
    -ttb:tp(ets,delete,1,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,delete,1,[]) ->
    +{ok,[{matched,1}]}
     
    -ok

    Write selected entries from the history buffer to a configuration file:

    (tiger@durin)204> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}},
    - {6,{ttb,tp,[ets,delete,1,[]]}}]
    -(tiger@durin)205> ttb:write_config("myconfig",[1,2,3,6]).
    +ok

    Write selected entries from the history buffer to a configuration file:

    (tiger@durin)204> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}},
    + {6,{ttb,tp,[ets,delete,1,[]]}}]
    +(tiger@durin)205> ttb:write_config("myconfig",[1,2,3,6]).
     ok
    -(tiger@durin)206> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,tp,[ets,delete,1,[]]}}]
    -(tiger@durin)207>

    +(tiger@durin)206> ttb:list_config("myconfig"). +[{1,{ttb,tracer,[tiger@durin,[]]}}, + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}}, + {3,{ttb,tp,[ets,new,2,[]]}}, + {4,{ttb,tp,[ets,delete,1,[]]}}] +(tiger@durin)207>

    @@ -714,40 +714,40 @@

    ttb:tracer/0,1,2. Sequential tracing can then be started in either of the following ways:

    Example 1:

    In the following example, function dbg:get_tracer/0 is used as trigger for -sequential tracing:

    (tiger@durin)110> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)111> ttb:p(self(),call).
    -{ok,{[<0.158.0>],[call]}}
    -(tiger@durin)112> ttb:tp(dbg,get_tracer,0,ttb:seq_trigger_ms(send)).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)113> dbg:get_tracer(), seq_trace:reset_trace().
    +sequential tracing:

    (tiger@durin)110> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)111> ttb:p(self(),call).
    +{ok,{[<0.158.0>],[call]}}
    +(tiger@durin)112> ttb:tp(dbg,get_tracer,0,ttb:seq_trigger_ms(send)).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)113> dbg:get_tracer(), seq_trace:reset_trace().
     true
    -(tiger@durin)114> ttb:stop(format).
    -({<0.158.0>,{shell,evaluator,3},tiger@durin}) call dbg:get_tracer()
    -SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    -{<0.237.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    -[Serial: {0,1}]
    -SeqTrace [0]: ({<0.237.0>,dbg,tiger@durin})
    -{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.222>}}
    -[Serial: {1,2}]
    +(tiger@durin)114> ttb:stop(format).
    +({<0.158.0>,{shell,evaluator,3},tiger@durin}) call dbg:get_tracer()
    +SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    +{<0.237.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    +[Serial: {0,1}]
    +SeqTrace [0]: ({<0.237.0>,dbg,tiger@durin})
    +{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.222>}}
    +[Serial: {1,2}]
     ok
    -(tiger@durin)116>

    Example 2:

    Starting sequential tracing with a trigger is more useful if the trigger +(tiger@durin)116>

    Example 2:

    Starting sequential tracing with a trigger is more useful if the trigger function is not called directly from the shell, but rather implicitly within a larger system. When calling a function from the shell, it is simpler to start -sequential tracing directly, for example, as follows:

    (tiger@durin)116> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)117> seq_trace:set_token(send,true), dbg:get_tracer(),
    -seq_trace:reset_trace().
    +sequential tracing directly, for example, as follows:

    (tiger@durin)116> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)117> seq_trace:set_token(send,true), dbg:get_tracer(),
    +seq_trace:reset_trace().
     true
    -(tiger@durin)118> ttb:stop(format).
    -SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    -{<0.246.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    -[Serial: {0,1}]
    -SeqTrace [0]: ({<0.246.0>,dbg,tiger@durin})
    -{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.229>}}
    -[Serial: {1,2}]
    +(tiger@durin)118> ttb:stop(format).
    +SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    +{<0.246.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    +[Serial: {0,1}]
    +SeqTrace [0]: ({<0.246.0>,dbg,tiger@durin})
    +{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.229>}}
    +[Serial: {1,2}]
     ok
    -(tiger@durin)120>

    In both previous examples, seq_trace:reset_trace/0 resets the trace token +(tiger@durin)120>

    In both previous examples, seq_trace:reset_trace/0 resets the trace token immediately after the traced function to avoid many trace messages because of the printouts in the Erlang shell.

    All functions in module seq_trace, except set_system_tracer/1, can be used after the trace port is started with ttb:tracer/0,1,2.

    diff --git a/prs/8803/lib/odbc-2.14.3/doc/html/getting_started.html b/prs/8803/lib/odbc-2.14.3/doc/html/getting_started.html index 6d3da67fc39fc..13b20ce197daa 100644 --- a/prs/8803/lib/odbc-2.14.3/doc/html/getting_started.html +++ b/prs/8803/lib/odbc-2.14.3/doc/html/getting_started.html @@ -157,77 +157,77 @@

    relevance to anything that exist in reality, it is just a simple example. The example was created using sqlserver 7.0 with servicepack 1 as database and the ODBC driver for sqlserver with version 2000.80.194.00.

     1 > odbc:start().
    -      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    -      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
    +      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    +      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
           FIRSTNAME  char varying(20), LASTNAME  char varying(20), GENDER char(1),
           PRIMARY KEY(NR))").
           {updated,undefined}

    Insert some data

     4 > odbc:sql_query(Ref, "INSERT INTO EMPLOYEE VALUES(1, 'Jane', 'Doe', 'F')").
           {updated,1}

    Check what data types the database assigned for the columns. Hopefully this is not a surprise, some times it can be! These are the data types that you should -use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    -      {ok, [{"NR", sql_integer},
    -            {"FIRSTNAME", {sql_varchar, 20}},
    -            {"LASTNAME", {sql_varchar, 20}}
    -            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
    +use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    +      {ok, [{"NR", sql_integer},
    +            {"FIRSTNAME", {sql_varchar, 20}},
    +            {"LASTNAME", {sql_varchar, 20}}
    +            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
                       "LASTNAME, GENDER) VALUES(?, ?, ?, ?)",
    -                   [{sql_integer,[2,3,4,5,6,7,8]},
    -                    {{sql_varchar, 20},
    -                             ["John", "Monica", "Ross", "Rachel",
    -                             "Piper", "Prue", "Louise"]},
    -                   {{sql_varchar, 20},
    -                             ["Doe","Geller","Geller", "Green",
    -                              "Halliwell", "Halliwell", "Lane"]},
    -                   {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]).
    -      {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    -    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -          [{1,"Jane","Doe","F"},
    -           {2,"John","Doe","M"},
    -           {3,"Monica","Geller","F"},
    -           {4,"Ross","Geller","M"},
    -           {5,"Rachel","Green","F"},
    -           {6,"Piper","Halliwell","F"},
    -           {7,"Prue","Halliwell","F"},
    -           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. -The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    -      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and -can do things like this.

     11 > odbc:last(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -     {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Monica",3},
    -           {"Rachel",5},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on -the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    -      ORDER BY FIRSTNAME").
    -    {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Louise",8},
    -           {"Monica",3},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all + [{sql_integer,[2,3,4,5,6,7,8]}, + {{sql_varchar, 20}, + ["John", "Monica", "Ross", "Rachel", + "Piper", "Prue", "Louise"]}, + {{sql_varchar, 20}, + ["Doe","Geller","Geller", "Green", + "Halliwell", "Halliwell", "Lane"]}, + {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]). + {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    +    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +          [{1,"Jane","Doe","F"},
    +           {2,"John","Doe","M"},
    +           {3,"Monica","Geller","F"},
    +           {4,"Ross","Geller","M"},
    +           {5,"Rachel","Green","F"},
    +           {6,"Piper","Halliwell","F"},
    +           {7,"Prue","Halliwell","F"},
    +           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. +The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    +      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and +can do things like this.

     11 > odbc:last(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +     {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Monica",3},
    +           {"Rachel",5},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on +the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    +      ORDER BY FIRSTNAME").
    +    {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Louise",8},
    +           {"Monica",3},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all female employees to the connection. The number of rows in the result set is -returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports +returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +      {ok,6}

    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.

     18 > odbc:select(Ref, {relative, 2}, 3).
    -    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    -    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    -      {selected,["FIRSTNAME","NR"],
    -                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    -      [{{sql_char, 1}, ["M"]}]).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    -      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
    +cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    +    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    +    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    +      {selected,["FIRSTNAME","NR"],
    +                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    +      [{{sql_char, 1}, ["M"]}]).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    +      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
           ok

    Shut down the application.

     26 > odbc:stop().
         =INFO REPORT==== 7-Jan-2004::17:00:59 ===
         application: odbc
    diff --git a/prs/8803/lib/odbc-2.14.3/doc/html/odbc.epub b/prs/8803/lib/odbc-2.14.3/doc/html/odbc.epub
    index b63c81a46f5cb1d07e77e76200a2c576b3777c88..c54dbf5629a61273e7dacde344467ffa91f67d07 100644
    GIT binary patch
    delta 6801
    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
    AuK)l5
    
    diff --git a/prs/8803/lib/os_mon-2.10/doc/html/os_mon.epub b/prs/8803/lib/os_mon-2.10/doc/html/os_mon.epub
    index 68979c0619d5e47ebe4fb31f768f7c0b5d048aaf..a78d39599fd9a698435c3879b4cc119137ba625f 100644
    GIT binary patch
    delta 1303
    zcmcaOk@@^YX5IjAW)?065D*K|naC^0uCx468W2x3(qjgRB&)+jHcs5m2ojp?&7=Vn
    z+g!zTPY^5^EusS#>=O}T1q&{fLn&EwO|UX$3#BX
    zU0e8=QaCd{J-HyL8MY+n`TgmO?4;EtyKYUcu-SLMcEa;7&s4bHGfaK9H0F1pz%MzE
    zC?mb{?EiJ2d1HT?-_!|h**8J9;#%~pt^ad+ybSE><@y=ZwfIkEwLdn9c^LHc-V)Hy;ZEfh(>IH05e|b(RdSrdXV7p<;wRv0yErQNb8HZjR2rUh@P+Kg)
    zB@h<(SfgWubw6Hz_wdn`H*iSU0rnA>yq@f)2zYu2R%U7w?Bvi$Z8L5E74
    z_(dJL;Tm0{hE1wmYv@=uMCa0P^#p+Rl-=nd`MOOr);bWQD|kb|0r+XQdq)?1qD#b(HCv3^;f8C95?lkh{gY1+1a
    z+aptd$r}c{lzX~)-JYwieR;9lY1N8NCJWjxnRfqov^*RTYX7q8#LDP6CB9
    zj!7=9oHH>;`BdE04BoO7^JNYv@7}kHxpA>W+W6h_+bIi{Mip{S-kHq0w(fV*oi7L9
    z=bK%A@5`#Td-B9j8-uOc?`_MJa`@h4KkY^Qz2kCsyML;5eOy&P>->sIkJe>q3cvez
    zV)IRTP^J_CracZ&rkt$3N*kVzV^>`h1E*uNgYc|1IrHENu$ajqXPCmtb%!Q{#Y7J4
    zFas0yWX7X1V1CkJQxyKr!)7Ra!6Q~E{9H8t$s?%x6^@IN5
    
    delta 1330
    zcmX>Ip2#c5zA5fu8W2x3(qjgRB&)+jHcs5m2ojp?&7=Vn
    z+g!zTPY^5^EusS#>=O}T1q&{fLn|~;-nt_`gZ37GjFlD?mT+gAm)Kn?w`)<
    zf3;55hc{R-XZ~n&-uWps@=b$O$P4kn6BG0051%|LyI=-mR_QyDosPAcXa$bDMoD5ADw`}aKO9JzG$hf6~>AFq0(Gtbp{n(i~j
    zs7+^ibkhZ$i;e2f3(UNGp+~?>{q&ia{7uX%>P68vKP^?5>%V`ViC*cld9KrE6y$5|H
    zqfUC_t*53QOh-7btXX$SiMjgshfhhjzpvaL^OCFYQ&w2`PLTzxcrNBleCtx`U~T(q
    z=E1zrum3*!_q%_2X+VD8O}0L^`u8X1nY3)Kv|!bE-Py9N;KDNo)kVK}mK9e;{I80!
    z|HCuqGUvK&yKMYCwh6i}_u9f{y(v3*!IN+KvU+baj%<}Iznp7wL1^ucmWy{bHihl4
    zG|c<;;PdRSUw#KPUVN9aB&ICu*@5F`z04W$A5uHtJ&paA5r0NKkSF}_L9)e%K6!&ws=Ug`bVaKYj#NzuZw{6!pbNQO!Gj)E!0M
    z
     next token. Note that pushing back a newline will mean the line numbering will
     no longer be correct.

    Note

    Pushing back characters gives you unexpected possibilities to cause the scanner to loop!

    The following example would match a simple Erlang integer or float and return a -token which could be sent to the Erlang parser:

    D = [0-9]
    +token which could be sent to the Erlang parser:

    D = [0-9]
     
    -{D}+ :
    -  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
    +{D}+ :
    +  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
     
    -{D}+\.{D}+((E|e)(\+|\-)?{D}+)? :
    -  {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file directly after the module declaration and predefined exports declaration, making it possible to add extra exports, define imports, and other attributes, which are visible in the whole file.

    @@ -731,7 +731,7 @@

    token(Cont, Chars, StartLoc)

    the token. This is continued until a token has been scanned. Cont is initially [].

    It is not designed to be called directly by an application, but is used through the I/O system where it can typically be called in an -application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
    +application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
       -> TokenRet

    @@ -820,7 +820,7 @@

    tokens(Cont, Chars, StartLoc)

    like Erlang where there is an explicit end token, '.'. If no end token is found then the whole file will be scanned and returned. If an error occurs then all tokens up to and including the next end token will be skipped.

    It is not designed to be called directly by an application, but used through the -I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
    +I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
       -> TokensRet
    diff --git a/prs/8803/lib/parsetools-2.6/doc/html/parsetools.epub b/prs/8803/lib/parsetools-2.6/doc/html/parsetools.epub index 4bffcfa6646c1d6f824cbc2f168f4af857d48b90..5b215fcb9f5b81256a6ae375543c09ba73117345 100644 GIT binary patch delta 16662 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 delta 16561 zcmZ|0bC4$A(kAB!bQ|+_(HYlUSKx{~|hKhl1q-Nj41L)ywldFdz2#Mb)*ZC#fPto11Q`dDQU;FB4VnBn zRj(hRlJn7o!)#QU#gf&T=BhYUAUAgpc3DX^b>>etP22m-ogF|5OO+wUp?ZaE8$$Gv z$q?-vi3#_COjtCmXa(ehT)ULwOtErh=%KtrCE__DLZI~JcA&OZ^lG?u8lw@9PwUh9 ziC3SWYyh}GtSU5wWaF^o@1RUH=Ke(Z#Hgj{AZZ>sx^lWnx8EbG;9wpy*l*&}1BQbo z4X7kixrZ>Vc~C%)1S(de#M)B4+MZzEwnXbJhrvIOC`5Y4UCk|PP%I7cNtRjrs@k`* zzZ521vqnJq-s|EHOrdBbAD*xFH<5=NT*Ilf0lV_O?7{&kb5eX!IYt?g1{_yyS#Oz2 zP#jO@c8Hc`^+Km}b~>`|hpDrPlej-#IiZ<-aFg-$Fu6O|b%bJ$-=Ugh%B!JxX=5$aqP@ZvN`H?IdfiD1yM^YC>~2~6eiu=_Ni*+c9_J}Fa~8%~yFpRANYW{a z)PD{9c;x-OeLOh*=xR=BA0uYkDab467W(M0?Wg3i9c`gU^=En;e}C5$RoC00OT z^QQJ2mZaLYze;r+iFRf0mSTW8q2C@G^k|SR&#}&A7X13j=*P&tt+nua&==Yw0`FHy zu<6XU5EH>{;GT}$ttJV6WF`up*~zhBqfFn7mDj4Us-FQUeLY z!Y|a)h6kGh51zR*7<4}Jd~mRd7dUuq-gnA~QpmFg^Hl=6Cb@P6g;aZz6h=r=GqyHK zeO8k*;|>>*DQV_vSa&UObHi`aCACKY(`HCG3LKb=$zm%nVX8P64`-$v)(BmX3Hz;A zUhoGWDB?_i584yCG>lsgm?C)JBrRocdnDT=zF!
    b5tsXThDc>P6fIQ_o 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 distinguished from all the terminal and non-terminal categories of the syntax rules. The Endsymbol can be declared in the grammar file.

    The simplest case is to segment the input string into a list of identifiers (atoms) and use those atoms both as categories and values of the tokens. For -example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    - {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is +example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    + {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is the distinguished end_of_input symbol.

    The Erlang scanner in the io module can be used as a starting point when writing a new scanner. Study yeccscan.erl in order to see how a filter can be added on top of io:scan_erl_form/3 to provide a scanner for Yecc that @@ -233,8 +233,8 @@

    element -> atom. element -> list.

    This grammar can be used to generate a parser which parses list expressions, such as (), (a), (peter charles), (a (b c) d (())), ... provided that your -scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    - {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as +scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    + {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as a grammatical phrase, the associated code is evaluated, and the value of the last expression becomes the value of the parsed phrase. This value may be used by the parser later to build structures that are values of higher phrases of @@ -246,8 +246,8 @@

    element -> atom : '$1'. element -> list : '$1'.

    With this code added to the grammar rules, the parser produces the following value (structure) when parsing the input string (a b c).. This still assumes -that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    -                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', +that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    +                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', '$3', and so on. which refer to (are bound to) the values associated previously by the parser with the symbols of the right-hand side of the rule. When these symbols are terminal categories, the @@ -270,12 +270,12 @@

    Generating a Parser

    -

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type +

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type (for example too ambiguous). Shift/reduce conflicts are resolved in favor of shifting if there are no operator precedence declarations. Refer to the yacc documentation on the use of operator precedence.

    The output file contains Erlang source code for a parser module with module name equal to the Parserfile parameter. After compilation, the parser can be called -as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included +as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included when generating the parser instead of the default file lib/parsetools/include/yeccpre.hrl.

    With the standard prologue, this call will return either {ok, Result}, where Result is a structure that the Erlang code of the grammar file has built, or @@ -284,15 +284,15 @@

    the screen. The user will have to do this either by printing the returned error messages, or by inserting tests and print instructions in the Erlang code associated with the syntax rules of the grammar file.

    It is also possible to make the parser ask for more input tokens when needed if -the following call format is used:

    myparser:parse_and_scan({Function, Args})
    -myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call +the following call format is used:

    myparser:parse_and_scan({Function, Args})
    +myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call apply(Function, Args) or apply({Mod, Tokenizer}, Args) is executed whenever a new token is needed. This, for example, makes it possible to parse from a file, token by token.

    The tokenizer used above has to be implemented so as to return one of the -following:

    {ok, Tokens, EndPosition}
    -{eof, EndPosition}
    -{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library +following:

    {ok, Tokens, EndPosition}
    +{eof, EndPosition}
    +{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library module.

    If {eof, EndPosition} is returned immediately, the call to parse_and_scan/1 returns {ok, eof}. If {eof, EndPosition} is returned before the parser expects end of input, parse_and_scan/1 will, of course, return an error @@ -342,36 +342,36 @@

    Endsymbol '$end'. grammar -> declaration : '$1'. grammar -> rule : '$1'. -declaration -> symbol symbols dot: {'$1', '$2'}. -rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], - '$4'}. +declaration -> symbol symbols dot: {'$1', '$2'}. +rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], + '$4'}. head -> symbol : '$1'. -symbols -> symbol : ['$1']. -symbols -> symbol symbols : ['$1' | '$2']. -attached_code -> ':' tokens : {erlang_code, '$2'}. -attached_code -> '$empty' : {erlang_code, - [{atom, 0, '$undefined'}]}. -tokens -> token : ['$1']. -tokens -> token tokens : ['$1' | '$2']. -symbol -> var : value_of('$1'). -symbol -> atom : value_of('$1'). -symbol -> integer : value_of('$1'). -symbol -> reserved_word : value_of('$1'). +symbols -> symbol : ['$1']. +symbols -> symbol symbols : ['$1' | '$2']. +attached_code -> ':' tokens : {erlang_code, '$2'}. +attached_code -> '$empty' : {erlang_code, + [{atom, 0, '$undefined'}]}. +tokens -> token : ['$1']. +tokens -> token tokens : ['$1' | '$2']. +symbol -> var : value_of('$1'). +symbol -> atom : value_of('$1'). +symbol -> integer : value_of('$1'). +symbol -> reserved_word : value_of('$1'). token -> var : '$1'. token -> atom : '$1'. token -> float : '$1'. token -> integer : '$1'. token -> string : '$1'. token -> char : '$1'. -token -> reserved_symbol : {value_of('$1'), line_of('$1')}. -token -> reserved_word : {value_of('$1'), line_of('$1')}. -token -> '->' : {'->', line_of('$1')}. -token -> ':' : {':', line_of('$1')}. +token -> reserved_symbol : {value_of('$1'), line_of('$1')}. +token -> reserved_word : {value_of('$1'), line_of('$1')}. +token -> '->' : {'->', line_of('$1')}. +token -> ':' : {':', line_of('$1')}. Erlang code. -value_of(Token) -> - element(3, Token). -line_of(Token) -> - element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are +value_of(Token) -> + element(3, Token). +line_of(Token) -> + element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are meta symbols of the grammar notation, as well as terminal symbols of the Yecc grammar.

    5. The file erl_parse.yrl in the lib/stdlib/src directory contains the grammar for Erlang.

    Note

    Syntactic tests are used in the code associated with some rules, and an error diff --git a/prs/8803/lib/public_key-1.16.1/doc/html/public_key.epub b/prs/8803/lib/public_key-1.16.1/doc/html/public_key.epub index 386c9cfe139bfc3495a69ebe6e25a18224243bc1..c773ccccadda7f8112c9f9bc4842bbdf06e7dd76 100644 GIT binary patch delta 38550 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 w_yTGE9f;|l?1>OTV82|tP delta 38668 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, CertChain, Optio or also by the user when the option policy_set is provided to this function. The qualifiers convey information about the valid policy and is intended as information to end users.

    Available options:

    Performs CRL validation. It is intended to be called from the verify fun of -pkix_path_validation/3 .

    Available options:

    • {update_crl, fun()} - The fun has the following type specification:

       fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
      -        #'CertificateList'{}

      The fun uses the information in the distribution point to access the latest +pkix_path_validation/3 .

      Available options:

      • {update_crl, fun()} - The fun has the following type specification:

         fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
        +        #'CertificateList'{}

        The fun uses the information in the distribution point to access the latest possible version of the CRL. If this fun is not specified, Public Key uses the default implementation:

         fun(_DP, CRL) -> CRL end
      • {issuer_fun, {fun(), UserState::term()}} - The fun has the following type -specification:

        fun(#'DistributionPoint'{}, #'CertificateList'{},
        -    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
        -  {ok, #'OTPCertificate'{}, [der_encoded]}

        The fun returns the root certificate and certificate chain that has signed the -CRL.

         fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
      • {undetermined_details, boolean()} - Defaults to false. When revocation +specification:

        fun(#'DistributionPoint'{}, #'CertificateList'{},
        +    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
        +  {ok, #'OTPCertificate'{}, [der_encoded]}

        The fun returns the root certificate and certificate chain that has signed the +CRL.

         fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
      • {undetermined_details, boolean()} - Defaults to false. When revocation status cannot be determined, and this option is set to true, details of why no CRLs where accepted are included in the return value.

      @@ -4051,18 +4051,18 @@

      pkix_test_data(ChainConf)

      generating an ECDSA key. Note this could fail if Erlang/OTP is compiled with a very old cryptolib.

    • {validity, {From::erlang:timestamp(), To::erlang:timestamp()}} - The validity period of the certificate.

    • {extensions, [#'Extension'{}]} - Extensions to include in the -certificate.

      Default extensions included in CA certificates if not otherwise specified are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      -              extnValue = [keyCertSign, cRLSign],
      -              critical = false},
      -#'Extension'{extnID = ?'id-ce-basicConstraints',
      -             extnValue = #'BasicConstraints'{cA = true},
      -             critical = true}]

      Default extensions included in the server peer cert if not otherwise specified -are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      -              extnValue = [digitalSignature, keyAgreement],
      -              critical = false},
      -#'Extension'{extnID = ?'id-ce-subjectAltName',
      -             extnValue = [{dNSName, Hostname}],
      -             critical = false}]

      Hostname is the result of calling net_adm:localhost() in the Erlang node where +certificate.

      Default extensions included in CA certificates if not otherwise specified are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      +              extnValue = [keyCertSign, cRLSign],
      +              critical = false},
      +#'Extension'{extnID = ?'id-ce-basicConstraints',
      +             extnValue = #'BasicConstraints'{cA = true},
      +             critical = true}]

      Default extensions included in the server peer cert if not otherwise specified +are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      +              extnValue = [digitalSignature, keyAgreement],
      +              critical = false},
      +#'Extension'{extnID = ?'id-ce-subjectAltName',
      +             extnValue = [{dNSName, Hostname}],
      +             critical = false}]

      Hostname is the result of calling net_adm:localhost() in the Erlang node where this function is called.

    Note

    Note that the generated certificates and keys does not provide a formally correct PKIX-trust-chain and they cannot be used to achieve real security. This function is provided for testing purposes only.

    diff --git a/prs/8803/lib/public_key-1.16.1/doc/html/public_key_records.html b/prs/8803/lib/public_key-1.16.1/doc/html/public_key_records.html index 52a0156159800..e640a12560d2e 100644 --- a/prs/8803/lib/public_key-1.16.1/doc/html/public_key_records.html +++ b/prs/8803/lib/public_key-1.16.1/doc/html/public_key_records.html @@ -129,7 +129,7 @@

    used to handle public key infrastructure. The scope is to describe the data types of each component, not the semantics. For information on the semantics, refer to the relevant standards and RFCs linked in the sections below.

    Use the following include directive to get access to the records and constant -macros described in the following sections:

     -include_lib("public_key/include/public_key.hrl").

    +macros described in the following sections:

     -include_lib("public_key/include/public_key.hrl").

    @@ -137,48 +137,48 @@

    Common non-standard Erlang data types used to describe the record fields in the following sections and which are not defined in the Public Key -Reference Manual follows here:

    time() = utc_time() | general_time()
    +Reference Manual follows here:

    time() = utc_time() | general_time()
     
    -utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
    +utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
     
    -general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
    +general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
     
    -general_name() = {rfc822Name, string()} |
    +general_name() = {rfc822Name, string()} |
     
    -                 {dNSName, string()} |
    +                 {dNSName, string()} |
     
    -                 {x400Address, string() |
    +                 {x400Address, string() |
     
    -                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
    +                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
     
    -                 {ediPartyName, special_string()} |
    +                 {ediPartyName, special_string()} |
     
    -                 {ediPartyName, special_string(), special_string()} |
    +                 {ediPartyName, special_string(), special_string()} |
     
    -                 {uniformResourceIdentifier, string()} |
    +                 {uniformResourceIdentifier, string()} |
     
    -                 {iPAddress, string()} |
    +                 {iPAddress, string()} |
     
    -                 {registeredId, oid()} |
    +                 {registeredId, oid()} |
     
    -                 {otherName, term()}
    +                 {otherName, term()}
     
    -special_string() = {teletexString, string()} |
    +special_string() = {teletexString, string()} |
      
    -                   {printableString, string()} |
    +                   {printableString, string()} |
     
    -                   {universalString, string()} |
    +                   {universalString, string()} |
     
    -                   {utf8String, binary()} |
    +                   {utf8String, binary()} |
     
    -                   {bmpString, string()}
    +                   {bmpString, string()}
     
    -dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
    +dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
                     cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise
     
    -OID_macro() = ?OID_name()
    +OID_macro() = ?OID_name()
     
    -OID_name() = atom()

    +OID_name() = atom()

    @@ -186,12 +186,12 @@

    Erlang representation of Rivest-Shamir-Adleman cryptosystem (RSA) -keys follows:

    #'RSAPublicKey'{
    +keys follows:

    #'RSAPublicKey'{
        modulus,       % pos_integer()
        publicExponent % pos_integer()
    -  }.
    +  }.
     
    -#'RSAPrivateKey'{
    +#'RSAPrivateKey'{
        version,         % two-prime | multi
        modulus,         % pos_integer()
        publicExponent,  % pos_integer()
    @@ -202,50 +202,50 @@ 

    exponent2, % pos_integer() coefficient, % pos_integer() otherPrimeInfos % [#OtherPrimeInfo{}] | asn1_NOVALUE - }. + }. -#'OtherPrimeInfo'{ +#'OtherPrimeInfo'{ prime, % pos_integer() exponent, % pos_integer() coefficient % pos_integer() - }. + }. -#'RSASSA-PSS-params'{ +#'RSASSA-PSS-params'{ hashAlgorithm, % #'HashAlgorithm'{}}, maskGenAlgorithm, % #'MaskGenAlgorithm'{}}, saltLength, % pos_integer(), trailerField, % pos_integer() - }. + }. -#'HashAlgorithm'{ +#'HashAlgorithm'{ algorithm, % oid() parameters % defaults to asn1_NOVALUE - }. + }. -#'MaskGenAlgorithm'{ +#'MaskGenAlgorithm'{ algorithm, % oid() parameters, % defaults to asn1_NOVALUE - }.

    + }.

    DSA

    Erlang representation of -Digital Signature Algorithm (DSA) keys

    #'DSAPrivateKey'{
    +Digital Signature Algorithm (DSA) keys

    #'DSAPrivateKey'{
        version,      % pos_integer()
        p,            % pos_integer()
        q,            % pos_integer()
        g,            % pos_integer()
        y,            % pos_integer()
        x             % pos_integer()
    -  }.
    +  }.
     
    -#'Dss-Parms'{
    +#'Dss-Parms'{
        p,         % pos_integer()
        q,         % pos_integer()
        g          % pos_integer()
    -  }.

    + }.

    @@ -256,38 +256,38 @@

    and Edwards-Curve Digital Signature Algorithm (EDDSA) where parameters in the private key will be -{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

    #'ECPrivateKey'{
    +{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

    #'ECPrivateKey'{
        version,       % pos_integer()
        privateKey,    % binary()
        parameters,    % {ecParameters, #'ECParameters'{}} |
                       % {namedCurve, Oid::tuple()} |
                       % {implicitlyCA, 'NULL'}
        publicKey      % bitstring()
    -  }.
    +  }.
     
    -#'ECParameters'{
    +#'ECParameters'{
        version,    % pos_integer()
        fieldID,    % #'FieldID'{}
        curve,      % #'Curve'{}
        base,       % binary()
        order,      % pos_integer()
        cofactor    % pos_integer()
    -  }.
    +  }.
     
    -#'Curve'{
    +#'Curve'{
        a,        % binary()
        b,        % binary()
        seed      % bitstring() - optional
    -  }.
    +  }.
     
    -#'FieldID'{
    +#'FieldID'{
        fieldType,    % oid()
        parameters    % Depending on fieldType
    -  }.
    +  }.
     
    -#'ECPoint'{
    +#'ECPoint'{
        point %  binary() - the public key
    -  }.

    + }.

    @@ -295,13 +295,13 @@

    Erlang representation of PKIX certificates derived from ASN.1 specifications see also X509 certificates (RFC 5280), also -referred to as plain type, are as follows:

    #'Certificate'{
    +referred to as plain type, are as follows:

    #'Certificate'{
        tbsCertificate,        % #'TBSCertificate'{}
        signatureAlgorithm,    % #'AlgorithmIdentifier'{}
        signature              % bitstring()
    -  }.
    +  }.
     
    -#'TBSCertificate'{
    +#'TBSCertificate'{
        version,              % v1 | v2 | v3
        serialNumber,         % pos_integer()
        signature,            % #'AlgorithmIdentifier'{}
    @@ -312,19 +312,19 @@ 

    issuerUniqueID, % binary() | asn1_novalue subjectUniqueID, % binary() | asn1_novalue extensions % [#'Extension'{}] - }. + }. -#'AlgorithmIdentifier'{ +#'AlgorithmIdentifier'{ algorithm, % oid() parameters % der_encoded() - }.

    Erlang alternate representation of PKIX certificate, also referred to as otp -type

    #'OTPCertificate'{
    +  }.

    Erlang alternate representation of PKIX certificate, also referred to as otp +type

    #'OTPCertificate'{
        tbsCertificate,        % #'OTPTBSCertificate'{}
        signatureAlgorithm,    % #'SignatureAlgorithm'
        signature              % bitstring()
    -  }.
    +  }.
     
    -#'OTPTBSCertificate'{
    +#'OTPTBSCertificate'{
        version,              % v1 | v2 | v3
        serialNumber,         % pos_integer()
        signature,            % #'SignatureAlgorithm'
    @@ -335,35 +335,35 @@ 

    issuerUniqueID, % binary() | asn1_novalue subjectUniqueID, % binary() | asn1_novalue extensions % [#'Extension'{}] - }. + }. -#'SignatureAlgorithm'{ +#'SignatureAlgorithm'{ algorithm, % id_signature_algorithm() parameters % asn1_novalue | #'Dss-Parms'{} - }.

    id_signature_algorithm() = OID_macro()

    The available OID names are as follows:

    OID Name
    id-dsa-with-sha1
    id-dsaWithSHA1 (ISO or OID to above)
    md2WithRSAEncryption
    md5WithRSAEncryption
    sha1WithRSAEncryption
    sha-1WithRSAEncryption (ISO or OID to above)
    sha224WithRSAEncryption
    sha256WithRSAEncryption
    sha512WithRSAEncryption
    ecdsa-with-SHA1

    Table: Signature Algorithm OIDs

    The data type 'AttributeTypeAndValue', is represented as the following erlang -record:

    #'AttributeTypeAndValue'{
    +  }.

    id_signature_algorithm() = OID_macro()

    The available OID names are as follows:

    OID Name
    id-dsa-with-sha1
    id-dsaWithSHA1 (ISO or OID to above)
    md2WithRSAEncryption
    md5WithRSAEncryption
    sha1WithRSAEncryption
    sha-1WithRSAEncryption (ISO or OID to above)
    sha224WithRSAEncryption
    sha256WithRSAEncryption
    sha512WithRSAEncryption
    ecdsa-with-SHA1

    Table: Signature Algorithm OIDs

    The data type 'AttributeTypeAndValue', is represented as the following erlang +record:

    #'AttributeTypeAndValue'{
        type,   % id_attributes()
        value   % term()
    -  }.

    The attribute OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-at-namespecial_string()
    id-at-surnamespecial_string()
    id-at-givenNamespecial_string()
    id-at-initialsspecial_string()
    id-at-generationQualifierspecial_string()
    id-at-commonNamespecial_string()
    id-at-localityNamespecial_string()
    id-at-stateOrProvinceNamespecial_string()
    id-at-organizationNamespecial_string()
    id-at-titlespecial_string()
    id-at-dnQualifier{printableString, string()}
    id-at-countryName{printableString, string()}
    id-at-serialNumber{printableString, string()}
    id-at-pseudonymspecial_string()

    Table: Attribute OIDs

    The data types 'Validity', 'SubjectPublicKeyInfo', and + }.

    The attribute OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-at-namespecial_string()
    id-at-surnamespecial_string()
    id-at-givenNamespecial_string()
    id-at-initialsspecial_string()
    id-at-generationQualifierspecial_string()
    id-at-commonNamespecial_string()
    id-at-localityNamespecial_string()
    id-at-stateOrProvinceNamespecial_string()
    id-at-organizationNamespecial_string()
    id-at-titlespecial_string()
    id-at-dnQualifier{printableString, string()}
    id-at-countryName{printableString, string()}
    id-at-serialNumber{printableString, string()}
    id-at-pseudonymspecial_string()

    Table: Attribute OIDs

    The data types 'Validity', 'SubjectPublicKeyInfo', and 'SubjectPublicKeyInfoAlgorithm' are represented as the following Erlang -records:

    #'Validity'{
    +records:

    #'Validity'{
        notBefore, % time()
        notAfter   % time()
    -  }.
    +  }.
     
    -#'SubjectPublicKeyInfo'{
    +#'SubjectPublicKeyInfo'{
        algorithm,       % #AlgorithmIdentifier{}
        subjectPublicKey % binary()
    -  }.
    +  }.
     
    -#'SubjectPublicKeyInfoAlgorithm'{
    +#'SubjectPublicKeyInfoAlgorithm'{
        algorithm,  % id_public_key_algorithm()
        parameters  % public_key_params()
    -  }.

    The public-key algorithm OID name atoms are as follows:

    OID Name
    rsaEncryption
    id-dsa
    dhpublicnumber
    id-keyExchangeAlgorithm
    id-ecPublicKey

    Table: Public-Key Algorithm OIDs

    #'Extension'{
    +  }.

    The public-key algorithm OID name atoms are as follows:

    OID Name
    rsaEncryption
    id-dsa
    dhpublicnumber
    id-keyExchangeAlgorithm
    id-ecPublicKey

    Table: Public-Key Algorithm OIDs

    #'Extension'{
        extnID,    % id_extensions() | oid()
        critical,  % boolean()
        extnValue  % der_encoded()
    -  }.

    id_extensions() + }.

    id_extensions() Standard Certificate Extensions, Private Internet Extensions, CRL Extensions and @@ -374,98 +374,98 @@

    Standard Certificate Extensions

    The standard certificate extensions OID name atoms and their corresponding value -types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier'{}
    id-ce-subjectKeyIdentifieroid()
    id-ce-keyUsage[key_usage()]
    id-ce-privateKeyUsagePeriod#'PrivateKeyUsagePeriod'{}
    id-ce-certificatePolicies#'PolicyInformation'{}
    id-ce-policyMappings#'PolicyMappings_SEQOF'{}
    id-ce-subjectAltNamegeneral_name()
    id-ce-issuerAltNamegeneral_name()
    id-ce-subjectDirectoryAttributes[#'Attribute'{}]
    id-ce-basicConstraints#'BasicConstraints'{}
    id-ce-nameConstraints#'NameConstraints'{}
    id-ce-policyConstraints#'PolicyConstraints'{}
    id-ce-extKeyUsage[id_key_purpose()]
    id-ce-cRLDistributionPoints[#'DistributionPoint'{}]
    id-ce-inhibitAnyPolicypos_integer()
    id-ce-freshestCRL[#'DistributionPoint'{}]

    Table: Standard Certificate Extensions

    Here:

    key_usage() = digitalSignature | nonRepudiation | keyEncipherment
    +types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier'{}
    id-ce-subjectKeyIdentifieroid()
    id-ce-keyUsage[key_usage()]
    id-ce-privateKeyUsagePeriod#'PrivateKeyUsagePeriod'{}
    id-ce-certificatePolicies#'PolicyInformation'{}
    id-ce-policyMappings#'PolicyMappings_SEQOF'{}
    id-ce-subjectAltNamegeneral_name()
    id-ce-issuerAltNamegeneral_name()
    id-ce-subjectDirectoryAttributes[#'Attribute'{}]
    id-ce-basicConstraints#'BasicConstraints'{}
    id-ce-nameConstraints#'NameConstraints'{}
    id-ce-policyConstraints#'PolicyConstraints'{}
    id-ce-extKeyUsage[id_key_purpose()]
    id-ce-cRLDistributionPoints[#'DistributionPoint'{}]
    id-ce-inhibitAnyPolicypos_integer()
    id-ce-freshestCRL[#'DistributionPoint'{}]

    Table: Standard Certificate Extensions

    Here:

    key_usage() = digitalSignature | nonRepudiation | keyEncipherment
                 | dataEncipherment | keyAgreement | keyCertSign
    -            | cRLSign | encipherOnly | decipherOnly

    And for id_key_purpose():

    OID Name
    id-kp-serverAuth
    id-kp-clientAuth
    id-kp-codeSigning
    id-kp-emailProtection
    id-kp-timeStamping
    id-kp-OCSPSigning

    Table: Key Purpose OIDs

    #'AuthorityKeyIdentifier'{
    +            | cRLSign | encipherOnly | decipherOnly

    And for id_key_purpose():

    OID Name
    id-kp-serverAuth
    id-kp-clientAuth
    id-kp-codeSigning
    id-kp-emailProtection
    id-kp-timeStamping
    id-kp-OCSPSigning

    Table: Key Purpose OIDs

    #'AuthorityKeyIdentifier'{
        keyIdentifier,            % oid()
        authorityCertIssuer,      % general_name()
        authorityCertSerialNumber % pos_integer()
    -  }.
    +  }.
     
    -#'PrivateKeyUsagePeriod'{
    +#'PrivateKeyUsagePeriod'{
        notBefore,   % general_time()
        notAfter     % general_time()
    -  }.
    +  }.
     
    -#'PolicyInformation'{
    +#'PolicyInformation'{
        policyIdentifier,  % oid()
        policyQualifiers   % [#PolicyQualifierInfo{}]
    -  }.
    +  }.
     
    -#'PolicyQualifierInfo'{
    +#'PolicyQualifierInfo'{
        policyQualifierId,   % oid()
        qualifier            % string() | #'UserNotice'{}
    -  }.
    +  }.
     
    -#'UserNotice'{
    +#'UserNotice'{
        noticeRef,   % #'NoticeReference'{}
        explicitText % string()
    -  }.
    +  }.
     
    -#'NoticeReference'{
    +#'NoticeReference'{
        organization,    % string()
        noticeNumbers    % [pos_integer()]
    -  }.
    +  }.
     
    -#'PolicyMappings_SEQOF'{
    +#'PolicyMappings_SEQOF'{
        issuerDomainPolicy,  % oid()
        subjectDomainPolicy  % oid()
    -  }.
    +  }.
     
    -#'Attribute'{
    +#'Attribute'{
        type,  % oid()
        values % [der_encoded()]
    -  }).
    +  }).
     
    -#'BasicConstraints'{
    +#'BasicConstraints'{
        cA,               % boolean()
        pathLenConstraint % pos_integer()
    -  }).
    +  }).
     
    -#'NameConstraints'{
    +#'NameConstraints'{
        permittedSubtrees, % [#'GeneralSubtree'{}]
        excludedSubtrees   % [#'GeneralSubtree'{}]
    -  }).
    +  }).
     
    -#'GeneralSubtree'{
    +#'GeneralSubtree'{
        base,    % general_name()
        minimum, % pos_integer()
        maximum  % pos_integer()
    -  }).
    +  }).
     
    -#'PolicyConstraints'{
    +#'PolicyConstraints'{
        requireExplicitPolicy, % pos_integer()
        inhibitPolicyMapping   % pos_integer()
    -  }).
    +  }).
     
    -#'DistributionPoint'{
    +#'DistributionPoint'{
        distributionPoint, % {fullName, [general_name()]} | {nameRelativeToCRLIssuer,[#AttributeTypeAndValue{}]}
        reasons,           % [dist_reason()]
        cRLIssuer          % [general_name()]
    -  }).

    + }).

    Private Internet Extensions

    The private internet extensions OID name atoms and their corresponding value -types are as follows:

    OID NameValue Type
    id-pe-authorityInfoAccess[#'AccessDescription'{}]
    id-pe-subjectInfoAccess[#'AccessDescription'{}]

    Table: Private Internet Extensions

    #'AccessDescription'{
    +types are as follows:

    OID NameValue Type
    id-pe-authorityInfoAccess[#'AccessDescription'{}]
    id-pe-subjectInfoAccess[#'AccessDescription'{}]

    Table: Private Internet Extensions

    #'AccessDescription'{
        accessMethod,    % oid()
        accessLocation   % general_name()
    -  }).

    + }).

    CRL and CRL Extensions Profile

    Erlang representation of CRL and CRL extensions profile derived from ASN.1 -specifications and RFC 5280 are as follows:

    #'CertificateList'{
    +specifications and RFC 5280 are as follows:

    #'CertificateList'{
        tbsCertList,        % #'TBSCertList{}
        signatureAlgorithm, % #'AlgorithmIdentifier'{}
        signature           % bitstring()
    -  }).
    +  }).
     
    -#'TBSCertList'{
    +#'TBSCertList'{
        version,             % v2 (if defined)
        signature,           % #AlgorithmIdentifier{}
        issuer,              % {rdnSequence, [#AttributeTypeAndValue'{}]}
    @@ -473,13 +473,13 @@ 

    nextUpdate, % time() revokedCertificates, % [#'TBSCertList_revokedCertificates_SEQOF'{}] crlExtensions % [#'Extension'{}] - }). + }). -#'TBSCertList_revokedCertificates_SEQOF'{ +#'TBSCertList_revokedCertificates_SEQOF'{ userCertificate, % pos_integer() revocationDate, % timer() crlEntryExtensions % [#'Extension'{}] - }).

    + }).

    @@ -487,21 +487,21 @@

    The CRL extensions OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier{}
    id-ce-issuerAltName{rdnSequence, [#AttributeTypeAndValue'{}]}
    id-ce-cRLNumberpos_integer()
    id-ce-deltaCRLIndicatorpos_integer()
    id-ce-issuingDistributionPoint#'IssuingDistributionPoint'{}
    id-ce-freshestCRL[#'Distributionpoint'{}]

    Table: CRL Extensions

    Here, the data type 'IssuingDistributionPoint' is represented as the following -Erlang record:

    #'IssuingDistributionPoint'{
    +Erlang record:

    #'IssuingDistributionPoint'{
        distributionPoint,         % {fullName, [general_name()]} | {nameRelativeToCRLIssuer, [#'AttributeTypeAndValue'{}]}
        onlyContainsUserCerts,     % boolean()
        onlyContainsCACerts,       % boolean()
        onlySomeReasons,           % [dist_reason()]
        indirectCRL,               % boolean()
        onlyContainsAttributeCerts % boolean()
    -  }).

    + }).

    CRL Entry Extensions

    The CRL entry extensions OID name atoms and their corresponding value types are -as follows:

    OID NameValue Type
    id-ce-cRLReasoncrl_reason()
    id-ce-holdInstructionCodeoid()
    id-ce-invalidityDategeneral_time()
    id-ce-certificateIssuergeneral_name()

    Table: CRL Entry Extensions

    Here:

        crl_reason() = unspecified | keyCompromise | cACompromise
    +as follows:

    OID NameValue Type
    id-ce-cRLReasoncrl_reason()
    id-ce-holdInstructionCodeoid()
    id-ce-invalidityDategeneral_time()
    id-ce-certificateIssuergeneral_name()

    Table: CRL Entry Extensions

    Here:

        crl_reason() = unspecified | keyCompromise | cACompromise
                      | affiliationChanged | superseded | cessationOfOperation
                      | certificateHold | removeFromCRL
                      | privilegeWithdrawn | aACompromise

    @@ -511,38 +511,38 @@

    PKCS#10 Certification Request

    Erlang representation of a PKCS#10 certification request derived from ASN.1 -specifications and RFC 5280 are as follows:

    #'CertificationRequest'{
    +specifications and RFC 5280 are as follows:

    #'CertificationRequest'{
        certificationRequestInfo, % #'CertificationRequestInfo'{},
        signatureAlgorithm,       % #'CertificationRequest_signatureAlgorithm'{}}.
        signature                 % bitstring()
    -  }.
    +  }.
     
    -#'CertificationRequestInfo'{
    +#'CertificationRequestInfo'{
        version,       % atom(),
        subject,       % {rdnSequence, [#AttributeTypeAndValue'{}]} ,
        subjectPKInfo, % #'CertificationRequestInfo_subjectPKInfo'{},
        attributes     % [#'AttributePKCS-10' {}]
    -  }.
    +  }.
     
    -#'CertificationRequestInfo_subjectPKInfo'{
    +#'CertificationRequestInfo_subjectPKInfo'{
        algorithm,        % #'CertificationRequestInfo_subjectPKInfo_algorithm'{}
        subjectPublicKey  %  bitstring()
    -  }.
    +  }.
     
    -#'CertificationRequestInfo_subjectPKInfo_algorithm'{
    +#'CertificationRequestInfo_subjectPKInfo_algorithm'{
        algorithm,  % oid(),
        parameters  % der_encoded()
    -  }.
    +  }.
     
    -#'CertificationRequest_signatureAlgorithm'{
    +#'CertificationRequest_signatureAlgorithm'{
        algorithm,  % oid(),
        parameters  % der_encoded()
    -  }.
    +  }.
     
    -#'AttributePKCS-10'{
    +#'AttributePKCS-10'{
        type,   % oid(),
        values  % [der_encoded()]
    -  }.

    +
    }.

    diff --git a/prs/8803/lib/public_key-1.16.1/doc/html/using_public_key.html b/prs/8803/lib/public_key-1.16.1/doc/html/using_public_key.html index 98980cd46a248..bace6bedb63fb 100644 --- a/prs/8803/lib/public_key-1.16.1/doc/html/using_public_key.html +++ b/prs/8803/lib/public_key-1.16.1/doc/html/using_public_key.html @@ -148,30 +148,30 @@

    DSA Private Key

    -

    A DSA private key can look as follows:

    Note

    File handling is not done by the Public Key application.

    1> {ok, PemBin} = file:read_file("dsa.pem").
    -{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

    The following PEM file has only one entry, a private DSA key:

    2>[DSAEntry] =  public_key:pem_decode(PemBin).
    -[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
    +

    A DSA private key can look as follows:

    Note

    File handling is not done by the Public Key application.

    1> {ok, PemBin} = file:read_file("dsa.pem").
    +{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

    The following PEM file has only one entry, a private DSA key:

    2>[DSAEntry] =  public_key:pem_decode(PemBin).
    +[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
                         179,230,217,37,99,144,157,21,228,204,
                         162,207,61,246,...>>,
    -                    not_encrypted}]
    3> Key = public_key:pem_entry_decode(DSAEntry).
    -#'DSAPrivateKey'{version = 0,
    +                    not_encrypted}]
    3> Key = public_key:pem_entry_decode(DSAEntry).
    +#'DSAPrivateKey'{version = 0,
                      p = 12900045185019966618...6593,
                      q = 1216700114794736143432235288305776850295620488937,
                      g = 10442040227452349332...47213,
                      y = 87256807980030509074...403143,
    -                 x = 510968529856012146351317363807366575075645839654}

    + x = 510968529856012146351317363807366575075645839654}

    RSA Private Key with Password

    -

    An RSA private key encrypted with a password can look as follows:

    1> {ok, PemBin} = file:read_file("rsa.pem").
    -{ok,<<"Bag Attribute"...>>}

    The following PEM file has only one entry, a private RSA key:

    2>[RSAEntry] = public_key:pem_decode(PemBin).
    -[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
    +

    An RSA private key encrypted with a password can look as follows:

    1> {ok, PemBin} = file:read_file("rsa.pem").
    +{ok,<<"Bag Attribute"...>>}

    The following PEM file has only one entry, a private RSA key:

    2>[RSAEntry] = public_key:pem_decode(PemBin).
    +[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
                         221,195,154,249,85,208,202,251,109,
                         119,120,57,29,89,19,9,...>>,
    -                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

    In this following example, the password is "abcd1234":

    3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
    -#'RSAPrivateKey'{version = 'two-prime',
    +                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

    In this following example, the password is "abcd1234":

    3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
    +#'RSAPrivateKey'{version = 'two-prime',
                      modulus = 1112355156729921663373...2737107,
                      publicExponent = 65537,
                      privateExponent = 58064406231183...2239766033,
    @@ -180,201 +180,201 @@ 

    exponent1 = 77928819327425934607...22152984217, exponent2 = 36287623121853605733...20588523793, coefficient = 924840412626098444...41820968343, - otherPrimeInfos = asn1_NOVALUE}

    + otherPrimeInfos = asn1_NOVALUE}

    X509 Certificates

    -

    The following is an example of X509 certificates:

    1> {ok, PemBin} = file:read_file("cacerts.pem").
    -{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

    The following file includes two certificates:

    2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
    -[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
    +

    The following is an example of X509 certificates:

    1> {ok, PemBin} = file:read_file("cacerts.pem").
    +{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

    The following file includes two certificates:

    2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
    +[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
                       9,0,230,145,97,214,191,2,120,150,48,13,
                       ...>>,
    -                not_encrypted},
    - {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
    +                not_encrypted},
    + {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
                       1,48,13,6,9,42,134,72,134,247,...>>,
    -                not_encrypted}]

    Certificates can be decoded as usual:

    2> Cert = public_key:pem_entry_decode(CertEntry1).
    -#'Certificate'{
    +                not_encrypted}]

    Certificates can be decoded as usual:

    2> Cert = public_key:pem_entry_decode(CertEntry1).
    +#'Certificate'{
         tbsCertificate =
    -        #'TBSCertificate'{
    +        #'TBSCertificate'{
                 version = v3,serialNumber = 16614168075301976214,
                 signature =
    -                #'AlgorithmIdentifier'{
    -                    algorithm = {1,2,840,113549,1,1,5},
    -                    parameters = <<5,0>>},
    +                #'AlgorithmIdentifier'{
    +                    algorithm = {1,2,840,113549,1,1,5},
    +                    parameters = <<5,0>>},
                 issuer =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,6},
    -                          value = <<19,2,83,69>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,6},
    +                          value = <<19,2,83,69>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
                 validity =
    -                #'Validity'{
    -                    notBefore = {utcTime,"080109082929Z"},
    -                    notAfter = {utcTime,"080208082929Z"}},
    +                #'Validity'{
    +                    notBefore = {utcTime,"080109082929Z"},
    +                    notAfter = {utcTime,"080208082929Z"}},
                 subject =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,6},
    -                          value = <<19,2,83,69>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,6},
    +                          value = <<19,2,83,69>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
                 subjectPublicKeyInfo =
    -                #'SubjectPublicKeyInfo'{
    +                #'SubjectPublicKeyInfo'{
                         algorithm =
    -                        #'AlgorithmIdentifier'{
    -                            algorithm = {1,2,840,113549,1,1,1},
    -                            parameters = <<5,0>>},
    +                        #'AlgorithmIdentifier'{
    +                            algorithm = {1,2,840,113549,1,1,1},
    +                            parameters = <<5,0>>},
                         subjectPublicKey =
    -                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
    +                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
                 issuerUniqueID = asn1_NOVALUE,
                 subjectUniqueID = asn1_NOVALUE,
                 extensions =
    -                [#'Extension'{
    -                     extnID = {2,5,29,19},
    +                [#'Extension'{
    +                     extnID = {2,5,29,19},
                          critical = true,
    -                     extnValue = [48,3,1,1,255]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,15},
    +                     extnValue = [48,3,1,1,255]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,15},
                          critical = false,
    -                     extnValue = [3,2,1,6]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,14},
    +                     extnValue = [3,2,1,6]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,14},
                          critical = false,
    -                     extnValue = [4,20,27,217,65,152,6,30,142|...]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,17},
    +                     extnValue = [4,20,27,217,65,152,6,30,142|...]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,17},
                          critical = false,
    -                     extnValue = [48,24,129,22,112,101,116,101|...]}]},
    +                     extnValue = [48,24,129,22,112,101,116,101|...]}]},
         signatureAlgorithm =
    -        #'AlgorithmIdentifier'{
    -            algorithm = {1,2,840,113549,1,1,5},
    -            parameters = <<5,0>>},
    +        #'AlgorithmIdentifier'{
    +            algorithm = {1,2,840,113549,1,1,5},
    +            parameters = <<5,0>>},
         signature =
         <<163,186,7,163,216,152,63,47,154,234,139,73,154,96,120,
    -    165,2,52,196,195,109,167,192,...>>}

    Parts of certificates can be decoded with public_key:der_decode/2, using the + 165,2,52,196,195,109,167,192,...>>}

    Parts of certificates can be decoded with public_key:der_decode/2, using the ASN.1 type of that part. However, an application-specific certificate extension requires application-specific ASN.1 decode/encode-functions. In the recent example, the first value of rdnSequence is of ASN.1 type -'X520CommonName'. ({2,5,4,3} = ?id-at-commonName):

    public_key:der_decode('X520CommonName', <<19,8,101,114,108,97,110,103,67,65>>).
    -{printableString,"erlangCA"}

    However, certificates can also be decoded using pkix_decode_cert/2, which can -customize and recursively decode standard parts of a certificate:

    3> {_, DerCert, _} = CertEntry1.
    4> public_key:pkix_decode_cert(DerCert, otp).
    -#'OTPCertificate'{
    +'X520CommonName'. ({2,5,4,3} = ?id-at-commonName):

    public_key:der_decode('X520CommonName', <<19,8,101,114,108,97,110,103,67,65>>).
    +{printableString,"erlangCA"}

    However, certificates can also be decoded using pkix_decode_cert/2, which can +customize and recursively decode standard parts of a certificate:

    3> {_, DerCert, _} = CertEntry1.
    4> public_key:pkix_decode_cert(DerCert, otp).
    +#'OTPCertificate'{
         tbsCertificate =
    -        #'OTPTBSCertificate'{
    +        #'OTPTBSCertificate'{
                 version = v3,serialNumber = 16614168075301976214,
                 signature =
    -                #'SignatureAlgorithm'{
    -                    algorithm = {1,2,840,113549,1,1,5},
    -                    parameters = 'NULL'},
    +                #'SignatureAlgorithm'{
    +                    algorithm = {1,2,840,113549,1,1,5},
    +                    parameters = 'NULL'},
                 issuer =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = {printableString,"erlangCA"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = {printableString,"Erlang OTP"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = {printableString,"Ericsson AB"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = {printableString,"Stockholm"}}],
    -                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = "peter@erix.ericsson.se"}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = {printableString,"erlangCA"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = {printableString,"Erlang OTP"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = {printableString,"Ericsson AB"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = {printableString,"Stockholm"}}],
    +                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = "peter@erix.ericsson.se"}]]},
                 validity =
    -                #'Validity'{
    -                    notBefore = {utcTime,"080109082929Z"},
    -                    notAfter = {utcTime,"080208082929Z"}},
    +                #'Validity'{
    +                    notBefore = {utcTime,"080109082929Z"},
    +                    notAfter = {utcTime,"080208082929Z"}},
                 subject =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = {printableString,"erlangCA"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = {printableString,"Erlang OTP"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = {printableString,"Ericsson AB"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = {printableString,"Stockholm"}}],
    -                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = "peter@erix.ericsson.se"}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = {printableString,"erlangCA"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = {printableString,"Erlang OTP"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = {printableString,"Ericsson AB"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = {printableString,"Stockholm"}}],
    +                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = "peter@erix.ericsson.se"}]]},
                 subjectPublicKeyInfo =
    -                #'OTPSubjectPublicKeyInfo'{
    +                #'OTPSubjectPublicKeyInfo'{
                         algorithm =
    -                        #'PublicKeyAlgorithm'{
    -                            algorithm = {1,2,840,113549,1,1,1},
    -                            parameters = 'NULL'},
    +                        #'PublicKeyAlgorithm'{
    +                            algorithm = {1,2,840,113549,1,1,1},
    +                            parameters = 'NULL'},
                         subjectPublicKey =
    -                        #'RSAPublicKey'{
    +                        #'RSAPublicKey'{
                                 modulus =
                                     1431267547247997...37419,
    -                            publicExponent = 65537}},
    +                            publicExponent = 65537}},
                 issuerUniqueID = asn1_NOVALUE,
                 subjectUniqueID = asn1_NOVALUE,
                 extensions =
    -                [#'Extension'{
    -                     extnID = {2,5,29,19},
    +                [#'Extension'{
    +                     extnID = {2,5,29,19},
                          critical = true,
                          extnValue =
    -                         #'BasicConstraints'{
    -                             cA = true,pathLenConstraint = asn1_NOVALUE}},
    -                 #'Extension'{
    -                     extnID = {2,5,29,15},
    +                         #'BasicConstraints'{
    +                             cA = true,pathLenConstraint = asn1_NOVALUE}},
    +                 #'Extension'{
    +                     extnID = {2,5,29,15},
                          critical = false,
    -                     extnValue = [keyCertSign,cRLSign]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,14},
    +                     extnValue = [keyCertSign,cRLSign]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,14},
                          critical = false,
    -                     extnValue = [27,217,65,152,6,30,142,132,245|...]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,17},
    +                     extnValue = [27,217,65,152,6,30,142,132,245|...]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,17},
                          critical = false,
    -                     extnValue = [{rfc822Name,"peter@erix.ericsson.se"}]}]},
    +                     extnValue = [{rfc822Name,"peter@erix.ericsson.se"}]}]},
         signatureAlgorithm =
    -        #'SignatureAlgorithm'{
    -            algorithm = {1,2,840,113549,1,1,5},
    -            parameters = 'NULL'},
    +        #'SignatureAlgorithm'{
    +            algorithm = {1,2,840,113549,1,1,5},
    +            parameters = 'NULL'},
         signature =
              <<163,186,7,163,216,152,63,47,154,234,139,73,154,96,120,
    -           165,2,52,196,195,109,167,192,...>>}

    This call is equivalent to public_key:pem_entry_decode(CertEntry1):

    5> public_key:pkix_decode_cert(DerCert, plain).
    -#'Certificate'{ ...}

    + 165,2,52,196,195,109,167,192,...>>}

    This call is equivalent to public_key:pem_entry_decode(CertEntry1):

    5> public_key:pkix_decode_cert(DerCert, plain).
    +#'Certificate'{ ...}

    @@ -385,17 +385,17 @@

    the result to a file. For example, assume that you have PubKey = 'RSAPublicKey'{}. Then you can create a PEM-"RSA PUBLIC KEY" file (ASN.1 type 'RSAPublicKey') or a PEM-"PUBLIC KEY" file -('SubjectPublicKeyInfo' ASN.1 type).

    The second element of the PEM-entry is the ASN.1 DER encoded key data:

    1> PemEntry = public_key:pem_entry_encode('RSAPublicKey', RSAPubKey).
    -{'RSAPublicKey', <<48,72,...>>, not_encrypted}
    +('SubjectPublicKeyInfo' ASN.1 type).

    The second element of the PEM-entry is the ASN.1 DER encoded key data:

    1> PemEntry = public_key:pem_entry_encode('RSAPublicKey', RSAPubKey).
    +{'RSAPublicKey', <<48,72,...>>, not_encrypted}
     
    -2> PemBin = public_key:pem_encode([PemEntry]).
    +2> PemBin = public_key:pem_encode([PemEntry]).
     <<"-----BEGIN RSA PUBLIC KEY-----\nMEgC...>>
     
     3> file:write_file("rsa_pub_key.pem", PemBin).
    -ok

    or:

    1> PemEntry = public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPubKey).
    -{'SubjectPublicKeyInfo', <<48,92...>>, not_encrypted}
    +ok

    or:

    1> PemEntry = public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPubKey).
    +{'SubjectPublicKeyInfo', <<48,92...>>, not_encrypted}
     
    -2> PemBin = public_key:pem_encode([PemEntry]).
    +2> PemBin = public_key:pem_encode([PemEntry]).
     <<"-----BEGIN PUBLIC KEY-----\nMFw...>>
     
     3> file:write_file("pub_key.pem", PemBin).
    @@ -405,9 +405,9 @@ 

    RSA Public-Key Cryptography

    -

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' and the plaintext Msg = binary()
    • PublicKey = #'RSAPublicKey'{}

    Then you can proceed as follows:

    Encrypt with the private key:

    RsaEncrypted = public_key:encrypt_private(Msg, PrivateKey),
    -Msg = public_key:decrypt_public(RsaEncrypted, PublicKey),

    Encrypt with the public key:

    RsaEncrypted = public_key:encrypt_public(Msg, PublicKey),
    -Msg = public_key:decrypt_private(RsaEncrypted, PrivateKey),

    Note

    You normally do only one of the encrypt or decrypt operations, and the peer +

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' and the plaintext Msg = binary()
    • PublicKey = #'RSAPublicKey'{}

    Then you can proceed as follows:

    Encrypt with the private key:

    RsaEncrypted = public_key:encrypt_private(Msg, PrivateKey),
    +Msg = public_key:decrypt_public(RsaEncrypted, PublicKey),

    Encrypt with the public key:

    RsaEncrypted = public_key:encrypt_public(Msg, PublicKey),
    +Msg = public_key:decrypt_private(RsaEncrypted, PrivateKey),

    Note

    You normally do only one of the encrypt or decrypt operations, and the peer does the other. This normally used in legacy applications as a primitive digital signature.

    Warning

    This legacy algorithm is broken although there exists a software prevention when using appropriate OpenSSL cryptolib with Erlang/OTP it is hard to @@ -418,12 +418,12 @@

    Digital Signatures

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' or #'DSAPrivateKey'{} and the plaintext -Msg = binary()
    • PublicKey = #'RSAPublicKey'{} or {integer(), #'DssParams'{}}

    Then you can proceed as follows:

    Signature = public_key:sign(Msg, sha, PrivateKey),
    -true = public_key:verify(Msg, sha, Signature, PublicKey),

    Note

    You normally do only one of the sign or verify operations, and the peer does +Msg = binary()

  • PublicKey = #'RSAPublicKey'{} or {integer(), #'DssParams'{}}
  • Then you can proceed as follows:

    Signature = public_key:sign(Msg, sha, PrivateKey),
    +true = public_key:verify(Msg, sha, Signature, PublicKey),

    Note

    You normally do only one of the sign or verify operations, and the peer does the other.

    It can be appropriate to calculate the message digest before calling sign or -verify, and then use none as second argument:

    Digest = crypto:sha(Msg),
    -Signature = public_key:sign(Digest, none, PrivateKey),
    -true = public_key:verify(Digest, none, Signature, PublicKey),

    +verify, and then use none as second argument:

    Digest = crypto:sha(Msg),
    +Signature = public_key:sign(Digest, none, PrivateKey),
    +true = public_key:verify(Digest, none, Signature, PublicKey),

    @@ -514,9 +514,9 @@

    Note

    Other applications like ssl/tls or https might have options that are passed down to the public_key:pkix_verify_hostname. You will probably not have to call it directly

    Suppose our client expects to connect to the web server https://www.example.net. -This URI is therefore the Reference IDs of the client. The call will be:

     public_key:pkix_verify_hostname(CertFromHost,
    -                                 [{uri_id, "https://www.example.net"}
    -                                 ]).

    The call will return true or false depending on the check. The caller do not +This URI is therefore the Reference IDs of the client. The call will be:

     public_key:pkix_verify_hostname(CertFromHost,
    +                                 [{uri_id, "https://www.example.net"}
    +                                 ]).

    The call will return true or false depending on the check. The caller do not need to handle the matching rules in the rfc. The matching will proceed as:

    • If there is a Subject Alternate Name field, the {uri_id,string()} in the function call will be compared to any {uniformResourceIdentifier,string()} in the Certificate field. If the two strings() are equal (case insensitive), @@ -539,25 +539,25 @@

      either a string/0 to be matched to each CN-name or the atom default which will invoke the default fqdn extraction function. The return value undefined removes the current URI from the fqdn extraction.

       ...
      - Extract = fun({uri_id, "myspecial://"++HostName}) -> HostName;
      -              (_Else) -> default
      + Extract = fun({uri_id, "myspecial://"++HostName}) -> HostName;
      +              (_Else) -> default
                  end,
        ...
      - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      -                                 [{fqdn_fun, Extract}])
      + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      +                                 [{fqdn_fun, Extract}])
        ...

      Re-defining the match operation

      The default matching handles dns_id and uri_id. In an uri_id the value is tested for equality with a value from the Subject Alternate Name. If some other kind of matching is needed, use the match_fun option.

      The match_fun takes two arguments and returns either true, false or default. The value default will invoke the default match function.

       ...
      - Match = fun({uri_id,"myspecial://"++A},
      -             {uniformResourceIdentifier,"myspecial://"++B}) ->
      -                                                    my_match(A,B);
      -            (_RefID, _PresentedID) ->
      + Match = fun({uri_id,"myspecial://"++A},
      +             {uniformResourceIdentifier,"myspecial://"++B}) ->
      +                                                    my_match(A,B);
      +            (_RefID, _PresentedID) ->
                                       default
                end,
        ...
      - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      -                                 [{match_fun, Match}]),
      + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      +                                 [{match_fun, Match}]),
        ...

      In case of a match operation between a ReferenceID and a CN value from the Subject field, the first argument to the fun is the extracted hostname from the ReferenceID, and the second argument is the tuple {cn, string()} taken @@ -578,19 +578,19 @@

      identifier. ..."

    The purpose is to have a mechanism for a human to accept an otherwise faulty Certificate. In for example a web browser, you could get a question like

    Warning: you wanted to visit the site www.example.com, but the certificate is for shop.example.com. Accept anyway (yes/no)?"

    This could be accomplished with the option fail_callback which will be called -if the hostname verification fails:

     -include_lib("public_key/include/public_key.hrl"). % Record def
    +if the hostname verification fails:

     -include_lib("public_key/include/public_key.hrl"). % Record def
      ...
    - Fail = fun(#'OTPCertificate'{}=C) ->
    -              case in_my_cache(C) orelse my_accept(C) of
    + Fail = fun(#'OTPCertificate'{}=C) ->
    +              case in_my_cache(C) orelse my_accept(C) of
                       true ->
    -                       enter_my_cache(C),
    +                       enter_my_cache(C),
                            true;
                       false ->
                            false
              end,
      ...
    - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
    -                                 [{fail_callback, Fail}]),
    + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
    +                                 [{fail_callback, Fail}]),
      ...

    diff --git a/prs/8803/lib/reltool-1.0.1/doc/html/reltool.epub b/prs/8803/lib/reltool-1.0.1/doc/html/reltool.epub index 3671921682460ef54ec87087b8e01b727e4d5530..bf420d12016974f3d8f8e3b37ccbdd959c17d93e 100644 GIT binary patch delta 18639 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%0Afk9|3IRdI{$Vhp*b~Z8nw@T@Y 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 delta 18617 zcmYJZ18^YG^1dD0wr$(?##Kr{vAB!3F|FbkEwS)f0lp+tt z{QqptL101X|20Bl{r^UOELBL@e=~KEpLbsCQ_}Gnfd6}|rH3~>2q?sVmizB*N?Xrq zlM5r@xqgqscr8$->Bm~UfgZ9$NHKUgmSUGNPFrxgbxe!|90lPh&Fiig&A3uibW^FX z;~mQ8QD?w0og(1V)c8Ki5V?_lXUM9#y}f^K#5!hf(zH5_bw@Xu=>YhVJn&@RZ}K;7Gz^ zC0As%s=~hwiaB~zR>;YE`y@0AP@=8NB&xgQ7xT}a^6xA$!V<}v@{qIJ$>N}DyO$=z4Ig55^_l#^5e&zL1DXeP<4G<;bb8%}olDnuGZ7!^HgbWtpJ`ZCqd z4YeE?#E?s)9esmc{QzgUomyjD*lcjL<`uI1WdV7DGHT<%8Xq?~FB z3kr~J(9w7}3rHMpQxZ7cGS_bpFZvu}OQ@O@*-x43(dBR2O_=tk{{}_%k^mt|W0NJ5 zLZ>M)qzGTi#3W=M zzn-ol?ii-E0RzF8#03UuNTouTqJq#l2Yopn41EdwRDucSVSzzNh)jj)4X8*?mHV;R zW$rPj7e+S6Lv2kd8_P0Br#Lk7RO2P>GI00jP_G3=66B!P9D17~^s+9fu|Ia$3Py|1 zQ>w-$`{_pR7J(jbpJUq^6SF6zjvkjk$Ezt&jS|_Ua$=fRR|FRzZ$}n6L)a3N#uY(2 z(QHYHwmq{gRu1uBvBNkaq?q%gP!?aIxJywA9y-$ekr0}3bEK^M9TYWL&wg_4@vpvU z2eRlH3w^qTKOLt)qv_e7eT?W2TDNegaXM*>-Nr<;%yA6*6WrL4{88NLnwut)YSpK4 zN|bJoggq6~yE~G6*old=wQ$NJ;B>x_ zTg8M$Fq`KV!p{&)W8u^D)7ez45GxP~VH%5g_Cqw}&BXzj&KvY&4_WQ4fF2#TTT@=r zcGO-f1K}8h3x{z`aEB%cw>bC3GOn_rr^6VR3g{oL-i1N`rJ4`JeunEOJ`R|#EkxZU0ceH$u=T*9C!MMRuh+i zM8DeXE|fK}<9>Ub!6iyBx0V3AA){+V=6ik3KhWS|Wv3V8=U+R0P)`r6U26{hf7sq7)^+qHPGtwSpDvX@!wNz8ezc3J1>$>jaME^y6N_5Iqtq-rRK_4;L| z>P``G9ku!WX7Hr6`{3%tto3%ZiuL*RF)qAQ*5dVv2tBa(rX;f4;_GiP6Jo^$`VszE z<>pafK601PZpwL%>%R!|jtv6x^|hp<;3T5%h`g>*I6&)pXt0TxTRu@_ZV^E}d8=|BNBrvDn z(Xqr?(8}@9n(JU$f+urJHA2dTGSGXKP}BI>C&R71*bJx(72(MQR>ZEOgH|Z6!%&@L8XLu3ufn3rG*cs zMRHZbVt+WOpuJNiMa4?3#j~OO=GDjJ&>LZgVXWkmxyV3nA5KxPQBh8~QE|Ta$77dY zmMevX3*GAYhpe_27AesRws_74{i;Jv$Y0u}+T|qWkV%>#&J^y}2#R%`cvxQta zV)zX=E0B(om}YHo$rb%fPB1AD0f-B%_T$gFg8<8^PBm|2_y=Gs#dnR$u#vK|ajj{I z5|m?1l~Hkx&<2^n6bJe++CIZ z5d1z8#L|eE$wGC{Sk$@zj3DKM$H79I%}kJ8k6&P+Qj2Vf&v;x6*ikH2R}q_65@~M9 z5j4oOA2ASXzye^jP=$daoqY_t=*1BIY!w;bEbDe3kT}h6U7hhzxx=>y+LQZ^kzm82v!_AWX9$lqSCE{a1ux_VXyL6S`@ z9OydOH))D=K=y4!>1Aq1+nZ-5_KM2qC7d#==Aw?64zTzK2tq3Rv6)@S{& zbFHmc&IfwOBMXPvy4Am9#fCGrAdwvmSa)!K0k{r!n42|IdQ`W6)I)_n^B;Scju>DB zZ^<5Ry~g~GZmjJJH_Jkf>6Gty3_3RIwRHu0)@fhi|FZ?BvZmv6STLlX{i7o#m*o^? z{&psM4wfa%S!hTS9f(#SDI+)(S6v$l5LQ;11Af1Zaxt(}FibD(W?Gpes+>k0b%;F& zxQcU=1$3<@z0olWuEo|H%R1BwVpLgZy+pAYknD{oWyq6@k-RiPj=ER4KDK8r{A z9hwWhKOF2Mkl%;n^Y+*TmYUEnep>lce&xD$=KJ5UVz`>Zb~?&6GH?Fb!+1~|y6rET z2i}9pzQDHa#f@J310Y7KM-KOQv~061Ry?lmC!tRh2!hAPEhUwplEhJXPZ7t*Ka$<- zJ8H6o-P>UJ#$WMHZqUQy@el)Nu*9hQ2>Hf;G4rXyIc-s(4l4@KJDP^#V|Ma$pBe7N z;_JzRI4>qlD-*v2SnKUOEy}4zl4N6w0uZRFVh~yK^j{F`a^U8_dAY&)U!Z6rKsILJ z3K=1kkw8N=wDGNTI2^{|i|oU!ttJ=%_y@ap8d_BIJRH$|r6+t5T-}4>LUl!(i2TM74JQpl z5Rb-(I{8ern%vWJKs&-cq00v?gT6z6(4Y+UgNh}Zts7|Gp^#yltDyiFO%5U%7wItX zzqw_=t1GF3VMFAgUld8SAsORHT<6daE1uG1c(+o?7iDf@-;BA)X->%kc3XtdU*y+b z5dY)4N15}Ei!2!7*FMn`*yu7XvKt(Y>whx#(26GHx5lz_AU1JpQLdE?P{3$Cf3s7o zn_@36T@4@e6wJPStR_U(!0R7*=cP}wNj|)Z7yGR&K)?B^$d)~lpP~8-KfP#4>@oy= z#Y!{TTCO#zY|k-Eemn!d_!50_k~VQP=WmJX_K`xZ;e=jg=Rc659;vg)Uugww&uJA~ z(zY}V^dhjv64D54ktTlKn%1j-;y$Pjt!|_zwzff9Gp;&n=Z*>q!${mWGV@7X#Bx7Ti9Hz!1(XzShiUwI*4_q5}ip~QFhG(D#kzC|!ZPspO!}J3PicB2q6{LHnm(Ir17B4UIjYbhFOqr0X3WLYozW$ywI(1o;S}R^%o!L zXK)?9gC2CknngAqXa#jx@Tik%kB!duHW!b-(F$DuwTJchW|8`2f45&Ibx5WKNwK)r z2<;I(#X}x`+=pDi)du=N6>S?M1I<6Wffspyfr}+0d5t+E)cT#3M%EaC4f9;fII-7w zGZ&i08o^o{DhmQ4RMd)UJmuOvwZ;TcpKywied!Yw6$)YrryjsC>3bF;&v`U%t;Nq;zo(!gqw05LV zx2cKxow^&PM7CB2G0cnTKOm1To@>L85!;eI>=d<_pNy5=t-9(sHo}rgky#AzGpAkl zx`>NqO$30XPA|1uxHi5~DK0&}D|dGr&Zi94+R>&oAcjfyFP&tDrtrjw?UUGCtNbbL z`W(4u)%6Dcw@J-@qDvg?7sM(P8 z!6Sf#wr1Ma8J@s#f7u|Aj4ZubqKF$y`!Rz^kq zb=6p$nVN-WL8KKN)i_1r`q~Kk3;-ct{|-XFzJ_%S5^`8jzF*fzdY`Dhz>sEEc)cf8 zi3v5hrV}VQxL#IX0`)f6uNYH47a;-?sPhxu?B`j_3)i}$t-T5E>cG2a+Trm-l?I); zyd>RU@rl&JkC$B|uS$T(+GtmCx86m(<@`kEusL~^^v|}x`^01wLzMveZ7+}H#ZQ0l%?Td)QpA4gi+ zH~3@Ed^`~;gr2)ja$1Ho)H6#ICDjie;#*e)fkgo&E?=nvtWQfNb2L|qKduf~&czZ( zBerQk_EpT<026R?#DW!{t^N@+)}CrGo$%I*PF*sG^-s+|M{Tw5^JU?0JO zpZWG@j}#rN_;L{3shN{vm?ctMp~jaq;ybug@35Ai=4$uULDL1#TQ>9UiG-FP5X}Ki zm5(WVE6jLaTxS$h_oZ^}L!C{GpM)-k(Df5eIoC0(TQ|+Bx9Ld-tDZJ#YXp9|P9LS1 zWUko-g`j}>I+uF?OjBA$5dX{&cQ!E%grC3Ky5VjiynM2`Y|zzi)eAR|(<;)Q_U6{J zQ1!&BVbsSB9BUlt=!W4a$e*wNlhUGnsK)5`{|4RR%>S})*gy6ii_u97bo$%OHx#3; zafIUql?DMNzEO4A&CQZiHG$&NaL7;$a|%$c9yed}veF9)hnJ<5AGmzqt3%f(-e0f+T(g84^ig%(E2tYKa`WhZ5O{0K!Ul01nX!VgfLz zu9;wX;y~VslX{8`9H^tghLaAk36j8RlO8Z4WXdtBjBhUk1yZ_6E`h(tzW((kH?o!*l}Jz7%36&s9E`!}od5xG<^ z#|n(?yb^(Qf24-i)nvuUZvEM}2r$6b`S%(9W856l)d=c1iXm)si zLOmZFBK_mWT3v^fF}5UX8X9ss*rn2h#B79qR+nCWe0sR41iMoCn;Pym4=?~X46t^5 zz&0x<4OgA32uFsAf`{>|eX>27+1QaJy2ThuGUZA3a@oo*l!3tV;$jfWm;@Q}t~Vmq^_8Sq(D3jGZ|cnAJ6j{M*h@b|wZ)Y3l={Z~STUq54@Vt3n$ zfe?$eq+?f>jX`pYQtp{HSDigwv7d4%E{YwcfR|5Vg5?<(%>MoQz-P>nRFOBk0y7JK zUrTQCaas`iSIt3JD3F4u&PQPu6-@^S#`GcnOvjvY*a*TAk;5+`aN;L$ zI<=aLLXv7!Si;#5Vj1CMDY8Mrh2-=IU}T4R&{(5~=g^SQ#xW@PEH10BV02&z;DgMP zZW;n%wbwkgFdcwO7@a+J{((x*!IF(}jH=6CSf|=CEskeq#q^Rd8g zWjYC&q1WGsqMbk4yBr(e`jl&=(>s?oyyz?OET+?9P*`JNTF+y=&F?hSmb!}_etIny zH3*m6WP}ghfX1+9JWhMd23P-m-)eu7?~>Epe3sveT;uw3P@l@+ z&)X6`PClvJZRvA9PVXK%8S3rQ_iV5liNCiP`b~!o?CTfycZv)gfeOGQmOK`04BCg@-czf1=Xn#?(v!OThp$~%E%?7-wdKt(R*fQFsIK2!BmatF#g z22yu|9vlIGj0wXJ=D5Fwk~lXa?wR86-ExR9EK;N7`Cg?phSE6uBJ%V=5%oZs_I!qc zm7uxh1_nt-@ApkQ1X8zy?rcE`Svs;)z~VGF=kvD9M!DrsFLPGq3wFqs6#Or7W~n&+ z^Q5rdXL>TCCk`<<*tXVmVK&7v$dzI|1&0(s^XzFCdV3QimIo&{f+qTCáV2E-o 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 diff --git a/prs/8803/lib/reltool-1.0.1/doc/html/reltool_examples.html b/prs/8803/lib/reltool-1.0.1/doc/html/reltool_examples.html index 35ea120ec64fb..0e3f9faa2d3d1 100644 --- a/prs/8803/lib/reltool-1.0.1/doc/html/reltool_examples.html +++ b/prs/8803/lib/reltool-1.0.1/doc/html/reltool_examples.html @@ -135,500 +135,500 @@

    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/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V9.0  (abort with ^G)
    +obtained with reltool:get_server/1

    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V9.0  (abort with ^G)
     1>
    -1> {ok, Win} = reltool:start([]).
    -{ok,<0.36.01>}
    -2> {ok, Server} = reltool:get_server(Win).
    -{ok,<0.37.01>}
    -3> reltool:get_config(Server).
    -{ok,{sys,[]}}
    +1> {ok, Win} = reltool:start([]).
    +{ok,<0.36.01>}
    +2> {ok, Server} = reltool:get_server(Win).
    +{ok,<0.37.01>}
    +3> reltool:get_config(Server).
    +{ok,{sys,[]}}
     4>
    -4> {ok, Server2} = reltool:start_server([]).
    -{ok,<0.6535.01>}
    -5> reltool:get_config(Server2).
    -{ok,{sys,[]}}
    -6> reltool:stop(Server2).
    +4> {ok, Server2} = reltool:start_server([]).
    +{ok,<0.6535.01>}
    +5> reltool:get_config(Server2).
    +{ok,{sys,[]}}
    +6> reltool:stop(Server2).
     ok

    Inspecting the configuration

    -
    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V9.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V9.0  (abort with ^G)
     1>
    -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}]}]}
    +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>
    -2> {ok, Server} = reltool:start_server([Config]).
    -{ok,<0.66.0>}
    +2> {ok, Server} = reltool:start_server([Config]).
    +{ok,<0.66.0>}
     3>
    -3> reltool:get_config(Server).
    -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {app,inets,[{incl_cond,include}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
    +3> reltool:get_config(Server).
    +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {app,inets,[{incl_cond,include}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
     4>
    -4> reltool:get_config(Server, false, false).
    -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {app,inets,[{incl_cond,include}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
    +4> reltool:get_config(Server, false, false).
    +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {app,inets,[{incl_cond,include}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
     5>
    -5> reltool:get_config(Server, true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {app,inets,
    -               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,development},
    -          {incl_sys_filters,[".*"]},
    -          {excl_sys_filters,[]},
    -          {incl_app_filters,[".*"]},
    -          {excl_app_filters,[]},
    -          {rel_app_type,...},
    -          {...}|...]}}
    +5> reltool:get_config(Server, true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {app,inets,
    +               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,development},
    +          {incl_sys_filters,[".*"]},
    +          {excl_sys_filters,[]},
    +          {incl_app_filters,[".*"]},
    +          {excl_app_filters,[]},
    +          {rel_app_type,...},
    +          {...}|...]}}
     6>
    -6> reltool:get_config(Server, true, true).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {erts,[{app,erts,
    -                      [{vsn,"10.0"},
    -                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
    -                       {mod,erl_prim_loader,[]},
    -                       {mod,erl_tracer,[]},
    -                       {mod,erlang,[]},
    -                       {mod,erts_code_purger,[]},
    -                       {mod,erts_dirty_process_signal_handler,[]},
    -                       {mod,erts_internal,[]},
    -                       {mod,erts_literal_area_collector,[]},
    -                       {mod,init,[]},
    -                       {mod,erl_init,...},
    -                       {mod,...},
    -                       {...}|...]}]},
    -          {app,compiler,
    -               [{vsn,"7.0.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
    -                {mod,beam_a,[]},
    -                {mod,beam_asm,[]},
    -                {mod,beam_block,[]},
    -                {mod,beam_bs,[]},
    -                {mod,beam_bsm,[]},
    -                {mod,beam_clean,[]},
    -                {mod,beam_dead,[]},
    -                {mod,beam_dict,[]},
    -                {mod,beam_disasm,[]},
    -                {mod,beam_except,[]},
    -                {mod,beam_flatten,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,crypto,
    -               [{vsn,"3.7.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/crypto-3.7.4"},
    -                {mod,crypto,[]},
    -                {mod,crypto_ec_curves,[]}]},
    -          {app,hipe,
    -               [{vsn,"3.15.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/hipe-3.15.4"},
    -                {mod,cerl_cconv,[]},
    -                {mod,cerl_closurean,[]},
    -                {mod,cerl_hipeify,[]},
    -                {mod,cerl_lib,[]},
    -                {mod,cerl_messagean,[]},
    -                {mod,cerl_pmatch,[]},
    -                {mod,cerl_prettypr,[]},
    -                {mod,cerl_to_icode,[]},
    -                {mod,cerl_typean,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,inets,
    -               [{incl_cond,include},
    -                {vsn,"6.3.9"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/inets-6.3.9"},
    -                {mod,ftp,[]},
    -                {mod,ftp_progress,[]},
    -                {mod,ftp_response,[]},
    -                {mod,ftp_sup,[]},
    -                {mod,http_chunk,[]},
    -                {mod,http_request,[]},
    -                {mod,http_response,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,kernel,
    -               [{vsn,"5.2"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/kernel-5.2"},
    -                {mod,application,[]},
    -                {mod,application_controller,[]},
    -                {mod,application_master,[]},
    -                {mod,application_starter,[]},
    -                {mod,auth,[]},
    -                {mod,code,[]},
    -                {mod,code_server,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,sasl,
    -               [{vsn,"3.0.3"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/sasl-3.0.3"},
    -                {mod,alarm_handler,[]},
    -                {mod,erlsrv,[]},
    -                {mod,format_lib_supp,[]},
    -                {mod,misc_supp,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,stdlib,
    -               [{vsn,"3.3"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/stdlib-3.3"},
    -                {mod,array,[]},
    -                {mod,base64,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,syntax_tools,[{incl_cond,exclude}]},
    -          {app,tools,
    -               [{vsn,"2.9.1"},{lib_dir,[...]},{mod,...},{...}|...]},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[...]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,...},
    -          {...}|...]}}
    +6> reltool:get_config(Server, true, true).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {erts,[{app,erts,
    +                      [{vsn,"10.0"},
    +                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
    +                       {mod,erl_prim_loader,[]},
    +                       {mod,erl_tracer,[]},
    +                       {mod,erlang,[]},
    +                       {mod,erts_code_purger,[]},
    +                       {mod,erts_dirty_process_signal_handler,[]},
    +                       {mod,erts_internal,[]},
    +                       {mod,erts_literal_area_collector,[]},
    +                       {mod,init,[]},
    +                       {mod,erl_init,...},
    +                       {mod,...},
    +                       {...}|...]}]},
    +          {app,compiler,
    +               [{vsn,"7.0.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
    +                {mod,beam_a,[]},
    +                {mod,beam_asm,[]},
    +                {mod,beam_block,[]},
    +                {mod,beam_bs,[]},
    +                {mod,beam_bsm,[]},
    +                {mod,beam_clean,[]},
    +                {mod,beam_dead,[]},
    +                {mod,beam_dict,[]},
    +                {mod,beam_disasm,[]},
    +                {mod,beam_except,[]},
    +                {mod,beam_flatten,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,crypto,
    +               [{vsn,"3.7.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/crypto-3.7.4"},
    +                {mod,crypto,[]},
    +                {mod,crypto_ec_curves,[]}]},
    +          {app,hipe,
    +               [{vsn,"3.15.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/hipe-3.15.4"},
    +                {mod,cerl_cconv,[]},
    +                {mod,cerl_closurean,[]},
    +                {mod,cerl_hipeify,[]},
    +                {mod,cerl_lib,[]},
    +                {mod,cerl_messagean,[]},
    +                {mod,cerl_pmatch,[]},
    +                {mod,cerl_prettypr,[]},
    +                {mod,cerl_to_icode,[]},
    +                {mod,cerl_typean,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,inets,
    +               [{incl_cond,include},
    +                {vsn,"6.3.9"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/inets-6.3.9"},
    +                {mod,ftp,[]},
    +                {mod,ftp_progress,[]},
    +                {mod,ftp_response,[]},
    +                {mod,ftp_sup,[]},
    +                {mod,http_chunk,[]},
    +                {mod,http_request,[]},
    +                {mod,http_response,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,kernel,
    +               [{vsn,"5.2"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/kernel-5.2"},
    +                {mod,application,[]},
    +                {mod,application_controller,[]},
    +                {mod,application_master,[]},
    +                {mod,application_starter,[]},
    +                {mod,auth,[]},
    +                {mod,code,[]},
    +                {mod,code_server,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,sasl,
    +               [{vsn,"3.0.3"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/sasl-3.0.3"},
    +                {mod,alarm_handler,[]},
    +                {mod,erlsrv,[]},
    +                {mod,format_lib_supp,[]},
    +                {mod,misc_supp,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,stdlib,
    +               [{vsn,"3.3"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/stdlib-3.3"},
    +                {mod,array,[]},
    +                {mod,base64,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,syntax_tools,[{incl_cond,exclude}]},
    +          {app,tools,
    +               [{vsn,"2.9.1"},{lib_dir,[...]},{mod,...},{...}|...]},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[...]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,...},
    +          {...}|...]}}
     7>
    -7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,embedded},
    -          {incl_sys_filters,["^bin","^erts","^lib","^releases"]},
    -          {excl_sys_filters,["^bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {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"]},
    -          {excl_app_filters,[]},
    -          {rel_app_type,permanent},
    -          {embedded_app_type,load},
    -          {app_file,keep},
    -          {debug_info,keep}]}}
    +                             "^erts.*/bin/.*(debug|pdb)"]},
    +          {incl_app_filters,["^ebin","^include","^priv"]},
    +          {excl_app_filters,[]},
    +          {rel_app_type,permanent},
    +          {embedded_app_type,load},
    +          {app_file,keep},
    +          {debug_info,keep}]}}
     8>
    -8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {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)$",
    +8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {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$"]},
    -          {rel_app_type,permanent},
    -          {app_file,keep},
    -          {debug_info,keep}]}}

    + "^erts.*/bin/.*(debug|pdb)"]}, + {incl_app_filters,["^ebin","^priv"]}, + {excl_app_filters,["^ebin/.*\\.appup$"]}, + {rel_app_type,permanent}, + {app_file,keep}, + {debug_info,keep}]}}

    Generate release and script files

    -
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V10.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V10.0  (abort with ^G)
     1>
    -1> {ok, Server} = reltool:start_server([{config,
    -                                         {sys,
    -                                          [{boot_rel, "NAME"},
    -                                           {rel, "NAME", "VSN",
    -                                            [sasl],
    -                                            [{load_dot_erlang, false}]}]}}]).
    -{ok,<0.1288.0>}
    +1> {ok, Server} = reltool:start_server([{config,
    +                                         {sys,
    +                                          [{boot_rel, "NAME"},
    +                                           {rel, "NAME", "VSN",
    +                                            [sasl],
    +                                            [{load_dot_erlang, false}]}]}}]).
    +{ok,<0.1288.0>}
     2>
    -2> reltool:get_config(Server).
    -{ok,{sys,[{boot_rel,"NAME"},
    -          {rel,"NAME","VSN",[sasl]}]}}
    +2> reltool:get_config(Server).
    +{ok,{sys,[{boot_rel,"NAME"},
    +          {rel,"NAME","VSN",[sasl]}]}}
     3>
    -3> reltool:get_rel(Server, "NAME").
    -{ok,{release,{"NAME","VSN"},
    -             {erts,"10.0"},
    -             [{kernel,"5.2"},{stdlib,"3.3"},{sasl,"3.0.3"}]}}
    +3> reltool:get_rel(Server, "NAME").
    +{ok,{release,{"NAME","VSN"},
    +             {erts,"10.0"},
    +             [{kernel,"5.2"},{stdlib,"3.3"},{sasl,"3.0.3"}]}}
     4>
    -4> reltool:get_script(Server, "NAME").
    -{ok,{script,{"NAME","VSN"},
    -            [{preLoaded,[erl_prim_loader,erl_tracer,erlang,
    +4> reltool:get_script(Server, "NAME").
    +{ok,{script,{"NAME","VSN"},
    +            [{preLoaded,[erl_prim_loader,erl_tracer,erlang,
                              erts_code_purger,erts_dirty_process_signal_handler,
                              erts_internal,erts_literal_area_collector,init,erl_init,
    -                         prim_eval,prim_file,prim_inet,prim_zip,zlib]},
    -             {progress,preloaded},
    -             {path,["$ROOT/lib/kernel-5.2/ebin",
    -                    "$ROOT/lib/stdlib-3.3/ebin"]},
    -             {primLoad,[error_handler]},
    -             {kernel_load_completed},
    -             {progress,kernel_load_completed},
    -             {path,["$ROOT/lib/kernel-5.2/ebin"]},
    -             {primLoad,[application,application_controller,
    +                         prim_eval,prim_file,prim_inet,prim_zip,zlib]},
    +             {progress,preloaded},
    +             {path,["$ROOT/lib/kernel-5.2/ebin",
    +                    "$ROOT/lib/stdlib-3.3/ebin"]},
    +             {primLoad,[error_handler]},
    +             {kernel_load_completed},
    +             {progress,kernel_load_completed},
    +             {path,["$ROOT/lib/kernel-5.2/ebin"]},
    +             {primLoad,[application,application_controller,
                             application_master,application_starter,auth,code,
                             code_server,disk_log,disk_log_1,disk_log_server,
    -                        disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},
    -             {path,["$ROOT/lib/stdlib-3.3/ebin"]},
    -             {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,
    -                        dets_server,dets_sup,dets_utils,dets_v9,dict|...]},
    -             {path,["$ROOT/lib/sasl-3.0.3/ebin"]},
    -             {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,
    +                        disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},
    +             {path,["$ROOT/lib/stdlib-3.3/ebin"]},
    +             {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,
    +                        dets_server,dets_sup,dets_utils,dets_v9,dict|...]},
    +             {path,["$ROOT/lib/sasl-3.0.3/ebin"]},
    +             {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,
                             rb,rb_format_supp,release_handler,release_handler_1,sasl,
    -                        sasl_report|...]},
    -             {progress,modules_loaded},
    -             {path,["$ROOT/lib/kernel-5.2/ebin",
    -                    "$ROOT/lib/stdlib-3.3/ebin","$ROOT/lib/sasl-3.0.3/ebin"]},
    -             {kernelProcess,heart,{heart,start,[]}},
    -             {kernelProcess,error_logger,{error_logger,start_link,[]}},
    -             {kernelProcess,application_controller,
    -                            {application_controller,start,[{...}]}},
    -             {progress,init_kernel_started},
    -             {apply,{application,load,[...]}},
    -             {apply,{application,load,...}},
    -             {progress,applications_loaded},
    -             {apply,{...}},
    -             {apply,...},
    -             {...}|...]}}
    +                        sasl_report|...]},
    +             {progress,modules_loaded},
    +             {path,["$ROOT/lib/kernel-5.2/ebin",
    +                    "$ROOT/lib/stdlib-3.3/ebin","$ROOT/lib/sasl-3.0.3/ebin"]},
    +             {kernelProcess,heart,{heart,start,[]}},
    +             {kernelProcess,error_logger,{error_logger,start_link,[]}},
    +             {kernelProcess,application_controller,
    +                            {application_controller,start,[{...}]}},
    +             {progress,init_kernel_started},
    +             {apply,{application,load,[...]}},
    +             {apply,{application,load,...}},
    +             {progress,applications_loaded},
    +             {apply,{...}},
    +             {apply,...},
    +             {...}|...]}}
     5>
    -5> reltool:stop(Server).
    +5> reltool:stop(Server).
     ok

    Create a target system

    -
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V10.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V10.0  (abort with ^G)
     1>
    -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}]}]}
    +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>
    -2> {ok, Spec} = reltool:get_target_spec([Config]).
    -{ok,[{create_dir,"releases",
    -         [{write_file,"start_erl.data","10.0 1.0\n"},
    -          {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,119,6,115,99,114,105,112,116,104,...>>},
    -               {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,119,6,115,99,114,105,...>>}]}]},
    -     {create_dir,"bin",
    -         [{copy_file,"display_args.escript",
    -              "/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args"},
    -          {copy_file,"display_args","erts-10.0/bin/escript"},
    -          {copy_file,"start","erts-10.0/bin/start"},
    -          {copy_file,"ct_run","erts-10.0/bin/ct_run"},
    -          {copy_file,"dialyzer","erts-10.0/bin/dialyzer"},
    -          {copy_file,"run_erl","erts-10.0/bin/run_erl"},
    -          {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    -          {copy_file,"to_erl","erts-10.0/bin/to_erl"},
    -          {copy_file,"epmd","erts-10.0/bin/epmd"},
    -          {copy_file,"erlc","erts-10.0/bin/erlc"},
    -          {copy_file,"typer","erts-10.0/bin/typer"},
    -          {copy_file,"escript","erts-10.0/bin/escript"},
    -          {write_file,"start_clean.boot",<<131,104,3,119,6,115,...>>},
    -          {write_file,"start_sasl.boot",<<131,104,3,119,6,...>>},
    -          {write_file,"start.boot",<<131,104,3,119,...>>}]},
    -     {copy_file,"Install"},
    -     {create_dir,"misc",
    -         [{copy_file,"format_man_pages"}]},
    -     {create_dir,"usr",
    -         [{create_dir,"lib",
    -              [{copy_file,"liberl_interface_st.a"},
    -               {copy_file,"libic.a"},
    -               {copy_file,"liberl_interface.a"},
    -               {copy_file,"libei_st.a"},
    -               {copy_file,"libei.a"}]},
    -          {create_dir,"include",
    -              [{copy_file,"driver_int.h"},
    -               {copy_file,"ei_connect.h"},
    -               {copy_file,"ei.h"},
    -               {copy_file,"erl_nif_api_funcs.h"},
    -               {copy_file,"erl_fixed_size_int_types.h"},
    -               {copy_file,"erl_int_sizes_config.h"},
    -               {copy_file,"erl_interface.h"},
    -               {copy_file,"eicode.h"},
    -               {copy_file,"erl_driver.h"},
    -               {copy_file,"erlang.idl"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}]}]},
    -     {create_dir,"erts-10.0",
    -         [{create_dir,"bin",
    -              [{copy_file,"start"},
    -               {copy_file,"ct_run"},
    -               {copy_file,"erlexec"},
    -               {copy_file,"dialyzer"},
    -               {copy_file,"beam.smp"},
    -               {copy_file,"run_erl"},
    -               {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    -               {copy_file,"to_erl"},
    -               {copy_file,"epmd"},
    -               {copy_file,"erl_child_setup"},
    -               {copy_file,"heart"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}|...]},
    -          {create_dir,"lib",
    -              [{create_dir,"internal",
    -                   [{copy_file,"liberts_internal.a"},
    -                    {copy_file,"liberts_internal_r.a"},
    -                    {copy_file,"libethread.a"},
    -                    {copy_file,"README"}]},
    -               ]},
    -          {create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]},
    -          {create_dir,"doc",[]},
    -          {create_dir,"man",[]},
    -          {create_dir,"include",
    -              [{create_dir,"internal",
    -                   [{create_dir,"i386",[{...}|...]},
    -                    {copy_file,"erl_errno.h"},
    -                    {copy_file,[...]},
    -                    {copy_file,...},
    -                    {...}|...]},
    -               {copy_file,"driver_int.h"},
    -               {copy_file,"erl_nif_api_funcs.h"},
    -               {copy_file,"erl_fixed_size_int_types.h"},
    -               {copy_file,"erl_int_sizes_config.h"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}]}]},
    -     {create_dir,"lib",
    -         [{create_dir,"compiler-7.0.4",
    -              [{create_dir,"src",
    -                   [{copy_file,"beam_flatten.erl"},
    -                    {copy_file,[...]},
    -                    {copy_file,...},
    -                    {...}|...]},
    -               {create_dir,"ebin",
    -                   [{copy_file,[...]},{copy_file,...},{...}|...]}]},
    -          {create_dir,"crypto-3.7.4",
    -              [{create_dir,"src",[{copy_file,[...]},{copy_file,...}]},
    -               {create_dir,"ebin",[{copy_file,...},{...}|...]}]},
    -          {create_dir,"crypto-3.7.4",
    -              [{create_dir,"priv",
    -                   [{create_dir,"lib",[{copy_file,[...]},{copy_file,...}]},
    -                    {create_dir,"obj",[{copy_file,...},{...}|...]}]}]},
    -          {create_dir,"erts-10.0",
    -              [{create_dir,"src",[{...}|...]},
    -               {create_dir,"ebin",[...]}]},
    -          {create_dir,"hipe-3.15.4",
    -              [{create_dir,"flow",[...]},
    -               {copy_file,[...]},
    -               {create_dir,...},
    -               {...}|...]},
    -          {create_dir,"inets-6.3.9",
    -              [{create_dir,[...],...},{create_dir,...},{...}]},
    -          {create_dir,"inets-6.3.9",
    -              [{create_dir,"priv",[{create_dir,[...],...}]},
    -               {create_dir,"include",[{copy_file,...},{...}]}]},
    -          {create_dir,"kernel-5.2",[{...}|...]},
    -          {create_dir,"kernel-5.2",
    -              [{create_dir,"include",[{...}|...]}]},
    -          {create_dir,[...],...},
    -          {create_dir,...},
    -          {create_dir,"stdlib-3.3",[{create_dir,...}]},
    -          ...]}]}
    +2> {ok, Spec} = reltool:get_target_spec([Config]).
    +{ok,[{create_dir,"releases",
    +         [{write_file,"start_erl.data","10.0 1.0\n"},
    +          {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,119,6,115,99,114,105,112,116,104,...>>},
    +               {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,119,6,115,99,114,105,...>>}]}]},
    +     {create_dir,"bin",
    +         [{copy_file,"display_args.escript",
    +              "/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args"},
    +          {copy_file,"display_args","erts-10.0/bin/escript"},
    +          {copy_file,"start","erts-10.0/bin/start"},
    +          {copy_file,"ct_run","erts-10.0/bin/ct_run"},
    +          {copy_file,"dialyzer","erts-10.0/bin/dialyzer"},
    +          {copy_file,"run_erl","erts-10.0/bin/run_erl"},
    +          {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    +          {copy_file,"to_erl","erts-10.0/bin/to_erl"},
    +          {copy_file,"epmd","erts-10.0/bin/epmd"},
    +          {copy_file,"erlc","erts-10.0/bin/erlc"},
    +          {copy_file,"typer","erts-10.0/bin/typer"},
    +          {copy_file,"escript","erts-10.0/bin/escript"},
    +          {write_file,"start_clean.boot",<<131,104,3,119,6,115,...>>},
    +          {write_file,"start_sasl.boot",<<131,104,3,119,6,...>>},
    +          {write_file,"start.boot",<<131,104,3,119,...>>}]},
    +     {copy_file,"Install"},
    +     {create_dir,"misc",
    +         [{copy_file,"format_man_pages"}]},
    +     {create_dir,"usr",
    +         [{create_dir,"lib",
    +              [{copy_file,"liberl_interface_st.a"},
    +               {copy_file,"libic.a"},
    +               {copy_file,"liberl_interface.a"},
    +               {copy_file,"libei_st.a"},
    +               {copy_file,"libei.a"}]},
    +          {create_dir,"include",
    +              [{copy_file,"driver_int.h"},
    +               {copy_file,"ei_connect.h"},
    +               {copy_file,"ei.h"},
    +               {copy_file,"erl_nif_api_funcs.h"},
    +               {copy_file,"erl_fixed_size_int_types.h"},
    +               {copy_file,"erl_int_sizes_config.h"},
    +               {copy_file,"erl_interface.h"},
    +               {copy_file,"eicode.h"},
    +               {copy_file,"erl_driver.h"},
    +               {copy_file,"erlang.idl"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}]}]},
    +     {create_dir,"erts-10.0",
    +         [{create_dir,"bin",
    +              [{copy_file,"start"},
    +               {copy_file,"ct_run"},
    +               {copy_file,"erlexec"},
    +               {copy_file,"dialyzer"},
    +               {copy_file,"beam.smp"},
    +               {copy_file,"run_erl"},
    +               {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    +               {copy_file,"to_erl"},
    +               {copy_file,"epmd"},
    +               {copy_file,"erl_child_setup"},
    +               {copy_file,"heart"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}|...]},
    +          {create_dir,"lib",
    +              [{create_dir,"internal",
    +                   [{copy_file,"liberts_internal.a"},
    +                    {copy_file,"liberts_internal_r.a"},
    +                    {copy_file,"libethread.a"},
    +                    {copy_file,"README"}]},
    +               ]},
    +          {create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]},
    +          {create_dir,"doc",[]},
    +          {create_dir,"man",[]},
    +          {create_dir,"include",
    +              [{create_dir,"internal",
    +                   [{create_dir,"i386",[{...}|...]},
    +                    {copy_file,"erl_errno.h"},
    +                    {copy_file,[...]},
    +                    {copy_file,...},
    +                    {...}|...]},
    +               {copy_file,"driver_int.h"},
    +               {copy_file,"erl_nif_api_funcs.h"},
    +               {copy_file,"erl_fixed_size_int_types.h"},
    +               {copy_file,"erl_int_sizes_config.h"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}]}]},
    +     {create_dir,"lib",
    +         [{create_dir,"compiler-7.0.4",
    +              [{create_dir,"src",
    +                   [{copy_file,"beam_flatten.erl"},
    +                    {copy_file,[...]},
    +                    {copy_file,...},
    +                    {...}|...]},
    +               {create_dir,"ebin",
    +                   [{copy_file,[...]},{copy_file,...},{...}|...]}]},
    +          {create_dir,"crypto-3.7.4",
    +              [{create_dir,"src",[{copy_file,[...]},{copy_file,...}]},
    +               {create_dir,"ebin",[{copy_file,...},{...}|...]}]},
    +          {create_dir,"crypto-3.7.4",
    +              [{create_dir,"priv",
    +                   [{create_dir,"lib",[{copy_file,[...]},{copy_file,...}]},
    +                    {create_dir,"obj",[{copy_file,...},{...}|...]}]}]},
    +          {create_dir,"erts-10.0",
    +              [{create_dir,"src",[{...}|...]},
    +               {create_dir,"ebin",[...]}]},
    +          {create_dir,"hipe-3.15.4",
    +              [{create_dir,"flow",[...]},
    +               {copy_file,[...]},
    +               {create_dir,...},
    +               {...}|...]},
    +          {create_dir,"inets-6.3.9",
    +              [{create_dir,[...],...},{create_dir,...},{...}]},
    +          {create_dir,"inets-6.3.9",
    +              [{create_dir,"priv",[{create_dir,[...],...}]},
    +               {create_dir,"include",[{copy_file,...},{...}]}]},
    +          {create_dir,"kernel-5.2",[{...}|...]},
    +          {create_dir,"kernel-5.2",
    +              [{create_dir,"include",[{...}|...]}]},
    +          {create_dir,[...],...},
    +          {create_dir,...},
    +          {create_dir,"stdlib-3.3",[{create_dir,...}]},
    +          ...]}]}
     3>
     3> TargetDir = "/tmp/my_target_dir".
     "/tmp/my_target_dir"
     4>
    -4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    -{error,"/tmp/my_target_dir: no such file or directory"}
    +4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +{error,"/tmp/my_target_dir: no such file or directory"}
     5>
    -5> file:make_dir(TargetDir).
    +5> file:make_dir(TargetDir).
     ok
     6>
    -6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
     ok
     7>
    -7> file:list_dir(TargetDir).
    -{ok,["bin","Install","lib","misc","usr","erts-10.0",
    -     "releases"]}
    +7> file:list_dir(TargetDir).
    +{ok,["bin","Install","lib","misc","usr","erts-10.0",
    +     "releases"]}
     8>
    -8> file:list_dir(filename:join([TargetDir,"lib"])).
    -{ok,["tools-2.9.1","inets-6.3.9",
    +8> file:list_dir(filename:join([TargetDir,"lib"])).
    +{ok,["tools-2.9.1","inets-6.3.9",
          "kernel-5.2","sasl-3.0.3",
          "crypto-3.7.4","erts-10.0",
    -     "stdlib-3.3","compiler-7.0.4"]}
    +     "stdlib-3.3","compiler-7.0.4"]}
     9>
    -9> file:make_dir("/tmp/yet_another_target_dir").
    +9> file:make_dir("/tmp/yet_another_target_dir").
     ok
     10>
    -10> reltool:create_target([Config], "/tmp/yet_another_target_dir").
    +10> reltool:create_target([Config], "/tmp/yet_another_target_dir").
     ok
     11>
    -11> file:list_dir("/tmp/yet_another_target_dir").
    -{ok,["bin","Install","lib","misc","usr","erts-10.0",
    -     "releases"]}
    +11>
    file:list_dir("/tmp/yet_another_target_dir"). +{ok,["bin","Install","lib","misc","usr","erts-10.0", + "releases"]}
    diff --git a/prs/8803/lib/runtime_tools-2.1/doc/html/dbg.html b/prs/8803/lib/runtime_tools-2.1/doc/html/dbg.html index b67e7582d8751..09052f2c4e208 100644 --- a/prs/8803/lib/runtime_tools-2.1/doc/html/dbg.html +++ b/prs/8803/lib/runtime_tools-2.1/doc/html/dbg.html @@ -131,16 +131,16 @@

    The Text Based Trace Facility

    This module implements a text based interface to the trace:process/4, trace:port/4, and trace:function/4 BIFs, simplifying tracing of functions, processes, ports, and messages.

    To quickly get started on tracing function calls you can use the -following code in the Erlang shell:

    1> dbg:tracer().  % Start the default trace message receiver
    -{ok,<0.90.0>}
    -2> dbg:p(all, c). % Set upp call tracing on all processes
    -{ok,[{matched,nonode@nohost,49}]}
    -3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
    -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
    -4> lists:seq(1, 10).
    -(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    -[1,2,3,4,5,6,7,8,9,10]
    -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

    The utilities are also suitable to use in system testing on large systems, where +following code in the Erlang shell:

    1> dbg:tracer().  % Start the default trace message receiver
    +{ok,<0.90.0>}
    +2> dbg:p(all, c). % Set upp call tracing on all processes
    +{ok,[{matched,nonode@nohost,49}]}
    +3> dbg:tp(lists, seq, cx). %  Set up call and exception tracing on lists:seq/2,3
    +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
    +4> lists:seq(1, 10).
    +(<0.88.0>) call lists:seq(1,10) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    +[1,2,3,4,5,6,7,8,9,10]
    +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]

    The utilities are also suitable to use in system testing on large systems, where other tools have too severe impact on the system performance. Some primitive support for sequential tracing is also included; see the advanced topics section.

    @@ -152,36 +152,36 @@

    To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). dbg:c/3 starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

    1> dbg:c(application, which_applications, []).
    -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
    -                                    [alias|
    -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
    -                                   which_applications} (Timestamp: {1710,
    +to application:which_applications/0:

    1> dbg:c(application, which_applications, []).
    +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
    +                                    [alias|
    +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
    +                                   which_applications} (Timestamp: {1710,
                                                                         847802,
    -                                                                    479222})
    -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
    -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
    -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
    -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
    -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
    +                                                                    479222})
    +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
    +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
    +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
    +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
    +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                        847802,
    -                                                                   479274})
    -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
    - {kernel,"ERTS  CXC 138 10","9.2.2"}]

    Four trace events are generated:

    • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

    Four trace events are generated:

    • A send event (!) for the sending of a request from the current process to the application_controller process.
    • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
    • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
    • A receive event (<<) when the current process retrieves the reply from the application_controller process.

    The dbg:c/4 function has a fourth argument for specifying the trace flags. -Here is how to only show message sending and receiving:

    2> dbg:c(application, which_applications, [], m).
    -(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
    -                                    [alias|
    -                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
    -                                   which_applications}
    -(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
    -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
    -                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
    -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
    - {kernel,"ERTS  CXC 138 10","9.2.2"}]

    +Here is how to only show message sending and receiving:

    2> dbg:c(application, which_applications, [], m).
    +(<0.96.0>) <0.45.0> ! {'$gen_call',{<0.96.0>,
    +                                    [alias|
    +                                     #Ref<0.0.12291.270031856.1478295555.230496>]},
    +                                   which_applications}
    +(<0.96.0>) << {[alias|#Ref<0.0.12291.270031856.1478295555.230496>],
    +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
    +                {kernel,"ERTS  CXC 138 10","9.2.2"}]}
    +[{stdlib,"ERTS  CXC 138 10","5.2.1"},
    + {kernel,"ERTS  CXC 138 10","9.2.2"}]

    @@ -189,35 +189,35 @@

    Another way of tracing from the shell is to explicitly start a tracer and set the trace flags of your choice on the processes you want to trace. -For example, here is how to trace messages and process events:

    1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
    +For example, here is how to trace messages and process events:

    1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
     <0.90.0>
    -2> dbg:tracer().
    -{ok,<0.92.0>}
    -3> dbg:p(Pid, [m,procs]).
    -{ok,[{matched,nonode@nohost,1}]}
    -4> Pid ! {self(),hello}.
    -(<0.90.0>) << {<0.88.0>,hello}
    -{<0.88.0>,hello}
    -(<0.90.0>) <0.88.0> ! hello
    -(<0.90.0>) exit normal
    -5> flush().
    +2> dbg:tracer().
    +{ok,<0.92.0>}
    +3> dbg:p(Pid, [m,procs]).
    +{ok,[{matched,nonode@nohost,1}]}
    +4> Pid ! {self(),hello}.
    +(<0.90.0>) << {<0.88.0>,hello}
    +{<0.88.0>,hello}
    +(<0.90.0>) <0.88.0> ! hello
    +(<0.90.0>) exit normal
    +5> flush().
     Shell got hello
     ok

    In order to trace functions call, in addition to enabling the call trace flag for the process, it is also necessary to set a trace pattern for the functions -to trace.

    Example:

    1> dbg:tracer().
    -{ok,<0.90.0>}
    -2> dbg:p(all, call).
    -{ok,[{matched,nonode@nohost,49}]}
    -3> dbg:tp(lists, last, 1, []).
    -{ok,[{matched,nonode@nohost,1}]}
    -4> lists:last([a,b,c,d,e]).
    -(<0.88.0>) call lists:last([a,b,c,d,e])
    +to trace.

    Example:

    1> dbg:tracer().
    +{ok,<0.90.0>}
    +2> dbg:p(all, call).
    +{ok,[{matched,nonode@nohost,49}]}
    +3> dbg:tp(lists, last, 1, []).
    +{ok,[{matched,nonode@nohost,1}]}
    +4> lists:last([a,b,c,d,e]).
    +(<0.88.0>) call lists:last([a,b,c,d,e])
     e
    -5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
    -{ok,[{matched,nonode@nohost,1},{saved,1}]}
    -6> lists:last([a,b,c,d,e]).
    -(<0.88.0>) call lists:last([a,b,c,d,e])
    -(<0.88.0>) returned from lists:last/1 -> e
    +5> dbg:tp(lists, last, 1, [{'_',[],[{return_trace}]}]).
    +{ok,[{matched,nonode@nohost,1},{saved,1}]}
    +6> lists:last([a,b,c,d,e]).
    +(<0.88.0>) call lists:last([a,b,c,d,e])
    +(<0.88.0>) returned from lists:last/1 -> e
     e

    @@ -231,21 +231,21 @@

    seq_trace and the same tracer function for both types of tracing can be used. The seq_trace messages can also be sent to a trace port for further analysis.

    As a match specification can turn on sequential tracing, the combination of dbg and seq_trace can be powerful. This brief example shows a session -where sequential tracing is used to trace the dbg module and the trace itself:

    1> dbg:tracer().
    -{ok,<0.30.0>}
    -2> {ok, Tracer} = dbg:get_tracer().
    -{ok,<0.31.0>}
    -3> seq_trace:set_system_tracer(Tracer).
    +where sequential tracing is used to trace the dbg module and the trace itself:

    1> dbg:tracer().
    +{ok,<0.30.0>}
    +2> {ok, Tracer} = dbg:get_tracer().
    +{ok,<0.31.0>}
    +3> seq_trace:set_system_tracer(Tracer).
     false
    -4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]).
    -{ok,[{matched,nonode@nohost,1},{saved,1}]}
    -5> dbg:p(all,call).
    -{ok,[{matched,nonode@nohost,22}]}
    -6> dbg:get_tracer(), seq_trace:set_token([]).
    -(<0.25.0>) call dbg:get_tracer()
    -SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}]
    -SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}]
    -{1,0,5,<0.30.0>,4}

    This session sets the system_tracer to the same process as the +4> dbg:tp(dbg, get_tracer, 0, [{[],[],[{set_seq_token, send, true}]}]). +{ok,[{matched,nonode@nohost,1},{saved,1}]} +5> dbg:p(all,call). +{ok,[{matched,nonode@nohost,22}]} +6> dbg:get_tracer(), seq_trace:set_token([]). +(<0.25.0>) call dbg:get_tracer() +SeqTrace [0]: (<0.25.0>) <0.30.0> ! {<0.25.0>,get_tracer} [Serial: {2,4}] +SeqTrace [0]: (<0.30.0>) <0.25.0> ! {dbg,{ok,<0.31.0>}} [Serial: {4,5}] +{1,0,5,<0.30.0>,4}

    This session sets the system_tracer to the same process as the ordinary tracer process (i. e. <0.31.0>) and sets the trace pattern for the function dbg:get_tracer to one that has the action of setting a sequential token. When the function is called by a traced @@ -267,20 +267,20 @@

    trace handler prints to the tty using an io function such as format/2. Note that when dbg:p(all, call) is called, IO processes are also traced. Here is an example:

    %% Using a default line editing shell
    -1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
    -{ok,<0.37.0>}
    -2> dbg:p(all, [call]).
    -{ok,[{matched,nonode@nohost,25}]}
    -3> dbg:tp(mymod,[{'_',[],[]}]).
    -{ok,[{matched,nonode@nohost,0},{saved,1}]}
    +1> dbg:tracer(process, {fun(Msg,_) -> io:format("~p~n", [Msg]), 0 end, 0}).
    +{ok,<0.37.0>}
    +2> dbg:p(all, [call]).
    +{ok,[{matched,nonode@nohost,25}]}
    +3> dbg:tp(mymod,[{'_',[],[]}]).
    +{ok,[{matched,nonode@nohost,0},{saved,1}]}
     4> mymod: % TAB pressed here
     %% -- Deadlock --

    Here is another example:

    %% Using a shell without line editing (oldshell)
    -1> dbg:tracer(process).
    -{ok,<0.31.0>}
    -2> dbg:p(all, [call]).
    -{ok,[{matched,nonode@nohost,25}]}
    -3> dbg:tp(lists,[{'_',[],[]}]).
    -{ok,[{matched,nonode@nohost,0},{saved,1}]}
    +1> dbg:tracer(process).
    +{ok,<0.31.0>}
    +2> dbg:p(all, [call]).
    +{ok,[{matched,nonode@nohost,25}]}
    +3> dbg:tp(lists,[{'_',[],[]}]).
    +{ok,[{matched,nonode@nohost,0},{saved,1}]}
     % -- Deadlock --

    The reason we get a deadlock in the first example is because when TAB is pressed to expand the function name, the group leader (which handles character input) calls mymod:module_info(). This generates a trace message which, in turn, @@ -2095,40 +2095,40 @@

    fun2ms(LiteralFun)

    as the argument of the function call; it cannot be held in a variable which in turn is passed to the function. Furthermore, the parse transform module ms_transform must be enabled. The easiest way to -enable it is by adding the following line to the source file:

    -include_lib("stdlib/include/ms_transform.hrl").

    Failing to include ms_transform.hrl in the source will result in a runtime +enable it is by adding the following line to the source file:

    -include_lib("stdlib/include/ms_transform.hrl").

    Failing to include ms_transform.hrl in the source will result in a runtime error, not a compile-time error.

    This function can also be invoked directly from the Erlang shell, as shown in the examples that follow.

    The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

    Examples:

    1> dbg:fun2ms(fun([_,_]) -> true end).
    -[{['_','_'],[],[true]}]
    -2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
    -[{'$1',[{'>',{length,'$1'},6}],[true]}]

    The first match specification matches when a function having two +will be used to match the arguments for the call:

    Examples:

    1> dbg:fun2ms(fun([_,_]) -> true end).
    +[{['_','_'],[],[true]}]
    +2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
    +[{'$1',[{'>',{length,'$1'},6}],[true]}]

    The first match specification matches when a function having two arguments is called. The second matches when a function with more than -6 arguments is called.

    Examples:

    1> dbg:fun2ms(fun(42) -> true end).
    +6 arguments is called.

    Examples:

    1> dbg:fun2ms(fun(42) -> true end).
     Error: dbg:fun2ms requires fun with single variable or list parameter
    -{error,transform_error}
    -2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
    +{error,transform_error}
    +2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
     Error: fun head contains bit syntax matching of variable 'H', which cannot be translated into match_spec
    -{error,transform_error}

    The preceding two examples show what happens when a fun cannot be +{error,transform_error}

    The preceding two examples show what happens when a fun cannot be translated into a match specification. In the first example, the fun head connot possibly match a list. In the second example, an attempt is made to take apart a binary using the bit syntax, which is currently not -supported in match specifications.

    However, note that literal binaries can be matched:

    1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
    -[{[<<"abc">>],[],[true]}]

    Match specifications support a large subset of the +supported in match specifications.

    However, note that literal binaries can be matched:

    1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
    +[{[<<"abc">>],[],[true]}]

    Match specifications support a large subset of the guard expressions supported -by Erlang, but not all. For example, updating a map is currently not supported:

    1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
    -Error: the language element map (in guard) cannot be translated into match_spec
    -{error,transform_error}

    However, creating a map in a guard is allowed:

    1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
    -[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

    Variables from the environment can be imported, so this works:

    1> X = 3.
    +by Erlang, but not all. For example, updating a map is currently not supported:

    1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
    +Error: the language element map (in guard) cannot be translated into match_spec
    +{error,transform_error}

    However, creating a map in a guard is allowed:

    1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
    +[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

    Variables from the environment can be imported, so this works:

    1> X = 3.
     3
    -2> dbg:fun2ms(fun([M,N]) when N > X  -> return_trace() end).
    -[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

    The imported variables will be replaced by const expressions, which +2> dbg:fun2ms(fun([M,N]) when N > X -> return_trace() end). +[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

    The imported variables will be replaced by const expressions, which is consistent with the static scoping for Erlang funs.

    In the body of the fun, only guard expressions and calls to the special functions for tracing -are allowed.

    Examples:

    1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
    -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
    -2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
    -Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
    -{error,transform_error}

    Warning

    If the parse transform is not applied to a module which calls dbg:fun2ms/1, +are allowed.

    Examples:

    1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
    +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
    +2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
    +Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
    +{error,transform_error}

    Warning

    If the parse transform is not applied to a module which calls dbg:fun2ms/1, the call will fail in runtime with a badarg exception.

    More information is available in the documentation for module ms_transform in STDLIB.

    @@ -2336,16 +2336,16 @@

    ltp()

    names, parameters, return values, and exceptions raised from functions

  • caller_trace, c - sets a trace that displays function names, parameters, and information about which function called it

  • caller_exception_trace, cx - combines exception_trace and -caller_trace

  • Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    -{ok,<0.90.0>}
    -2> dbg:tp(lists, seq, 2, cx).
    -{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    -3> dbg:p(self(), call).
    -{ok,[{matched,nonode@nohost,1}]}
    -4> lists:seq(1, 5).
    -(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    -[1,2,3,4,5]
    -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    +caller_trace

    Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    +{ok,<0.90.0>}
    +2> dbg:tp(lists, seq, 2, cx).
    +{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    +3> dbg:p(self(), call).
    +{ok,[{matched,nonode@nohost,1}]}
    +4> lists:seq(1, 5).
    +(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    +[1,2,3,4,5]
    +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    @@ -2543,37 +2543,37 @@

    session(Session, Fun)

    is provided.

    Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
    +from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 10).
    -(<0.89.0>) call lists:seq(1,10)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    -[1,2,3,4,5,6,7,8,9,10]
    -4> dbg:session_destroy(S).
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 10).
    +(<0.89.0>) call lists:seq(1,10)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    +[1,2,3,4,5,6,7,8,9,10]
    +4> dbg:session_destroy(S).
     ok

    The state of the session/0 is preserved in between session/2 calls, so -you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
    +you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
     %% Setup the initial traces
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
     %% Add an additional trace pattern
    -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
    +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
     ok
    -5> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) call lists:seq_loop(3,3,[])
    -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    -6> dbg:session_destroy(S).
    +5> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) call lists:seq_loop(3,3,[])
    +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
    +6> dbg:session_destroy(S).
     ok

    Note

    The session functionality is experimental in Erlang/OTP 27 and may change in future releases without notice.

    @@ -2747,11 +2747,11 @@

    tp(ModuleOrMFA, MatchSpec)

    and will stand as an "alias" for the given expression.

    If the match specification is invalid, an {error, Errors} tuple is returned. Errors is as a list of tuples {error, string()}, where the string is a textual explanation of the compilation error. For -example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    -{error,
    - [{error,"Special form 'message' called with wrong number of
    -          arguments in {message,two,arguments}."},
    -  {error,"Function noexist/1 does_not_exist."}]}
    +example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    +{error,
    + [{error,"Special form 'message' called with wrong number of
    +          arguments in {message,two,arguments}."},
    +  {error,"Function noexist/1 does_not_exist."}]}
    @@ -3002,17 +3002,17 @@

    trace_client(Type, Parameters)

    host Hostname, from where it reads trace messages until the TCP/IP connection is closed. If no Hostname is specified, the local host is assumed.

    As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

    On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
    +shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
     <0.17.0>
    -ant@stack> dbg:p(self(), send).
    -{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
    +another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
     <0.42.0>

    If we now send a message from the shell on the node ant@stack, where all sends -from the shell are traced:

    ant@stack> self() ! hello.
    +from the shell are traced:

    ant@stack> self() ! hello.
     hello

    The following will appear at the console on the node that started the trace -client:

    (<0.23.0>) <0.23.0> ! hello
    -(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. +client:

    (<0.23.0>) <0.23.0> ! hello
    +(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. The pids will vary.

    @@ -3096,7 +3096,7 @@

    trace_port(Type, Parameters)

    Creates a trace-port-generating fun that is suitable as the -second argument to tracer/2.

    Example:

    dbg:tracer(port, dbg:trace_port(ip, 4711)).

    A trace port is an Erlang port to a dynamically linked-in driver that +second argument to tracer/2.

    Example:

    dbg:tracer(port, dbg:trace_port(ip, 4711)).

    A trace port is an Erlang port to a dynamically linked-in driver that handles trace messages directly, without the overhead of sending them as messages to an Erlang process. Using a trace port significantly lowers the overhead imposed by tracing.

    Two trace drivers are currently implemented: the file and the ip diff --git a/prs/8803/lib/runtime_tools-2.1/doc/html/dyntrace.html b/prs/8803/lib/runtime_tools-2.1/doc/html/dyntrace.html index 83b2cff187d9e..1c6462612f5e3 100644 --- a/prs/8803/lib/runtime_tools-2.1/doc/html/dyntrace.html +++ b/prs/8803/lib/runtime_tools-2.1/doc/html/dyntrace.html @@ -857,14 +857,14 @@

    restore_tag(TagData)

    Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

    Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

    f() ->
    -    TagData = dyntrace:spread_tag(false),
    -    spawn(fun() ->
    -             dyntrace:restore_tag(TagData),
    -             do_something()
    -          end),
    -    do_something_else(),
    -    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

    f() ->
    +    TagData = dyntrace:spread_tag(false),
    +    spawn(fun() ->
    +             dyntrace:restore_tag(TagData),
    +             do_something()
    +          end),
    +    do_something_else(),
    +    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -911,12 +911,12 @@

    spread_tag(boolean())

    later call to restore_tag/1.

    The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

    The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

    f() ->
    -   {ok, F} = file:open("test.tst", [write]),
    -   Saved = dyntrace:spread_tag(true),
    -   io:format(F, "Hello world!", []),
    -   dyntrace:restore_tag(Saved),
    -   file:close(F).

    In this example, any user tag set in the calling process will be spread to the +example:

    f() ->
    +   {ok, F} = file:open("test.tst", [write]),
    +   Saved = dyntrace:spread_tag(true),
    +   io:format(F, "Hello world!", []),
    +   dyntrace:restore_tag(Saved),
    +   file:close(F).

    In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

    diff --git a/prs/8803/lib/runtime_tools-2.1/doc/html/instrument.html b/prs/8803/lib/runtime_tools-2.1/doc/html/instrument.html index dddddf41f5aa4..37a4399d9d04a 100644 --- a/prs/8803/lib/runtime_tools-2.1/doc/html/instrument.html +++ b/prs/8803/lib/runtime_tools-2.1/doc/html/instrument.html @@ -355,8 +355,8 @@

    block_histogram()

    the one before it.

    The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

    For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    +blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    @@ -496,30 +496,30 @@

    allocations(Options)

    block size histograms. Defaults to 128.

  • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

  • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

  • Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -596,15 +596,15 @@

    carriers(Options)

    tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    diff --git a/prs/8803/lib/runtime_tools-2.1/doc/html/lttng.html b/prs/8803/lib/runtime_tools-2.1/doc/html/lttng.html index ab24cbd6c85e3..2571af4407bfb 100644 --- a/prs/8803/lib/runtime_tools-2.1/doc/html/lttng.html +++ b/prs/8803/lib/runtime_tools-2.1/doc/html/lttng.html @@ -150,42 +150,42 @@

    Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and {tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    -

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    @@ -198,10 +198,10 @@

    Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng] Eshell V8.0 (abort with ^G) -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    diff --git a/prs/8803/lib/runtime_tools-2.1/doc/html/msacc.html b/prs/8803/lib/runtime_tools-2.1/doc/html/msacc.html
    index e0d525e10f642..054fc70070831 100644
    --- a/prs/8803/lib/runtime_tools-2.1/doc/html/msacc.html
    +++ b/prs/8803/lib/runtime_tools-2.1/doc/html/msacc.html
    @@ -131,9 +131,9 @@ 

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -141,11 +141,11 @@ 

    Thread aux check_io emulator gc other port sleep Stats per thread: - async( 0) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00% - async( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00% - aux( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99% - scheduler( 1) 0.00% 0.03% 0.13% 0.00% 0.01% 0.00% 99.82% - scheduler( 2) 0.00% 0.00% 0.00% 0.00% 0.03% 0.00% 99.97% + async( 0) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00% + async( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00% + aux( 1) 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 99.99% + scheduler( 1) 0.00% 0.03% 0.13% 0.00% 0.01% 0.00% 99.82% + scheduler( 2) 0.00% 0.00% 0.00% 0.00% 0.03% 0.00% 99.97% Stats per type: async 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 100.00% @@ -945,7 +945,7 @@

    print(DataOrStats, Options)

    this can be verbose. See the top of this reference manual for a brief description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    scheduler_wall_time.

    Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

    Note

    This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

    scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

    The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

    scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

    The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

    Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

    diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/appup.html b/prs/8803/lib/sasl-4.2.2/doc/html/appup.html index 3abafecfcc598..a97d8ef15c530 100644 --- a/prs/8803/lib/sasl-4.2.2/doc/html/appup.html +++ b/prs/8803/lib/sasl-4.2.2/doc/html/appup.html @@ -143,9 +143,9 @@

    Application is the application name. The file is to be located in the ebin directory for the application.

    The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

    {Vsn,
    -  [{UpFromVsn, Instructions}, ...],
    -  [{DownToVsn, Instructions}, ...]}.
    • Vsn = string() - Current application version.

    • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

      {Vsn,
      +  [{UpFromVsn, Instructions}, ...],
      +  [{DownToVsn, Instructions}, ...]}.
      • Vsn = string() - Current application version.

      • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

      • DownToVsn = string() | binary() - An earlier application version to @@ -221,21 +221,21 @@

        version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

      update with argument supervisor is used when changing the start -specification of a supervisor.

      {load_module, Mod}
      -{load_module, Mod, DepMods}
      -{load_module, Mod, PrePurge, PostPurge, DepMods}
      -  Mod = atom()
      +specification of a supervisor.

      {load_module, Mod}
      +{load_module, Mod, DepMods}
      +{load_module, Mod, PrePurge, PostPurge, DepMods}
      +  Mod = atom()
         PrePurge = PostPurge = soft_purge | brutal_purge
      -  DepMods = [Mod]

      Simple code replacement of the module Mod.

      For a description of PrePurge and PostPurge, see update above.

      DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

      Simple code replacement of the module Mod.

      For a description of PrePurge and PostPurge, see update above.

      DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

      {add_module, Mod}
      -{add_module, Mod, DepMods}
      -  Mod = atom()
      -  DepMods = [Mod]

      Loads a new module Mod.

      DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

      {add_module, Mod}
      +{add_module, Mod, DepMods}
      +  Mod = atom()
      +  DepMods = [Mod]

      Loads a new module Mod.

      DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

      {delete_module, Mod}
      -{delete_module, Mod, DepMods}
      -  Mod = atom()

      Deletes a module Mod using the low-level instructions remove and purge.

      DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

      {delete_module, Mod}
      +{delete_module, Mod, DepMods}
      +  Mod = atom()

      Deletes a module Mod using the low-level instructions remove and purge.

      DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

      {add_application, Application}
       {add_application, Application, Type}
      @@ -262,9 +262,9 @@ 

      Low-Level Instructions

      -
      {load_object_code, {App, Vsn, [Mod]}}
      -  App = Mod = atom()
      -  Vsn = string()

      Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +

      {load_object_code, {App, Vsn, [Mod]}}
      +  App = Mod = atom()
      +  Vsn = string()

      Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

      point_of_no_return

      If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -278,38 +278,38 @@

      PrePurge = PostPurge = soft_purge | brutal_purge

      Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

      {purge, [Mod]}
         Mod = atom()

      Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

      {suspend, [Mod | {Mod, Timeout}]}
      -  Mod = atom()
      -  Timeout = int()>0 | default | infinity

      Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

      {suspend, [Mod | {Mod, Timeout}]}
      +  Mod = atom()
      +  Timeout = int()>0 | default | infinity

      Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

      {resume, [Mod]}
      -  Mod = atom()

      Resumes all suspended processes using a module Mod.

      {code_change, [{Mod, Extra}]}
      -{code_change, Mode, [{Mod, Extra}]}
      -  Mod = atom()
      +  Mod = atom()

      Resumes all suspended processes using a module Mod.

      {code_change, [{Mod, Extra}]}
      +{code_change, Mode, [{Mod, Extra}]}
      +  Mod = atom()
         Mode = up | down
      -  Extra = term()

      Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

    Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

    {stop, [Mod]}
       Mod = atom()

    Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    -  Mod = atom()

    Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    -{sync_nodes, Id, {M, F, A}}
    -  Id = term()
    -  Node = node()
    -  M = F = atom()
    -  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

    {start, [Mod]}
    +  Mod = atom()

    Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

    {sync_nodes, Id, [Node]}
    +{sync_nodes, Id, {M, F, A}}
    +  Id = term()
    +  Node = node()
    +  M = F = atom()
    +  A = [term()]

    apply(M, F, A) must return a list of nodes.

    This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    -  M = F = atom()
    -  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

    {apply, {M, F, A}}
    +  M = F = atom()
    +  A = [term()]

    Evaluates apply(M, F, A).

    If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

    If the instruction appears after instruction point_of_no_return and the diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/error_logging.html b/prs/8803/lib/sasl-4.2.2/doc/html/error_logging.html index 49bf5dd396bd5..153ba016b6649 100644 --- a/prs/8803/lib/sasl-4.2.2/doc/html/error_logging.html +++ b/prs/8803/lib/sasl-4.2.2/doc/html/error_logging.html @@ -308,42 +308,42 @@

    Show Reports

    Use function rb:show(Number) to show details of a specific -report:

    7> rb:show(4).
    +report:

    7> rb:show(4).
     
     PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
     ===============================================================================
    -supervisor                                                     {local,sasl_sup}
    +supervisor                                                     {local,sasl_sup}
     started
    -[{pid,<0.24.0>},
    -{name,release_handler},
    -{mfa,{release_handler,start_link,[]}},
    -{restart_type,permanent},
    -{shutdown,2000},
    -{child_type,worker}]
    +[{pid,<0.24.0>},
    +{name,release_handler},
    +{mfa,{release_handler,start_link,[]}},
    +{restart_type,permanent},
    +{shutdown,2000},
    +{child_type,worker}]
     
     ok
    -8> rb:show(9).
    +8> rb:show(9).
     
     CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
     ===============================================================================
     Crashing process
     pid                                                                 <0.24.0>
     registered_name                                              release_handler
    -error_info                             {undef,{release_handler,mbj_func,[]}}
    +error_info                             {undef,{release_handler,mbj_func,[]}}
     initial_call
    -{gen,init_it,
    -[gen_server,
    +{gen,init_it,
    +[gen_server,
     <0.20.0>,
     <0.20.0>,
    -{erlang,register},
    +{erlang,register},
     release_handler,
     release_handler,
    -[],
    -[]]}
    -ancestors                                                [sasl_sup,<0.18.0>]
    -messages                                                                  []
    -links                                                    [<0.23.0>,<0.20.0>]
    -dictionary                                                                []
    +[],
    +[]]}
    +ancestors                                                [sasl_sup,<0.18.0>]
    +messages                                                                  []
    +links                                                    [<0.23.0>,<0.20.0>]
    +dictionary                                                                []
     trap_exit                                                              false
     status                                                               running
     heap_size                                                                610
    diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/rel.html b/prs/8803/lib/sasl-4.2.2/doc/html/rel.html
    index 124a733cd1252..7105baa5bf3e4 100644
    --- a/prs/8803/lib/sasl-4.2.2/doc/html/rel.html
    +++ b/prs/8803/lib/sasl-4.2.2/doc/html/rel.html
    @@ -140,11 +140,11 @@ 

    File Syntax

    The release resource file is to be called Name.rel.

    The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

    {release, {RelName,Vsn}, {erts, EVsn},
    -  [{Application, AppVsn} |
    -   {Application, AppVsn, Type} |
    -   {Application, AppVsn, IncApps} |
    -   {Application, AppVsn, Type, IncApps}]}.
    • RelName = string() - Release name.

    • Vsn = string() - Release version.

    • EVsn = string() - ERTS version the release is intended for.

    • Application = atom() - Name of an application included in the release.

    • AppVsn = string() - Version of an application included in the release.

    • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

      {release, {RelName,Vsn}, {erts, EVsn},
      +  [{Application, AppVsn} |
      +   {Application, AppVsn, Type} |
      +   {Application, AppVsn, IncApps} |
      +   {Application, AppVsn, Type, IncApps}]}.
      • RelName = string() - Release name.

      • Vsn = string() - Release version.

      • EVsn = string() - ERTS version the release is intended for.

      • Application = atom() - Name of an application included in the release.

      • AppVsn = string() - Version of an application included in the release.

      • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

        If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

        If Type = load, the application is only loaded.

        If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

        Defaults to permanent

      • IncApps = [atom()] - A list of applications that are included by an diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/release_handler.html b/prs/8803/lib/sasl-4.2.2/doc/html/release_handler.html index ec9a726af2f47..214a997363e85 100644 --- a/prs/8803/lib/sasl-4.2.2/doc/html/release_handler.html +++ b/prs/8803/lib/sasl-4.2.2/doc/html/release_handler.html @@ -1084,8 +1084,8 @@

        install_release(Vsn, [Opt])

        create_RELEASES/4 or set_unpacked/2.

        Example:

        In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        -=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then +as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        +=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

      Note

      Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/relup.html b/prs/8803/lib/sasl-4.2.2/doc/html/relup.html index 10759e768770d..6fcd989d902b4 100644 --- a/prs/8803/lib/sasl-4.2.2/doc/html/relup.html +++ b/prs/8803/lib/sasl-4.2.2/doc/html/relup.html @@ -143,9 +143,9 @@

      In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

      The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

      {Vsn,
      -  [{UpFromVsn, Descr, Instructions}, ...],
      -  [{DownToVsn, Descr, Instructions}, ...]}.
      • Vsn = string() - Current release version.

      • UpFromVsn = string() - Earlier version of the release to upgrade from.

      • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

        {Vsn,
        +  [{UpFromVsn, Descr, Instructions}, ...],
        +  [{DownToVsn, Descr, Instructions}, ...]}.
        • Vsn = string() - Current release version.

        • UpFromVsn = string() - Earlier version of the release to upgrade from.

        • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

        • Instructions - A list of low-level release upgrade instructions, see diff --git a/prs/8803/lib/sasl-4.2.2/doc/html/sasl.epub b/prs/8803/lib/sasl-4.2.2/doc/html/sasl.epub index 086c54a5ac687fb53bc94696bf8972f9b2c046ce..2b3f306a9c073ad419a1975c961d4c6fc46e745a 100644 GIT binary patch delta 16945 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

          YI?+9#3(q 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 File Syntax

    The boot script is stored in a file with extension .script. The file has the -following syntax:

    {script, {Name, Vsn},
    - [
    -  {progress, loading},
    -  {preLoaded, [Mod1, Mod2, ...]},
    -  {path, [Dir1,"$ROOT/Dir",...]}.
    -  {primLoad, [Mod1, Mod2, ...]},
    +following syntax:

    {script, {Name, Vsn},
    + [
    +  {progress, loading},
    +  {preLoaded, [Mod1, Mod2, ...]},
    +  {path, [Dir1,"$ROOT/Dir",...]}.
    +  {primLoad, [Mod1, Mod2, ...]},
       ...
    -  {kernel_load_completed},
    -  {progress, loaded},
    -  {kernelProcess, Name, {Mod, Func, Args}},
    +  {kernel_load_completed},
    +  {progress, loaded},
    +  {kernelProcess, Name, {Mod, Func, Args}},
       ...
    -  {apply, {Mod, Func, Args}},
    +  {apply, {Mod, Func, Args}},
       ...
    -  {progress, started}]}.
    • Name = string() - Defines the system name.

    • Vsn = string() - Defines the system version.

    • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    -

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify +

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    @@ -350,11 +350,11 @@

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    @@ -367,28 +367,28 @@

    that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    -
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_config_files.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_config_files.html index 24547f3974c82..b435dbcb16b52 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_config_files.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_config_files.html @@ -150,19 +150,19 @@

    The agent information should be stored in a file called agent.conf.

    Each entry is a tuple of size two:

    {AgentVariable, Value}.

    • AgentVariable is one of the variables in SNMP-FRAMEWORK-MIB or one of the internal variables intAgentUDPPort, which defines which UDP port the agent listens to, or intAgentTransports, which defines the transport domains and -addresses of the agent.
    • Value is the value for the variable.

    The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    -{intAgentTransports,
    - [{transportDomainUdpIpv4, {141,213,11,24}},
    -  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    -{snmpEngineID, "mbj's engine"}.
    -{snmpEngineMaxMessageSize, 484}.

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    -      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    -      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    -      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling +addresses of the agent.

  • Value is the value for the variable.
  • The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    +{intAgentTransports,
    + [{transportDomainUdpIpv4, {141,213,11,24}},
    +  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    +{snmpEngineID, "mbj's engine"}.
    +{snmpEngineMaxMessageSize, 484}.

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    +      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    +      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    +      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling both requests and traps) for a transport domain, its not possible to also specify a transport (for that domain) with a specific Kind. This is for -example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    -  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be +example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    +  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be configured.

    PortInfo system is used to indicate that the 'system' should choose (the way port number '0' (zero) is normally used). Port info '0' (zero) cannot be used for this, since it is (internally) used to represent the 'default' port number.

    In the traditional transport entries, when the Addr value does not contain a @@ -188,12 +188,12 @@

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or -snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    -{sysObjectID, [1,2,3]}.
    -{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    -{sysName, "test"}.
    -{sysServices, 72}.
    -{snmpEnableAuthenTraps, enabled}.

    A value must be provided for all variables, which lack default values in the +snmpEnableAuthenTraps.

  • Value is the value for the variable.
  • The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    +{sysObjectID, [1,2,3]}.
    +{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    +{sysName, "test"}.
    +{sysServices, 72}.
    +{snmpEnableAuthenTraps, enabled}.

    A value must be provided for all variables, which lack default values in the MIB.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_funct_descr.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_funct_descr.html index da0676c8e91ad..6e07372dd8f6c 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_funct_descr.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_agent_funct_descr.html @@ -308,7 +308,7 @@

    MIBs are always available in all contexts.

    The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

    The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

    @@ -469,9 +469,9 @@

    Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    -                       [, NotifyName, ContextName, Varbinds])
    -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, +following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    +                       [, NotifyName, ContextName, Varbinds])
    +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

    If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_app.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_app.html index 2217a0be6b09a..8d966d3a97d79 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_app.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_app.html @@ -140,51 +140,51 @@

    The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

    The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    -        ]
    +basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    +        ]
            }
           ].

    Each snmp component has its 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()}
    -      agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {discovery,        agent_discovery()}  |
    -                       {versions,         versions()}         |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      +      agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {discovery,        agent_discovery()}  |
      +                       {versions,         versions()}         |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_app_b.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_app_b.html index 244cc5814049f..cd3c5f24a1ddb 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_app_b.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_app_b.html @@ -586,23 +586,23 @@

        immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }

    + createAndGo(4), + createAndWait(5), + destroy(6) + }

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_config.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_config.html index 8721109165e74..755b205c10127 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_config.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_config.html @@ -145,41 +145,41 @@

    more information).
  • the database directory stores the internal database files.
  • The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be 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()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -556,34 +556,34 @@

        configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_generic.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_generic.html index dcbaa68fdfa3b..8e2e534939c6c 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_generic.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_generic.html @@ -140,9 +140,9 @@

          | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -150,7 +150,7 @@

          | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -162,41 +162,41 @@

        this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_impl_example_agent.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_impl_example_agent.html index 556bdc35a91b4..24ffa94377e71 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_impl_example_agent.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_impl_example_agent.html @@ -230,54 +230,54 @@

    the default implementation of it. Recall that MIBs imported by "EX1-MIB.mib" must be present and compiled in the current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when compiling.

    unix> erl -config ./sys
    -1> application:start(snmp).
    +1> application:start(snmp).
     ok
    -2> snmpc:compile("EX1-MIB").
    +2> snmpc:compile("EX1-MIB").
     No accessfunction for 'friendsTable', using default.
     No accessfunction for 'myName', using default.
    -{ok, "EX1-MIB.bin"}
    -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
    +{ok, "EX1-MIB.bin"}
    +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
     ok

    This MIB is now loaded into the agent, and a manager can ask questions. As an example of this, we start another Erlang system and the simple Erlang manager in -the toolkit:

    1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
    +the toolkit:

    1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
      %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
    -{ok, <0.89.0>}
    +{ok, <0.89.0>}
     %% a get-next request with one OID.
    -2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
    +2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
     ok
     * Got PDU:
    -[myName,0] = []
    +[myName,0] = []
     %% A set-request (now using symbolic names for convenience)
    -3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
    +3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
     ok
     * Got PDU:
    -[myName,0] = "Martin"
    +[myName,0] = "Martin"
     %% Try the same get-next request again
    -4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
    +4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
     ok
     * Got PDU:
    -[myName,0] = "Martin"
    +[myName,0] = "Martin"
     %% ... and we got the new value.
     %% you can event do row operations. How to add a row:
    -5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
    +5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
      %% createAndGo
     ok
     * Got PDU:
    -[fName,0] = "Martin"
    -[fAddress,0] = "home"
    -[fStatus,0] = 4
    -6> snmp_test_mgr:gn([[myName,0]]).
    +[fName,0] = "Martin"
    +[fAddress,0] = "home"
    +[fStatus,0] = 4
    +6> snmp_test_mgr:gn([[myName,0]]).
     ok
     * Got PDU:
    -[fName,0] = "Martin"
    -7> snmp_test_mgr:gn().
    +[fName,0] = "Martin"
    +7> snmp_test_mgr:gn().
     ok
     * Got PDU:
    -[fAddress,0] = "home"
    -8> snmp_test_mgr:gn().
    +[fAddress,0] = "home"
    +8> snmp_test_mgr:gn().
     ok
     * Got PDU:
    -[fStatus,0] = 1
    +[fStatus,0] = 1
     9>

    @@ -295,55 +295,55 @@

    Code

    -
    -module(ex1).
    --author('dummy@flop.org').
    +
    -module(ex1).
    +-author('dummy@flop.org').
     %% External exports
    --export([start/0, my_name/1, my_name/2, friends_table/3]).
    +-export([start/0, my_name/1, my_name/2, friends_table/3]).
     %% Internal exports
    --export([init/0]).
    --define(status_col, 4).
    --define(active, 1).
    --define(notInService, 2).
    --define(notReady, 3).
    --define(createAndGo, 4).   % Action; written, not read
    --define(createAndWait, 5). % Action; written, not read
    --define(destroy, 6).       % Action; written, not read
    -start() ->
    -    spawn(ex1, init, []).
    +-export([init/0]).
    +-define(status_col, 4).
    +-define(active, 1).
    +-define(notInService, 2).
    +-define(notReady, 3).
    +-define(createAndGo, 4).   % Action; written, not read
    +-define(createAndWait, 5). % Action; written, not read
    +-define(destroy, 6).       % Action; written, not read
    +start() ->
    +    spawn(ex1, init, []).
     %%----------------------------------------------------------------
     %% Instrumentation function for variable myName.
     %% Returns: (get) {value, Name}
     %%          (set) noError
     %%----------------------------------------------------------------
    -my_name(get) ->
    -    ex1_server ! {self(), get_my_name},
    -    Name = wait_answer(),
    -    {value, Name}.
    -my_name(set, NewName) ->
    -    ex1_server ! {self(), {set_my_name, NewName}},
    +my_name(get) ->
    +    ex1_server ! {self(), get_my_name},
    +    Name = wait_answer(),
    +    {value, Name}.
    +my_name(set, NewName) ->
    +    ex1_server ! {self(), {set_my_name, NewName}},
         noError.
     %%----------------------------------------------------------------
     %% Instrumentation function for table friendsTable.
     %%----------------------------------------------------------------
    -friends_table(get, RowIndex, Cols) ->
    -    case get_row(RowIndex) of
    -   {ok, Row} ->
    -        get_cols(Cols, Row);
    +friends_table(get, RowIndex, Cols) ->
    +    case get_row(RowIndex) of
    +   {ok, Row} ->
    +        get_cols(Cols, Row);
        _  ->
    -        {noValue, noSuchInstance}
    +        {noValue, noSuchInstance}
         end;
    -friends_table(get_next, RowIndex, Cols) ->
    -    case get_next_row(RowIndex) of
    -   {ok, Row} ->
    -        get_next_cols(Cols, Row);
    +friends_table(get_next, RowIndex, Cols) ->
    +    case get_next_row(RowIndex) of
    +   {ok, Row} ->
    +        get_next_cols(Cols, Row);
        _  ->
    -       case get_next_row([]) of
    -     {ok, Row} ->
    +       case get_next_row([]) of
    +     {ok, Row} ->
              % Get next cols from first row.
    -         NewCols = add_one_to_cols(Cols),
    -         get_next_cols(NewCols, Row);
    +         NewCols = add_one_to_cols(Cols),
    +         get_next_cols(NewCols, Row);
          _  ->
    -        end_of_table(Cols)
    +        end_of_table(Cols)
             end
         end;
     %%----------------------------------------------------------------
    @@ -354,158 +354,158 @@ 

    %% *) Otherwise, error (for simplicity). %% Otherwise, row is modified; check that row exists. %%---------------------------------------------------------------- -friends_table(is_set_ok, RowIndex, Cols) -> +friends_table(is_set_ok, RowIndex, Cols) -> RowExists = - case get_row(RowIndex) of - {ok, _Row} -> true; + case get_row(RowIndex) of + {ok, _Row} -> true; _ -> false end, - case is_row_status_col_changed(Cols) of - {true, ?destroy} when RowExists == true -> - {noError, 0}; - {true, ?createAndGo} when RowExists == false, - length(Cols) == 3 -> - {noError, 0}; - {true, _} -> - {inconsistentValue, ?status_col}; + case is_row_status_col_changed(Cols) of + {true, ?destroy} when RowExists == true -> + {noError, 0}; + {true, ?createAndGo} when RowExists == false, + length(Cols) == 3 -> + {noError, 0}; + {true, _} -> + {inconsistentValue, ?status_col}; false when RowExists == true -> - {noError, 0}; + {noError, 0}; _ -> - [{Col, _NewVal} | _Cols] = Cols, - {inconsistentName, Col} + [{Col, _NewVal} | _Cols] = Cols, + {inconsistentName, Col} end; -friends_table(set, RowIndex, Cols) -> - case is_row_status_col_changed(Cols) of - {true, ?destroy} -> - ex1_server ! {self(), {delete_row, RowIndex}}; - {true, ?createAndGo} -> - NewRow = make_row(RowIndex, Cols), - ex1_server ! {self(), {add_row, NewRow}}; +friends_table(set, RowIndex, Cols) -> + case is_row_status_col_changed(Cols) of + {true, ?destroy} -> + ex1_server ! {self(), {delete_row, RowIndex}}; + {true, ?createAndGo} -> + NewRow = make_row(RowIndex, Cols), + ex1_server ! {self(), {add_row, NewRow}}; false -> - {ok, Row} = get_row(RowIndex), - NewRow = merge_rows(Row, Cols), - ex1_server ! {self(), {delete_row, RowIndex}}, - ex1_server ! {self(), {add_row, NewRow}} + {ok, Row} = get_row(RowIndex), + NewRow = merge_rows(Row, Cols), + ex1_server ! {self(), {delete_row, RowIndex}}, + ex1_server ! {self(), {add_row, NewRow}} end, - {noError, 0}. + {noError, 0}. %%---------------------------------------------------------------- %% Make a list of {value, Val} of the Row and Cols list. %%---------------------------------------------------------------- -get_cols([Col | Cols], Row) -> - [{value, element(Col, Row)} | get_cols(Cols, Row)]; -get_cols([], _Row) -> - []. +get_cols([Col | Cols], Row) -> + [{value, element(Col, Row)} | get_cols(Cols, Row)]; +get_cols([], _Row) -> + []. %%---------------------------------------------------------------- %% As get_cols, but the Cols list may contain invalid column %% numbers. If it does, we must find the next valid column, %% or return endOfTable. %%---------------------------------------------------------------- -get_next_cols([Col | Cols], Row) when Col < 2 -> - [{[2, element(1, Row)], element(2, Row)} | - get_next_cols(Cols, Row)]; -get_next_cols([Col | Cols], Row) when Col > 4 -> - [endOfTable | - get_next_cols(Cols, Row)]; -get_next_cols([Col | Cols], Row) -> - [{[Col, element(1, Row)], element(Col, Row)} | - get_next_cols(Cols, Row)]; -get_next_cols([], _Row) -> - []. +get_next_cols([Col | Cols], Row) when Col < 2 -> + [{[2, element(1, Row)], element(2, Row)} | + get_next_cols(Cols, Row)]; +get_next_cols([Col | Cols], Row) when Col > 4 -> + [endOfTable | + get_next_cols(Cols, Row)]; +get_next_cols([Col | Cols], Row) -> + [{[Col, element(1, Row)], element(Col, Row)} | + get_next_cols(Cols, Row)]; +get_next_cols([], _Row) -> + []. %%---------------------------------------------------------------- %% Make a list of endOfTable with as many elems as Cols list. %%---------------------------------------------------------------- -end_of_table([Col | Cols]) -> - [endOfTable | end_of_table(Cols)]; -end_of_table([]) -> - []. -add_one_to_cols([Col | Cols]) -> - [Col + 1 | add_one_to_cols(Cols)]; -add_one_to_cols([]) -> - []. -is_row_status_col_changed(Cols) -> - case lists:keysearch(?status_col, 1, Cols) of - {value, {?status_col, StatusVal}} -> - {true, StatusVal}; +end_of_table([Col | Cols]) -> + [endOfTable | end_of_table(Cols)]; +end_of_table([]) -> + []. +add_one_to_cols([Col | Cols]) -> + [Col + 1 | add_one_to_cols(Cols)]; +add_one_to_cols([]) -> + []. +is_row_status_col_changed(Cols) -> + case lists:keysearch(?status_col, 1, Cols) of + {value, {?status_col, StatusVal}} -> + {true, StatusVal}; _ -> false end. -get_row(RowIndex) -> - ex1_server ! {self(), {get_row, RowIndex}}, - wait_answer(). -get_next_row(RowIndex) -> - ex1_server ! {self(), {get_next_row, RowIndex}}, - wait_answer(). -wait_answer() -> +get_row(RowIndex) -> + ex1_server ! {self(), {get_row, RowIndex}}, + wait_answer(). +get_next_row(RowIndex) -> + ex1_server ! {self(), {get_next_row, RowIndex}}, + wait_answer(). +wait_answer() -> receive - {ex1_server, Answer} -> + {ex1_server, Answer} -> Answer end. %%%--------------------------------------------------------------- %%% Server code follows %%%--------------------------------------------------------------- -init() -> - register(ex1_server, self()), - loop("", []). +init() -> + register(ex1_server, self()), + loop("", []). -loop(MyName, Table) -> +loop(MyName, Table) -> receive - {From, get_my_name} -> - From ! {ex1_server, MyName}, - loop(MyName, Table); - {From, {set_my_name, NewName}} -> - loop(NewName, Table); - {From, {get_row, RowIndex}} -> - Res = table_get_row(Table, RowIndex), - From ! {ex1_server, Res}, - loop(MyName, Table); - {From, {get_next_row, RowIndex}} -> - Res = table_get_next_row(Table, RowIndex), - From ! {ex1_server, Res}, - loop(MyName, Table); - {From, {delete_row, RowIndex}} -> - NewTable = table_delete_row(Table, RowIndex), - loop(MyName, NewTable); - {From, {add_row, NewRow}} -> - NewTable = table_add_row(Table, NewRow), - loop(MyName, NewTable) + {From, get_my_name} -> + From ! {ex1_server, MyName}, + loop(MyName, Table); + {From, {set_my_name, NewName}} -> + loop(NewName, Table); + {From, {get_row, RowIndex}} -> + Res = table_get_row(Table, RowIndex), + From ! {ex1_server, Res}, + loop(MyName, Table); + {From, {get_next_row, RowIndex}} -> + Res = table_get_next_row(Table, RowIndex), + From ! {ex1_server, Res}, + loop(MyName, Table); + {From, {delete_row, RowIndex}} -> + NewTable = table_delete_row(Table, RowIndex), + loop(MyName, NewTable); + {From, {add_row, NewRow}} -> + NewTable = table_add_row(Table, NewRow), + loop(MyName, NewTable) end. %%%--------------------------------------------------------------- %%% Functions for table operations. The table is represented as %%% a list of rows. %%%--------------------------------------------------------------- -table_get_row([{Index, Name, Address, Status} | _], [Index]) -> - {ok, {Index, Name, Address, Status}}; -table_get_row([H | T], RowIndex) -> - table_get_row(T, RowIndex); -table_get_row([], _RowIndex) -> +table_get_row([{Index, Name, Address, Status} | _], [Index]) -> + {ok, {Index, Name, Address, Status}}; +table_get_row([H | T], RowIndex) -> + table_get_row(T, RowIndex); +table_get_row([], _RowIndex) -> no_such_row. -table_get_next_row([Row | T], []) -> - {ok, Row}; -table_get_next_row([Row | T], [Index | _]) -when element(1, Row) > Index -> - {ok, Row}; -table_get_next_row([Row | T], RowIndex) -> - table_get_next_row(T, RowIndex); -table_get_next_row([], RowIndex) -> +table_get_next_row([Row | T], []) -> + {ok, Row}; +table_get_next_row([Row | T], [Index | _]) +when element(1, Row) > Index -> + {ok, Row}; +table_get_next_row([Row | T], RowIndex) -> + table_get_next_row(T, RowIndex); +table_get_next_row([], RowIndex) -> endOfTable. -table_delete_row([{Index, _, _, _} | T], [Index]) -> +table_delete_row([{Index, _, _, _} | T], [Index]) -> T; -table_delete_row([H | T], RowIndex) -> - [H | table_delete_row(T, RowIndex)]; -table_delete_row([], _RowIndex) -> - []. -table_add_row([Row | T], NewRow) - when element(1, Row) > element(1, NewRow) -> - [NewRow, Row | T]; -table_add_row([H | T], NewRow) -> - [H | table_add_row(T, NewRow)]; -table_add_row([], NewRow) -> - [NewRow]. -make_row([Index], [{2, Name}, {3, Address} | _]) -> - {Index, Name, Address, ?active}. -merge_rows(Row, [{Col, NewVal} | T]) -> - merge_rows(setelement(Col, Row, NewVal), T); -merge_rows(Row, []) -> +table_delete_row([H | T], RowIndex) -> + [H | table_delete_row(T, RowIndex)]; +table_delete_row([], _RowIndex) -> + []. +table_add_row([Row | T], NewRow) + when element(1, Row) > element(1, NewRow) -> + [NewRow, Row | T]; +table_add_row([H | T], NewRow) -> + [H | table_add_row(T, NewRow)]; +table_add_row([], NewRow) -> + [NewRow]. +make_row([Index], [{2, Name}, {3, Address} | _]) -> + {Index, Name, Address, ?active}. +merge_rows(Row, [{Col, NewVal} | T]) -> + merge_rows(setelement(Col, Row, NewVal), T); +merge_rows(Row, []) -> Row.

    @@ -513,21 +513,21 @@

    Association File

    The association file EX1-MIB.funcs for the real implementation looks as -follows:

    {myName, {ex1, my_name, []}}.
    -{friendsTable, {ex1, friends_table, []}}.

    +follows:

    {myName, {ex1, my_name, []}}.
    +{friendsTable, {ex1, friends_table, []}}.

    Transcript

    To use the real implementation, we must recompile the MIB and load it into the -agent.

    1> application:start(snmp).
    +agent.

    1> application:start(snmp).
     ok
    -2> snmpc:compile("EX1-MIB").
    -{ok,"EX1-MIB.bin"}
    -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
    +2> snmpc:compile("EX1-MIB").
    +{ok,"EX1-MIB.bin"}
    +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
     ok
    -4> ex1:start().
    +4> ex1:start().
     <0.115.0>
     %% Now all requests operates on this "real" implementation.
     %% The output from the manager requests will *look* exactly the
    @@ -543,35 +543,35 @@ 

    trap, myName and fIndex. fIndex is a table column, so we must provide its value and the index for the row in the call to snmpa:send_notification2/3. In the example below, we assume that the row in question is indexed by 2 (the row with -fIndex 2).

    we use a simple Erlang SNMP manager, which can receive traps.

    [MANAGER]
    -1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"public"}
    +fIndex 2).

    we use a simple Erlang SNMP manager, which can receive traps.

    [MANAGER]
    +1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"public"}
      %% does not have write-access
    -1>{mibs,["EX1-MIB","STANDARD-MIB"]}]).
    -{ok, <0.100.0>}
    -2> snmp_test_mgr:s([{[myName,0], "Klas"}]).
    +1>{mibs,["EX1-MIB","STANDARD-MIB"]}]).
    +{ok, <0.100.0>}
    +2> snmp_test_mgr:s([{[myName,0], "Klas"}]).
     ok
     * Got PDU:
     Received a trap:
           Generic: 4       %% authenticationFailure
    -   Enterprise: [iso,2,3]
    +   Enterprise: [iso,2,3]
          Specific: 0
    -   Agent addr: [123,12,12,21]
    +   Agent addr: [123,12,12,21]
         TimeStamp: 42993
     2>
    -[AGENT]
    -3> SendOpts = [{receiver, no_receiver}, {varbinds, [{fIndex,[2],2}]}, {name, "standard trap"}, {context, ""}],
    -4> snmpa:send_notification2(snmp_master_agent, fTrap, SendOpts).
    -[MANAGER]
    +[AGENT]
    +3> SendOpts = [{receiver, no_receiver}, {varbinds, [{fIndex,[2],2}]}, {name, "standard trap"}, {context, ""}],
    +4> snmpa:send_notification2(snmp_master_agent, fTrap, SendOpts).
    +[MANAGER]
     2>
     * Got PDU:
     Received a trap:
           Generic: 6
    -   Enterprise: [example1]
    +   Enterprise: [example1]
          Specific: 1
    -   Agent addr: [123,12,12,21]
    +   Agent addr: [123,12,12,21]
         TimeStamp: 69649
    -[myName,0] = "Martin"
    -[fIndex,2] = 2
    +[myName,0] = "Martin"
    +[fIndex,2] = 2
     2>
    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_index.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_index.html index 0bf6a399fd346..e6aea65752090 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_index.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_index.html @@ -135,13 +135,13 @@

    actual implementation of the table. The SNMP ordering, that is implementation of GET NEXT, is implemented in this module.

    For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

    snmp_index:new(string)

    For each new process we create, we insert an item in an snmp_index structure:

    new_process(Name, SnmpIndex) ->
    -  Pid = start_process(),
    +table is an OCTET STRING. The index structure would be created as follows:

    snmp_index:new(string)

    For each new process we create, we insert an item in an snmp_index structure:

    new_process(Name, SnmpIndex) ->
    +  Pid = start_process(),
       NewSnmpIndex =
    -    snmp_index:insert(SnmpIndex, Name, Pid),
    +    snmp_index:insert(SnmpIndex, Name, Pid),
       <...>

    With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

    get_next_pid(Oid, SnmpIndex) ->
    -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
    +request, to the correct process:

    get_next_pid(Oid, SnmpIndex) ->
    +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
       Pid.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_instr_functions.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_instr_functions.html index e9e3bcf4c172a..ca60f2c23fc4d 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_instr_functions.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_instr_functions.html @@ -153,8 +153,8 @@

    New / Delete Operations

    -

    For scalar variables:

    variable_access(new [, ExtraArg1, ...])
    -variable_access(delete [, ExtraArg1, ...])

    For tables:

    table_access(new [, ExtraArg1, ...])
    +

    For scalar variables:

    variable_access(new [, ExtraArg1, ...])
    +variable_access(delete [, ExtraArg1, ...])

    For tables:

    table_access(new [, ExtraArg1, ...])
     table_access(delete [, ExtraArg1, ...])

    These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

    @@ -214,9 +214,9 @@

    value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

    [{[3, 1, 2], d}, {[5, 1, 2], f}]

    This is illustrated in the following table:

    GetNext from [3,1,1] and [5,1,1].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry.3.2.1,
              myTable.myTableEntry.5.2.1 }

    This is transformed into one call to my_table:

    my_table(get_next, [2, 1], [3, 5])

    The function should now return:

    [{[4, 1, 1], b}, endOfTable]

    This is illustrated in the following table:

    GetNext from [3,2,1] and [5,2,1].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry.3.1.2,
    -         myTable.myTableEntry.4.1.2 }

    This will be transform into one call to my_table:

    my_table(get_next, [1, 2], [3, 4])

    The function should now return:

    [{[3, 2, 1], g}, {[5, 1, 1], c}]

    This is illustrated in the following table:

    GetNext from [3,1,2] and [4,1,2].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry,
    -         myTable.myTableEntry.1.3.2 }

    This will be transform into two calls to my_table:

    my_table(get_next, [], [0]) and
    -my_table(get_next, [3, 2], [1])

    The function should now return:

    [{[3, 1, 1], a}] and
    +         myTable.myTableEntry.4.1.2 }

    This will be transform into one call to my_table:

    my_table(get_next, [1, 2], [3, 4])

    The function should now return:

    [{[3, 2, 1], g}, {[5, 1, 1], c}]

    This is illustrated in the following table:

    GetNext from [3,1,2] and [4,1,2].

    The manager now issues the following getNext request:

    getNext{ myTable.myTableEntry,
    +         myTable.myTableEntry.1.3.2 }

    This will be transform into two calls to my_table:

    my_table(get_next, [], [0]) and
    +my_table(get_next, [3, 2], [1])

    The function should now return:

    [{[3, 1, 1], a}] and
     [{[3, 1, 1], a}]

    In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

    Note

    Normally, the functions described above behave exactly as shown, but they are @@ -233,17 +233,17 @@

    variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

    {ipAdr, {my_module, ip_access, []}}.
    +functions could be specified in a text file as follows:

    {ipAdr, {my_module, ip_access, []}}.
     % Or using the oid syntax for 'name'
    -{[1,1,7], {my_module, name_access, []}}.

    The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

    The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

    If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

    {ipAdr, {my_module, generic_access, ['IPADR']}}.
    +generic_access function using the ListOfExtraArguments:

    {ipAdr, {my_module, generic_access, ['IPADR']}}.
     % The mnemonic 'name' is more convenient than 1.1.7
    -{name, {my_module, generic_access, ['NAME']}}.

    When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

    Yet another possibility, closer to the hardware, could be:

    {ipAdr, {my_module, generic_access, [16#2543]}}.
    -{name, {my_module, generic_access, [16#A2B3]}}.

    +{name, {my_module, generic_access, ['NAME']}}.

    When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

    Yet another possibility, closer to the hardware, could be:

    {ipAdr, {my_module, generic_access, [16#2543]}}.
    +{name, {my_module, generic_access, [16#A2B3]}}.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_manager_config_files.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_manager_config_files.html index f86ca317d09c3..64dd023f8496a 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_manager_config_files.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_manager_config_files.html @@ -149,10 +149,10 @@

    every transport.

  • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

  • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

  • Value is the value for the variable.

  • The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_mib_compiler.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_mib_compiler.html index 79cb51aa40c1f..7906139043188 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_mib_compiler.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_mib_compiler.html @@ -141,7 +141,7 @@

    association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    @@ -153,10 +153,10 @@

    compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmp_pdus.html b/prs/8803/lib/snmp-5.16/doc/html/snmp_pdus.html index b813f41df33d6..43c6c700acd7d 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmp_pdus.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmp_pdus.html @@ -134,8 +134,8 @@

    Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmpa.html b/prs/8803/lib/snmp-5.16/doc/html/snmpa.html index 83ac36ca5bd47..0de51afcdfd40 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmpa.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmpa.html @@ -3336,8 +3336,8 @@

    load_mib(Agent, Mib)

    Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    +including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    @@ -3453,8 +3453,8 @@

    load_mibs(Agent, Mibs, Force)

    Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

    @@ -4565,8 +4565,8 @@

    register_subagent(Agent, SubTree, SubAgent)

    Registers a sub-agent under a sub-tree of another agent.

    It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

    @@ -5011,20 +5011,20 @@

    send_notification(Agent, Notification, Rece Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

    The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

  • {Mod, Func, Args} - The info will be delivered via the function call:

    Mod:Func([Msg | Args])

    where Msg has the same content and purpose as the messages descrived above.

  • Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

            Addresses  = [address()]
    -        Address    = address()
    -        address()  = v1_address() | v3_address()
    -        v1_address() = {TDomain, TAddress}
    -        v3_address() = {{TDomain, TAddress}, V3MsgData}
    -        TDomain    = tdoamin()
    -        TAddress   = taddress()
    -        tdomain()  = The oid of snmpUDPDomain
    +target addresses. They are defined as followes:

            Addresses  = [address()]
    +        Address    = address()
    +        address()  = v1_address() | v3_address()
    +        v1_address() = {TDomain, TAddress}
    +        v3_address() = {{TDomain, TAddress}, V3MsgData}
    +        TDomain    = tdoamin()
    +        TAddress   = taddress()
    +        tdomain()  = The oid of snmpUDPDomain
                          This is the only supported transport domain.
    -        taddress() = [A1, A2, A3, A4, P1, P3]
    +        taddress() = [A1, A2, A3, A4, P1, P3]
                          The 4 first bytes makes up the IP-address and the last 2,
                          the UDP-port number.
    -        V3MsgData  = v3_msg_data()
    -        v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmpc_cmd.html b/prs/8803/lib/snmp-5.16/doc/html/snmpc_cmd.html index 8b7ad6badb2eb..e38f5bb0efb8a 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmpc_cmd.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmpc_cmd.html @@ -131,7 +131,7 @@

    Synopsis

    -
    snmpc [options] file.mib | file.bin

    +
    snmpc [options] file.mib | file.bin

    diff --git a/prs/8803/lib/snmp-5.16/doc/html/snmpm.html b/prs/8803/lib/snmp-5.16/doc/html/snmpm.html index b2e35447f45aa..2032fa464b396 100644 --- a/prs/8803/lib/snmp-5.16/doc/html/snmpm.html +++ b/prs/8803/lib/snmp-5.16/doc/html/snmpm.html @@ -2008,8 +2008,8 @@

    load_mib(MibName)

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3588,8 +3588,8 @@

    unload_mib(MibName)

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/configurations.html b/prs/8803/lib/ssh-5.2.1/doc/html/configurations.html index 02fbe8fb0a048..7f071d879c240 100644 --- a/prs/8803/lib/ssh-5.2.1/doc/html/configurations.html +++ b/prs/8803/lib/ssh-5.2.1/doc/html/configurations.html @@ -142,23 +142,23 @@

    Options configuration

    There are from OTP-23.0 two main ways to set an option:

    • Like before, in the Options parameter in the Erlang code in a call to for -example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

      ssh:connect(22, [{user,"foo"}])
    • In OTP Configuration Parameters:

      • In the erl command line:

        erl -ssh user \"foo\"
      • In the ssh.app file, in the env part

        {application, ssh,
        - [{description, "SSH-2 for Erlang/OTP"},
        -  {vsn, "4.9"},
        -  {modules, [ssh,
        +example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

        ssh:connect(22, [{user,"foo"}])
      • In OTP Configuration Parameters:

        • In the erl command line:

          erl -ssh user \"foo\"
        • In the ssh.app file, in the env part

          {application, ssh,
          + [{description, "SSH-2 for Erlang/OTP"},
          +  {vsn, "4.9"},
          +  {modules, [ssh,
                   ...
          -         ssh_xfer]},
          -  {registered, []},
          -  {applications, [kernel, stdlib, crypto, public_key]},
          -  {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
          -  {mod, {ssh_app, []}},
          -       ...
        • In a .config file:

          erl -config ex1

          where ex1.config contains:

          [
          -{ssh, [{user, "foo"}]}
          -].

        If the option is intended only for a server or for a client, it may be set in -this way:

        [
        -{ssh, [{server_options,[{user, "foo"}]},
        -       {client_options,[{user, "bar"}]}
        -].

        A server (daemon) will use the user name foo, and a client will use the name + ssh_xfer]}, + {registered, []}, + {applications, [kernel, stdlib, crypto, public_key]}, + {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE + {mod, {ssh_app, []}}, + ...

  • In a .config file:

    erl -config ex1

    where ex1.config contains:

    [
    +{ssh, [{user, "foo"}]}
    +].
  • If the option is intended only for a server or for a client, it may be set in +this way:

    [
    +{ssh, [{server_options,[{user, "foo"}]},
    +       {client_options,[{user, "bar"}]}
    +].

    A server (daemon) will use the user name foo, and a client will use the name bar.

    @@ -229,17 +229,17 @@

    'hmac-sha1']}]}, {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the algorithms in the file ex2.config is not yet applied. They will -be when we start ssh:

    2> ssh:start().
    +be when we start ssh:

    2> ssh:start().
     ok
    -3> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes192-ctr']},
    -          {server2client,['aes192-ctr']}]},
    - {mac,[{client2server,['hmac-sha1']},
    -       {server2client,['hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]
    +3> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes192-ctr']},
    +          {server2client,['aes192-ctr']}]},
    + {mac,[{client2server,['hmac-sha1']},
    +       {server2client,['hmac-sha1']}]},
    + {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    +               {server2client,[none,'zlib@openssh.com',zlib]}]}]
     4>

    We see that the algorithm set is changed to the one in the ex2.config. Since compression is not specified in the file, the hard-coded default is still used for that entry.

    Establishing a connection (ssh:connect et al) or starting a daemon (ssh:daemon)

    Both when the client establishes a connection with ssh:connect or other @@ -252,65 +252,65 @@

    modify_algorithms on all levels in order starting with level 0 are applied.

    We continue the example above by connecting to a server and modifying the kex algorithm set. We remove the only one ('ecdh-sha2-nistp384') and add -'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    -                        [{modify_algorithms,
    -                                 [{rm,
    -                                     [ {kex,['ecdh-sha2-nistp384']} ]
    -				  },
    -                                  {append,
    -			             [ {kex,['curve25519-sha256@libssh.org']} ]
    -				  }
    -				 ]
    -	                 }
    -                        ]).
    -{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note -that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    -{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    -             {hkey,'ssh-rsa'},
    -             {send_mac,'hmac-sha1'},
    -             {recv_mac,'hmac-sha1'},
    -             {encrypt,'aes192-ctr'},
    -             {decrypt,'aes192-ctr'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the +'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    +                        [{modify_algorithms,
    +                                 [{rm,
    +                                     [ {kex,['ecdh-sha2-nistp384']} ]
    +				  },
    +                                  {append,
    +			             [ {kex,['curve25519-sha256@libssh.org']} ]
    +				  }
    +				 ]
    +	                 }
    +                        ]).
    +{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note +that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    +{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    +             {hkey,'ssh-rsa'},
    +             {send_mac,'hmac-sha1'},
    +             {recv_mac,'hmac-sha1'},
    +             {encrypt,'aes192-ctr'},
    +             {decrypt,'aes192-ctr'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the modify_algorithms on a lower level is applied to a preferred_algorithms on a higher level. We will do that by enabling the ssh-dss algorithm that is supported, -but not in the default set.

    The config file ex3.config has the contents:

    [
    - {ssh, [{modify_algorithms,
    -         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    -        }]}
    -].

    A newly started erlang shell shows that no 'ssh-dss' is present in the -public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    -['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +but not in the default set.

    The config file ex3.config has the contents:

    [
    + {ssh, [{modify_algorithms,
    +         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    +        }]}
    +].

    A newly started erlang shell shows that no 'ssh-dss' is present in the +public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    +['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
      'ecdsa-sha2-nistp256','ssh-ed25519','ssh-ed448',
    - 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    -2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
    + 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    +2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
     ok
    -3> {ok,C} = ssh:connect(loopback, 22,
    -                        [{preferred_algorithms,
    -                         [{public_key, ['ecdsa-sha2-nistp256']},
    -			  {kex, ['ecdh-sha2-nistp256']},
    -		          {cipher, ['chacha20-poly1305@openssh.com']},
    -			  {mac, ['hmac-sha2-256']},
    -			  {compression, [none]}
    -			  ]}
    -			 ]).
    -{ok,<0.101.0>}
    -4> ssh:connection_info(C,algorithms).
    -{algorithms,[{kex,'ecdh-sha2-nistp256'},
    -             {hkey,'ssh-dss'},
    -             {send_mac,'chacha20-poly1305@openssh.com'},
    -             {recv_mac,'chacha20-poly1305@openssh.com'},
    -             {encrypt,'chacha20-poly1305@openssh.com'},
    -             {decrypt,'chacha20-poly1305@openssh.com'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}
    +3> {ok,C} = ssh:connect(loopback, 22,
    +                        [{preferred_algorithms,
    +                         [{public_key, ['ecdsa-sha2-nistp256']},
    +			  {kex, ['ecdh-sha2-nistp256']},
    +		          {cipher, ['chacha20-poly1305@openssh.com']},
    +			  {mac, ['hmac-sha2-256']},
    +			  {compression, [none]}
    +			  ]}
    +			 ]).
    +{ok,<0.101.0>}
    +4> ssh:connection_info(C,algorithms).
    +{algorithms,[{kex,'ecdh-sha2-nistp256'},
    +             {hkey,'ssh-dss'},
    +             {send_mac,'chacha20-poly1305@openssh.com'},
    +             {recv_mac,'chacha20-poly1305@openssh.com'},
    +             {encrypt,'chacha20-poly1305@openssh.com'},
    +             {decrypt,'chacha20-poly1305@openssh.com'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}
     5>

    But 'ssh-dss' is selected although the call inserted only 'ecdsa-sha2-nistp256' as acceptable.

    This example showed that we could augment the set of algorithms with a config-file without the need to change the actual call.

    For demonstration purposes we used prepend instead of append. This forces diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/configure_algos.html b/prs/8803/lib/ssh-5.2.1/doc/html/configure_algos.html index 2829e146dc9ff..5ca5a4ae8fbf2 100644 --- a/prs/8803/lib/ssh-5.2.1/doc/html/configure_algos.html +++ b/prs/8803/lib/ssh-5.2.1/doc/html/configure_algos.html @@ -170,29 +170,29 @@

    supported by the:

    • crypto app,
    • The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,
    • and finally what the SSH app implements

    Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.

    There is an important command to list the actual algorithms and their ordering: -ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    To change the algorithm list, there are two options which can be used in ssh:connect/2,3,4 and ssh:daemon/2,3. The options could of course be used in all other functions that initiates connections.

    The options are @@ -215,28 +215,28 @@

    Example 1

    Replace the kex algorithms list with the single algorithm -'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{kex, ['diffie-hellman-group14-sha256']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['diffie-hellman-group14-sha256']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{kex, ['diffie-hellman-group14-sha256']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['diffie-hellman-group14-sha256']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that the unmentioned lists (public_key, cipher, mac and compression) are unchanged.

    @@ -244,30 +244,30 @@

    Example 2

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change both directions at once:

    2> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change both directions at once:

    2> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value + 'rsa-sha2-512','ssh-dss']}, + {cipher,[{client2server,['aes128-ctr']}, + {server2client,['aes128-ctr']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Note that both lists in cipher has been changed to the provided value ('aes128-ctr').

    @@ -275,56 +275,56 @@

    Example 3

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,[{client2server,['aes128-ctr']}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,[{client2server,['aes128-ctr']}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    Example 4

    -

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']},
    -		      {mac,['hmac-sha2-256']},
    -                      {kex,['ecdh-sha2-nistp384']},
    -		      {public_key,['ssh-rsa']},
    -		      {compression,[{server2client,[none]},
    -		                    {client2server,[zlib]}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256']},
    -       {server2client,['hmac-sha2-256']}]},
    - {compression,[{client2server,[zlib]},
    -               {server2client,[none]}]}]

    Note that the order of the tuples in the lists does not matter.

    +

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']},
    +		      {mac,['hmac-sha2-256']},
    +                      {kex,['ecdh-sha2-nistp384']},
    +		      {public_key,['ssh-rsa']},
    +		      {compression,[{server2client,[none]},
    +		                    {client2server,[zlib]}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-ctr']}]},
    + {mac,[{client2server,['hmac-sha2-256']},
    +       {server2client,['hmac-sha2-256']}]},
    + {compression,[{client2server,[zlib]},
    +               {server2client,[none]}]}]

    Note that the order of the tuples in the lists does not matter.

    @@ -338,10 +338,10 @@

    ssh:default_algorithms() and then do changes in the lists.

    To facilitate addition or removal of algorithms the option modify_algorithms is available. See the Reference Manual for details.

    The option takes a list with instructions to append, prepend or remove -algorithms:

    {modify_algorithms, [{append,  ...},
    -                     {prepend, ...},
    -		     {rm,      ...}
    -		    ]}

    Each of the ... can be a algs_list() as the argument to the +algorithms:

    {modify_algorithms, [{append,  ...},
    +                     {prepend, ...},
    +		     {rm,      ...}
    +		    ]}

    Each of the ... can be a algs_list() as the argument to the preferred_algorithms option.

    @@ -349,37 +349,37 @@

    Example 5

    As an example let's add the Diffie-Hellman Group1 first in the kex list. It is -supported according to Supported algorithms.

    5> ssh:chk_algos_opts(
    -         [{modify_algorithms,
    -	       [{prepend,
    -	           [{kex,['diffie-hellman-group1-sha1']}]
    -		   }
    -	       ]
    -          }
    -        ]).
    -[{kex,['diffie-hellman-group1-sha1','ecdh-sha2-nistp384',
    +supported according to Supported algorithms.

    5> ssh:chk_algos_opts(
    +         [{modify_algorithms,
    +	       [{prepend,
    +	           [{kex,['diffie-hellman-group1-sha1']}]
    +		   }
    +	       ]
    +          }
    +        ]).
    +[{kex,['diffie-hellman-group1-sha1','ecdh-sha2-nistp384',
            'ecdh-sha2-nistp521','ecdh-sha2-nistp256',
            'diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    And the result shows that the Diffie-Hellman Group1 is added at the head of the + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    And the result shows that the Diffie-Hellman Group1 is added at the head of the kex list

    @@ -387,27 +387,27 @@

    Example 6

    In this example, we in put the 'diffie-hellman-group1-sha1' first and also move -the 'ecdh-sha2-nistp521' to the end in the kex list, that is, append it.

    6> ssh:chk_algos_opts(
    -         [{modify_algorithms,
    -	       [{prepend,
    -	           [{kex, ['diffie-hellman-group1-sha1']}
    -		   ]},
    -		{append,
    -                   [{kex, ['ecdh-sha2-nistp521']}
    -                   ]}
    -	       ]
    -          }
    -        ]).
    -[{kex,['diffie-hellman-group1-sha1','ecdh-sha2-nistp384',
    +the 'ecdh-sha2-nistp521' to the end in the kex list, that is, append it.

    6> ssh:chk_algos_opts(
    +         [{modify_algorithms,
    +	       [{prepend,
    +	           [{kex, ['diffie-hellman-group1-sha1']}
    +		   ]},
    +		{append,
    +                   [{kex, ['ecdh-sha2-nistp521']}
    +                   ]}
    +	       ]
    +          }
    +        ]).
    +[{kex,['diffie-hellman-group1-sha1','ecdh-sha2-nistp384',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1','ecdh-sha2-nistp521']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1','ecdh-sha2-nistp521']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
        .....
    -]

    Note that the appended algorithm is removed from its original place and then +]

    Note that the appended algorithm is removed from its original place and then appended to the same list.

    @@ -416,34 +416,34 @@

    In this example, we use both options (preferred_algorithms and modify_algorithms) and also try to prepend an unsupported algorithm. Any -unsupported algorithm is quietly removed.

    7> ssh:chk_algos_opts(
    -         [{preferred_algorithms,
    -               [{cipher,['aes128-ctr']},
    -	        {mac,['hmac-sha2-256']},
    -                {kex,['ecdh-sha2-nistp384']},
    -		{public_key,['ssh-rsa']},
    -		{compression,[{server2client,[none]},
    -		              {client2server,[zlib]}]}
    -               ]
    -           },
    -          {modify_algorithms,
    -	       [{prepend,
    -	           [{kex, ['some unsupported algorithm']}
    -		   ]},
    -		{append,
    -                   [{kex, ['diffie-hellman-group1-sha1']}
    -                   ]}
    -	       ]
    -          }
    -        ]).
    -[{kex,['ecdh-sha2-nistp384','diffie-hellman-group1-sha1']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256']},
    -       {server2client,['hmac-sha2-256']}]},
    - {compression,[{client2server,[zlib]},
    -               {server2client,[none]}]}]

    It is of course questionable why anyone would like to use the both these options +unsupported algorithm is quietly removed.

    7> ssh:chk_algos_opts(
    +         [{preferred_algorithms,
    +               [{cipher,['aes128-ctr']},
    +	        {mac,['hmac-sha2-256']},
    +                {kex,['ecdh-sha2-nistp384']},
    +		{public_key,['ssh-rsa']},
    +		{compression,[{server2client,[none]},
    +		              {client2server,[zlib]}]}
    +               ]
    +           },
    +          {modify_algorithms,
    +	       [{prepend,
    +	           [{kex, ['some unsupported algorithm']}
    +		   ]},
    +		{append,
    +                   [{kex, ['diffie-hellman-group1-sha1']}
    +                   ]}
    +	       ]
    +          }
    +        ]).
    +[{kex,['ecdh-sha2-nistp384','diffie-hellman-group1-sha1']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-ctr']}]},
    + {mac,[{client2server,['hmac-sha2-256']},
    +       {server2client,['hmac-sha2-256']}]},
    + {compression,[{client2server,[zlib]},
    +               {server2client,[none]}]}]

    It is of course questionable why anyone would like to use the both these options together, but it is possible if an unforeseen need should arise.

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

    In this example, we need to use a diffie-hellman-group1-sha1 key exchange algorithm although it is unsafe and disabled by default.

    We use the modify_algorithms -option, because we want to keep all other algorithm definitions.

    We add the option:

      {modify_algorithms, [{append, [{kex,['diffie-hellman-group1-sha1']}]}]}

    either to the Options list in a function call, in the ssh.app file or in a +option, because we want to keep all other algorithm definitions.

    We add the option:

      {modify_algorithms, [{append, [{kex,['diffie-hellman-group1-sha1']}]}]}

    either to the Options list in a function call, in the ssh.app file or in a .config file for the erl command. See the chapter Configuration in SSH in the SSH User's Guide.

    @@ -464,7 +464,7 @@

    either as a user's key, a host's key or both.

    To do that, we enable the 'ssh-dss' algorithm that is disabled by default by security reasons. We use the modify_algorithms option, because -we want to keep all other algorithm definitions.

    We add the option:

      {modify_algorithms, [{append, [{public_key,['ssh-dss']}]}]}

    either to the Options list in a function call, in the ssh.app file or in a +we want to keep all other algorithm definitions.

    We add the option:

      {modify_algorithms, [{append, [{public_key,['ssh-dss']}]}]}

    either to the Options list in a function call, in the ssh.app file or in a .config file for the erl command. See the chapter Configuration in SSH in the SSH User's Guide.

    diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/hardening.html b/prs/8803/lib/ssh-5.2.1/doc/html/hardening.html index ed4047002cd47..c96467047c522 100644 --- a/prs/8803/lib/ssh-5.2.1/doc/html/hardening.html +++ b/prs/8803/lib/ssh-5.2.1/doc/html/hardening.html @@ -214,16 +214,16 @@

    could be replaced with a pwdfun plugin. The arity four variant (pwdfun_4()) can also be used for introducing delays after failed password checking attempts. Here is a simple -example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    -        case lists:member({User,Password}, my_user_pwds()) of
    +example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    +        case lists:member({User,Password}, my_user_pwds()) of
                 true ->
    -                {true, undefined}; % Reset delay time
    +                {true, undefined}; % Reset delay time
                 false when State == undefined ->
    -                timer:sleep(1000),
    -                {false, 2000}; % Next delay is 2000 ms
    -            false when is_integer(State) ->
    -                timer:sleep(State),
    -                {false, 2*State} % Double the delay for each failure
    +                timer:sleep(1000),
    +                {false, 2000}; % Next delay is 2000 ms
    +            false when is_integer(State) ->
    +                timer:sleep(State),
    +                {false, 2*State} % Double the delay for each failure
             end
     end.

    If a public key is used for logging in, there is normally no checking of the user name. It could be enabled by setting the option @@ -292,7 +292,7 @@

    exploiting known faults or peculiarities learned by reading the public code.

    Each SSH client or daemon presents themselves to each other with brand and version. This may look like

    SSH-2.0-Erlang/4.10

    or

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

    This brand and version may be changed with the option id_string. We start a daemon with that -option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each +option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each connection attempt. See the reference manual for id_string.

    diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/ssh.epub b/prs/8803/lib/ssh-5.2.1/doc/html/ssh.epub index 0b25bd1c5ac8ce8c918d6e4e00272c37290da33d..9912ccb8a23a9a7823941cd94c8db009c65698cc 100644 GIT binary patch delta 48423 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 b_ebDrLH^v3oPRqSxgklR;}{`74*q`t0a2eN delta 48548 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

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5559,21 +5559,21 @@

    hostkey_fingerprint(TypeOrTypes, Key)

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/ssh_agent.html b/prs/8803/lib/ssh-5.2.1/doc/html/ssh_agent.html index 9bdfd0dd0c497..6ceee40492d96 100644 --- a/prs/8803/lib/ssh-5.2.1/doc/html/ssh_agent.html +++ b/prs/8803/lib/ssh-5.2.1/doc/html/ssh_agent.html @@ -135,11 +135,11 @@

    authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

    diff --git a/prs/8803/lib/ssh-5.2.1/doc/html/using_ssh.html b/prs/8803/lib/ssh-5.2.1/doc/html/using_ssh.html index a5977e020dca5..87ff3152e23a7 100644 --- a/prs/8803/lib/ssh-5.2.1/doc/html/using_ssh.html +++ b/prs/8803/lib/ssh-5.2.1/doc/html/using_ssh.html @@ -140,9 +140,9 @@

    Using the Erlang ssh Terminal Client

    The user otptest, which has bash as default shell, uses the ssh:shell/1 -client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
    +client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
     ok
    -2> {ok, S} = ssh:shell("ssh.example.com").
    +2> {ok, S} = ssh:shell("ssh.example.com").
     otptest@ssh.example.com:> pwd
     /home/otptest
     otptest@ssh.example.com:> exit
    @@ -161,11 +161,11 @@ 

    [...] $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa [...]

    Step 2. Create the file /tmp/otptest_user/.ssh/authorized_keys and add the -content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
    +content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    +{ok,<0.54.0>}
     3>

    Step 4. Use the OpenSSH client from a shell to connect to the Erlang ssh daemon:

    $bash> ssh ssh.example.com -p 8989  -i /tmp/otptest_user/.ssh/id_rsa \
                       -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
    @@ -176,10 +176,10 @@ 

    Eshell V5.10 (abort with ^G) 1>

    There are two ways of shutting down an ssh daemon, see Step 5a and Step 5b.

    Step 5a. Shut down the Erlang ssh daemon so that it stops the listener but -leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
    +leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
     ok
     4>

    Step 5b. Shut down the Erlang ssh daemon so that it stops the listener and -all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
    +all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
     ok
     4>

    @@ -195,35 +195,35 @@

    In the following example, the Erlang shell is the client process that receives the channel replies as Erlang messages.

    Do an one-time execution of a remote OS command ("pwd") over ssh to the ssh -server of the OS at the host "ssh.example.com":

    1> ssh:start().
    +server of the OS at the host "ssh.example.com":

    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    -{ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    -5> flush(). % Get all pending messages. NOTE: ordering may vary!
    -Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    -Shell got {ssh_cm,<0.57.0>,{eof,0}}
    -Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.57.0>,{closed,0}}
    +2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    +{ok,<0.57.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    +5> flush(). % Get all pending messages. NOTE: ordering may vary!
    +Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    +Shell got {ssh_cm,<0.57.0>,{eof,0}}
    +Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.57.0>,{closed,0}}
     ok
    -6> ssh:connection_info(ConnectionRef, channels).
    -{channels,[]}
    +6> ssh:connection_info(ConnectionRef, channels).
    +{channels,[]}
     7>

    See ssh_connection and ssh_connection:exec/4 for finding documentation of the channel messages.

    To collect the channel messages in a program, use receive...end instead of flush/1:

    5> receive
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    -5>         {ok,Result}
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    -5>         {error,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    +5>         {ok,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    +5>         {error,Result}
     5> end.
    -{ok,<<"/home/otptest\n">>}
    +{ok,<<"/home/otptest\n">>}
     6>

    Note that only the exec channel is closed after the one-time execution. The connection is still up and can handle previously opened channels. It is also possible to open a new channel:

    % try to open a new channel to check if the ConnectionRef is still open
    -7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,1}
    +7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,1}
     8>

    To close the connection, call the function ssh:close(ConnectionRef). As an alternative, set the option {idle_time, 1} when opening the @@ -238,23 +238,23 @@

    "command" must be as if entered into the erlang shell, that is a sequence of Erlang expressions ended by a period (.). Variables bound in that sequence will keep their bindings throughout the expression -sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in +sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in Step 3 above:

    $bash> ssh ssh.example.com -p 8989 "A=1, B=2, 3 == (A + B)."
     true
     $bash>

    The same example but now using the Erlang ssh client to contact the Erlang -server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    -{ok,<0.216.0>}
    -2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -3> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    +{ok,<0.216.0>}
    +2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +3> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "A=1, B=2, 3 == (A + B).",
    -                                 infinity).
    +                                 infinity).
     success
    -4> flush().
    -Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    -Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.216.0>,{eof,0}}
    -Shell got {ssh_cm,<0.216.0>,{closed,0}}
    +4> flush().
    +Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    +Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.216.0>,{eof,0}}
    +Shell got {ssh_cm,<0.216.0>,{closed,0}}
     ok
     5>

    Note that Erlang shell specific functions and control sequences like for example h(). are not supported.

    @@ -275,36 +275,36 @@

    write something: [a,b,c]. {ok,[a,b,c]} $bash>

    The same example but using the Erlang ssh client:

    
    -Eshell V10.5.2  (abort with ^G)
    -1> ssh:start().
    +Eshell V10.5.2  (abort with ^G)
    +1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "io:read(\"write something: \").",
    -                                 infinity).
    +                                 infinity).
     success
    -5> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
    +5> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
     ok
     % All data is sent as binaries with string contents:
    -6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
    +6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
     ok
    -7> flush().
    +7> flush().
     ok
     %% Nothing is received, because the io:read/1
     %% requires the input line to end with a newline.
     
     %% Send a newline (it could have been included in the last send):
    -8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
    +8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
     ok
    -9> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    -Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.92.0>,{eof,0}}
    -Shell got {ssh_cm,<0.92.0>,{closed,0}}
    +9> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    +Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.92.0>,{eof,0}}
    +Shell got {ssh_cm,<0.92.0>,{closed,0}}
     ok
     10>

    @@ -321,44 +321,44 @@

    ssh:daemon/2,3 and exec_daemon_option() for details.

    Examples of the two ways to configure the exec evaluator:

    1. Disable one-time execution.
      To modify the daemon start example above to reject one-time execution requests, we change Step 3 by adding the -option {exec, disabled} to:
    1> ssh:start().
    +option {exec, disabled} to:
    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, disabled}
    -                                 ]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"},
    +                                  {exec, disabled}
    +                                 ]).
    +{ok,<0.54.0>}
     3>

    A call to that daemon will return the text "Prohibited." on stderr (depending on the client and OS), and the exit status 255:

    $bash> ssh ssh.example.com -p 8989 "test."
     Prohibited.
     $bash> echo $?
     255
     $bash>

    And the Erlang client library also returns the text "Prohibited." on data type 1 -instead of the normal 0 and exit status 255:

    2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "test."
    +instead of the normal 0 and exit status 255:

    2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "test."
     success
    -5> flush().
    -Shell got {ssh_cm,<0.106.0>,{data,0,1,<<"Prohibited.">>}}
    -Shell got {ssh_cm,<0.106.0>,{exit_status,0,255}}
    -Shell got {ssh_cm,<0.106.0>,{eof,0}}
    -Shell got {ssh_cm,<0.106.0>,{closed,0}}
    +5> flush().
    +Shell got {ssh_cm,<0.106.0>,{data,0,1,<<"Prohibited.">>}}
    +Shell got {ssh_cm,<0.106.0>,{exit_status,0,255}}
    +Shell got {ssh_cm,<0.106.0>,{eof,0}}
    +Shell got {ssh_cm,<0.106.0>,{closed,0}}
     ok
    -6>
    1. Install an alternative evaluator.
      Start the damon with a reference to a fun() that handles the evaluation:
    1> ssh:start().
    +6>
    1. Install an alternative evaluator.
      Start the damon with a reference to a fun() that handles the evaluation:
    1> ssh:start().
     ok
    -2> MyEvaluator = fun("1") -> {ok, some_value};
    -                    ("2") -> {ok, some_other_value};
    -                    ("3") -> {ok, V} = io:read("input erlang term>> "),
    -                             {ok, V};
    -                    (Err) -> {error,{bad_input,Err}}
    +2> MyEvaluator = fun("1") -> {ok, some_value};
    +                    ("2") -> {ok, some_other_value};
    +                    ("3") -> {ok, V} = io:read("input erlang term>> "),
    +                             {ok, V};
    +                    (Err) -> {error,{bad_input,Err}}
                      end.
    -3> {ok, Sshd} = ssh:daemon(1234, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, {direct,MyEvaluator}}
    -                                 ]).
    -{ok,<0.275.0>}
    +3> {ok, Sshd} = ssh:daemon(1234, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"},
    +                                  {exec, {direct,MyEvaluator}}
    +                                 ]).
    +{ok,<0.275.0>}
     4>

    and call it:

    $bash> ssh localhost -p 1234 1
     some_value
     $bash> ssh localhost -p 1234 2
    @@ -372,17 +372,17 @@ 

    **Error** {bad_input,"1+ 2."} $bash>

    Note that spaces are preserved and that no point (.) is needed at the end - that was required by the default evaluator.

    The error return in the Erlang client (The text as data type 1 and exit_status -255):

    2> {ok, ConnectionRef} = ssh:connect(loopback, 1234, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "1+ 2.").
    +255):

    2> {ok, ConnectionRef} = ssh:connect(loopback, 1234, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "1+ 2.").
     success
    -5> flush().
    -Shell got {ssh_cm,<0.106.0>,{data,0,1,<<"**Error** {bad_input,\"1+ 2.\"}">>}}
    -Shell got {ssh_cm,<0.106.0>,{exit_status,0,255}}
    -Shell got {ssh_cm,<0.106.0>,{eof,0}}
    -Shell got {ssh_cm,<0.106.0>,{closed,0}}
    +5> flush().
    +Shell got {ssh_cm,<0.106.0>,{data,0,1,<<"**Error** {bad_input,\"1+ 2.\"}">>}}
    +Shell got {ssh_cm,<0.106.0>,{exit_status,0,255}}
    +Shell got {ssh_cm,<0.106.0>,{eof,0}}
    +Shell got {ssh_cm,<0.106.0>,{closed,0}}
     ok
     6>

    The fun() in the exec option could take up to three arguments (Cmd, User and ClientAddress). See the @@ -394,14 +394,14 @@

    SFTP Server

    -

    Start the Erlang ssh daemon with the SFTP subsystem:

    1> ssh:start().
    +

    Start the Erlang ssh daemon with the SFTP subsystem:

    1> ssh:start().
     ok
    -2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                     {user_dir, "/tmp/otptest_user/.ssh"},
    -                     {subsystems, [ssh_sftpd:subsystem_spec(
    -                                            [{cwd, "/tmp/sftp/example"}])
    -                                  ]}]).
    -{ok,<0.54.0>}
    +2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                     {user_dir, "/tmp/otptest_user/.ssh"},
    +                     {subsystems, [ssh_sftpd:subsystem_spec(
    +                                            [{cwd, "/tmp/sftp/example"}])
    +                                  ]}]).
    +{ok,<0.54.0>}
     3>

    Run the OpenSSH SFTP client:

    $bash> sftp -oPort=8989 -o IdentityFile=/tmp/otptest_user/.ssh/id_rsa \
                 -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts ssh.example.com
     Connecting to ssh.example.com...
    @@ -413,12 +413,12 @@ 

    SFTP Client

    -

    Fetch a file with the Erlang SFTP client:

    1> ssh:start().
    +

    Fetch a file with the Erlang SFTP client:

    1> ssh:start().
     ok
    -2> {ok, ChannelPid, Connection} = ssh_sftp:start_channel("ssh.example.com", []).
    -{ok,<0.57.0>,<0.51.0>}
    -3> ssh_sftp:read_file(ChannelPid, "/home/otptest/test.txt").
    -{ok,<<"This is a test file\n">>}

    +2> {ok, ChannelPid, Connection} = ssh_sftp:start_channel("ssh.example.com", []). +{ok,<0.57.0>,<0.51.0>} +3> ssh_sftp:read_file(ChannelPid, "/home/otptest/test.txt"). +{ok,<<"This is a test file\n">>}

    @@ -430,17 +430,17 @@

    Basic example

    -

    This is an example of writing and then reading a tar file:

    {ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write]),
    -ok = erl_tar:add(HandleWrite, .... ),
    -ok = erl_tar:add(HandleWrite, .... ),
    +

    This is an example of writing and then reading a tar file:

    {ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write]),
    +ok = erl_tar:add(HandleWrite, .... ),
    +ok = erl_tar:add(HandleWrite, .... ),
     ...
    -ok = erl_tar:add(HandleWrite, .... ),
    -ok = erl_tar:close(HandleWrite),
    +ok = erl_tar:add(HandleWrite, .... ),
    +ok = erl_tar:close(HandleWrite),
     
     %% And for reading
    -{ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read]),
    -{ok,NameValueList} = erl_tar:extract(HandleRead,[memory]),
    -ok = erl_tar:close(HandleRead),

    +{ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read]), +{ok,NameValueList} = erl_tar:extract(HandleRead,[memory]), +ok = erl_tar:close(HandleRead),

    @@ -449,123 +449,123 @@

    The previous Basic example can be extended with encryption and decryption as follows:

    %% First three parameters depending on which crypto type we select:
     Key = <<"This is a 256 bit key. abcdefghi">>,
    -Ivec0 = crypto:strong_rand_bytes(16),
    +Ivec0 = crypto:strong_rand_bytes(16),
     DataSize = 1024,  % DataSize rem 16 = 0 for aes_cbc
     
     %% Initialization of the CryptoState, in this case it is the Ivector.
    -InitFun = fun() -> {ok, Ivec0, DataSize} end,
    +InitFun = fun() -> {ok, Ivec0, DataSize} end,
     
     %% How to encrypt:
     EncryptFun =
    -    fun(PlainBin,Ivec) ->
    -        EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec, PlainBin),
    -        {ok, EncryptedBin, crypto:next_iv(aes_cbc,EncryptedBin)}
    +    fun(PlainBin,Ivec) ->
    +        EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec, PlainBin),
    +        {ok, EncryptedBin, crypto:next_iv(aes_cbc,EncryptedBin)}
         end,
     
     %% What to do with the very last block:
     CloseFun =
    -    fun(PlainBin, Ivec) ->
    -        EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec,
    -                                            pad(16,PlainBin) %% Last chunk
    -                                           ),
    -       {ok, EncryptedBin}
    +    fun(PlainBin, Ivec) ->
    +        EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec,
    +                                            pad(16,PlainBin) %% Last chunk
    +                                           ),
    +       {ok, EncryptedBin}
         end,
     
    -Cw = {InitFun,EncryptFun,CloseFun},
    -{ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write,{crypto,Cw}]),
    -ok = erl_tar:add(HandleWrite, .... ),
    -ok = erl_tar:add(HandleWrite, .... ),
    +Cw = {InitFun,EncryptFun,CloseFun},
    +{ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write,{crypto,Cw}]),
    +ok = erl_tar:add(HandleWrite, .... ),
    +ok = erl_tar:add(HandleWrite, .... ),
     ...
    -ok = erl_tar:add(HandleWrite, .... ),
    -ok = erl_tar:close(HandleWrite),
    +ok = erl_tar:add(HandleWrite, .... ),
    +ok = erl_tar:close(HandleWrite),
     
     %% And for decryption (in this crypto example we could use the same InitFun
     %% as for encryption):
     DecryptFun =
    -    fun(EncryptedBin,Ivec) ->
    -        PlainBin = crypto:block_decrypt(aes_cbc256, Key, Ivec, EncryptedBin),
    -       {ok, PlainBin, crypto:next_iv(aes_cbc,EncryptedBin)}
    +    fun(EncryptedBin,Ivec) ->
    +        PlainBin = crypto:block_decrypt(aes_cbc256, Key, Ivec, EncryptedBin),
    +       {ok, PlainBin, crypto:next_iv(aes_cbc,EncryptedBin)}
         end,
     
    -Cr = {InitFun,DecryptFun},
    -{ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read,{crypto,Cw}]),
    -{ok,NameValueList} = erl_tar:extract(HandleRead,[memory]),
    -ok = erl_tar:close(HandleRead),

    +Cr = {InitFun,DecryptFun}, +{ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read,{crypto,Cw}]), +{ok,NameValueList} = erl_tar:extract(HandleRead,[memory]), +ok = erl_tar:close(HandleRead),

    Creating a Subsystem

    A small ssh subsystem that echoes N bytes can be implemented as shown in the -following example:

    -module(ssh_echo_server).
    --behaviour(ssh_server_channel). % replaces ssh_daemon_channel
    --record(state, {
    +following example:

    -module(ssh_echo_server).
    +-behaviour(ssh_server_channel). % replaces ssh_daemon_channel
    +-record(state, {
     	  n,
     	  id,
     	  cm
    -	 }).
    --export([init/1, handle_msg/2, handle_ssh_msg/2, terminate/2]).
    +	 }).
    +-export([init/1, handle_msg/2, handle_ssh_msg/2, terminate/2]).
     
    -init([N]) ->
    -    {ok, #state{n = N}}.
    +init([N]) ->
    +    {ok, #state{n = N}}.
     
    -handle_msg({ssh_channel_up, ChannelId, ConnectionManager}, State) ->
    -    {ok, State#state{id = ChannelId,
    -		     cm = ConnectionManager}}.
    +handle_msg({ssh_channel_up, ChannelId, ConnectionManager}, State) ->
    +    {ok, State#state{id = ChannelId,
    +		     cm = ConnectionManager}}.
     
    -handle_ssh_msg({ssh_cm, CM, {data, ChannelId, 0, Data}}, #state{n = N} = State) ->
    -    M = N - size(Data),
    +handle_ssh_msg({ssh_cm, CM, {data, ChannelId, 0, Data}}, #state{n = N} = State) ->
    +    M = N - size(Data),
         case M > 0 of
     	true ->
    -	   ssh_connection:send(CM, ChannelId, Data),
    -	   {ok, State#state{n = M}};
    +	   ssh_connection:send(CM, ChannelId, Data),
    +	   {ok, State#state{n = M}};
     	false ->
     	   <<SendData:N/binary, _/binary>> = Data,
    -           ssh_connection:send(CM, ChannelId, SendData),
    -           ssh_connection:send_eof(CM, ChannelId),
    -	   {stop, ChannelId, State}
    +           ssh_connection:send(CM, ChannelId, SendData),
    +           ssh_connection:send_eof(CM, ChannelId),
    +	   {stop, ChannelId, State}
         end;
    -handle_ssh_msg({ssh_cm, _ConnectionManager,
    -		{data, _ChannelId, 1, Data}}, State) ->
    -    error_logger:format(standard_error, " ~p~n", [binary_to_list(Data)]),
    -    {ok, State};
    +handle_ssh_msg({ssh_cm, _ConnectionManager,
    +		{data, _ChannelId, 1, Data}}, State) ->
    +    error_logger:format(standard_error, " ~p~n", [binary_to_list(Data)]),
    +    {ok, State};
     
    -handle_ssh_msg({ssh_cm, _ConnectionManager, {eof, _ChannelId}}, State) ->
    -    {ok, State};
    +handle_ssh_msg({ssh_cm, _ConnectionManager, {eof, _ChannelId}}, State) ->
    +    {ok, State};
     
    -handle_ssh_msg({ssh_cm, _, {signal, _, _}}, State) ->
    +handle_ssh_msg({ssh_cm, _, {signal, _, _}}, State) ->
         %% Ignore signals according to RFC 4254 section 6.9.
    -    {ok, State};
    +    {ok, State};
     
    -handle_ssh_msg({ssh_cm, _, {exit_signal, ChannelId, _, _Error, _}},
    -	       State) ->
    -    {stop, ChannelId,  State};
    +handle_ssh_msg({ssh_cm, _, {exit_signal, ChannelId, _, _Error, _}},
    +	       State) ->
    +    {stop, ChannelId,  State};
     
    -handle_ssh_msg({ssh_cm, _, {exit_status, ChannelId, _Status}}, State) ->
    -    {stop, ChannelId, State}.
    +handle_ssh_msg({ssh_cm, _, {exit_status, ChannelId, _Status}}, State) ->
    +    {stop, ChannelId, State}.
     
    -terminate(_Reason, _State) ->
    +terminate(_Reason, _State) ->
         ok.

    The subsystem can be run on the host ssh.example.com with the generated keys, as described in Section -Running an Erlang ssh Daemon:

    1> ssh:start().
    +Running an Erlang ssh Daemon:

    1> ssh:start().
     ok
    -2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                     {user_dir, "/tmp/otptest_user/.ssh"}
    -                     {subsystems, [{"echo_n", {ssh_echo_server, [10]}}]}]).
    -{ok,<0.54.0>}
    -3>
    1> ssh:start().
    +2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                     {user_dir, "/tmp/otptest_user/.ssh"}
    +                     {subsystems, [{"echo_n", {ssh_echo_server, [10]}}]}]).
    +{ok,<0.54.0>}
    +3>
    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989,
    -                                    [{user_dir, "/tmp/otptest_user/.ssh"}]).
    - {ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -4> success = ssh_connection:subsystem(ConnectionRef, ChannelId, "echo_n", infinity).
    -5> ok = ssh_connection:send(ConnectionRef, ChannelId, "0123456789", infinity).
    -6> flush().
    -{ssh_msg, <0.57.0>, {data, 0, 1, "0123456789"}}
    -{ssh_msg, <0.57.0>, {eof, 0}}
    -{ssh_msg, <0.57.0>, {closed, 0}}
    -7> {error, closed} = ssh_connection:send(ConnectionRef, ChannelId, "10", infinity).

    See also ssh_client_channel (replaces ssh_channel(3)).

    +2>
    {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, + [{user_dir, "/tmp/otptest_user/.ssh"}]). + {ok,<0.57.0>} +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity). +4> success = ssh_connection:subsystem(ConnectionRef, ChannelId, "echo_n", infinity). +5> ok = ssh_connection:send(ConnectionRef, ChannelId, "0123456789", infinity). +6> flush(). +{ssh_msg, <0.57.0>, {data, 0, 1, "0123456789"}} +{ssh_msg, <0.57.0>, {eof, 0}} +{ssh_msg, <0.57.0>, {closed, 0}} +7> {error, closed} = ssh_connection:send(ConnectionRef, ChannelId, "10", infinity).

    See also ssh_client_channel (replaces ssh_channel(3)).

    diff --git a/prs/8803/lib/ssl-11.2.1/doc/html/.build b/prs/8803/lib/ssl-11.2.1/doc/html/.build index 749d5a9c1de34..9e4a34816e8db 100644 --- a/prs/8803/lib/ssl-11.2.1/doc/html/.build +++ b/prs/8803/lib/ssl-11.2.1/doc/html/.build @@ -18,7 +18,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-6435E30D.js +dist/search_data-731AC49D.js dist/sidebar_items-7FA2259C.js index.html notes.html diff --git a/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-6435E30D.js b/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-6435E30D.js deleted file mode 100644 index 29727fa6b58a2..0000000000000 --- a/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-6435E30D.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","doc":"Interface functions for TLS (Transport Layer Security)\nand DTLS (Datagram Transport Layer Security).\n\n> #### Note {: .info }\nThe application's name is still SSL because the first versions of the\nTLS protocol were named SSL (Secure Socket Layer). However, no version\nof the old SSL protocol is supported by this application.\n\nExample:\n```erlang\n1> ssl:start(), ssl:connect(\"google.com\", 443, [{verify, verify_peer},\n {cacerts, public_key:cacerts_get()}]).\n{ok,{sslsocket, [...]}}\n```\n\nSee [Examples](using_ssl.md) for detailed usage and more examples of\nthis API.\n\nSpecial Erlang node configuration for the application can be found in\n[SSL Application](ssl_app.md).","title":"ssl","ref":"ssl.html"},{"type":"function","doc":"Make `Deferred` suites become the least preferred suites.\n\nThe `Deferred` suites will be put at the end of the cipher suite list\n`Suites` after removing them from `Suites` if present. `Deferred` can\nbe a list of cipher suites or a list of filters in which case the\nfilters are used on `Suites` to extract the deferred cipher list.","title":"ssl.append_cipher_suites/2","ref":"ssl.html#append_cipher_suites/2"},{"type":"function","doc":"Lists all available cipher suites corresponding to `Description`.\n\nThe `exclusive` and `exclusive_anonymous` option will exclusively\nlist cipher suites first supported in `Version`, whereas the other options are\ninclusive from the lowest possible version to `Version`. The `all` option\nincludes all suites except anonymous suites. No anonymous suites are supported\nby default.\n\n> #### Note {: .info }\n>\n> TLS-1.3 has no overlapping cipher suites with previous TLS versions, meaning that\n> the result of [`cipher_suites(all, 'tlsv1.3')`](`cipher_suites/2`) contains a separate\n> set of suites that can be used with TLS-1.3 and another set that can be used if a lower\n> version is negotiated. The so-called `PSK` and `SRP` suites (prior to TLS-1.3)\n> need extra configuration to work; namely the option `user_lookup_function`. No\n> anonymous suites are supported by TLS-1.3.\n>\n> Also note that the cipher suites returned by this function are the cipher\n> suites that the OTP SSL application can support provided that they are\n> supported by the crypto library linked with the OTP Crypto application. Use\n> [`ssl:filter_cipher_suites(Suites, [])`](`filter_cipher_suites/2`) to filter\n> the list for the current crypto library. Note that cipher suites may be filtered\n> out because they are too old or too new depending on the crypto library.","title":"ssl.cipher_suites/2","ref":"ssl.html#cipher_suites/2"},{"type":"function","doc":"Equivalent to `cipher_suites/2`, but lists RFC or OpenSSL string names instead of\n[`erl_cipher_suite()`](`t:erl_cipher_suite/0`).","title":"ssl.cipher_suites/3","ref":"ssl.html#cipher_suites/3"},{"type":"function","doc":"Clears the PEM cache.\n\nPEM files, used by SSL API-functions, are cached for performance\nreasons. The cache is automatically checked at regular intervals to\ndetermine whether any cache entries should be invalidated.\n\nThis function provides a way to unconditionally clear the entire cache, thereby\nforcing a reload of previously cached PEM files.","title":"ssl.clear_pem_cache/0","ref":"ssl.html#clear_pem_cache/0"},{"type":"function","doc":"Closes a TLS/DTLS connection.","title":"ssl.close/1","ref":"ssl.html#close/1"},{"type":"function","doc":"Closes or downgrades a TLS connection.\n\nIn the latter case the transport connection will be handed over to the\n`NewController` process after receiving the TLS close alert from the\npeer. The returned transport socket will have the following options\nset: `[{active, false}, {packet, 0}, {mode, binary}]`.\n\nIn case of downgrade, the close function might return some binary data that\nshould be treated by the user as the first bytes received on the downgraded\nconnection.","title":"ssl.close/2","ref":"ssl.html#close/2"},{"type":"function","doc":"","title":"ssl.connect/2","ref":"ssl.html#connect/2"},{"type":"function","doc":"Opens a TLS/DTLS connection.\n\n```erlang\nconnect(TCPSocket, TLSOptions, Timeout).\n```\n\nUpgrades a `gen_tcp` (or equivalent) connected socket to a TLS socket by\nperforming the client-side TLS handshake.\n\n\n```erlang\nconnect(Host, Port, TLSOptions).\n```\n\nOpens a TLS/DTLS connection to `Host`, `Port`. This call is equivalent to:\n\n```erlang\nconnect(Host, Port, TLSOptions, infinity).\n```","title":"ssl.connect/3","ref":"ssl.html#connect/3"},{"type":"function","doc":"Opens a TLS/DTLS connection to `Host`, `Port`.\n\nWhen the `verify` option is set to `verify_peer`, the\n`public_key:pkix_verify_hostname/2` check will be performed in addition to the usual\nX.509-path validation checks. If the check fails, the error `{bad_cert,\nhostname_check_failed}` will be propagated to the path validation fun,\nwhere it is possible to do customized checks\nby using the full possibilities of the `public_key:pkix_verify_hostname/3` API.\nWhen the `server_name_indication` option is provided, its value (the DNS name)\nwill be used as `ReferenceID` to `public_key:pkix_verify_hostname/2`. When no\n`server_name_indication` option is given, the `Host` argument will be used as\nServer Name Indication extension. The `Host` argument will also be used for the\n`public_key:pkix_verify_hostname/2` check. If the `Host` argument is an\n[`inet:ip_address()`](`t:inet:ip_address/0`) the `ReferenceID` used for the\ncheck will be `{ip, Host}`; otherwise `dns_id` will be assumed with a fallback to\n`ip` if that fails.\n\n> #### Note {: .info }\n>\n> According to good practices, certificates should not use IP addresses as\n> \"server names\", especially outside a closed network.\n\nIf the `{handshake, hello}` option is used, the handshake is paused after\nreceiving the server hello message and the success response is\n`{ok, SslSocket, Ext}` instead of `{ok, SslSocket}`. Thereafter the handshake is\ncontinued or canceled by calling `handshake_continue/3` or `handshake_cancel/1`.\n\nIf the `active` option is set to `once`, `true`, or an integer value, the process\nowning the SSL socket will receive messages of type\n[`active_msgs()`](`t:active_msgs/0`).","title":"ssl.connect/4","ref":"ssl.html#connect/4"},{"type":"function","doc":"Returns the most relevant information about the connection.\n\nSome items that are undefined will be filtered out. No values\nthat affect the security of the connection will be returned.\n\n> #### Note {: .info }\n>\n> The legacy `cipher_suite` item was removed in OTP 23. Previously it returned\n> the cipher suite in its (undocumented) legacy format. It is replaced by\n> `selected_cipher_suite`.","title":"ssl.connection_information/1","ref":"ssl.html#connection_information/1"},{"type":"function","doc":"Returns the requested information items about the connection if they are\ndefined.\n\nNote that the values for `client_random`, `server_random`, `master_secret`, and `keylog`\naffect the security of connection.\n\nIn order to retrieve `keylog` and other secret information from a TLS 1.3\nconnection, the `keep_secrets` option must be configured in advance and\nset to `true`.\n\n> #### Note {: .info }\n>\n> If only undefined options are requested the resulting list can be empty.","title":"ssl.connection_information/2","ref":"ssl.html#connection_information/2"},{"type":"function","doc":"Assigns a new controlling process to the SSL socket.\n\nA controlling process is the owner of an SSL socket and receives all\nmessages from the socket.","title":"ssl.controlling_process/2","ref":"ssl.html#controlling_process/2"},{"type":"function","doc":"Returns a list of all supported elliptic curves, including legacy\ncurves, for all TLS/DTLS versions prior to TLS-1.3.","title":"ssl.eccs/0","ref":"ssl.html#eccs/0"},{"type":"function","doc":"Returns the elliptic curves supported by default for `Version`.\n\nThis is a subset of what `eccs/0` returns.","title":"ssl.eccs/1","ref":"ssl.html#eccs/1"},{"type":"function","doc":"","title":"ssl.export_key_materials/4","ref":"ssl.html#export_key_materials/4"},{"type":"function","doc":"Uses a Pseudo-Random Function (PRF prior to TLS-1.3) or a Key\nDerivation Function (HKDF in TLS-1.3) for a TLS connection to\ngenerate and export keying materials.\n\nIn TLS-1.3, using `no_context` is equivalent to specifying an empty\ncontext (an empty binary). Prior to TLS-1.3, `no_context` and an empty\ncontext will produce different results.\n\nThe `ConsumeSecret` argument is relevant only in TLS-1.3, causing the\nTLS-1.3 `exporter_master_secret` to be consumed, thereby making it\nunavailable and increasing security. Further attempts to call this\nfunction will fail.","title":"ssl.export_key_materials/5","ref":"ssl.html#export_key_materials/5"},{"type":"function","doc":"Removes cipher suites if any of the filter functions returns `false` for any part\nof the cipher suite.\n\nIf no filter function is supplied for some part, the default behavior\ntreats it as a filter function that returns `true`. For\nexamples, see [Customizing cipher suites\n](using_ssl.md#customizing-cipher-suites). Additionally, this function\nalso filters the cipher suites to exclude cipher suites not supported\nby the crypto library used by the OTP Crypto application, meaning that\n[`ssl:filter_cipher_suites(Suites, [])`](`filter_cipher_suites/2`)\nis equivalent to applying only the filters for crypto library support.","title":"ssl.filter_cipher_suites/2","ref":"ssl.html#filter_cipher_suites/2"},{"type":"function","doc":"Presents the error returned by an SSL function as a printable string.","title":"ssl.format_error/1","ref":"ssl.html#format_error/1"},{"type":"function","doc":"Gets the values of the specified socket options.","title":"ssl.getopts/2","ref":"ssl.html#getopts/2"},{"type":"function","doc":"Get statistics for the underlying socket.","title":"ssl.getstat/1","ref":"ssl.html#getstat/1"},{"type":"function","doc":"Get one or more statistic values for the underlying socket.\n\nSee `inet:getstat/2` for further details.","title":"ssl.getstat/2","ref":"ssl.html#getstat/2"},{"type":"function","doc":"Returns all supported groups in TLS 1.3.\n\nExisted since OTP 22.0; documented as of OTP 27.","title":"ssl.groups/0","ref":"ssl.html#groups/0"},{"type":"function","doc":"Returns default supported groups in TLS 1.3.\n\nExisted since OTP 22.0; documented as of OTP 27.","title":"ssl.groups/1","ref":"ssl.html#groups/1"},{"type":"function","doc":"","title":"ssl.handshake/1","ref":"ssl.html#handshake/1"},{"type":"function","doc":"Performs the TLS/DTLS server-side handshake.\n\nIf the second argument is a timeout value:\n\n```erlang\nhandshake(HsSocket, Timeout).\n```\n\nthis call is equivalent to:\n\n```erlang\nhandshake(HsSocket, [], Timeout).\n```\n\nOtherwise, if the second argument is a list of options:\n\n\n```erlang\nhandshake(HsSocket, Options).\n```\nthis call is equivalent to:\n\n```erlang\nhandshake(HsSocket, Options, infinity).\n```","title":"ssl.handshake/2","ref":"ssl.html#handshake/2"},{"type":"function","doc":"Performs the TLS/DTLS server-side handshake.\n\nReturns a new TLS/DTLS socket if the handshake is successful.\n\nIf `Socket` is a ordinary [`socket()`](`t:socket/0`), upgrades a\n`gen_tcp` or equivalent socket to an SSL socket by performing the\nTLS server-side handshake and returning a TLS socket.\n\n> #### Note {: .info }\nThe ordinary `Socket` must be in passive mode (`{active, false}`)\nbefore calling this function and before the client tries to connect\nwith TLS; otherwise, the behavior of this function is undefined. The\nbest way to ensure this is to create the ordinary listen socket in\npassive mode.\n\nIf `Socket` is an [`sslsocket()`](`t:sslsocket/0`), provides extra\nTLS/DTLS options to those specified in `listen/2` and then performs\nthe TLS/DTLS handshake. Returns a new TLS/DTLS socket if the handshake\nis successful.\n\n> #### Warning {: .warning }\nNot setting the timeout makes the server more vulnerable to Denial of\nService (DoS) attacks.\n\nIf option `{handshake, hello}` is specified the handshake is paused after\nreceiving the client hello message and the success response is\n`{ok, SslSocket, Ext}` instead of `{ok, SslSocket}`. Thereafter the handshake is\ncontinued or canceled by calling `handshake_continue/3` or `handshake_cancel/1`.\n\nIf option `active` is set to `once`, `true`, or an integer value, the process\nowning the [`sslsocket()`](`t:sslsocket/0`) will receive messages of type\n[`active_msgs()`](`t:active_msgs/0`).","title":"ssl.handshake/3","ref":"ssl.html#handshake/3"},{"type":"function","doc":"Cancel the handshake with a fatal `USER_CANCELED` alert.","title":"ssl.handshake_cancel/1","ref":"ssl.html#handshake_cancel/1"},{"type":"function","doc":"","title":"ssl.handshake_continue/2","ref":"ssl.html#handshake_continue/2"},{"type":"function","doc":"Continue the TLS handshake, possibly with new, additional, or changed options.","title":"ssl.handshake_continue/3","ref":"ssl.html#handshake_continue/3"},{"type":"function","doc":"Creates an SSL listen socket.","title":"ssl.listen/2","ref":"ssl.html#listen/2"},{"type":"function","doc":"Returns the protocol negotiated through ALPN or NPN extensions.","title":"ssl.negotiated_protocol/1","ref":"ssl.html#negotiated_protocol/1"},{"type":"function","doc":"The peer certificate is returned as a DER-encoded binary.\n\nThe certificate can be\ndecoded with `public_key:pkix_decode_cert/2`. Suggested further reading about\ncertificates is [Public_Key User's Guide](`e:public_key:public_key_records.md`)\nand [SSL User's Guide](standards_compliance.md).","title":"ssl.peercert/1","ref":"ssl.html#peercert/1"},{"type":"function","doc":"Returns the address and port number of the peer.","title":"ssl.peername/1","ref":"ssl.html#peername/1"},{"type":"function","doc":"Make `Preferred` suites become the most preferred suites.\n\nThe `Preferred` suites will be put at the head of the cipher suite\nlist `Suites` after removing them from `Suites` if\npresent. `Preferred` can be a list of cipher suites or a list of\nfilters in which case the filters are used on `Suites` to extract the\npreferred cipher list.","title":"ssl.prepend_cipher_suites/2","ref":"ssl.html#prepend_cipher_suites/2"},{"type":"function","doc":"Uses the Pseudo-Random Function (PRF) of a TLS session to generate extra key\nmaterial.\n\nIt either takes user-generated values for `Secret` and `Seed` or atoms\ndirecting it to use a specific value from the session security parameters.\n\n> #### Note {: .info }\n\nThis function is replaced by `export_key_materials/4`, the officially\ndocumented API function since OTP 27, which is equivalent to\n[`prf(TLSSocket, master_secret, Label, [client_random, server_random,\nContext], WantedLength)`](`prf/5`). Other ways of calling this\nfunction were for testing purposes only and has no use case. When\ncalled in a TLS-1.3 context it will now behave as\n[`export_key_materials(TLSSocket, [Label], [Context],\n[WantedLength])`](`export_key_materials/4`).","title":"ssl.prf/5","ref":"ssl.html#prf/5"},{"type":"function","doc":"","title":"ssl.recv/2","ref":"ssl.html#recv/2"},{"type":"function","doc":"Receives a packet from a socket in passive mode.\n\nA closed socket is indicated by return value `{error, closed}`.\nArgument `Length` is meaningful only when the socket is in mode `raw`\nand denotes the number of bytes to read. If `Length` is zero, all\navailable bytes are returned. If `Length` is greater than zero,\nexactly `Length` bytes are returned, or an error; possibly discarding\nless than `Length` bytes of data when the socket gets closed from\nthe other side.\n\nOptional argument `Timeout` specifies a time-out in milliseconds. The default\nvalue is `infinity`.","title":"ssl.recv/3","ref":"ssl.html#recv/3"},{"type":"function","doc":"Initiates a new handshake.\n\nA notable return value is `{error, renegotiation_rejected}` indicating\nthat the peer refused to go through with the renegotiation, but the\nconnection is still active using the previously negotiated session.\n\nTLS-1.3 has removed the renegotiation feature from earlier TLS\nversions and instead adds a new feature called key update, which\nreplaces the most important part of renegotiation: the refreshing of\nsession keys. This is triggered automatically after reaching a\nplaintext limit and can be configured using the `key_update_at` option\nin `t:common_option_tls13/0`.","title":"ssl.renegotiate/1","ref":"ssl.html#renegotiate/1"},{"type":"function","doc":"Writes `Data` to `SslSocket`.\n\nA notable return value is `{error, closed}` indicating that the socket is\nclosed.","title":"ssl.send/2","ref":"ssl.html#send/2"},{"type":"function","doc":"Sets options according to `Options` for socket `SslSocket`.","title":"ssl.setopts/2","ref":"ssl.html#setopts/2"},{"type":"function","doc":"Immediately closes a socket in one or two directions.\n\n`How == write` means closing the socket for writing, but reading from\nit is still possible.\n\nTo handle siutations where the peer has performed a shutdown on the\nwrite side, option `{exit_on_close, false}` is useful.","title":"ssl.shutdown/2","ref":"ssl.html#shutdown/2"},{"type":"function","doc":"Lists all available signature algorithms corresponding to `Description`.\n\nThe `exclusive` option will exclusively list algorithms or algorithm schemes for\nthat protocol version, whereas the `default` and `all` options lists the\ncombined list to support the range of protocols from (D)TLS-1.2, the first\nversion to support configuration of the signature algorithms, to `Version`.\n\nExample:\n\n```erlang\n1> ssl:signature_algs(default, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\nrsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,\n{sha512,ecdsa},\n{sha384,ecdsa},\n{sha256,ecdsa}]\n\n2> ssl:signature_algs(all, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\nrsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,\n{sha512,ecdsa},\n{sha384,ecdsa},\n{sha256,ecdsa},\n{sha224,ecdsa},\n{sha224,rsa},\n{sha,rsa},\n{sha,dsa}]\n\n3> ssl:signature_algs(exclusive, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256]\n```\n\n> #### Note {: .info }\n>\n> Some TLS-1-3 scheme names overlap with TLS-1.2 algorithm-tuple-pair-names and\n> then TLS-1.3 names will be used, for example `rsa_pkcs1_sha256` instead of\n> `{sha256, rsa}`. These are legacy algorithms in TLS-1.3 that apply only to\n> certificate signatures in this version of the protocol.","title":"ssl.signature_algs/2","ref":"ssl.html#signature_algs/2"},{"type":"function","doc":"Returns the local address and port number of socket `SslSocket`.","title":"ssl.sockname/1","ref":"ssl.html#sockname/1"},{"type":"function","doc":"","title":"ssl.start/0","ref":"ssl.html#start/0"},{"type":"function","doc":"Starts the SSL application.","title":"ssl.start/1","ref":"ssl.html#start/1"},{"type":"function","doc":"Stops the SSL application.","title":"ssl.stop/0","ref":"ssl.html#stop/0"},{"type":"function","doc":"Converts an RFC or OpenSSL name string to an `t:erl_cipher_suite/0`\n\nReturns an error if the cipher suite is not supported or the name is\nnot a valid cipher suite name.","title":"ssl.str_to_suite/1","ref":"ssl.html#str_to_suite/1"},{"type":"function","doc":"Converts an [`erl_cipher_suite()`](`t:erl_cipher_suite/0`) value to\nan OpenSSL name string.\n\nPRE TLS-1.3 these names differ for RFC names","title":"ssl.suite_to_openssl_str/1","ref":"ssl.html#suite_to_openssl_str/1"},{"type":"function","doc":"Converts an [`erl_cipher_suite()`](`t:erl_cipher_suite/0`) value to an RFC\nname string.","title":"ssl.suite_to_str/1","ref":"ssl.html#suite_to_str/1"},{"type":"function","doc":"","title":"ssl.transport_accept/1","ref":"ssl.html#transport_accept/1"},{"type":"function","doc":"Accepts an incoming connection request on a listen socket.\n\n`ListenSocket` must be a socket returned from `listen/2`. The socket\nreturned is to be passed to [`handshake/1,2,3`](`handshake/3`) to\ncomplete the handshake and establish the TLS/DTLS connection.\n\n> #### Warning {: .warning }\n>\n> Most API functions require that the TLS/DTLS connection is established to work\n> as expected.\n\nThe accepted socket inherits the options set for `ListenSocket` in `listen/2`.\n\nThe default value for `Timeout` is `infinity`. If `Timeout` is specified and no\nconnection is accepted within the given time, `{error, timeout}` is returned.","title":"ssl.transport_accept/2","ref":"ssl.html#transport_accept/2"},{"type":"function","doc":"Create new session keys.\n\nThere are cryptographic limits on the amount of plaintext which can be safely\nencrypted under a given set of keys. If the amount of data surpasses those\nlimits, a key update is triggered and a new set of keys are installed. See also\nthe `key_update_at` option in `t:common_option_tls13/0`.\n\nThis function can be used to explicitly start a key update on a TLS-1.3\nconnection. There are two types of key updates: if `Type` is `write`,\nonly the writing key is updated; if `Type` is `read_write`, both the\nreading and writing keys are updated.","title":"ssl.update_keys/2","ref":"ssl.html#update_keys/2"},{"type":"function","doc":"Lists information, mainly concerning TLS/DTLS versions, in runtime for debugging\nand testing purposes.\n\n- **`app_vsn`** - The application version of the SSL application.\n\n- **`supported`** - TLS versions supported with current application environment\n and crypto library configuration. Overridden by a version option on\n [`connect/2,3,4`](`connect/2`), `listen/2`, and\n [`handshake/2,3`](`handshake/2`). For the negotiated TLS version, see\n [`connection_information/1`](`connection_information/1`).\n\n- **`supported_dtls`** - DTLS versions supported with current application\n environment and crypto library configuration. Overridden by a version option\n on [`connect/2,3,4`](`connect/2`), `listen/2`, and\n [`handshake/2,3`](`handshake/2`). For the negotiated DTLS version, see\n [`connection_information/1`](`connection_information/1`).\n\n- **`available`** - All TLS versions supported with the linked crypto library.\n\n- **`available_dtls`** - All DTLS versions supported with the linked crypto\n library.\n\n- **`implemented`** - All TLS versions supported by the SSL application if\n linked with a crypto library with the necessary support.\n\n- **`implemented_dtls`** - All DTLS versions supported by the SSL application if\n linked with a crypto library with the necessary support.","title":"ssl.versions/0","ref":"ssl.html#versions/0"},{"type":"type","doc":"The type for the messages that are delivered to the owner of a\nTLS/DTLS socket in active mode.\n\nThe `ssl_passive` message is sent only when the socket is in `{active, N}` mode\nand the counter has dropped to 0. It indicates that the socket has transitioned\nto passive (`{active, false}`) mode.","title":"ssl.active_msgs/0","ref":"ssl.html#t:active_msgs/0"},{"type":"type","doc":"Claim an intermediate CA in the chain as trusted.\n\n```erlang\nfun(Chain::[public_key:der_encoded()]) ->\n {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.\n```\n\nTLS then uses `public_key:pkix_path_validation/3` with the selected CA\nas the trusted anchor and verifies the rest of the chain.","title":"ssl.anchor_fun/0","ref":"ssl.html#t:anchor_fun/0"},{"type":"type","doc":"Configuration of the entity certificate and its corresponding key.\n\nA certificate (or possibly a list including the certificate and its\nchain certificates, where the entity certificate must be the first\nelement in the list or the first entry in the file) and its associated\nkey. For the PEM file format, there can also be a password associated\nwith the file containing the key.\n\nFor maximum interoperability, the certificates in the chain should be\nin the correct order, as the chain will be sent as-is to the peer. If\nchain certificates are not provided, certificates from the configured\ntrusted CA certificates will be used to construct the chain. See\n[`client_option_cert()`](`t:client_option_cert/0`) and\n[`server_option_cert()`](`t:server_option_cert/0`) for more\ninformation.","title":"ssl.cert_key_conf/0","ref":"ssl.html#t:cert_key_conf/0"},{"type":"type","doc":"Cipher algorithms that can be used for payload encryption.","title":"ssl.cipher/0","ref":"ssl.html#t:cipher/0"},{"type":"type","doc":"Filter that allows you to customize cipher suite list.","title":"ssl.cipher_filters/0","ref":"ssl.html#t:cipher_filters/0"},{"type":"type","doc":"A list of cipher suites that should be supported.\n\nFunction [ssl:cipher_suites/2 ](`cipher_suites/2`) can be used to find all\ncipher suites that are supported by default and all cipher suites that can be\nconfigured.\n\nIf you compose your own `t:cipher_suites/0` make sure they are\nfiltered for crypto library support using [ssl:filter_cipher_suites/2\n](`filter_cipher_suites/2`).\n\nThe following function can help creating customized cipher suite lists:\n\n- [ssl:append_cipher_suites/2 ](`append_cipher_suites/2`)\n- [ssl:prepend_cipher_suites/2](`prepend_cipher_suites/2`)\n- [ssl:suite_to_str/1](`suite_to_str/1`)\n- [ssl:str_to_suite/1](`str_to_suite/1`)\n- [ssl:suite_to_openssl_str/1](`suite_to_openssl_str/1`)\n\n> #### Note {: .info }\nNote that TLS-1.3 and TLS-1.2 use different sets of cipher suites. To\nsupport both versions, cipher suites from both sets need to be\nincluded. If the supplied list does not comply with the configured\nversions or crypto library, that is, resulting in an empty list, the option\nwill fall back to its appropriate default value for the configured\nversions.\n\nNon-default cipher suites, including anonymous cipher suites (prior to\nTLS 1.3), are supported for interoperability and testing\npurposes. These can be used by adding them to your cipher suite\nlist. Note that they also need to be supported and enabled by the peer\nto be actually used, and they may require additional configuration;\nsee [`srp_param_type()`](`t:srp_param_type/0`).","title":"ssl.cipher_suites/0","ref":"ssl.html#t:cipher_suites/0"},{"type":"type","doc":"Cipher suite formats.\n\nFor backwards compatibility, cipher suites can be configured as a\ncolon-separated string of cipher suite RFC names (or even old OpenSSL\nnames). However, a more flexible approach is to use utility functions\ntogether with [`cipher_filters()`](`t:cipher_filters/0`) if a customized\ncipher suite option is needed.","title":"ssl.ciphers/0","ref":"ssl.html#t:ciphers/0"},{"type":"type","doc":"The following options are specific to the client side, or have\ndifferent semantics for the client and server:\n\n- **`{alpn_advertised_protocols, AppProtocols}`** - Application layer protocol\n\n The list of protocols supported by the client to be sent to the server to be\n used for an Application-Layer Protocol Negotiation (ALPN). If the server\n supports ALPN, it will choose a protocol from this list; otherwise it will\n fail the connection with a `no_application_protocol` alert. A server that does\n not support ALPN will ignore this value. The list of protocols must not contain\n an empty binary.\n\n- **`{max_fragment_length, MaxLen}`** - Max fragment length extension\n\n Specifies the maximum fragment length the client is prepared to accept from the\n server. See [RFC 6066](http://www.ietf.org/rfc/rfc6066.txt).","title":"ssl.client_option/0","ref":"ssl.html#t:client_option/0"},{"type":"type","doc":"Certificate-related options specific to the client side, or with\ndifferent semantics for the client and server.\n\n- **`{verify, Verify}`** - Verification of certificates\n\n This option specifies whether certificates are to be verified.\n\n If `Verify` is `verify_peer`, which is the default, it is required\n to also provide one of the options `cacerts` or `cacertfile` in\n order for the certificate verification to succeed. For example, an\n HTTPS client can use option `{cacerts, public_key:cacerts_get()}` to\n use the trusted CA certificates provided by the operating system.\n\n If `Verify` is `verify_none`, all X.509-certificate path\n validation errors will be ignored.\n\n > #### Change {: .info }\n >\n > The default for `Verify` was changed to `verify_peer` in\n > Erlang/OTP 26.\n\n- **`{cacerts, CACerts}`** - Trusted certificates\n\n The DER-encoded trusted certificates. If this option is supplied it overrides\n option `cacertfile`.\n\n Function `public_key:cacerts_get/0` can be used to retrieve to the\n trusted CA certificates provided by the operating system.\n\n- **`{cacertfile, CertFile}`** - End entity certificate\n\n Path to a file containing PEM-encoded CA certificates. The CA certificates are\n used during server authentication and when building the client certificate\n chain.\n\n > #### Note {: .info }\n >\n > When PEM caching is enabled, files provided with this option will be checked\n > for updates at fixed time intervals specified by the\n > [ssl_pem_cache_clean](ssl_app.md#configuration) environment parameter.\n\n\n- **`{server_name_indication, SNI}`** - Server Name Indication extension\n\n Specify the hostname to be used in TLS Server Name Indication extension. If not\n specified it will default to the `Host` argument of\n [connect/3,4](`connect/3`) unless it is of type [`inet:ip_address()`](`t:inet:ip_address/0`).\n The hostname will also be used in the hostname verification of the peer\n certificate using `public_key:pkix_verify_hostname/2`.\n The special value `disable` prevents the Server Name Indication extension from\n being sent and disables the hostname verification check.\n\n- **`{customize_hostname_check, HostNameCheckOpts}`** - Customization option\n\n Customizes the hostname verification of the peer certificate, as various\n protocols that use TLS, such as HTTP or LDAP, may require different approaches. For\n example, here is how to use standard hostname checking for HTTPS implemented in\n [Public_Key](`e:public_key:public_key_app.md`):\n\n ```erlang\n {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}\n ```\n\n For futher description of the customize options, see\n `public_key:pkix_verify_hostname/3`.\n\n- **`{client_certificate_authorities, UseCertAuth}`** - Inter-op hint option\n\n If `UseCertAuth` is set to `true`, sends the certificate authorities\n extension in the TLS-1.3 client hello. The default is `false`. Note\n that setting `UseCertAuth` to `true` can result in a significant\n overhead if there exists many trusted CA certificates. (Since\n Erlang/OTP 24.3.)\n\n- **`{stapling, Stapling}`** - Certificate revocation check option\n\n If `Stapling` is atom `staple` or a map, OCSP stapling will be\n enabled, meaning that an extension of type \"status_request\" will be\n included in the client hello to indicate the desire to receive\n certificate status information.\n\n If `Stapling` is set to `no_staple` (the default), OCSP stapling will be disabled.\n\n > #### Note {: .info }\n >\n > Even if requested by the client, the OCSP response might not be\n > provided by the server. In such event, SSL will proceed with\n > the handshake and generate a `{missing, stapling_response}` logger\n > event.\n\n When `Stapling` is given as a map, boolean `ocsp_nonce` key can\n indicate whether an OCSP nonce should be requested by the client\n (default is `false`).\n\n > #### Note {: .info }\n >\n > The OCSP response can be provided without a nonce value — even if it was requested\n > by the client. In such cases SSL will proceed with the handshake and generate\n > a `{missing, ocsp_nonce}` logger event.","title":"ssl.client_option_cert/0","ref":"ssl.html#t:client_option_cert/0"},{"type":"type","doc":"Legacy client options.\n\n- **`{client_preferred_next_protocols, NextAppProtocols}`** - Next Protocol Negotiation\n\n ALPN (Application-Layer Protocol Negotiation)\n deprecates NPN (Next Protocol Negotiation) and this option.\n\n Indicates that the client wants to perform Next Protocol Negotiation.\n\n If `Precedence` is `server`, the negotiated protocol is the first protocol to be\n shown on the server advertised list that is also on the client preference\n list.\n\n If `Precedence` is `client`, the negotiated protocol is the first protocol to be\n shown on the client preference list that is also on the server advertised\n list.\n\n If the client does not support any of the server advertised protocols or the\n server does not advertise any protocols, the client falls back to the first\n protocol in its list or to the default protocol (if a default is supplied). If\n the server does not support Next Protocol Negotiation, the connection terminates\n if no default protocol is supplied.","title":"ssl.client_option_legacy/0","ref":"ssl.html#t:client_option_legacy/0"},{"type":"type","doc":"Options only relevant to TLS versions prior to TLS-1.3.\n\n- **`{reuse_session, SessionRef}`** - Explicit session reuse\n\n Reuses a specific session.\n\n Since Erlang/OTP 21.3, if the session was saved earlier using option\n `{reuse_sessions, save}`, the session can be referred by its session ID.\n\n Since Erlang/OTP 22.3, the session can be explicitly specified by\n its session ID and associated data.\n\n See also\n [SSL User's Guide, Session Reuse pre TLS 1.3.](using_ssl.md#session-reuse-prior-to-tls-1-3)\n\n- **`{reuse_sessions, Reuse}`** - Enables later session reuse\n\n When `Reuse` is set to `save`, a new connection will be negotiated and saved for later\n reuse. The session ID can be fetched with `connection_information/2` and used\n with the client option `reuse_session`.\n\n When `Reuse` is set to `true`, automated session reuse will be\n performed, if possible. If a new session is created, and is unique in regard to previous\n stored sessions, it will be saved for possible later reuse.\n\n Since: OTP 21.3.\n\n- **`{psk_identity, PskID}`** - Option for use with PSK cipher suites\n\n Specifies the identity the client presents to the server. The matching secret is\n found by the fun given in the `user_lookup_fun` option.\n\n- **`{srp_identity, SrpID}`** - Option for use SRP cipher suites\n\n Specifies the username and password to use to authenticate to the server.\n\n- **`{fallback, LegacyFallback}`** - Inter-op legacy client option\n\n Send special cipher suite TLS_FALLBACK_SCSV to avoid an undesired TLS version\n downgrade. Defaults to `false`.\n\n > #### Warning {: .warning }\n >\n > This option is not needed in normal TLS usage and must not be used to\n > implement new clients. However, legacy clients that retries connections in the\n > following manner:\n >\n > `ssl:connect(Host, Port, [...{versions, ['tlsv2', 'tlsv1.1', 'tlsv1']}])`\n >\n > `ssl:connect(Host, Port, [...{versions, [tlsv1.1', 'tlsv1']}, {fallback, true}])`\n >\n > `ssl:connect(Host, Port, [...{versions, ['tlsv1']}, {fallback, true}])`\n >\n > can use it to avoid undesired TLS version downgrade. Note that\n > TLS_FALLBACK_SCSV must also be supported by the server for the prevention to\n > work.","title":"ssl.client_option_pre_tls13/0","ref":"ssl.html#t:client_option_pre_tls13/0"},{"type":"type","doc":"Options only relevant for TLS-1.3.\n\n- **`{session_tickets, SessionTickets}`** - Use of session tickets\n\n Configures the session ticket functionality. Allowed values are `disabled`,\n `manual`, and `auto`. If it is set to `manual` the client will send the ticket\n information to user process in a 3-tuple:\n\n ```erlang\n {ssl, session_ticket, {SNI, TicketData}}\n ```\n\n where `SNI` is the ServerNameIndication and `TicketData` is the extended ticket\n data that can be used in subsequent session resumptions.\n\n If it is set to `auto`, the client automatically handles received tickets and\n tries to use them when making new TLS connections (session resumption with\n pre-shared keys).\n\n Ticket lifetime, the number of tickets sent by the server, and the\n maximum number of tickets stored by the server in stateful mode are configured\n by [application variables](ssl_app.md#configuration).\n\n See also\n [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{use_ticket, Tickets}`**\n\n Configures the session tickets to be used for session resumption. It is a\n mandatory option in `manual` mode (`{session_tickets, manual}`).\n\n > #### Note {: .info }\n >\n > Session tickets are only sent to the user if option `session_tickets` is set to\n > `manual`\n >\n > This option is supported by TLS-1.3. See also\n > [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{early_data, EarlyData}`**\n\n Configures the early data to be sent by the client.\n\n To verify that the server has the intention to process the early\n data, the following tuple is sent to the user process:\n\n ```erlang\n {ssl, SslSocket, {early_data, Result}}\n ```\n\n where `Result` is either `accepted` or `rejected`.\n\n > #### Warning {: .warning }\n >\n > It is the responsibility of the user to handle rejected `EarlyData` and to\n > resend when appropriate.\n\n- **`{middlebox_comp_mode, MiddleBoxMode}`**\n\n Configures the middlebox compatibility mode for a TLS-1.3 connection.\n\n A significant number of middleboxes misbehave when a TLS-1.3\n connection is negotiated. Implementations can increase the chance of\n making connections through those middleboxes by adapting the TLS-1.3\n handshake to resemble that of a TLS-1.2 handshake.\n\n The middlebox compatibility mode is enabled (`true`) by default.","title":"ssl.client_option_tls13/0","ref":"ssl.html#t:client_option_tls13/0"},{"type":"type","doc":"Options common to both client and server side.\n\n- **`{protocol, Protocol}`** - Choose TLS or DTLS protocol for the transport layer security.\n\n Defaults to `tls`.\n\n- **`{handshake_completion, Completion}`** - Possibly pause handshake at hello stage.\n\n Defaults to `full`. If `hello` is specified the handshake will pause\n after the hello message, allowing the user to make decisions based\n on hello extensions before continuing or aborting the handshake by\n calling `handshake_continue/3` or `handshake_cancel/1`.\n\n- **`{keep_secrets, KeepSecrets}`** - Configures a TLS 1.3 connection for keylogging.\n\n In order to retrieve keylog information on a TLS 1.3 connection, it must be\n configured in advance to keep `client_random` and various handshake secrets.\n\n The `keep_secrets` functionality is disabled (`false`) by default.\n\n Added in OTP 23.2.\n\n- **`{handshake_size, HandshakeSize}`** - Limit the acceptable handshake packet size.\n\n Used to limit the size of valid TLS handshake packets to avoid DoS\n attacks.\n\n Integer (24 bits, unsigned). Defaults to `256*1024`.\n\n- **`{hibernate_after, HibernateTimeout}`** - Hibernate inactive connection processes.\n\n When an integer-value is specified, the TLS/DTLS connection goes into hibernation\n after the specified number of milliseconds of inactivity, thus reducing its\n memory footprint. When not specified the process never goes into hibernation.\n\n- **`{log_level, Level}`** - Specifies the log level for a TLS/DTLS connection.\n\n Alerts are logged on `notice`\n level, which is the default level. The level `debug` triggers verbose logging of\n TLS/DTLS protocol messages. See also [SSL Application](ssl_app.md)\n\n- **`{receiver|sender_spawn_opts, SpawnOpts}`** - Configure erlang spawn opts.\n\n Configures spawn options of TLS sender and receiver processes.\n\n Setting up garbage collection options can be helpful for trade-offs between CPU\n usage and memory usage. See `erlang:spawn_opt/2`.\n\n For connections using Erlang distribution, the default sender option\n is `[...{priority, max}]`; this priority option cannot be changed. For all\n connections, `...link` is added to receiver and cannot be changed.","title":"ssl.common_option/0","ref":"ssl.html#t:common_option/0"},{"type":"type","doc":"Common certificate related options to both client and server.\n\n- **`{certs_keys, CertsKeys}`** - At least one certificate and key pair.\n\n A list of a certificate (or possible a certificate and its chain)\n and the associated key of the certificate that can be used to\n authenticate the client or the server. The certificate key pair that\n is considered best and matches negotiated parameters for the\n connection will be selected.\n\n The different signature algorithms are prioritized in the following\n order: `eddsa`, `ecdsa`, `rsa_pss_pss`, `rsa`, and `dsa`. If more\n than one key is supplied for the same signature algorithm, they will\n be prioritized by strength (except for _engine keys_; see the next\n paragraph). This offers flexibility to, for instance, configure a\n newer certificate that is expected to be used in most cases, and an\n older but acceptable certificate that will only be used to\n communicate with legacy systems. Note that there is a trade off\n between the induced overhead and the flexibility; thus, alternatives\n should be chosen for good reasons.\n\n _Engine keys_ will be favored over other keys. As engine keys cannot\n be inspected, supplying more than one engine key makes no sense.\n\n When this option is specified it overrides all single certificate\n and key options. For examples, see the [User's Guide](using_ssl.md).\n\n > #### Note {: .info }\n >\n > `eddsa` certificates are only supported by TLS-1.3 implementations that do not support `dsa`\n > certificates. `rsa_pss_pss` (RSA certificates using Probabilistic Signature\n > Scheme) are supported in TLS-1.2 and TLS-1.3, but some TLS-1.2 implementations\n > do not support `rsa_pss_pss`.\n\n- **`{depth, AllowedCertChainLen}`** - Limits the accepted number of certificates in the certificate chain.\n\n Maximum number of non-self-issued intermediate certificates that can follow the\n peer certificate in a valid certification path. So, if depth is 0 the PEER must\n be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA,\n ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default\n value is 10. Used to mitigate DoS attack possibilities.\n\n- **`{verify_fun, Verify}`** - Customize certificate path validation\n\n The verification fun is to be defined as follows:\n\n ```erlang\n fun(OtpCert :: #'OTPCertificate'{},\n Event, InitialUserState :: term()) ->\n\t{valid, UserState :: term()} |\n\t{fail, Reason :: term()} | {unknown, UserState :: term()}.\n\n fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),\n Event, InitialUserState :: term()) ->\n\t{valid, UserState :: term()} |\n\t{fail, Reason :: term()} | {unknown, UserState :: term()}.\n\n Types:\n Event = {bad_cert, Reason :: atom() |\n {revoked, atom()}} |\n\t\t{extension, #'Extension'{}} |\n valid |\n valid_peer\n ```\n\n The verification fun is called during the X.509-path validation when\n an error occurs or an extension unknown to the SSL application is\n encountered. It is also called when a certificate is considered\n valid by the path validation to allow access to each certificate in\n the path to the user application. It differentiates between the peer\n certificate and the CA certificates by using `valid_peer` or `valid`\n as `Event` argument to the verification fun. See the [Public_Key\n User's Guide](`e:public_key:public_key_records.md`) for definition\n of `#'OTPCertificate'{}` and `#'Extension'{}`.\n\n - If the verify callback fun returns `{fail, Reason}`, the verification process\n is immediately stopped, an alert is sent to the peer, and the TLS/DTLS\n handshake terminates.\n - If the verify callback fun returns `{valid, UserState}`, the verification\n process continues.\n - If the verify callback fun always returns `{valid, UserState}`, the TLS/DTLS\n handshake does not terminate regardless of verification failures, and the\n connection is established.\n - If called with an extension unknown to the user application, the fun is to\n return `{unknown, UserState}`.\n\n Note that if the fun returns `unknown` for an extension marked as critical,\n validation will fail.\n\n Default option `verify_fun` in `verify_peer mode`:\n\n ```erlang\n {fun(_, _, {bad_cert, _} = Reason, _) ->\n\t {fail, Reason};\n (_, _, {extension, _}, UserState) ->\n\t {unknown, UserState};\n (_, _, valid, UserState) ->\n\t {valid, UserState};\n (_, _, valid_peer, UserState) ->\n {valid, UserState}\n end, []}\n ```\n\n Default option `verify_fun` in mode `verify_none`:\n\n ```erlang\n {fun(_, _, {bad_cert, _}, UserState) ->\n\t {valid, UserState};\n (_, _, {extension, #'Extension'{critical = true}}, UserState) ->\n\t {valid, UserState};\n (_, _, {extension, _}, UserState) ->\n\t {unknown, UserState};\n (_, _, valid, UserState) ->\n\t {valid, UserState};\n (_, _, valid_peer, UserState) ->\n {valid, UserState}\n end, []}\n ```\n\n The possible path validation errors are given in the form `{bad_cert, Reason}`,\n where `Reason` is:\n\n - **`unknown_ca`**\n\n No trusted CA was found in the trusted store. The trusted\n CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust\n can be claimed for an intermediate CA (the trusted anchor does not have to be\n self-signed according to X-509) by using option `partial_chain`.\n\n - **`selfsigned_peer`**\n\n The chain consisted only of one self-signed certificate.\n\n - **`PKIX X-509-path validation error`**\n\n For possible reasons, see `public_key:pkix_path_validation/3`.\n\n- **`{cert_policy_opts, PolicyOpts}`** - Handle certificate policies.\n\n Configure X.509 certificate policy handling for the certificate path validation process;\n see [public_key:pkix_path_validation/3](`public_key:pkix_path_validation/3`) for\n more details.\n\n- **`{cerl_check, Check}`** - Handle certificate revocation lists.\n\n Perform CRL (Certificate Revocation List) verification\n [(public_key:pkix_crls_validate/3)](`public_key:pkix_crls_validate/3`) on all\n the certificates during the path validation\n [(public_key:pkix_path_validation/3) ](`public_key:pkix_path_validation/3`)of\n the certificate chain. `Check` defaults to `false`.\n\n The meaning of `Check` is as follows:\n\n - **`false`**\n\n No checks are performed.\n\n - **`peer`**\n\n Check is only performed on the peer certificate.\n\n - **`best_effort`**\n\n If certificate revocation status cannot be determined it will be accepted as valid.\n\n The CA certificates specified for the connection will be used to construct the\n certificate chain validating the CRLs.\n\n The CRLs will be fetched from a local or external cache. See\n `m:ssl_crl_cache_api`.","title":"ssl.common_option_cert/0","ref":"ssl.html#t:common_option_cert/0"},{"type":"type","doc":"Common options to client and server only valid for DTLS.\n\n- **`{use_srtp, UseSrtp}`** - Configures the `use_srtp` DTLS hello extension.\n\n In order to negotiate the use of SRTP data protection, clients include an\n extension of type \"use_srtp\" in the DTLS extended client hello. This extension\n MUST only be used when the data being transported is RTP or RTCP.\n\n The value is a map with a mandatory `protection_profiles` parameter\n and an optional `mki` parameter.\n\n `protection_profiles` configures the list of the client's acceptable SRTP\n Protection Profiles. Each profile is a 2-byte binary. Example:\n `#{protection_profiles => [<<0,2>>, <<0,5>>]}`\n\n `mki` configures the SRTP Master Key Identifier chosen by the client.\n\n The `srtp_mki` field contains the value of the SRTP MKI which is associated with\n the SRTP master keys derived from this handshake. Each SRTP session MUST have\n exactly one master key that is used to protect packets at any given time. The\n client MUST choose the MKI value so that it is distinct from the last MKI value\n that was used, and it SHOULD make these values unique for the duration of the\n TLS session.\n\n > #### Note {: .info }\n >\n > OTP does not handle SRTP, so an external implementations of SRTP\n > encoder/decoder and a packet demultiplexer are needed to make use of the\n > `use_srtp` extension. See also option [transport_option](`t:transport_option/0`).\n\n Servers that receive an extended hello containing a \"use_srtp\" extension can\n agree to use SRTP by including an extension of type \"use_srtp\", with the chosen\n protection profile in the extended server hello. This extension MUST only be\n used when the data being transported is RTP or RTCP.","title":"ssl.common_option_dtls/0","ref":"ssl.html#t:common_option_dtls/0"},{"type":"type","doc":"Legacy options considered deprecated in favor of other options,\ninsecure to use, or plainly not relevant anymore.\n\n- **`{cert, Certs}`**\n\n Use option `certs_keys` instead.\n\n- **`{certfile, CertPem}`**\n\n Use option `certs_keys` instead.\n\n- **`{keyfile, KeyPem}`**\n\n Use option `certs_keys` instead.\n\n- **`{password, KeyPemPasswd}`**\n\n Use option `certs_keys` instead.\n\n- **`{log_alert, LogAlert}`**\n\n If `LogAlert` is `false`, TLS/DTLS Alert reports are not displayed. Deprecated in OTP\n 22; use `{log_level, Level}` instead.\n\n- **`{padding_check, PaddingCheck}`** - Inter-op trade-off option\n\n Affects TLS-1.0 connections only. If set to `false`, it disables the block\n cipher padding check to be able to interoperate with legacy software.\n\n > #### Warning {: .warning }\n >\n > Using `{padding_check, false}` makes TLS vulnerable to the Poodle attack.\n\n- **`{beast_mitigation, BeastMitigation}`** - Inter-op trade-off option\n\n Affects TLS-1.0 connections only. Used to change the BEAST mitigation strategy\n to interoperate with legacy software. Defaults to `one_n_minus_one`.\n\n `one_n_minus_one` - Perform `1/n-1` BEAST mitigation.\n\n `zero_n` - Perform `0/n` BEAST mitigation.\n\n `disabled` - Disable BEAST mitigation.\n\n > #### Warning {: .warning }\n >\n > Using `{beast_mitigation, disabled}` makes TLS-1.0 vulnerable to the BEAST\n > attack.\n\n- **`{ssl_imp, Imp}`**\n\n Deprecated since OTP 17; has no effect.","title":"ssl.common_option_legacy/0","ref":"ssl.html#t:common_option_legacy/0"},{"type":"type","doc":"Options common to client and server side prior to TLS-1.3.\n\n- **`{eccs, NamedCurves}`** - Named Elliptic Curves\n\n Elliptic curves that can be used in pre TLS-1.3 key exchange.\n\n- **`{secure_renegotiate, SecureRenegotiate}`** - Inter-operate trade-off option\n\n Specifies whether to reject renegotiation attempt that does not live\n up to [RFC 5746](http://www.ietf.org/rfc/rfc5746.txt). By default,\n `SecureRenegotiate` is `true`, meaning that secure renegotiation is\n enforced. If `SecureRenegotiate` is `false` secure renegotiation\n will still be used if possible, but it falls back to insecure\n renegotiation if the peer does not support if [RFC\n 5746](http://www.ietf.org/rfc/rfc5746.txt).\n\n- **`{user_lookup_fun, {LookupFun, UserState}}`** - PSK/SRP cipher suite option\n\n The lookup fun is to be defined as follows:\n\n ```erlang\n fun(psk, PSKIdentity :: binary(), UserState :: term()) ->\n\t{ok, SharedSecret :: binary()} | error;\n fun(srp, Username :: binary(), UserState :: term()) ->\n\t{ok, {SRPParams :: srp_param_type(), Salt :: binary(),\n\t DerivedKey :: binary()}} | error.\n ```\n\n For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client\n and server to determine the shared secret. When called by the client,\n `PSKIdentity` is the hint presented by the server or `undefined`. When\n called by the server, `PSKIdentity` is the identity presented by the client.\n\n For Secure Remote Password (SRP), the fun is only used by the server to obtain\n parameters that it uses to generate its session keys. `DerivedKey` is to be\n derived according to [RFC 2945](http://tools.ietf.org/html/rfc2945#section/3)\n and [RFC 5054](http://tools.ietf.org/html/rfc5054#section-2.4):\n `crypto:sha([Salt, crypto:sha([Username, <<$:>>, Password])])`","title":"ssl.common_option_pre_tls13/0","ref":"ssl.html#t:common_option_pre_tls13/0"},{"type":"type","doc":"Common options to both client and server for TLS-1.3.\n\n- **`{supported_groups, Groups}`** - Key exchange option\n\n TLS 1.3 introduces the \"supported_groups\" extension, which is used for negotiating\n the Diffie-Hellman parameters in a TLS 1.3 handshake. Both client and server can\n specify a list of parameters that they are willing to use.\n\n If not specified it will use a default list (`[x25519, x448, secp256r1,\n secp384r1]`) that is filtered based on the installed crypto library version.\n\n- **`{key_update_at, KeyUpdateAt}`** - Session key renewal\n\n Configures the maximum amount of bytes that can be sent on a TLS 1.3 connection\n before an automatic key update is performed.\n\n There are cryptographic limits on the amount of plaintext which can be safely\n encrypted under a given set of keys. The current default ensures that data\n integrity will not be breached with probability greater than `1/2^57`. For more\n information see\n [Limits on Authenticated Encryption Use in TLS](https://eprint.iacr.org/2024/051.pdf).","title":"ssl.common_option_tls13/0","ref":"ssl.html#t:common_option_tls13/0"},{"type":"type","doc":"Key value list convening some information about the established connection.","title":"ssl.connection_info/0","ref":"ssl.html#t:connection_info/0"},{"type":"type","doc":"TLS connection keys for which information can be retrieved.","title":"ssl.connection_info_keys/0","ref":"ssl.html#t:connection_info_keys/0"},{"type":"type","doc":"TLS connection information relevant prior to TLS-1.3.","title":"ssl.connection_info_pre_tls13/0","ref":"ssl.html#t:connection_info_pre_tls13/0"},{"type":"type","doc":"Options for using built-in CRL cache support.\n\nSpecify how to perform lookup and caching of certificate revocation\nlists (CRLs). `Module` defaults to `m:ssl_crl_cache` with `DbHandle`\nbeing `internal`, and `Args` being `[]`.\n\nThere are two implementations available:\n\n- **`ssl_crl_cache`** - Implementation 1\n\n This module maintains a cache of CRLs. CRLs can be added to the\n cache using `ssl_crl_cache:insert/1`, and can optionally be\n automatically fetched through HTTP if the following argument is\n specified:\n\n - **`{http, timeout()}`**\n\n Enables fetching of CRLs specified as http URIs in [X.509 certificate\n extensions](`e:public_key:public_key_records.md`). Requires the\n [Inets](`e:inets:introduction.md`) application.\n\n- **`ssl_crl_hash_dir`** - Implementation 2\n\n This module makes use of a directory where CRLs are\n stored in files named by the hash of the issuer name.\n\n The file names consist of eight hexadecimal digits followed by `.rN`, where\n `N` is an integer, for example `1a2b3c4d.r0`. For the first version of the CRL, `N`\n starts at zero, and for each new version, `N` is incremented by one. The\n OpenSSL utility `c_rehash` creates symlinks according to this pattern.\n\n For a given hash value, this module finds all consecutive `.r*`\n files starting from zero, and those files taken together make up the\n revocation list. CRL files with `nextUpdate` fields in the past or\n issued by a different CA that happens to have the same name hash\n are excluded.\n\n The following argument is required:\n\n - **`{dir, string()}`**\n\n Specifies the directory in which the CRLs can be found.","title":"ssl.crl_cache_opts/0","ref":"ssl.html#t:crl_cache_opts/0"},{"type":"type","doc":"A DTLS protocol version that are no longer supported by default for security reasons.","title":"ssl.dtls_legacy_version/0","ref":"ssl.html#t:dtls_legacy_version/0"},{"type":"type","doc":"DTLS protocol version.","title":"ssl.dtls_version/0","ref":"ssl.html#t:dtls_version/0"},{"type":"type","doc":"Erlang cipher suite representation\n\n> #### Warning {: .warning }\nEnabling cipher suites using RSA as a key exchange algorithm is\nstrongly discouraged (only available prior to TLS-1.3). For some\nconfigurations software preventions may exist, and can make them\nusable if they work, but relying on them to work is risky. There\nexists more reliable cipher suites that can be used instead.","title":"ssl.erl_cipher_suite/0","ref":"ssl.html#t:erl_cipher_suite/0"},{"type":"type","doc":"If a TLS connection fails a TLS protocol ALERT will be sent/received.\n\nAn atom reflecting the raised alert, according to the TLS protocol, and a description string\nwith some further details will be returned.","title":"ssl.error_alert/0","ref":"ssl.html#t:error_alert/0"},{"type":"type","doc":"TLS-1.3 key exchange configuration.","title":"ssl.group/0","ref":"ssl.html#t:group/0"},{"type":"type","doc":"Hash algorithms used together with signing and encryption functions.","title":"ssl.hash/0","ref":"ssl.html#t:hash/0"},{"type":"type","doc":"A name or address to a host.","title":"ssl.host/0","ref":"ssl.html#t:host/0"},{"type":"type","doc":"Cipher Suite Key Exchange Algorithm will be `any`\nin TLS-1.3 as key exchange is no longer part of cipher suite\nconfiguration in TLS-1.3.","title":"ssl.kex_algo/0","ref":"ssl.html#t:kex_algo/0"},{"type":"type","doc":"The user's private key.\n\nThe key can be provided either directly as a DER-encoded entity,\nindirectly using a crypto engine/provider (with key reference\ninformation), or as an Erlang fun (with possible custom options).\nThe latter two options can be used for customized signing with\nhardware security modules (HSM) or trusted platform modules (TPM).\n\n- A DER encoded key will need to specify the ASN-1 type used to create the\n encoding.\n- An engine/provider needs to specify specific information to support this\n concept and can optionally be password protected; see also\n [crypto:engine_load/3 ](`crypto:engine_load/3`) and\n [Crypto User's Guide](`e:crypto:engine_load.md`).\n- A fun option should include a fun that mimics `public_key:sign/4` and possibly\n [public_key:private_encrypt/4](`public_key:encrypt_private/3`) if legacy\n versions TLS-1.0 and TLS-1.1 must be supported.","title":"ssl.key/0","ref":"ssl.html#t:key/0"},{"type":"type","doc":"Cipher algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_cipher/0","ref":"ssl.html#t:legacy_cipher/0"},{"type":"type","doc":"Hash algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_hash/0","ref":"ssl.html#t:legacy_hash/0"},{"type":"type","doc":"Key exchange configuration prior to TLS-1.3.\n\nThese curves have been deprecated by RFC 8422.","title":"ssl.legacy_named_curve/0","ref":"ssl.html#t:legacy_named_curve/0"},{"type":"type","doc":"Signature algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_sign_algo/0","ref":"ssl.html#t:legacy_sign_algo/0"},{"type":"type","doc":"This is only used for certificate signatures if TLS-1.2 is negotiated,\nmeaning that the peer only supports TLS-1.2, but we also support\nTLS-1.3.","title":"ssl.legacy_sign_scheme/0","ref":"ssl.html#t:legacy_sign_scheme/0"},{"type":"type","doc":"Key exchange configuration prior to TLS-1.3.","title":"ssl.named_curve/0","ref":"ssl.html#t:named_curve/0"},{"type":"type","doc":"For backwards compatibility only; do not use.","title":"ssl.old_cipher_suite/0","ref":"ssl.html#t:old_cipher_suite/0"},{"type":"type","doc":"","title":"ssl.prf_random/0","ref":"ssl.html#t:prf_random/0"},{"type":"type","doc":"Client hello extensions.","title":"ssl.protocol_extensions/0","ref":"ssl.html#t:protocol_extensions/0"},{"type":"type","doc":"TLS or DTLS protocol version.","title":"ssl.protocol_version/0","ref":"ssl.html#t:protocol_version/0"},{"type":"type","doc":"Error reason for debug purposes.\n\nNot to be matched.","title":"ssl.reason/0","ref":"ssl.html#t:reason/0"},{"type":"type","doc":"Supported in TLS-1.3 and TLS-1.2.","title":"ssl.rsassa_pss_scheme/0","ref":"ssl.html#t:rsassa_pss_scheme/0"},{"type":"type","doc":"TLS connection information that can be used for NSS key logging.","title":"ssl.security_info/0","ref":"ssl.html#t:security_info/0"},{"type":"type","doc":"Options specific to the server side, or with different semantics for the client and server.\n\n- **`{alpn_preferred_protocols, AppProtocols}`** - Application Layer Protocol Negotiation\n\n Indicates that the server will try to perform Application-Layer\n Protocol Negotiation (ALPN).\n\n The list of protocols is in order of preference. The protocol negotiated will be\n the first in the list that matches one of the protocols advertised by the\n client. If no protocol matches, the server will fail the connection with a\n `no_application_protocol` alert.\n\n The negotiated protocol can be retrieved using the\n [`negotiated_protocol/1`](`negotiated_protocol/1`) function.\n\n- **`{sni_fun, SNIFun}`**\n\n If the server receives a SNI (Server Name Indication) from the\n client, the given fun `SNIFun` will be called to retrieve\n [`server_option()`](`t:server_option/0`) for the indicated\n hosts. These options will override previously specified options for\n that host.\n\n > #### Note {: .info }\n The options `sni_fun` and `sni_hosts` are mutually exclusive.\n\n- **`{sni_hosts, SNIHosts}`**\n\n If the server receives a SNI (Server Name Indication) from the client matching a\n host listed in the `sni_hosts` option, the specific options for that host will\n override previously specified options.\n\n > #### Note {: .info }\n The options `sni_fun` and `sni_hosts` are mutually exclusive.","title":"ssl.server_option/0","ref":"ssl.html#t:server_option/0"},{"type":"type","doc":"Certificate related options for a server.\n\n- **`{cacerts, CACerts}`** - Trusted certificates.\n\n The DER-encoded trusted certificates. If this option is supplied, it overrides\n the `cacertfile` option.\n\n- **`{verify, Verify}`** - Verify certificates.\n\n Client certificates are an optional part of the TLS protocol. A server performs\n X.509 certificate path validation only in `verify_peer` mode. By default the server\n is in `verify_none` mode and, hence, will not send an certificate request to the\n client. When using `verify_peer` you may also want to specify the options\n `fail_if_no_peer_cert` and `certificate_authorities`.\n\n- **`{fail_if_no_peer_cert, FailNoPeerCert}`** - Legacy trade-off option\n\n Used together with `{verify, verify_peer}` by an TLS/DTLS server. If set to\n `true`, the server fails if the client does not have a certificate to send, that\n is, sends an empty certificate. If set to `false`, it fails only if the client\n sends an invalid certificate (an empty certificate is considered valid).\n Defaults to `false`.\n\n- **`{certificate_authorities, ServerCertAuth}`** - Inter-operate hint option\n\n Determines whether a TLS-1.3 server should include the authorities extension in its\n certificate request message that is sent when the option `verify` is set to\n `verify_peer`. Defaults to `true`.\n\n A reason to exclude the extension would be if the server wants to communicate\n with clients incapable of sending complete certificate chains that adhere to the\n extension, but the server still has the capability to recreate a chain that it\n can verify.","title":"ssl.server_option_cert/0","ref":"ssl.html#t:server_option_cert/0"},{"type":"type","doc":"Legacy server options.\n\n- **`{next_protocols_advertised, NextAppProtocols}`**\n\n ALPN (Application-Layer Protocol Negotiation)\n deprecates NPN (Next Protocol Negotiation) described here.\n\n List of protocols to send to the client if the client indicates that it supports\n the Next Protocol extension. The client can select a protocol that is not on\n this list. The list of protocols must not contain an empty binary. If the server\n negotiates a Next Protocol, it can be accessed using the\n `negotiated_protocol/1` method.","title":"ssl.server_option_legacy/0","ref":"ssl.html#t:server_option_legacy/0"},{"type":"type","doc":"Options only relevant to TLS versions prior to TLS-1.3.\n\n- **`{client_renegotiation, ClientRengotiation}`** - DoS attack avoidance option\n\n In protocols that support client-initiated renegotiation, the resource cost\n of such an operation is higher for the server than the client. This can act as a\n vector for denial-of-service (DoS) attacks. The SSL application already takes measures\n to counter-act such attempts, but client-initiated renegotiation can be completely\n disabled by setting this option to `false`. The default value is `true`. Note\n that disabling renegotiation can result in long-lived connections becoming\n unusable due to limits on the number of messages the underlying cipher suite can\n encipher.\n\n- **`{reuse_sessions, ReuseSessions}`** - Enable session reuse\n\n The boolean value `true` specifies that the server will agree to reuse sessions.\n Setting it to `false` will result in an empty session table, meaning that no sessions\n will be reused.\n\n- **`{reuse_session, ReuseSession}`** - Local server reuse policy\n\n Enables the TLS/DTLS server to have a local policy for deciding whether a session\n is to be reused. Meaningful only if `reuse_sessions` is set to `true`.\n\n `ReuseSession` should be a fun:\n\n `fun(SuggestedSessionId, PeerCert, Compression, CipherSuite)`\n\n `SuggestedSessionId` is a [`binary()`](`t:binary/0`),\n `PeerCert` is a DER-encoded certificate,\n `Compression` is an enumeration integer, and `CipherSuite` is of type\n [`erl_cipher_suite()`](`t:erl_cipher_suite/0`).\n\n- **`{psk_identity, PSKHint}`** - Inter-operate hint option\n\n Specifies the server identity hint that the server presents to the client.\n\n- **`{honor_cipher_order, HonorServerCipherOrder}`** - Trade-off option alters protocol defined behavior\n\n If `true`, use the server's preference for ECC curve selection. If `false` (the\n default), use the client's preference.\n\n- **`{honor_ecc_order, HonorServerECCOrder}`** - Trade-off option alters protocol defined behavior\n\n If `true`, use the server's preference for ECC curve selection. If `false` (the\n default), use the client's preference.\n\n- **`{dh, DHder}`** - Affects DH key exchange cipher suites\n\n The DER-encoded Diffie-Hellman parameters. If specified, it overrides option\n `dhfile`.\n\n- **`{dh_file, DHfile}`** - Affects DH key exchange cipher suites\n\n Path to a file containing PEM-encoded Diffie Hellman parameters to be used by\n the server if a cipher suite using Diffie Hellman key exchange is negotiated. If\n not specified, default parameters are used.","title":"ssl.server_option_pre_tls13/0","ref":"ssl.html#t:server_option_pre_tls13/0"},{"type":"type","doc":"Options only relevant for TLS-1.3.\n\n- **`{session_tickets, SessionTickets}`**\n\n Configures the session ticket functionality. Allowed values for `SessionTickets` are:\n\n * `disabled`\n * `stateful`\n * `stateless`\n * `stateful_with_cert`\n * `stateless_with_cert`\n\n If `SessionTickets` is not set to `disabled`, session resumption with pre-shared\n keys is enabled and the server will send stateful or stateless session tickets to the\n client after successful connections.\n\n > #### Note {: .info }\n In pre-shared key session ticket resumption, there is no certificate\n exchange involved. Therefore, `ssl:peercert/1` will not return the\n peer certificate, as it is only communicated during the initial\n handshake. To associate the client certificate from the original\n handshake with the tickets it issues, the server options\n `stateful_with_cert` or `stateless_with_cert` can be used.\n\n A stateful session ticket is a database reference to internal state information.\n A stateless session ticket is a self-encrypted binary that contains both\n cryptographic keying material and state data.\n\n > #### Warning {: .warning }\n When `SessionTickets` is set to `stateful_with_cert`, the client\n certificate is stored along with the internal state information,\n leading to increased memory consumption. Conversely, when it is set\n to `stateless_with_cert`, the client certificate is encoded in the\n self-encrypted binary sent to the client, resulting in an increase\n in payload size.\n\n See also [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{stateless_tickets_seed, TicketSeed}`** - Option for statless tickets\n\n Configures the seed used for the encryption of stateless session tickets.\n Allowed values are any randomly generated `t:binary/0`. If this option is not\n configured, an encryption seed will be randomly generated.\n\n > #### Warning {: .warning }\n >\n > Reusing the ticket encryption seed between multiple server instances enables\n > stateless session tickets to work across multiple server instances, but it\n > breaks anti-replay protection across instances.\n >\n > Inaccurate time synchronization between server instances can also affect\n > session ticket freshness checks, potentially causing false negatives as well\n > as false positives.\n\n- **`{anti_replay, AntiReplay}`** - Option for statless tickets\n\n Configures the server's built-in anti replay feature based on Bloom filters.\n\n Allowed values for `AntiReplay` are the pre-defined `'10k'`,\n `'100k'`, or a custom 3-tuple that defines the properties of the\n bloom filters:\n `{WindowSize, HashFunctions, Bits}`. `WindowSize` is the number of seconds after\n the current Bloom filter is rotated and also the window size used for freshness\n checks of ClientHello. `HashFunctions` is the number hash functions and `Bits`\n is the number of bits in the bit vector. `'10k'` and `'100k'` are simple\n defaults with the following properties:\n\n - `'10k'`: Bloom filters can hold 10000 elements with 3% probability of false\n positives. `WindowSize`: 10, `HashFunctions`: 5, `Bits:` 72985 (8.91 KiB).\n - `'100k'`: Bloom filters can hold 100000 elements with 3% probability of false\n positives. `WindowSize`: 10, `HashFunctions`: 5, `Bits`: 729845 (89.09 KiB).\n\n See also [SSL User's Guide, Anti-Replay Protection in TLS\n 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3).\n\n- **`{cookie, Cookie}`** - Option for `HelloRetryRequest` behavior\n\n If `Cookie` is `true`, which is the default, the server sends a\n cookie extension in its `HelloRetryRequest` messages.\n\n The cookie extension has two main purposes. It allows the server to force the\n client to demonstrate reachability at their apparent network address (thus\n providing a measure of DoS protection). This is primarily useful for\n non-connection-oriented transports. It also allows offloading the server's\n state to the client. The cookie extension is enabled by default as it is a\n mandatory extension in RFC8446.\n\n- **`{early_data, EarlyData}`** - Option for accepting or rejecting Early Data\n\n Configures if the server accepts (`enabled`) or rejects (`disabled`) early data\n sent by a client. The default value is `disabled`.","title":"ssl.server_option_tls13/0","ref":"ssl.html#t:server_option_tls13/0"},{"type":"type","doc":"Identifies a TLS session prior to TLS-1.3.","title":"ssl.session_id/0","ref":"ssl.html#t:session_id/0"},{"type":"type","doc":"SHA2 hash algorithms.","title":"ssl.sha2/0","ref":"ssl.html#t:sha2/0"},{"type":"type","doc":"Signature algorithms.","title":"ssl.sign_algo/0","ref":"ssl.html#t:sign_algo/0"},{"type":"type","doc":"Signature schemes, defined by TLS-1.3, and replacing signature algorithms from TLS-1.2.\n\nExplicitly list acceptable signature schemes in the preferred\norder.\n\nOverrides the algorithms supplied in\n[`signature_algs`](`t:signature_algs/0`) option for certificates.\nIn addition to the `signature_algorithms` extension from TLS 1.2,\n[TLS 1.3 (RFC 5246 Section 4.2.3)](http://www.ietf.org/rfc/rfc8446.txt#section-4.2.3)\nadds the `signature_algorithms_cert` extension which enables having special\nrequirements on the signatures used in the certificates that differs from the\nrequirements on digital signatures as a whole. If this is not required this\nextension is not needed.\n\nThe client will send a `signature_algorithms_cert` extension (in the\nclient hello message), if TLS version 1.2 (back-ported to TLS 1.2 in\n24.1) or later is used, and the signature_algs_cert option is\nexplicitly specified. By default, only the\n[signature_algs](`t:signature_algs/0`) extension is sent with the\nexception of when signature_algs option is not explicitly specified,\nin which case it will append the rsa_pkcs1_sha1 algorithm to the\ndefault value of signature_algs and use it as value for\nsignature_algs_cert to allow certificates to have this signature but\nstill disallow sha1 use in the TLS protocol, since 27.0.1 and 26.2.5.2.\n\n> #### Note {: .info }\n>\n> Note that supported signature schemes for TLS-1.2 are\n[`legacy_sign_scheme()`](`t:legacy_sign_scheme/0`)\n> and [`rsassa_pss_scheme()`](`t:rsassa_pss_scheme/0`).","title":"ssl.sign_scheme/0","ref":"ssl.html#t:sign_scheme/0"},{"type":"type","doc":"Explicitly list acceptable signature algorithms for certificates and handshake\nmessages in the preferred order.\n\nThe client will send its list as the client hello\n`signature_algorithm` extension introduced in TLS-1.2; see [Section\n7.4.1.4.1 in RFC 5246](http://www.ietf.org/rfc/rfc5246.txt). Before\nTLS-1.2, these algorithms where implicitly chosen and partly derived\nfrom the cipher suite.\n\nIn TLS-1.2 a somewhat more explicit negotiation is made possible using a list of\n`{HashAlgo, SignAlgo}` tuples.\n\nIn TLS-1.3, these algorithm pairs are replaced by [signature\nschemes](`t:sign_scheme/0`) that are completely decoupled from the\ncipher suite.\n\nSignature algorithms used for certificates can be overridden by the\n[signature schemes](`t:sign_scheme/0`) supplied by the\n`signature_algs_cert` option.\n\nThe TLS-1.2 default is `Default_TLS_12_Alg_Pairs` interleaved with\n`rsa_pss_schemes` since ssl-11.0 (Erlang/OTP 25). `pss_pss` is\npreferred over `pss_rsae`, which in turn is preferred over `rsa`.\n\nThe list for `Default_TLS_12_Alg_Pairs` is defined as follows:\n\n```erlang\n[\n{sha512, ecdsa},\n{sha512, rsa},\n{sha384, ecdsa},\n{sha384, rsa},\n{sha256, ecdsa},\n{sha256, rsa}\n]\n```\n\n> #### Change {: .info }\n>\n> - Support for `{md5, rsa}` was removed from the TLS-1.2 default in\n> ssl-8.0 (Erlang/OTP 22).\n> - Support for `{sha, _}` (SHA1) and `{sha224, _}` was removed\n> from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).\n\nThe list for `rsa_pss_schemes` is defined as follows:\n\n\n```erlang\n[rsa_pss_pss_sha512,\nrsa_pss_pss_sha384,\nrsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,\nrsa_pss_rsae_sha384,\nrsa_pss_rsae_sha256]\n```\n\nThe list of `TLS_13_Legacy_Schemes` is defined as follows:\n\n```erlang\n[\n%% Legacy algorithms only applicable to certificate signatures\nrsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}\nrsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}\nrsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}\n]\n```\n\nThe list of `Default_TLS_13_Schemes` is defined as follows:\n\n```text\n[\n%% EDDSA\neddsa_ed25519,\neddsa_ed448\n\n%% ECDSA\necdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,\necdsa_secp256r1_sha256] ++\n\n%% RSASSA-PSS\nrsa_pss_schemes()\n```\n\n> #### Change {: .info }\n>\n> EDDSA was made highest priority in ssl-10.8 (Erlang/OTP 25).\n\nThe TLS-1.3 default is `Default_TLS_13_Schemes`.\n\nIf both TLS-1.3 and TLS-1.2 are supported the default is:\n\n```erlang\nDefault_TLS_13_Schemes ++ TLS_13_Legacy_Schemes ++\nDefault_TLS_12_Alg_Pairs %% not represented in TLS_13_Legacy_Schemes\n```\n\nto ensure that appropriate algorithms can be chosen for the negotiated\nversion.\n\n> #### Note {: .info }\nTLS-1.2 algorithms will not be negotiated for TLS-1.3, but the TLS-1.3\nRSASSA-PSS ([`rsassa_pss_scheme()`](`t:rsassa_pss_scheme/0`))\nsignature schemes can be negotiated also for TLS-1.2 from Erlang/OTP\n24.1 (fully working from Erlang/OTP 24.1.3). However, if both TLS 1.3\nand TLS 1.2 are supported using defaults, and TLS 1.3 is negotiated,\nthe corresponding TLS 1.2 algorithms for TLS 1.3 legacy signature\nschemes will be treated as legacy schemes and applied only to\ncertificate signatures.","title":"ssl.signature_algs/0","ref":"ssl.html#t:signature_algs/0"},{"type":"type","doc":"A socket that can be used to perform a so-called \"START-TLS\", which\nmeans using an already connected socket previously used for plain TCP\ntraffic and upgrading it to use TLS.\n\nBoth sides needs to agree on the upgrade.","title":"ssl.socket/0","ref":"ssl.html#t:socket/0"},{"type":"type","doc":"Options for the transport socket.\n\nThe default socket options are\n`[{mode, list}, {packet, 0}, {header, 0}, {active, true}]`.\n\nFor valid options, see `m:inet`, `m:gen_tcp`, and `m:gen_udp`\nin Kernel. Note that stream-oriented options such as `packet` are\nonly relevant for TLS and not DTLS.","title":"ssl.socket_option/0","ref":"ssl.html#t:socket_option/0"},{"type":"type","doc":"SRP cipher suite configuration prior to TLS-1.3.","title":"ssl.srp_param_type/0","ref":"ssl.html#t:srp_param_type/0"},{"type":"type","doc":"An opaque reference to the TLS/DTLS connection.\n\nNote that despite being opaque, matching `sslsocket()` instances is allowed.","title":"ssl.sslsocket/0","ref":"ssl.html#t:sslsocket/0"},{"type":"type","doc":"TLS Alert Protocol reasons.","title":"ssl.tls_alert/0","ref":"ssl.html#t:tls_alert/0"},{"type":"type","doc":"An option that can be supplied to a TLS client.","title":"ssl.tls_client_option/0","ref":"ssl.html#t:tls_client_option/0"},{"type":"type","doc":"A TLS protocol version that are no longer supported by default for security reasons.","title":"ssl.tls_legacy_version/0","ref":"ssl.html#t:tls_legacy_version/0"},{"type":"type","doc":"An option related to the TLS/DTLS protocol.","title":"ssl.tls_option/0","ref":"ssl.html#t:tls_option/0"},{"type":"type","doc":"An option that can be supplied to a TLS server.","title":"ssl.tls_server_option/0","ref":"ssl.html#t:tls_server_option/0"},{"type":"type","doc":"TLS protocol version.","title":"ssl.tls_version/0","ref":"ssl.html#t:tls_version/0"},{"type":"type","doc":"Transport option defines a callback module and message tags to handle the underlying transport socket.\n\nCan be used to customize the transport layer. The tag\nvalues should be the values used by the underlying transport in its active mode\nmessages.\n\nDefaults to `{gen_tcp, tcp, tcp_closed, tcp_error, tcp_passive}` for TLS.\n\n> #### Note {: .info }\nFor backward compatibility a tuple of size four will be converted to a\ntuple of size five, where `PassiveTag` is the `DataTag` element with\n`_passive` appended.\n\nFor TLS the callback module must implement a reliable transport\nprotocol, behave as `m:gen_tcp`, and have functions corresponding to\n`inet:setopts/2`, `inet:getopts/2`, `inet:peername/1`, `inet:sockname/1`, and\n`inet:port/1`. The callback `m:gen_tcp` is treated specially and calls `m:inet`\ndirectly. For DTLS this feature is considered experimental.","title":"ssl.transport_option/0","ref":"ssl.html#t:transport_option/0"},{"type":"module","doc":"CRL cache\n\nImplements an internal CRL (Certificate Revocation List) cache. In addition to\nimplementing the `m:ssl_crl_cache_api` behaviour the following functions are\navailable.","title":"ssl_crl_cache","ref":"ssl_crl_cache.html"},{"type":"function","doc":"Delete CRLs from the ssl applications local cache.","title":"ssl_crl_cache.delete/1","ref":"ssl_crl_cache.html#delete/1"},{"type":"function","doc":"","title":"ssl_crl_cache.insert/1","ref":"ssl_crl_cache.html#insert/1"},{"type":"function","doc":"Insert CRLs into the ssl applications local cache, with or without a\ndistribution point reference URI","title":"ssl_crl_cache.insert/2","ref":"ssl_crl_cache.html#insert/2"},{"type":"type","doc":"A source to input CRLs","title":"ssl_crl_cache.crl_src/0","ref":"ssl_crl_cache.html#t:crl_src/0"},{"type":"behaviour","doc":"API for a TLS CRL (Certificate Revocation List) cache.\n\nWhen TLS performs certificate path validation according to\n[RFC 5280 ](http://www.ietf.org/rfc/rfc5280.txt)it should also perform CRL\nvalidation checks. To enable the CRL checks the application needs access to\nCRLs. A database of CRLs can be set up in many different ways. This module\nprovides the behavior of the API needed to integrate an arbitrary CRL cache with\nthe erlang ssl application. It is also used by the application itself to provide\na simple default implementation of a CRL cache.","title":"ssl_crl_cache_api","ref":"ssl_crl_cache_api.html"},{"type":"callback","doc":"`fun fresh_crl/2` will be used as input option `update_crl` to\n`public_key:pkix_crls_validate/3`.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.fresh_crl/2","ref":"ssl_crl_cache_api.html#c:fresh_crl/2"},{"type":"callback","doc":"Backwards compatibility, replaced by lookup/3","title":"ssl_crl_cache_api.lookup/2","ref":"ssl_crl_cache_api.html#c:lookup/2"},{"type":"callback","doc":"Lookup the CRLs belonging to the distribution point `Distributionpoint`. This\nfunction may choose to only look in the cache or to follow distribution point\nlinks depending on how the cache is administrated.\n\nThe `Issuer` argument contains the issuer name of the certificate to\nbe checked. Normally the returned CRL should be issued by this\nissuer, except if the `cRLIssuer` field of `DistributionPoint` has a\nvalue, in which case that value should be used instead.\n\nIn an earlier version of this API, the `lookup` function received two\narguments, omitting `Issuer`. For compatibility, this is still\nsupported: if there is no [`lookup/3`](`c:lookup/3`) function in the\ncallback module,[`lookup/2`](`c:lookup/2`) is called instead.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.lookup/3","ref":"ssl_crl_cache_api.html#c:lookup/3"},{"type":"callback","doc":"Select the CRLs in the cache that are issued by `Issuer` unless the value is a\nlist of so called general names, see\n[X509 certificates records](`e:public_key:public_key_records.md`), originating\nform `#'DistributionPoint'.cRLissuer` and representing different mechanism to\nobtain the CRLs. The cache callback needs to use the appropriate entry to\nretrieve the CRLs or return an empty list if it does not exist.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.select/2","ref":"ssl_crl_cache_api.html#c:select/2"},{"type":"type","doc":"Reference to the CRL cache.","title":"ssl_crl_cache_api.crl_cache_ref/0","ref":"ssl_crl_cache_api.html#t:crl_cache_ref/0"},{"type":"type","doc":"For description see\n[X509 certificates records](`e:public_key:public_key_records.md`)","title":"ssl_crl_cache_api.dist_point/0","ref":"ssl_crl_cache_api.html#t:dist_point/0"},{"type":"type","doc":"Information for ssl applications use of [Logger(3)](`m:logger`)","title":"ssl_crl_cache_api.logger_info/0","ref":"ssl_crl_cache_api.html#t:logger_info/0"},{"type":"behaviour","doc":"TLS session cache API\n\nDefines the API for the TLS session cache (pre TLS-1.3) so that the data storage\nscheme can be replaced by defining a new callback module implementing this API.","title":"ssl_session_cache_api","ref":"ssl_session_cache_api.html"},{"type":"callback","doc":"Deletes a cache entry.\n\nIs only called from the cache handling process.","title":"ssl_session_cache_api.delete/2","ref":"ssl_session_cache_api.html#c:delete/2"},{"type":"callback","doc":"Calls `Fun(Elem, AccIn)` on successive elements of the cache, starting with\n `AccIn == Acc0`.\n\n`Fun/2` must return a new accumulator, which is passed to the\nnext call. The function returns the final value of the accumulator. `Acc0` is\nreturned if the cache is empty.\n\n> #### Note {: .info }\n>\n> Since OTP-23.3 this functions is only used on the client side and does not\n> need to implemented for a server cache.","title":"ssl_session_cache_api.foldl/3","ref":"ssl_session_cache_api.html#c:foldl/3"},{"type":"callback","doc":"Performs possible initializations of the cache and returns a reference to it\nthat is used as parameter to the other API functions. \n\nIs called by the cache handling processes `init` function, hence\nputting the same requirements on it as a normal process `init`\nfunction. This function is called twice when starting the SSL\napplication, once with the role client and once with the role server,\nas the SSL application must be prepared to take on both roles.\n\nIncludes property `{role, client | server}` in init argument list. \nCurrently this is the only predefined property, there can also be\nuser-defined properties. See also application environment variable\n[session_cb_init_args](ssl_app.md).","title":"ssl_session_cache_api.init/1","ref":"ssl_session_cache_api.html#c:init/1"},{"type":"callback","doc":"Looks up a cache entry. Is to be callable from any process.","title":"ssl_session_cache_api.lookup/2","ref":"ssl_session_cache_api.html#c:lookup/2"},{"type":"callback","doc":"Selects sessions that can be reused, that is sessions that include `PartialKey`\nin its key. Is to be callable from any process.\n\n> #### Note {: .info }\n>\n> Since OTP-23.3 This functions is only used on the client side and does not\n> need to implemented for a server cache.","title":"ssl_session_cache_api.select_session/2","ref":"ssl_session_cache_api.html#c:select_session/2"},{"type":"callback","doc":"Returns the number of sessions in the cache.\n\nIf size exceeds the maximum number of sessions, the current cache\nentries will be invalidated regardless of their remaining lifetime. Is\nto be callable from any process.","title":"ssl_session_cache_api.size/1","ref":"ssl_session_cache_api.html#c:size/1"},{"type":"callback","doc":"Takes care of possible cleanup that is needed when the cache handling process\nterminates.","title":"ssl_session_cache_api.terminate/1","ref":"ssl_session_cache_api.html#c:terminate/1"},{"type":"callback","doc":"Caches a new session or updates an already cached one.\n\nIs only called from the cache handling process.","title":"ssl_session_cache_api.update/3","ref":"ssl_session_cache_api.html#c:update/3"},{"type":"opaque","doc":"The opaque part of the key. Does not need to be handled by the callback.","title":"ssl_session_cache_api.partial_key/0","ref":"ssl_session_cache_api.html#t:partial_key/0"},{"type":"opaque","doc":"The session data that is stored for each session.","title":"ssl_session_cache_api.session/0","ref":"ssl_session_cache_api.html#t:session/0"},{"type":"type","doc":"A key to an entry in the session cache.","title":"ssl_session_cache_api.session_cache_key/0","ref":"ssl_session_cache_api.html#t:session_cache_key/0"},{"type":"type","doc":"A term that can be used to reference the cache.","title":"ssl_session_cache_api.session_cache_ref/0","ref":"ssl_session_cache_api.html#t:session_cache_ref/0"},{"type":"extras","doc":"\n# SSL Application\n\nThe ssl application provides secure communication over sockets.","title":"SSL Application","ref":"ssl_app.html"},{"type":"extras","doc":"The ssl application is an implementation of the TLS (previously known as SSL) and DTLS protocols in\nErlang.\n\nFor current statement of standards compliance see the\n[User's Guide](standards_compliance.md).","title":"Description - SSL Application","ref":"ssl_app.html#description"},{"type":"extras","doc":"The SSL application uses the `Public_Key`, `Asn1` and `Crypto` application to\nhandle public keys and encryption, hence these applications must be loaded for\nthe SSL application to work. In an embedded environment this means they must be\nstarted with `application:start/1,2` before the SSL application is started.","title":"Dependencies - SSL Application","ref":"ssl_app.html#dependencies"},{"type":"extras","doc":"The application environment configuration parameters in this section are defined\nfor the SSL application. For more information about configuration parameters,\nsee the `m:application` manual page in Kernel.\n\n> #### Note {: .info }\nAll parameters including the wording 'session_ticket' are TLS-1.3 only configuration\nand other session parameters are prior to TLS-1.3 only configuration. DTLS versions\nare based on TLS versions see [standard compliance](standards_compliance.md) for mapping.\n\nThe environment parameters can be set on the command line, for example:\n\n`erl -ssl protocol_version \"['tlsv1.2', 'tlsv1.1']\"`\n\n- **`protocol_version = ``t:ssl:tls_version/0` | [`t:ssl:tls_version/0`]\n ` `** - Protocol supported by started clients and servers. If this\n option is not set, it defaults to all TLS protocols currently supported, more\n might be configurable, by the SSL application. This option can be overridden\n by the version option to `ssl:connect/2,3` and `ssl:listen/2`.\n\n- **`dtls_protocol_version = ``t:ssl:dtls_version/0` | [`t:ssl:dtls_version/0`]\n ` `** - Protocol supported by started clients and servers. If this\n option is not set, it defaults to all DTLS protocols currently supported, more\n might be configurable, by the SSL application. This option can be overridden\n by the version option to `ssl:connect/2,3` and `ssl:listen/2`.\n\n- **`session_lifetime = integer() `** - Maximum lifetime of the\n session data in seconds. Defaults to 24 hours which is the maximum recommended\n lifetime by [RFC 5246](http://www.ietf.org/rfc/5246rfc.txt). However sessions\n may be invalidated earlier due to the maximum limitation of the session cache\n table.\n\n- **`session_cb = atom() `** - Deprecated Since OTP-23.3 replaced by\n `client_session_cb` and `server_session_cb`\n\n- **`client_session_cb = atom() `** - Since OTP-23.3 Name client of\n the session cache callback module that implements the `ssl_session_cache_api`\n behavior. Defaults to `ssl_client_session_cache_db`.\n\n- **`server_session_cb = atom() `** - Since OTP-23.3 Name of the\n server session cache callback module that implements the\n `ssl_session_cache_api` behavior. Defaults to `ssl_server_session_cache_db`.\n\n- **`session_cb_init_args = proplist:proplist() `** - Deprecated Since\n OTP-23.3 replaced by `client_session_cb_init_args` and\n `server_session_cb_init_args`\n\n- **`client_session_cb_init_args = proplist:proplist() `** - List of\n extra user-defined arguments to the `init` function in the session cache\n callback module. Defaults to `[]`.\n\n- **`server_session_cb_init_args = proplist:proplist() `** - List of\n extra user-defined arguments to the `init` function in the session cache\n callback module. Defaults to `[]`.\n\n- **`session_cache_client_max = integer() ` \n ** \n Limits the growth of the clients session cache, that is how many sessions\n towards servers that are cached to be used by new client connections. If the\n maximum number of sessions is reached, the current cache entries will be\n invalidated regardless of their remaining lifetime. Defaults to 1000.\n Recommended ssl-8.2.1 or later for this option to work as intended.\n\n- **`session_cache_server_max = integer() `** - Limits the growth of\n the servers session cache, that is how many client sessions are cached by the\n server. If the maximum number of sessions is reached, the current cache\n entries will be invalidated regardless of their remaining lifetime. Defaults\n to 1000. Recommended ssl-8.2.1 or later for this option to work as intended.\n\n- **`ssl_pem_cache_clean = integer() `** - Number of milliseconds\n between PEM cache validations. Defaults to 2 minutes.\n\n Note: The cache can be reloaded by calling `ssl:clear_pem_cache/0`.\n\n- **`bypass_pem_cache = boolean() `** - Introduced in ssl-8.0.2.\n Disables the PEM-cache. Can be used as a workaround for the PEM-cache\n bottleneck before ssl-8.1.1. Defaults to false.\n\n- **`alert_timeout = integer() `** - Number of milliseconds between\n sending of a fatal alert and closing the connection. Waiting a little while\n improves the peers chances to properly receiving the alert so it may shutdown\n gracefully. Defaults to 5000 milliseconds.\n\n- **`internal_active_n = integer() `** - For TLS connections this\n value is used to handle the internal socket. As the implementation was changed\n from an active once to an active N behavior (N = 100), for performance\n reasons, this option exist for possible tweaking or restoring of the old\n behavior (internal_active_n = 1) in unforeseen scenarios. The option will not\n affect erlang distribution over TLS that will always run in active N mode.\n Added in ssl-9.1 (OTP-21.2).\n\n- **`server_session_tickets_amount = integer() `** - Number of session\n tickets sent by the server. It must be greater than 0. Defaults to 3.\n\n- **`server_session_ticket_lifetime = integer() `** - Lifetime of\n session tickets sent by the server. Servers must not use any value greater\n than 604800 seconds (7 days). Expired tickets are automatically removed.\n Defaults to 7200 seconds (2 hours).\n\n- **`server_session_ticket_store_size = integer() `** - Sets the\n maximum size of the server session ticket store (stateful tickets). Defaults\n to 1000. Size limit is enforced by dropping old tickets.\n\n- **`server_session_ticket_max_early_data = integer() `** - Sets the\n maximum size of the early data that the server accepts and also configures its\n NewSessionTicket messages to include this same size limit in their\n early_data_indication extension. Defaults to 16384. Size limit is enforced by\n both client and server.\n\n- **`client_session_ticket_lifetime = integer() `** - Lifetime of\n session tickets in the client ticket store. Expired tickets are automatically\n removed. Defaults to 7200 seconds (2 hours).\n\n- **`client_session_ticket_store_size = integer() `** - Sets the\n maximum size of the client session ticket store. Defaults to 1000. Size limit\n is enforced by dropping old tickets.","title":"Configuration - SSL Application","ref":"ssl_app.html#configuration"},{"type":"extras","doc":"The SSL application uses [OTP logger](`m:logger`). TLS/DTLS alerts are logged on\nnotice level. Unexpected errors are logged on error level. These log entries\nwill by default end up in the default Erlang log. The option `log_level` may be\nused to in run-time to set the log level of a specific TLS connection, which is\nhandy when you want to use level debug to inspect the TLS handshake setup.","title":"Error Logger and Event Handlers - SSL Application","ref":"ssl_app.html#error-logger-and-event-handlers"},{"type":"extras","doc":"`m:application`","title":"See Also - SSL Application","ref":"ssl_app.html#see-also"},{"type":"extras","doc":"\n# SSL Release Notes\n\nThis document describes the changes made to the SSL application.","title":"SSL Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"SSL 11.2.1 - SSL Release Notes","ref":"notes.html#ssl-11-2-1"},{"type":"extras","doc":"- Check for TLS-1.3 support should check minimum requirements.\n\n Own Id: OTP-19094 Aux Id: [GH-8489]\n\n- If both TLS-1.3 and TLS-1.2 is supported\n and TLS-1.2 negotiated convert TLS-1.3 ECDSA schemes to TLS-1.2 hash and signature pairs for increased interoperability.\n\n Own Id: OTP-19107 Aux Id: [GH-8376]\n\n- TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140\n\n[GH-8489]: https://github.com/erlang/otp/issues/8489\n[GH-8376]: https://github.com/erlang/otp/issues/8376","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make it easier to distinguish between a invalid signature and unsupported signature.\n\n Own Id: OTP-19091\n\n- Enhance ALERT logs to help understand what causes the alert.\n\n Own Id: OTP-19092 Aux Id: [GH-8482]\n\n- When the default value for signature_algs is used, default the signature_algs_cert to the default value + rsa_pkcs1_sha1 to allow this algorithms for certificates but not for the TLS protocol. This is for better interoperability. If signature_algs is set explicitly signature_algs_cert must also be set explicitly if they should be different.\n\n Own Id: OTP-19152 Aux Id: [GH-8588]\n\n[GH-8482]: https://github.com/erlang/otp/issues/8482\n[GH-8588]: https://github.com/erlang/otp/issues/8588","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.2 - SSL Release Notes","ref":"notes.html#ssl-11-2"},{"type":"extras","doc":"- Starting a TLS server without sufficient credentials (certificate or anonymous cipher) would work, but it was impossible to connect to it.\n \n This has been corrected to return an error instead of starting the server.\n\n Own Id: OTP-18887 Aux Id: [GH-7493], [PR-7918]\n\n- ASN.1 decoding errors are handled in more places to ensure that errors are returned instead of cause a crash.\n\n Own Id: OTP-18969 Aux Id: [GH-8058], [PR-8256]\n\n- Improved error checking on the API functions.\n\n Own Id: OTP-18992 Aux Id: [GH-8066] [PR-8156]\n\n[GH-7493]: https://github.com/erlang/otp/issues/7493\n[PR-7918]: https://github.com/erlang/otp/pull/7918\n[GH-8058]: https://github.com/erlang/otp/issues/8058\n[PR-8256]: https://github.com/erlang/otp/pull/8256\n[GH-8066]: https://github.com/erlang/otp/issues/8066\n[PR-8156]: https://github.com/erlang/otp/pull/8156","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The `ssl` client can negotiate and handle certificate status request (OCSP stapling support on the client side).\n \n Thanks to voltone for interop testing and related discussions.\n\n Own Id: OTP-18606 Aux Id: OTP-16875,OTP-16448\n\n- Memory consumption has been reduced and performance increased by refactoring internal data structures and their usage.\n\n Own Id: OTP-18665 Aux Id: [PR-7447]\n\n- Added `c:ssl_crl_cache_api:lookup/2` as an optional `-callback` attribute.\n\n Own Id: OTP-18788 Aux Id: [PR-7700]\n\n- Key customization support has been extended to allow flexibility for implementers of for instance hardware security modules (HSM) or trusted platform modules (TPM).\n\n Own Id: OTP-18876 Aux Id: [PR-7898], [PR-7475]\n\n- The `proc_lib:set_label/1` function is now used to increase observability of `ssl` processes.\n\n Own Id: OTP-18879\n\n- Brainpool elliptic curves are now supported in TLS-1.3.\n\n Own Id: OTP-18884 Aux Id: [PR-8056]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- For security reasons, the CBC ciphers are now longer included in the list of default ciphers for TLS-1.2.\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-19025 Aux Id: [PR-8250]\n\n- There is a new `cert_policy_opts` option to configure certificate policy options for the certificate path validation.\n\n Own Id: OTP-19027 Aux Id: [PR-8255]\n\n[PR-7447]: https://github.com/erlang/otp/pull/7447\n[PR-7700]: https://github.com/erlang/otp/pull/7700\n[PR-7898]: https://github.com/erlang/otp/pull/7898\n[PR-7475]: https://github.com/erlang/otp/pull/7475\n[PR-8056]: https://github.com/erlang/otp/pull/8056\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8250]: https://github.com/erlang/otp/pull/8250\n[PR-8255]: https://github.com/erlang/otp/pull/8255","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.3 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-3"},{"type":"extras","doc":"* A race in the kTLS flavour of SSL distribution has been fixed so inet_drv.c doesn't read ahead too much data which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: GH-8561, PR-8690","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Make sure all TLS-1.3 terminations are graceful (previous TLS version terminations already are).\n\n Own Id: OTP-17848\n* Include more information in logging of SNI (Server Name Indication) mismatch error.\n\n Own Id: OTP-19187","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.2 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-2"},{"type":"extras","doc":"* When the default value for signature_algs is used, default the signature_algs_cert to the default value + rsa_pkcs1_sha1 to allow this algorithms for certificates but not for the TLS protocol. This is for better interoperability. If signature_algs is set explicitly signature_algs_cert must also be set explicitly if they should be different.\n\n Own Id: OTP-19152 Aux Id: GH-8588","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.1 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-1"},{"type":"extras","doc":"* Check for TLS-1.3 support should check minimum requirements.\n\n Own Id: OTP-19094 Aux Id: GH-8489\n* If both TLS-1.3 and TLS-1.2 is supported and TLS-1.2 negotiated convert TLS-1.3 ECDSA schemes to TLS-1.2 hash and signature pairs for increased interoperability.\n\n Own Id: OTP-19107 Aux Id: GH-8376\n* TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Make it easier to distinguish between a invalid signature and unsupported signature.\n\n Own Id: OTP-19091\n* Enhance ALERT logs to help understand what causes the alert.\n\n Own Id: OTP-19092 Aux Id: GH-8482","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4 - SSL Release Notes","ref":"notes.html#ssl-11-1-4"},{"type":"extras","doc":"* Fix certificate authorities check so that CA closest to peer is not lost. It could manifest itself in a failed connection as the client failed to realize it had a valid certificate chain to send to the server.\n\n Own Id: OTP-19065 Aux Id: GH-8356, PR-8367\n* ssl:signature_algs/2 did not list some legacy algorithm schemes correctly when listing all algorithms available.\n\n Own Id: OTP-19067 Aux Id: PR-8379","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1.3 - SSL Release Notes","ref":"notes.html#ssl-11-1-3"},{"type":"extras","doc":"* Cleanup and close all connections in DTLS when the listen socket owner dies.\n\n Improved IPv6 handling in DTLS.\n\n Own Id: OTP-19037 Aux Id: GH-7951 GH-7955\n* Fixed a crash in dtls accept.\n\n Own Id: OTP-19059 Aux Id: GH-8338","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1.2 - SSL Release Notes","ref":"notes.html#ssl-11-1-2"},{"type":"extras","doc":"* ssl:prf/5, will start working instead of hanging in a TLS-1.3 context if called appropriately. Note that the implementation has changed and in OTP-27 a more adequate API will be documented.\n\n Own Id: OTP-18890 Aux Id: GH-7911\n* Server name verification didn't work if a connection was made with IP-address as a string.\n\n Own Id: OTP-18909 Aux Id: GH-7968\n* The fallback after \"dh\" ssl option was undefined was to get \"dh\" from ssl options again. This is clearly wrong and now changed to the documented fallback \"dhfile\" ssl option.\n\n Own Id: OTP-18919 Aux Id: PR-7984\n* Correct default value selection for DTLS. Will only affect users linked with really old version of cryptolib library.\n\n Own Id: OTP-18962 Aux Id: GH-8079\n* Adhere elliptic curves with RFC 8422 pre TLS-1.3, that is Edwards curves are added to curves that can be used for key exchange, and documentation and implementation of eccs/0,1 are aligned.\n\n Own Id: OTP-18991","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Improve alert reason when ecdhe_rsa key_exchange does not have any common curves to use\n\n Own Id: OTP-18985","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.1 - SSL Release Notes","ref":"notes.html#ssl-11-1-1"},{"type":"extras","doc":"* Legacy name handling could cause interop problems between TLS-1.3/1.2 client and TLS-1.2 server.\n\n Own Id: OTP-18917 Aux Id: GH-7978","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1 - SSL Release Notes","ref":"notes.html#ssl-11-1"},{"type":"extras","doc":"- ssl application will validate id-kp-serverAuth and id-kp-clientAuth extended\n key usage only in end entity certificates. public_key application will\n disallow \"anyExtendedKeyUsage\" for CA certificates that includes the extended\n key usage extension and marks it critical.\n\n Own Id: OTP-18739\n\n- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780\n\n- Correct handling of TLS-1.3 legacy scheme names, could cause interop failures\n for TLS-1.2 clients.\n\n Own Id: OTP-18817\n\n- Add missing export for connection_info() API type.\n\n Own Id: OTP-18886","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Fixed `server name indication` which was not handled properly.\n\n Own Id: OTP-18836 Aux Id: GH-7795\n\n- Align documentation and implementation\n\n Own Id: OTP-18853 Aux Id: PR-7841\n\n- Improve connection setup by optimizing certificate lookup.\n\n Own Id: OTP-18893 Aux Id: PR-7920 PR-7921","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.3 - SSL Release Notes","ref":"notes.html#ssl-11-0-3"},{"type":"extras","doc":"- Avoid function clause error in ssl:getopts/2 by handling that inet:getopts may\n return an empty list during some circumstances, such as the socket being in a\n closing state.\n\n Own Id: OTP-18697 Aux Id: GH-7506\n\n- The API function \\`ssl:recv/3\\` has been tightened to disallow negative\n length, which has never been documented to work, but was passed through and\n caused strange errors.\n\n Own Id: OTP-18700 Aux Id: GH-7507\n\n- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add some guidance for signature algorithms configuration in ssl applications\n users guide.\n\n Own Id: OTP-18631","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.2 - SSL Release Notes","ref":"notes.html#ssl-11-0-2"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.1 - SSL Release Notes","ref":"notes.html#ssl-11-0-1"},{"type":"extras","doc":"- Make sure that selection of client certificates handle both TLS-1.3 and\n TLS-1.2 names correctly. Could cause valid client certificate to not be\n selected, and an empty client certificate message to be sent to server.\n\n Own Id: OTP-18588 Aux Id: GH-7264, PR-7277\n\n- Improved `ssl:format_error/1` to handle more error tuples.\n\n Own Id: OTP-18596 Aux Id: GH-7247\n\n- Fixed hanging `ssl:connect` when ssl application is not started.\n\n Own Id: OTP-18603 Aux Id: GH-7297\n\n- Correct handling of retransmission timers, current behavior could cause\n unwanted delays.\n\n Own Id: OTP-18632 Aux Id: PR-7300, GH-7301","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.0 - SSL Release Notes","ref":"notes.html#ssl-11-0"},{"type":"extras","doc":"- Remove less that 256 bit ECC from default supported ECC pre TLS-1.3\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14771\n\n- Improved error checking and handling of ssl options.\n\n Own Id: OTP-15903\n\n- With this change, stateless tickets generated by server with anti_replay\n option enabled can be used for creating ClientHello throughout ticket\n lifetime. Without this change, usability was limited to WindowSize number of\n seconds configured for anti_replay option.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18168 Aux Id: PR-6019, GH-6014\n\n- Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS\n distribution (`-proto_dist inet_tls`), the SSL option `{ktls, true}`. Using\n this for general SSL sockets is uncomfortable, undocumented and not\n recommended since it requires very platform dependent raw options.\n\n This, for now, only works for some not too old Linux distributions. Roughly, a\n kernel 5.2.0 or later with support for UserLand Protocols and the kernel\n module `tls` is required.\n\n Own Id: OTP-18235 Aux Id: PR-6104, PR-5840\n\n- With this change, TLS 1.3 server can be configured to include client\n certificate in session ticket.\n\n Own Id: OTP-18253\n\n- With this change, it is possible to configure encryption seed to be used with\n TLS1.3 stateless tickets. This enables using tickets on different server\n instances.\n\n Own Id: OTP-18254 Aux Id: PR-5982\n\n- Debugging enhancements.\n\n Own Id: OTP-18312\n\n- With this change, maybe keyword atom is not used as function name in ssl code.\n\n Own Id: OTP-18335\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- For security reasons remove support for SHA1 and DSA algorithms from default\n values.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18438 Aux Id: GH-6679\n\n- Mitigate memory usage from large certificate chains by lowering the maximum\n handshake size. This should not effect the common cases, if needed it can be\n configured to a higher value.\n\n Own Id: OTP-18453\n\n- Change the client default verify option to verify_peer. Note that this makes\n it mandatory to also supply trusted CA certificates or explicitly set verify\n to verify_none. This also applies when using the so called anonymous test\n cipher suites defined in TLS versions pre TLS-1.3.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18455 Aux Id: GH-5899\n\n- Erlang distribution code in Kernel and SSL has been refactored a bit to\n facilitate debugging and re-usability, which shouldn't have any noticeable\n effects on behaviour or performance.\n\n Own Id: OTP-18456\n\n- Add encoding and decoding of use_srtp hello extension to facilitate for DTLS\n users to implement SRTP functionality.\n\n Own Id: OTP-18459\n\n- Refactors the (`ssl` application to use macros for TLS and DTLS versions\n instead of hard-coded tuple numbers. This change improves the maintainability\n of `ssl`\n\n Own Id: OTP-18465 Aux Id: GH-7065\n\n- If the function ssl:renegotiate/1 is called on connection that is running\n TLS-1.3 return an error instead of hanging or timing out.\n\n Own Id: OTP-18507\n\n- If a user cancel alert with level warning is received during handshake make it\n be handled the same regardless of TLS version. If it is received in connection\n in TLS-1.3 regard it as an error as it is inappropriate.\n\n In TLS-1.3 all error alerts are considered FATAL regardless of legacy alert\n type. But make sure legacy type is printed in logs to not confuse users that\n are expecting the same legacy type as sent by peer.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18531\n\n- Make `fail_if_no_peer_cert` default true if verify_peer is set on the server,\n otherwise the server will accept the connection if verify_peer is set and the\n user have forgot to set the fail_if_no_peer_cert and the client did not send a\n certificate.\n\n Own Id: OTP-18567\n\n- To make it easier to configure signature algorithms with algorithms that are\n moved from the default add the API function signature_algs/2 that lists\n possible values. Also make sha224 a non default value.\n\n Own Id: OTP-18572","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.9.1.5 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-5"},{"type":"extras","doc":"* TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.4 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-4"},{"type":"extras","doc":"* Fix certificate authorities check so that CA closest to peer is not lost. It could manifest itself in a failed connection as the client failed to realize it had a valid certificate chain to send to the server.\n\n Own Id: OTP-19065 Aux Id: GH-8356, PR-8367","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.3 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-3"},{"type":"extras","doc":"- ssl application will validate id-kp-serverAuth and id-kp-clientAuth extended\n key usage only in end entity certificates. public_key application will\n disallow \"anyExtendedKeyUsage\" for CA certificates that includes the extended\n key usage extension and marks it critical.\n\n Own Id: OTP-18739\n\n- Add missing export for connection_info() API type.\n\n Own Id: OTP-18886","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.2 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-2"},{"type":"extras","doc":"- The API function \\`ssl:recv/3\\` has been tightened to disallow negative\n length, which has never been documented to work, but was passed through and\n caused strange errors.\n\n Own Id: OTP-18700 Aux Id: GH-7507\n\n- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.1 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-1"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.9.1 - SSL Release Notes","ref":"notes.html#ssl-10-9-1"},{"type":"extras","doc":"- With this change, ssl:connection_information/2 returns correct keylog data\n after TLS1.3 key update.\n\n Own Id: OTP-18489\n\n- Client signature algorithm list input order is now honored again , it was\n accidently reversed by a previous fix.\n\n Own Id: OTP-18550","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9 - SSL Release Notes","ref":"notes.html#ssl-10-9"},{"type":"extras","doc":"- Fixed that new `dtls` connections from the same client ip port combination\n works. If there is a process waiting for accept the new connection will\n connect to that, otherwise it will try to re-connect to the old server\n connection.\n\n Own Id: OTP-18371 Aux Id: GH-6160\n\n- When shutting down a node that uses SSL distribution (`-proto_dist inet_tls`),\n a confusing error message about an unexpected process exit was printed. This\n particular message is no longer generated.\n\n Own Id: OTP-18443 Aux Id: PR-6810","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- fixes the type spec for ssl:format_error/1\n\n Own Id: OTP-18366 Aux Id: PR-6565, GH-6506\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18432 Aux Id:\n GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.7 - SSL Release Notes","ref":"notes.html#ssl-10-8-7"},{"type":"extras","doc":"- Maximize compatibility by ignoring change_cipher_spec during handshake even if\n middle_box_mode is not negotiated (mandated by client)\n\n Own Id: OTP-18433 Aux Id: GH-6772\n\n- Move assert of middlebox message after an hello_retry_request to maximize\n interoperability. Does not changes semantics of the protocol only allows\n unexpected message delay from server.\n\n Own Id: OTP-18467 Aux Id: GH-6807","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.6 - SSL Release Notes","ref":"notes.html#ssl-10-8-6"},{"type":"extras","doc":"- With this change, tls_sender process is hibernated after sufficient\n inactivity.\n\n Own Id: OTP-18314 Aux Id: GH-6373\n\n- Correct handling of legacy schemes so that ECDSA certs using sha1 may be used\n for some TLS-1.3 configurations.\n\n Own Id: OTP-18332 Aux Id: GH-6435, PR-6435, ERL-6435\n\n- With this change, tls_sender does not cause logger crash upon key update.\n\n Own Id: OTP-18349","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance warning message\n\n Own Id: OTP-18257 Aux Id: GH-6307\n\n- Provide server option to make certificate_authorities extension in the TLS-1.3\n servers certificate request optional. This will allow clients to send\n incomplete chains that may be reconstructable and thereby verifiable by the\n server, but that would not adhere to the certificate_authorities extension.\n\n Own Id: OTP-18267 Aux Id: PR-6228, GH-6106\n\n- If the `verify_fun` handles four arguments the DER cert will be supplied as\n one of the arguments.\n\n Own Id: OTP-18302 Aux Id: ERIERL-867","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.5 - SSL Release Notes","ref":"notes.html#ssl-10-8-5"},{"type":"extras","doc":"- Fixes handling of symlinks in cacertfile option.\n\n Own Id: OTP-18266 Aux Id: GH-6328","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.4 - SSL Release Notes","ref":"notes.html#ssl-10-8-4"},{"type":"extras","doc":"- Reject unexpected application data in all relevant places for all TLS\n versions. Also, handle TLS-1.3 middlebox compatibility with more care. This\n will make malicious connections fail early and further, mitigate possible DoS\n attacks, that would be caught by the handshake timeout.\n\n Thanks to Aina Toky Rasoamanana and Olivier Levillain from Télécom SudParis\n for alerting us of the issues in our implementation.\n\n Own Id: OTP-18044\n\n- With this change, value of cacertfile option will be adjusted before loading\n certs from the file. Adjustments include converting relative paths to absolute\n and converting symlinks to actual file path.\n\n Thanks to Marcus Johansson\n\n Own Id: OTP-18099 Aux Id: PR-6287\n\n- In TLS-1.3, if chain certs are missing (so server auth domain adherence can\n not be determined) send peer cert and hope the server is able to recreate a\n chain in its auth domain.\n\n Own Id: OTP-18191 Aux Id: GH-6105\n\n- Make sure periodical refresh of CA certificate files repopulates cache\n properly.\n\n Own Id: OTP-18195\n\n- Correct internal CRL cache functions to use internal format consistently.\n\n Own Id: OTP-18203 Aux Id: PR-5996\n\n- Incorrect handling of client middlebox negotiation for TLS-1.3 could result in\n that a TLS-1.3 server would not use middlebox mode although the client was\n expecting it too and failing the negotiation with unexpected message.\n\n Own Id: OTP-18219 Aux Id: GH-6241, PR-6249\n\n- If the \"User\" process, the process starting the TLS connection, gets killed in\n the middle of spawning the dynamic connection tree make sure we do not leave\n any processes behind.\n\n Own Id: OTP-18233 Aux Id: GH-6244, PR-6270","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A vulnerability has been discovered and corrected. It is registered as\n CVE-2022-37026 \"Client Authentication Bypass\". Corrections have been released\n on the supported tracks with patches 23.3.4.15, 24.3.4.2, and 25.0.2. The\n vulnerability might also exist in older OTP versions. We recommend that\n impacted users upgrade to one of these versions or later on the respective\n tracks. OTP 25.1 would be an even better choice. Impacted are those who are\n running an ssl/tls/dtls server using the ssl application either directly or\n indirectly via other applications. For example via inets (httpd), cowboy, etc.\n Note that the vulnerability only affects servers that request client\n certification, that is sets the option \\{verify, verify_peer\\}.\n\n Own Id: OTP-18241","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.3 - SSL Release Notes","ref":"notes.html#ssl-10-8-3"},{"type":"extras","doc":"- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.2 - SSL Release Notes","ref":"notes.html#ssl-10-8-2"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.1 - SSL Release Notes","ref":"notes.html#ssl-10-8-1"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Correctly handles supported protocol version change from default to something\n else by sni_fun supplied to ssl:handshake/\\[2,3] together with a TCP-socket\n (so called upgrade).\n\n Own Id: OTP-18100 Aux Id: GH-5985\n\n- Also, TLS-1.3 should respond with a protocol version alert if previous\n versions, that are supported but not configured, are attempted.\n\n Own Id: OTP-18129 Aux Id: GH-5950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8 - SSL Release Notes","ref":"notes.html#ssl-10-8"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Fixed tls-1.3 session ticket lifetime which was discarded to quickly before.\n\n Own Id: OTP-18092 Aux Id: PR-5959","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- With this change, it is possible to provide several certificates. Most\n appropriate will be selected based on negotiated properties.\n\n Own Id: OTP-15993 Aux Id: GH-4143\n\n- Add options for users to be able to set spawn_opts for TLS processes (sender\n and receiver) this may be useful for tuning trade-offs between CPU and Memory\n usage.\n\n Own Id: OTP-17855 Aux Id: PR-5328\n\n- Allow key file passwords to be input as a single binary, that is we change the\n data type to be the more for the purpose logical data type iodata() instead of\n string().\n\n Own Id: OTP-17890\n\n- Logging enhancement, add location information to the warning log message.\n\n Own Id: OTP-18000 Aux Id: PR-5790\n\n- Now also accepts the signature_algs_cert option in TLS-1.2 configuration.\n\n Own Id: OTP-18014\n\n- Handle certificate selection correctly for server fallback and certificate\n authorities considerations.\n\n Own Id: OTP-18045 Aux Id: ERIERL-792, OTP-15993\n\n- Enhance handling of handshake decoding errors, especially for certificate\n authorities extension to ensure graceful termination.\n\n Own Id: OTP-18085","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.9 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-9"},{"type":"extras","doc":"- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.8 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-8"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.7 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-7"},{"type":"extras","doc":"- Client signature algorithm list input order is now honored again , it was\n accidently reversed by a previous fix.\n\n Own Id: OTP-18550","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.6 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-6"},{"type":"extras","doc":"- Maximize compatibility by ignoring change_cipher_spec during handshake even if\n middle_box_mode is not negotiated (mandated by client)\n\n Own Id: OTP-18433 Aux Id: GH-6772\n\n- Move assert of middlebox message after an hello_retry_request to maximize\n interoperability. Does not changes semantics of the protocol only allows\n unexpected message delay from server.\n\n Own Id: OTP-18467 Aux Id: GH-6807","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.5 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-5"},{"type":"extras","doc":"- Fixes handling of symlinks in cacertfile option.\n\n Own Id: OTP-18266 Aux Id: GH-6328","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.4 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-4"},{"type":"extras","doc":"- With this change, value of cacertfile option will be adjusted before loading\n certs from the file. Adjustments include converting relative paths to absolute\n and converting symlinks to actual file path.\n\n Thanks to Marcus Johansson\n\n Own Id: OTP-18099 Aux Id: PR-6287\n\n- Incorrect handling of client middlebox negotiation for TLS-1.3 could result in\n that a TLS-1.3 server would not use middlebox mode although the client was\n expecting it too and failing the negotiation with unexpected message.\n\n Own Id: OTP-18219 Aux Id: GH-6241, PR-6249\n\n- If the \"User\" process, the process starting the TLS connection, gets killed in\n the middle of spawning the dynamic connection tree make sure we do not leave\n any processes behind.\n\n Own Id: OTP-18233 Aux Id: GH-6244, PR-6270","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.3 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-3"},{"type":"extras","doc":"- Reject unexpected application data in all relevant places for all TLS\n versions. Also, handle TLS-1.3 middlebox compatibility with more care. This\n will make malicious connections fail early and further, mitigate possible DoS\n attacks, that would be caught by the handshake timeout.\n\n Thanks to Aina Toky Rasoamanana and Olivier Levillain from Télécom SudParis\n for alerting us of the issues in our implementation.\n\n Own Id: OTP-18044\n\n- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173\n\n- Make sure periodical refresh of CA certificate files repopulates cache\n properly.\n\n Own Id: OTP-18195","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.2 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-2"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.1 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-1"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Fixed tls-1.3 session ticket lifetime which was discarded to quickly before.\n\n Own Id: OTP-18092 Aux Id: PR-5959\n\n- Correctly handles supported protocol version change from default to something\n else by sni_fun supplied to ssl:handshake/\\[2,3] together with a TCP-socket\n (so called upgrade).\n\n Own Id: OTP-18100 Aux Id: GH-5985\n\n- Also, TLS-1.3 should respond with a protocol version alert if previous\n versions, that are supported but not configured, are attempted.\n\n Own Id: OTP-18129 Aux Id: GH-5950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance handling of handshake decoding errors, especially for certificate\n authorities extension to ensure graceful termination.\n\n Own Id: OTP-18085","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3 - SSL Release Notes","ref":"notes.html#ssl-10-7-3"},{"type":"extras","doc":"- Client certification could fail if TLS-1.3 enabled client negotiated TLS-1.2\n connection with the server, this is due to the wrong version being used when\n decoding the certificate request message from the server.\n\n Own Id: OTP-18028 Aux Id: GH-5835\n\n- socket option packet_size was not handled in ssl:setops/2 and ssl:getotps/2\n\n Own Id: OTP-18062 Aux Id: GH-5898\n\n- Remove legacy code to fix interoperability with new socket inet_backend.\n\n Own Id: OTP-18071 Aux Id: GH-5930","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.2 - SSL Release Notes","ref":"notes.html#ssl-10-7-2"},{"type":"extras","doc":"- With this change, potential hanging of pre TLS1.3 client receiving OSCP staple\n message is avoided.\n\n Own Id: OTP-17994","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.1 - SSL Release Notes","ref":"notes.html#ssl-10-7-1"},{"type":"extras","doc":"- Client certification could fail for TLS-1.3 servers that did not include the\n certificate_authorities extension in its certificate request message.\n\n Own Id: OTP-17971 Aux Id: GH-5783","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7 - SSL Release Notes","ref":"notes.html#ssl-10-7"},{"type":"extras","doc":"- Improved error handling.\n\n Own Id: OTP-17759 Aux Id: GH-5367\n\n- Before this change, net_kernel used with TLS distribution might be leaking\n processes in case of connectivity issues.\n\n Own Id: OTP-17815 Aux Id: GH-5332\n\n- Fix makefile dependency bugs.\n\n Own Id: OTP-17847 Aux Id: PR-5574 GH-5548\n\n- Make sure the TLS sender process handles explicit calls to\n erlang:disconnect_node properly, avoiding potential hanging problems in\n net_kernel.\n\n Own Id: OTP-17929 Aux Id: GH-5708","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for TLS-1.3 certificate_authorities extension. And process\n certificate_authorities field in pre-TLS-1.3 certificate requests.\n\n Own Id: OTP-15719\n\n- Support password fun for protected keyfiles in ssl:connect function.\n\n Own Id: OTP-17816 Aux Id: PR-5607\n\n- Add in some cases earlier detection of possible DoS attacks by malicious\n clients sending unexpected TLS messages instead of the client hello. Note that\n such attacks are already mitigated by providing a timeout for the TLS\n handshake.\n\n Own Id: OTP-17903","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.6.1 - SSL Release Notes","ref":"notes.html#ssl-10-6-1"},{"type":"extras","doc":"- Improve SNI (server name indication) handling so that protocol version can be\n selected with regards to SNI. Also, make sure that\n ssl:connection_information/1 returns the correct SNI value.\n\n Own Id: OTP-17794 Aux Id: GH-5341, GH-4450\n\n- Fixed cipher suite listing functions so that the listing of all cipher suites\n will be complete. Another fix for cipher suite handling in OTP-24.1\n accidentally excludes a few cipher suites from the listing of all cipher\n suites.\n\n Own Id: OTP-17829 Aux Id: ERIERL-708\n\n- Reenable legacy cipher suite TLS_RSA_WITH_3DES_EDE_CBC_SHA for explicit\n configuration in TLS-1.2, not supported by default.\n\n Own Id: OTP-17879 Aux Id: GH-5624","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Avoid unnecessary logs by better adjusting the tls_sender process to the new\n supervisor structure in OTP-24.2\n\n Own Id: OTP-17831","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.6 - SSL Release Notes","ref":"notes.html#ssl-10-6"},{"type":"extras","doc":"- Allow re-connect on DTLS sockets\n\n Can happen when a computer reboots and connects from the same client port\n without the server noticing should be allowed according to RFC.\n\n Own Id: OTP-17411 Aux Id: ERL-1203, GH-4393\n\n- Fix tls and non-tls distribution to use erl_epmd:address_please to figure out\n if IPv4 or IPv6 addresses should be used when connecting to the remote node.\n\n Before this fix, a dns lookup of the remote node hostname determined which IP\n version was to be used which meant that the hostname had to resolve to a valid\n ip address.\n\n Own Id: OTP-17809 Aux Id: PR-5337 GH-5334","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Use supervisor significant child to manage tls connection process and tls\n sender process dependency.\n\n Own Id: OTP-17417\n\n- Random generation adjustment for TLS1.3\n\n Own Id: OTP-17699\n\n- Allow any \\{03,XX\\} TLS record version in the client hello for maximum\n interoperability\n\n Own Id: OTP-17761 Aux Id: GH-5380","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.5.3 - SSL Release Notes","ref":"notes.html#ssl-10-5-3"},{"type":"extras","doc":"- Correct typo of ECC curve name in signature algorithm handling. Will make the\n signature algorithm ecdsa_secp521r1_sha512 succeed.\n\n Own Id: OTP-17756 Aux Id: GH-5383, PR-5397\n\n- Suppress authenticity warning when option verify_none is explicitly supplied.\n\n Own Id: OTP-17757 Aux Id: GH-5352, PR-5395","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5.2 - SSL Release Notes","ref":"notes.html#ssl-10-5-2"},{"type":"extras","doc":"- Fix TLS-1.2 RSA-PSS negotiation and also fix broken certificate request\n message for pre-TLS-1.3 servers.\n\n Own Id: OTP-17688 Aux Id: GH-5255\n\n- Fix CRL issuer verification that under some circumstances could fail with a\n function_clause error.\n\n Own Id: OTP-17723 Aux Id: GH-5300","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5.1 - SSL Release Notes","ref":"notes.html#ssl-10-5-1"},{"type":"extras","doc":"- Before that change, TLS downgrade could occasionally fail when data intended\n for downgraded socket were delivered together with CLOSE_NOTIFY alert to ssl\n app.\n\n Own Id: OTP-17393\n\n- Avoid re-encoding of decoded certificates. This could cause unexpected\n failures as some subtle encoding errors can be tolerated when decoding but\n hence creating another sequence of bytes if the decoded value is re-encoded.\n\n Own Id: OTP-17657\n\n- Fix possible process leak when the process doing ssl:transport_accept dies\n before initiating the TLS handshake.\n\n Own Id: OTP-17666 Aux Id: GH-5239\n\n- Fix dtls memory leak, the replay window code was broken.\n\n Own Id: OTP-17670 Aux Id: GH-5224","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5 - SSL Release Notes","ref":"notes.html#ssl-10-5"},{"type":"extras","doc":"- Fix Makefile dependency generation to work no matter what the `ERL_TOP` folder\n is called.\n\n Own Id: OTP-17423 Aux Id: GH-4823 PR-4829\n\n- If trying to downgrade a TLS-1.3 connection to a plain TCP connection,\n possible TLS-1.3 session ticket messages will be ignored in the \"downgrade\"\n state while waiting for the close notify alert.\n\n Own Id: OTP-17517 Aux Id: GH-5009\n\n- Corrected error handling to correctly generate an insufficient security alert\n when there are no suitable groups that can be negotiated in TLS-1.3 instead of\n crashing resulting in an internal error alert.\n\n Own Id: OTP-17521\n\n- Properly handle default session data storage.\n\n When a client tries to reuse an expired session the default server storage\n handling would crash losing other session data. This would cause a error\n report and possible loss of abbreviated handshakes.\n\n Own Id: OTP-17635 Aux Id: GH-5192","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for RSA-PSS-PSS signatures and signature_algorithms_cert in\n TLS-1.2. This is a TLS-1.3 RFC requirement to backport this functionality.\n\n Own Id: OTP-16590 Aux Id: ERL-625, GH-5029\n\n- Use inet:monitor/1 to monitor listen-sockets so that we are compatible with\n the new socket backend for gen_tcp.\n\n Own Id: OTP-17392 Aux Id: PR-5050\n\n- Enhance ssl:prf/4 handling and testing\n\n Own Id: OTP-17464\n\n- Enhanced cipher suite filtering functionality, making sure TLS-1.3 and TLS-1.2\n cipher suites can be supported correctly together even when TLS-1.2 anonymous\n ciphers are included.\n\n Own Id: OTP-17501 Aux Id: GH-4978\n\n- Enhance gracefulness especially in TLS-1.3\n\n Own Id: OTP-17530","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.4.2 - SSL Release Notes","ref":"notes.html#ssl-10-4-2"},{"type":"extras","doc":"- Handle cross-signed root certificates when old root expired as reported in\n GH-4877.\n\n Own Id: OTP-17475 Aux Id: GH-4877\n\n- The signature selection algorithm has been changed to also verify if the\n client supports signatures using the elliptic curve of the server's\n public/private key pair. This change fixes #4958.\n\n Own Id: OTP-17529 Aux Id: PR-4979, GH-4958","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Slight optimization of certificate decoding.\n\n Own Id: OTP-17150 Aux Id: GH-4877","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.4.1 - SSL Release Notes","ref":"notes.html#ssl-10-4-1"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.4 - SSL Release Notes","ref":"notes.html#ssl-10-4"},{"type":"extras","doc":"- Missing runtime dependencies has been added to this application.\n\n Own Id: OTP-17243 Aux Id: PR-4557\n\n- TLS handshake should fail if OCSP staple is requested but missing. Note that\n OCSP support is still considered experimental and only partially implemented.\n\n Own Id: OTP-17343","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Removed ssl:ssl_accept/1,2,3 and ssl:cipher:suites/0,1 use ssl:handshake/1,2,3\n and ssl:cipher_suites/2,3 instead.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16974\n\n- Make TLS handshakes in Erlang distribution concurrent.\n\n Own Id: OTP-17044 Aux Id: PR-2654\n\n- Randomize internal `{active,n}` optimization when running Erlang distribution\n over TLS to spread RAM/CPU spike that may occur when starting up a big\n cluster.\n\n Own Id: OTP-17117 Aux Id: PR-2933\n\n- TLS connections now support EdDSA certificates.\n\n Own Id: OTP-17142 Aux Id: PR-4756, GH-4637, GH-4650\n\n- Enhance documentation and logging of certificate handling.\n\n Own Id: OTP-17384 Aux Id: GH-4800","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.3.1.5 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-5"},{"type":"extras","doc":"- Correct corner case of unexpected message handling for pre TLS-1.3 versions,\n could cause \"late failure\" and make the server dependent on its handshake\n timeout to prevent possible DoS attacks.\n\n Own Id: OTP-18224","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.4 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-4"},{"type":"extras","doc":"- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.3 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-3"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.2 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-2"},{"type":"extras","doc":"- Handle cross-signed root certificates when old root expired as reported in\n GH-4877.\n\n Own Id: OTP-17475 Aux Id: GH-4877\n\n- The signature selection algorithm has been changed to also verify if the\n client supports signatures using the elliptic curve of the server's\n public/private key pair. This change fixes #4958.\n\n Own Id: OTP-17529 Aux Id: PR-4979, GH-4958","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Slight optimization of certificate decoding.\n\n Own Id: OTP-17150 Aux Id: GH-4877","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.3.1.1 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-1"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1 - SSL Release Notes","ref":"notes.html#ssl-10-3-1"},{"type":"extras","doc":"- Retain backwards compatible behavior of verify_fun when handling incomplete\n chains that are not verifiable.\n\n Own Id: OTP-17296 Aux Id: GH-4682\n\n- Avoid server session handler crash, this will increase session ruse\n opportunities.\n\n Own Id: OTP-17348 Aux Id: ERIERL-641","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3 - SSL Release Notes","ref":"notes.html#ssl-10-3"},{"type":"extras","doc":"- Fix CRL handling that previously could fail to find the issuer cert under some\n circumstances.\n\n Own Id: OTP-17261 Aux Id: GH-4589\n\n- TLS-1.3 client could, under some circumstances, select an incorrect algorithm\n to sign the certificate verification message causing a TLS Decrypt Alert being\n issued by the server.\n\n Own Id: OTP-17281 Aux Id: GH-4620\n\n- Correct handling of default values for emulated socket options and retain the\n order of the ssl options list to ensure backwards compatible behavior if\n options should be set more than once.\n\n Own Id: OTP-17282","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance pre TLS-1.3 session handling so the client and server side handling is\n completely separated and client disregards oldest session when reaching max\n limit of the session table.\n\n Own Id: OTP-16876\n\n- This change implements the early data feature for TLS 1.3 clients.\n\n TLS 1.3 allows clients to send data in the first flight using a Pre-Shared Key\n to authenticate the server and to encrypt the early data.\n\n Own Id: OTP-16985\n\n- This change implements the early data feature for TLS 1.3 servers.\n\n Own Id: OTP-17042","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2.4.4 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-4"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.3 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-3"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.2 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-2"},{"type":"extras","doc":"- Fix handling of emulated socket options, the previous patch was incomplete,\n\n Own Id: OTP-17305","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.1 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-1"},{"type":"extras","doc":"- Backport of OTP-17282\n\n Correct handling of default values for emulated socket options and retain the\n order of the ssl options list to ensure backwards compatible behavior if\n options should be set more than once.\n\n Own Id: OTP-17289 Aux Id: GH-4585","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4 - SSL Release Notes","ref":"notes.html#ssl-10-2-4"},{"type":"extras","doc":"- Enhance logging option log_level to support none and all, also restore\n backwards compatibility for log_alert option.\n\n Own Id: OTP-17228 Aux Id: ERIERL-614","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.3 - SSL Release Notes","ref":"notes.html#ssl-10-2-3"},{"type":"extras","doc":"- Avoid race when the first two upgrade server handshakes (that is servers that\n use a gen_tcp socket as input to ssl:handshake/2,3) start close to each other.\n Could lead to that one of the handshakes would fail.\n\n Own Id: OTP-17190 Aux Id: ERIERL-606","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.2 - SSL Release Notes","ref":"notes.html#ssl-10-2-2"},{"type":"extras","doc":"- Avoid that upgrade (from TCP to TLS) servers starts multiple session cache\n handlers for the same server. This applies to Erlang distribution over TLS\n servers.\n\n Own Id: OTP-17139 Aux Id: ERL-1458, OTP-16239\n\n- Legacy cipher suites defined before TLS-1.2 (but still supported) should be\n possible to use in TLS-1.2. They where accidentally excluded for available\n cipher suites for TLS-1.2 in OTP-23.2.2.\n\n Own Id: OTP-17174 Aux Id: ERIERL-597","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enable Erlang distribution over TLS to run TLS-1.3, although TLS-1.2 will\n still be default.\n\n Own Id: OTP-16239 Aux Id: ERL-1458, OTP-17139","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2.1 - SSL Release Notes","ref":"notes.html#ssl-10-2-1"},{"type":"extras","doc":"- Fix CVE-2020-35733 this only affects ssl-10.2 (OTP-23.2). This vulnerability\n could enable a man in the middle attack using a fake chain to a known trusted\n ROOT. Also limits alternative chain handling, for handling of possibly\n extraneous certs, to improve memory management.\n\n Own Id: OTP-17098","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for AES CCM based cipher suites defined in RFC 7251\n\n Also Correct cipher suite name conversion to OpenSSL names. A few names where\n corrected earlier in OTP-16267 For backwards compatible reasons we support\n usage of openSSL names for cipher suites. Mostly anonymous suites names where\n incorrect, but also some legacy suites.\n\n Own Id: OTP-17100","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2 - SSL Release Notes","ref":"notes.html#ssl-10-2"},{"type":"extras","doc":"- SSL's Erlang Distribution Protocol modules inet_tls_dist and inet6_tls_dist\n lacked a callback function, so the start flag \"-dist_listen false\" did not\n work, which has now been fixed.\n\n Own Id: OTP-15126 Aux Id: ERL-1375\n\n- Correct OpenSSL names for newer cipher suites using DHE in their name that\n accidentally got the wrong value when fixing other older names using EDH\n instead.\n\n Own Id: OTP-16267 Aux Id: ERIERL-571, ERIERL-477\n\n- This change improves the handling of DTLS listening dockets, making it\n possible to open multiple listeners on the same port with different IP\n addresses.\n\n Own Id: OTP-16849 Aux Id: ERL-1339\n\n- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tarballs.\n\n Own Id: OTP-16921\n\n- This change fixes ssl:peername/1 when called on a DTLS client socket.\n\n Own Id: OTP-16923 Aux Id: ERL-1341, PR-2786\n\n- Retain emulation of active once on a closed socket to behave as before 23.1\n\n Own Id: OTP-17018 Aux Id: ERL-1409\n\n- Corrected server session cache entry deletion pre TLS-1.3. May increase\n session reuse.\n\n Own Id: OTP-17019 Aux Id: ERL-1412","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Handle extraneous certs in certificate chains as well as chains that are\n incomplete but can be reconstructed or unordered chains. The cert and certfile\n options will now accept a list of certificates so that the user may specify\n the chain explicitly.\n\n Also, the default value of the depth option has been increased to allow longer\n chains by default.\n\n Own Id: OTP-16277\n\n- This change implements optional NSS-style keylog in\n ssl:connection_information/2 for debugging purposes.\n\n The keylog contains various TLS secrets that can be loaded in Wireshark to\n decrypt TLS packets.\n\n Own Id: OTP-16445 Aux Id: PR-2823\n\n- Use new gen_statem feature of changing callback mode to improve code\n maintainability.\n\n Own Id: OTP-16529\n\n- The handling of Service Name Indication has been aligned with RFC8446.\n\n Own Id: OTP-16762\n\n- Add explicit session reuse option to TLS clients for pre TLS-1.3 sessions.\n Also, add documentation to Users Guide for such sessions.\n\n Own Id: OTP-16893","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.1 - SSL Release Notes","ref":"notes.html#ssl-10-1"},{"type":"extras","doc":"- If a passive socket is created, ssl:recv/2,3 is never called and then the peer\n closes the socket the controlling process will no longer receive an active\n close message.\n\n Own Id: OTP-16697 Aux Id: ERIERL-496\n\n- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764\n\n- This change fixes a potential man-in-the-middle vulnerability when the ssl\n client is configured to automatically handle session tickets\n (\\{session_tickets, auto\\}).\n\n Own Id: OTP-16765\n\n- Fix the internal handling of options 'verify' and 'verify_fun'.\n\n This change fixes a vulnerability when setting the ssl option 'verify' to\n verify_peer in a continued handshake won't take any effect resulting in the\n acceptance of expired peer certificates.\n\n Own Id: OTP-16767 Aux Id: ERIERL-512\n\n- This change fixes the handling of stateless session tickets when anti-replay\n is enabled.\n\n Own Id: OTP-16776 Aux Id: ERL-1316\n\n- Fix a crash due to the faulty handling of stateful session tickets received by\n servers expecting stateless session tickets.\n\n This change also improves the handling of faulty/invalid tickets.\n\n Own Id: OTP-16777 Aux Id: ERL-1317\n\n- Correct flow ctrl checks from OTP-16764 to work as intended. Probably will not\n have a noticeable affect but will make connections more well behaved under\n some circumstances.\n\n Own Id: OTP-16837 Aux Id: ERL-1319, OTP-16764\n\n- Distribution over TLS could exhibit livelock-like behaviour when there is a\n constant stream of distribution messages. Distribution data is now chunked\n every 16 Mb to avoid that.\n\n Own Id: OTP-16851 Aux Id: PR-2703","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Implement the cookie extension for TLS 1.3.\n\n Own Id: OTP-15855\n\n- Experimental OCSP client support.\n\n Own Id: OTP-16448\n\n- TLS 1.0 -TLS-1.2 sessions tables now have a absolute max value instead of\n using a shrinking mechanism when reaching the limit. To avoid out of memory\n problems under heavy load situations. Note that this change infers that\n implementations of ssl_session_cache_api needs to implement the size function\n (introduce in OTP 19) for session reuse to be optimally utilized.\n\n Own Id: OTP-16802 Aux Id: ERIERL-516","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.0 - SSL Release Notes","ref":"notes.html#ssl-10-0"},{"type":"extras","doc":"- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tar balls.\n\n Own Id: OTP-16562 Aux Id: ERL-1168\n\n- Correct translation of OpenSSL legacy names for two legacy cipher suites\n\n Own Id: OTP-16573 Aux Id: ERIERL-477\n\n- Correct documentation for PSK identity and SRP username.\n\n Own Id: OTP-16585\n\n- Make sure client hostname check is run when client uses its own verify_fun\n\n Own Id: OTP-16626 Aux Id: ERL-1232\n\n- Improved signature selection mechanism in TLS 1.3 for increased\n interoperability.\n\n Own Id: OTP-16638 Aux Id: ERL-1206","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Drop support for SSL-3.0. Support for this legacy TLS version has not been\n enabled by default since OTP 19. Now all code to support it has been removed,\n that is SSL-3.0 protocol version can not be used and is considered invalid.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14790\n\n- Added support for RSA-PSS signature schemes\n\n Own Id: OTP-15247\n\n- Improve interoperability by implementing the middlebox compatibility mode.\n\n The middlebox compatibility mode makes the TLS 1.3 handshake look more like a\n TLS 1.2 handshake and increases the chance of successfully establishing TLS\n 1.3 connections through legacy middleboxes.\n\n Own Id: OTP-15589\n\n- Utilize new properties of\n [`erlang:dist_ctrl_get_data()`](`erlang:dist_ctrl_get_data/1`) for performance\n improvement of Erlang distribution over TLS.\n\n Own Id: OTP-16127 Aux Id: OTP-15618\n\n- Calls of deprecated functions in the\n [Old Crypto API](`e:crypto:new_api.md#the-old-api`) are replaced by calls of\n their [substitutions](`e:crypto:new_api.md#the-new-api`).\n\n Own Id: OTP-16346\n\n- Implement cipher suite TLS_AES_128_CCM_8_SHA256.\n\n Own Id: OTP-16391\n\n- This change adds TLS-1.3 to the list of default supported versions. That is,\n TLS-1.3 and TLS-1.2 are configured when ssl option 'versions' is not\n explicitly set.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16400\n\n- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- Extended ssl:versions so that it lists supported, available and implemented\n TLS/DTLS versions.\n\n Own Id: OTP-16519\n\n- Added new option exclusive for ssl:cipher_suites/2,3\n\n Own Id: OTP-16532\n\n- Avoid DoS attack against stateful session_tickets by making session ticket ids\n unpredictable.\n\n Own Id: OTP-16533\n\n- Add support for the max_fragment_length extension (RFC 6066).\n\n Own Id: OTP-16547 Aux Id: PR-2547\n\n- Add srp_username in ssl:connection_info, update the document with types of\n this function.\n\n Own Id: OTP-16584","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.6.2.3 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-3"},{"type":"extras","doc":"- Correct flow ctrl checks from OTP-16764 to work as intended. Probably will not\n have a noticeable affect but will make connections more well behaved under\n some circumstances.\n\n Own Id: OTP-16837 Aux Id: ERL-1319, OTP-16764\n\n- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tar balls.\n\n Own Id: OTP-16921","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.2.2 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-2"},{"type":"extras","doc":"- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764\n\n- Fix the internal handling of options 'verify' and 'verify_fun'.\n\n This change fixes a vulnerability when setting the ssl option 'verify' to\n verify_peer in a continued handshake won't take any effect resulting in the\n acceptance of expired peer certificates.\n\n Own Id: OTP-16767 Aux Id: ERIERL-512","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.2.1 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-1"},{"type":"extras","doc":"- If a passive socket is created, ssl:recv/2,3 is never called and then the peer\n closes the socket the controlling process will no longer receive an active\n close message.\n\n Own Id: OTP-16697 Aux Id: ERIERL-496","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.6.2 - SSL Release Notes","ref":"notes.html#ssl-9-6-2"},{"type":"extras","doc":"- Fix timing bug that could cause ssl sockets to become unresponsive after an\n ssl:recv/3 call timed out\n\n Own Id: OTP-16619 Aux Id: ERL-1213","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.1 - SSL Release Notes","ref":"notes.html#ssl-9-6-1"},{"type":"extras","doc":"- Correct error handling when the partial_chain fun claims a certificate to be\n the trusted cert that is not part of the chain. This bug would hide the\n appropriate alert generating an \"INTERNAL_ERROR\" alert instead.\n\n Own Id: OTP-16567 Aux Id: ERIERL-481","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6 - SSL Release Notes","ref":"notes.html#ssl-9-6"},{"type":"extras","doc":"- Correct handling of TLS record limit in TLS-1.3. The max value differs from\n previous versions. Also the payload data max record check was broken, that is\n record overflow problems could occur if user sent large amounts of data.\n\n Own Id: OTP-16258\n\n- Correct close handling for DTLS\n\n Own Id: OTP-16348 Aux Id: ERL-1110\n\n- Fix ssl:getstat/1-2 to also work for DTLS sockets\n\n Own Id: OTP-16352 Aux Id: ERL-1099\n\n- Correct internal handling och socket active mode to avoid reviving TCP data\n aimed for a downgraded TLS socket.\n\n Own Id: OTP-16425\n\n- When using the host name as fallback for SNI (server name indication) strip a\n possible trailing dot that is allowed in a host name but not in the SNI. Also\n if the server receives a SNI with a trailing dot send an UNRECOGNIZED_NAME\n alert.\n\n Own Id: OTP-16437 Aux Id: ERL-1135\n\n- Immediately remove session entries if handshake is abruptly closed at\n transport level.\n\n Own Id: OTP-16479","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Implementation of the key and initialization vector update feature, and\n general hardening of TLS 1.3.\n\n There are cryptographic limits on the amount of plaintext which can be safely\n encrypted under a given set of keys.\n\n This change enforces those limits by triggering automatic key updates on TLS\n 1.3 connections.\n\n Own Id: OTP-15856\n\n- Add support for TLS 1.3 Session Tickets (stateful and stateless). This allows\n session resumption using keying material from a previous successful handshake.\n\n Own Id: OTP-16253\n\n- Add support for key exchange with Edward curves and PSS-RSA padding in\n signature verification.\n\n Own Id: OTP-16528","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.5.3 - SSL Release Notes","ref":"notes.html#ssl-9-5-3"},{"type":"extras","doc":"- Enhance error handling, all ALERTS shall be handled gracefully and not cause a\n crash.\n\n Own Id: OTP-16413 Aux Id: ERL-1136\n\n- Enhance alert logging, in some places the role indication of the alert origin\n was missing. So the log would say undefined instead of client or server.\n\n Own Id: OTP-16424\n\n- Two different optimizations did not work together and resulted in the possible\n breakage of connections using stream ciphers (that is RC4). Reworked the\n implementation to avoid this.\n\n Own Id: OTP-16426 Aux Id: ERL-1136","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5.2 - SSL Release Notes","ref":"notes.html#ssl-9-5-2"},{"type":"extras","doc":"- Fix the handling of GREASE values sent by web browsers when establishing TLS\n 1.3 connections. This change improves handling of GREASE values in various\n protocol elements sent in a TLS 1.3 ClientHello.\n\n Own Id: OTP-16388 Aux Id: ERL-1130\n\n- Correct DTLS listen emulation, could cause problems with opening a new DTLS\n listen socket for a port previously used by a now closed DTLS listen socket.\n\n Own Id: OTP-16396 Aux Id: ERL-1118","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5.1 - SSL Release Notes","ref":"notes.html#ssl-9-5-1"},{"type":"extras","doc":"- Add missing alert handling clause for TLS record handling. Could sometimes\n cause confusing error behaviors of TLS connections.\n\n Own Id: OTP-16357 Aux Id: ERL-1166\n\n- Fix handling of ssl:recv that happens during a renegotiation. Using the\n passive receive function ssl:recv/\\[2,3] during a renegotiation would fail the\n connection with unexpected msg.\n\n Own Id: OTP-16361","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5 - SSL Release Notes","ref":"notes.html#ssl-9-5"},{"type":"extras","doc":"- Corrected CRL handling which could cause CRL verification to fail. This could\n happen when the CRL distribution point explicitly specifies the CRL issuer,\n that is not using the fallback.\n\n Own Id: OTP-16156 Aux Id: ERL-1030\n\n- Correct handling of unordered chains so that it works as expected\n\n Own Id: OTP-16293\n\n- Fix bug causing ssl application to crash when handshake is paused and\n ClientHello contains extensions for session resumption\n (psk_key_exchange_modes, pre_shared_key).\n\n Own Id: OTP-16295 Aux Id: ERL-1095\n\n- Fix connectivity problems with legacy servers when client is configured to\n support a range of protocol versions including TLS 1.3.\n\n Own Id: OTP-16303","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improve session handling for TLS-1.3 compatibility mode and cleaner internal\n handling so that removal of old session data can be more efficient, hopefully\n mitigating problems with big session tables during heavy load.\n\n Own Id: OTP-15524 Aux Id: OTP-15352\n\n- Correct handling of DTLS listen socket emulation. Could cause failure to\n create new listen socket after process that owned previous listen socket died.\n\n Own Id: OTP-15809 Aux Id: ERL-917\n\n- Add detailed info in ALERT description when client does not send a requested\n cert.\n\n Own Id: OTP-16266","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.4 - SSL Release Notes","ref":"notes.html#ssl-9-4"},{"type":"extras","doc":"- Handling of zero size fragments in TLS could cause an infinite loop. This has\n now been corrected.\n\n Own Id: OTP-15328 Aux Id: ERIERL-379\n\n- DTLS record check needs to consider that a resent hello message can have a\n different version than the negotiated.\n\n Own Id: OTP-15807 Aux Id: ERL-920","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Basic support for TLS 1.3 Client for experimental use. For more information\n see the Standards Compliance chapter of the User's Guide.\n\n Own Id: OTP-15431\n\n- Correct solution for retaining tcp flow control OTP-15802 (ERL-934) as to not\n break ssl:recv as reported in (ERL-938)\n\n Own Id: OTP-15823 Aux Id: ERL-934, ERL-938\n\n- Enhance dialyzer specs to reflect implementation better and avoid dialyzer\n warnings for the user that wants to use TLS with unix domain sockets.\n\n Own Id: OTP-15851 Aux Id: PR-2235\n\n- Add support for ECDSA signature algorithms in TLS 1.3.\n\n Own Id: OTP-15854\n\n- Correct error handling of TLS downgrade, possible return values form\n ssl:close/2 when downgrading is \\{ok, Port\\} or \\{error, Reason\\}, it could\n happen that only ok was returned instead of \\{error, closed\\} when downgrade\n failed due to that the peer closed the TCP connection.\n\n Own Id: OTP-16027","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.3.5 - SSL Release Notes","ref":"notes.html#ssl-9-3-5"},{"type":"extras","doc":"- Enhance error handling for erroneous alerts from the peer.\n\n Own Id: OTP-15943","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.3.4 - SSL Release Notes","ref":"notes.html#ssl-9-3-4"},{"type":"extras","doc":"- Fix handling of certificate decoding problems in TLS 1.3 similarly as in TLS\n 1.2.\n\n Own Id: OTP-15900\n\n- Hibernation now works as expected in all cases, was accidentally broken by\n optimization efforts.\n\n Own Id: OTP-15910\n\n- Fix interoperability problems with openssl when the TLS 1.3 server is\n configured with the option signature_algs_cert.\n\n Own Id: OTP-15913","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.3 - SSL Release Notes","ref":"notes.html#ssl-9-3-3"},{"type":"extras","doc":"- Correct handshake handling, might cause strange symptoms such as ASN.1\n certificate decoding issues.\n\n Own Id: OTP-15879 Aux Id: ERL-968\n\n- Fix handling of the signature_algorithms_cert extension in the ClientHello\n handshake message.\n\n Own Id: OTP-15887 Aux Id: ERL-973\n\n- Handle new ClientHello extensions when handshake is paused by the \\{handshake,\n hello\\} ssl option.\n\n Own Id: OTP-15888 Aux Id: ERL-975","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.2 - SSL Release Notes","ref":"notes.html#ssl-9-3-2"},{"type":"extras","doc":"- Returned \"alert error string\" is now same as logged alert string\n\n Own Id: OTP-15844\n\n- Fix returned extension map fields to follow the documentation.\n\n Own Id: OTP-15862 Aux Id: ERL-951\n\n- Avoid DTLS crash due to missing gen_server return value in DTLS packet demux\n process.\n\n Own Id: OTP-15864 Aux Id: ERL-962","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.1 - SSL Release Notes","ref":"notes.html#ssl-9-3-1"},{"type":"extras","doc":"- Missing check of size of user_data_buffer made internal socket behave as an\n active socket instead of active N. This could cause memory problems.\n\n Own Id: OTP-15825 Aux Id: ERL-934, OTP-15823","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3 - SSL Release Notes","ref":"notes.html#ssl-9-3"},{"type":"extras","doc":"- The distribution handshake with TLS distribution (`inet_tls_dist`) does now\n utilize the socket option `{nodelay, true}`, which decreases the distribution\n setup time significantly.\n\n Own Id: OTP-14792\n\n- Correct shutdown reason to avoid an incorrect crash report\n\n Own Id: OTP-15710 Aux Id: ERL-893\n\n- Enhance documentation and type specifications.\n\n Own Id: OTP-15746 Aux Id: ERIERL-333","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS-1.0, TLS-1.1 and DTLS-1.0 are now considered legacy and not supported by\n default\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14865\n\n- Use new logger API in ssl. Introduce log levels and verbose debug logging for\n SSL.\n\n Own Id: OTP-15055\n\n- Add new API function str_to_suite/1, cipher_suites/3 (list cipher suites as\n rfc or OpenSSL name strings) and suite_to_openssl_str/1\n\n Own Id: OTP-15483 Aux Id: ERL-924\n\n- Basic support for TLS 1.3 Server for experimental use. The client is not yet\n functional, for more information see the Standards Compliance chapter of the\n User's Guide.\n\n Own Id: OTP-15591\n\n- Add support for PSK CCM ciphers from RFC 6655\n\n Own Id: OTP-15626","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.2.3.7 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-7"},{"type":"extras","doc":"- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.6 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-6"},{"type":"extras","doc":"- Fix timing bug that could cause ssl sockets to become unresponsive after an\n ssl:recv/3 call timed out\n\n Own Id: OTP-16619 Aux Id: ERL-1213","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.5 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-5"},{"type":"extras","doc":"- Handling of zero size fragments in TLS could cause an infinite loop. This has\n now been corrected.\n\n Own Id: OTP-15328 Aux Id: ERIERL-379","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.4 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-4"},{"type":"extras","doc":"- Hibernation now works as expected in all cases, was accidentally broken by\n optimization efforts.\n\n Own Id: OTP-15910","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.3 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-3"},{"type":"extras","doc":"- Correct handshake handling, might cause strange symptoms such as ASN.1\n certificate decoding issues.\n\n Own Id: OTP-15879 Aux Id: ERL-968","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.2 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-2"},{"type":"extras","doc":"- Returned \"alert error string\" is now same as logged alert string\n\n Own Id: OTP-15844","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.1 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-1"},{"type":"extras","doc":"- Correct solution for retaining tcp flow control OTP-15802 (ERL-934) as to not\n break ssl:recv as reported in (ERL-938)\n\n Own Id: OTP-15823 Aux Id: ERL-934, ERL-938","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3 - SSL Release Notes","ref":"notes.html#ssl-9-2-3"},{"type":"extras","doc":"- Missing check of size of user_data_buffer made internal socket behave as an\n active socket instead of active N. This could cause memory problems.\n\n Own Id: OTP-15802 Aux Id: ERL-934","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Back port of bug fix ERL-893 from OTP-22 and document enhancements that will\n solve dialyzer warnings for users of the ssl application.\n\n This change also affects public_key, eldap (and inet doc).\n\n Own Id: OTP-15785 Aux Id: ERL-929, ERL-893, PR-2215","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.2.2 - SSL Release Notes","ref":"notes.html#ssl-9-2-2"},{"type":"extras","doc":"- With the default BEAST Mitigation strategy for TLS 1.0 an empty TLS fragment\n could be sent after a one-byte fragment. This glitch has been fixed.\n\n Own Id: OTP-15054 Aux Id: ERIERL-346","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.1 - SSL Release Notes","ref":"notes.html#ssl-9-2-1"},{"type":"extras","doc":"- The timeout for a passive receive was sometimes not cancelled and later caused\n a server crash. This bug has now been corrected.\n\n Own Id: OTP-14701 Aux Id: ERL-883, ERL-884\n\n- Add tag for passive message (active N) in cb_info to retain transport\n transparency.\n\n Own Id: OTP-15679 Aux Id: ERL-861","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2 - SSL Release Notes","ref":"notes.html#ssl-9-2"},{"type":"extras","doc":"- Fix bug that an incorrect return value for gen_statem could be created when\n alert was a result of handling renegotiation info extension\n\n Own Id: OTP-15502\n\n- Correct check for 3des_ede_cbc, could cause ssl to claim to support\n 3des_ede_cbc when cryptolib does not.\n\n Own Id: OTP-15539\n\n- Improved DTLS error handling, avoids unexpected connection failure in rare\n cases.\n\n Own Id: OTP-15561\n\n- Corrected active once emulation bug that could cause the ssl_closed meassage\n to not be sent. Bug introduced by OTP-15449\n\n Own Id: OTP-15666 Aux Id: ERIERL-316,","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add client option \\{reuse_session, SessionID::binary()\\} that can be used\n together with new option value \\{reuse_sessions, save\\}. This makes it\n possible to reuse a session from a specific connection establishment.\n\n Own Id: OTP-15369\n\n- The Reason part of of the error return from the functions connect and\n handshake has a better and documented format. This will sometimes differ from\n previous returned reasons, however those where only documented as term() and\n should for that reason not be relied on.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15423\n\n- Refactor of state handling to improve TLS application data throughput and\n reduce CPU overhead\n\n Own Id: OTP-15445\n\n- The SSL code has been optimized in many small ways to reduce CPU load for\n encryption/decryption, especially for Erlang's distribution protocol over TLS.\n\n Own Id: OTP-15529\n\n- Add support for active N\n\n Own Id: OTP-15665 Aux Id: ERL-811, PR-2072","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.1.2 - SSL Release Notes","ref":"notes.html#ssl-9-1-2"},{"type":"extras","doc":"- Fix encoding of the SRP extension length field in ssl. The old encoding of the\n SRP extension length could cause interoperability problems with third party\n SSL implementations when SRP was used.\n\n Own Id: OTP-15477 Aux Id: ERL-790\n\n- Guarantee active once data delivery, handling TCP stream properly.\n\n Own Id: OTP-15504 Aux Id: ERL-371\n\n- Correct gen_statem returns for some error cases\n\n Own Id: OTP-15505","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.1.1 - SSL Release Notes","ref":"notes.html#ssl-9-1-1"},{"type":"extras","doc":"- Fixed renegotiation bug. Client did not handle server initiated renegotiation\n correctly after rewrite to two connection processes, due to ERL-622 commit\n d87ac1c55188f5ba5cdf72384125d94d42118c18. This could manifest it self as a \"\n bad_record_mac\" alert.\n\n Also included are some optimizations\n\n Own Id: OTP-15489 Aux Id: ERL-308","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.1 - SSL Release Notes","ref":"notes.html#ssl-9-1"},{"type":"extras","doc":"- PEM cache was not evicting expired entries due to due to timezone confusion.\n\n Own Id: OTP-15368\n\n- Make sure an error is returned if a \"transport_accept socket\" is used in some\n other call than ssl:handshake\\* or ssl:controlling_process\n\n Own Id: OTP-15384 Aux Id: ERL-756\n\n- Fix timestamp handling in the PEM-cache could cause entries to not be\n invalidated at the correct time.\n\n Own Id: OTP-15402\n\n- Extend check for undelivered data at closing, could under some circumstances\n fail to deliver all data that was actually received.\n\n Own Id: OTP-15412 Aux Id: ERL-731\n\n- Correct signature check for TLS-1.2 that allows different algorithms for\n signature of peer cert and peer cert key. Not all allowed combinations where\n accepted.\n\n Own Id: OTP-15415 Aux Id: ERL-763\n\n- Correct gen_statem return value, could cause renegotiation to fail.\n\n Own Id: OTP-15418 Aux Id: ERL-770","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add engine support for RSA key exchange\n\n Own Id: OTP-15420 Aux Id: ERIERL-268\n\n- ssl now uses active n internally to boost performance. Old active once\n behavior can be restored by setting application variable see manual page for\n ssl application (man 6).\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15449","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.0.3 - SSL Release Notes","ref":"notes.html#ssl-9-0-3"},{"type":"extras","doc":"- Correct alert handling with new TLS sender process, from ssl-9.0.2. CLOSE\n ALERTS could under some circumstances be encoded using an incorrect cipher\n state. This would cause the peer to regard them as unknown messages.\n\n Own Id: OTP-15337 Aux Id: ERL-738\n\n- Correct handling of socket packet option with new TLS sender process, from\n ssl-9.0.2. When changing the socket option \\{packet, 1|2|3|4\\} with\n ssl:setopts/2 the option must internally be propagated to the sender process\n as well as the reader process as this particular option also affects the data\n to be sent.\n\n Own Id: OTP-15348 Aux Id: ERL-747","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.0.2 - SSL Release Notes","ref":"notes.html#ssl-9-0-2"},{"type":"extras","doc":"- Use separate processes for sending and receiving application data for TLS\n connections to avoid potential deadlock that was most likely to occur when\n using TLS for Erlang distribution. Note does not change the API.\n\n Own Id: OTP-15122\n\n- Correct handling of empty server SNI extension\n\n Own Id: OTP-15168\n\n- Correct PSK cipher suite handling and add selected_cipher_suite to connection\n information\n\n Own Id: OTP-15172\n\n- Adopt to the fact that cipher suite sign restriction are relaxed in TLS-1.2\n\n Own Id: OTP-15173\n\n- Enhance error handling of non existing PEM files\n\n Own Id: OTP-15174\n\n- Correct close handling of transport accepted sockets in the error state\n\n Own Id: OTP-15216\n\n- Correct PEM cache to not add references to empty entries when PEM file does\n not exist.\n\n Own Id: OTP-15224\n\n- Correct handling of all PSK cipher suites\n\n Before only some PSK suites would be correctly negotiated and most PSK ciphers\n suites would fail the connection.\n\n Own Id: OTP-15285","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS will now try to order certificate chains if they appear to be unordered.\n That is prior to TLS 1.3, “certificate_list” ordering was required to be\n strict, however some implementations already allowed for some flexibility. For\n maximum compatibility, all implementations SHOULD be prepared to handle\n potentially extraneous certificates and arbitrary orderings from any TLS\n version.\n\n Own Id: OTP-12983\n\n- TLS will now try to reconstructed an incomplete certificate chains from its\n local CA-database and use that data for the certificate path validation. This\n especially makes sense for partial chains as then the peer might not send an\n intermediate CA as it is considered the trusted root in that case.\n\n Own Id: OTP-15060\n\n- Option keyfile defaults to certfile and should be trumped with key. This\n failed for engine keys.\n\n Own Id: OTP-15193\n\n- Error message improvement when own certificate has decoding issues, see also\n issue ERL-668.\n\n Own Id: OTP-15234\n\n- Correct dialyzer spec for key option\n\n Own Id: OTP-15281","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.0.1 - SSL Release Notes","ref":"notes.html#ssl-9-0-1"},{"type":"extras","doc":"- Correct cipher suite handling for ECDHE\\_\\*, the incorrect handling could\n cause an incorrrect suite to be selected and most likely fail the handshake.\n\n Own Id: OTP-15203","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.0 - SSL Release Notes","ref":"notes.html#ssl-9-0"},{"type":"extras","doc":"- Correct handling of ECDH suites.\n\n Own Id: OTP-14974\n\n- Proper handling of clients that choose to send an empty answer to a\n certificate request\n\n Own Id: OTP-15050","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Distribution over SSL (inet_tls) has, to improve performance, been rewritten\n to not use intermediate processes and ports.\n\n Own Id: OTP-14465\n\n- Add support for ECDHE_PSK cipher suites\n\n Own Id: OTP-14547\n\n- For security reasons no longer support 3-DES cipher suites by default\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14768\n\n- For security reasons RSA-key exchange cipher suites are no longer supported by\n default\n\n \\*** INCOMPATIBILITY with possible \\***\n\n Own Id: OTP-14769\n\n- The interoperability option to fallback to insecure renegotiation now has to\n be explicitly turned on.\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14789\n\n- Drop support for SSLv2 enabled clients. SSLv2 has been broken for decades and\n never supported by the Erlang SSL/TLS implementation. This option was by\n default disabled and enabling it has proved to sometimes break connections not\n using SSLv2 enabled clients.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14824\n\n- Remove CHACHA20_POLY1305 ciphers form default for now. We have discovered\n interoperability problems, ERL-538, that we believe needs to be solved in\n crypto.\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14882\n\n- Generalize DTLS packet multiplexing to make it easier to add future DTLS\n features and uses.\n\n Own Id: OTP-14888\n\n- Use uri_string module instead of http_uri.\n\n Own Id: OTP-14902\n\n- The SSL distribution protocol `-proto inet_tls` has stopped setting the SSL\n option `server_name_indication`. New verify funs for client and server in\n `inet_tls_dist` has been added, not documented yet, that checks node name if\n present in peer certificate. Usage is still also yet to be documented.\n\n Own Id: OTP-14969 Aux Id: OTP-14465, ERL-598\n\n- Deprecate ssl:ssl_accept/\\[1,2,3] in favour of ssl:handshake/\\[1,2,3]\n\n Own Id: OTP-15056\n\n- Customizes the hostname verification of the peer certificate, as different\n protocols that use TLS such as HTTP or LDAP may want to do it differently\n\n Own Id: OTP-15102 Aux Id: ERL-542, OTP-14962\n\n- Add utility function for converting erlang cipher suites to a string\n representation (ERL-600).\n\n Own Id: OTP-15106\n\n- First version with support for DTLS\n\n Own Id: OTP-15142","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.6.4 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-4"},{"type":"extras","doc":"- Add engine support for RSA key exchange\n\n Own Id: OTP-15420","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.3 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-3"},{"type":"extras","doc":"- Extend check for undelivered data at closing, could under some circumstances\n fail to deliverd all data that was acctualy recivied.\n\n Own Id: OTP-15412","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.2 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-2"},{"type":"extras","doc":"- Correct handling of empty server SNI extension\n\n Own Id: OTP-15168\n\n- Correct cipher suite handling for ECDHE\\_\\*, the incorrect handling could\n cause an incorrrect suite to be selected and most likely fail the handshake.\n\n Own Id: OTP-15203","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.1 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-1"},{"type":"extras","doc":"- Improve cipher suite handling correcting ECC and TLS-1.2 requierments.\n Backport of solution for ERL-641\n\n Own Id: OTP-15178","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Option keyfile defaults to certfile and should be trumped with key. This\n failed for engine keys.\n\n Own Id: OTP-15193","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.6 - SSL Release Notes","ref":"notes.html#ssl-8-2-6"},{"type":"extras","doc":"- Proper handling of clients that choose to send an empty answer to a\n certificate request\n\n Own Id: OTP-15050","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.5 - SSL Release Notes","ref":"notes.html#ssl-8-2-5"},{"type":"extras","doc":"- Fix filter function to not incorrectly exclude AEAD cipher suites\n\n Own Id: OTP-14981","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.4 - SSL Release Notes","ref":"notes.html#ssl-8-2-4"},{"type":"extras","doc":"- Optimization of bad merge conflict resolution causing dubble decode\n\n Own Id: OTP-14843\n\n- Restore error propagation to OTP-19.3 behaviour, in OTP-20.2 implementation\n adjustments to gen_statem needed some further adjustments to avoid a race\n condition. This could cause a TLS server to not always report file path errors\n correctly.\n\n Own Id: OTP-14852\n\n- Corrected RC4 suites listing function to regard TLS version\n\n Own Id: OTP-14871\n\n- Fix alert handling so that unexpected messages are logged and alerted\n correctly\n\n Own Id: OTP-14919\n\n- Correct handling of anonymous cipher suites\n\n Own Id: OTP-14952","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added new API functions to facilitate cipher suite handling\n\n Own Id: OTP-14760\n\n- Correct TLS_FALLBACK_SCSV handling so that this special flag suite is always\n placed last in the cipher suite list in accordance with the specs. Also make\n sure this functionality is used in DTLS.\n\n Own Id: OTP-14828\n\n- Add TLS record version sanity check for early as possible error detection and\n consistency in ALERT codes generated\n\n Own Id: OTP-14892","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.3 - SSL Release Notes","ref":"notes.html#ssl-8-2-3"},{"type":"extras","doc":"- Packet options cannot be supported for unreliable transports, that is, packet\n option for DTLS over udp will not be supported.\n\n Own Id: OTP-14664\n\n- Ensure data delivery before close if possible. This fix is related to fix in\n PR-1479.\n\n Own Id: OTP-14794","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The crypto API is extended to use private/public keys stored in an Engine for\n sign/verify or encrypt/decrypt operations.\n\n The ssl application provides an API to use this new engine concept in TLS.\n\n Own Id: OTP-14448\n\n- Implemented renegotiation for DTLS\n\n Own Id: OTP-14563\n\n- A new command line option `-ssl_dist_optfile` has been added to facilitate\n specifying the many options needed when using SSL as the distribution\n protocol.\n\n Own Id: OTP-14657","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.2 - SSL Release Notes","ref":"notes.html#ssl-8-2-2"},{"type":"extras","doc":"- TLS sessions must be registered with SNI if provided, so that sessions where\n client hostname verification would fail cannot connect reusing a session\n created when the server name verification succeeded.\n\n Own Id: OTP-14632\n\n- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- If no SNI is available and the hostname is an IP-address also check for\n IP-address match. This check is not as good as a DNS hostname check and\n certificates using IP-address are not recommended.\n\n Own Id: OTP-14655","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.1 - SSL Release Notes","ref":"notes.html#ssl-8-2-1"},{"type":"extras","doc":"- Max session table works correctly again\n\n Own Id: OTP-14556","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Customize alert handling for DTLS over UDP to mitigate DoS attacks\n\n Own Id: OTP-14078\n\n- Improved error propagation and reports\n\n Own Id: OTP-14236","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2 - SSL Release Notes","ref":"notes.html#ssl-8-2"},{"type":"extras","doc":"- ECDH-ECDSA key exchange supported, was accidentally dismissed in earlier\n versions.\n\n Own Id: OTP-14421\n\n- Correct close semantics for active once connections. This was a timing\n dependent bug the resulted in the close message not always reaching the ssl\n user process.\n\n Own Id: OTP-14443","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS-1.2 clients will now always send hello messages on its own format, as\n opposed to earlier versions that will send the hello on the lowest supported\n version, this is a change supported by the latest RFC.\n\n This will make interoperability with some newer servers smoother. Potentially,\n but unlikely, this could cause a problem with older servers if they do not\n adhere to the RFC and ignore unknown extensions.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13820\n\n- Allow Erlang/OTP to use OpenSSL in FIPS-140 mode, in order to satisfy specific\n security requirements (mostly by different parts of the US federal\n government).\n\n See the new crypto users guide \"FIPS mode\" chapter about building and using\n the FIPS support which is disabled by default.\n\n (Thanks to dszoboszlay and legoscia)\n\n Own Id: OTP-13921 Aux Id: PR-1180\n\n- Implemented DTLS cookie generation, required by spec, instead of using a\n hardcoded value.\n\n Own Id: OTP-14076\n\n- Implement sliding window replay protection of DTLS records.\n\n Own Id: OTP-14077\n\n- TLS client processes will by default call public_key:pkix_verify_hostname/2 to\n verify the hostname of the connection with the server certificates specified\n hostname during certificate path validation. The user may explicitly disables\n it. Also if the hostname cannot be derived from the first argument to connect\n or is not supplied by the server name indication option, the check will not be\n performed.\n\n Own Id: OTP-14197\n\n- Extend connection_information/\\[1,2] . The values session_id, master_secret,\n client_random and server_random can no be accessed by\n connection_information/2. Note only session_id will be added to\n connection_information/1. The rational is that values concerning the\n connection security should have to be explicitly requested.\n\n Own Id: OTP-14291\n\n- Chacha cipher suites are currently not tested enough to be most preferred ones\n\n Own Id: OTP-14382\n\n- Basic support for DTLS that been tested together with OpenSSL.\n\n Test by providing the option \\{protocol, dtls\\} to the ssl API functions\n connect and listen.\n\n Own Id: OTP-14388","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.1.3.1.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-3-1-1"},{"type":"extras","doc":"- Fix alert handling so that unexpected messages are logged and alerted\n correctly\n\n Own Id: OTP-14929","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.3.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-3-1"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.3 - SSL Release Notes","ref":"notes.html#ssl-8-1-3"},{"type":"extras","doc":"- Remove debug printout\n\n Own Id: OTP-14396","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.2 - SSL Release Notes","ref":"notes.html#ssl-8-1-2"},{"type":"extras","doc":"- Correct active once emulation, for TLS. Now all data received by the\n connection process will be delivered through active once, even when the active\n once arrives after that the gen_tcp socket is closed by the peer.\n\n Own Id: OTP-14300","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-1"},{"type":"extras","doc":"- Corrected termination behavior, that caused a PEM cache bug and sometimes\n resulted in connection failures.\n\n Own Id: OTP-14100\n\n- Fix bug that could hang ssl connection processes when failing to require more\n data for very large handshake packages. Add option max_handshake_size to\n mitigate DoS attacks.\n\n Own Id: OTP-14138\n\n- Improved support for CRL handling that could fail to work as intended when an\n id-ce-extKeyUsage was present in the certificate. Also improvements where\n needed to distributionpoint handling so that all revocations actually are\n found and not deemed to be not determinable.\n\n Own Id: OTP-14141\n\n- A TLS handshake might accidentally match old sslv2 format and ssl application\n would incorrectly aborted TLS handshake with ssl_v2_client_hello_no_supported.\n Parsing was altered to avoid this problem.\n\n Own Id: OTP-14222\n\n- Correct default cipher list to prefer AES 128 before 3DES\n\n Own Id: OTP-14235","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Move PEM cache to a dedicated process, to avoid making the SSL manager process\n a bottleneck. This improves scalability of TLS connections.\n\n Own Id: OTP-13874","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.1 - SSL Release Notes","ref":"notes.html#ssl-8-1"},{"type":"extras","doc":"- List of possible anonymous suites, never supported by default, where incorrect\n for some TLS versions.\n\n Own Id: OTP-13926","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Experimental version of DTLS. It is runnable but not complete and cannot be\n considered reliable for production usage.\n\n Own Id: OTP-12982\n\n- Add API options to handle ECC curve selection.\n\n Own Id: OTP-13959","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.0.3 - SSL Release Notes","ref":"notes.html#ssl-8-0-3"},{"type":"extras","doc":"- A timing related bug in event handling could cause interoperability problems\n between an erlang TLS server and some TLS clients, especially noticed with\n Firefox as TLS client.\n\n Own Id: OTP-13917\n\n- Correct ECC curve selection, the error could cause the default to always be\n selected.\n\n Own Id: OTP-13918","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.0.2 - SSL Release Notes","ref":"notes.html#ssl-8-0-2"},{"type":"extras","doc":"- Correctly formed handshake messages received out of order will now correctly\n fail the connection with unexpected message.\n\n Own Id: OTP-13853\n\n- Correct handling of signature algorithm selection\n\n Own Id: OTP-13711","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- ssl application now behaves gracefully also on partially incorrect input from\n peer.\n\n Own Id: OTP-13834\n\n- Add application environment configuration bypass_pem_cache. This can be used\n as a workaround for the current implementation of the PEM-cache that has\n proven to be a bottleneck.\n\n Own Id: OTP-13883","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.0.1 - SSL Release Notes","ref":"notes.html#ssl-8-0-1"},{"type":"extras","doc":"- The TLS/SSL protocol version selection for the SSL server has been corrected\n to follow RFC 5246 Appendix E.1 especially in case where the list of supported\n versions has gaps. Now the server selects the highest protocol version it\n supports that is not higher than what the client supports.\n\n Own Id: OTP-13753 Aux Id: seq13150","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.0 - SSL Release Notes","ref":"notes.html#ssl-8-0"},{"type":"extras","doc":"- Server now rejects, a not requested client cert, as an incorrect handshake\n message and ends the connection.\n\n Own Id: OTP-13651","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Remove default support for DES cipher suites\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13195\n\n- Deprecate the function `crypto:rand_bytes` and make sure that\n `crypto:strong_rand_bytes` is used in all places that are cryptographically\n significant.\n\n Own Id: OTP-13214\n\n- Better error handling of user error during TLS upgrade. ERL-69 is solved by\n gen_statem rewrite of ssl application.\n\n Own Id: OTP-13255\n\n- Provide user friendly error message when crypto rejects a key\n\n Own Id: OTP-13256\n\n- Add ssl:getstat/1 and ssl:getstat/2\n\n Own Id: OTP-13415\n\n- TLS distribution connections now allow specifying the options `verify_fun`,\n `crl_check` and `crl_cache`. See the documentation. GitHub pull req #956\n contributed by Magnus Henoch.\n\n Own Id: OTP-13429 Aux Id: Pull#956\n\n- Remove confusing error message when closing a distributed erlang node running\n over TLS\n\n Own Id: OTP-13431\n\n- Remove default support for use of md5 in TLS 1.2 signature algorithms\n\n Own Id: OTP-13463\n\n- ssl now uses gen_statem instead of gen_fsm to implement the ssl connection\n process, this solves some timing issues in addition to making the code more\n intuitive as the behaviour can be used cleanly instead of having a lot of\n workaround for shortcomings of the behaviour.\n\n Own Id: OTP-13464\n\n- Phase out interoperability with clients that offer SSLv2. By default they are\n no longer supported, but an option to provide interoperability is offered.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13465\n\n- OpenSSL has functions to generate short (eight hex digits) hashes of issuers\n of certificates and CRLs. These hashes are used by the \"c_rehash\" script to\n populate directories of CA certificates and CRLs, e.g. in the Apache web\n server. Add functionality to let an Erlang program find the right CRL for a\n given certificate in such a directory.\n\n Own Id: OTP-13530\n\n- Some legacy TLS 1.0 software does not tolerate the 1/n-1 content split BEAST\n mitigation technique. Add a beast_mitigation SSL option (defaulting to\n one_n_minus_one) to select or disable the BEAST mitigation technique.\n\n Own Id: OTP-13629\n\n- Enhance error log messages to facilitate for users to understand the error\n\n Own Id: OTP-13632\n\n- Increased default DH params to 2048-bit\n\n Own Id: OTP-13636\n\n- Propagate CRL unknown CA error so that public_key validation process continues\n correctly and determines what should happen.\n\n Own Id: OTP-13656\n\n- Introduce a flight concept for handshake packages. This is a preparation for\n enabling DTLS, however it can also have a positive effects for TLS on slow and\n unreliable networks.\n\n Own Id: OTP-13678","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3.3.2 - SSL Release Notes","ref":"notes.html#ssl-7-3-3-2"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.3 - SSL Release Notes","ref":"notes.html#ssl-7-3-3"},{"type":"extras","doc":"- Correct ssl:prf/5 to use the negotiated cipher suite's prf function in\n ssl:prf/5 instead of the default prf.\n\n Own Id: OTP-13546\n\n- Timeouts may have the value 0, guards have been corrected to allow this\n\n Own Id: OTP-13635\n\n- Change of internal handling of hash sign pairs as the used one enforced to\n much restrictions making some valid combinations unavailable.\n\n Own Id: OTP-13670","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.3.0.1 - SSL Release Notes","ref":"notes.html#ssl-7-3-3-0-1"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Create a little randomness in sending of session invalidation messages, to\n mitigate load when whole table is invalidated.\n\n Own Id: OTP-13490","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3.2 - SSL Release Notes","ref":"notes.html#ssl-7-3-2"},{"type":"extras","doc":"- Correct cipher suites conversion and guard expression. Caused problems with\n GCM cipher suites and client side option to set signature_algorithms extension\n values.\n\n Own Id: OTP-13525","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.1 - SSL Release Notes","ref":"notes.html#ssl-7-3-1"},{"type":"extras","doc":"- Corrections to cipher suite handling using the 3 and 4 tuple format in\n addition to commit 89d7e21cf4ae988c57c8ef047bfe85127875c70c\n\n Own Id: OTP-13511","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make values for the TLS-1.2 signature_algorithms extension configurable\n\n Own Id: OTP-13261","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3 - SSL Release Notes","ref":"notes.html#ssl-7-3"},{"type":"extras","doc":"- Make sure there is only one poller validator at a time for validating the\n session cache.\n\n Own Id: OTP-13185\n\n- A timing related issue could cause ssl to hang, especially happened with newer\n versions of OpenSSL in combination with ECC ciphers.\n\n Own Id: OTP-13253\n\n- Work around a race condition in the TLS distribution start.\n\n Own Id: OTP-13268\n\n- Big handshake messages are now correctly fragmented in the TLS record layer.\n\n Own Id: OTP-13306\n\n- Improve portability of ECC tests in Crypto and SSL for \"exotic\" OpenSSL\n versions.\n\n Own Id: OTP-13311\n\n- Certificate extensions marked as critical are ignored when using verify_none\n\n Own Id: OTP-13377\n\n- If a certificate doesn't contain a CRL Distribution Points extension, and the\n relevant CRL is not in the cache, and the `crl_check` option is not set to\n `best_effort` , the revocation check should fail.\n\n Own Id: OTP-13378\n\n- Enable TLS distribution over IPv6\n\n Own Id: OTP-13391","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improve error reporting for TLS distribution\n\n Own Id: OTP-13219\n\n- Include options from connect, listen and accept in\n `connection_information/1,2`\n\n Own Id: OTP-13232\n\n- Allow adding extra options for outgoing TLS distribution connections, as\n supported for plain TCP connections.\n\n Own Id: OTP-13285\n\n- Use loopback as server option in TLS-distribution module\n\n Own Id: OTP-13300\n\n- Verify certificate signature against original certificate binary.\n\n This avoids bugs due to encoding errors when re-encoding a decode certificate.\n As there exists several decode step and using of different ASN.1 specification\n this is a risk worth avoiding.\n\n Own Id: OTP-13334\n\n- Use `application:ensure_all_started/2` instead of hard-coding dependencies\n\n Own Id: OTP-13363","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.2 - SSL Release Notes","ref":"notes.html#ssl-7-2"},{"type":"extras","doc":"- Honor distribution port range options\n\n Own Id: OTP-12838\n\n- Correct supervisor specification in TLS distribution.\n\n Own Id: OTP-13134\n\n- Correct cache timeout\n\n Own Id: OTP-13141\n\n- Avoid crash and restart of ssl process when key file does not exist.\n\n Own Id: OTP-13144\n\n- Enable passing of raw socket options on the format \\{raw,_,_,\\_\\} to the\n underlying socket.\n\n Own Id: OTP-13166\n\n- Hibernation with small or a zero timeout will now work as expected\n\n Own Id: OTP-13189","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add upper limit for session cache, configurable on ssl application level.\n\n If upper limit is reached, invalidate the current cache entries, e.i the\n session lifetime is the max time a session will be kept, but it may be\n invalidated earlier if the max limit for the table is reached. This will keep\n the ssl manager process well behaved, not exhusting memory. Invalidating the\n entries will incrementally empty the cache to make room for fresh sessions\n entries.\n\n Own Id: OTP-12392\n\n- Use new time functions to measure passed time.\n\n Own Id: OTP-12457\n\n- Improved error handling in TLS distribution\n\n Own Id: OTP-13142\n\n- Distribution over TLS now honors the nodelay distribution flag\n\n Own Id: OTP-13143","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.1 - SSL Release Notes","ref":"notes.html#ssl-7-1"},{"type":"extras","doc":"- Add DER encoded ECPrivateKey as valid input format for key option.\n\n Own Id: OTP-12974\n\n- Correct return value of default session callback module\n\n This error had the symptom that the client check for unique session would\n always fail, potentially making the client session table grow a lot and\n causing long setup times.\n\n Own Id: OTP-12980","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add possibility to downgrade an SSL/TLS connection to a tcp connection, and\n give back the socket control to a user process.\n\n This also adds the possibility to specify a timeout to the ssl:close function.\n\n Own Id: OTP-11397\n\n- Add application setting to be able to change fatal alert shutdown timeout,\n also shorten the default timeout. The fatal alert timeout is the number of\n milliseconds between sending of a fatal alert and closing the connection.\n Waiting a little while improves the peers chances to properly receiving the\n alert so it may shutdown gracefully.\n\n Own Id: OTP-12832","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.0 - SSL Release Notes","ref":"notes.html#ssl-7-0"},{"type":"extras","doc":"- Ignore signature_algorithm (TLS 1.2 extension) sent to TLS 1.0 or TLS 1.1\n server\n\n Own Id: OTP-12670\n\n- Improve error handling in TLS distribution module to avoid lingering sockets.\n\n Own Id: OTP-12799 Aux Id: Tom Briden\n\n- Add option \\{client_renegotiation, boolean()\\} option to the server-side of\n the SSL application.\n\n Own Id: OTP-12815","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add new API functions to handle CRL-verification\n\n Own Id: OTP-10362 Aux Id: kunagi-215 \\[126]\n\n- Remove default support for SSL-3.0, due to Poodle vunrability in protocol\n specification.\n\n Add padding check for TLS-1.0 to remove Poodle vunrability from TLS 1.0, also\n add the option padding_check. This option only affects TLS-1.0 connections and\n if set to false it disables the block cipher padding check to be able to\n interoperate with legacy software.\n\n Remove default support for RC4 cipher suites, as they are consider too weak.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12390\n\n- Add support for TLS ALPN (Application-Layer Protocol Negotiation) extension.\n\n Own Id: OTP-12580\n\n- Add SNI (Server Name Indication) support for the server side.\n\n Own Id: OTP-12736","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 6.0.1.1 - SSL Release Notes","ref":"notes.html#ssl-6-0-1-1"},{"type":"extras","doc":"- Gracefully ignore proprietary hash_sign algorithms\n\n Own Id: OTP-12829","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 6.0.1 - SSL Release Notes","ref":"notes.html#ssl-6-0-1"},{"type":"extras","doc":"- Terminate gracefully when receiving bad input to premaster secret calculation\n\n Own Id: OTP-12783","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 6.0 - SSL Release Notes","ref":"notes.html#ssl-6-0"},{"type":"extras","doc":"- Exclude self-signed trusted anchor certificates from certificate prospective\n certification path according to RFC 3280.\n\n This will avoid some unnecessary certificate processing.\n\n Own Id: OTP-12449","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Separate client and server session cache internally.\n\n Avoid session table growth when client starts many connections in such a\n manner that many connections are started before session reuse is possible.\n Only save a new session in client if there is no equivalent session already\n stored.\n\n Own Id: OTP-11365\n\n- The PEM cache is now validated by a background process, instead of always\n keeping it if it is small enough and clearing it otherwise. That strategy\n required that small caches where cleared by API function if a file changes on\n disk.\n\n However export the API function to clear the cache as it may still be useful.\n\n Own Id: OTP-12391\n\n- Add padding check for TLS-1.0 to remove Poodle vulnerability from TLS 1.0,\n also add the option padding_check. This option only affects TLS-1.0\n connections and if set to false it disables the block cipher padding check to\n be able to interoperate with legacy software.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12420\n\n- Add support for TLS_FALLBACK_SCSV used to prevent undesired TLS version\n downgrades. If used by a client that is vulnerable to the POODLE attack, and\n the server also supports TLS_FALLBACK_SCSV, the attack can be prevented.\n\n Own Id: OTP-12458","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.8 - SSL Release Notes","ref":"notes.html#ssl-5-3-8"},{"type":"extras","doc":"- Make sure the clean rule for ssh, ssl, eunit and otp_mibs actually removes\n generated files.\n\n Own Id: OTP-12200","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Change code to reflect that state data may be secret to avoid breaking\n dialyzer contracts.\n\n Own Id: OTP-12341","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.7 - SSL Release Notes","ref":"notes.html#ssl-5-3-7"},{"type":"extras","doc":"- Handle the fact that servers may send an empty SNI extension to the client.\n\n Own Id: OTP-12198","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.3.6 - SSL Release Notes","ref":"notes.html#ssl-5-3-6"},{"type":"extras","doc":"- Corrected handling of ECC certificates, there where several small issues with\n the handling of such certificates in the ssl and public_key application. Now\n ECC signed ECC certificates shall work and not only RSA signed ECC\n certificates.\n\n Own Id: OTP-12026\n\n- Check that the certificate chain ends with a trusted ROOT CA e.i. a\n self-signed certificate, but provide an option partial_chain to enable the\n application to define an intermediat CA as trusted.\n\n Own Id: OTP-12149","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add decode functions for SNI (Server Name Indication)\n\n Own Id: OTP-12048","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.5 - SSL Release Notes","ref":"notes.html#ssl-5-3-5"},{"type":"extras","doc":"- ssl:recv now returns \\{error, einval\\} if applied to a non passive socket, the\n same as gen_tcp:recv.\n\n Thanks to Danil Zagoskin for reporting this issue\n\n Own Id: OTP-11878\n\n- Corrected handling of default values for signature_algorithms extension in\n TLS-1.2 and corresponding values used in previous versions that does not\n support this extension.\n\n Thanks to Danil Zagoskin\n\n Own Id: OTP-11886\n\n- Handle socket option inheritance when pooling of accept sockets is used\n\n Own Id: OTP-11897\n\n- Make sure that the list of versions, possibly supplied in the versions option,\n is not order dependent.\n\n Thanks to Ransom Richardson for reporting this issue\n\n Own Id: OTP-11912\n\n- Reject connection if the next_protocol message is sent twice.\n\n Own Id: OTP-11926\n\n- Correct options handling when ssl:ssl_accept/3 is called with new ssl options\n after calling ssl:listen/2\n\n Own Id: OTP-11950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Gracefully handle unknown alerts\n\n Thanks to Atul Atri for reporting this issue\n\n Own Id: OTP-11874\n\n- Gracefully ignore cipher suites sent by client not supported by the SSL/TLS\n version that the client has negotiated.\n\n Thanks to Danil Zagoskin for reporting this issue\n\n Own Id: OTP-11875\n\n- Gracefully handle structured garbage, i.e a client sends some garbage in a ssl\n record instead of a valid fragment.\n\n Thanks to Danil Zagoskin\n\n Own Id: OTP-11880\n\n- Gracefully handle invalid alerts\n\n Own Id: OTP-11890\n\n- Generalize handling of default ciphers\n\n Thanks to Andreas Schultz\n\n Own Id: OTP-11966\n\n- Make sure change cipher spec is correctly handled\n\n Own Id: OTP-11975","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.4 - SSL Release Notes","ref":"notes.html#ssl-5-3-4"},{"type":"extras","doc":"- Fix incorrect dialyzer spec and types, also enhance documentation.\n\n Thanks to Ayaz Tuncer.\n\n Own Id: OTP-11627\n\n- Fix possible mismatch between SSL/TLS version and default ciphers. Could\n happen when you specified SSL/TLS-version in optionlist to listen or accept.\n\n Own Id: OTP-11712\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Moved elliptic curve definition from the crypto NIF/OpenSSL into Erlang code,\n adds the RFC-5639 brainpool curves and makes TLS use them (RFC-7027).\n\n Thanks to Andreas Schultz\n\n Own Id: OTP-11578\n\n- Unicode adaptations\n\n Own Id: OTP-11620\n\n- Added option honor_cipher_order. This instructs the server to prefer its own\n cipher ordering rather than the client's and can help protect against things\n like BEAST while maintaining compatibility with clients which only support\n older ciphers.\n\n Thanks to Andrew Thompson for the implementation, and Andreas Schultz for the\n test cases.\n\n Own Id: OTP-11621\n\n- Replace boolean checking in validate_option with is_boolean guard.\n\n Thanks to Andreas Schultz.\n\n Own Id: OTP-11634\n\n- Some function specs are corrected or moved and some edoc comments are\n corrected in order to allow use of edoc. (Thanks to Pierre Fenoll)\n\n Own Id: OTP-11702\n\n- Correct clean up of certificate database when certs are inputted in pure DER\n format.The incorrect code could cause a memory leek when certs where inputted\n in DER. Thanks to Bernard Duggan for reporting this.\n\n Own Id: OTP-11733\n\n- Improved documentation of the cacertfile option\n\n Own Id: OTP-11759 Aux Id: seq12535\n\n- Avoid next protocol negotiation failure due to incorrect option format.\n\n Own Id: OTP-11760\n\n- Handle v1 CRLs, with no extensions and fixes issues with IDP (Issuing\n Distribution Point) comparison during CRL validation.\n\n Thanks to Andrew Thompson\n\n Own Id: OTP-11761\n\n- Server now ignores client ECC curves that it does not support instead of\n crashing.\n\n Thanks to Danil Zagoskin for reporting the issue and suggesting a solution.\n\n Own Id: OTP-11780\n\n- Handle SNI (Server Name Indication) alert unrecognized_name and gracefully\n deal with unexpected alerts.\n\n Thanks to Masatake Daimon for reporting this.\n\n Own Id: OTP-11815\n\n- Add possibility to specify ssl options when calling ssl:ssl_accept\n\n Own Id: OTP-11837","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.3 - SSL Release Notes","ref":"notes.html#ssl-5-3-3"},{"type":"extras","doc":"- Add missing validation of the server_name_indication option and test for its\n explicit use. It was not possible to set or disable the default\n server_name_indication as the validation of the option was missing.\n\n Own Id: OTP-11567\n\n- Elliptic curve selection in server mode now properly selects a curve suggested\n by the client, if possible, and the fallback alternative is changed to a more\n widely supported curve.\n\n Own Id: OTP-11575\n\n- Bug in the TLS hello extension handling caused the server to behave as it did\n not understand secure renegotiation.\n\n Own Id: OTP-11595","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.3.2 - SSL Release Notes","ref":"notes.html#ssl-5-3-2"},{"type":"extras","doc":"- Honors the clients advertised support of elliptic curves and no longer sends\n incorrect elliptic curve extension in server hello.\n\n Own Id: OTP-11370\n\n- Fix initialization of DTLS fragment reassembler, in previously contributed\n code, for future support of DTLS . Thanks to Andreas Schultz.\n\n Own Id: OTP-11376\n\n- Corrected type error in client_preferred_next_protocols documentation. Thanks\n to Julien Barbot.\n\n Own Id: OTP-11457","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS code has been refactored to prepare for future DTLS support. Also some\n DTLS code is in place but not yet runnable, some of it contributed by Andreas\n Schultz and some of it written by the OTP team. Thanks to to Andreas for his\n participation.\n\n Own Id: OTP-11292\n\n- Remove extraneous dev debug code left in the close function. Thanks to Ken\n Key.\n\n Own Id: OTP-11447\n\n- Add SSL Server Name Indication (SNI) client support. Thanks to Julien Barbot.\n\n Own Id: OTP-11460","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.1 - SSL Release Notes","ref":"notes.html#ssl-5-3-1"},{"type":"extras","doc":"- Setopts during renegotiation caused the renegotiation to be unsuccessful.\n\n If calling setopts during a renegotiation the FSM state might change during\n the handling of the setopts messages, this is now handled correctly.\n\n Own Id: OTP-11228\n\n- Now handles signature_algorithm field in digitally_signed properly with proper\n defaults. Prior to this change some elliptic curve cipher suites could fail\n reporting the error \"bad certificate\".\n\n Own Id: OTP-11229\n\n- The code emulating the inet header option was changed in the belief that it\n made it inet compatible. However the testing is a bit hairy as the inet option\n is actually broken, now the tests are corrected and the header option should\n work in the same broken way as inet again, preferably use the bitsyntax\n instead.\n\n Own Id: OTP-11230","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make the ssl manager name for erlang distribution over SSL/TLS relative to the\n module name of the ssl_manager.\n\n This can be beneficial when making tools that rename modules for internal\n processing in the tool.\n\n Own Id: OTP-11255\n\n- Add documentation regarding log_alert option.\n\n Own Id: OTP-11271","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3 - SSL Release Notes","ref":"notes.html#ssl-5-3"},{"type":"extras","doc":"- Honor the versions option to ssl:connect and ssl:listen.\n\n Own Id: OTP-10905\n\n- Next protocol negotiation with reused sessions will now succeed\n\n Own Id: OTP-10909","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for PSK (Pre Shared Key) and SRP (Secure Remote Password) cipher\n suites, thanks to Andreas Schultz.\n\n Own Id: OTP-10450 Aux Id: kunagi-269 \\[180]\n\n- Fix SSL Next Protocol Negotiation documentation. Thanks to Julien Barbot.\n\n Own Id: OTP-10955\n\n- Fix ssl_connection to support reading proxy/chain certificates. Thanks to\n Valentin Kuznetsov.\n\n Own Id: OTP-10980\n\n- Integrate elliptic curve contribution from Andreas Schultz\n\n In order to be able to support elliptic curve cipher suites in SSL/TLS,\n additions to handle elliptic curve infrastructure has been added to public_key\n and crypto.\n\n This also has resulted in a rewrite of the crypto API to gain consistency and\n remove unnecessary overhead. All OTP applications using crypto has been\n updated to use the new API.\n\n Impact: Elliptic curve cryptography (ECC) offers equivalent security with\n smaller key sizes than other public key algorithms. Smaller key sizes result\n in savings for power, memory, bandwidth, and computational cost that make ECC\n especially attractive for constrained environments.\n\n Own Id: OTP-11009","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.2.1 - SSL Release Notes","ref":"notes.html#ssl-5-2-1"},{"type":"extras","doc":"- Transport callback handling is changed so that gen_tcp is treated as a special\n case where inet will be called directly for functions such as setopts, as\n gen_tcp does not have its own setopts. This will enable users to use the\n transport callback for other customizations such as websockets.\n\n Own Id: OTP-10847\n\n- Follow up to OTP-10451 solved in ssl-5.2 R16A. Make sure format_error return\n good strings. Replace confusing legacy atoms with more descriptive atoms.\n\n Own Id: OTP-10864","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1.2.1 - SSL Release Notes","ref":"notes.html#ssl-5-1-2-1"},{"type":"extras","doc":"- Make log_alert configurable as option in ssl, SSLLogLevel added as option to\n inets conf file\n\n Own Id: OTP-11259","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.2 - SSL Release Notes","ref":"notes.html#ssl-5-2"},{"type":"extras","doc":"- SSL: TLS 1.2, advertise sha224 support, thanks to Andreas Schultz.\n\n Own Id: OTP-10586\n\n- If an ssl server is restarted with new options and a client tries to reuse a\n session the server must make sure that it complies to the new options before\n agreeing to reuse it.\n\n Own Id: OTP-10595\n\n- Now handles cleaning of CA-certificate database correctly so that there will\n be no memory leek, bug was introduced in ssl- 5.1 when changing implementation\n to increase parallel execution.\n\n Impact: Improved memory usage, especially if you have many different\n certificates and upgrade tcp-connections to TLS-connections.\n\n Own Id: OTP-10710","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support Next Protocol Negotiation in TLS, thanks to Ben Murphy for the\n contribution.\n\n Impact: Could give performance benefit if used as it saves a round trip.\n\n Own Id: OTP-10361 Aux Id: kunagi-214 \\[125]\n\n- TLS 1.2 will now be the default TLS version if sufficient crypto support is\n available otherwise TLS 1.1 will be default.\n\n Impact: A default TLS connection will have higher security and hence it may be\n perceived as slower then before.\n\n Own Id: OTP-10425 Aux Id: kunagi-275 \\[186]\n\n- It is now possible to call controlling_process on a listen socket, same as in\n gen_tcp.\n\n Own Id: OTP-10447\n\n- Remove filter mechanisms that made error messages backwards compatible with\n old ssl but hid information about what actually happened.\n\n This does not break the documented API however other reason terms may be\n returned, so code that matches on the reason part of \\{error, Reason\\} may\n fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10451 Aux Id: kunagi-270 \\[181]\n\n- Added missing dependencies to Makefile\n\n Own Id: OTP-10594\n\n- Removed deprecated function ssl:pid/0, it has been pointless since R14 but has\n been keep for backwards compatibility.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10613 Aux Id: kunagi-331 \\[242]\n\n- Refactor to simplify addition of key exchange methods, thanks to Andreas\n Schultz.\n\n Own Id: OTP-10709","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1.2 - SSL Release Notes","ref":"notes.html#ssl-5-1-2"},{"type":"extras","doc":"- ssl:ssl_accept/2 timeout is no longer ignored\n\n Own Id: OTP-10600","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.1.1 - SSL Release Notes","ref":"notes.html#ssl-5-1-1"},{"type":"extras","doc":"- ssl:recv/3 could \"loose\" data when the timeout occurs. If the timeout in\n ssl:connect or ssl:ssl_accept expired the ssl connection process was not\n terminated as it should, this due to gen_fsm:send_all_state_event timeout is a\n client side time out. These timouts are now handled by the gen_fsm-procss\n instead.\n\n Own Id: OTP-10569","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Better termination handling that avoids hanging.\n\n Own Id: OTP-10574","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1 - SSL Release Notes","ref":"notes.html#ssl-5-1"},{"type":"extras","doc":"- Sometimes the client process could receive an extra \\{error, closed\\} message\n after ssl:recv had returned \\{error, closed\\}.\n\n Own Id: OTP-10118\n\n- ssl v3 alert number 41 (no_certificate_RESERVED) is now recognized\n\n Own Id: OTP-10196","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Experimental support for TLS 1.1 is now available, will be officially\n supported from OTP-R16. Thanks to Andreas Schultz for implementing the first\n version.\n\n Own Id: OTP-8871\n\n- Experimental support for TLS 1.2 is now available, will be officially\n supported from OTP-R16. Thanks to Andreas Schultz for implementing the first\n version.\n\n Own Id: OTP-8872\n\n- Removed some bottlenecks increasing the applications parallelism especially\n for the client side.\n\n Own Id: OTP-10113\n\n- Workaround for handling certificates that wrongly encode X509countryname in\n utf-8 when the actual value is a valid ASCCI value of length 2. Such\n certificates are accepted by many browsers such as Chrome and Fierfox so for\n interoperability reasons we will too.\n\n Own Id: OTP-10222","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.0.1 - SSL Release Notes","ref":"notes.html#ssl-5-0-1"},{"type":"extras","doc":"- Robustness and improvement to distribution over SSL\n\n Fix a bug where ssl_tls_dist_proxy would crash at caller timeout. Fix a bug\n where a timeout from the SSL layer would block the distribution indefinitely.\n Run the proxy exclusively on the loopback interface. (Thanks to Paul Guyot)\n\n Own Id: OTP-9915\n\n- Fix setup loop of SSL TLS dist proxy\n\n Fix potential leak of processes waiting indefinitely for data from closed\n sockets during socket setup phase. (Thanks to Paul Guyot)\n\n Own Id: OTP-9916\n\n- Correct spelling of registered (Thanks to Richard Carlsson)\n\n Own Id: OTP-9925\n\n- Added TLS PRF function to the SSL API for generation of additional key\n material from a TLS session. (Thanks to Andreas Schultz)\n\n Own Id: OTP-10024","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.0 - SSL Release Notes","ref":"notes.html#ssl-5-0"},{"type":"extras","doc":"- Invalidation handling of sessions could cause the time_stamp field in the\n session record to be set to undefined crashing the session clean up process.\n This did not affect the connections but would result in that the session table\n would grow.\n\n Own Id: OTP-9696 Aux Id: seq11947\n\n- Changed code to use ets:foldl and throw instead of ets:next traversal,\n avoiding the need to explicitly call ets:safe_fixtable. It was possible to get\n a badarg-crash under special circumstances.\n\n Own Id: OTP-9703 Aux Id: seq11947\n\n- Send ssl_closed notification to active ssl user when a tcp error occurs.\n\n Own Id: OTP-9734 Aux Id: seq11946\n\n- If a passive receive was ongoing during a renegotiation the process evaluating\n ssl:recv could be left hanging for ever.\n\n Own Id: OTP-9744","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support for the old ssl implementation is dropped and the code is removed.\n\n Own Id: OTP-7048\n\n- The erlang distribution can now be run over the new ssl implementation. All\n options can currently not be set but it is enough to replace to old ssl\n implementation.\n\n Own Id: OTP-7053\n\n- public_key, ssl and crypto now supports PKCS-8\n\n Own Id: OTP-9312\n\n- Implements a CBC timing attack counter measure. Thanks to Andreas Schultz for\n providing the patch.\n\n Own Id: OTP-9683\n\n- Mitigates an SSL/TLS Computational DoS attack by disallowing the client to\n renegotiate many times in a row in a short time interval, thanks to Tuncer\n Ayaz for alerting us about this.\n\n Own Id: OTP-9739\n\n- Implements the 1/n-1 splitting countermeasure to the Rizzo Duong BEAST attack,\n affects SSL 3.0 and TLS 1.0. Thanks to Tuncer Ayaz for alerting us about this.\n\n Own Id: OTP-9750","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.6 - SSL Release Notes","ref":"notes.html#ssl-4-1-6"},{"type":"extras","doc":"- replace \"a ssl\" with \"an ssl\" reindent pkix_path_validation/3 Trivial\n documentation fixes (Thanks to Christian von Roques )\n\n Own Id: OTP-9464","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Adds function clause to avoid denial of service attack. Thanks to Vinod for\n reporting this vulnerability.\n\n Own Id: OTP-9364\n\n- Error handling code now takes care of inet:getopts/2 and inets:setopts/2\n crashes. Thanks to Richard Jones for reporting this.\n\n Own Id: OTP-9382\n\n- Support explicit use of packet option httph and httph_bin\n\n Own Id: OTP-9461\n\n- Decoding of hello extensions could fail to come to the correct conclusion due\n to an error in a binary match pattern. Thanks to Ben Murphy.\n\n Own Id: OTP-9589","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.5 - SSL Release Notes","ref":"notes.html#ssl-4-1-5"},{"type":"extras","doc":"- Calling gen_tcp:connect with option \\{ip, \\{127,0,0,1\\}\\} results in an exit\n with reason badarg. Neither SSL nor INETS This was not caught, resulting in\n crashes with incomprehensible reasons.\n\n Own Id: OTP-9289 Aux Id: seq11845","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.3 - SSL Release Notes","ref":"notes.html#ssl-4-1-3"},{"type":"extras","doc":"- Fixed error in cache-handling fix from ssl-4.1.2\n\n Own Id: OTP-9018 Aux Id: seq11739\n\n- Verification of a critical extended_key_usage-extension corrected\n\n Own Id: OTP-9029 Aux Id: seq11541","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 4.1.2 - SSL Release Notes","ref":"notes.html#ssl-4-1-2"},{"type":"extras","doc":"- The ssl application caches certificate files, it will now invalidate cache\n entries if the diskfile is changed.\n\n Own Id: OTP-8965 Aux Id: seq11739\n\n- Now runs the terminate function before returning from the call made by\n ssl:close/1, as before the caller of ssl:close/1 could get problems with the\n reuseaddr option.\n\n Own Id: OTP-8992","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 4.1.1 - SSL Release Notes","ref":"notes.html#ssl-4-1-1"},{"type":"extras","doc":"- Correct handling of client certificate verify message When checking the client\n certificate verify message the server used the wrong algorithm identifier to\n determine the signing algorithm, causing a function clause error in the\n public_key application when the key-exchange algorithm and the public key\n algorithm of the client certificate happen to differ.\n\n Own Id: OTP-8897","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- For testing purposes ssl now also support some anonymous cipher suites when\n explicitly configured to do so.\n\n Own Id: OTP-8870\n\n- Sends an error alert instead of crashing if a crypto function for the selected\n cipher suite fails.\n\n Own Id: OTP-8930 Aux Id: seq11720","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1 - SSL Release Notes","ref":"notes.html#ssl-4-1"},{"type":"extras","doc":"- Updated ssl to ignore CA certs that violate the asn1-spec for a certificate,\n and updated public key asn1 spec to handle inherited DSS-params.\n\n Own Id: OTP-7884\n\n- Changed ssl implementation to retain backwards compatibility for old option\n \\{verify, 0\\} that shall be equivalent to \\{verify, verify_none\\}, also\n separate the cases unknown ca and selfsigned peer cert, and restored return\n value of deprecated function public_key:pem_to_der/1.\n\n Own Id: OTP-8858\n\n- Changed the verify fun so that it differentiate between the peer certificate\n and CA certificates by using valid_peer or valid as the second argument to the\n verify fun. It may not always be trivial or even possible to know when the\n peer certificate is reached otherwise.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8873","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.0.1 - SSL Release Notes","ref":"notes.html#ssl-4-0-1"},{"type":"extras","doc":"- The server now verifies the client certificate verify message correctly,\n instead of causing a case-clause.\n\n Own Id: OTP-8721\n\n- The client hello message now always include ALL available cipher suites (or\n those specified by the ciphers option). Previous implementation would filter\n them based on the client certificate key usage extension (such filtering only\n makes sense for the server certificate).\n\n Own Id: OTP-8772\n\n- Fixed handling of the option \\{mode, list\\} that was broken for some packet\n types for instance line.\n\n Own Id: OTP-8785\n\n- Empty packets were not delivered to the client.\n\n Own Id: OTP-8790\n\n- Building in a source tree without prebuilt platform independent build results\n failed on the SSL examples when:\n\n - cross building. This has been solved by not building the SSL examples during\n a cross build.\n - building on Windows.\n\n Own Id: OTP-8791\n\n- Fixed a handshake error which occurred on some ssl implementations.\n\n Own Id: OTP-8793","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Revise the public_key API - Cleaned up and documented the public_key API to\n make it useful for general use, also changed ssl to use the new API.\n\n Own Id: OTP-8722\n\n- Added support for inputing certificates and keys directly in DER format these\n options will override the pem-file options if specified.\n\n Own Id: OTP-8723\n\n- To gain interoperability ssl will not check for padding errors when using TLS\n 1.0. It is first in TLS 1.1 that checking the padding is an requirement.\n\n Own Id: OTP-8740\n\n- Changed the semantics of the verify_fun option in the ssl-application so that\n it takes care of both application handling of path validation errors and\n verification of application specific extensions. This means that it is now\n possible for the server application in verify_peer mode to handle path\n validation errors. This change moved some functionality earlier in ssl to the\n public_key application.\n\n Own Id: OTP-8770\n\n- Added the functionality so that the verification fun will be called when a\n certificate is considered valid by the path validation to allow access to each\n certificate in the path to the user application. Also try to verify\n subject-AltName, if unable to verify it let the application verify it.\n\n Own Id: OTP-8825","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.0 - SSL Release Notes","ref":"notes.html#ssl-4-0"},{"type":"extras","doc":"- New ssl now support client/server-certificates signed by dsa keys.\n\n Own Id: OTP-8587\n\n- Ssl has now switched default implementation and removed deprecated certificate\n handling. All certificate handling is done by the public_key application.\n\n Own Id: OTP-8695","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"\n\n# TLS/DTLS Protocol Overview","title":"TLS/DTLS Protocol Overview","ref":"ssl_protocol.html"},{"type":"extras","doc":"Transport Layer Security (TLS) and its predecessor, the Secure Sockets Layer\n(SSL), are cryptographic protocols designed to provide communications security\nover a computer network. The protocols use X.509 certificates and hence public\nkey (asymmetric) cryptography to authenticate the counterpart with whom they\ncommunicate, and to exchange a symmetric key for payload encryption. The\nprotocol provides data/message confidentiality (encryption), integrity (through\nmessage authentication code checks) and host verification (through certificate\npath validation). DTLS (Datagram Transport Layer Security) that is based on TLS\nbut datagram oriented instead of stream oriented.\n\n# Erlang Support\n\nThe Erlang SSL application implements the TLS/DTLS protocol for the currently\nsupported versions, see the `m:ssl` manual page.\n\nBy default TLS is run over the TCP/IP protocol even though you can plug in any\nother reliable transport protocol with the same Application Programming\nInterface (API) as the `gen_tcp` module in Kernel. DTLS is by default run over\nUDP/IP, which means that application data has no delivery guarantees. Other\ntransports, such as SCTP, may be supported in future releases.\n\nIf a client and a server wants to use an upgrade mechanism, such as defined by\nRFC 2817, to upgrade a regular TCP/IP connection to a TLS connection, this is\nsupported by the Erlang SSL application API. This can be useful for, for\nexample, supporting HTTP and HTTPS on the same port and implementing virtual\nhosting. Note this is a TLS feature only.","title":"Purpose - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#purpose"},{"type":"extras","doc":"To achieve authentication and privacy, the client and server perform a TLS/DTLS\nhandshake procedure before transmitting or receiving any data. During the\nhandshake, they agree on a protocol version and cryptographic algorithms,\ngenerate shared secrets using public key cryptographies, and optionally\nauthenticate each other with digital certificates.","title":"Security Overview - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#security-overview"},{"type":"extras","doc":"A _symmetric key_ algorithm has one key only. The key is used for both\nencryption and decryption. These algorithms are fast, compared to public key\nalgorithms (using two keys, one public and one private) and are therefore\ntypically used for encrypting bulk data.\n\nThe keys for the symmetric encryption are generated uniquely for each connection\nand are based on a secret negotiated in the TLS/DTLS handshake.\n\nThe TLS/DTLS handshake protocol and data transfer is run on top of the TLS/DTLS\nRecord Protocol, which uses a keyed-hash Message Authenticity Code (MAC), or a\nHash-based MAC (HMAC), to protect the message data integrity. From the TLS RFC:\n\"A Message Authentication Code is a one-way hash computed from a message and\nsome secret data. It is difficult to forge without knowing the secret data. Its\npurpose is to detect if the message has been altered.\"","title":"Data Privacy and Integrity - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#data-privacy-and-integrity"},{"type":"extras","doc":"A certificate is similar to a driver's license, or a passport. The holder of the\ncertificate is called the _subject_. The certificate is signed with the private\nkey of the issuer of the certificate. A chain of trust is built by having the\nissuer in its turn being certified by another certificate, and so on, until you\nreach the so called root certificate, which is self-signed, that is, issued by\nitself.\n\nCertificates are issued by Certification Authorities (CAs) only. A handful of\ntop CAs in the world issue root certificates. You can examine several of these\ncertificates by clicking through the menus of your web browser.","title":"Digital Certificates - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#digital-certificates"},{"type":"extras","doc":"Authentication of the peer is done by public key path validation as defined in\nRFC 3280. This means basically the following:\n\n- Each certificate in the certificate chain is issued by the previous one.\n- The certificates attributes are valid.\n- The root certificate is a trusted certificate that is present in the trusted\n certificate database kept by the peer.\n\nThe server always sends a certificate chain as part of the TLS handshake, but\nthe client only sends one if requested by the server. If the client does not\nhave an appropriate certificate, it can send an \"empty\" certificate to the\nserver.\n\nThe client can choose to accept some path evaluation errors, for example, a web\nbrowser can ask the user whether to accept an unknown CA root certificate. The\nserver, if it requests a certificate, does however not accept any path\nvalidation errors. It is configurable if the server is to accept or reject an\n\"empty\" certificate as response to a certificate request.","title":"Peer Authentication - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#peer-authentication"},{"type":"extras","doc":"From the TLS RFC: \"A TLS session is an association between a client and a\nserver. Sessions are created by the handshake protocol. Sessions define a set of\ncryptographic security parameters, which can be shared among multiple\nconnections. Sessions are used to avoid the expensive negotiation of new\nsecurity parameters for each connection.\"\n\nSession data is by default kept by the SSL application in a memory storage,\nhence session data is lost at application restart or takeover. Users can define\ntheir own callback module to handle session data storage if persistent data\nstorage is required. Session data is also invalidated when session database\nexceeds its limit or 24 hours after being saved (RFC max lifetime\nrecommendation). The amount of time the session data is to be saved can be\nconfigured.\n\nBy default the TLS/DTLS clients try to reuse an available session and by default\nthe TLS/DTLS servers agree to reuse sessions when clients ask for it. See also\n[Session Reuse Prior to TLS-1.3](using_ssl.md#session-reuse-prior-to-tls-1-3)","title":"TLS Sessions - Prior to TLS-1.3 - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#tls-sessions-prior-to-tls-1-3"},{"type":"extras","doc":"In TLS 1.3 the session reuse is replaced by a new session tickets mechanism\nbased on the prior to shared key concept. This mechanism also obsoletes the session\ntickets from RFC5077, not implemented by this application. See also\n[Session Tickets and Session Resumption in TLS-1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3)","title":"TLS-1.3 session tickets - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#tls-1-3-session-tickets"},{"type":"extras","doc":"\n# Examples\n\nTo see relevant version information for ssl, call `ssl:versions/0` .\n\nTo see all supported cipher suites, call\n[`ssl:cipher_suites(all, 'tlsv1.3')` ](`ssl:cipher_suites/2`). The available\ncipher suites for a connection depend on the TLS version and prior to TLS-1.3 also on\nthe certificate. To see the default cipher suite list change `all` to `default`.\nNote that TLS 1.3 and previous versions do not have any cipher suites in common,\nfor listing cipher suites for a specific version use\n[`ssl:cipher_suites(exclusive, 'tlsv1.3')` ](`ssl:cipher_suites/2`). Specific\ncipher suites that you want your connection to use can also be specified.\nDefault is to use the strongest available.\n\n\n> #### Warning {: .warning }\n>Enabling cipher suites using RSA as a key exchange algorithm is\n>strongly discouraged (only available prior to TLS-1.3). For some\n>configurations software preventions may exist, and can make them usable if they work,\n>but relying on them to work is risky and there are many more reliable\n>cipher suites that can be used instead.\n\nThe following sections shows small examples of how to set up client/server\nconnections using the Erlang shell. The returned value of the `sslsocket` is\nabbreviated with `[...]` as it can be fairly large and is opaque to the user\nexcept for the purpose of pattern matching.\n\n> #### Note {: .info }\n>\n> Note that client certificate verification is optional for the server and needs\n> additional conguration on both sides to work. The Certificate and keys, in the\n> examples, are provided using the `t:ssl:cert_key_conf/0` supplied in the `certs_keys`\n> introduced in OTP 25.","title":"Examples","ref":"using_ssl.html"},{"type":"extras","doc":"```erlang\n 1 > ssl:start(), ssl:connect(\"google.com\", 443, [{verify, verify_peer},\n {cacerts, public_key:cacerts_get()}]).\n {ok,{sslsocket, [...]}}\n```","title":"Basic Client - Examples","ref":"using_ssl.html#basic-client"},{"type":"extras","doc":"_Step 1:_ Start the server side:\n\n```erlang\n1 server> ssl:start().\nok\n```\n\n_Step 2:_ with alternative certificates, in this example the EDDSA certificate\nwill be preferred if TLS-1.3 is negotiated and the RSA certificate will always\nbe used for TLS-1.2 as it does not support the EDDSA algorithm:\n\n```erlang\n2 server> {ok, ListenSocket} =\nssl:listen(9999, [{certs_keys, [#{certfile => \"eddsacert.pem\",\n keyfile => \"eddsakey.pem\"},\n #{certfile => \"rsacert.pem\",\n keyfile => \"rsakey.pem\",\n password => \"foobar\"}\n ]},{reuseaddr, true}]).\n{ok,{sslsocket, [...]}}\n```\n\n_Step 3:_ Do a transport accept on the TLS listen socket:\n\n```erlang\n3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).\n{ok,{sslsocket, [...]}}\n```\n\n> #### Note {: .info }\n>\n> ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the\n> handshake part can be called in a new erlang process dedicated to handling the\n> connection\n\n_Step 4:_ Start the client side:\n\n```erlang\n1 client> ssl:start().\nok\n```\n\nBe sure to configure trusted certificates to use for server certificate\nverification.\n\n```erlang\n2 client> {ok, Socket} = ssl:connect(\"localhost\", 9999,\n [{verify, verify_peer},\n {cacertfile, \"cacerts.pem\"}, {active, once}], infinity).\n{ok,{sslsocket, [...]}}\n```\n\n_Step 5:_ Do the TLS handshake:\n\n```erlang\n4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).\n{ok,{sslsocket, [...]}}\n```\n\n> #### Note {: .info }\n>\n> A real server should use ssl:handshake/2 that has a timeout to avoid DoS\n> attacks. In the example the timeout defaults to infinty.\n\n_Step 6:_ Send a message over TLS:\n\n```erlang\n5 server> ssl:send(Socket, \"foo\").\nok\n```\n\n_Step 7:_ Flush the shell message queue to see that the message sent on the\nserver side is recived by the client side:\n\n```erlang\n3 client> flush().\nShell got {ssl,{sslsocket,[...]},\"foo\"}\nok\n```","title":"Basic Connection - Examples","ref":"using_ssl.html#basic-connection"},{"type":"extras","doc":"Upgrading a a TCP/IP connection to a TLS connections is mostly used when there\nis a desire have unencrypted communication first and then later secure the\ncommunication channel by using TLS. Note that the client and server need to\nagree to do the upgrade in the protocol doing the communication. This is concept\nis often referenced as `STARTLS` and used in many protocols such as `SMTP`,\n`FTPS` and `HTTPS` via a proxy.\n\n> #### Warning {: .warning }\n>\n> Maximum security recommendations are however moving away from such solutions.\n\nTo upgrade to a TLS connection:\n\n_Step 1:_ Start the server side:\n\n```erlang\n1 server> ssl:start().\n ok\n```\n\n_Step 2:_ Create a normal TCP listen socket and ensure `active` is set to\n`false` and not set to any active mode otherwise TLS handshake messages can be\ndelivered to the wrong process.\n\n```erlang\n2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},\n {active, false}]).\n {ok, #Port<0.475>}\n```\n\n_Step 3:_ Accept client connection:\n\n```erlang\n3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).\n {ok, #Port<0.476>}\n```\n\n_Step 4:_ Start the client side:\n\n```erlang\n1 client> ssl:start().\n ok\n```\n\n```erlang\n2 client> {ok, Socket} = gen_tcp:connect(\"localhost\", 9999, [], infinity).\n```\n\n_Step 5:_ Do the TLS handshake:\n\n```erlang\n4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},\n {fail_if_no_peer_cert, true},\n {cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]}]).\n {ok,{sslsocket,[...]}}\n```\n\n_Step 6:_ Upgrade to a TLS connection. The client and server must agree upon the\nupgrade. The server must be prepared to be a TLS server before the client can do\na successful connect.\n\n```erlang\n3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},\n {cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]}], infinity).\n{ok,{sslsocket,[...]}}\n```\n\n_Step 7:_ Send a message over TLS:\n\n```erlang\n4 client> ssl:send(TLSSocket, \"foo\").\n ok\n```\n\n_Step 8:_ Set `active once` on the TLS socket:\n\n```erlang\n5 server> ssl:setopts(TLSSocket, [{active, once}]).\n ok\n```\n\n_Step 9:_ Flush the shell message queue to see that the message sent on the\nclient side is recived by the server side:\n\n```erlang\n5 server> flush().\n Shell got {ssl,{sslsocket,[...]},\"foo\"}\n ok\n```","title":"Upgrade Example - TLS only - Examples","ref":"using_ssl.html#upgrade-example-tls-only"},{"type":"extras","doc":"Fetch default cipher suite list for a TLS/DTLS version. Change default to all to\nget all possible cipher suites.\n\n```erlang\n1> Default = ssl:cipher_suites(default, 'tlsv1.2').\n [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,\n mac => aead,prf => sha384}, ....]\n```\n\nIn OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange\n(removed from default in 21)\n\n```erlang\n2> NoRSA =\n ssl:filter_cipher_suites(Default,\n [{key_exchange, fun(rsa) -> false;\n (_) -> true\n end}]).\n [...]\n```\n\nPick just a few suites\n\n```erlang\n 3> Suites =\n ssl:filter_cipher_suites(Default,\n [{key_exchange, fun(ecdh_ecdsa) -> true;\n (_) -> false\n end},\n {cipher, fun(aes_128_cbc) -> true;\n (_) ->false\n end}]).\n\n[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,\n mac => sha256,prf => sha256},\n #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,\n prf => default_prf}]\n```\n\nMake some particular suites the most preferred, or least preferred by changing\nprepend to append.\n\n```erlang\n 4>ssl:prepend_cipher_suites(Suites, Default).\n [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,\n mac => sha256,prf => sha256},\n #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,\n prf => default_prf},\n #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,\n mac => sha384,prf => sha384}, ...]\n```","title":"Customizing cipher suites - Examples","ref":"using_ssl.html#customizing-cipher-suites"},{"type":"extras","doc":"Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3)\nis something that can be negotiated and hence also configured. These\nalgorithms/schemes will be used for digital signatures in protocol messages and\nin certificates.\n\n> #### Note {: .info }\n>\n> TLS-1.3 schemes have atom names whereas TLS-1.2 configuration is two element\n> tuples composed by one hash algorithm and one signature algorithm. When both\n> versions are supported the configuration can be a mix of these as both\n> versions might be negotiated. All `rsa_pss` based schemes are back ported to\n> TLS-1.2 and can be used also in a TLS-1.2 configuration. In TLS-1.2 the\n> signature algorithms chosen by the server will also be affected by the chiper\n> suite that is chosen, which is not the case in TLS-1.3.\n\nUsing the function `ssl:signature_algs/2` will let you inspect different aspects\nof possible configurations for your system. For example if TLS-1.3 and TLS-1.2\nis supported the default signature_algorithm list in OTP-26 and cryptolib from\nOpenSSL 3.0.2 would look like:\n\n```erlang\n 1> ssl:signature_algs(default, 'tlsv1.3').\n %% TLS-1.3 schemes\n [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\n ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\n rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\n rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\n %% Legacy schemes only valid for certificate signatures in TLS-1.3\n %% (would have a tuple name in TLS-1.2 only configuration)\n rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256\n %% TLS 1.2 algorithms\n {sha512,ecdsa},\n {sha384,ecdsa},\n {sha256,ecdsa}]\n```\n\nIf you want to add support for non default supported algorithms you should\nappend them to the default list as the configuration is in prefered order,\nsomething like this:\n\n```erlang\n MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],\n ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),\n ...\n```\n\nSee also `ssl:signature_algs/2` and [sign_algo()](`t:ssl:signature_algs/0`)","title":"Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3) - Examples","ref":"using_ssl.html#customizing-signature-algorithms-tls-1-2-schemes-tls-1-3"},{"type":"extras","doc":"Erlang ssl application is able to use private keys provided by OpenSSL engines\nusing the following mechanism:\n\n```erlang\n1> ssl:start().\nok\n```\n\nLoad a crypto engine, should be done once per engine used. For example\ndynamically load the engine called `MyEngine`:\n\n```erlang\n2> {ok, EngineRef} =\ncrypto:engine_load(<<\"dynamic\">>,\n[{<<\"SO_PATH\">>, \"/tmp/user/engines/MyEngine\"},<<\"LOAD\">>],\n[]).\n{ok,#Ref<0.2399045421.3028942852.173962>}\n```\n\nCreate a map with the engine information and the algorithm used by the engine:\n\n```erlang\n3> PrivKey =\n #{algorithm => rsa,\n engine => EngineRef,\n key_id => \"id of the private key in Engine\"}.\n```\n\nUse the map in the ssl key option:\n\n```erlang\n4> {ok, SSLSocket} =\n ssl:connect(\"localhost\", 9999,\n [{cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", key => PrivKey}]}\n ], infinity).\n\n```\n\nSee also [crypto documentation](`e:crypto:engine_load.md#engine_load`)","title":"Using an Engine Stored Key - Examples","ref":"using_ssl.html#using-an-engine-stored-key"},{"type":"extras","doc":"The NSS keylog debug feature can be used by authorized users to for instance\nenable wireshark to decrypt TLS packets.\n\n_Server (with NSS key logging)_\n\n```erlang\n server() ->\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]},\n {reuseaddr, true},\n {versions, ['tlsv1.2','tlsv1.3']},\n {keep_secrets, true} %% Enable NSS key log (debug option)\n ],\n {ok, LSock} = ssl:listen(Port, LOpts),\n {ok, ASock} = ssl:transport_accept(LSock),\n {ok, CSock} = ssl:handshake(ASock).\n```\n\n_Exporting the secrets_\n\n```erlang\n {ok, [{keylog, KeylogItems}]} = ssl:connection_information(CSock, [keylog]).\n file:write_file(\"key.log\", [[KeylogItem,$\\n] || KeylogItem <- KeylogItems]).\n```","title":"NSS keylog - Examples","ref":"using_ssl.html#nss-keylog"},{"type":"extras","doc":"Clients can request to reuse a session established by a previous full handshake\nbetween that client and server by sending the id of the session in the initial\nhandshake message. The server may or may not agree to reuse it. If agreed the\nserver will send back the id and if not it will send a new id. The ssl\napplication has several options for handling session reuse.\n\nOn the client side the ssl application will save session data to try to automate\nsession reuse on behalf of the client processes on the Erlang node. Note that\nonly verified sessions will be saved for security reasons, that is session\nresumption relies on the certificate validation to have been run in the original\nhandshake. To minimize memory consumption only unique sessions will be saved\nunless the special `save` value is specified for the following option\n`{reuse_sessions, boolean() | save}` in which case a full handshake will be\nperformed and that specific session will have been saved before the handshake\nreturns. The session id and even an opaque binary containing the session data\ncan be retrieved using `ssl:connection_information/1` function. A saved session\n(guaranteed by the save option) can be explicitly reused using\n`{reuse_session, SessionId}`. Also it is possible for the client to reuse a\nsession that is not saved by the ssl application using\n`{reuse_session, {SessionId, SessionData}}`.\n\n> #### Note {: .info }\n>\n> When using explicit session reuse, it is up to the client to make sure that\n> the session being reused is for the correct server and has been verified.\n\nHere follows a client side example, divide into several steps for readability.\n\nStep 1 - Automated Session Reuse\n\n```erlang\n1> ssl:start().\nok\n\n2>{ok, C1} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.7>,tls_connection,undefined}, ...}}\n\n3> ssl:connection_information(C1, [session_id]).\n{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,\n 152,49,52,124,56,130,192,137,161,\n 146,145,164,232,...>>}]}\n\n%% Reuse session if possible, note that if C2 is really fast the session\n%% data might not be available for reuse.\n4>{ok, C2} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, true}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.8>,tls_connection,undefined}, ...]}}\n\n%% C2 got same session ID as client one, session was automatically reused.\n5> ssl:connection_information(C2, [session_id]).\n{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,\n 152,49,52,124,56,130,192,137,161,\n 146,145,164,232,...>>}]}\n```\n\nStep 2- Using `save` Option\n\n```erlang\n%% We want save this particular session for\n%% reuse although it has the same basis as C1\n6> {ok, C3} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, save}]).\n\n{ok,{sslsocket,{gen_tcp,#Port<0.9>,tls_connection,undefined}, ...]}}\n\n%% A full handshake is performed and we get a new session ID\n7> {ok, [{session_id, ID}]} = ssl:connection_information(C3, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n\n%% Use automatic session reuse\n8> {ok, C4} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, true}]).\n\n{ok,{sslsocket,{gen_tcp,#Port<0.10>,tls_connection,\n undefined}, ...]}}\n\n%% The \"saved\" one happened to be selected, but this is not a guarantee\n9> ssl:connection_information(C4, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n\n%% Make sure to reuse the \"saved\" session\n10> {ok, C5} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, ID}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.11>,tls_connection,\n undefined}, ...]}}\n\n11> ssl:connection_information(C5, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n```\n\nStep 3 - Explicit Session Reuse\n\n```erlang\n%% Perform a full handshake and the session will not be saved for reuse\n12> {ok, C9} =\nssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, false},\n {server_name_indication, disable}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.14>,tls_connection, ...}}\n\n%% Fetch session ID and data for C9 connection\n12> {ok, [{session_id, ID1}, {session_data, SessData}]} =\n ssl:connection_information(C9, [session_id, session_data]).\n{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,\n 85,85,99,119,47,9,68,195,50,120,52,\n 130,239,...>>},\n {session_data,<<131,104,13,100,0,7,115,101,115,115,105,\n 111,110,109,0,0,0,32,9,233,4,54,170,...>>}]}\n\n%% Explicitly reuse the session from C9\n13> {ok, C10} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, {ID1, SessData}}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.15>,tls_connection,\n undefined}, ...}}\n\n14> ssl:connection_information(C10, [session_id]).\n{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,\n 85,85,99,119,47,9,68,195,50,120,52,\n 130,239,...>>}]}\n```\n\nStep 4 - Not Possible to Reuse Explicit Session by ID Only\n\n```erlang\n%% Try to reuse the session from C9 using only the id\n15> {ok, E} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, ID1}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.18>,tls_connection,\n undefined}, ...}}\n\n%% This will fail (as it is not saved for reuse)\n%% and a full handshake will be performed, we get a new id.\n16> ssl:connection_information(E, [session_id]).\n{ok,[{session_id,<<87,46,43,126,175,68,160,153,37,29,\n 196,240,65,160,254,88,65,224,18,63,\n 18,17,174,39,...>>}]}\n```\n\nOn the server side the the `{reuse_sessions, boolean()}` option determines if\nthe server will save session data and allow session reuse or not. This can be\nfurther customized by the option `{reuse_session, fun()}` that may introduce a\nlocal policy for session reuse.","title":"Session Reuse Prior to TLS 1.3 - Examples","ref":"using_ssl.html#session-reuse-prior-to-tls-1-3"},{"type":"extras","doc":"TLS 1.3 introduces a new secure way of resuming sessions by using session\ntickets. A session ticket is an opaque data structure that is sent in the\npre_shared_key extension of a ClientHello, when a client attempts to resume a\nsession with keying material from a previous successful handshake.\n\nSession tickets can be stateful or stateless. A stateful session ticket is a\ndatabase reference (session ticket store) and used with stateful servers, while\na stateless ticket is a self-encrypted and self-authenticated data structure\nwith cryptographic keying material and state data, enabling session resumption\nwith stateless servers.\n\nThe choice between stateful or stateless depends on the server requirements as\nthe session tickets are opaque for the clients. Generally, stateful tickets are\nsmaller and the server can guarantee that tickets are only used once. Stateless\ntickets contain additional data, require less storage on the server side, but\nthey offer different guarantees against anti-replay. See also\n[Anti-Replay Protection in TLS 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3)\n\nSession tickets are sent by servers on newly established TLS connections. The\nnumber of tickets sent and their lifetime are configurable by application\nvariables. See also [SSL's configuration](ssl_app.md#configuration).\n\nSession tickets are protected by application traffic keys, and in stateless\ntickets, the opaque data structure itself is self-encrypted.\n\nAn example with automatic and manual session resumption:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\",\n keyfile => \"key.pem\"}]},\n {versions, ['tlsv1.2','tlsv1.3']},\n {session_tickets, stateless}].\n {ok, LSock} = ssl:listen(8001, LOpts).\n {ok, ASock} = ssl:transport_accept(LSock).\n```\n\n_Step 2 (client):_ Start the client and connect to server:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n COpts = [{cacertfile, \"cert.pem\"},\n {versions, ['tlsv1.2','tlsv1.3']},\n {log_level, debug},\n {session_tickets, auto}].\n ssl:connect(\"localhost\", 8001, COpts).\n```\n\n_Step 3 (server):_ Start the TLS handshake:\n\n```erlang\n {ok, CSocket} = ssl:handshake(ASock).\n```\n\nA connection is established using a full handshake. Below is a summary of the\nexchanged messages:\n\n```erlang\n >>> TLS 1.3 Handshake, ClientHello ...\n << >> Handshake, Finished ...\n << >> TLS 1.3 Handshake, ClientHello ...\n << >> Handshake, Finished ...\n << TicketData end.\n```\n\n_Step 11 (server):_ Accept a new connection on the server:\n\n```erlang\n {ok, ASock4} = ssl:transport_accept(LSock).\n```\n\n_Step 12 (client):_ Initiate a new connection to the server with the session\nticket received in Step 10:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n COpts2 = [{cacertfile, \"cert.pem\"},\n {versions, ['tlsv1.2','tlsv1.3']},\n {log_level, debug},\n {session_tickets, manual},\n {use_ticket, [Ticket]}].\n ssl:connect(\"localhost\", 8001, COpts).\n```\n\n_Step 13 (server):_ Start the handshake:\n\n```erlang\n {ok, CSock4} = ssl:handshake(ASock4).\n```","title":"Session Tickets and Session Resumption in TLS 1.3 - Examples","ref":"using_ssl.html#session-tickets-and-session-resumption-in-tls-1-3"},{"type":"extras","doc":"TLS 1.3 allows clients to send data on the first flight if the endpoints have a\nshared crypographic secret (pre-shared key). This means that clients can send\nearly data if they have a valid session ticket received in a previous successful\nhandshake. For more information about session resumption see\n[Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\nThe security properties of Early Data are weaker than other kinds of TLS data.\nThis data is not forward secret, and it is vulnerable to replay attacks. For\navailable mitigation strategies see\n[Anti-Replay Protection in TLS 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3).\n\nIn normal operation, clients will not know which, if any, of the available\nmitigation strategies servers actually implement, and hence must only send early\ndata which they deem safe to be replayed. For example, idempotent HTTP\noperations, such as HEAD and GET, can usually be regarded as safe but even they\ncan be exploited by a large number of replays causing resource limit exhaustion\nand other similar problems.\n\nAn example of sending early data with automatic and manual session ticket\nhandling:\n\n_Server_\n\n```erlang\nearly_data_server() ->\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]},\n {reuseaddr, true},\n {versions, ['tlsv1.2','tlsv1.3']},\n {session_tickets, stateless},\n {early_data, enabled},\n ],\n {ok, LSock} = ssl:listen(Port, LOpts),\n %% Accept first connection\n {ok, ASock0} = ssl:transport_accept(LSock),\n {ok, CSock0} = ssl:handshake(ASock0),\n %% Accept second connection\n {ok, ASock1} = ssl:transport_accept(LSock),\n {ok, CSock1} = ssl:handshake(ASock1),\n Sock.\n```\n\n_Client (automatic ticket handling):_\n\n```erlang\nearly_data_auto() ->\n %% First handshake 1-RTT - get session tickets\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n Data = <<\"HEAD / HTTP/1.1\\r\\nHost: \\r\\nConnection: close\\r\\n\">>,\n COpts0 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, auto}],\n {ok, Sock0} = ssl:connect(\"localhost\", Port, COpts0),\n\n %% Wait for session tickets\n timer:sleep(500),\n %% Close socket if server cannot handle multiple\n %% connections e.g. openssl s_server\n ssl:close(Sock0),\n\n %% Second handshake 0-RTT\n COpts1 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, auto},\n {early_data, Data}],\n {ok, Sock} = ssl:connect(\"localhost\", Port, COpts1),\n Sock.\n\n```\n\n_Client (manual ticket handling):_\n\n```erlang\nearly_data_manual() ->\n %% First handshake 1-RTT - get session tickets\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n Data = <<\"HEAD / HTTP/1.1\\r\\nHost: \\r\\nConnection: close\\r\\n\">>,\n COpts0 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, manual}],\n {ok, Sock0} = ssl:connect(\"localhost\", Port, COpts0),\n\n %% Wait for session tickets\n Ticket =\n receive\n {ssl, session_ticket, Ticket0} ->\n Ticket0\n end,\n\n %% Close socket if server cannot handle multiple connections\n %% e.g. openssl s_server\n ssl:close(Sock0),\n\n %% Second handshake 0-RTT\n COpts1 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, manual},\n {use_ticket, [Ticket]},\n {early_data, Data}],\n {ok, Sock} = ssl:connect(\"localhost\", Port, COpts1),\n Sock.\n```","title":"Early Data in TLS-1.3 - Examples","ref":"using_ssl.html#early-data-in-tls-1-3"},{"type":"extras","doc":"The TLS 1.3 protocol does not provide inherent protection for replay of 0-RTT\ndata but describes mechanisms that SHOULD be implemented by compliant server\nimplementations. The implementation of TLS 1.3 in the SSL application employs\nall standard methods to prevent potential threats.\n\n_Single-use tickets_\n\nThis mechanism is available with stateful session tickets. Session tickets can\nonly be used once, subsequent use of the same ticket results in a full\nhandshake. Stateful servers enforce this rule by maintaining a database of\noutstanding valid tickets.\n\n_Client Hello Recording_\n\nThis mechanism is available with stateless session tickets. The server records a\nunique value derived from the ClientHello (PSK binder) in a given time window.\nThe ticket's age is verified by using both the \"obsfuscated_ticket_age\" and an\nadditional timestamp encrypted in the ticket data. As the used datastore allows\nfalse positives, apparent replays will be answered by doing a full 1-RTT\nhandshake.\n\n_Freshness Checks_\n\nThis mechanism is available with the stateless session tickets. As the ticket\ndata has an embedded timestamp, the server can determine if a ClientHello was\nsent reasonably recently and accept the 0-RTT handshake, otherwise if falls back\nto a full 1-RTT handshake. This mechanism is tightly coupled with the previous\none, it prevents storing an unlimited number of ClientHellos.\n\nThe current implementation uses a pair of Bloom filters to implement the last\ntwo mechanisms. Bloom filters are fast, memory-efficient, probabilistic data\nstructures that can tell if an element may be in a set or if it is definitely\nnot in the set.\n\nIf the option `anti_replay` is defined in the server, a\npair of Bloom filters (_current_ and _old_) are used to record incoming\nClientHello messages (it is the unique binder value that is actually stored).\nThe _current_ Bloom filter is used for `WindowSize` seconds to store new\nelements. At the end of the time window the Bloom filters are rotated (the\n_current_ Bloom filter becomes the _old_ and an empty Bloom filter is set as\n_current_.\n\nThe Anti-Replay protection feature in stateless servers executes in the\nfollowing steps when a new ClientHello is received:\n\n- Reported ticket age (obfuscated ticket age) shall be less than ticket\n lifetime.\n- Actual ticket age shall be less than the ticket lifetime (stateless session\n tickets contain the servers timestamp when the ticket was issued).\n- ClientHello created with the ticket shall be sent relatively recently\n (freshness checks).\n- If all above checks passed both _current_ and _old_ Bloom filters are checked\n to detect if binder was already seen. Being a probabilistic data structure,\n false positives can occur and they trigger a full handshake.\n- If the binder is not seen, the binder is validated. If the binder is valid,\n the server proceeds with the 0-RTT handshake.","title":"Anti-Replay Protection in TLS 1.3 - Examples","ref":"using_ssl.html#anti-replay-protection-in-tls-1-3"},{"type":"extras","doc":"Using DTLS has basically the same API as TLS. You need to add the option\n\\{protocol, dtls\\} to the connect and listen functions. For example\n\n```erlang\n client>{ok, Socket} = ssl:connect(\"localhost\", 9999, [{protocol, dtls},\n {verify, verify_peer},\n {cacertfile, \"cacerts.pem\"}],\n infinity).\n{ok,{sslsocket, [...]}}\n\n```","title":"Using DTLS - Examples","ref":"using_ssl.html#using-dtls"},{"type":"extras","doc":"\n# Erlang Distribution over TLS\n\nThis section describes how the Erlang distribution can use TLS to get extra\nverification and security.\n\nThe Erlang distribution can in theory use almost any connection-based protocol\nas bearer. However, a module that implements the protocol-specific parts of the\nconnection setup is needed. The default distribution module is `inet_tcp_dist`\nin the Kernel application. When starting an Erlang node distributed,\n`net_kernel` uses this module to set up listen ports and connections.\n\nIn the SSL application, an extra distribution module, `inet_tls_dist`, can be\nused as an alternative. All distribution connections will use TLS and all\nparticipating Erlang nodes in a distributed system must use this distribution\nmodule.\n\nThe security level depends on the parameters provided to the TLS connection\nsetup. Erlang node cookies are however always used, as they can be used to\ndifferentiate between two different Erlang networks.\n\nTo set up Erlang distribution over TLS:\n\n- _Step 1:_ Build boot scripts including the SSL application.\n- _Step 2:_ Specify the distribution module for `net_kernel`.\n- _Step 3:_ Specify the security options and other SSL options.\n- _Step 4:_ Set up the environment to always use TLS.\n\nThe following sections describe these steps.","title":"Erlang Distribution over TLS","ref":"ssl_distribution.html"},{"type":"extras","doc":"Boot scripts are built using the `systools` utility in the SASL application. For\nmore information on `systools`, see the SASL documentation. This is only an\nexample of what can be done.\n\nThe simplest boot script possible includes only the Kernel and STDLIB\napplications. Such a script is located in the `bin` directory of the Erlang\ndistribution. The source for the script is found under the Erlang installation\ntop directory under `releases/ /start_clean.rel`.\n\nDo the following:\n\n- Copy that script to another location (and preferably another name).\n- Add the applications Crypto, Public Key, and SSL with their current version\n numbers after the STDLIB application.\n\nThe following shows an example `.rel` file with TLS added:\n\n```erlang\n {release, {\"OTP APN 181 01\",\"R15A\"}, {erts, \"5.9\"},\n [{kernel,\"2.15\"},\n {stdlib,\"1.18\"},\n {crypto, \"2.0.3\"},\n {public_key, \"0.12\"},\n {asn1, \"4.0\"},\n {ssl, \"5.0\"}\n ]}.\n```\n\nThe version numbers differ in your system. Whenever one of the applications\nincluded in the script is upgraded, change the script.\n\nDo the following:\n\n- Build the boot script.\n\n Assuming the `.rel file` is stored in a file `start_ssl.rel` in the current\n directory, a boot script can be built as follows:\n\n```text\n 1> systools:make_script(\"start_ssl\",[]).\n```\n\nThere is now a `start_ssl.boot` file in the current directory.\n\nDo the following:\n\n- Test the boot script. To do this, start Erlang with the `-boot` command-line\n parameter specifying this boot script (with its full path, but without the\n `.boot` suffix). In UNIX it can look as follows:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl\nErlang (BEAM) emulator version 5.0\n\nEshell V5.0 (abort with ^G)\n1> whereis(ssl_manager).\n<0.41.0>\n```\n\nThe `whereis` function-call verifies that the SSL application is started.\n\nAs an alternative to building a bootscript, you can explicitly add the path to\nthe SSL `ebin` directory on the command line. This is done with command-line\noption `-pa`. This works as the SSL application does not need to be started for\nthe distribution to come up, as a clone of the SSL application is hooked into\nthe Kernel application. So, as long as the SSL application code can be reached,\nthe distribution starts. The `-pa` method is only recommended for testing\npurposes.\n\n> #### Note {: .info }\n>\n> The clone of the SSL application must enable the use of the SSL code in such\n> an early bootstage as needed to set up the distribution. However, this makes\n> it impossible to soft upgrade the SSL application.","title":"Building Boot Scripts Including the SSL Application - Erlang Distribution over TLS","ref":"ssl_distribution.html#building-boot-scripts-including-the-ssl-application"},{"type":"extras","doc":"The distribution module for TLS is named `inet_tls_dist` and is specified on the\ncommand line with option `-proto_dist`. The argument to `-proto_dist` is to be\nthe module name without suffix `_dist`. So, this distribution module is\nspecified with `-proto_dist inet_tls` on the command line.\n\nExtending the command line gives the following:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n```\n\nFor the distribution to be started, give the emulator a name as well:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1>\n```\n\nHowever, a node started in this way refuses to talk to other nodes, as no TLS\nparameters are supplied (see the next section).","title":"Specifying Distribution Module for net_kernel - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-distribution-module-for-net_kernel"},{"type":"extras","doc":"The TLS distribution options can be written into a file that is consulted when\nthe node is started. This file name is then specified with the command line\nargument `-ssl_dist_optfile`.\n\nAny available TLS option can be specified in an options file.\n\n> #### Note {: .info }\nOptions that take a `fun()` has to use the syntax `fun Mod:Func/Arity` since a\nfunction body cannot be compiled when consulting a file. Also the encoding\nof the file can be specified as defined by module `m:epp`.\n\n> #### Warning {: .warning }\nDo not tamper with the socket options `list`, `binary`, `active`, `packet`,\n`nodelay` and `deliver` since they are used by the distribution protocol handler\nitself. Other raw socket options such as `packet_size` may interfere severely,\nso beware\\!\n\nFor TLS to work, at least a public key and a certificate must be specified for\nthe server side and the client needs to specify CAs that it trusts (client certification\nis optional and requires more configuration).\n\nIn the following example (to keep it simple), the PEM file `\"/home/me/ssl/erlserver.pem\"`\ncontains both the server certificate and its private key .\n\nCreate a file named for example `\"/home/me/ssl/ssl_test@myhost.conf\"`:\n\n```erlang\n[{server,\n [{certfile, \"/home/me/ssl/erlserver.pem\"}]},\n {client,\n [{cacertfile, \"/home/me/ssl/client_trusted.pem\"}]}].\n```\n\nAnd then start the node like this (line breaks in the command are for\nreadability, and shall not be there when typed):\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_optfile \"/home/me/ssl/ssl_test@myhost.conf\"\n -sname ssl_test\n```\n\nThe options in the `{server, Opts}` tuple are used when calling\n`ssl:handshake/3`, and the options in the `{client, Opts}` tuple are used when\ncalling `ssl:connect/4`.\n\nFor the client, the option `{server_name_indication, atom_to_list(TargetNode)}`\nis added when connecting. This makes it possible to use the client option\n`{verify, verify_peer}`, and the client will verify that the certificate matches\nthe node name you are connecting to. This only works if the the server\ncertificate is issued to the name\n[`atom_to_list(TargetNode)`](`atom_to_list/1`).\n\nFor the server it is also possible to use the option `{verify, verify_peer}` and\nthe server will only accept client connections with certificates that are\ntrusted by a root certificate that the server knows. A client that presents an\nuntrusted certificate will be rejected. This option is preferably combined with\n`{fail_if_no_peer_cert, true}` or a client will still be accepted if it does not\npresent any certificate.\n\nA node started in this way is fully functional, using TLS as the distribution\nprotocol.","title":"Specifying TLS Options - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-tls-options"},{"type":"extras","doc":"It is possible to use TLS distribution over IPv6 instead of IPv4. To do this,\npass the option `-proto_dist inet6_tls` instead of `-proto_dist inet_tls` when\nstarting Erlang, either on the command line or in the `ERL_FLAGS` environment\nvariable.\n\nAn example command line with this option would look like this:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet6_tls\n -ssl_dist_optfile \"/home/me/ssl/ssl_test@myhost.conf\"\n -sname ssl_test\n```\n\nA node started in this way will only be able to communicate with other nodes\nusing TLS distribution over IPv6.","title":"Using TLS distribution over IPv6 - Erlang Distribution over TLS","ref":"ssl_distribution.html#using-tls-distribution-over-ipv6"},{"type":"extras","doc":"> #### Note {: .info }\n> The following section describes TLS Option handling prior to OTP 20.2\n> and can only handle a small subset of the actual available options.\n> It is here only for the sake of backwards compatibility .\n\nAs in the previous section the PEM file `\"/home/me/ssl/erlserver.pem\"` contains\nboth the server certificate and its private key.\n\nOn the `erl` command line you can specify options that the TLS distribution adds\nwhen creating a socket.\n\nThe simplest TLS options in the following list can be specified by adding the\nprefix `server_` or `client_` to the option name:\n\n- `certfile`\n- `keyfile`\n- `password`\n- `cacertfile`\n- `verify`\n- `verify_fun` (write as `{Module, Function, InitialUserState}`)\n- `crl_check`\n- `crl_cache` (write as Erlang term)\n- `reuse_sessions`\n- `secure_renegotiate`\n- `depth`\n- `hibernate_after`\n- `ciphers` (use old string format)\n\nNote that `verify_fun` needs to be written in a different form than the\ncorresponding TLS option, since funs are not accepted on the command line.\n\nThe server can also take the options `dhfile` and `fail_if_no_peer_cert` (also\nprefixed).\n\n`client_`\\-prefixed options are used when the distribution initiates a\nconnection to another node. `server_`\\-prefixed options are used when accepting\na connection from a remote node.\n\nRaw socket options, such as `packet` and `size` must not be specified on the\ncommand line.\n\nThe command-line argument for specifying the TLS options is named\n`-ssl_dist_opt` and is to be followed by pairs of SSL options and their values.\nArgument `-ssl_dist_opt` can be repeated any number of times.\n\nAn example command line doing the same as the example in the previous section\ncan now look as follows (line breaks in the command are for readability, and\nshall not be there when typed):\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_opt server_certfile \"/home/me/ssl/erlserver.pem\"\n -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true\n -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1>\n```","title":"Specifying TLS Options (Legacy) - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-tls-options-legacy"},{"type":"extras","doc":"A convenient way to specify arguments to Erlang is to use environment variable\n`ERL_FLAGS`. All the flags needed to use the TLS distribution can be specified\nin that variable and are then interpreted as command-line arguments for all\nsubsequent invocations of Erlang.\n\nIn a Unix (Bourne) shell, it can look as follows (line breaks are for\nreadability, they are not to be there when typed):\n\n```erlang\n$ ERL_FLAGS=\"-boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_opt server_certfile /home/me/ssl/erlserver.pem\n -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true\"\n$ export ERL_FLAGS\n$ erl -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1> init:get_arguments().\n[{root,[\"/usr/local/erlang\"]},\n {progname,[\"erl \"]},\n {sname,[\"ssl_test\"]},\n {boot,[\"/home/me/ssl/start_ssl\"]},\n {proto_dist,[\"inet_tls\"]},\n {ssl_dist_opt,[\"server_certfile\",\"/home/me/ssl/erlserver.pem\"]},\n {ssl_dist_opt,[\"server_secure_renegotiate\",\"true\",\n \"client_secure_renegotiate\",\"true\"]\n {home,[\"/home/me\"]}]\n```\n\nThe `init:get_arguments()` call verifies that the correct arguments are supplied\nto the emulator.","title":"Setting up Environment to Always Use TLS - Erlang Distribution over TLS","ref":"ssl_distribution.html#setting-up-environment-to-always-use-tls"},{"type":"extras","doc":"\n# Standards Compliance","title":"Standards Compliance","ref":"standards_compliance.html"},{"type":"extras","doc":"This section describes the current state of standards compliance of the ssl\napplication.","title":"Purpose - Standards Compliance","ref":"standards_compliance.html#purpose"},{"type":"extras","doc":"- For security reasons RSA key exchange cipher suites are no longer supported by\n default, but can be configured. (OTP 21)\n- For security reasons DES cipher suites are no longer supported by default, but\n can be configured. (OTP 20)\n- For security reasons 3DES cipher suites are no longer supported by default,\n but can be configured. (OTP 21)\n- Renegotiation Indication Extension\n [RFC 5746](http://www.ietf.org/rfc/rfc5746.txt) is supported\n- Ephemeral Diffie-Hellman cipher suites are supported, but not Diffie Hellman\n Certificates cipher suites.\n- Elliptic Curve cipher suites are supported if the Crypto application supports\n it and named curves are used.\n- Export cipher suites are not supported as the U.S. lifted its export\n restrictions in early 2000.\n- IDEA cipher suites are not supported as they have become deprecated by the TLS\n 1.2 specification so it is not motivated to implement them.\n- Compression is not supported.\n- It is possible to use Pre-Shared Key (PSK) and Secure Remote Password (SRP)\n cipher suites, but they are not enabled by default and need addition configuration.","title":"Common (prior to TLS 1.3) - Standards Compliance","ref":"standards_compliance.html#common-prior-to-tls-1-3"},{"type":"extras","doc":"- CRL validation is supported.\n- Policy certificate extensions are supported. (OTP 27)\n- 'Server Name Indication' extension\n ([RFC 6066](http://www.ietf.org/rfc/rfc6066.txt)) is supported.\n- Application Layer Protocol Negotiation (ALPN) and its successor Next Protocol\n Negotiation (NPN) are supported.","title":"Common - Standards Compliance","ref":"standards_compliance.html#common"},{"type":"extras","doc":"For security reasons SSL-2.0 is not supported. Interoperability with SSL-2.0\nenabled clients dropped. (OTP 21)","title":"SSL 2.0 - Standards Compliance","ref":"standards_compliance.html#ssl-2-0"},{"type":"extras","doc":"For security reasons SSL-3.0 is no longer supported at all. (OTP 23)\n\nFor security reasons SSL-3.0 is no longer supported by default, but can be\nconfigured. (OTP 19)","title":"SSL 3.0 - Standards Compliance","ref":"standards_compliance.html#ssl-3-0"},{"type":"extras","doc":"For security reasons TLS-1.0 is no longer supported by default, but can be\nconfigured. (OTP 22)","title":"TLS 1.0 - Standards Compliance","ref":"standards_compliance.html#tls-1-0"},{"type":"extras","doc":"For security reasons TLS-1.1 is no longer supported by default, but can be\nconfigured. (OTP 22)","title":"TLS 1.1 - Standards Compliance","ref":"standards_compliance.html#tls-1-1"},{"type":"extras","doc":"Supported","title":"TLS 1.2 - Standards Compliance","ref":"standards_compliance.html#tls-1-2"},{"type":"extras","doc":"For security reasons DTLS-1.0 (based on TLS 1.1) is no longer supported by\ndefault, but can be configured. (OTP 22)","title":"DTLS 1.0 - Standards Compliance","ref":"standards_compliance.html#dtls-1-0"},{"type":"extras","doc":"Supported (based on TLS 1.2)","title":"DTLS 1.2 - Standards Compliance","ref":"standards_compliance.html#dtls-1-2"},{"type":"extras","doc":"Not yet supported","title":"DTLS 1.3 - Standards Compliance","ref":"standards_compliance.html#dtls-1-3"},{"type":"extras","doc":"OTP-22 introduces support for TLS 1.3. The current implementation supports a\nselective set of cryptographic algorithms:\n\n- Key Exchange: ECDHE groups supported by default\n- Groups: all standard groups supported for the Diffie-Hellman key exchange\n- Groups: Support brainpool groups from RFC 8734\n- Ciphers: all mandatory cipher suites are supported\n- Signature Algorithms: All algorithms form RFC 8446\n- Certificates: RSA, ECDSA and EDDSA keys\n\nOther notable features:\n\n- PSK and session resumption is supported (stateful and stateless tickets)\n- Anti-replay protection using Bloom-filters with stateless tickets\n- Early data and 0-RTT is supported\n- Key and Initialization Vector Update is supported\n\nFor more detailed information see the\n[Standards Compliance](standards_compliance.md#soc_table) below.\n\nThe following table describes the current state of standards compliance for TLS\n1.3.\n\n(_C_ = Compliant, _NC_ = Non-Compliant, _PC_ = Partially-Compliant, _NA_ = Not\nApplicable)\n\n[](){: #soc_table }\n\n| _Section_ | _Feature_ | _State_ | _Since_ |\n| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------- |\n| [1\\.3. Updates Affecting TLS 1.2](https://tools.ietf.org/html/rfc8446#section-1.2) | | _C_ | _24\\.1_ |\n| | Version downgrade protection mechanism | _C_ | _22_ |\n| | RSASSA-PSS signature schemes | _C_ | _24\\.1_ |\n| | supported_versions (ClientHello) extension | _C_ | _22_ |\n| | signature_algorithms_cert extension | _C_ | _24\\.1_ |\n| [2\\. Protocol Overview](https://tools.ietf.org/html/rfc8446#section/2) | | _PC_ | _22_ |\n| | (EC)DHE | _C_ | _22_ |\n| | PSK-only | _NC_ | |\n| | PSK with (EC)DHE | _C_ | _22\\.2_ |\n| [2\\.1. Incorrect DHE share](https://tools.ietf.org/html/rfc8446#section-2.1) | HelloRetryRequest | _C_ | _22_ |\n| [2\\.2. Resumption and Pre-Shared Key (PSK)](https://tools.ietf.org/html/rfc8446#section-2.2) | | _C_ | _22\\.2_ |\n| [2\\.3. 0-RTT Data](https://tools.ietf.org/html/rfc8446#section-2.3) | | _PC_ | _23\\.3_ |\n| [4\\.1.1. Cryptographic Negotiation](https://tools.ietf.org/html/rfc8446#section-4.1.1) | | _C_ | _22\\.2_ |\n| | supported_groups extension | _C_ | _22_ |\n| | signature_algorithms extension | _C_ | _22_ |\n| | pre_shared_key extension | _C_ | _22\\.2_ |\n| [4\\.1.2. Client Hello](https://tools.ietf.org/html/rfc8446#section-4.1.2) | _Client_ | _PC_ | _22\\.1_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | status_request (RFC6066) | _C_ | _27\\.0_ |\n| | supported_groups (RFC7919) | _C_ | _22\\.1_ |\n| | signature_algorithms (RFC8446) | _C_ | _22\\.1_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | padding (RFC7685) | _NC_ | |\n| | key_share (RFC8446) | _C_ | _22\\.1_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | psk_key_exchange_modes (RFC8446) | _C_ | _22\\.2_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22\\.1_ |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | post_handshake_auth (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22\\.1_ |\n| | _Server_ | _PC_ | _22_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | status_request (RFC6066) | _NC_ | |\n| | supported_groups (RFC7919) | _C_ | _22_ |\n| | signature_algorithms (RFC8446) | _C_ | _22_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | padding (RFC7685) | _NC_ | |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | psk_key_exchange_modes (RFC8446) | _C_ | _22\\.2_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| | oid_filters (RFC8446) | _NC_ | |\n| | post_handshake_auth (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22_ |\n| [4\\.1.3. Server Hello](https://tools.ietf.org/html/rfc8446#section-4.1.3) | _Client_ | _C_ | _22\\.2_ |\n| | Version downgrade protection | _C_ | _22\\.1_ |\n| | key_share (RFC8446) | _C_ | _22\\.1_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | supported_versions (RFC8446) | _C_ | _22\\.1_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | _Server_ | _C_ | _22\\.2_ |\n| | Version downgrade protection | _C_ | _22_ |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| [4\\.1.4. Hello Retry Request](https://tools.ietf.org/html/rfc8446#section-4.1.4) | _Server_ | _C_ | _22_ |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| [4\\.2.1. Supported Versions](https://tools.ietf.org/html/rfc8446#section-4.2.1) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.2.2. Cookie](https://tools.ietf.org/html/rfc8446#section-4.2.2) | _Client_ | _C_ | _23\\.1_ |\n| | _Server_ | _C_ | _23\\.1_ |\n| [4\\.2.3. Signature Algorithms](https://tools.ietf.org/html/rfc8446#section-4.2.3) | _Client_ | _C_ | _24_ |\n| | rsa_pkcs1_sha256 | _C_ | _22\\.1_ |\n| | rsa_pkcs1_sha384 | _C_ | _22\\.1_ |\n| | rsa_pkcs1_sha512 | _C_ | _22\\.1_ |\n| | ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | ecdsa_secp384r1_sha384 | _C_ | _22\\.1_ |\n| | ecdsa_secp521r1_sha512 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha256 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha384 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha512 | _C_ | _22\\.1_ |\n| | ed25519 | _C_ | _24_ |\n| | ed448 | _C_ | _24_ |\n| | rsa_pss_pss_sha256 | _C_ | _23_ |\n| | rsa_pss_pss_sha384 | _C_ | _23_ |\n| | rsa_pss_pss_sha512 | _C_ | _23_ |\n| | rsa_pkcs1_sha1 | _C_ | _22\\.1_ |\n| | ecdsa_sha1 | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _24_ |\n| | rsa_pkcs1_sha256 | _C_ | _22_ |\n| | rsa_pkcs1_sha384 | _C_ | _22_ |\n| | rsa_pkcs1_sha512 | _C_ | _22_ |\n| | ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | ecdsa_secp384r1_sha384 | _C_ | _22\\.1_ |\n| | ecdsa_secp521r1_sha512 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha256 | _C_ | _22_ |\n| | rsa_pss_rsae_sha384 | _C_ | _22_ |\n| | rsa_pss_rsae_sha512 | _C_ | _22_ |\n| | ed25519 | _C_ | _24_ |\n| | ed448 | _C_ | _24_ |\n| | rsa_pss_pss_sha256 | _C_ | _23_ |\n| | rsa_pss_pss_sha384 | _C_ | _23_ |\n| | rsa_pss_pss_sha512 | _C_ | _23_ |\n| | rsa_pkcs1_sha1 | _C_ | _22_ |\n| | ecdsa_sha1 | _C_ | _22_ |\n| [4\\.2.4. Certificate Authorities](https://tools.ietf.org/html/rfc8446#section-4.2.4) | _Client_ | _C_ | 24\\.3 |\n| | _Server_ | _C_ | _24\\.3_ |\n| [4\\.2.5. OID Filters](https://tools.ietf.org/html/rfc8446#section-4.2.5) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.2.6. Post-Handshake Client Authentication](https://tools.ietf.org/html/rfc8446#section-4.2.6) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.2.7. Supported Groups](https://tools.ietf.org/html/rfc8446#section-4.2.7) | _Client_ | _C_ | _22\\.1_ |\n| | secp256r1 | _C_ | _22\\.1_ |\n| | secp384r1 | _C_ | _22\\.1_ |\n| | secp521r1 | _C_ | _22\\.1_ |\n| | x25519 | _C_ | _22\\.1_ |\n| | x448 | _C_ | _22\\.1_ |\n| | ffdhe2048 | _C_ | _22\\.1_ |\n| | ffdhe3072 | _C_ | _22\\.1_ |\n| | ffdhe4096 | _C_ | _22\\.1_ |\n| | ffdhe6144 | _C_ | _22\\.1_ |\n| | ffdhe8192 | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| | secp256r1 | _C_ | _22_ |\n| | secp384r1 | _C_ | _22_ |\n| | secp521r1 | _C_ | _22_ |\n| | x25519 | _C_ | _22_ |\n| | x448 | _C_ | _22_ |\n| | ffdhe2048 | _C_ | _22_ |\n| | ffdhe3072 | _C_ | _22_ |\n| | ffdhe4096 | _C_ | _22_ |\n| | ffdhe6144 | _C_ | _22_ |\n| | ffdhe8192 | _C_ | _22_ |\n| [4\\.2.8. Key Share](https://tools.ietf.org/html/rfc8446#section-4.2.8) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.2.9. Pre-Shared Key Exchange Modes](https://tools.ietf.org/html/rfc8446#section-4.2.9) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.10. Early Data Indication](https://tools.ietf.org/html/rfc8446#section-4.2.10) | _Client_ | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| [4\\.2.11. Pre-Shared Key Extension](https://tools.ietf.org/html/rfc8446#section-4.2.11) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.1. Ticket Age](https://tools.ietf.org/html/rfc8446#section-4.2.11.1) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.2. PSK Binder](https://tools.ietf.org/html/rfc8446#section-4.2.11.2) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.3. Processing Order](https://tools.ietf.org/html/rfc8446#section-4.2.11.3) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.3.1. Encrypted Extensions](https://tools.ietf.org/html/rfc8446#section-4.3.1) | _Client_ | _PC_ | _22\\.1_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | supported_groups (RFC7919) | _NC_ | |\n| | use_srtp (RFC5764) | _NC_ | |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | 23\\.0 |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | _Server_ | _PC_ | _22_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | supported_groups (RFC7919) | _NC_ | |\n| | use_srtp (RFC5764) | _NC_ | |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | 23\\.0 |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| [4\\.3.2. Certificate Request](https://tools.ietf.org/html/rfc8446#section-4.3.2) | _Client_ | _PC_ | _22\\.1_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signature_algorithms (RFC8446) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22\\.1_ |\n| | _Server_ | _PC_ | _22_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signature_algorithms (RFC8446) | _C_ | _22_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22_ |\n| [4\\.4.1. The Transcript Hash](https://tools.ietf.org/html/rfc8446#section-4.4.1) | | _C_ | _22_ |\n| [4\\.4.2. Certificate](https://tools.ietf.org/html/rfc8446#section-4.4.2) | _Client_ | _PC_ | _22\\.1_ |\n| | Arbitrary certificate chain orderings | _C_ | _22\\.2_ |\n| | Extraneous certificates in chain | _C_ | _23\\.2_ |\n| | status_request (RFC6066) | _C_ | 27\\.0 |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | _Server_ | _PC_ | _22_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| [4\\.4.2.1. OCSP Status and SCT Extensions](https://tools.ietf.org/html/rfc8446#section-4.4.2.1) | _Client_ | _PC_ | _27\\.0_ |\n| | _Server_ | _NC_ | |\n| [4\\.4.2.2. Server Certificate Selection](https://tools.ietf.org/html/rfc8446#section-4.4.2.2) | | _C_ | _24\\.3_ |\n| | The certificate type MUST be X.509v3, unless explicitly negotiated otherwise | _C_ | _22_ |\n| | The server's end-entity certificate's public key (and associated restrictions) MUST be compatible with the selected authentication algorithm from the client's \"signature_algorithms\" extension (currently RSA, ECDSA, or EdDSA). | _C_ | _22_ |\n| | The certificate MUST allow the key to be used for signing with a signature scheme indicated in the client's \"signature_algorithms\"/\"signature_algorithms_cert\" extensions | _C_ | _22_ |\n| | The \"server_name\" and \"certificate_authorities\" extensions are used to guide certificate selection. As servers MAY require the presence of the \"server_name\" extension, clients SHOULD send this extension, when applicable. | _C_ | _24\\.3_ |\n| [4\\.4.2.3. Client Certificate Selection](https://tools.ietf.org/html/rfc8446#section-4.4.2.3) | | _PC_ | _22\\.1_ |\n| | The certificate type MUST be X.509v3, unless explicitly negotiated otherwise | _C_ | _22\\.1_ |\n| | If the \"certificate_authorities\" extension in the CertificateRequest message was present, at least one of the certificates in the certificate chain SHOULD be issued by one of the listed CAs. | _C_ | _24\\.3_ |\n| | The certificates MUST be signed using an acceptable signature algorithm | _C_ | _22\\.1_ |\n| | If the CertificateRequest message contained a non-empty \"oid_filters\" extension, the end-entity certificate MUST match the extension OIDs that are recognized by the client | _NC_ | |\n| [4\\.4.2.4. Receiving a Certificate Message](https://tools.ietf.org/html/rfc8446#section-4.4.2.4) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.4.3. Certificate Verify](https://tools.ietf.org/html/rfc8446#section-4.4.3) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.4.4. Finished](https://tools.ietf.org/html/rfc8446#section-4.4.4) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.5. End of Early Data](https://tools.ietf.org/html/rfc8446#section-4.5) | _Client_ | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| [4\\.6.1. New Session Ticket Message](https://tools.ietf.org/html/rfc8446#section-4.6.1) | _Client_ | _C_ | _23\\.3_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| [4\\.6.2. Post-Handshake Authentication](https://tools.ietf.org/html/rfc8446#section-4.6.2) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.6.3. Key and Initialization Vector Update](https://tools.ietf.org/html/rfc8446#section-4.6.3) | _Client_ | _C_ | _22\\.3_ |\n| | _Server_ | _C_ | _22\\.3_ |\n| [5\\.1. Record Layer](https://tools.ietf.org/html/rfc8446#section-5.1) | | _C_ | _22_ |\n| | MUST NOT be interleaved with other record types | _C_ | _22_ |\n| | MUST NOT span key changes | _C_ | _22_ |\n| | MUST NOT send zero-length fragments | _C_ | _22_ |\n| | Alert messages MUST NOT be fragmented | _C_ | _22_ |\n| [5\\.2. Record Payload Protection](https://tools.ietf.org/html/rfc8446#section-5.2) | | _C_ | _22_ |\n| [5\\.3. Per-Record Nonce](https://tools.ietf.org/html/rfc8446#section-5.3) | | _C_ | _22_ |\n| [5\\.4. Record Padding](https://tools.ietf.org/html/rfc8446#section-5.4) | | _PC_ | _22_ |\n| | MAY choose to pad | _NC_ | |\n| | MUST NOT send Handshake and Alert records that have a zero-length TLSInnerPlaintext.content | _NC_ | |\n| | The padding sent is automatically verified | _C_ | _22_ |\n| [5\\.5. Limits on Key Usage](https://tools.ietf.org/html/rfc8446#section-5.5) | | _C_ | _22\\.3_ |\n| [6\\.1. Closure Alerts](https://tools.ietf.org/html/rfc8446#section-6.1) | | _22_ | |\n| | close_notify | _C_ | _22_ | |\n| | user_cancelled | _C_ | _22_ | |\n| [6\\.2. Error Alerts](https://tools.ietf.org/html/rfc8446#section-6.2) | | _PC_ | _22_ |\n| [7\\.1. Key Schedule](https://tools.ietf.org/html/rfc8446#section-7.1) | | _C_ | _22_ |\n| [7\\.2. Updating Traffic Secrets](https://tools.ietf.org/html/rfc8446#section-7.2) | | _C_ | _22_ |\n| [7\\.3. Traffic Key Calculation](https://tools.ietf.org/html/rfc8446#section-7.3) | | _C_ | _22_ |\n| [7\\.5. Exporters](https://tools.ietf.org/html/rfc8446#section-7.5) | | _PC_ | _26\\.3_ |\n| [8\\. 0-RTT and Anti-Replay](https://tools.ietf.org/html/rfc8446#section/8) | | _C_ | _22\\.2_ |\n| [8\\.1. Single-Use Tickets](https://tools.ietf.org/html/rfc8446#section-8.1) | | _C_ | _22\\.2_ |\n| [8\\.2. Client Hello Recording](https://tools.ietf.org/html/rfc8446#section-8.2) | | _C_ | _22\\.2_ |\n| [8\\.3. Freshness Checks](https://tools.ietf.org/html/rfc8446#section-8.3) | | _C_ | _22\\.2_ |\n| [9\\.1. Mandatory-to-Implement Cipher Suites](https://tools.ietf.org/html/rfc8446#section-9.1) | | _C_ | _22\\.1_ |\n| | MUST implement the TLS_AES_128_GCM_SHA256 | _C_ | _22_ |\n| | SHOULD implement the TLS_AES_256_GCM_SHA384 | _C_ | _22_ |\n| | SHOULD implement the TLS_CHACHA20_POLY1305_SHA256 | _C_ | _22_ |\n| | _Digital signatures_ | _C_ | _22\\.1_ |\n| | MUST support rsa_pkcs1_sha256 (for certificates) | _C_ | _22_ |\n| | MUST support rsa_pss_rsae_sha256 (for CertificateVerify and certificates) | _C_ | _22_ |\n| | MUST support ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | _Key Exchange_ | _C_ | _22_ |\n| | MUST support key exchange with secp256r1 | _C_ | _22_ |\n| | SHOULD support key exchange with X25519 | _C_ | _22_ |\n| [9\\.2. Mandatory-to-Implement Extensions](https://tools.ietf.org/html/rfc8446#section-9.2) | | _C_ | _23\\.2_ |\n| | Supported Versions | _C_ | _22_ |\n| | Cookie | _C_ | _23\\.1_ |\n| | Signature Algorithms | _C_ | _22_ |\n| | Signature Algorithms Certificate | _C_ | _22_ |\n| | Negotiated Groups | _C_ | _22_ |\n| | Key Share | _C_ | _22_ |\n| | Server Name Indication | _C_ | _23\\.2_ |\n| | _MUST send and use these extensions_ | _C_ | _22\\.2_ |\n| | \"supported_versions\" is REQUIRED for ClientHello, ServerHello and HelloRetryRequest | _C_ | _22\\.1_ |\n| | \"signature_algorithms\" is REQUIRED for certificate authentication | _C_ | _22_ |\n| | \"supported_groups\" is REQUIRED for ClientHello messages using (EC)DHE key exchange | _C_ | _22_ |\n| | \"key_share\" is REQUIRED for (EC)DHE key exchange | _C_ | _22_ |\n| | \"pre_shared_key\" is REQUIRED for PSK key agreement | _C_ | _22\\.2_ |\n| | \"psk_key_exchange_modes\" is REQUIRED for PSK key agreement | _C_ | _22\\.2_ |\n| | _TLS 1.3 ClientHello_ | _C_ | _22\\.1_ |\n| | If not containing a \"pre_shared_key\" extension, it MUST contain both a \"signature_algorithms\" extension and a \"supported_groups\" extension. | _C_ | _22\\.1_ |\n| | If containing a \"supported_groups\" extension, it MUST also contain a \"key_share\" extension, and vice versa. An empty KeyShare.client_shares vector is permitted. | _C_ | _22\\.1_ |\n| | _TLS 1.3 ServerHello_ | _C_ | _23\\.2_ |\n| | MUST support the use of the \"server_name\" extension | _C_ | _23\\.2_ |\n| [9\\.3. Protocol Invariants](https://tools.ietf.org/html/rfc8446#section-9.3) | | _C_ | _22\\.1_ |\n| | _MUST correctly handle extensible fields_ | _C_ | _22\\.1_ |\n| | A client sending a ClientHello MUST support all parameters advertised in it. Otherwise, the server may fail to interoperate by selecting one of those parameters. | _C_ | _22\\.1_ |\n| | A server receiving a ClientHello MUST correctly ignore all unrecognized cipher suites, extensions, and other parameters. Otherwise, it may fail to interoperate with newer clients. In TLS 1.3, a client receiving a CertificateRequest or NewSessionTicket MUST also ignore all unrecognized extensions. | _C_ | _22\\.1_ |\n| | A middlebox which terminates a TLS connection MUST behave as a compliant TLS server | _NA_ | |\n| | A middlebox which forwards ClientHello parameters it does not understand MUST NOT process any messages beyond that ClientHello. It MUST forward all subsequent traffic unmodified. Otherwise, it may fail to interoperate with newer clients and servers. | _NA_ | |\n| [B.4. Cipher Suites](https://tools.ietf.org/html/rfc8446#section-B.4) | | _C_ | _23_ |\n| | TLS_AES_128_GCM_SHA256 | _C_ | _22_ |\n| | TLS_AES_256_GCM_SHA384 | _C_ | _22_ |\n| | TLS_CHACHA20_POLY1305_SHA256 | _C_ | _22_ |\n| | TLS_AES_128_CCM_SHA256 | _C_ | _22_ |\n| | TLS_AES_128_CCM_8_SHA256 | _C_ | _23_ |\n| [C.1. Random Number Generation and Seeding](https://tools.ietf.org/html/rfc8446#section-C.1) | | _C_ | _22_ |\n| [C.2. Certificates and Authentication](https://tools.ietf.org/html/rfc8446#section-C.2) | | _C_ | _22_ |\n| [C.3. Implementation Pitfalls](https://tools.ietf.org/html/rfc8446#section-C.3) | | _PC_ | _22_ |\n| [C.4. Client Tracking Prevention](https://tools.ietf.org/html/rfc8446#section-C.4) | | _C_ | _22\\.2_ |\n| [C.5. Unauthenticated Operation](https://tools.ietf.org/html/rfc8446#section-C.5) | | _C_ | _22_ |\n| [D.1. Negotiating with an Older Server](https://tools.ietf.org/html/rfc8446#section-D.1) | | _C_ | _22\\.2_ |\n| [D.2. Negotiating with an Older Client](https://tools.ietf.org/html/rfc8446#section-D.2) | | _C_ | _22_ |\n| [D.3. 0-RTT Backward Compatibility](https://tools.ietf.org/html/rfc8446#section-D.3) | | _NC_ | |\n| [D.4. Middlebox Compatibility Mode](https://tools.ietf.org/html/rfc8446#section-D.4) | | _C_ | _23_ |\n| [D.5. Security Restrictions Related to Backward Compatibility](https://tools.ietf.org/html/rfc8446#section-D.5) | | _C_ | _22_ |\n\n_Table: Standards Compliance_","title":"TLS 1.3 - Standards Compliance","ref":"standards_compliance.html#tls-1-3"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-731AC49D.js b/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-731AC49D.js new file mode 100644 index 0000000000000..a659c8c2a5812 --- /dev/null +++ b/prs/8803/lib/ssl-11.2.1/doc/html/dist/search_data-731AC49D.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","doc":"Interface functions for TLS (Transport Layer Security)\nand DTLS (Datagram Transport Layer Security).\n\n> #### Note {: .info }\nThe application's name is still SSL because the first versions of the\nTLS protocol were named SSL (Secure Socket Layer). However, no version\nof the old SSL protocol is supported by this application.\n\nExample:\n```erlang\n1> ssl:start(), ssl:connect(\"google.com\", 443, [{verify, verify_peer},\n {cacerts, public_key:cacerts_get()}]).\n{ok,{sslsocket, [...]}}\n```\n\nSee [Examples](using_ssl.md) for detailed usage and more examples of\nthis API.\n\nSpecial Erlang node configuration for the application can be found in\n[SSL Application](ssl_app.md).","title":"ssl","ref":"ssl.html"},{"type":"function","doc":"Make `Deferred` suites become the least preferred suites.\n\nThe `Deferred` suites will be put at the end of the cipher suite list\n`Suites` after removing them from `Suites` if present. `Deferred` can\nbe a list of cipher suites or a list of filters in which case the\nfilters are used on `Suites` to extract the deferred cipher list.","title":"ssl.append_cipher_suites/2","ref":"ssl.html#append_cipher_suites/2"},{"type":"function","doc":"Lists all available cipher suites corresponding to `Description`.\n\nThe `exclusive` and `exclusive_anonymous` option will exclusively\nlist cipher suites first supported in `Version`, whereas the other options are\ninclusive from the lowest possible version to `Version`. The `all` option\nincludes all suites except anonymous suites. No anonymous suites are supported\nby default.\n\n> #### Note {: .info }\n>\n> TLS-1.3 has no overlapping cipher suites with previous TLS versions, meaning that\n> the result of [`cipher_suites(all, 'tlsv1.3')`](`cipher_suites/2`) contains a separate\n> set of suites that can be used with TLS-1.3 and another set that can be used if a lower\n> version is negotiated. The so-called `PSK` and `SRP` suites (prior to TLS-1.3)\n> need extra configuration to work; namely the option `user_lookup_function`. No\n> anonymous suites are supported by TLS-1.3.\n>\n> Also note that the cipher suites returned by this function are the cipher\n> suites that the OTP SSL application can support provided that they are\n> supported by the crypto library linked with the OTP Crypto application. Use\n> [`ssl:filter_cipher_suites(Suites, [])`](`filter_cipher_suites/2`) to filter\n> the list for the current crypto library. Note that cipher suites may be filtered\n> out because they are too old or too new depending on the crypto library.","title":"ssl.cipher_suites/2","ref":"ssl.html#cipher_suites/2"},{"type":"function","doc":"Equivalent to `cipher_suites/2`, but lists RFC or OpenSSL string names instead of\n[`erl_cipher_suite()`](`t:erl_cipher_suite/0`).","title":"ssl.cipher_suites/3","ref":"ssl.html#cipher_suites/3"},{"type":"function","doc":"Clears the PEM cache.\n\nPEM files, used by SSL API-functions, are cached for performance\nreasons. The cache is automatically checked at regular intervals to\ndetermine whether any cache entries should be invalidated.\n\nThis function provides a way to unconditionally clear the entire cache, thereby\nforcing a reload of previously cached PEM files.","title":"ssl.clear_pem_cache/0","ref":"ssl.html#clear_pem_cache/0"},{"type":"function","doc":"Closes a TLS/DTLS connection.","title":"ssl.close/1","ref":"ssl.html#close/1"},{"type":"function","doc":"Closes or downgrades a TLS connection.\n\nIn the latter case the transport connection will be handed over to the\n`NewController` process after receiving the TLS close alert from the\npeer. The returned transport socket will have the following options\nset: `[{active, false}, {packet, 0}, {mode, binary}]`.\n\nIn case of downgrade, the close function might return some binary data that\nshould be treated by the user as the first bytes received on the downgraded\nconnection.","title":"ssl.close/2","ref":"ssl.html#close/2"},{"type":"function","doc":"","title":"ssl.connect/2","ref":"ssl.html#connect/2"},{"type":"function","doc":"Opens a TLS/DTLS connection.\n\n```erlang\nconnect(TCPSocket, TLSOptions, Timeout).\n```\n\nUpgrades a `gen_tcp` (or equivalent) connected socket to a TLS socket by\nperforming the client-side TLS handshake.\n\n\n```erlang\nconnect(Host, Port, TLSOptions).\n```\n\nOpens a TLS/DTLS connection to `Host`, `Port`. This call is equivalent to:\n\n```erlang\nconnect(Host, Port, TLSOptions, infinity).\n```","title":"ssl.connect/3","ref":"ssl.html#connect/3"},{"type":"function","doc":"Opens a TLS/DTLS connection to `Host`, `Port`.\n\nWhen the `verify` option is set to `verify_peer`, the\n`public_key:pkix_verify_hostname/2` check will be performed in addition to the usual\nX.509-path validation checks. If the check fails, the error `{bad_cert,\nhostname_check_failed}` will be propagated to the path validation fun,\nwhere it is possible to do customized checks\nby using the full possibilities of the `public_key:pkix_verify_hostname/3` API.\nWhen the `server_name_indication` option is provided, its value (the DNS name)\nwill be used as `ReferenceID` to `public_key:pkix_verify_hostname/2`. When no\n`server_name_indication` option is given, the `Host` argument will be used as\nServer Name Indication extension. The `Host` argument will also be used for the\n`public_key:pkix_verify_hostname/2` check. If the `Host` argument is an\n[`inet:ip_address()`](`t:inet:ip_address/0`) the `ReferenceID` used for the\ncheck will be `{ip, Host}`; otherwise `dns_id` will be assumed with a fallback to\n`ip` if that fails.\n\n> #### Note {: .info }\n>\n> According to good practices, certificates should not use IP addresses as\n> \"server names\", especially outside a closed network.\n\nIf the `{handshake, hello}` option is used, the handshake is paused after\nreceiving the server hello message and the success response is\n`{ok, SslSocket, Ext}` instead of `{ok, SslSocket}`. Thereafter the handshake is\ncontinued or canceled by calling `handshake_continue/3` or `handshake_cancel/1`.\n\nIf the `active` option is set to `once`, `true`, or an integer value, the process\nowning the SSL socket will receive messages of type\n[`active_msgs()`](`t:active_msgs/0`).","title":"ssl.connect/4","ref":"ssl.html#connect/4"},{"type":"function","doc":"Returns the most relevant information about the connection.\n\nSome items that are undefined will be filtered out. No values\nthat affect the security of the connection will be returned.\n\n> #### Note {: .info }\n>\n> The legacy `cipher_suite` item was removed in OTP 23. Previously it returned\n> the cipher suite in its (undocumented) legacy format. It is replaced by\n> `selected_cipher_suite`.","title":"ssl.connection_information/1","ref":"ssl.html#connection_information/1"},{"type":"function","doc":"Returns the requested information items about the connection if they are\ndefined.\n\nNote that the values for `client_random`, `server_random`, `master_secret`, and `keylog`\naffect the security of connection.\n\nIn order to retrieve `keylog` and other secret information from a TLS 1.3\nconnection, the `keep_secrets` option must be configured in advance and\nset to `true`.\n\n> #### Note {: .info }\n>\n> If only undefined options are requested the resulting list can be empty.","title":"ssl.connection_information/2","ref":"ssl.html#connection_information/2"},{"type":"function","doc":"Assigns a new controlling process to the SSL socket.\n\nA controlling process is the owner of an SSL socket and receives all\nmessages from the socket.","title":"ssl.controlling_process/2","ref":"ssl.html#controlling_process/2"},{"type":"function","doc":"Returns a list of all supported elliptic curves, including legacy\ncurves, for all TLS/DTLS versions prior to TLS-1.3.","title":"ssl.eccs/0","ref":"ssl.html#eccs/0"},{"type":"function","doc":"Returns the elliptic curves supported by default for `Version`.\n\nThis is a subset of what `eccs/0` returns.","title":"ssl.eccs/1","ref":"ssl.html#eccs/1"},{"type":"function","doc":"","title":"ssl.export_key_materials/4","ref":"ssl.html#export_key_materials/4"},{"type":"function","doc":"Uses a Pseudo-Random Function (PRF prior to TLS-1.3) or a Key\nDerivation Function (HKDF in TLS-1.3) for a TLS connection to\ngenerate and export keying materials.\n\nIn TLS-1.3, using `no_context` is equivalent to specifying an empty\ncontext (an empty binary). Prior to TLS-1.3, `no_context` and an empty\ncontext will produce different results.\n\nThe `ConsumeSecret` argument is relevant only in TLS-1.3, causing the\nTLS-1.3 `exporter_master_secret` to be consumed, thereby making it\nunavailable and increasing security. Further attempts to call this\nfunction will fail.","title":"ssl.export_key_materials/5","ref":"ssl.html#export_key_materials/5"},{"type":"function","doc":"Removes cipher suites if any of the filter functions returns `false` for any part\nof the cipher suite.\n\nIf no filter function is supplied for some part, the default behavior\ntreats it as a filter function that returns `true`. For\nexamples, see [Customizing cipher suites\n](using_ssl.md#customizing-cipher-suites). Additionally, this function\nalso filters the cipher suites to exclude cipher suites not supported\nby the crypto library used by the OTP Crypto application, meaning that\n[`ssl:filter_cipher_suites(Suites, [])`](`filter_cipher_suites/2`)\nis equivalent to applying only the filters for crypto library support.","title":"ssl.filter_cipher_suites/2","ref":"ssl.html#filter_cipher_suites/2"},{"type":"function","doc":"Presents the error returned by an SSL function as a printable string.","title":"ssl.format_error/1","ref":"ssl.html#format_error/1"},{"type":"function","doc":"Gets the values of the specified socket options.","title":"ssl.getopts/2","ref":"ssl.html#getopts/2"},{"type":"function","doc":"Get statistics for the underlying socket.","title":"ssl.getstat/1","ref":"ssl.html#getstat/1"},{"type":"function","doc":"Get one or more statistic values for the underlying socket.\n\nSee `inet:getstat/2` for further details.","title":"ssl.getstat/2","ref":"ssl.html#getstat/2"},{"type":"function","doc":"Returns all supported groups in TLS 1.3.\n\nExisted since OTP 22.0; documented as of OTP 27.","title":"ssl.groups/0","ref":"ssl.html#groups/0"},{"type":"function","doc":"Returns default supported groups in TLS 1.3.\n\nExisted since OTP 22.0; documented as of OTP 27.","title":"ssl.groups/1","ref":"ssl.html#groups/1"},{"type":"function","doc":"","title":"ssl.handshake/1","ref":"ssl.html#handshake/1"},{"type":"function","doc":"Performs the TLS/DTLS server-side handshake.\n\nIf the second argument is a timeout value:\n\n```erlang\nhandshake(HsSocket, Timeout).\n```\n\nthis call is equivalent to:\n\n```erlang\nhandshake(HsSocket, [], Timeout).\n```\n\nOtherwise, if the second argument is a list of options:\n\n\n```erlang\nhandshake(HsSocket, Options).\n```\nthis call is equivalent to:\n\n```erlang\nhandshake(HsSocket, Options, infinity).\n```","title":"ssl.handshake/2","ref":"ssl.html#handshake/2"},{"type":"function","doc":"Performs the TLS/DTLS server-side handshake.\n\nReturns a new TLS/DTLS socket if the handshake is successful.\n\nIf `Socket` is a ordinary [`socket()`](`t:socket/0`), upgrades a\n`gen_tcp` or equivalent socket to an SSL socket by performing the\nTLS server-side handshake and returning a TLS socket.\n\n> #### Note {: .info }\nThe ordinary `Socket` must be in passive mode (`{active, false}`)\nbefore calling this function and before the client tries to connect\nwith TLS; otherwise, the behavior of this function is undefined. The\nbest way to ensure this is to create the ordinary listen socket in\npassive mode.\n\nIf `Socket` is an [`sslsocket()`](`t:sslsocket/0`), provides extra\nTLS/DTLS options to those specified in `listen/2` and then performs\nthe TLS/DTLS handshake. Returns a new TLS/DTLS socket if the handshake\nis successful.\n\n> #### Warning {: .warning }\nNot setting the timeout makes the server more vulnerable to Denial of\nService (DoS) attacks.\n\nIf option `{handshake, hello}` is specified the handshake is paused after\nreceiving the client hello message and the success response is\n`{ok, SslSocket, Ext}` instead of `{ok, SslSocket}`. Thereafter the handshake is\ncontinued or canceled by calling `handshake_continue/3` or `handshake_cancel/1`.\n\nIf option `active` is set to `once`, `true`, or an integer value, the process\nowning the [`sslsocket()`](`t:sslsocket/0`) will receive messages of type\n[`active_msgs()`](`t:active_msgs/0`).","title":"ssl.handshake/3","ref":"ssl.html#handshake/3"},{"type":"function","doc":"Cancel the handshake with a fatal `USER_CANCELED` alert.","title":"ssl.handshake_cancel/1","ref":"ssl.html#handshake_cancel/1"},{"type":"function","doc":"","title":"ssl.handshake_continue/2","ref":"ssl.html#handshake_continue/2"},{"type":"function","doc":"Continue the TLS handshake, possibly with new, additional, or changed options.","title":"ssl.handshake_continue/3","ref":"ssl.html#handshake_continue/3"},{"type":"function","doc":"Creates an SSL listen socket.","title":"ssl.listen/2","ref":"ssl.html#listen/2"},{"type":"function","doc":"Returns the protocol negotiated through ALPN or NPN extensions.","title":"ssl.negotiated_protocol/1","ref":"ssl.html#negotiated_protocol/1"},{"type":"function","doc":"The peer certificate is returned as a DER-encoded binary.\n\nThe certificate can be\ndecoded with `public_key:pkix_decode_cert/2`. Suggested further reading about\ncertificates is [Public_Key User's Guide](`e:public_key:public_key_records.md`)\nand [SSL User's Guide](standards_compliance.md).","title":"ssl.peercert/1","ref":"ssl.html#peercert/1"},{"type":"function","doc":"Returns the address and port number of the peer.","title":"ssl.peername/1","ref":"ssl.html#peername/1"},{"type":"function","doc":"Make `Preferred` suites become the most preferred suites.\n\nThe `Preferred` suites will be put at the head of the cipher suite\nlist `Suites` after removing them from `Suites` if\npresent. `Preferred` can be a list of cipher suites or a list of\nfilters in which case the filters are used on `Suites` to extract the\npreferred cipher list.","title":"ssl.prepend_cipher_suites/2","ref":"ssl.html#prepend_cipher_suites/2"},{"type":"function","doc":"Uses the Pseudo-Random Function (PRF) of a TLS session to generate extra key\nmaterial.\n\nIt either takes user-generated values for `Secret` and `Seed` or atoms\ndirecting it to use a specific value from the session security parameters.\n\n> #### Note {: .info }\n\nThis function is replaced by `export_key_materials/4`, the officially\ndocumented API function since OTP 27, which is equivalent to\n[`prf(TLSSocket, master_secret, Label, [client_random, server_random,\nContext], WantedLength)`](`prf/5`). Other ways of calling this\nfunction were for testing purposes only and has no use case. When\ncalled in a TLS-1.3 context it will now behave as\n[`export_key_materials(TLSSocket, [Label], [Context],\n[WantedLength])`](`export_key_materials/4`).","title":"ssl.prf/5","ref":"ssl.html#prf/5"},{"type":"function","doc":"","title":"ssl.recv/2","ref":"ssl.html#recv/2"},{"type":"function","doc":"Receives a packet from a socket in passive mode.\n\nA closed socket is indicated by return value `{error, closed}`.\nArgument `Length` is meaningful only when the socket is in mode `raw`\nand denotes the number of bytes to read. If `Length` is zero, all\navailable bytes are returned. If `Length` is greater than zero,\nexactly `Length` bytes are returned, or an error; possibly discarding\nless than `Length` bytes of data when the socket gets closed from\nthe other side.\n\nOptional argument `Timeout` specifies a time-out in milliseconds. The default\nvalue is `infinity`.","title":"ssl.recv/3","ref":"ssl.html#recv/3"},{"type":"function","doc":"Initiates a new handshake.\n\nA notable return value is `{error, renegotiation_rejected}` indicating\nthat the peer refused to go through with the renegotiation, but the\nconnection is still active using the previously negotiated session.\n\nTLS-1.3 has removed the renegotiation feature from earlier TLS\nversions and instead adds a new feature called key update, which\nreplaces the most important part of renegotiation: the refreshing of\nsession keys. This is triggered automatically after reaching a\nplaintext limit and can be configured using the `key_update_at` option\nin `t:common_option_tls13/0`.","title":"ssl.renegotiate/1","ref":"ssl.html#renegotiate/1"},{"type":"function","doc":"Writes `Data` to `SslSocket`.\n\nA notable return value is `{error, closed}` indicating that the socket is\nclosed.","title":"ssl.send/2","ref":"ssl.html#send/2"},{"type":"function","doc":"Sets options according to `Options` for socket `SslSocket`.","title":"ssl.setopts/2","ref":"ssl.html#setopts/2"},{"type":"function","doc":"Immediately closes a socket in one or two directions.\n\n`How == write` means closing the socket for writing, but reading from\nit is still possible.\n\nTo handle siutations where the peer has performed a shutdown on the\nwrite side, option `{exit_on_close, false}` is useful.","title":"ssl.shutdown/2","ref":"ssl.html#shutdown/2"},{"type":"function","doc":"Lists all available signature algorithms corresponding to `Description`.\n\nThe `exclusive` option will exclusively list algorithms or algorithm schemes for\nthat protocol version, whereas the `default` and `all` options lists the\ncombined list to support the range of protocols from (D)TLS-1.2, the first\nversion to support configuration of the signature algorithms, to `Version`.\n\nExample:\n\n```erlang\n1> ssl:signature_algs(default, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\nrsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,\n{sha512,ecdsa},\n{sha384,ecdsa},\n{sha256,ecdsa}]\n\n2> ssl:signature_algs(all, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\nrsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,\n{sha512,ecdsa},\n{sha384,ecdsa},\n{sha256,ecdsa},\n{sha224,ecdsa},\n{sha224,rsa},\n{sha,rsa},\n{sha,dsa}]\n\n3> ssl:signature_algs(exclusive, 'tlsv1.3').\n[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\nrsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256]\n```\n\n> #### Note {: .info }\n>\n> Some TLS-1-3 scheme names overlap with TLS-1.2 algorithm-tuple-pair-names and\n> then TLS-1.3 names will be used, for example `rsa_pkcs1_sha256` instead of\n> `{sha256, rsa}`. These are legacy algorithms in TLS-1.3 that apply only to\n> certificate signatures in this version of the protocol.","title":"ssl.signature_algs/2","ref":"ssl.html#signature_algs/2"},{"type":"function","doc":"Returns the local address and port number of socket `SslSocket`.","title":"ssl.sockname/1","ref":"ssl.html#sockname/1"},{"type":"function","doc":"","title":"ssl.start/0","ref":"ssl.html#start/0"},{"type":"function","doc":"Starts the SSL application.","title":"ssl.start/1","ref":"ssl.html#start/1"},{"type":"function","doc":"Stops the SSL application.","title":"ssl.stop/0","ref":"ssl.html#stop/0"},{"type":"function","doc":"Converts an RFC or OpenSSL name string to an `t:erl_cipher_suite/0`\n\nReturns an error if the cipher suite is not supported or the name is\nnot a valid cipher suite name.","title":"ssl.str_to_suite/1","ref":"ssl.html#str_to_suite/1"},{"type":"function","doc":"Converts an [`erl_cipher_suite()`](`t:erl_cipher_suite/0`) value to\nan OpenSSL name string.\n\nPRE TLS-1.3 these names differ for RFC names","title":"ssl.suite_to_openssl_str/1","ref":"ssl.html#suite_to_openssl_str/1"},{"type":"function","doc":"Converts an [`erl_cipher_suite()`](`t:erl_cipher_suite/0`) value to an RFC\nname string.","title":"ssl.suite_to_str/1","ref":"ssl.html#suite_to_str/1"},{"type":"function","doc":"","title":"ssl.transport_accept/1","ref":"ssl.html#transport_accept/1"},{"type":"function","doc":"Accepts an incoming connection request on a listen socket.\n\n`ListenSocket` must be a socket returned from `listen/2`. The socket\nreturned is to be passed to [`handshake/1,2,3`](`handshake/3`) to\ncomplete the handshake and establish the TLS/DTLS connection.\n\n> #### Warning {: .warning }\n>\n> Most API functions require that the TLS/DTLS connection is established to work\n> as expected.\n\nThe accepted socket inherits the options set for `ListenSocket` in `listen/2`.\n\nThe default value for `Timeout` is `infinity`. If `Timeout` is specified and no\nconnection is accepted within the given time, `{error, timeout}` is returned.","title":"ssl.transport_accept/2","ref":"ssl.html#transport_accept/2"},{"type":"function","doc":"Create new session keys.\n\nThere are cryptographic limits on the amount of plaintext which can be safely\nencrypted under a given set of keys. If the amount of data surpasses those\nlimits, a key update is triggered and a new set of keys are installed. See also\nthe `key_update_at` option in `t:common_option_tls13/0`.\n\nThis function can be used to explicitly start a key update on a TLS-1.3\nconnection. There are two types of key updates: if `Type` is `write`,\nonly the writing key is updated; if `Type` is `read_write`, both the\nreading and writing keys are updated.","title":"ssl.update_keys/2","ref":"ssl.html#update_keys/2"},{"type":"function","doc":"Lists information, mainly concerning TLS/DTLS versions, in runtime for debugging\nand testing purposes.\n\n- **`app_vsn`** - The application version of the SSL application.\n\n- **`supported`** - TLS versions supported with current application environment\n and crypto library configuration. Overridden by a version option on\n [`connect/2,3,4`](`connect/2`), `listen/2`, and\n [`handshake/2,3`](`handshake/2`). For the negotiated TLS version, see\n [`connection_information/1`](`connection_information/1`).\n\n- **`supported_dtls`** - DTLS versions supported with current application\n environment and crypto library configuration. Overridden by a version option\n on [`connect/2,3,4`](`connect/2`), `listen/2`, and\n [`handshake/2,3`](`handshake/2`). For the negotiated DTLS version, see\n [`connection_information/1`](`connection_information/1`).\n\n- **`available`** - All TLS versions supported with the linked crypto library.\n\n- **`available_dtls`** - All DTLS versions supported with the linked crypto\n library.\n\n- **`implemented`** - All TLS versions supported by the SSL application if\n linked with a crypto library with the necessary support.\n\n- **`implemented_dtls`** - All DTLS versions supported by the SSL application if\n linked with a crypto library with the necessary support.","title":"ssl.versions/0","ref":"ssl.html#versions/0"},{"type":"type","doc":"The type for the messages that are delivered to the owner of a\nTLS/DTLS socket in active mode.\n\nThe `ssl_passive` message is sent only when the socket is in `{active, N}` mode\nand the counter has dropped to 0. It indicates that the socket has transitioned\nto passive (`{active, false}`) mode.","title":"ssl.active_msgs/0","ref":"ssl.html#t:active_msgs/0"},{"type":"type","doc":"Claim an intermediate CA in the chain as trusted.\n\n```erlang\nfun(Chain::[public_key:der_encoded()]) ->\n {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.\n```\n\nTLS then uses `public_key:pkix_path_validation/3` with the selected CA\nas the trusted anchor and verifies the rest of the chain.","title":"ssl.anchor_fun/0","ref":"ssl.html#t:anchor_fun/0"},{"type":"type","doc":"Configuration of the entity certificate and its corresponding key.\n\nA certificate (or possibly a list including the certificate and its\nchain certificates, where the entity certificate must be the first\nelement in the list or the first entry in the file) and its associated\nkey. For the PEM file format, there can also be a password associated\nwith the file containing the key.\n\nFor maximum interoperability, the certificates in the chain should be\nin the correct order, as the chain will be sent as-is to the peer. If\nchain certificates are not provided, certificates from the configured\ntrusted CA certificates will be used to construct the chain. See\n[`client_option_cert()`](`t:client_option_cert/0`) and\n[`server_option_cert()`](`t:server_option_cert/0`) for more\ninformation.","title":"ssl.cert_key_conf/0","ref":"ssl.html#t:cert_key_conf/0"},{"type":"type","doc":"Cipher algorithms that can be used for payload encryption.","title":"ssl.cipher/0","ref":"ssl.html#t:cipher/0"},{"type":"type","doc":"Filter that allows you to customize cipher suite list.","title":"ssl.cipher_filters/0","ref":"ssl.html#t:cipher_filters/0"},{"type":"type","doc":"A list of cipher suites that should be supported.\n\nFunction [ssl:cipher_suites/2 ](`cipher_suites/2`) can be used to find all\ncipher suites that are supported by default and all cipher suites that can be\nconfigured.\n\nIf you compose your own `t:cipher_suites/0` make sure they are\nfiltered for crypto library support using [ssl:filter_cipher_suites/2\n](`filter_cipher_suites/2`).\n\nThe following function can help creating customized cipher suite lists:\n\n- [ssl:append_cipher_suites/2 ](`append_cipher_suites/2`)\n- [ssl:prepend_cipher_suites/2](`prepend_cipher_suites/2`)\n- [ssl:suite_to_str/1](`suite_to_str/1`)\n- [ssl:str_to_suite/1](`str_to_suite/1`)\n- [ssl:suite_to_openssl_str/1](`suite_to_openssl_str/1`)\n\n> #### Note {: .info }\nNote that TLS-1.3 and TLS-1.2 use different sets of cipher suites. To\nsupport both versions, cipher suites from both sets need to be\nincluded. If the supplied list does not comply with the configured\nversions or crypto library, that is, resulting in an empty list, the option\nwill fall back to its appropriate default value for the configured\nversions.\n\nNon-default cipher suites, including anonymous cipher suites (prior to\nTLS 1.3), are supported for interoperability and testing\npurposes. These can be used by adding them to your cipher suite\nlist. Note that they also need to be supported and enabled by the peer\nto be actually used, and they may require additional configuration;\nsee [`srp_param_type()`](`t:srp_param_type/0`).","title":"ssl.cipher_suites/0","ref":"ssl.html#t:cipher_suites/0"},{"type":"type","doc":"Cipher suite formats.\n\nFor backwards compatibility, cipher suites can be configured as a\ncolon-separated string of cipher suite RFC names (or even old OpenSSL\nnames). However, a more flexible approach is to use utility functions\ntogether with [`cipher_filters()`](`t:cipher_filters/0`) if a customized\ncipher suite option is needed.","title":"ssl.ciphers/0","ref":"ssl.html#t:ciphers/0"},{"type":"type","doc":"The following options are specific to the client side, or have\ndifferent semantics for the client and server:\n\n- **`{alpn_advertised_protocols, AppProtocols}`** - Application layer protocol\n\n The list of protocols supported by the client to be sent to the server to be\n used for an Application-Layer Protocol Negotiation (ALPN). If the server\n supports ALPN, it will choose a protocol from this list; otherwise it will\n fail the connection with a `no_application_protocol` alert. A server that does\n not support ALPN will ignore this value. The list of protocols must not contain\n an empty binary.\n\n- **`{max_fragment_length, MaxLen}`** - Max fragment length extension\n\n Specifies the maximum fragment length the client is prepared to accept from the\n server. See [RFC 6066](http://www.ietf.org/rfc/rfc6066.txt).","title":"ssl.client_option/0","ref":"ssl.html#t:client_option/0"},{"type":"type","doc":"Certificate-related options specific to the client side, or with\ndifferent semantics for the client and server.\n\n- **`{verify, Verify}`** - Verification of certificates\n\n This option specifies whether certificates are to be verified.\n\n If `Verify` is `verify_peer`, which is the default, it is required\n to also provide one of the options `cacerts` or `cacertfile` in\n order for the certificate verification to succeed. For example, an\n HTTPS client can use option `{cacerts, public_key:cacerts_get()}` to\n use the trusted CA certificates provided by the operating system.\n\n If `Verify` is `verify_none`, all X.509-certificate path\n validation errors will be ignored.\n\n > #### Change {: .info }\n >\n > The default for `Verify` was changed to `verify_peer` in\n > Erlang/OTP 26.\n\n- **`{cacerts, CACerts}`** - Trusted certificates\n\n The DER-encoded trusted certificates. If this option is supplied it overrides\n option `cacertfile`.\n\n Function `public_key:cacerts_get/0` can be used to retrieve to the\n trusted CA certificates provided by the operating system.\n\n- **`{cacertfile, CertFile}`** - End entity certificate\n\n Path to a file containing PEM-encoded CA certificates. The CA certificates are\n used during server authentication and when building the client certificate\n chain.\n\n > #### Note {: .info }\n >\n > When PEM caching is enabled, files provided with this option will be checked\n > for updates at fixed time intervals specified by the\n > [ssl_pem_cache_clean](ssl_app.md#configuration) environment parameter.\n\n\n- **`{server_name_indication, SNI}`** - Server Name Indication extension\n\n Specify the hostname to be used in TLS Server Name Indication extension. If not\n specified it will default to the `Host` argument of\n [connect/3,4](`connect/3`) unless it is of type [`inet:ip_address()`](`t:inet:ip_address/0`).\n The hostname will also be used in the hostname verification of the peer\n certificate using `public_key:pkix_verify_hostname/2`.\n The special value `disable` prevents the Server Name Indication extension from\n being sent and disables the hostname verification check.\n\n- **`{customize_hostname_check, HostNameCheckOpts}`** - Customization option\n\n Customizes the hostname verification of the peer certificate, as various\n protocols that use TLS, such as HTTP or LDAP, may require different approaches. For\n example, here is how to use standard hostname checking for HTTPS implemented in\n [Public_Key](`e:public_key:public_key_app.md`):\n\n ```erlang\n {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}\n ```\n\n For futher description of the customize options, see\n `public_key:pkix_verify_hostname/3`.\n\n- **`{client_certificate_authorities, UseCertAuth}`** - Inter-op hint option\n\n If `UseCertAuth` is set to `true`, sends the certificate authorities\n extension in the TLS-1.3 client hello. The default is `false`. Note\n that setting `UseCertAuth` to `true` can result in a significant\n overhead if there exists many trusted CA certificates. (Since\n Erlang/OTP 24.3.)\n\n- **`{stapling, Stapling}`** - Certificate revocation check option\n\n If `Stapling` is atom `staple` or a map, OCSP stapling will be\n enabled, meaning that an extension of type \"status_request\" will be\n included in the client hello to indicate the desire to receive\n certificate status information.\n\n If `Stapling` is set to `no_staple` (the default), OCSP stapling will be disabled.\n\n > #### Note {: .info }\n >\n > Even if requested by the client, the OCSP response might not be\n > provided by the server. In such event, SSL will proceed with\n > the handshake and generate a `{missing, stapling_response}` logger\n > event.\n\n When `Stapling` is given as a map, boolean `ocsp_nonce` key can\n indicate whether an OCSP nonce should be requested by the client\n (default is `false`).\n\n > #### Note {: .info }\n >\n > The OCSP response can be provided without a nonce value — even if it was requested\n > by the client. In such cases SSL will proceed with the handshake and generate\n > a `{missing, ocsp_nonce}` logger event.","title":"ssl.client_option_cert/0","ref":"ssl.html#t:client_option_cert/0"},{"type":"type","doc":"Legacy client options.\n\n- **`{client_preferred_next_protocols, NextAppProtocols}`** - Next Protocol Negotiation\n\n ALPN (Application-Layer Protocol Negotiation)\n deprecates NPN (Next Protocol Negotiation) and this option.\n\n Indicates that the client wants to perform Next Protocol Negotiation.\n\n If `Precedence` is `server`, the negotiated protocol is the first protocol to be\n shown on the server advertised list that is also on the client preference\n list.\n\n If `Precedence` is `client`, the negotiated protocol is the first protocol to be\n shown on the client preference list that is also on the server advertised\n list.\n\n If the client does not support any of the server advertised protocols or the\n server does not advertise any protocols, the client falls back to the first\n protocol in its list or to the default protocol (if a default is supplied). If\n the server does not support Next Protocol Negotiation, the connection terminates\n if no default protocol is supplied.","title":"ssl.client_option_legacy/0","ref":"ssl.html#t:client_option_legacy/0"},{"type":"type","doc":"Options only relevant to TLS versions prior to TLS-1.3.\n\n- **`{reuse_session, SessionRef}`** - Explicit session reuse\n\n Reuses a specific session.\n\n Since Erlang/OTP 21.3, if the session was saved earlier using option\n `{reuse_sessions, save}`, the session can be referred by its session ID.\n\n Since Erlang/OTP 22.3, the session can be explicitly specified by\n its session ID and associated data.\n\n See also\n [SSL User's Guide, Session Reuse pre TLS 1.3.](using_ssl.md#session-reuse-prior-to-tls-1-3)\n\n- **`{reuse_sessions, Reuse}`** - Enables later session reuse\n\n When `Reuse` is set to `save`, a new connection will be negotiated and saved for later\n reuse. The session ID can be fetched with `connection_information/2` and used\n with the client option `reuse_session`.\n\n When `Reuse` is set to `true`, automated session reuse will be\n performed, if possible. If a new session is created, and is unique in regard to previous\n stored sessions, it will be saved for possible later reuse.\n\n Since: OTP 21.3.\n\n- **`{psk_identity, PskID}`** - Option for use with PSK cipher suites\n\n Specifies the identity the client presents to the server. The matching secret is\n found by the fun given in the `user_lookup_fun` option.\n\n- **`{srp_identity, SrpID}`** - Option for use SRP cipher suites\n\n Specifies the username and password to use to authenticate to the server.\n\n- **`{fallback, LegacyFallback}`** - Inter-op legacy client option\n\n Send special cipher suite TLS_FALLBACK_SCSV to avoid an undesired TLS version\n downgrade. Defaults to `false`.\n\n > #### Warning {: .warning }\n >\n > This option is not needed in normal TLS usage and must not be used to\n > implement new clients. However, legacy clients that retries connections in the\n > following manner:\n >\n > `ssl:connect(Host, Port, [...{versions, ['tlsv2', 'tlsv1.1', 'tlsv1']}])`\n >\n > `ssl:connect(Host, Port, [...{versions, [tlsv1.1', 'tlsv1']}, {fallback, true}])`\n >\n > `ssl:connect(Host, Port, [...{versions, ['tlsv1']}, {fallback, true}])`\n >\n > can use it to avoid undesired TLS version downgrade. Note that\n > TLS_FALLBACK_SCSV must also be supported by the server for the prevention to\n > work.","title":"ssl.client_option_pre_tls13/0","ref":"ssl.html#t:client_option_pre_tls13/0"},{"type":"type","doc":"Options only relevant for TLS-1.3.\n\n- **`{session_tickets, SessionTickets}`** - Use of session tickets\n\n Configures the session ticket functionality. Allowed values are `disabled`,\n `manual`, and `auto`. If it is set to `manual` the client will send the ticket\n information to user process in a 3-tuple:\n\n ```erlang\n {ssl, session_ticket, {SNI, TicketData}}\n ```\n\n where `SNI` is the ServerNameIndication and `TicketData` is the extended ticket\n data that can be used in subsequent session resumptions.\n\n If it is set to `auto`, the client automatically handles received tickets and\n tries to use them when making new TLS connections (session resumption with\n pre-shared keys).\n\n Ticket lifetime, the number of tickets sent by the server, and the\n maximum number of tickets stored by the server in stateful mode are configured\n by [application variables](ssl_app.md#configuration).\n\n See also\n [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{use_ticket, Tickets}`**\n\n Configures the session tickets to be used for session resumption. It is a\n mandatory option in `manual` mode (`{session_tickets, manual}`).\n\n > #### Note {: .info }\n >\n > Session tickets are only sent to the user if option `session_tickets` is set to\n > `manual`\n >\n > This option is supported by TLS-1.3. See also\n > [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{early_data, EarlyData}`**\n\n Configures the early data to be sent by the client.\n\n To verify that the server has the intention to process the early\n data, the following tuple is sent to the user process:\n\n ```erlang\n {ssl, SslSocket, {early_data, Result}}\n ```\n\n where `Result` is either `accepted` or `rejected`.\n\n > #### Warning {: .warning }\n >\n > It is the responsibility of the user to handle rejected `EarlyData` and to\n > resend when appropriate.\n\n- **`{middlebox_comp_mode, MiddleBoxMode}`**\n\n Configures the middlebox compatibility mode for a TLS-1.3 connection.\n\n A significant number of middleboxes misbehave when a TLS-1.3\n connection is negotiated. Implementations can increase the chance of\n making connections through those middleboxes by adapting the TLS-1.3\n handshake to resemble that of a TLS-1.2 handshake.\n\n The middlebox compatibility mode is enabled (`true`) by default.","title":"ssl.client_option_tls13/0","ref":"ssl.html#t:client_option_tls13/0"},{"type":"type","doc":"Options common to both client and server side.\n\n- **`{protocol, Protocol}`** - Choose TLS or DTLS protocol for the transport layer security.\n\n Defaults to `tls`.\n\n- **`{handshake, Completion}`** - Possibly pause handshake at hello stage.\n\n Defaults to `full`. If `hello` is specified the handshake will pause\n after the hello message, allowing the user to make decisions based\n on hello extensions before continuing or aborting the handshake by\n calling `handshake_continue/3` or `handshake_cancel/1`.\n\n- **`{keep_secrets, KeepSecrets}`** - Configures a TLS 1.3 connection for keylogging.\n\n In order to retrieve keylog information on a TLS 1.3 connection, it must be\n configured in advance to keep `client_random` and various handshake secrets.\n\n The `keep_secrets` functionality is disabled (`false`) by default.\n\n Added in OTP 23.2.\n\n- **`{max_handshake_size, HandshakeSize}`** - Limit the acceptable handshake packet size.\n\n Used to limit the size of valid TLS handshake packets to avoid DoS\n attacks.\n\n Integer (24 bits, unsigned). Defaults to `256*1024`.\n\n- **`{hibernate_after, HibernateTimeout}`** - Hibernate inactive connection processes.\n\n When an integer-value is specified, the TLS/DTLS connection goes into hibernation\n after the specified number of milliseconds of inactivity, thus reducing its\n memory footprint. When not specified the process never goes into hibernation.\n\n- **`{log_level, Level}`** - Specifies the log level for a TLS/DTLS connection.\n\n Alerts are logged on `notice`\n level, which is the default level. The level `debug` triggers verbose logging of\n TLS/DTLS protocol messages. See also [SSL Application](ssl_app.md)\n\n- **`{receiver|sender_spawn_opts, SpawnOpts}`** - Configure erlang spawn opts.\n\n Configures spawn options of TLS sender and receiver processes.\n\n Setting up garbage collection options can be helpful for trade-offs between CPU\n usage and memory usage. See `erlang:spawn_opt/2`.\n\n For connections using Erlang distribution, the default sender option\n is `[...{priority, max}]`; this priority option cannot be changed. For all\n connections, `...link` is added to receiver and cannot be changed.","title":"ssl.common_option/0","ref":"ssl.html#t:common_option/0"},{"type":"type","doc":"Common certificate related options to both client and server.\n\n- **`{certs_keys, CertsKeys}`** - At least one certificate and key pair.\n\n A list of a certificate (or possible a certificate and its chain)\n and the associated key of the certificate that can be used to\n authenticate the client or the server. The certificate key pair that\n is considered best and matches negotiated parameters for the\n connection will be selected.\n\n The different signature algorithms are prioritized in the following\n order: `eddsa`, `ecdsa`, `rsa_pss_pss`, `rsa`, and `dsa`. If more\n than one key is supplied for the same signature algorithm, they will\n be prioritized by strength (except for _engine keys_; see the next\n paragraph). This offers flexibility to, for instance, configure a\n newer certificate that is expected to be used in most cases, and an\n older but acceptable certificate that will only be used to\n communicate with legacy systems. Note that there is a trade off\n between the induced overhead and the flexibility; thus, alternatives\n should be chosen for good reasons.\n\n _Engine keys_ will be favored over other keys. As engine keys cannot\n be inspected, supplying more than one engine key makes no sense.\n\n When this option is specified it overrides all single certificate\n and key options. For examples, see the [User's Guide](using_ssl.md).\n\n > #### Note {: .info }\n >\n > `eddsa` certificates are only supported by TLS-1.3 implementations that do not support `dsa`\n > certificates. `rsa_pss_pss` (RSA certificates using Probabilistic Signature\n > Scheme) are supported in TLS-1.2 and TLS-1.3, but some TLS-1.2 implementations\n > do not support `rsa_pss_pss`.\n\n- **`{depth, AllowedCertChainLen}`** - Limits the accepted number of certificates in the certificate chain.\n\n Maximum number of non-self-issued intermediate certificates that can follow the\n peer certificate in a valid certification path. So, if depth is 0 the PEER must\n be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA,\n ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default\n value is 10. Used to mitigate DoS attack possibilities.\n\n- **`{verify_fun, Verify}`** - Customize certificate path validation\n\n The verification fun is to be defined as follows:\n\n ```erlang\n fun(OtpCert :: #'OTPCertificate'{},\n Event, InitialUserState :: term()) ->\n\t{valid, UserState :: term()} |\n\t{fail, Reason :: term()} | {unknown, UserState :: term()}.\n\n fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),\n Event, InitialUserState :: term()) ->\n\t{valid, UserState :: term()} |\n\t{fail, Reason :: term()} | {unknown, UserState :: term()}.\n\n Types:\n Event = {bad_cert, Reason :: atom() |\n {revoked, atom()}} |\n\t\t{extension, #'Extension'{}} |\n valid |\n valid_peer\n ```\n\n The verification fun is called during the X.509-path validation when\n an error occurs or an extension unknown to the SSL application is\n encountered. It is also called when a certificate is considered\n valid by the path validation to allow access to each certificate in\n the path to the user application. It differentiates between the peer\n certificate and the CA certificates by using `valid_peer` or `valid`\n as `Event` argument to the verification fun. See the [Public_Key\n User's Guide](`e:public_key:public_key_records.md`) for definition\n of `#'OTPCertificate'{}` and `#'Extension'{}`.\n\n - If the verify callback fun returns `{fail, Reason}`, the verification process\n is immediately stopped, an alert is sent to the peer, and the TLS/DTLS\n handshake terminates.\n - If the verify callback fun returns `{valid, UserState}`, the verification\n process continues.\n - If the verify callback fun always returns `{valid, UserState}`, the TLS/DTLS\n handshake does not terminate regardless of verification failures, and the\n connection is established.\n - If called with an extension unknown to the user application, the fun is to\n return `{unknown, UserState}`.\n\n Note that if the fun returns `unknown` for an extension marked as critical,\n validation will fail.\n\n Default option `verify_fun` in `verify_peer mode`:\n\n ```erlang\n {fun(_, _, {bad_cert, _} = Reason, _) ->\n\t {fail, Reason};\n (_, _, {extension, _}, UserState) ->\n\t {unknown, UserState};\n (_, _, valid, UserState) ->\n\t {valid, UserState};\n (_, _, valid_peer, UserState) ->\n {valid, UserState}\n end, []}\n ```\n\n Default option `verify_fun` in mode `verify_none`:\n\n ```erlang\n {fun(_, _, {bad_cert, _}, UserState) ->\n\t {valid, UserState};\n (_, _, {extension, #'Extension'{critical = true}}, UserState) ->\n\t {valid, UserState};\n (_, _, {extension, _}, UserState) ->\n\t {unknown, UserState};\n (_, _, valid, UserState) ->\n\t {valid, UserState};\n (_, _, valid_peer, UserState) ->\n {valid, UserState}\n end, []}\n ```\n\n The possible path validation errors are given in the form `{bad_cert, Reason}`,\n where `Reason` is:\n\n - **`unknown_ca`**\n\n No trusted CA was found in the trusted store. The trusted\n CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust\n can be claimed for an intermediate CA (the trusted anchor does not have to be\n self-signed according to X-509) by using option `partial_chain`.\n\n - **`selfsigned_peer`**\n\n The chain consisted only of one self-signed certificate.\n\n - **`PKIX X-509-path validation error`**\n\n For possible reasons, see `public_key:pkix_path_validation/3`.\n\n- **`{cert_policy_opts, PolicyOpts}`** - Handle certificate policies.\n\n Configure X.509 certificate policy handling for the certificate path validation process;\n see [public_key:pkix_path_validation/3](`public_key:pkix_path_validation/3`) for\n more details.\n\n- **`{cerl_check, Check}`** - Handle certificate revocation lists.\n\n Perform CRL (Certificate Revocation List) verification\n [(public_key:pkix_crls_validate/3)](`public_key:pkix_crls_validate/3`) on all\n the certificates during the path validation\n [(public_key:pkix_path_validation/3) ](`public_key:pkix_path_validation/3`)of\n the certificate chain. `Check` defaults to `false`.\n\n The meaning of `Check` is as follows:\n\n - **`false`**\n\n No checks are performed.\n\n - **`peer`**\n\n Check is only performed on the peer certificate.\n\n - **`best_effort`**\n\n If certificate revocation status cannot be determined it will be accepted as valid.\n\n The CA certificates specified for the connection will be used to construct the\n certificate chain validating the CRLs.\n\n The CRLs will be fetched from a local or external cache. See\n `m:ssl_crl_cache_api`.","title":"ssl.common_option_cert/0","ref":"ssl.html#t:common_option_cert/0"},{"type":"type","doc":"Common options to client and server only valid for DTLS.\n\n- **`{use_srtp, UseSrtp}`** - Configures the `use_srtp` DTLS hello extension.\n\n In order to negotiate the use of SRTP data protection, clients include an\n extension of type \"use_srtp\" in the DTLS extended client hello. This extension\n MUST only be used when the data being transported is RTP or RTCP.\n\n The value is a map with a mandatory `protection_profiles` parameter\n and an optional `mki` parameter.\n\n `protection_profiles` configures the list of the client's acceptable SRTP\n Protection Profiles. Each profile is a 2-byte binary. Example:\n `#{protection_profiles => [<<0,2>>, <<0,5>>]}`\n\n `mki` configures the SRTP Master Key Identifier chosen by the client.\n\n The `srtp_mki` field contains the value of the SRTP MKI which is associated with\n the SRTP master keys derived from this handshake. Each SRTP session MUST have\n exactly one master key that is used to protect packets at any given time. The\n client MUST choose the MKI value so that it is distinct from the last MKI value\n that was used, and it SHOULD make these values unique for the duration of the\n TLS session.\n\n > #### Note {: .info }\n >\n > OTP does not handle SRTP, so an external implementations of SRTP\n > encoder/decoder and a packet demultiplexer are needed to make use of the\n > `use_srtp` extension. See also option [transport_option](`t:transport_option/0`).\n\n Servers that receive an extended hello containing a \"use_srtp\" extension can\n agree to use SRTP by including an extension of type \"use_srtp\", with the chosen\n protection profile in the extended server hello. This extension MUST only be\n used when the data being transported is RTP or RTCP.","title":"ssl.common_option_dtls/0","ref":"ssl.html#t:common_option_dtls/0"},{"type":"type","doc":"Legacy options considered deprecated in favor of other options,\ninsecure to use, or plainly not relevant anymore.\n\n- **`{cert, Certs}`**\n\n Use option `certs_keys` instead.\n\n- **`{certfile, CertPem}`**\n\n Use option `certs_keys` instead.\n\n- **`{keyfile, KeyPem}`**\n\n Use option `certs_keys` instead.\n\n- **`{password, KeyPemPasswd}`**\n\n Use option `certs_keys` instead.\n\n- **`{log_alert, LogAlert}`**\n\n If `LogAlert` is `false`, TLS/DTLS Alert reports are not displayed. Deprecated in OTP\n 22; use `{log_level, Level}` instead.\n\n- **`{padding_check, PaddingCheck}`** - Inter-op trade-off option\n\n Affects TLS-1.0 connections only. If set to `false`, it disables the block\n cipher padding check to be able to interoperate with legacy software.\n\n > #### Warning {: .warning }\n >\n > Using `{padding_check, false}` makes TLS vulnerable to the Poodle attack.\n\n- **`{beast_mitigation, BeastMitigation}`** - Inter-op trade-off option\n\n Affects TLS-1.0 connections only. Used to change the BEAST mitigation strategy\n to interoperate with legacy software. Defaults to `one_n_minus_one`.\n\n `one_n_minus_one` - Perform `1/n-1` BEAST mitigation.\n\n `zero_n` - Perform `0/n` BEAST mitigation.\n\n `disabled` - Disable BEAST mitigation.\n\n > #### Warning {: .warning }\n >\n > Using `{beast_mitigation, disabled}` makes TLS-1.0 vulnerable to the BEAST\n > attack.\n\n- **`{ssl_imp, Imp}`**\n\n Deprecated since OTP 17; has no effect.","title":"ssl.common_option_legacy/0","ref":"ssl.html#t:common_option_legacy/0"},{"type":"type","doc":"Options common to client and server side prior to TLS-1.3.\n\n- **`{eccs, NamedCurves}`** - Named Elliptic Curves\n\n Elliptic curves that can be used in pre TLS-1.3 key exchange.\n\n- **`{secure_renegotiate, SecureRenegotiate}`** - Inter-operate trade-off option\n\n Specifies whether to reject renegotiation attempt that does not live\n up to [RFC 5746](http://www.ietf.org/rfc/rfc5746.txt). By default,\n `SecureRenegotiate` is `true`, meaning that secure renegotiation is\n enforced. If `SecureRenegotiate` is `false` secure renegotiation\n will still be used if possible, but it falls back to insecure\n renegotiation if the peer does not support if [RFC\n 5746](http://www.ietf.org/rfc/rfc5746.txt).\n\n- **`{user_lookup_fun, {LookupFun, UserState}}`** - PSK/SRP cipher suite option\n\n The lookup fun is to be defined as follows:\n\n ```erlang\n fun(psk, PSKIdentity :: binary(), UserState :: term()) ->\n\t{ok, SharedSecret :: binary()} | error;\n fun(srp, Username :: binary(), UserState :: term()) ->\n\t{ok, {SRPParams :: srp_param_type(), Salt :: binary(),\n\t DerivedKey :: binary()}} | error.\n ```\n\n For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client\n and server to determine the shared secret. When called by the client,\n `PSKIdentity` is the hint presented by the server or `undefined`. When\n called by the server, `PSKIdentity` is the identity presented by the client.\n\n For Secure Remote Password (SRP), the fun is only used by the server to obtain\n parameters that it uses to generate its session keys. `DerivedKey` is to be\n derived according to [RFC 2945](http://tools.ietf.org/html/rfc2945#section/3)\n and [RFC 5054](http://tools.ietf.org/html/rfc5054#section-2.4):\n `crypto:sha([Salt, crypto:sha([Username, <<$:>>, Password])])`","title":"ssl.common_option_pre_tls13/0","ref":"ssl.html#t:common_option_pre_tls13/0"},{"type":"type","doc":"Common options to both client and server for TLS-1.3.\n\n- **`{supported_groups, Groups}`** - Key exchange option\n\n TLS 1.3 introduces the \"supported_groups\" extension, which is used for negotiating\n the Diffie-Hellman parameters in a TLS 1.3 handshake. Both client and server can\n specify a list of parameters that they are willing to use.\n\n If not specified it will use a default list (`[x25519, x448, secp256r1,\n secp384r1]`) that is filtered based on the installed crypto library version.\n\n- **`{key_update_at, KeyUpdateAt}`** - Session key renewal\n\n Configures the maximum amount of bytes that can be sent on a TLS 1.3 connection\n before an automatic key update is performed.\n\n There are cryptographic limits on the amount of plaintext which can be safely\n encrypted under a given set of keys. The current default ensures that data\n integrity will not be breached with probability greater than `1/2^57`. For more\n information see\n [Limits on Authenticated Encryption Use in TLS](https://eprint.iacr.org/2024/051.pdf).","title":"ssl.common_option_tls13/0","ref":"ssl.html#t:common_option_tls13/0"},{"type":"type","doc":"Key value list convening some information about the established connection.","title":"ssl.connection_info/0","ref":"ssl.html#t:connection_info/0"},{"type":"type","doc":"TLS connection keys for which information can be retrieved.","title":"ssl.connection_info_keys/0","ref":"ssl.html#t:connection_info_keys/0"},{"type":"type","doc":"TLS connection information relevant prior to TLS-1.3.","title":"ssl.connection_info_pre_tls13/0","ref":"ssl.html#t:connection_info_pre_tls13/0"},{"type":"type","doc":"Options for using built-in CRL cache support.\n\nSpecify how to perform lookup and caching of certificate revocation\nlists (CRLs). `Module` defaults to `m:ssl_crl_cache` with `DbHandle`\nbeing `internal`, and `Args` being `[]`.\n\nThere are two implementations available:\n\n- **`ssl_crl_cache`** - Implementation 1\n\n This module maintains a cache of CRLs. CRLs can be added to the\n cache using `ssl_crl_cache:insert/1`, and can optionally be\n automatically fetched through HTTP if the following argument is\n specified:\n\n - **`{http, timeout()}`**\n\n Enables fetching of CRLs specified as http URIs in [X.509 certificate\n extensions](`e:public_key:public_key_records.md`). Requires the\n [Inets](`e:inets:introduction.md`) application.\n\n- **`ssl_crl_hash_dir`** - Implementation 2\n\n This module makes use of a directory where CRLs are\n stored in files named by the hash of the issuer name.\n\n The file names consist of eight hexadecimal digits followed by `.rN`, where\n `N` is an integer, for example `1a2b3c4d.r0`. For the first version of the CRL, `N`\n starts at zero, and for each new version, `N` is incremented by one. The\n OpenSSL utility `c_rehash` creates symlinks according to this pattern.\n\n For a given hash value, this module finds all consecutive `.r*`\n files starting from zero, and those files taken together make up the\n revocation list. CRL files with `nextUpdate` fields in the past or\n issued by a different CA that happens to have the same name hash\n are excluded.\n\n The following argument is required:\n\n - **`{dir, string()}`**\n\n Specifies the directory in which the CRLs can be found.","title":"ssl.crl_cache_opts/0","ref":"ssl.html#t:crl_cache_opts/0"},{"type":"type","doc":"A DTLS protocol version that are no longer supported by default for security reasons.","title":"ssl.dtls_legacy_version/0","ref":"ssl.html#t:dtls_legacy_version/0"},{"type":"type","doc":"DTLS protocol version.","title":"ssl.dtls_version/0","ref":"ssl.html#t:dtls_version/0"},{"type":"type","doc":"Erlang cipher suite representation\n\n> #### Warning {: .warning }\nEnabling cipher suites using RSA as a key exchange algorithm is\nstrongly discouraged (only available prior to TLS-1.3). For some\nconfigurations software preventions may exist, and can make them\nusable if they work, but relying on them to work is risky. There\nexists more reliable cipher suites that can be used instead.","title":"ssl.erl_cipher_suite/0","ref":"ssl.html#t:erl_cipher_suite/0"},{"type":"type","doc":"If a TLS connection fails a TLS protocol ALERT will be sent/received.\n\nAn atom reflecting the raised alert, according to the TLS protocol, and a description string\nwith some further details will be returned.","title":"ssl.error_alert/0","ref":"ssl.html#t:error_alert/0"},{"type":"type","doc":"TLS-1.3 key exchange configuration.","title":"ssl.group/0","ref":"ssl.html#t:group/0"},{"type":"type","doc":"Hash algorithms used together with signing and encryption functions.","title":"ssl.hash/0","ref":"ssl.html#t:hash/0"},{"type":"type","doc":"A name or address to a host.","title":"ssl.host/0","ref":"ssl.html#t:host/0"},{"type":"type","doc":"Cipher Suite Key Exchange Algorithm will be `any`\nin TLS-1.3 as key exchange is no longer part of cipher suite\nconfiguration in TLS-1.3.","title":"ssl.kex_algo/0","ref":"ssl.html#t:kex_algo/0"},{"type":"type","doc":"The user's private key.\n\nThe key can be provided either directly as a DER-encoded entity,\nindirectly using a crypto engine/provider (with key reference\ninformation), or as an Erlang fun (with possible custom options).\nThe latter two options can be used for customized signing with\nhardware security modules (HSM) or trusted platform modules (TPM).\n\n- A DER encoded key will need to specify the ASN-1 type used to create the\n encoding.\n- An engine/provider needs to specify specific information to support this\n concept and can optionally be password protected; see also\n [crypto:engine_load/3 ](`crypto:engine_load/3`) and\n [Crypto User's Guide](`e:crypto:engine_load.md`).\n- A fun option should include a fun that mimics `public_key:sign/4` and possibly\n [public_key:private_encrypt/4](`public_key:encrypt_private/3`) if legacy\n versions TLS-1.0 and TLS-1.1 must be supported.","title":"ssl.key/0","ref":"ssl.html#t:key/0"},{"type":"type","doc":"Cipher algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_cipher/0","ref":"ssl.html#t:legacy_cipher/0"},{"type":"type","doc":"Hash algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_hash/0","ref":"ssl.html#t:legacy_hash/0"},{"type":"type","doc":"Key exchange configuration prior to TLS-1.3.\n\nThese curves have been deprecated by RFC 8422.","title":"ssl.legacy_named_curve/0","ref":"ssl.html#t:legacy_named_curve/0"},{"type":"type","doc":"Signature algorithms that are no longer supported by default for security reasons.","title":"ssl.legacy_sign_algo/0","ref":"ssl.html#t:legacy_sign_algo/0"},{"type":"type","doc":"This is only used for certificate signatures if TLS-1.2 is negotiated,\nmeaning that the peer only supports TLS-1.2, but we also support\nTLS-1.3.","title":"ssl.legacy_sign_scheme/0","ref":"ssl.html#t:legacy_sign_scheme/0"},{"type":"type","doc":"Key exchange configuration prior to TLS-1.3.","title":"ssl.named_curve/0","ref":"ssl.html#t:named_curve/0"},{"type":"type","doc":"For backwards compatibility only; do not use.","title":"ssl.old_cipher_suite/0","ref":"ssl.html#t:old_cipher_suite/0"},{"type":"type","doc":"","title":"ssl.prf_random/0","ref":"ssl.html#t:prf_random/0"},{"type":"type","doc":"Client hello extensions.","title":"ssl.protocol_extensions/0","ref":"ssl.html#t:protocol_extensions/0"},{"type":"type","doc":"TLS or DTLS protocol version.","title":"ssl.protocol_version/0","ref":"ssl.html#t:protocol_version/0"},{"type":"type","doc":"Error reason for debug purposes.\n\nNot to be matched.","title":"ssl.reason/0","ref":"ssl.html#t:reason/0"},{"type":"type","doc":"Supported in TLS-1.3 and TLS-1.2.","title":"ssl.rsassa_pss_scheme/0","ref":"ssl.html#t:rsassa_pss_scheme/0"},{"type":"type","doc":"TLS connection information that can be used for NSS key logging.","title":"ssl.security_info/0","ref":"ssl.html#t:security_info/0"},{"type":"type","doc":"Options specific to the server side, or with different semantics for the client and server.\n\n- **`{alpn_preferred_protocols, AppProtocols}`** - Application Layer Protocol Negotiation\n\n Indicates that the server will try to perform Application-Layer\n Protocol Negotiation (ALPN).\n\n The list of protocols is in order of preference. The protocol negotiated will be\n the first in the list that matches one of the protocols advertised by the\n client. If no protocol matches, the server will fail the connection with a\n `no_application_protocol` alert.\n\n The negotiated protocol can be retrieved using the\n [`negotiated_protocol/1`](`negotiated_protocol/1`) function.\n\n- **`{sni_fun, SNIFun}`**\n\n If the server receives a SNI (Server Name Indication) from the\n client, the given fun `SNIFun` will be called to retrieve\n [`server_option()`](`t:server_option/0`) for the indicated\n hosts. These options will override previously specified options for\n that host.\n\n > #### Note {: .info }\n The options `sni_fun` and `sni_hosts` are mutually exclusive.\n\n- **`{sni_hosts, SNIHosts}`**\n\n If the server receives a SNI (Server Name Indication) from the client matching a\n host listed in the `sni_hosts` option, the specific options for that host will\n override previously specified options.\n\n > #### Note {: .info }\n The options `sni_fun` and `sni_hosts` are mutually exclusive.","title":"ssl.server_option/0","ref":"ssl.html#t:server_option/0"},{"type":"type","doc":"Certificate related options for a server.\n\n- **`{cacerts, CACerts}`** - Trusted certificates.\n\n The DER-encoded trusted certificates. If this option is supplied, it overrides\n the `cacertfile` option.\n\n- **`{verify, Verify}`** - Verify certificates.\n\n Client certificates are an optional part of the TLS protocol. A server performs\n X.509 certificate path validation only in `verify_peer` mode. By default the server\n is in `verify_none` mode and, hence, will not send an certificate request to the\n client. When using `verify_peer` you may also want to specify the options\n `fail_if_no_peer_cert` and `certificate_authorities`.\n\n- **`{fail_if_no_peer_cert, FailNoPeerCert}`** - Legacy trade-off option\n\n Used together with `{verify, verify_peer}` by an TLS/DTLS server. If set to\n `true`, the server fails if the client does not have a certificate to send, that\n is, sends an empty certificate. If set to `false`, it fails only if the client\n sends an invalid certificate (an empty certificate is considered valid).\n Defaults to `false`.\n\n- **`{certificate_authorities, ServerCertAuth}`** - Inter-operate hint option\n\n Determines whether a TLS-1.3 server should include the authorities extension in its\n certificate request message that is sent when the option `verify` is set to\n `verify_peer`. Defaults to `true`.\n\n A reason to exclude the extension would be if the server wants to communicate\n with clients incapable of sending complete certificate chains that adhere to the\n extension, but the server still has the capability to recreate a chain that it\n can verify.","title":"ssl.server_option_cert/0","ref":"ssl.html#t:server_option_cert/0"},{"type":"type","doc":"Legacy server options.\n\n- **`{next_protocols_advertised, NextAppProtocols}`**\n\n ALPN (Application-Layer Protocol Negotiation)\n deprecates NPN (Next Protocol Negotiation) described here.\n\n List of protocols to send to the client if the client indicates that it supports\n the Next Protocol extension. The client can select a protocol that is not on\n this list. The list of protocols must not contain an empty binary. If the server\n negotiates a Next Protocol, it can be accessed using the\n `negotiated_protocol/1` method.","title":"ssl.server_option_legacy/0","ref":"ssl.html#t:server_option_legacy/0"},{"type":"type","doc":"Options only relevant to TLS versions prior to TLS-1.3.\n\n- **`{client_renegotiation, ClientRengotiation}`** - DoS attack avoidance option\n\n In protocols that support client-initiated renegotiation, the resource cost\n of such an operation is higher for the server than the client. This can act as a\n vector for denial-of-service (DoS) attacks. The SSL application already takes measures\n to counter-act such attempts, but client-initiated renegotiation can be completely\n disabled by setting this option to `false`. The default value is `true`. Note\n that disabling renegotiation can result in long-lived connections becoming\n unusable due to limits on the number of messages the underlying cipher suite can\n encipher.\n\n- **`{reuse_sessions, ReuseSessions}`** - Enable session reuse\n\n The boolean value `true` specifies that the server will agree to reuse sessions.\n Setting it to `false` will result in an empty session table, meaning that no sessions\n will be reused.\n\n- **`{reuse_session, ReuseSession}`** - Local server reuse policy\n\n Enables the TLS/DTLS server to have a local policy for deciding whether a session\n is to be reused. Meaningful only if `reuse_sessions` is set to `true`.\n\n `ReuseSession` should be a fun:\n\n `fun(SuggestedSessionId, PeerCert, Compression, CipherSuite)`\n\n `SuggestedSessionId` is a [`binary()`](`t:binary/0`),\n `PeerCert` is a DER-encoded certificate,\n `Compression` is an enumeration integer, and `CipherSuite` is of type\n [`erl_cipher_suite()`](`t:erl_cipher_suite/0`).\n\n- **`{psk_identity, PSKHint}`** - Inter-operate hint option\n\n Specifies the server identity hint that the server presents to the client.\n\n- **`{honor_cipher_order, HonorServerCipherOrder}`** - Trade-off option alters protocol defined behavior\n\n If `true`, use the server's preference for ECC curve selection. If `false` (the\n default), use the client's preference.\n\n- **`{honor_ecc_order, HonorServerECCOrder}`** - Trade-off option alters protocol defined behavior\n\n If `true`, use the server's preference for ECC curve selection. If `false` (the\n default), use the client's preference.\n\n- **`{dh, DHder}`** - Affects DH key exchange cipher suites\n\n The DER-encoded Diffie-Hellman parameters. If specified, it overrides option\n `dhfile`.\n\n- **`{dh_file, DHfile}`** - Affects DH key exchange cipher suites\n\n Path to a file containing PEM-encoded Diffie Hellman parameters to be used by\n the server if a cipher suite using Diffie Hellman key exchange is negotiated. If\n not specified, default parameters are used.","title":"ssl.server_option_pre_tls13/0","ref":"ssl.html#t:server_option_pre_tls13/0"},{"type":"type","doc":"Options only relevant for TLS-1.3.\n\n- **`{session_tickets, SessionTickets}`**\n\n Configures the session ticket functionality. Allowed values for `SessionTickets` are:\n\n * `disabled`\n * `stateful`\n * `stateless`\n * `stateful_with_cert`\n * `stateless_with_cert`\n\n If `SessionTickets` is not set to `disabled`, session resumption with pre-shared\n keys is enabled and the server will send stateful or stateless session tickets to the\n client after successful connections.\n\n > #### Note {: .info }\n In pre-shared key session ticket resumption, there is no certificate\n exchange involved. Therefore, `ssl:peercert/1` will not return the\n peer certificate, as it is only communicated during the initial\n handshake. To associate the client certificate from the original\n handshake with the tickets it issues, the server options\n `stateful_with_cert` or `stateless_with_cert` can be used.\n\n A stateful session ticket is a database reference to internal state information.\n A stateless session ticket is a self-encrypted binary that contains both\n cryptographic keying material and state data.\n\n > #### Warning {: .warning }\n When `SessionTickets` is set to `stateful_with_cert`, the client\n certificate is stored along with the internal state information,\n leading to increased memory consumption. Conversely, when it is set\n to `stateless_with_cert`, the client certificate is encoded in the\n self-encrypted binary sent to the client, resulting in an increase\n in payload size.\n\n See also [SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\n- **`{stateless_tickets_seed, TicketSeed}`** - Option for statless tickets\n\n Configures the seed used for the encryption of stateless session tickets.\n Allowed values are any randomly generated `t:binary/0`. If this option is not\n configured, an encryption seed will be randomly generated.\n\n > #### Warning {: .warning }\n >\n > Reusing the ticket encryption seed between multiple server instances enables\n > stateless session tickets to work across multiple server instances, but it\n > breaks anti-replay protection across instances.\n >\n > Inaccurate time synchronization between server instances can also affect\n > session ticket freshness checks, potentially causing false negatives as well\n > as false positives.\n\n- **`{anti_replay, AntiReplay}`** - Option for statless tickets\n\n Configures the server's built-in anti replay feature based on Bloom filters.\n\n Allowed values for `AntiReplay` are the pre-defined `'10k'`,\n `'100k'`, or a custom 3-tuple that defines the properties of the\n bloom filters:\n `{WindowSize, HashFunctions, Bits}`. `WindowSize` is the number of seconds after\n the current Bloom filter is rotated and also the window size used for freshness\n checks of ClientHello. `HashFunctions` is the number hash functions and `Bits`\n is the number of bits in the bit vector. `'10k'` and `'100k'` are simple\n defaults with the following properties:\n\n - `'10k'`: Bloom filters can hold 10000 elements with 3% probability of false\n positives. `WindowSize`: 10, `HashFunctions`: 5, `Bits:` 72985 (8.91 KiB).\n - `'100k'`: Bloom filters can hold 100000 elements with 3% probability of false\n positives. `WindowSize`: 10, `HashFunctions`: 5, `Bits`: 729845 (89.09 KiB).\n\n See also [SSL User's Guide, Anti-Replay Protection in TLS\n 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3).\n\n- **`{cookie, Cookie}`** - Option for `HelloRetryRequest` behavior\n\n If `Cookie` is `true`, which is the default, the server sends a\n cookie extension in its `HelloRetryRequest` messages.\n\n The cookie extension has two main purposes. It allows the server to force the\n client to demonstrate reachability at their apparent network address (thus\n providing a measure of DoS protection). This is primarily useful for\n non-connection-oriented transports. It also allows offloading the server's\n state to the client. The cookie extension is enabled by default as it is a\n mandatory extension in RFC8446.\n\n- **`{early_data, EarlyData}`** - Option for accepting or rejecting Early Data\n\n Configures if the server accepts (`enabled`) or rejects (`disabled`) early data\n sent by a client. The default value is `disabled`.","title":"ssl.server_option_tls13/0","ref":"ssl.html#t:server_option_tls13/0"},{"type":"type","doc":"Identifies a TLS session prior to TLS-1.3.","title":"ssl.session_id/0","ref":"ssl.html#t:session_id/0"},{"type":"type","doc":"SHA2 hash algorithms.","title":"ssl.sha2/0","ref":"ssl.html#t:sha2/0"},{"type":"type","doc":"Signature algorithms.","title":"ssl.sign_algo/0","ref":"ssl.html#t:sign_algo/0"},{"type":"type","doc":"Signature schemes, defined by TLS-1.3, and replacing signature algorithms from TLS-1.2.\n\nExplicitly list acceptable signature schemes in the preferred\norder.\n\nOverrides the algorithms supplied in\n[`signature_algs`](`t:signature_algs/0`) option for certificates.\nIn addition to the `signature_algorithms` extension from TLS 1.2,\n[TLS 1.3 (RFC 5246 Section 4.2.3)](http://www.ietf.org/rfc/rfc8446.txt#section-4.2.3)\nadds the `signature_algorithms_cert` extension which enables having special\nrequirements on the signatures used in the certificates that differs from the\nrequirements on digital signatures as a whole. If this is not required this\nextension is not needed.\n\nThe client will send a `signature_algorithms_cert` extension (in the\nclient hello message), if TLS version 1.2 (back-ported to TLS 1.2 in\n24.1) or later is used, and the signature_algs_cert option is\nexplicitly specified. By default, only the\n[signature_algs](`t:signature_algs/0`) extension is sent with the\nexception of when signature_algs option is not explicitly specified,\nin which case it will append the rsa_pkcs1_sha1 algorithm to the\ndefault value of signature_algs and use it as value for\nsignature_algs_cert to allow certificates to have this signature but\nstill disallow sha1 use in the TLS protocol, since 27.0.1 and 26.2.5.2.\n\n> #### Note {: .info }\n>\n> Note that supported signature schemes for TLS-1.2 are\n[`legacy_sign_scheme()`](`t:legacy_sign_scheme/0`)\n> and [`rsassa_pss_scheme()`](`t:rsassa_pss_scheme/0`).","title":"ssl.sign_scheme/0","ref":"ssl.html#t:sign_scheme/0"},{"type":"type","doc":"Explicitly list acceptable signature algorithms for certificates and handshake\nmessages in the preferred order.\n\nThe client will send its list as the client hello\n`signature_algorithm` extension introduced in TLS-1.2; see [Section\n7.4.1.4.1 in RFC 5246](http://www.ietf.org/rfc/rfc5246.txt). Before\nTLS-1.2, these algorithms where implicitly chosen and partly derived\nfrom the cipher suite.\n\nIn TLS-1.2 a somewhat more explicit negotiation is made possible using a list of\n`{HashAlgo, SignAlgo}` tuples.\n\nIn TLS-1.3, these algorithm pairs are replaced by [signature\nschemes](`t:sign_scheme/0`) that are completely decoupled from the\ncipher suite.\n\nSignature algorithms used for certificates can be overridden by the\n[signature schemes](`t:sign_scheme/0`) supplied by the\n`signature_algs_cert` option.\n\nThe TLS-1.2 default is `Default_TLS_12_Alg_Pairs` interleaved with\n`rsa_pss_schemes` since ssl-11.0 (Erlang/OTP 25). `pss_pss` is\npreferred over `pss_rsae`, which in turn is preferred over `rsa`.\n\nThe list for `Default_TLS_12_Alg_Pairs` is defined as follows:\n\n```erlang\n[\n{sha512, ecdsa},\n{sha512, rsa},\n{sha384, ecdsa},\n{sha384, rsa},\n{sha256, ecdsa},\n{sha256, rsa}\n]\n```\n\n> #### Change {: .info }\n>\n> - Support for `{md5, rsa}` was removed from the TLS-1.2 default in\n> ssl-8.0 (Erlang/OTP 22).\n> - Support for `{sha, _}` (SHA1) and `{sha224, _}` was removed\n> from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).\n\nThe list for `rsa_pss_schemes` is defined as follows:\n\n\n```erlang\n[rsa_pss_pss_sha512,\nrsa_pss_pss_sha384,\nrsa_pss_pss_sha256,\nrsa_pss_rsae_sha512,\nrsa_pss_rsae_sha384,\nrsa_pss_rsae_sha256]\n```\n\nThe list of `TLS_13_Legacy_Schemes` is defined as follows:\n\n```erlang\n[\n%% Legacy algorithms only applicable to certificate signatures\nrsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}\nrsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}\nrsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}\n]\n```\n\nThe list of `Default_TLS_13_Schemes` is defined as follows:\n\n```text\n[\n%% EDDSA\neddsa_ed25519,\neddsa_ed448\n\n%% ECDSA\necdsa_secp521r1_sha512,\necdsa_secp384r1_sha384,\necdsa_secp256r1_sha256] ++\n\n%% RSASSA-PSS\nrsa_pss_schemes()\n```\n\n> #### Change {: .info }\n>\n> EDDSA was made highest priority in ssl-10.8 (Erlang/OTP 25).\n\nThe TLS-1.3 default is `Default_TLS_13_Schemes`.\n\nIf both TLS-1.3 and TLS-1.2 are supported the default is:\n\n```erlang\nDefault_TLS_13_Schemes ++ TLS_13_Legacy_Schemes ++\nDefault_TLS_12_Alg_Pairs %% not represented in TLS_13_Legacy_Schemes\n```\n\nto ensure that appropriate algorithms can be chosen for the negotiated\nversion.\n\n> #### Note {: .info }\nTLS-1.2 algorithms will not be negotiated for TLS-1.3, but the TLS-1.3\nRSASSA-PSS ([`rsassa_pss_scheme()`](`t:rsassa_pss_scheme/0`))\nsignature schemes can be negotiated also for TLS-1.2 from Erlang/OTP\n24.1 (fully working from Erlang/OTP 24.1.3). However, if both TLS 1.3\nand TLS 1.2 are supported using defaults, and TLS 1.3 is negotiated,\nthe corresponding TLS 1.2 algorithms for TLS 1.3 legacy signature\nschemes will be treated as legacy schemes and applied only to\ncertificate signatures.","title":"ssl.signature_algs/0","ref":"ssl.html#t:signature_algs/0"},{"type":"type","doc":"A socket that can be used to perform a so-called \"START-TLS\", which\nmeans using an already connected socket previously used for plain TCP\ntraffic and upgrading it to use TLS.\n\nBoth sides needs to agree on the upgrade.","title":"ssl.socket/0","ref":"ssl.html#t:socket/0"},{"type":"type","doc":"Options for the transport socket.\n\nThe default socket options are\n`[{mode, list}, {packet, 0}, {header, 0}, {active, true}]`.\n\nFor valid options, see `m:inet`, `m:gen_tcp`, and `m:gen_udp`\nin Kernel. Note that stream-oriented options such as `packet` are\nonly relevant for TLS and not DTLS.","title":"ssl.socket_option/0","ref":"ssl.html#t:socket_option/0"},{"type":"type","doc":"SRP cipher suite configuration prior to TLS-1.3.","title":"ssl.srp_param_type/0","ref":"ssl.html#t:srp_param_type/0"},{"type":"type","doc":"An opaque reference to the TLS/DTLS connection.\n\nNote that despite being opaque, matching `sslsocket()` instances is allowed.","title":"ssl.sslsocket/0","ref":"ssl.html#t:sslsocket/0"},{"type":"type","doc":"TLS Alert Protocol reasons.","title":"ssl.tls_alert/0","ref":"ssl.html#t:tls_alert/0"},{"type":"type","doc":"An option that can be supplied to a TLS client.","title":"ssl.tls_client_option/0","ref":"ssl.html#t:tls_client_option/0"},{"type":"type","doc":"A TLS protocol version that are no longer supported by default for security reasons.","title":"ssl.tls_legacy_version/0","ref":"ssl.html#t:tls_legacy_version/0"},{"type":"type","doc":"An option related to the TLS/DTLS protocol.","title":"ssl.tls_option/0","ref":"ssl.html#t:tls_option/0"},{"type":"type","doc":"An option that can be supplied to a TLS server.","title":"ssl.tls_server_option/0","ref":"ssl.html#t:tls_server_option/0"},{"type":"type","doc":"TLS protocol version.","title":"ssl.tls_version/0","ref":"ssl.html#t:tls_version/0"},{"type":"type","doc":"Transport option defines a callback module and message tags to handle the underlying transport socket.\n\nCan be used to customize the transport layer. The tag\nvalues should be the values used by the underlying transport in its active mode\nmessages.\n\nDefaults to `{gen_tcp, tcp, tcp_closed, tcp_error, tcp_passive}` for TLS.\n\n> #### Note {: .info }\nFor backward compatibility a tuple of size four will be converted to a\ntuple of size five, where `PassiveTag` is the `DataTag` element with\n`_passive` appended.\n\nFor TLS the callback module must implement a reliable transport\nprotocol, behave as `m:gen_tcp`, and have functions corresponding to\n`inet:setopts/2`, `inet:getopts/2`, `inet:peername/1`, `inet:sockname/1`, and\n`inet:port/1`. The callback `m:gen_tcp` is treated specially and calls `m:inet`\ndirectly. For DTLS this feature is considered experimental.","title":"ssl.transport_option/0","ref":"ssl.html#t:transport_option/0"},{"type":"module","doc":"CRL cache\n\nImplements an internal CRL (Certificate Revocation List) cache. In addition to\nimplementing the `m:ssl_crl_cache_api` behaviour the following functions are\navailable.","title":"ssl_crl_cache","ref":"ssl_crl_cache.html"},{"type":"function","doc":"Delete CRLs from the ssl applications local cache.","title":"ssl_crl_cache.delete/1","ref":"ssl_crl_cache.html#delete/1"},{"type":"function","doc":"","title":"ssl_crl_cache.insert/1","ref":"ssl_crl_cache.html#insert/1"},{"type":"function","doc":"Insert CRLs into the ssl applications local cache, with or without a\ndistribution point reference URI","title":"ssl_crl_cache.insert/2","ref":"ssl_crl_cache.html#insert/2"},{"type":"type","doc":"A source to input CRLs","title":"ssl_crl_cache.crl_src/0","ref":"ssl_crl_cache.html#t:crl_src/0"},{"type":"behaviour","doc":"API for a TLS CRL (Certificate Revocation List) cache.\n\nWhen TLS performs certificate path validation according to\n[RFC 5280 ](http://www.ietf.org/rfc/rfc5280.txt)it should also perform CRL\nvalidation checks. To enable the CRL checks the application needs access to\nCRLs. A database of CRLs can be set up in many different ways. This module\nprovides the behavior of the API needed to integrate an arbitrary CRL cache with\nthe erlang ssl application. It is also used by the application itself to provide\na simple default implementation of a CRL cache.","title":"ssl_crl_cache_api","ref":"ssl_crl_cache_api.html"},{"type":"callback","doc":"`fun fresh_crl/2` will be used as input option `update_crl` to\n`public_key:pkix_crls_validate/3`.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.fresh_crl/2","ref":"ssl_crl_cache_api.html#c:fresh_crl/2"},{"type":"callback","doc":"Backwards compatibility, replaced by lookup/3","title":"ssl_crl_cache_api.lookup/2","ref":"ssl_crl_cache_api.html#c:lookup/2"},{"type":"callback","doc":"Lookup the CRLs belonging to the distribution point `Distributionpoint`. This\nfunction may choose to only look in the cache or to follow distribution point\nlinks depending on how the cache is administrated.\n\nThe `Issuer` argument contains the issuer name of the certificate to\nbe checked. Normally the returned CRL should be issued by this\nissuer, except if the `cRLIssuer` field of `DistributionPoint` has a\nvalue, in which case that value should be used instead.\n\nIn an earlier version of this API, the `lookup` function received two\narguments, omitting `Issuer`. For compatibility, this is still\nsupported: if there is no [`lookup/3`](`c:lookup/3`) function in the\ncallback module,[`lookup/2`](`c:lookup/2`) is called instead.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.lookup/3","ref":"ssl_crl_cache_api.html#c:lookup/3"},{"type":"callback","doc":"Select the CRLs in the cache that are issued by `Issuer` unless the value is a\nlist of so called general names, see\n[X509 certificates records](`e:public_key:public_key_records.md`), originating\nform `#'DistributionPoint'.cRLissuer` and representing different mechanism to\nobtain the CRLs. The cache callback needs to use the appropriate entry to\nretrieve the CRLs or return an empty list if it does not exist.\n\nIt is possible to return logger info, since OTP 22.2, that will be used by the TLS connection to\nproduce log events.","title":"ssl_crl_cache_api.select/2","ref":"ssl_crl_cache_api.html#c:select/2"},{"type":"type","doc":"Reference to the CRL cache.","title":"ssl_crl_cache_api.crl_cache_ref/0","ref":"ssl_crl_cache_api.html#t:crl_cache_ref/0"},{"type":"type","doc":"For description see\n[X509 certificates records](`e:public_key:public_key_records.md`)","title":"ssl_crl_cache_api.dist_point/0","ref":"ssl_crl_cache_api.html#t:dist_point/0"},{"type":"type","doc":"Information for ssl applications use of [Logger(3)](`m:logger`)","title":"ssl_crl_cache_api.logger_info/0","ref":"ssl_crl_cache_api.html#t:logger_info/0"},{"type":"behaviour","doc":"TLS session cache API\n\nDefines the API for the TLS session cache (pre TLS-1.3) so that the data storage\nscheme can be replaced by defining a new callback module implementing this API.","title":"ssl_session_cache_api","ref":"ssl_session_cache_api.html"},{"type":"callback","doc":"Deletes a cache entry.\n\nIs only called from the cache handling process.","title":"ssl_session_cache_api.delete/2","ref":"ssl_session_cache_api.html#c:delete/2"},{"type":"callback","doc":"Calls `Fun(Elem, AccIn)` on successive elements of the cache, starting with\n `AccIn == Acc0`.\n\n`Fun/2` must return a new accumulator, which is passed to the\nnext call. The function returns the final value of the accumulator. `Acc0` is\nreturned if the cache is empty.\n\n> #### Note {: .info }\n>\n> Since OTP-23.3 this functions is only used on the client side and does not\n> need to implemented for a server cache.","title":"ssl_session_cache_api.foldl/3","ref":"ssl_session_cache_api.html#c:foldl/3"},{"type":"callback","doc":"Performs possible initializations of the cache and returns a reference to it\nthat is used as parameter to the other API functions. \n\nIs called by the cache handling processes `init` function, hence\nputting the same requirements on it as a normal process `init`\nfunction. This function is called twice when starting the SSL\napplication, once with the role client and once with the role server,\nas the SSL application must be prepared to take on both roles.\n\nIncludes property `{role, client | server}` in init argument list. \nCurrently this is the only predefined property, there can also be\nuser-defined properties. See also application environment variable\n[session_cb_init_args](ssl_app.md).","title":"ssl_session_cache_api.init/1","ref":"ssl_session_cache_api.html#c:init/1"},{"type":"callback","doc":"Looks up a cache entry. Is to be callable from any process.","title":"ssl_session_cache_api.lookup/2","ref":"ssl_session_cache_api.html#c:lookup/2"},{"type":"callback","doc":"Selects sessions that can be reused, that is sessions that include `PartialKey`\nin its key. Is to be callable from any process.\n\n> #### Note {: .info }\n>\n> Since OTP-23.3 This functions is only used on the client side and does not\n> need to implemented for a server cache.","title":"ssl_session_cache_api.select_session/2","ref":"ssl_session_cache_api.html#c:select_session/2"},{"type":"callback","doc":"Returns the number of sessions in the cache.\n\nIf size exceeds the maximum number of sessions, the current cache\nentries will be invalidated regardless of their remaining lifetime. Is\nto be callable from any process.","title":"ssl_session_cache_api.size/1","ref":"ssl_session_cache_api.html#c:size/1"},{"type":"callback","doc":"Takes care of possible cleanup that is needed when the cache handling process\nterminates.","title":"ssl_session_cache_api.terminate/1","ref":"ssl_session_cache_api.html#c:terminate/1"},{"type":"callback","doc":"Caches a new session or updates an already cached one.\n\nIs only called from the cache handling process.","title":"ssl_session_cache_api.update/3","ref":"ssl_session_cache_api.html#c:update/3"},{"type":"opaque","doc":"The opaque part of the key. Does not need to be handled by the callback.","title":"ssl_session_cache_api.partial_key/0","ref":"ssl_session_cache_api.html#t:partial_key/0"},{"type":"opaque","doc":"The session data that is stored for each session.","title":"ssl_session_cache_api.session/0","ref":"ssl_session_cache_api.html#t:session/0"},{"type":"type","doc":"A key to an entry in the session cache.","title":"ssl_session_cache_api.session_cache_key/0","ref":"ssl_session_cache_api.html#t:session_cache_key/0"},{"type":"type","doc":"A term that can be used to reference the cache.","title":"ssl_session_cache_api.session_cache_ref/0","ref":"ssl_session_cache_api.html#t:session_cache_ref/0"},{"type":"extras","doc":"\n# SSL Application\n\nThe ssl application provides secure communication over sockets.","title":"SSL Application","ref":"ssl_app.html"},{"type":"extras","doc":"The ssl application is an implementation of the TLS (previously known as SSL) and DTLS protocols in\nErlang.\n\nFor current statement of standards compliance see the\n[User's Guide](standards_compliance.md).","title":"Description - SSL Application","ref":"ssl_app.html#description"},{"type":"extras","doc":"The SSL application uses the `Public_Key`, `Asn1` and `Crypto` application to\nhandle public keys and encryption, hence these applications must be loaded for\nthe SSL application to work. In an embedded environment this means they must be\nstarted with `application:start/1,2` before the SSL application is started.","title":"Dependencies - SSL Application","ref":"ssl_app.html#dependencies"},{"type":"extras","doc":"The application environment configuration parameters in this section are defined\nfor the SSL application. For more information about configuration parameters,\nsee the `m:application` manual page in Kernel.\n\n> #### Note {: .info }\nAll parameters including the wording 'session_ticket' are TLS-1.3 only configuration\nand other session parameters are prior to TLS-1.3 only configuration. DTLS versions\nare based on TLS versions see [standard compliance](standards_compliance.md) for mapping.\n\nThe environment parameters can be set on the command line, for example:\n\n`erl -ssl protocol_version \"['tlsv1.2', 'tlsv1.1']\"`\n\n- **`protocol_version = ``t:ssl:tls_version/0` | [`t:ssl:tls_version/0`]\n ` `** - Protocol supported by started clients and servers. If this\n option is not set, it defaults to all TLS protocols currently supported, more\n might be configurable, by the SSL application. This option can be overridden\n by the version option to `ssl:connect/2,3` and `ssl:listen/2`.\n\n- **`dtls_protocol_version = ``t:ssl:dtls_version/0` | [`t:ssl:dtls_version/0`]\n ` `** - Protocol supported by started clients and servers. If this\n option is not set, it defaults to all DTLS protocols currently supported, more\n might be configurable, by the SSL application. This option can be overridden\n by the version option to `ssl:connect/2,3` and `ssl:listen/2`.\n\n- **`session_lifetime = integer() `** - Maximum lifetime of the\n session data in seconds. Defaults to 24 hours which is the maximum recommended\n lifetime by [RFC 5246](http://www.ietf.org/rfc/5246rfc.txt). However sessions\n may be invalidated earlier due to the maximum limitation of the session cache\n table.\n\n- **`session_cb = atom() `** - Deprecated Since OTP-23.3 replaced by\n `client_session_cb` and `server_session_cb`\n\n- **`client_session_cb = atom() `** - Since OTP-23.3 Name client of\n the session cache callback module that implements the `ssl_session_cache_api`\n behavior. Defaults to `ssl_client_session_cache_db`.\n\n- **`server_session_cb = atom() `** - Since OTP-23.3 Name of the\n server session cache callback module that implements the\n `ssl_session_cache_api` behavior. Defaults to `ssl_server_session_cache_db`.\n\n- **`session_cb_init_args = proplist:proplist() `** - Deprecated Since\n OTP-23.3 replaced by `client_session_cb_init_args` and\n `server_session_cb_init_args`\n\n- **`client_session_cb_init_args = proplist:proplist() `** - List of\n extra user-defined arguments to the `init` function in the session cache\n callback module. Defaults to `[]`.\n\n- **`server_session_cb_init_args = proplist:proplist() `** - List of\n extra user-defined arguments to the `init` function in the session cache\n callback module. Defaults to `[]`.\n\n- **`session_cache_client_max = integer() ` \n ** \n Limits the growth of the clients session cache, that is how many sessions\n towards servers that are cached to be used by new client connections. If the\n maximum number of sessions is reached, the current cache entries will be\n invalidated regardless of their remaining lifetime. Defaults to 1000.\n Recommended ssl-8.2.1 or later for this option to work as intended.\n\n- **`session_cache_server_max = integer() `** - Limits the growth of\n the servers session cache, that is how many client sessions are cached by the\n server. If the maximum number of sessions is reached, the current cache\n entries will be invalidated regardless of their remaining lifetime. Defaults\n to 1000. Recommended ssl-8.2.1 or later for this option to work as intended.\n\n- **`ssl_pem_cache_clean = integer() `** - Number of milliseconds\n between PEM cache validations. Defaults to 2 minutes.\n\n Note: The cache can be reloaded by calling `ssl:clear_pem_cache/0`.\n\n- **`bypass_pem_cache = boolean() `** - Introduced in ssl-8.0.2.\n Disables the PEM-cache. Can be used as a workaround for the PEM-cache\n bottleneck before ssl-8.1.1. Defaults to false.\n\n- **`alert_timeout = integer() `** - Number of milliseconds between\n sending of a fatal alert and closing the connection. Waiting a little while\n improves the peers chances to properly receiving the alert so it may shutdown\n gracefully. Defaults to 5000 milliseconds.\n\n- **`internal_active_n = integer() `** - For TLS connections this\n value is used to handle the internal socket. As the implementation was changed\n from an active once to an active N behavior (N = 100), for performance\n reasons, this option exist for possible tweaking or restoring of the old\n behavior (internal_active_n = 1) in unforeseen scenarios. The option will not\n affect erlang distribution over TLS that will always run in active N mode.\n Added in ssl-9.1 (OTP-21.2).\n\n- **`server_session_tickets_amount = integer() `** - Number of session\n tickets sent by the server. It must be greater than 0. Defaults to 3.\n\n- **`server_session_ticket_lifetime = integer() `** - Lifetime of\n session tickets sent by the server. Servers must not use any value greater\n than 604800 seconds (7 days). Expired tickets are automatically removed.\n Defaults to 7200 seconds (2 hours).\n\n- **`server_session_ticket_store_size = integer() `** - Sets the\n maximum size of the server session ticket store (stateful tickets). Defaults\n to 1000. Size limit is enforced by dropping old tickets.\n\n- **`server_session_ticket_max_early_data = integer() `** - Sets the\n maximum size of the early data that the server accepts and also configures its\n NewSessionTicket messages to include this same size limit in their\n early_data_indication extension. Defaults to 16384. Size limit is enforced by\n both client and server.\n\n- **`client_session_ticket_lifetime = integer() `** - Lifetime of\n session tickets in the client ticket store. Expired tickets are automatically\n removed. Defaults to 7200 seconds (2 hours).\n\n- **`client_session_ticket_store_size = integer() `** - Sets the\n maximum size of the client session ticket store. Defaults to 1000. Size limit\n is enforced by dropping old tickets.","title":"Configuration - SSL Application","ref":"ssl_app.html#configuration"},{"type":"extras","doc":"The SSL application uses [OTP logger](`m:logger`). TLS/DTLS alerts are logged on\nnotice level. Unexpected errors are logged on error level. These log entries\nwill by default end up in the default Erlang log. The option `log_level` may be\nused to in run-time to set the log level of a specific TLS connection, which is\nhandy when you want to use level debug to inspect the TLS handshake setup.","title":"Error Logger and Event Handlers - SSL Application","ref":"ssl_app.html#error-logger-and-event-handlers"},{"type":"extras","doc":"`m:application`","title":"See Also - SSL Application","ref":"ssl_app.html#see-also"},{"type":"extras","doc":"\n# SSL Release Notes\n\nThis document describes the changes made to the SSL application.","title":"SSL Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"SSL 11.2.1 - SSL Release Notes","ref":"notes.html#ssl-11-2-1"},{"type":"extras","doc":"- Check for TLS-1.3 support should check minimum requirements.\n\n Own Id: OTP-19094 Aux Id: [GH-8489]\n\n- If both TLS-1.3 and TLS-1.2 is supported\n and TLS-1.2 negotiated convert TLS-1.3 ECDSA schemes to TLS-1.2 hash and signature pairs for increased interoperability.\n\n Own Id: OTP-19107 Aux Id: [GH-8376]\n\n- TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140\n\n[GH-8489]: https://github.com/erlang/otp/issues/8489\n[GH-8376]: https://github.com/erlang/otp/issues/8376","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make it easier to distinguish between a invalid signature and unsupported signature.\n\n Own Id: OTP-19091\n\n- Enhance ALERT logs to help understand what causes the alert.\n\n Own Id: OTP-19092 Aux Id: [GH-8482]\n\n- When the default value for signature_algs is used, default the signature_algs_cert to the default value + rsa_pkcs1_sha1 to allow this algorithms for certificates but not for the TLS protocol. This is for better interoperability. If signature_algs is set explicitly signature_algs_cert must also be set explicitly if they should be different.\n\n Own Id: OTP-19152 Aux Id: [GH-8588]\n\n[GH-8482]: https://github.com/erlang/otp/issues/8482\n[GH-8588]: https://github.com/erlang/otp/issues/8588","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.2 - SSL Release Notes","ref":"notes.html#ssl-11-2"},{"type":"extras","doc":"- Starting a TLS server without sufficient credentials (certificate or anonymous cipher) would work, but it was impossible to connect to it.\n \n This has been corrected to return an error instead of starting the server.\n\n Own Id: OTP-18887 Aux Id: [GH-7493], [PR-7918]\n\n- ASN.1 decoding errors are handled in more places to ensure that errors are returned instead of cause a crash.\n\n Own Id: OTP-18969 Aux Id: [GH-8058], [PR-8256]\n\n- Improved error checking on the API functions.\n\n Own Id: OTP-18992 Aux Id: [GH-8066] [PR-8156]\n\n[GH-7493]: https://github.com/erlang/otp/issues/7493\n[PR-7918]: https://github.com/erlang/otp/pull/7918\n[GH-8058]: https://github.com/erlang/otp/issues/8058\n[PR-8256]: https://github.com/erlang/otp/pull/8256\n[GH-8066]: https://github.com/erlang/otp/issues/8066\n[PR-8156]: https://github.com/erlang/otp/pull/8156","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The `ssl` client can negotiate and handle certificate status request (OCSP stapling support on the client side).\n \n Thanks to voltone for interop testing and related discussions.\n\n Own Id: OTP-18606 Aux Id: OTP-16875,OTP-16448\n\n- Memory consumption has been reduced and performance increased by refactoring internal data structures and their usage.\n\n Own Id: OTP-18665 Aux Id: [PR-7447]\n\n- Added `c:ssl_crl_cache_api:lookup/2` as an optional `-callback` attribute.\n\n Own Id: OTP-18788 Aux Id: [PR-7700]\n\n- Key customization support has been extended to allow flexibility for implementers of for instance hardware security modules (HSM) or trusted platform modules (TPM).\n\n Own Id: OTP-18876 Aux Id: [PR-7898], [PR-7475]\n\n- The `proc_lib:set_label/1` function is now used to increase observability of `ssl` processes.\n\n Own Id: OTP-18879\n\n- Brainpool elliptic curves are now supported in TLS-1.3.\n\n Own Id: OTP-18884 Aux Id: [PR-8056]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- For security reasons, the CBC ciphers are now longer included in the list of default ciphers for TLS-1.2.\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-19025 Aux Id: [PR-8250]\n\n- There is a new `cert_policy_opts` option to configure certificate policy options for the certificate path validation.\n\n Own Id: OTP-19027 Aux Id: [PR-8255]\n\n[PR-7447]: https://github.com/erlang/otp/pull/7447\n[PR-7700]: https://github.com/erlang/otp/pull/7700\n[PR-7898]: https://github.com/erlang/otp/pull/7898\n[PR-7475]: https://github.com/erlang/otp/pull/7475\n[PR-8056]: https://github.com/erlang/otp/pull/8056\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8250]: https://github.com/erlang/otp/pull/8250\n[PR-8255]: https://github.com/erlang/otp/pull/8255","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.3 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-3"},{"type":"extras","doc":"* A race in the kTLS flavour of SSL distribution has been fixed so inet_drv.c doesn't read ahead too much data which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: GH-8561, PR-8690","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Make sure all TLS-1.3 terminations are graceful (previous TLS version terminations already are).\n\n Own Id: OTP-17848\n* Include more information in logging of SNI (Server Name Indication) mismatch error.\n\n Own Id: OTP-19187","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.2 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-2"},{"type":"extras","doc":"* When the default value for signature_algs is used, default the signature_algs_cert to the default value + rsa_pkcs1_sha1 to allow this algorithms for certificates but not for the TLS protocol. This is for better interoperability. If signature_algs is set explicitly signature_algs_cert must also be set explicitly if they should be different.\n\n Own Id: OTP-19152 Aux Id: GH-8588","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4.1 - SSL Release Notes","ref":"notes.html#ssl-11-1-4-1"},{"type":"extras","doc":"* Check for TLS-1.3 support should check minimum requirements.\n\n Own Id: OTP-19094 Aux Id: GH-8489\n* If both TLS-1.3 and TLS-1.2 is supported and TLS-1.2 negotiated convert TLS-1.3 ECDSA schemes to TLS-1.2 hash and signature pairs for increased interoperability.\n\n Own Id: OTP-19107 Aux Id: GH-8376\n* TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Make it easier to distinguish between a invalid signature and unsupported signature.\n\n Own Id: OTP-19091\n* Enhance ALERT logs to help understand what causes the alert.\n\n Own Id: OTP-19092 Aux Id: GH-8482","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.4 - SSL Release Notes","ref":"notes.html#ssl-11-1-4"},{"type":"extras","doc":"* Fix certificate authorities check so that CA closest to peer is not lost. It could manifest itself in a failed connection as the client failed to realize it had a valid certificate chain to send to the server.\n\n Own Id: OTP-19065 Aux Id: GH-8356, PR-8367\n* ssl:signature_algs/2 did not list some legacy algorithm schemes correctly when listing all algorithms available.\n\n Own Id: OTP-19067 Aux Id: PR-8379","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1.3 - SSL Release Notes","ref":"notes.html#ssl-11-1-3"},{"type":"extras","doc":"* Cleanup and close all connections in DTLS when the listen socket owner dies.\n\n Improved IPv6 handling in DTLS.\n\n Own Id: OTP-19037 Aux Id: GH-7951 GH-7955\n* Fixed a crash in dtls accept.\n\n Own Id: OTP-19059 Aux Id: GH-8338","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1.2 - SSL Release Notes","ref":"notes.html#ssl-11-1-2"},{"type":"extras","doc":"* ssl:prf/5, will start working instead of hanging in a TLS-1.3 context if called appropriately. Note that the implementation has changed and in OTP-27 a more adequate API will be documented.\n\n Own Id: OTP-18890 Aux Id: GH-7911\n* Server name verification didn't work if a connection was made with IP-address as a string.\n\n Own Id: OTP-18909 Aux Id: GH-7968\n* The fallback after \"dh\" ssl option was undefined was to get \"dh\" from ssl options again. This is clearly wrong and now changed to the documented fallback \"dhfile\" ssl option.\n\n Own Id: OTP-18919 Aux Id: PR-7984\n* Correct default value selection for DTLS. Will only affect users linked with really old version of cryptolib library.\n\n Own Id: OTP-18962 Aux Id: GH-8079\n* Adhere elliptic curves with RFC 8422 pre TLS-1.3, that is Edwards curves are added to curves that can be used for key exchange, and documentation and implementation of eccs/0,1 are aligned.\n\n Own Id: OTP-18991","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"* Improve alert reason when ecdhe_rsa key_exchange does not have any common curves to use\n\n Own Id: OTP-18985","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.1.1 - SSL Release Notes","ref":"notes.html#ssl-11-1-1"},{"type":"extras","doc":"* Legacy name handling could cause interop problems between TLS-1.3/1.2 client and TLS-1.2 server.\n\n Own Id: OTP-18917 Aux Id: GH-7978","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.1 - SSL Release Notes","ref":"notes.html#ssl-11-1"},{"type":"extras","doc":"- ssl application will validate id-kp-serverAuth and id-kp-clientAuth extended\n key usage only in end entity certificates. public_key application will\n disallow \"anyExtendedKeyUsage\" for CA certificates that includes the extended\n key usage extension and marks it critical.\n\n Own Id: OTP-18739\n\n- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780\n\n- Correct handling of TLS-1.3 legacy scheme names, could cause interop failures\n for TLS-1.2 clients.\n\n Own Id: OTP-18817\n\n- Add missing export for connection_info() API type.\n\n Own Id: OTP-18886","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Fixed `server name indication` which was not handled properly.\n\n Own Id: OTP-18836 Aux Id: GH-7795\n\n- Align documentation and implementation\n\n Own Id: OTP-18853 Aux Id: PR-7841\n\n- Improve connection setup by optimizing certificate lookup.\n\n Own Id: OTP-18893 Aux Id: PR-7920 PR-7921","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.3 - SSL Release Notes","ref":"notes.html#ssl-11-0-3"},{"type":"extras","doc":"- Avoid function clause error in ssl:getopts/2 by handling that inet:getopts may\n return an empty list during some circumstances, such as the socket being in a\n closing state.\n\n Own Id: OTP-18697 Aux Id: GH-7506\n\n- The API function \\`ssl:recv/3\\` has been tightened to disallow negative\n length, which has never been documented to work, but was passed through and\n caused strange errors.\n\n Own Id: OTP-18700 Aux Id: GH-7507\n\n- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add some guidance for signature algorithms configuration in ssl applications\n users guide.\n\n Own Id: OTP-18631","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.2 - SSL Release Notes","ref":"notes.html#ssl-11-0-2"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 11.0.1 - SSL Release Notes","ref":"notes.html#ssl-11-0-1"},{"type":"extras","doc":"- Make sure that selection of client certificates handle both TLS-1.3 and\n TLS-1.2 names correctly. Could cause valid client certificate to not be\n selected, and an empty client certificate message to be sent to server.\n\n Own Id: OTP-18588 Aux Id: GH-7264, PR-7277\n\n- Improved `ssl:format_error/1` to handle more error tuples.\n\n Own Id: OTP-18596 Aux Id: GH-7247\n\n- Fixed hanging `ssl:connect` when ssl application is not started.\n\n Own Id: OTP-18603 Aux Id: GH-7297\n\n- Correct handling of retransmission timers, current behavior could cause\n unwanted delays.\n\n Own Id: OTP-18632 Aux Id: PR-7300, GH-7301","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 11.0 - SSL Release Notes","ref":"notes.html#ssl-11-0"},{"type":"extras","doc":"- Remove less that 256 bit ECC from default supported ECC pre TLS-1.3\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14771\n\n- Improved error checking and handling of ssl options.\n\n Own Id: OTP-15903\n\n- With this change, stateless tickets generated by server with anti_replay\n option enabled can be used for creating ClientHello throughout ticket\n lifetime. Without this change, usability was limited to WindowSize number of\n seconds configured for anti_replay option.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18168 Aux Id: PR-6019, GH-6014\n\n- Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS\n distribution (`-proto_dist inet_tls`), the SSL option `{ktls, true}`. Using\n this for general SSL sockets is uncomfortable, undocumented and not\n recommended since it requires very platform dependent raw options.\n\n This, for now, only works for some not too old Linux distributions. Roughly, a\n kernel 5.2.0 or later with support for UserLand Protocols and the kernel\n module `tls` is required.\n\n Own Id: OTP-18235 Aux Id: PR-6104, PR-5840\n\n- With this change, TLS 1.3 server can be configured to include client\n certificate in session ticket.\n\n Own Id: OTP-18253\n\n- With this change, it is possible to configure encryption seed to be used with\n TLS1.3 stateless tickets. This enables using tickets on different server\n instances.\n\n Own Id: OTP-18254 Aux Id: PR-5982\n\n- Debugging enhancements.\n\n Own Id: OTP-18312\n\n- With this change, maybe keyword atom is not used as function name in ssl code.\n\n Own Id: OTP-18335\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- For security reasons remove support for SHA1 and DSA algorithms from default\n values.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18438 Aux Id: GH-6679\n\n- Mitigate memory usage from large certificate chains by lowering the maximum\n handshake size. This should not effect the common cases, if needed it can be\n configured to a higher value.\n\n Own Id: OTP-18453\n\n- Change the client default verify option to verify_peer. Note that this makes\n it mandatory to also supply trusted CA certificates or explicitly set verify\n to verify_none. This also applies when using the so called anonymous test\n cipher suites defined in TLS versions pre TLS-1.3.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18455 Aux Id: GH-5899\n\n- Erlang distribution code in Kernel and SSL has been refactored a bit to\n facilitate debugging and re-usability, which shouldn't have any noticeable\n effects on behaviour or performance.\n\n Own Id: OTP-18456\n\n- Add encoding and decoding of use_srtp hello extension to facilitate for DTLS\n users to implement SRTP functionality.\n\n Own Id: OTP-18459\n\n- Refactors the (`ssl` application to use macros for TLS and DTLS versions\n instead of hard-coded tuple numbers. This change improves the maintainability\n of `ssl`\n\n Own Id: OTP-18465 Aux Id: GH-7065\n\n- If the function ssl:renegotiate/1 is called on connection that is running\n TLS-1.3 return an error instead of hanging or timing out.\n\n Own Id: OTP-18507\n\n- If a user cancel alert with level warning is received during handshake make it\n be handled the same regardless of TLS version. If it is received in connection\n in TLS-1.3 regard it as an error as it is inappropriate.\n\n In TLS-1.3 all error alerts are considered FATAL regardless of legacy alert\n type. But make sure legacy type is printed in logs to not confuse users that\n are expecting the same legacy type as sent by peer.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18531\n\n- Make `fail_if_no_peer_cert` default true if verify_peer is set on the server,\n otherwise the server will accept the connection if verify_peer is set and the\n user have forgot to set the fail_if_no_peer_cert and the client did not send a\n certificate.\n\n Own Id: OTP-18567\n\n- To make it easier to configure signature algorithms with algorithms that are\n moved from the default add the API function signature_algs/2 that lists\n possible values. Also make sha224 a non default value.\n\n Own Id: OTP-18572","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.9.1.5 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-5"},{"type":"extras","doc":"* TLS-1.3 negotiation now uses SNI based options correctly instead of ignoring them.\n\n Own Id: OTP-19140","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.4 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-4"},{"type":"extras","doc":"* Fix certificate authorities check so that CA closest to peer is not lost. It could manifest itself in a failed connection as the client failed to realize it had a valid certificate chain to send to the server.\n\n Own Id: OTP-19065 Aux Id: GH-8356, PR-8367","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.3 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-3"},{"type":"extras","doc":"- ssl application will validate id-kp-serverAuth and id-kp-clientAuth extended\n key usage only in end entity certificates. public_key application will\n disallow \"anyExtendedKeyUsage\" for CA certificates that includes the extended\n key usage extension and marks it critical.\n\n Own Id: OTP-18739\n\n- Add missing export for connection_info() API type.\n\n Own Id: OTP-18886","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.2 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-2"},{"type":"extras","doc":"- The API function \\`ssl:recv/3\\` has been tightened to disallow negative\n length, which has never been documented to work, but was passed through and\n caused strange errors.\n\n Own Id: OTP-18700 Aux Id: GH-7507\n\n- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9.1.1 - SSL Release Notes","ref":"notes.html#ssl-10-9-1-1"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.9.1 - SSL Release Notes","ref":"notes.html#ssl-10-9-1"},{"type":"extras","doc":"- With this change, ssl:connection_information/2 returns correct keylog data\n after TLS1.3 key update.\n\n Own Id: OTP-18489\n\n- Client signature algorithm list input order is now honored again , it was\n accidently reversed by a previous fix.\n\n Own Id: OTP-18550","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.9 - SSL Release Notes","ref":"notes.html#ssl-10-9"},{"type":"extras","doc":"- Fixed that new `dtls` connections from the same client ip port combination\n works. If there is a process waiting for accept the new connection will\n connect to that, otherwise it will try to re-connect to the old server\n connection.\n\n Own Id: OTP-18371 Aux Id: GH-6160\n\n- When shutting down a node that uses SSL distribution (`-proto_dist inet_tls`),\n a confusing error message about an unexpected process exit was printed. This\n particular message is no longer generated.\n\n Own Id: OTP-18443 Aux Id: PR-6810","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- fixes the type spec for ssl:format_error/1\n\n Own Id: OTP-18366 Aux Id: PR-6565, GH-6506\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18432 Aux Id:\n GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.7 - SSL Release Notes","ref":"notes.html#ssl-10-8-7"},{"type":"extras","doc":"- Maximize compatibility by ignoring change_cipher_spec during handshake even if\n middle_box_mode is not negotiated (mandated by client)\n\n Own Id: OTP-18433 Aux Id: GH-6772\n\n- Move assert of middlebox message after an hello_retry_request to maximize\n interoperability. Does not changes semantics of the protocol only allows\n unexpected message delay from server.\n\n Own Id: OTP-18467 Aux Id: GH-6807","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.6 - SSL Release Notes","ref":"notes.html#ssl-10-8-6"},{"type":"extras","doc":"- With this change, tls_sender process is hibernated after sufficient\n inactivity.\n\n Own Id: OTP-18314 Aux Id: GH-6373\n\n- Correct handling of legacy schemes so that ECDSA certs using sha1 may be used\n for some TLS-1.3 configurations.\n\n Own Id: OTP-18332 Aux Id: GH-6435, PR-6435, ERL-6435\n\n- With this change, tls_sender does not cause logger crash upon key update.\n\n Own Id: OTP-18349","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance warning message\n\n Own Id: OTP-18257 Aux Id: GH-6307\n\n- Provide server option to make certificate_authorities extension in the TLS-1.3\n servers certificate request optional. This will allow clients to send\n incomplete chains that may be reconstructable and thereby verifiable by the\n server, but that would not adhere to the certificate_authorities extension.\n\n Own Id: OTP-18267 Aux Id: PR-6228, GH-6106\n\n- If the `verify_fun` handles four arguments the DER cert will be supplied as\n one of the arguments.\n\n Own Id: OTP-18302 Aux Id: ERIERL-867","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.5 - SSL Release Notes","ref":"notes.html#ssl-10-8-5"},{"type":"extras","doc":"- Fixes handling of symlinks in cacertfile option.\n\n Own Id: OTP-18266 Aux Id: GH-6328","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.4 - SSL Release Notes","ref":"notes.html#ssl-10-8-4"},{"type":"extras","doc":"- Reject unexpected application data in all relevant places for all TLS\n versions. Also, handle TLS-1.3 middlebox compatibility with more care. This\n will make malicious connections fail early and further, mitigate possible DoS\n attacks, that would be caught by the handshake timeout.\n\n Thanks to Aina Toky Rasoamanana and Olivier Levillain from Télécom SudParis\n for alerting us of the issues in our implementation.\n\n Own Id: OTP-18044\n\n- With this change, value of cacertfile option will be adjusted before loading\n certs from the file. Adjustments include converting relative paths to absolute\n and converting symlinks to actual file path.\n\n Thanks to Marcus Johansson\n\n Own Id: OTP-18099 Aux Id: PR-6287\n\n- In TLS-1.3, if chain certs are missing (so server auth domain adherence can\n not be determined) send peer cert and hope the server is able to recreate a\n chain in its auth domain.\n\n Own Id: OTP-18191 Aux Id: GH-6105\n\n- Make sure periodical refresh of CA certificate files repopulates cache\n properly.\n\n Own Id: OTP-18195\n\n- Correct internal CRL cache functions to use internal format consistently.\n\n Own Id: OTP-18203 Aux Id: PR-5996\n\n- Incorrect handling of client middlebox negotiation for TLS-1.3 could result in\n that a TLS-1.3 server would not use middlebox mode although the client was\n expecting it too and failing the negotiation with unexpected message.\n\n Own Id: OTP-18219 Aux Id: GH-6241, PR-6249\n\n- If the \"User\" process, the process starting the TLS connection, gets killed in\n the middle of spawning the dynamic connection tree make sure we do not leave\n any processes behind.\n\n Own Id: OTP-18233 Aux Id: GH-6244, PR-6270","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A vulnerability has been discovered and corrected. It is registered as\n CVE-2022-37026 \"Client Authentication Bypass\". Corrections have been released\n on the supported tracks with patches 23.3.4.15, 24.3.4.2, and 25.0.2. The\n vulnerability might also exist in older OTP versions. We recommend that\n impacted users upgrade to one of these versions or later on the respective\n tracks. OTP 25.1 would be an even better choice. Impacted are those who are\n running an ssl/tls/dtls server using the ssl application either directly or\n indirectly via other applications. For example via inets (httpd), cowboy, etc.\n Note that the vulnerability only affects servers that request client\n certification, that is sets the option \\{verify, verify_peer\\}.\n\n Own Id: OTP-18241","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.8.3 - SSL Release Notes","ref":"notes.html#ssl-10-8-3"},{"type":"extras","doc":"- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.2 - SSL Release Notes","ref":"notes.html#ssl-10-8-2"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8.1 - SSL Release Notes","ref":"notes.html#ssl-10-8-1"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Correctly handles supported protocol version change from default to something\n else by sni_fun supplied to ssl:handshake/\\[2,3] together with a TCP-socket\n (so called upgrade).\n\n Own Id: OTP-18100 Aux Id: GH-5985\n\n- Also, TLS-1.3 should respond with a protocol version alert if previous\n versions, that are supported but not configured, are attempted.\n\n Own Id: OTP-18129 Aux Id: GH-5950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.8 - SSL Release Notes","ref":"notes.html#ssl-10-8"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Fixed tls-1.3 session ticket lifetime which was discarded to quickly before.\n\n Own Id: OTP-18092 Aux Id: PR-5959","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- With this change, it is possible to provide several certificates. Most\n appropriate will be selected based on negotiated properties.\n\n Own Id: OTP-15993 Aux Id: GH-4143\n\n- Add options for users to be able to set spawn_opts for TLS processes (sender\n and receiver) this may be useful for tuning trade-offs between CPU and Memory\n usage.\n\n Own Id: OTP-17855 Aux Id: PR-5328\n\n- Allow key file passwords to be input as a single binary, that is we change the\n data type to be the more for the purpose logical data type iodata() instead of\n string().\n\n Own Id: OTP-17890\n\n- Logging enhancement, add location information to the warning log message.\n\n Own Id: OTP-18000 Aux Id: PR-5790\n\n- Now also accepts the signature_algs_cert option in TLS-1.2 configuration.\n\n Own Id: OTP-18014\n\n- Handle certificate selection correctly for server fallback and certificate\n authorities considerations.\n\n Own Id: OTP-18045 Aux Id: ERIERL-792, OTP-15993\n\n- Enhance handling of handshake decoding errors, especially for certificate\n authorities extension to ensure graceful termination.\n\n Own Id: OTP-18085","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.9 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-9"},{"type":"extras","doc":"- When a client initiated renegotiation was rejected and the client socket was\n in active mode the expected error message to the controlling process was not\n sent.\n\n Own Id: OTP-18712 Aux Id: GH-7431","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.8 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-8"},{"type":"extras","doc":"- Added keylog information to all protocol versions in\n `ssl:connection_information/2`.\n\n Own Id: OTP-18643 Aux Id: ERIERL-932","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add RFC-6083 considerations for DTLS to enable gen_sctp based callback for the\n transport.\n\n Own Id: OTP-18618 Aux Id: ERIERL-932","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.7 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-7"},{"type":"extras","doc":"- Client signature algorithm list input order is now honored again , it was\n accidently reversed by a previous fix.\n\n Own Id: OTP-18550","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.6 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-6"},{"type":"extras","doc":"- Maximize compatibility by ignoring change_cipher_spec during handshake even if\n middle_box_mode is not negotiated (mandated by client)\n\n Own Id: OTP-18433 Aux Id: GH-6772\n\n- Move assert of middlebox message after an hello_retry_request to maximize\n interoperability. Does not changes semantics of the protocol only allows\n unexpected message delay from server.\n\n Own Id: OTP-18467 Aux Id: GH-6807","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3.5 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-5"},{"type":"extras","doc":"- Fixes handling of symlinks in cacertfile option.\n\n Own Id: OTP-18266 Aux Id: GH-6328","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.4 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-4"},{"type":"extras","doc":"- With this change, value of cacertfile option will be adjusted before loading\n certs from the file. Adjustments include converting relative paths to absolute\n and converting symlinks to actual file path.\n\n Thanks to Marcus Johansson\n\n Own Id: OTP-18099 Aux Id: PR-6287\n\n- Incorrect handling of client middlebox negotiation for TLS-1.3 could result in\n that a TLS-1.3 server would not use middlebox mode although the client was\n expecting it too and failing the negotiation with unexpected message.\n\n Own Id: OTP-18219 Aux Id: GH-6241, PR-6249\n\n- If the \"User\" process, the process starting the TLS connection, gets killed in\n the middle of spawning the dynamic connection tree make sure we do not leave\n any processes behind.\n\n Own Id: OTP-18233 Aux Id: GH-6244, PR-6270","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.3 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-3"},{"type":"extras","doc":"- Reject unexpected application data in all relevant places for all TLS\n versions. Also, handle TLS-1.3 middlebox compatibility with more care. This\n will make malicious connections fail early and further, mitigate possible DoS\n attacks, that would be caught by the handshake timeout.\n\n Thanks to Aina Toky Rasoamanana and Olivier Levillain from Télécom SudParis\n for alerting us of the issues in our implementation.\n\n Own Id: OTP-18044\n\n- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173\n\n- Make sure periodical refresh of CA certificate files repopulates cache\n properly.\n\n Own Id: OTP-18195","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.2 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-2"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.3.1 - SSL Release Notes","ref":"notes.html#ssl-10-7-3-1"},{"type":"extras","doc":"- When a TLS-1.3 enabled client tried to talk to a TLS-1.2 server that coalesces\n TLS-1.2 handshake message over one TLS record, the connection could fail due\n to some message being handled in the wrong state, this has been fixed.\n\n Own Id: OTP-18087 Aux Id: GH-5961\n\n- Fixed tls-1.3 session ticket lifetime which was discarded to quickly before.\n\n Own Id: OTP-18092 Aux Id: PR-5959\n\n- Correctly handles supported protocol version change from default to something\n else by sni_fun supplied to ssl:handshake/\\[2,3] together with a TCP-socket\n (so called upgrade).\n\n Own Id: OTP-18100 Aux Id: GH-5985\n\n- Also, TLS-1.3 should respond with a protocol version alert if previous\n versions, that are supported but not configured, are attempted.\n\n Own Id: OTP-18129 Aux Id: GH-5950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance handling of handshake decoding errors, especially for certificate\n authorities extension to ensure graceful termination.\n\n Own Id: OTP-18085","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.7.3 - SSL Release Notes","ref":"notes.html#ssl-10-7-3"},{"type":"extras","doc":"- Client certification could fail if TLS-1.3 enabled client negotiated TLS-1.2\n connection with the server, this is due to the wrong version being used when\n decoding the certificate request message from the server.\n\n Own Id: OTP-18028 Aux Id: GH-5835\n\n- socket option packet_size was not handled in ssl:setops/2 and ssl:getotps/2\n\n Own Id: OTP-18062 Aux Id: GH-5898\n\n- Remove legacy code to fix interoperability with new socket inet_backend.\n\n Own Id: OTP-18071 Aux Id: GH-5930","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.2 - SSL Release Notes","ref":"notes.html#ssl-10-7-2"},{"type":"extras","doc":"- With this change, potential hanging of pre TLS1.3 client receiving OSCP staple\n message is avoided.\n\n Own Id: OTP-17994","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7.1 - SSL Release Notes","ref":"notes.html#ssl-10-7-1"},{"type":"extras","doc":"- Client certification could fail for TLS-1.3 servers that did not include the\n certificate_authorities extension in its certificate request message.\n\n Own Id: OTP-17971 Aux Id: GH-5783","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.7 - SSL Release Notes","ref":"notes.html#ssl-10-7"},{"type":"extras","doc":"- Improved error handling.\n\n Own Id: OTP-17759 Aux Id: GH-5367\n\n- Before this change, net_kernel used with TLS distribution might be leaking\n processes in case of connectivity issues.\n\n Own Id: OTP-17815 Aux Id: GH-5332\n\n- Fix makefile dependency bugs.\n\n Own Id: OTP-17847 Aux Id: PR-5574 GH-5548\n\n- Make sure the TLS sender process handles explicit calls to\n erlang:disconnect_node properly, avoiding potential hanging problems in\n net_kernel.\n\n Own Id: OTP-17929 Aux Id: GH-5708","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for TLS-1.3 certificate_authorities extension. And process\n certificate_authorities field in pre-TLS-1.3 certificate requests.\n\n Own Id: OTP-15719\n\n- Support password fun for protected keyfiles in ssl:connect function.\n\n Own Id: OTP-17816 Aux Id: PR-5607\n\n- Add in some cases earlier detection of possible DoS attacks by malicious\n clients sending unexpected TLS messages instead of the client hello. Note that\n such attacks are already mitigated by providing a timeout for the TLS\n handshake.\n\n Own Id: OTP-17903","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.6.1 - SSL Release Notes","ref":"notes.html#ssl-10-6-1"},{"type":"extras","doc":"- Improve SNI (server name indication) handling so that protocol version can be\n selected with regards to SNI. Also, make sure that\n ssl:connection_information/1 returns the correct SNI value.\n\n Own Id: OTP-17794 Aux Id: GH-5341, GH-4450\n\n- Fixed cipher suite listing functions so that the listing of all cipher suites\n will be complete. Another fix for cipher suite handling in OTP-24.1\n accidentally excludes a few cipher suites from the listing of all cipher\n suites.\n\n Own Id: OTP-17829 Aux Id: ERIERL-708\n\n- Reenable legacy cipher suite TLS_RSA_WITH_3DES_EDE_CBC_SHA for explicit\n configuration in TLS-1.2, not supported by default.\n\n Own Id: OTP-17879 Aux Id: GH-5624","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Avoid unnecessary logs by better adjusting the tls_sender process to the new\n supervisor structure in OTP-24.2\n\n Own Id: OTP-17831","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.6 - SSL Release Notes","ref":"notes.html#ssl-10-6"},{"type":"extras","doc":"- Allow re-connect on DTLS sockets\n\n Can happen when a computer reboots and connects from the same client port\n without the server noticing should be allowed according to RFC.\n\n Own Id: OTP-17411 Aux Id: ERL-1203, GH-4393\n\n- Fix tls and non-tls distribution to use erl_epmd:address_please to figure out\n if IPv4 or IPv6 addresses should be used when connecting to the remote node.\n\n Before this fix, a dns lookup of the remote node hostname determined which IP\n version was to be used which meant that the hostname had to resolve to a valid\n ip address.\n\n Own Id: OTP-17809 Aux Id: PR-5337 GH-5334","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Use supervisor significant child to manage tls connection process and tls\n sender process dependency.\n\n Own Id: OTP-17417\n\n- Random generation adjustment for TLS1.3\n\n Own Id: OTP-17699\n\n- Allow any \\{03,XX\\} TLS record version in the client hello for maximum\n interoperability\n\n Own Id: OTP-17761 Aux Id: GH-5380","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.5.3 - SSL Release Notes","ref":"notes.html#ssl-10-5-3"},{"type":"extras","doc":"- Correct typo of ECC curve name in signature algorithm handling. Will make the\n signature algorithm ecdsa_secp521r1_sha512 succeed.\n\n Own Id: OTP-17756 Aux Id: GH-5383, PR-5397\n\n- Suppress authenticity warning when option verify_none is explicitly supplied.\n\n Own Id: OTP-17757 Aux Id: GH-5352, PR-5395","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5.2 - SSL Release Notes","ref":"notes.html#ssl-10-5-2"},{"type":"extras","doc":"- Fix TLS-1.2 RSA-PSS negotiation and also fix broken certificate request\n message for pre-TLS-1.3 servers.\n\n Own Id: OTP-17688 Aux Id: GH-5255\n\n- Fix CRL issuer verification that under some circumstances could fail with a\n function_clause error.\n\n Own Id: OTP-17723 Aux Id: GH-5300","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5.1 - SSL Release Notes","ref":"notes.html#ssl-10-5-1"},{"type":"extras","doc":"- Before that change, TLS downgrade could occasionally fail when data intended\n for downgraded socket were delivered together with CLOSE_NOTIFY alert to ssl\n app.\n\n Own Id: OTP-17393\n\n- Avoid re-encoding of decoded certificates. This could cause unexpected\n failures as some subtle encoding errors can be tolerated when decoding but\n hence creating another sequence of bytes if the decoded value is re-encoded.\n\n Own Id: OTP-17657\n\n- Fix possible process leak when the process doing ssl:transport_accept dies\n before initiating the TLS handshake.\n\n Own Id: OTP-17666 Aux Id: GH-5239\n\n- Fix dtls memory leak, the replay window code was broken.\n\n Own Id: OTP-17670 Aux Id: GH-5224","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.5 - SSL Release Notes","ref":"notes.html#ssl-10-5"},{"type":"extras","doc":"- Fix Makefile dependency generation to work no matter what the `ERL_TOP` folder\n is called.\n\n Own Id: OTP-17423 Aux Id: GH-4823 PR-4829\n\n- If trying to downgrade a TLS-1.3 connection to a plain TCP connection,\n possible TLS-1.3 session ticket messages will be ignored in the \"downgrade\"\n state while waiting for the close notify alert.\n\n Own Id: OTP-17517 Aux Id: GH-5009\n\n- Corrected error handling to correctly generate an insufficient security alert\n when there are no suitable groups that can be negotiated in TLS-1.3 instead of\n crashing resulting in an internal error alert.\n\n Own Id: OTP-17521\n\n- Properly handle default session data storage.\n\n When a client tries to reuse an expired session the default server storage\n handling would crash losing other session data. This would cause a error\n report and possible loss of abbreviated handshakes.\n\n Own Id: OTP-17635 Aux Id: GH-5192","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for RSA-PSS-PSS signatures and signature_algorithms_cert in\n TLS-1.2. This is a TLS-1.3 RFC requirement to backport this functionality.\n\n Own Id: OTP-16590 Aux Id: ERL-625, GH-5029\n\n- Use inet:monitor/1 to monitor listen-sockets so that we are compatible with\n the new socket backend for gen_tcp.\n\n Own Id: OTP-17392 Aux Id: PR-5050\n\n- Enhance ssl:prf/4 handling and testing\n\n Own Id: OTP-17464\n\n- Enhanced cipher suite filtering functionality, making sure TLS-1.3 and TLS-1.2\n cipher suites can be supported correctly together even when TLS-1.2 anonymous\n ciphers are included.\n\n Own Id: OTP-17501 Aux Id: GH-4978\n\n- Enhance gracefulness especially in TLS-1.3\n\n Own Id: OTP-17530","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.4.2 - SSL Release Notes","ref":"notes.html#ssl-10-4-2"},{"type":"extras","doc":"- Handle cross-signed root certificates when old root expired as reported in\n GH-4877.\n\n Own Id: OTP-17475 Aux Id: GH-4877\n\n- The signature selection algorithm has been changed to also verify if the\n client supports signatures using the elliptic curve of the server's\n public/private key pair. This change fixes #4958.\n\n Own Id: OTP-17529 Aux Id: PR-4979, GH-4958","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Slight optimization of certificate decoding.\n\n Own Id: OTP-17150 Aux Id: GH-4877","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.4.1 - SSL Release Notes","ref":"notes.html#ssl-10-4-1"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.4 - SSL Release Notes","ref":"notes.html#ssl-10-4"},{"type":"extras","doc":"- Missing runtime dependencies has been added to this application.\n\n Own Id: OTP-17243 Aux Id: PR-4557\n\n- TLS handshake should fail if OCSP staple is requested but missing. Note that\n OCSP support is still considered experimental and only partially implemented.\n\n Own Id: OTP-17343","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Removed ssl:ssl_accept/1,2,3 and ssl:cipher:suites/0,1 use ssl:handshake/1,2,3\n and ssl:cipher_suites/2,3 instead.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16974\n\n- Make TLS handshakes in Erlang distribution concurrent.\n\n Own Id: OTP-17044 Aux Id: PR-2654\n\n- Randomize internal `{active,n}` optimization when running Erlang distribution\n over TLS to spread RAM/CPU spike that may occur when starting up a big\n cluster.\n\n Own Id: OTP-17117 Aux Id: PR-2933\n\n- TLS connections now support EdDSA certificates.\n\n Own Id: OTP-17142 Aux Id: PR-4756, GH-4637, GH-4650\n\n- Enhance documentation and logging of certificate handling.\n\n Own Id: OTP-17384 Aux Id: GH-4800","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.3.1.5 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-5"},{"type":"extras","doc":"- Correct corner case of unexpected message handling for pre TLS-1.3 versions,\n could cause \"late failure\" and make the server dependent on its handshake\n timeout to prevent possible DoS attacks.\n\n Own Id: OTP-18224","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.4 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-4"},{"type":"extras","doc":"- The link to crypto:engine_load refered the function with wrong arity.\n\n Own Id: OTP-18173","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.3 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-3"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1.2 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-2"},{"type":"extras","doc":"- Handle cross-signed root certificates when old root expired as reported in\n GH-4877.\n\n Own Id: OTP-17475 Aux Id: GH-4877\n\n- The signature selection algorithm has been changed to also verify if the\n client supports signatures using the elliptic curve of the server's\n public/private key pair. This change fixes #4958.\n\n Own Id: OTP-17529 Aux Id: PR-4979, GH-4958","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Slight optimization of certificate decoding.\n\n Own Id: OTP-17150 Aux Id: GH-4877","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.3.1.1 - SSL Release Notes","ref":"notes.html#ssl-10-3-1-1"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3.1 - SSL Release Notes","ref":"notes.html#ssl-10-3-1"},{"type":"extras","doc":"- Retain backwards compatible behavior of verify_fun when handling incomplete\n chains that are not verifiable.\n\n Own Id: OTP-17296 Aux Id: GH-4682\n\n- Avoid server session handler crash, this will increase session ruse\n opportunities.\n\n Own Id: OTP-17348 Aux Id: ERIERL-641","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.3 - SSL Release Notes","ref":"notes.html#ssl-10-3"},{"type":"extras","doc":"- Fix CRL handling that previously could fail to find the issuer cert under some\n circumstances.\n\n Own Id: OTP-17261 Aux Id: GH-4589\n\n- TLS-1.3 client could, under some circumstances, select an incorrect algorithm\n to sign the certificate verification message causing a TLS Decrypt Alert being\n issued by the server.\n\n Own Id: OTP-17281 Aux Id: GH-4620\n\n- Correct handling of default values for emulated socket options and retain the\n order of the ssl options list to ensure backwards compatible behavior if\n options should be set more than once.\n\n Own Id: OTP-17282","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enhance pre TLS-1.3 session handling so the client and server side handling is\n completely separated and client disregards oldest session when reaching max\n limit of the session table.\n\n Own Id: OTP-16876\n\n- This change implements the early data feature for TLS 1.3 clients.\n\n TLS 1.3 allows clients to send data in the first flight using a Pre-Shared Key\n to authenticate the server and to encrypt the early data.\n\n Own Id: OTP-16985\n\n- This change implements the early data feature for TLS 1.3 servers.\n\n Own Id: OTP-17042","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2.4.4 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-4"},{"type":"extras","doc":"- Improved handling of unexpected messages during the handshake, taking the\n right action for unexpected messages.\n\n Own Id: OTP-18145","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.3 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-3"},{"type":"extras","doc":"- Fix cache invalidation problem for CA certs provided by the cacertfile option.\n\n Own Id: OTP-17435 Aux Id: ERIERL-653","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.2 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-2"},{"type":"extras","doc":"- Fix handling of emulated socket options, the previous patch was incomplete,\n\n Own Id: OTP-17305","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4.1 - SSL Release Notes","ref":"notes.html#ssl-10-2-4-1"},{"type":"extras","doc":"- Backport of OTP-17282\n\n Correct handling of default values for emulated socket options and retain the\n order of the ssl options list to ensure backwards compatible behavior if\n options should be set more than once.\n\n Own Id: OTP-17289 Aux Id: GH-4585","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.4 - SSL Release Notes","ref":"notes.html#ssl-10-2-4"},{"type":"extras","doc":"- Enhance logging option log_level to support none and all, also restore\n backwards compatibility for log_alert option.\n\n Own Id: OTP-17228 Aux Id: ERIERL-614","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.3 - SSL Release Notes","ref":"notes.html#ssl-10-2-3"},{"type":"extras","doc":"- Avoid race when the first two upgrade server handshakes (that is servers that\n use a gen_tcp socket as input to ssl:handshake/2,3) start close to each other.\n Could lead to that one of the handshakes would fail.\n\n Own Id: OTP-17190 Aux Id: ERIERL-606","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 10.2.2 - SSL Release Notes","ref":"notes.html#ssl-10-2-2"},{"type":"extras","doc":"- Avoid that upgrade (from TCP to TLS) servers starts multiple session cache\n handlers for the same server. This applies to Erlang distribution over TLS\n servers.\n\n Own Id: OTP-17139 Aux Id: ERL-1458, OTP-16239\n\n- Legacy cipher suites defined before TLS-1.2 (but still supported) should be\n possible to use in TLS-1.2. They where accidentally excluded for available\n cipher suites for TLS-1.2 in OTP-23.2.2.\n\n Own Id: OTP-17174 Aux Id: ERIERL-597","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enable Erlang distribution over TLS to run TLS-1.3, although TLS-1.2 will\n still be default.\n\n Own Id: OTP-16239 Aux Id: ERL-1458, OTP-17139","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2.1 - SSL Release Notes","ref":"notes.html#ssl-10-2-1"},{"type":"extras","doc":"- Fix CVE-2020-35733 this only affects ssl-10.2 (OTP-23.2). This vulnerability\n could enable a man in the middle attack using a fake chain to a known trusted\n ROOT. Also limits alternative chain handling, for handling of possibly\n extraneous certs, to improve memory management.\n\n Own Id: OTP-17098","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for AES CCM based cipher suites defined in RFC 7251\n\n Also Correct cipher suite name conversion to OpenSSL names. A few names where\n corrected earlier in OTP-16267 For backwards compatible reasons we support\n usage of openSSL names for cipher suites. Mostly anonymous suites names where\n incorrect, but also some legacy suites.\n\n Own Id: OTP-17100","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.2 - SSL Release Notes","ref":"notes.html#ssl-10-2"},{"type":"extras","doc":"- SSL's Erlang Distribution Protocol modules inet_tls_dist and inet6_tls_dist\n lacked a callback function, so the start flag \"-dist_listen false\" did not\n work, which has now been fixed.\n\n Own Id: OTP-15126 Aux Id: ERL-1375\n\n- Correct OpenSSL names for newer cipher suites using DHE in their name that\n accidentally got the wrong value when fixing other older names using EDH\n instead.\n\n Own Id: OTP-16267 Aux Id: ERIERL-571, ERIERL-477\n\n- This change improves the handling of DTLS listening dockets, making it\n possible to open multiple listeners on the same port with different IP\n addresses.\n\n Own Id: OTP-16849 Aux Id: ERL-1339\n\n- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tarballs.\n\n Own Id: OTP-16921\n\n- This change fixes ssl:peername/1 when called on a DTLS client socket.\n\n Own Id: OTP-16923 Aux Id: ERL-1341, PR-2786\n\n- Retain emulation of active once on a closed socket to behave as before 23.1\n\n Own Id: OTP-17018 Aux Id: ERL-1409\n\n- Corrected server session cache entry deletion pre TLS-1.3. May increase\n session reuse.\n\n Own Id: OTP-17019 Aux Id: ERL-1412","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Handle extraneous certs in certificate chains as well as chains that are\n incomplete but can be reconstructed or unordered chains. The cert and certfile\n options will now accept a list of certificates so that the user may specify\n the chain explicitly.\n\n Also, the default value of the depth option has been increased to allow longer\n chains by default.\n\n Own Id: OTP-16277\n\n- This change implements optional NSS-style keylog in\n ssl:connection_information/2 for debugging purposes.\n\n The keylog contains various TLS secrets that can be loaded in Wireshark to\n decrypt TLS packets.\n\n Own Id: OTP-16445 Aux Id: PR-2823\n\n- Use new gen_statem feature of changing callback mode to improve code\n maintainability.\n\n Own Id: OTP-16529\n\n- The handling of Service Name Indication has been aligned with RFC8446.\n\n Own Id: OTP-16762\n\n- Add explicit session reuse option to TLS clients for pre TLS-1.3 sessions.\n Also, add documentation to Users Guide for such sessions.\n\n Own Id: OTP-16893","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.1 - SSL Release Notes","ref":"notes.html#ssl-10-1"},{"type":"extras","doc":"- If a passive socket is created, ssl:recv/2,3 is never called and then the peer\n closes the socket the controlling process will no longer receive an active\n close message.\n\n Own Id: OTP-16697 Aux Id: ERIERL-496\n\n- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764\n\n- This change fixes a potential man-in-the-middle vulnerability when the ssl\n client is configured to automatically handle session tickets\n (\\{session_tickets, auto\\}).\n\n Own Id: OTP-16765\n\n- Fix the internal handling of options 'verify' and 'verify_fun'.\n\n This change fixes a vulnerability when setting the ssl option 'verify' to\n verify_peer in a continued handshake won't take any effect resulting in the\n acceptance of expired peer certificates.\n\n Own Id: OTP-16767 Aux Id: ERIERL-512\n\n- This change fixes the handling of stateless session tickets when anti-replay\n is enabled.\n\n Own Id: OTP-16776 Aux Id: ERL-1316\n\n- Fix a crash due to the faulty handling of stateful session tickets received by\n servers expecting stateless session tickets.\n\n This change also improves the handling of faulty/invalid tickets.\n\n Own Id: OTP-16777 Aux Id: ERL-1317\n\n- Correct flow ctrl checks from OTP-16764 to work as intended. Probably will not\n have a noticeable affect but will make connections more well behaved under\n some circumstances.\n\n Own Id: OTP-16837 Aux Id: ERL-1319, OTP-16764\n\n- Distribution over TLS could exhibit livelock-like behaviour when there is a\n constant stream of distribution messages. Distribution data is now chunked\n every 16 Mb to avoid that.\n\n Own Id: OTP-16851 Aux Id: PR-2703","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Implement the cookie extension for TLS 1.3.\n\n Own Id: OTP-15855\n\n- Experimental OCSP client support.\n\n Own Id: OTP-16448\n\n- TLS 1.0 -TLS-1.2 sessions tables now have a absolute max value instead of\n using a shrinking mechanism when reaching the limit. To avoid out of memory\n problems under heavy load situations. Note that this change infers that\n implementations of ssl_session_cache_api needs to implement the size function\n (introduce in OTP 19) for session reuse to be optimally utilized.\n\n Own Id: OTP-16802 Aux Id: ERIERL-516","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 10.0 - SSL Release Notes","ref":"notes.html#ssl-10-0"},{"type":"extras","doc":"- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tar balls.\n\n Own Id: OTP-16562 Aux Id: ERL-1168\n\n- Correct translation of OpenSSL legacy names for two legacy cipher suites\n\n Own Id: OTP-16573 Aux Id: ERIERL-477\n\n- Correct documentation for PSK identity and SRP username.\n\n Own Id: OTP-16585\n\n- Make sure client hostname check is run when client uses its own verify_fun\n\n Own Id: OTP-16626 Aux Id: ERL-1232\n\n- Improved signature selection mechanism in TLS 1.3 for increased\n interoperability.\n\n Own Id: OTP-16638 Aux Id: ERL-1206","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Drop support for SSL-3.0. Support for this legacy TLS version has not been\n enabled by default since OTP 19. Now all code to support it has been removed,\n that is SSL-3.0 protocol version can not be used and is considered invalid.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14790\n\n- Added support for RSA-PSS signature schemes\n\n Own Id: OTP-15247\n\n- Improve interoperability by implementing the middlebox compatibility mode.\n\n The middlebox compatibility mode makes the TLS 1.3 handshake look more like a\n TLS 1.2 handshake and increases the chance of successfully establishing TLS\n 1.3 connections through legacy middleboxes.\n\n Own Id: OTP-15589\n\n- Utilize new properties of\n [`erlang:dist_ctrl_get_data()`](`erlang:dist_ctrl_get_data/1`) for performance\n improvement of Erlang distribution over TLS.\n\n Own Id: OTP-16127 Aux Id: OTP-15618\n\n- Calls of deprecated functions in the\n [Old Crypto API](`e:crypto:new_api.md#the-old-api`) are replaced by calls of\n their [substitutions](`e:crypto:new_api.md#the-new-api`).\n\n Own Id: OTP-16346\n\n- Implement cipher suite TLS_AES_128_CCM_8_SHA256.\n\n Own Id: OTP-16391\n\n- This change adds TLS-1.3 to the list of default supported versions. That is,\n TLS-1.3 and TLS-1.2 are configured when ssl option 'versions' is not\n explicitly set.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16400\n\n- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- Extended ssl:versions so that it lists supported, available and implemented\n TLS/DTLS versions.\n\n Own Id: OTP-16519\n\n- Added new option exclusive for ssl:cipher_suites/2,3\n\n Own Id: OTP-16532\n\n- Avoid DoS attack against stateful session_tickets by making session ticket ids\n unpredictable.\n\n Own Id: OTP-16533\n\n- Add support for the max_fragment_length extension (RFC 6066).\n\n Own Id: OTP-16547 Aux Id: PR-2547\n\n- Add srp_username in ssl:connection_info, update the document with types of\n this function.\n\n Own Id: OTP-16584","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.6.2.3 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-3"},{"type":"extras","doc":"- Correct flow ctrl checks from OTP-16764 to work as intended. Probably will not\n have a noticeable affect but will make connections more well behaved under\n some circumstances.\n\n Own Id: OTP-16837 Aux Id: ERL-1319, OTP-16764\n\n- Fix a bug that causes cross-build failure.\n\n This change excludes the ssl.d dependency file from the source tar balls.\n\n Own Id: OTP-16921","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.2.2 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-2"},{"type":"extras","doc":"- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764\n\n- Fix the internal handling of options 'verify' and 'verify_fun'.\n\n This change fixes a vulnerability when setting the ssl option 'verify' to\n verify_peer in a continued handshake won't take any effect resulting in the\n acceptance of expired peer certificates.\n\n Own Id: OTP-16767 Aux Id: ERIERL-512","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.2.1 - SSL Release Notes","ref":"notes.html#ssl-9-6-2-1"},{"type":"extras","doc":"- If a passive socket is created, ssl:recv/2,3 is never called and then the peer\n closes the socket the controlling process will no longer receive an active\n close message.\n\n Own Id: OTP-16697 Aux Id: ERIERL-496","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.6.2 - SSL Release Notes","ref":"notes.html#ssl-9-6-2"},{"type":"extras","doc":"- Fix timing bug that could cause ssl sockets to become unresponsive after an\n ssl:recv/3 call timed out\n\n Own Id: OTP-16619 Aux Id: ERL-1213","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6.1 - SSL Release Notes","ref":"notes.html#ssl-9-6-1"},{"type":"extras","doc":"- Correct error handling when the partial_chain fun claims a certificate to be\n the trusted cert that is not part of the chain. This bug would hide the\n appropriate alert generating an \"INTERNAL_ERROR\" alert instead.\n\n Own Id: OTP-16567 Aux Id: ERIERL-481","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.6 - SSL Release Notes","ref":"notes.html#ssl-9-6"},{"type":"extras","doc":"- Correct handling of TLS record limit in TLS-1.3. The max value differs from\n previous versions. Also the payload data max record check was broken, that is\n record overflow problems could occur if user sent large amounts of data.\n\n Own Id: OTP-16258\n\n- Correct close handling for DTLS\n\n Own Id: OTP-16348 Aux Id: ERL-1110\n\n- Fix ssl:getstat/1-2 to also work for DTLS sockets\n\n Own Id: OTP-16352 Aux Id: ERL-1099\n\n- Correct internal handling och socket active mode to avoid reviving TCP data\n aimed for a downgraded TLS socket.\n\n Own Id: OTP-16425\n\n- When using the host name as fallback for SNI (server name indication) strip a\n possible trailing dot that is allowed in a host name but not in the SNI. Also\n if the server receives a SNI with a trailing dot send an UNRECOGNIZED_NAME\n alert.\n\n Own Id: OTP-16437 Aux Id: ERL-1135\n\n- Immediately remove session entries if handshake is abruptly closed at\n transport level.\n\n Own Id: OTP-16479","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Implementation of the key and initialization vector update feature, and\n general hardening of TLS 1.3.\n\n There are cryptographic limits on the amount of plaintext which can be safely\n encrypted under a given set of keys.\n\n This change enforces those limits by triggering automatic key updates on TLS\n 1.3 connections.\n\n Own Id: OTP-15856\n\n- Add support for TLS 1.3 Session Tickets (stateful and stateless). This allows\n session resumption using keying material from a previous successful handshake.\n\n Own Id: OTP-16253\n\n- Add support for key exchange with Edward curves and PSS-RSA padding in\n signature verification.\n\n Own Id: OTP-16528","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.5.3 - SSL Release Notes","ref":"notes.html#ssl-9-5-3"},{"type":"extras","doc":"- Enhance error handling, all ALERTS shall be handled gracefully and not cause a\n crash.\n\n Own Id: OTP-16413 Aux Id: ERL-1136\n\n- Enhance alert logging, in some places the role indication of the alert origin\n was missing. So the log would say undefined instead of client or server.\n\n Own Id: OTP-16424\n\n- Two different optimizations did not work together and resulted in the possible\n breakage of connections using stream ciphers (that is RC4). Reworked the\n implementation to avoid this.\n\n Own Id: OTP-16426 Aux Id: ERL-1136","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5.2 - SSL Release Notes","ref":"notes.html#ssl-9-5-2"},{"type":"extras","doc":"- Fix the handling of GREASE values sent by web browsers when establishing TLS\n 1.3 connections. This change improves handling of GREASE values in various\n protocol elements sent in a TLS 1.3 ClientHello.\n\n Own Id: OTP-16388 Aux Id: ERL-1130\n\n- Correct DTLS listen emulation, could cause problems with opening a new DTLS\n listen socket for a port previously used by a now closed DTLS listen socket.\n\n Own Id: OTP-16396 Aux Id: ERL-1118","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5.1 - SSL Release Notes","ref":"notes.html#ssl-9-5-1"},{"type":"extras","doc":"- Add missing alert handling clause for TLS record handling. Could sometimes\n cause confusing error behaviors of TLS connections.\n\n Own Id: OTP-16357 Aux Id: ERL-1166\n\n- Fix handling of ssl:recv that happens during a renegotiation. Using the\n passive receive function ssl:recv/\\[2,3] during a renegotiation would fail the\n connection with unexpected msg.\n\n Own Id: OTP-16361","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.5 - SSL Release Notes","ref":"notes.html#ssl-9-5"},{"type":"extras","doc":"- Corrected CRL handling which could cause CRL verification to fail. This could\n happen when the CRL distribution point explicitly specifies the CRL issuer,\n that is not using the fallback.\n\n Own Id: OTP-16156 Aux Id: ERL-1030\n\n- Correct handling of unordered chains so that it works as expected\n\n Own Id: OTP-16293\n\n- Fix bug causing ssl application to crash when handshake is paused and\n ClientHello contains extensions for session resumption\n (psk_key_exchange_modes, pre_shared_key).\n\n Own Id: OTP-16295 Aux Id: ERL-1095\n\n- Fix connectivity problems with legacy servers when client is configured to\n support a range of protocol versions including TLS 1.3.\n\n Own Id: OTP-16303","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improve session handling for TLS-1.3 compatibility mode and cleaner internal\n handling so that removal of old session data can be more efficient, hopefully\n mitigating problems with big session tables during heavy load.\n\n Own Id: OTP-15524 Aux Id: OTP-15352\n\n- Correct handling of DTLS listen socket emulation. Could cause failure to\n create new listen socket after process that owned previous listen socket died.\n\n Own Id: OTP-15809 Aux Id: ERL-917\n\n- Add detailed info in ALERT description when client does not send a requested\n cert.\n\n Own Id: OTP-16266","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.4 - SSL Release Notes","ref":"notes.html#ssl-9-4"},{"type":"extras","doc":"- Handling of zero size fragments in TLS could cause an infinite loop. This has\n now been corrected.\n\n Own Id: OTP-15328 Aux Id: ERIERL-379\n\n- DTLS record check needs to consider that a resent hello message can have a\n different version than the negotiated.\n\n Own Id: OTP-15807 Aux Id: ERL-920","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Basic support for TLS 1.3 Client for experimental use. For more information\n see the Standards Compliance chapter of the User's Guide.\n\n Own Id: OTP-15431\n\n- Correct solution for retaining tcp flow control OTP-15802 (ERL-934) as to not\n break ssl:recv as reported in (ERL-938)\n\n Own Id: OTP-15823 Aux Id: ERL-934, ERL-938\n\n- Enhance dialyzer specs to reflect implementation better and avoid dialyzer\n warnings for the user that wants to use TLS with unix domain sockets.\n\n Own Id: OTP-15851 Aux Id: PR-2235\n\n- Add support for ECDSA signature algorithms in TLS 1.3.\n\n Own Id: OTP-15854\n\n- Correct error handling of TLS downgrade, possible return values form\n ssl:close/2 when downgrading is \\{ok, Port\\} or \\{error, Reason\\}, it could\n happen that only ok was returned instead of \\{error, closed\\} when downgrade\n failed due to that the peer closed the TCP connection.\n\n Own Id: OTP-16027","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.3.5 - SSL Release Notes","ref":"notes.html#ssl-9-3-5"},{"type":"extras","doc":"- Enhance error handling for erroneous alerts from the peer.\n\n Own Id: OTP-15943","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.3.4 - SSL Release Notes","ref":"notes.html#ssl-9-3-4"},{"type":"extras","doc":"- Fix handling of certificate decoding problems in TLS 1.3 similarly as in TLS\n 1.2.\n\n Own Id: OTP-15900\n\n- Hibernation now works as expected in all cases, was accidentally broken by\n optimization efforts.\n\n Own Id: OTP-15910\n\n- Fix interoperability problems with openssl when the TLS 1.3 server is\n configured with the option signature_algs_cert.\n\n Own Id: OTP-15913","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.3 - SSL Release Notes","ref":"notes.html#ssl-9-3-3"},{"type":"extras","doc":"- Correct handshake handling, might cause strange symptoms such as ASN.1\n certificate decoding issues.\n\n Own Id: OTP-15879 Aux Id: ERL-968\n\n- Fix handling of the signature_algorithms_cert extension in the ClientHello\n handshake message.\n\n Own Id: OTP-15887 Aux Id: ERL-973\n\n- Handle new ClientHello extensions when handshake is paused by the \\{handshake,\n hello\\} ssl option.\n\n Own Id: OTP-15888 Aux Id: ERL-975","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.2 - SSL Release Notes","ref":"notes.html#ssl-9-3-2"},{"type":"extras","doc":"- Returned \"alert error string\" is now same as logged alert string\n\n Own Id: OTP-15844\n\n- Fix returned extension map fields to follow the documentation.\n\n Own Id: OTP-15862 Aux Id: ERL-951\n\n- Avoid DTLS crash due to missing gen_server return value in DTLS packet demux\n process.\n\n Own Id: OTP-15864 Aux Id: ERL-962","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3.1 - SSL Release Notes","ref":"notes.html#ssl-9-3-1"},{"type":"extras","doc":"- Missing check of size of user_data_buffer made internal socket behave as an\n active socket instead of active N. This could cause memory problems.\n\n Own Id: OTP-15825 Aux Id: ERL-934, OTP-15823","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.3 - SSL Release Notes","ref":"notes.html#ssl-9-3"},{"type":"extras","doc":"- The distribution handshake with TLS distribution (`inet_tls_dist`) does now\n utilize the socket option `{nodelay, true}`, which decreases the distribution\n setup time significantly.\n\n Own Id: OTP-14792\n\n- Correct shutdown reason to avoid an incorrect crash report\n\n Own Id: OTP-15710 Aux Id: ERL-893\n\n- Enhance documentation and type specifications.\n\n Own Id: OTP-15746 Aux Id: ERIERL-333","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS-1.0, TLS-1.1 and DTLS-1.0 are now considered legacy and not supported by\n default\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14865\n\n- Use new logger API in ssl. Introduce log levels and verbose debug logging for\n SSL.\n\n Own Id: OTP-15055\n\n- Add new API function str_to_suite/1, cipher_suites/3 (list cipher suites as\n rfc or OpenSSL name strings) and suite_to_openssl_str/1\n\n Own Id: OTP-15483 Aux Id: ERL-924\n\n- Basic support for TLS 1.3 Server for experimental use. The client is not yet\n functional, for more information see the Standards Compliance chapter of the\n User's Guide.\n\n Own Id: OTP-15591\n\n- Add support for PSK CCM ciphers from RFC 6655\n\n Own Id: OTP-15626","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.2.3.7 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-7"},{"type":"extras","doc":"- Data deliver with ssl:recv/2,3 could fail for when using packet mode. This has\n been fixed by correcting the flow control handling of passive sockets when\n packet mode is used.\n\n Own Id: OTP-16764","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.6 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-6"},{"type":"extras","doc":"- Fix timing bug that could cause ssl sockets to become unresponsive after an\n ssl:recv/3 call timed out\n\n Own Id: OTP-16619 Aux Id: ERL-1213","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.5 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-5"},{"type":"extras","doc":"- Handling of zero size fragments in TLS could cause an infinite loop. This has\n now been corrected.\n\n Own Id: OTP-15328 Aux Id: ERIERL-379","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.4 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-4"},{"type":"extras","doc":"- Hibernation now works as expected in all cases, was accidentally broken by\n optimization efforts.\n\n Own Id: OTP-15910","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.3 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-3"},{"type":"extras","doc":"- Correct handshake handling, might cause strange symptoms such as ASN.1\n certificate decoding issues.\n\n Own Id: OTP-15879 Aux Id: ERL-968","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.2 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-2"},{"type":"extras","doc":"- Returned \"alert error string\" is now same as logged alert string\n\n Own Id: OTP-15844","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3.1 - SSL Release Notes","ref":"notes.html#ssl-9-2-3-1"},{"type":"extras","doc":"- Correct solution for retaining tcp flow control OTP-15802 (ERL-934) as to not\n break ssl:recv as reported in (ERL-938)\n\n Own Id: OTP-15823 Aux Id: ERL-934, ERL-938","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.3 - SSL Release Notes","ref":"notes.html#ssl-9-2-3"},{"type":"extras","doc":"- Missing check of size of user_data_buffer made internal socket behave as an\n active socket instead of active N. This could cause memory problems.\n\n Own Id: OTP-15802 Aux Id: ERL-934","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Back port of bug fix ERL-893 from OTP-22 and document enhancements that will\n solve dialyzer warnings for users of the ssl application.\n\n This change also affects public_key, eldap (and inet doc).\n\n Own Id: OTP-15785 Aux Id: ERL-929, ERL-893, PR-2215","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.2.2 - SSL Release Notes","ref":"notes.html#ssl-9-2-2"},{"type":"extras","doc":"- With the default BEAST Mitigation strategy for TLS 1.0 an empty TLS fragment\n could be sent after a one-byte fragment. This glitch has been fixed.\n\n Own Id: OTP-15054 Aux Id: ERIERL-346","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2.1 - SSL Release Notes","ref":"notes.html#ssl-9-2-1"},{"type":"extras","doc":"- The timeout for a passive receive was sometimes not cancelled and later caused\n a server crash. This bug has now been corrected.\n\n Own Id: OTP-14701 Aux Id: ERL-883, ERL-884\n\n- Add tag for passive message (active N) in cb_info to retain transport\n transparency.\n\n Own Id: OTP-15679 Aux Id: ERL-861","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.2 - SSL Release Notes","ref":"notes.html#ssl-9-2"},{"type":"extras","doc":"- Fix bug that an incorrect return value for gen_statem could be created when\n alert was a result of handling renegotiation info extension\n\n Own Id: OTP-15502\n\n- Correct check for 3des_ede_cbc, could cause ssl to claim to support\n 3des_ede_cbc when cryptolib does not.\n\n Own Id: OTP-15539\n\n- Improved DTLS error handling, avoids unexpected connection failure in rare\n cases.\n\n Own Id: OTP-15561\n\n- Corrected active once emulation bug that could cause the ssl_closed meassage\n to not be sent. Bug introduced by OTP-15449\n\n Own Id: OTP-15666 Aux Id: ERIERL-316,","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add client option \\{reuse_session, SessionID::binary()\\} that can be used\n together with new option value \\{reuse_sessions, save\\}. This makes it\n possible to reuse a session from a specific connection establishment.\n\n Own Id: OTP-15369\n\n- The Reason part of of the error return from the functions connect and\n handshake has a better and documented format. This will sometimes differ from\n previous returned reasons, however those where only documented as term() and\n should for that reason not be relied on.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15423\n\n- Refactor of state handling to improve TLS application data throughput and\n reduce CPU overhead\n\n Own Id: OTP-15445\n\n- The SSL code has been optimized in many small ways to reduce CPU load for\n encryption/decryption, especially for Erlang's distribution protocol over TLS.\n\n Own Id: OTP-15529\n\n- Add support for active N\n\n Own Id: OTP-15665 Aux Id: ERL-811, PR-2072","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.1.2 - SSL Release Notes","ref":"notes.html#ssl-9-1-2"},{"type":"extras","doc":"- Fix encoding of the SRP extension length field in ssl. The old encoding of the\n SRP extension length could cause interoperability problems with third party\n SSL implementations when SRP was used.\n\n Own Id: OTP-15477 Aux Id: ERL-790\n\n- Guarantee active once data delivery, handling TCP stream properly.\n\n Own Id: OTP-15504 Aux Id: ERL-371\n\n- Correct gen_statem returns for some error cases\n\n Own Id: OTP-15505","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.1.1 - SSL Release Notes","ref":"notes.html#ssl-9-1-1"},{"type":"extras","doc":"- Fixed renegotiation bug. Client did not handle server initiated renegotiation\n correctly after rewrite to two connection processes, due to ERL-622 commit\n d87ac1c55188f5ba5cdf72384125d94d42118c18. This could manifest it self as a \"\n bad_record_mac\" alert.\n\n Also included are some optimizations\n\n Own Id: OTP-15489 Aux Id: ERL-308","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.1 - SSL Release Notes","ref":"notes.html#ssl-9-1"},{"type":"extras","doc":"- PEM cache was not evicting expired entries due to due to timezone confusion.\n\n Own Id: OTP-15368\n\n- Make sure an error is returned if a \"transport_accept socket\" is used in some\n other call than ssl:handshake\\* or ssl:controlling_process\n\n Own Id: OTP-15384 Aux Id: ERL-756\n\n- Fix timestamp handling in the PEM-cache could cause entries to not be\n invalidated at the correct time.\n\n Own Id: OTP-15402\n\n- Extend check for undelivered data at closing, could under some circumstances\n fail to deliver all data that was actually received.\n\n Own Id: OTP-15412 Aux Id: ERL-731\n\n- Correct signature check for TLS-1.2 that allows different algorithms for\n signature of peer cert and peer cert key. Not all allowed combinations where\n accepted.\n\n Own Id: OTP-15415 Aux Id: ERL-763\n\n- Correct gen_statem return value, could cause renegotiation to fail.\n\n Own Id: OTP-15418 Aux Id: ERL-770","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add engine support for RSA key exchange\n\n Own Id: OTP-15420 Aux Id: ERIERL-268\n\n- ssl now uses active n internally to boost performance. Old active once\n behavior can be restored by setting application variable see manual page for\n ssl application (man 6).\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15449","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.0.3 - SSL Release Notes","ref":"notes.html#ssl-9-0-3"},{"type":"extras","doc":"- Correct alert handling with new TLS sender process, from ssl-9.0.2. CLOSE\n ALERTS could under some circumstances be encoded using an incorrect cipher\n state. This would cause the peer to regard them as unknown messages.\n\n Own Id: OTP-15337 Aux Id: ERL-738\n\n- Correct handling of socket packet option with new TLS sender process, from\n ssl-9.0.2. When changing the socket option \\{packet, 1|2|3|4\\} with\n ssl:setopts/2 the option must internally be propagated to the sender process\n as well as the reader process as this particular option also affects the data\n to be sent.\n\n Own Id: OTP-15348 Aux Id: ERL-747","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.0.2 - SSL Release Notes","ref":"notes.html#ssl-9-0-2"},{"type":"extras","doc":"- Use separate processes for sending and receiving application data for TLS\n connections to avoid potential deadlock that was most likely to occur when\n using TLS for Erlang distribution. Note does not change the API.\n\n Own Id: OTP-15122\n\n- Correct handling of empty server SNI extension\n\n Own Id: OTP-15168\n\n- Correct PSK cipher suite handling and add selected_cipher_suite to connection\n information\n\n Own Id: OTP-15172\n\n- Adopt to the fact that cipher suite sign restriction are relaxed in TLS-1.2\n\n Own Id: OTP-15173\n\n- Enhance error handling of non existing PEM files\n\n Own Id: OTP-15174\n\n- Correct close handling of transport accepted sockets in the error state\n\n Own Id: OTP-15216\n\n- Correct PEM cache to not add references to empty entries when PEM file does\n not exist.\n\n Own Id: OTP-15224\n\n- Correct handling of all PSK cipher suites\n\n Before only some PSK suites would be correctly negotiated and most PSK ciphers\n suites would fail the connection.\n\n Own Id: OTP-15285","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS will now try to order certificate chains if they appear to be unordered.\n That is prior to TLS 1.3, “certificate_list” ordering was required to be\n strict, however some implementations already allowed for some flexibility. For\n maximum compatibility, all implementations SHOULD be prepared to handle\n potentially extraneous certificates and arbitrary orderings from any TLS\n version.\n\n Own Id: OTP-12983\n\n- TLS will now try to reconstructed an incomplete certificate chains from its\n local CA-database and use that data for the certificate path validation. This\n especially makes sense for partial chains as then the peer might not send an\n intermediate CA as it is considered the trusted root in that case.\n\n Own Id: OTP-15060\n\n- Option keyfile defaults to certfile and should be trumped with key. This\n failed for engine keys.\n\n Own Id: OTP-15193\n\n- Error message improvement when own certificate has decoding issues, see also\n issue ERL-668.\n\n Own Id: OTP-15234\n\n- Correct dialyzer spec for key option\n\n Own Id: OTP-15281","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 9.0.1 - SSL Release Notes","ref":"notes.html#ssl-9-0-1"},{"type":"extras","doc":"- Correct cipher suite handling for ECDHE\\_\\*, the incorrect handling could\n cause an incorrrect suite to be selected and most likely fail the handshake.\n\n Own Id: OTP-15203","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 9.0 - SSL Release Notes","ref":"notes.html#ssl-9-0"},{"type":"extras","doc":"- Correct handling of ECDH suites.\n\n Own Id: OTP-14974\n\n- Proper handling of clients that choose to send an empty answer to a\n certificate request\n\n Own Id: OTP-15050","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Distribution over SSL (inet_tls) has, to improve performance, been rewritten\n to not use intermediate processes and ports.\n\n Own Id: OTP-14465\n\n- Add support for ECDHE_PSK cipher suites\n\n Own Id: OTP-14547\n\n- For security reasons no longer support 3-DES cipher suites by default\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14768\n\n- For security reasons RSA-key exchange cipher suites are no longer supported by\n default\n\n \\*** INCOMPATIBILITY with possible \\***\n\n Own Id: OTP-14769\n\n- The interoperability option to fallback to insecure renegotiation now has to\n be explicitly turned on.\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14789\n\n- Drop support for SSLv2 enabled clients. SSLv2 has been broken for decades and\n never supported by the Erlang SSL/TLS implementation. This option was by\n default disabled and enabling it has proved to sometimes break connections not\n using SSLv2 enabled clients.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14824\n\n- Remove CHACHA20_POLY1305 ciphers form default for now. We have discovered\n interoperability problems, ERL-538, that we believe needs to be solved in\n crypto.\n\n \\*** INCOMPATIBILITY with possibly \\***\n\n Own Id: OTP-14882\n\n- Generalize DTLS packet multiplexing to make it easier to add future DTLS\n features and uses.\n\n Own Id: OTP-14888\n\n- Use uri_string module instead of http_uri.\n\n Own Id: OTP-14902\n\n- The SSL distribution protocol `-proto inet_tls` has stopped setting the SSL\n option `server_name_indication`. New verify funs for client and server in\n `inet_tls_dist` has been added, not documented yet, that checks node name if\n present in peer certificate. Usage is still also yet to be documented.\n\n Own Id: OTP-14969 Aux Id: OTP-14465, ERL-598\n\n- Deprecate ssl:ssl_accept/\\[1,2,3] in favour of ssl:handshake/\\[1,2,3]\n\n Own Id: OTP-15056\n\n- Customizes the hostname verification of the peer certificate, as different\n protocols that use TLS such as HTTP or LDAP may want to do it differently\n\n Own Id: OTP-15102 Aux Id: ERL-542, OTP-14962\n\n- Add utility function for converting erlang cipher suites to a string\n representation (ERL-600).\n\n Own Id: OTP-15106\n\n- First version with support for DTLS\n\n Own Id: OTP-15142","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.6.4 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-4"},{"type":"extras","doc":"- Add engine support for RSA key exchange\n\n Own Id: OTP-15420","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.3 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-3"},{"type":"extras","doc":"- Extend check for undelivered data at closing, could under some circumstances\n fail to deliverd all data that was acctualy recivied.\n\n Own Id: OTP-15412","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.2 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-2"},{"type":"extras","doc":"- Correct handling of empty server SNI extension\n\n Own Id: OTP-15168\n\n- Correct cipher suite handling for ECDHE\\_\\*, the incorrect handling could\n cause an incorrrect suite to be selected and most likely fail the handshake.\n\n Own Id: OTP-15203","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.6.1 - SSL Release Notes","ref":"notes.html#ssl-8-2-6-1"},{"type":"extras","doc":"- Improve cipher suite handling correcting ECC and TLS-1.2 requierments.\n Backport of solution for ERL-641\n\n Own Id: OTP-15178","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Option keyfile defaults to certfile and should be trumped with key. This\n failed for engine keys.\n\n Own Id: OTP-15193","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.6 - SSL Release Notes","ref":"notes.html#ssl-8-2-6"},{"type":"extras","doc":"- Proper handling of clients that choose to send an empty answer to a\n certificate request\n\n Own Id: OTP-15050","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.5 - SSL Release Notes","ref":"notes.html#ssl-8-2-5"},{"type":"extras","doc":"- Fix filter function to not incorrectly exclude AEAD cipher suites\n\n Own Id: OTP-14981","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.2.4 - SSL Release Notes","ref":"notes.html#ssl-8-2-4"},{"type":"extras","doc":"- Optimization of bad merge conflict resolution causing dubble decode\n\n Own Id: OTP-14843\n\n- Restore error propagation to OTP-19.3 behaviour, in OTP-20.2 implementation\n adjustments to gen_statem needed some further adjustments to avoid a race\n condition. This could cause a TLS server to not always report file path errors\n correctly.\n\n Own Id: OTP-14852\n\n- Corrected RC4 suites listing function to regard TLS version\n\n Own Id: OTP-14871\n\n- Fix alert handling so that unexpected messages are logged and alerted\n correctly\n\n Own Id: OTP-14919\n\n- Correct handling of anonymous cipher suites\n\n Own Id: OTP-14952","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added new API functions to facilitate cipher suite handling\n\n Own Id: OTP-14760\n\n- Correct TLS_FALLBACK_SCSV handling so that this special flag suite is always\n placed last in the cipher suite list in accordance with the specs. Also make\n sure this functionality is used in DTLS.\n\n Own Id: OTP-14828\n\n- Add TLS record version sanity check for early as possible error detection and\n consistency in ALERT codes generated\n\n Own Id: OTP-14892","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.3 - SSL Release Notes","ref":"notes.html#ssl-8-2-3"},{"type":"extras","doc":"- Packet options cannot be supported for unreliable transports, that is, packet\n option for DTLS over udp will not be supported.\n\n Own Id: OTP-14664\n\n- Ensure data delivery before close if possible. This fix is related to fix in\n PR-1479.\n\n Own Id: OTP-14794","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The crypto API is extended to use private/public keys stored in an Engine for\n sign/verify or encrypt/decrypt operations.\n\n The ssl application provides an API to use this new engine concept in TLS.\n\n Own Id: OTP-14448\n\n- Implemented renegotiation for DTLS\n\n Own Id: OTP-14563\n\n- A new command line option `-ssl_dist_optfile` has been added to facilitate\n specifying the many options needed when using SSL as the distribution\n protocol.\n\n Own Id: OTP-14657","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.2 - SSL Release Notes","ref":"notes.html#ssl-8-2-2"},{"type":"extras","doc":"- TLS sessions must be registered with SNI if provided, so that sessions where\n client hostname verification would fail cannot connect reusing a session\n created when the server name verification succeeded.\n\n Own Id: OTP-14632\n\n- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- If no SNI is available and the hostname is an IP-address also check for\n IP-address match. This check is not as good as a DNS hostname check and\n certificates using IP-address are not recommended.\n\n Own Id: OTP-14655","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2.1 - SSL Release Notes","ref":"notes.html#ssl-8-2-1"},{"type":"extras","doc":"- Max session table works correctly again\n\n Own Id: OTP-14556","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Customize alert handling for DTLS over UDP to mitigate DoS attacks\n\n Own Id: OTP-14078\n\n- Improved error propagation and reports\n\n Own Id: OTP-14236","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.2 - SSL Release Notes","ref":"notes.html#ssl-8-2"},{"type":"extras","doc":"- ECDH-ECDSA key exchange supported, was accidentally dismissed in earlier\n versions.\n\n Own Id: OTP-14421\n\n- Correct close semantics for active once connections. This was a timing\n dependent bug the resulted in the close message not always reaching the ssl\n user process.\n\n Own Id: OTP-14443","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS-1.2 clients will now always send hello messages on its own format, as\n opposed to earlier versions that will send the hello on the lowest supported\n version, this is a change supported by the latest RFC.\n\n This will make interoperability with some newer servers smoother. Potentially,\n but unlikely, this could cause a problem with older servers if they do not\n adhere to the RFC and ignore unknown extensions.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13820\n\n- Allow Erlang/OTP to use OpenSSL in FIPS-140 mode, in order to satisfy specific\n security requirements (mostly by different parts of the US federal\n government).\n\n See the new crypto users guide \"FIPS mode\" chapter about building and using\n the FIPS support which is disabled by default.\n\n (Thanks to dszoboszlay and legoscia)\n\n Own Id: OTP-13921 Aux Id: PR-1180\n\n- Implemented DTLS cookie generation, required by spec, instead of using a\n hardcoded value.\n\n Own Id: OTP-14076\n\n- Implement sliding window replay protection of DTLS records.\n\n Own Id: OTP-14077\n\n- TLS client processes will by default call public_key:pkix_verify_hostname/2 to\n verify the hostname of the connection with the server certificates specified\n hostname during certificate path validation. The user may explicitly disables\n it. Also if the hostname cannot be derived from the first argument to connect\n or is not supplied by the server name indication option, the check will not be\n performed.\n\n Own Id: OTP-14197\n\n- Extend connection_information/\\[1,2] . The values session_id, master_secret,\n client_random and server_random can no be accessed by\n connection_information/2. Note only session_id will be added to\n connection_information/1. The rational is that values concerning the\n connection security should have to be explicitly requested.\n\n Own Id: OTP-14291\n\n- Chacha cipher suites are currently not tested enough to be most preferred ones\n\n Own Id: OTP-14382\n\n- Basic support for DTLS that been tested together with OpenSSL.\n\n Test by providing the option \\{protocol, dtls\\} to the ssl API functions\n connect and listen.\n\n Own Id: OTP-14388","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.1.3.1.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-3-1-1"},{"type":"extras","doc":"- Fix alert handling so that unexpected messages are logged and alerted\n correctly\n\n Own Id: OTP-14929","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.3.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-3-1"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.3 - SSL Release Notes","ref":"notes.html#ssl-8-1-3"},{"type":"extras","doc":"- Remove debug printout\n\n Own Id: OTP-14396","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.2 - SSL Release Notes","ref":"notes.html#ssl-8-1-2"},{"type":"extras","doc":"- Correct active once emulation, for TLS. Now all data received by the\n connection process will be delivered through active once, even when the active\n once arrives after that the gen_tcp socket is closed by the peer.\n\n Own Id: OTP-14300","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.1.1 - SSL Release Notes","ref":"notes.html#ssl-8-1-1"},{"type":"extras","doc":"- Corrected termination behavior, that caused a PEM cache bug and sometimes\n resulted in connection failures.\n\n Own Id: OTP-14100\n\n- Fix bug that could hang ssl connection processes when failing to require more\n data for very large handshake packages. Add option max_handshake_size to\n mitigate DoS attacks.\n\n Own Id: OTP-14138\n\n- Improved support for CRL handling that could fail to work as intended when an\n id-ce-extKeyUsage was present in the certificate. Also improvements where\n needed to distributionpoint handling so that all revocations actually are\n found and not deemed to be not determinable.\n\n Own Id: OTP-14141\n\n- A TLS handshake might accidentally match old sslv2 format and ssl application\n would incorrectly aborted TLS handshake with ssl_v2_client_hello_no_supported.\n Parsing was altered to avoid this problem.\n\n Own Id: OTP-14222\n\n- Correct default cipher list to prefer AES 128 before 3DES\n\n Own Id: OTP-14235","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Move PEM cache to a dedicated process, to avoid making the SSL manager process\n a bottleneck. This improves scalability of TLS connections.\n\n Own Id: OTP-13874","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.1 - SSL Release Notes","ref":"notes.html#ssl-8-1"},{"type":"extras","doc":"- List of possible anonymous suites, never supported by default, where incorrect\n for some TLS versions.\n\n Own Id: OTP-13926","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Experimental version of DTLS. It is runnable but not complete and cannot be\n considered reliable for production usage.\n\n Own Id: OTP-12982\n\n- Add API options to handle ECC curve selection.\n\n Own Id: OTP-13959","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.0.3 - SSL Release Notes","ref":"notes.html#ssl-8-0-3"},{"type":"extras","doc":"- A timing related bug in event handling could cause interoperability problems\n between an erlang TLS server and some TLS clients, especially noticed with\n Firefox as TLS client.\n\n Own Id: OTP-13917\n\n- Correct ECC curve selection, the error could cause the default to always be\n selected.\n\n Own Id: OTP-13918","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.0.2 - SSL Release Notes","ref":"notes.html#ssl-8-0-2"},{"type":"extras","doc":"- Correctly formed handshake messages received out of order will now correctly\n fail the connection with unexpected message.\n\n Own Id: OTP-13853\n\n- Correct handling of signature algorithm selection\n\n Own Id: OTP-13711","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- ssl application now behaves gracefully also on partially incorrect input from\n peer.\n\n Own Id: OTP-13834\n\n- Add application environment configuration bypass_pem_cache. This can be used\n as a workaround for the current implementation of the PEM-cache that has\n proven to be a bottleneck.\n\n Own Id: OTP-13883","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 8.0.1 - SSL Release Notes","ref":"notes.html#ssl-8-0-1"},{"type":"extras","doc":"- The TLS/SSL protocol version selection for the SSL server has been corrected\n to follow RFC 5246 Appendix E.1 especially in case where the list of supported\n versions has gaps. Now the server selects the highest protocol version it\n supports that is not higher than what the client supports.\n\n Own Id: OTP-13753 Aux Id: seq13150","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 8.0 - SSL Release Notes","ref":"notes.html#ssl-8-0"},{"type":"extras","doc":"- Server now rejects, a not requested client cert, as an incorrect handshake\n message and ends the connection.\n\n Own Id: OTP-13651","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Remove default support for DES cipher suites\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13195\n\n- Deprecate the function `crypto:rand_bytes` and make sure that\n `crypto:strong_rand_bytes` is used in all places that are cryptographically\n significant.\n\n Own Id: OTP-13214\n\n- Better error handling of user error during TLS upgrade. ERL-69 is solved by\n gen_statem rewrite of ssl application.\n\n Own Id: OTP-13255\n\n- Provide user friendly error message when crypto rejects a key\n\n Own Id: OTP-13256\n\n- Add ssl:getstat/1 and ssl:getstat/2\n\n Own Id: OTP-13415\n\n- TLS distribution connections now allow specifying the options `verify_fun`,\n `crl_check` and `crl_cache`. See the documentation. GitHub pull req #956\n contributed by Magnus Henoch.\n\n Own Id: OTP-13429 Aux Id: Pull#956\n\n- Remove confusing error message when closing a distributed erlang node running\n over TLS\n\n Own Id: OTP-13431\n\n- Remove default support for use of md5 in TLS 1.2 signature algorithms\n\n Own Id: OTP-13463\n\n- ssl now uses gen_statem instead of gen_fsm to implement the ssl connection\n process, this solves some timing issues in addition to making the code more\n intuitive as the behaviour can be used cleanly instead of having a lot of\n workaround for shortcomings of the behaviour.\n\n Own Id: OTP-13464\n\n- Phase out interoperability with clients that offer SSLv2. By default they are\n no longer supported, but an option to provide interoperability is offered.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13465\n\n- OpenSSL has functions to generate short (eight hex digits) hashes of issuers\n of certificates and CRLs. These hashes are used by the \"c_rehash\" script to\n populate directories of CA certificates and CRLs, e.g. in the Apache web\n server. Add functionality to let an Erlang program find the right CRL for a\n given certificate in such a directory.\n\n Own Id: OTP-13530\n\n- Some legacy TLS 1.0 software does not tolerate the 1/n-1 content split BEAST\n mitigation technique. Add a beast_mitigation SSL option (defaulting to\n one_n_minus_one) to select or disable the BEAST mitigation technique.\n\n Own Id: OTP-13629\n\n- Enhance error log messages to facilitate for users to understand the error\n\n Own Id: OTP-13632\n\n- Increased default DH params to 2048-bit\n\n Own Id: OTP-13636\n\n- Propagate CRL unknown CA error so that public_key validation process continues\n correctly and determines what should happen.\n\n Own Id: OTP-13656\n\n- Introduce a flight concept for handshake packages. This is a preparation for\n enabling DTLS, however it can also have a positive effects for TLS on slow and\n unreliable networks.\n\n Own Id: OTP-13678","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3.3.2 - SSL Release Notes","ref":"notes.html#ssl-7-3-3-2"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.3 - SSL Release Notes","ref":"notes.html#ssl-7-3-3"},{"type":"extras","doc":"- Correct ssl:prf/5 to use the negotiated cipher suite's prf function in\n ssl:prf/5 instead of the default prf.\n\n Own Id: OTP-13546\n\n- Timeouts may have the value 0, guards have been corrected to allow this\n\n Own Id: OTP-13635\n\n- Change of internal handling of hash sign pairs as the used one enforced to\n much restrictions making some valid combinations unavailable.\n\n Own Id: OTP-13670","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.3.0.1 - SSL Release Notes","ref":"notes.html#ssl-7-3-3-0-1"},{"type":"extras","doc":"- An erlang TLS server configured with cipher suites using rsa key exchange, may\n be vulnerable to an Adaptive Chosen Ciphertext attack (AKA Bleichenbacher\n attack) against RSA, which when exploited, may result in plaintext recovery of\n encrypted messages and/or a Man-in-the-middle (MiTM) attack, despite the\n attacker not having gained access to the server’s private key itself.\n [CVE-2017-1000385](https://nvd.nist.gov/vuln/detail/CVE-2017-1000385)\n\n Exploiting this vulnerability to perform plaintext recovery of encrypted\n messages will, in most practical cases, allow an attacker to read the\n plaintext only after the session has completed. Only TLS sessions established\n using RSA key exchange are vulnerable to this attack.\n\n Exploiting this vulnerability to conduct a MiTM attack requires the attacker\n to complete the initial attack, which may require thousands of server\n requests, during the handshake phase of the targeted session within the window\n of the configured handshake timeout. This attack may be conducted against any\n TLS session using RSA signatures, but only if cipher suites using RSA key\n exchange are also enabled on the server. The limited window of opportunity,\n limitations in bandwidth, and latency make this attack significantly more\n difficult to execute.\n\n RSA key exchange is enabled by default although least prioritized if server\n order is honored. For such a cipher suite to be chosen it must also be\n supported by the client and probably the only shared cipher suite.\n\n Captured TLS sessions encrypted with ephemeral cipher suites (DHE or ECDHE)\n are not at risk for subsequent decryption due to this vulnerability.\n\n As a workaround if default cipher suite configuration was used you can\n configure the server to not use vulnerable suites with the ciphers option like\n this:\n\n `{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,Suite) =/= rsa]}`\n\n that is your code will look somethingh like this:\n\n `ssl:listen(Port, [{ciphers, [Suite || Suite <- ssl:cipher_suites(), element(1,S) =/= rsa]} | Options]).`\n\n Thanks to Hanno Böck, Juraj Somorovsky and Craig Young for reporting this\n vulnerability.\n\n Own Id: OTP-14748","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Create a little randomness in sending of session invalidation messages, to\n mitigate load when whole table is invalidated.\n\n Own Id: OTP-13490","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3.2 - SSL Release Notes","ref":"notes.html#ssl-7-3-2"},{"type":"extras","doc":"- Correct cipher suites conversion and guard expression. Caused problems with\n GCM cipher suites and client side option to set signature_algorithms extension\n values.\n\n Own Id: OTP-13525","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 7.3.1 - SSL Release Notes","ref":"notes.html#ssl-7-3-1"},{"type":"extras","doc":"- Corrections to cipher suite handling using the 3 and 4 tuple format in\n addition to commit 89d7e21cf4ae988c57c8ef047bfe85127875c70c\n\n Own Id: OTP-13511","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make values for the TLS-1.2 signature_algorithms extension configurable\n\n Own Id: OTP-13261","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.3 - SSL Release Notes","ref":"notes.html#ssl-7-3"},{"type":"extras","doc":"- Make sure there is only one poller validator at a time for validating the\n session cache.\n\n Own Id: OTP-13185\n\n- A timing related issue could cause ssl to hang, especially happened with newer\n versions of OpenSSL in combination with ECC ciphers.\n\n Own Id: OTP-13253\n\n- Work around a race condition in the TLS distribution start.\n\n Own Id: OTP-13268\n\n- Big handshake messages are now correctly fragmented in the TLS record layer.\n\n Own Id: OTP-13306\n\n- Improve portability of ECC tests in Crypto and SSL for \"exotic\" OpenSSL\n versions.\n\n Own Id: OTP-13311\n\n- Certificate extensions marked as critical are ignored when using verify_none\n\n Own Id: OTP-13377\n\n- If a certificate doesn't contain a CRL Distribution Points extension, and the\n relevant CRL is not in the cache, and the `crl_check` option is not set to\n `best_effort` , the revocation check should fail.\n\n Own Id: OTP-13378\n\n- Enable TLS distribution over IPv6\n\n Own Id: OTP-13391","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improve error reporting for TLS distribution\n\n Own Id: OTP-13219\n\n- Include options from connect, listen and accept in\n `connection_information/1,2`\n\n Own Id: OTP-13232\n\n- Allow adding extra options for outgoing TLS distribution connections, as\n supported for plain TCP connections.\n\n Own Id: OTP-13285\n\n- Use loopback as server option in TLS-distribution module\n\n Own Id: OTP-13300\n\n- Verify certificate signature against original certificate binary.\n\n This avoids bugs due to encoding errors when re-encoding a decode certificate.\n As there exists several decode step and using of different ASN.1 specification\n this is a risk worth avoiding.\n\n Own Id: OTP-13334\n\n- Use `application:ensure_all_started/2` instead of hard-coding dependencies\n\n Own Id: OTP-13363","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.2 - SSL Release Notes","ref":"notes.html#ssl-7-2"},{"type":"extras","doc":"- Honor distribution port range options\n\n Own Id: OTP-12838\n\n- Correct supervisor specification in TLS distribution.\n\n Own Id: OTP-13134\n\n- Correct cache timeout\n\n Own Id: OTP-13141\n\n- Avoid crash and restart of ssl process when key file does not exist.\n\n Own Id: OTP-13144\n\n- Enable passing of raw socket options on the format \\{raw,_,_,\\_\\} to the\n underlying socket.\n\n Own Id: OTP-13166\n\n- Hibernation with small or a zero timeout will now work as expected\n\n Own Id: OTP-13189","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add upper limit for session cache, configurable on ssl application level.\n\n If upper limit is reached, invalidate the current cache entries, e.i the\n session lifetime is the max time a session will be kept, but it may be\n invalidated earlier if the max limit for the table is reached. This will keep\n the ssl manager process well behaved, not exhusting memory. Invalidating the\n entries will incrementally empty the cache to make room for fresh sessions\n entries.\n\n Own Id: OTP-12392\n\n- Use new time functions to measure passed time.\n\n Own Id: OTP-12457\n\n- Improved error handling in TLS distribution\n\n Own Id: OTP-13142\n\n- Distribution over TLS now honors the nodelay distribution flag\n\n Own Id: OTP-13143","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.1 - SSL Release Notes","ref":"notes.html#ssl-7-1"},{"type":"extras","doc":"- Add DER encoded ECPrivateKey as valid input format for key option.\n\n Own Id: OTP-12974\n\n- Correct return value of default session callback module\n\n This error had the symptom that the client check for unique session would\n always fail, potentially making the client session table grow a lot and\n causing long setup times.\n\n Own Id: OTP-12980","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add possibility to downgrade an SSL/TLS connection to a tcp connection, and\n give back the socket control to a user process.\n\n This also adds the possibility to specify a timeout to the ssl:close function.\n\n Own Id: OTP-11397\n\n- Add application setting to be able to change fatal alert shutdown timeout,\n also shorten the default timeout. The fatal alert timeout is the number of\n milliseconds between sending of a fatal alert and closing the connection.\n Waiting a little while improves the peers chances to properly receiving the\n alert so it may shutdown gracefully.\n\n Own Id: OTP-12832","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 7.0 - SSL Release Notes","ref":"notes.html#ssl-7-0"},{"type":"extras","doc":"- Ignore signature_algorithm (TLS 1.2 extension) sent to TLS 1.0 or TLS 1.1\n server\n\n Own Id: OTP-12670\n\n- Improve error handling in TLS distribution module to avoid lingering sockets.\n\n Own Id: OTP-12799 Aux Id: Tom Briden\n\n- Add option \\{client_renegotiation, boolean()\\} option to the server-side of\n the SSL application.\n\n Own Id: OTP-12815","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add new API functions to handle CRL-verification\n\n Own Id: OTP-10362 Aux Id: kunagi-215 \\[126]\n\n- Remove default support for SSL-3.0, due to Poodle vunrability in protocol\n specification.\n\n Add padding check for TLS-1.0 to remove Poodle vunrability from TLS 1.0, also\n add the option padding_check. This option only affects TLS-1.0 connections and\n if set to false it disables the block cipher padding check to be able to\n interoperate with legacy software.\n\n Remove default support for RC4 cipher suites, as they are consider too weak.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12390\n\n- Add support for TLS ALPN (Application-Layer Protocol Negotiation) extension.\n\n Own Id: OTP-12580\n\n- Add SNI (Server Name Indication) support for the server side.\n\n Own Id: OTP-12736","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 6.0.1.1 - SSL Release Notes","ref":"notes.html#ssl-6-0-1-1"},{"type":"extras","doc":"- Gracefully ignore proprietary hash_sign algorithms\n\n Own Id: OTP-12829","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 6.0.1 - SSL Release Notes","ref":"notes.html#ssl-6-0-1"},{"type":"extras","doc":"- Terminate gracefully when receiving bad input to premaster secret calculation\n\n Own Id: OTP-12783","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 6.0 - SSL Release Notes","ref":"notes.html#ssl-6-0"},{"type":"extras","doc":"- Exclude self-signed trusted anchor certificates from certificate prospective\n certification path according to RFC 3280.\n\n This will avoid some unnecessary certificate processing.\n\n Own Id: OTP-12449","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Separate client and server session cache internally.\n\n Avoid session table growth when client starts many connections in such a\n manner that many connections are started before session reuse is possible.\n Only save a new session in client if there is no equivalent session already\n stored.\n\n Own Id: OTP-11365\n\n- The PEM cache is now validated by a background process, instead of always\n keeping it if it is small enough and clearing it otherwise. That strategy\n required that small caches where cleared by API function if a file changes on\n disk.\n\n However export the API function to clear the cache as it may still be useful.\n\n Own Id: OTP-12391\n\n- Add padding check for TLS-1.0 to remove Poodle vulnerability from TLS 1.0,\n also add the option padding_check. This option only affects TLS-1.0\n connections and if set to false it disables the block cipher padding check to\n be able to interoperate with legacy software.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12420\n\n- Add support for TLS_FALLBACK_SCSV used to prevent undesired TLS version\n downgrades. If used by a client that is vulnerable to the POODLE attack, and\n the server also supports TLS_FALLBACK_SCSV, the attack can be prevented.\n\n Own Id: OTP-12458","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.8 - SSL Release Notes","ref":"notes.html#ssl-5-3-8"},{"type":"extras","doc":"- Make sure the clean rule for ssh, ssl, eunit and otp_mibs actually removes\n generated files.\n\n Own Id: OTP-12200","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Change code to reflect that state data may be secret to avoid breaking\n dialyzer contracts.\n\n Own Id: OTP-12341","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.7 - SSL Release Notes","ref":"notes.html#ssl-5-3-7"},{"type":"extras","doc":"- Handle the fact that servers may send an empty SNI extension to the client.\n\n Own Id: OTP-12198","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.3.6 - SSL Release Notes","ref":"notes.html#ssl-5-3-6"},{"type":"extras","doc":"- Corrected handling of ECC certificates, there where several small issues with\n the handling of such certificates in the ssl and public_key application. Now\n ECC signed ECC certificates shall work and not only RSA signed ECC\n certificates.\n\n Own Id: OTP-12026\n\n- Check that the certificate chain ends with a trusted ROOT CA e.i. a\n self-signed certificate, but provide an option partial_chain to enable the\n application to define an intermediat CA as trusted.\n\n Own Id: OTP-12149","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add decode functions for SNI (Server Name Indication)\n\n Own Id: OTP-12048","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.5 - SSL Release Notes","ref":"notes.html#ssl-5-3-5"},{"type":"extras","doc":"- ssl:recv now returns \\{error, einval\\} if applied to a non passive socket, the\n same as gen_tcp:recv.\n\n Thanks to Danil Zagoskin for reporting this issue\n\n Own Id: OTP-11878\n\n- Corrected handling of default values for signature_algorithms extension in\n TLS-1.2 and corresponding values used in previous versions that does not\n support this extension.\n\n Thanks to Danil Zagoskin\n\n Own Id: OTP-11886\n\n- Handle socket option inheritance when pooling of accept sockets is used\n\n Own Id: OTP-11897\n\n- Make sure that the list of versions, possibly supplied in the versions option,\n is not order dependent.\n\n Thanks to Ransom Richardson for reporting this issue\n\n Own Id: OTP-11912\n\n- Reject connection if the next_protocol message is sent twice.\n\n Own Id: OTP-11926\n\n- Correct options handling when ssl:ssl_accept/3 is called with new ssl options\n after calling ssl:listen/2\n\n Own Id: OTP-11950","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Gracefully handle unknown alerts\n\n Thanks to Atul Atri for reporting this issue\n\n Own Id: OTP-11874\n\n- Gracefully ignore cipher suites sent by client not supported by the SSL/TLS\n version that the client has negotiated.\n\n Thanks to Danil Zagoskin for reporting this issue\n\n Own Id: OTP-11875\n\n- Gracefully handle structured garbage, i.e a client sends some garbage in a ssl\n record instead of a valid fragment.\n\n Thanks to Danil Zagoskin\n\n Own Id: OTP-11880\n\n- Gracefully handle invalid alerts\n\n Own Id: OTP-11890\n\n- Generalize handling of default ciphers\n\n Thanks to Andreas Schultz\n\n Own Id: OTP-11966\n\n- Make sure change cipher spec is correctly handled\n\n Own Id: OTP-11975","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.4 - SSL Release Notes","ref":"notes.html#ssl-5-3-4"},{"type":"extras","doc":"- Fix incorrect dialyzer spec and types, also enhance documentation.\n\n Thanks to Ayaz Tuncer.\n\n Own Id: OTP-11627\n\n- Fix possible mismatch between SSL/TLS version and default ciphers. Could\n happen when you specified SSL/TLS-version in optionlist to listen or accept.\n\n Own Id: OTP-11712\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Moved elliptic curve definition from the crypto NIF/OpenSSL into Erlang code,\n adds the RFC-5639 brainpool curves and makes TLS use them (RFC-7027).\n\n Thanks to Andreas Schultz\n\n Own Id: OTP-11578\n\n- Unicode adaptations\n\n Own Id: OTP-11620\n\n- Added option honor_cipher_order. This instructs the server to prefer its own\n cipher ordering rather than the client's and can help protect against things\n like BEAST while maintaining compatibility with clients which only support\n older ciphers.\n\n Thanks to Andrew Thompson for the implementation, and Andreas Schultz for the\n test cases.\n\n Own Id: OTP-11621\n\n- Replace boolean checking in validate_option with is_boolean guard.\n\n Thanks to Andreas Schultz.\n\n Own Id: OTP-11634\n\n- Some function specs are corrected or moved and some edoc comments are\n corrected in order to allow use of edoc. (Thanks to Pierre Fenoll)\n\n Own Id: OTP-11702\n\n- Correct clean up of certificate database when certs are inputted in pure DER\n format.The incorrect code could cause a memory leek when certs where inputted\n in DER. Thanks to Bernard Duggan for reporting this.\n\n Own Id: OTP-11733\n\n- Improved documentation of the cacertfile option\n\n Own Id: OTP-11759 Aux Id: seq12535\n\n- Avoid next protocol negotiation failure due to incorrect option format.\n\n Own Id: OTP-11760\n\n- Handle v1 CRLs, with no extensions and fixes issues with IDP (Issuing\n Distribution Point) comparison during CRL validation.\n\n Thanks to Andrew Thompson\n\n Own Id: OTP-11761\n\n- Server now ignores client ECC curves that it does not support instead of\n crashing.\n\n Thanks to Danil Zagoskin for reporting the issue and suggesting a solution.\n\n Own Id: OTP-11780\n\n- Handle SNI (Server Name Indication) alert unrecognized_name and gracefully\n deal with unexpected alerts.\n\n Thanks to Masatake Daimon for reporting this.\n\n Own Id: OTP-11815\n\n- Add possibility to specify ssl options when calling ssl:ssl_accept\n\n Own Id: OTP-11837","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.3 - SSL Release Notes","ref":"notes.html#ssl-5-3-3"},{"type":"extras","doc":"- Add missing validation of the server_name_indication option and test for its\n explicit use. It was not possible to set or disable the default\n server_name_indication as the validation of the option was missing.\n\n Own Id: OTP-11567\n\n- Elliptic curve selection in server mode now properly selects a curve suggested\n by the client, if possible, and the fallback alternative is changed to a more\n widely supported curve.\n\n Own Id: OTP-11575\n\n- Bug in the TLS hello extension handling caused the server to behave as it did\n not understand secure renegotiation.\n\n Own Id: OTP-11595","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.3.2 - SSL Release Notes","ref":"notes.html#ssl-5-3-2"},{"type":"extras","doc":"- Honors the clients advertised support of elliptic curves and no longer sends\n incorrect elliptic curve extension in server hello.\n\n Own Id: OTP-11370\n\n- Fix initialization of DTLS fragment reassembler, in previously contributed\n code, for future support of DTLS . Thanks to Andreas Schultz.\n\n Own Id: OTP-11376\n\n- Corrected type error in client_preferred_next_protocols documentation. Thanks\n to Julien Barbot.\n\n Own Id: OTP-11457","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- TLS code has been refactored to prepare for future DTLS support. Also some\n DTLS code is in place but not yet runnable, some of it contributed by Andreas\n Schultz and some of it written by the OTP team. Thanks to to Andreas for his\n participation.\n\n Own Id: OTP-11292\n\n- Remove extraneous dev debug code left in the close function. Thanks to Ken\n Key.\n\n Own Id: OTP-11447\n\n- Add SSL Server Name Indication (SNI) client support. Thanks to Julien Barbot.\n\n Own Id: OTP-11460","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3.1 - SSL Release Notes","ref":"notes.html#ssl-5-3-1"},{"type":"extras","doc":"- Setopts during renegotiation caused the renegotiation to be unsuccessful.\n\n If calling setopts during a renegotiation the FSM state might change during\n the handling of the setopts messages, this is now handled correctly.\n\n Own Id: OTP-11228\n\n- Now handles signature_algorithm field in digitally_signed properly with proper\n defaults. Prior to this change some elliptic curve cipher suites could fail\n reporting the error \"bad certificate\".\n\n Own Id: OTP-11229\n\n- The code emulating the inet header option was changed in the belief that it\n made it inet compatible. However the testing is a bit hairy as the inet option\n is actually broken, now the tests are corrected and the header option should\n work in the same broken way as inet again, preferably use the bitsyntax\n instead.\n\n Own Id: OTP-11230","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make the ssl manager name for erlang distribution over SSL/TLS relative to the\n module name of the ssl_manager.\n\n This can be beneficial when making tools that rename modules for internal\n processing in the tool.\n\n Own Id: OTP-11255\n\n- Add documentation regarding log_alert option.\n\n Own Id: OTP-11271","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.3 - SSL Release Notes","ref":"notes.html#ssl-5-3"},{"type":"extras","doc":"- Honor the versions option to ssl:connect and ssl:listen.\n\n Own Id: OTP-10905\n\n- Next protocol negotiation with reused sessions will now succeed\n\n Own Id: OTP-10909","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for PSK (Pre Shared Key) and SRP (Secure Remote Password) cipher\n suites, thanks to Andreas Schultz.\n\n Own Id: OTP-10450 Aux Id: kunagi-269 \\[180]\n\n- Fix SSL Next Protocol Negotiation documentation. Thanks to Julien Barbot.\n\n Own Id: OTP-10955\n\n- Fix ssl_connection to support reading proxy/chain certificates. Thanks to\n Valentin Kuznetsov.\n\n Own Id: OTP-10980\n\n- Integrate elliptic curve contribution from Andreas Schultz\n\n In order to be able to support elliptic curve cipher suites in SSL/TLS,\n additions to handle elliptic curve infrastructure has been added to public_key\n and crypto.\n\n This also has resulted in a rewrite of the crypto API to gain consistency and\n remove unnecessary overhead. All OTP applications using crypto has been\n updated to use the new API.\n\n Impact: Elliptic curve cryptography (ECC) offers equivalent security with\n smaller key sizes than other public key algorithms. Smaller key sizes result\n in savings for power, memory, bandwidth, and computational cost that make ECC\n especially attractive for constrained environments.\n\n Own Id: OTP-11009","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.2.1 - SSL Release Notes","ref":"notes.html#ssl-5-2-1"},{"type":"extras","doc":"- Transport callback handling is changed so that gen_tcp is treated as a special\n case where inet will be called directly for functions such as setopts, as\n gen_tcp does not have its own setopts. This will enable users to use the\n transport callback for other customizations such as websockets.\n\n Own Id: OTP-10847\n\n- Follow up to OTP-10451 solved in ssl-5.2 R16A. Make sure format_error return\n good strings. Replace confusing legacy atoms with more descriptive atoms.\n\n Own Id: OTP-10864","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1.2.1 - SSL Release Notes","ref":"notes.html#ssl-5-1-2-1"},{"type":"extras","doc":"- Make log_alert configurable as option in ssl, SSLLogLevel added as option to\n inets conf file\n\n Own Id: OTP-11259","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.2 - SSL Release Notes","ref":"notes.html#ssl-5-2"},{"type":"extras","doc":"- SSL: TLS 1.2, advertise sha224 support, thanks to Andreas Schultz.\n\n Own Id: OTP-10586\n\n- If an ssl server is restarted with new options and a client tries to reuse a\n session the server must make sure that it complies to the new options before\n agreeing to reuse it.\n\n Own Id: OTP-10595\n\n- Now handles cleaning of CA-certificate database correctly so that there will\n be no memory leek, bug was introduced in ssl- 5.1 when changing implementation\n to increase parallel execution.\n\n Impact: Improved memory usage, especially if you have many different\n certificates and upgrade tcp-connections to TLS-connections.\n\n Own Id: OTP-10710","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support Next Protocol Negotiation in TLS, thanks to Ben Murphy for the\n contribution.\n\n Impact: Could give performance benefit if used as it saves a round trip.\n\n Own Id: OTP-10361 Aux Id: kunagi-214 \\[125]\n\n- TLS 1.2 will now be the default TLS version if sufficient crypto support is\n available otherwise TLS 1.1 will be default.\n\n Impact: A default TLS connection will have higher security and hence it may be\n perceived as slower then before.\n\n Own Id: OTP-10425 Aux Id: kunagi-275 \\[186]\n\n- It is now possible to call controlling_process on a listen socket, same as in\n gen_tcp.\n\n Own Id: OTP-10447\n\n- Remove filter mechanisms that made error messages backwards compatible with\n old ssl but hid information about what actually happened.\n\n This does not break the documented API however other reason terms may be\n returned, so code that matches on the reason part of \\{error, Reason\\} may\n fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10451 Aux Id: kunagi-270 \\[181]\n\n- Added missing dependencies to Makefile\n\n Own Id: OTP-10594\n\n- Removed deprecated function ssl:pid/0, it has been pointless since R14 but has\n been keep for backwards compatibility.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10613 Aux Id: kunagi-331 \\[242]\n\n- Refactor to simplify addition of key exchange methods, thanks to Andreas\n Schultz.\n\n Own Id: OTP-10709","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1.2 - SSL Release Notes","ref":"notes.html#ssl-5-1-2"},{"type":"extras","doc":"- ssl:ssl_accept/2 timeout is no longer ignored\n\n Own Id: OTP-10600","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.1.1 - SSL Release Notes","ref":"notes.html#ssl-5-1-1"},{"type":"extras","doc":"- ssl:recv/3 could \"loose\" data when the timeout occurs. If the timeout in\n ssl:connect or ssl:ssl_accept expired the ssl connection process was not\n terminated as it should, this due to gen_fsm:send_all_state_event timeout is a\n client side time out. These timouts are now handled by the gen_fsm-procss\n instead.\n\n Own Id: OTP-10569","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Better termination handling that avoids hanging.\n\n Own Id: OTP-10574","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.1 - SSL Release Notes","ref":"notes.html#ssl-5-1"},{"type":"extras","doc":"- Sometimes the client process could receive an extra \\{error, closed\\} message\n after ssl:recv had returned \\{error, closed\\}.\n\n Own Id: OTP-10118\n\n- ssl v3 alert number 41 (no_certificate_RESERVED) is now recognized\n\n Own Id: OTP-10196","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Experimental support for TLS 1.1 is now available, will be officially\n supported from OTP-R16. Thanks to Andreas Schultz for implementing the first\n version.\n\n Own Id: OTP-8871\n\n- Experimental support for TLS 1.2 is now available, will be officially\n supported from OTP-R16. Thanks to Andreas Schultz for implementing the first\n version.\n\n Own Id: OTP-8872\n\n- Removed some bottlenecks increasing the applications parallelism especially\n for the client side.\n\n Own Id: OTP-10113\n\n- Workaround for handling certificates that wrongly encode X509countryname in\n utf-8 when the actual value is a valid ASCCI value of length 2. Such\n certificates are accepted by many browsers such as Chrome and Fierfox so for\n interoperability reasons we will too.\n\n Own Id: OTP-10222","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 5.0.1 - SSL Release Notes","ref":"notes.html#ssl-5-0-1"},{"type":"extras","doc":"- Robustness and improvement to distribution over SSL\n\n Fix a bug where ssl_tls_dist_proxy would crash at caller timeout. Fix a bug\n where a timeout from the SSL layer would block the distribution indefinitely.\n Run the proxy exclusively on the loopback interface. (Thanks to Paul Guyot)\n\n Own Id: OTP-9915\n\n- Fix setup loop of SSL TLS dist proxy\n\n Fix potential leak of processes waiting indefinitely for data from closed\n sockets during socket setup phase. (Thanks to Paul Guyot)\n\n Own Id: OTP-9916\n\n- Correct spelling of registered (Thanks to Richard Carlsson)\n\n Own Id: OTP-9925\n\n- Added TLS PRF function to the SSL API for generation of additional key\n material from a TLS session. (Thanks to Andreas Schultz)\n\n Own Id: OTP-10024","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 5.0 - SSL Release Notes","ref":"notes.html#ssl-5-0"},{"type":"extras","doc":"- Invalidation handling of sessions could cause the time_stamp field in the\n session record to be set to undefined crashing the session clean up process.\n This did not affect the connections but would result in that the session table\n would grow.\n\n Own Id: OTP-9696 Aux Id: seq11947\n\n- Changed code to use ets:foldl and throw instead of ets:next traversal,\n avoiding the need to explicitly call ets:safe_fixtable. It was possible to get\n a badarg-crash under special circumstances.\n\n Own Id: OTP-9703 Aux Id: seq11947\n\n- Send ssl_closed notification to active ssl user when a tcp error occurs.\n\n Own Id: OTP-9734 Aux Id: seq11946\n\n- If a passive receive was ongoing during a renegotiation the process evaluating\n ssl:recv could be left hanging for ever.\n\n Own Id: OTP-9744","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support for the old ssl implementation is dropped and the code is removed.\n\n Own Id: OTP-7048\n\n- The erlang distribution can now be run over the new ssl implementation. All\n options can currently not be set but it is enough to replace to old ssl\n implementation.\n\n Own Id: OTP-7053\n\n- public_key, ssl and crypto now supports PKCS-8\n\n Own Id: OTP-9312\n\n- Implements a CBC timing attack counter measure. Thanks to Andreas Schultz for\n providing the patch.\n\n Own Id: OTP-9683\n\n- Mitigates an SSL/TLS Computational DoS attack by disallowing the client to\n renegotiate many times in a row in a short time interval, thanks to Tuncer\n Ayaz for alerting us about this.\n\n Own Id: OTP-9739\n\n- Implements the 1/n-1 splitting countermeasure to the Rizzo Duong BEAST attack,\n affects SSL 3.0 and TLS 1.0. Thanks to Tuncer Ayaz for alerting us about this.\n\n Own Id: OTP-9750","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.6 - SSL Release Notes","ref":"notes.html#ssl-4-1-6"},{"type":"extras","doc":"- replace \"a ssl\" with \"an ssl\" reindent pkix_path_validation/3 Trivial\n documentation fixes (Thanks to Christian von Roques )\n\n Own Id: OTP-9464","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Adds function clause to avoid denial of service attack. Thanks to Vinod for\n reporting this vulnerability.\n\n Own Id: OTP-9364\n\n- Error handling code now takes care of inet:getopts/2 and inets:setopts/2\n crashes. Thanks to Richard Jones for reporting this.\n\n Own Id: OTP-9382\n\n- Support explicit use of packet option httph and httph_bin\n\n Own Id: OTP-9461\n\n- Decoding of hello extensions could fail to come to the correct conclusion due\n to an error in a binary match pattern. Thanks to Ben Murphy.\n\n Own Id: OTP-9589","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.5 - SSL Release Notes","ref":"notes.html#ssl-4-1-5"},{"type":"extras","doc":"- Calling gen_tcp:connect with option \\{ip, \\{127,0,0,1\\}\\} results in an exit\n with reason badarg. Neither SSL nor INETS This was not caught, resulting in\n crashes with incomprehensible reasons.\n\n Own Id: OTP-9289 Aux Id: seq11845","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1.3 - SSL Release Notes","ref":"notes.html#ssl-4-1-3"},{"type":"extras","doc":"- Fixed error in cache-handling fix from ssl-4.1.2\n\n Own Id: OTP-9018 Aux Id: seq11739\n\n- Verification of a critical extended_key_usage-extension corrected\n\n Own Id: OTP-9029 Aux Id: seq11541","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 4.1.2 - SSL Release Notes","ref":"notes.html#ssl-4-1-2"},{"type":"extras","doc":"- The ssl application caches certificate files, it will now invalidate cache\n entries if the diskfile is changed.\n\n Own Id: OTP-8965 Aux Id: seq11739\n\n- Now runs the terminate function before returning from the call made by\n ssl:close/1, as before the caller of ssl:close/1 could get problems with the\n reuseaddr option.\n\n Own Id: OTP-8992","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"SSL 4.1.1 - SSL Release Notes","ref":"notes.html#ssl-4-1-1"},{"type":"extras","doc":"- Correct handling of client certificate verify message When checking the client\n certificate verify message the server used the wrong algorithm identifier to\n determine the signing algorithm, causing a function clause error in the\n public_key application when the key-exchange algorithm and the public key\n algorithm of the client certificate happen to differ.\n\n Own Id: OTP-8897","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- For testing purposes ssl now also support some anonymous cipher suites when\n explicitly configured to do so.\n\n Own Id: OTP-8870\n\n- Sends an error alert instead of crashing if a crypto function for the selected\n cipher suite fails.\n\n Own Id: OTP-8930 Aux Id: seq11720","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.1 - SSL Release Notes","ref":"notes.html#ssl-4-1"},{"type":"extras","doc":"- Updated ssl to ignore CA certs that violate the asn1-spec for a certificate,\n and updated public key asn1 spec to handle inherited DSS-params.\n\n Own Id: OTP-7884\n\n- Changed ssl implementation to retain backwards compatibility for old option\n \\{verify, 0\\} that shall be equivalent to \\{verify, verify_none\\}, also\n separate the cases unknown ca and selfsigned peer cert, and restored return\n value of deprecated function public_key:pem_to_der/1.\n\n Own Id: OTP-8858\n\n- Changed the verify fun so that it differentiate between the peer certificate\n and CA certificates by using valid_peer or valid as the second argument to the\n verify fun. It may not always be trivial or even possible to know when the\n peer certificate is reached otherwise.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8873","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.0.1 - SSL Release Notes","ref":"notes.html#ssl-4-0-1"},{"type":"extras","doc":"- The server now verifies the client certificate verify message correctly,\n instead of causing a case-clause.\n\n Own Id: OTP-8721\n\n- The client hello message now always include ALL available cipher suites (or\n those specified by the ciphers option). Previous implementation would filter\n them based on the client certificate key usage extension (such filtering only\n makes sense for the server certificate).\n\n Own Id: OTP-8772\n\n- Fixed handling of the option \\{mode, list\\} that was broken for some packet\n types for instance line.\n\n Own Id: OTP-8785\n\n- Empty packets were not delivered to the client.\n\n Own Id: OTP-8790\n\n- Building in a source tree without prebuilt platform independent build results\n failed on the SSL examples when:\n\n - cross building. This has been solved by not building the SSL examples during\n a cross build.\n - building on Windows.\n\n Own Id: OTP-8791\n\n- Fixed a handshake error which occurred on some ssl implementations.\n\n Own Id: OTP-8793","title":"Fixed Bugs and Malfunctions - SSL Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Revise the public_key API - Cleaned up and documented the public_key API to\n make it useful for general use, also changed ssl to use the new API.\n\n Own Id: OTP-8722\n\n- Added support for inputing certificates and keys directly in DER format these\n options will override the pem-file options if specified.\n\n Own Id: OTP-8723\n\n- To gain interoperability ssl will not check for padding errors when using TLS\n 1.0. It is first in TLS 1.1 that checking the padding is an requirement.\n\n Own Id: OTP-8740\n\n- Changed the semantics of the verify_fun option in the ssl-application so that\n it takes care of both application handling of path validation errors and\n verification of application specific extensions. This means that it is now\n possible for the server application in verify_peer mode to handle path\n validation errors. This change moved some functionality earlier in ssl to the\n public_key application.\n\n Own Id: OTP-8770\n\n- Added the functionality so that the verification fun will be called when a\n certificate is considered valid by the path validation to allow access to each\n certificate in the path to the user application. Also try to verify\n subject-AltName, if unable to verify it let the application verify it.\n\n Own Id: OTP-8825","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"SSL 4.0 - SSL Release Notes","ref":"notes.html#ssl-4-0"},{"type":"extras","doc":"- New ssl now support client/server-certificates signed by dsa keys.\n\n Own Id: OTP-8587\n\n- Ssl has now switched default implementation and removed deprecated certificate\n handling. All certificate handling is done by the public_key application.\n\n Own Id: OTP-8695","title":"Improvements and New Features - SSL Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"\n\n# TLS/DTLS Protocol Overview","title":"TLS/DTLS Protocol Overview","ref":"ssl_protocol.html"},{"type":"extras","doc":"Transport Layer Security (TLS) and its predecessor, the Secure Sockets Layer\n(SSL), are cryptographic protocols designed to provide communications security\nover a computer network. The protocols use X.509 certificates and hence public\nkey (asymmetric) cryptography to authenticate the counterpart with whom they\ncommunicate, and to exchange a symmetric key for payload encryption. The\nprotocol provides data/message confidentiality (encryption), integrity (through\nmessage authentication code checks) and host verification (through certificate\npath validation). DTLS (Datagram Transport Layer Security) that is based on TLS\nbut datagram oriented instead of stream oriented.\n\n# Erlang Support\n\nThe Erlang SSL application implements the TLS/DTLS protocol for the currently\nsupported versions, see the `m:ssl` manual page.\n\nBy default TLS is run over the TCP/IP protocol even though you can plug in any\nother reliable transport protocol with the same Application Programming\nInterface (API) as the `gen_tcp` module in Kernel. DTLS is by default run over\nUDP/IP, which means that application data has no delivery guarantees. Other\ntransports, such as SCTP, may be supported in future releases.\n\nIf a client and a server wants to use an upgrade mechanism, such as defined by\nRFC 2817, to upgrade a regular TCP/IP connection to a TLS connection, this is\nsupported by the Erlang SSL application API. This can be useful for, for\nexample, supporting HTTP and HTTPS on the same port and implementing virtual\nhosting. Note this is a TLS feature only.","title":"Purpose - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#purpose"},{"type":"extras","doc":"To achieve authentication and privacy, the client and server perform a TLS/DTLS\nhandshake procedure before transmitting or receiving any data. During the\nhandshake, they agree on a protocol version and cryptographic algorithms,\ngenerate shared secrets using public key cryptographies, and optionally\nauthenticate each other with digital certificates.","title":"Security Overview - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#security-overview"},{"type":"extras","doc":"A _symmetric key_ algorithm has one key only. The key is used for both\nencryption and decryption. These algorithms are fast, compared to public key\nalgorithms (using two keys, one public and one private) and are therefore\ntypically used for encrypting bulk data.\n\nThe keys for the symmetric encryption are generated uniquely for each connection\nand are based on a secret negotiated in the TLS/DTLS handshake.\n\nThe TLS/DTLS handshake protocol and data transfer is run on top of the TLS/DTLS\nRecord Protocol, which uses a keyed-hash Message Authenticity Code (MAC), or a\nHash-based MAC (HMAC), to protect the message data integrity. From the TLS RFC:\n\"A Message Authentication Code is a one-way hash computed from a message and\nsome secret data. It is difficult to forge without knowing the secret data. Its\npurpose is to detect if the message has been altered.\"","title":"Data Privacy and Integrity - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#data-privacy-and-integrity"},{"type":"extras","doc":"A certificate is similar to a driver's license, or a passport. The holder of the\ncertificate is called the _subject_. The certificate is signed with the private\nkey of the issuer of the certificate. A chain of trust is built by having the\nissuer in its turn being certified by another certificate, and so on, until you\nreach the so called root certificate, which is self-signed, that is, issued by\nitself.\n\nCertificates are issued by Certification Authorities (CAs) only. A handful of\ntop CAs in the world issue root certificates. You can examine several of these\ncertificates by clicking through the menus of your web browser.","title":"Digital Certificates - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#digital-certificates"},{"type":"extras","doc":"Authentication of the peer is done by public key path validation as defined in\nRFC 3280. This means basically the following:\n\n- Each certificate in the certificate chain is issued by the previous one.\n- The certificates attributes are valid.\n- The root certificate is a trusted certificate that is present in the trusted\n certificate database kept by the peer.\n\nThe server always sends a certificate chain as part of the TLS handshake, but\nthe client only sends one if requested by the server. If the client does not\nhave an appropriate certificate, it can send an \"empty\" certificate to the\nserver.\n\nThe client can choose to accept some path evaluation errors, for example, a web\nbrowser can ask the user whether to accept an unknown CA root certificate. The\nserver, if it requests a certificate, does however not accept any path\nvalidation errors. It is configurable if the server is to accept or reject an\n\"empty\" certificate as response to a certificate request.","title":"Peer Authentication - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#peer-authentication"},{"type":"extras","doc":"From the TLS RFC: \"A TLS session is an association between a client and a\nserver. Sessions are created by the handshake protocol. Sessions define a set of\ncryptographic security parameters, which can be shared among multiple\nconnections. Sessions are used to avoid the expensive negotiation of new\nsecurity parameters for each connection.\"\n\nSession data is by default kept by the SSL application in a memory storage,\nhence session data is lost at application restart or takeover. Users can define\ntheir own callback module to handle session data storage if persistent data\nstorage is required. Session data is also invalidated when session database\nexceeds its limit or 24 hours after being saved (RFC max lifetime\nrecommendation). The amount of time the session data is to be saved can be\nconfigured.\n\nBy default the TLS/DTLS clients try to reuse an available session and by default\nthe TLS/DTLS servers agree to reuse sessions when clients ask for it. See also\n[Session Reuse Prior to TLS-1.3](using_ssl.md#session-reuse-prior-to-tls-1-3)","title":"TLS Sessions - Prior to TLS-1.3 - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#tls-sessions-prior-to-tls-1-3"},{"type":"extras","doc":"In TLS 1.3 the session reuse is replaced by a new session tickets mechanism\nbased on the prior to shared key concept. This mechanism also obsoletes the session\ntickets from RFC5077, not implemented by this application. See also\n[Session Tickets and Session Resumption in TLS-1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3)","title":"TLS-1.3 session tickets - TLS/DTLS Protocol Overview","ref":"ssl_protocol.html#tls-1-3-session-tickets"},{"type":"extras","doc":"\n# Examples\n\nTo see relevant version information for ssl, call `ssl:versions/0` .\n\nTo see all supported cipher suites, call\n[`ssl:cipher_suites(all, 'tlsv1.3')` ](`ssl:cipher_suites/2`). The available\ncipher suites for a connection depend on the TLS version and prior to TLS-1.3 also on\nthe certificate. To see the default cipher suite list change `all` to `default`.\nNote that TLS 1.3 and previous versions do not have any cipher suites in common,\nfor listing cipher suites for a specific version use\n[`ssl:cipher_suites(exclusive, 'tlsv1.3')` ](`ssl:cipher_suites/2`). Specific\ncipher suites that you want your connection to use can also be specified.\nDefault is to use the strongest available.\n\n\n> #### Warning {: .warning }\n>Enabling cipher suites using RSA as a key exchange algorithm is\n>strongly discouraged (only available prior to TLS-1.3). For some\n>configurations software preventions may exist, and can make them usable if they work,\n>but relying on them to work is risky and there are many more reliable\n>cipher suites that can be used instead.\n\nThe following sections shows small examples of how to set up client/server\nconnections using the Erlang shell. The returned value of the `sslsocket` is\nabbreviated with `[...]` as it can be fairly large and is opaque to the user\nexcept for the purpose of pattern matching.\n\n> #### Note {: .info }\n>\n> Note that client certificate verification is optional for the server and needs\n> additional conguration on both sides to work. The Certificate and keys, in the\n> examples, are provided using the `t:ssl:cert_key_conf/0` supplied in the `certs_keys`\n> introduced in OTP 25.","title":"Examples","ref":"using_ssl.html"},{"type":"extras","doc":"```erlang\n 1 > ssl:start(), ssl:connect(\"google.com\", 443, [{verify, verify_peer},\n {cacerts, public_key:cacerts_get()}]).\n {ok,{sslsocket, [...]}}\n```","title":"Basic Client - Examples","ref":"using_ssl.html#basic-client"},{"type":"extras","doc":"_Step 1:_ Start the server side:\n\n```erlang\n1 server> ssl:start().\nok\n```\n\n_Step 2:_ with alternative certificates, in this example the EDDSA certificate\nwill be preferred if TLS-1.3 is negotiated and the RSA certificate will always\nbe used for TLS-1.2 as it does not support the EDDSA algorithm:\n\n```erlang\n2 server> {ok, ListenSocket} =\nssl:listen(9999, [{certs_keys, [#{certfile => \"eddsacert.pem\",\n keyfile => \"eddsakey.pem\"},\n #{certfile => \"rsacert.pem\",\n keyfile => \"rsakey.pem\",\n password => \"foobar\"}\n ]},{reuseaddr, true}]).\n{ok,{sslsocket, [...]}}\n```\n\n_Step 3:_ Do a transport accept on the TLS listen socket:\n\n```erlang\n3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).\n{ok,{sslsocket, [...]}}\n```\n\n> #### Note {: .info }\n>\n> ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the\n> handshake part can be called in a new erlang process dedicated to handling the\n> connection\n\n_Step 4:_ Start the client side:\n\n```erlang\n1 client> ssl:start().\nok\n```\n\nBe sure to configure trusted certificates to use for server certificate\nverification.\n\n```erlang\n2 client> {ok, Socket} = ssl:connect(\"localhost\", 9999,\n [{verify, verify_peer},\n {cacertfile, \"cacerts.pem\"}, {active, once}], infinity).\n{ok,{sslsocket, [...]}}\n```\n\n_Step 5:_ Do the TLS handshake:\n\n```erlang\n4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).\n{ok,{sslsocket, [...]}}\n```\n\n> #### Note {: .info }\n>\n> A real server should use ssl:handshake/2 that has a timeout to avoid DoS\n> attacks. In the example the timeout defaults to infinty.\n\n_Step 6:_ Send a message over TLS:\n\n```erlang\n5 server> ssl:send(Socket, \"foo\").\nok\n```\n\n_Step 7:_ Flush the shell message queue to see that the message sent on the\nserver side is recived by the client side:\n\n```erlang\n3 client> flush().\nShell got {ssl,{sslsocket,[...]},\"foo\"}\nok\n```","title":"Basic Connection - Examples","ref":"using_ssl.html#basic-connection"},{"type":"extras","doc":"Upgrading a a TCP/IP connection to a TLS connections is mostly used when there\nis a desire have unencrypted communication first and then later secure the\ncommunication channel by using TLS. Note that the client and server need to\nagree to do the upgrade in the protocol doing the communication. This is concept\nis often referenced as `STARTLS` and used in many protocols such as `SMTP`,\n`FTPS` and `HTTPS` via a proxy.\n\n> #### Warning {: .warning }\n>\n> Maximum security recommendations are however moving away from such solutions.\n\nTo upgrade to a TLS connection:\n\n_Step 1:_ Start the server side:\n\n```erlang\n1 server> ssl:start().\n ok\n```\n\n_Step 2:_ Create a normal TCP listen socket and ensure `active` is set to\n`false` and not set to any active mode otherwise TLS handshake messages can be\ndelivered to the wrong process.\n\n```erlang\n2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},\n {active, false}]).\n {ok, #Port<0.475>}\n```\n\n_Step 3:_ Accept client connection:\n\n```erlang\n3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).\n {ok, #Port<0.476>}\n```\n\n_Step 4:_ Start the client side:\n\n```erlang\n1 client> ssl:start().\n ok\n```\n\n```erlang\n2 client> {ok, Socket} = gen_tcp:connect(\"localhost\", 9999, [], infinity).\n```\n\n_Step 5:_ Do the TLS handshake:\n\n```erlang\n4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},\n {fail_if_no_peer_cert, true},\n {cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]}]).\n {ok,{sslsocket,[...]}}\n```\n\n_Step 6:_ Upgrade to a TLS connection. The client and server must agree upon the\nupgrade. The server must be prepared to be a TLS server before the client can do\na successful connect.\n\n```erlang\n3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},\n {cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]}], infinity).\n{ok,{sslsocket,[...]}}\n```\n\n_Step 7:_ Send a message over TLS:\n\n```erlang\n4 client> ssl:send(TLSSocket, \"foo\").\n ok\n```\n\n_Step 8:_ Set `active once` on the TLS socket:\n\n```erlang\n5 server> ssl:setopts(TLSSocket, [{active, once}]).\n ok\n```\n\n_Step 9:_ Flush the shell message queue to see that the message sent on the\nclient side is recived by the server side:\n\n```erlang\n5 server> flush().\n Shell got {ssl,{sslsocket,[...]},\"foo\"}\n ok\n```","title":"Upgrade Example - TLS only - Examples","ref":"using_ssl.html#upgrade-example-tls-only"},{"type":"extras","doc":"Fetch default cipher suite list for a TLS/DTLS version. Change default to all to\nget all possible cipher suites.\n\n```erlang\n1> Default = ssl:cipher_suites(default, 'tlsv1.2').\n [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,\n mac => aead,prf => sha384}, ....]\n```\n\nIn OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange\n(removed from default in 21)\n\n```erlang\n2> NoRSA =\n ssl:filter_cipher_suites(Default,\n [{key_exchange, fun(rsa) -> false;\n (_) -> true\n end}]).\n [...]\n```\n\nPick just a few suites\n\n```erlang\n 3> Suites =\n ssl:filter_cipher_suites(Default,\n [{key_exchange, fun(ecdh_ecdsa) -> true;\n (_) -> false\n end},\n {cipher, fun(aes_128_cbc) -> true;\n (_) ->false\n end}]).\n\n[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,\n mac => sha256,prf => sha256},\n #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,\n prf => default_prf}]\n```\n\nMake some particular suites the most preferred, or least preferred by changing\nprepend to append.\n\n```erlang\n 4>ssl:prepend_cipher_suites(Suites, Default).\n [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,\n mac => sha256,prf => sha256},\n #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,\n prf => default_prf},\n #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,\n mac => sha384,prf => sha384}, ...]\n```","title":"Customizing cipher suites - Examples","ref":"using_ssl.html#customizing-cipher-suites"},{"type":"extras","doc":"Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3)\nis something that can be negotiated and hence also configured. These\nalgorithms/schemes will be used for digital signatures in protocol messages and\nin certificates.\n\n> #### Note {: .info }\n>\n> TLS-1.3 schemes have atom names whereas TLS-1.2 configuration is two element\n> tuples composed by one hash algorithm and one signature algorithm. When both\n> versions are supported the configuration can be a mix of these as both\n> versions might be negotiated. All `rsa_pss` based schemes are back ported to\n> TLS-1.2 and can be used also in a TLS-1.2 configuration. In TLS-1.2 the\n> signature algorithms chosen by the server will also be affected by the chiper\n> suite that is chosen, which is not the case in TLS-1.3.\n\nUsing the function `ssl:signature_algs/2` will let you inspect different aspects\nof possible configurations for your system. For example if TLS-1.3 and TLS-1.2\nis supported the default signature_algorithm list in OTP-26 and cryptolib from\nOpenSSL 3.0.2 would look like:\n\n```erlang\n 1> ssl:signature_algs(default, 'tlsv1.3').\n %% TLS-1.3 schemes\n [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,\n ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,\n rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,\n rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,\n %% Legacy schemes only valid for certificate signatures in TLS-1.3\n %% (would have a tuple name in TLS-1.2 only configuration)\n rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256\n %% TLS 1.2 algorithms\n {sha512,ecdsa},\n {sha384,ecdsa},\n {sha256,ecdsa}]\n```\n\nIf you want to add support for non default supported algorithms you should\nappend them to the default list as the configuration is in prefered order,\nsomething like this:\n\n```erlang\n MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],\n ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),\n ...\n```\n\nSee also `ssl:signature_algs/2` and [sign_algo()](`t:ssl:signature_algs/0`)","title":"Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3) - Examples","ref":"using_ssl.html#customizing-signature-algorithms-tls-1-2-schemes-tls-1-3"},{"type":"extras","doc":"Erlang ssl application is able to use private keys provided by OpenSSL engines\nusing the following mechanism:\n\n```erlang\n1> ssl:start().\nok\n```\n\nLoad a crypto engine, should be done once per engine used. For example\ndynamically load the engine called `MyEngine`:\n\n```erlang\n2> {ok, EngineRef} =\ncrypto:engine_load(<<\"dynamic\">>,\n[{<<\"SO_PATH\">>, \"/tmp/user/engines/MyEngine\"},<<\"LOAD\">>],\n[]).\n{ok,#Ref<0.2399045421.3028942852.173962>}\n```\n\nCreate a map with the engine information and the algorithm used by the engine:\n\n```erlang\n3> PrivKey =\n #{algorithm => rsa,\n engine => EngineRef,\n key_id => \"id of the private key in Engine\"}.\n```\n\nUse the map in the ssl key option:\n\n```erlang\n4> {ok, SSLSocket} =\n ssl:connect(\"localhost\", 9999,\n [{cacertfile, \"cacerts.pem\"},\n {certs_keys, [#{certfile => \"cert.pem\", key => PrivKey}]}\n ], infinity).\n\n```\n\nSee also [crypto documentation](`e:crypto:engine_load.md#engine_load`)","title":"Using an Engine Stored Key - Examples","ref":"using_ssl.html#using-an-engine-stored-key"},{"type":"extras","doc":"The NSS keylog debug feature can be used by authorized users to for instance\nenable wireshark to decrypt TLS packets.\n\n_Server (with NSS key logging)_\n\n```erlang\n server() ->\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]},\n {reuseaddr, true},\n {versions, ['tlsv1.2','tlsv1.3']},\n {keep_secrets, true} %% Enable NSS key log (debug option)\n ],\n {ok, LSock} = ssl:listen(Port, LOpts),\n {ok, ASock} = ssl:transport_accept(LSock),\n {ok, CSock} = ssl:handshake(ASock).\n```\n\n_Exporting the secrets_\n\n```erlang\n {ok, [{keylog, KeylogItems}]} = ssl:connection_information(CSock, [keylog]).\n file:write_file(\"key.log\", [[KeylogItem,$\\n] || KeylogItem <- KeylogItems]).\n```","title":"NSS keylog - Examples","ref":"using_ssl.html#nss-keylog"},{"type":"extras","doc":"Clients can request to reuse a session established by a previous full handshake\nbetween that client and server by sending the id of the session in the initial\nhandshake message. The server may or may not agree to reuse it. If agreed the\nserver will send back the id and if not it will send a new id. The ssl\napplication has several options for handling session reuse.\n\nOn the client side the ssl application will save session data to try to automate\nsession reuse on behalf of the client processes on the Erlang node. Note that\nonly verified sessions will be saved for security reasons, that is session\nresumption relies on the certificate validation to have been run in the original\nhandshake. To minimize memory consumption only unique sessions will be saved\nunless the special `save` value is specified for the following option\n`{reuse_sessions, boolean() | save}` in which case a full handshake will be\nperformed and that specific session will have been saved before the handshake\nreturns. The session id and even an opaque binary containing the session data\ncan be retrieved using `ssl:connection_information/1` function. A saved session\n(guaranteed by the save option) can be explicitly reused using\n`{reuse_session, SessionId}`. Also it is possible for the client to reuse a\nsession that is not saved by the ssl application using\n`{reuse_session, {SessionId, SessionData}}`.\n\n> #### Note {: .info }\n>\n> When using explicit session reuse, it is up to the client to make sure that\n> the session being reused is for the correct server and has been verified.\n\nHere follows a client side example, divide into several steps for readability.\n\nStep 1 - Automated Session Reuse\n\n```erlang\n1> ssl:start().\nok\n\n2>{ok, C1} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.7>,tls_connection,undefined}, ...}}\n\n3> ssl:connection_information(C1, [session_id]).\n{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,\n 152,49,52,124,56,130,192,137,161,\n 146,145,164,232,...>>}]}\n\n%% Reuse session if possible, note that if C2 is really fast the session\n%% data might not be available for reuse.\n4>{ok, C2} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, true}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.8>,tls_connection,undefined}, ...]}}\n\n%% C2 got same session ID as client one, session was automatically reused.\n5> ssl:connection_information(C2, [session_id]).\n{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,\n 152,49,52,124,56,130,192,137,161,\n 146,145,164,232,...>>}]}\n```\n\nStep 2- Using `save` Option\n\n```erlang\n%% We want save this particular session for\n%% reuse although it has the same basis as C1\n6> {ok, C3} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, save}]).\n\n{ok,{sslsocket,{gen_tcp,#Port<0.9>,tls_connection,undefined}, ...]}}\n\n%% A full handshake is performed and we get a new session ID\n7> {ok, [{session_id, ID}]} = ssl:connection_information(C3, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n\n%% Use automatic session reuse\n8> {ok, C4} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, true}]).\n\n{ok,{sslsocket,{gen_tcp,#Port<0.10>,tls_connection,\n undefined}, ...]}}\n\n%% The \"saved\" one happened to be selected, but this is not a guarantee\n9> ssl:connection_information(C4, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n\n%% Make sure to reuse the \"saved\" session\n10> {ok, C5} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, ID}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.11>,tls_connection,\n undefined}, ...]}}\n\n11> ssl:connection_information(C5, [session_id]).\n{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,\n 121,190,66,192,10,1,27,192,33,95,78,\n 8,34,180,...>>}]}\n```\n\nStep 3 - Explicit Session Reuse\n\n```erlang\n%% Perform a full handshake and the session will not be saved for reuse\n12> {ok, C9} =\nssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_sessions, false},\n {server_name_indication, disable}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.14>,tls_connection, ...}}\n\n%% Fetch session ID and data for C9 connection\n12> {ok, [{session_id, ID1}, {session_data, SessData}]} =\n ssl:connection_information(C9, [session_id, session_data]).\n{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,\n 85,85,99,119,47,9,68,195,50,120,52,\n 130,239,...>>},\n {session_data,<<131,104,13,100,0,7,115,101,115,115,105,\n 111,110,109,0,0,0,32,9,233,4,54,170,...>>}]}\n\n%% Explicitly reuse the session from C9\n13> {ok, C10} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, {ID1, SessData}}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.15>,tls_connection,\n undefined}, ...}}\n\n14> ssl:connection_information(C10, [session_id]).\n{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,\n 85,85,99,119,47,9,68,195,50,120,52,\n 130,239,...>>}]}\n```\n\nStep 4 - Not Possible to Reuse Explicit Session by ID Only\n\n```erlang\n%% Try to reuse the session from C9 using only the id\n15> {ok, E} = ssl:connect(\"localhost\", 9999, [{verify, verify_peer},\n {versions, ['tlsv1.2']},\n {cacertfile, \"cacerts.pem\"},\n {reuse_session, ID1}]).\n{ok,{sslsocket,{gen_tcp,#Port<0.18>,tls_connection,\n undefined}, ...}}\n\n%% This will fail (as it is not saved for reuse)\n%% and a full handshake will be performed, we get a new id.\n16> ssl:connection_information(E, [session_id]).\n{ok,[{session_id,<<87,46,43,126,175,68,160,153,37,29,\n 196,240,65,160,254,88,65,224,18,63,\n 18,17,174,39,...>>}]}\n```\n\nOn the server side the the `{reuse_sessions, boolean()}` option determines if\nthe server will save session data and allow session reuse or not. This can be\nfurther customized by the option `{reuse_session, fun()}` that may introduce a\nlocal policy for session reuse.","title":"Session Reuse Prior to TLS 1.3 - Examples","ref":"using_ssl.html#session-reuse-prior-to-tls-1-3"},{"type":"extras","doc":"TLS 1.3 introduces a new secure way of resuming sessions by using session\ntickets. A session ticket is an opaque data structure that is sent in the\npre_shared_key extension of a ClientHello, when a client attempts to resume a\nsession with keying material from a previous successful handshake.\n\nSession tickets can be stateful or stateless. A stateful session ticket is a\ndatabase reference (session ticket store) and used with stateful servers, while\na stateless ticket is a self-encrypted and self-authenticated data structure\nwith cryptographic keying material and state data, enabling session resumption\nwith stateless servers.\n\nThe choice between stateful or stateless depends on the server requirements as\nthe session tickets are opaque for the clients. Generally, stateful tickets are\nsmaller and the server can guarantee that tickets are only used once. Stateless\ntickets contain additional data, require less storage on the server side, but\nthey offer different guarantees against anti-replay. See also\n[Anti-Replay Protection in TLS 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3)\n\nSession tickets are sent by servers on newly established TLS connections. The\nnumber of tickets sent and their lifetime are configurable by application\nvariables. See also [SSL's configuration](ssl_app.md#configuration).\n\nSession tickets are protected by application traffic keys, and in stateless\ntickets, the opaque data structure itself is self-encrypted.\n\nAn example with automatic and manual session resumption:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\",\n keyfile => \"key.pem\"}]},\n {versions, ['tlsv1.2','tlsv1.3']},\n {session_tickets, stateless}].\n {ok, LSock} = ssl:listen(8001, LOpts).\n {ok, ASock} = ssl:transport_accept(LSock).\n```\n\n_Step 2 (client):_ Start the client and connect to server:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n COpts = [{cacertfile, \"cert.pem\"},\n {versions, ['tlsv1.2','tlsv1.3']},\n {log_level, debug},\n {session_tickets, auto}].\n ssl:connect(\"localhost\", 8001, COpts).\n```\n\n_Step 3 (server):_ Start the TLS handshake:\n\n```erlang\n {ok, CSocket} = ssl:handshake(ASock).\n```\n\nA connection is established using a full handshake. Below is a summary of the\nexchanged messages:\n\n```erlang\n >>> TLS 1.3 Handshake, ClientHello ...\n << >> Handshake, Finished ...\n << >> TLS 1.3 Handshake, ClientHello ...\n << >> Handshake, Finished ...\n << TicketData end.\n```\n\n_Step 11 (server):_ Accept a new connection on the server:\n\n```erlang\n {ok, ASock4} = ssl:transport_accept(LSock).\n```\n\n_Step 12 (client):_ Initiate a new connection to the server with the session\nticket received in Step 10:\n\n```erlang\n {ok, _} = application:ensure_all_started(ssl).\n COpts2 = [{cacertfile, \"cert.pem\"},\n {versions, ['tlsv1.2','tlsv1.3']},\n {log_level, debug},\n {session_tickets, manual},\n {use_ticket, [Ticket]}].\n ssl:connect(\"localhost\", 8001, COpts).\n```\n\n_Step 13 (server):_ Start the handshake:\n\n```erlang\n {ok, CSock4} = ssl:handshake(ASock4).\n```","title":"Session Tickets and Session Resumption in TLS 1.3 - Examples","ref":"using_ssl.html#session-tickets-and-session-resumption-in-tls-1-3"},{"type":"extras","doc":"TLS 1.3 allows clients to send data on the first flight if the endpoints have a\nshared crypographic secret (pre-shared key). This means that clients can send\nearly data if they have a valid session ticket received in a previous successful\nhandshake. For more information about session resumption see\n[Session Tickets and Session Resumption in TLS 1.3](using_ssl.md#session-tickets-and-session-resumption-in-tls-1-3).\n\nThe security properties of Early Data are weaker than other kinds of TLS data.\nThis data is not forward secret, and it is vulnerable to replay attacks. For\navailable mitigation strategies see\n[Anti-Replay Protection in TLS 1.3](using_ssl.md#anti-replay-protection-in-tls-1-3).\n\nIn normal operation, clients will not know which, if any, of the available\nmitigation strategies servers actually implement, and hence must only send early\ndata which they deem safe to be replayed. For example, idempotent HTTP\noperations, such as HEAD and GET, can usually be regarded as safe but even they\ncan be exploited by a large number of replays causing resource limit exhaustion\nand other similar problems.\n\nAn example of sending early data with automatic and manual session ticket\nhandling:\n\n_Server_\n\n```erlang\nearly_data_server() ->\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n LOpts = [{certs_keys, [#{certfile => \"cert.pem\", keyfile => \"key.pem\"}]},\n {reuseaddr, true},\n {versions, ['tlsv1.2','tlsv1.3']},\n {session_tickets, stateless},\n {early_data, enabled},\n ],\n {ok, LSock} = ssl:listen(Port, LOpts),\n %% Accept first connection\n {ok, ASock0} = ssl:transport_accept(LSock),\n {ok, CSock0} = ssl:handshake(ASock0),\n %% Accept second connection\n {ok, ASock1} = ssl:transport_accept(LSock),\n {ok, CSock1} = ssl:handshake(ASock1),\n Sock.\n```\n\n_Client (automatic ticket handling):_\n\n```erlang\nearly_data_auto() ->\n %% First handshake 1-RTT - get session tickets\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n Data = <<\"HEAD / HTTP/1.1\\r\\nHost: \\r\\nConnection: close\\r\\n\">>,\n COpts0 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, auto}],\n {ok, Sock0} = ssl:connect(\"localhost\", Port, COpts0),\n\n %% Wait for session tickets\n timer:sleep(500),\n %% Close socket if server cannot handle multiple\n %% connections e.g. openssl s_server\n ssl:close(Sock0),\n\n %% Second handshake 0-RTT\n COpts1 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, auto},\n {early_data, Data}],\n {ok, Sock} = ssl:connect(\"localhost\", Port, COpts1),\n Sock.\n\n```\n\n_Client (manual ticket handling):_\n\n```erlang\nearly_data_manual() ->\n %% First handshake 1-RTT - get session tickets\n application:load(ssl),\n {ok, _} = application:ensure_all_started(ssl),\n Port = 11029,\n Data = <<\"HEAD / HTTP/1.1\\r\\nHost: \\r\\nConnection: close\\r\\n\">>,\n COpts0 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, manual}],\n {ok, Sock0} = ssl:connect(\"localhost\", Port, COpts0),\n\n %% Wait for session tickets\n Ticket =\n receive\n {ssl, session_ticket, Ticket0} ->\n Ticket0\n end,\n\n %% Close socket if server cannot handle multiple connections\n %% e.g. openssl s_server\n ssl:close(Sock0),\n\n %% Second handshake 0-RTT\n COpts1 = [{cacertfile, \"cacerts.pem\"},\n {versions, ['tlsv1.2', 'tlsv1.3']},\n {session_tickets, manual},\n {use_ticket, [Ticket]},\n {early_data, Data}],\n {ok, Sock} = ssl:connect(\"localhost\", Port, COpts1),\n Sock.\n```","title":"Early Data in TLS-1.3 - Examples","ref":"using_ssl.html#early-data-in-tls-1-3"},{"type":"extras","doc":"The TLS 1.3 protocol does not provide inherent protection for replay of 0-RTT\ndata but describes mechanisms that SHOULD be implemented by compliant server\nimplementations. The implementation of TLS 1.3 in the SSL application employs\nall standard methods to prevent potential threats.\n\n_Single-use tickets_\n\nThis mechanism is available with stateful session tickets. Session tickets can\nonly be used once, subsequent use of the same ticket results in a full\nhandshake. Stateful servers enforce this rule by maintaining a database of\noutstanding valid tickets.\n\n_Client Hello Recording_\n\nThis mechanism is available with stateless session tickets. The server records a\nunique value derived from the ClientHello (PSK binder) in a given time window.\nThe ticket's age is verified by using both the \"obsfuscated_ticket_age\" and an\nadditional timestamp encrypted in the ticket data. As the used datastore allows\nfalse positives, apparent replays will be answered by doing a full 1-RTT\nhandshake.\n\n_Freshness Checks_\n\nThis mechanism is available with the stateless session tickets. As the ticket\ndata has an embedded timestamp, the server can determine if a ClientHello was\nsent reasonably recently and accept the 0-RTT handshake, otherwise if falls back\nto a full 1-RTT handshake. This mechanism is tightly coupled with the previous\none, it prevents storing an unlimited number of ClientHellos.\n\nThe current implementation uses a pair of Bloom filters to implement the last\ntwo mechanisms. Bloom filters are fast, memory-efficient, probabilistic data\nstructures that can tell if an element may be in a set or if it is definitely\nnot in the set.\n\nIf the option `anti_replay` is defined in the server, a\npair of Bloom filters (_current_ and _old_) are used to record incoming\nClientHello messages (it is the unique binder value that is actually stored).\nThe _current_ Bloom filter is used for `WindowSize` seconds to store new\nelements. At the end of the time window the Bloom filters are rotated (the\n_current_ Bloom filter becomes the _old_ and an empty Bloom filter is set as\n_current_.\n\nThe Anti-Replay protection feature in stateless servers executes in the\nfollowing steps when a new ClientHello is received:\n\n- Reported ticket age (obfuscated ticket age) shall be less than ticket\n lifetime.\n- Actual ticket age shall be less than the ticket lifetime (stateless session\n tickets contain the servers timestamp when the ticket was issued).\n- ClientHello created with the ticket shall be sent relatively recently\n (freshness checks).\n- If all above checks passed both _current_ and _old_ Bloom filters are checked\n to detect if binder was already seen. Being a probabilistic data structure,\n false positives can occur and they trigger a full handshake.\n- If the binder is not seen, the binder is validated. If the binder is valid,\n the server proceeds with the 0-RTT handshake.","title":"Anti-Replay Protection in TLS 1.3 - Examples","ref":"using_ssl.html#anti-replay-protection-in-tls-1-3"},{"type":"extras","doc":"Using DTLS has basically the same API as TLS. You need to add the option\n\\{protocol, dtls\\} to the connect and listen functions. For example\n\n```erlang\n client>{ok, Socket} = ssl:connect(\"localhost\", 9999, [{protocol, dtls},\n {verify, verify_peer},\n {cacertfile, \"cacerts.pem\"}],\n infinity).\n{ok,{sslsocket, [...]}}\n\n```","title":"Using DTLS - Examples","ref":"using_ssl.html#using-dtls"},{"type":"extras","doc":"\n# Erlang Distribution over TLS\n\nThis section describes how the Erlang distribution can use TLS to get extra\nverification and security.\n\nThe Erlang distribution can in theory use almost any connection-based protocol\nas bearer. However, a module that implements the protocol-specific parts of the\nconnection setup is needed. The default distribution module is `inet_tcp_dist`\nin the Kernel application. When starting an Erlang node distributed,\n`net_kernel` uses this module to set up listen ports and connections.\n\nIn the SSL application, an extra distribution module, `inet_tls_dist`, can be\nused as an alternative. All distribution connections will use TLS and all\nparticipating Erlang nodes in a distributed system must use this distribution\nmodule.\n\nThe security level depends on the parameters provided to the TLS connection\nsetup. Erlang node cookies are however always used, as they can be used to\ndifferentiate between two different Erlang networks.\n\nTo set up Erlang distribution over TLS:\n\n- _Step 1:_ Build boot scripts including the SSL application.\n- _Step 2:_ Specify the distribution module for `net_kernel`.\n- _Step 3:_ Specify the security options and other SSL options.\n- _Step 4:_ Set up the environment to always use TLS.\n\nThe following sections describe these steps.","title":"Erlang Distribution over TLS","ref":"ssl_distribution.html"},{"type":"extras","doc":"Boot scripts are built using the `systools` utility in the SASL application. For\nmore information on `systools`, see the SASL documentation. This is only an\nexample of what can be done.\n\nThe simplest boot script possible includes only the Kernel and STDLIB\napplications. Such a script is located in the `bin` directory of the Erlang\ndistribution. The source for the script is found under the Erlang installation\ntop directory under `releases/ /start_clean.rel`.\n\nDo the following:\n\n- Copy that script to another location (and preferably another name).\n- Add the applications Crypto, Public Key, and SSL with their current version\n numbers after the STDLIB application.\n\nThe following shows an example `.rel` file with TLS added:\n\n```erlang\n {release, {\"OTP APN 181 01\",\"R15A\"}, {erts, \"5.9\"},\n [{kernel,\"2.15\"},\n {stdlib,\"1.18\"},\n {crypto, \"2.0.3\"},\n {public_key, \"0.12\"},\n {asn1, \"4.0\"},\n {ssl, \"5.0\"}\n ]}.\n```\n\nThe version numbers differ in your system. Whenever one of the applications\nincluded in the script is upgraded, change the script.\n\nDo the following:\n\n- Build the boot script.\n\n Assuming the `.rel file` is stored in a file `start_ssl.rel` in the current\n directory, a boot script can be built as follows:\n\n```text\n 1> systools:make_script(\"start_ssl\",[]).\n```\n\nThere is now a `start_ssl.boot` file in the current directory.\n\nDo the following:\n\n- Test the boot script. To do this, start Erlang with the `-boot` command-line\n parameter specifying this boot script (with its full path, but without the\n `.boot` suffix). In UNIX it can look as follows:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl\nErlang (BEAM) emulator version 5.0\n\nEshell V5.0 (abort with ^G)\n1> whereis(ssl_manager).\n<0.41.0>\n```\n\nThe `whereis` function-call verifies that the SSL application is started.\n\nAs an alternative to building a bootscript, you can explicitly add the path to\nthe SSL `ebin` directory on the command line. This is done with command-line\noption `-pa`. This works as the SSL application does not need to be started for\nthe distribution to come up, as a clone of the SSL application is hooked into\nthe Kernel application. So, as long as the SSL application code can be reached,\nthe distribution starts. The `-pa` method is only recommended for testing\npurposes.\n\n> #### Note {: .info }\n>\n> The clone of the SSL application must enable the use of the SSL code in such\n> an early bootstage as needed to set up the distribution. However, this makes\n> it impossible to soft upgrade the SSL application.","title":"Building Boot Scripts Including the SSL Application - Erlang Distribution over TLS","ref":"ssl_distribution.html#building-boot-scripts-including-the-ssl-application"},{"type":"extras","doc":"The distribution module for TLS is named `inet_tls_dist` and is specified on the\ncommand line with option `-proto_dist`. The argument to `-proto_dist` is to be\nthe module name without suffix `_dist`. So, this distribution module is\nspecified with `-proto_dist inet_tls` on the command line.\n\nExtending the command line gives the following:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n```\n\nFor the distribution to be started, give the emulator a name as well:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1>\n```\n\nHowever, a node started in this way refuses to talk to other nodes, as no TLS\nparameters are supplied (see the next section).","title":"Specifying Distribution Module for net_kernel - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-distribution-module-for-net_kernel"},{"type":"extras","doc":"The TLS distribution options can be written into a file that is consulted when\nthe node is started. This file name is then specified with the command line\nargument `-ssl_dist_optfile`.\n\nAny available TLS option can be specified in an options file.\n\n> #### Note {: .info }\nOptions that take a `fun()` has to use the syntax `fun Mod:Func/Arity` since a\nfunction body cannot be compiled when consulting a file. Also the encoding\nof the file can be specified as defined by module `m:epp`.\n\n> #### Warning {: .warning }\nDo not tamper with the socket options `list`, `binary`, `active`, `packet`,\n`nodelay` and `deliver` since they are used by the distribution protocol handler\nitself. Other raw socket options such as `packet_size` may interfere severely,\nso beware\\!\n\nFor TLS to work, at least a public key and a certificate must be specified for\nthe server side and the client needs to specify CAs that it trusts (client certification\nis optional and requires more configuration).\n\nIn the following example (to keep it simple), the PEM file `\"/home/me/ssl/erlserver.pem\"`\ncontains both the server certificate and its private key .\n\nCreate a file named for example `\"/home/me/ssl/ssl_test@myhost.conf\"`:\n\n```erlang\n[{server,\n [{certfile, \"/home/me/ssl/erlserver.pem\"}]},\n {client,\n [{cacertfile, \"/home/me/ssl/client_trusted.pem\"}]}].\n```\n\nAnd then start the node like this (line breaks in the command are for\nreadability, and shall not be there when typed):\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_optfile \"/home/me/ssl/ssl_test@myhost.conf\"\n -sname ssl_test\n```\n\nThe options in the `{server, Opts}` tuple are used when calling\n`ssl:handshake/3`, and the options in the `{client, Opts}` tuple are used when\ncalling `ssl:connect/4`.\n\nFor the client, the option `{server_name_indication, atom_to_list(TargetNode)}`\nis added when connecting. This makes it possible to use the client option\n`{verify, verify_peer}`, and the client will verify that the certificate matches\nthe node name you are connecting to. This only works if the the server\ncertificate is issued to the name\n[`atom_to_list(TargetNode)`](`atom_to_list/1`).\n\nFor the server it is also possible to use the option `{verify, verify_peer}` and\nthe server will only accept client connections with certificates that are\ntrusted by a root certificate that the server knows. A client that presents an\nuntrusted certificate will be rejected. This option is preferably combined with\n`{fail_if_no_peer_cert, true}` or a client will still be accepted if it does not\npresent any certificate.\n\nA node started in this way is fully functional, using TLS as the distribution\nprotocol.","title":"Specifying TLS Options - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-tls-options"},{"type":"extras","doc":"It is possible to use TLS distribution over IPv6 instead of IPv4. To do this,\npass the option `-proto_dist inet6_tls` instead of `-proto_dist inet_tls` when\nstarting Erlang, either on the command line or in the `ERL_FLAGS` environment\nvariable.\n\nAn example command line with this option would look like this:\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet6_tls\n -ssl_dist_optfile \"/home/me/ssl/ssl_test@myhost.conf\"\n -sname ssl_test\n```\n\nA node started in this way will only be able to communicate with other nodes\nusing TLS distribution over IPv6.","title":"Using TLS distribution over IPv6 - Erlang Distribution over TLS","ref":"ssl_distribution.html#using-tls-distribution-over-ipv6"},{"type":"extras","doc":"> #### Note {: .info }\n> The following section describes TLS Option handling prior to OTP 20.2\n> and can only handle a small subset of the actual available options.\n> It is here only for the sake of backwards compatibility .\n\nAs in the previous section the PEM file `\"/home/me/ssl/erlserver.pem\"` contains\nboth the server certificate and its private key.\n\nOn the `erl` command line you can specify options that the TLS distribution adds\nwhen creating a socket.\n\nThe simplest TLS options in the following list can be specified by adding the\nprefix `server_` or `client_` to the option name:\n\n- `certfile`\n- `keyfile`\n- `password`\n- `cacertfile`\n- `verify`\n- `verify_fun` (write as `{Module, Function, InitialUserState}`)\n- `crl_check`\n- `crl_cache` (write as Erlang term)\n- `reuse_sessions`\n- `secure_renegotiate`\n- `depth`\n- `hibernate_after`\n- `ciphers` (use old string format)\n\nNote that `verify_fun` needs to be written in a different form than the\ncorresponding TLS option, since funs are not accepted on the command line.\n\nThe server can also take the options `dhfile` and `fail_if_no_peer_cert` (also\nprefixed).\n\n`client_`\\-prefixed options are used when the distribution initiates a\nconnection to another node. `server_`\\-prefixed options are used when accepting\na connection from a remote node.\n\nRaw socket options, such as `packet` and `size` must not be specified on the\ncommand line.\n\nThe command-line argument for specifying the TLS options is named\n`-ssl_dist_opt` and is to be followed by pairs of SSL options and their values.\nArgument `-ssl_dist_opt` can be repeated any number of times.\n\nAn example command line doing the same as the example in the previous section\ncan now look as follows (line breaks in the command are for readability, and\nshall not be there when typed):\n\n```text\n$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_opt server_certfile \"/home/me/ssl/erlserver.pem\"\n -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true\n -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1>\n```","title":"Specifying TLS Options (Legacy) - Erlang Distribution over TLS","ref":"ssl_distribution.html#specifying-tls-options-legacy"},{"type":"extras","doc":"A convenient way to specify arguments to Erlang is to use environment variable\n`ERL_FLAGS`. All the flags needed to use the TLS distribution can be specified\nin that variable and are then interpreted as command-line arguments for all\nsubsequent invocations of Erlang.\n\nIn a Unix (Bourne) shell, it can look as follows (line breaks are for\nreadability, they are not to be there when typed):\n\n```erlang\n$ ERL_FLAGS=\"-boot /home/me/ssl/start_ssl -proto_dist inet_tls\n -ssl_dist_opt server_certfile /home/me/ssl/erlserver.pem\n -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true\"\n$ export ERL_FLAGS\n$ erl -sname ssl_test\nErlang (BEAM) emulator version 5.0 [source]\n\nEshell V5.0 (abort with ^G)\n(ssl_test@myhost)1> init:get_arguments().\n[{root,[\"/usr/local/erlang\"]},\n {progname,[\"erl \"]},\n {sname,[\"ssl_test\"]},\n {boot,[\"/home/me/ssl/start_ssl\"]},\n {proto_dist,[\"inet_tls\"]},\n {ssl_dist_opt,[\"server_certfile\",\"/home/me/ssl/erlserver.pem\"]},\n {ssl_dist_opt,[\"server_secure_renegotiate\",\"true\",\n \"client_secure_renegotiate\",\"true\"]\n {home,[\"/home/me\"]}]\n```\n\nThe `init:get_arguments()` call verifies that the correct arguments are supplied\nto the emulator.","title":"Setting up Environment to Always Use TLS - Erlang Distribution over TLS","ref":"ssl_distribution.html#setting-up-environment-to-always-use-tls"},{"type":"extras","doc":"\n# Standards Compliance","title":"Standards Compliance","ref":"standards_compliance.html"},{"type":"extras","doc":"This section describes the current state of standards compliance of the ssl\napplication.","title":"Purpose - Standards Compliance","ref":"standards_compliance.html#purpose"},{"type":"extras","doc":"- For security reasons RSA key exchange cipher suites are no longer supported by\n default, but can be configured. (OTP 21)\n- For security reasons DES cipher suites are no longer supported by default, but\n can be configured. (OTP 20)\n- For security reasons 3DES cipher suites are no longer supported by default,\n but can be configured. (OTP 21)\n- Renegotiation Indication Extension\n [RFC 5746](http://www.ietf.org/rfc/rfc5746.txt) is supported\n- Ephemeral Diffie-Hellman cipher suites are supported, but not Diffie Hellman\n Certificates cipher suites.\n- Elliptic Curve cipher suites are supported if the Crypto application supports\n it and named curves are used.\n- Export cipher suites are not supported as the U.S. lifted its export\n restrictions in early 2000.\n- IDEA cipher suites are not supported as they have become deprecated by the TLS\n 1.2 specification so it is not motivated to implement them.\n- Compression is not supported.\n- It is possible to use Pre-Shared Key (PSK) and Secure Remote Password (SRP)\n cipher suites, but they are not enabled by default and need addition configuration.","title":"Common (prior to TLS 1.3) - Standards Compliance","ref":"standards_compliance.html#common-prior-to-tls-1-3"},{"type":"extras","doc":"- CRL validation is supported.\n- Policy certificate extensions are supported. (OTP 27)\n- 'Server Name Indication' extension\n ([RFC 6066](http://www.ietf.org/rfc/rfc6066.txt)) is supported.\n- Application Layer Protocol Negotiation (ALPN) and its successor Next Protocol\n Negotiation (NPN) are supported.","title":"Common - Standards Compliance","ref":"standards_compliance.html#common"},{"type":"extras","doc":"For security reasons SSL-2.0 is not supported. Interoperability with SSL-2.0\nenabled clients dropped. (OTP 21)","title":"SSL 2.0 - Standards Compliance","ref":"standards_compliance.html#ssl-2-0"},{"type":"extras","doc":"For security reasons SSL-3.0 is no longer supported at all. (OTP 23)\n\nFor security reasons SSL-3.0 is no longer supported by default, but can be\nconfigured. (OTP 19)","title":"SSL 3.0 - Standards Compliance","ref":"standards_compliance.html#ssl-3-0"},{"type":"extras","doc":"For security reasons TLS-1.0 is no longer supported by default, but can be\nconfigured. (OTP 22)","title":"TLS 1.0 - Standards Compliance","ref":"standards_compliance.html#tls-1-0"},{"type":"extras","doc":"For security reasons TLS-1.1 is no longer supported by default, but can be\nconfigured. (OTP 22)","title":"TLS 1.1 - Standards Compliance","ref":"standards_compliance.html#tls-1-1"},{"type":"extras","doc":"Supported","title":"TLS 1.2 - Standards Compliance","ref":"standards_compliance.html#tls-1-2"},{"type":"extras","doc":"For security reasons DTLS-1.0 (based on TLS 1.1) is no longer supported by\ndefault, but can be configured. (OTP 22)","title":"DTLS 1.0 - Standards Compliance","ref":"standards_compliance.html#dtls-1-0"},{"type":"extras","doc":"Supported (based on TLS 1.2)","title":"DTLS 1.2 - Standards Compliance","ref":"standards_compliance.html#dtls-1-2"},{"type":"extras","doc":"Not yet supported","title":"DTLS 1.3 - Standards Compliance","ref":"standards_compliance.html#dtls-1-3"},{"type":"extras","doc":"OTP-22 introduces support for TLS 1.3. The current implementation supports a\nselective set of cryptographic algorithms:\n\n- Key Exchange: ECDHE groups supported by default\n- Groups: all standard groups supported for the Diffie-Hellman key exchange\n- Groups: Support brainpool groups from RFC 8734\n- Ciphers: all mandatory cipher suites are supported\n- Signature Algorithms: All algorithms form RFC 8446\n- Certificates: RSA, ECDSA and EDDSA keys\n\nOther notable features:\n\n- PSK and session resumption is supported (stateful and stateless tickets)\n- Anti-replay protection using Bloom-filters with stateless tickets\n- Early data and 0-RTT is supported\n- Key and Initialization Vector Update is supported\n\nFor more detailed information see the\n[Standards Compliance](standards_compliance.md#soc_table) below.\n\nThe following table describes the current state of standards compliance for TLS\n1.3.\n\n(_C_ = Compliant, _NC_ = Non-Compliant, _PC_ = Partially-Compliant, _NA_ = Not\nApplicable)\n\n[](){: #soc_table }\n\n| _Section_ | _Feature_ | _State_ | _Since_ |\n| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------- |\n| [1\\.3. Updates Affecting TLS 1.2](https://tools.ietf.org/html/rfc8446#section-1.2) | | _C_ | _24\\.1_ |\n| | Version downgrade protection mechanism | _C_ | _22_ |\n| | RSASSA-PSS signature schemes | _C_ | _24\\.1_ |\n| | supported_versions (ClientHello) extension | _C_ | _22_ |\n| | signature_algorithms_cert extension | _C_ | _24\\.1_ |\n| [2\\. Protocol Overview](https://tools.ietf.org/html/rfc8446#section/2) | | _PC_ | _22_ |\n| | (EC)DHE | _C_ | _22_ |\n| | PSK-only | _NC_ | |\n| | PSK with (EC)DHE | _C_ | _22\\.2_ |\n| [2\\.1. Incorrect DHE share](https://tools.ietf.org/html/rfc8446#section-2.1) | HelloRetryRequest | _C_ | _22_ |\n| [2\\.2. Resumption and Pre-Shared Key (PSK)](https://tools.ietf.org/html/rfc8446#section-2.2) | | _C_ | _22\\.2_ |\n| [2\\.3. 0-RTT Data](https://tools.ietf.org/html/rfc8446#section-2.3) | | _PC_ | _23\\.3_ |\n| [4\\.1.1. Cryptographic Negotiation](https://tools.ietf.org/html/rfc8446#section-4.1.1) | | _C_ | _22\\.2_ |\n| | supported_groups extension | _C_ | _22_ |\n| | signature_algorithms extension | _C_ | _22_ |\n| | pre_shared_key extension | _C_ | _22\\.2_ |\n| [4\\.1.2. Client Hello](https://tools.ietf.org/html/rfc8446#section-4.1.2) | _Client_ | _PC_ | _22\\.1_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | status_request (RFC6066) | _C_ | _27\\.0_ |\n| | supported_groups (RFC7919) | _C_ | _22\\.1_ |\n| | signature_algorithms (RFC8446) | _C_ | _22\\.1_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | padding (RFC7685) | _NC_ | |\n| | key_share (RFC8446) | _C_ | _22\\.1_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | psk_key_exchange_modes (RFC8446) | _C_ | _22\\.2_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22\\.1_ |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | post_handshake_auth (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22\\.1_ |\n| | _Server_ | _PC_ | _22_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | status_request (RFC6066) | _NC_ | |\n| | supported_groups (RFC7919) | _C_ | _22_ |\n| | signature_algorithms (RFC8446) | _C_ | _22_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | padding (RFC7685) | _NC_ | |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | psk_key_exchange_modes (RFC8446) | _C_ | _22\\.2_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| | oid_filters (RFC8446) | _NC_ | |\n| | post_handshake_auth (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22_ |\n| [4\\.1.3. Server Hello](https://tools.ietf.org/html/rfc8446#section-4.1.3) | _Client_ | _C_ | _22\\.2_ |\n| | Version downgrade protection | _C_ | _22\\.1_ |\n| | key_share (RFC8446) | _C_ | _22\\.1_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | supported_versions (RFC8446) | _C_ | _22\\.1_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| | _Server_ | _C_ | _22\\.2_ |\n| | Version downgrade protection | _C_ | _22_ |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | pre_shared_key (RFC8446) | _C_ | _22\\.2_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| | use_srtp (RFC5764) | _C_ | 26\\.0 |\n| [4\\.1.4. Hello Retry Request](https://tools.ietf.org/html/rfc8446#section-4.1.4) | _Server_ | _C_ | _22_ |\n| | key_share (RFC8446) | _C_ | _22_ |\n| | cookie (RFC8446) | _C_ | _23\\.1_ |\n| | supported_versions (RFC8446) | _C_ | _22_ |\n| [4\\.2.1. Supported Versions](https://tools.ietf.org/html/rfc8446#section-4.2.1) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.2.2. Cookie](https://tools.ietf.org/html/rfc8446#section-4.2.2) | _Client_ | _C_ | _23\\.1_ |\n| | _Server_ | _C_ | _23\\.1_ |\n| [4\\.2.3. Signature Algorithms](https://tools.ietf.org/html/rfc8446#section-4.2.3) | _Client_ | _C_ | _24_ |\n| | rsa_pkcs1_sha256 | _C_ | _22\\.1_ |\n| | rsa_pkcs1_sha384 | _C_ | _22\\.1_ |\n| | rsa_pkcs1_sha512 | _C_ | _22\\.1_ |\n| | ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | ecdsa_secp384r1_sha384 | _C_ | _22\\.1_ |\n| | ecdsa_secp521r1_sha512 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha256 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha384 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha512 | _C_ | _22\\.1_ |\n| | ed25519 | _C_ | _24_ |\n| | ed448 | _C_ | _24_ |\n| | rsa_pss_pss_sha256 | _C_ | _23_ |\n| | rsa_pss_pss_sha384 | _C_ | _23_ |\n| | rsa_pss_pss_sha512 | _C_ | _23_ |\n| | rsa_pkcs1_sha1 | _C_ | _22\\.1_ |\n| | ecdsa_sha1 | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _24_ |\n| | rsa_pkcs1_sha256 | _C_ | _22_ |\n| | rsa_pkcs1_sha384 | _C_ | _22_ |\n| | rsa_pkcs1_sha512 | _C_ | _22_ |\n| | ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | ecdsa_secp384r1_sha384 | _C_ | _22\\.1_ |\n| | ecdsa_secp521r1_sha512 | _C_ | _22\\.1_ |\n| | rsa_pss_rsae_sha256 | _C_ | _22_ |\n| | rsa_pss_rsae_sha384 | _C_ | _22_ |\n| | rsa_pss_rsae_sha512 | _C_ | _22_ |\n| | ed25519 | _C_ | _24_ |\n| | ed448 | _C_ | _24_ |\n| | rsa_pss_pss_sha256 | _C_ | _23_ |\n| | rsa_pss_pss_sha384 | _C_ | _23_ |\n| | rsa_pss_pss_sha512 | _C_ | _23_ |\n| | rsa_pkcs1_sha1 | _C_ | _22_ |\n| | ecdsa_sha1 | _C_ | _22_ |\n| [4\\.2.4. Certificate Authorities](https://tools.ietf.org/html/rfc8446#section-4.2.4) | _Client_ | _C_ | 24\\.3 |\n| | _Server_ | _C_ | _24\\.3_ |\n| [4\\.2.5. OID Filters](https://tools.ietf.org/html/rfc8446#section-4.2.5) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.2.6. Post-Handshake Client Authentication](https://tools.ietf.org/html/rfc8446#section-4.2.6) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.2.7. Supported Groups](https://tools.ietf.org/html/rfc8446#section-4.2.7) | _Client_ | _C_ | _22\\.1_ |\n| | secp256r1 | _C_ | _22\\.1_ |\n| | secp384r1 | _C_ | _22\\.1_ |\n| | secp521r1 | _C_ | _22\\.1_ |\n| | x25519 | _C_ | _22\\.1_ |\n| | x448 | _C_ | _22\\.1_ |\n| | ffdhe2048 | _C_ | _22\\.1_ |\n| | ffdhe3072 | _C_ | _22\\.1_ |\n| | ffdhe4096 | _C_ | _22\\.1_ |\n| | ffdhe6144 | _C_ | _22\\.1_ |\n| | ffdhe8192 | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| | secp256r1 | _C_ | _22_ |\n| | secp384r1 | _C_ | _22_ |\n| | secp521r1 | _C_ | _22_ |\n| | x25519 | _C_ | _22_ |\n| | x448 | _C_ | _22_ |\n| | ffdhe2048 | _C_ | _22_ |\n| | ffdhe3072 | _C_ | _22_ |\n| | ffdhe4096 | _C_ | _22_ |\n| | ffdhe6144 | _C_ | _22_ |\n| | ffdhe8192 | _C_ | _22_ |\n| [4\\.2.8. Key Share](https://tools.ietf.org/html/rfc8446#section-4.2.8) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.2.9. Pre-Shared Key Exchange Modes](https://tools.ietf.org/html/rfc8446#section-4.2.9) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.10. Early Data Indication](https://tools.ietf.org/html/rfc8446#section-4.2.10) | _Client_ | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| [4\\.2.11. Pre-Shared Key Extension](https://tools.ietf.org/html/rfc8446#section-4.2.11) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.1. Ticket Age](https://tools.ietf.org/html/rfc8446#section-4.2.11.1) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.2. PSK Binder](https://tools.ietf.org/html/rfc8446#section-4.2.11.2) | _Client_ | _C_ | _22\\.2_ |\n| | _Server_ | _C_ | _22\\.2_ |\n| [4\\.2.11.3. Processing Order](https://tools.ietf.org/html/rfc8446#section-4.2.11.3) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.3.1. Encrypted Extensions](https://tools.ietf.org/html/rfc8446#section-4.3.1) | _Client_ | _PC_ | _22\\.1_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | supported_groups (RFC7919) | _NC_ | |\n| | use_srtp (RFC5764) | _NC_ | |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | 23\\.0 |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | _Server_ | _PC_ | _22_ |\n| | server_name (RFC6066) | _C_ | _23\\.2_ |\n| | max_fragment_length (RFC6066) | _C_ | _23\\.0_ |\n| | supported_groups (RFC7919) | _NC_ | |\n| | use_srtp (RFC5764) | _NC_ | |\n| | heartbeat (RFC6520) | _NC_ | |\n| | application_layer_protocol_negotiation (RFC7301) | _C_ | 23\\.0 |\n| | client_certificate_type (RFC7250) | _NC_ | |\n| | server_certificate_type (RFC7250) | _NC_ | |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| [4\\.3.2. Certificate Request](https://tools.ietf.org/html/rfc8446#section-4.3.2) | _Client_ | _PC_ | _22\\.1_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signature_algorithms (RFC8446) | _C_ | _22\\.1_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22\\.1_ |\n| | _Server_ | _PC_ | _22_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signature_algorithms (RFC8446) | _C_ | _22_ |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | certificate_authorities (RFC8446) | _C_ | 24\\.3 |\n| | oid_filters (RFC8446) | _NC_ | |\n| | signature_algorithms_cert (RFC8446) | _C_ | _22_ |\n| [4\\.4.1. The Transcript Hash](https://tools.ietf.org/html/rfc8446#section-4.4.1) | | _C_ | _22_ |\n| [4\\.4.2. Certificate](https://tools.ietf.org/html/rfc8446#section-4.4.2) | _Client_ | _PC_ | _22\\.1_ |\n| | Arbitrary certificate chain orderings | _C_ | _22\\.2_ |\n| | Extraneous certificates in chain | _C_ | _23\\.2_ |\n| | status_request (RFC6066) | _C_ | 27\\.0 |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| | _Server_ | _PC_ | _22_ |\n| | status_request (RFC6066) | _NC_ | |\n| | signed_certificate_timestamp (RFC6962) | _NC_ | |\n| [4\\.4.2.1. OCSP Status and SCT Extensions](https://tools.ietf.org/html/rfc8446#section-4.4.2.1) | _Client_ | _PC_ | _27\\.0_ |\n| | _Server_ | _NC_ | |\n| [4\\.4.2.2. Server Certificate Selection](https://tools.ietf.org/html/rfc8446#section-4.4.2.2) | | _C_ | _24\\.3_ |\n| | The certificate type MUST be X.509v3, unless explicitly negotiated otherwise | _C_ | _22_ |\n| | The server's end-entity certificate's public key (and associated restrictions) MUST be compatible with the selected authentication algorithm from the client's \"signature_algorithms\" extension (currently RSA, ECDSA, or EdDSA). | _C_ | _22_ |\n| | The certificate MUST allow the key to be used for signing with a signature scheme indicated in the client's \"signature_algorithms\"/\"signature_algorithms_cert\" extensions | _C_ | _22_ |\n| | The \"server_name\" and \"certificate_authorities\" extensions are used to guide certificate selection. As servers MAY require the presence of the \"server_name\" extension, clients SHOULD send this extension, when applicable. | _C_ | _24\\.3_ |\n| [4\\.4.2.3. Client Certificate Selection](https://tools.ietf.org/html/rfc8446#section-4.4.2.3) | | _PC_ | _22\\.1_ |\n| | The certificate type MUST be X.509v3, unless explicitly negotiated otherwise | _C_ | _22\\.1_ |\n| | If the \"certificate_authorities\" extension in the CertificateRequest message was present, at least one of the certificates in the certificate chain SHOULD be issued by one of the listed CAs. | _C_ | _24\\.3_ |\n| | The certificates MUST be signed using an acceptable signature algorithm | _C_ | _22\\.1_ |\n| | If the CertificateRequest message contained a non-empty \"oid_filters\" extension, the end-entity certificate MUST match the extension OIDs that are recognized by the client | _NC_ | |\n| [4\\.4.2.4. Receiving a Certificate Message](https://tools.ietf.org/html/rfc8446#section-4.4.2.4) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.4.3. Certificate Verify](https://tools.ietf.org/html/rfc8446#section-4.4.3) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.4.4. Finished](https://tools.ietf.org/html/rfc8446#section-4.4.4) | _Client_ | _C_ | _22\\.1_ |\n| | _Server_ | _C_ | _22_ |\n| [4\\.5. End of Early Data](https://tools.ietf.org/html/rfc8446#section-4.5) | _Client_ | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| [4\\.6.1. New Session Ticket Message](https://tools.ietf.org/html/rfc8446#section-4.6.1) | _Client_ | _C_ | _23\\.3_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| | _Server_ | _C_ | _23\\.3_ |\n| | early_data (RFC8446) | _C_ | _23\\.3_ |\n| [4\\.6.2. Post-Handshake Authentication](https://tools.ietf.org/html/rfc8446#section-4.6.2) | _Client_ | _NC_ | |\n| | _Server_ | _NC_ | |\n| [4\\.6.3. Key and Initialization Vector Update](https://tools.ietf.org/html/rfc8446#section-4.6.3) | _Client_ | _C_ | _22\\.3_ |\n| | _Server_ | _C_ | _22\\.3_ |\n| [5\\.1. Record Layer](https://tools.ietf.org/html/rfc8446#section-5.1) | | _C_ | _22_ |\n| | MUST NOT be interleaved with other record types | _C_ | _22_ |\n| | MUST NOT span key changes | _C_ | _22_ |\n| | MUST NOT send zero-length fragments | _C_ | _22_ |\n| | Alert messages MUST NOT be fragmented | _C_ | _22_ |\n| [5\\.2. Record Payload Protection](https://tools.ietf.org/html/rfc8446#section-5.2) | | _C_ | _22_ |\n| [5\\.3. Per-Record Nonce](https://tools.ietf.org/html/rfc8446#section-5.3) | | _C_ | _22_ |\n| [5\\.4. Record Padding](https://tools.ietf.org/html/rfc8446#section-5.4) | | _PC_ | _22_ |\n| | MAY choose to pad | _NC_ | |\n| | MUST NOT send Handshake and Alert records that have a zero-length TLSInnerPlaintext.content | _NC_ | |\n| | The padding sent is automatically verified | _C_ | _22_ |\n| [5\\.5. Limits on Key Usage](https://tools.ietf.org/html/rfc8446#section-5.5) | | _C_ | _22\\.3_ |\n| [6\\.1. Closure Alerts](https://tools.ietf.org/html/rfc8446#section-6.1) | | _22_ | |\n| | close_notify | _C_ | _22_ | |\n| | user_cancelled | _C_ | _22_ | |\n| [6\\.2. Error Alerts](https://tools.ietf.org/html/rfc8446#section-6.2) | | _PC_ | _22_ |\n| [7\\.1. Key Schedule](https://tools.ietf.org/html/rfc8446#section-7.1) | | _C_ | _22_ |\n| [7\\.2. Updating Traffic Secrets](https://tools.ietf.org/html/rfc8446#section-7.2) | | _C_ | _22_ |\n| [7\\.3. Traffic Key Calculation](https://tools.ietf.org/html/rfc8446#section-7.3) | | _C_ | _22_ |\n| [7\\.5. Exporters](https://tools.ietf.org/html/rfc8446#section-7.5) | | _PC_ | _26\\.3_ |\n| [8\\. 0-RTT and Anti-Replay](https://tools.ietf.org/html/rfc8446#section/8) | | _C_ | _22\\.2_ |\n| [8\\.1. Single-Use Tickets](https://tools.ietf.org/html/rfc8446#section-8.1) | | _C_ | _22\\.2_ |\n| [8\\.2. Client Hello Recording](https://tools.ietf.org/html/rfc8446#section-8.2) | | _C_ | _22\\.2_ |\n| [8\\.3. Freshness Checks](https://tools.ietf.org/html/rfc8446#section-8.3) | | _C_ | _22\\.2_ |\n| [9\\.1. Mandatory-to-Implement Cipher Suites](https://tools.ietf.org/html/rfc8446#section-9.1) | | _C_ | _22\\.1_ |\n| | MUST implement the TLS_AES_128_GCM_SHA256 | _C_ | _22_ |\n| | SHOULD implement the TLS_AES_256_GCM_SHA384 | _C_ | _22_ |\n| | SHOULD implement the TLS_CHACHA20_POLY1305_SHA256 | _C_ | _22_ |\n| | _Digital signatures_ | _C_ | _22\\.1_ |\n| | MUST support rsa_pkcs1_sha256 (for certificates) | _C_ | _22_ |\n| | MUST support rsa_pss_rsae_sha256 (for CertificateVerify and certificates) | _C_ | _22_ |\n| | MUST support ecdsa_secp256r1_sha256 | _C_ | _22\\.1_ |\n| | _Key Exchange_ | _C_ | _22_ |\n| | MUST support key exchange with secp256r1 | _C_ | _22_ |\n| | SHOULD support key exchange with X25519 | _C_ | _22_ |\n| [9\\.2. Mandatory-to-Implement Extensions](https://tools.ietf.org/html/rfc8446#section-9.2) | | _C_ | _23\\.2_ |\n| | Supported Versions | _C_ | _22_ |\n| | Cookie | _C_ | _23\\.1_ |\n| | Signature Algorithms | _C_ | _22_ |\n| | Signature Algorithms Certificate | _C_ | _22_ |\n| | Negotiated Groups | _C_ | _22_ |\n| | Key Share | _C_ | _22_ |\n| | Server Name Indication | _C_ | _23\\.2_ |\n| | _MUST send and use these extensions_ | _C_ | _22\\.2_ |\n| | \"supported_versions\" is REQUIRED for ClientHello, ServerHello and HelloRetryRequest | _C_ | _22\\.1_ |\n| | \"signature_algorithms\" is REQUIRED for certificate authentication | _C_ | _22_ |\n| | \"supported_groups\" is REQUIRED for ClientHello messages using (EC)DHE key exchange | _C_ | _22_ |\n| | \"key_share\" is REQUIRED for (EC)DHE key exchange | _C_ | _22_ |\n| | \"pre_shared_key\" is REQUIRED for PSK key agreement | _C_ | _22\\.2_ |\n| | \"psk_key_exchange_modes\" is REQUIRED for PSK key agreement | _C_ | _22\\.2_ |\n| | _TLS 1.3 ClientHello_ | _C_ | _22\\.1_ |\n| | If not containing a \"pre_shared_key\" extension, it MUST contain both a \"signature_algorithms\" extension and a \"supported_groups\" extension. | _C_ | _22\\.1_ |\n| | If containing a \"supported_groups\" extension, it MUST also contain a \"key_share\" extension, and vice versa. An empty KeyShare.client_shares vector is permitted. | _C_ | _22\\.1_ |\n| | _TLS 1.3 ServerHello_ | _C_ | _23\\.2_ |\n| | MUST support the use of the \"server_name\" extension | _C_ | _23\\.2_ |\n| [9\\.3. Protocol Invariants](https://tools.ietf.org/html/rfc8446#section-9.3) | | _C_ | _22\\.1_ |\n| | _MUST correctly handle extensible fields_ | _C_ | _22\\.1_ |\n| | A client sending a ClientHello MUST support all parameters advertised in it. Otherwise, the server may fail to interoperate by selecting one of those parameters. | _C_ | _22\\.1_ |\n| | A server receiving a ClientHello MUST correctly ignore all unrecognized cipher suites, extensions, and other parameters. Otherwise, it may fail to interoperate with newer clients. In TLS 1.3, a client receiving a CertificateRequest or NewSessionTicket MUST also ignore all unrecognized extensions. | _C_ | _22\\.1_ |\n| | A middlebox which terminates a TLS connection MUST behave as a compliant TLS server | _NA_ | |\n| | A middlebox which forwards ClientHello parameters it does not understand MUST NOT process any messages beyond that ClientHello. It MUST forward all subsequent traffic unmodified. Otherwise, it may fail to interoperate with newer clients and servers. | _NA_ | |\n| [B.4. Cipher Suites](https://tools.ietf.org/html/rfc8446#section-B.4) | | _C_ | _23_ |\n| | TLS_AES_128_GCM_SHA256 | _C_ | _22_ |\n| | TLS_AES_256_GCM_SHA384 | _C_ | _22_ |\n| | TLS_CHACHA20_POLY1305_SHA256 | _C_ | _22_ |\n| | TLS_AES_128_CCM_SHA256 | _C_ | _22_ |\n| | TLS_AES_128_CCM_8_SHA256 | _C_ | _23_ |\n| [C.1. Random Number Generation and Seeding](https://tools.ietf.org/html/rfc8446#section-C.1) | | _C_ | _22_ |\n| [C.2. Certificates and Authentication](https://tools.ietf.org/html/rfc8446#section-C.2) | | _C_ | _22_ |\n| [C.3. Implementation Pitfalls](https://tools.ietf.org/html/rfc8446#section-C.3) | | _PC_ | _22_ |\n| [C.4. Client Tracking Prevention](https://tools.ietf.org/html/rfc8446#section-C.4) | | _C_ | _22\\.2_ |\n| [C.5. Unauthenticated Operation](https://tools.ietf.org/html/rfc8446#section-C.5) | | _C_ | _22_ |\n| [D.1. Negotiating with an Older Server](https://tools.ietf.org/html/rfc8446#section-D.1) | | _C_ | _22\\.2_ |\n| [D.2. Negotiating with an Older Client](https://tools.ietf.org/html/rfc8446#section-D.2) | | _C_ | _22_ |\n| [D.3. 0-RTT Backward Compatibility](https://tools.ietf.org/html/rfc8446#section-D.3) | | _NC_ | |\n| [D.4. Middlebox Compatibility Mode](https://tools.ietf.org/html/rfc8446#section-D.4) | | _C_ | _23_ |\n| [D.5. Security Restrictions Related to Backward Compatibility](https://tools.ietf.org/html/rfc8446#section-D.5) | | _C_ | _22_ |\n\n_Table: Standards Compliance_","title":"TLS 1.3 - Standards Compliance","ref":"standards_compliance.html#tls-1-3"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/ssl-11.2.1/doc/html/search.html b/prs/8803/lib/ssl-11.2.1/doc/html/search.html index a6ccd10acc150..42d13f668d422 100644 --- a/prs/8803/lib/ssl-11.2.1/doc/html/search.html +++ b/prs/8803/lib/ssl-11.2.1/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

    diff --git a/prs/8803/lib/ssl-11.2.1/doc/html/using_ssl.html b/prs/8803/lib/ssl-11.2.1/doc/html/using_ssl.html index 34859196f1ed4..5fd74656428ba 100644 --- a/prs/8803/lib/ssl-11.2.1/doc/html/using_ssl.html +++ b/prs/8803/lib/ssl-11.2.1/doc/html/using_ssl.html @@ -149,38 +149,38 @@

    Basic Client

    -
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -                                                 {cacerts, public_key:cacerts_get()}]).
    -   {ok,{sslsocket, [...]}}

    +
     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +                                                 {cacerts, public_key:cacerts_get()}]).
    +   {ok,{sslsocket, [...]}}

    Basic Connection

    -

    Step 1: Start the server side:

    1 server> ssl:start().
    +

    Step 1: Start the server side:

    1 server> ssl:start().
     ok

    Step 2: with alternative certificates, in this example the EDDSA certificate will be preferred if TLS-1.3 is negotiated and the RSA certificate will always -be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    -ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    -                                  keyfile => "eddsakey.pem"},
    -                                #{certfile => "rsacert.pem",
    +be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    +ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    +                                  keyfile => "eddsakey.pem"},
    +                                #{certfile => "rsacert.pem",
                                       keyfile => "rsakey.pem",
    -                                  password => "foobar"}
    -                               ]},{reuseaddr, true}]).
    -{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    -{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the + password => "foobar"} + ]},{reuseaddr, true}]). +{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    +{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the handshake part can be called in a new erlang process dedicated to handling the -connection

    Step 4: Start the client side:

    1 client> ssl:start().
    +connection

    Step 4: Start the client side:

    1 client> ssl:start().
     ok

    Be sure to configure trusted certificates to use for server certificate -verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    -      [{verify, verify_peer},
    -      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    -{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    -{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS -attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
    +verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    +      [{verify, verify_peer},
    +      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    +{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    +{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2 that has a timeout to avoid DoS +attacks. In the example the timeout defaults to infinty.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
     ok

    Step 7: Flush the shell message queue to see that the message sent on the -server side is recived by the client side:

    3 client> flush().
    -Shell got {ssl,{sslsocket,[...]},"foo"}
    +server side is recived by the client side:

    3 client> flush().
    +Shell got {ssl,{sslsocket,[...]},"foo"}
     ok

    @@ -192,27 +192,27 @@

    communication channel by using TLS. Note that the client and server need to agree to do the upgrade in the protocol doing the communication. This is concept is often referenced as STARTLS and used in many protocols such as SMTP, -FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
    +FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
       ok

    Step 2: Create a normal TCP listen socket and ensure active is set to false and not set to any active mode otherwise TLS handshake messages can be -delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    -  {active, false}]).
    -  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    -  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    -  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    -  {fail_if_no_peer_cert, true},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    -  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the +delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    +  {active, false}]).
    +  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    +  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    +  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    +  {fail_if_no_peer_cert, true},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    +  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the upgrade. The server must be prepared to be a TLS server before the client can do -a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    -{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    -      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
    +a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    +{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    +      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
           ok

    Step 9: Flush the shell message queue to see that the message sent on the -client side is recived by the server side:

    5 server> flush().
    -      Shell got {ssl,{sslsocket,[...]},"foo"}
    +client side is recived by the server side:

    5 server> flush().
    +      Shell got {ssl,{sslsocket,[...]},"foo"}
           ok

    @@ -220,34 +220,34 @@

    Customizing cipher suites

    Fetch default cipher suite list for a TLS/DTLS version. Change default to all to -get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    -    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    -    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange +get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    +    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    +    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange (removed from default in 21)

    2> NoRSA =
    -    ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(rsa) -> false;
    -                                                (_) -> true
    -                                             end}]).
    -    [...]

    Pick just a few suites

     3> Suites =
    - ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    -                                                (_) -> false
    -                                             end},
    -                              {cipher, fun(aes_128_cbc) -> true;
    -                                          (_) ->false
    -                                       end}]).
    -
    -[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -   mac => sha256,prf => sha256},
    - #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing -prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    -  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -     mac => sha256,prf => sha256},
    -   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -     prf => default_prf},
    -   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    -     mac => sha384,prf => sha384}, ...]

    + ssl:filter_cipher_suites(Default, + [{key_exchange, fun(rsa) -> false; + (_) -> true + end}]). + [...]

    Pick just a few suites

     3> Suites =
    + ssl:filter_cipher_suites(Default,
    +                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    +                                                (_) -> false
    +                                             end},
    +                              {cipher, fun(aes_128_cbc) -> true;
    +                                          (_) ->false
    +                                       end}]).
    +
    +[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +   mac => sha256,prf => sha256},
    + #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing +prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    +  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +     mac => sha256,prf => sha256},
    +   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +     prf => default_prf},
    +   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    +     mac => sha384,prf => sha384}, ...]

    @@ -265,9 +265,9 @@

    suite that is chosen, which is not the case in TLS-1.3.

    Using the function ssl:signature_algs/2 will let you inspect different aspects of possible configurations for your system. For example if TLS-1.3 and TLS-1.2 is supported the default signature_algorithm list in OTP-26 and cryptolib from -OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
    +OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
      %% TLS-1.3 schemes
    - [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
    + [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
       ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
       rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
       rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
    @@ -275,12 +275,12 @@ 

    %% (would have a tuple name in TLS-1.2 only configuration) rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256 %% TLS 1.2 algorithms - {sha512,ecdsa}, - {sha384,ecdsa}, - {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should + {sha512,ecdsa}, + {sha384,ecdsa}, + {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should append them to the default list as the configuration is in prefered order, -something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    -    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
    +something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    +    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
         ...

    See also ssl:signature_algs/2 and sign_algo()

    @@ -288,20 +288,20 @@

    Using an Engine Stored Key

    Erlang ssl application is able to use private keys provided by OpenSSL engines -using the following mechanism:

    1> ssl:start().
    +using the following mechanism:

    1> ssl:start().
     ok

    Load a crypto engine, should be done once per engine used. For example -dynamically load the engine called MyEngine:

    2> {ok, EngineRef} =
    -crypto:engine_load(<<"dynamic">>,
    -[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
    -[]).
    -{ok,#Ref<0.2399045421.3028942852.173962>}

    Create a map with the engine information and the algorithm used by the engine:

    3> PrivKey =
    - #{algorithm => rsa,
    +dynamically load the engine called MyEngine:

    2> {ok, EngineRef} =
    +crypto:engine_load(<<"dynamic">>,
    +[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
    +[]).
    +{ok,#Ref<0.2399045421.3028942852.173962>}

    Create a map with the engine information and the algorithm used by the engine:

    3> PrivKey =
    + #{algorithm => rsa,
        engine => EngineRef,
    -   key_id => "id of the private key in Engine"}.

    Use the map in the ssl key option:

    4> {ok, SSLSocket} =
    - ssl:connect("localhost", 9999,
    -                [{cacertfile, "cacerts.pem"},
    -                 {certs_keys, [#{certfile => "cert.pem", key => PrivKey}]}
    -                ], infinity).
    +   key_id => "id of the private key in Engine"}.

    Use the map in the ssl key option:

    4> {ok, SSLSocket} =
    + ssl:connect("localhost", 9999,
    +                [{cacertfile, "cacerts.pem"},
    +                 {certs_keys, [#{certfile => "cert.pem", key => PrivKey}]}
    +                ], infinity).
     

    See also crypto documentation

    @@ -309,19 +309,19 @@

    NSS keylog

    The NSS keylog debug feature can be used by authorized users to for instance -enable wireshark to decrypt TLS packets.

    Server (with NSS key logging)

        server() ->
    -        application:load(ssl),
    -        {ok, _} = application:ensure_all_started(ssl),
    +enable wireshark to decrypt TLS packets.

    Server (with NSS key logging)

        server() ->
    +        application:load(ssl),
    +        {ok, _} = application:ensure_all_started(ssl),
             Port = 11029,
    -        LOpts = [{certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]},
    -        {reuseaddr, true},
    -        {versions, ['tlsv1.2','tlsv1.3']},
    -        {keep_secrets, true} %% Enable NSS key log (debug option)
    -        ],
    -        {ok, LSock} = ssl:listen(Port, LOpts),
    -        {ok, ASock} = ssl:transport_accept(LSock),
    -        {ok, CSock} = ssl:handshake(ASock).

    Exporting the secrets

          {ok, [{keylog, KeylogItems}]} = ssl:connection_information(CSock, [keylog]).
    -      file:write_file("key.log", [[KeylogItem,$\n] || KeylogItem <- KeylogItems]).

    + LOpts = [{certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}, + {reuseaddr, true}, + {versions, ['tlsv1.2','tlsv1.3']}, + {keep_secrets, true} %% Enable NSS key log (debug option) + ], + {ok, LSock} = ssl:listen(Port, LOpts), + {ok, ASock} = ssl:transport_accept(LSock), + {ok, CSock} = ssl:handshake(ASock).

    Exporting the secrets

          {ok, [{keylog, KeylogItems}]} = ssl:connection_information(CSock, [keylog]).
    +      file:write_file("key.log", [[KeylogItem,$\n] || KeylogItem <- KeylogItems]).

    @@ -345,115 +345,115 @@

    {reuse_session, SessionId}. Also it is possible for the client to reuse a session that is not saved by the ssl application using {reuse_session, {SessionId, SessionData}}.

    Note

    When using explicit session reuse, it is up to the client to make sure that -the session being reused is for the correct server and has been verified.

    Here follows a client side example, divide into several steps for readability.

    Step 1 - Automated Session Reuse

    1> ssl:start().
    +the session being reused is for the correct server and has been verified.

    Here follows a client side example, divide into several steps for readability.

    Step 1 - Automated Session Reuse

    1> ssl:start().
     ok
     
    -2>{ok, C1} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                           {versions, ['tlsv1.2']},
    -                                           {cacertfile, "cacerts.pem"}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.7>,tls_connection,undefined}, ...}}
    +2>{ok, C1} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                           {versions, ['tlsv1.2']},
    +                                           {cacertfile, "cacerts.pem"}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.7>,tls_connection,undefined}, ...}}
     
    -3> ssl:connection_information(C1, [session_id]).
    -{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,
    +3> ssl:connection_information(C1, [session_id]).
    +{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,
                        152,49,52,124,56,130,192,137,161,
    -                   146,145,164,232,...>>}]}
    +                   146,145,164,232,...>>}]}
     
     %% Reuse session if possible, note that if C2 is really fast the session
     %% data might not be available for reuse.
    -4>{ok, C2} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                           {versions, ['tlsv1.2']},
    -                                           {cacertfile, "cacerts.pem"},
    -                                           {reuse_sessions, true}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.8>,tls_connection,undefined}, ...]}}
    +4>{ok, C2} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                           {versions, ['tlsv1.2']},
    +                                           {cacertfile, "cacerts.pem"},
    +                                           {reuse_sessions, true}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.8>,tls_connection,undefined}, ...]}}
     
     %% C2 got same session ID as client one, session was automatically reused.
    -5> ssl:connection_information(C2, [session_id]).
    -{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,
    +5> ssl:connection_information(C2, [session_id]).
    +{ok,[{session_id,<<95,32,43,22,35,63,249,22,26,36,106,
                        152,49,52,124,56,130,192,137,161,
    -                   146,145,164,232,...>>}]}

    Step 2- Using save Option

    %% We want save this particular session for
    +                   146,145,164,232,...>>}]}

    Step 2- Using save Option

    %% We want save this particular session for
     %% reuse although it has the same basis as C1
    -6> {ok, C3} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                           {versions, ['tlsv1.2']},
    -                                           {cacertfile, "cacerts.pem"},
    -                                           {reuse_sessions, save}]).
    +6> {ok, C3} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                           {versions, ['tlsv1.2']},
    +                                           {cacertfile, "cacerts.pem"},
    +                                           {reuse_sessions, save}]).
     
    -{ok,{sslsocket,{gen_tcp,#Port<0.9>,tls_connection,undefined}, ...]}}
    +{ok,{sslsocket,{gen_tcp,#Port<0.9>,tls_connection,undefined}, ...]}}
     
     %% A full handshake is performed and we get a new session ID
    -7> {ok, [{session_id, ID}]} = ssl:connection_information(C3, [session_id]).
    -{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
    +7> {ok, [{session_id, ID}]} = ssl:connection_information(C3, [session_id]).
    +{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
                        121,190,66,192,10,1,27,192,33,95,78,
    -                   8,34,180,...>>}]}
    +                   8,34,180,...>>}]}
     
     %% Use automatic session reuse
    -8> {ok, C4} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                           {versions, ['tlsv1.2']},
    -                                           {cacertfile, "cacerts.pem"},
    -                                           {reuse_sessions, true}]).
    +8> {ok, C4} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                           {versions, ['tlsv1.2']},
    +                                           {cacertfile, "cacerts.pem"},
    +                                           {reuse_sessions, true}]).
     
    -{ok,{sslsocket,{gen_tcp,#Port<0.10>,tls_connection,
    -                        undefined}, ...]}}
    +{ok,{sslsocket,{gen_tcp,#Port<0.10>,tls_connection,
    +                        undefined}, ...]}}
     
     %% The "saved" one happened to be selected, but this is not a guarantee
    -9> ssl:connection_information(C4, [session_id]).
    -{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
    +9> ssl:connection_information(C4, [session_id]).
    +{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
                        121,190,66,192,10,1,27,192,33,95,78,
    -                   8,34,180,...>>}]}
    +                   8,34,180,...>>}]}
     
     %% Make sure to reuse the "saved" session
    -10> {ok, C5} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                           {versions, ['tlsv1.2']},
    -                                           {cacertfile, "cacerts.pem"},
    -                                           {reuse_session, ID}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.11>,tls_connection,
    -                        undefined}, ...]}}
    -
    -11> ssl:connection_information(C5, [session_id]).
    -{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
    +10> {ok, C5} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                           {versions, ['tlsv1.2']},
    +                                           {cacertfile, "cacerts.pem"},
    +                                           {reuse_session, ID}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.11>,tls_connection,
    +                        undefined}, ...]}}
    +
    +11> ssl:connection_information(C5, [session_id]).
    +{ok,[{session_id,<<91,84,27,151,183,39,84,90,143,141,
                        121,190,66,192,10,1,27,192,33,95,78,
    -                   8,34,180,...>>}]}

    Step 3 - Explicit Session Reuse

    %% Perform a full handshake and the session will not be saved for reuse
    -12> {ok, C9} =
    -ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                    {versions, ['tlsv1.2']},
    -                                    {cacertfile, "cacerts.pem"},
    -                                    {reuse_sessions, false},
    -                                    {server_name_indication, disable}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.14>,tls_connection, ...}}
    +                   8,34,180,...>>}]}

    Step 3 - Explicit Session Reuse

    %% Perform a full handshake and the session will not be saved for reuse
    +12> {ok, C9} =
    +ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                    {versions, ['tlsv1.2']},
    +                                    {cacertfile, "cacerts.pem"},
    +                                    {reuse_sessions, false},
    +                                    {server_name_indication, disable}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.14>,tls_connection, ...}}
     
     %% Fetch session ID and data for C9 connection
    -12> {ok, [{session_id, ID1}, {session_data, SessData}]} =
    -        ssl:connection_information(C9, [session_id, session_data]).
    -{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,
    +12> {ok, [{session_id, ID1}, {session_data, SessData}]} =
    +        ssl:connection_information(C9, [session_id, session_data]).
    +{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,
                        85,85,99,119,47,9,68,195,50,120,52,
    -                   130,239,...>>},
    -     {session_data,<<131,104,13,100,0,7,115,101,115,115,105,
    -                     111,110,109,0,0,0,32,9,233,4,54,170,...>>}]}
    +                   130,239,...>>},
    +     {session_data,<<131,104,13,100,0,7,115,101,115,115,105,
    +                     111,110,109,0,0,0,32,9,233,4,54,170,...>>}]}
     
     %% Explicitly reuse the session from C9
    -13> {ok, C10} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                    {versions, ['tlsv1.2']},
    -                                    {cacertfile, "cacerts.pem"},
    -                                    {reuse_session, {ID1, SessData}}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.15>,tls_connection,
    -                        undefined}, ...}}
    -
    -14> ssl:connection_information(C10, [session_id]).
    -{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,
    +13> {ok, C10} = ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                    {versions, ['tlsv1.2']},
    +                                    {cacertfile, "cacerts.pem"},
    +                                    {reuse_session, {ID1, SessData}}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.15>,tls_connection,
    +                        undefined}, ...}}
    +
    +14> ssl:connection_information(C10, [session_id]).
    +{ok,[{session_id,<<9,233,4,54,170,88,170,180,17,96,202,
                        85,85,99,119,47,9,68,195,50,120,52,
    -                   130,239,...>>}]}

    Step 4 - Not Possible to Reuse Explicit Session by ID Only

    %% Try to reuse the session from C9 using only the id
    -15> {ok, E} =  ssl:connect("localhost", 9999, [{verify, verify_peer},
    -                                    {versions, ['tlsv1.2']},
    -                                    {cacertfile, "cacerts.pem"},
    -                                    {reuse_session, ID1}]).
    -{ok,{sslsocket,{gen_tcp,#Port<0.18>,tls_connection,
    -                        undefined}, ...}}
    +                   130,239,...>>}]}

    Step 4 - Not Possible to Reuse Explicit Session by ID Only

    %% Try to reuse the session from C9 using only the id
    +15> {ok, E} =  ssl:connect("localhost", 9999, [{verify, verify_peer},
    +                                    {versions, ['tlsv1.2']},
    +                                    {cacertfile, "cacerts.pem"},
    +                                    {reuse_session, ID1}]).
    +{ok,{sslsocket,{gen_tcp,#Port<0.18>,tls_connection,
    +                        undefined}, ...}}
     
     %% This will fail (as it is not saved for reuse)
     %% and a full handshake will be performed, we get a new id.
    -16>  ssl:connection_information(E, [session_id]).
    -{ok,[{session_id,<<87,46,43,126,175,68,160,153,37,29,
    +16>  ssl:connection_information(E, [session_id]).
    +{ok,[{session_id,<<87,46,43,126,175,68,160,153,37,29,
                        196,240,65,160,254,88,65,224,18,63,
    -                   18,17,174,39,...>>}]}

    On the server side the the {reuse_sessions, boolean()} option determines if + 18,17,174,39,...>>}]}

    On the server side the the {reuse_sessions, boolean()} option determines if the server will save session data and allow session reuse or not. This can be further customized by the option {reuse_session, fun()} that may introduce a local policy for session reuse.

    @@ -477,18 +477,18 @@

    Anti-Replay Protection in TLS 1.3

    Session tickets are sent by servers on newly established TLS connections. The number of tickets sent and their lifetime are configurable by application variables. See also SSL's configuration.

    Session tickets are protected by application traffic keys, and in stateless -tickets, the opaque data structure itself is self-encrypted.

    An example with automatic and manual session resumption:

          {ok, _} = application:ensure_all_started(ssl).
    -      LOpts = [{certs_keys, [#{certfile => "cert.pem",
    -                               keyfile => "key.pem"}]},
    -               {versions, ['tlsv1.2','tlsv1.3']},
    -               {session_tickets, stateless}].
    -      {ok, LSock} = ssl:listen(8001, LOpts).
    -      {ok, ASock} = ssl:transport_accept(LSock).

    Step 2 (client): Start the client and connect to server:

          {ok, _} = application:ensure_all_started(ssl).
    -      COpts = [{cacertfile, "cert.pem"},
    -               {versions, ['tlsv1.2','tlsv1.3']},
    -               {log_level, debug},
    -               {session_tickets, auto}].
    -      ssl:connect("localhost", 8001, COpts).

    Step 3 (server): Start the TLS handshake:

          {ok, CSocket} = ssl:handshake(ASock).

    A connection is established using a full handshake. Below is a summary of the +tickets, the opaque data structure itself is self-encrypted.

    An example with automatic and manual session resumption:

          {ok, _} = application:ensure_all_started(ssl).
    +      LOpts = [{certs_keys, [#{certfile => "cert.pem",
    +                               keyfile => "key.pem"}]},
    +               {versions, ['tlsv1.2','tlsv1.3']},
    +               {session_tickets, stateless}].
    +      {ok, LSock} = ssl:listen(8001, LOpts).
    +      {ok, ASock} = ssl:transport_accept(LSock).

    Step 2 (client): Start the client and connect to server:

          {ok, _} = application:ensure_all_started(ssl).
    +      COpts = [{cacertfile, "cert.pem"},
    +               {versions, ['tlsv1.2','tlsv1.3']},
    +               {log_level, debug},
    +               {session_tickets, auto}].
    +      ssl:connect("localhost", 8001, COpts).

    Step 3 (server): Start the TLS handshake:

          {ok, CSocket} = ssl:handshake(ASock).

    A connection is established using a full handshake. Below is a summary of the exchanged messages:

          >>> TLS 1.3 Handshake, ClientHello ...
           <<< TLS 1.3 Handshake, ServerHello ...
           <<< Handshake, EncryptedExtensions ...
    @@ -497,27 +497,27 @@ 

    <<< Handshake, Finished ... >>> Handshake, Finished ... <<< Post-Handshake, NewSessionTicket ...

    At this point the client has stored the received session tickets and ready to -use them when establishing new connections to the same server.

    Step 4 (server): Accept a new connection on the server:

          {ok, ASock2} = ssl:transport_accept(LSock).

    Step 5 (client): Make a new connection:

          ssl:connect("localhost", 8001, COpts).

    Step 6 (server): Start the handshake:

          {ok, CSock2} =ssl:handshake(ASock2).

    The second connection is a session resumption using keying material from the +use them when establishing new connections to the same server.

    Step 4 (server): Accept a new connection on the server:

          {ok, ASock2} = ssl:transport_accept(LSock).

    Step 5 (client): Make a new connection:

          ssl:connect("localhost", 8001, COpts).

    Step 6 (server): Start the handshake:

          {ok, CSock2} =ssl:handshake(ASock2).

    The second connection is a session resumption using keying material from the previous handshake:

          >>> TLS 1.3 Handshake, ClientHello ...
           <<< TLS 1.3 Handshake, ServerHello ...
           <<< Handshake, EncryptedExtensions ...
           <<< Handshake, Finished ...
           >>> Handshake, Finished ...
           <<< Post-Handshake, NewSessionTicket ...

    Manual handling of session tickets is also supported. In manual mode, it is the -responsibility of the client to handle received session tickets.

    Step 7 (server): Accept a new connection on the server:

          {ok, ASock3} = ssl:transport_accept(LSock).

    Step 8 (client): Make a new connection to server:

          {ok, _} = application:ensure_all_started(ssl).
    -      COpts2 = [{cacertfile, "cacerts.pem"},
    -                {versions, ['tlsv1.2','tlsv1.3']},
    -                {log_level, debug},
    -                {session_tickets, manual}].
    -      ssl:connect("localhost", 8001, COpts).

    Step 9 (server): Start the handshake:

          {ok, CSock3} = ssl:handshake(ASock3).

    After the handshake is performed, the user process receivess messages with the -tickets sent by the server.

    Step 10 (client): Receive a new session ticket:

          Ticket = receive {ssl, session_ticket, {_, TicketData}} -> TicketData end.

    Step 11 (server): Accept a new connection on the server:

          {ok, ASock4} = ssl:transport_accept(LSock).

    Step 12 (client): Initiate a new connection to the server with the session -ticket received in Step 10:

          {ok, _} = application:ensure_all_started(ssl).
    -      COpts2 = [{cacertfile, "cert.pem"},
    -                {versions, ['tlsv1.2','tlsv1.3']},
    -                {log_level, debug},
    -                {session_tickets, manual},
    -                {use_ticket, [Ticket]}].
    -      ssl:connect("localhost", 8001, COpts).

    Step 13 (server): Start the handshake:

          {ok, CSock4} = ssl:handshake(ASock4).

    +responsibility of the client to handle received session tickets.

    Step 7 (server): Accept a new connection on the server:

          {ok, ASock3} = ssl:transport_accept(LSock).

    Step 8 (client): Make a new connection to server:

          {ok, _} = application:ensure_all_started(ssl).
    +      COpts2 = [{cacertfile, "cacerts.pem"},
    +                {versions, ['tlsv1.2','tlsv1.3']},
    +                {log_level, debug},
    +                {session_tickets, manual}].
    +      ssl:connect("localhost", 8001, COpts).

    Step 9 (server): Start the handshake:

          {ok, CSock3} = ssl:handshake(ASock3).

    After the handshake is performed, the user process receivess messages with the +tickets sent by the server.

    Step 10 (client): Receive a new session ticket:

          Ticket = receive {ssl, session_ticket, {_, TicketData}} -> TicketData end.

    Step 11 (server): Accept a new connection on the server:

          {ok, ASock4} = ssl:transport_accept(LSock).

    Step 12 (client): Initiate a new connection to the server with the session +ticket received in Step 10:

          {ok, _} = application:ensure_all_started(ssl).
    +      COpts2 = [{cacertfile, "cert.pem"},
    +                {versions, ['tlsv1.2','tlsv1.3']},
    +                {log_level, debug},
    +                {session_tickets, manual},
    +                {use_ticket, [Ticket]}].
    +      ssl:connect("localhost", 8001, COpts).

    Step 13 (server): Start the handshake:

          {ok, CSock4} = ssl:handshake(ASock4).

    @@ -536,76 +536,76 @@

    operations, such as HEAD and GET, can usually be regarded as safe but even they can be exploited by a large number of replays causing resource limit exhaustion and other similar problems.

    An example of sending early data with automatic and manual session ticket -handling:

    Server

    early_data_server() ->
    -    application:load(ssl),
    -    {ok, _} = application:ensure_all_started(ssl),
    +handling:

    Server

    early_data_server() ->
    +    application:load(ssl),
    +    {ok, _} = application:ensure_all_started(ssl),
         Port = 11029,
    -    LOpts = [{certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]},
    -             {reuseaddr, true},
    -             {versions, ['tlsv1.2','tlsv1.3']},
    -             {session_tickets, stateless},
    -             {early_data, enabled},
    -            ],
    -    {ok, LSock} = ssl:listen(Port, LOpts),
    +    LOpts = [{certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]},
    +             {reuseaddr, true},
    +             {versions, ['tlsv1.2','tlsv1.3']},
    +             {session_tickets, stateless},
    +             {early_data, enabled},
    +            ],
    +    {ok, LSock} = ssl:listen(Port, LOpts),
         %% Accept first connection
    -    {ok, ASock0} = ssl:transport_accept(LSock),
    -    {ok, CSock0} = ssl:handshake(ASock0),
    +    {ok, ASock0} = ssl:transport_accept(LSock),
    +    {ok, CSock0} = ssl:handshake(ASock0),
         %% Accept second connection
    -    {ok, ASock1} = ssl:transport_accept(LSock),
    -    {ok, CSock1} = ssl:handshake(ASock1),
    -    Sock.

    Client (automatic ticket handling):

    early_data_auto() ->
    +    {ok, ASock1} = ssl:transport_accept(LSock),
    +    {ok, CSock1} = ssl:handshake(ASock1),
    +    Sock.

    Client (automatic ticket handling):

    early_data_auto() ->
         %% First handshake 1-RTT - get session tickets
    -    application:load(ssl),
    -    {ok, _} = application:ensure_all_started(ssl),
    +    application:load(ssl),
    +    {ok, _} = application:ensure_all_started(ssl),
         Port = 11029,
         Data = <<"HEAD / HTTP/1.1\r\nHost: \r\nConnection: close\r\n">>,
    -    COpts0 = [{cacertfile, "cacerts.pem"},
    -              {versions, ['tlsv1.2', 'tlsv1.3']},
    -              {session_tickets, auto}],
    -    {ok, Sock0} = ssl:connect("localhost", Port, COpts0),
    +    COpts0 = [{cacertfile, "cacerts.pem"},
    +              {versions, ['tlsv1.2', 'tlsv1.3']},
    +              {session_tickets, auto}],
    +    {ok, Sock0} = ssl:connect("localhost", Port, COpts0),
     
         %% Wait for session tickets
    -    timer:sleep(500),
    +    timer:sleep(500),
         %% Close socket if server cannot handle multiple
         %% connections e.g. openssl s_server
    -    ssl:close(Sock0),
    +    ssl:close(Sock0),
     
         %% Second handshake 0-RTT
    -    COpts1 = [{cacertfile,  "cacerts.pem"},
    -              {versions, ['tlsv1.2', 'tlsv1.3']},
    -              {session_tickets, auto},
    -              {early_data, Data}],
    -    {ok, Sock} = ssl:connect("localhost", Port, COpts1),
    +    COpts1 = [{cacertfile,  "cacerts.pem"},
    +              {versions, ['tlsv1.2', 'tlsv1.3']},
    +              {session_tickets, auto},
    +              {early_data, Data}],
    +    {ok, Sock} = ssl:connect("localhost", Port, COpts1),
         Sock.
    -

    Client (manual ticket handling):

    early_data_manual() ->
    +

    Client (manual ticket handling):

    early_data_manual() ->
         %% First handshake 1-RTT - get session tickets
    -    application:load(ssl),
    -    {ok, _} = application:ensure_all_started(ssl),
    +    application:load(ssl),
    +    {ok, _} = application:ensure_all_started(ssl),
         Port = 11029,
         Data = <<"HEAD / HTTP/1.1\r\nHost: \r\nConnection: close\r\n">>,
    -    COpts0 = [{cacertfile, "cacerts.pem"},
    -              {versions, ['tlsv1.2', 'tlsv1.3']},
    -              {session_tickets, manual}],
    -    {ok, Sock0} = ssl:connect("localhost", Port, COpts0),
    +    COpts0 = [{cacertfile, "cacerts.pem"},
    +              {versions, ['tlsv1.2', 'tlsv1.3']},
    +              {session_tickets, manual}],
    +    {ok, Sock0} = ssl:connect("localhost", Port, COpts0),
     
         %% Wait for session tickets
         Ticket =
             receive
    -            {ssl, session_ticket, Ticket0} ->
    +            {ssl, session_ticket, Ticket0} ->
                     Ticket0
             end,
     
         %% Close socket if server cannot handle multiple connections
         %% e.g. openssl s_server
    -    ssl:close(Sock0),
    +    ssl:close(Sock0),
     
         %% Second handshake 0-RTT
    -    COpts1 = [{cacertfile, "cacerts.pem"},
    -              {versions, ['tlsv1.2', 'tlsv1.3']},
    -              {session_tickets, manual},
    -              {use_ticket, [Ticket]},
    -              {early_data, Data}],
    -    {ok, Sock} = ssl:connect("localhost", Port, COpts1),
    +    COpts1 = [{cacertfile, "cacerts.pem"},
    +              {versions, ['tlsv1.2', 'tlsv1.3']},
    +              {session_tickets, manual},
    +              {use_ticket, [Ticket]},
    +              {early_data, Data}],
    +    {ok, Sock} = ssl:connect("localhost", Port, COpts1),
         Sock.

    @@ -650,11 +650,11 @@

    Using DTLS

    Using DTLS has basically the same API as TLS. You need to add the option -{protocol, dtls} to the connect and listen functions. For example

     client>{ok, Socket} = ssl:connect("localhost", 9999, [{protocol, dtls},
    -                                               {verify, verify_peer},
    -                                               {cacertfile, "cacerts.pem"}],
    -                           infinity).
    -{ok,{sslsocket, [...]}}
    +{protocol, dtls} to the connect and listen functions. For example

     client>{ok, Socket} = ssl:connect("localhost", 9999, [{protocol, dtls},
    +                                               {verify, verify_peer},
    +                                               {cacertfile, "cacerts.pem"}],
    +                           infinity).
    +{ok,{sslsocket, [...]}}
     
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/argparse.html b/prs/8803/lib/stdlib-6.0.1/doc/html/argparse.html index e8bc3670a6a88..453cb551726cd 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/argparse.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/argparse.html @@ -147,20 +147,20 @@

    example below is a fully functioning Erlang program accepting two command line arguments and printing their product.

    #!/usr/bin/env escript
     
    -main(Args) ->
    -    argparse:run(Args, cli(), #{progname => mul}).
    -
    -cli() ->
    -    #{
    -        arguments => [
    -            #{name => left, type => integer},
    -            #{name => right, type => integer}
    -        ],
    +main(Args) ->
    +    argparse:run(Args, cli(), #{progname => mul}).
    +
    +cli() ->
    +    #{
    +        arguments => [
    +            #{name => left, type => integer},
    +            #{name => right, type => integer}
    +        ],
             handler =>
    -            fun (#{left := Left, right := Right}) ->
    -                io:format("~b~n", [Left * Right])
    +            fun (#{left := Left, right := Right}) ->
    +                io:format("~b~n", [Left * Right])
                 end
    -    }.

    Running this script with no arguments results in an error, accompanied by the + }.

    Running this script with no arguments results in an error, accompanied by the usage information.

    The cli function defines a single command with embedded handler accepting a map. Keys of the map are argument names as defined by the argument field of the command, left and right in the example. Values are taken from the @@ -174,25 +174,25 @@

    A command may contain nested commands, forming a hierarchy. Arguments defined at the upper level command are automatically added to all nested commands. Nested -commands example (assuming progname is nested):

    cli() ->
    -  #{
    +commands example (assuming progname is nested):

    cli() ->
    +  #{
         %% top level argument applicable to all commands
    -    arguments => [#{name => top}],
    -      commands => #{
    -        "first" => #{
    +    arguments => [#{name => top}],
    +      commands => #{
    +        "first" => #{
               %% argument applicable to "first" command and
               %%  all commands nested into "first"
    -          arguments => [#{name => mid}],
    -          commands => #{
    -            "second" => #{
    +          arguments => [#{name => mid}],
    +          commands => #{
    +            "second" => #{
                   %% argument only applicable for "second" command
    -              arguments => [#{name => bottom}],
    -              handler => fun (A) -> io:format("~p~n", [A]) end
    -          }
    -        }
    -      }
    -    }
    -  }.

    In the example above, a 3-level hierarchy is defined. First is the script itself + arguments => [#{name => bottom}], + handler => fun (A) -> io:format("~p~n", [A]) end + } + } + } + } + }.

    In the example above, a 3-level hierarchy is defined. First is the script itself (nested), accepting the only argument top. Since it has no associated handler, run/3 will not accept user input omitting nested command selection. For this example, user has to supply 5 arguments in the command line, two being @@ -210,14 +210,14 @@

    on all operating systems). Both options and positional arguments have 1 or more associated values. See argument specification to find more details about supported combinations.

    In the user input, short options may be concatenated with their values. Long -options support values separated by =. Consider this definition:

    cli() ->
    -  #{
    -    arguments => [
    -      #{name => long, long => "-long"},
    -      #{name => short, short => $s}
    -    ],
    -    handler => fun (Args) -> io:format("~p~n", [Args]) end
    -  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running +options support values separated by =. Consider this definition:

    cli() ->
    +  #{
    +    arguments => [
    +      #{name => long, long => "-long"},
    +      #{name => short, short => $s}
    +    ],
    +    handler => fun (Args) -> io:format("~p~n", [Args]) end
    +  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running ./args -sVALUE prints #{short => "VALUE"}

    argparse supports boolean flags concatenation: it is possible to shorten -r -f -v to -rfv.

    Shortened option names are not supported: it is not possible to use --my-argum instead of --my-argument-name even when such option can be unambiguously @@ -608,111 +608,111 @@

    argument()

    which case resulting argument map will either contain the default value, or not have the key at all.

    • name - Sets the argument name in the parsed argument map. If help is not defined, name is also used to generate the default usage message.

    • short - Defines a short (single character) form of an optional argument.

      %% Define a command accepting argument named myarg, with short form $a:
      -1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
      +1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
       %% Parse command line "-a str":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
       
      -#{myarg => "str"}
      +#{myarg => "str"}
       
       %% Option value can be concatenated with the switch: "-astr"
      -3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
       
      -#{myarg => "str"}

      By default all options expect a single value following the option switch. The -only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
      +#{myarg => "str"}

      By default all options expect a single value following the option switch. The +only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
       %% Parse command line "-name Erlang":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}
      +#{myarg => "Erlang"}
       %% Or use "=" to separate the switch and the value:
      -3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}

      If neither short not long is defined, the argument is treated as +#{myarg => "Erlang"}

    If neither short not long is defined, the argument is treated as positional.

  • required - Forces the parser to expect the argument to be present in the command line. By default, all positional argument are required, and all options are not.

  • default - Specifies the default value to put in the parsed argument map -if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
    +if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
     
    -{ok,#{}, ...
    -2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
    +{ok,#{}, ...
    +2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
     
    -{ok,#{myarg => "def"}, ...
  • type - Defines type conversion and validation routine. The default is +{ok,#{myarg => "def"}, ...

  • type - Defines type conversion and validation routine. The default is string, assuming no conversion.

  • nargs - Defines the number of following arguments to consume from the command line. By default, the parser consumes the next argument and converts it into an Erlang term according to the specified type.

    • pos_integer/0 - Consume exactly this number of positional arguments, fail if there is not enough. Value in the argument map contains a list of exactly this length. Example, defining a positional argument expecting 3 -integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      -argparse:parse(["1", "2", "3"], Cmd).
      +integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      +argparse:parse(["1", "2", "3"], Cmd).
       
      -{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two -string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      -argparse:parse(["-env", "key", "value"], Cmd).
      +{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two +string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      +argparse:parse(["-env", "key", "value"], Cmd).
       
      -{ok, #{env => ["key", "value"]}, ...
    • list - Consume all following arguments until hitting the next option +{ok, #{env => ["key", "value"]}, ...

  • list - Consume all following arguments until hitting the next option (starting with an option prefix). May result in an empty list added to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => nodes, long => "nodes", nargs => list},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => nodes, long => "nodes", nargs => list},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
     
    -{ok, #{nodes => ["one", "two"], verbose => true}, ...
  • nonempty_list - Same as list, but expects at least one argument. +{ok, #{nodes => ["one", "two"], verbose => true}, ...

  • nonempty_list - Same as list, but expects at least one argument. Returns an error if the following command line argument is an option switch (starting with the prefix).

  • 'maybe' - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a default value to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-l", "info", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-l", "info", "-v"], Cmd).
     
    -{ok,#{level => "info",verbose => true}, ...
    +{ok,#{level => "info",verbose => true}, ...
     
     %% When "info" is omitted, argument maps receives the default "error"
    -2> argparse:parse(["-l", "-v"], Cmd).
    +2> argparse:parse(["-l", "-v"], Cmd).
     
    -{ok,#{level => "error",verbose => true}, ...
  • {'maybe', term()} - Consumes the next argument from the command line, +{ok,#{level => "error",verbose => true}, ...

  • {'maybe', term()} - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a specified Erlang term to the arguments map.

  • all - Fold all remaining command line arguments into a list, ignoring any option prefixes or switches. Useful for proxying arguments into another -command line utility.

    1> Cmd = #{arguments => [
    -    #{name => verbose, short => $v, type => boolean},
    -    #{name => raw, long => "-", nargs => all}
    -]},
    -argparse:parse(["-v", "--", "-kernel", "arg", "opt"], Cmd).
    +command line utility.

    1> Cmd = #{arguments => [
    +    #{name => verbose, short => $v, type => boolean},
    +    #{name => raw, long => "-", nargs => all}
    +]},
    +argparse:parse(["-v", "--", "-kernel", "arg", "opt"], Cmd).
     
    -{ok,#{raw => ["-kernel","arg","opt"],verbose => true}, ...
  • action - Defines an action to take when the argument is found in the +{ok,#{raw => ["-kernel","arg","opt"],verbose => true}, ...

  • action - Defines an action to take when the argument is found in the command line. The default action is store.

    • store - Store the value in the arguments map. Overwrites the value -previously written.

      1> Cmd = #{arguments => [#{name => str, short => $s}]},
      -argparse:parse(["-s", "one", "-s", "two"], Cmd).
      +previously written.

      1> Cmd = #{arguments => [#{name => str, short => $s}]},
      +argparse:parse(["-s", "one", "-s", "two"], Cmd).
       
      -{ok, #{str => "two"}, ...
    • {store, term()} - Stores the specified term instead of reading the -value from the command line.

      1> Cmd = #{arguments => [#{name => str, short => $s, action => {store, "two"}}]},
      -argparse:parse(["-s"], Cmd).
      +{ok, #{str => "two"}, ...
    • {store, term()} - Stores the specified term instead of reading the +value from the command line.

      1> Cmd = #{arguments => [#{name => str, short => $s, action => {store, "two"}}]},
      +argparse:parse(["-s"], Cmd).
       
      -{ok, #{str => "two"}, ...
    • append - Appends the repeating occurrences of the argument instead of -overwriting.

      1> Cmd = #{arguments => [#{name => node, short => $n, action => append}]},
      -argparse:parse(["-n", "one", "-n", "two", "-n", "three"], Cmd).
      +{ok, #{str => "two"}, ...
    • append - Appends the repeating occurrences of the argument instead of +overwriting.

      1> Cmd = #{arguments => [#{name => node, short => $n, action => append}]},
      +argparse:parse(["-n", "one", "-n", "two", "-n", "three"], Cmd).
       
      -{ok, #{node => ["one", "two", "three"]}, ...
      +{ok, #{node => ["one", "two", "three"]}, ...
       
       %% Always produces a list - even if there is one occurrence
      -2> argparse:parse(["-n", "one"], Cmd).
      +2> argparse:parse(["-n", "one"], Cmd).
       
      -{ok, #{node => ["one"]}, ...
    • {append, term()} - Same as append, but instead of consuming the +{ok, #{node => ["one"]}, ...

  • {append, term()} - Same as append, but instead of consuming the argument from the command line, appends a provided term/0.

  • count - Puts a counter as a value in the arguments map. Useful for -implementing verbosity option:

    1> Cmd = #{arguments => [#{name => verbose, short => $v, action => count}]},
    -argparse:parse(["-v"], Cmd).
    +implementing verbosity option:

    1> Cmd = #{arguments => [#{name => verbose, short => $v, action => count}]},
    +argparse:parse(["-v"], Cmd).
     
    -{ok, #{verbose => 1}, ...
    +{ok, #{verbose => 1}, ...
     
    -2> argparse:parse(["-vvvv"], Cmd).
    +2> argparse:parse(["-vvvv"], Cmd).
     
    -{ok, #{verbose => 4}, ...
  • extend - Works as append, but flattens the resulting list. Valid -only for nargs set to list, nonempty_list, all or pos_integer/0.

    1> Cmd = #{arguments => [#{name => duet, short => $d, nargs => 2, action => extend}]},
    -argparse:parse(["-d", "a", "b", "-d", "c", "d"], Cmd).
    +{ok, #{verbose => 4}, ...
  • extend - Works as append, but flattens the resulting list. Valid +only for nargs set to list, nonempty_list, all or pos_integer/0.

    1> Cmd = #{arguments => [#{name => duet, short => $d, nargs => 2, action => extend}]},
    +argparse:parse(["-d", "a", "b", "-d", "c", "d"], Cmd).
     
    -{ok, #{duet => ["a", "b", "c", "d"]}, ...
    +{ok, #{duet => ["a", "b", "c", "d"]}, ...
     
     %% 'append' would result in {ok, #{duet => [["a", "b"],["c", "d"]]},
  • help - Specifies help/usage text for the argument. argparse provides automatic generation based on the argument name, type and default value, but @@ -929,16 +929,16 @@

    handler()

    exported from Module, accepting argument map.

  • {fun(() -> term()), Default :: term()} - Function accepting as many arguments as there are in the arguments list for this command. Arguments missing from the parsed map are replaced with the Default. Convenient way to -expose existing functions.

    1> Cmd = #{arguments => [
    -        #{name => x, type => float},
    -        #{name => y, type => float, short => $p}],
    -    handler => {fun math:pow/2, 1}},
    -argparse:run(["2", "-p", "3"], Cmd, #{}).
    +expose existing functions.

    1> Cmd = #{arguments => [
    +        #{name => x, type => float},
    +        #{name => y, type => float, short => $p}],
    +    handler => {fun math:pow/2, 1}},
    +argparse:run(["2", "-p", "3"], Cmd, #{}).
     
     8.0
     
     %% default term 1 is passed to math:pow/2
    -2> argparse:run(["2"], Cmd, #{}).
    +2> argparse:run(["2"], Cmd, #{}).
     
     2.0
  • {Module :: module(), Function :: atom(), Default :: term()} - Function named Function, exported from Module, accepting as many arguments as diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/array.html b/prs/8803/lib/stdlib-6.0.1/doc/html/array.html index 657298784a64e..79d2430d80dbd 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/array.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/array.html @@ -136,14 +136,14 @@

    reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1184,7 +1184,7 @@

    new(Options)

    array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1217,7 +1217,7 @@

    new(Size, Options)

    Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/assert_hrl.html b/prs/8803/lib/stdlib-6.0.1/doc/html/assert_hrl.html index e3798287f1710..93012e2b48cb6 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/assert_hrl.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/assert_hrl.html @@ -132,7 +132,7 @@

    Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -160,7 +160,7 @@

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/base64.html b/prs/8803/lib/stdlib-6.0.1/doc/html/base64.html index cba2a1bec1a91..305bbe863a261 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/base64.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/base64.html @@ -671,15 +671,15 @@

      decode(Base64, Options)

      Decodes a base64 string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strips away any whitespace characters and check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
       <<1,2,3,4>>
      -2> base64:decode("AQ ID BA==").
      +2> base64:decode("AQ ID BA==").
       <<1,2,3,4>>
      -3> base64:decode("AQIDBA=").
      +3> base64:decode("AQIDBA=").
       ** exception error: missing_padding
            in function  base64:decode_list/7 (base64.erl, line 734)
               *** data to decode is missing final = padding characters, if this is intended, use the `padding => false` option
      -4> base64:decode("AQIDBA=", #{ padding => false }).
      +4> base64:decode("AQIDBA=", #{ padding => false }).
       <<1,2,3,4>>

    @@ -934,9 +934,9 @@

    mime_decode(Base64, Options)

    Decodes a base64 "mime" string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

    The function will strips away any illegal characters. It does not check for the -the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    +the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
     <<1,2,3,4>>
    -2> base64:mime_decode("AQIDB=A=").
    +2> base64:mime_decode("AQIDB=A=").
     <<1,2,3,4>>
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/beam_lib.html b/prs/8803/lib/stdlib-6.0.1/doc/html/beam_lib.html index 2459131514fdb..69752dc15aa60 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/beam_lib.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/beam_lib.html @@ -151,8 +151,8 @@

    Reconstruct Source Code

    The following example shows how to reconstruct Erlang source code from the debug -information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    -io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    +information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    +io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    @@ -182,13 +182,13 @@

    user's home directory and then filename:basedir(user_config, "erlang"). If the file is found and contains a key, beam_lib implicitly creates a crypto key fun -and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is +and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is des3_cbc. Module is either an atom, in which case Key is only used for the module Module, or [], in which case Key is used for all modules. Key is the non-empty key string.

    Key in the first tuple where both Mode and Module match is used.

    The following is an example of an .erlang.crypt file that returns the same key -for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt -providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    - {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    +for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt +providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    + {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    @@ -1556,11 +1556,11 @@

    crypto_key_fun(CryptoKeyFun)

    Registers an unary fun that is called if beam_lib must read an debug_info chunk that has been encrypted. The fun is held in a process that is started by the function.

    If a fun is already registered when attempting to register a fun, -{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the +{error, exists} is returned.

    The fun must handle the following arguments:

    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, NewCryptoKeyFun is registered instead of CryptoKeyFun. If {error, Term} is returned, the registration is aborted and -crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. +crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value is des3_cbc. The call is to fail (raise an exception) if no key is available.

    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 @@ -1927,14 +1927,14 @@

    version(Beam)

    -vsn(Vsn).

    If this attribute is not specified, the version defaults to the checksum of the module. Notice that if version Vsn is not a list, it is made into one, that is {ok,{Module,[Vsn]}} is returned. If there are many -vsn -module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    -{ok,{a,[1]}}
    -2> beam_lib:version(b). % -vsn([1]).
    -{ok,{b,[1]}}
    -3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    -{ok,{c,[1,2]}}
    -4> beam_lib:version(d). % no -vsn attribute
    -{ok,{d,[275613208176997377698094100858909383631]}}
    +module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    +{ok,{a,[1]}}
    +2> beam_lib:version(b). % -vsn([1]).
    +{ok,{b,[1]}}
    +3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    +{ok,{c,[1,2]}}
    +4> beam_lib:version(d). % no -vsn attribute
    +{ok,{d,[275613208176997377698094100858909383631]}}
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/binary.html b/prs/8803/lib/stdlib-6.0.1/doc/html/binary.html index ddcda2509139e..2131947c3440f 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/binary.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/binary.html @@ -643,7 +643,7 @@

    bin_to_list(Subject)

    -

    Converts Subject to a list of byte/0s, each representing the value of one byte.

    Example:

    1> binary:bin_to_list(<<"erlang">>).
    +

    Converts Subject to a list of byte/0s, each representing the value of one byte.

    Example:

    1> binary:bin_to_list(<<"erlang">>).
     "erlang"
     %% or [101,114,108,97,110,103] in list notation.
    @@ -709,7 +709,7 @@

    bin_to_list(Subject, Pos, Len)

    Converts Subject to a list of byte/0s, each representing the value of one byte. PosLen or alternatively Pos and Len denote which part of the Subject binary to convert. By default, the entire Subject binary is -converted.

    Example:

    1> binary:bin_to_list(<<"erlang">>, {1,3}).
    +converted.

    Example:

    1> binary:bin_to_list(<<"erlang">>, {1,3}).
     "rla"
     %% or [114,108,97] in list notation.

    If PosLen or alternatively Pos and Len in any way reference outside the binary, a badarg exception is raised.

    @@ -851,7 +851,7 @@

    decode_hex(Bin)

    -

    Decodes a hex encoded binary into a binary.

    Example

    1> binary:decode_hex(<<"66">>).
    +

    Decodes a hex encoded binary into a binary.

    Example

    1> binary:decode_hex(<<"66">>).
     <<"f">>
    @@ -917,11 +917,11 @@

    decode_unsigned(Subject, Endianness)

    Converts the binary digit representation, in big endian or little endian, of a -positive integer in Subject to an Erlang integer/0.

    Example:

    1> binary:decode_unsigned(<<169,138,199>>).
    +positive integer in Subject to an Erlang integer/0.

    Example:

    1> binary:decode_unsigned(<<169,138,199>>).
     11111111
    -2> binary:decode_unsigned(<<169,138,199>>, big).
    +2> binary:decode_unsigned(<<169,138,199>>, big).
     11111111
    -3> binary:decode_unsigned(<<169,138,199>>, little).
    +3> binary:decode_unsigned(<<169,138,199>>, little).
     13077161
    @@ -984,13 +984,13 @@

    encode_hex(Bin, Case)

    Encodes a binary into a hex encoded binary using the specified case for the -hexadecimal digits "a" to "f".

    The default case is uppercase.

    Example:

    1> binary:encode_hex(<<"f">>).
    +hexadecimal digits "a" to "f".

    The default case is uppercase.

    Example:

    1> binary:encode_hex(<<"f">>).
     <<"66">>
    -2> binary:encode_hex(<<"/">>).
    +2> binary:encode_hex(<<"/">>).
     <<"2F">>
    -3> binary:encode_hex(<<"/">>, lowercase).
    +3> binary:encode_hex(<<"/">>, lowercase).
     <<"2f">>
    -4> binary:encode_hex(<<"/">>, uppercase).
    +4> binary:encode_hex(<<"/">>, uppercase).
     <<"2F">>
    @@ -1053,11 +1053,11 @@

    encode_unsigned(Unsigned, Endianness)

    Converts a positive integer to the smallest possible representation in a binary -digit representation, either big endian or little endian.

    Example:

    1> binary:encode_unsigned(11111111).
    +digit representation, either big endian or little endian.

    Example:

    1> binary:encode_unsigned(11111111).
     <<169,138,199>>
    -2> binary:encode_unsigned(11111111, big).
    +2> binary:encode_unsigned(11111111, big).
     <<169,138,199>>
    -2> binary:encode_unsigned(11111111, little).
    +2> binary:encode_unsigned(11111111, little).
     <<199,138,169>>
    @@ -1181,9 +1181,9 @@

    longest_common_prefix(Binaries)

    Returns the length of the longest common prefix of the binaries in list -Binaries.

    Example:

    1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
    +Binaries.

    Example:

    1> binary:longest_common_prefix([<<"erlang">>, <<"ergonomy">>]).
     2
    -2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
    +2> binary:longest_common_prefix([<<"erlang">>, <<"perl">>]).
     0

    If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

    @@ -1216,9 +1216,9 @@

    longest_common_suffix(Binaries)

    Returns the length of the longest common suffix of the binaries in list -Binaries.

    Example:

    1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
    +Binaries.

    Example:

    1> binary:longest_common_suffix([<<"erlang">>, <<"fang">>]).
     3
    -2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
    +2> binary:longest_common_suffix([<<"erlang">>, <<"perl">>]).
     0

    If Binaries is not a flat non-empty list of binaries, a badarg exception is raised.

    @@ -1294,8 +1294,8 @@

    match(Subject, Pattern, Options)

    Searches for the first occurrence of Pattern in Subject and returns the position and length.

    The function returns {Pos, Length} for the binary in Pattern, starting at -the lowest position in Subject.

    Example:

    1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
    -{1,4}

    Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and +the lowest position in Subject.

    Example:

    1> binary:match(<<"abcde">>, [<<"bcde">>, <<"cd">>],[]).
    +{1,4}

    Even though <<"cd">> ends before <<"bcde">>, <<"bcde">> begins first and is therefore the first match. If two overlapping matches begin at the same position, the longest is returned.

    Summary of the options:

    • {scope, {Start, Length}} - Only the specified part is searched. Return values still have offsets from the beginning of Subject. A negative Length @@ -1375,9 +1375,9 @@

      matches(Subject, Pattern, Options)

      As match/2, but Subject is searched until exhausted and a list of all non-overlapping parts matching Pattern is returned (in order).

      The first and longest match is preferred to a shorter, which is illustrated by -the following example:

      1> binary:matches(<<"abcde">>,
      -                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
      -[{1,4}]

      The result shows that <<"bcde">> is selected instead of the shorter match +the following example:

      1> binary:matches(<<"abcde">>,
      +                  [<<"bcde">>,<<"bc">>,<<"de">>],[]).
      +[{1,4}]

      The result shows that <<"bcde">> is selected instead of the shorter match <<"bc">> (which would have given raise to one more match, <<"de">>). This corresponds to the behavior of POSIX regular expressions (and programs like awk), but is not consistent with alternative matches in re (and Perl), where @@ -1446,7 +1446,7 @@

      part(Subject, Pos, Len)

      Extracts the part of binary Subject described by PosLen.

      A negative length can be used to extract bytes at the end of a binary:

      1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
      -2> binary:part(Bin, {byte_size(Bin), -5}).
      +2> binary:part(Bin, {byte_size(Bin), -5}).
       <<6,7,8,9,10>>

      Note

      part/2 and part/3 are also available in the erlang module under the names binary_part/2 and binary_part/3. Those BIFs are allowed in guard tests.

      If PosLen in any way references outside the binary, a badarg exception is @@ -1484,33 +1484,33 @@

      referenced_byte_size(Binary)

      it can be useful to get the size of the referenced binary. This function can be used in a program to trigger the use of copy/1. By copying a binary, one can dereference the original, possibly large, binary that a -smaller binary is a reference to.

      Example:

      store(Binary, GBSet) ->
      +smaller binary is a reference to.

      Example:

      store(Binary, GBSet) ->
         NewBin =
      -      case binary:referenced_byte_size(Binary) of
      -          Large when Large > 2 * byte_size(Binary) ->
      -             binary:copy(Binary);
      +      case binary:referenced_byte_size(Binary) of
      +          Large when Large > 2 * byte_size(Binary) ->
      +             binary:copy(Binary);
                 _ ->
                    Binary
             end,
      -  gb_sets:insert(NewBin,GBSet).

      In this example, we chose to copy the binary content before inserting it in + gb_sets:insert(NewBin,GBSet).

      In this example, we chose to copy the binary content before inserting it in gb_sets:set() if it references a binary more than twice the data size we want to keep. Of course, different rules apply when copying to different programs.

      Binary sharing occurs whenever binaries are taken apart. This is the fundamental reason why binaries are fast, decomposition can always be done with O(1) complexity. In rare circumstances this data sharing is however undesirable, why this function together with copy/1 can be useful when optimizing -for memory use.

      Example of binary sharing:

      1> A = binary:copy(<<1>>, 100).
      +for memory use.

      Example of binary sharing:

      1> A = binary:copy(<<1>>, 100).
       <<1,1,1,1,1 ...
      -2> byte_size(A).
      +2> byte_size(A).
       100
      -3> binary:referenced_byte_size(A).
      +3> binary:referenced_byte_size(A).
       100
       4> <<B:10/binary, C:90/binary>> = A.
       <<1,1,1,1,1 ...
      -5> {byte_size(B), binary:referenced_byte_size(B)}.
      -{10,10}
      -6> {byte_size(C), binary:referenced_byte_size(C)}.
      -{90,100}

      In the above example, the small binary B was copied while the larger binary +5> {byte_size(B), binary:referenced_byte_size(B)}. +{10,10} +6> {byte_size(C), binary:referenced_byte_size(C)}. +{90,100}

      In the above example, the small binary B was copied while the larger binary C references binary A.

      Note

      Binary data is shared among processes. If another process still references the larger binary, copying the part this process uses only consumes more memory and does not free up the larger binary for garbage collection. Use this kind @@ -1599,28 +1599,28 @@

      replace(Subject, Pattern, Replacement, Opti at the specified position (or positions) before inserting Replacement into Subject. If Replacement is given as a fun instead, this option is ignored.

      If any position specified in InsPos > size of the replacement binary, a badarg exception is raised.

      Options global and {scope, part()} work as for split/3. The return type is -always a binary/0.

      For a description of Pattern, see compile_pattern/1.

      Examples:

      1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
      +always a binary/0.

      For a description of Pattern, see compile_pattern/1.

      Examples:

      1> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, []).
       <<"aXcde">>
       
      -2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
      +2> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"X">>, [global]).
       <<"aXcXe">>
       
      -3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
      +3> binary:replace(<<"abcde">>, <<"b">>, <<"[]">>, [{insert_replaced, 1}]).
       <<"a[b]cde">>
       
      -4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
      +4> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, 1}]).
       <<"a[b]c[d]e">>
       
      -5> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, [1, 1]}]).
      +5> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[]">>, [global, {insert_replaced, [1, 1]}]).
       <<"a[bb]c[dd]e">>
       
      -6> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[-]">>, [global, {insert_replaced, [1, 2]}]).
      +6> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], <<"[-]">>, [global, {insert_replaced, [1, 2]}]).
       <<"a[b-b]c[d-d]e">>
       
      -7> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], fun(M) -> <<$[, M/binary, $]>> end, []).
      +7> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], fun(M) -> <<$[, M/binary, $]>> end, []).
       <<"a[b]cde">>
       
      -8> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], fun(M) -> <<$[, M/binary, $]>> end, [global]).
      +8> binary:replace(<<"abcde">>, [<<"b">>, <<"d">>], fun(M) -> <<$[, M/binary, $]>> end, [global]).
       <<"a[b]c[d]e">>
      @@ -1694,20 +1694,20 @@

      split(Subject, Pattern, Options)

      Splits Subject into a list of binaries based on Pattern.

      If option global is not specified, only the first occurrence of Pattern in -Subject gives rise to a split.

      The parts of Pattern found in Subject are not included in the result.

      Example:

      1> binary:split(<<1,255,4,0,0,0,2,3>>, [<<0,0,0>>,<<2>>],[]).
      -[<<1,255,4>>, <<2,3>>]
      -2> binary:split(<<0,1,0,0,4,255,255,9>>, [<<0,0>>, <<255,255>>],[global]).
      -[<<0,1>>,<<4>>,<<9>>]

      Summary of options:

      • {scope, part()} - Works as in match/3 and matches/3. Notice that +Subject gives rise to a split.

        The parts of Pattern found in Subject are not included in the result.

        Example:

        1> binary:split(<<1,255,4,0,0,0,2,3>>, [<<0,0,0>>,<<2>>],[]).
        +[<<1,255,4>>, <<2,3>>]
        +2> binary:split(<<0,1,0,0,4,255,255,9>>, [<<0,0>>, <<255,255>>],[global]).
        +[<<0,1>>,<<4>>,<<9>>]

        Summary of options:

        • {scope, part()} - Works as in match/3 and matches/3. Notice that this only defines the scope of the search for matching strings, it does not cut the binary before splitting. The bytes before and after the scope are kept in the result. See the example below.

        • trim - Removes trailing empty parts of the result (as does trim in re:split/3.

        • trim_all - Removes all empty parts of the result.

        • global - Repeats the split until Subject is exhausted. Conceptually option global makes split work on the positions returned by matches/3, while it normally works on the position returned by match/3.

        Example of the difference between a scope and taking the binary apart before -splitting:

        1> binary:split(<<"banana">>, [<<"a">>],[{scope,{2,3}}]).
        -[<<"ban">>,<<"na">>]
        -2> binary:split(binary:part(<<"banana">>,{2,3}), [<<"a">>],[]).
        -[<<"n">>,<<"n">>]

        The return type is always a list of binaries that are all referencing Subject. +splitting:

        1> binary:split(<<"banana">>, [<<"a">>],[{scope,{2,3}}]).
        +[<<"ban">>,<<"na">>]
        +2> binary:split(binary:part(<<"banana">>,{2,3}), [<<"a">>],[]).
        +[<<"n">>,<<"n">>]

        The return type is always a list of binaries that are all referencing Subject. This means that the data in Subject is not copied to new binaries, and that Subject cannot be garbage collected until the results of the split are no longer referenced.

        For a description of Pattern, see compile_pattern/1.

        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/c.html b/prs/8803/lib/stdlib-6.0.1/doc/html/c.html index a8cfabb5e7ba0..547e5c47af6e0 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/c.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/c.html @@ -1755,7 +1755,7 @@

        nc(File, Options)

        Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

        compile:file(File, Options ++ [report_errors, report_warnings])
        +[]. Compilation is equivalent to:

        compile:file(File, Options ++ [report_errors, report_warnings])
        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/calendar.html b/prs/8803/lib/stdlib-6.0.1/doc/html/calendar.html index 40959fd51beb9..91630af71de01 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/calendar.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/calendar.html @@ -1845,10 +1845,10 @@

        rfc3339_to_system_time(DateTimeString, Opti

        Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

        Valid option:

        • {unit, Unit} - The time unit of the return value. The default is -second.
        1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
        +second.

      1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
       1517498278
      -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
      -   [{unit, nanosecond}]).
      +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
      +   [{unit, nanosecond}]).
       1517498282088000000
      @@ -2018,16 +2018,16 @@

      system_time_to_rfc3339(Time, Options)

      the formatted string includes a fraction of a second. The number of fractional second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros -are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +are not removed from the fraction.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/dets.html b/prs/8803/lib/stdlib-6.0.1/doc/html/dets.html index 048ebf06f82aa..e7977f8711c84 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/dets.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/dets.html @@ -1914,14 +1914,14 @@

    lookup(Name, Key)

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2778,11 +2778,11 @@

    table(Name, Options)

    specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2856,7 +2856,7 @@

    traverse(Name, Fun)

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/dict.html b/prs/8803/lib/stdlib-6.0.1/doc/html/dict.html index bcff0c0766171..5b68e9f3187b5 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/dict.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/dict.html @@ -138,13 +138,13 @@

    Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    @@ -905,10 +905,10 @@

    merge(Fun, Dict1, Dict2)

    the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -1121,8 +1121,8 @@

    update(Key, Fun, Initial, Dict1)

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1153,8 +1153,8 @@

    update_counter(Key, Increment, Dict1)

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/epp.html b/prs/8803/lib/stdlib-6.0.1/doc/html/epp.html index 3aae88987c0cd..f4ed4157c45bc 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/epp.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/epp.html @@ -140,7 +140,7 @@

    Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_error.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_error.html index a3c56a6985299..ffff93eb605a8 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_error.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_error.html @@ -317,7 +317,7 @@

    format_fun()

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -438,23 +438,23 @@

    format_error(Reason, StackTrace)

    caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    -
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
    +
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -542,18 +542,18 @@ 

    format_exception(Class, Reason, StackTrace,

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_eval.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_eval.html index cc649a15a180a..3d42ea2e8607e 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_eval.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_eval.html @@ -141,13 +141,13 @@

    LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    @@ -161,7 +161,7 @@

    expressions.
  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function on the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_lint.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_lint.html index 43938dfcffd5e..cde0ef47f8475 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_lint.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_lint.html @@ -139,7 +139,7 @@

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      +modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_parse.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_parse.html index a5fe0d2c2c205..188b117526563 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_parse.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_parse.html @@ -138,7 +138,7 @@

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      +The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_scan.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_scan.html index fe1c4987dabdd..a27ce511a3d52 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_scan.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_scan.html @@ -136,7 +136,7 @@

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      +modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_tar.html b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_tar.html index 46da1b79c3dfb..ab481824fe27c 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/erl_tar.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/erl_tar.html @@ -1291,14 +1291,14 @@

      init/3

      Notice that there is only an arity-2 read function, not an arity-1 function.

    • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

    Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/escript.html b/prs/8803/lib/stdlib-6.0.1/doc/html/escript.html index 5ea8c5f9d90b4..774c252a4fb9c 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/escript.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/escript.html @@ -522,67 +522,67 @@

    create(File, Options)

    number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
     ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
         <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
     ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
     ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
     ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
           <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +
    83,0,0,...>>}, + {"demo.erl", + {file_info,118,regular,read_write, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + {{2010,3,2},{0,59,22}}, + 54,1,0,0,0,0,0}, + <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -615,16 +615,16 @@

    extract(File, Options)

    extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
     ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +>
    {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, + {archive, ArchiveBin}]} = + escript:extract("demo.escript", []). +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105, + 152,61,93,107,0,0,0,118,0,...>>} + {emu_args,undefined}]}
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/ets.html b/prs/8803/lib/stdlib-6.0.1/doc/html/ets.html index 8c35f1c1effdd..7bb2a4563674e 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/ets.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/ets.html @@ -220,10 +220,10 @@

    find the next key is not done with such guarantees. This is often not a problem, but may cause rare subtle "unexpected" effects if a concurrent process inserts objects during a traversal. For example, consider one process -doing

    ets:new(t, [ordered_set, named_table]),
    -ets:insert(t, {1}),
    -ets:insert(t, {2}),
    -ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare +doing

    ets:new(t, [ordered_set, named_table]),
    +ets:insert(t, {1}),
    +ets:insert(t, {2}),
    +ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare cases return 2 even though 2 has never existed in the table ordered as the first key. In the same way, a concurrent call to ets:next(t, 1) may return 3 even though 3 never existed in the table ordered directly after 1.

    Effects like this are improbable but possible. The probability will further be @@ -236,11 +236,11 @@

    lookup without any table traversal at all. For ordered_set a partially bound key will limit the traversal to only scan a subset of the table based on term order. A partially bound key is either a list or a tuple with a prefix that is -fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
    +fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
     true
     2> %% Efficient search of all with area code 555
    -2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}).
    -[["1234","John Smith"]]

    +2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}). +[["1234","John Smith"]]

    @@ -1936,19 +1936,19 @@

    fun2ms(LiteralFun)

    -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

    The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, -receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    -[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
    +receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    +[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
     3
    -3> ets:fun2ms(fun({M,N}) when N > X -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, +3> ets:fun2ms(fun({M,N}) when N > X -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, which is consistent with the static scoping for Erlang funs. However, local or global function calls cannot be in the guard or body of the fun. Calls to -built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
    +built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
     Error: fun containing local Erlang function calls
    -('my_fun' called in guard) cannot be translated into match_spec
    -{error,transform_error}
    -5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun +('my_fun' called in guard) cannot be translated into match_spec +{error,transform_error} +5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun must be literally in the call when used from the shell as well.

    Warning

    If the parse_transform is not applied to a module that calls this pseudo function, the call fails in runtime (with a badarg). The ets module exports a function with this name, but it is never to be called except when @@ -2573,12 +2573,12 @@

    match(Table, Pattern)

    Matches the objects in table Table against pattern Pattern.

    A pattern is a term that can contain:

    • Bound parts (Erlang terms)
    • '_' that matches any Erlang term
    • Pattern variables '$N', where N=0,1,...

    The function returns a list with one element for each matching object, where -each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    -[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    -7> ets:match(T, {'_',dog,'$1'}).
    -[[7],[5]]
    -8> ets:match(T, {'_',cow,'$1'}).
    -[]

    If the key is specified in the pattern, the match is very efficient. If the key +each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    +[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    +7> ets:match(T, {'_',dog,'$1'}).
    +[[7],[5]]
    +8> ets:match(T, {'_',cow,'$1'}).
    +[]

    If the key is specified in the pattern, the match is very efficient. If the key is not specified, that is, if it is a variable or an underscore, the entire table must be searched. The search time can be substantial if the table is very large.

    For tables of type ordered_set, the result is in the same order as in a @@ -2830,10 +2830,10 @@

    match_spec_run(List, CompiledMatchSpec)

    Table = ets:new...
     MatchSpec = ...
     % The following call...
    -ets:match_spec_run(ets:tab2list(Table),
    -                   ets:match_spec_compile(MatchSpec)),
    +ets:match_spec_run(ets:tab2list(Table),
    +                   ets:match_spec_compile(MatchSpec)),
     % ...gives the same result as the more common (and more efficient)
    -ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets +ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets module to perform the dets:select/1 operations and by Mnesia during transactions.

    @@ -3196,19 +3196,19 @@

    repair_continuation(Continuation, MatchSpec format. Given that the original match specification is kept intact, the continuation can be restored, meaning it can once again be used in subsequent select/1 calls even though it has been stored on disk or on -another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
    +another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T, MS, 10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(MaybeBroken).

    The following sequence works, as the call to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T, MS, 10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(MaybeBroken).

    The following sequence works, as the call to repair_continuation/2 reestablishes the -MaybeBroken continuation.

    T=ets:new(x,[]),
    +MaybeBroken continuation.

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T,MS,10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T,MS,10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to provide distributed select/3 and select/1 sequences. A normal application would either use Mnesia or keep the continuation from being converted to external format.

    The actual behavior of compiled match specifications when recreated from @@ -3253,21 +3253,21 @@

    safe_fixtable(Table, Fix)

    to succeed even if keys are removed during the traversal. The keys for objects inserted or deleted during a traversal may or may not be returned by next/2 depending on the ordering of keys within the table and if -the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    -    safe_fixtable(Table,true),
    -    clean_all_with_value(Table,X,ets:first(Table)),
    -    safe_fixtable(Table,false).
    +the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    +    safe_fixtable(Table,true),
    +    clean_all_with_value(Table,X,ets:first(Table)),
    +    safe_fixtable(Table,false).
     
    -clean_all_with_value(Table,X,'$end_of_table') ->
    +clean_all_with_value(Table,X,'$end_of_table') ->
         true;
    -clean_all_with_value(Table,X,Key) ->
    -    case ets:lookup(Table,Key) of
    -        [{Key,X}] ->
    -            ets:delete(Table,Key);
    +clean_all_with_value(Table,X,Key) ->
    +    case ets:lookup(Table,Key) of
    +        [{Key,X}] ->
    +            ets:delete(Table,Key);
             _ ->
                 true
         end,
    -    clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been + clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been released. If a process fixes a table but never releases it, the memory used by the deleted objects is never freed. The performance of operations on the table also degrades significantly.

    To retrieve information about which processes have fixed which tables, use @@ -3355,7 +3355,7 @@

    select(Table, MatchSpec)

    a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to be constructed, one has to write a tuple of arity 1 where the single element in the tuple is the tuple one wants to construct (as an ordinary tuple can be -mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the +mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the dbg) module in Runtime_Tools.

    The Guards are constructed as tuples, where the first element is the test name and the remaining elements are the test parameters. To check for a specific type (say a list) of the element bound to the match variable '$1', one would write @@ -3517,16 +3517,16 @@

    select_replace(Table, MatchSpec)

    object. If not, select_replace will fail with badarg without updating any objects.

    For the moment, due to performance and semantic constraints, tables of type bag are not yet supported.

    The function returns the total number of replaced objects.

    Example

    For all 2-tuples with a list in second position, add atom 'marker' first in -the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
    +the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
     true
    -2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    -[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    -3> ets:select_replace(T, MS).
    +2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    +[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    +3> ets:select_replace(T, MS).
     1
    -4> ets:tab2list(T).
    -[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    -New = update_object(Old),
    -Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    +4>
    ets:tab2list(T). +[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    +New = update_object(Old),
    +Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    @@ -3561,22 +3561,22 @@

    select_reverse(Continuation)

    ordered_set, the traversal of the table continues to objects with keys earlier in the Erlang term order. The returned list also contains objects with keys in reverse order. For all other table types, the behavior is exactly that of -select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    -2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
    +select/1.

    Example:

    1> T = ets:new(x,[ordered_set]).
    +2> [ ets:insert(T,{N}) || N <- lists:seq(1,10) ].
     ...
    -3> {R0,C0} = ets:select_reverse(T,[{'_',[],['$_']}],4).
    +3> {R0,C0} = ets:select_reverse(T,[{'_',[],['$_']}],4).
     ...
     4> R0.
    -[{10},{9},{8},{7}]
    -5> {R1,C1} = ets:select_reverse(C0).
    +[{10},{9},{8},{7}]
    +5> {R1,C1} = ets:select_reverse(C0).
     ...
     6> R1.
    -[{6},{5},{4},{3}]
    -7> {R2,C2} = ets:select_reverse(C1).
    +[{6},{5},{4},{3}]
    +7> {R2,C2} = ets:select_reverse(C1).
     ...
     8> R2.
    -[{2},{1}]
    -9> '$end_of_table' = ets:select_reverse(C2).
    +[{2},{1}]
    +9> '$end_of_table' = ets:select_reverse(C2).
     ...
    @@ -3977,10 +3977,10 @@

    table(Table, Options)

    match specification that matches all objects.

  • {select, MatchSpec} - As for select, the table is traversed by calling select/3 and select/1. The difference is that the match specification is explicitly specified. This is how to state match specifications that cannot -easily be expressed within the syntax provided by QLC.

  • Examples:

    An explicit match specification is here used to traverse the table:

    9> true = ets:insert(Table = ets:new(t, []), [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = ets:table(Table, [{traverse, {select, MS}}]).

    An example with an implicit match specification:

    10> QH2 = qlc:q([{Y} || {X,Y} <- ets:table(Table), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    11> qlc:info(QH1) =:= qlc:info(QH2).
    +easily be expressed within the syntax provided by QLC.

    Examples:

    An explicit match specification is here used to traverse the table:

    9> true = ets:insert(Table = ets:new(t, []), [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = ets:table(Table, [{traverse, {select, MS}}]).

    An example with an implicit match specification:

    10> QH2 = qlc:q([{Y} || {X,Y} <- ets:table(Table), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    11> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle, and in this case identical information is returned for the two query handles.

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/file_sorter.html b/prs/8803/lib/stdlib-6.0.1/doc/html/file_sorter.html index ff42a1c57f509..9d15b27ba5205 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/file_sorter.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/file_sorter.html @@ -195,35 +195,35 @@

    argument {value, Value}. This makes it easy to initiate the sequence of output functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            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) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/filelib.html b/prs/8803/lib/stdlib-6.0.1/doc/html/filelib.html index 3f4c3be5b781c..2ef09d0363672 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/filelib.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/filelib.html @@ -1030,15 +1030,15 @@

      safe_relative_path(Filename, Cwd)

      Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

      Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
      +The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
       ...
      -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
      +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
       "dir"
      -3> filelib:safe_relative_path("dir/..", Cwd).
      -[]
      -4> filelib:safe_relative_path("dir/../..", Cwd).
      +3> filelib:safe_relative_path("dir/..", Cwd).
      +[]
      +4> filelib:safe_relative_path("dir/../..", Cwd).
       unsafe
      -5> filelib:safe_relative_path("/abs/path", Cwd).
      +5> filelib:safe_relative_path("/abs/path", Cwd).
       unsafe
      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/filename.html b/prs/8803/lib/stdlib-6.0.1/doc/html/filename.html index a04eb131463ba..769722fb259bc 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/filename.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/filename.html @@ -526,20 +526,20 @@

      absname(Filename)

      Converts a relative Filename and returns an absolute name. No attempt is made to create the shortest absolute name, as this can give incorrect results on file -systems that allow links.

      Unix examples:

      1> pwd().
      +systems that allow links.

      Unix examples:

      1> pwd().
       "/usr/local"
      -2> filename:absname("foo").
      +2> filename:absname("foo").
       "/usr/local/foo"
      -3> filename:absname("../x").
      +3> filename:absname("../x").
       "/usr/local/../x"
      -4> filename:absname("/").
      -"/"

      Windows examples:

      1> pwd().
      +4> filename:absname("/").
      +"/"

      Windows examples:

      1> pwd().
       "D:/usr/local"
      -2> filename:absname("foo").
      +2> filename:absname("foo").
       "D:/usr/local/foo"
      -3> filename:absname("../x").
      +3> filename:absname("../x").
       "D:/usr/local/../x"
      -4> filename:absname("/").
      +4> filename:absname("/").
       "D:/"
      @@ -679,58 +679,58 @@

      basedir(Type, Application, Opts)

      Opts the function will default to the native option, that is 'linux', 'darwin' or 'windows', as understood by os:type/0. Anything not recognized as 'darwin' or 'windows' is interpreted as 'linux'.

      The options 'author' and 'version' are only used with 'windows' option -mode.

      • user_cache

        The path location is intended for transient data files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        1> filename:basedir(user_cache, "my_application", #{os=>linux}).
        -"/home/otptest/.cache/my_application"

        On Darwin:

        1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Caches/my_application"

        On Windows:

        1> filename:basedir(user_cache, "My App").
        +mode.

        • user_cache

          The path location is intended for transient data files on a local machine.

          On Linux: Respects the os environment variable XDG_CACHE_HOME.

          1> filename:basedir(user_cache, "my_application", #{os=>linux}).
          +"/home/otptest/.cache/my_application"

          On Darwin:

          1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
          +"/home/otptest/Library/Caches/my_application"

          On Windows:

          1> filename:basedir(user_cache, "My App").
           "c:/Users/otptest/AppData/Local/My App/Cache"
          -2> filename:basedir(user_cache, "My App").
          +2> filename:basedir(user_cache, "My App").
           "c:/Users/otptest/AppData/Local/My App/Cache"
          -3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
          +3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
           "c:/Users/otptest/AppData/Local/Erlang/My App/Cache"
          -4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
          +4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
           "c:/Users/otptest/AppData/Local/My App/1.2/Cache"
          -5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
          -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
        • user_config

          The path location is intended for persistent configuration files.

          On Linux: Respects the os environment variable XDG_CONFIG_HOME.

          2> filename:basedir(user_config, "my_application", #{os=>linux}).
          -"/home/otptest/.config/my_application"

          On Darwin:

          2> filename:basedir(user_config, "my_application", #{os=>darwin}).
          -"/home/otptest/Library/Application Support/my_application"

          On Windows:

          1> filename:basedir(user_config, "My App").
          +5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
          +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
        • user_config

          The path location is intended for persistent configuration files.

          On Linux: Respects the os environment variable XDG_CONFIG_HOME.

          2> filename:basedir(user_config, "my_application", #{os=>linux}).
          +"/home/otptest/.config/my_application"

          On Darwin:

          2> filename:basedir(user_config, "my_application", #{os=>darwin}).
          +"/home/otptest/Library/Application Support/my_application"

          On Windows:

          1> filename:basedir(user_config, "My App").
           "c:/Users/otptest/AppData/Roaming/My App"
          -2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
          -"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
        • user_data

          The path location is intended for persistent data files.

          On Linux: Respects the os environment variable XDG_DATA_HOME.

          3> filename:basedir(user_data, "my_application", #{os=>linux}).
          -"/home/otptest/.local/my_application"

          On Darwin:

          3> filename:basedir(user_data, "my_application", #{os=>darwin}).
          -"/home/otptest/Library/Application Support/my_application"

          On Windows:

          8> filename:basedir(user_data, "My App").
          +2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
          +"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
        • user_data

          The path location is intended for persistent data files.

          On Linux: Respects the os environment variable XDG_DATA_HOME.

          3> filename:basedir(user_data, "my_application", #{os=>linux}).
          +"/home/otptest/.local/my_application"

          On Darwin:

          3> filename:basedir(user_data, "my_application", #{os=>darwin}).
          +"/home/otptest/Library/Application Support/my_application"

          On Windows:

          8> filename:basedir(user_data, "My App").
           "c:/Users/otptest/AppData/Local/My App"
          -9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
          -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
        • user_log

          The path location is intended for transient log files on a local machine.

          On Linux: Respects the os environment variable XDG_CACHE_HOME.

          4> filename:basedir(user_log, "my_application", #{os=>linux}).
          -"/home/otptest/.cache/my_application/log"

          On Darwin:

          4> filename:basedir(user_log, "my_application", #{os=>darwin}).
          -"/home/otptest/Library/Logs/my_application"

          On Windows:

          12> filename:basedir(user_log, "My App").
          +9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
          +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
        • user_log

          The path location is intended for transient log files on a local machine.

          On Linux: Respects the os environment variable XDG_CACHE_HOME.

          4> filename:basedir(user_log, "my_application", #{os=>linux}).
          +"/home/otptest/.cache/my_application/log"

          On Darwin:

          4> filename:basedir(user_log, "my_application", #{os=>darwin}).
          +"/home/otptest/Library/Logs/my_application"

          On Windows:

          12> filename:basedir(user_log, "My App").
           "c:/Users/otptest/AppData/Local/My App/Logs"
          -13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
          -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
        • site_config

          On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

          5> filename:basedir(site_config, "my_application", #{os=>linux}).
          -["/usr/local/share/my_application",
          - "/usr/share/my_application"]
          -6> os:getenv("XDG_CONFIG_DIRS").
          +13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
          +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
        • site_config

          On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

          5> filename:basedir(site_config, "my_application", #{os=>linux}).
          +["/usr/local/share/my_application",
          + "/usr/share/my_application"]
          +6> os:getenv("XDG_CONFIG_DIRS").
           "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg"
          -7> filename:basedir(site_config, "my_application", #{os=>linux}).
          -["/etc/xdg/xdg-ubuntu/my_application",
          +7> filename:basedir(site_config, "my_application", #{os=>linux}).
          +["/etc/xdg/xdg-ubuntu/my_application",
            "/usr/share/upstart/xdg/my_application",
          - "/etc/xdg/my_application"]
          -8> os:unsetenv("XDG_CONFIG_DIRS").
          + "/etc/xdg/my_application"]
          +8> os:unsetenv("XDG_CONFIG_DIRS").
           true
          -9> filename:basedir(site_config, "my_application", #{os=>linux}).
          -["/etc/xdg/my_application"]

          On Darwin:

          5> filename:basedir(site_config, "my_application", #{os=>darwin}).
          -["/Library/Application Support/my_application"]
        • site_data

          On Linux: Respects the os environment variable XDG_DATA_DIRS.

          10> os:getenv("XDG_DATA_DIRS").
          +9> filename:basedir(site_config, "my_application", #{os=>linux}).
          +["/etc/xdg/my_application"]

          On Darwin:

          5> filename:basedir(site_config, "my_application", #{os=>darwin}).
          +["/Library/Application Support/my_application"]
        • site_data

          On Linux: Respects the os environment variable XDG_DATA_DIRS.

          10> os:getenv("XDG_DATA_DIRS").
           "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
          -11> filename:basedir(site_data, "my_application", #{os=>linux}).
          -["/usr/share/ubuntu/my_application",
          +11> filename:basedir(site_data, "my_application", #{os=>linux}).
          +["/usr/share/ubuntu/my_application",
            "/usr/share/gnome/my_application",
            "/usr/local/share/my_application",
          - "/usr/share/my_application"]
          -12> os:unsetenv("XDG_DATA_DIRS").
          + "/usr/share/my_application"]
          +12> os:unsetenv("XDG_DATA_DIRS").
           true
          -13> filename:basedir(site_data, "my_application", #{os=>linux}).
          -["/usr/local/share/my_application",
          - "/usr/share/my_application"]

          On Darwin:

          5> filename:basedir(site_data, "my_application", #{os=>darwin}).
          -["/Library/Application Support/my_application"]
        +13>
        filename:basedir(site_data, "my_application", #{os=>linux}). +["/usr/local/share/my_application", + "/usr/share/my_application"]

        On Darwin:

        5> filename:basedir(site_data, "my_application", #{os=>darwin}).
        +["/Library/Application Support/my_application"]
      @@ -759,12 +759,12 @@

      basename(Filename)

      Returns the last component of Filename, or Filename itself if it does not -contain any directory separators.

      Examples:

      5> filename:basename("foo").
      +contain any directory separators.

      Examples:

      5> filename:basename("foo").
       "foo"
      -6> filename:basename("/usr/foo").
      +6> filename:basename("/usr/foo").
       "foo"
      -7> filename:basename("/").
      -[]
      +7>
      filename:basename("/"). +[]
      @@ -795,15 +795,15 @@

      basename(Filename, Ext)

      Returns the last component of Filename with extension Ext stripped.

      This function is to be used to remove a (possible) specific extension. To remove an existing extension when you are unsure which one it is, use -rootname(basename(Filename)).

      Examples:

      8> filename:basename("~/src/kalle.erl", ".erl").
      +rootname(basename(Filename)).

      Examples:

      8> filename:basename("~/src/kalle.erl", ".erl").
       "kalle"
      -9> filename:basename("~/src/kalle.beam", ".erl").
      +9> filename:basename("~/src/kalle.beam", ".erl").
       "kalle.beam"
      -10> filename:basename("~/src/kalle.old.erl", ".erl").
      +10> filename:basename("~/src/kalle.old.erl", ".erl").
       "kalle.old"
      -11> filename:rootname(filename:basename("~/src/kalle.erl")).
      +11> filename:rootname(filename:basename("~/src/kalle.erl")).
       "kalle"
      -12> filename:rootname(filename:basename("~/src/kalle.beam")).
      +12> filename:rootname(filename:basename("~/src/kalle.beam")).
       "kalle"
      @@ -832,10 +832,10 @@

      dirname(Filename)

      -

      Returns the directory part of Filename.

      Examples:

      13> filename:dirname("/usr/src/kalle.erl").
      +

      Returns the directory part of Filename.

      Examples:

      13> filename:dirname("/usr/src/kalle.erl").
       "/usr/src"
      -14> filename:dirname("kalle.erl").
      -"."
      5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
      +14> filename:dirname("kalle.erl").
      +"."
      5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
       "/usr/src"
      @@ -865,10 +865,10 @@

      extension(Filename)

      Returns the file extension of Filename, including the period. Returns an empty -string if no extension exists.

      Examples:

      15> filename:extension("foo.erl").
      +string if no extension exists.

      Examples:

      15> filename:extension("foo.erl").
       ".erl"
      -16> filename:extension("beam.src/kalle").
      -[]
      +16>
      filename:extension("beam.src/kalle"). +[]
      @@ -928,10 +928,10 @@

      join(Components)

      Joins a list of filename Components with directory separators. If one of the elements of Components includes an absolute path, such as "/xxx", the preceding elements, if any, are removed from the result.

      The result is "normalized":

      • Redundant directory separators are removed.
      • In Windows, all directory separators are forward slashes and the drive letter -is in lower case.

      Examples:

      17> filename:join(["/usr", "local", "bin"]).
      +is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
     "/usr/local/bin"
    -18> filename:join(["a/b///c/"]).
    -"a/b/c"
    6> filename:join(["B:a\\b///c/"]). % Windows
    +18> filename:join(["a/b///c/"]).
    +"a/b/c"
    6> filename:join(["B:a\\b///c/"]). % Windows
     "b:a/b/c"
    @@ -991,8 +991,8 @@

    nativename(Path)

    Converts Path to a form accepted by the command shell and native applications on the current platform. On Windows, forward slashes are converted to backward -slashes. On all platforms, the name is normalized as done by join/1.

    Examples:

    19> filename:nativename("/usr/local/bin/"). % Unix
    -"/usr/local/bin"
    7> filename:nativename("/usr/local/bin/"). % Windows
    +slashes. On all platforms, the name is normalized as done by join/1.

    Examples:

    19> filename:nativename("/usr/local/bin/"). % Unix
    +"/usr/local/bin"
    7> filename:nativename("/usr/local/bin/"). % Windows
     "\\usr\\local\\bin"
    @@ -1052,9 +1052,9 @@

    rootname(Filename)

    -

    Removes the filename extension.

    Examples:

    1> filename:rootname("/beam.src/kalle").
    +

    Removes the filename extension.

    Examples:

    1> filename:rootname("/beam.src/kalle").
     "/beam.src/kalle"
    -2> filename:rootname("/beam.src/foo.erl").
    +2> filename:rootname("/beam.src/foo.erl").
     "/beam.src/foo"
    @@ -1084,9 +1084,9 @@

    rootname(Filename, Ext)

    -

    Removes the filename extension Ext from Filename.

    Examples:

    1> filename:rootname("/beam.src/foo.erl", ".erl").
    +

    Removes the filename extension Ext from Filename.

    Examples:

    1> filename:rootname("/beam.src/foo.erl", ".erl").
     "/beam.src/foo"
    -2> filename:rootname("/beam.src/foo.beam", ".erl").
    +2> filename:rootname("/beam.src/foo.beam", ".erl").
     "/beam.src/foo.beam"
    @@ -1115,12 +1115,12 @@

    split(Filename)

    -

    Returns a list whose elements are the path components of Filename.

    Examples:

    24> filename:split("/usr/local/bin").
    -["/","usr","local","bin"]
    -25> filename:split("foo/bar").
    -["foo","bar"]
    -26> filename:split("a:\\msdev\\include").
    -["a:/","msdev","include"]
    +

    Returns a list whose elements are the path components of Filename.

    Examples:

    24> filename:split("/usr/local/bin").
    +["/","usr","local","bin"]
    +25> filename:split("foo/bar").
    +["foo","bar"]
    +26> filename:split("a:\\msdev\\include").
    +["a:/","msdev","include"]
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_event.html b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_event.html index 5272cd8912483..76af26c6f57da 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_event.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_event.html @@ -1303,15 +1303,15 @@

    format_status(Status)

    but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_fsm.html b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_fsm.html index 4a37281e3d9a2..af510679dbabf 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_fsm.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_fsm.html @@ -135,163 +135,163 @@

    Migration to gen_statem

    Here follows a simple example of turning a gen_fsm into a gen_statem. -The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    --define(NAME, code_lock).
    +The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    +-define(NAME, code_lock).
     %-define(BEFORE_REWRITE, true).
     
    --ifdef(BEFORE_REWRITE).
    --behaviour(gen_fsm).
    +-ifdef(BEFORE_REWRITE).
    +-behaviour(gen_fsm).
     -else.
    --behaviour(gen_statem).
    +-behaviour(gen_statem).
     -endif.
     
    --export([start_link/1, button/1, stop/0]).
    +-export([start_link/1, button/1, stop/0]).
     
    --ifdef(BEFORE_REWRITE).
    --export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    -     handle_info/3, terminate/3, code_change/4]).
    +-ifdef(BEFORE_REWRITE).
    +-export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    +     handle_info/3, terminate/3, code_change/4]).
     -else.
    --export([init/1, callback_mode/0, locked/3, open/3,
    -     terminate/3, code_change/4]).
    +-export([init/1, callback_mode/0, locked/3, open/3,
    +     terminate/3, code_change/4]).
     %% Add callback__mode/0
     %% Change arity of the state functions
     %% Remove handle_info/3
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -start_link(Code) ->
    -    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
    +-ifdef(BEFORE_REWRITE).
    +start_link(Code) ->
    +    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
     -else.
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -button(Digit) ->
    -    gen_fsm:send_event(?NAME, {button, Digit}).
    +-ifdef(BEFORE_REWRITE).
    +button(Digit) ->
    +    gen_fsm:send_event(?NAME, {button, Digit}).
     -else.
    -button(Digit) ->
    -    gen_statem:cast(?NAME, {button,Digit}).
    +button(Digit) ->
    +    gen_statem:cast(?NAME, {button,Digit}).
         %% send_event is asynchronous and becomes a cast
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -stop() ->
    -    gen_fsm:sync_send_all_state_event(?NAME, stop).
    +-ifdef(BEFORE_REWRITE).
    +stop() ->
    +    gen_fsm:sync_send_all_state_event(?NAME, stop).
     -else.
    -stop() ->
    -    gen_statem:call(?NAME, stop).
    +stop() ->
    +    gen_statem:call(?NAME, stop).
         %% sync_send is synchronous and becomes call
         %% all_state is handled by callback code in gen_statem
     -endif.
     
    -init(Code) ->
    -    do_lock(),
    -    Data = #{code => Code, remaining => Code},
    -    {ok, locked, Data}.
    +init(Code) ->
    +    do_lock(),
    +    Data = #{code => Code, remaining => Code},
    +    {ok, locked, Data}.
     
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -callback_mode() ->
    +callback_mode() ->
         state_functions.
     %% state_functions mode is the mode most similar to
     %% gen_fsm. There is also handle_event mode which is
     %% a fairly different concept.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -locked({button, Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +-ifdef(BEFORE_REWRITE).
    +locked({button, Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end.
     -else.
    -locked(cast, {button,Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +locked(cast, {button,Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end;
    -locked({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -locked({info, Msg}, StateName, Data) ->
    -    handle_info(Msg, StateName, Data).
    +locked({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +locked({info, Msg}, StateName, Data) ->
    +    handle_info(Msg, StateName, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -open(timeout, State) ->
    -     do_lock(),
    -    {next_state, locked, State};
    -open({button,_}, Data) ->
    -    {next_state, locked, Data}.
    +-ifdef(BEFORE_REWRITE).
    +open(timeout, State) ->
    +     do_lock(),
    +    {next_state, locked, State};
    +open({button,_}, Data) ->
    +    {next_state, locked, Data}.
     -else.
    -open(timeout, _, Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, locked, Data};
    -open({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -open(info, Msg, Data) ->
    -    handle_info(Msg, open, Data).
    +open(timeout, _, Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, locked, Data};
    +open({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +open(info, Msg, Data) ->
    +    handle_info(Msg, open, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -handle_sync_event(stop, _From, _StateName, Data) ->
    -    {stop, normal, ok, Data}.
    +-ifdef(BEFORE_REWRITE).
    +handle_sync_event(stop, _From, _StateName, Data) ->
    +    {stop, normal, ok, Data}.
     
    -handle_event(Event, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
    +handle_event(Event, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     -else.
     -endif.
     
    -terminate(_Reason, State, _Data) ->
    -    State =/= locked andalso do_lock(),
    +terminate(_Reason, State, _Data) ->
    +    State =/= locked andalso do_lock(),
         ok.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok, State, Data}.
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok, State, Data}.
     
     %% Internal functions
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -handle_call(From, stop, Data) ->
    -     {stop_and_reply, normal,  {reply, From, ok}, Data}.
    +handle_call(From, stop, Data) ->
    +     {stop_and_reply, normal,  {reply, From, ok}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     %% These are internal functions for handling all state events
     %% and not behaviour callbacks as in gen_fsm
     -endif.
     
    -analyze_lock(Digit, #{code := Code, remaining := Remaining} = Data) ->
    +analyze_lock(Digit, #{code := Code, remaining := Remaining} = Data) ->
          case Remaining of
    -         [Digit] ->
    -         do_unlock(),
    -         {open,  Data#{remaining := Code}};
    -         [Digit|Rest] -> % Incomplete
    -             {locked, Data#{remaining := Rest}};
    +         [Digit] ->
    +         do_unlock(),
    +         {open,  Data#{remaining := Code}};
    +         [Digit|Rest] -> % Incomplete
    +             {locked, Data#{remaining := Rest}};
              _Wrong ->
    -             {locked, Data#{remaining := Code}}
    +             {locked, Data#{remaining := Code}}
          end.
     
    -do_lock() ->
    -    io:format("Lock~n", []).
    -do_unlock() ->
    -    io:format("Unlock~n", []).

    +do_lock() -> + io:format("Lock~n", []). +do_unlock() -> + io:format("Unlock~n", []).

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_server.html b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_server.html index 45d49259e18d7..eb5bdcd499e82 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_server.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_server.html @@ -1279,15 +1279,15 @@

    format_status(Status)

    but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_statem.html b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_statem.html index f0cc7fa84cd4a..f1cab429addc0 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/gen_statem.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/gen_statem.html @@ -176,7 +176,7 @@

    depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -302,97 +302,97 @@

    Pushbutton Code

    -

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    + {next_state,State,Data}.

    Note

    @@ -3177,15 +3177,15 @@

    format_status(Status)

    containing the same keys as the input map, but it may transform some values.

    One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +Another is to hide sensitive data from being written to the error log.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so a callback module does not need + end, Status).

    Note

    This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3359,8 +3359,8 @@

    init(Args)

    to initialize the implementation state and server data.

    Args is the Args argument provided to that start function.

    Note

    Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

    -spec init(_) -> no_return().
    -init(Args) -> erlang:error(not_implemented, [Args]).
    +it can in that case be implemented as:

    -spec init(_) -> no_return().
    +init(Args) -> erlang:error(not_implemented, [Args]).
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/io.html b/prs/8803/lib/stdlib-6.0.1/doc/html/io.html index eebccce2eae10..25aab9b19d2a0 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/io.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/io.html @@ -148,7 +148,7 @@

    Error Information

    The ErrorInfo mentioned in this module is the standard ErrorInfo structure -that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    +that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    @@ -1189,12 +1189,12 @@

    standard_io()

    no IoDevice argument is specified in the function calls in this module.

    It is sometimes desirable to use an explicit IoDevice argument that refers to the default I/O device. This is the case with functions that can access either a file or the default I/O device. The atom standard_io has this -special meaning. The following example illustrates this:

    27> io:read('enter>').
    +special meaning. The following example illustrates this:

    27> io:read('enter>').
     enter>foo.
    -{ok,foo}
    -28> io:read(standard_io, 'enter>').
    +{ok,foo}
    +28> io:read(standard_io, 'enter>').
     enter>bar.
    -{ok,bar}

    By default all I/O sent to standard_io will end up in the user +{ok,bar}

    By default all I/O sent to standard_io will end up in the user I/O device of the node that spawned the calling process.

    standard_io is an alias for group_leader/0, so in order to change where the default input/output requests are sent you can change the group leader of the current process using @@ -1469,33 +1469,33 @@

    fread(IoDevice, Prompt, Format)

    whitespace characters are stripped. An Erlang string (list of characters) is returned.

    If Unicode translation is in effect (~ts), characters > 255 are accepted, otherwise not. With the translation modifier, the returned list can as a -consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
    +consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~ts").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~ts").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{ok,[[1091,1085,1080,1094,1086,1076,1077]]}
  • a - Similar to s, but the resulting string is converted into an +{ok,[[1091,1085,1080,1094,1086,1076,1077]]}

  • a - Similar to s, but the resulting string is converted into an atom.

  • c - The number of characters equal to the field width are read (default is 1) and returned as an Erlang string. However, leading and trailing whitespace characters are not omitted as they are with s. All -characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
    +characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~tc").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~tc").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{ok,[[1091]]}
  • l - Returns the number of characters that have been scanned up to that +{ok,[[1091]]}

  • l - Returns the number of characters that have been scanned up to that point, including whitespace characters.

  • The function returns:
    • {ok, Terms} - The read was successful and Terms is the list of successfully matched and read items.

    • eof - End of file was encountered.

    • {error, FreadError} - The reading failed and FreadError gives a hint about the error.

    • {error, ErrorDescription} - The read operation failed and parameter -ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
    +ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
     enter>1.9 35.5e3 15.0
    -{ok,[1.9,3.55e4,15.0]}
    -21> io:fread('enter>', "~10f~d").
    +{ok,[1.9,3.55e4,15.0]}
    +21> io:fread('enter>', "~10f~d").
     enter>     5.67899
    -{ok,[5.678,99]}
    -22> io:fread('enter>', ":~10s:~10c:").
    +{ok,[5.678,99]}
    +22> io:fread('enter>', ":~10s:~10c:").
     enter>:   alan   :   joe    :
    -{ok, ["alan", "   joe    "]}
    +
    {ok, ["alan", " joe "]}
    @@ -1584,7 +1584,7 @@

    fwrite(IoDevice, Format, Data)

    the output device, and control sequences for formatting, see below. If Format is an atom or a binary, it is first converted to a list with the aid of atom_to_list/1 or -binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
    +binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
     Hello world!
     ok

    The general format of a control sequence is ~F.P.PadModC.

    The character C determines the type of control sequence to be used. It is the only required field. All of F, P, Pad, and Mod are optional. For @@ -1602,25 +1602,25 @@

    fwrite(IoDevice, Format, Data)

    padding character is ' ' (space).

  • Mod is the control sequence modifier. This is one or more characters that change the interpretation of Data.

    The current modifiers are:

    • t - For Unicode translation.

    • l - For stopping p and P from detecting printable characters.

    • k - For use with p, P, w, and W to format maps in map-key ordered order (see maps:iterator_order/0).

    • K - Similar to k, for formatting maps in map-key order, but takes an -extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      -#{a => 1,b => 2}
      -> io:format("~Kp~n", [reversed, M]).
      -#{b => 2,a => 1}
      +extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      +#{a => 1,b => 2}
      +> io:format("~Kp~n", [reversed, M]).
      +#{b => 2,a => 1}
       ok
  • If F, P, or Pad is a * character, the next argument in Data is used as -the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
    +the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
     003.14159
    -ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
    +ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
     **3.14159
     ok

    Available control sequences:

    • ~ - Character ~ is written.

    • c - The argument is a number that is interpreted as an ASCII code. The precision is the number of times the character is printed and defaults to the -field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
      +field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
       |     aaaaa|bbbbb     |ccccc|
       ok

      If the Unicode translation modifier (t) is in effect, the integer argument can be any number representing a valid Unicode codepoint, otherwise it is to -be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      -\x{400}
      +be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      +\x{400}
       ok
      -3> io:fwrite("~c~n",[1024]).
      +3> io:fwrite("~c~n",[1024]).
       ^@
       ok
    • f - The argument is a float that is written as [-]ddd.ddd, where the precision is the number of digits after the decimal point. The default @@ -1638,18 +1638,18 @@

      fwrite(IoDevice, Format, Data)

      binaries are in UTF-8. The characters are printed without quotes. The string is first truncated by the specified precision and then padded and justified to the specified field width. The default precision is the field width.

      This format can be used for printing any object and truncating the output so -it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
      +it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
       |**********|
       ok
      -2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey,h|
      -3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey  |
      +2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey,h|
      +3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey  |
       ok

      A list with integers > 255 is considered an error if the Unicode translation -modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      -\x{400}
      +modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      +\x{400}
       ok
      -5> io:fwrite("~s~n",[[1024]]).
      +5> io:fwrite("~s~n",[[1024]]).
       ** exception error: bad argument
            in function  io:format/3
               called as io:format(<0.53.0>,"~s~n",[[1024]])
    • w - Writes data with the standard syntax. This is used to output Erlang @@ -1660,122 +1660,122 @@

      fwrite(IoDevice, Format, Data)

      breaks terms whose printed representation is longer than one line into many lines and indents each line sensibly. Left-justification is not supported. It also tries to detect flat lists of printable characters and output these as -strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      -{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      -{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
      +strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      +{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      +{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
       ...
      -2> io:fwrite("~w~n", [T]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      -[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      -me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      -,implicit}]
      +2> io:fwrite("~w~n", [T]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      +[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      +me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      +,implicit}]
       ok
      -3> io:fwrite("~62p~n", [T]).
      -[{attributes,[[{id,age,1.5},
      -               {mode,explicit},
      -               {typename,"INTEGER"}],
      -              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +3> io:fwrite("~62p~n", [T]).
      +[{attributes,[[{id,age,1.5},
      +               {mode,explicit},
      +               {typename,"INTEGER"}],
      +              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok

      The field width specifies the maximum line length. It defaults to 80. The precision specifies the initial indentation of the term. It defaults to the number of characters printed on this line in the same call to write/1 or -format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      -Here T = [{attributes,[[{id,age,1.5},
      -                        {mode,explicit},
      -                        {typename,"INTEGER"}],
      -                       [{id,cho},
      -                        {mode,explicit},
      -                        {typename,'Cho'}]]},
      -          {typename,'Person'},
      -          {tag,{'PRIVATE',3}},
      -          {mode,implicit}]
      +format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      +Here T = [{attributes,[[{id,age,1.5},
      +                        {mode,explicit},
      +                        {typename,"INTEGER"}],
      +                       [{id,cho},
      +                        {mode,explicit},
      +                        {typename,'Cho'}]]},
      +          {typename,'Person'},
      +          {tag,{'PRIVATE',3}},
      +          {mode,implicit}]
       ok

      As from Erlang/OTP 21.0, a field width of value 0 can be used for specifying that a line is infinitely long, which means that no line breaks are inserted. -For example:

      5> io:fwrite("~0p~n", [lists:seq(1, 30)]).
      -[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]
      +For example:

      5> io:fwrite("~0p~n", [lists:seq(1, 30)]).
      +[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]
       ok

      When the modifier l is specified, no detection of printable character lists -takes place, for example:

      6> S = [{a,"a"}, {b, "b"}],
      -   io:fwrite("~15p~n", [S]).
      -[{a,"a"},
      - {b,"b"}]
      +takes place, for example:

      6> S = [{a,"a"}, {b, "b"}],
      +   io:fwrite("~15p~n", [S]).
      +[{a,"a"},
      + {b,"b"}]
       ok
      -7> io:fwrite("~15lp~n", [S]).
      -[{a,[97]},
      - {b,[98]}]
      +7> io:fwrite("~15lp~n", [S]).
      +[{a,[97]},
      + {b,[98]}]
       ok

      The Unicode translation modifier t specifies how to treat characters outside the Latin-1 range of codepoints, in atoms, strings, and binaries. For example, -printing an atom containing a character > 255:

      8> io:fwrite("~p~n",[list_to_atom([1024])]).
      +printing an atom containing a character > 255:

      8> io:fwrite("~p~n",[list_to_atom([1024])]).
       '\x{400}'
       ok
      -9> io:fwrite("~tp~n",[list_to_atom([1024])]).
      +9> io:fwrite("~tp~n",[list_to_atom([1024])]).
       'Ѐ'
       ok

      By default, Erlang only detects lists of characters in the Latin-1 range as strings, but the +pc unicode flag can be used to change this (see -printable_range/0 for details). For example:

      10> io:fwrite("~p~n",[[214]]).
      +printable_range/0 for details). For example:

      10> io:fwrite("~p~n",[[214]]).
       "Ö"
       ok
      -11> io:fwrite("~p~n",[[1024]]).
      -[1024]
      +11> io:fwrite("~p~n",[[1024]]).
      +[1024]
       ok
      -12> io:fwrite("~tp~n",[[1024]]).
      -[1024]
      -ok

      but if Erlang was started with +pc unicode:

      13> io:fwrite("~p~n",[[1024]]).
      -[1024]
      +12> io:fwrite("~tp~n",[[1024]]).
      +[1024]
      +ok

      but if Erlang was started with +pc unicode:

      13> io:fwrite("~p~n",[[1024]]).
      +[1024]
       ok
      -14> io:fwrite("~tp~n",[[1024]]).
      +14> io:fwrite("~tp~n",[[1024]]).
       "Ѐ"
       ok

      Similarly, binaries that look like UTF-8 encoded strings are output with the -binary string syntax if the t modifier is specified:

      15> io:fwrite("~p~n", [<<208,128>>]).
      +binary string syntax if the t modifier is specified:

      15> io:fwrite("~p~n", [<<208,128>>]).
       <<208,128>>
       ok
      -16> io:fwrite("~tp~n", [<<208,128>>]).
      +16> io:fwrite("~tp~n", [<<208,128>>]).
       <<"Ѐ"/utf8>>
       ok
      -17> io:fwrite("~tp~n", [<<128,128>>]).
      +17> io:fwrite("~tp~n", [<<128,128>>]).
       <<128,128>>
       ok
    • W - Writes data in the same way as ~w, but takes an extra argument that is the maximum depth to which terms are printed. Anything below this -depth is replaced with .... For example, using T above:

      8> io:fwrite("~W~n", [T,9]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
      -[{id,cho},{mode,...},{...}]]},{typename,'Person'},
      -{tag,{'PRIVATE',3}},{mode,implicit}]
      +depth is replaced with .... For example, using T above:

      8> io:fwrite("~W~n", [T,9]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
      +[{id,cho},{mode,...},{...}]]},{typename,'Person'},
      +{tag,{'PRIVATE',3}},{mode,implicit}]
       ok

      If the maximum depth is reached, it cannot be read in the resultant output. Also, the ,... form in a tuple denotes that there are more elements in the tuple but these are below the print depth.

    • P - Writes data in the same way as ~p, but takes an extra argument that is the maximum depth to which terms are printed. Anything below this -depth is replaced with ..., for example:

      9> io:fwrite("~62P~n", [T,9]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
      -              [{id,cho},{mode,...},{...}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +depth is replaced with ..., for example:

      9> io:fwrite("~62P~n", [T,9]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
      +              [{id,cho},{mode,...},{...}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok
    • B - Writes an integer in base 2-36, the default base is 10. A leading -dash is printed for negative integers.

      The precision field selects base, for example:

      1> io:fwrite("~.16B~n", [31]).
      +dash is printed for negative integers.

      The precision field selects base, for example:

      1> io:fwrite("~.16B~n", [31]).
       1F
       ok
      -2> io:fwrite("~.2B~n", [-19]).
      +2> io:fwrite("~.2B~n", [-19]).
       -10011
       ok
      -3> io:fwrite("~.36B~n", [5*36+35]).
      +3> io:fwrite("~.36B~n", [5*36+35]).
       5Z
       ok
    • X - Like B, but takes an extra argument that is a prefix to insert -before the number, but after the leading dash, if any.

      The prefix can be a possibly deep list of characters or an atom. Example:

      1> io:fwrite("~X~n", [31,"10#"]).
      +before the number, but after the leading dash, if any.

      The prefix can be a possibly deep list of characters or an atom. Example:

      1> io:fwrite("~X~n", [31,"10#"]).
       10#31
       ok
      -2> io:fwrite("~.16X~n", [-31,"0x"]).
      +2> io:fwrite("~.16X~n", [-31,"0x"]).
       -0x1F
       ok
    • # - Like B, but prints the number with an Erlang style #-separated -base prefix. Example:

      1> io:fwrite("~.10#~n", [31]).
      +base prefix. Example:

      1> io:fwrite("~.10#~n", [31]).
       10#31
       ok
      -2> io:fwrite("~.16#~n", [-31]).
      +2> io:fwrite("~.16#~n", [-31]).
       -16#1F
      -ok
    • b - Like B, but prints lowercase letters.

    • x - Like X, but prints lowercase letters.

    • + - Like #, but prints lowercase letters.

    • n - Writes a new line.

    • i - Ignores the next term.

    The function returns:

    • ok - The formatting succeeded.

    If an error occurs, there is no output. Example:

    1> io:fwrite("~s ~w ~i ~w ~c ~n",['abc def', 'abc def', {foo, 1},{foo, 1}, 65]).
    -abc def 'abc def'  {foo,1} A
    +ok
  • b - Like B, but prints lowercase letters.

  • x - Like X, but prints lowercase letters.

  • + - Like #, but prints lowercase letters.

  • n - Writes a new line.

  • i - Ignores the next term.

  • The function returns:

    • ok - The formatting succeeded.

    If an error occurs, there is no output. Example:

    1> io:fwrite("~s ~w ~i ~w ~c ~n",['abc def', 'abc def', {foo, 1},{foo, 1}, 65]).
    +abc def 'abc def'  {foo,1} A
     ok
    -2> io:fwrite("~s", [65]).
    +2> io:fwrite("~s", [65]).
     ** exception error: bad argument
          in function  io:format/3
             called as io:format(<0.53.0>,"~s","A")

    In this example, an attempt was made to output the single character 65 with the @@ -1972,20 +1972,20 @@

    getopts(IoDevice)

    -

    Requests all available options and their current values for a IoDevice.

    For example:

    1> {ok,F} = file:open("/dev/null",[read]).
    -{ok,<0.42.0>}
    -2> io:getopts(F).
    -[{binary,false},{encoding,latin1}]

    Here the file I/O server returns all available options for a file, which are the +

    Requests all available options and their current values for a IoDevice.

    For example:

    1> {ok,F} = file:open("/dev/null",[read]).
    +{ok,<0.42.0>}
    +2> io:getopts(F).
    +[{binary,false},{encoding,latin1}]

    Here the file I/O server returns all available options for a file, which are the expected ones, encoding and binary. However, the standard shell has some -more options:

    3> io:getopts().
    -[{expand_fun,#Fun<group.0.120017273>},
    - {echo,true},
    - {binary,false},
    - {encoding,unicode},
    - {terminal,true},
    - {stdout,true},
    - {stderr,true},
    - {stdin,true}]

    This example is, as can be seen, run in an environment where the terminal +more options:

    3> io:getopts().
    +[{expand_fun,#Fun<group.0.120017273>},
    + {echo,true},
    + {binary,false},
    + {encoding,unicode},
    + {terminal,true},
    + {stdout,true},
    + {stderr,true},
    + {stdin,true}]

    This example is, as can be seen, run in an environment where the terminal supports Unicode input and output.

    The stdin, stdout and stderr options are read only and indicates whether the stream is a terminal or not. When it is a terminal, most systems that Erlang runs on allows the use of ANSI escape codes @@ -2176,12 +2176,12 @@

    parse_erl_exprs(IoDevice, Prompt, StartLoca and parsed as if it was a sequence of Erlang expressions until a final dot (.) is reached.

    The function returns:

    • {ok, ExprList, EndLocation} - The parsing was successful.

    • {eof, EndLocation} - End of file was encountered by the tokenizer.

    • eof - End of file was encountered by the I/O server.

    • {error, ErrorInfo, ErrorLocation} - An error occurred while tokenizing or parsing.

    • {error, ErrorDescription} - Other (rare) error condition, such as -{error, estale} if reading from an NFS file system.

    Example:

    25> io:parse_erl_exprs('enter>').
    -enter>abc(), "hey".
    -{ok, [{call,1,{atom,1,abc},[]},{string,1,"hey"}],2}
    -26> io:parse_erl_exprs('enter>').
    -enter>abc("hey".
    -{error,{1,erl_parse,["syntax error before: ",["'.'"]]},2}
    +{error, estale} if reading from an NFS file system.

    Example:

    25> io:parse_erl_exprs('enter>').
    +enter>abc(), "hey".
    +{ok, [{call,1,{atom,1,abc},[]},{string,1,"hey"}],2}
    +26> io:parse_erl_exprs('enter>').
    +enter>abc("hey".
    +{error,{1,erl_parse,["syntax error before: ",["'.'"]]},2}

    @@ -2748,12 +2748,12 @@

    scan_erl_exprs(Device, Prompt, StartLocatio argument Options of function erl_scan:tokens/4. The data is tokenized as if it were a sequence of Erlang expressions until a final dot (.) is reached. This token is also returned.

    The function returns:

    • {ok, Tokens, EndLocation} - The tokenization succeeded.

    • {eof, EndLocation} - End of file was encountered by the tokenizer.

    • eof - End of file was encountered by the I/O server.

    • {error, ErrorInfo, ErrorLocation} - An error occurred while tokenizing.

    • {error, ErrorDescription} - Other (rare) error condition, such as -{error, estale} if reading from an NFS file system.

    Example:

    23> io:scan_erl_exprs('enter>').
    -enter>abc(), "hey".
    -{ok,[{atom,1,abc},{'(',1},{')',1},{',',1},{string,1,"hey"},{dot,1}],2}
    -24> io:scan_erl_exprs('enter>').
    +{error, estale} if reading from an NFS file system.

    Example:

    23> io:scan_erl_exprs('enter>').
    +enter>abc(), "hey".
    +{ok,[{atom,1,abc},{'(',1},{')',1},{',',1},{string,1,"hey"},{dot,1}],2}
    +24> io:scan_erl_exprs('enter>').
     enter>1.0er.
    -{error,{1,erl_scan,{illegal,float}},2}
    +
    {error,{1,erl_scan,{illegal,float}},2}

    @@ -2968,8 +2968,8 @@

    setopts(IoDevice, Opts)

    current input line. The list of possible expansions can be formatted in different ways to make more advanced expansion suggestions more readable to the user, see edlin_expand:expand/2 for documentation of that.

    Trivial example (beep on anything except empty line, which is expanded to -"quit"):

    fun("") -> {yes, "quit", []};
    -   (_) -> {no, "", ["quit"]} end

    This option is only supported by the standard shell (group.erl).

  • {encoding, latin1 | unicode} - Specifies how characters are input or +"quit"):

    fun("") -> {yes, "quit", []};
    +   (_) -> {no, "", ["quit"]} end

    This option is only supported by the standard shell (group.erl).

  • {encoding, latin1 | unicode} - Specifies how characters are input or output from or to the I/O device, implying that, for example, a terminal is set to handle Unicode input and output or a file is set to handle UTF-8 data encoding.

    The option does not affect how data is returned from the I/O functions or diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/io_lib.html b/prs/8803/lib/stdlib-6.0.1/doc/html/io_lib.html index 8a313d9277cc0..8cfd67c9de8a6 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/io_lib.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/io_lib.html @@ -1032,8 +1032,8 @@

    fread(Format, String)

    input is needed to complete the original format string. RestFormat is the remaining format string, Nchars is the number of characters scanned, and InputStack is the reversed list of inputs matched up to that point.

  • {error, What} - The read operation failed and parameter What gives a -hint about the error.

  • Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    -{ok,[15.6,1.73e-5,24.5],[]}
    +hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    +{ok,[15.6,1.73e-5,24.5],[]}
    @@ -1538,11 +1538,11 @@

    write(Term, DepthOrOptions)

    "...".

    Depth defaults to -1, which means no limitation. Option CharsLimit puts a soft limit on the number of characters returned. When the number of characters is reached, remaining structures are replaced by "...". CharsLimit defaults to -1, -which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
    +which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
     "{1,[2],[3],[4,5],6,7,8,9}"
    -2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
    +2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
     "{1,[2],[3],[...],...}"
    -3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
    +3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
     "{[1,2|...],[4|...],...}"
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/io_protocol.html b/prs/8803/lib/stdlib-6.0.1/doc/html/io_protocol.html index ffa6a378b90c5..f11128fd55986 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/io_protocol.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/io_protocol.html @@ -146,8 +146,8 @@

    Protocol Basics

    As described in Robert's paper, I/O servers and clients communicate using -io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    -{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server +io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    +{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server eventually sends a corresponding io_reply tuple.

    • From is the pid/0 of the client, the process which the I/O server sends the I/O reply to.

    • ReplyAs can be any datum and is returned in the corresponding io_reply. The io module monitors the I/O server and uses the monitor reference as @@ -164,8 +164,8 @@

      Output Requests

      -

      To output characters on an I/O device, the following Requests exist:

      {put_chars, Encoding, Characters}
      -{put_chars, Encoding, Module, Function, Args}
      • Encoding is unicode or latin1, meaning that the characters are (in case +

        To output characters on an I/O device, the following Requests exist:

        {put_chars, Encoding, Characters}
        +{put_chars, Encoding, Module, Function, Args}
        • Encoding is unicode or latin1, meaning that the characters are (in case of binaries) encoded as UTF-8 or ISO Latin-1 (pure bytes). A well-behaved I/O server is also to return an error indication if list elements contain integers > 255 when Encoding is set to latin1.

          Notice that this does not in any way tell how characters are to be put on the @@ -184,14 +184,14 @@

          the function returns anything else than a binary or list, or throws an exception, an error is to be sent back to the client.

        The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

        ok
        -{error, Error}
        • Error describes the error to the client, which can do whatever it wants with +{error, Error}
    • Error describes the error to the client, which can do whatever it wants with it. The io module typically returns it "as is".

    Input Requests

    -

    To read characters from an I/O device, the following Requests exist:

    {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
    • Encoding denotes how data is to be sent back to the client and what data is +

      To read characters from an I/O device, the following Requests exist:

      {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
      • Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/ExtraArgs. If the function supplied returns data as a list, the data is converted to this encoding. If the function supplied returns data in some other format, no @@ -207,8 +207,8 @@

        nothing being written to the I/O device).

      • Module, Function, and ExtraArgs denote a function and arguments to determine when enough data is written. The function is to take two more arguments, the last state, and a list of characters. The function is to return -one of:

        {done, Result, RestChars}
        -{more, Continuation}

        Result can be any Erlang term, but if it is a list/0, the I/O server can +one of:

        {done, Result, RestChars}
        +{more, Continuation}

        Result can be any Erlang term, but if it is a list/0, the I/O server can convert it to a binary/0 of appropriate format before returning it to the client, if the I/O server is set in binary mode (see below).

        The function is called with the data the I/O server finds on its I/O device, returning one of:

        • {done, Result, RestChars} when enough data is read. In this case Result @@ -218,38 +218,38 @@

          characters are available. When no more characters are available, the function must return {done, eof, Rest}. The initial state is the empty list. The data when an end of file is reached on the IO device is the atom eof.

          An emulation of the get_line request can be (inefficiently) implemented -using the following functions:

          -module(demo).
          --export([until_newline/3, get_line/1]).
          +using the following functions:

          -module(demo).
          +-export([until_newline/3, get_line/1]).
           
          -until_newline(_ThisFar,eof,_MyStopCharacter) ->
          -    {done,eof,[]};
          -until_newline(ThisFar,CharList,MyStopCharacter) ->
          +until_newline(_ThisFar,eof,_MyStopCharacter) ->
          +    {done,eof,[]};
          +until_newline(ThisFar,CharList,MyStopCharacter) ->
               case
          -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
          +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
               of
          -  {L,[]} ->
          -            {more,ThisFar++L};
          -  {L2,[MyStopCharacter|Rest]} ->
          -      {done,ThisFar++L2++[MyStopCharacter],Rest}
          +  {L,[]} ->
          +            {more,ThisFar++L};
          +  {L2,[MyStopCharacter|Rest]} ->
          +      {done,ThisFar++L2++[MyStopCharacter],Rest}
               end.
           
          -get_line(IoServer) ->
          -    IoServer ! {io_request,
          -                self(),
          +get_line(IoServer) ->
          +    IoServer ! {io_request,
          +                self(),
                           IoServer,
          -                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
          +                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
               receive
          -        {io_reply, IoServer, Data} ->
          +        {io_reply, IoServer, Data} ->
                 Data
               end.

          Notice that the last element in the Request tuple ([$\n]) is appended to the argument list when the function is called. The function is to be called like apply(Module, Function, [ State, Data | ExtraArgs ]) by -the I/O server.

        A fixed number of characters is requested using the following Request:

        {get_chars, Encoding, Prompt, N}
        • Encoding and Prompt as for get_until.
        • N is the number of characters to be read from the I/O device.

        A single line (as in former example) is requested with the following Request:

        {get_line, Encoding, Prompt}
        • Encoding and Prompt as for get_until.

        Clearly, get_chars and get_line could be implemented with the get_until +the I/O server.

      A fixed number of characters is requested using the following Request:

      {get_chars, Encoding, Prompt, N}
      • Encoding and Prompt as for get_until.
      • N is the number of characters to be read from the I/O device.

      A single line (as in former example) is requested with the following Request:

      {get_line, Encoding, Prompt}
      • Encoding and Prompt as for get_until.

      Clearly, get_chars and get_line could be implemented with the get_until request (and indeed they were originally), but demands for efficiency have made these additions necessary.

      The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

      Data
       eof
      -{error, Error}
      • Data is the characters read, in list or binary form (depending on the I/O +{error, Error}
    • Data is the characters read, in list or binary form (depending on the I/O server mode, see the next section).
    • eof is returned when input end is reached and no more data is available to the client process.
    • Error describes the error to the client, which can do whatever it wants with it. The io module typically returns it as is.

    @@ -275,22 +275,22 @@

    This is done in the example in section An Annotated and Working Example I/O Server.

    An I/O server in binary mode affects the data sent to the client, so that it must be able to handle binary data. For convenience, the modes of an I/O server -can be set and retrieved using the following I/O requests:

    {setopts, Opts}
    • Opts is a list of options in the format recognized by the proplists +can be set and retrieved using the following I/O requests:

      {setopts, Opts}
      • Opts is a list of options in the format recognized by the proplists module (and by the I/O server).

      As an example, the I/O server for the interactive shell (in group.erl) -understands the following options:

      {binary, boolean()} (or binary/list)
      -{echo, boolean()}
      -{expand_fun, fun()}
      -{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while +understands the following options:

      {binary, boolean()} (or binary/list)
      +{echo, boolean()}
      +{expand_fun, fun()}
      +{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while echo and expand are valid only for this I/O server. Option unicode notifies how characters are put on the physical I/O device, that is, if the terminal itself is Unicode-aware. It does not affect how characters are sent in the I/O protocol, where each request contains encoding information for the provided or returned data.

      The I/O server is to send one of the following as Reply:

      ok
      -{error, Error}

      An error (preferably enotsup) is to be expected if the option is not supported +{error, Error}

    An error (preferably enotsup) is to be expected if the option is not supported by the I/O server (like if an echo option is sent in a setopts request to a plain file).

    To retrieve options, the following request is used:

    getopts

    This request asks for a complete list of all options supported by the I/O server as well as their current values.

    The I/O server replies:

    OptList
    -{error, Error}
    • OptList is a list of tuples {Option, Value}, where Option always is an +{error, Error}

    • OptList is a list of tuples {Option, Value}, where Option always is an atom.

    @@ -298,22 +298,22 @@

    Multiple I/O Requests

    The Request element can in itself contain many Requests by using the -following format:

    {requests, Requests}
    • Requests is a list of valid io_request tuples for the protocol. They must +following format:

      {requests, Requests}
      • Requests is a list of valid io_request tuples for the protocol. They must be executed in the order that they appear in the list. The execution is to continue until one of the requests results in an error or the list is consumed. The result of the last request is sent back to the client.

      The I/O server can, for a list of requests, send any of the following valid results in the reply, depending on the requests in the list:

      ok
      -{ok, Data}
      -{ok, Options}
      -{error, Error}

      +{ok, Data} +{ok, Options} +{error, Error}

    Optional I/O Request

    The following I/O request is optional to implement and a client is to be -prepared for an error return:

    {get_geometry, Geometry}
    • Geometry is the atom rows or the atom columns.

    The I/O server is to send one of the following as Reply:

    N
    -{error, Error}
    • N is the number of character rows or columns that the I/O device has, if +prepared for an error return:

      {get_geometry, Geometry}
      • Geometry is the atom rows or the atom columns.

      The I/O server is to send one of the following as Reply:

      N
      +{error, Error}
      • N is the number of character rows or columns that the I/O device has, if applicable to the I/O device handled by the I/O server, otherwise {error, enotsup} is a good answer.

      @@ -323,7 +323,7 @@

      If an I/O server encounters a request that it does not recognize (that is, the io_request tuple has the expected format, but the Request is unknown), the -I/O server is to send a valid reply with the error tuple:

      {error, request}

      This makes it possible to extend the protocol with optional requests and for the +I/O server is to send a valid reply with the error tuple:

      {error, request}

      This makes it possible to extend the protocol with optional requests and for the clients to be somewhat backward compatible.

      @@ -335,128 +335,128 @@

      process handling incoming requests, usually both I/O-requests and other I/O device-specific requests (positioning, closing, and so on).

      The example I/O server stores characters in an ETS table, making up a fairly crude RAM file.

      The module begins with the usual directives, a function to start the I/O server -and a main loop handling the requests:

      -module(ets_io_server).
      +and a main loop handling the requests:

      -module(ets_io_server).
       
      --export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
      +-export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
       
      --define(CHARS_PER_REC, 10).
      +-define(CHARS_PER_REC, 10).
       
      --record(state, {
      +-record(state, {
       	  table,
       	  position, % absolute
       	  mode % binary | list
      -	 }).
      +	 }).
       
      -start_link() ->
      -    spawn_link(?MODULE,init,[]).
      +start_link() ->
      +    spawn_link(?MODULE,init,[]).
       
      -init() ->
      -    Table = ets:new(noname,[ordered_set]),
      -    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
      +init() ->
      +    Table = ets:new(noname,[ordered_set]),
      +    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
       
      -loop(State) ->
      +loop(State) ->
           receive
      -	{io_request, From, ReplyAs, Request} ->
      -	    case request(Request,State) of
      -		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
      -		    reply(From, ReplyAs, Reply),
      -		    ?MODULE:loop(NewState);
      -		{stop, Reply, _NewState} ->
      -		    reply(From, ReplyAs, Reply),
      -		    exit(Reply)
      +	{io_request, From, ReplyAs, Request} ->
      +	    case request(Request,State) of
      +		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
      +		    reply(From, ReplyAs, Reply),
      +		    ?MODULE:loop(NewState);
      +		{stop, Reply, _NewState} ->
      +		    reply(From, ReplyAs, Reply),
      +		    exit(Reply)
       	    end;
       	%% Private message
      -	{From, rewind} ->
      -	    From ! {self(), ok},
      -	    ?MODULE:loop(State#state{position = 0});
      +	{From, rewind} ->
      +	    From ! {self(), ok},
      +	    ?MODULE:loop(State#state{position = 0});
       	_Unknown ->
      -	    ?MODULE:loop(State)
      +	    ?MODULE:loop(State)
           end.

      The main loop receives messages from the client (which can use the the io module to send requests). For each request, the function request/2 is called and a reply is eventually sent using function reply/3.

      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 I/O device-specific 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 can confuse the reader.

      First, we examine the reply function:

      reply(From, ReplyAs, Reply) ->
      -    From ! {io_reply, ReplyAs, Reply}.

      It sends the io_reply tuple back to the client, providing element ReplyAs +that can confuse the reader.

      First, we examine the reply function:

      reply(From, ReplyAs, Reply) ->
      +    From ! {io_reply, ReplyAs, Reply}.

      It sends the io_reply tuple back to the client, providing element ReplyAs received in the request along with the result of the request, as described -earlier.

      We need to handle some requests. First the requests for writing characters:

      request({put_chars, Encoding, Chars}, State) ->
      -    put_chars(unicode:characters_to_list(Chars,Encoding),State);
      -request({put_chars, Encoding, Module, Function, Args}, State) ->
      +earlier.

      We need to handle some requests. First the requests for writing characters:

      request({put_chars, Encoding, Chars}, State) ->
      +    put_chars(unicode:characters_to_list(Chars,Encoding),State);
      +request({put_chars, Encoding, Module, Function, Args}, State) ->
           try
      -	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
      +	request({put_chars, Encoding, apply(Module, Function, Args)}, State)
           catch
       	_:_ ->
      -	    {error, {error,Function}, State}
      +	    {error, {error,Function}, State}
           end;

      The Encoding says how the characters in the request are represented. We want to store the characters as lists in the ETS table, so we convert them to lists using function unicode:characters_to_list/2. The conversion function conveniently accepts the encoding types unicode and latin1, so we can use Encoding directly.

      When Module, Function, and Arguments are provided, we apply it and do the -same with the result as if the data was provided directly.

      We handle the requests for retrieving data:

      request({get_until, Encoding, _Prompt, M, F, As}, State) ->
      -    get_until(Encoding, M, F, As, State);
      -request({get_chars, Encoding, _Prompt, N}, State) ->
      +same with the result as if the data was provided directly.

      We handle the requests for retrieving data:

      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 implemented using get_until
      -    get_until(Encoding, ?MODULE, until_enough, [N], State);
      -request({get_line, Encoding, _Prompt}, State) ->
      +    get_until(Encoding, ?MODULE, until_enough, [N], State);
      +request({get_line, Encoding, _Prompt}, State) ->
           %% To simplify the code, get_line is implemented using get_until
      -    get_until(Encoding, ?MODULE, until_newline, [$\n], State);

      Here we have cheated a little by more or less only implementing get_until and + get_until(Encoding, ?MODULE, until_newline, [$\n], State);

      Here we have cheated a little by more or less only implementing get_until and using internal helpers to implement get_chars and get_line. In production code, this can be inefficient, but that depends on the frequency of the different requests. Before we start implementing functions put_chars/2 and -get_until/5, we examine the few remaining requests:

      request({get_geometry,_}, State) ->
      -    {error, {error,enotsup}, State};
      -request({setopts, Opts}, State) ->
      -    setopts(Opts, State);
      -request(getopts, State) ->
      -    getopts(State);
      -request({requests, Reqs}, State) ->
      -     multi_request(Reqs, {ok, ok, State});

      Request get_geometry has no meaning for this I/O server, so the reply is +get_until/5, we examine the few remaining requests:

      request({get_geometry,_}, State) ->
      +    {error, {error,enotsup}, State};
      +request({setopts, Opts}, State) ->
      +    setopts(Opts, State);
      +request(getopts, State) ->
      +    getopts(State);
      +request({requests, Reqs}, State) ->
      +     multi_request(Reqs, {ok, ok, State});

      Request get_geometry has no meaning for this I/O server, so the reply is {error, enotsup}. The only option we handle is binary/list, which is done in separate functions.

      The multi-request tag (requests) is handled in a separate loop function -applying the requests in the list one after another, returning the last result.

      {error, request} must be returned if the request is not recognized:

      request(_Other, State) ->
      -    {error, {error, request}, State}.

      Next we handle the different requests, first the fairly generic multi-request -type:

      multi_request([R|Rs], {ok, _Res, State}) ->
      -    multi_request(Rs, request(R, State));
      -multi_request([_|_], Error) ->
      +applying the requests in the list one after another, returning the last result.

      {error, request} must be returned if the request is not recognized:

      request(_Other, State) ->
      +    {error, {error, request}, State}.

      Next we handle the different requests, first the fairly generic multi-request +type:

      multi_request([R|Rs], {ok, _Res, State}) ->
      +    multi_request(Rs, request(R, State));
      +multi_request([_|_], Error) ->
           Error;
      -multi_request([], Result) ->
      +multi_request([], Result) ->
           Result.

      We loop through the requests one at the time, stopping when we either encounter an error or the list is exhausted. The last return value is sent back to the client (it is first returned to the main loop and then sent back by function io_reply).

      Requests getopts and setopts are also simple to handle. We only change or -read the state record:

      setopts(Opts0,State) ->
      -    Opts = proplists:unfold(
      -	     proplists:substitute_negations(
      -	       [{list,binary}],
      -	       Opts0)),
      -    case check_valid_opts(Opts) of
      +read the state record:

      setopts(Opts0,State) ->
      +    Opts = proplists:unfold(
      +	     proplists:substitute_negations(
      +	       [{list,binary}],
      +	       Opts0)),
      +    case check_valid_opts(Opts) of
       	true ->
      -	        case proplists:get_value(binary, Opts) of
      +	        case proplists:get_value(binary, Opts) of
       		    true ->
      -			{ok,ok,State#state{mode=binary}};
      +			{ok,ok,State#state{mode=binary}};
       		    false ->
      -			{ok,ok,State#state{mode=binary}};
      +			{ok,ok,State#state{mode=binary}};
       		    _ ->
      -			{ok,ok,State}
      +			{ok,ok,State}
       		end;
       	false ->
      -	    {error,{error,enotsup},State}
      +	    {error,{error,enotsup},State}
           end.
      -check_valid_opts([]) ->
      +check_valid_opts([]) ->
           true;
      -check_valid_opts([{binary,Bool}|T]) when is_boolean(Bool) ->
      -    check_valid_opts(T);
      -check_valid_opts(_) ->
      +check_valid_opts([{binary,Bool}|T]) when is_boolean(Bool) ->
      +    check_valid_opts(T);
      +check_valid_opts(_) ->
           false.
       
      -getopts(#state{mode=M} = S) ->
      -    {ok,[{binary, case M of
      +getopts(#state{mode=M} = S) ->
      +    {ok,[{binary, case M of
       		      binary ->
       			  true;
       		      _ ->
       			  false
      -		  end}],S}.

      As a convention, all I/O servers handle both {setopts, [binary]}, + end}],S}.

      As a convention, all I/O servers handle both {setopts, [binary]}, {setopts, [list]}, and {setopts,[{binary, boolean()}]}, hence the trick with proplists:substitute_negations/2 and proplists:unfold/1. If invalid options are sent to us, we send {error, enotsup} back to the client.

      Request getopts is to return a list of {Option, Value} tuples. This has the @@ -464,50 +464,50 @@

      of this I/O server. We have only one option, and hence return that.

      So far this I/O server is fairly generic (except for request rewind handled in the main loop and the creation of an ETS table). Most I/O servers contain code similar to this one.

      To make the example runnable, we start implementing the reading and writing of -the data to/from the ETS table. First function put_chars/3:

      put_chars(Chars, #state{table = T, position = P} = State) ->
      +the data to/from the ETS table. First function put_chars/3:

      put_chars(Chars, #state{table = T, position = P} = State) ->
           R = P div ?CHARS_PER_REC,
           C = P rem ?CHARS_PER_REC,
      -    [ apply_update(T,U) || U <- split_data(Chars, R, C) ],
      -    {ok, ok, State#state{position = (P + length(Chars))}}.

      We already have the data as (Unicode) lists and therefore only split the list in + [ apply_update(T,U) || U <- split_data(Chars, R, C) ], + {ok, ok, State#state{position = (P + length(Chars))}}.

      We already have the data as (Unicode) lists and therefore only split the list in runs of a predefined size and put each run in the table at the current position (and forward). Functions split_data/3 and apply_update/2 are implemented below.

      Now we want to read data from the table. Function get_until/5 reads data and applies the function until it says that it is done. The result is sent back to -the client:

      get_until(Encoding, Mod, Func, As,
      -	  #state{position = P, mode = M, table = T} = State) ->
      -    case get_loop(Mod,Func,As,T,P,[]) of
      -	{done,Data,_,NewP} when is_binary(Data); is_list(Data) ->
      +the client:

      get_until(Encoding, Mod, Func, As,
      +	  #state{position = P, mode = M, table = T} = State) ->
      +    case get_loop(Mod,Func,As,T,P,[]) of
      +	{done,Data,_,NewP} when is_binary(Data); is_list(Data) ->
       	    if
       		M =:= binary ->
      -		    {ok,
      -		     unicode:characters_to_binary(Data, unicode, Encoding),
      -		     State#state{position = NewP}};
      +		    {ok,
      +		     unicode:characters_to_binary(Data, unicode, Encoding),
      +		     State#state{position = NewP}};
       		true ->
      -		    case check(Encoding,
      -		               unicode:characters_to_list(Data, unicode))
      +		    case check(Encoding,
      +		               unicode:characters_to_list(Data, unicode))
                           of
      -			{error, _} = E ->
      -			    {error, E, State};
      +			{error, _} = E ->
      +			    {error, E, State};
       			List ->
      -			    {ok, List,
      -			     State#state{position = NewP}}
      +			    {ok, List,
      +			     State#state{position = NewP}}
       		    end
       	    end;
      -	{done,Data,_,NewP} ->
      -	    {ok, Data, State#state{position = NewP}};
      +	{done,Data,_,NewP} ->
      +	    {ok, Data, State#state{position = NewP}};
       	Error ->
      -	    {error, Error, State}
      +	    {error, Error, State}
           end.
       
      -get_loop(M,F,A,T,P,C) ->
      -    {NewP,L} = get(P,T),
      -    case catch apply(M,F,[C,L|A]) of
      -	{done, List, Rest} ->
      -	    {done, List, [], NewP - length(Rest)};
      -	{more, NewC} ->
      -	    get_loop(M,F,A,T,NewP,NewC);
      +get_loop(M,F,A,T,P,C) ->
      +    {NewP,L} = get(P,T),
      +    case catch apply(M,F,[C,L|A]) of
      +	{done, List, Rest} ->
      +	    {done, List, [], NewP - length(Rest)};
      +	{more, NewC} ->
      +	    get_loop(M,F,A,T,NewP,NewC);
       	_ ->
      -	    {error,F}
      +	    {error,F}
           end.

      Here we also handle the mode (binary or list) that can be set by request setopts. By default, all OTP I/O servers send data back to the client as lists, but switching mode to binary can increase efficiency if the I/O server @@ -524,80 +524,80 @@

      is only to get characters in the range 0..255. Function check/2 takes care of not returning arbitrary Unicode code points in lists if the encoding was specified as latin1. If the function does not return a list, the check cannot -be performed and the result is that of the supplied function untouched.

      To manipulate the table we implement the following utility functions:

      check(unicode, List) ->
      +be performed and the result is that of the supplied function untouched.

      To manipulate the table we implement the following utility functions:

      check(unicode, List) ->
           List;
      -check(latin1, List) ->
      +check(latin1, List) ->
           try
      -	[ throw(not_unicode) || X <- List,
      -				X > 255 ],
      +	[ throw(not_unicode) || X <- List,
      +				X > 255 ],
       	List
           catch
       	throw:_ ->
      -	    {error,{cannot_convert, unicode, latin1}}
      +	    {error,{cannot_convert, unicode, latin1}}
           end.

      The function check provides an error tuple if Unicode code points > 255 are to be returned if the client requested latin1.

      The two functions until_newline/3 and until_enough/3 are helpers used together with function get_until/5 to implement get_chars and get_line -(inefficiently):

      until_newline([],eof,_MyStopCharacter) ->
      -    {done,eof,[]};
      -until_newline(ThisFar,eof,_MyStopCharacter) ->
      -    {done,ThisFar,[]};
      -until_newline(ThisFar,CharList,MyStopCharacter) ->
      +(inefficiently):

      until_newline([],eof,_MyStopCharacter) ->
      +    {done,eof,[]};
      +until_newline(ThisFar,eof,_MyStopCharacter) ->
      +    {done,ThisFar,[]};
      +until_newline(ThisFar,CharList,MyStopCharacter) ->
           case
      -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
      +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
           of
      -	{L,[]} ->
      -            {more,ThisFar++L};
      -	{L2,[MyStopCharacter|Rest]} ->
      -	    {done,ThisFar++L2++[MyStopCharacter],Rest}
      +	{L,[]} ->
      +            {more,ThisFar++L};
      +	{L2,[MyStopCharacter|Rest]} ->
      +	    {done,ThisFar++L2++[MyStopCharacter],Rest}
           end.
       
      -until_enough([],eof,_N) ->
      -    {done,eof,[]};
      -until_enough(ThisFar,eof,_N) ->
      -    {done,ThisFar,[]};
      -until_enough(ThisFar,CharList,N)
      -  when length(ThisFar) + length(CharList) >= N ->
      -    {Res,Rest} = my_split(N,ThisFar ++ CharList, []),
      -    {done,Res,Rest};
      -until_enough(ThisFar,CharList,_N) ->
      -    {more,ThisFar++CharList}.

      As can be seen, the functions above are just the type of functions that are to +until_enough([],eof,_N) -> + {done,eof,[]}; +until_enough(ThisFar,eof,_N) -> + {done,ThisFar,[]}; +until_enough(ThisFar,CharList,N) + when length(ThisFar) + length(CharList) >= N -> + {Res,Rest} = my_split(N,ThisFar ++ CharList, []), + {done,Res,Rest}; +until_enough(ThisFar,CharList,_N) -> + {more,ThisFar++CharList}.

      As can be seen, the functions above are just the type of functions that are to be provided in get_until requests.

      To complete the I/O server, we only need to read and write the table in an -appropriate way:

      get(P,Tab) ->
      +appropriate way:

      get(P,Tab) ->
           R = P div ?CHARS_PER_REC,
           C = P rem ?CHARS_PER_REC,
      -    case ets:lookup(Tab,R) of
      -	[] ->
      -	    {P,eof};
      -	[{R,List}] ->
      -	    case my_split(C,List,[]) of
      -		{_,[]} ->
      -		    {P+length(List),eof};
      -		{_,Data} ->
      -		    {P+length(Data),Data}
      +    case ets:lookup(Tab,R) of
      +	[] ->
      +	    {P,eof};
      +	[{R,List}] ->
      +	    case my_split(C,List,[]) of
      +		{_,[]} ->
      +		    {P+length(List),eof};
      +		{_,Data} ->
      +		    {P+length(Data),Data}
       	    end
           end.
       
      -my_split(0,Left,Acc) ->
      -    {lists:reverse(Acc),Left};
      -my_split(_,[],Acc) ->
      -    {lists:reverse(Acc),[]};
      -my_split(N,[H|T],Acc) ->
      -    my_split(N-1,T,[H|Acc]).
      -
      -split_data([],_,_) ->
      -    [];
      -split_data(Chars, Row, Col) ->
      -    {This,Left} = my_split(?CHARS_PER_REC - Col, Chars, []),
      -    [ {Row, Col, This} | split_data(Left, Row + 1, 0) ].
      -
      -apply_update(Table, {Row, Col, List}) ->
      -    case ets:lookup(Table,Row) of
      -	[] ->
      -	    ets:insert(Table,{Row, lists:duplicate(Col,0) ++ List});
      -	[{Row, OldData}] ->
      -	    {Part1,_} = my_split(Col,OldData,[]),
      -	    {_,Part2} = my_split(Col+length(List),OldData,[]),
      -	    ets:insert(Table,{Row, Part1 ++ List ++ Part2})
      +my_split(0,Left,Acc) ->
      +    {lists:reverse(Acc),Left};
      +my_split(_,[],Acc) ->
      +    {lists:reverse(Acc),[]};
      +my_split(N,[H|T],Acc) ->
      +    my_split(N-1,T,[H|Acc]).
      +
      +split_data([],_,_) ->
      +    [];
      +split_data(Chars, Row, Col) ->
      +    {This,Left} = my_split(?CHARS_PER_REC - Col, Chars, []),
      +    [ {Row, Col, This} | split_data(Left, Row + 1, 0) ].
      +
      +apply_update(Table, {Row, Col, List}) ->
      +    case ets:lookup(Table,Row) of
      +	[] ->
      +	    ets:insert(Table,{Row, lists:duplicate(Col,0) ++ List});
      +	[{Row, OldData}] ->
      +	    {Part1,_} = my_split(Col,OldData,[]),
      +	    {_,Part2} = my_split(Col+length(List),OldData,[]),
      +	    ets:insert(Table,{Row, Part1 ++ List ++ Part2})
           end.

      The table is read or written in chunks of ?CHARS_PER_REC, overwriting when necessary. The implementation is clearly not efficient, it is just working.

      This concludes the example. It is fully runnable and you can read or write to the I/O server by using, for example, the io module or even the file diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/json.html b/prs/8803/lib/stdlib-6.0.1/doc/html/json.html index 9c7d0a93e8976..d1d525f1beecf 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/json.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/json.html @@ -991,8 +991,8 @@

      decode(Binary)

      Example

      -
      > json:decode(<<"{\"foo\": 1}">>).
      -#{<<"foo">> => 1}
      +
      > json:decode(<<"{\"foo\": 1}">>).
      +#{<<"foo">> => 1}
      @@ -1044,9 +1044,9 @@

      decode(Binary, Acc0, Decoders)

      Example

      -

      Decoding object keys as atoms:

      > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
      -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
      -{#{foo => 1},ok,<<>>}
      +

      Decoding object keys as atoms:

      > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
      +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
      +{#{foo => 1},ok,<<>>}
      @@ -1079,11 +1079,11 @@

      decode_continue/2

      Continue parsing a stream of bytes of a JSON value.

      Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

      > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
      -> json:decode_continue(<<"1}">>, State).
      -{#{foo => 1},ok,<<>>}
      > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
      -> json:decode_continue(end_of_input, State).
      -{123,ok,<<>>}
      +there is no more data, use end_of_input instead of a binary.

      > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
      +> json:decode_continue(<<"1}">>, State).
      +{#{foo => 1},ok,<<>>}
      > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
      +> json:decode_continue(end_of_input, State).
      +{123,ok,<<>>}
      @@ -1153,7 +1153,7 @@

      encode(Term)

      Examples

      -
      > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
      +
      > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
       <<"{\"foo\":\"bar\"}">>
      @@ -1195,10 +1195,10 @@

      encode(Term, Encoder)

      Examples

      An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

      > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
      -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
      -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
      -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
      +lists of key-value pairs from plain lists:

      > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
      +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
      +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
      +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
       <<"{\"a\":[],\"b\":1}">>
      @@ -1590,11 +1590,11 @@

      format(Term)

      -

      Generates formatted JSON corresponding to Term.

      Similiar to encode/1 but with added whitespaces for formatting.

      > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
      -{
      +

      Generates formatted JSON corresponding to Term.

      Similiar to encode/1 but with added whitespaces for formatting.

      > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
      +{
         "baz": 52,
         "foo": "bar"
      -}
      +}
       ok
      @@ -1659,20 +1659,20 @@

      format(Term, Encoder, Options)

      Generates formatted JSON corresponding to Term.

      Similar to encode/2, can be customised with the Encoder callback and Options.

      Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

      The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

      format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

      > formatter({posix_time, SysTimeSecs}, Encode, State) ->
      -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
      -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
      -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
      +to help in constructing such callbacks.

      > formatter({posix_time, SysTimeSecs}, Encode, State) ->
      +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
      +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
      +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
       >
      -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
      -> Options = #{indent => 4}.
      -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
      +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
      +> Options = #{indent => 4}.
      +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
       >
      -> io:put_chars(json:format(Term, Fun, Options)).
      -{
      +> io:put_chars(json:format(Term, Fun, Options)).
      +{
           "id": 1,
           "time": "2024-05-23T16:07:48Z"
      -}
      +}
       ok
      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/lists.html b/prs/8803/lib/stdlib-6.0.1/doc/html/lists.html index 785db1c74daf9..e2decbcd824bb 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/lists.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/lists.html @@ -1167,8 +1167,8 @@

      append(ListOfLists)

      -

      Returns a list in which all the sublists of ListOfLists have been appended.

      Example:

      > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
      -[1,2,3,a,b,4,5,6]
      +

      Returns a list in which all the sublists of ListOfLists have been appended.

      Example:

      > lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
      +[1,2,3,a,b,4,5,6]
      @@ -1197,7 +1197,7 @@

      append(List1, List2)

      Returns a new list List3, which is made from the elements of List1 followed -by the elements of List2.

      Example:

      > lists:append("abc", "def").
      +by the elements of List2.

      Example:

      > lists:append("abc", "def").
       "abcdef"

      lists:append(A, B) is equivalent to A ++ B.

      @@ -1228,7 +1228,7 @@

      concat(Things)

      Concatenates the text representation of the elements of Things. The elements -of Things can be atoms, integers, floats, or strings.

      Example:

      > lists:concat([doc, '/', file, '.', 3]).
      +of Things can be atoms, integers, floats, or strings.

      Example:

      > lists:concat([doc, '/', file, '.', 3]).
       "doc/file.3"
      @@ -1347,8 +1347,8 @@

      duplicate(N, Elem)

      -

      Returns a list containing N copies of term Elem.

      Example:

      > lists:duplicate(5, xx).
      -[xx,xx,xx,xx,xx]
      +

      Returns a list containing N copies of term Elem.

      Example:

      > lists:duplicate(5, xx).
      +[xx,xx,xx,xx,xx]
      @@ -1449,12 +1449,12 @@

      enumerate(Index, Step, List1)

      Returns List1 with each element H replaced by a tuple of form {I, H} where I is the position of H in List1. The enumeration starts with Index and increases by Step in each step.

      That is, enumerate/3 behaves as if it had been defined as -follows:

      enumerate(I, S, List) ->
      -  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
      -  List1.

      The default values for Index and Step are both 1.

      Examples:

      > lists:enumerate([a,b,c]).
      -[{1,a},{2,b},{3,c}]
      > lists:enumerate(10, [a,b,c]).
      -[{10,a},{11,b},{12,c}]
      > lists:enumerate(0, -2, [a,b,c]).
      -[{0,a},{-2,b},{-4,c}]
      +follows:

      enumerate(I, S, List) ->
      +  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
      +  List1.

      The default values for Index and Step are both 1.

      Examples:

      > lists:enumerate([a,b,c]).
      +[{1,a},{2,b},{3,c}]
      > lists:enumerate(10, [a,b,c]).
      +[{10,a},{11,b},{12,c}]
      > lists:enumerate(0, -2, [a,b,c]).
      +[{0,a},{-2,b},{-4,c}]
      @@ -1523,15 +1523,15 @@

      filtermap(Fun, List1)

      Calls Fun(Elem) on successive elements Elem of List1 in order to update or remove elements from List1.

      Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the list of elements for which Fun returns a new value, where a value -of true is synonymous with {true, Elem}.

      That is, filtermap behaves as if it had been defined as follows:

      filtermap(Fun, List1) ->
      -    lists:foldr(fun(Elem, Acc) ->
      -                       case Fun(Elem) of
      +of true is synonymous with {true, Elem}.

      That is, filtermap behaves as if it had been defined as follows:

      filtermap(Fun, List1) ->
      +    lists:foldr(fun(Elem, Acc) ->
      +                       case Fun(Elem) of
                                  false -> Acc;
      -                           true -> [Elem|Acc];
      -                           {true,Value} -> [Value|Acc]
      +                           true -> [Elem|Acc];
      +                           {true,Value} -> [Value|Acc]
                              end
      -                end, [], List1).

      Example:

      > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
      -[1,2]
      +
      end, [], List1).

      Example:

      > lists:filtermap(fun(X) -> case X rem 2 of 0 -> {true, X div 2}; _ -> false end end, [1,2,3,4,5]).
      +[1,2]
      @@ -1590,9 +1590,9 @@

      flatmap(Fun, List1)

      Takes a function from As to lists of Bs, and a list of As (List1) and produces a list of Bs by applying the function to every element in List1 and -appending the resulting lists.

      That is, flatmap behaves as if it had been defined as follows:

      flatmap(Fun, List1) ->
      -    append(map(Fun, List1)).

      Example:

      > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
      -[a,a,b,b,c,c]
      +appending the resulting lists.

      That is, flatmap behaves as if it had been defined as follows:

      flatmap(Fun, List1) ->
      +    append(map(Fun, List1)).

      Example:

      > lists:flatmap(fun(X)->[X,X] end, [a,b,c]).
      +[a,a,b,b,c,c]
      @@ -1688,9 +1688,9 @@

      foldl(Fun, Acc0, List)

      Calls Fun(Elem, AccIn) on successive elements A of List, starting with AccIn == Acc0. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is -returned if the list is empty.

      Example:

      > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
      +returned if the list is empty.

      Example:

      > lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
       15
      -> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
      +> lists:foldl(fun(X, Prod) -> X * Prod end, 1, [1,2,3,4,5]).
       120
      @@ -1727,11 +1727,11 @@

      foldr(Fun, Acc0, List)

      -

      Like foldl/3, but the list is traversed from right to left.

      Example:

      > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
      +

      Like foldl/3, but the list is traversed from right to left.

      Example:

      > P = fun(A, AccIn) -> io:format("~p ", [A]), AccIn end.
       #Fun<erl_eval.12.2225172>
      -> lists:foldl(P, void, [1,2,3]).
      +> lists:foldl(P, void, [1,2,3]).
       1 2 3 void
      -> lists:foldr(P, void, [1,2,3]).
      +> lists:foldr(P, void, [1,2,3]).
       3 2 1 void

      foldl/3 is tail recursive and is usually preferred to foldr/3.

      @@ -1794,12 +1794,12 @@

      join(Sep, List1)

      Inserts Sep between each element in List1. Has no effect on the empty list -and on a singleton list. For example:

      > lists:join(x, [a,b,c]).
      -[a,x,b,x,c]
      -> lists:join(x, [a]).
      -[a]
      -> lists:join(x, []).
      -[]
      +and on a singleton list. For example:

      > lists:join(x, [a,b,c]).
      +[a,x,b,x,c]
      +> lists:join(x, [a]).
      +[a]
      +> lists:join(x, []).
      +[]
      @@ -1900,10 +1900,10 @@

      keymap(Fun, N, TupleList1)

      Returns a list of tuples where, for each tuple in TupleList1, the Nth element Term1 of the tuple has been replaced with the result of calling -Fun(Term1).

      Examples:

      > Fun = fun(Atom) -> atom_to_list(Atom) end.
      +Fun(Term1).

      Examples:

      > Fun = fun(Atom) -> atom_to_list(Atom) end.
       #Fun<erl_eval.6.10732646>
      -2> lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]).
      -[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
      +2>
      lists:keymap(Fun, 2, [{name,jane,22},{name,lizzie,20},{name,lydia,15}]). +[{name,"jane",22},{name,"lizzie",20},{name,"lydia",15}]
      @@ -2244,9 +2244,9 @@

      mapfoldl(Fun, Acc0, List1)

      -

      Combines the operations of map/2 and foldl/3 into one pass.

      Example:

      Summing the elements in a list and double them at the same time:

      > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
      -0, [1,2,3,4,5]).
      -{[2,4,6,8,10],15}
      +

      Combines the operations of map/2 and foldl/3 into one pass.

      Example:

      Summing the elements in a list and double them at the same time:

      > lists:mapfoldl(fun(X, Sum) -> {2*X, X+Sum} end,
      +0, [1,2,3,4,5]).
      +{[2,4,6,8,10],15}
      @@ -2538,7 +2538,7 @@

      nth(N, List)

      -

      Returns the Nth element of List.

      Example:

      > lists:nth(3, [a, b, c, d, e]).
      +

      Returns the Nth element of List.

      Example:

      > lists:nth(3, [a, b, c, d, e]).
       c
      @@ -2568,14 +2568,14 @@

      nthtail(N, List)

      Returns the Nth tail of List, that is, the sublist of List starting at -N+1 and continuing up to the end of the list.

      Example

      > lists:nthtail(3, [a, b, c, d, e]).
      -[d,e]
      -> tl(tl(tl([a, b, c, d, e]))).
      -[d,e]
      -> lists:nthtail(0, [a, b, c, d, e]).
      -[a,b,c,d,e]
      -> lists:nthtail(5, [a, b, c, d, e]).
      -[]
      +N+1 and continuing up to the end of the list.

      Example

      > lists:nthtail(3, [a, b, c, d, e]).
      +[d,e]
      +> tl(tl(tl([a, b, c, d, e]))).
      +[d,e]
      +> lists:nthtail(0, [a, b, c, d, e]).
      +[a,b,c,d,e]
      +> lists:nthtail(5, [a, b, c, d, e]).
      +[]
      @@ -2611,10 +2611,10 @@

      partition(Pred, List)

      Partitions List into two lists, where the first list contains all elements for which Pred(Elem) returns true, and the second list contains all elements for -which Pred(Elem) returns false.

      Examples:

      > lists:partition(fun(A) -> A rem 2 == 1 end, [1,2,3,4,5,6,7]).
      -{[1,3,5,7],[2,4,6]}
      -> lists:partition(fun(A) -> is_atom(A) end, [a,b,1,c,d,2,3,4,e]).
      -{[a,b,c,d,e],[1,2,3,4]}

      For a different way to partition a list, see splitwith/2.

      +which Pred(Elem) returns false.

      Examples:

      > lists:partition(fun(A) -> A rem 2 == 1 end, [1,2,3,4,5,6,7]).
      +{[1,3,5,7],[2,4,6]}
      +> lists:partition(fun(A) -> is_atom(A) end, [a,b,1,c,d,2,3,4,e]).
      +{[a,b,c,d,e],[1,2,3,4]}

      For a different way to partition a list, see splitwith/2.

      @@ -2699,8 +2699,8 @@

      reverse(List1, Tail)

      Returns a list with the elements in List1 in reverse order, with tail Tail -appended.

      Example:

      > lists:reverse([1, 2, 3, 4], [a, b, c]).
      -[4,3,2,1,a,b,c]
      +appended.

      Example:

      > lists:reverse([1, 2, 3, 4], [a, b, c]).
      +[4,3,2,1,a,b,c]
      @@ -2793,17 +2793,17 @@

      seq(From, To, Incr)

      Returns a sequence of integers that starts with From and contains the successive results of adding Incr to the previous element, until To is reached or passed (in the latter case, To is not an element of the sequence). -Incr defaults to 1.

      Failures:

      • If To < From - Incr and Incr > 0.
      • If To > From - Incr and Incr < 0.
      • If Incr =:= 0 and From =/= To.

      The following equalities hold for all sequences:

      length(lists:seq(From, To)) =:= To - From + 1
      -length(lists:seq(From, To, Incr)) =:= (To - From + Incr) div Incr

      Examples:

      > lists:seq(1, 10).
      -[1,2,3,4,5,6,7,8,9,10]
      -> lists:seq(1, 20, 3).
      -[1,4,7,10,13,16,19]
      -> lists:seq(1, 0, 1).
      -[]
      -> lists:seq(10, 6, 4).
      -[]
      -> lists:seq(1, 1, 0).
      -[1]
      +Incr defaults to 1.

      Failures:

      • If To < From - Incr and Incr > 0.
      • If To > From - Incr and Incr < 0.
      • If Incr =:= 0 and From =/= To.

      The following equalities hold for all sequences:

      length(lists:seq(From, To)) =:= To - From + 1
      +length(lists:seq(From, To, Incr)) =:= (To - From + Incr) div Incr

      Examples:

      > lists:seq(1, 10).
      +[1,2,3,4,5,6,7,8,9,10]
      +> lists:seq(1, 20, 3).
      +[1,4,7,10,13,16,19]
      +> lists:seq(1, 0, 1).
      +[]
      +> lists:seq(10, 6, 4).
      +[]
      +> lists:seq(1, 1, 0).
      +[1]
      @@ -2928,11 +2928,11 @@

      splitwith(Pred, List)

      Partitions List into two lists according to Pred. -splitwith/2 behaves as if it is defined as follows:

      splitwith(Pred, List) ->
      -    {takewhile(Pred, List), dropwhile(Pred, List)}.

      Examples:

      > lists:splitwith(fun(A) -> A rem 2 == 1 end, [1,2,3,4,5,6,7]).
      -{[1],[2,3,4,5,6,7]}
      -> lists:splitwith(fun(A) -> is_atom(A) end, [a,b,1,c,d,2,3,4,e]).
      -{[a,b],[1,c,d,2,3,4,e]}

      The Pred function must return a boolean. For a different way to partition a +splitwith/2 behaves as if it is defined as follows:

      splitwith(Pred, List) ->
      +    {takewhile(Pred, List), dropwhile(Pred, List)}.

      Examples:

      > lists:splitwith(fun(A) -> A rem 2 == 1 end, [1,2,3,4,5,6,7]).
      +{[1],[2,3,4,5,6,7]}
      +> lists:splitwith(fun(A) -> is_atom(A) end, [a,b,1,c,d,2,3,4,e]).
      +{[a,b],[1,c,d,2,3,4,e]}

      The Pred function must return a boolean. For a different way to partition a list, see partition/2.

      @@ -2999,12 +2999,12 @@

      sublist(List1, Start, Len)

      Returns the sublist of List1 starting at Start and with (maximum) Len -elements. It is not an error for Start+Len to exceed the length of the list.

      Examples:

      > lists:sublist([1,2,3,4], 2, 2).
      -[2,3]
      -> lists:sublist([1,2,3,4], 2, 5).
      -[2,3,4]
      -> lists:sublist([1,2,3,4], 5, 2).
      -[]
      +elements. It is not an error for Start+Len to exceed the length of the list.

      Examples:

      > lists:sublist([1,2,3,4], 2, 2).
      +[2,3]
      +> lists:sublist([1,2,3,4], 2, 5).
      +[2,3,4]
      +> lists:sublist([1,2,3,4], 5, 2).
      +[]
      @@ -3034,7 +3034,7 @@

      subtract(List1, List2)

      Returns a new list List3 that is a copy of List1, subjected to the following procedure: for each element in List2, its first occurrence in List1 is -deleted.

      Example:

      > lists:subtract("123212", "212").
      +deleted.

      Example:

      > lists:subtract("123212", "212").
       "312".

      lists:subtract(A, B) is equivalent to A -- B.

      @@ -3370,10 +3370,10 @@

      uniq(List1)

      Returns a list containing the elements of List1 with duplicated elements removed (preserving the order of the elements). The first occurrence of each -element is kept.

      Examples:

      > lists:uniq([3,3,1,2,1,2,3]).
      -[3,1,2]
      -> lists:uniq([a, a, 1, b, 2, a, 3]).
      -[a, 1, b, 2, 3]
      +element is kept.

      Examples:

      > lists:uniq([3,3,1,2,1,2,3]).
      +[3,1,2]
      +> lists:uniq([a, a, 1, b, 2, a, 3]).
      +[a, 1, b, 2, 3]
      @@ -3405,8 +3405,8 @@

      uniq(Fun, List1)

      Returns a list containing the elements of List1 without the elements for which Fun returned duplicate values (preserving the order of the elements). The -first occurrence of each element is kept.

      Examples:

      > lists:uniq(fun({X, _}) -> X end, [{b, 2}, {a, 1}, {c, 3}, {a, 2}]).
      -[{b, 2}, {a, 1}, {c, 3}]
      +first occurrence of each element is kept.

      Examples:

      > lists:uniq(fun({X, _}) -> X end, [{b, 2}, {a, 1}, {c, 3}, {a, 2}]).
      +[{b, 2}, {a, 1}, {c, 3}]
      @@ -3690,14 +3690,14 @@

      zip(List1, List2, How)

      tuple is taken from the first list and the second element is taken from the corresponding element in the second list.

      The How parameter specifies the behavior if the given lists are of different lengths.

      • fail - The call will fail if the given lists are not of equal length. -This is the default.

      • trim - Surplus elements from the longer list will be ignored.

        Examples:

        > lists:zip([a, b], [1, 2, 3], trim).
        -[{a,1},{b,2}]
        -> lists:zip([a, b, c], [1, 2], trim).
        -[{a,1},{b,2}]
      • {pad, Defaults} - The shorter list will be padded to the length of the -longer list, using the respective elements from the given Defaults tuple.

        Examples:

        > lists:zip([a, b], [1, 2, 3], {pad, {x, 0}}).
        -[{a,1},{b,2},{x,3}]
        -> lists:zip([a, b, c], [1, 2], {pad, {x, 0}}).
        -[{a,1},{b,2},{c,0}]
      +This is the default.

    • trim - Surplus elements from the longer list will be ignored.

      Examples:

      > lists:zip([a, b], [1, 2, 3], trim).
      +[{a,1},{b,2}]
      +> lists:zip([a, b, c], [1, 2], trim).
      +[{a,1},{b,2}]
    • {pad, Defaults} - The shorter list will be padded to the length of the +longer list, using the respective elements from the given Defaults tuple.

      Examples:

      > lists:zip([a, b], [1, 2, 3], {pad, {x, 0}}).
      +[{a,1},{b,2},{x,3}]
      +> lists:zip([a, b, c], [1, 2], {pad, {x, 0}}).
      +[{a,1},{b,2},{c,0}]
    @@ -3782,10 +3782,10 @@

    zipwith3(Combine, List1, List2, List3, How)

    Combines the elements of three lists into one list. For each triple X, Y, Z of list elements from the three lists, the element in the result list is Combine(X, Y, Z).

    For a description of the How parameter, see zip/3.

    zipwith3(fun(X, Y, Z) -> {X,Y,Z} end, List1, List2, List3) is -equivalent to zip3(List1, List2, List3).

    Examples:

    > lists:zipwith3(fun(X, Y, Z) -> X+Y+Z end, [1,2,3], [4,5,6], [7,8,9]).
    -[12,15,18]
    -> lists:zipwith3(fun(X, Y, Z) -> [X,Y,Z] end, [a,b,c], [x,y,z], [1,2,3]).
    -[[a,x,1],[b,y,2],[c,z,3]]
    +equivalent to zip3(List1, List2, List3).

    Examples:

    > lists:zipwith3(fun(X, Y, Z) -> X+Y+Z end, [1,2,3], [4,5,6], [7,8,9]).
    +[12,15,18]
    +> lists:zipwith3(fun(X, Y, Z) -> [X,Y,Z] end, [a,b,c], [x,y,z], [1,2,3]).
    +[[a,x,1],[b,y,2],[c,z,3]]

    @@ -3864,8 +3864,8 @@

    zipwith(Combine, List1, List2, How)

    Combines the elements of two lists into one list. For each pair X, Y of list elements from the two lists, the element in the result list is Combine(X, Y).

    For a description of the How parameter, see zip/3.

    zipwith(fun(X, Y) -> {X,Y} end, List1, List2) is equivalent to -zip(List1, List2).

    Example:

    > lists:zipwith(fun(X, Y) -> X+Y end, [1,2,3], [4,5,6]).
    -[5,7,9]
    +zip(List1, List2).

    Example:

    > lists:zipwith(fun(X, Y) -> X+Y end, [1,2,3], [4,5,6]).
    +[5,7,9]
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/maps.html b/prs/8803/lib/stdlib-6.0.1/doc/html/maps.html index efee040635b24..e5a3c4c57b101 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/maps.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/maps.html @@ -745,10 +745,10 @@

    filter(Pred, MapOrIter)

    Returns a map Map for which predicate Pred holds true in MapOrIter.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    -  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    -  maps:filter(Pred,M).
    -#{a => 2,c => 4}
    +valid iterator, or with badarg if Pred is not a function of arity 2.

    Example:

    > M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
    +  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
    +  maps:filter(Pred,M).
    +#{a => 2,c => 4}
    @@ -787,10 +787,10 @@

    filtermap(Fun, MapOrIter)

    map. If it returns false, the association is not copied. If it returns {true, NewValue}, the value for Key is replaced with NewValue in the result map.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    -  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    -  maps:filtermap(Fun,Map).
    -#{k1 => 2,"k2" => 2}
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
    +  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
    +  maps:filtermap(Fun,Map).
    +#{k1 => 2,"k2" => 2}
    @@ -821,10 +821,10 @@

    find(Key, Map)

    Returns a tuple {ok, Value}, where Value is the value associated with Key, -or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
    +or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"hi" => 42},
       Key = "hi",
    -  maps:find(Key,Map).
    -{ok,42}
    +
    maps:find(Key,Map). +{ok,42}
    @@ -865,9 +865,9 @@

    fold(Fun, Init, MapOrIter)

    which is passed to the next successive call. This function returns the final value of the accumulator. The initial accumulator value Init is returned if the map is empty.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    -  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    -  maps:fold(Fun,0,Map).
    +valid iterator, or with badarg if Fun is not a function of arity 3.

    Example:

    > Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
    +  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    +  maps:fold(Fun,0,Map).
     6
    @@ -934,8 +934,8 @@

    from_keys(Keys, Value)

    Takes a list of keys and a value and builds a map where all keys point to the -same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    -#{"a" => ok,"b" => ok,"c" => ok}
    +same value. The key can be in any order, and keys and value can be of any term.

    Example:

    > Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
    +#{"a" => ok,"b" => ok,"c" => ok}
    @@ -967,9 +967,9 @@

    from_list(List)

    Takes a list of key-value tuples elements and builds a map. The associations can be in any order, and both keys and values in the association can be of any term.

    If the same key appears more than once, the latter (right-most) value is used -and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    -  maps:from_list(List).
    -#{42 => value_three,1337 => "value two","a" => 1}
    +and the previous values are ignored.

    Example:

    > List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
    +  maps:from_list(List).
    +#{42 => value_three,1337 => "value two","a" => 1}
    @@ -1001,8 +1001,8 @@

    get(Key, Map)

    Returns value Value associated with Key if Map contains Key.

    The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkey,Key} exception if no value is associated with Key.

    Example:

    > Key = 1337,
    -  Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  maps:get(Key,Map).
    +  Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  maps:get(Key,Map).
     "value one"
    @@ -1034,11 +1034,11 @@

    get(Key, Map, Default)

    Returns value Value associated with Key if Map contains Key. If no value -is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    -#{key1 => val1,key2 => val2}
    -> maps:get(key1, Map, "Default value").
    +is associated with Key, Default is returned.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{ key1 => val1, key2 => val2 }.
    +#{key1 => val1,key2 => val2}
    +> maps:get(key1, Map, "Default value").
     val1
    -> maps:get(key3, Map, "Default value").
    +> maps:get(key3, Map, "Default value").
     "Default value"
    @@ -1078,11 +1078,11 @@

    groups_from_list(KeyFun, List)

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -maps:groups_from_list(EvenOdd, [1, 2, 3]).
    -#{even => [2], odd => [1, 3]}
    -> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +maps:groups_from_list(EvenOdd, [1, 2, 3]).
    +#{even => [2], odd => [1, 3]}
    +> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
    +#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    @@ -1094,7 +1094,7 @@

    groups_from_list(KeyFun, List)

    groups_from_list(KeyFun, ValueFun, List)

    - + View Source @@ -1124,15 +1124,15 @@

    groups_from_list(KeyFun, ValueFun, List)Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List, mapped via ValueFun, for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    -> Square = fun(X) -> X * X end,
    -> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    -#{even => [4], odd => [1, 9]}
    -> maps:groups_from_list(
    +list.

    Examples:

    > EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
    +> Square = fun(X) -> X * X end,
    +> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    +#{even => [4], odd => [1, 9]}
    +> maps:groups_from_list(
         fun erlang:length/1,
         fun lists:reverse/1,
    -    ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    +
    ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}

    @@ -1164,10 +1164,10 @@

    intersect(Map1, Map2)

    Intersects two maps into a single map Map3. If a key exists in both maps, the -value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect(Map1,Map2).
    -#{a => 1}
    +value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect(Map1,Map2).
    +#{a => 1}
    @@ -1207,10 +1207,10 @@

    intersect_with(Combiner, Map1, Map2)

    the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    -#{a => {"value_one",1}}
    +three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    +#{a => {"value_one",1}}
    @@ -1241,11 +1241,11 @@

    is_key(Key, Map)

    Returns true if map Map contains Key and returns false if it does not -contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    -#{"42" => value}
    -> maps:is_key("42",Map).
    +contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    +#{"42" => value}
    +> maps:is_key("42",Map).
     true
    -> maps:is_key(value,Map).
    +> maps:is_key(value,Map).
     false
    @@ -1278,15 +1278,15 @@

    iterator(Map)

    Returns a map iterator Iterator that can be used by maps:next/1 to traverse the key-value associations in a map. When iterating over a map, the -memory usage is guaranteed to be bounded no matter the size of the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > M = #{ a => 1, b => 2 }.
    -#{a => 1,b => 2}
    -> I = maps:iterator(M), ok.
    +memory usage is guaranteed to be bounded no matter the size of the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > M = #{ a => 1, b => 2 }.
    +#{a => 1,b => 2}
    +> I = maps:iterator(M), ok.
     ok
    -> {K1, V1, I2} = maps:next(I), {K1, V1}.
    -{a,1}
    -> {K2, V2, I3} = maps:next(I2),{K2, V2}.
    -{b,2}
    -> maps:next(I3).
    +> {K1, V1, I2} = maps:next(I), {K1, V1}.
    +{a,1}
    +> {K2, V2, I3} = maps:next(I2),{K2, V2}.
    +{b,2}
    +> maps:next(I3).
     none
    @@ -1324,34 +1324,34 @@

    iterator(Map, Order)

    Returns a map iterator Iterator that can be used by maps:next/1 to traverse the key-value associations in a map sorted by key using the given Order.

    The call fails with a {badmap,Map} exception if Map is not a map or if -Order is invalid.

    Example (when Order is ordered):

    > M = #{ a => 1, b => 2 }.
    -#{a => 1,b => 2}
    -> OrdI = maps:iterator(M, ordered), ok.
    +Order is invalid.

    Example (when Order is ordered):

    > M = #{ a => 1, b => 2 }.
    +#{a => 1,b => 2}
    +> OrdI = maps:iterator(M, ordered), ok.
     ok
    -> {K1, V1, OrdI2} = maps:next(OrdI), {K1, V1}.
    -{a,1}
    -> {K2, V2, OrdI3} = maps:next(OrdI2),{K2, V2}.
    -{b,2}
    -> maps:next(OrdI3).
    -none

    Example (when Order is reversed):

    > M = #{ a => 1, b => 2 }.
    -#{a => 1,b => 2}
    -> RevI = maps:iterator(M, reversed), ok.
    +> {K1, V1, OrdI2} = maps:next(OrdI), {K1, V1}.
    +{a,1}
    +> {K2, V2, OrdI3} = maps:next(OrdI2),{K2, V2}.
    +{b,2}
    +> maps:next(OrdI3).
    +none

    Example (when Order is reversed):

    > M = #{ a => 1, b => 2 }.
    +#{a => 1,b => 2}
    +> RevI = maps:iterator(M, reversed), ok.
     ok
    -> {K2, V2, RevI2} = maps:next(RevI), {K2, V2}.
    -{b,2}
    -> {K1, V1, RevI3} = maps:next(RevI2),{K1, V1}.
    -{a,1}
    -> maps:next(RevI3).
    -none

    Example (when Order is an arithmetic sorting function):

    > M = #{ -1 => a, -1.0 => b, 0 => c, 0.0 => d }.
    -#{-1 => a,0 => c,-1.0 => b,0.0 => d}
    -> ArithOrdI = maps:iterator(M, fun(A, B) -> A =< B end), ok.
    +> {K2, V2, RevI2} = maps:next(RevI), {K2, V2}.
    +{b,2}
    +> {K1, V1, RevI3} = maps:next(RevI2),{K1, V1}.
    +{a,1}
    +> maps:next(RevI3).
    +none

    Example (when Order is an arithmetic sorting function):

    > M = #{ -1 => a, -1.0 => b, 0 => c, 0.0 => d }.
    +#{-1 => a,0 => c,-1.0 => b,0.0 => d}
    +> ArithOrdI = maps:iterator(M, fun(A, B) -> A =< B end), ok.
     ok
    -> maps:to_list(ArithOrdI).
    -[{-1,a},{-1.0,b},{0,c},{0.0,d}]
    -> ArithRevI = maps:iterator(M, fun(A, B) -> B < A end), ok.
    +> maps:to_list(ArithOrdI).
    +[{-1,a},{-1.0,b},{0,c},{0.0,d}]
    +> ArithRevI = maps:iterator(M, fun(A, B) -> B < A end), ok.
     ok
    -> maps:to_list(ArithRevI).
    -[{0.0,d},{0,c},{-1.0,b},{-1,a}]
    +>
    maps:to_list(ArithRevI). +[{0.0,d},{0,c},{-1.0,b},{-1,a}]
    @@ -1381,9 +1381,9 @@

    keys(Map)

    -

    Returns a complete list of keys, in any order, which resides within Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    -  maps:keys(Map).
    -[42,1337,"a"]
    +

    Returns a complete list of keys, in any order, which resides within Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    +  maps:keys(Map).
    +[42,1337,"a"]
    @@ -1421,10 +1421,10 @@

    map(Fun, MapOrIter)

    Key to value Value1 association in MapOrIter in any order. Function fun Fun/2 must return value Value2 to be associated with key Key for the new map Map.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V1) when is_list(K) -> V1*2 end,
    -  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    -  maps:map(Fun,Map).
    -#{"k1" => 2,"k2" => 4,"k3" => 6}
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Example:

    > Fun = fun(K,V1) when is_list(K) -> V1*2 end,
    +  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
    +  maps:map(Fun,Map).
    +#{"k1" => 2,"k2" => 4,"k3" => 6}
    @@ -1455,10 +1455,10 @@

    merge(Map1, Map2)

    Merges two maps into a single map Map3. If two keys exist in both maps, the -value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:merge(Map1,Map2).
    -#{a => 1,b => "value_two",c => 2}
    +value in Map1 is superseded by the value in Map2.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:merge(Map1,Map2).
    +#{a => 1,b => "value_two",c => 2}
    @@ -1498,10 +1498,10 @@

    merge_with(Combiner, Map1, Map2)

    the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    -  Map2 = #{a => 1, c => 2},
    -  maps:merge_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    -#{a => {"value_one",1},b => "value_two",c => 2}
    +three arguments.

    Example:

    > Map1 = #{a => "value_one", b => "value_two"},
    +  Map2 = #{a => 1, c => 2},
    +  maps:merge_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
    +#{a => {"value_one",1},b => "value_two",c => 2}
    @@ -1564,17 +1564,17 @@

    next(Iterator)

    Returns the next key-value association in Iterator and a new iterator for the -remaining associations in the iterator.

    If there are no more associations in the iterator, none is returned.

    Example:

    > Map = #{a => 1, b => 2, c => 3}.
    -#{a => 1,b => 2,c => 3}
    -> I = maps:iterator(Map), ok.
    +remaining associations in the iterator.

    If there are no more associations in the iterator, none is returned.

    Example:

    > Map = #{a => 1, b => 2, c => 3}.
    +#{a => 1,b => 2,c => 3}
    +> I = maps:iterator(Map), ok.
     ok
    -> {K1, V1, I1} = maps:next(I), {K1, V1}.
    -{a,1}
    -> {K2, V2, I2} = maps:next(I1), {K2, V2}.
    -{b,2}
    -> {K3, V3, I3} = maps:next(I2), {K3, V3}.
    -{c,3}
    -> maps:next(I3).
    +> {K1, V1, I1} = maps:next(I), {K1, V1}.
    +{a,1}
    +> {K2, V2, I2} = maps:next(I1), {K2, V2}.
    +{b,2}
    +> {K3, V3, I3} = maps:next(I2), {K3, V3}.
    +{c,3}
    +> maps:next(I3).
     none
    @@ -1608,12 +1608,12 @@

    put(Key, Value, Map1)

    Associates Key with value Value and inserts the association into map Map2. If key Key already exists in map Map1, the old associated value is replaced by value Value. The function returns a new map Map2 containing the new -association and the old associations in Map1.

    The call fails with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => 1}.
    -#{"a" => 1}
    -> maps:put("a", 42, Map).
    -#{"a" => 42}
    -> maps:put("b", 1337, Map).
    -#{"a" => 1,"b" => 1337}
    +association and the old associations in Map1.

    The call fails with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => 1}.
    +#{"a" => 1}
    +> maps:put("a", 42, Map).
    +#{"a" => 42}
    +> maps:put("b", 1337, Map).
    +#{"a" => 1,"b" => 1337}
    @@ -1644,12 +1644,12 @@

    remove(Key, Map1)

    Removes the Key, if it exists, and its associated value from Map1 and -returns a new map Map2 without key Key.

    The call fails with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => 1}.
    -#{"a" => 1}
    -> maps:remove("a",Map).
    -#{}
    -> maps:remove("b",Map).
    -#{"a" => 1}
    +returns a new map Map2 without key Key.

    The call fails with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => 1}.
    +#{"a" => 1}
    +> maps:remove("a",Map).
    +#{}
    +> maps:remove("b",Map).
    +#{"a" => 1}
    @@ -1680,8 +1680,8 @@

    size(Map)

    Returns the number of key-value associations in Map. This operation occurs in -constant time.

    Example:

    > Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  maps:size(Map).
    +constant time.

    Example:

    > Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  maps:size(Map).
     3
    @@ -1714,11 +1714,11 @@

    take(Key, Map1)

    The function removes the Key, if it exists, and its associated value from Map1 and returns a tuple with the removed Value and the new map Map2 -without key Key. If the key does not exist error is returned.

    The call will fail with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => "hello", "b" => "world"}.
    -#{"a" => "hello", "b" => "world"}
    -> maps:take("a",Map).
    -{"hello",#{"b" => "world"}}
    -> maps:take("does not exist",Map).
    +without key Key. If the key does not exist error is returned.

    The call will fail with a {badmap,Map} exception if Map1 is not a map.

    Example:

    > Map = #{"a" => "hello", "b" => "world"}.
    +#{"a" => "hello", "b" => "world"}
    +> maps:take("a",Map).
    +{"hello",#{"b" => "world"}}
    +> maps:take("does not exist",Map).
     error
    @@ -1753,12 +1753,12 @@

    to_list(MapOrIterator)

    Returns a list of pairs representing the key-value associations of MapOrIterator, where the pairs [{K1,V1}, ..., {Kn,Vn}] are returned in arbitrary order.

    The call fails with a {badmap,Map} exception if MapOrIterator is not a map -or an iterator obtained by a call to iterator/1 or iterator/2.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    -  maps:to_list(Map).
    -[{42,value_three},{1337,"value two"},{"a",1}]

    Example (using iterator/2):

    > Map = #{ z => 1, y => 2, x => 3 }.
    -#{x => 3,y => 2,z => 1}
    -> maps:to_list(maps:iterator(Map, ordered)).
    -[{x,3},{y,2},{z,1}]
    +or an iterator obtained by a call to iterator/1 or iterator/2.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    +  maps:to_list(Map).
    +[{42,value_three},{1337,"value two"},{"a",1}]

    Example (using iterator/2):

    > Map = #{ z => 1, y => 2, x => 3 }.
    +#{x => 3,y => 2,z => 1}
    +> maps:to_list(maps:iterator(Map, ordered)).
    +[{x,3},{y,2},{z,1}]
    @@ -1791,10 +1791,10 @@

    update(Key, Value, Map1)

    If Key exists in Map1, the old associated value is replaced by value Value. The function returns a new map Map2 containing the new associated value.

    The call fails with a {badmap,Map} exception if Map1 is not a map, or with a -{badkey,Key} exception if no value is associated with Key.

    Example:

    > Map = #{"a" => 1}.
    -#{"a" => 1}
    -> maps:update("a", 42, Map).
    -#{"a" => 42}
    +{badkey,Key} exception if no value is associated with Key.

    Example:

    > Map = #{"a" => 1}.
    +#{"a" => 1}
    +> maps:update("a", 42, Map).
    +#{"a" => 42}
    @@ -1830,10 +1830,10 @@

    update_with(Key, Fun, Map1)

    Update a value in a Map1 associated with Key by calling Fun on the old value to get a new value. An exception {badkey,Key} is generated if Key is -not present in the map.

    Example:

    > Map = #{"counter" => 1},
    -  Fun = fun(V) -> V + 1 end,
    -  maps:update_with("counter",Fun,Map).
    -#{"counter" => 2}
    +not present in the map.

    Example:

    > Map = #{"counter" => 1},
    +  Fun = fun(V) -> V + 1 end,
    +  maps:update_with("counter",Fun,Map).
    +#{"counter" => 2}
    @@ -1869,10 +1869,10 @@

    update_with(Key, Fun, Init, Map1)

    Update a value in a Map1 associated with Key by calling Fun on the old value to get a new value. If Key is not present in Map1 then Init will be -associated with Key.

    Example:

    > Map = #{"counter" => 1},
    -  Fun = fun(V) -> V + 1 end,
    -  maps:update_with("new counter",Fun,42,Map).
    -#{"counter" => 1,"new counter" => 42}
    +associated with Key.

    Example:

    > Map = #{"counter" => 1},
    +  Fun = fun(V) -> V + 1 end,
    +  maps:update_with("new counter",Fun,42,Map).
    +#{"counter" => 1,"new counter" => 42}
    @@ -1902,9 +1902,9 @@

    values(Map)

    -

    Returns a complete list of values, in arbitrary order, contained in map Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    -  maps:values(Map).
    -[value_three,"value two",1]
    +

    Returns a complete list of values, in arbitrary order, contained in map Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    +  maps:values(Map).
    +[value_three,"value two",1]
    @@ -1936,10 +1936,10 @@

    with(Ks, Map1)

    Returns a new map Map2 with the keys K1 through Kn and their associated values from map Map1. Any key in Ks that does not exist in Map1 is -ignored.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    -  Ks = ["a",42,"other key"],
    -  maps:with(Ks,Map).
    -#{42 => value_three,"a" => 1}
    +ignored.

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    +  Ks = ["a",42,"other key"],
    +  maps:with(Ks,Map).
    +#{42 => value_three,"a" => 1}
    @@ -1970,10 +1970,10 @@

    without(Ks, Map1)

    Returns a new map Map2 without keys K1 through Kn and their associated -values from map Map1. Any key in Ks that does not exist in Map1 is ignored

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    -  Ks = ["a",42,"other key"],
    -  maps:without(Ks,Map).
    -#{1337 => "value two"}
    +values from map Map1. Any key in Ks that does not exist in Map1 is ignored

    Example:

    > Map = #{42 => value_three,1337 => "value two","a" => 1},
    +  Ks = ["a",42,"other key"],
    +  maps:without(Ks,Map).
    +#{1337 => "value two"}
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/ms_transform.html b/prs/8803/lib/stdlib-6.0.1/doc/html/ms_transform.html index b1e71231128d3..88918c44afc22 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/ms_transform.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/ms_transform.html @@ -154,31 +154,31 @@

    table and construct a list of tuples containing relevant parts of the data in these rows. One can use ets:foldl/3 instead, but the ets:select/2 call is far more efficient. Without the translation provided by ms_transform, one must -struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
    +struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
                   surname,   %Surname of the employee
                   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]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    - {emp,"041231","Doe","John",prod,2001},
    - {emp,"052341","Smith","John",dev,1997},
    - {emp,"076324","Smith","Ella",sales,1995},
    - {emp,"122334","Weston","Anna",prod,2002},
    - {emp,"535216","Chalker","Samuel",adm,1998},
    - {emp,"789789","Harrysson","Joe",adm,1996},
    - {emp,"963721","Scott","Juliana",dev,2003},
    - {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, -there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    -[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    + {emp,"041231","Doe","John",prod,2001},
    + {emp,"052341","Smith","John",dev,1997},
    + {emp,"076324","Smith","Ella",sales,1995},
    + {emp,"122334","Weston","Anna",prod,2002},
    + {emp,"535216","Chalker","Samuel",adm,1998},
    + {emp,"789789","Harrysson","Joe",adm,1996},
    + {emp,"963721","Scott","Juliana",dev,2003},
    + {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, +there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    +[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still unreadable, and one has little control over the returned result. It is always a -list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    -             (_,Acc) -> Acc
    +list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    +             (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only + [], + emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only problem is that all the data from the table must be transferred from the table to the calling process for filtering. That is inefficient compared to the ets:match/2 call where the filtering can be done "inside" the emulator and -only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to +only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to write. The first element of the tuple, #emp{empno = '$1', dept = sales, _='_'}, tells what to match. Elements not matching this are not returned, as in the ets:match/2 example. The second @@ -189,12 +189,12 @@

    hence the employee number is returned. The result is ["011103","076324"], as in the ets:foldr/3 example, but the result is retrieved much more efficiently in terms of execution speed and memory consumption.

    Using ets:fun2ms/1, we can combine the ease of use of the ets:foldr/3 and -the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, dept = sales}) ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, dept = sales}) ->
                                   E
    -                      end)).

    This example requires no special knowledge of match specifications to + end)).

    This example requires no special knowledge of match specifications to understand. The head of the fun matches what you want to filter out and the body returns what you want returned. As long as the fun can be kept within the limits of the match specifications, there is no need to transfer all table data to the @@ -216,22 +216,22 @@

    Assume that we want to get all the employee numbers of employees hired before year 2000. Using ets:match/2 is not an alternative here, as relational operators cannot be expressed there. Once again, ets:foldr/3 can do it -(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    -                  (_,Acc) -> Acc
    +(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    +                  (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The + [], + emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The equivalent expression using a handwritten match specification would look like -this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    -                     [{'<', '$2', 2000}],
    -                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and +this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    +                     [{'<', '$2', 2000}],
    +                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and therefore discards anything that does not have an empyear (bound to '$2' in -the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
                                E
    -                      end)).

    + end)).

    @@ -239,11 +239,11 @@

    Assume that we want the whole object matching instead of only one element. One alternative is to assign a variable to every part of the record and build it up -once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(Obj = #emp{empno = E, empyear = Y})
    +once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(Obj = #emp{empno = E, empyear = Y})
                              when Y < 2000 ->
                                   Obj
    -                      end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched + end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched object using a "match inside the match", that is, a =. Unfortunately in funs translated to match specifications, it is allowed only at the "top-level", that is, matching the whole object arriving to be matched into a separate variable. @@ -258,10 +258,10 @@

    This example concerns the body of the fun. Assume that all employee numbers beginning with zero (0) must be changed to begin with one (1) instead, and -that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = [$0 | Rest] }) ->
    -                              {[$0|Rest],[$1|Rest]}
    -                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, +that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = [$0 | Rest] }) ->
    +                              {[$0|Rest],[$1|Rest]}
    +                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, so that not the whole table needs to be searched, only the part containing keys beginning with 0 is looked into.

    @@ -274,24 +274,24 @@

    {rookie, <employee number>}.
  • For all other employees, return {newbie, <employee number>}, except for those named Smith as they would be affronted by anything other than the tag guru and that is also what is returned for their numbers: -{guru, <employee number>}.
  • This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, surname = "Smith" }) ->
    -                              {guru,E};
    -                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    -                              {inventory, E};
    -                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    -                              {newbie, E};
    -                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    -                              {rookie, E}
    -                      end)).

    The result is as follows:

    [{rookie,"011103"},
    - {rookie,"041231"},
    - {guru,"052341"},
    - {guru,"076324"},
    - {newbie,"122334"},
    - {rookie,"535216"},
    - {inventory,"789789"},
    - {newbie,"963721"},
    - {rookie,"989891"}]

    +{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, surname = "Smith" }) ->
    +                              {guru,E};
    +                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    +                              {inventory, E};
    +                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    +                              {newbie, E};
    +                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    +                              {rookie, E}
    +                      end)).

    The result is as follows:

    [{rookie,"011103"},
    + {rookie,"041231"},
    + {guru,"052341"},
    + {guru,"076324"},
    + {newbie,"122334"},
    + {rookie,"535216"},
    + {inventory,"789789"},
    + {newbie,"963721"},
    + {rookie,"989891"}]

    @@ -338,18 +338,18 @@

    more, as filtering using Erlang code is not a good idea when tracing (except afterwards, if you trace to file). The concept is similar to that of ets:fun2ms/1 except that you usually use it directly from the shell (which can -also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
    +also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
     
    --export([start/1, store/2, retrieve/1]).
    +-export([start/1, store/2, retrieve/1]).
     
    -start(Args) ->
    -    toy_table = ets:new(toy_table, Args).
    +start(Args) ->
    +    toy_table = ets:new(toy_table, Args).
     
    -store(Key, Value) ->
    -    ets:insert(toy_table, {Key,Value}).
    +store(Key, Value) ->
    +    ets:insert(toy_table, {Key,Value}).
     
    -retrieve(Key) ->
    -    [{Key, Value}] = ets:lookup(toy_table, Key),
    +retrieve(Key) ->
    +    [{Key, Value}] = ets:lookup(toy_table, Key),
         Value.

    During model testing, the first test results in {badmatch,16} in {toy,start,1}, why?

    We suspect the ets:new/2 call, as we match hard on the return value, but want only the particular new/2 call with toy_table as first parameter. So we @@ -358,32 +358,32 @@

    trace pattern, so there is no need to call trace only a few processes (usually it is not):

    2> dbg:p(all,call).
     {ok,[{matched,nonode@nohost,25}]}

    We specify the filter, we want to view calls that resemble -ets:new(toy_table, <something>):

    3> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> true end)).
    -{ok,[{matched,nonode@nohost,1},{saved,1}]}

    As can be seen, the fun used with dbg:fun2ms/1 takes a single list as +ets:new(toy_table, <something>):

    3> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> true end)).
    +{ok,[{matched,nonode@nohost,1},{saved,1}]}

    As can be seen, the fun used with dbg:fun2ms/1 takes a single list as parameter instead of a single tuple. The list matches a list of the parameters to the traced function. A single variable can also be used. The body of the fun expresses, in a more imperative way, actions to be taken if the fun head (and the guards) matches. true is returned here, only because the body of a fun -cannot be empty. The return value is discarded.

    The following trace output is received during test:

    (<0.86.0>) call ets:new(toy_table, [ordered_set])

    Assume that we have not found the problem yet, and want to see what ets:new/2 -returns. We use a slightly different trace pattern:

    4> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> return_trace() end)).

    The following trace output is received during test:

    (<0.86.0>) call ets:new(toy_table,[ordered_set])
    -(<0.86.0>) returned from ets:new/2 -> 24

    The call to return_trace results in a trace message when the function returns. +cannot be empty. The return value is discarded.

    The following trace output is received during test:

    (<0.86.0>) call ets:new(toy_table, [ordered_set])

    Assume that we have not found the problem yet, and want to see what ets:new/2 +returns. We use a slightly different trace pattern:

    4> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> return_trace() end)).

    The following trace output is received during test:

    (<0.86.0>) call ets:new(toy_table,[ordered_set])
    +(<0.86.0>) returned from ets:new/2 -> 24

    The call to return_trace results in a trace message when the function returns. It applies only to the specific function call triggering the match specification (and matching the head/guards of the match specification). This is by far the most common call in the body of a dbg match specification.

    The test now fails with {badmatch,24} because the atom toy_table does not match the number returned for an unnamed table. So, the problem is found, the table is to be named, and the arguments supplied by the test program do not -include named_table. We rewrite the start function:

    start(Args) ->
    -    toy_table = ets:new(toy_table, [named_table|Args]).

    With the same tracing turned on, the following trace output is received:

    (<0.86.0>) call ets:new(toy_table,[named_table,ordered_set])
    -(<0.86.0>) returned from ets:new/2 -> toy_table

    Assume that the module now passes all testing and goes into the system. After a +include named_table. We rewrite the start function:

    start(Args) ->
    +    toy_table = ets:new(toy_table, [named_table|Args]).

    With the same tracing turned on, the following trace output is received:

    (<0.86.0>) call ets:new(toy_table,[named_table,ordered_set])
    +(<0.86.0>) returned from ets:new/2 -> toy_table

    Assume that the module now passes all testing and goes into the system. After a while, it is found that table toy_table grows while the system is running and that there are many elements with atoms as keys. We expected only integer keys and so does the rest of the system, but clearly not the entire system. We turn -on call tracing and try to see calls to the module with an atom as the key:

    1> dbg:tracer().
    -{ok,<0.88.0>}
    -2> dbg:p(all,call).
    -{ok,[{matched,nonode@nohost,25}]}
    -3> dbg:tpl(toy,store,dbg:fun2ms(fun([A,_]) when is_atom(A) -> true end)).
    -{ok,[{matched,nonode@nohost,1},{saved,1}]}

    We use dbg:tpl/3 to ensure to catch local calls (assume that the module has +on call tracing and try to see calls to the module with an atom as the key:

    1> dbg:tracer().
    +{ok,<0.88.0>}
    +2> dbg:p(all,call).
    +{ok,[{matched,nonode@nohost,25}]}
    +3> dbg:tpl(toy,store,dbg:fun2ms(fun([A,_]) when is_atom(A) -> true end)).
    +{ok,[{matched,nonode@nohost,1},{saved,1}]}

    We use dbg:tpl/3 to ensure to catch local calls (assume that the module has grown since the smaller version and we are unsure if this inserting of atoms is not done locally). When in doubt, always use local call tracing.

    Assume that nothing happens when tracing in this way. The function is never called with these parameters. We conclude that someone else (some other module) @@ -391,11 +391,11 @@

    calling function. The calling function can be retrieved using the match specification function caller. To get it into the trace message, the match specification function message must be used. The filter call looks like this -(looking for calls to ets:insert/2):

    4> dbg:tpl(ets,insert,dbg:fun2ms(fun([toy_table,{A,_}]) when is_atom(A) ->
    -                                    message(caller())
    -                                  end)).
    -{ok,[{matched,nonode@nohost,1},{saved,2}]}

    The caller is now displayed in the "additional message" part of the trace -output, and the following is displayed after a while:

    (<0.86.0>) call ets:insert(toy_table,{garbage,can}) ({evil_mod,evil_fun,2})

    You have realized that function evil_fun of the evil_mod module, with arity +(looking for calls to ets:insert/2):

    4> dbg:tpl(ets,insert,dbg:fun2ms(fun([toy_table,{A,_}]) when is_atom(A) ->
    +                                    message(caller())
    +                                  end)).
    +{ok,[{matched,nonode@nohost,1},{saved,2}]}

    The caller is now displayed in the "additional message" part of the trace +output, and the following is displayed after a while:

    (<0.86.0>) call ets:insert(toy_table,{garbage,can}) ({evil_mod,evil_fun,2})

    You have realized that function evil_fun of the evil_mod module, with arity 2, is causing all this trouble.

    This example illustrates the most used calls in match specifications for dbg. The other, more esoteric, calls are listed and explained in Match specifications in Erlang in ERTS User's Guide, @@ -430,26 +430,26 @@

    [{{'$1','$2'},[{is_atom,'$1'}],['$2']}].

  • Variables that are not included in the head are imported from the environment and made into match specification const expressions. Example from the shell:

    1> X = 25.
     25
    -2> ets:fun2ms(fun({A,B}) when A > X -> B end).
    -[{{'$1','$2'},[{'>','$1',{const,25}}],['$2']}]
  • Matching with = cannot be used in the body. It can only be used on the -top-level in the head of the fun. Example from the shell again:

    1> ets:fun2ms(fun({A,[B|C]} = D) when A > B -> D end).
    -[{{'$1',['$2'|'$3']},[{'>','$1','$2'}],['$_']}]
    -2> ets:fun2ms(fun({A,[B|C]=D}) when A > B -> D end).
    -Error: fun with head matching ('=' in head) cannot be translated into
    +2> ets:fun2ms(fun({A,B}) when A > X -> B end).
    +[{{'$1','$2'},[{'>','$1',{const,25}}],['$2']}]
  • Matching with = cannot be used in the body. It can only be used on the +top-level in the head of the fun. Example from the shell again:

    1> ets:fun2ms(fun({A,[B|C]} = D) when A > B -> D end).
    +[{{'$1',['$2'|'$3']},[{'>','$1','$2'}],['$_']}]
    +2> ets:fun2ms(fun({A,[B|C]=D}) when A > B -> D end).
    +Error: fun with head matching ('=' in head) cannot be translated into
     match_spec
    -{error,transform_error}
    -3> ets:fun2ms(fun({A,[B|C]}) when A > B -> D = [B|C], D end).
    -Error: fun with body matching ('=' in body) is illegal as match_spec
    -{error,transform_error}

    All variables are bound in the head of a match specification, so the +{error,transform_error} +3> ets:fun2ms(fun({A,[B|C]}) when A > B -> D = [B|C], D end). +Error: fun with body matching ('=' in body) is illegal as match_spec +{error,transform_error}

  • All variables are bound in the head of a match specification, so the translator cannot allow multiple bindings. The special case when matching is done on the top-level makes the variable bind to '$_' in the resulting match specification. It is to allow a more natural access to the whole matched -object. Pseudo function object() can be used instead, see below.

    The following expressions are translated equally:

    ets:fun2ms(fun({a,_} = A) -> A end).
    -ets:fun2ms(fun({a,_}) -> object() end).
  • The special match specification variables '$_' and '$*' can be accessed +object. Pseudo function object() can be used instead, see below.

    The following expressions are translated equally:

    ets:fun2ms(fun({a,_} = A) -> A end).
    +ets:fun2ms(fun({a,_}) -> object() end).
  • The special match specification variables '$_' and '$*' can be accessed through the pseudo functions object() (for '$_') and bindings() (for '$*'). As an example, one can translate the following ets:match_object/2 -call to a ets:select/2 call:

    ets:match_object(Table, {'$1',test,'$2'}).

    This is the same as:

    ets:select(Table, ets:fun2ms(fun({A,test,B}) -> object() end)).

    In this simple case, the former expression is probably preferable in terms of -readability.

    The ets:select/2 call conceptually looks like this in the resulting code:

    ets:select(Table, [{{'$1',test,'$2'},[],['$_']}]).

    Matching on the top-level of the fun head can be a more natural way to access +call to a ets:select/2 call:

    ets:match_object(Table, {'$1',test,'$2'}).

    This is the same as:

    ets:select(Table, ets:fun2ms(fun({A,test,B}) -> object() end)).

    In this simple case, the former expression is probably preferable in terms of +readability.

    The ets:select/2 call conceptually looks like this in the resulting code:

    ets:select(Table, [{{'$1',test,'$2'},[],['$_']}]).

    Matching on the top-level of the fun head can be a more natural way to access '$_', see above.

  • Term constructions/literals are translated as much as is needed to get them into valid match specification. This way tuples are made into match specification tuple constructions (a one element tuple containing the tuple) diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/notes.html b/prs/8803/lib/stdlib-6.0.1/doc/html/notes.html index 4aa70b0ab3e4d..4fd1b3b5df07b 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/notes.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/notes.html @@ -160,8 +160,8 @@

    Improvements and New Features

    • The functions is_equal/2, map/2, and filtermap/2 have been added to the modules sets, ordsets, and gb_sets.

      Own Id: OTP-18622 Aux Id: PR-7183, PR-7232

    • The compiler now emits nicer error message for function head mismatches. -For example, given:

      a() -> ok;
      -a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
      +For example, given:

      a() -> ok;
      +a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
       %    6| a(_) -> error.
       %     | ^

      while in Erlang/OTP 27 the diagnostic is similar to:

      t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
       %    6| a(_) -> error.
      @@ -194,12 +194,12 @@ 

      shell:prompt_width/1 have been exported to help with custom prompt implementations.

      Own Id: OTP-18834 Aux Id: PR-7675

    • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

      Own Id: OTP-18846 Aux Id: PR-7845

    • The M-h hotkey (Alt/Option-h) now outputs help for the module or function directly before the cursor.

      Own Id: OTP-18847 Aux Id: PR-7846

    • Added support for adding a custom code formatter that formats your multi-line shell commands in your preferred formatting on submission. See shell:format_shell_func/ and shell:erl_pp_format_func/1.

      Own Id: OTP-18848 Aux Id: PR-7847

    • Added shell functions for viewing, forgetting and saving locally defined functions, types and records.

      Own Id: OTP-18852 Aux Id: PR-7844

    • Added string:jaro_similarity/2, which can be used to calculate the similarity between two strings.

      Own Id: OTP-18865 Aux Id: PR-7879

    • The new function ets:update_element/4 is similar to ets:update_element/3, but takes a default tuple as the fourth argument, which will be inserted if no previous record with that key exists.

      Own Id: OTP-18870 Aux Id: PR-7857

    • Added functions to retrieve the next higher or lower key/element from gb_trees and gb_sets, as well as returning iterators that start at given keys/elements.

      Own Id: OTP-18874 Aux Id: PR-7745

    • When the shell built-in function c/1,2 is used to re-compile a module, the current working directory of the original compilation is now added to the include path.

      Own Id: OTP-18908 Aux Id: PR-7957

    • The timer module now uses a private table for its internal state, slightly improving its performance.

      Own Id: OTP-18914 Aux Id: PR-7973

    • EEP-59 - Documentation Attributes has been implemented.

      Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

      • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

      • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

      • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

      • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

      Own Id: OTP-18923 Aux Id: PR-6791

    • The maybe expression is now enabled by default.

      To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

      -feature(maybe_expr, disable).

      Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

      erlc -disable-feature maybe_expr some_file.erl

      Own Id: OTP-18944 Aux Id: PR-8067

    • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

      -module(t).
      --export([f/0]).
      --record(r, {a,b,c}).
      +spec attributes are missing in documented functions, types, and callbacks.

    • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

    • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

    Own Id: OTP-18916 Aux Id: PR-7936

  • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

    Own Id: OTP-18923 Aux Id: PR-6791

  • The maybe expression is now enabled by default.

    To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

    -feature(maybe_expr, disable).

    Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

    erlc -disable-feature maybe_expr some_file.erl

    Own Id: OTP-18944 Aux Id: PR-8067

  • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

    -module(t).
    +-export([f/0]).
    +-record(r, {a,b,c}).
     
    -f() ->
    -    #r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
    +f() ->
    +    #r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
     t.erl:6:12: Warning: expression updates a literal
     %    6|     #r{a=1}#r{b=2}.
     %     |            ^

    Own Id: OTP-18951 Aux Id: PR-8069

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Optimized ets:foldl and ets:foldr to use new ets:next_lookup. Also made them immune against table renaming.

    Own Id: OTP-18993 Aux Id: PR-8048

  • Windows now supports all functions in math.

    Own Id: OTP-19001 Aux Id: PR-8164

  • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

    The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

    You can use nowarn_deprecated_callback to silence the warning.

    Own Id: OTP-19010 Aux Id: PR-8205

  • There is a new module json for encoding and decoding JSON.

    Both encoding and decoding can be customized. Decoding can be done in a SAX-like fashion and handle multiple documents and streams of data.

    Own Id: OTP-19020 Aux Id: PR-8111

  • diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/orddict.html b/prs/8803/lib/stdlib-6.0.1/doc/html/orddict.html index ee6ce6be1cf71..4630cbdbcac6b 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/orddict.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/orddict.html @@ -142,13 +142,13 @@

    Functions append/3 and append_list/3 are included so that keyed values can be stored in a list accumulator, for -example:

    > D0 = orddict:new(),
    -  D1 = orddict:store(files, [], D0),
    -  D2 = orddict:append(files, f1, D1),
    -  D3 = orddict:append(files, f2, D2),
    -  D4 = orddict:append(files, f3, D3),
    -  orddict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +example:

    > D0 = orddict:new(),
    +  D1 = orddict:store(files, [], D0),
    +  D2 = orddict:append(files, f1, D1),
    +  D3 = orddict:append(files, f2, D2),
    +  D4 = orddict:append(files, f3, D3),
    +  orddict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch/2 is to be used if the key is known to be in the dictionary, otherwise function find/2.

    @@ -537,16 +537,16 @@

    append(Key, Value, Orddict1)

    Appends a new Value to the current list of values associated with Key. An exception is generated if the initial value associated with Key is not a list -of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    -[{x,[1]}]
    -3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    -[{x,[1,2]}]
    -4> orddict:append(y, 3, OrdDict3).
    -[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    -[{a,no_list}]
    -2> orddict:append(a, 1, OrdDict1).
    +of values.

    See also section Notes.

    Example 1:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append(x, 1, OrdDict1).
    +[{x,[1]}]
    +3> OrdDict3 = orddict:append(x, 2, OrdDict2).
    +[{x,[1,2]}]
    +4> orddict:append(y, 3, OrdDict3).
    +[{x,[1,2]},{y,[3]}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, no_list}]).
    +[{a,no_list}]
    +2> orddict:append(a, 1, OrdDict1).
     ** exception error: bad argument
          in operator  ++/2
             called as no_list ++ [1]
    @@ -583,12 +583,12 @@

    append_list(Key, ValList, Orddict1)

    Appends a list of values ValList to the current list of values associated with Key. An exception is generated if the initial value associated with Key is -not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    -[{x,[]}]
    -2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    -[{x,[1,2]}]
    -3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    -[{x,[1,2]},{y,[3,4]}]
    +not a list of values.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{x, []}]).
    +[{x,[]}]
    +2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
    +[{x,[1,2]}]
    +3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
    +[{x,[1,2]},{y,[3,4]}]
    @@ -617,10 +617,10 @@

    erase(Key, Orddict1)

    -

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:erase(a, OrdDict1).
    -[{b,2}]
    +

    Erases all items with a specified key from a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:erase(a, OrdDict1).
    +[{b,2}]
    @@ -650,11 +650,11 @@

    fetch(Key, Orddict)

    Returns the value associated with Key in dictionary Orddict. This function assumes that the Key is present in the dictionary. An exception is generated -if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch(a, OrdDict1).
    +if Key is not in the dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch(a, OrdDict1).
     1
    -3> orddict:fetch(missing, OrdDict1).
    +3> orddict:fetch(missing, OrdDict1).
     ** exception error: no function clause matching orddict:fetch(missing,[])
    @@ -683,10 +683,10 @@

    fetch_keys(Orddict)

    -

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fetch_keys(OrdDict1).
    -[a,b]
    +

    Returns a list of all keys in a dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fetch_keys(OrdDict1).
    +[a,b]
    @@ -719,10 +719,10 @@

    filter(Pred, Orddict1)

    Orddict2 is a dictionary of all keys and values in Orddict1 for which -Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    -[{b,2}]
    +Pred(Key, Value) is true.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
    +[{b,2}]
    @@ -752,11 +752,11 @@

    find(Key, Orddict)

    Searches for a key in a dictionary. Returns {ok, Value}, where Value is the value associated with Key, or error if the key is not present in the -dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:find(a, OrdDict1).
    -{ok,1}
    -3> orddict:find(c, OrdDict1).
    +dictionary.

    See also section Notes.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:find(a, OrdDict1).
    +{ok,1}
    +3> orddict:find(c, OrdDict1).
     error
    @@ -794,10 +794,10 @@

    fold(Fun, Acc0, Orddict)

    Calls Fun on successive keys and values of Orddict together with an extra argument Acc (short for accumulator). Fun must return a new accumulator that -is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    -[{b,102},{a,101}]
    +is passed to the next call. Acc0 is returned if the list is empty.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
    +[{b,102},{a,101}]
    @@ -916,10 +916,10 @@

    map(Fun, Orddict1)

    Calls Fun on successive keys and values of Orddict1 to return a new value -for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    -[{a,101},{b,102}]
    +for each key.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
    +[{a,101},{b,102}]
    @@ -955,15 +955,15 @@

    merge(Fun, Orddict1, Orddict2)

    Merges two dictionaries, Orddict1 and Orddict2, to create a new dictionary. All the Key-Value pairs from both dictionaries are included in the new dictionary.

    If a key occurs in both dictionaries, Fun is called with the key -and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    -[{b,7},{c,8}]
    -3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    -[{a,1},{b,14},{c,8}]
    +and both values to return a new value.

    merge/3 can be defined as follows, but is faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
    +[{b,7},{c,8}]
    +3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
    +[{a,1},{b,14},{c,8}]
    @@ -1049,12 +1049,12 @@

    store(Key, Value, Orddict1)

    Stores a Key-Value pair in a dictionary. If the Key already exists in -Orddict1, the associated value is replaced by Value.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:store(a, 99, OrdDict1).
    -[{a,99},{b,2}]
    -3> orddict:store(c, 100, OrdDict1).
    -[{a,1},{b,2},{c,100}]
    +Orddict1, the associated value is replaced by Value.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:store(a, 99, OrdDict1).
    +[{a,99},{b,2}]
    +3> orddict:store(c, 100, OrdDict1).
    +[{a,1},{b,2},{c,100}]
    @@ -1090,11 +1090,11 @@

    take(Key, Orddict)

    This function returns value from dictionary and new dictionary without this -value. Returns error if the key is not present in the dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:take(a, OrdDict1).
    -{1,[{b,2}]}
    -3> orddict:take(missing, OrdDict1).
    +value. Returns error if the key is not present in the dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:take(a, OrdDict1).
    +{1,[{b,2}]}
    +3> orddict:take(missing, OrdDict1).
     error
    @@ -1156,10 +1156,10 @@

    update(Key, Fun, Orddict1)

    Updates a value in a dictionary by calling Fun on the value to get a new -value. An exception is generated if Key is not present in the dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:update(a, fun (V) -> V + 100 end, OrdDict1).
    -[{a,101},{b,2}]
    +value. An exception is generated if Key is not present in the dictionary.

    Example:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:update(a, fun (V) -> V + 100 end, OrdDict1).
    +[{a,101},{b,2}]
    @@ -1194,14 +1194,14 @@

    update(Key, Fun, Initial, Orddict1)

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value.

    For example, append/3 can be defined as follows:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).

    Example 1:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:update(c, fun (V) -> V + 100 end, 99, OrdDict1).
    -[{a,1},{b,2},{c,99}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    -[{a,1},{b,2}]
    -2> orddict:update(a, fun (V) -> V + 100 end, 99, OrdDict1).
    -[{a,101},{b,2}]
    +first value.

    For example, append/3 can be defined as follows:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).

    Example 1:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:update(c, fun (V) -> V + 100 end, 99, OrdDict1).
    +[{a,1},{b,2},{c,99}]

    Example 2:

    1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
    +[{a,1},{b,2}]
    +2> orddict:update(a, fun (V) -> V + 100 end, 99, OrdDict1).
    +[{a,101},{b,2}]
    @@ -1235,8 +1235,8 @@

    update_counter(Key, Increment, Orddict1)Adds Increment to the value associated with Key and store this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/peer.html b/prs/8803/lib/stdlib-6.0.1/doc/html/peer.html index c2be24a879086..ebc0f27b0fe9c 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/peer.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/peer.html @@ -161,127 +161,127 @@

    manual analysis. If the test case fails, the CRASH REPORT contains these arguments
  • multiple test cases can run concurrently speeding up overall testing process, peer node names are unique even when there are multiple instances of the same -test suite running in parallel
  • -module(my_SUITE).
    --behaviour(ct_suite).
    --export([all/0, groups/0]).
    --export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
    +test suite running in parallel
    -module(my_SUITE).
    +-behaviour(ct_suite).
    +-export([all/0, groups/0]).
    +-export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -groups() ->
    -    [{quick, [parallel],
    -        [basic, args, named, restart_node, multi_node]}].
    +groups() ->
    +    [{quick, [parallel],
    +        [basic, args, named, restart_node, multi_node]}].
     
    -all() ->
    -    [{group, quick}].
    +all() ->
    +    [{group, quick}].
     
    -basic(Config) when is_list(Config) ->
    -    {ok, Peer, _Node} = ?CT_PEER(),
    -    peer:stop(Peer).
    +basic(Config) when is_list(Config) ->
    +    {ok, Peer, _Node} = ?CT_PEER(),
    +    peer:stop(Peer).
     
    -args(Config) when is_list(Config) ->
    +args(Config) when is_list(Config) ->
         %% specify additional arguments to the new node
    -    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    -    peer:stop(Peer).
    +    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    +    peer:stop(Peer).
     
    -named(Config) when is_list(Config) ->
    +named(Config) when is_list(Config) ->
         %% pass test case name down to function starting nodes
    -    Peer = start_node_impl(named_test),
    -    peer:stop(Peer).
    +    Peer = start_node_impl(named_test),
    +    peer:stop(Peer).
     
    -start_node_impl(ActualTestCase) ->
    -    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
    +start_node_impl(ActualTestCase) ->
    +    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
         %% extra setup needed for multiple test cases
    -    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
    +    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
         Peer.
     
    -restart_node(Config) when is_list(Config) ->
    -    Name = ?CT_PEER_NAME(),
    -    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    -    peer:stop(Peer),
    +restart_node(Config) when is_list(Config) ->
    +    Name = ?CT_PEER_NAME(),
    +    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    +    peer:stop(Peer),
         %% restart the node with the same name as before
    -    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    -    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    -    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    -        || _ <- lists:seq(1, 4)],
    +    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    +    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    +    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    +        || _ <- lists:seq(1, 4)],
         %% wait for all nodes to complete boot process, get their names:
    -    _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
    -        || {ok, Peer} <- Peers],
    -    [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set -up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    -peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    -    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two + _Nodes = [receive {tag, {started, Node, Peer}} -> Node end + || {ok, Peer} <- Peers], + [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set +up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    +peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    +    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two containers with hostnames "one" and "two". In this example Erlang nodes running -inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    -    Docker = os:find_executable("docker"),
    -    PrivDir = proplists:get_value(priv_dir, Config),
    -    build_release(PrivDir),
    -    build_image(PrivDir),
    +inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    +    Docker = os:find_executable("docker"),
    +    PrivDir = proplists:get_value(priv_dir, Config),
    +    build_release(PrivDir),
    +    build_image(PrivDir),
     
         %% start two Docker containers
    -    {ok, Peer, Node} = peer:start_link(#{name => lambda,
    +    {ok, Peer, Node} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    -    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
    +        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    +    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
    +        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
     
         %% find IP address of the second node using alternative connection RPC
    -    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    -    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    -    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
    +    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    +    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    +    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
     
         %% make first node to discover second one
    -    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    -    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
    +    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    +    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
     
         %% join a cluster
    -    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
    +    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
         %% verify that second peer node has only the first node visible
    -    [Node] = peer:call(Peer2, erlang, nodes, []),
    +    [Node] = peer:call(Peer2, erlang, nodes, []),
     
         %% stop peers, causing containers to also stop
    -    peer:stop(Peer2),
    -    peer:stop(Peer).
    +    peer:stop(Peer2),
    +    peer:stop(Peer).
     
    -build_release(Dir) ->
    +build_release(Dir) ->
         %% load sasl.app file, otherwise application:get_key will fail
    -    application:load(sasl),
    +    application:load(sasl),
         %% create *.rel - release file
    -    RelFile = filename:join(Dir, "lambda.rel"),
    -    Release = {release, {"lambda", "1.0.0"},
    -        {erts, erlang:system_info(version)},
    -        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    -            || App <- [kernel, stdlib, sasl]]},
    -    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    -        io_lib:format("~tp.", [Release])))),
    -    RelFileNoExt = filename:join(Dir, "lambda"),
    +    RelFile = filename:join(Dir, "lambda.rel"),
    +    Release = {release, {"lambda", "1.0.0"},
    +        {erts, erlang:system_info(version)},
    +        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    +            || App <- [kernel, stdlib, sasl]]},
    +    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    +        io_lib:format("~tp.", [Release])))),
    +    RelFileNoExt = filename:join(Dir, "lambda"),
     
         %% create boot script
    -    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    -        [silent, {outdir, Dir}]),
    +    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    +        [silent, {outdir, Dir}]),
         %% package release into *.tar.gz
    -    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
    +    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
     
    -build_image(Dir) ->
    +build_image(Dir) ->
         %% Create Dockerfile example, working only for Ubuntu 20.04
         %% Expose port 4445, and make Erlang distribution to listen
         %%  on this port, and connect to it without EPMD
         %% Set cookie on both nodes to be the same.
    -    BuildScript = filename:join(Dir, "Dockerfile"),
    +    BuildScript = filename:join(Dir, "Dockerfile"),
         Dockerfile =
           "FROM ubuntu:20.04 as runner\n"
           "EXPOSE 4445\n"
           "WORKDIR /opt/lambda\n"
           "COPY lambda.tar.gz /tmp\n"
           "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
    -      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
    +      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
           "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
           " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
           " \"-erl_epmd_port\", \"4445\","
           " \"-setcookie\", \"secret\"]\n",
    -    ok = file:write_file(BuildScript, Dockerfile),
    -    os:cmd("docker build -t lambda " ++ Dir).
    +
    ok = file:write_file(BuildScript, Dockerfile), + os:cmd("docker build -t lambda " ++ Dir).
    @@ -733,11 +733,11 @@

    start_options()

    connection type. Default is true.

  • args - Extra command line arguments to append to the "erl" command. Arguments are passed as is, no escaping or quoting is needed or accepted.

  • post_process_args - Allows the user to change the arguments passed to exec before the peer is started. This can for example be useful when the -exec program wants the arguments to "erl" as a single argument. Example:

    peer:start(#{ name => peer:random_name(),
    -  exec => {os:find_executable("bash"),["-c","erl"]},
    +exec program wants the arguments to "erl" as a single argument. Example:

    peer:start(#{ name => peer:random_name(),
    +  exec => {os:find_executable("bash"),["-c","erl"]},
       post_process_args =>
    -     fun(["-c"|Args]) -> ["-c", lists:flatten(lists:join($\s, Args))] end
    -  }).
  • env - List of environment variables with their values. This list is + fun(["-c"|Args]) -> ["-c", lists:flatten(lists:join($\s, Args))] end + }).

  • env - List of environment variables with their values. This list is applied to a locally started executable. If you need to change the environment of the remote peer, adjust args to contain -env ENV_KEY ENV_VALUE.

  • wait_boot - Specifies the start/start_link timeout. See wait_boot datatype.

  • shutdown - Specifies the peer node stopping behaviour. See diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/proc_lib.html b/prs/8803/lib/stdlib-6.0.1/doc/html/proc_lib.html index 0d0b52b993b58..c963cf6827c50 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/proc_lib.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/proc_lib.html @@ -995,21 +995,21 @@

    init_ack(Parent, Ret)

    failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1082,21 +1082,21 @@

    init_fail(Parent, Return, Exception)

    started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/proplists.html b/prs/8803/lib/stdlib-6.0.1/doc/html/proplists.html index 23d42f14220e0..8c7ce1ea3cb9f 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/proplists.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/proplists.html @@ -532,7 +532,7 @@

    append_values(Key, ListIn)

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -626,10 +626,10 @@

    expand(Expansions, ListIn)

    first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, 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 because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, 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 because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice 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 occurrence is used.

    See also normalize/2.

    @@ -1034,7 +1034,7 @@

    split(List, Keys)

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1157,7 +1157,7 @@

    to_map(List)

    an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/qlc.html b/prs/8803/lib/stdlib-6.0.1/doc/html/qlc.html index c15fad95061ac..12e8270220859 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/qlc.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/qlc.html @@ -285,24 +285,24 @@

    If a tuple {finished} exists among the answers to QH, it is returned twice from append/2.

    As another example, consider concatenating the answers to two queries QH1 and QH2 while removing all duplicates. This is accomplished by using option -unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before +unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before returning an answer, it is looked up in the ETS table to check if it has already been returned. Without the unique option, all answers to QH1 would be returned followed by all answers to QH2. The unique option keeps the order between the remaining answers.

    If the order of the answers is not important, there is an alternative to the -unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many +unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many answers, temporary files are used. Notice that to get the first unique answer, all answers must be found and sorted. Both alternatives find duplicates by comparing answers, that is, if A1 and A2 are answers found in that order, then A2 is a removed if A1 == A2.

    To return only a few answers, cursors can be used. The following code returns no -more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    -R = qlc:next_answers(C, 5),
    -ok = qlc:delete_cursor(C),
    +more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    +R = qlc:next_answers(C, 5),
    +ok = qlc:delete_cursor(C),
     R.

    QLCs are convenient for stating constraints on data from two or more tables. The -following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 +following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 and QH2. If, for example, X2 is matched against the key of a QLC table, the lookup join method traverses the objects of QH2 while looking up key values in the table. However, if not X2 or Y2 is matched against the key or an indexed @@ -310,11 +310,11 @@

    both sorted on position 2 and next do the join by traversing the objects one by one.

    Option join can be used to force the qlc module to use a certain join method. For the rest of this section it is assumed that the excessively slow -join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2],
    -      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 +join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2],
    +      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 and QH2, one at a time. If there are M answers to QH1 and N answers to QH2, the filter is run M*N times.

    If QH2 is a call to the function for gb_trees, as defined in section Implementing a QLC Table, then @@ -328,7 +328,7 @@

    no side effects so that the meaning of the query does not change if QH2 is evaluated only once. One way of caching the answers is to evaluate QH2 first of all and substitute the list of answers for QH2 in the query. Another way is -to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first +to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first time, every answer is stored in an ETS table. When the next answer of QH1 is tried, answers to QH2' are copied from the ETS table, which is very fast. As for option unique the cost is a possibly substantial amount of RAM memory.

    Option {cache, list} offers the possibility to store the answers in a list on @@ -350,62 +350,62 @@

    Implementing a QLC Table

    As an example of how to use function table/2, the implementation of a QLC -table for the gb_trees module is given:

    -module(gb_table).
    +table for the gb_trees module is given:

    -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
    +-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 -> []
    +        fun(1, Ks) ->
    +                lists:flatmap(fun(K) ->
    +                                      case gb_trees:lookup(K, T) of
    +                                          {value, V} -> [{K,V}];
    +                                          none -> []
                                           end
    -                              end, Ks)
    +                              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) -> "
    +        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]])
    +                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
             end,
    -    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    -                   {lookup_fun, LookupFun},{key_equality,'=='}]).
    +    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) ->
    -    [].
    +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_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(_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)];
    +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.

    TF is the traversal function. The qlc module requires that there is a way of traversing all objects of the data structure. gb_trees has an iterator function suitable for that purpose. Notice that for each object returned, a new @@ -441,49 +441,49 @@

    example, 2 == 2.0 evaluates to true while 2 =:= 2.0 evaluates to false. Normally this is a minor issue, but the qlc module cannot ignore the difference, which affects the user's choice of operators in QLCs.

    If the qlc module at compile time can determine that some constant is free of -integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    -Q1 = qlc:q([K ||
    -{K} <- ets:table(E1),
    -K == 2.71 orelse K == a]),
    -io:format("~s~n", [qlc:info(Q1)]).
    -ets:match_spec_run(
    -       lists:flatmap(fun(V) ->
    -			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    -				       V)
    +integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    +Q1 = qlc:q([K ||
    +{K} <- ets:table(E1),
    +K == 2.71 orelse K == a]),
    +io:format("~s~n", [qlc:info(Q1)]).
    +ets:match_spec_run(
    +       lists:flatmap(fun(V) ->
    +			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    +				       V)
     		     end,
    -		     [a, 2.71]),
    -       ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have + [a, 2.71]), + ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have been handled. However, if it cannot be determined at compile time that some constant is free of integers, and the table uses =:=/2 when comparing keys for equality (see option key_equality), then the qlc module does not try to look up the constant. The reason is that there is in the general case no upper limit on the number of key values that can compare equal -to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    -true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    -F2 = fun(I) ->
    -qlc:q([V || {K,V} <- ets:table(E2), K == I])
    +to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    +true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    +F2 = fun(I) ->
    +qlc:q([V || {K,V} <- ets:table(E2), K == I])
     end,
    -Q2 = F2({2,2}),
    -io:format("~s~n", [qlc:info(Q2)]).
    -ets:table(#Ref<0.3098908599.2283929601.256125>,
    -          [{traverse,
    -            {select,
    -             [{{'$1', '$2'}, [{'==', '$1', {const, {2, 2}}}], ['$2']}]}}])
    -3> lists:sort(qlc:e(Q2)).
    -[a,b,c]

    Looking up only {2,2} would not return b and c.

    If the table uses ==/2 when comparing keys for equality, the qlc module +Q2 = F2({2,2}), +io:format("~s~n", [qlc:info(Q2)]). +ets:table(#Ref<0.3098908599.2283929601.256125>, + [{traverse, + {select, + [{{'$1', '$2'}, [{'==', '$1', {const, {2, 2}}}], ['$2']}]}}]) +3> lists:sort(qlc:e(Q2)). +[a,b,c]

    Looking up only {2,2} would not return b and c.

    If the table uses ==/2 when comparing keys for equality, the qlc module looks up the constant regardless of which operator is used in the QLC. However, -==/2 is to be preferred:

    4> E3 = ets:new(t, [ordered_set]), % uses ==/2 for key equality
    -true = ets:insert(E3, [{{2,2.0},b}]),
    -F3 = fun(I) ->
    -qlc:q([V || {K,V} <- ets:table(E3), K == I])
    +==/2 is to be preferred:

    4> E3 = ets:new(t, [ordered_set]), % uses ==/2 for key equality
    +true = ets:insert(E3, [{{2,2.0},b}]),
    +F3 = fun(I) ->
    +qlc:q([V || {K,V} <- ets:table(E3), K == I])
     end,
    -Q3 = F3({2,2}),
    -io:format("~s~n", [qlc:info(Q3)]).
    -ets:match_spec_run(ets:lookup(#Ref<0.3098908599.2283929601.256211>,
    -                              {2, 2}),
    -                   ets:match_spec_compile([{{'$1', '$2'}, [], ['$2']}]))
    -5> qlc:e(Q3).
    -[b]

    Lookup join is handled analogously to lookup of constants in a table: if the +Q3 = F3({2,2}), +io:format("~s~n", [qlc:info(Q3)]). +ets:match_spec_run(ets:lookup(#Ref<0.3098908599.2283929601.256211>, + {2, 2}), + ets:match_spec_compile([{{'$1', '$2'}, [], ['$2']}])) +5> qlc:e(Q3). +[b]

    Lookup join is handled analogously to lookup of constants in a table: if the join operator is ==/2, and the table where constants are to be looked up uses =:=/2 when testing keys for equality, then the qlc module does not consider lookup join for that table.

    @@ -1697,15 +1697,15 @@

    cursor(QH, Options)

    and (eventually) delete_cursor/1. Calls erlang:spawn_opt/2 to spawn and link to a process that evaluates the query handle. The value of option spawn_options is used as last argument when calling -spawn_opt/2. Defaults to [link].

    Example:

    1> QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]),
    -QC = qlc:cursor(QH),
    -qlc:next_answers(QC, 1).
    -[{a,1}]
    -2> qlc:next_answers(QC, 1).
    -[{a,2}]
    -3> qlc:next_answers(QC, all_remaining).
    -[{b,1},{b,2}]
    -4> qlc:delete_cursor(QC).
    +spawn_opt/2. Defaults to [link].

    Example:

    1> QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]),
    +QC = qlc:cursor(QH),
    +qlc:next_answers(QC, 1).
    +[{a,1}]
    +2> qlc:next_answers(QC, 1).
    +[{a,2}]
    +3> qlc:next_answers(QC, all_remaining).
    +[{b,1},{b,2}]
    +4> qlc:delete_cursor(QC).
     ok

    @@ -1885,9 +1885,9 @@

    eval(QH, Options)

    Evaluates a query handle in the calling process and collects all answers in a -list.

    Example:

    1> QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]),
    -qlc:eval(QH).
    -[{a,1},{a,2},{b,1},{b,2}]
    +list.

    Example:

    1> QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]),
    +qlc:eval(QH).
    +[{a,1},{a,2},{b,1},{b,2}]
    @@ -1973,8 +1973,8 @@

    fold(Function, Acc0, QH, Options)

    Calls Function on successive answers to the query handle together with an extra argument AccIn.

    The query handle and the function are evaluated in the calling process. Function must return a new accumulator, which is passed to -the next call. Acc0 is returned if there are no answers to the query handle.

    Example:

    1> QH = [1,2,3,4,5,6],
    -qlc:fold(fun(X, Sum) -> X + Sum end, 0, QH).
    +the next call. Acc0 is returned if there are no answers to the query handle.

    Example:

    1> QH = [1,2,3,4,5,6],
    +qlc:fold(fun(X, Sum) -> X + Sum end, 0, QH).
     21
    @@ -2091,59 +2091,59 @@

    info(QH, Options)

    returned.
  • The default is to show all parts of objects and match specifications, but if option {depth, Depth} is specified, parts of terms below a certain depth are replaced by '...'.
  • Examples:

    In the following example two simple QLCs are inserted only to hold option -{unique, true}:

    1> QH = qlc:q([{X,Y} || X <- [x,y], Y <- [a,b]]),
    -io:format("~s~n", [qlc:info(QH, unique_all)]).
    +{unique, true}:

    1> QH = qlc:q([{X,Y} || X <- [x,y], Y <- [a,b]]),
    +io:format("~s~n", [qlc:info(QH, unique_all)]).
     begin
         V1 =
    -        qlc:q([
    +        qlc:q([
                    SQV ||
    -                   SQV <- [x, y]
    -              ],
    -              [{unique, true}]),
    +                   SQV <- [x, y]
    +              ],
    +              [{unique, true}]),
         V2 =
    -        qlc:q([
    +        qlc:q([
                    SQV ||
    -                   SQV <- [a, b]
    -              ],
    -              [{unique, true}]),
    -    qlc:q([
    -           {X,Y} ||
    +                   SQV <- [a, b]
    +              ],
    +              [{unique, true}]),
    +    qlc:q([
    +           {X,Y} ||
                    X <- V1,
                    Y <- V2
    -          ],
    -          [{unique, true}])
    +          ],
    +          [{unique, true}])
     end

    In the following example QLC V2 has been inserted to show the joined generators and the join method chosen. A convention is used for lookup join: the first generator (G2) is the one traversed, the second (G1) is the table -where constants are looked up.

    1> 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]),
    -io:format("~s~n", [qlc:info(Q)]).
    +where constants are looked up.

    1> 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]),
    +io:format("~s~n", [qlc:info(Q)]).
     begin
         V1 =
    -        qlc:q([
    +        qlc:q([
                    P0 ||
    -                   P0 = {W, Y} <-
    -                       ets:table(#Ref<0.3098908599.2283929601.256549>)
    -              ]),
    +                   P0 = {W, Y} <-
    +                       ets:table(#Ref<0.3098908599.2283929601.256549>)
    +              ]),
         V2 =
    -        qlc:q([
    -               [G1 | G2] ||
    +        qlc:q([
    +               [G1 | G2] ||
                        G2 <- V1,
                        G1 <-
    -                       ets:table(#Ref<0.3098908599.2283929601.256548>),
    -                   element(2, G1) =:= element(1, G2)
    -              ],
    -              [{join, lookup}]),
    -    qlc:q([
    -           {X, Z, W} ||
    -               [{X, Z} | {W, Y}] <- V2
    -          ])
    +                       ets:table(#Ref<0.3098908599.2283929601.256548>),
    +                   element(2, G1) =:= element(1, G2)
    +              ],
    +              [{join, lookup}]),
    +    qlc:q([
    +           {X, Z, W} ||
    +               [{X, Z} | {W, Y}] <- V2
    +          ])
     end
    @@ -2352,13 +2352,13 @@

    q(QLC, Options)

    Returns a query handle for a QLC. The QLC must be the first argument to this function, otherwise it is evaluated as an ordinary list comprehension. It is -also necessary to add the following line to the source code:

    -include_lib("stdlib/include/qlc.hrl").

    This causes a parse transform to substitute a fun for the QLC. The (compiled) +also necessary to add the following line to the source code:

    -include_lib("stdlib/include/qlc.hrl").

    This causes a parse transform to substitute a fun for the QLC. The (compiled) fun is called when the query handle is evaluated.

    When calling qlc:q/1,2 from the Erlang shell, the parse transform is automatically called. When this occurs, the fun substituted for the QLC is not compiled but is evaluated by erl_eval. This is also true when expressions are evaluated by file:eval/1,2 or in the debugger.

    To be explicit, this does not work:

    ...
    -A = [X || {X} <- [{1},{2}]],
    -QH = qlc:q(A),
    +A = [X || {X} <- [{1},{2}]],
    +QH = qlc:q(A),
     ...

    Variable A is bound to the evaluated value of the list comprehension ([1,2]). The compiler complains with an error message ("argument is not a query list comprehension"); the shell process stops with a badarg reason.

    Options:

    • Option {cache, ets} can be used to cache the answers to a QLC. The answers @@ -2386,40 +2386,40 @@

      q(QLC, Options)

      results of looking up constants, running match specifications, and joining handles.

      Example:

      In the following example the cached results of the merge join are traversed for each value of A. Notice that without option cache the join would have been -carried out three times, once for each value of A.

      1> 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}),
      -io:format("~s~n", [qlc:info(Q)]).
      +carried out three times, once for each value of A.

      1> 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}),
      +io:format("~s~n", [qlc:info(Q)]).
       begin
           V1 =
      -        qlc:q([
      +        qlc:q([
                      P0 ||
      -                   P0 = {X, Z} <-
      -                       qlc:keysort(1, [{a, 1}, {b, 4}, {c, 6}], [])
      -              ]),
      +                   P0 = {X, Z} <-
      +                       qlc:keysort(1, [{a, 1}, {b, 4}, {c, 6}], [])
      +              ]),
           V2 =
      -        qlc:q([
      +        qlc:q([
                      P0 ||
      -                   P0 = {W, Y} <-
      -                       qlc:keysort(2, [{2, a}, {3, b}, {4, c}], [])
      -              ]),
      +                   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)
      -              ],
      -              [{join, merge}, {cache, list}]),
      -    qlc:q([
      -           {A, X, Z, W} ||
      -               A <- [a, b, c],
      -               [{X, Z} | {W, Y}] <- V3,
      +                   element(1, G1) == element(2, G2)
      +              ],
      +              [{join, merge}, {cache, list}]),
      +    qlc:q([
      +           {A, X, Z, W} ||
      +               A <- [a, b, c],
      +               [{X, Z} | {W, Y}] <- V3,
                      X =:= Y
      -          ])
      +          ])
       end

      sort/1,2 and keysort/2,3 can also be used for caching answers and for removing duplicates. When sorting answers are cached in a list, possibly stored on a temporary file, and no ETS tables are used.

      Sometimes (see table/2) traversal of tables can be done by looking up key @@ -2431,32 +2431,32 @@

      q(QLC, Options)

      limit on the number of keys to look up.

      Example:

      In the following example, using the gb_table module from section Implementing a QLC Table, there are six keys to look up: {1,a}, {1,b}, {1,c}, {2,a}, {2,b}, and {2,c}. The reason -is that the two elements of key {X, Y} are compared separately.

      1> 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))]),
      -io:format("~s~n", [qlc:info(QH)]).
      -ets:match_spec_run(
      -       lists:flatmap(fun(K) ->
      +is that the two elements of key {X, Y} are compared separately.

      1> 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))]),
      +io:format("~s~n", [qlc:info(QH)]).
      +ets:match_spec_run(
      +       lists:flatmap(fun(K) ->
                                   case
      -                                gb_trees:lookup(K,
      -                                                gb_trees:from_orddict([]))
      +                                gb_trees:lookup(K,
      +                                                gb_trees:from_orddict([]))
                                   of
      -                                {value, V} ->
      -                                    [{K, V}];
      +                                {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']}]))

      Options:

      • Option {lookup, true} can be used to ensure that the qlc module looks up + [{1, a}, + {1, b}, + {1, c}, + {2, a}, + {2, b}, + {2, c}]), + ets:match_spec_compile([{{{'$1', '$2'}, '_'}, + [], + ['$1']}]))

      Options:

      • Option {lookup, true} can be used to ensure that the qlc module looks up constants in some QLC table. If there are more than one QLC table among the list expressions of the generators, constants must be looked up in at least one of the tables. The evaluation of the query fails if there are no constants @@ -2653,11 +2653,11 @@

        string_to_handle(QueryString, Options, Bind

        A string version of q/1,2. When the query handle is evaluated, the fun created by the parse transform is interpreted by erl_eval. The query -string is to be one single QLC terminated by a period.

        Example:

        1> 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),
        -qlc:eval(QH).
        -[2,3,4]

        This function is probably mainly useful when called from outside of Erlang, for +string is to be one single QLC terminated by a period.

        Example:

        1> 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),
        +qlc:eval(QH).
        +[2,3,4]

        This function is probably mainly useful when called from outside of Erlang, for example from a driver written in C.

        Note

        Query handles created this way may have worse performance than when created directly via q/1,2.

        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/queue.html b/prs/8803/lib/stdlib-6.0.1/doc/html/queue.html index 9b13a47ace86e..1c19128616f8d 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/queue.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/queue.html @@ -723,10 +723,10 @@

        all(Pred, Q)

        Returns true if Pred(Item) returns true for all items Item in Q, -otherwise false.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -2> queue:all(fun (E) -> E > 3 end, Queue).
        +otherwise false.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +2> queue:all(fun (E) -> E > 3 end, Queue).
         false
        -3> queue:all(fun (E) -> E > 0 end, Queue).
        +3> queue:all(fun (E) -> E > 0 end, Queue).
         true
        @@ -758,10 +758,10 @@

        any(Pred, Q)

        Returns true if Pred(Item) returns true for at least one item Item in -Q, otherwise false.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -2> queue:any(fun (E) -> E > 10 end, Queue).
        +Q, otherwise false.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +2> queue:any(fun (E) -> E > 10 end, Queue).
         false
        -3> queue:any(fun (E) -> E > 3 end, Queue).
        +3> queue:any(fun (E) -> E > 3 end, Queue).
         true
        @@ -793,9 +793,9 @@

        delete(Item, Q1)

        Returns a copy of Q1 where the first item matching Item is deleted, if there -is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -2> Queue1 = queue:delete(3, Queue).
        -3> queue:member(3, Queue1).
        +is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +2> Queue1 = queue:delete(3, Queue).
        +3> queue:member(3, Queue1).
         false
        @@ -827,10 +827,10 @@

        delete_r(Item, Q1)

        Returns a copy of Q1 where the last item matching Item is deleted, if there -is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,3,5]).
        -2> Queue1 = queue:delete_r(3, Queue).
        -3> queue:to_list(Queue1).
        -[1,2,3,4,5]
        +is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,3,5]).
        +2> Queue1 = queue:delete_r(3, Queue).
        +3> queue:to_list(Queue1).
        +[1,2,3,4,5]
        @@ -866,10 +866,10 @@

        delete_with(Pred, Q1)

        Returns a copy of Q1 where the first item for which Pred returns true is -deleted, if there is such an item.

        Example:

        1> Queue = queue:from_list([100,1,2,3,4,5]).
        -2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
        -3> queue:to_list(Queue1).
        -[1,2,3,4,5]
        +deleted, if there is such an item.

        Example:

        1> Queue = queue:from_list([100,1,2,3,4,5]).
        +2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
        +3> queue:to_list(Queue1).
        +[1,2,3,4,5]
        @@ -905,10 +905,10 @@

        delete_with_r(Pred, Q1)

        Returns a copy of Q1 where the last item for which Pred returns true is -deleted, if there is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5,100]).
        -2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
        -3> queue:to_list(Queue1).
        -[1,2,3,4,5]
        +deleted, if there is such an item.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5,100]).
        +2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
        +3> queue:to_list(Queue1).
        +[1,2,3,4,5]
        @@ -939,19 +939,19 @@

        filter(Fun, Q1)

        Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

        If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns a list, the list elements -are inserted instead of Item in the result queue.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
        -{[5],[3,4]}
        -3> queue:to_list(Queue1).
        -[3,4,5]

        So, Fun(Item) returning [Item] is thereby semantically equivalent to +are inserted instead of Item in the result queue.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue1 = queue:filter(fun (E) -> E > 2 end, Queue).
        +{[5],[3,4]}
        +3> queue:to_list(Queue1).
        +[3,4,5]

        So, Fun(Item) returning [Item] is thereby semantically equivalent to returning true, just as returning [] is semantically equivalent to returning -false. But returning a list builds more garbage than returning an atom.

        Example 2:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
        -{[6,5,5,4,4,3],[1,2,2,3]}
        -3> queue:to_list(Queue1).
        -[1,2,2,3,3,4,4,5,5,6]
        +false. But returning a list builds more garbage than returning an atom.

        Example 2:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue1 = queue:filter(fun (E) -> [E, E+1] end, Queue).
        +{[6,5,5,4,4,3],[1,2,2,3]}
        +3> queue:to_list(Queue1).
        +[1,2,2,3,3,4,4,5,5,6]
        @@ -990,15 +990,15 @@

        filtermap(Fun, Q1)

        Returns a queue Q2 that is the result of calling Fun(Item) on all items in Q1.

        If Fun(Item) returns true, Item is copied to the result queue. If it returns false, Item is not copied. If it returns {true, NewItem}, the -queue element at this position is replaced with NewItem in the result queue.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
        -{[5],[3,4]}
        -3> queue:to_list(Queue1).
        -[3,4,5]
        -4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
        -{"ihg","ef"}
        -5> queue:to_list(Queue1).
        +queue element at this position is replaced with NewItem in the result queue.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
        +{[5],[3,4]}
        +3> queue:to_list(Queue1).
        +[3,4,5]
        +4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
        +{"ihg","ef"}
        +5> queue:to_list(Queue1).
         "efghi
        @@ -1039,9 +1039,9 @@

        fold(Fun, Acc0, Q)

        AccIn == Acc0. The queue is traversed in queue order, that is, from front to rear. Fun/2 must return a new accumulator, which is passed to the next call. The function returns the final value of the accumulator. Acc0 is returned if -the queue is empty.

        Example:

        1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
        +the queue is empty.

        Example:

        1> queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
         15
        -2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
        +2> queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
         120
        @@ -1099,12 +1099,12 @@

        in(Item, Q1)

        -

        Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue1 = queue:in(100, Queue).
        -{[100,5,4,3],[1,2]}
        -3> queue:to_list(Queue1).
        -[1,2,3,4,5,100]
        +

        Inserts Item at the rear of queue Q1. Returns the resulting queue Q2.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue1 = queue:in(100, Queue).
        +{[100,5,4,3],[1,2]}
        +3> queue:to_list(Queue1).
        +[1,2,3,4,5,100]
        @@ -1132,12 +1132,12 @@

        in_r(Item, Q1)

        -

        Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue1 = queue:in_r(100, Queue).
        -{[5,4,3],[100,1,2]}
        -3> queue:to_list(Queue1).
        -[100,1,2,3,4,5]
        +

        Inserts Item at the front of queue Q1. Returns the resulting queue Q2.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue1 = queue:in_r(100, Queue).
        +{[5,4,3],[100,1,2]}
        +3> queue:to_list(Queue1).
        +[100,1,2,3,4,5]
        @@ -1225,12 +1225,12 @@

        join(Q1, Q2)

        Returns a queue Q3 that is the result of joining Q1 and Q2 with Q1 in -front of Q2.

        Example:

        1> Queue1 = queue:from_list([1,3]).
        -{[3],[1]}
        -2> Queue2 = queue:from_list([2,4]).
        -{[4],[2]}
        -3> queue:to_list(queue:join(Queue1, Queue2)).
        -[1,3,2,4]
        +front of Q2.

        Example:

        1> Queue1 = queue:from_list([1,3]).
        +{[3],[1]}
        +2> Queue2 = queue:from_list([2,4]).
        +{[4],[2]}
        +3> queue:to_list(queue:join(Queue1, Queue2)).
        +[1,3,2,4]
        @@ -1344,12 +1344,12 @@

        out(Q1)

        Removes the item at the front of queue Q1. Returns tuple {{value, Item}, Q2}, where Item is the item removed and Q2 is the -resulting queue. If Q1 is empty, tuple {empty, Q1} is returned.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> {{value, 1=Item}, Queue1} = queue:out(Queue).
        -{{value,1},{[5,4,3],[2]}}
        -3> queue:to_list(Queue1).
        -[2,3,4,5]
        +resulting queue. If Q1 is empty, tuple {empty, Q1} is returned.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> {{value, 1=Item}, Queue1} = queue:out(Queue).
        +{{value,1},{[5,4,3],[2]}}
        +3> queue:to_list(Queue1).
        +[2,3,4,5]
        @@ -1379,12 +1379,12 @@

        out_r(Q1)

        Removes the item at the rear of queue Q1. Returns tuple {{value, Item}, Q2}, where Item is the item removed and Q2 is the new queue. If Q1 is empty, -tuple {empty, Q1} is returned.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> {{value, 5=Item}, Queue1} = queue:out_r(Queue).
        -{{value,5},{[4,3],[1,2]}}
        -3> queue:to_list(Queue1).
        -[1,2,3,4]
        +tuple {empty, Q1} is returned.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> {{value, 5=Item}, Queue1} = queue:out_r(Queue).
        +{{value,5},{[4,3],[1,2]}}
        +3> queue:to_list(Queue1).
        +[1,2,3,4]
        @@ -1469,9 +1469,9 @@

        to_list(Q)

        Returns a list of the items in the queue in the same order; the front item of -the queue becomes the head of the list.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> List == queue:to_list(Queue).
        +the queue becomes the head of the list.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> List == queue:to_list(Queue).
         true
        @@ -1512,12 +1512,12 @@

        drop(Q1)

        -

        Returns a queue Q2 that is the result of removing the front item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue = queue:drop(Queue).
        -{[5,4,3],[2]}
        -3> queue:to_list(Queue1).
        -[2,3,4,5]
        +

        Returns a queue Q2 that is the result of removing the front item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue = queue:drop(Queue).
        +{[5,4,3],[2]}
        +3> queue:to_list(Queue1).
        +[2,3,4,5]
        @@ -1545,12 +1545,12 @@

        drop_r(Q1)

        -

        Returns a queue Q2 that is the result of removing the rear item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> Queue = queue:drop_r(Queue).
        -{[4,3],[1,2]}
        -3> queue:to_list(Queue1).
        -[1,2,3,4]
        +

        Returns a queue Q2 that is the result of removing the rear item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> Queue = queue:drop_r(Queue).
        +{[4,3],[1,2]}
        +3> queue:to_list(Queue1).
        +[1,2,3,4]
        @@ -1578,9 +1578,9 @@

        get(Q)

        -

        Returns Item at the front of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> 1 == queue:get(Queue).
        +

        Returns Item at the front of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> 1 == queue:get(Queue).
         true
        @@ -1609,9 +1609,9 @@

        get_r(Q)

        -

        Returns Item at the rear of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -2> 5 == queue:get_r(Queue).
        +

        Returns Item at the rear of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> Queue = queue:from_list([1,2,3,4,5]).
        +{[5,4,3],[1,2]}
        +2> 5 == queue:get_r(Queue).
         true
        @@ -1641,12 +1641,12 @@

        peek(Q)

        Returns tuple {value, Item}, where Item is the front item of Q, or empty -if Q is empty.

        Example 1:

        1> queue:peek(queue:new()).
        +if Q is empty.

        Example 1:

        1> queue:peek(queue:new()).
         empty
        -2> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -3> queue:peek(Queue).
        -{value, 1}
        +2>
        Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek(Queue). +{value, 1}
        @@ -1675,12 +1675,12 @@

        peek_r(Q)

        Returns tuple {value, Item}, where Item is the rear item of Q, or empty -if Q is empty.

        Example 1:

        1> queue:peek_r(queue:new()).
        +if Q is empty.

        Example 1:

        1> queue:peek_r(queue:new()).
         empty
        -2> Queue = queue:from_list([1,2,3,4,5]).
        -{[5,4,3],[1,2]}
        -3> queue:peek_r(Queue).
        -{value, 5}
        +2>
        Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek_r(Queue). +{value, 5}
        @@ -1720,10 +1720,10 @@

        cons(Item, Q1)

        -

        Inserts Item at the head of queue Q1. Returns the new queue Q2.

        Example:

        1> Queue = queue:cons(0, queue:from_list([1,2,3])).
        -{[3,2],[0,1]}
        -2> queue:to_list(Queue).
        -[0,1,2,3]
        +

        Inserts Item at the head of queue Q1. Returns the new queue Q2.

        Example:

        1> Queue = queue:cons(0, queue:from_list([1,2,3])).
        +{[3,2],[0,1]}
        +2> queue:to_list(Queue).
        +[0,1,2,3]
        @@ -1751,7 +1751,7 @@

        daeh(Q)

        -

        Returns the tail item of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> queue:daeh(queue:from_list([1,2,3])).
        +

        Returns the tail item of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> queue:daeh(queue:from_list([1,2,3])).
         3
        @@ -1780,7 +1780,7 @@

        head(Q)

        -

        Returns Item from the head of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> queue:head(queue:from_list([1,2,3])).
        +

        Returns Item from the head of queue Q.

        Fails with reason empty if Q is empty.

        Example 1:

        1> queue:head(queue:from_list([1,2,3])).
         1
        @@ -1809,10 +1809,10 @@

        init(Q1)

        -

        Returns a queue Q2 that is the result of removing the tail item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:init(queue:from_list([1,2,3])).
        -{[2],[1]}
        -2> queue:to_list(Queue).
        -[1,2]
        +

        Returns a queue Q2 that is the result of removing the tail item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:init(queue:from_list([1,2,3])).
        +{[2],[1]}
        +2> queue:to_list(Queue).
        +[1,2]
        @@ -1872,7 +1872,7 @@

        last(Q)

        -

        Returns the tail item of queue Q.

        Fails with reason empty if Q is empty.

        Example:

        1> queue:last(queue:from_list([1,2,3])).
        +

        Returns the tail item of queue Q.

        Fails with reason empty if Q is empty.

        Example:

        1> queue:last(queue:from_list([1,2,3])).
         3
        @@ -1901,10 +1901,10 @@

        liat(Q1)

        -

        Returns a queue Q2 that is the result of removing the tail item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:liat(queue:from_list([1,2,3])).
        -{[2],[1]}
        -2> queue:to_list(Queue).
        -[1,2]
        +

        Returns a queue Q2 that is the result of removing the tail item from Q1.

        Fails with reason empty if Q1 is empty.

        Example:

        1> Queue = queue:liat(queue:from_list([1,2,3])).
        +{[2],[1]}
        +2> queue:to_list(Queue).
        +[1,2]
        @@ -1932,10 +1932,10 @@

        snoc(Q1, Item)

        -

        Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

        Example:

        1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
        -{[4,3,2],[1]}
        -2> queue:to_list(Queue).
        -[1,2,3,4]
        +

        Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

        Example:

        1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
        +{[4,3,2],[1]}
        +2> queue:to_list(Queue).
        +[1,2,3,4]
        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/rand.html b/prs/8803/lib/stdlib-6.0.1/doc/html/rand.html index 84a9f5fe02041..b70b31cecefb6 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/rand.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/rand.html @@ -201,13 +201,13 @@

        a reasonably unpredictable seed.

        The functions with explicit state don't use the process dictionary.

        Examples

        Simple use; create and seed the default algorithm with a non-fixed seed, if not already done, and generate two uniformly distibuted -floating point numbers.

        R0 = rand:uniform(),
        -R1 = rand:uniform(),

        Use a specified algorithm:

        _ = rand:seed(exro928ss),
        -R2 = rand:uniform(),

        Use a specified algorithm with a fixed seed:

        _ = rand:seed(exro928ss, {123, 123534, 345345}),
        -R3 = rand:uniform(),

        Use the functional API with a non-fixed seed:

        S0 = rand:seed_s(exsss),
        -{R4, S1} = rand:uniform_s(S0),

        Generate a textbook basic form Box-Muller standard normal distribution number:

        R5 = rand:uniform_real(),
        -R6 = rand:uniform(),
        -SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

        Generate a standard normal distribution number:

        {SND1, S2} = rand:normal_s(S1),

        Generate a normal distribution number with with mean -3 and variance 0.5:

        {ND0, S3} = rand:normal_s(-3, 0.5, S2),

        Quality of the Generated Numbers

        Note

        The builtin random number generator algorithms are not cryptographically +floating point numbers.

        R0 = rand:uniform(),
        +R1 = rand:uniform(),

        Use a specified algorithm:

        _ = rand:seed(exro928ss),
        +R2 = rand:uniform(),

        Use a specified algorithm with a fixed seed:

        _ = rand:seed(exro928ss, {123, 123534, 345345}),
        +R3 = rand:uniform(),

        Use the functional API with a non-fixed seed:

        S0 = rand:seed_s(exsss),
        +{R4, S1} = rand:uniform_s(S0),

        Generate a textbook basic form Box-Muller standard normal distribution number:

        R5 = rand:uniform_real(),
        +R6 = rand:uniform(),
        +SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

        Generate a standard normal distribution number:

        {SND1, S2} = rand:normal_s(S1),

        Generate a normal distribution number with with mean -3 and variance 0.5:

        {ND0, S3} = rand:normal_s(-3, 0.5, S2),

        Quality of the Generated Numbers

        Note

        The builtin random number generator algorithms are not cryptographically strong. If a cryptographically strong random number generator is needed, use something like crypto:rand_seed/0.

        For all these generators except exro928ss and exsss the lowest bit(s) have got a slightly less random behaviour than all other bits. @@ -218,7 +218,7 @@

        up to (and included) 16TB, with the exception of binary rank tests, which fail due to the lowest bit being an LFSR; all other bits pass all tests. We suggest to use a sign test to extract a random Boolean value.

        If this is a problem; to generate a boolean with these algorithms, -use something like this:

        (rand:uniform(256) > 128) % -> boolean()
        ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

        For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

        (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

        The floating point generating functions in this module waste the lowest bits +use something like this:

        (rand:uniform(256) > 128) % -> boolean()
        ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

        For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

        (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

        The floating point generating functions in this module waste the lowest bits when converting from an integer so they avoid this snag.

        @@ -1947,10 +1947,10 @@

        uniform_s(State)

        equally spaced in the interval.

        Warning

        This function may return exactly 0.0 which can be fatal for certain applications. If that is undesired you can use (1.0 - rand:uniform()) to get the interval 0.0 < X =< 1.0, or instead use uniform_real/0.

        If neither endpoint is desired you can achieve the range -0.0 < X < 1.0 using test and re-try like this:

        my_uniform() ->
        -    case rand:uniform() of
        +0.0 < X < 1.0 using test and re-try like this:

        my_uniform() ->
        +    case rand:uniform() of
                 X when 0.0 < X -> X;
        -        _ -> my_uniform()
        +        _ -> my_uniform()
             end.

        @@ -2111,7 +2111,7 @@

        mwc59(CX0)

        16#7fa6502 * 2^32 - 1, which have been selected, in collaboration with Sebastiano Vigna, to avoid bignum operations and still get good statistical quality. It has been named "MWC59" and can be written as:

        C = CX0 bsr 32
        -X = CX0 band ((1 bsl 32)-1))
        +X = CX0 band ((1 bsl 32)-1))
         CX1 = 16#7fa6502 * X + C

        Because the generator uses a multiplier that is a power of 2 it gets statistical flaws for collision tests and birthday spacings tests in 2 and 3 dimensions, and these caveats apply even when looking diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/random.html b/prs/8803/lib/stdlib-6.0.1/doc/html/random.html index 1e8f55f6db3b8..0fbb3a592e5f7 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/random.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/random.html @@ -472,9 +472,9 @@

        seed(A1, A2, A3)

        Seeds random number generation with integer values in the process dictionary and -returns the old state.

        The following is an easy way of obtaining a unique value to seed with:

        random:seed(erlang:phash2([node()]),
        -            erlang:monotonic_time(),
        -            erlang:unique_integer())

        For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

        The following is an easy way of obtaining a unique value to seed with:

        random:seed(erlang:phash2([node()]),
        +            erlang:monotonic_time(),
        +            erlang:unique_integer())

        For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/re.html b/prs/8803/lib/stdlib-6.0.1/doc/html/re.html index 541dbb5444a79..b4e40f82f1adf 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/re.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/re.html @@ -1375,9 +1375,9 @@

        follows (COMMIT) can be triggered first, so merely passing (COMMIT) during a match does not always guarantee that a match must be at this starting point.

        Notice that (*COMMIT) at the start of a pattern is not the same as an anchor, unless the PCRE start-of-match optimizations are turned off, as shown in the -following example:

        1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
        -{match,["abc"]}
        -2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
        +following example:

        1> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list}]).
        +{match,["abc"]}
        +2> re:run("xyzabc","(*COMMIT)abc",[{capture,all,list},no_start_optimize]).
         nomatch

        For this pattern, PCRE knows that any match must start with "a", so the optimization skips along the subject to "a" before applying the pattern to the first set of data. The match attempt then succeeds. In the second call the @@ -2110,32 +2110,32 @@

        inspect(MP, Item)

        Takes a compiled regular expression and an item, and returns the relevant data from the regular expression.

        The only supported item is namelist, which returns the tuple {namelist, [binary()]}, -containing the names of all (unique) named subpatterns in the regular expression.

        For example:

        1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
        -{ok,{re_pattern,3,0,0,
        +containing the names of all (unique) named subpatterns in the regular expression.

        For example:

        1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
        +{ok,{re_pattern,3,0,0,
                         <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
        -                  255,255,...>>}}
        -2> re:inspect(MP,namelist).
        -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
        -3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
        -{ok,{re_pattern,3,0,0,
        +                  255,255,...>>}}
        +2> re:inspect(MP,namelist).
        +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
        +3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
        +{ok,{re_pattern,3,0,0,
                         <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
        -                  255,255,...>>}}
        -4> re:inspect(MPD,namelist).
        -{namelist,[<<"B">>,<<"C">>]}

        Notice in the second example that the duplicate name only occurs once in the + 255,255,...>>}} +4> re:inspect(MPD,namelist). +{namelist,[<<"B">>,<<"C">>]}

        Notice in the second example that the duplicate name only occurs once in the returned list, and that the list is in alphabetical order regardless of where the names are positioned in the regular expression. The order of the names is the same as the order of captured subexpressions if {capture, all_names} is specified as an option to run/3. You can therefore create a name-to-value -mapping from the result of run/3 like this:

        1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
        -{ok,{re_pattern,3,0,0,
        +mapping from the result of run/3 like this:

        1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
        +{ok,{re_pattern,3,0,0,
                         <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
        -                  255,255,...>>}}
        -2> {namelist, N} = re:inspect(MP,namelist).
        -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
        -3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
        -{match,[<<"A">>,<<>>,<<>>]}
        -4> NameMap = lists:zip(N,L).
        -[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
        +
        255,255,...>>}} +2> {namelist, N} = re:inspect(MP,namelist). +{namelist,[<<"A">>,<<"B">>,<<"C">>]} +3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]). +{match,[<<"A">>,<<>>,<<>>]} +4> NameMap = lists:zip(N,L). +[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
        @@ -2228,16 +2228,16 @@

        replace(Subject, RE, Replacement, Options)< subexpression number N, is inserted in the result. If no subexpression with that number is generated by the regular expression, nothing is inserted.

        To insert an & or a \ in the result, precede it with a \. Notice that Erlang already gives a special meaning to \ in literal strings, so a single \ must be -written as "\\" and therefore a double \ as "\\\\".

        Example:

        1> re:replace("abcd","c","[&]",[{return,list}]).
        -"ab[c]d"

        while

        2> re:replace("abcd","c","[\\&]",[{return,list}]).
        +written as "\\" and therefore a double \ as "\\\\".

        Example:

        1> re:replace("abcd","c","[&]",[{return,list}]).
        +"ab[c]d"

        while

        2> re:replace("abcd","c","[\\&]",[{return,list}]).
         "ab[&]d"

        If the replacement is given as a fun, it will be called with the whole matching expression as the first argument and a list of subexpression matches in the order in which they appear in the regular expression. The returned value will be -inserted in the result.

        Example:

        3> re:replace("abcd", ".(.)",
        -    fun(Whole, [<<C>>]) ->
        -         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
        +inserted in the result.

        Example:

        3> re:replace("abcd", ".(.)",
        +    fun(Whole, [<<C>>]) ->
        +         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
             end,
        -    [{return, list}]).
        +    [{return, list}]).
         "#ab-B#cd"

        Note

        Non-matching optional subexpressions will not be included in the list of subexpression matches if they are the last subexpressions in the regular expression.

        Example:

        The regular expression "(a)(b)?(c)?" ("a", optionally followed by "b", @@ -2354,7 +2354,7 @@

        run(Subject, RE, Options)

        run/3 handles empty matches in the same way as Perl: a zero-length match at any point is also retried with options [anchored, notempty_atstart]. If that search gives a result of length > 0, -the result is included. Example:

        re:run("cat","(|at)",[global]).

        The following matchings are performed:

        • At offset 0 - The regular expression (|at) first match at the +the result is included. Example:

          re:run("cat","(|at)",[global]).

          The following matchings are performed:

          • At offset 0 - The regular expression (|at) first match at the initial position of string cat, giving the result set [{0,0},{0,0}] (the second {0,0} is because of the subexpression marked by the parentheses). As the length of the match is 0, we do not advance to the next position yet.

          • At offset 0 with [anchored, notempty_atstart] - The search is @@ -2366,7 +2366,7 @@

            run(Subject, RE, Options)

            of results and the position in the search string is advanced two steps.

          • At offset 3 - The search once again matches the empty string, giving [{3,0},{3,0}].

          • At offset 1 with [anchored, notempty_atstart] - This gives no result of length > 0 and we are at the last position, so the global search is -complete.

          The result of the call is:

          {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
        • notempty - An empty string is not considered to be a valid match if this +complete.

        The result of the call is:

        {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}

      • notempty - An empty string is not considered to be a valid match if this option is specified. If alternatives in the pattern exist, they are tried. If all the alternatives match the empty string, the entire match fails.

        Example:

        If the following pattern is applied to a string not beginning with "a" or "b", it would normally match the empty string at the start of the subject:

        a?b?

        With option notempty, this match is invalid, so run/3 searches @@ -2437,12 +2437,12 @@

        run(Subject, RE, Options)

        instead of the stack, the amount of heap memory that can be used.

        The Erlang VM uses a PCRE library where heap memory is used when regular expression match recursion occurs. This therefore limits the use of machine heap, not C stack.

        Specifying a lower value can result in matches with deep recursion failing, -when they should have matched:

        1> re:run("aaaaaaaaaaaaaz","(a+)*z").
        -{match,[{0,14},{0,13}]}
        -2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
        +when they should have matched:

        1> re:run("aaaaaaaaaaaaaz","(a+)*z").
        +{match,[{0,14},{0,13}]}
        +2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
         nomatch
        -3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
        -{error,match_limit_recursion}

        This option and option match_limit are only to be used in rare cases. +3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]). +{error,match_limit_recursion}

        This option and option match_limit are only to be used in rare cases. Understanding of the PCRE library internals is recommended before tampering with these limits.

      • {offset, integer() >= 0} - Start matching at the offset (position) specified in the subject string. The offset is zero-based, so that the default @@ -2464,9 +2464,9 @@

        run(Subject, RE, Options)

        capturing).

        As an example of the default behavior, the following call returns, as first and only captured string, the matching part of the subject ("abcd" in the middle) as an index pair {3,4}, where character positions are zero-based, -just as in offsets:

        re:run("ABCabcdABC","abcd",[]).

        The return value of this call is:

        {match,[{3,4}]}

        Another (and quite common) case is where the regular expression matches all of -the subject:

        re:run("ABCabcdABC",".*abcd.*",[]).

        Here the return value correspondingly points out all of the string, beginning -at index 0, and it is 10 characters long:

        {match,[{0,10}]}

        If the regular expression contains capturing subpatterns, like in:

        re:run("ABCabcdABC",".*(abcd).*",[]).

        all of the matched subject is captured, as well as the captured substrings:

        {match,[{0,10},{3,4}]}

        The complete matching pattern always gives the first return value in the list +just as in offsets:

        re:run("ABCabcdABC","abcd",[]).

        The return value of this call is:

        {match,[{3,4}]}

        Another (and quite common) case is where the regular expression matches all of +the subject:

        re:run("ABCabcdABC",".*abcd.*",[]).

        Here the return value correspondingly points out all of the string, beginning +at index 0, and it is 10 characters long:

        {match,[{0,10}]}

        If the regular expression contains capturing subpatterns, like in:

        re:run("ABCabcdABC",".*(abcd).*",[]).

        all of the matched subject is captured, as well as the captured substrings:

        {match,[{0,10},{3,4}]}

        The complete matching pattern always gives the first return value in the list and the remaining subpatterns are added in the order they occurred in the regular expression.

        The capture tuple is built up as follows:

        • ValueSpec - Specifies which captured (sub)patterns are to be returned. ValueSpec can either be an atom describing a predefined set of return @@ -2491,12 +2491,12 @@

          run(Subject, RE, Options)

          subpatterns (see below) in the regular expression, one can use atom/0s or string/0s to specify the subpatterns to be returned. For example, consider the regular expression:

          ".*(abcd).*"

          matched against string "ABCabcdABC", capturing only the "abcd" part (the -first explicit subpattern):

          re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

          The call gives the following result, as the first explicitly captured +first explicit subpattern):

          re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

          The call gives the following result, as the first explicitly captured subpattern is "(abcd)", matching "abcd" in the subject, at (zero-based) -position 3, of length 4:

          {match,[{3,4}]}

          Consider the same regular expression, but with the subpattern explicitly +position 3, of length 4:

          {match,[{3,4}]}

          Consider the same regular expression, but with the subpattern explicitly named 'FOO':

          ".*(?<FOO>abcd).*"

          With this expression, we could still give the index of the subpattern with -the following call:

          re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

          giving the same result as before. But, as the subpattern is named, we can -also specify its name in the value list:

          re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

          This would give the same result as the earlier examples, namely:

          {match,[{3,4}]}

          The values list can specify indexes or names not present in the regular +the following call:

          re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

          giving the same result as before. But, as the subpattern is named, we can +also specify its name in the value list:

          re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

          This would give the same result as the earlier examples, namely:

          {match,[{3,4}]}

          The values list can specify indexes or names not present in the regular expression, in which case the return values vary depending on the type. If the type is index, the tuple {-1,0} is returned for values with no corresponding subpattern in the regular expression, but for the other types @@ -2531,12 +2531,12 @@

          run(Subject, RE, Options)

          string:

          "ABCabcdABC"

          the subpattern at index 2 does not match, as "abdd" is not present in the string, but the complete pattern matches (because of the alternative a(..d)). The subpattern at index 2 is therefore unassigned and the default -return value is:

          {match,[{0,10},{3,4},{-1,0},{4,3}]}

          Setting the capture Type to binary gives:

          {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

          Here the empty binary (<<>>) represents the unassigned subpattern. In the +return value is:

          {match,[{0,10},{3,4},{-1,0},{4,3}]}

          Setting the capture Type to binary gives:

          {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

          Here the empty binary (<<>>) represents the unassigned subpattern. In the binary case, some information about the matching is therefore lost, as <<>> can also be an empty string captured.

          If differentiation between empty matches and non-existing subpatterns is necessary, use the type index and do the conversion to the final type in Erlang code.

          When option global is speciified, the capture specification affects each -match separately, so that:

          re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

          gives

          {match,[["a"],["b"]]}

        For a descriptions of options only affecting the compilation step, see +match separately, so that:

        re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

        gives

        {match,[["a"],["b"]]}

      For a descriptions of options only affecting the compilation step, see compile/2.

      @@ -2625,7 +2625,7 @@

      split(Subject, RE, Options)

      compilation option is specified to this function, both the regular expression and Subject are to be specified as valid Unicode charlist()s.

      The result is given as a list of "strings", the preferred data type specified in option return (default iodata).

      If subexpressions are specified in the regular expression, the matching -subexpressions are returned in the resulting list as well. For example:

      re:split("Erlang","[ln]",[{return,list}]).

      gives

      ["Er","a","g"]

      while

      re:split("Erlang","([ln])",[{return,list}]).

      gives

      ["Er","l","a","n","g"]

      The text matching the subexpression (marked by the parentheses in the regular +subexpressions are returned in the resulting list as well. For example:

      re:split("Erlang","[ln]",[{return,list}]).

      gives

      ["Er","a","g"]

      while

      re:split("Erlang","([ln])",[{return,list}]).

      gives

      ["Er","l","a","n","g"]

      The text matching the subexpression (marked by the parentheses in the regular expression) is inserted in the result list where it was found. This means that concatenating the result of a split where the whole regular expression is a single subexpression (as in the last example) always results in the original @@ -2633,21 +2633,21 @@

      split(Subject, RE, Options)

      "g"), nothing is inserted after that. To make the group of strings and the parts matching the subexpressions more obvious, one can use option group, which groups together the part of the subject string with the parts matching the -subexpressions when the string was split:

      re:split("Erlang","([ln])",[{return,list},group]).

      gives

      [["Er","l"],["a","n"],["g"]]

      Here the regular expression first matched the "l", causing "Er" to be the first +subexpressions when the string was split:

      re:split("Erlang","([ln])",[{return,list},group]).

      gives

      [["Er","l"],["a","n"],["g"]]

      Here the regular expression first matched the "l", causing "Er" to be the first part in the result. When the regular expression matched, the (only) subexpression was bound to the "l", so the "l" is inserted in the group together with "Er". The next match is of the "n", making "a" the next part to be returned. As the subexpression is bound to substring "n" in this case, the "n" is inserted into this group. The last group consists of the remaining string, as no more matches are found.

      By default, all parts of the string, including the empty strings, are returned -from the function, for example:

      re:split("Erlang","[lg]",[{return,list}]).

      gives

      ["Er","an",[]]

      as the matching of the "g" in the end of the string leaves an empty rest, which +from the function, for example:

      re:split("Erlang","[lg]",[{return,list}]).

      gives

      ["Er","an",[]]

      as the matching of the "g" in the end of the string leaves an empty rest, which is also returned. This behavior differs from the default behavior of the split function in Perl, where empty strings at the end are by default removed. To get -the "trimming" default behavior of Perl, specify trim as an option:

      re:split("Erlang","[lg]",[{return,list},trim]).

      gives

      ["Er","an"]

      The "trim" option says; "give me as many parts as possible except the empty +the "trimming" default behavior of Perl, specify trim as an option:

      re:split("Erlang","[lg]",[{return,list},trim]).

      gives

      ["Er","an"]

      The "trim" option says; "give me as many parts as possible except the empty ones", which sometimes can be useful. You can also specify how many parts you -want, by specifying {parts,N}:

      re:split("Erlang","[lg]",[{return,list},{parts,2}]).

      gives

      ["Er","ang"]

      Notice that the last part is "ang", not "an", as splitting was specified into +want, by specifying {parts,N}:

      re:split("Erlang","[lg]",[{return,list},{parts,2}]).

      gives

      ["Er","ang"]

      Notice that the last part is "ang", not "an", as splitting was specified into two parts, and the splitting stops when enough parts are given, which is why the -result differs from that of trim.

      More than three parts are not possible with this indata, so

      re:split("Erlang","[lg]",[{return,list},{parts,4}]).

      gives the same result as the default, which is to be viewed as "an infinite +result differs from that of trim.

      More than three parts are not possible with this indata, so

      re:split("Erlang","[lg]",[{return,list},{parts,4}]).

      gives the same result as the default, which is to be viewed as "an infinite number of parts".

      Specifying 0 as the number of parts gives the same effect as option trim. If subexpressions are captured, empty subexpressions matched at the end are also stripped from the result if trim or {parts,0} is specified.

      The trim behavior corresponds exactly to the Perl default. {parts,N}, where diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/sets.html b/prs/8803/lib/stdlib-6.0.1/doc/html/sets.html index deb5eccce6d03..2acdf07232c41 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/sets.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/sets.html @@ -154,11 +154,11 @@

      respect to the aforementioned functions, their overall behavior may differ. As mentioned, this module considers elements as different if and only if they do not match (=:=), while both ordsets and gb_sets consider elements -as different if and only if they do not compare equal (==).

      Example:

      1> sets:is_element(1.0, sets:from_list([1])).
      +as different if and only if they do not compare equal (==).

      Example:

      1> sets:is_element(1.0, sets:from_list([1])).
       false
      -2> ordsets:is_element(1.0, ordsets:from_list([1])).
      +2> ordsets:is_element(1.0, ordsets:from_list([1])).
       true
      -2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
      +2> gb_sets:is_element(1.0, gb_sets:from_list([1])).
       true

      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/shell.html b/prs/8803/lib/stdlib-6.0.1/doc/html/shell.html index de970f68ee703..c467c130b388e 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/shell.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/shell.html @@ -166,7 +166,7 @@

      definitions. To facilitate matters, record definitions in modules shell_default and user_default (if loaded) are read each time a new job is started. For example, adding the following line to user_default makes the -definition of file_info readily available in the shell:

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

      The shell runs in two modes:

      Command 1 sets variable Str to string "abcd".

      2> L = length(Str).
      +4

      Command 2 sets L to the length of string Str.

      3> Descriptor = {L, list_to_atom(Str)}.
      +{4,abcd}

      Command 3 builds the tuple Descriptor, evaluating the BIF list_to_atom/1 .

      4> L.
      -4

      Command 4 prints the value of variable L.

      5> b().
      -Descriptor = {4,abcd}
      +4

      Command 4 prints the value of variable L.

      5> b().
      +Descriptor = {4,abcd}
       L = 4
       Str = "abcd"
       ok

      Command 5 evaluates the internal shell command b(), which is an abbreviation of "bindings". This prints the current shell variables and their bindings. ok -at the end is the return value of function b().

      6> f(L).
      +at the end is the return value of function b().

      6> f(L).
       ok

      Command 6 evaluates the internal shell command f(L) (abbreviation of -"forget"). The value of variable L is removed.

      7> b().
      -Descriptor = {4,abcd}
      +"forget"). The value of variable L is removed.

      7> b().
      +Descriptor = {4,abcd}
       Str = "abcd"
      -ok

      Command 7 prints the new bindings.

      8> f(L).
      -ok

      Command 8 has no effect, as L has no value.

      9> {L, _} = Descriptor.
      -{4,abcd}

      Command 9 performs a pattern matching operation on Descriptor, binding a new +ok

      Command 7 prints the new bindings.

      8> f(L).
      +ok

      Command 8 has no effect, as L has no value.

      9> {L, _} = Descriptor.
      +{4,abcd}

      Command 9 performs a pattern matching operation on Descriptor, binding a new value to L.

      10> L.
      -4

      Command 10 prints the current value of L.

      11> {P, Q, R} = Descriptor.
      +4

      Command 10 prints the current value of L.

      11> {P, Q, R} = Descriptor.
       ** exception error: no match of right hand side value {4,abcd}

      Command 11 tries to match {P, Q, R} against Descriptor, which is {4, abc}. The match fails and none of the new variables become bound. The printout starting with "** exception error:" is not the value of the expression (the @@ -266,74 +266,74 @@

      other variables (L, Str, and so on) are unchanged.

      12> P.
       * 1:1: variable 'P' is unbound
       13> Descriptor.
      -{4,abcd}

      Commands 12 and 13 show that P is unbound because the previous command failed, -and that Descriptor has not changed.

      14>{P, Q} = Descriptor.
      -{4,abcd}
      +{4,abcd}

      Commands 12 and 13 show that P is unbound because the previous command failed, +and that Descriptor has not changed.

      14>{P, Q} = Descriptor.
      +{4,abcd}
       15> P.
      -4

      Commands 14 and 15 show a correct match where P and Q are bound.

      16> f().
      -ok

      Command 16 clears all bindings.

      The next few commands assume that test1:demo(X) is defined as follows:

      demo(X) ->
      -    put(aa, worked),
      +4

      Commands 14 and 15 show a correct match where P and Q are bound.

      16> f().
      +ok

      Command 16 clears all bindings.

      The next few commands assume that test1:demo(X) is defined as follows:

      demo(X) ->
      +    put(aa, worked),
           X = 1,
      -    X + 10.
      17> put(aa, hello).
      +    X + 10.
      17> put(aa, hello).
       undefined
      -18> get(aa).
      +18> get(aa).
       hello

      Commands 17 and 18 set and inspect the value of item aa in the process -dictionary.

      19> Y = test1:demo(1).
      +dictionary.

      19> Y = test1:demo(1).
       11

      Command 19 evaluates test1:demo(1). The evaluation succeeds and the changes made in the process dictionary become visible to the shell. The new value of -dictionary item aa can be seen in command 20.

      20> get().
      -[{aa,worked}]
      -21> put(aa, hello).
      +dictionary item aa can be seen in command 20.

      20> get().
      +[{aa,worked}]
      +21> put(aa, hello).
       worked
      -22> Z = test1:demo(2).
      +22> Z = test1:demo(2).
       ** exception error: no match of right hand side value 1
            in function  test1:demo/1

      Commands 21 and 22 change the value of dictionary item aa to hello and call test1:demo(2). Evaluation fails and the changes made to the dictionary in test1:demo(2), before the error occurred, are discarded.

      23> Z.
       * 1:1: variable 'Z' is unbound
      -24> get(aa).
      +24> get(aa).
       hello

      Commands 23 and 24 show that Z was not bound and that dictionary item aa has -retained its original value.

      25> erase(), put(aa, hello).
      +retained its original value.

      25> erase(), put(aa, hello).
       undefined
      -26> spawn(test1, demo, [1]).
      +26> spawn(test1, demo, [1]).
       <0.57.0>
      -27> get(aa).
      +27> get(aa).
       hello

      Commands 25, 26, and 27 show the effect of evaluating test1:demo(1) in the background. In this case, the expression is evaluated in a newly spawned process. Any changes made in the process dictionary are local to the newly -spawned process and therefore not visible to the shell.

      28> io:format("hello hello\n").
      +spawned process and therefore not visible to the shell.

      28> io:format("hello hello\n").
       hello hello
       ok
      -29> e(28).
      +29> e(28).
       hello hello
       ok
      -30> v(28).
      +30> v(28).
       ok

      Commands 28, 29 and 30 use the history facilities of the shell. Command 29 re-evaluates command 28. Command 30 uses the value (result) of command 28. In the cases of a pure function (a function with no side effects), the result is the same. For a function with side effects, the result can be different.

      The next few commands show some record manipulation. It is assumed that ex.erl -defines a record as follows:

      -record(rec, {a, b = val()}).

      val() ->
          3.

      31> c(ex).
      -{ok,ex}
      -32> rr(ex).
      -[rec]

      Commands 31 and 32 compile file ex.erl and read the record definitions in +defines a record as follows:

      -record(rec, {a, b = val()}).

      val() ->
          3.

      31> c(ex).
      +{ok,ex}
      +32> rr(ex).
      +[rec]

      Commands 31 and 32 compile file ex.erl and read the record definitions in ex.beam. If the compiler did not output any record definitions on the BEAM -file, rr(ex) tries to read record definitions from the source file instead.

      33> rl(rec).
      --record(rec,{a,b = val()}).
      -ok

      Command 33 prints the definition of the record named rec.

      34> #rec{}.
      +file, rr(ex) tries to read record definitions from the source file instead.

      33> rl(rec).
      +-record(rec,{a,b = val()}).
      +ok

      Command 33 prints the definition of the record named rec.

      34> #rec{}.
       ** exception error: undefined shell command val/0

      Command 34 tries to create a rec record, but fails as function val/0 is -undefined.

      35> #rec{b = 3}.
      -#rec{a = undefined,b = 3}

      Command 35 shows the workaround: explicitly assign values to record fields that -cannot otherwise be initialized.

      36> rp(v(-1)).
      -#rec{a = undefined,b = 3}
      +undefined.

      35> #rec{b = 3}.
      +#rec{a = undefined,b = 3}

      Command 35 shows the workaround: explicitly assign values to record fields that +cannot otherwise be initialized.

      36> rp(v(-1)).
      +#rec{a = undefined,b = 3}
       ok

      Command 36 prints the newly created record using record definitions maintained -by the shell.

      37> rd(rec, {f = orddict:new()}).
      +by the shell.

      37> rd(rec, {f = orddict:new()}).
       rec

      Command 37 defines a record directly in the shell. The definition replaces the -one read from file ex.beam.

      38> #rec{}.
      -#rec{f = []}
      -ok

      Command 38 creates a record using the new definition, and prints the result.

      39> rd(rec, {c}), A.
      +one read from file ex.beam.

      38> #rec{}.
      +#rec{f = []}
      +ok

      Command 38 creates a record using the new definition, and prints the result.

      39> rd(rec, {c}), A.
       * 1:15: variable 'A' is unbound
      -40> #rec{}.
      -#rec{c = undefined}
      +40> #rec{}.
      +#rec{c = undefined}
       ok

      Command 39 and 40 show that record definitions are updated as side effects. The evaluation of the command fails, but the definition of rec has been carried out.

      For the next command, it is assumed that test1:loop(N) is defined as follows:

      loop(N) ->
          io:format("Hello Number: ~w~n", [N]),
          loop(N+1).

      41> test1:loop(0).
      @@ -359,31 +359,31 @@ 

      JCL mode the user can start and stop jobs.

      In this particular case, command i ("interrupt") terminates the looping program, and command c connects to the shell again. As the process was running in the background before we killed it, more printouts occur before message -"** exception exit: killed" is shown.

      42> E = ets:new(t, []).
      -#Ref<0.1662103692.2407923716.214192>

      Command 42 creates an ETS table.

      43> ets:insert({d,1,2}).
      +"** exception exit: killed" is shown.

      42> E = ets:new(t, []).
      +#Ref<0.1662103692.2407923716.214192>

      Command 42 creates an ETS table.

      43> ets:insert({d,1,2}).
       ** exception error: undefined function ets:insert/1

      Command 43 tries to insert a tuple into the ETS table, but the first argument -(the table) is missing. The exception kills the evaluator process.

      44> ets:insert(E, {d,1,2}).
      +(the table) is missing. The exception kills the evaluator process.

      44> ets:insert(E, {d,1,2}).
       ** exception error: argument is of wrong type
            in function  ets:insert/2
               called as ets:insert(16,{d,1,2})

      Command 44 corrects the mistake, but the ETS table has been destroyed as it was -owned by the killed evaluator process.

      45> f(E).
      +owned by the killed evaluator process.

      45> f(E).
       ok
      -46> catch_exception(true).
      +46> catch_exception(true).
       false

      Command 46 sets the exception handling of the evaluator process to true. The exception handling can also be set when starting Erlang by -erl -stdlib shell_catch_exception true.

      47> E = ets:new(t, []).
      +erl -stdlib shell_catch_exception true.

      47> E = ets:new(t, []).
       #Ref<0.1662103692.2407923716.214197>
      -48> ets:insert({d,1,2}).
      +48> ets:insert({d,1,2}).
       * exception error: undefined function ets:insert/1

      Command 48 makes the same mistake as in command 43, but this time the evaluator process lives on. The single star at the beginning of the printout signals that -the exception has been caught.

      49> ets:insert(E, {d,1,2}).
      -true

      Command 49 successfully inserts the tuple into the ETS table.

      50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
      +the exception has been caught.

      49> ets:insert(E, {d,1,2}).
      +true

      Command 49 successfully inserts the tuple into the ETS table.

      50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
       true

      Command 50 inserts another tuple into the ETS table. This time the first argument is the table identifier itself. The shell can parse commands with pids (<0.60.0>), ports (#Port<0.536>), references (#Ref<0.1662103692.2407792644.214210>), and external functions (#Fun<a.b.1>), but the command fails unless the corresponding pid, port, -reference, or function can be created in the running system.

      51> halt().
      +reference, or function can be created in the running system.

      51> halt().
       strider 2>

      Command 51 exits the Erlang runtime system.

      @@ -856,7 +856,7 @@

      format_shell_func(ShellFormatFunc)

      stdlib app config for how to set it before shell started.

      If instead a string is provided, it will be used as a shell command. Your command must include ${file} somewhere in the string, for the shell to know -where the file goes in the command.

      shell:format_shell_func("\"emacs -batch \${file} -l ~/erlang-format/emacs-format-file -f emacs-format-function\"").
      shell:format_shell_func({shell, erl_pp_format_func}).
      +where the file goes in the command.

      shell:format_shell_func("\"emacs -batch \${file} -l ~/erlang-format/emacs-format-file -f emacs-format-function\"").
      shell:format_shell_func({shell, erl_pp_format_func}).
      @@ -1075,19 +1075,19 @@

      prompt_width(String, Encoding)

      It receives a prompt and computes its width, considering its Unicode characters -and ANSI escapes.

      Useful for creating custom multiline prompts.

      Example:

      1> shell:prompt_width("olá> ", unicode).
      +and ANSI escapes.

      Useful for creating custom multiline prompts.

      Example:

      1> shell:prompt_width("olá> ", unicode).
       5
       %% "olá> " is printed as "ol\341> " on a latin1 systems
      -2> shell:prompt_width("olá> ", latin1).
      +2> shell:prompt_width("olá> ", latin1).
       8
       %% Ansi escapes are ignored
      -3> shell:prompt_width("\e[32molá\e[0m> ", unicode).
      +3> shell:prompt_width("\e[32molá\e[0m> ", unicode).
       5
       %% Double width characters count as 2
      -4> shell:prompt_width("😀> ", unicode).
      +4> shell:prompt_width("😀> ", unicode).
       4
       %% "😀> " is printed as "\x{1F600}> " on latin1 systems
      -5> shell:prompt_width("😀> ", latin1).
      +5> shell:prompt_width("😀> ", latin1).
       11
      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/shell_default.html b/prs/8803/lib/stdlib-6.0.1/doc/html/shell_default.html index 478083ff780c2..7b84a55d141db 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/shell_default.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/shell_default.html @@ -129,10 +129,10 @@

      Customizing the Erlang environment.

      The functions in this module are called when no module name is specified in a -shell command.

      Consider the following shell dialog:

      1> lists:reverse("abc").
      +shell command.

      Consider the following shell dialog:

      1> lists:reverse("abc").
       "cba"
      -2> c(foo).
      -{ok, foo}

      In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

      In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

      shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

      diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/slave.html b/prs/8803/lib/stdlib-6.0.1/doc/html/slave.html index 0e2d56e46b09b..ac073974e0540 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/slave.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/slave.html @@ -375,7 +375,7 @@

      pseudo(Master, ServerList)

      at a master node. A pseudo server is an intermediary that only has the same registered name as the real server.

      For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

      rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
      +at the slave node. This is illustrated as follows:

      rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
      @@ -529,9 +529,9 @@

      start(Host, Name, Args)

      passed to the new node and can be used for a variety of purposes; see erl(1).

      As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

      • Directory Dir is to be added to the code path.
      • The Mnesia directory is to be set to M.
      • The Unix DISPLAY environment variable is to be set to the display of the -master node.

      The following code is executed to achieve this:

      E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
      +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/sofs.html b/prs/8803/lib/stdlib-6.0.1/doc/html/sofs.html index 04751d1fe1528..c9a47ca38b628 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/sofs.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/sofs.html @@ -262,11 +262,11 @@

      selecting, duplicating, or rearranging parts of the elements.

    • Specifying a SetFun as an integer I is equivalent to specifying {external, fun(X) -> element(I, X) end}, but is to be preferred, as it makes it possible to handle this case even more efficiently.

    Examples of SetFuns:

    fun sofs:union/1
    -fun(S) -> sofs:partition(1, S) end
    -{external, fun(A) -> A end}
    -{external, fun({A,_,C}) -> {C,A} end}
    -{external, fun({_,{_,C}}) -> C end}
    -{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
    +fun(S) -> sofs:partition(1, S) end
    +{external, fun(A) -> A end}
    +{external, fun({A,_,C}) -> {C,A} end}
    +{external, fun({_,{_,C}}) -> C end}
    +{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
     2

    The order in which a SetFun is applied to the elements of an unordered set is not specified, and can change in future versions of this module.

    The execution time of the functions of this module is dominated by the time it takes to sort lists. When no sorting is needed, the execution time is in the @@ -1832,10 +1832,10 @@

    canonical_relation(SetOfSets)

    belongs to SetOfSets and E belongs to Set.

    If SetOfSets is a partition of a set X and R is the equivalence relation in X induced by SetOfSets, then the returned relation is the canonical map from X onto the equivalence classes with -respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    -CR = sofs:canonical_relation(Ss),
    -sofs:to_external(CR).
    -[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    +respect to R.

    1> Ss = sofs:from_term([[a,b],[b,c]]),
    +CR = sofs:canonical_relation(Ss),
    +sofs:to_external(CR).
    +[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    @@ -1865,11 +1865,11 @@

    composite(Function1, Function2)

    Returns the composite of the functions Function1 and -Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    -F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    -F = sofs:composite(F1, F2),
    -sofs:to_external(F).
    -[{a,x},{b,y},{c,y}]
    +Function2.

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
    +F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
    +F = sofs:composite(F1, F2),
    +sofs:to_external(F).
    +[{a,x},{b,y},{c,y}]
    @@ -1899,11 +1899,11 @@

    constant_function(Set, AnySet)

    Creates the function that maps each element of set Set -onto AnySet.

    1> S = sofs:set([a,b]),
    -E = sofs:from_term(1),
    -R = sofs:constant_function(S, E),
    -sofs:to_external(R).
    -[{a,1},{b,1}]
    +onto AnySet.

    1> S = sofs:set([a,b]),
    +E = sofs:from_term(1),
    +R = sofs:constant_function(S, E),
    +sofs:to_external(R).
    +[{a,1},{b,1}]
    @@ -1931,10 +1931,10 @@

    converse(BinRel1)

    -

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    -R2 = sofs:converse(R1),
    -sofs:to_external(R2).
    -[{a,1},{a,3},{b,2}]
    +

    Returns the converse of the binary relation BinRel1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
    +R2 = sofs:converse(R1),
    +sofs:to_external(R2).
    +[{a,1},{a,3},{b,2}]
    @@ -2052,10 +2052,10 @@

    domain(BinRel)

    -

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    -S = sofs:domain(R),
    -sofs:to_external(S).
    -[1,2]
    +

    Returns the domain of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    +S = sofs:domain(R),
    +sofs:to_external(S).
    +[1,2]
    @@ -2085,11 +2085,11 @@

    drestriction(BinRel1, Set)

    Returns the difference between the binary relation BinRel1 and the -restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S = sofs:set([2,4,6]),
    -R2 = sofs:drestriction(R1, S),
    -sofs:to_external(R2).
    -[{1,a},{3,c}]

    drestriction(R, S) is equivalent to +restriction of BinRel1 to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S = sofs:set([2,4,6]),
    +R2 = sofs:drestriction(R1, S),
    +sofs:to_external(R2).
    +[{1,a},{3,c}]

    drestriction(R, S) is equivalent to difference(R, restriction(R, S)).

    @@ -2120,12 +2120,12 @@

    drestriction(SetFun, Set1, Set2)

    Returns a subset of Set1 containing those elements that do not give an element -in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    -R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    -R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    -R3 = sofs:drestriction(SetFun, R1, R2),
    -sofs:to_external(R3).
    -[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to +in Set2 as the result of applying SetFun.

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
    +R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
    +R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
    +R3 = sofs:drestriction(SetFun, R1, R2),
    +sofs:to_external(R3).
    +[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to difference(S1, restriction(F, S1, S2)).

    @@ -2190,12 +2190,12 @@

    extension(BinRel1, Set, AnySet)

    Returns the extension of BinRel1 such that for each element E in Set that does not belong to the domain of -BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    -A = sofs:empty_set(),
    -R = sofs:family([{a,[1,2]},{b,[3]}]),
    -X = sofs:extension(R, S, A),
    -sofs:to_external(X).
    -[{a,[1,2]},{b,[3]},{c,[]}]
    +BinRel1, BinRel2 contains the pair (E, AnySet).

    1> S = sofs:set([b,c]),
    +A = sofs:empty_set(),
    +R = sofs:family([{a,[1,2]},{b,[3]}]),
    +X = sofs:extension(R, S, A),
    +sofs:to_external(X).
    +[{a,[1,2]},{b,[3]},{c,[]}]
    @@ -2284,11 +2284,11 @@

    family_difference(Family1, Family2)

    If Family1 and Family2 are families, then Family3 is the family such that the index set is equal to the index set of Family1, and Family3[i] is the difference between Family1[i] and Family2[i] if -Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    -F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    -F3 = sofs:family_difference(F1, F2),
    -sofs:to_external(F3).
    -[{a,[1,2]},{b,[3]}]
    +Family2 maps i, otherwise Family1[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
    +F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
    +F3 = sofs:family_difference(F1, F2),
    +sofs:to_external(F3).
    +[{a,[1,2]},{b,[3]}]
    @@ -2319,10 +2319,10 @@

    family_domain(Family1)

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_domain(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    +domain of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_domain(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3]},{b,[]},{c,[4,5]}]
    @@ -2353,10 +2353,10 @@

    family_field(Family1)

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_field(FR),
    -sofs:to_external(F).
    -[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to +field of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_field(FR),
    +sofs:to_external(F).
    +[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

    family_field(Family1) is equivalent to family_union(family_domain(Family1), family_range(Family1)).

    @@ -2389,10 +2389,10 @@

    family_intersection(Family1)

    for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the intersection of Family1[i].

    If Family1[i] is an empty set for some i, the process exits with a badarg -message.

    1> F1 = sofs:from_term([{a,[[1,2,3],[2,3,4]]},{b,[[x,y,z],[x,y]]}]),
    -F2 = sofs:family_intersection(F1),
    -sofs:to_external(F2).
    -[{a,[2,3]},{b,[x,y]}]
    +message.

    1> F1 = sofs:from_term([{a,[[1,2,3],[2,3,4]]},{b,[[x,y,z],[x,y]]}]),
    +F2 = sofs:family_intersection(F1),
    +sofs:to_external(F2).
    +[{a,[2,3]},{b,[x,y]}]
    @@ -2424,11 +2424,11 @@

    family_intersection(Family1, Family2)

    If Family1 and Family2 are families, then Family3 is the family such that the index set is the intersection of Family1:s and Family2:s index sets, and Family3[i] is the intersection of Family1[i] -and Family2[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
    -F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
    -F3 = sofs:family_intersection(F1, F2),
    -sofs:to_external(F3).
    -[{b,[4]},{c,[]}]
    +and Family2[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
    +F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
    +F3 = sofs:family_intersection(F1, F2),
    +sofs:to_external(F3).
    +[{b,[4]},{c,[]}]
    @@ -2459,10 +2459,10 @@

    family_projection(SetFun, Family1)

    If Family1 is a family, then Family2 is the family with the same index set as Family1 such that Family2[i] is the result of calling -SetFun with Family1[i] as argument.

    1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
    -F2 = sofs:family_projection(fun sofs:union/1, F1),
    -sofs:to_external(F2).
    -[{a,[1,2,3]},{b,[]}]
    +SetFun with Family1[i] as argument.

    1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
    +F2 = sofs:family_projection(fun sofs:union/1, F1),
    +sofs:to_external(F2).
    +[{a,[1,2,3]},{b,[]}]
    @@ -2493,10 +2493,10 @@

    family_range(Family1)

    If Family1 is a family and Family1[i] is a binary relation for every i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -range of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    -F = sofs:family_range(FR),
    -sofs:to_external(F).
    -[{a,[a,b,c]},{b,[]},{c,[d,e]}]
    +range of Family1[i].

    1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
    +F = sofs:family_range(FR),
    +sofs:to_external(F).
    +[{a,[a,b,c]},{b,[]},{c,[d,e]}]
    @@ -2530,11 +2530,11 @@

    family_specification(Fun, Family1)

    index set for which Fun applied to Family1[i] returns true. If Fun is a tuple {external, Fun2}, then Fun2 is applied to the external set of Family1[i], otherwise Fun is -applied to Family1[i].

    1> F1 = sofs:family([{a,[1,2,3]},{b,[1,2]},{c,[1]}]),
    -SpecFun = fun(S) -> sofs:no_elements(S) =:= 2 end,
    -F2 = sofs:family_specification(SpecFun, F1),
    -sofs:to_external(F2).
    -[{b,[1,2]}]
    +applied to Family1[i].

    1> F1 = sofs:family([{a,[1,2,3]},{b,[1,2]},{c,[1]}]),
    +SpecFun = fun(S) -> sofs:no_elements(S) =:= 2 end,
    +F2 = sofs:family_specification(SpecFun, F1),
    +sofs:to_external(F2).
    +[{b,[1,2]}]
    @@ -2629,10 +2629,10 @@

    family_to_relation(Family)

    If Family is a family, then BinRel is the binary relation containing all pairs (i, x) such that i belongs to the index set of Family and -x belongs to Family[i].

    1> F = sofs:family([{a,[]}, {b,[1]}, {c,[2,3]}]),
    -R = sofs:family_to_relation(F),
    -sofs:to_external(R).
    -[{b,1},{c,2},{c,3}]
    +x belongs to Family[i].

    1> F = sofs:family([{a,[]}, {b,[1]}, {c,[2,3]}]),
    +R = sofs:family_to_relation(F),
    +sofs:to_external(R).
    +[{b,1},{c,2},{c,3}]
    @@ -2663,10 +2663,10 @@

    family_union(Family1)

    If Family1 is a family and Family1[i] is a set of sets for each i in the index set of Family1, then Family2 is the family with the same index set as Family1 such that Family2[i] is the -union of Family1[i].

    1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
    -F2 = sofs:family_union(F1),
    -sofs:to_external(F2).
    -[{a,[1,2,3]},{b,[]}]

    family_union(F) is equivalent to +union of Family1[i].

    1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
    +F2 = sofs:family_union(F1),
    +sofs:to_external(F2).
    +[{a,[1,2,3]},{b,[]}]

    family_union(F) is equivalent to family_projection(fun sofs:union/1, F).

    @@ -2699,11 +2699,11 @@

    family_union(Family1, Family2)

    If Family1 and Family2 are families, then Family3 is the family such that the index set is the union of Family1:s and Family2:s index sets, and Family3[i] is the union of Family1[i] and Family2[i] if -both map i, otherwise Family1[i] or Family2[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
    -F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
    -F3 = sofs:family_union(F1, F2),
    -sofs:to_external(F3).
    -[{a,[1,2]},{b,[3,4,5]},{c,[5,6,7,8]},{d,[9,10]}]
    +both map i, otherwise Family1[i] or Family2[i].

    1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
    +F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
    +F3 = sofs:family_union(F1, F2),
    +sofs:to_external(F3).
    +[{a,[1,2]},{b,[3,4,5]},{c,[5,6,7,8]},{d,[9,10]}]
    @@ -2731,10 +2731,10 @@

    field(BinRel)

    -

    Returns the field of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    -S = sofs:field(R),
    -sofs:to_external(S).
    -[1,2,a,b,c]

    field(R) is equivalent to +

    Returns the field of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    +S = sofs:field(R),
    +sofs:to_external(S).
    +[1,2,a,b,c]

    field(R) is equivalent to union(domain(R), range(R)).

    @@ -2796,11 +2796,11 @@

    from_sets/1

    Returns the unordered set containing the sets of -list ListOfSets.

    1> S1 = sofs:relation([{a,1},{b,2}]),
    -S2 = sofs:relation([{x,3},{y,4}]),
    -S = sofs:from_sets([S1,S2]),
    -sofs:to_external(S).
    -[[{a,1},{b,2}],[{x,3},{y,4}]]

    Returns the ordered set containing the sets of the +list ListOfSets.

    1> S1 = sofs:relation([{a,1},{b,2}]),
    +S2 = sofs:relation([{x,3},{y,4}]),
    +S = sofs:from_sets([S1,S2]),
    +sofs:to_external(S).
    +[[{a,1},{b,2}],[{x,3},{y,4}]]

    Returns the ordered set containing the sets of the non-empty tuple TupleOfSets.

    @@ -2861,22 +2861,22 @@

    from_term(Term, Type)

    traversing term Term, sorting lists, removing duplicates, and deriving or verifying a valid type for the so obtained external set.

    An explicitly specified type Type can be used to limit the depth of the traversal; an atomic type stops the traversal, as shown by the -following example where "foo" and {"foo"} are left unmodified:

    1> S = sofs:from_term([{{"foo"},[1,1]},{"foo",[2,2]}],
    -                      [{atom,[atom]}]),
    -   sofs:to_external(S).
    -[{{"foo"},[1]},{"foo",[2]}]

    from_term can be used for creating atomic or ordered sets. The only purpose of +following example where "foo" and {"foo"} are left unmodified:

    1> S = sofs:from_term([{{"foo"},[1,1]},{"foo",[2,2]}],
    +                      [{atom,[atom]}]),
    +   sofs:to_external(S).
    +[{{"foo"},[1]},{"foo",[2]}]

    from_term can be used for creating atomic or ordered sets. The only purpose of such a set is that of later building unordered sets, as all functions in this module that do anything operate on unordered sets. Creating unordered sets from a collection of ordered sets can be the way to go if the ordered sets are big and one does not want to waste heap by rebuilding the elements of the unordered set. The following example shows that a set can be built "layer by -layer":

    1> A = sofs:from_term(a),
    -S = sofs:set([1,2,3]),
    -P1 = sofs:from_sets({A,S}),
    -P2 = sofs:from_term({b,[6,5,4]}),
    -Ss = sofs:from_sets([P1,P2]),
    -sofs:to_external(Ss).
    -[{a,[1,2,3]},{b,[4,5,6]}]

    Other functions that create sets are from_external/2 and from_sets/1. +layer":

    1> A = sofs:from_term(a),
    +S = sofs:set([1,2,3]),
    +P1 = sofs:from_sets({A,S}),
    +P2 = sofs:from_term({b,[6,5,4]}),
    +Ss = sofs:from_sets([P1,P2]),
    +sofs:to_external(Ss).
    +[{a,[1,2,3]},{b,[4,5,6]}]

    Other functions that create sets are from_external/2 and from_sets/1. Special cases of from_term/2 are a_function/1,2, empty_set/0, family/1,2, relation/1,2, and set/1,2.

    @@ -2908,11 +2908,11 @@

    image(BinRel, Set1)

    Returns the image of set Set1 under the binary relation -BinRel.

    1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
    -S1 = sofs:set([1,2]),
    -S2 = sofs:image(R, S1),
    -sofs:to_external(S2).
    -[a,b,c]
    +BinRel.

    1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
    +S1 = sofs:set([1,2]),
    +S2 = sofs:image(R, S1),
    +sofs:to_external(S2).
    +[a,b,c]
    @@ -2997,10 +2997,10 @@

    intersection_of_family(Family)

    -

    Returns the intersection of family Family.

    Intersecting an empty family exits the process with a badarg message.

    1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
    -S = sofs:intersection_of_family(F),
    -sofs:to_external(S).
    -[2]
    +

    Returns the intersection of family Family.

    Intersecting an empty family exits the process with a badarg message.

    1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
    +S = sofs:intersection_of_family(F),
    +sofs:to_external(S).
    +[2]
    @@ -3028,10 +3028,10 @@

    inverse(Function1)

    -

    Returns the inverse of function Function1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -R2 = sofs:inverse(R1),
    -sofs:to_external(R2).
    -[{a,1},{b,2},{c,3}]
    +

    Returns the inverse of function Function1.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +R2 = sofs:inverse(R1),
    +sofs:to_external(R2).
    +[{a,1},{b,2},{c,3}]
    @@ -3061,11 +3061,11 @@

    inverse_image(BinRel, Set1)

    Returns the inverse image of Set1 under the binary -relation BinRel.

    1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
    -S1 = sofs:set([c,d,e]),
    -S2 = sofs:inverse_image(R, S1),
    -sofs:to_external(S2).
    -[2,3]
    +relation BinRel.

    1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
    +S1 = sofs:set([c,d,e]),
    +S2 = sofs:inverse_image(R, S1),
    +sofs:to_external(S2).
    +[2,3]
    @@ -3182,9 +3182,9 @@

    is_equal(AnySet1, AnySet2)

    Returns true if AnySet1 and AnySet2 are equal, otherwise false. The following example shows that ==/2 is used when comparing sets for -equality:

    1> S1 = sofs:set([1.0]),
    -S2 = sofs:set([1]),
    -sofs:is_equal(S1, S2).
    +equality:

    1> S1 = sofs:set([1.0]),
    +S2 = sofs:set([1]),
    +sofs:is_equal(S1, S2).
     true
    @@ -3341,11 +3341,11 @@

    join(Relation1, I, Relation2, J)

    Returns the natural join of the relations Relation1 -and Relation2 on coordinates I and J.

    1> R1 = sofs:relation([{a,x,1},{b,y,2}]),
    -R2 = sofs:relation([{1,f,g},{1,h,i},{2,3,4}]),
    -J = sofs:join(R1, 3, R2, 1),
    -sofs:to_external(J).
    -[{a,x,1,f,g},{a,x,1,h,i},{b,y,2,3,4}]
    +and Relation2 on coordinates I and J.

    1> R1 = sofs:relation([{a,x,1},{b,y,2}]),
    +R2 = sofs:relation([{1,f,g},{1,h,i},{2,3,4}]),
    +J = sofs:join(R1, 3, R2, 1),
    +sofs:to_external(J).
    +[{a,x,1,f,g},{a,x,1,h,i},{b,y,2,3,4}]
    @@ -3381,11 +3381,11 @@

    multiple_relative_product(TupleOfBinRels, B

    If TupleOfBinRels is a non-empty tuple {R[1], ..., R[n]} of binary relations and BinRel1 is a binary relation, then BinRel2 is the multiple relative product of the ordered -set (R[i], ..., R[n]) and BinRel1.

    1> Ri = sofs:relation([{a,1},{b,2},{c,3}]),
    -R = sofs:relation([{a,b},{b,c},{c,a}]),
    -MP = sofs:multiple_relative_product({Ri, Ri}, R),
    -sofs:to_external(sofs:range(MP)).
    -[{1,2},{2,3},{3,1}]
    +set (R[i], ..., R[n]) and BinRel1.

    1> Ri = sofs:relation([{a,1},{b,2},{c,3}]),
    +R = sofs:relation([{a,b},{b,c},{c,a}]),
    +MP = sofs:multiple_relative_product({Ri, Ri}, R),
    +sofs:to_external(sofs:range(MP)).
    +[{1,2},{2,3},{3,1}]

    @@ -3443,11 +3443,11 @@

    partition(SetOfSets)

    Returns the partition of the union of the set of sets SetOfSets such that two elements are considered equal if they belong to the -same elements of SetOfSets.

    1> Sets1 = sofs:from_term([[a,b,c],[d,e,f],[g,h,i]]),
    -Sets2 = sofs:from_term([[b,c,d],[e,f,g],[h,i,j]]),
    -P = sofs:partition(sofs:union(Sets1, Sets2)),
    -sofs:to_external(P).
    -[[a],[b,c],[d],[e,f],[g],[h,i],[j]]
    +same elements of SetOfSets.

    1> Sets1 = sofs:from_term([[a,b,c],[d,e,f],[g,h,i]]),
    +Sets2 = sofs:from_term([[b,c,d],[e,f,g],[h,i,j]]),
    +P = sofs:partition(sofs:union(Sets1, Sets2)),
    +sofs:to_external(P).
    +[[a],[b,c],[d],[e,f],[g],[h,i],[j]]
    @@ -3476,11 +3476,11 @@

    partition(SetFun, Set)

    Returns the partition of Set such that two elements are -considered equal if the results of applying SetFun are equal.

    1> Ss = sofs:from_term([[a],[b],[c,d],[e,f]]),
    -SetFun = fun(S) -> sofs:from_term(sofs:no_elements(S)) end,
    -P = sofs:partition(SetFun, Ss),
    -sofs:to_external(P).
    -[[[a],[b]],[[c,d],[e,f]]]
    +considered equal if the results of applying SetFun are equal.

    1> Ss = sofs:from_term([[a],[b],[c,d],[e,f]]),
    +SetFun = fun(S) -> sofs:from_term(sofs:no_elements(S)) end,
    +P = sofs:partition(SetFun, Ss),
    +sofs:to_external(P).
    +[[[a],[b]],[[c,d],[e,f]]]
    @@ -3517,11 +3517,11 @@

    partition(SetFun, Set1, Set2)

    Returns a pair of sets that, regarded as constituting a set, forms a partition of Set1. If the result of applying SetFun to an element of Set1 gives an element in Set2, the element belongs to Set3, -otherwise the element belongs to Set4.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S = sofs:set([2,4,6]),
    -{R2,R3} = sofs:partition(1, R1, S),
    -{sofs:to_external(R2),sofs:to_external(R3)}.
    -{[{2,b}],[{1,a},{3,c}]}

    partition(F, S1, S2) is equivalent to +otherwise the element belongs to Set4.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S = sofs:set([2,4,6]),
    +{R2,R3} = sofs:partition(1, R1, S),
    +{sofs:to_external(R2),sofs:to_external(R3)}.
    +{[{2,b}],[{1,a},{3,c}]}

    partition(F, S1, S2) is equivalent to {restriction(F, S1, S2), drestriction(F, S1, S2)}.

    @@ -3555,11 +3555,11 @@

    partition_family(SetFun, Set)

    partition of Set such that two elements are considered equal if the results of applying SetFun are the same value i. This i is the index that Family maps onto the -equivalence class.

    1> S = sofs:relation([{a,a,a,a},{a,a,b,b},{a,b,b,b}]),
    -SetFun = {external, fun({A,_,C,_}) -> {A,C} end},
    -F = sofs:partition_family(SetFun, S),
    -sofs:to_external(F).
    -[{{a,a},[{a,a,a,a}]},{{a,b},[{a,a,b,b},{a,b,b,b}]}]
    +equivalence class.

    1> S = sofs:relation([{a,a,a,a},{a,a,b,b},{a,b,b,b}]),
    +SetFun = {external, fun({A,_,C,_}) -> {A,C} end},
    +F = sofs:partition_family(SetFun, S),
    +sofs:to_external(F).
    +[{{a,a},[{a,a,a,a}]},{{a,b},[{a,a,b,b},{a,b,b,b}]}]
    @@ -3590,12 +3590,12 @@

    product(TupleOfSets)

    Returns the Cartesian product of the non-empty tuple of sets TupleOfSets. If (x[1], ..., x[n]) is an element of the n-ary relation Relation, then x[i] is drawn from element i of -TupleOfSets.

    1> S1 = sofs:set([a,b]),
    -S2 = sofs:set([1,2]),
    -S3 = sofs:set([x,y]),
    -P3 = sofs:product({S1,S2,S3}),
    -sofs:to_external(P3).
    -[{a,1,x},{a,1,y},{a,2,x},{a,2,y},{b,1,x},{b,1,y},{b,2,x},{b,2,y}]
    +TupleOfSets.

    1> S1 = sofs:set([a,b]),
    +S2 = sofs:set([1,2]),
    +S3 = sofs:set([x,y]),
    +P3 = sofs:product({S1,S2,S3}),
    +sofs:to_external(P3).
    +[{a,1,x},{a,1,y},{a,2,x},{a,2,y},{b,1,x},{b,1,y},{b,2,x},{b,2,y}]
    @@ -3624,11 +3624,11 @@

    product(Set1, Set2)

    Returns the Cartesian product of Set1 and -Set2.

    1> S1 = sofs:set([1,2]),
    -S2 = sofs:set([a,b]),
    -R = sofs:product(S1, S2),
    -sofs:to_external(R).
    -[{1,a},{1,b},{2,a},{2,b}]

    product(S1, S2) is equivalent to +Set2.

    1> S1 = sofs:set([1,2]),
    +S2 = sofs:set([a,b]),
    +R = sofs:product(S1, S2),
    +sofs:to_external(R).
    +[{1,a},{1,b},{2,a},{2,b}]

    product(S1, S2) is equivalent to product({S1, S2}).

    @@ -3659,10 +3659,10 @@

    projection(SetFun, Set1)

    Returns the set created by substituting each element of Set1 by the result of applying SetFun to the element.

    If SetFun is a number i >= 1 and Set1 is a relation, then the returned set -is the projection of Set1 onto coordinate i.

    1> S1 = sofs:from_term([{1,a},{2,b},{3,a}]),
    -S2 = sofs:projection(2, S1),
    -sofs:to_external(S2).
    -[a,b]
    +is the projection of Set1 onto coordinate i.

    1> S1 = sofs:from_term([{1,a},{2,b},{3,a}]),
    +S2 = sofs:projection(2, S1),
    +sofs:to_external(S2).
    +[a,b]
    @@ -3690,10 +3690,10 @@

    range(BinRel)

    -

    Returns the range of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    -S = sofs:range(R),
    -sofs:to_external(S).
    -[a,b,c]
    +

    Returns the range of the binary relation BinRel.

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
    +S = sofs:range(R),
    +sofs:to_external(S).
    +[a,b,c]
    @@ -3784,10 +3784,10 @@

    relation_to_family(BinRel)

    Returns family Family such that the index set is equal to the domain of the binary relation BinRel, and Family[i] -is the image of the set of i under BinRel.

    1> R = sofs:relation([{b,1},{c,2},{c,3}]),
    -F = sofs:relation_to_family(R),
    -sofs:to_external(F).
    -[{b,[1]},{c,[2,3]}]
    +is the image of the set of i under BinRel.

    1> R = sofs:relation([{b,1},{c,2},{c,3}]),
    +F = sofs:relation_to_family(R),
    +sofs:to_external(F).
    +[{b,[1]},{c,[2,3]}]
    @@ -3821,11 +3821,11 @@

    relative_product1(BinRel1, BinRel2)

    Returns the relative product of the converse of the binary relation BinRel1 and the binary -relation BinRel2.

    1> R1 = sofs:relation([{1,a},{1,aa},{2,b}]),
    -R2 = sofs:relation([{1,u},{2,v},{3,c}]),
    -R3 = sofs:relative_product1(R1, R2),
    -sofs:to_external(R3).
    -[{a,u},{aa,u},{b,v}]

    relative_product1(R1, R2) is equivalent to +relation BinRel2.

    1> R1 = sofs:relation([{1,a},{1,aa},{2,b}]),
    +R2 = sofs:relation([{1,u},{2,v},{3,c}]),
    +R3 = sofs:relative_product1(R1, R2),
    +sofs:to_external(R3).
    +[{a,u},{aa,u},{b,v}]

    relative_product1(R1, R2) is equivalent to relative_product(converse(R1), R2).

    @@ -3902,11 +3902,11 @@

    relative_product/2

    (R[i], ..., R[n]) and BinRel1.

    If BinRel1 is omitted, the relation of equality between the elements of the Cartesian product of the ranges of R[i], range R[1] × ... × range R[n], is used instead (intuitively, nothing is -"lost").

    1> TR = sofs:relation([{1,a},{1,aa},{2,b}]),
    -R1 = sofs:relation([{1,u},{2,v},{3,c}]),
    -R2 = sofs:relative_product([TR, R1]),
    -sofs:to_external(R2).
    -[{1,{a,u}},{1,{aa,u}},{2,{b,v}}]

    Notice that relative_product([R1], R2) is different +"lost").

    1> TR = sofs:relation([{1,a},{1,aa},{2,b}]),
    +R1 = sofs:relation([{1,u},{2,v},{3,c}]),
    +R2 = sofs:relative_product([TR, R1]),
    +sofs:to_external(R2).
    +[{1,{a,u}},{1,{aa,u}},{2,{b,v}}]

    Notice that relative_product([R1], R2) is different from relative_product(R1, R2); the list of one element is not identified with the element itself.

    Returns the relative product of the binary relations BinRel1 and BinRel2.

    @@ -3939,11 +3939,11 @@

    restriction(BinRel1, Set)

    Returns the restriction of the binary relation BinRel1 -to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S = sofs:set([1,2,4]),
    -R2 = sofs:restriction(R1, S),
    -sofs:to_external(R2).
    -[{1,a},{2,b}]
    +to Set.

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S = sofs:set([1,2,4]),
    +R2 = sofs:restriction(R1, S),
    +sofs:to_external(R2).
    +[{1,a},{2,b}]
    @@ -3973,11 +3973,11 @@

    restriction(SetFun, Set1, Set2)

    Returns a subset of Set1 containing those elements that gives an element in -Set2 as the result of applying SetFun.

    1> S1 = sofs:relation([{1,a},{2,b},{3,c}]),
    -S2 = sofs:set([b,c,d]),
    -S3 = sofs:restriction(2, S1, S2),
    -sofs:to_external(S3).
    -[{2,b},{3,c}]
    +Set2 as the result of applying SetFun.

    1> S1 = sofs:relation([{1,a},{2,b},{3,c}]),
    +S2 = sofs:set([b,c,d]),
    +S3 = sofs:restriction(2, S1, S2),
    +sofs:to_external(S3).
    +[{2,b},{3,c}]
    @@ -4066,12 +4066,12 @@

    specification(Fun, Set1)

    Returns the set containing every element of Set1 for which Fun returns true. If Fun is a tuple {external, Fun2}, Fun2 is applied to the external set of each element, otherwise Fun is -applied to each element.

    1> R1 = sofs:relation([{a,1},{b,2}]),
    -R2 = sofs:relation([{x,1},{x,2},{y,3}]),
    -S1 = sofs:from_sets([R1,R2]),
    -S2 = sofs:specification(fun sofs:is_a_function/1, S1),
    -sofs:to_external(S2).
    -[[{a,1},{b,2}]]
    +applied to each element.

    1> R1 = sofs:relation([{a,1},{b,2}]),
    +R2 = sofs:relation([{x,1},{x,2},{y,3}]),
    +S1 = sofs:from_sets([R1,R2]),
    +S2 = sofs:specification(fun sofs:is_a_function/1, S1),
    +sofs:to_external(S2).
    +[[{a,1},{b,2}]]
    @@ -4101,10 +4101,10 @@

    strict_relation(BinRel1)

    Returns the strict relation corresponding to the -binary relation BinRel1.

    1> R1 = sofs:relation([{1,1},{1,2},{2,1},{2,2}]),
    -R2 = sofs:strict_relation(R1),
    -sofs:to_external(R2).
    -[{1,2},{2,1}]
    +binary relation BinRel1.

    1> R1 = sofs:relation([{1,1},{1,2},{2,1},{2,2}]),
    +R2 = sofs:strict_relation(R1),
    +sofs:to_external(R2).
    +[{1,2},{2,1}]
    @@ -4133,29 +4133,29 @@

    substitution(SetFun, Set1)

    Returns a function, the domain of which is Set1. The value of an element of -the domain is the result of applying SetFun to the element.

    1> L = [{a,1},{b,2}].
    -[{a,1},{b,2}]
    -2> sofs:to_external(sofs:projection(1,sofs:relation(L))).
    -[a,b]
    -3> sofs:to_external(sofs:substitution(1,sofs:relation(L))).
    -[{{a,1},a},{{b,2},b}]
    -4> SetFun = {external, fun({A,_}=E) -> {E,A} end},
    -sofs:to_external(sofs:projection(SetFun,sofs:relation(L))).
    -[{{a,1},a},{{b,2},b}]

    The relation of equality between the elements of {a,b,c}:

    1> I = sofs:substitution(fun(A) -> A end, sofs:set([a,b,c])),
    -sofs:to_external(I).
    -[{a,a},{b,b},{c,c}]

    Let SetOfSets be a set of sets and BinRel a binary relation. The function +the domain is the result of applying SetFun to the element.

    1> L = [{a,1},{b,2}].
    +[{a,1},{b,2}]
    +2> sofs:to_external(sofs:projection(1,sofs:relation(L))).
    +[a,b]
    +3> sofs:to_external(sofs:substitution(1,sofs:relation(L))).
    +[{{a,1},a},{{b,2},b}]
    +4> SetFun = {external, fun({A,_}=E) -> {E,A} end},
    +sofs:to_external(sofs:projection(SetFun,sofs:relation(L))).
    +[{{a,1},a},{{b,2},b}]

    The relation of equality between the elements of {a,b,c}:

    1> I = sofs:substitution(fun(A) -> A end, sofs:set([a,b,c])),
    +sofs:to_external(I).
    +[{a,a},{b,b},{c,c}]

    Let SetOfSets be a set of sets and BinRel a binary relation. The function that maps each element Set of SetOfSets onto the image of -Set under BinRel is returned by the following function:

    images(SetOfSets, BinRel) ->
    -   Fun = fun(Set) -> sofs:image(BinRel, Set) end,
    -   sofs:substitution(Fun, SetOfSets).

    External unordered sets are represented as sorted lists. So, creating the image +Set under BinRel is returned by the following function:

    images(SetOfSets, BinRel) ->
    +   Fun = fun(Set) -> sofs:image(BinRel, Set) end,
    +   sofs:substitution(Fun, SetOfSets).

    External unordered sets are represented as sorted lists. So, creating the image of a set under a relation R can traverse all elements of R (to that comes the sorting of results, the image). In image/2, BinRel is traversed once for each element of SetOfSets, which can take too long. The following efficient function can be used instead under the assumption that the image of each element -of SetOfSets under BinRel is non-empty:

    images2(SetOfSets, BinRel) ->
    -   CR = sofs:canonical_relation(SetOfSets),
    -   R = sofs:relative_product1(CR, BinRel),
    -   sofs:relation_to_family(R).
    +of SetOfSets under BinRel is non-empty:

    images2(SetOfSets, BinRel) ->
    +   CR = sofs:canonical_relation(SetOfSets),
    +   R = sofs:relative_product1(CR, BinRel),
    +   sofs:relation_to_family(R).
    @@ -4184,11 +4184,11 @@

    symdiff(Set1, Set2)

    Returns the symmetric difference (or the -Boolean sum) of Set1 and Set2.

    1> S1 = sofs:set([1,2,3]),
    -S2 = sofs:set([2,3,4]),
    -P = sofs:symdiff(S1, S2),
    -sofs:to_external(P).
    -[1,4]
    +Boolean sum) of Set1 and Set2.

    1> S1 = sofs:set([1,2,3]),
    +S2 = sofs:set([2,3,4]),
    +P = sofs:symdiff(S1, S2),
    +sofs:to_external(P).
    +[1,4]
    @@ -4395,10 +4395,10 @@

    union_of_family(Family)

    -

    Returns the union of family Family.

    1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
    -S = sofs:union_of_family(F),
    -sofs:to_external(S).
    -[0,1,2,3,4]
    +

    Returns the union of family Family.

    1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
    +S = sofs:union_of_family(F),
    +sofs:to_external(S).
    +[0,1,2,3,4]
    @@ -4429,10 +4429,10 @@

    weak_relation(BinRel1)

    Returns a subset S of the weak relation W corresponding to the binary relation BinRel1. Let F be the field of BinRel1. The subset S is defined so that x S y if x -W y for some x in F and for some y in F.

    1> R1 = sofs:relation([{1,1},{1,2},{3,1}]),
    -R2 = sofs:weak_relation(R1),
    -sofs:to_external(R2).
    -[{1,1},{1,2},{2,2},{3,1},{3,3}]
    +W y for some x in F and for some y in F.

    1> R1 = sofs:relation([{1,1},{1,2},{3,1}]),
    +R2 = sofs:weak_relation(R1),
    +sofs:to_external(R2).
    +[{1,1},{1,2},{2,2},{3,1},{3,3}]
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/stdlib.epub b/prs/8803/lib/stdlib-6.0.1/doc/html/stdlib.epub index 70a3534c5b0d6994832b0fa39d5c62af18c85d86..59854c7e61063fd240963aa27c9d2c65676779f9 100644 GIT binary patch delta 558489 zcmXu}Q*@wR)3pu9wr$(#u;X-W+qQYew#|;6bZo0*+jhtPuKR!gXN|FTsy0`Rv1T1} z*6nKK>}nt?%78<_f&A})sWK!Y5T9W)xa0D!6T+Imvp z6$SI3^axuKs>c?pr~i|N(}G zkdKEonSl_Y?7BHIRDw$e>Ce(VP@525)lpw_%dVz}GgUZqGsE5z2)M=+A2f!@?#K;gQO7t|W|8b(U5 zxmwG~x#B4J#sc#>e{SjEZ@Ra;wSbNzb_K1Og*E!$==%>eQEH6?s>X?ovR7cg~ zZm4C}WZq~cUTHg-*6C*7)zzn>C#x^4UEu;PFOTs-dp;2t(7WZJO65SmP_u2^vhe~& zrj~6^ELlIZin_qTWV{J`jzjkGJ3a;Jov#++$-fd;e=oNZ*B*wDWU%PZ@F$o7dr$G7_)#( zczT|nch`d=Yw?rBS!&s&jDiffbkGO(hr)uPgs?ThLE6nKtaymm(pbTz^(WeC%IqW^P@TtfL*Arv^1Ysfcf6hmw;njv5`Mb~}x)W|2c1beNW|GwhBtgv#v0 zWeqLVOTenpj2{ymn$xCy7Y6im^WhCfOl=KWAgW^W=aF6=C|!ZDUR3{`Uv`DivI3%#0zvx5*`+4w0j(_p?C40&L5oC5e zBI)%`rqBW-2rs(R))pcj>B5_}mjOju`{b*MJ4$Me+9!00l2*thh`!3=PR-K8U7#(H z1sONW+k|2SevUBbS=*DE$AiZ4Kc7MV*I&P?HK?XlCN()J)lh-!; zWjnrD^xDp%MLQsIYGq7Wl$s}l$)cKxUqPT1YR>Mp*gSc9BQZ8c7FBe$hqP+Zixf|r z%G2tUd!Ew}MZ%Dmo!vw~dMEGSCk$C+r*86$Jgb!vPK(;GRn7Z*o$_E4K@TObTo@Kfbw5E^X=2JxGRea{X z>`l0a{cLs9x%4-%em;C%(^@)pW|N>k5cfzq#kf_*iSUVm2_Ay2;g9lavghS-unoM!-Um35duBv(K)Rv*P!S10jebSZx%IMK4$&Tu zCb7?j;t}59O^8^Dwe=Cyj=}UO2@K#FOikS+H7*HmgLOYxq{z$w!xC?~g4H3Vbg8YE zRN}y5q7M%iJDKw!`h1!O`nUJCuhoC+p(2(LNvI!&ViZT;=U_i=YUB$LCo}dC$7N$k(GtCOLi5AM9`r_iS+KCa0UWrTWz$5}=So&yO z+G8X{1_HF>HxorzV-$5xGkZx(xwzJDwytl%M%F@qGC59j;=u6F+}w_B2xe2H4@ao^c1 zpXv=gnDhNxc8x0?*>ScxZ?FpLD~;;8FF2U*2$UBIIics4z;;%!QXKyDBvfNMl*teg zFYqv9^yWH2M%V=- zxv*x!`9ep)MzIBS(*|Uv-MH%<57vYb9QL7J*t;~~EJ|x=tgLPHmXry7M{nXq6ON5f z;&aw|vnN>nHNzpZnHGL+0X}UYf*kR4X$q_?1kzA}k9GTe>sAZhDsJaN=6qaZxkU{5d%JrdSKe!LgO;38zpN7gVy`D^SQ6?w%O|I@IQ*2Uv0ur> ze~Z&K!5Z5W^Q$nb7%9amwMA?td(XTC)pF{QF;RUjGUC0rzc+W+SaeE!ZbkF&(}*m~ z7<{+~yoqGohkYC1c`CZ@q6fi&HSDgSH3e;b*Wob=GJZY8hW*i}q)wPlkB*t|v>VKFrC%NF zV!OnI3EwJs*seV3?6*}q8(JYswHuhb$9EtwuoZ1UwQ2D!weNVd7t?u+yHfLkRY<+$ z{ZW^rJh#VO^pfTZqi}M63};Vp89D)8slBv&9lVG<*8R>=R&HKZ^JH({fO8aJ*M-JI zBrhAUf3uPE!~W}|mc2(=;Ab~QwYix*|* zd5+u{!1^(X+{yi`qrXl01H)FQ$Bn+Xu#fS&tKvUzcbsTm z^GOF(m!EM%ftKsQI22(fw~C|{;PGr-)$aPo{hNrb>Mz{#hk|UiW~e-W)>^f}oNxRj=eFg*6qp z7wiX5{!@+(8lZEhWOF4pTxQK3uTv6RThS?vU$mGgjDoFv{nl-3Lw1W5U>Fp z&n-!~LZ@-{?SCM*IkY)f#k0?9k{$ZA52h$Glu+YR$t+gDECJ%X8xUS=3sXG;-?65q zWr`WEsx<|O#i`=(8DQOM8lr~*8>1{a?f{UzuiW?UI}ZI_FkGCZvr(b!y~KBOmK)co zZsWa4B0Mge!0Z&A46a_z6US$fWGXb+)^4(b^@?9 zp*$rn=(@cYqtFd@t;$rU5(4!>%y*?5kwv5dQ%L(;o8OS-Bgod9$>p{j7t(h;8|qf9 zJ!3*U359~a(a}+3EgDCLgXYEB4AoW*oPxRp2kp-C46-KeCU%L0|3S@;zv%B;38WTz zE{RKZORTc@PpYOS=_5v4`l?b4Q*i*@&-{hQTG$ebxMIwk#Y77&#k6J&OS_r9&xZSc zI)Si#>QL=>yzl@IRXw zzIu-*^?5TiGvkNd-jjv@6Op1$q}n5)uG2DW$$#}8E{%qfj}Uk%IORuw;u9sYxd8XR ze(EH5JR{}1?t!XnuNQ>Eu5=Rs!=%72_CjjPvIKkIN7cW0%wgS>C21E?Os`fN`_q?$ z31*4&0?jX}GzUfyXF_oSH4V_%@E>31q@S{nq2?lJr9&a$Mw7S}Ek?LgluviI_%N}u z4$XHmZEAk3cbGPujbXNG%~8tc|H~}({QZO!>90c&Yye{zw9hPNQx?Q6Qo12a=7S~z zL(Ze;iSq+L(z+|fE5-Oo&K_$?ELBhYMw>k%_Rk2pG-xA~a0sy*ej32`Tckiak$eT& zD=p?{;cRsoQwiVC#N`CFS)E(9d9W!G+`!}$2e6xgENc$Kvhy|^h_#jjfu+i#)+>lu z9(c&zsf*Lo$Kr#7B?*F7rtwBCOY8`ZdIgr6yD&yWyILbLjd^elI>r>6*Mg=L$u1FB|k`aj$kipp2u#32h%|f3<`2DwcOx#32F`^njnCxW`d3SeoKAjj-%G1 zuG=6^9~wE8LElo{29XO6COM=36_^H^|F+M0Kx^Kq<0B^ zqQ6Wi4y0SFN=66xbzV zGO15A*DrfEUW=OtV3`SOj= z#rIphnadfO-~-z)neobRS>FY(sl4O!CWE@x!iU~{d_3R?`NUdu$~100QXr+dg8$Fb zn=DR;)NFp?>BqYChFej_OcjB(Bn<-mh+EZ=ZC}r?_@4zGDne<>Z9Ng^3gUC} z>nOLb1YH;I85;LG8OR4C+<$AA)-)DbH%sX983RIG2SZr~v@u)W2 zxH{-pLXLsCNfRzRo1Ghb4rahA#Oa=F0%J?D%?2yYWm50kk|{sQel>Wh*!8)Xz~Q?3 zKIEF1Qt$3qy2G{l|p|ArYqrvk{9$D|b&aV9T2y`^od9SYRF*>&C$R+)`LX=^q;l@9Q0W|C(UKdf#QLs1Qv29f_76Iq0@y7TVju#RRsI4Nx2GW-e^mGyU6&BP*PCoSpIFr7Rjg z6X2gsOVu_gR9_r+y4@_EuXFjHuc>_QUXEKt9o3OvQb%sGq7^JUTq3;(Wk8}^1_8?K zPtT7H^{oN|iJv9RiAIiVq*{Ef{>bEh^K(d(!81efQ6Jlc>z0SUkY$!m%aSZM9{Tq! z{xd-cT>WD=_rz?$*}G2bJJ&CrSlp}5T3Hbrj>WQ{LCqY9g#?jV#u*ZkEl7njAu@~4 zOP)QP9uFAE?fdPGdS`dog7aj#^6eMijnyUZ#{&l2?pcsVE#;1k$qg3hkZC0FrWVQL z7KD`Tnm2U=0LpPnC1&x6>`(V)Euu?n-R!7W&z?HbpTX{Q=gg{H~;`icBM2zRJ?=KMd1F;gaV zwl0Uam1HK>l9Fs=$qDHB7(dTSX@zAx%0Ey$@1H2I3&hK$wxm&_uXkVf{~~lC12;$7 zme3{SQ&l26*ukBE$ESswB30j>CZOpBsK6#ihYf=9B~B6W5H~H7JpK ztlma4NdFh*u9nq#Mc)p5L&9%_+Z;bFyPLnsxroaFgf%<9;sILfyQJy9*7<- z(KGW*MLW)o$KvxnB^8T-ZoVHWadELT%9B4PpLkj#&k#h$Mz7N}DOO~+uCG2nwN@r) z%9;G5mK+w~YWLFOB!d<)y3m;cS9AMJ??*AvUUl?Bj0r6i6hl(z&>--QicF>iqJER} z8AXc1d8IH<3iXSqU!kUAn6#N_yGsdNyk!$b6{)H&-vfyIG!t5=DOo2_tKyU!lNk3e z84+ZQH8SL&Y_1IyTo ztbM}R6(O|H7na)Uy4ka;CVybbB7jg$2ozha(~e76VSqXSV6dRnMr$J-QQHJ|0~q2? z=J!yta7*`_Zb=RizLEh-*Cmr#Ln927+3|9Ognh-+e!hy(23YE${un!uKLXkR{gQ&q?cY4(1pbDB&aqLAv2bY5>b!CUw4qU&2BCjZt*7-M zw1uyFTbrO;jJ|tBGq5Js9%TY|}(&JK@ z)PN=xOZ}V6_jM==o%Asw_3V5C5gS1Az1Fo32r%j%v3^J4U9q^upeZeE_jo@z|Iw zTLvk9G~&y5748;)%mY?@h}9J2@CQVU(FBRg57^nGq2jo7(>B=9KwFTQ&O88=auGTR zv)24q+(UU`U7VrR0X2(_EP@YMuW&J`+XybUA1}(f0FALp0fk@XFQt4D9vxG2Qj4xE zm6hT1kfVuk$!d;@p$s(^G3!@Vx=fK58*E5LqtR^g_K|By^uE<}-#jw)f{O5g#(??X z>X6no%VYCbF%E0sx{t{?yS2bh|CDyQM6sS7SN7Gi(lN?2X(3~2diFFktSF1lXL|#R zYiK6Bg1bZZ4!s3||JslsO&Z;jcDK_izjd<$alYUERq{>G&G+qrf*Sn_91f35!p*MH_bz*O(y#>cll3;^H+;%3!$pNu~D zCqKanLPnu|9-r>I-wl4!P&i!^cr+FEjE%hQF!tMD!d(s$)Hjtr#Y4WK54<{R{NQ$R zEZu8sn2U~rOo82PdFXAY|BnCn>EK`eo%_RfA7%|LrdTg$riTfX{{ixT< zI_BaPL3xw@)0W`$5hoDl^GBt8qcf;Od%TbL#_mYZC%*A8=uO<(Dbuh6QpxhinGewz^uKnR#@YZPqwImp}GYp8}nhqHcg9HALx@v<wkYt);aj|4W6`!LSZv~e&(LA6Ln!Lho%o! z&4vG5jjeXyDFFC|aJv27Vr;LWb5KhYqA6q6n6OsW#Ym2f zL(9ct=tBhJkt0>aR0~NT`Ca9mK~cHJQehTk06xo8G$@fF26*SdU3p9NGH7YxlI1Gu zZO!Wg4+;bnR3dY1EM+kEGb3>%hLIYbaVeQtg&Kc>Gsx-&w?qP~Zr%AGO`rlnc~X=# zoxg+?n3bFhxQk&+C?-oPHfp&prmSl==$5L#o+d;RHhj;C5?W+F#6;(Pp=XfPV>P-M z0o@X?%+Sk4f%GmWhD+y)>nZ>Ejnzq;)ND7hzKL#bYV`_+rXSjk^?%9SsfPpqRi^r5 ziFZp6n-(iNY)+5rBJv%|h6&m(wWY9z(k_7CH^aKS?xIpAB1U1V5*?awi6|!urOidk zID^;9j$Sr8cyV40ifnnAPd>vO5rIE21bcKK{^c0?QNsP{7-3X zc$bRUc#CFC`tO{fP#ezRB1~SuLi6+uxHiw37vsoJZ&AhY4$%` z=I|)970UW9w;*XkS9&nl=f`6_{}fvg%UTv(pNlSw@J{HHY?H z$jS9U#=hvq1vhIdO^*nUVNmaH*|_ISL9+0J#1#u<8Z+?V-NnO#izSt_c?+uJRItsZ zcnSsl{Q&_|&heU=QRH^|=_3`AbTDDu0v9_0ZGjOG09AjQ%btB4Y{=y_0Hj@@3khal z+1s@0%b9Vpa{_Bu?Qu_?XUZ;e)>bx67^ki`g8y7sZUncg66vRQomPTtFR#Nk;CU;a1Th_=;I$IW^E&D)~D0z=c6# zRDKr9Wrs0=8!v!1yKu++$4>-=Kkl52&gaQXk7i`wYrB4URXDIQRg_Zi%8uD~TeAjp z$L9(}|C(ZRwbD1vY5|`U0vjcb@p2LilQ7Z82D6LWoWOm83r8_M1hwC{^V(XC#WrDdo7+oXudTQxTDl2-QgK+V?!e9}g|hJ!=kn6)S%R&zKq z!b$JzEt7>%^M0(N0Nc86SYFbW&j9ZW^FqI*G?WGFpF_ld4B9tkiY;7PH0+$s>>ROG z7bC82Y_26&!Oa+M*nE%WIuag)x9-cR))sJ|i2swGTQOfXjS6!gR70d z?Cdjt8IBCkZ1oUb-RJm-;tgUA{Cv20h;p9H^UKH$q}a3Ll(T6+st5$D*4}j^X}i&^ zNV|JatyCw;lc3zJB(D>#L%4?+=&6z8Fh z5L>27lC2cgnY65A*_IImy8yl)=o5y>c4?w_(=ZooM`HEHwIMm!QA7u%s|N2qZ7t1X zN0`Vd|B9taZ1vQIb$A`^@r9SOqt-?F?M_QZ$;zrkAb(=~cCeCac}-2`bt43{WlP3# zwRIn?%a{e8LT>Z_DPk!EC66TkDVB0*L7$#Vx}QE=#zQL;ZgRH_wyu{NlF5>7TOUF_ zQZ^eX2prq*q@W4-5#Rc5TEv3^72ZC6tak=8-hnoOInUtZgiE4`Enrdzu-bEbK0F`0!x+ z@89La(Tgd|^;F)K_F>@wb2DO{q@;sFE^k)Obgn>FR|NC(*a{Fa0zDkW_xZ3ZKH9zJ zz~>gowys-ia>yD|#>itnVnB9u!rXsw!rX9mFED}hOp|?i{}}hPi$@T6Tlm!7pAEy{ zKfneePOUVL*cvB-jRf2ILave5^r-zHgTLNA%6byb9`PC@?Z)jXraXj63{D#xnSP;1 zw5w?y&0iQqwkLjb%&>65Fk|QZF;&A{8UMm)MEtV!^&o0*FG`jbE6tS#XX8Wzb6qMG z3HrE=_b?DZj`2Y2{|*J{^SgX`UY~}?P1$<*@DE8+NN>@xo&zR-M)Xnv2*old#P%2C0(PH{tJl0wa}2(>1)@s<&eI*?i=Yi5 zZAqciOh)CiLyPZ7tzXq2;1rL10z4IMZ7 z(sZ(g-dwooLUJ|acTg3qGfJz|i9GC)vZ(3mvc*MdPrbN7EBQ{*Pt#8-@mzKQMOUa{&U6`Jy2V|5a zPu3CJ05SB{y|2(m=9#*IHd7EX;u&*Gqji~suZ416NId=wME$&IR9DOgW0gDU3M)fX zoPo$+dID%rk$pBx9SmF}14g*!&`dJwsCNmM6R2+?#Rs+};vSVMth-Ux>7iQ>DwFj+ zwdjOitU}P1yZ>4^j+E3&p9!c9-Vz-HMTudaTz(AFSyp=3R;H)M& z_?)Us{A*Ss&vD1UYg9)eMg-6)78mw0QmdhD7_a{JpEmVuuwSCe zsa6;bK}P$HIrh%Rx^CrI0R!*MHq7aju)i^>kh1~rk0RlD(Oc2`f{c06 zH30n9Zctz1+KWBx%fx~QyRxL=d0tOx+|O`AmU-z-h6N4YDzpA|JJ&cnS-rodp;V)p zU}iRHP24Hme`AGWM2$(dhhS`C{>bR$9}C(0T}dUnoorc-q9owG3bltUq#wG}YB3kN z`ky5}yUl7;?(w1lI-xq^6Z&pnecP@8oyhJ9Nj?24Zp{Px>n&Uf4_g6y^jawbV6kLXo_mfy$M0VqEVfVit_?`0 zikC8-O6Q6VVw74-yj`eQCvtXX*n`d+_tQ`-4>?-}bB5ZHt4`k0nC*XZ8N9Log*LQR zYMWW|=6l6O`pOOo{yfAuWDmKYnQ^dcQHK3iR8;=N<9MYBhqUcWoo-ylUEuwjr-Q9b zkwazQ;#KXOHm{4Oupt$8$gk6rJPf?CerXH$SH#vS&JU6HFljHwCEJ!c+B*Bvn&53? ze++J63pA(}c3AkzPPMPX>MuO^01AFL1{F7-@HjUgm&2ztvCsIHzLL%y1aZes*Y~8@ zDy{g(H9Dx;OANbb2g#!;dtnX5VhaA`utSi<7$?onoRb-p9q8`k8z)<0qJWvsg4EW_ zgI6cBU6ck}W!f-^(czwa!~XqqwegMS$K%8r@j<`w`>u`~BdUrv`EW)lhR*YXoi0fr z{o8AO(T1`-tY_xZSqE(q_<0f@J@GA}8PrO0;(gEi-qssgv+9%@y?1d-lWKlMQ{$@K zhsqSBY>UXDAf%`{E?YLXOR|(NkvKCV7Ny|mWvugW5%JLYpqnB=Ilm9R#&e8Px$VM% z6kzT*QBn|_(dr3Tr#Vi)Q`6zk|Aj#@{@e6m{uc(-dZw;87fG)1rTRZpx@q0F3KhWk zBUAq?ijZ1PMN&wIK_~Ff#=0vIHBdk~u`eA-CpFBv-m|Q4$lT&m9&I-2ZeFGrZ7e|` zgEf=7^NJMTEa*aJPJ>;$yT%tTwy4ORT$`wjlZQSSYiKbI$xk7Hmh33^m%~DSmh_2p zmjXjIm}s~LiQ5fEEvExEo-8ewM*_gC_uajh5IfQ*w_SGFWR zZ%6U^qqtP@FR8?wEWCB!f-J9a;R{R2>-Bb@LWgh}myA@ArtdMu$l=@K^XMkU@EE+= z`Oj7&51-M`S;tHsF;-A}mP9_cpzmE<5&dzI(5A)d6Rs3gmu7gQa|rY) zdzt$v{#J%&cHPppCfjH>E1~<^W392Vy7b;e{T05|s^qPBPN4OkRNXbF@oz$tVOSv9 zL5AWDFKfjrYnhP$ik`M}IKtGg+bNob&W~nPY?}QtO(0nnR zuq1vOlf-wVrV(mwOdq$+Xt+zT2#d`WX@WOMRUemBHbspFO`Pk3zJV_-&F7>dq+&43 zS2HWb-DOYn094<`@m~TqaVM&ha1Q%jvcPr4Ak;t(M}A531Zb7E{{>0S`Y(n0@9l_v z5oOi7GK%K(4>LCXWMhk{CqxOrYeM8Yr*2&Jmo7{JCpM$rX4kdCw)5WpT9$3e16E9nj-WD%Y0|mncRv5f}shnRz3aOXqS_}@6J~^0f)Mh29JXm}7 zVSo~e^~s1TqjjgeKtFr2>$3<3u(Aw7S85@J~UhqBi9R$d)ogpV7V@e5)$D+T}YYFL)m z3P5SZZjBXIm?Z2o4;wnel3q+6DaeVgR32mS4Ngl3C&q^O!QE%whpb2LY{XZE+4m}) zvYA<^Mi#J{l>59Ys zbv_R&&btRd|8Rc&2qN$j&{1(8iS*KZBDd}2mVMx2cVc08svm+NLS(_M=|?xV4FVtu z=eYbis9jdsaE^9^DwKVp0wQc4T$aPruEz%|tu1Ej*2$*xe(I?dD7#yqO#Sl_n#&nT z=`j(PpEy`Vj3c&GRAeSRVX?KL>SH2=bu97$Y>5D)s!;KJnI=b~V{VN@dB+Y_HvLnE z$tVc8f_%2!fHO?q{RfpjA>EF8rrR75p_K@cH)9Lce zg%J?+hw#mDyBSo;9&YkcK)w;+>7gX%rfXPur;@p|%vR>#F2x|O4xkxwH^`8D>2WDB zj=JmC();9lx4HPhn!H$OL`Ad(t8NZcxNakEWt&LfjL~_8;Vte}1uv(O^;H&lhyH&F z?T!But~fotNIWa$?Pg3p- zL>C-0WOlI}jaN{DW`+_|UK4}XO#Y?(bBY{VTu2D&H);xib$%qJ@HP6=&o(?#LVTYL zJks_v?PZ~X9pK3E;1XN$T^!n|5vC1fIEs!&Pjew1S2i4n7N~Pf0fcpiG2oZc>O93q?wWUW7G#QFTHH0ntR{h=ZUx zAo`BKam4z$GuVEVBLg8Oaa1C#psBC;V0Z}udY>*z(~0xg*8M1uWU!b;ykjnwPh#vW zH6iCM8EbEQ`t{47`yR|KqwWAlV<-~Z8UU~?)>3k>>a2#FX z47PS0ghpKbOIutptVjJ&Fkfm{7kkkI#@p)^uDK>{?N?;6VmL``{_d}^g15GuU4gpSF(9aar0{nK}!F%jJNS0#d|2- zpDE&Mrz%H9%a5wlU4%TYr5RPW0K4pz{79n%+=X{>#8Z72>FJ>J9}$sF1eE^{VExB*)o zC`j8dI;lZLeo$JadsHqhpe!MLMoysglU4lRum{*{VsXHp)A0-O>_lL!pR!tSC77-*e@d^QI%MLY0Y{2jJgwT!wU|}kOGYYxXvnk#790b64u2zkGt3#SU^c!OKb~K4K-otIQ2q1#kn7vcu$hYlPdjQO zex3GyPh>m${I^>`1$yi}HPVp&y@gFlvgxPYMu+IYZLH73u>{gG)%sLrDnWP@q`m3# zmU$U(%I4tMPhiJ8WvzP4PQjlCNYD9*a_dHYZ~nKtL(}GwE_9L3141IZl18`Om-t7~ zWtdryysAnQ*n;og$nSM|{S=?x!AD-T*pOf01~2*~soLAttK8dV67DcS`;GZVpc8#` z{G_O5)tUPdThd}}LI*8VBCShV&vg>%r4VjgbN*e*{q=R!+WYm=tjljJAJd42MU2-| zjgOhN1ix9Z&!(cD!Chs(MX6WwG-#lj61OC*;i+l>s6P=2>9lU`*m zaqeARJb5_~h*Um$t&I163OY>hzey{c_1fQRn|pkJBi*c=-=>8NFR!clt@&`e-^^ES zZiD&>UG4jDs^^aop;W@-IWyaVU~(y`@5=hbR8|bb{%%7i;8LV*L&IB&P|1u~Z95kA zuX)Y`wv$7NxWm9?+kd^YTg1#fsEQsbmWwjs2E%APuFd0Iw=gt8Hf$?wm~u;x`3gEr z@iC52j~rc;Q*PVfXMGMH-McK>G#95Rvr3OHMrO-RjNy~5FNtNypqd9pupayhygU9U zOU%&OwX|XMY!?lHU)Ad>wQu#5{#R+Q zk*HGqsvm2l*ih2d`Keuf8eq?uWeY@+6;Q5|(IwMKO^q|vHDj+vUnwS;(I)1MIjw`` zqVl1QySz_}^JBmnGaM~y;(qlHC3$APpnpb3-3w$?0!`4R zCNIRi=rU)N-g^iBPK?og^*`~zda zH>xSsOI#_Ew%peBO}v~~G(?GPQU(Ovj4@c@Apzr}%i^Cj$gq4kZ_3mH+d1RcwnS(9 z7t&O;-@1PCk!@$y-?O*zIsgUH@Ok^!Hg@JuAyfG)@{FkuZUI+`@VJW@s64;Z9-8a7 zrvhXTo!lzW`5nEOA69#7Hh4RX=vc zBa3Tv!#)%*&+5h0LjF>SJ5KLD$`p6{ zUD7}xk_07^7o+e{dAgBTSszQo=9*L~V+3m67Z+QGVBu$knJ9w|7U^eq&uk0~QsitQ zQa-FiBFTNlUA44#G+F7TiV@gB={~bEM{Xj*dtowP-F0CP<~`;y(~B5s>sbk$JS zu&=pPhpaJgZ@c!sn7)~Rnube%x&~|NL=-K9lF^d_#PTuiCO}T+|76ZWkdm+vz>a=G zLMCji7(9d`1i9X;)F^_@j|oc4S{qy~I+jAUN=F|1qaFDMtB*dZlI7$FF~@6^6J$<2 zr5UKO1M?2)==Gz*@{kt4D95ozt4Rhl56Q>~V(M5bEbO5h z{KY?F%3zrOQ2lhhLm6*z9<4#`7sI5Nbi8gJm~%M`MF?Cn{nc)rmFyjPmp_cA0+(5f}m0CO+=Z#ZC{Sg1G!Sg2m z<6<-0$8()NnO~XQT-b~Dl{KUg@7-7u3#Agsyv!%tUKtH3O0R5YNFb*6!rO;%kXi_Z zmL<|7PalOCTSNfQW$YilN2_|G?w&4R4_~Jsbw$z#GCYDY4yiW9wTG%nkFwMKea??Q zvyodgCSW;Cc5MFp4$lVMa08M1^~aB@<7mn+v3UsLlD-6D4-$Y;KUw& z9vnYfx0(vAT3x}8+{Xr%|H4)0Elqx5<*rv}<#gLFS9#mb9Zhl?cZ%NdH^S=7qgaEg zB+xAsK22HXZ#-q?`J6Wq*{@ueZa#LsPkC*3GXrO?oMFZU_aLLF>DHHz9)I~fcDy`v zIICpPka~DD5VVsW;pb*=^ErvFKxJRqD)~IFLEOFiIIA`(r<=Wa?Rql2%!;x)bCQ>hzY3>Z89Vb@-ZH|Ow+69`|JHZ% z1pxw2H`CXjo%h|3H)W@GMQh`A+hab1-}tX}^J5MoyZwZI3vFNgTE#n5^|QM0pCm9L zd<$a4Ix9CfT?KMWl7#fShNl?~wmjMo_%pb4^b=%Jeh~UIJ~k0h1YxQNAqU6BQDDPC z1b9B6-ZW(Lg@=Zrt_NhE49yp6Vh}M&=YUaIn6ku=xVe~uO?Z~5$GI`#KskF?e+Xd` z%fbXF3B|d)LF>E<7W-v~gEf)in;V=yd~Z>oA3r=cKZ(Hq^h|l}PUb}E+c7Uca#f!9 zU)wtL_Wr*}+NRcq{Q(z>-?Ih^914XHg?0}`oJkdA6qcqTww~>J4~DpqOp182Vi6mF z@D|*&bED_cQF{Y%LS8ME1xfx+9Ga6N5~%U``4?7u=>nhYjJJQBSWQ`*Pgp`$xe2|p z!Pb|TlY3*VkE@K>#mb(gf5G`rG&-OLE61J!FUNz3nCS@j;#%#M>K-u*>pXn@M@d%J zrVC$PdPJV&w=}Fp??R2;4Nt$;lzkbnxw)!AZc7{ONE2E(5c9rze`|&w5%}24B*x;` zpx1`~an9FY=hmgXcqqMDLa`x!<Lo;w|^nRjtb7y~TQR@aw&D$8+obCMDUVBb`Xc z!O#9*jX~+2Ij)lDBnG1P7#;`^8ZM=z=)jW`k9AIN4Re6h7{y-1F`O{NNKe$DkR81l zk`zHVN*C@GgeHE_;L?cV^Cyel>1V6nua#fph?5CMVG9lSSX7CLV-&K*Kd?jPT&4=L z8C_}BPn}etQHLY4>uHLNFL6>u1qh8=Fy?TzcuP|0Apysr2|Ex(O}=LUEcun>E`8pX z4n`H@oTNBnHV3C(^Oua-?Zf2>vV(o}Jxof#5Od!;$WUoiSm$U;CPltyq3m7ffM>7E z8va9v9fMpLwXS@9w&t(euXGxR0o(BdYwWJ2$l)A+#5=sP6?bju4zUh3 zOh!^fOTh)%5RA{41)s&c?x$CgHbXYY1_A-|Is_S^95tL}&nkAj^CeYQ#I?I0)%eRO z;BeIKoa4>^T=-@WR>`@AZqEqEXBi5?7%gTU+tLWk+oJI79rDZpDMxqz21R93$lsa~ z7~NB~l7Kx!v9y#KHfFGMBsViCywLG!Y~ybCqcFMS6MW;eIeWYkx{tD4LzL+Ixjr(J z!2Q~f{&3if!ArZQHh8ao*UrZL4D2wr#WGu5-I@|AqZ!uV=0~ z#(GKG1_CY!XckRZ@6IBTDI?<$>n}6(9dFbQ5GE%Slgjz{QyKZj#)lDqGL$d+AUPPH zN)!bR@Gi+8up~9%nXgoZa!RLpoXcuMY?+TPNIi#%(gJ2;_8g%KbXLygwlv*`2inq+ zM%vd#*O{bE%EaQyk3>z@YcI1jQr5DevD4CNIN38ULy`-+6%d&|MZMv_EBM4W?kS)p zdu5&Nvy~?l>LK-Alv>_hOsW1gzPO-r>nEhmP{HT2n6ace(Z}{z+0y*_ zj~V{?j~TX107^jPk-q4N_4h@ioO9DzwFSV62+EX&{}QVtO<_HI*Y*zRUW-kxmTWj4 zvD)ZhLk>sw9Q`D%fIt0r*G7J}a_w4*+@h#gc8GA2&h1Q-L;%u1yD zlP)R#$c{JOX*plv$>S67!%HZ{!hg<1?J$G~YLffM2@BcbhQlQhV>gFATlVt-i(tKm zAM5x>3Z*ZC(Uutov$yyl|DM;owh%;7oB`)lkSZnQd%>rj-z7Yh&0d}Ob&f;TZUoLW z<;eM>zemcHm>zAFm^vV(1#k$+st0En#w8GV{iPQDjwOSPIGU?O=26aPBk3xH!}jN) zWKToC*%_x9p|)lj%93wP9FC0#Whoh&*BBKoQzZx)CIYRl=wW8O>a??o5Ql5fEjkHH z<;)5(n<**f(TMhO&w}E|(g#(3Am~dllQ`Xl3xRbKW@e#kF&q7T3DB;WS1Nr{mTiUN z7%C%sfKLrCJuLsH-%$W3@Bl$yR($ohMFT2-4XqTaBPuB8h>G2V0H$u@u2}>%Yv_&k z2KBKG0oqCi8;{S}8K1ht^-_zQ*;PMv7?f4~W2`wb#KYvJ!T4W8&K*6(&byJeYHx+9O{)-rc2l+~ zd##3#@Np^?FJnC9^pqA*vDh<%MsuI*UHy=hMWE5ige+X68~}NyfGfeUD)nnD6SO>1E;gWyVp0Y4eWEv^23%K)qK~K2b5tY{Jv}#-3|c z#n-CNRp!)cwSb7iw4o9*=>v9)(6cFR5Vb*2E~2(f=MahY<^22!zXs2+l=gTKx{|P? z&cZ#7)Sga>0aSHdzhh2ByLcWoHa0X+Nfn)VdLWGmpVWFy_Y6t_eA!`I^+g_G^LDjd80f8&1 zpW|Qxhf^unC2!>IS}Mm)P{XDjL5)7|O0-s$vmmO-bdoc>^>kNf8PMhrT$V1T(bL}& zxE4l5&}svEKtI(G9ux?4_T2O6b~WdkKED>_9RSMBMD`dM+MJq)+;S?IiL1YeAr%YQ zg9{&&SAV6J{yKx2;}m&{Xdp;K=R=M>OB!AhlGo}Vfe1X96m0*hC^A(}Cj z)F+OtIcHrXLl-Y?OStsQ2V;f&EZnZ~@%RCHFpOGwu>^dQ@?r|$hu8oeT^DYpc3B~| zB>~R&|2lq7;VT628Qm~Nbw2p5(B53QBW%!NJUQ}^nE2Es+*ceLe}W$pw`JMq4B$0W zzvgr-$GSd}KL=iI-pcXFx%-Kx^mr(|J3iRG6eEOv=&UB$w{O1`0-EX~eBFF44#cld zoT<{;&hPBDO+|qUZ1LO3ZP`|RbXXa6WB~%PYJl4ZG}P>oe7bxkOon{cgp!8vQq*5M zf_j3&teB$wJSJb zhOt(8Tk_##2+@#{$xSVWv`UHayfglkaKQ|&+oJ!fx5|HFU9ythJzU(c>eJU@c>ntX zS5&1mMl!<2SV8+yrHr0vh?+Y8OF&UnK<}||YTp+1K+M-bgf&tPgm$K#$)s*CO)&-5 zb>?`R5~<2pS#mZ&0Wz4!|{@q~P*Ux*cBXF)xZouVF}Oz);iH#jFa+ zZmFT{KC4z^ekMMZ>_n7lJN{O!s(cb-e)0P9`&o8s_4c}Y?K-QM8}pclS@`>|i*`p3 z)fx2u;KJ_FKAe(&{XG@Mjlg&o_PyCDyAkeH_ESBuvy1$D>s-v$PXz12=pMh73Vl)O~5l%J$KoJNl~Pl>}?>O{v>qyJ>VhZ(Z&&;4abW3p$ z$07{IuY?wR4EOPM$b(*0sES-XoY3qj#{$KYQTZ?gCFidOkqBRzVMYy^2))*seBU?) z9;jNNSTWsZDm~)=a|Z&z#73Zhm#9WuoN83ADvm5rk!quFFjrCzs&KZkHiXvjxn!&~ zb{y#}=NNpm-1h`YjoLCv)}g>Q*5)D24X=6@^Ml|8zD{t?Ht4(P7rt7#&>frfe3LxZ zDRHKeHV>Ib0^U6&ZGy%d9xHvMoMkJrZRi0Wb978}o{3PM5Z)fx}6^=H>gGKR(JX^FPje)@@!PZsfEq z9WY-e?E`@l;Jozy(g@n$Yr~<|QEnkGK=OzTe>y4LD`|JMGpARsiHy?4#5n;;TO0a1 zy}|JVoI6-RXRT|9c?NmNJSPW$72xZ~dmfK9EnSGvN=rLP{!>K)(^Y_nm3 z(=O1HP{@Rs^6r7%&EElN&HE=dT~sobV7GGD1@Z z*w!e_xsFR^tXnoM?jzZ@3J0Xb$lpi>T7&FJ^WKm?mXQFU9qo-FA6aIESaS7EO=ecA z%8J=Rms99(0emDA!gR>L?>#C`Grdvk2h*O-ZKMMUZTVHP|AKC0A_gHP?$np!_WQ(f z3pNiP+*Ll)+x-Zm1YzrBflW1q{PmQ_9GQmD-1F=ePYHGf$C$Rj89SLr8dR-c8AeTe zlOB20orVSMSC{%ply@Oh_GA4)Qn9iK!8za+W~Ogo3s>%BiZ2hxz7!a~m+uHV1kODk zT;y}=I#tB{qRlQv2wyx zAhsO3Cg0`W83j)mIq|Yzwl_zE6lx&(U#u(Nn){g7>{>0mVsN)*0!dq*@Tu4@rjtFn z9}8+pxXoTJ#m4PkO!b2=pk2e^$^=L-vJ?QnHmi0$OP`8P%MkThui)Q5#zx5aGW~lz zJ5mLqx#f|_`)^uHWwV9m-@~6N{fecpSN*(piA*bVr$9Fx)54nFlD{kj5Ukv77k=RL zKeK|a-idB;Ag@nhhjwxIc9f9fAlrXH{{JSF^Z#ZNb8}*(h$TEQ6-n;x?ho~9(GAm*;`7;hV$!2pANYP+Js^1lG2W)l$W@~LO z2f@(98Rp7^Bl3{)ZM&4qP(Od~PVlDjN$&H9zx8ptY(yfDaJ=w+hPmMRTwOh!Iq z;U-w1C^<1$L*~JfL7FHKL(D)t5~6_xn8A(0G@po=Wg~^{_^JWoEZ0n!6Kx{ZF3`>@N^2G2KwmM+wDamAE+17^+&&qE}+Aj-~q@a_W`fhy!hC z1bDUK68*Zf`NP86(C9rk0DmatG8w-DY)5}p$#-yDnK{xCQ|uyc zGxG6K_VS(1fruUeFDDjQST1V@$BFZmRj89i(&l8c`Fmr2c272ChQ4!Y%qSK;lhb_x zu|uv1pQ6w0wG(4`zeNHnJ>5PjG-oC-ZoBUOH$@Q613>A7IuQHXtc@-~_quSEyJ2n6 zcdS*gH{S~B4*6bQWht1I($jzi3D^^G&vXB!@5s2RTaT@!6??<1B~C^-!wU-oyMiU^ z#jhr7Qo03qo5;45-{)j6=Y0J=0lzQ;d=PpRSV@KX*^*!W-YF$m{cZgtEo926D@o0g zJ-WuD3#iRx-4Y=DsiqY_nNlxpDO@+(Hjhae|L49Uc_b~-{3>p|j1+1w)zo;MTuFS?%udXr7ut2t!oG6VTGO4E$h3kaS5u?mFkc?+K zkf>&mMg0TLjirWdtcJ3grI48p0tlj44iJNih_`MNPL{4Lq7!G!iBPp_ zXx}nq)1nY@J%?SmYki3Cb3yJ+?k)O}p)Y-ceuy@7%1=kGVm06lD8(B8Hz~h~j^Y}f zZ>oHW#oiJ-;QwBFQHTQp>=8iJZTn5`>k;JOi3KbpJ~!kf7rw7wuk=Kv8SLpy3l{lt6X1M_i~WgXfXb@S zzT`vxQQ6eN>(UFDi3Z>`{BAJcaufx>)zvl5~qAu$eRv8naa$QI$TmV z^B>z5mU)6Q+3C@|pzu-vEELCIDl8DuEdQVcbLqGENi9UB5u6}sl7}>T850dLT_~td zn%u*Yl>Up61^KnLDushlp+5Fz8Um812j%mnVKVpz_QM&rlP4rwYp0XlLaI<@yv{fq zci`n~M-*j}$BxNk&e##);6U_P>+;c5{MTL5%z!J9tAaet>LZBA*ga5nbOuUPa?gM` zVpT+()SnEEce2x3Gg|tFXg-}82CGNgxE2=00&Lt`Gx%xoMVyD2lXQU@#1OAYGVwU% zIbYr@Dp2XWfH43@2d1A@F1|D~0p^m6mY6O+wp@5J*`fn&D?k81=P8wW-(Uh`B-Ma7 z&q%seo;{#f?`SDjh^&iMR!qm)+0Z48)qj|7rjM$FGrso8kFHD=9F{bfDF;t?Bs&9YfJ+YJve3vjx1Ar zZ!IQVycmqMEJ5xKtRriG9!@ynoA6NYzA)CBiU1C{Rbk{2McjynWlLHnF_=$5nc!Rn z)wrQ#LTRf?AK-=FzYmFxSKvzJNV$sE5C#fqYndG1Q63w>kgAmVn3~(t0(}b95Bg!x z$R6Eix47dHR3Cw~Hwmo2*hXJs;HY4g3SJ_`&9{(AlF+POz--BcO9l)?hx)SQm6+ml zYhD136?6${_#};QXKmU(u(%93@5u7PrnVn6q6Okvfz4q-$^Bwn^wd%}wN390KP=gL zB4%)?(*EGMwqnfQP33eHojY>3>b0S17xNjvN4#D8*wTe~aN?p1q_Gf8zLa6Kjaqq= zlzMUD|DghrxABI%(cf$N=vfphN+qsHva|(w*0_zVWbn$HZSHs3lf70l@npzx)9#3; z7G>}Xh>oL2b)p!KI{*IA#H+~O{=($P6Zrg+hpZni$T@Y$6JK~8XtRPDvGcseS#x_G zk&!D{CrWqz-J1@gfqi^KqI9r62JE^%NbsdsAk4uSF7yHy;&Gs&Qdjrj{$hXih)0}hF0%!|OXsa~yj_XYtB zDfL8m=>zmwcm73C!f-+Vp?6}E6E(4`9EAB_1!9>&F%(T`1FqU)aNU&~j}N~U!wBtf z4-%6nIzO%+JjI7=ORE^}EB~09a|bG*qqlXxAeLae;eDHlez)AP6Rm5N+c>P8JzWI= zOuJ_e#c#TQhdy7d3@eiheBAp6bW&7u~Kpkl>JhY(YXAY`e) z67dgY(t5Y)|Jc$-*fK35s##2w*p2j$KIrQqkBG8^mN(9Mt&o36cOvIthDEMt!IbjkA7C?=+Wr&S zfn{DK^c~;N;~RM8E_p3G57R%DNr6F$`P8);XwHx)hO`WDS0U3vW2#alcd^a&Xl?3^ zfQ1@q7ky_G&?GFY=m%|`^5hm;q>%bB%xI7;70mdFz>^AU8G4pnI{Vb+lhTbYzzn>MaK53_1Gj@8pRm3zk20-wke^r%Ei=&@h7q@w`a3FAMDx&y7}#Q zea(gu9LZVWpBXL)pxP?x;MjCEyOA%W06h4ug~4Ev5taFkR$4H>rQs8DgP<{ci;==A zS&PRF9LCkIg{^$DJb!ydE`~TKu+L3}HVf zXvGjqe5?JN*-5PUx<_48th82^DjR;0tdLEo@vXE9$_@Rw2ML}{A6WEe!EdH|z@E7j zan_l6M%{hW#+H;v9Th32Qq?>OY~%;$X2J)D<^8GIC-yQATf0xl2-S#s zl-~Y|`Yl@nf>QWywU9%3!=!7=e`ATifRMm($0&sm5x$sX5)qJ*kae^#{=NT9Ms7uV zZ-_6>=rvP!>~zgF_E@uz?TJshFpVxW5o@pe4-h!#!S&0b;B zrx58WW|ed1RGx(_01q~@^2zMMCxOs*G85(1G1qFeqlJHU2 z!T(CyLyE*kW6C$&o;H;nz&dszGhz&kmpLq^pihgvY8J21FVYs~Z9_t|xD%4*TmGd1 zW7l8Kz{|%VIO<506 z-_MSRc7KKTyY0S;v;jGZNOL-~aL1B-yf8G@(Bc+TbSF5vNl7j!rkJLT(rjCg6GwZ@ zml=uu$1;P{RlUT8@AP-eu71=JP30Go3jDiLU}6GN+ONhkK2@L1dEfN_0gVOnKS z-Ae7q+b(K-mFsXHo&R2~CPu-Te!iL27HwWuT5Lk0XKDOTF|>aKP752nX5a*Fy|lmq z@x{C(nLu|NU{o^{DhdqJo}g^aw}$@9L-r@H=3|6zZ`WEOc0}QmwH(fyTiuYuzcrj& ztY2dZH4=>(l}ZrVPruB6KYsY45XUIaZIxPtnHX^qVr?=aDYll< z!VQ8fs(tlHH&*fild$flr=mIEs&KONiIpOy`@S~{;6!GEhJy)L&bwf&CH{C#stBcu zQe>d=Hz&5>an$!Jzwz2eMz}fhcV4E7mip${vd`5NKMyQEK4U+E6F@$*shgoeE9RL` z_2$O#z}-otnaDMFV^LF@d$Wwo8`Jf3NA=1De|TFIOZQ@i_QM2Qp$o zf_oJQpa3}?7Sd{J;Gq{#*U55aESnjq<;Rl*ZR7fbOVny-gAl@niw#j#nQ^%86ZTb~ zxd?S};N|Al&aYEfd!qSbAdBSXDQhXP+1K!4`FfrHe6%VGSW)@ZihCMOUk`2csg{+f zZAc7=G8qoW1^=)O5*0w|du#Y8Nw=$&DB6nz>}yt(n&ret6{?65&-v2fj7K(6sd9h7 zR|w(1b?_{-JyPN4#66W~+I{n^6#X=W>&f0<9yA-wCRrgrrK!kveZrekuM_RR77it# zSzLZd&FJMg)(Y7+4_s1N>izr`_2nC`Tixxi8}HKZ&SVwr;@(Huz|WJG{##bqn8^+X zh{*{o9TJN)?lMX;&tI+}I=f}=MYG=d)fTam$MO{nKWbpa_fuQ>LyUl6$!ekTGy^|7 z>`}>(UfP6!&>P!)=zg10^D|$<<&E|8D8q@m5V7Rri_bdbmsVPwpsF}izH`0>6rFWC+j6ryTHx*^eG)g<`SnEu*vAose zlRfay_~I={bQjHd{7e_rv|;xaXr!WVZA8g08)3P3aj6*t>)YhvtKSZv!DZBJf@f^;zm$80)Emp0`RB|G+ zB2>3%TUwq?F(4J#dD2N4FrpXrZ27)GJk=kDMYqNpnLChA%qdQ1*f}L0pc-nxb8iDz z-hPxW;Pr10h_2sDbY<6IT5|ghDPAFPwt{fBf3%82dD@vjLB`8X8@d5TMLAnocF|L( zo5G#v@y7nG6MJj~%-Y=h>ZRR*Ra(;)g%+2U3nOmW>*~ew*2|ONv&ESq$;Y%D#$NMp z7ZKC#Jt(Cbl5Ur;MrF2s%nJgyDR?6>N8P&ryi*u>7S{6t5zI>vuMSl++()VwpQ)%# zw?)P;{FJeN#(_s7UFv|tm4(>XKjXp`_Q6C|QYZvX4zyX=dW`~q!@@LH0mcCQY}Z3~ zb2mHX{?bOo)DlKB;>7lZ8K~i6V*y>jCXdNR{rEscdvoA*FA-bJuyVf&rS8itm}=F+f~7CN!egQ}4*NJ-?F3Oh-z zO9*Vu{kAS%E*zlXQ2&YN*ulTqI|FWP4fcj>C$eOvk@Q#6C_yqMLV8b(D{`(3spyub z;o_fZIq!`UwZN6HQ!#c|p!E*l!K2?eDYpA{LLJ)n2nKeIacv-wP7=IJ3g`$O&DcNL zoJ&|45u)JvLw^CW#YRjyo`5JWw6 zNo($>m=!sdmx}fsNd-&arH}EFNQM+27;gr;*qta-!X1_1*zYoFu=QLGjR?06`jzdg zdlCUE;AYy$|796=_I{LpO@}qp{=sp7uNcGCZjJGZ+yif4rpe* zA(8KEPY6)d_~D4IW^xfQmdjH>stlZ1uaBwUoI`GW_6P>WltvHf)j&W?16OgBljP5r z%tN-JiV>2#*y?-M(3lL)0m)<|0K-nmr5$jz9QWt9fdOruA2G5Gsfm+S1kMa>rRb^qHT2CsVewodOct~BV%)S|JY8Bt|)VWTe_3bqR^ zRvWNSd?40jwHzfoQyi6)OmSB#%EcAgozV1&A_TcaM^#x&_v9TdV1ysLE~tqf!O^~e z49aXyPx@Ah*_Z{DERc07%*V!;AT_RTTSZ{)^Qnhu=c4MEHg0u=G$~H327Z$g!6PL% zhSIbw8(Ojfq~46B@WDQn(@pNxVDo2xtQa7af#M&9Rw6T^gmst6s*0V=$%ImxCt8)J z2YXLlMZAQj6OiI>ev1xK4f*6zVg%igCVK=k7GU6BW?pO;f-=h$8j zCtuD9J;a^@h0(Fj(z(e3)}?FHX`9@%cI3B930PW13|GZ0yZXW@s#_7n+Grs zEQgMGDMh8ShhE7L2e|vG7ob7pWocV_Ame=n-TkipW2prEoOCIM#@`rH%Y@nQagIAz zYfP8kuvT0(C{z^RDmqZS9S=;_i{>_bpaqrc93p=NCg0QXcn8Z}rCC!=nIEnI-N%3D z`Pg-MVd?7Q%#95TIod5`@tNk9B@I}|%FDBNVc2)iw(CCh!ASb)5RwBdcF%U4qA$(3 zK=VrthPhSY1LwdB1i8wf17gx+aWfWaAZwFsE>wNr=GbNip_)R_}Z)dU?R|c@kgg`S7 zoNb3}o@izv^0cPo2FRq>Gi+(m)#dLP>rT7e@QNv{NdCp^R1VyhVk#qxO$}Ty`aOiA zE@DPLbcv$JuCW;mIR7Wps` zO>`DYzutV#KAw>VcN1YH6osle1tcd(BixIcNsxsd1)7yBMirR%9jD|xe(1z!A8BR0 z1`(~8nHy*dYC$y(4T7WJ+^t@WCi-hu-!P$mBa&8&IT`|8{xe9<927Y>M6lLT} zorPTWp7uN%G;5Xa2-cugy!(YFr-aAImMlGJ0xpU zVn2a%iSyMuCC^ zL68(|kzrYJ-V8w`Mg|@7@Mtz_RxmxmRJClGm8h%lQV9z*CD|@if5X|xS6kp?1>)O% zQ*Atda3-Eb|9a99lT^F)|1c2E{@6uE#O_-SQS?f|Id%~F#iZFYLg2TgyE6PYAD;BE2&8I_^DeLdF=?&zA}k$wOb(bCw0b zhXk>LrM#y@Tog;00svbwVUi>(CmO@Kj~ULb!gm_ZyZK_PTnX)1nja*;w~XlUSO1SbRq(+ zSBPUhr`H(BQo?#(nrui`%*bGmASwY-)_x9CqkT zs{2cC@Y~AuMq;(T<1_+*v-VHC#pVJN7-5wqgoqUuj6P&2A){xYpVMkaUX~S?g^00d-P|0eu*0p8% zY2~7j^&wz;BiD_GU)*|8RsDUq9`?PI>}=(iR#7K#YPO_NYL)@uL5=UO(~+oo!U_80 zx0zY)$!~c5+Y5PBD=|9T$0+F=*TC>)S2hf384+jomd$w_H zyau6NNJ7k7k+7s|qM2*nxxLH?3%-%n2`7Rp_^d6FaEHd4>yi z|H@u~1$W^0(^t!2-zhe-LmaeEuK%-Fzxd~iAJX5pw~BD*tsU|G>>w^`m*Km%XOlhm zqd0iLsxzr6+^aY zmUQqFwIZ4^lyX%x5W6OR&vss#nbrve&`ZUdVyq6$|8qj~M7EL~CK*U7q*>KPh-F`#beqL#nJGAt2^>^%pfnm4*;x$b zPEeRQ1G!ug@xe48mT7`CLzuD<@WH*v@?uJT1bg}Aho~b`a^U#qu#(qltCr?HVtzb~ zn#KDXTCQ7;$S1dQWsB6BT$#HBC`c`(2bCR)A&BPDYTGNf?w_Wu@v)A<9amj2^QG!G zYoA5=C_EVtoe=K25Od{-bZ_qM5-$(zo1L489FT~(%MU4B%emgt z-ZoZ3wq`{Il}x*#I+jLcbO{x%#J8ZRJ)ySz2{nR=!pS@PLm@9BxU@j9_{C3SPt$x05e+`^N5SMHaEw zPFO6~)175h8v*?1Ty7E6P>;&63wYaTZ^FQTR=ik zLu3*G^1L?-IHX&NA@Y6S@Gjn5@KS%*833WG(o%yp*D;|Ji(x%s&5{rJpN`>{mW~68 z1ghU_9VXqcfD0L1XQqCw2w}l+^h#vQs!FlL=QW;bFY}BHH)FNq)#f_i%F0URj{$-) zg$s_R9aA}X_VsvWLFp^g-?Lo1Z!>20B00)Jg~8U{IF@+9stls6SL^$Zntqgkpn4TH z`a(k124mOiD*Q5`HWfDhL!mZxI>C{pxf#`Q+UvV}`#FP6{mm`iTL)WLdx(8^HQ_KJ zNo<`X1f5NU8=A@Gs znk038i4RXQYcf9kW*ie-59)UHGj+u8Ga*Mhrq*i*y7$%IuJ5%&JbN_zEI=2H8bhFe)iN5z* z6|-CK5ci8>+DgYmKI(Bb*{D8?)j7vFIOlcUd2qL&wzj7sKA)HO2BQGnAJ5O%dxu-h zzgQ898EZYwje5?#zvLfi6vWkfC_s9bB|;q>UX{79DVMg-<0^HP}`8L>5_oDwLTK@buVnEbvG zu>tT@nYw6wVv;xEFv}Na6OcJeXGsjN3WVQd+2lS~)dOBMkrjmiB*t@gC0prbP9tp{ zU44_hVkIM47L&I07O3T$FV*pi!X_*g(h)=+X%u{?BwFo>gZa>y2zF@VkRU^5+>y&6 zaVTu=SOTB}mlY?PmpxMWeAHw&V_Wb7p!tEoOk`U)iq8HNuXW9tj0>Re0F)p?27IcU z5uPT0f1izrH;*X*SYJ7854`u*`nl4p+6>HKtSsWq;AL3Z@A1V2deC#!xhm^Sl zz7$2rJ;B6Z+-|9*nlnijfjkrKKwR`x6TBt+C_+64#P8LMYXSQ4r?}(YGYJum0$h`1b<(DRw3>-tYp^dWD zt%N4QfsHqSgIUa%`_-nekDLIvpXvC7%UYs63tDiJBC$;*U*##5AuXuDp{2ef>6=Sm zO`9Z%*B9+LMp7C5L`dNo`TZ@&!`ORKaa7LKlJap{5wo~8X1EpTJ2>za(!O! z4L8&7brFFypf1vG!{;GewzW=%n;XF6us*QIP+#@!w#w*+sLTL`XCWc|U5Q+q6G?iqz_Uqc>`n zmb2MJv~0}Hb5MPvCcS%Voo=raG7~mBn!g`_69PKbJCOq;OE#36RYk#m>I`^Nc>wnY zXgdKqr!Qw)&=9z}V<+4e*)vvGK1jbkapRfJP#2k9%XDyMuuLHn7kI;W%&=aoU8p+g z9zV^~SElVqKjP2)z4>_fE%#~Re2a6$Hav#`Yc($J4``C( z3mVk#B-Zn&P&&D=q}Uf;Kxh#zw3Ww%$z&)MLXn}PiRtZN&?dPBvzK7rvc4y>xP=^y z=P#%xTi;@}gu19Bqc)bd&IYct-R&*?TZiEJ>5^i5HW{(*(o>Y+ou{pIM&+^`(gVi# z+6;e2?ltc}?w=2qy;fQw^CARb^agx@m0^PB=g+?lqf=gskFvq@fY{M_ad%w$oZtHp zO4pak<4PDjluymQUnUp{FI#8c%$2TVnex>}$_~%(IC{n+vae}@+vy9F35>src6~`P z)y~oxN*?2uiMkd8<1;FvJBOr<)ixSVXsuuwLN9U|RCCw#fqg?nZCenT(BF^)Hgu_a zYS4YkbY*tdNH&O509DOOBN*h3t^>+VU}!pi)F2KBEG9d!^(A3n9m^FGh6d*jPuQDa zSX#ugn{;+@a49W%SwEs{P8e9VZkS)^1*c^txYoAec?Qz&-!f3Dt9*B-at8biip ztwXbJF^n;iIxmn8!I<3ueZ2&X-3h_Q5B79@VUx z_G2%ZgC?S>WqQEi zP+uI8u6KEbCD4$bZRN?xIqktC)dYnV-Xz=LM6VH?recsp5}G5=ndhgJ-@3~jX=ENZg&GFm{xyF@9({JUKYUGKt^V7=;-0(Pi6RK`eK zt+sIO2^gY7sW^Z3D(PmPGMs@f<&sRjAG+o_siRvcoCW8`i?5`h7oo-}JvoqxoB?@E zvkLvmhKa@@i;&C+jb^bD%u%czM>^(Q@0Cnix?c_QwSopS9i7rAzZGl2mQC=06$za| zVxOXt%^+$;i7ip3Vga@gC;a7f;L3@RGHfbB0Z@WTO{ZGS=rvCsu-QWn5*((URBY;> zeo6uNR-scieQXpj2cp`RI^K$x+2txZzJs`VSGj+R%G4z!Iwy8N-gEx)TrW9Ek<=$b z;&O88(ljwM5PXV&p3tUA$_QwH_e4`_^sZ}`u^TzBeMjXvw#?)SCen-{>KE_7XC07# z285uz|G~E6XmNLM{r%C26ZCAuI=`X>I2P>8w^e(z)jQUZmx7t7U1!yi=;6jzXPI0< ztA*eGlVy6j*1IqCyMNxnIJV})MQ&sbeC|h~q2|fw-ziay_W`UH{P2G#dGr_`@)YXb zXk$Qa)A9=EK4Y4M*FTzCo8p>Yn-H25ngH&{NotPkN?)gAx6SBYudE|5o+H>F#vkC* zubZ18K@OQVgNDmJ2{nmT<>$Zed}od1gR|W=IPM(xeTAG$I&OyL`PuLvG(w%o_y+KN znp(e0;=W5>ze^ClOBB9K+;gZKA7|T8SEkK&yrH~ejz`o%nIhpBMhsk-5Da>fr~$j| zY7Q|#SwP)3jI45yBL}YV6=T6Qq2BNcxp)J>O~SRWmnPl_@MN)$ud-{Yy)CSqkN@jHF>u%%Ljs(Z{rk$`e+x;add;l! z>j>7SHA7$*TPDf`5VENs0i?Gwx6It7CWYtyqWz-zp9?7Gx}Ny%Brc|CrIgssL}#}D zAb@{LXy44te4cPL@rY!BE7*}gf%x(GebQY?>2&n(JNhu<-VW+mP~%Lx->J8y#6p@` zmq>1n1IHFu=0m0}SZBaNCz(;WByhda|H|!9HOKO~9R|9J$Y>y=1*l~V+ydGOqI-3d zcl%BWb`XLN2a5~`3>?0HKh|Xdwmu(EzNUA>`ezM&K&U5=giR641|r*%R}}d0hRG8a z7nO|e9k_v0vO^Yz)zQj3=f(wb_!O}*_Nd*+Agv9B!&&yXw9ZIl_a9N|l)RASLH$*L zE!RJ3eV*oxm0ifL0fZ{=iDdb(%e;+|qmZ7z2B?`N)eWTbW3~JA{o-EUrx3CSlJh3UX0A@Cvw{ik9a{L74 z=T{gd)IX^?Ukt_K;G9eE;#`QvMW@zETA?t|u&=trfWBgxI!`S5rNdDFVEtp#tKtV; zGiS-X7DCBcp1J;{-RxaAjree7Lq8Y7x+vMb0Wd7It;r29TS1uwchHToki}ItqF$1S zu?Y)SS)N;W4>9x!n*@xpoQ$a{{C_0ZN0BOPIG6IyxWh(EHQMwYJbL?zJpI79FP^mRPW1MLz7 z+AaAiCtO(^KaSc=thsa?<1_0Ubvet$$&(Z3*Fn^*;hra`?@~x;sCyd2z3N#?)#*N~ zMBx)3jj*9IZFNN?aE^7-=;8SO(cWJVWq9PtuIfg~ z2wDDTsddbVHhq##TC|h0X7HRLUL9fnYPRz#NS0?)s;+IEzMDPQwg^t_FSyw54EmQ3 zjQg+47{MJqdxn^s`z7>B+t+shj@!&556R9pel=5sbH zio!5M1HR$l>kc0vzjuAK=fuj-@8K>3ko|%4@l7zuq%KkihEPkbDQ~;l`9A=jKw-b1 zg)jA}VqIWSaC~?a!K^B=Jk_zJ`axLf>+ygJ&!xgjs=eX%_X#%2ul)$`=TuPMy0oJ) zTn?Z?5iC;`r*+jCRONhdR9Cs}BHHbKJBPrX4%Ar2sX<8wHT6<6x9xH3j3 z*<62Vk-<`BSO-X7XZn2+TQ(*jLtTpX7*}A%S{YMIBdbu^D@lc$sTL{Kb#mp{W8}6GQHMH5DeEFc%ujW*4&VJiG3VH5Dh#@l!so z8Mb}hkJtTb%HU_so_E?^&ka_)InJ>fOd)@%XMlLRl`CcL+ICYTr`4UX=eEpJtcLI^ zm6n+wp)hvnI-5qBh8tlR!YE=0=NcM4P|2WHI08}c=4Da7!39k;m5pQ))kgD`c!NOlyD32VzMZaa&QB5iHadrMSGpJk)mcB)TasJ9NM- z+7WCR6U;IVyBG#Ptqkr^YzQxn&lwF*W)d+}2)&u}c+I5mpK~fS++n1Kk-ux)7TESP zs3}H__tQvST%JpOSZlOiLOzPq=?YN$Mh> zF~9;A+#U(UB;Vl05X@FIbUO?=YM9Rcdy~7qGdRa{x9(ygHy+Tkdqj3zB+8D)_jK=0 z*0Z`TD#X%gS$m}8TS5+LSy>%);c~uT%-;*t9|!n-#pLiXLO&N$Gb)}c6dn{CjlVn5 zs?~s3&_x=d#g6IMYF@aupMXdaj$X%dWi>7g0bWF{5_&p`ISRz?4k!C~DEs z29ps=p)^TtTbkY(LDw17#f0(X2o1D+#-d~DC}7h$0=PE|=PzHtuL*y>!5C0aR6n?# zdY%v%>m(Pi2%a@Gn=y>LkVT0J)>&~QW|0LOsjrEHZ`UV@sUfJbjT-U%7Kab5UVh`P z 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�B|;}*7JYC(J8}fKQnzA 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%0DgucAc#2*> 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

    >r%pQ66lyPhhF%2hKyXm=1*FV9^| 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 Gd;TB!x2uc* delta 558290 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 T-b7`<&MK4!bv prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/string.html b/prs/8803/lib/stdlib-6.0.1/doc/html/string.html index 8b20e3454dc97..d3b3e98e6e209 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/string.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/string.html @@ -149,14 +149,14 @@

    expect UTF-8 binaries but not all functions verify that all binaries are encoded correctly.

    Unless otherwise specified the return value type is the same as the input type. That is, binary input returns binary output, list input returns a list output, -and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
    +and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
     "sarah"
    -2> string:trim(<<"  sarah  ">>).
    +2> string:trim(<<"  sarah  ">>).
     <<"sarah">>
    -3> string:lexemes("foo bar", " ").
    -["foo","bar"]
    -4> string:lexemes(<<"foo bar">>, " ").
    -[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 +3> string:lexemes("foo bar", " "). +["foo","bar"] +4> string:lexemes(<<"foo bar">>, " "). +[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 and operate on grapheme clusters. The old functions that only work on Latin-1 lists as input are still available but should not be used, they will be @@ -1072,7 +1072,7 @@

    casefold(String)

    Converts String to a case-agnostic comparable string. Function casefold/1 is preferred over lowercase/1 -when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
    +when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
     "ω and ss sharp s"
    @@ -1104,9 +1104,9 @@

    chomp(String)

    Returns a string where any trailing \n or \r\n have been removed from -String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    +String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
     <<"\nHello">>
    -183> string:chomp("\nHello\r\r\n").
    +183> string:chomp("\nHello\r\r\n").
     "\nHello\r"
    @@ -1207,11 +1207,11 @@

    equal(A, B, IgnoreCase, Norm)

    nfc, nfd, nfkc, and -nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
    +nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
     true
    -2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
    +2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
     false
    -3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
    +3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
     true
    @@ -1277,13 +1277,13 @@

    find(String, SearchPattern, Dir)

    Removes anything before SearchPattern in String and returns the remainder of the string or nomatch if SearchPattern is not found. Dir, which can be leading or trailing, indicates from which direction characters are to be -searched.

    Example:

    1> string:find("ab..cd..ef", ".").
    +searched.

    Example:

    1> string:find("ab..cd..ef", ".").
     "..cd..ef"
    -2> string:find(<<"ab..cd..ef">>, "..", trailing).
    +2> string:find(<<"ab..cd..ef">>, "..", trailing).
     <<"..ef">>
    -3> string:find(<<"ab..cd..ef">>, "x", leading).
    +3> string:find(<<"ab..cd..ef">>, "x", leading).
     nomatch
    -4> string:find("ab..cd..ef", "x", trailing).
    +4> string:find("ab..cd..ef", "x", trailing).
     nomatch
    @@ -1314,9 +1314,9 @@

    is_empty(String)

    -

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
    +

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
     false
    -2> string:is_empty(["",<<>>]).
    +2> string:is_empty(["",<<>>]).
     true
    @@ -1354,13 +1354,13 @@

    jaro_similarity(String1, String2)

    Returns a float between +0.0 and 1.0 representing the Jaro similarity between the given strings. Strings with a higher similarity will score closer -to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
    +to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
     1.0
    -2> string:jaro_similarity("foo", "bar").
    +2> string:jaro_similarity("foo", "bar").
     +0.0
    -3> string:jaro_similarity("michelle", "michael").
    +3> string:jaro_similarity("michelle", "michael").
     0.8690476190476191
    -4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
    +4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
     0.5317460317460317

    The Jaro distance between two strings can be calculated with JaroDistance = 1.0 - JaroSimilarity.

    @@ -1392,9 +1392,9 @@

    length(String)

    -

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
    +

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
     3
    -2> string:length(<<195,159,226,134,145,101,204,138>>).
    +2> string:length(<<195,159,226,134,145,101,204,138>>).
     3
    @@ -1429,10 +1429,10 @@

    lexemes(String, SeparatorList)

    Returns a list of lexemes in String, separated by the grapheme clusters in SeparatorList.

    Notice that, as shown in this example, two or more adjacent separator graphemes clusters in String are treated as one. That is, there are no empty strings in -the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    -["abc","de̊f","ghi","jkl","foo"]
    -2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    -[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    +the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    +["abc","de̊f","ghi","jkl","foo"]
    +2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    +[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    @@ -1463,7 +1463,7 @@

    lowercase(String)

    Converts String to lowercase.

    Notice that function casefold/1 should be used when converting a string to be -tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
    +tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
     "michał"
    @@ -1497,8 +1497,8 @@

    next_codepoint(String)

    Returns the first codepoint in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple if the -next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    -[101|<<"̊fg"/utf8>>]
    +next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    +[101|<<"̊fg"/utf8>>]
    @@ -1532,8 +1532,8 @@

    next_grapheme(String)

    Returns the first grapheme cluster in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple -if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    -["e̊"|<<"fg">>]
    +if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    +["e̊"|<<"fg">>]
    @@ -1568,7 +1568,7 @@

    nth_lexeme(String, N, SeparatorList)

    Returns lexeme number N in String, where lexemes are separated by the -grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
    +grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
     "ghi"
    @@ -1666,11 +1666,11 @@

    pad(String, Length, Dir, Char)

    Pads String to Length with grapheme cluster Char. Dir, which can be -leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    -[<<72,101,204,138,108,108,195,182>>,32,32,32]
    -2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
    +leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    +[<<72,101,204,138,108,108,195,182>>,32,32,32]
    +2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
     '   He̊llö'
    -3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
    +3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
     ' He̊llö  '
    @@ -1702,9 +1702,9 @@

    prefix(String, Prefix)

    If Prefix is the prefix of String, removes it and returns the remainder of -String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
    +String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
     <<"fix of string">>
    -2> string:prefix("pre", "prefix").
    +2> string:prefix("pre", "prefix").
     nomatch
    @@ -1775,10 +1775,10 @@

    replace(String, SearchPattern, Replacement,

    Replaces SearchPattern in String with Replacement. Where, indicates whether -the leading, the trailing or all encounters of SearchPattern are to be replaced.

    Can be implemented as:

    lists:join(Replacement, split(String, SearchPattern, Where)).

    Example:

    1> string:replace(<<"ab..cd..ef">>, "..", "*").
    -[<<"ab">>,"*",<<"cd..ef">>]
    -2> string:replace(<<"ab..cd..ef">>, "..", "*", all).
    -[<<"ab">>,"*",<<"cd">>,"*",<<"ef">>]
    +the leading, the trailing or all encounters of SearchPattern are to be replaced.

    Can be implemented as:

    lists:join(Replacement, split(String, SearchPattern, Where)).

    Example:

    1> string:replace(<<"ab..cd..ef">>, "..", "*").
    +[<<"ab">>,"*",<<"cd..ef">>]
    +2> string:replace(<<"ab..cd..ef">>, "..", "*", all).
    +[<<"ab">>,"*",<<"cd">>,"*",<<"ef">>]
    @@ -1808,9 +1808,9 @@

    reverse(String)

    -

    Returns the reverse list of the grapheme clusters in String.

    Example:

    1> Reverse = string:reverse(unicode:characters_to_nfd_binary("ÅÄÖ")).
    -[[79,776],[65,776],[65,778]]
    -2> io:format("~ts~n",[Reverse]).
    +

    Returns the reverse list of the grapheme clusters in String.

    Example:

    1> Reverse = string:reverse(unicode:characters_to_nfd_binary("ÅÄÖ")).
    +[[79,776],[65,776],[65,778]]
    +2> io:format("~ts~n",[Reverse]).
     ÖÄÅ
    @@ -1879,11 +1879,11 @@

    slice(String, Start, Length)

    Returns a substring of String of at most Length grapheme clusters, starting -at position Start.

    Example:

    1> string:slice(<<"He̊llö Wörld"/utf8>>, 4).
    +at position Start.

    Example:

    1> string:slice(<<"He̊llö Wörld"/utf8>>, 4).
     <<"ö Wörld"/utf8>>
    -2> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,4).
    +2> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,4).
     "ö Wö"
    -3> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,50).
    +3> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,50).
     "ö Wörld"
    @@ -1951,12 +1951,12 @@

    split(String, SearchPattern, Where)

    Splits String where SearchPattern is encountered and return the remaining parts. Where, default leading, indicates whether the leading, the -trailing or all encounters of SearchPattern will split String.

    Example:

    0> string:split("ab..bc..cd", "..").
    -["ab","bc..cd"]
    -1> string:split(<<"ab..bc..cd">>, "..", trailing).
    -[<<"ab..bc">>,<<"cd">>]
    -2> string:split(<<"ab..bc....cd">>, "..", all).
    -[<<"ab">>,<<"bc">>,<<>>,<<"cd">>]
    +trailing or all encounters of SearchPattern will split String.

    Example:

    0> string:split("ab..bc..cd", "..").
    +["ab","bc..cd"]
    +1> string:split(<<"ab..bc..cd">>, "..", trailing).
    +[<<"ab..bc">>,<<"cd">>]
    +2> string:split(<<"ab..bc....cd">>, "..", all).
    +[<<"ab">>,<<"bc">>,<<>>,<<"cd">>]
    @@ -2067,14 +2067,14 @@

    take(String, Characters, Complement, Dir)Takes characters from String as long as the characters are members of set Characters or the complement of set Characters. Dir, which can be leading or trailing, indicates from which direction characters are to be -taken.

    Example:

    5> string:take("abc0z123", lists:seq($a,$z)).
    -{"abc","0z123"}
    -6> string:take(<<"abc0z123">>, lists:seq($0,$9), true, leading).
    -{<<"abc">>,<<"0z123">>}
    -7> string:take("abc0z123", lists:seq($0,$9), false, trailing).
    -{"abc0z","123"}
    -8> string:take(<<"abc0z123">>, lists:seq($a,$z), true, trailing).
    -{<<"abc0z">>,<<"123">>}
    +taken.

    Example:

    5> string:take("abc0z123", lists:seq($a,$z)).
    +{"abc","0z123"}
    +6> string:take(<<"abc0z123">>, lists:seq($0,$9), true, leading).
    +{<<"abc">>,<<"0z123">>}
    +7> string:take("abc0z123", lists:seq($0,$9), false, trailing).
    +{"abc0z","123"}
    +8> string:take(<<"abc0z123">>, lists:seq($a,$z), true, trailing).
    +{<<"abc0z">>,<<"123">>}

    @@ -2104,7 +2104,7 @@

    titlecase(String)

    -

    Converts String to titlecase.

    Example:

    1> string:titlecase("ß is a SHARP s").
    +

    Converts String to titlecase.

    Example:

    1> string:titlecase("ß is a SHARP s").
     "Ss is a SHARP s"
    @@ -2140,14 +2140,14 @@

    to_float(String)

    Argument String is expected to start with a valid text represented float (the digits are ASCII values). Remaining characters in the string after the float are -returned in Rest.

    Example:

    1> {F1,Fs} = string:to_float("1.0-1.0e-1"),
    -1> {F2,[]} = string:to_float(Fs),
    +returned in Rest.

    Example:

    1> {F1,Fs} = string:to_float("1.0-1.0e-1"),
    +1> {F2,[]} = string:to_float(Fs),
     1> F1+F2.
     0.9
    -2> string:to_float("3/2=1.5").
    -{error,no_float}
    -3> string:to_float("-1.5eX").
    -{-1.5,"eX"}
    +2>
    string:to_float("3/2=1.5"). +{error,no_float} +3> string:to_float("-1.5eX"). +{-1.5,"eX"}
    @@ -2177,10 +2177,10 @@

    to_graphemes(String)

    -

    Converts String to a list of grapheme clusters.

    Example:

    1> string:to_graphemes("ß↑e̊").
    -[223,8593,[101,778]]
    -2> string:to_graphemes(<<"ß↑e̊"/utf8>>).
    -[223,8593,[101,778]]
    +

    Converts String to a list of grapheme clusters.

    Example:

    1> string:to_graphemes("ß↑e̊").
    +[223,8593,[101,778]]
    +2> string:to_graphemes(<<"ß↑e̊"/utf8>>).
    +[223,8593,[101,778]]
    @@ -2215,14 +2215,14 @@

    to_integer(String)

    Argument String is expected to start with a valid text represented integer (the digits are ASCII values). Remaining characters in the string after the -integer are returned in Rest.

    Example:

    1> {I1,Is} = string:to_integer("33+22"),
    -1> {I2,[]} = string:to_integer(Is),
    +integer are returned in Rest.

    Example:

    1> {I1,Is} = string:to_integer("33+22"),
    +1> {I2,[]} = string:to_integer(Is),
     1> I1-I2.
     11
    -2> string:to_integer("0.5").
    -{0,".5"}
    -3> string:to_integer("x=2").
    -{error,no_integer}
    +2>
    string:to_integer("0.5"). +{0,".5"} +3> string:to_integer("x=2"). +{error,no_integer}
    @@ -2323,11 +2323,11 @@

    trim(String, Dir, Characters)

    Returns a string, where leading or trailing, or both, Characters have been removed.

    Dir which can be leading, trailing, or both, indicates from which direction characters are to be removed.

    Note that [$\r,$\n] is one grapheme cluster according to the Unicode -Standard.

    Example:

    1> string:trim("\t  Hello  \n").
    +Standard.

    Example:

    1> string:trim("\t  Hello  \n").
     "Hello"
    -2> string:trim(<<"\t  Hello  \n">>, leading).
    +2> string:trim(<<"\t  Hello  \n">>, leading).
     <<"Hello  \n">>
    -3> string:trim(<<".Hello.\n">>, trailing, "\n.").
    +3> string:trim(<<".Hello.\n">>, trailing, "\n.").
     <<".Hello">>
    @@ -2358,7 +2358,7 @@

    uppercase(String)

    -

    Converts String to uppercase.

    See also titlecase/1.

    Example:

    1> string:uppercase("Michał").
    +

    Converts String to uppercase.

    See also titlecase/1.

    Example:

    1> string:uppercase("Michał").
     "MICHAŁ"
    @@ -2620,7 +2620,7 @@

    cspan(String, Chars)

    Returns the length of the maximum initial segment of String, which consists -entirely of characters not from Chars.

    This function is obsolete. Use take/3.

    Example:

    1> string:cspan("\t    abcdef", " \t").
    +entirely of characters not from Chars.

    This function is obsolete. Use take/3.

    Example:

    1> string:cspan("\t    abcdef", " \t").
     0
    @@ -2652,7 +2652,7 @@

    join(StringList, Separator)

    Returns a string with the elements of StringList separated by the string in Separator.

    This function is obsolete. Use -lists:join/2.

    Example:

    1> join(["one", "two", "three"], ", ").
    +lists:join/2.

    Example:

    1> join(["one", "two", "three"], ", ").
     "one, two, three"
    @@ -2715,7 +2715,7 @@

    left(String, Number, Character)

    Returns String with the length adjusted in accordance with Number. The left margin is fixed. If length(String) < Number, then String is padded with blanks or Characters.

    This function is obsolete. Use pad/2 or -pad/3.

    Example:

    1> string:left("Hello",10,$.).
    +pad/3.

    Example:

    1> string:left("Hello",10,$.).
     "Hello....."
    @@ -2838,7 +2838,7 @@

    right(String, Number, Character)

    Returns String with the length adjusted in accordance with Number. The right margin is fixed. If the length of (String) < Number, then String is padded -with blanks or Characters.

    This function is obsolete. Use pad/3.

    Example:

    1> string:right("Hello", 10, $.).
    +with blanks or Characters.

    This function is obsolete. Use pad/3.

    Example:

    1> string:right("Hello", 10, $.).
     ".....Hello"
    @@ -2869,7 +2869,7 @@

    rstr(String, SubString)

    Returns the position where the last occurrence of SubString begins in -String. Returns 0 if SubString does not exist in String.

    This function is obsolete. Use find/3.

    Example:

    1> string:rstr(" Hello Hello World World ", "Hello World").
    +String. Returns 0 if SubString does not exist in String.

    This function is obsolete. Use find/3.

    Example:

    1> string:rstr(" Hello Hello World World ", "Hello World").
     8
    @@ -2900,7 +2900,7 @@

    span(String, Chars)

    Returns the length of the maximum initial segment of String, which consists -entirely of characters from Chars.

    This function is obsolete. Use take/2.

    Example:

    1> string:span("\t    abcdef", " \t").
    +entirely of characters from Chars.

    This function is obsolete. Use take/2.

    Example:

    1> string:span("\t    abcdef", " \t").
     5
    @@ -2931,7 +2931,7 @@

    str(String, SubString)

    Returns the position where the first occurrence of SubString begins in -String. Returns 0 if SubString does not exist in String.

    This function is obsolete. Use find/2.

    Example:

    1> string:str(" Hello Hello World World ", "Hello World").
    +String. Returns 0 if SubString does not exist in String.

    This function is obsolete. Use find/2.

    Example:

    1> string:str(" Hello Hello World World ", "Hello World").
     8
    @@ -3025,7 +3025,7 @@

    strip(String, Direction, Character)

    Returns a string, where leading or trailing, or both, blanks or a number of Character have been removed.

    Direction, which can be left, right, or both, indicates from which direction blanks are to be removed. -strip/1 is equivalent to strip(String, both).

    This function is obsolete. Use trim/3.

    Example:

    1> string:strip("...Hello.....", both, $.).
    +strip/1 is equivalent to strip(String, both).

    This function is obsolete. Use trim/3.

    Example:

    1> string:strip("...Hello.....", both, $.).
     "Hello"
    @@ -3089,7 +3089,7 @@

    sub_string(String, Start, Stop)

    Returns a substring of String, starting at position Start to the end of the -string, or to and including position Stop.

    This function is obsolete. Use slice/3.

    Example:

    1> sub_string("Hello World", 4, 8).
    +string, or to and including position Stop.

    This function is obsolete. Use slice/3.

    Example:

    1> sub_string("Hello World", 4, 8).
     "lo Wo"
    @@ -3149,7 +3149,7 @@

    sub_word(String, Number, Character)

    Returns the word in position Number of String. Words are separated by blanks or Characters.

    This function is obsolete. Use -nth_lexeme/3.

    Example:

    1> string:sub_word(" Hello old boy !",3,$o).
    +nth_lexeme/3.

    Example:

    1> string:sub_word(" Hello old boy !",3,$o).
     "ld b"
    @@ -3213,7 +3213,7 @@

    substr(String, Start, Length)

    Returns a substring of String, starting at position Start, and ending at the -end of the string or at length Length.

    This function is obsolete. Use slice/3.

    Example:

    1> substr("Hello World", 4, 5).
    +end of the string or at length Length.

    This function is obsolete. Use slice/3.

    Example:

    1> substr("Hello World", 4, 5).
     "lo Wo"
    @@ -3311,8 +3311,8 @@

    tokens(String, SeparatorList)

    Returns a list of tokens in String, separated by the characters in -SeparatorList.

    Example:

    1> tokens("abc defxxghix jkl", "x ").
    -["abc", "def", "ghi", "jkl"]

    Notice that, as shown in this example, two or more adjacent separator characters +SeparatorList.

    Example:

    1> tokens("abc defxxghix jkl", "x ").
    +["abc", "def", "ghi", "jkl"]

    Notice that, as shown in this example, two or more adjacent separator characters in String are treated as one. That is, there are no empty strings in the resulting list of tokens.

    This function is obsolete. Use lexemes/2.

    @@ -3371,7 +3371,7 @@

    words(String, Character)

    -

    Returns the number of words in String, separated by blanks or Character.

    This function is obsolete. Use lexemes/2.

    Example:

    1> words(" Hello old boy!", $o).
    +

    Returns the number of words in String, separated by blanks or Character.

    This function is obsolete. Use lexemes/2.

    Example:

    1> words(" Hello old boy!", $o).
     4
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/supervisor.html b/prs/8803/lib/stdlib-6.0.1/doc/html/supervisor.html index bf0e69187a5a9..a9937d21ac6ff 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/supervisor.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/supervisor.html @@ -158,10 +158,10 @@

    Supervisor flags

    The supervisor properties are defined by the supervisor flags. The type -definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    -                intensity => non_neg_integer(),   % optional
    -                period => pos_integer(),          % optional
    -                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with +definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    +                intensity => non_neg_integer(),   % optional
    +                period => pos_integer(),          % optional
    +                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with the strategy key in the above map:

    • one_for_one - If one child process terminates and is to be restarted, only that child process is affected. This is the default restart strategy.

    • one_for_all - If one child process terminates and is to be restarted, all other child processes are terminated and then all child processes are @@ -205,13 +205,13 @@

      Child specification

      -

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      -                 start => mfargs(),            % mandatory
      -                 restart => restart(),         % optional
      -                 significant => significant(), % optional
      -                 shutdown => shutdown(),       % optional
      -                 type => worker(),             % optional
      -                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, +

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      +                 start => mfargs(),            % mandatory
      +                 restart => restart(),         % optional
      +                 significant => significant(), % optional
      +                 shutdown => shutdown(),       % optional
      +                 type => worker(),             % optional
      +                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, but the map is preferred.

      • id is used to identify the child specification internally by the supervisor.

        The id key is mandatory.

        Notice that this identifier on occations has been called "name". As far as possible, the terms "identifier" or "id" are now used but to keep backward compatibility, some occurences of "name" can still be found, for example in diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/timer.html b/prs/8803/lib/stdlib-6.0.1/doc/html/timer.html index b85b117c30af7..438e56477ddbb 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/timer.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/timer.html @@ -143,15 +143,15 @@

        Examples

        -

        Example 1

        The following example shows how to print "Hello World!" in 5 seconds:

        1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
        -{ok,TRef}
        +

        Example 1

        The following example shows how to print "Hello World!" in 5 seconds:

        1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
        +{ok,TRef}
         Hello World!

        Example 2

        The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

        Pid = spawn(mod, fun, [foo, bar]),
        +action is not completed within a certain limit, the process is killed:

        Pid = spawn(mod, fun, [foo, bar]),
         %% If pid is not finished in 10 seconds, kill him
        -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
        +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
         ...
         %% We change our mind...
        -timer:cancel(R),
        +timer:cancel(R),
         ...

        @@ -178,20 +178,20 @@

        process which set the timer about its completion, by sending it a done message.

        Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

        1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
        -{ok,TRef}
        +process and is lost.

        1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
        +{ok,TRef}
         2> receive done -> done after 5000 -> timeout end.
         %% ... 5s pass...
         timeout

        The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

        1> Target = self()
        +and so works as intended.

        1> Target = self()
         <0.82.0>
        -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
        -{ok,TRef}
        +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
        +{ok,TRef}
         3> receive done -> done after 5000 -> timeout end.
         %% ... 1s passes...
        -done

        Another option is to pass the message target as a parameter to the function.

        1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
        -{ok,TRef}
        +done

        Another option is to pass the message target as a parameter to the function.

        1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
        +{ok,TRef}
         2> receive done -> done after 5000 -> timeout end.
         %% ... 1s passes...
         done
        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/unicode.html b/prs/8803/lib/stdlib-6.0.1/doc/html/unicode.html index 1d74150c33fca..73b4633e48359 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/unicode.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/unicode.html @@ -1071,13 +1071,13 @@

        characters_to_list(Data, InEncoding)

        the first part of a (so far) valid UTF character.

        If one UTF character is split over two consecutive 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 specified as input without errors -occurring.

        Example:

        decode_data(Data) ->
        -   case unicode:characters_to_list(Data,unicode) of
        -      {incomplete,Encoded, Rest} ->
        -            More = get_some_more_data(),
        -            Encoded ++ decode_data([Rest, More]);
        -      {error,Encoded,Rest} ->
        -            handle_error(Encoded,Rest);
        +occurring.

        Example:

        decode_data(Data) ->
        +   case unicode:characters_to_list(Data,unicode) of
        +      {incomplete,Encoded, Rest} ->
        +            More = get_some_more_data(),
        +            Encoded ++ decode_data([Rest, More]);
        +      {error,Encoded,Rest} ->
        +            handle_error(Encoded,Rest);
               List ->
                     List
            end.

        However, bit strings that are not whole bytes are not allowed, so a UTF @@ -1112,7 +1112,7 @@

        characters_to_nfc_binary(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
        +of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
         <<"abc..åäö"/utf8>>
        @@ -1144,7 +1144,7 @@

        characters_to_nfc_list(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
        +of canonical equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
         "abc..åäö"
        @@ -1176,7 +1176,7 @@

        characters_to_nfd_binary(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfd_binary("abc..åäö").
        +of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfd_binary("abc..åäö").
         <<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
        @@ -1208,8 +1208,8 @@

        characters_to_nfd_list(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfd_list("abc..åäö").
        -[97,98,99,46,46,97,778,97,776,111,776]
        +of canonical equivalent Decomposed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfd_list("abc..åäö").
        +[97,98,99,46,46,97,778,97,776,111,776]
        @@ -1240,7 +1240,7 @@

        characters_to_nfkc_binary(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
        +of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
         <<"abc..åäö32"/utf8>>
        @@ -1272,7 +1272,7 @@

        characters_to_nfkc_list(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
        +of compatibly equivalent Composed characters according to the Unicode standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
         "abc..åäö32"
        @@ -1305,7 +1305,7 @@

        characters_to_nfkd_binary(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
        +standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is an utf8 encoded binary.

        2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
         <<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
        @@ -1338,8 +1338,8 @@

        characters_to_nfkd_list(CD)

        Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
        -[97,98,99,46,46,97,778,97,776,111,776,51,50]
        +standard.

        Any binaries in the input must be encoded with utf8 encoding.

        The result is a list of characters.

        1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
        +[97,98,99,46,46,97,778,97,776,111,776,51,50]
        diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/unicode_usage.html b/prs/8803/lib/stdlib-6.0.1/doc/html/unicode_usage.html index a35fe01393112..ab2e363556c30 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/unicode_usage.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/unicode_usage.html @@ -339,20 +339,20 @@

        iolists, where binaries and lists can be combined to represent a sequence of bytes. In the same way, the Unicode-aware modules often allow for combinations of binaries and lists, where the binaries have characters encoded in UTF-8 and -the lists contain such binaries or numbers representing Unicode code points:

        unicode_binary() = binary() with characters encoded in UTF-8 coding standard
        +the lists contain such binaries or numbers representing Unicode code points:

        unicode_binary() = binary() with characters encoded in UTF-8 coding standard
         
        -chardata() = charlist() | unicode_binary()
        +chardata() = charlist() | unicode_binary()
         
        -charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
        -  unicode_binary() | nil())

        The module unicode even supports similar mixes with binaries containing +charlist() = maybe_improper_list(char() | unicode_binary() | charlist(), + unicode_binary() | nil())

        The module unicode even supports similar mixes with binaries containing other encodings than UTF-8, but that is a special case to allow for conversions -to and from external data:

        external_unicode_binary() = binary() with characters coded in a user-specified
        -  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
        +to and from external data:

        external_unicode_binary() = binary() with characters coded in a user-specified
        +  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
         
        -external_chardata() = external_charlist() | external_unicode_binary()
        +external_chardata() = external_charlist() | external_unicode_binary()
         
        -external_charlist() = maybe_improper_list(char() | external_unicode_binary() |
        -  external_charlist(), external_unicode_binary() | nil())

        +external_charlist() = maybe_improper_list(char() | external_unicode_binary() | + external_charlist(), external_unicode_binary() | nil())

        @@ -400,7 +400,7 @@

        In certain output functions and in the output of return values in the shell, Erlang tries to detect string data in lists and binaries heuristically. -Typically you will see heuristic detection in a situation like this:

        1> [97,98,99].
        +Typically you will see heuristic detection in a situation like this:

        1> [97,98,99].
         "abc"
         2> <<97,98,99>>.
         <<"abc">>
        @@ -420,27 +420,27 @@ 

        controls how heuristic string detection is done. More ranges are expected to be added in the future, enabling tailoring of the heuristics to the language and region relevant to the user.

        The following examples show the two startup options:

        $ erl +pc latin1
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> [1024].
        -[1024]
        -2> [1070,1085,1080,1082,1086,1076].
        -[1070,1085,1080,1082,1086,1076]
        -3> [229,228,246].
        +Eshell V5.10.1  (abort with ^G)
        +1> [1024].
        +[1024]
        +2> [1070,1085,1080,1082,1086,1076].
        +[1070,1085,1080,1082,1086,1076]
        +3> [229,228,246].
         "åäö"
         4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
         <<208,174,208,189,208,184,208,186,208,190,208,180>>
         5> <<229/utf8,228/utf8,246/utf8>>.
         <<"åäö"/utf8>>
        $ erl +pc unicode
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> [1024].
        +Eshell V5.10.1  (abort with ^G)
        +1> [1024].
         "Ѐ"
        -2> [1070,1085,1080,1082,1086,1076].
        +2> [1070,1085,1080,1082,1086,1076].
         "Юникод"
        -3> [229,228,246].
        +3> [229,228,246].
         "åäö"
         4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
         <<"Юникод"/utf8>>
        @@ -453,17 +453,17 @@ 

        outputs anything containing printable Unicode data (in binaries, either UTF-8 or bytewise encoded) as string data.

        These heuristics are also used by io:format/2, io_lib:format/2, and friends when modifier t is used with ~p or ~P:

        $ erl +pc latin1
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        -{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
        +Eshell V5.10.1  (abort with ^G)
        +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        +{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
         ok
        $ erl +pc unicode
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        -{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
        +Eshell V5.10.1  (abort with ^G)
        +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
        +{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
         ok

        Notice that this only affects heuristic interpretation of lists and binaries on output. For example, the ~ts format sequence always outputs a valid list of characters, regardless of the +pc setting, as the programmer has explicitly @@ -486,19 +486,19 @@

        capable of. There is no portable way for Erlang to ask the terminal about its UTF-8 capacity, we have to rely on the language and character type settings.

        To investigate what Erlang thinks about the terminal, the call io:getopts() can be used when the shell is started:

        $ LC_CTYPE=en_US.ISO-8859-1 erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,latin1}
        -2> q().
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,latin1}
        +2> q().
         ok
         $ LC_CTYPE=en_US.UTF-8 erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,unicode}
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,unicode}
         2>

        When (finally?) everything is in order with the locale settings, fonts. and the terminal emulator, you have probably found a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard @@ -511,14 +511,14 @@

        easily if you are not used to this. For example, entering commands using a Cyrillic character set is not easily done in the Erlang shell.

        Now you are set up for some Unicode input and output. The simplest thing to do is to enter a string in the shell:

        $ erl
        -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
        +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
         
        -Eshell V5.10.1  (abort with ^G)
        -1> lists:keyfind(encoding, 1, io:getopts()).
        -{encoding,unicode}
        +Eshell V5.10.1  (abort with ^G)
        +1> lists:keyfind(encoding, 1, io:getopts()).
        +{encoding,unicode}
         2> "Юникод".
         "Юникод"
        -3> io:format("~ts~n", [v(2)]).
        +3> io:format("~ts~n", [v(2)]).
         Юникод
         ok
         4>

        While strings can be input as Unicode characters, the language elements are @@ -551,10 +551,10 @@

        charlist() represented by it.

        #!/usr/bin/env escript
         %%! -kernel standard_io_encoding latin1
         
        -main(_) ->
        -  {ok, Char} = file:read_line(standard_io),
        -  ok = file:write(standard_io, string:trim(Char)),
        -  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
        +main(_) ->
        +  {ok, Char} = file:read_line(standard_io),
        +  ok = file:write(standard_io, string:trim(Char)),
        +  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
           ok.
        $ escript test.es
         ξ
         ξ: [206,190]

        ξ would normally be represented as the integer 958, but since we are using @@ -790,13 +790,13 @@

        example {encoding,utf8}).

      Functions reading Erlang syntax from files recognize the coding: comment and can therefore handle Unicode data on input. When writing Erlang terms to a file, you are advised to insert such comments when applicable:

      $ erl +fna +pc unicode
      -Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
      +Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
       
      -Eshell V5.10.1  (abort with ^G)
      -1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
      +Eshell V5.10.1  (abort with ^G)
      +1> file:write_file("test.term",<<"%% coding: utf-8\n[{\"Юникод\",4711}].\n"/utf8>>).
       ok
      -2> file:consult("test.term").
      -{ok,[[{"Юникод",4711}]]}

      +2> file:consult("test.term"). +{ok,[[{"Юникод",4711}]]}

    @@ -875,21 +875,21 @@

    same way as the remaining file. If such a file is to be read, the first few bytes (depending on encoding) are not part of the text. This code outlines how to open a file that is believed to have a BOM, and sets the files encoding and -position for further sequential reading (preferably using the io module).

    Notice that error handling is omitted from the code:

    open_bom_file_for_reading(File) ->
    -    {ok,F} = file:open(File,[read,binary]),
    -    {ok,Bin} = file:read(F,4),
    -    {Type,Bytes} = unicode:bom_to_encoding(Bin),
    -    file:position(F,Bytes),
    -    io:setopts(F,[{encoding,Type}]),
    -    {ok,F}.

    Function unicode:bom_to_encoding/1 identifies the encoding from a binary of at +position for further sequential reading (preferably using the io module).

    Notice that error handling is omitted from the code:

    open_bom_file_for_reading(File) ->
    +    {ok,F} = file:open(File,[read,binary]),
    +    {ok,Bin} = file:read(F,4),
    +    {Type,Bytes} = unicode:bom_to_encoding(Bin),
    +    file:position(F,Bytes),
    +    io:setopts(F,[{encoding,Type}]),
    +    {ok,F}.

    Function unicode:bom_to_encoding/1 identifies the encoding from a binary of at least four bytes. It returns, along with a term suitable for setting the encoding of the file, the byte length of the BOM, so that the file position can be set accordingly. Notice that function file:position/2 always works on -byte-offsets, so that the byte length of the BOM is needed.

    To open a file for writing and place the BOM first is even simpler:

    open_bom_file_for_writing(File,Encoding) ->
    -    {ok,F} = file:open(File,[write,binary]),
    -    ok = file:write(File,unicode:encoding_to_bom(Encoding)),
    -    io:setopts(F,[{encoding,Encoding}]),
    -    {ok,F}.

    The file is in both these cases then best processed using the io module, as +byte-offsets, so that the byte length of the BOM is needed.

    To open a file for writing and place the BOM first is even simpler:

    open_bom_file_for_writing(File,Encoding) ->
    +    {ok,F} = file:open(File,[write,binary]),
    +    ok = file:write(File,unicode:encoding_to_bom(Encoding)),
    +    io:setopts(F,[{encoding,Encoding}]),
    +    {ok,F}.

    The file is in both these cases then best processed using the io module, as the functions in that module can handle code points beyond the ISO Latin-1 range.

    @@ -903,10 +903,10 @@

    compatibility reasons, these functions do not accept any list as a string, but require a special translation modifier when working with Unicode texts. The modifier is t. When applied to control character s in a formatting string, -it accepts all Unicode code points and expects binaries to be in UTF-8:

    1> io:format("~ts~n",[<<"åäö"/utf8>>]).
    +it accepts all Unicode code points and expects binaries to be in UTF-8:

    1> io:format("~ts~n",[<<"åäö"/utf8>>]).
     åäö
     ok
    -2> io:format("~s~n",[<<"åäö"/utf8>>]).
    +2> io:format("~s~n",[<<"åäö"/utf8>>]).
     åäÃ
     ok

    Clearly, the second io:format/2 gives undesired output, as the UTF-8 binary is not in latin1. For backward compatibility, the non-prefixed control character @@ -923,12 +923,12 @@

    cannot be stored in one byte. The call to erlang:list_to_binary/1 then fails. However, if the I/O server you want to communicate with is Unicode-aware, the returned list can still be used directly:

    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1 (abort with ^G)
    -1> io_lib:format("~ts~n", ["Γιούνικοντ"]).
    -["Γιούνικοντ","\n"]
    -2> io:put_chars(io_lib:format("~ts~n", ["Γιούνικοντ"])).
    +Eshell V5.10.1 (abort with ^G)
    +1> io_lib:format("~ts~n", ["Γιούνικοντ"]).
    +["Γιούνικοντ","\n"]
    +2> io:put_chars(io_lib:format("~ts~n", ["Γιούνικοντ"])).
     Γιούνικοντ
     ok

    The Unicode string is returned as a Unicode list, which is recognized as such, as the Erlang shell uses the Unicode encoding (and is started with all Unicode @@ -953,8 +953,8 @@

    ASCII range are seldom considered valid when decoded as UTF-8. Therefore one can usually use heuristics to determine if a file is in UTF-8 or if it is encoded in ISO Latin-1 (one byte per character). The unicode module can be used to -determine if data can be interpreted as UTF-8:

    heuristic_encoding_bin(Bin) when is_binary(Bin) ->
    -    case unicode:characters_to_binary(Bin,utf8,utf8) of
    +determine if data can be interpreted as UTF-8:

    heuristic_encoding_bin(Bin) when is_binary(Bin) ->
    +    case unicode:characters_to_binary(Bin,utf8,utf8) of
     	Bin ->
     	    utf8;
     	_ ->
    @@ -965,34 +965,34 @@ 

    unicode:characters_to_binary/1,2,3 comes in handy. The incomplete rest from one chunk of data read from the file is prepended to the next chunk and we therefore avoid the problem of character -boundaries when reading chunks of bytes in UTF-8 encoding:

    heuristic_encoding_file(FileName) ->
    -    {ok,F} = file:open(FileName,[read,binary]),
    -    loop_through_file(F,<<>>,file:read(F,1024)).
    +boundaries when reading chunks of bytes in UTF-8 encoding:

    heuristic_encoding_file(FileName) ->
    +    {ok,F} = file:open(FileName,[read,binary]),
    +    loop_through_file(F,<<>>,file:read(F,1024)).
     
    -loop_through_file(_,<<>>,eof) ->
    +loop_through_file(_,<<>>,eof) ->
         utf8;
    -loop_through_file(_,_,eof) ->
    +loop_through_file(_,_,eof) ->
         latin1;
    -loop_through_file(F,Acc,{ok,Bin}) when is_binary(Bin) ->
    -    case unicode:characters_to_binary([Acc,Bin]) of
    -	{error,_,_} ->
    +loop_through_file(F,Acc,{ok,Bin}) when is_binary(Bin) ->
    +    case unicode:characters_to_binary([Acc,Bin]) of
    +	{error,_,_} ->
     	    latin1;
    -	{incomplete,_,Rest} ->
    -	    loop_through_file(F,Rest,file:read(F,1024));
    -	Res when is_binary(Res) ->
    -	    loop_through_file(F,<<>>,file:read(F,1024))
    +	{incomplete,_,Rest} ->
    +	    loop_through_file(F,Rest,file:read(F,1024));
    +	Res when is_binary(Res) ->
    +	    loop_through_file(F,<<>>,file:read(F,1024))
         end.

    Another option is to try to read the whole file in UTF-8 encoding and see if it fails. Here we need to read the file using function io:get_chars/3, as we have -to read characters with a code point > 255:

    heuristic_encoding_file2(FileName) ->
    -    {ok,F} = file:open(FileName,[read,binary,{encoding,utf8}]),
    -    loop_through_file2(F,io:get_chars(F,'',1024)).
    +to read characters with a code point > 255:

    heuristic_encoding_file2(FileName) ->
    +    {ok,F} = file:open(FileName,[read,binary,{encoding,utf8}]),
    +    loop_through_file2(F,io:get_chars(F,'',1024)).
     
    -loop_through_file2(_,eof) ->
    +loop_through_file2(_,eof) ->
         utf8;
    -loop_through_file2(_,{error,_Err}) ->
    +loop_through_file2(_,{error,_Err}) ->
         latin1;
    -loop_through_file2(F,Bin) when is_binary(Bin) ->
    -    loop_through_file2(F,io:get_chars(F,'',1024)).

    +loop_through_file2(F,Bin) when is_binary(Bin) -> + loop_through_file2(F,io:get_chars(F,'',1024)).

    @@ -1003,8 +1003,8 @@

    character. Instead you get the "raw" UTF-8 encoding that you have in binaries. This is easily converted to a proper Unicode string by first converting byte per byte into a binary, and then converting the binary of UTF-8 encoded characters -back to a Unicode string:

    utf8_list_to_string(StrangeList) ->
    -  unicode:characters_to_list(list_to_binary(StrangeList)).

    +back to a Unicode string:

    utf8_list_to_string(StrangeList) ->
    +  unicode:characters_to_list(list_to_binary(StrangeList)).

    @@ -1022,26 +1022,26 @@

    encoded in which format, and never convert UTF-8 data (possibly read byte by byte from a file) into UTF-8 again.

    By far the most common situation where this occurs, is when you get lists of UTF-8 instead of proper Unicode strings, and then convert them to UTF-8 in a -binary or on a file:

    wrong_thing_to_do() ->
    -  {ok,Bin} = file:read_file("an_utf8_encoded_file.txt"),
    -  MyList = binary_to_list(Bin), %% Wrong! It is an utf8 binary!
    -  {ok,C} = file:open("catastrophe.txt",[write,{encoding,utf8}]),
    -  io:put_chars(C,MyList), %% Expects a Unicode string, but get UTF-8
    +binary or on a file:

    wrong_thing_to_do() ->
    +  {ok,Bin} = file:read_file("an_utf8_encoded_file.txt"),
    +  MyList = binary_to_list(Bin), %% Wrong! It is an utf8 binary!
    +  {ok,C} = file:open("catastrophe.txt",[write,{encoding,utf8}]),
    +  io:put_chars(C,MyList), %% Expects a Unicode string, but get UTF-8
                               %% bytes in a list!
    -  file:close(C). %% The file catastrophe.txt contains more or less unreadable
    +  file:close(C). %% The file catastrophe.txt contains more or less unreadable
                      %% garbage!

    Ensure you know what a binary contains before converting it to a string. If no -other option exists, try heuristics:

    if_you_can_not_know() ->
    -  {ok,Bin} = file:read_file("maybe_utf8_encoded_file.txt"),
    -  MyList = case unicode:characters_to_list(Bin) of
    -    L when is_list(L) ->
    +other option exists, try heuristics:

    if_you_can_not_know() ->
    +  {ok,Bin} = file:read_file("maybe_utf8_encoded_file.txt"),
    +  MyList = case unicode:characters_to_list(Bin) of
    +    L when is_list(L) ->
           L;
         _ ->
    -      binary_to_list(Bin) %% The file was bytewise encoded
    +      binary_to_list(Bin) %% The file was bytewise encoded
       end,
       %% Now we know that the list is a Unicode string, not a list of UTF-8 bytes
    -  {ok,G} = file:open("greatness.txt",[write,{encoding,utf8}]),
    -  io:put_chars(G,MyList), %% Expects a Unicode string, which is what it gets!
    -  file:close(G). %% The file contains valid UTF-8 encoded Unicode characters!
    +
    {ok,G} = file:open("greatness.txt",[write,{encoding,utf8}]), + io:put_chars(G,MyList), %% Expects a Unicode string, which is what it gets! + file:close(G). %% The file contains valid UTF-8 encoded Unicode characters!
    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string.html b/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string.html index d8bb61ee073ef..3dd3776ad8cae 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string.html @@ -601,10 +601,10 @@

    compose_query(QueryList)

    Composes a form-urlencoded QueryString based on a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
    +specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
     "foo+bar=1&city=%C3%B6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"örebro"/utf8>>}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"örebro"/utf8>>}]).
     <<"foo+bar=1&city=%C3%B6rebro">>
    @@ -648,11 +648,11 @@

    compose_query(QueryList, Options)

    ";" (U+003B) character.

    Bytes that are out of the range 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A, are percent-encoded (U+0025 PERCENT SIGN character (%) followed by uppercase ASCII hex digits representing the hexadecimal value of the -byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    -1> [{encoding, latin1}]).
    +byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    +1> [{encoding, latin1}]).
     "foo+bar=1&city=%F6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
    +2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    +2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
     <<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    @@ -689,11 +689,11 @@

    dissect_query(QueryString)

    Dissects an urlencoded QueryString and returns a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    -[{"foo bar","1"},{"city","örebro"}]
    -2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    -[{<<"foo bar">>,<<"1">>},
    - {<<"city">>,<<230,157,177,228,186,172>>}]
    +specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    +[{"foo bar","1"},{"city","örebro"}]
    +2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    +[{<<"foo bar">>,<<"1">>},
    + {<<"city">>,<<230,157,177,228,186,172>>}]
    @@ -727,14 +727,14 @@

    normalize(URI)

    Transforms an URI into a normalized form using Syntax-Based Normalization as defined by RFC 3986.

    This function implements case normalization, percent-encoding normalization, path segment normalization and scheme based normalization for HTTP(S) with basic -support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
    +support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
     "/a/g"
    -2> uri_string:normalize(<<"mid/content=5/../6">>).
    +2> uri_string:normalize(<<"mid/content=5/../6">>).
     <<"mid/6">>
    -3> uri_string:normalize("http://localhost:80").
    +3> uri_string:normalize("http://localhost:80").
     "http://localhost/"
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}).
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}).
     "http://localhost-%C3%B6rebro/a/g"
    @@ -771,15 +771,15 @@

    normalize(URI, Options)

    Same as normalize/1 but with an additional Options parameter, that controls whether the normalized URI shall be returned as an -uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    -#{path => "/a/g"}
    -2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    -#{path => <<"mid/6">>}
    -3> uri_string:normalize("http://localhost:80", [return_map]).
    -#{scheme => "http",path => "/",host => "localhost"}
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}, [return_map]).
    -#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    +uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    +#{path => "/a/g"}
    +2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    +#{path => <<"mid/6">>}
    +3> uri_string:normalize("http://localhost:80", [return_map]).
    +#{scheme => "http",path => "/",host => "localhost"}
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}, [return_map]).
    +#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    @@ -811,14 +811,14 @@

    parse(URIString)

    Parses an RFC 3986 compliant uri_string/0 into a uri_map/0, that holds the parsed components of the -URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    -#{fragment => "nose",host => "example.com",
    +URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => foo,userinfo => "user"}
    -2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    -#{host => <<"example.com">>,path => <<"/over/there">>,
    +  scheme => foo,userinfo => "user"}
    +2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    +#{host => <<"example.com">>,path => <<"/over/there">>,
       port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>,
    -  userinfo => <<"user">>}
    +
    userinfo => <<"user">>}
    @@ -857,15 +857,15 @@

    percent_decode(URI)

    Decodes all percent-encoded triplets in the input that can be both a uri_string/0 and a uri_map/0.

    Note, that this function performs raw decoding and it shall be used on already parsed URI components. Applying this function directly on a standard URI can -effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    -1> scheme => "http"}).
    -#{host => "localhost-örebro",path => [],scheme => "http"}
    -2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    +effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    +1> scheme => "http"}).
    +#{host => "localhost-örebro",path => [],scheme => "http"}
    +2> uri_string:percent_decode(<<"%C3%B6rebro">>).
     <<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This example shows, that after each consecutive application of the function the -resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    +resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
     <<"http://local%2Fhost/path">>
    -4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    +4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
     <<"http://local/host/path">>
    @@ -898,9 +898,9 @@

    quote(Data)

    Replaces characters out of unreserved set with their percent encoded equivalents.

    Unreserved characters defined in -RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
    +RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
     "SomeId%2F04"
    -2> uri_string:quote(<<"SomeId/04">>).
    +2> uri_string:quote(<<"SomeId/04">>).
     <<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -935,9 +935,9 @@

    quote(Data, Safe)

    Same as quote/1, but Safe allows user to provide a list of -characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
    +characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
     "SomeId/04"
    -2> uri_string:quote(<<"SomeId/04">>, "/").
    +2> uri_string:quote(<<"SomeId/04">>, "/").
     <<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -972,13 +972,13 @@

    recompose(URIMap)

    Creates an RFC 3986 compliant URIString (percent-encoded), based on the components of URIMap. If the -URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    -1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    -#{fragment => "nose",host => "example.com",
    +URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    +1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => "foo",userinfo => "user"}
    +  scheme => "foo",userinfo => "user"}
     
    -2> uri_string:recompose(URIMap).
    +2> uri_string:recompose(URIMap).
     "foo://example.com:8042/over/there?name=ferret#nose"
    @@ -1015,13 +1015,13 @@

    resolve(RefURI, BaseURI)

    Convert a RefURI reference that might be relative to a given base URI into the parsed components of the reference's target, which can then be recomposed to -form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    +form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
     "http://localhost/abs/ol/ute"
    -2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
    +2> uri_string:resolve("../relative", "http://localhost/a/b/c?q").
     "http://localhost/a/relative"
    -3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
    +3> uri_string:resolve("http://localhost/full", "http://localhost/a/b/c?q").
     "http://localhost/full"
    -4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
    +4> uri_string:resolve(#{path => "path", query => "xyz"}, "http://localhost/a/b/c?q").
     "http://localhost/a/b/path?xyz"
    @@ -1059,11 +1059,11 @@

    resolve(RefURI, BaseURI, Options)

    Same as resolve/2 but with an additional Options parameter, that controls whether the target URI shall be returned as an uri_map(). There is -one supported option: return_map.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q", [return_map]).
    -#{host => "localhost",path => "/abs/ol/ute",scheme => "http"}
    -2> uri_string:resolve(#{path => "/abs/ol/ute"}, #{scheme => "http",
    -2> host => "localhost", path => "/a/b/c?q"}, [return_map]).
    -#{host => "localhost",path => "/abs/ol/ute",scheme => "http"}
    +one supported option: return_map.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q", [return_map]).
    +#{host => "localhost",path => "/abs/ol/ute",scheme => "http"}
    +2> uri_string:resolve(#{path => "/abs/ol/ute"}, #{scheme => "http",
    +2> host => "localhost", path => "/a/b/c?q"}, [return_map]).
    +#{host => "localhost",path => "/abs/ol/ute",scheme => "http"}
    @@ -1103,11 +1103,11 @@

    transcode(URIString, Options)

    (in_encoding) and outbound (out_encoding) encodings.

    in_encoding and out_encoding specifies both binary encoding and percent-encoding for the input and output data. Mixed encoding, where binary encoding is not the same as percent-encoding, is not supported. If an argument is invalid, an error tuple is -returned.

    Example:

    1> uri_string:transcode(<<"foo%00%00%00%F6bar"/utf32>>,
    -1> [{in_encoding, utf32},{out_encoding, utf8}]).
    +returned.

    Example:

    1> uri_string:transcode(<<"foo%00%00%00%F6bar"/utf32>>,
    +1> [{in_encoding, utf32},{out_encoding, utf8}]).
     <<"foo%C3%B6bar"/utf8>>
    -2> uri_string:transcode("foo%F6bar", [{in_encoding, latin1},
    -2> {out_encoding, utf8}]).
    +2> uri_string:transcode("foo%F6bar", [{in_encoding, latin1},
    +2> {out_encoding, utf8}]).
     "foo%C3%B6bar"
    @@ -1138,9 +1138,9 @@

    unquote(QuotedData)

    -

    Percent decode characters.

    Example:

    1> uri_string:unquote("SomeId%2F04").
    +

    Percent decode characters.

    Example:

    1> uri_string:unquote("SomeId%2F04").
     "SomeId/04"
    -2> uri_string:unquote(<<"SomeId%2F04">>).
    +2> uri_string:unquote(<<"SomeId%2F04">>).
     <<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string_usage.html b/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string_usage.html index 4123350e1d00e..3b355366da664 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string_usage.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/uri_string_usage.html @@ -194,19 +194,19 @@

    to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    @@ -229,27 +229,27 @@

    question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -261,32 +261,32 @@

    You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of diff --git a/prs/8803/lib/stdlib-6.0.1/doc/html/zip.html b/prs/8803/lib/stdlib-6.0.1/doc/html/zip.html index 3d14bde9bc160..a23e7cfddf640 100644 --- a/prs/8803/lib/stdlib-6.0.1/doc/html/zip.html +++ b/prs/8803/lib/stdlib-6.0.1/doc/html/zip.html @@ -1054,28 +1054,28 @@

    foldl(Fun, Acc0, Archive)

    archive. The iteration can be ended prematurely in a controlled manner by throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    +> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    +       0,0,3,0,0,...>>}}
    +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    +{ok,[{"bar",<<"BAR">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}},
    +     {"foo",<<"FOO">>,
    +      {file_info,3,regular,read_write,
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 {{2010,3,1},{19,2,10}},
    +                 54,1,0,0,0,0,0}}]}
    +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    +{ok,{"dummy.zip",
          <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    +       0,0,3,0,0,...>>}}
    +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
     <<"FOO">>
    diff --git a/prs/8803/lib/syntax_tools-3.2/doc/html/erl_syntax.html b/prs/8803/lib/syntax_tools-3.2/doc/html/erl_syntax.html index db3c596b838fe..606622401c787 100644 --- a/prs/8803/lib/syntax_tools-3.2/doc/html/erl_syntax.html +++ b/prs/8803/lib/syntax_tools-3.2/doc/html/erl_syntax.html @@ -6854,10 +6854,10 @@

    get_postcomments(Node)

    Returns the associated post-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, post-comments are typically -displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters +displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters on the same line, rather than placing the separators on the following line. -For example:

    foo([X | Xs], Y) ->
    -    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
    +For example:

    foo([X | Xs], Y) ->
    +    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
      ...

    (where the comment is moved past the rightmost ")" and the ";").

    See also: comment/2, get_attrs/1, get_precomments/1, set_postcomments/2.

    @@ -6890,10 +6890,10 @@

    get_precomments(Node)

    Returns the associated pre-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, pre-comments are typically displayed directly above the node. For example:

    % Pre-comment of function
    -foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator -characters on the same line. For example:

    foo([X | Xs]) ->
    +foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator +characters on the same line. For example:

    foo([X | Xs]) ->
         % Pre-comment of 'bar(X)' node
    -    [bar(X) | foo(Xs)];
    +    [bar(X) | foo(Xs)];
     ...

    (where the comment is moved before the "[").

    See also: comment/2, get_attrs/1, get_postcomments/1, set_precomments/2.

    diff --git a/prs/8803/lib/syntax_tools-3.2/doc/html/merl.html b/prs/8803/lib/syntax_tools-3.2/doc/html/merl.html index 0750941330d61..0803ea7939f10 100644 --- a/prs/8803/lib/syntax_tools-3.2/doc/html/merl.html +++ b/prs/8803/lib/syntax_tools-3.2/doc/html/merl.html @@ -138,30 +138,30 @@

    Quick start

    To enable the full power of Merl, your module needs to include the Merl header -file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on -existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    -?Q("{foo, _@Number}") = Tuple,
    -Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts +file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on +existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    +?Q("{foo, _@Number}") = Tuple,
    +Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts metavariables such as _@Tuple and _@Number to the level of your Erlang code, so you can use the corresponding Erlang variables Tuple and Number directly. This is the most straightforward way to use Merl, and in many cases it's all you need.

    You can even write case switches using ?Q macros as patterns. For example:

    case AST of
    -    ?Q("{foo, _@Foo}") -> handle(Foo);
    -    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    -    _ -> handle_default()
    +    ?Q("{foo, _@Foo}") -> handle(Foo);
    +    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    +    _ -> handle_default()
     end

    These case switches only allow ?Q(...) or _ as clause patterns, and the guards may contain any expressions, not just Erlang guard expressions.

    If the macro MERL_NO_TRANSFORM is defined before the merl.hrl header file is included, the parse transform used by Merl will be disabled, and in that case, the match expressions ?Q(...) = ..., case switches using ?Q(...) patterns, and automatic metavariables like _@Tuple cannot be used in your code, but the Merl macros and functions still work. To do metavariable substitution, you need -to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of +to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of strings. The latter is useful when you need to split a long expression over -multiple lines. For example:

    ?Q(["case _@Expr of",
    +multiple lines. For example:

    ?Q(["case _@Expr of",
         "  {foo, X} -> f(X);",
         "  {bar, X} -> g(X)",
         "  _ -> h(X)"
    -"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in +"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in the second clause above) this allows Merl to generate an error message pointing to the exact line in your source code. (Just remember to comma-separate the strings in the list, otherwise Erlang will concatenate the string fragments as @@ -184,23 +184,23 @@

    uppercase character, as in _@Foo or _@_@Foo, it will become a variable on the Erlang level, and can be used to easily deconstruct and construct syntax trees:

    case Input of
    -    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
    +    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
         ...

    We refer to these as "automatic metavariables". If in addition the name ends with @, as in _@Foo@, the value of the variable as an Erlang term will be automatically converted to the corresponding abstract syntax tree when used to -construct a larger tree. For example, in:

    Bar = {bar, 42},
    -Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a +construct a larger tree. For example, in:

    Bar = {bar, 42},
    +Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a syntax tree representing {foo, {bar, 42}}. This avoids the need for temporary -variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    -Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, +variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    +Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, you cannot use the uppercase convention to mark an automatic metavariable. Instead, if the integer (without the 909-prefix and lift/glob markers) ends in a 9, the integer will become an Erlang-level variable prefixed with Q, and if it ends with 99 it will also be automatically abstracted. For example, the following will increment the arity of the exported function f:

    case Form of
    -    ?Q("-export([f/90919]).") ->
    -        Q2 = erl_syntax:concrete(Q1) + 1,
    -        ?Q("-export([f/909299]).");
    +    ?Q("-export([f/90919]).") ->
    +        Q2 = erl_syntax:concrete(Q1) + 1,
    +        ?Q("-export([f/909299]).");
         ...

    @@ -209,40 +209,40 @@

    Merl can only parse a fragment of text if it follows the basic syntactical rules of Erlang. In most places, a normal Erlang variable can be used as metavariable, -for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to -use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the +for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to +use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the directive -file(Name, Line) requires that Name is a string literal and -Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note +Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note the use of the anonymous variable 9090 to ignore the line number. To match and also bind a metavariable that must be an integer literal, we can use the convention of ending the integer with a 9, turning it into a Q-prefixed variable on the Erlang level (see the previous section).

    Globs

    Whenever you want to match out a number of elements in a sequence (zero or more) -rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms +rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms a, b, and c. This can also be used with static prefix and suffix elements -in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use -plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part +in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use +plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part of the same sequence.

    Lifted metavariables

    In some cases, the Erlang syntax rules make it impossible to place a -metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of +metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of exports in a declaration, because the Erlang parser only allows elements on the form A/I (where A is an atom and I an integer) in the export list. A variable like the above is not allowed, but neither is a single atom or integer, so '@@Name' or 909919 would not work either.

    What you have to do in such cases is to write your metavariable in a syntactically valid position, and use lifting markers to denote where it should -really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level +really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level in the syntax tree, replacing that entire subtree. In this case, the '@_@Name'/0 will be replaced with '@@Name', and the /0 part was just used as dummy notation and will be discarded.

    You may even need to apply lifting more than once. To match the entire export -list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the +list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the entire ['@__Name'/0] part be replaced with '@Name'.

    Sometimes, the tree structure of a code fragment is not very obvious, and parts of the structure may be invisible when printed as source code. For instance, a -simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the +simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the single clause () -> 0. The clause consists of an argument list (empty), a guard (empty), and a body (which is always a list of expressions) containing the single expression 0. This means that to match out the name and the list of clauses of any function, you'll need to use a pattern like ?Q("'@Name'() -> _@_@Body."), using a dummy clause whose body is a glob lifted one level.

    To visualize the structure of a syntax tree, you can use the function -merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate +merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate groups of subtrees on the same level):

    function: inc(X, Y) when ... -> X + Y.
       atom: inc
       +
    diff --git a/prs/8803/lib/tftp-1.2/doc/html/.build b/prs/8803/lib/tftp-1.2/doc/html/.build
    index 40e6f180c63c5..5b8ef34d32c3f 100644
    --- a/prs/8803/lib/tftp-1.2/doc/html/.build
    +++ b/prs/8803/lib/tftp-1.2/doc/html/.build
    @@ -18,7 +18,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2
     dist/lato-latin-ext-400-normal-N27NCBWW.woff2
     dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2
     dist/remixicon-NKANDIL5.woff2
    -dist/search_data-AF02D849.js
    +dist/search_data-C5EAE448.js
     dist/sidebar_items-C15E3309.js
     getting_started.html
     index.html
    diff --git a/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-AF02D849.js b/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-AF02D849.js
    deleted file mode 100644
    index d065014d58277..0000000000000
    --- a/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-AF02D849.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -searchData={"items":[{"type":"behaviour","title":"tftp","doc":"Trivial FTP.\n\nInterface module for the `tftp` application.","ref":"tftp.html"},{"type":"behaviour","title":"Overwiew - tftp","doc":"This is a complete implementation of the following IETF standards:\n    RFC 1350, The TFTP Protocol (revision 2).\n    RFC 2347, TFTP Option Extension.\n    RFC 2348, TFTP Blocksize Option.\n    RFC 2349, TFTP Timeout Interval and Transfer Size Options.\n\nThe only feature that not is implemented in this release is\nthe \"netascii\" transfer mode.\n\nThe [start](`start/1`) function starts a daemon process which, listens\nfor UDP packets on a port. When it receives a request for read or\nwrite it spawns a temporary server process which handles the actual\ntransfer of the file. On the client side the\n[read_file/3](`read_file/3`) and [write_file/3](`write_file/3`)\nfunctions spawns a temporary client process which establishes contact\nwith a TFTP daemon and performs the actual transfer of the file.\n\nMost of the options are common for both the client and the server\nside, but some of them differs a little.","ref":"tftp.html#module-overwiew"},{"type":"behaviour","title":"Callbacks - tftp","doc":"A `tftp` callback module is to be implemented as a `tftp` behavior and export\nthe functions listed in the following.\n\nOn the server side, the callback interaction starts with a call to `open/5` with\nthe registered initial callback state. `open/5` is expected to open the\n(virtual) file. Then either function [`Module:read/1`](`c:read/1`) or\n[`Module:write/2`](`c:write/2`) is invoked repeatedly, once per transferred block. At\neach function call, the state returned from the previous call is obtained. When\nthe last block is encountered, function [`Module:read/1`](`c:read/1`) or\n[`Module:write/2`](`c:write/2`) is expected to close the (virtual) file and return its\nlast state. Function [`Module:abort/3`](`c:abort/3`) is only used in error situations.\nFunction `prepare/5` is not used on the server side.\n\nOn the client side, the callback interaction is the same, but it starts and ends\na bit differently. It starts with a call to `prepare/5` with the same arguments\nas `open/5` takes. `prepare/5` is expected to validate the TFTP options\nsuggested by the user and to return the subset of them that it accepts. Then the\noptions are sent to the server, which performs the same TFTP option negotiation\nprocedure. The options that are accepted by the server are forwarded to function\n`open/5` on the client side. On the client side, function `open/5` must accept\nall option as-is or reject the transfer. Then the callback interaction follows\nthe same pattern as described for the server side. When the last block is\nencountered in [`Module:read/1`](`c:read/1`) or [`Module:write/2`](`c:write/2`), the returned\nstate is forwarded to the user and returned from `read_file`/3 or\n[`write_file/3`](`write_file/3`).\n\nIf a callback (performing the file access in the TFTP server) takes too long\ntime (more than the double TFTP time-out), the server aborts the connection and\nsends an error reply to the client. The server simply\nassumes that the client has given up.\n\nIf the TFTP server receives yet another request from the same client (same host\nand port) while it already has an active connection to the client, it ignores\nthe new request if the request is equal to the first one (same filename and\noptions). This implies that the (new) client will be served by the already\nongoing connection on the server side. By not setting up yet another connection,\nin parallel with the ongoing one, the server consumes less resources.\n\n[](){: #prepare }","ref":"tftp.html#module-callbacks"},{"type":"callback","title":"tftp.abort/3","doc":"Invoked when the file transfer is aborted.\n\nThe callback function is expected to clean up its used resources after the\naborted file transfer, such as closing open file descriptors and so on. The\nfunction is not invoked if any of the other callback functions returns an error,\nas it is expected that they already have cleaned up the necessary resources.\nHowever, it is invoked if the functions fail (crash).","ref":"tftp.html#c:abort/3"},{"type":"function","title":"tftp.change_config/2","doc":"Changes configuration a TFTP Server","ref":"tftp.html#change_config/2"},{"type":"function","title":"tftp.info/1","doc":"Returns information about all TFTP server.","ref":"tftp.html#info/1"},{"type":"callback","title":"tftp.open/6","doc":"Opens a file for read or write access.\n\nOn the client side, where the `open/5` call has been preceded by a call to\n`prepare/5`, all options must be accepted or rejected.\n\nOn the server side, where there is no preceding `prepare/5` call, no new options\ncan be added, but those present in `SuggestedOptions` can be omitted or replaced\nwith new values in `AcceptedOptions`.\n\n[](){: #read }","ref":"tftp.html#c:open/6"},{"type":"callback","title":"tftp.prepare/6","doc":"Prepares to open a file on the client side.\n\nNo new options can be added, but those present in `SuggestedOptions` can be\nomitted or replaced with new values in `AcceptedOptions`.\n\nThis is followed by a call to `open/4` before any read/write access is\nperformed. `AcceptedOptions` is sent to the server, which replies with the\noptions that it accepts. These are then forwarded to `open/4` as\n`SuggestedOptions`.\n\n[](){: #open }","ref":"tftp.html#c:prepare/6"},{"type":"callback","title":"tftp.read/1","doc":"Reads a chunk from the file.\n\nThe callback function is expected to close the file when the last file chunk is\nencountered. When an error is encountered, the callback function is expected to\nclean up after the aborted file transfer, such as closing open file descriptors,\nand so on. In both cases there will be no more calls to any of the callback\nfunctions.\n\n[](){: #write }","ref":"tftp.html#c:read/1"},{"type":"function","title":"tftp.read_file/3","doc":"Reads a (virtual) file `RemoteFilename` from a TFTP server.\n\nIf `LocalFilename` is the atom `binary`, `tftp_binary` is used as callback\nmodule. It concatenates all transferred blocks and returns them as one single\nbinary in `LastCallbackState`.\n\nIf `LocalFilename` is a string and there are no registered callback modules,\n`tftp_file` is used as callback module. It writes each transferred block to the\nfile named `LocalFilename` and returns the number of transferred bytes in\n`LastCallbackState`.\n\nIf `LocalFilename` is a string and there are registered callback modules,\n`LocalFilename` is tested against the regexps of these and the callback module\ncorresponding to the first match is used, or an error tuple is returned if no\nmatching regexp is found.","ref":"tftp.html#read_file/3"},{"type":"function","title":"tftp.start/1","doc":"Starts a daemon process listening for UDP packets on a port.\n\nWhen it receives a request for read or write, it spawns a temporary\nserver process handling the actual transfer of the (virtual) file.","ref":"tftp.html#start/1"},{"type":"callback","title":"tftp.write/2","doc":"Writes a chunk to the file.\n\nThe callback function is expected to close the file when the last file chunk is\nencountered. When an error is encountered, the callback function is expected to\nclean up after the aborted file transfer, such as closing open file descriptors,\nand so on. In both cases there will be no more calls to any of the callback\nfunctions.\n\n[](){: #abort }","ref":"tftp.html#c:write/2"},{"type":"function","title":"tftp.write_file/3","doc":"Writes a (virtual) file `RemoteFilename` to a TFTP server.\n\nIf `LocalFilename` is a binary, `tftp_binary` is used as callback module. The\nbinary is transferred block by block and the number of transferred bytes is\nreturned in `LastCallbackState`.\n\nIf `LocalFilename` is a string and there are no registered callback modules,\n`tftp_file` is used as callback module. It reads the file named `LocalFilename`\nblock by block and returns the number of transferred bytes in\n`LastCallbackState`.\n\nIf `LocalFilename` is a string and there are registered callback modules,\n`LocalFilename` is tested against the regexps of these and the callback module\ncorresponding to the first match is used, or an error tuple is returned if no\nmatching regexp is found.","ref":"tftp.html#write_file/3"},{"type":"type","title":"tftp.access/0","doc":"Access mode.","ref":"tftp.html#t:access/0"},{"type":"type","title":"tftp.connection_option/0","doc":"All options most of them common to the client and server.\n\n- **`{debug, Level::none | error | warning | brief | normal | verbose | all}`**\n\n  Controls the level of debug printouts. Default is `none`.\n\n- **`{host, Host::inet:hostname()}`** -\n\n  The name or IP address of the host where the TFTP daemon resides. This option\n  is only used by the client.\n\n- **`{port, Port::inet:port_number()}`**\n\n  The TFTP port where the daemon listens. Defaults is the standardized\n  number 69. On the server side, it can sometimes make sense to set it to 0,\n  meaning that the daemon just picks a free port (which one is returned by\n  function [`info/1`](`info/1`)).\n\n  If a socket is connected already, option `{udp, [{fd, integer()}]}` can be\n  used to pass the open file descriptor to `gen_udp`. This can be automated by\n  using a command-line argument stating the prebound file descriptor number. For\n  example, if the port is 69 and file descriptor 22 is opened by\n  `setuid_socket_wrap`, the command-line argument \"-tftpd_69 22\" triggers the\n  prebound file descriptor 22 to be used instead of opening port 69. The UDP\n  option `{udp, [{fd, 22}]}` is automatically added. See `init:get_argument/`\n  about command-line arguments and `gen_udp:open/2` about UDP options.\n\n- **`{port_policy, random | inet:port_number() | {range, Min::inet:port_number(), Max::inet:port_nuber()}`**\n\n  Policy for the selection of the temporary port that is used by the\n  server/client during the file transfer. Default is `random`, which is the\n  standardized policy. With this policy a randomized free port is used. A single\n  port or a range of ports can be useful if the protocol passes through a\n  firewall.\n\n- **`{udp, Options::gen_udp:option}`**\n\n- **`{use_tsize, boolean()}`**\n\n  Flag for automated use of option `tsize`. With this set to `true`, the\n  [`write_file/3`](`write_file/3`) client determines the filesize and sends it\n  to the server as the standardized `tsize` option. A\n  [`read_file/3`](`read_file/3`) client acquires only a filesize from the server\n  by sending a zero `tsize`.\n\n- **`{max_tsize, MaxTsize::pos_integer() | infinity}`**\n\n  Threshold for the maximal filesize in bytes. The transfer is aborted if the\n  limit is exceeded. Default is `infinity`.\n\n- **`{max_conn, MaxConn::pos_integer() | infinity}`**\n\n  Threshold for the maximal number of active connections. The daemon rejects the\n  setup of new connections if the limit is exceeded. Default is `infinity`.\n\n- **TftpOption::option()**\n\n  Name and value of a TFTP option.\n\n- **`{reject, Feature:: access() | TftpKey::string()}`**\n\n  Controls which features to reject. This is mostly useful for the server as it\n  can restrict the use of certain TFTP options or read/write access.\n\n- **`{callback, {RegExp ::string(), Module::module(), State :: term()}}`**\n\n  Registration of a callback module. When a file is to be transferred, its local\n  filename is matched to the regular expressions of the registered callbacks.\n  The first matching callback is used during the transfer. See `read_file/3` and\n  `write_file/3`.\n\n  The callback module must implement the `tftp` behavior, see\n  [callbacks](`m:tftp#callbacks`).\n\n- **`{logger, module()}`**\n\n  Callback module for customized logging of errors, warnings, and info messages.\n  The callback module must implement the `m:tftp_logger` behavior. The default\n  module is `tftp_logger`.\n\n- **`{max_retries, MaxRetries::non_neg_integer()}`**\n\n  Threshold for the maximal number of retries. By default the server/client\n  tries to resend a message up to five times when the time-out expires.","ref":"tftp.html#t:connection_option/0"},{"type":"type","title":"tftp.error_code/0","doc":"Error reason codes.","ref":"tftp.html#t:error_code/0"},{"type":"type","title":"tftp.option/0","doc":"Specific TFTP protocol options","ref":"tftp.html#t:option/0"},{"type":"type","title":"tftp.peer/0","doc":"Information about the peer provided for callback.","ref":"tftp.html#t:peer/0"},{"type":"behaviour","title":"tftp_logger","doc":"Trivial FTP logger.\n\nA `tftp_logger` callback module is to be implemented as a `tftp_logger` behavior\nand export the following functions:","ref":"tftp_logger.html"},{"type":"callback","title":"tftp_logger.error_msg/2","doc":"Logs an error message. See `logger:error/2` for details.","ref":"tftp_logger.html#c:error_msg/2"},{"type":"callback","title":"tftp_logger.info_msg/2","doc":"Logs an info message. See `logger:info/2` for details.","ref":"tftp_logger.html#c:info_msg/2"},{"type":"callback","title":"tftp_logger.warning_msg/2","doc":"Logs a warning message. See `logger:warning/2` for details.","ref":"tftp_logger.html#c:warning_msg/2"},{"type":"extras","title":"TFTP Release Notes","doc":"\n# TFTP Release Notes","ref":"notes.html"},{"type":"extras","title":"Tftp 1.2 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-2"},{"type":"extras","title":"Improvements and New Features - TFTP Release Notes","doc":"- There is a new [`tftp_logger`](`m:tftp_logger`) callback behavior module.\n\n  Own Id: OTP-18787 Aux Id: [PR-7700]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n  Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-7700]: https://github.com/erlang/otp/pull/7700\n[PR-8026]: https://github.com/erlang/otp/pull/8026","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tftp 1.1.1 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","doc":"- Replaced unintentional Erlang Public License 1.1 headers in some files with\n  the intended Apache License 2.0 header.\n\n  Own Id: OTP-18815 Aux Id: PR-7780","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tftp 1.1 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-1"},{"type":"extras","title":"Improvements and New Features - TFTP Release Notes","doc":"- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n  appropriate, instead of `proc_lib:init_ack/1,2`.\n\n  \\*** POTENTIAL INCOMPATIBILITY \\***\n\n  Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tftp 1.0.4 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-0-4"},{"type":"extras","title":"Improvements and New Features - TFTP Release Notes","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n  The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n  result in worse types for Dialyzer.\n\n  When one knows that the value being tested must be a tuple,\n  [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n  When one knows that the value being tested must be a binary,\n  [`byte_size/1`](`byte_size/1`) should be preferred. However,\n  [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n  whole number of bytes), so one must make sure that the call to `byte_size/` is\n  preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n  are rejected. Note that the compiler removes redundant calls to\n  [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n  had made sure that the argument is a binary, it does not harm to add an\n  [`is_binary/1`](`is_binary/1`) test immediately before the call to\n  [`byte_size/1`](`byte_size/1`).\n\n  Own Id: OTP-18432 Aux Id:\n  GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tftp 1.0.3 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-0-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","doc":"- Missing runtime dependencies has been added to this application.\n\n  Own Id: OTP-17243 Aux Id: PR-4557","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tftp 1.0.2 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-0-2"},{"type":"extras","title":"Improvements and New Features - TFTP Release Notes","doc":"- Removed compiler warnings.\n\n  Own Id: OTP-16317 Aux Id: OTP-16183","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tftp 1.0.1 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","doc":"- Improved documentation.\n\n  Own Id: OTP-15190","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"TFTP 1.0 - TFTP Release Notes","doc":"","ref":"notes.html#tftp-1-0"},{"type":"extras","title":"First released version - TFTP Release Notes","doc":"- Inets application was split into multiple smaller protocol specific\n  applications. The TFTP application is a standalone TFTP client and server with\n  the same functionality as TFTP in Inets.\n\n  Own Id: OTP-14113","ref":"notes.html#first-released-version"},{"type":"extras","title":"Overview","doc":"\n# Overview\n\nTrivial File Transfer Protocol (TFTP) is a very simple protocol used\nto transfer files over the transport datagram protocol UDP.\n\nOn the client side, function [read_file/3](`tftp:read_file/3`) and\n[write_file/3](`tftp:write_file/3`) spawn a temporary client process\nestablishing contact with a TFTP daemon and perform the file transfer.\n\n`tftp` uses a callback module to handle the file transfer. Two such callback\nmodules are provided, `tftp_binary` and `tftp_file`. See\n[read_file/3](`tftp:read_file/3`) and [write_file/3](`tftp:write_file/3`) for\ndetails. You can also implement your own callback modules, see\n[callbacks](`m:tftp#callbacks`).\n\n# Security Considerations\n\nAs stated in ([RFC 1350](https://datatracker.ietf.org/doc/html/rfc1350))\nbe aware that \"Since TFTP includes no login or access\ncontrol mechanisms, care must be taken in the rights granted to a TFTP\nserver process so as not to violate the security of the server hosts\nfile system.  TFTP is often installed with controls such that only\nfiles that have public read access are available via TFTP and writing\nfiles via TFTP is disallowed.\"","ref":"introduction.html"},{"type":"extras","title":"Examples","doc":"\n# Examples\n\n\nThe [start/1](`tftp:start/1`) function starts a daemon process listening for UDP\npackets on a port. When it receives a request for read or write, it spawns a\ntemporary server process handling the transfer.\n\nThis is a simple example of starting the TFTP server and reading the content of\na sample file using the TFTP client.\n\n_Step 1._ Create a sample file to be used for the transfer:\n\n```text\n      $ echo \"Erlang/OTP 21\" > file.txt\n```\n\n_Step 2._ Start the TFTP server:\n\n```erlang\n      1> {ok, Pid} = tftp:start([{port, 19999}]).\n      {ok,<0.65.0>}\n```\n\n_Step 3._ Start the TFTP client (in another shell):\n\n```erlang\n      1> tftp:read_file(\"file.txt\", binary, [{port, 19999}]).\n      {ok,<<\"Erlang/OTP 21\\n\">>}\n```","ref":"getting_started.html"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}}
    \ No newline at end of file
    diff --git a/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-C5EAE448.js b/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-C5EAE448.js
    new file mode 100644
    index 0000000000000..96339b4084a9f
    --- /dev/null
    +++ b/prs/8803/lib/tftp-1.2/doc/html/dist/search_data-C5EAE448.js
    @@ -0,0 +1 @@
    +searchData={"items":[{"type":"behaviour","doc":"Trivial FTP.\n\nInterface module for the `tftp` application.","title":"tftp","ref":"tftp.html"},{"type":"behaviour","doc":"This is a complete implementation of the following IETF standards:\n    RFC 1350, The TFTP Protocol (revision 2).\n    RFC 2347, TFTP Option Extension.\n    RFC 2348, TFTP Blocksize Option.\n    RFC 2349, TFTP Timeout Interval and Transfer Size Options.\n\nThe only feature that not is implemented in this release is\nthe \"netascii\" transfer mode.\n\nThe [start](`start/1`) function starts a daemon process which, listens\nfor UDP packets on a port. When it receives a request for read or\nwrite it spawns a temporary server process which handles the actual\ntransfer of the file. On the client side the\n[read_file/3](`read_file/3`) and [write_file/3](`write_file/3`)\nfunctions spawns a temporary client process which establishes contact\nwith a TFTP daemon and performs the actual transfer of the file.\n\nMost of the options are common for both the client and the server\nside, but some of them differs a little.","title":"Overwiew - tftp","ref":"tftp.html#module-overwiew"},{"type":"behaviour","doc":"A `tftp` callback module is to be implemented as a `tftp` behavior and export\nthe functions listed in the following.\n\nOn the server side, the callback interaction starts with a call to `open/5` with\nthe registered initial callback state. `open/5` is expected to open the\n(virtual) file. Then either function [`Module:read/1`](`c:read/1`) or\n[`Module:write/2`](`c:write/2`) is invoked repeatedly, once per transferred block. At\neach function call, the state returned from the previous call is obtained. When\nthe last block is encountered, function [`Module:read/1`](`c:read/1`) or\n[`Module:write/2`](`c:write/2`) is expected to close the (virtual) file and return its\nlast state. Function [`Module:abort/3`](`c:abort/3`) is only used in error situations.\nFunction `prepare/5` is not used on the server side.\n\nOn the client side, the callback interaction is the same, but it starts and ends\na bit differently. It starts with a call to `prepare/5` with the same arguments\nas `open/5` takes. `prepare/5` is expected to validate the TFTP options\nsuggested by the user and to return the subset of them that it accepts. Then the\noptions are sent to the server, which performs the same TFTP option negotiation\nprocedure. The options that are accepted by the server are forwarded to function\n`open/5` on the client side. On the client side, function `open/5` must accept\nall option as-is or reject the transfer. Then the callback interaction follows\nthe same pattern as described for the server side. When the last block is\nencountered in [`Module:read/1`](`c:read/1`) or [`Module:write/2`](`c:write/2`), the returned\nstate is forwarded to the user and returned from `read_file`/3 or\n[`write_file/3`](`write_file/3`).\n\nIf a callback (performing the file access in the TFTP server) takes too long\ntime (more than the double TFTP time-out), the server aborts the connection and\nsends an error reply to the client. The server simply\nassumes that the client has given up.\n\nIf the TFTP server receives yet another request from the same client (same host\nand port) while it already has an active connection to the client, it ignores\nthe new request if the request is equal to the first one (same filename and\noptions). This implies that the (new) client will be served by the already\nongoing connection on the server side. By not setting up yet another connection,\nin parallel with the ongoing one, the server consumes less resources.\n\n[](){: #prepare }","title":"Callbacks - tftp","ref":"tftp.html#module-callbacks"},{"type":"callback","doc":"Invoked when the file transfer is aborted.\n\nThe callback function is expected to clean up its used resources after the\naborted file transfer, such as closing open file descriptors and so on. The\nfunction is not invoked if any of the other callback functions returns an error,\nas it is expected that they already have cleaned up the necessary resources.\nHowever, it is invoked if the functions fail (crash).","title":"tftp.abort/3","ref":"tftp.html#c:abort/3"},{"type":"function","doc":"Changes configuration a TFTP Server","title":"tftp.change_config/2","ref":"tftp.html#change_config/2"},{"type":"function","doc":"Returns information about all TFTP server.","title":"tftp.info/1","ref":"tftp.html#info/1"},{"type":"callback","doc":"Opens a file for read or write access.\n\nOn the client side, where the `open/5` call has been preceded by a call to\n`prepare/5`, all options must be accepted or rejected.\n\nOn the server side, where there is no preceding `prepare/5` call, no new options\ncan be added, but those present in `SuggestedOptions` can be omitted or replaced\nwith new values in `AcceptedOptions`.\n\n[](){: #read }","title":"tftp.open/6","ref":"tftp.html#c:open/6"},{"type":"callback","doc":"Prepares to open a file on the client side.\n\nNo new options can be added, but those present in `SuggestedOptions` can be\nomitted or replaced with new values in `AcceptedOptions`.\n\nThis is followed by a call to `open/4` before any read/write access is\nperformed. `AcceptedOptions` is sent to the server, which replies with the\noptions that it accepts. These are then forwarded to `open/4` as\n`SuggestedOptions`.\n\n[](){: #open }","title":"tftp.prepare/6","ref":"tftp.html#c:prepare/6"},{"type":"callback","doc":"Reads a chunk from the file.\n\nThe callback function is expected to close the file when the last file chunk is\nencountered. When an error is encountered, the callback function is expected to\nclean up after the aborted file transfer, such as closing open file descriptors,\nand so on. In both cases there will be no more calls to any of the callback\nfunctions.\n\n[](){: #write }","title":"tftp.read/1","ref":"tftp.html#c:read/1"},{"type":"function","doc":"Reads a (virtual) file `RemoteFilename` from a TFTP server.\n\nIf `LocalFilename` is the atom `binary`, `tftp_binary` is used as callback\nmodule. It concatenates all transferred blocks and returns them as one single\nbinary in `LastCallbackState`.\n\nIf `LocalFilename` is a string and there are no registered callback modules,\n`tftp_file` is used as callback module. It writes each transferred block to the\nfile named `LocalFilename` and returns the number of transferred bytes in\n`LastCallbackState`.\n\nIf `LocalFilename` is a string and there are registered callback modules,\n`LocalFilename` is tested against the regexps of these and the callback module\ncorresponding to the first match is used, or an error tuple is returned if no\nmatching regexp is found.","title":"tftp.read_file/3","ref":"tftp.html#read_file/3"},{"type":"function","doc":"Starts a daemon process listening for UDP packets on a port.\n\nWhen it receives a request for read or write, it spawns a temporary\nserver process handling the actual transfer of the (virtual) file.","title":"tftp.start/1","ref":"tftp.html#start/1"},{"type":"callback","doc":"Writes a chunk to the file.\n\nThe callback function is expected to close the file when the last file chunk is\nencountered. When an error is encountered, the callback function is expected to\nclean up after the aborted file transfer, such as closing open file descriptors,\nand so on. In both cases there will be no more calls to any of the callback\nfunctions.\n\n[](){: #abort }","title":"tftp.write/2","ref":"tftp.html#c:write/2"},{"type":"function","doc":"Writes a (virtual) file `RemoteFilename` to a TFTP server.\n\nIf `LocalFilename` is a binary, `tftp_binary` is used as callback module. The\nbinary is transferred block by block and the number of transferred bytes is\nreturned in `LastCallbackState`.\n\nIf `LocalFilename` is a string and there are no registered callback modules,\n`tftp_file` is used as callback module. It reads the file named `LocalFilename`\nblock by block and returns the number of transferred bytes in\n`LastCallbackState`.\n\nIf `LocalFilename` is a string and there are registered callback modules,\n`LocalFilename` is tested against the regexps of these and the callback module\ncorresponding to the first match is used, or an error tuple is returned if no\nmatching regexp is found.","title":"tftp.write_file/3","ref":"tftp.html#write_file/3"},{"type":"type","doc":"Access mode.","title":"tftp.access/0","ref":"tftp.html#t:access/0"},{"type":"type","doc":"All options most of them common to the client and server.\n\n- **`{debug, Level::none | error | warning | brief | normal | verbose | all}`**\n\n  Controls the level of debug printouts. Default is `none`.\n\n- **`{host, Host::inet:hostname()}`** -\n\n  The name or IP address of the host where the TFTP daemon resides. This option\n  is only used by the client.\n\n- **`{port, Port::inet:port_number()}`**\n\n  The TFTP port where the daemon listens. Defaults is the standardized\n  number 69. On the server side, it can sometimes make sense to set it to 0,\n  meaning that the daemon just picks a free port (which one is returned by\n  function [`info/1`](`info/1`)).\n\n  If a socket is connected already, option `{udp, [{fd, integer()}]}` can be\n  used to pass the open file descriptor to `gen_udp`. This can be automated by\n  using a command-line argument stating the prebound file descriptor number. For\n  example, if the port is 69 and file descriptor 22 is opened by\n  `setuid_socket_wrap`, the command-line argument \"-tftpd_69 22\" triggers the\n  prebound file descriptor 22 to be used instead of opening port 69. The UDP\n  option `{udp, [{fd, 22}]}` is automatically added. See `init:get_argument/`\n  about command-line arguments and `gen_udp:open/2` about UDP options.\n\n- **`{port_policy, random | inet:port_number() | {range, Min::inet:port_number(), Max::inet:port_nuber()}`**\n\n  Policy for the selection of the temporary port that is used by the\n  server/client during the file transfer. Default is `random`, which is the\n  standardized policy. With this policy a randomized free port is used. A single\n  port or a range of ports can be useful if the protocol passes through a\n  firewall.\n\n- **`{udp, Options::gen_udp:option}`**\n\n- **`{use_tsize, boolean()}`**\n\n  Flag for automated use of option `tsize`. With this set to `true`, the\n  [`write_file/3`](`write_file/3`) client determines the filesize and sends it\n  to the server as the standardized `tsize` option. A\n  [`read_file/3`](`read_file/3`) client acquires only a filesize from the server\n  by sending a zero `tsize`.\n\n- **`{max_tsize, MaxTsize::pos_integer() | infinity}`**\n\n  Threshold for the maximal filesize in bytes. The transfer is aborted if the\n  limit is exceeded. Default is `infinity`.\n\n- **`{max_conn, MaxConn::pos_integer() | infinity}`**\n\n  Threshold for the maximal number of active connections. The daemon rejects the\n  setup of new connections if the limit is exceeded. Default is `infinity`.\n\n- **TftpOption::option()**\n\n  Name and value of a TFTP option.\n\n- **`{reject, Feature:: access() | TftpKey::string()}`**\n\n  Controls which features to reject. This is mostly useful for the server as it\n  can restrict the use of certain TFTP options or read/write access.\n\n- **`{callback, {RegExp ::string(), Module::module(), State :: term()}}`**\n\n  Registration of a callback module. When a file is to be transferred, its local\n  filename is matched to the regular expressions of the registered callbacks.\n  The first matching callback is used during the transfer. See `read_file/3` and\n  `write_file/3`.\n\n  The callback module must implement the `tftp` behavior, see\n  [callbacks](`m:tftp#callbacks`).\n\n- **`{logger, module()}`**\n\n  Callback module for customized logging of errors, warnings, and info messages.\n  The callback module must implement the `m:tftp_logger` behavior. The default\n  module is `tftp_logger`.\n\n- **`{max_retries, MaxRetries::non_neg_integer()}`**\n\n  Threshold for the maximal number of retries. By default the server/client\n  tries to resend a message up to five times when the time-out expires.","title":"tftp.connection_option/0","ref":"tftp.html#t:connection_option/0"},{"type":"type","doc":"Error reason codes.","title":"tftp.error_code/0","ref":"tftp.html#t:error_code/0"},{"type":"type","doc":"Specific TFTP protocol options","title":"tftp.option/0","ref":"tftp.html#t:option/0"},{"type":"type","doc":"Information about the peer provided for callback.","title":"tftp.peer/0","ref":"tftp.html#t:peer/0"},{"type":"behaviour","doc":"Trivial FTP logger.\n\nA `tftp_logger` callback module is to be implemented as a `tftp_logger` behavior\nand export the following functions:","title":"tftp_logger","ref":"tftp_logger.html"},{"type":"callback","doc":"Logs an error message. See `logger:error/2` for details.","title":"tftp_logger.error_msg/2","ref":"tftp_logger.html#c:error_msg/2"},{"type":"callback","doc":"Logs an info message. See `logger:info/2` for details.","title":"tftp_logger.info_msg/2","ref":"tftp_logger.html#c:info_msg/2"},{"type":"callback","doc":"Logs a warning message. See `logger:warning/2` for details.","title":"tftp_logger.warning_msg/2","ref":"tftp_logger.html#c:warning_msg/2"},{"type":"extras","doc":"\n# TFTP Release Notes","title":"TFTP Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Tftp 1.2 - TFTP Release Notes","ref":"notes.html#tftp-1-2"},{"type":"extras","doc":"- There is a new [`tftp_logger`](`m:tftp_logger`) callback behavior module.\n\n  Own Id: OTP-18787 Aux Id: [PR-7700]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n  Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-7700]: https://github.com/erlang/otp/pull/7700\n[PR-8026]: https://github.com/erlang/otp/pull/8026","title":"Improvements and New Features - TFTP Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tftp 1.1.1 - TFTP Release Notes","ref":"notes.html#tftp-1-1-1"},{"type":"extras","doc":"- Replaced unintentional Erlang Public License 1.1 headers in some files with\n  the intended Apache License 2.0 header.\n\n  Own Id: OTP-18815 Aux Id: PR-7780","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tftp 1.1 - TFTP Release Notes","ref":"notes.html#tftp-1-1"},{"type":"extras","doc":"- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n  appropriate, instead of `proc_lib:init_ack/1,2`.\n\n  \\*** POTENTIAL INCOMPATIBILITY \\***\n\n  Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","title":"Improvements and New Features - TFTP Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tftp 1.0.4 - TFTP Release Notes","ref":"notes.html#tftp-1-0-4"},{"type":"extras","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n  The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n  result in worse types for Dialyzer.\n\n  When one knows that the value being tested must be a tuple,\n  [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n  When one knows that the value being tested must be a binary,\n  [`byte_size/1`](`byte_size/1`) should be preferred. However,\n  [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n  whole number of bytes), so one must make sure that the call to `byte_size/` is\n  preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n  are rejected. Note that the compiler removes redundant calls to\n  [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n  had made sure that the argument is a binary, it does not harm to add an\n  [`is_binary/1`](`is_binary/1`) test immediately before the call to\n  [`byte_size/1`](`byte_size/1`).\n\n  Own Id: OTP-18432 Aux Id:\n  GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","title":"Improvements and New Features - TFTP Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tftp 1.0.3 - TFTP Release Notes","ref":"notes.html#tftp-1-0-3"},{"type":"extras","doc":"- Missing runtime dependencies has been added to this application.\n\n  Own Id: OTP-17243 Aux Id: PR-4557","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tftp 1.0.2 - TFTP Release Notes","ref":"notes.html#tftp-1-0-2"},{"type":"extras","doc":"- Removed compiler warnings.\n\n  Own Id: OTP-16317 Aux Id: OTP-16183","title":"Improvements and New Features - TFTP Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tftp 1.0.1 - TFTP Release Notes","ref":"notes.html#tftp-1-0-1"},{"type":"extras","doc":"- Improved documentation.\n\n  Own Id: OTP-15190","title":"Fixed Bugs and Malfunctions - TFTP Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"TFTP 1.0 - TFTP Release Notes","ref":"notes.html#tftp-1-0"},{"type":"extras","doc":"- Inets application was split into multiple smaller protocol specific\n  applications. The TFTP application is a standalone TFTP client and server with\n  the same functionality as TFTP in Inets.\n\n  Own Id: OTP-14113","title":"First released version - TFTP Release Notes","ref":"notes.html#first-released-version"},{"type":"extras","doc":"\n# Overview\n\nTrivial File Transfer Protocol (TFTP) is a very simple protocol used\nto transfer files over the transport datagram protocol UDP.\n\nOn the client side, function [read_file/3](`tftp:read_file/3`) and\n[write_file/3](`tftp:write_file/3`) spawn a temporary client process\nestablishing contact with a TFTP daemon and perform the file transfer.\n\n`tftp` uses a callback module to handle the file transfer. Two such callback\nmodules are provided, `tftp_binary` and `tftp_file`. See\n[read_file/3](`tftp:read_file/3`) and [write_file/3](`tftp:write_file/3`) for\ndetails. You can also implement your own callback modules, see\n[callbacks](`m:tftp#callbacks`).\n\n# Security Considerations\n\nAs stated in ([RFC 1350](https://datatracker.ietf.org/doc/html/rfc1350))\nbe aware that \"Since TFTP includes no login or access\ncontrol mechanisms, care must be taken in the rights granted to a TFTP\nserver process so as not to violate the security of the server hosts\nfile system.  TFTP is often installed with controls such that only\nfiles that have public read access are available via TFTP and writing\nfiles via TFTP is disallowed.\"","title":"Overview","ref":"introduction.html"},{"type":"extras","doc":"\n# Examples\n\n\nThe [start/1](`tftp:start/1`) function starts a daemon process listening for UDP\npackets on a port. When it receives a request for read or write, it spawns a\ntemporary server process handling the transfer.\n\nThis is a simple example of starting the TFTP server and reading the content of\na sample file using the TFTP client.\n\n_Step 1._ Create a sample file to be used for the transfer:\n\n```text\n      $ echo \"Erlang/OTP 21\" > file.txt\n```\n\n_Step 2._ Start the TFTP server:\n\n```erlang\n      1> {ok, Pid} = tftp:start([{port, 19999}]).\n      {ok,<0.65.0>}\n```\n\n_Step 3._ Start the TFTP client (in another shell):\n\n```erlang\n      1> tftp:read_file(\"file.txt\", binary, [{port, 19999}]).\n      {ok,<<\"Erlang/OTP 21\\n\">>}\n```","title":"Examples","ref":"getting_started.html"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}}
    \ No newline at end of file
    diff --git a/prs/8803/lib/tftp-1.2/doc/html/getting_started.html b/prs/8803/lib/tftp-1.2/doc/html/getting_started.html
    index 416ed2657d741..48447bf24f797 100644
    --- a/prs/8803/lib/tftp-1.2/doc/html/getting_started.html
    +++ b/prs/8803/lib/tftp-1.2/doc/html/getting_started.html
    @@ -128,9 +128,9 @@ 

    The start/1 function starts a daemon process listening for UDP packets on a port. When it receives a request for read or write, it spawns a temporary server process handling the transfer.

    This is a simple example of starting the TFTP server and reading the content of -a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    -      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    -      {ok,<<"Erlang/OTP 21\n">>}
    +a sample file using the TFTP client.

    Step 1. Create a sample file to be used for the transfer:

          $ echo "Erlang/OTP 21" > file.txt

    Step 2. Start the TFTP server:

          1> {ok, Pid} = tftp:start([{port, 19999}]).
    +      {ok,<0.65.0>}

    Step 3. Start the TFTP client (in another shell):

          1> tftp:read_file("file.txt", binary, [{port, 19999}]).
    +      {ok,<<"Erlang/OTP 21\n">>}
    diff --git a/prs/8803/lib/tftp-1.2/doc/html/search.html b/prs/8803/lib/tftp-1.2/doc/html/search.html index 614e314ff1895..731da8f09d112 100644 --- a/prs/8803/lib/tftp-1.2/doc/html/search.html +++ b/prs/8803/lib/tftp-1.2/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    diff --git a/prs/8803/lib/tftp-1.2/doc/html/tftp.epub b/prs/8803/lib/tftp-1.2/doc/html/tftp.epub index 9064cac49f4b451b90dbad0c07ad76eedb9566e3..30fdc1366a7c60adbcad4d969c9acd58dde2a3ce 100644 GIT binary patch delta 3963 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 TnP>m^&*(kbuCchCCjkBjVvtWI delta 3896 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 Overwiew

    -

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
    +

    This is a complete implementation of the following IETF standards:

    RFC 1350, The TFTP Protocol (revision 2).
     RFC 2347, TFTP Option Extension.
     RFC 2348, TFTP Blocksize Option.
     RFC 2349, TFTP Timeout Interval and Transfer Size Options.

    The only feature that not is implemented in this release is diff --git a/prs/8803/lib/tools-4.0/doc/html/.build b/prs/8803/lib/tools-4.0/doc/html/.build index 4d9ea5e3dbece..8dd2e03946912 100644 --- a/prs/8803/lib/tools-4.0/doc/html/.build +++ b/prs/8803/lib/tools-4.0/doc/html/.build @@ -25,7 +25,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-8780CEA5.js +dist/search_data-536C0AEB.js dist/sidebar_items-7275BB77.js eprof.html erlang-el.html diff --git a/prs/8803/lib/tools-4.0/doc/html/cover.html b/prs/8803/lib/tools-4.0/doc/html/cover.html index 71034e9dee566..ad7599cd5d920 100644 --- a/prs/8803/lib/tools-4.0/doc/html/cover.html +++ b/prs/8803/lib/tools-4.0/doc/html/cover.html @@ -1561,7 +1561,7 @@

    analyse(Arg)

    call is equivalent to analyse('_', coverage, Arg).

    Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

    Note

    To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).
    +name has to be in a list. For example, to analyze a module named calls:

    cover:analyse([calls]).

    @@ -1603,7 +1603,7 @@

    analyse(Arg1, Arg2)

    analyse(Arg1, Arg2, function).

    If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

    Note

    To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    +list. For example, to analyze a module named calls:

    cover:analyse([calls], function).
    @@ -1712,7 +1712,7 @@

    analyse_to_file(Arg)

    options, this call is equivalent to analyse_to_file('_', Arg).

    Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

    Note

    To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    +use cover:analyse_to_file/2:

    cover:analyse_to_file([html], []).
    diff --git a/prs/8803/lib/tools-4.0/doc/html/cover_chapter.html b/prs/8803/lib/tools-4.0/doc/html/cover_chapter.html index 413364031c370..642fc0bb4cf13 100644 --- a/prs/8803/lib/tools-4.0/doc/html/cover_chapter.html +++ b/prs/8803/lib/tools-4.0/doc/html/cover_chapter.html @@ -146,81 +146,81 @@

    Example

    -

    Assume that a test case for the following program should be verified:

    -module(channel).
    --behaviour(gen_server).
    +

    Assume that a test case for the following program should be verified:

    -module(channel).
    +-behaviour(gen_server).
     
    --export([start_link/0,stop/0]).
    --export([alloc/0,free/1]). % client interface
    --export([init/1,handle_call/3,terminate/2]). % callback functions
    +-export([start_link/0,stop/0]).
    +-export([alloc/0,free/1]). % client interface
    +-export([init/1,handle_call/3,terminate/2]). % callback functions
     
    -start_link() ->
    -    gen_server:start_link({local,channel}, channel, [], []).
    +start_link() ->
    +    gen_server:start_link({local,channel}, channel, [], []).
     
    -stop() ->
    -    gen_server:call(channel, stop).
    +stop() ->
    +    gen_server:call(channel, stop).
     
     %%%-Client interface functions-------------------------------------------
     
    -alloc() ->
    -    gen_server:call(channel, alloc).
    +alloc() ->
    +    gen_server:call(channel, alloc).
     
    -free(Channel) ->
    -    gen_server:call(channel, {free,Channel}).
    +free(Channel) ->
    +    gen_server:call(channel, {free,Channel}).
     
     %%%-gen_server callback functions----------------------------------------
     
    -init(_Arg) ->
    -    {ok,channels()}.
    +init(_Arg) ->
    +    {ok,channels()}.
     
    -handle_call(stop, _Client, Channels) ->
    -    {stop,normal,ok,Channels};
    +handle_call(stop, _Client, Channels) ->
    +    {stop,normal,ok,Channels};
     
    -handle_call(alloc, _Client, Channels) ->
    -    {Ch,Channels2} = alloc(Channels),
    -    {reply,{ok,Ch},Channels2};
    +handle_call(alloc, _Client, Channels) ->
    +    {Ch,Channels2} = alloc(Channels),
    +    {reply,{ok,Ch},Channels2};
     
    -handle_call({free,Channel}, _Client, Channels) ->
    -    Channels2 = free(Channel, Channels),
    -    {reply,ok,Channels2}.
    +handle_call({free,Channel}, _Client, Channels) ->
    +    Channels2 = free(Channel, Channels),
    +    {reply,ok,Channels2}.
     
    -terminate(_Reason, _Channels) ->
    +terminate(_Reason, _Channels) ->
         ok.
     
     %%%-Internal functions---------------------------------------------------
     
    -channels() ->
    -    [ch1,ch2,ch3].
    +channels() ->
    +    [ch1,ch2,ch3].
     
    -alloc([Channel|Channels]) ->
    -    {Channel,Channels};
    -alloc([]) ->
    +alloc([Channel|Channels]) ->
    +    {Channel,Channels};
    +alloc([]) ->
         false.
     
    -free(Channel, Channels) ->
    -    [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    --export([s/0]).
    +free(Channel, Channels) ->
    +    [Channel|Channels].

    The test case is implemented as follows:

    -module(test).
    +-export([s/0]).
     
    -s() ->
    -    {ok,Pid} = channel:start_link(),
    -    {ok,Ch1} = channel:alloc(),
    -    ok = channel:free(Ch1),
    -    ok = channel:stop().

    +s() -> + {ok,Pid} = channel:start_link(), + {ok,Ch1} = channel:alloc(), + ok = channel:free(Ch1), + ok = channel:stop().

    Preparation

    First of all, Cover must be started. This spawns a process which owns the Cover -database where all coverage data will be stored.

    1> cover:start().
    -{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use +database where all coverage data will be stored.

    1> cover:start().
    +{ok,<0.90.0>}

    To include other nodes in the coverage analysis, use cover:start/1. All cover-compiled modules will then be loaded on all nodes, and data from all nodes will be summed up when analysing. For simplicity this example only involves the current node.

    Before any analysis can take place, the involved modules must be cover-compiled. This means that some extra information is added to the module before beging compiled into a binary and loaded. The source file of the module is -not affected and no .beam file is created.

    2> cover:compile_module(channel).
    -{ok,channel}

    Each time a function in the cover-compiled module channel is called, +not affected and no .beam file is created.

    2> cover:compile_module(channel).
    +{ok,channel}

    Each time a function in the cover-compiled module channel is called, information about the call will be added to the Cover database. Run the test case:

    3> test:s().
     ok

    Cover analysis is performed by examining the contents of the Cover database. The @@ -238,56 +238,56 @@

    {Cov,NotCov}, where Cov is the number of executable lines that have been executed at least once and NotCov is the number of executable lines that have not been executed.

    If the analysis is made on module level, the result is given for the entire -module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    -{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one +module as a tuple {Module,{Cov,NotCov}}:

    4> cover:analyse(channel, coverage, module).
    +{ok,{channel,{14,1}}}

    For channel, the result shows that 14 lines in the module are covered but one line is not covered.

    If the analysis is made on function level, the result is given as a list of tuples {Function,{Cov,NotCov}}, one for each function in the module. A -function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    -{ok,[{{channel,start_link,0},{1,0}},
    -     {{channel,stop,0},{1,0}},
    -     {{channel,alloc,0},{1,0}},
    -     {{channel,free,1},{1,0}},
    -     {{channel,init,1},{1,0}},
    -     {{channel,handle_call,3},{5,0}},
    -     {{channel,terminate,2},{1,0}},
    -     {{channel,channels,0},{1,0}},
    -     {{channel,alloc,1},{1,1}},
    -     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function +function is specified by its module name, function name and arity:

    5> cover:analyse(channel, coverage, function).
    +{ok,[{{channel,start_link,0},{1,0}},
    +     {{channel,stop,0},{1,0}},
    +     {{channel,alloc,0},{1,0}},
    +     {{channel,free,1},{1,0}},
    +     {{channel,init,1},{1,0}},
    +     {{channel,handle_call,3},{5,0}},
    +     {{channel,terminate,2},{1,0}},
    +     {{channel,channels,0},{1,0}},
    +     {{channel,alloc,1},{1,1}},
    +     {{channel,free,2},{1,0}}]}

    For channel, the result shows that the uncovered line is in the function channel:alloc/1.

    If the analysis is made on clause level, the result is given as a list of tuples {Clause,{Cov,NotCov}}, one for each function clause in the module. A clause is specified by its module name, function name, arity and position within the -function definition:

    6> cover:analyse(channel, coverage, clause).
    -{ok,[{{channel,start_link,0,1},{1,0}},
    -     {{channel,stop,0,1},{1,0}},
    -     {{channel,alloc,0,1},{1,0}},
    -     {{channel,free,1,1},{1,0}},
    -     {{channel,init,1,1},{1,0}},
    -     {{channel,handle_call,3,1},{1,0}},
    -     {{channel,handle_call,3,2},{2,0}},
    -     {{channel,handle_call,3,3},{2,0}},
    -     {{channel,terminate,2,1},{1,0}},
    -     {{channel,channels,0,1},{1,0}},
    -     {{channel,alloc,1,1},{1,0}},
    -     {{channel,alloc,1,2},{0,1}},
    -     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause +function definition:

    6> cover:analyse(channel, coverage, clause).
    +{ok,[{{channel,start_link,0,1},{1,0}},
    +     {{channel,stop,0,1},{1,0}},
    +     {{channel,alloc,0,1},{1,0}},
    +     {{channel,free,1,1},{1,0}},
    +     {{channel,init,1,1},{1,0}},
    +     {{channel,handle_call,3,1},{1,0}},
    +     {{channel,handle_call,3,2},{2,0}},
    +     {{channel,handle_call,3,3},{2,0}},
    +     {{channel,terminate,2,1},{1,0}},
    +     {{channel,channels,0,1},{1,0}},
    +     {{channel,alloc,1,1},{1,0}},
    +     {{channel,alloc,1,2},{0,1}},
    +     {{channel,free,2,1},{1,0}}]}

    For channel, the result shows that the uncovered line is in the second clause of channel:alloc/1.

    Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,{Cov,NotCov}}, one for each executable line in the source code. A -line is specified by its module name and line number.

    7> cover:analyse(channel, coverage, line).
    -{ok,[{{channel,9},{1,0}},
    -     {{channel,12},{1,0}},
    -     {{channel,17},{1,0}},
    -     {{channel,20},{1,0}},
    -     {{channel,25},{1,0}},
    -     {{channel,28},{1,0}},
    -     {{channel,31},{1,0}},
    -     {{channel,32},{1,0}},
    -     {{channel,35},{1,0}},
    -     {{channel,36},{1,0}},
    -     {{channel,39},{1,0}},
    -     {{channel,44},{1,0}},
    -     {{channel,47},{1,0}},
    -     {{channel,49},{0,1}},
    -     {{channel,52},{1,0}}]}

    For channel, the result shows that the uncovered line is line number 49.

    +line is specified by its module name and line number.

    7> cover:analyse(channel, coverage, line).
    +{ok,[{{channel,9},{1,0}},
    +     {{channel,12},{1,0}},
    +     {{channel,17},{1,0}},
    +     {{channel,20},{1,0}},
    +     {{channel,25},{1,0}},
    +     {{channel,28},{1,0}},
    +     {{channel,31},{1,0}},
    +     {{channel,32},{1,0}},
    +     {{channel,35},{1,0}},
    +     {{channel,36},{1,0}},
    +     {{channel,39},{1,0}},
    +     {{channel,44},{1,0}},
    +     {{channel,47},{1,0}},
    +     {{channel,49},{0,1}},
    +     {{channel,52},{1,0}}]}

    For channel, the result shows that the uncovered line is line number 49.

    @@ -296,53 +296,53 @@

    Analysis of type calls is used to find out how many times something has been called and is represented by an integer Calls.

    If the analysis is made on module level, the result is given as a tuple {Module,Calls}. Here Calls is the total number of calls to functions in the -module:

    8> cover:analyse(channel, calls, module).
    -{ok,{channel,12}}

    For channel, the result shows that a total of twelve calls have been made to +module:

    8> cover:analyse(channel, calls, module).
    +{ok,{channel,12}}

    For channel, the result shows that a total of twelve calls have been made to functions in the module.

    If the analysis is made on function level, the result is given as a list of -tuples {Function,Calls}. Here Calls is the number of calls to each function:

    9> cover:analyse(channel, calls, function).
    -{ok,[{{channel,start_link,0},1},
    -     {{channel,stop,0},1},
    -     {{channel,alloc,0},1},
    -     {{channel,free,1},1},
    -     {{channel,init,1},1},
    -     {{channel,handle_call,3},3},
    -     {{channel,terminate,2},1},
    -     {{channel,channels,0},1},
    -     {{channel,alloc,1},1},
    -     {{channel,free,2},1}]}

    For channel, the result shows that handle_call/3 is the most called function +tuples {Function,Calls}. Here Calls is the number of calls to each function:

    9> cover:analyse(channel, calls, function).
    +{ok,[{{channel,start_link,0},1},
    +     {{channel,stop,0},1},
    +     {{channel,alloc,0},1},
    +     {{channel,free,1},1},
    +     {{channel,init,1},1},
    +     {{channel,handle_call,3},3},
    +     {{channel,terminate,2},1},
    +     {{channel,channels,0},1},
    +     {{channel,alloc,1},1},
    +     {{channel,free,2},1}]}

    For channel, the result shows that handle_call/3 is the most called function in the module (three calls). All other functions have been called once.

    If the analysis is made on clause level, the result is given as a list of tuples -{Clause,Calls}. Here Calls is the number of calls to each function clause:

    10> cover:analyse(channel, calls, clause).
    -{ok,[{{channel,start_link,0,1},1},
    -     {{channel,stop,0,1},1},
    -     {{channel,alloc,0,1},1},
    -     {{channel,free,1,1},1},
    -     {{channel,init,1,1},1},
    -     {{channel,handle_call,3,1},1},
    -     {{channel,handle_call,3,2},1},
    -     {{channel,handle_call,3,3},1},
    -     {{channel,terminate,2,1},1},
    -     {{channel,channels,0,1},1},
    -     {{channel,alloc,1,1},1},
    -     {{channel,alloc,1,2},0},
    -     {{channel,free,2,1},1}]}

    For channel, the result shows that all clauses have been called once, except +{Clause,Calls}. Here Calls is the number of calls to each function clause:

    10> cover:analyse(channel, calls, clause).
    +{ok,[{{channel,start_link,0,1},1},
    +     {{channel,stop,0,1},1},
    +     {{channel,alloc,0,1},1},
    +     {{channel,free,1,1},1},
    +     {{channel,init,1,1},1},
    +     {{channel,handle_call,3,1},1},
    +     {{channel,handle_call,3,2},1},
    +     {{channel,handle_call,3,3},1},
    +     {{channel,terminate,2,1},1},
    +     {{channel,channels,0,1},1},
    +     {{channel,alloc,1,1},1},
    +     {{channel,alloc,1,2},0},
    +     {{channel,free,2,1},1}]}

    For channel, the result shows that all clauses have been called once, except the second clause of channel:alloc/1 which has not been called at all.

    Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,Calls}. Here Calls is the number of times each line has been -executed:

    11> cover:analyse(channel, calls, line).
    -{ok,[{{channel,9},1},
    -     {{channel,12},1},
    -     {{channel,17},1},
    -     {{channel,20},1},
    -     {{channel,25},1},
    -     {{channel,28},1},
    -     {{channel,31},1},
    -     {{channel,32},1},
    -     {{channel,35},1},
    -     {{channel,36},1},
    -     {{channel,39},1},
    -     {{channel,44},1},
    -     {{channel,47},1},
    -     {{channel,49},0},
    -     {{channel,52},1}]}

    For channel, the result shows that all lines have been executed once, except +executed:

    11> cover:analyse(channel, calls, line).
    +{ok,[{{channel,9},1},
    +     {{channel,12},1},
    +     {{channel,17},1},
    +     {{channel,20},1},
    +     {{channel,25},1},
    +     {{channel,28},1},
    +     {{channel,31},1},
    +     {{channel,32},1},
    +     {{channel,35},1},
    +     {{channel,36},1},
    +     {{channel,39},1},
    +     {{channel,44},1},
    +     {{channel,47},1},
    +     {{channel,49},0},
    +     {{channel,52},1}]}

    For channel, the result shows that all lines have been executed once, except line number 49 which has not been executed at all.

    @@ -350,65 +350,65 @@

    Analysis to File

    A line level calls analysis of channel can be written to a file using -cover:analyse_to_file/1:

    12> cover:analyse_to_file(channel).
    -{ok,"channel.COVER.out"}

    The function creates a copy of channel.erl where it for each executable line +cover:analyse_to_file/1:

    12> cover:analyse_to_file(channel).
    +{ok,"channel.COVER.out"}

    The function creates a copy of channel.erl where it for each executable line is specified how many times that line has been executed. The output file is called channel.COVER.out.

    File generated from /Users/bjorng/git/otp/channel.erl by COVER 2024-03-20 at 13:25:04
     
     ****************************************************************************
     
    -        |  -module(channel).
    -        |  -behaviour(gen_server).
    +        |  -module(channel).
    +        |  -behaviour(gen_server).
             |
    -        |  -export([start_link/0,stop/0]).
    -        |  -export([alloc/0,free/1]). % client interface
    -        |  -export([init/1,handle_call/3,terminate/2]). % callback functions
    +        |  -export([start_link/0,stop/0]).
    +        |  -export([alloc/0,free/1]). % client interface
    +        |  -export([init/1,handle_call/3,terminate/2]). % callback functions
             |
    -        |  start_link() ->
    -     1..|      gen_server:start_link({local,channel}, channel, [], []).
    +        |  start_link() ->
    +     1..|      gen_server:start_link({local,channel}, channel, [], []).
             |
    -        |  stop() ->
    -     1..|      gen_server:call(channel, stop).
    +        |  stop() ->
    +     1..|      gen_server:call(channel, stop).
             |
             |  %%%-Client interface functions-------------------------------------------
             |
    -        |  alloc() ->
    -     1..|      gen_server:call(channel, alloc).
    +        |  alloc() ->
    +     1..|      gen_server:call(channel, alloc).
             |
    -        |  free(Channel) ->
    -     1..|      gen_server:call(channel, {free,Channel}).
    +        |  free(Channel) ->
    +     1..|      gen_server:call(channel, {free,Channel}).
             |
             |  %%%-gen_server callback functions----------------------------------------
             |
    -        |  init(_Arg) ->
    -     1..|      {ok,channels()}.
    +        |  init(_Arg) ->
    +     1..|      {ok,channels()}.
             |
    -        |  handle_call(stop, _Client, Channels) ->
    -     1..|      {stop,normal,ok,Channels};
    +        |  handle_call(stop, _Client, Channels) ->
    +     1..|      {stop,normal,ok,Channels};
             |
    -        |  handle_call(alloc, _Client, Channels) ->
    -     1..|      {Ch,Channels2} = alloc(Channels),
    -     1..|      {reply,{ok,Ch},Channels2};
    +        |  handle_call(alloc, _Client, Channels) ->
    +     1..|      {Ch,Channels2} = alloc(Channels),
    +     1..|      {reply,{ok,Ch},Channels2};
             |
    -        |  handle_call({free,Channel}, _Client, Channels) ->
    -     1..|      Channels2 = free(Channel, Channels),
    -     1..|      {reply,ok,Channels2}.
    +        |  handle_call({free,Channel}, _Client, Channels) ->
    +     1..|      Channels2 = free(Channel, Channels),
    +     1..|      {reply,ok,Channels2}.
             |
    -        |  terminate(_Reason, _Channels) ->
    +        |  terminate(_Reason, _Channels) ->
          1..|      ok.
             |
             |  %%%-Internal functions---------------------------------------------------
             |
    -        |  channels() ->
    -     1..|      [ch1,ch2,ch3].
    +        |  channels() ->
    +     1..|      [ch1,ch2,ch3].
             |
    -        |  alloc([Channel|Channels]) ->
    -     1..|      {Channel,Channels};
    -        |  alloc([]) ->
    +        |  alloc([Channel|Channels]) ->
    +     1..|      {Channel,Channels};
    +        |  alloc([]) ->
          0..|      false.
             |
    -        |  free(Channel, Channels) ->
    -     1..|      [Channel|Channels].

    + | free(Channel, Channels) -> + 1..| [Channel|Channels].

    @@ -419,11 +419,11 @@

    and test.erl should be extended accordingly. Incidentally, when the test case is corrected a bug in channel will be discovered.

    When the Cover analysis is ready, Cover is stopped and all cover-compiled modules are unloaded. The code for channel is now -loaded as usual from a .beam file in the current path.

    13> code:which(channel).
    +loaded as usual from a .beam file in the current path.

    13> code:which(channel).
     cover_compiled
    -14> cover:stop().
    +14> cover:stop().
     ok
    -15> code:which(channel).
    +15> code:which(channel).
     "./channel.beam"

    @@ -451,12 +451,12 @@

    Cover uses the concept of executable lines, which is code lines containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head or pattern in a case or receive -statement is not executable.

    In the example below, lines number 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module, Compiled) ->
    -2:   case get_file(Module, Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +statement is not executable.

    In the example below, lines number 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module, Compiled) ->
    +2:   case get_file(Module, Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    diff --git a/prs/8803/lib/tools-4.0/doc/html/cprof.html b/prs/8803/lib/tools-4.0/doc/html/cprof.html
    index aa9a072c8ce10..adb7938b84481 100644
    --- a/prs/8803/lib/tools-4.0/doc/html/cprof.html
    +++ b/prs/8803/lib/tools-4.0/doc/html/cprof.html
    @@ -590,7 +590,7 @@ 

    analyse(Module, Limit)

    -

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result +

    Collects and analyses all call counters for module Module.

    This function returns:

    {Module, ModuleCount, FuncAnalysisList}

    where FuncAnalysisList is a list of tuples, one for each function:

    {{Module, FunctionName, Arity}, FuncCallCount}

    If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of diff --git a/prs/8803/lib/tools-4.0/doc/html/cprof_chapter.html b/prs/8803/lib/tools-4.0/doc/html/cprof_chapter.html index 69026d2d17a3a..8662540467f90 100644 --- a/prs/8803/lib/tools-4.0/doc/html/cprof_chapter.html +++ b/prs/8803/lib/tools-4.0/doc/html/cprof_chapter.html @@ -156,36 +156,36 @@

    Example: Background work

    -

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
    +

    From the Erlang shell:

    1> cprof:start(), cprof:pause(). % Stop counters just after start
     8492
    -2> cprof:analyse().
    -{539,
    - [{shell,155,
    -         [{{shell,prep_check,1},55},
    -          {{shell,used_records,4},45},
    -          {{shell,used_records,1},45},
    -          {{shell,used_record_defs,2},1},
    -          {{shell,record_defs,2},1},
    -          {{shell,record_bindings,2},1},
    -          {{shell,exprs,7},1},
    -          {{shell,expr,4},1},
    -          {{shell,expand_records,2},1},
    -          {{shell,check_command,2},1},
    -          {{shell,apply_fun,3},1},
    -          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    -          {{shell,'-eval_loop/3-fun-0-',3},1}]},
    +2> cprof:analyse().
    +{539,
    + [{shell,155,
    +         [{{shell,prep_check,1},55},
    +          {{shell,used_records,4},45},
    +          {{shell,used_records,1},45},
    +          {{shell,used_record_defs,2},1},
    +          {{shell,record_defs,2},1},
    +          {{shell,record_bindings,2},1},
    +          {{shell,exprs,7},1},
    +          {{shell,expr,4},1},
    +          {{shell,expand_records,2},1},
    +          {{shell,check_command,2},1},
    +          {{shell,apply_fun,3},1},
    +          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
    +          {{shell,'-eval_loop/3-fun-0-',3},1}]},
       %% Information about many modules omitted.
                          .
                          .
                          .
       %% Here is the last part.
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    -  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    -  {maps,1,[{{maps,from_list,1},1}]},
    -  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    -3> cprof:analyse(cprof).
    -{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    -4> cprof:stop().
    +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
    +  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
    +  {maps,1,[{{maps,from_list,1},1}]},
    +  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
    +3> cprof:analyse(cprof).
    +{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
    +4> cprof:stop().
     8586

    The example showed some of the background work that the shell performs just to interpret the first command line.

    What is captured in this example is the part of the work the shell does while interpreting the command line that occurs between the actual calls to @@ -195,20 +195,20 @@

    Example: One module

    -

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
    +

    From the Erlang shell:

    1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
     1
    -2> cprof:analyse(calendar).
    -{calendar,9,
    -          [{{calendar,last_day_of_the_month1,2},1},
    -           {{calendar,last_day_of_the_month,2},1},
    -           {{calendar,is_leap_year1,1},1},
    -           {{calendar,is_leap_year,1},1},
    -           {{calendar,dy,1},1},
    -           {{calendar,dm,1},1},
    -           {{calendar,df,2},1},
    -           {{calendar,day_of_the_week,3},1},
    -           {{calendar,date_to_gregorian_days,3},1}]}
    -3> cprof:stop().
    +2> cprof:analyse(calendar).
    +{calendar,9,
    +          [{{calendar,last_day_of_the_month1,2},1},
    +           {{calendar,last_day_of_the_month,2},1},
    +           {{calendar,is_leap_year1,1},1},
    +           {{calendar,is_leap_year,1},1},
    +           {{calendar,dy,1},1},
    +           {{calendar,dm,1},1},
    +           {{calendar,df,2},1},
    +           {{calendar,day_of_the_week,3},1},
    +           {{calendar,date_to_gregorian_days,3},1}]}
    +3> cprof:stop().
     8648

    The example tells us that "Aktiebolaget LM Ericsson & Co" was registered on a Monday (since the return value of the first command is 1), and that the calendar module needed 9 function calls to calculate that.

    Using cprof:analyse() in this example also shows approximately the same @@ -218,60 +218,60 @@

    Example: In the code

    -

    Write a module:

    -module(sort).
    --export([do/1]).
    +

    Write a module:

    -module(sort).
    +-export([do/1]).
     
    -do(N) ->
    -    cprof:stop(),
    -    cprof:start(),
    -    do(N, []).
    +do(N) ->
    +    cprof:stop(),
    +    cprof:start(),
    +    do(N, []).
     
    -do(0, L) ->
    -    R = lists:sort(L),
    -    cprof:pause(),
    +do(0, L) ->
    +    R = lists:sort(L),
    +    cprof:pause(),
         R;
    -do(N, L) ->
    -    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    -{ok,sort}
    -2> rand:seed(default, 42), ok.
    +do(N, L) ->
    +    do(N-1, [rand:uniform(256)-1 | L]).

    From the Erlang shell:

    1> c(sort).
    +{ok,sort}
    +2> rand:seed(default, 42), ok.
     ok.
    -3> sort:do(1000).
    -[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    -4> cprof:analyse().
    -{13180,
    - [{lists,6173,
    -         [{{lists,rmerge3_1,6},1045},
    -          {{lists,rmerge3_2,6},977},
    -          {{lists,split_1,5},652},
    -          {{lists,merge3_1,6},579},
    -          {{lists,merge3_2,6},577},
    -          {{lists,rmerge3_12_3,6},511},
    -          {{lists,split_1_1,6},347},
    -          {{lists,merge3_12_3,6},310},
    -          {{lists,rmerge3_21_3,6},282},
    -          {{lists,merge3_21_3,6},221},
    -          {{lists,merge2_1,4},154},
    -          {{lists,merge2_2,5},138},
    -          {{lists,reverse,2},106},
    -          {{lists,rmerge2_2,5},87},
    -          {{lists,rmergel,2},81},
    -          {{lists,rmerge2_1,4},75},
    -          {{lists,mergel,2},28},
    -          {{lists,keyfind,3},2},
    -          {{lists,sort,1},1}]},
    -  {rand,5000,
    -        [{{rand,uniform_s,2},1000},
    -         {{rand,uniform,1},1000},
    -         {{rand,seed_put,1},1000},
    -         {{rand,seed_get,0},1000},
    -         {{rand,exsss_uniform,2},1000}]},
    -  {erlang,1004,
    -          [{{erlang,put,2},1000},
    -           {{erlang,trace_pattern,3},2},
    -           {{erlang,ensure_tracer_module_loaded,2},2}]},
    -  {sort,1001,[{{sort,do,2},1001}]},
    -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
    -5> cprof:stop().
    +3> sort:do(1000).
    +[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
    +4> cprof:analyse().
    +{13180,
    + [{lists,6173,
    +         [{{lists,rmerge3_1,6},1045},
    +          {{lists,rmerge3_2,6},977},
    +          {{lists,split_1,5},652},
    +          {{lists,merge3_1,6},579},
    +          {{lists,merge3_2,6},577},
    +          {{lists,rmerge3_12_3,6},511},
    +          {{lists,split_1_1,6},347},
    +          {{lists,merge3_12_3,6},310},
    +          {{lists,rmerge3_21_3,6},282},
    +          {{lists,merge3_21_3,6},221},
    +          {{lists,merge2_1,4},154},
    +          {{lists,merge2_2,5},138},
    +          {{lists,reverse,2},106},
    +          {{lists,rmerge2_2,5},87},
    +          {{lists,rmergel,2},81},
    +          {{lists,rmerge2_1,4},75},
    +          {{lists,mergel,2},28},
    +          {{lists,keyfind,3},2},
    +          {{lists,sort,1},1}]},
    +  {rand,5000,
    +        [{{rand,uniform_s,2},1000},
    +         {{rand,uniform,1},1000},
    +         {{rand,seed_put,1},1000},
    +         {{rand,seed_get,0},1000},
    +         {{rand,exsss_uniform,2},1000}]},
    +  {erlang,1004,
    +          [{{erlang,put,2},1000},
    +           {{erlang,trace_pattern,3},2},
    +           {{erlang,ensure_tracer_module_loaded,2},2}]},
    +  {sort,1001,[{{sort,do,2},1001}]},
    +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
    +5> cprof:stop().
     12625

    The example shows some details of how lists:sort/1 works. It used 6173 function calls in module lists to complete the work.

    This time, since the shell was not involved in starting and stopping cprof, no other work was done in the system during the profiling.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/dist/search_data-536C0AEB.js b/prs/8803/lib/tools-4.0/doc/html/dist/search_data-536C0AEB.js new file mode 100644 index 0000000000000..06e401d62e383 --- /dev/null +++ b/prs/8803/lib/tools-4.0/doc/html/dist/search_data-536C0AEB.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","doc":"A Coverage Analysis Tool for Erlang\n\nThe module `cover` provides a set of functions for coverage analysis\nof Erlang programs, counting how many times each _executable line_ of\ncode is executed when a program is run. Executable lines are\nlines in the body of a clause in a function, `case`,\n`receive`, or `try`. Lines in clause heads, blank lines, and lines\ncontaining only comments are not executable.\n\nCoverage analysis can be used to verify that test cases covers all\nrelevant line in the code being test. It can also be helpful when\nlooking for bottlenecks in the code.\n\nBefore any analysis can take place, the involved modules has to be\n_cover-compiled_. This means that some extra information is added to\nthe module before it is compiled into a binary which then is\nloaded. The source file of the module is not affected and no `.beam`\nfile is created. If the runtime system supports coverage natively,\nCover will automatically use that functionality to lower the execution\noverhead for cover-compiled code.\n\n> #### Change {: .info }\n>\n> Native coverage support was added in Erlang/OTP 27.\n\nEach time a function in a cover-compiled module is called, information about the\ncall is added to an internal database of Cover. The coverage analysis is\nperformed by examining the contents of the Cover database. The output `Answer`\nis determined by two parameters: `Level` and `Analysis`.\n\n- `Level = module`\n\n `Answer = {Module,Value}`, where `Module` is the module name.\n\n- `Level = function`\n\n `Answer = [{Function,Value}]`, one tuple for each function in the module. A\n function is specified by its module name `M`, function name `F` and arity `A`\n as a tuple `{M,F,A}`.\n\n- `Level = clause`\n\n `Answer = [{Clause,Value}]`, one tuple for each clause in the module. A clause\n is specified by its module name `M`, function name `F`, arity `A` and position\n in the function definition `C` as a tuple `{M,F,A,C}`.\n\n- `Level = line`\n\n `Answer = [{Line,Value}]`, one tuple for each executable line in the module. A\n line is specified by its module name `M` and line number in the source file\n `N` as a tuple `{M,N}`.\n\n- `Analysis = coverage`\n\n `Value = {Cov,NotCov}` where `Cov` is the number of executable lines in the\n module, function, clause or line that have been executed at least once and\n `NotCov` is the number of executable lines that have not been executed.\n\n- `Analysis = calls`\n\n `Value = Calls` which is the number of times the module, function, or clause\n has been called. In the case of line level analysis, `Calls` is the number of\n times the line has been executed.","title":"cover","ref":"cover.html"},{"type":"module","doc":"Cover can be used in a distributed Erlang system. One of the nodes in the system\nhas to be selected as the _main node_, and all Cover commands must be\nexecuted from that node. The error reason `not_main_node` is returned if an\ninterface function is called on one of the remote nodes.\n\nUse `cover:start/1` and `cover:stop/1` to add or remove nodes. The\nsame cover-compiled code will be loaded on each node, and analysis\nwill collect and sum up coverage data results from all nodes.\n\nTo only collect data from remote nodes without stopping `cover` on those nodes,\nuse `cover:flush/1`\n\nIf the connection to a remote node goes down, the main node will mark it as\nlost. If the node comes back it will be added again. If the remote node was\nalive during the disconnected period, cover data from before and during this\nperiod will be included in the analysis.","title":"Distribution - cover","ref":"cover.html#module-distribution"},{"type":"function","doc":"","title":"cover.analyse/0","ref":"cover.html#analyse/0"},{"type":"function","doc":"Analyzes one or more modules as specified by `Arg`.\n\nIf `Arg` is one of the values in [`analysis()`](`t:analysis/0`), this\ncall is equivalent to [`analyse('_', Arg, function)`](`analyse/3`).\n\nIf `Arg` is one of the values in [`level()`](`t:level/0`), this\ncall is equivalent to [`analyse('_', coverage, Arg)`](`analyse/3`).\n\nOtherwise `Arg` is assumed to be a module name, and this call is equivalent\nto [`analyse(Arg, coverage, function)`](`analyse/3`).\n\n> #### Note {: .info }\n>\n> To analyze a module whose name overlaps with one the values in\n> [`analysis()`](`t:analysis/0`) or [`level()`](`t:level/0`), the module\n> name has to be in a list. For example, to analyze a module named `calls`:\n>\n> ```\n> cover:analyse([calls]).\n> ```","title":"cover.analyse/1","ref":"cover.html#analyse/1"},{"type":"function","doc":"Analyzes one or more modules as specified by `Arg1` and `Arg2`.\n\nIf `Arg1` is one of the values in [`analysis()`](`t:analysis/0`) and\n`Arg2` is one of the values in [`level()`](`t:level/0`), this\ncall is equivalent to [`analyse('_', Arg1, Arg2)`](`analyse/3`).\n\nIf `Arg2` is one of the values in [`analysis()`](`t:analysis/0`),\n`Arg1` is assumed to be a module and this call is equivalent to\n[`analyse(Arg1, Arg2, function)`](`analyse/3`).\n\nIf `Arg2` is one of the values in [`level()`](`t:level/0`), `Arg1` is\nassumed to be a module and this call is equivalent to [`analyse(Arg1,\ncoverage, Arg2)`](`analyse/3`).\n\n> #### Note {: .info }\n>\n> To analyze a module whose name overlaps with one of the values in\n> [`analysis()`](`t:analysis/0`), the module name needs to be in a\n> list. For example, to analyze a module named `calls`:\n>\n> ```\n> cover:analyse([calls], function).\n> ```","title":"cover.analyse/2","ref":"cover.html#analyse/2"},{"type":"function","doc":"Perform analysis of one or more cover-compiled modules, as specified by\n`Analysis` and `Level`, by examining the contents of the internal\ndatabase.\n\nIf `Modules` is an atom (a single module), the return is `OneResult`,\notherwise the return is `{result, Ok, Fail}`.\n\nIf `Modules` is atom `'_'`, all modules that have data in the cover data table\nare analysed. Note that this includes both cover-compiled modules and imported\nmodules.\n\nIf a given module is not cover-compiled, this is indicated by the error reason\n`{not_cover_compiled, Module}`.","title":"cover.analyse/3","ref":"cover.html#analyse/3"},{"type":"function","doc":"","title":"cover.analyse_to_file/0","ref":"cover.html#analyse_to_file/0"},{"type":"function","doc":"If `Arg` is a list of [`analyse_option()`](`t:analyse_option/0`)\noptions, this call is equivalent to [`analyse_to_file('_',\nArg)`](`analyse_to_file/2`).\n\nOtherwise `Arg` is assumed to be a module, and this call is equivalent to\n[`analyse_to_file(Arg, [])`](`analyse_to_file/2`).\n\n> #### Note {: .info }\n>\n> To analyze a module of the name `html` (which overlaps with an option\n> in [`analyse_option()`](`t:analyse_option/0`)), it is necessary to\n> use `cover:analyse_to_file/2`:\n>\n> ```\n> cover:analyse_to_file([html], []).\n> ```","title":"cover.analyse_to_file/1","ref":"cover.html#analyse_to_file/1"},{"type":"function","doc":"Outputs copies of the source code for the given modules annotated with\nexecution counts for each executable line.\n\nThe output file `OutFile` defaults to `Module.COVER.out`, and to `Module.COVER.html`\nif option `html` is used.\n\nIf `Modules` is an atom (one module), the return will be `Answer`, otherwise the\nreturn will be a list, `{result, Ok, Fail}`.\n\nIf `Modules` is '_', all modules that have data in the Cover data table\nare analysed. Note that this includes both cover-compiled modules and imported\nmodules.\n\nIf a module is not cover-compiled, this is indicated by the error reason\n`{not_cover_compiled, Module}`.\n\nIf the source file and/or the output file cannot be opened using `file:open/2`,\nthe function returns `{error, {file, File, Reason}}`, where `File` is the file\nname and `Reason` is the error reason.\n\nIf a module was cover compiled from the `.beam` file, that is, using\n`compile_beam/1` or\n[`compile_beam_directory/0,1` ](`compile_beam_directory/0`), it is assumed that\nthe source code can be found in one of the following locations:\n\n- the same directory as the `.beam` file\n- `../src` relative to the directory with `.beam` file\n- the source path in `Module:module_info(compile)`, in which case two paths\n are examined:\n * first the one constructed by joining `../src` and the tail of the compiled path\n below a trailing `src` component\n * the compiled path itself\n\nIf no source code is found, this is indicated by the error reason\n`{no_source_code_found, Module}`.","title":"cover.analyse_to_file/2","ref":"cover.html#analyse_to_file/2"},{"type":"function","doc":"","title":"cover.async_analyse_to_file/1","ref":"cover.html#async_analyse_to_file/1"},{"type":"function","doc":"","title":"cover.async_analyse_to_file/2","ref":"cover.html#async_analyse_to_file/2"},{"type":"function","doc":"This function works the same way as\n[`analyse_to_file/2`](`analyse_to_file/2`) except that it is asynchronous instead\nof synchronous.\n\nThe spawned process will link with the caller when created. If an\nerror of type [`analyse_rsn()`](`t:analyse_rsn/0`) occurs while doing\nthe cover analysis the process will crash with the same error reason\nas [`analyse_to_file`](`analyse_to_file/1`) would return.","title":"cover.async_analyse_to_file/3","ref":"cover.html#async_analyse_to_file/3"},{"type":"function","doc":"","title":"cover.compile/1","ref":"cover.html#compile/1"},{"type":"function","doc":"","title":"cover.compile/2","ref":"cover.html#compile/2"},{"type":"function","doc":"Cover-compiles one or more modules based `.beam` files containing\nabstract code (option `debug_info`).\n\nCover-compiling from `.beam` files is faster than compiling from\nsource and less hassle, because there is no need to supply options for\ninclude paths or macros. However, the existing `.beam` files must have\nbeen compiled with option\n[`debug_info`](`e:compiler:compile.md#debug_info`) so that they contain\n[*abstract code*](`e:erts:absform`).\n\nIf abstract code is missing, the error reason `{no_abstract_code,\nBeamFile}` is returned. If the abstract code is encrypted, and no key\nis available for decrypting it, the error reason\n`{encrypted_abstract_code, BeamFile}` is returned.\n\nIf only the module name (that is, not the full name of the `.beam`\nfile) is given to this function, the `.beam` file is found by calling\n[`code:which(Module)`](`code:which/1`). If no `.beam` file is found,\nthe error reason `non_existing` is returned. If the module is already\ncover compiled with [`compile_beam/1`](`compile_beam/1`), the `.beam`\nfile will be picked from the same location as the first time it was\ncompiled. If the module is already cover-compiled with\n`compile_module/2`, there is no way to find the correct `.beam` file,\nso the error reason `{already_cover_compiled, no_beam_found, Module}`\nis returned.\n\n`{error, BeamFile}` is returned if the compiled code cannot be loaded on the\nnode.\n\nIf a list of `ModFiles` is given as input, a list of `Result` will be returned.\nThe order of the returned list is undefined.","title":"cover.compile_beam/1","ref":"cover.html#compile_beam/1"},{"type":"function","doc":"","title":"cover.compile_beam_directory/0","ref":"cover.html#compile_beam_directory/0"},{"type":"function","doc":"Cover-compiles all `.beam` files in directory `Dir` in the same way\nas `compile_beam/1`.\n\nThis function returns a list of [`compile_beam_result()`](`t:compile_beam_result/0`)\nif successful. Otherwise, it returns `{error, eacces}` if the directory is not\nreadable, and `{error, enoent}` if the directory does not exist.","title":"cover.compile_beam_directory/1","ref":"cover.html#compile_beam_directory/1"},{"type":"function","doc":"","title":"cover.compile_directory/0","ref":"cover.html#compile_directory/0"},{"type":"function","doc":"","title":"cover.compile_directory/1","ref":"cover.html#compile_directory/1"},{"type":"function","doc":"Compiles all modules (`.erl` files) in a directory `Dir` for Cover analysis the\nsame way as [`compile_module/1,2`](`compile_module/1`) and returns a list of\n[`Result`](`t:compile_result/0`).\n\nThis function returns `{error, eacces}` if the directory is not readable or\n`{error, enoent}` if the directory does not exist.","title":"cover.compile_directory/2","ref":"cover.html#compile_directory/2"},{"type":"function","doc":"","title":"cover.compile_module/1","ref":"cover.html#compile_module/1"},{"type":"function","doc":"Cover-compiles one or more modules.\n\nThe module is given by its module name `Module` or by its file name\n`File`.\n\nThe `.erl` extension can be omitted. If the module is not located in\nthe current directory, the full path to it must be specified.\n\n`Options` is a list of compiler options. Only options defining include\nfile directories and macros are passed to `compile:file/2`;\neverything else is ignored.\n\nIf the module is successfully cover-compiled, the function returns\n`{ok, Module}`. Otherwise the function returns `{error, File}`. Errors and\nwarnings are printed as they occur.\n\nIf a list of `ModFiles` is given as input, a list of [`Result`](`t:compile_result/0`)\nwill be returned. The order of the returned results in the list is undefined.\n\nNote that the internal database is initialized during the compilation,\nwhich means that any previously collected coverage data for the module\nis lost.","title":"cover.compile_module/2","ref":"cover.html#compile_module/2"},{"type":"function","doc":"","title":"cover.export/1","ref":"cover.html#export/1"},{"type":"function","doc":"Exports the current coverage data for `Module` to the file `ExportFile`.\n\nIt is recommended to name the `ExportFile` with the extension `.coverdata`.\n\nIf `Module` is '_', data for all cover-compiled or earlier imported\nmodules is exported.\n\nThis function is useful if coverage data from different systems is to be merged.\n\nSee also `import/1`.","title":"cover.export/2","ref":"cover.html#export/2"},{"type":"function","doc":"Fetches data from the Cover database on the remote nodes and stores it on the main\nnode.","title":"cover.flush/1","ref":"cover.html#flush/1"},{"type":"function","doc":"Imports coverage data from the file `ExportFile` created with\n[`export/1,2`](`export/2`).\n\nAny analysis performed after this call will include the imported data.\n\nNote that when compiling a module _all existing coverage data is removed_,\nincluding imported data. If a module is already compiled when data is imported,\nthe imported data is _added_ to the existing coverage data.\n\nCoverage data from several export files can be imported into one system. The\ncoverage data is then added up when analysing.\n\nCoverage data for a module cannot be imported from the same file twice unless\nthe module is first reset or compiled. The check is based on the filename, so\nyou can easily fool the system by renaming your export file.","title":"cover.import/1","ref":"cover.html#import/1"},{"type":"function","doc":"Returns a list of all imported files.","title":"cover.imported/0","ref":"cover.html#imported/0"},{"type":"function","doc":"Returns a list of all modules for which there are imported data.","title":"cover.imported_modules/0","ref":"cover.html#imported_modules/0"},{"type":"function","doc":"Returns `{file, File}` if the module `Module` is cover-compiled, or `false`\notherwise.\n\n`File` is the `.erl` file used by [`compile_module/1,2`](`compile_module/2`)\nor the `.beam` file used by `compile_beam/1`.","title":"cover.is_compiled/1","ref":"cover.html#is_compiled/1"},{"type":"function","doc":"Only support running Cover on the local node.\n\nThis function has to be called before any modules have been compiled or\nany nodes added. When running in this mode, modules will be\ncover-compiled in a more efficient way, but the resulting code will\nonly work on the same node they were compiled on.","title":"cover.local_only/0","ref":"cover.html#local_only/0"},{"type":"function","doc":"Returns a list with all modules that are currently cover-compiled.","title":"cover.modules/0","ref":"cover.html#modules/0"},{"type":"function","doc":"Resets all coverage data for all cover-compiled modules in the Cover\ndatabase on all nodes.","title":"cover.reset/0","ref":"cover.html#reset/0"},{"type":"function","doc":"Resets all coverage data for the cover-compiled module `Module` in the Cover\ndatabase on all nodes.\n\nIf `Module` is not cover-compiled, the function returns\n`{error, {not_cover_compiled, Module}}`.","title":"cover.reset/1","ref":"cover.html#reset/1"},{"type":"function","doc":"Starts the Cover server which owns the Cover internal database. This function is\ncalled automatically by the other functions in the module.","title":"cover.start/0","ref":"cover.html#start/0"},{"type":"function","doc":"Starts a Cover server on the each of given nodes, and loads all cover compiled\nmodules.\n\nThis call will fail if `cover:local_only/0` has been called.","title":"cover.start/1","ref":"cover.html#start/1"},{"type":"function","doc":"Stops the Cover server and unloads all cover-compiled code.","title":"cover.stop/0","ref":"cover.html#stop/0"},{"type":"function","doc":"Stops the Cover server and unloads all cover-compiled code on the given nodes.\n\nData stored in the Cover database on the remote nodes is fetched and stored on\nthe main node.","title":"cover.stop/1","ref":"cover.html#stop/1"},{"type":"function","doc":"Returns a list with all nodes that are part of the coverage analysis.\n\nNote that the current node is not included, because it is always part\nof the analysis.","title":"cover.which_nodes/0","ref":"cover.html#which_nodes/0"},{"type":"type","doc":"","title":"cover.analyse_answer/0","ref":"cover.html#t:analyse_answer/0"},{"type":"type","doc":"","title":"cover.analyse_fail/0","ref":"cover.html#t:analyse_fail/0"},{"type":"type","doc":"","title":"cover.analyse_file_fail/0","ref":"cover.html#t:analyse_file_fail/0"},{"type":"type","doc":"","title":"cover.analyse_file_ok/0","ref":"cover.html#t:analyse_file_ok/0"},{"type":"type","doc":"","title":"cover.analyse_item/0","ref":"cover.html#t:analyse_item/0"},{"type":"type","doc":"","title":"cover.analyse_ok/0","ref":"cover.html#t:analyse_ok/0"},{"type":"type","doc":"","title":"cover.analyse_option/0","ref":"cover.html#t:analyse_option/0"},{"type":"type","doc":"","title":"cover.analyse_rsn/0","ref":"cover.html#t:analyse_rsn/0"},{"type":"type","doc":"","title":"cover.analyse_value/0","ref":"cover.html#t:analyse_value/0"},{"type":"type","doc":"","title":"cover.analysis/0","ref":"cover.html#t:analysis/0"},{"type":"type","doc":"","title":"cover.beam_mod_file/0","ref":"cover.html#t:beam_mod_file/0"},{"type":"type","doc":"","title":"cover.beam_mod_files/0","ref":"cover.html#t:beam_mod_files/0"},{"type":"type","doc":"","title":"cover.compile_beam_result/0","ref":"cover.html#t:compile_beam_result/0"},{"type":"type","doc":"","title":"cover.compile_beam_rsn/0","ref":"cover.html#t:compile_beam_rsn/0"},{"type":"type","doc":"","title":"cover.compile_result/0","ref":"cover.html#t:compile_result/0"},{"type":"type","doc":"","title":"cover.export_reason/0","ref":"cover.html#t:export_reason/0"},{"type":"type","doc":"","title":"cover.file_error/0","ref":"cover.html#t:file_error/0"},{"type":"type","doc":"","title":"cover.level/0","ref":"cover.html#t:level/0"},{"type":"type","doc":"","title":"cover.mod_file/0","ref":"cover.html#t:mod_file/0"},{"type":"type","doc":"","title":"cover.mod_files/0","ref":"cover.html#t:mod_files/0"},{"type":"type","doc":"","title":"cover.modules/0","ref":"cover.html#t:modules/0"},{"type":"type","doc":"","title":"cover.one_result/0","ref":"cover.html#t:one_result/0"},{"type":"type","doc":"","title":"cover.option/0","ref":"cover.html#t:option/0"},{"type":"module","doc":"A simple Call Count Profiling Tool using breakpoints for minimal runtime\nperformance impact.\n\nThe `cprof` module is used to profile a program to find out how many times\ndifferent functions are called. To minimize runtime performance impact,\nbreakpoints containing counters are used.\n\nSince breakpoints are used there is no need for special compilation of the\nmodules to be profiled. These breakpoints can only be set on BEAM code, so\nBIFs cannot be call-count traced.\n\nThe size of the call counters is the host machine word size. One bit is used\nwhen pausing the counter, so the maximum counter value for a 32-bit host\nis 2,147,483,647.\n\nThe profiling result is delivered as a term containing a sorted list of entries,\none per module. Each module entry contains a sorted list of functions. The\nsorting order in both cases is of decreasing call count.\n\nCall count tracing is lightweight compared to other forms of tracing,\nsuch as `m:eprof` or `m:fprof`, since no trace messages have to be\ngenerated. Some measurements indicates that the performance degradation is\nabout 10 percent.\n\nFor more information and some examples, see the\n[User's Guide for `cprof`](cprof_chapter.md).","title":"cprof","ref":"cprof.html"},{"type":"function","doc":"","title":"cprof.analyse/0","ref":"cprof.html#analyse/0"},{"type":"function","doc":"Collect call counters for one or more modules.\n\nIf `ModLimit` is a module name (an atom), this call is equivalent to\n[`analyse(ModLimit, 1)`](`analyse/2`).\n\nIf `ModLimit` is an integer, this function calls\n[`analyse(Module, ModLimit)`](`analyse/2`) for each `Module` that is\ncurrently loaded (except the `cprof` module itself).\nThe result from those calls are returned in a list.","title":"cprof.analyse/1","ref":"cprof.html#analyse/1"},{"type":"function","doc":"Collects and analyses all call counters for module `Module`.\n\nThis function returns:\n\n```\n{Module, ModuleCount, FuncAnalysisList}\n```\n\nwhere `FuncAnalysisList` is a list of tuples, one for each function:\n\n```\n{{Module, FunctionName, Arity}, FuncCallCount}\n```\n\nIf call counters are still running while `analyse/0,1,2` is executing, the result\ncould be inconsistent. This happens if the process executing `analyse/0,1,2`\nis scheduled out so some other process can increment the counters that are\nbeing analysed. Calling [`pause()`](`pause/0`) before analysing takes care of\nthat problem.\n\nAll functions with a `FuncCallCount` lower than `Limit` are excluded from\n`FuncAnalysisList`. They are still included in `ModCallCount`, though.","title":"cprof.analyse/2","ref":"cprof.html#analyse/2"},{"type":"function","doc":"Pause call count tracing for all functions in all modules and stop it for all\nfunctions in modules to be loaded.\n\nThis call is equivalent to\n[`pause('_', '_', '_') + stop({on_load})`](`pause/3`).","title":"cprof.pause/0","ref":"cprof.html#pause/0"},{"type":"function","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`pause(FuncSpec, '_', '_')`](`pause/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`pause(Module, Name, Arity)`](`pause/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be paused for all functions in modules to be loaded.","title":"cprof.pause/1","ref":"cprof.html#pause/1"},{"type":"function","doc":"","title":"cprof.pause/2","ref":"cprof.html#pause/2"},{"type":"function","doc":"Pause call counters for matching functions in matching modules.\n\nThe call counters for all matching functions that have call count breakpoints\nare paused at their current count.\n\nReturn the number of matching functions that can have call count breakpoints,\nthe same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","title":"cprof.pause/3","ref":"cprof.html#pause/3"},{"type":"function","doc":"","title":"cprof.restart/0","ref":"cprof.html#restart/0"},{"type":"function","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`restart(FuncSpec, '_', '_')`](`restart/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`restart(Module, Name, Arity)`](`restart/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be set to zero and running for all functions in\nmodules to be loaded.","title":"cprof.restart/1","ref":"cprof.html#restart/1"},{"type":"function","doc":"","title":"cprof.restart/2","ref":"cprof.html#restart/2"},{"type":"function","doc":"Restart call counters for the matching functions in matching modules that are\ncall-count traced.\n\nThe call counters for all matching functions that has call count breakpoints\nare set to zero and running.\n\nReturn the number of matching functions that can have call count breakpoints,\nthe same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","title":"cprof.restart/3","ref":"cprof.html#restart/3"},{"type":"function","doc":"Start call count tracing for all functions in all modules, and also for all\nfunctions in modules to be loaded.\n\nThis is equivalent to\n[`start('_', '_', '_') + start({on_load})`](`start/3`).","title":"cprof.start/0","ref":"cprof.html#start/0"},{"type":"function","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`start(FuncSpec, '_', '_')`](`start/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`start(Module, Name, Arity)`](`start/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be set to zero and running for all functions in\nmodules to be loaded.","title":"cprof.start/1","ref":"cprof.html#start/1"},{"type":"function","doc":"","title":"cprof.start/2","ref":"cprof.html#start/2"},{"type":"function","doc":"Start call count tracing for matching functions in matching modules.\n\nSet call count breakpoints on the matching functions that has no call count\nbreakpoints. Call counters are set to zero and running for all matching\nfunctions.\n\nReturn the number of matching functions that has call count breakpoints.","title":"cprof.start/3","ref":"cprof.html#start/3"},{"type":"function","doc":"Stop call count tracing for all functions in all modules, and also for all\nfunctions in modules to be loaded.\n\nThis is equivalent to\n[`stop('_', '_', '_') + stop({on_load})`](`stop/3`).","title":"cprof.stop/0","ref":"cprof.html#stop/0"},{"type":"function","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`stop(FuncSpec, '_', '_')`](`stop/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`stop(Module, Name, Arity)`](`stop/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters be disabled for all functions in modules to be loaded.","title":"cprof.stop/1","ref":"cprof.html#stop/1"},{"type":"function","doc":"","title":"cprof.stop/2","ref":"cprof.html#stop/2"},{"type":"function","doc":"Stop call count tracing for matching functions in matching modules.\n\nRemove call count breakpoints from the matching functions that has call count\nbreakpoints.\n\nReturn the number of matching functions that can have call count breakpoints,\nwhich is the same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","title":"cprof.stop/3","ref":"cprof.html#stop/3"},{"type":"type","doc":"","title":"cprof.func_analysis_list/0","ref":"cprof.html#t:func_analysis_list/0"},{"type":"type","doc":"","title":"cprof.mod_analysis/0","ref":"cprof.html#t:mod_analysis/0"},{"type":"type","doc":"","title":"cprof.mod_analysis_list/0","ref":"cprof.html#t:mod_analysis_list/0"},{"type":"module","doc":"A Time Profiling Tool for Erlang\n\nThe module `eprof` provides a set of functions for time profiling of Erlang\nprograms to find out how the execution time is used. The profiling is done using\nthe Erlang trace BIFs. Tracing of local function calls for a specified set of\nprocesses is enabled when profiling is begun, and disabled when profiling is\nstopped.\n\nWhen using Eprof, expect a slowdown in program execution.","title":"eprof","ref":"eprof.html"},{"type":"function","doc":"","title":"eprof.analyze/0","ref":"eprof.html#analyze/0"},{"type":"function","doc":"If `TypeOpts` is an atom, it is assumed to be a module name, and this\ncall is equivalent to [`analyze(TypeOpts, [])`](`analyze/2`).\n\nOtherwise, if `TypeOpts` is a list, it assumed to be a list of options, and this\ncall is equivalent to [`analyze(procs, TypeOpts)`](`analyze/2`).","title":"eprof.analyze/1","ref":"eprof.html#analyze/1"},{"type":"function","doc":"Call this function when profiling has been stopped to display the results.\n\nIf `Type` is `procs`, the time spent in each function is shown separately\nfor each profiled process.\n\nIf `Type` is `total`, the time spent in each function is shown combined\nfor each profiled process.\n\nTime is shown as percentage of total time and as absolute time in micro seconds.","title":"eprof.analyze/2","ref":"eprof.html#analyze/2"},{"type":"function","doc":"Call this function to ensure that the results displayed by\n[`analyze/0,1,2`](`analyze/0`) are printed to the file `File` as well as to the\nscreen.","title":"eprof.log/1","ref":"eprof.html#log/1"},{"type":"function","doc":"If `FunRootset` is a fun, this call is equivalent to\n[`profile([], FunRootset)`](`profile/2`).\n\nIf `FunRootset` is a list, it is assumed to be a `Rootset`, and this\ncall is equivalent to [`start_profiling(Rootset)`](`start_profiling/1`).","title":"eprof.profile/1","ref":"eprof.html#profile/1"},{"type":"function","doc":"If `Arg1` is a fun and `Arg2` is list, this call is equivalent to\n[`profile([], Arg1, {'_','_','_'}, Arg2)`](`profile/4`).\n\nIf `Arg1` is a list and `Arg2` is a fun, this call is equivalent to\n[`profile(Arg1, Arg2, {'_','_','_'}, Arg1)`](`profile/4`).","title":"eprof.profile/2","ref":"eprof.html#profile/2"},{"type":"function","doc":"","title":"eprof.profile/3","ref":"eprof.html#profile/3"},{"type":"function","doc":"This function spawns a process that applies a fun or an an function,\nand then starts profiling for the spawned proceses as well as the\nprocesses in `Rootset` (and any new processes spawned from them).\n\nIf `Arg1` is a fun, `Arg2` is expected to be a trace pattern, and\n`Arg3` a list of options. In that case, this call is equivalent to:\n\n[`profile(Rootset, erlang, apply, [Arg1, []], Arg2, Arg3)`](`profile/6`)\n\nIf `Arg1` is an atom, `Arg1` is assumed to be a module name, `Arg2` the\nname of the function in that module, and `Arg3` a list of arguments to\nbe used when calling that function. In that case, this call is equivalent\nto:\n\n[`profile(Rootset, Arg1, Arg2, Arg3, {'_','_','_'}, [{set_on_spawn, true}])`](`profile/6`)","title":"eprof.profile/4","ref":"eprof.html#profile/4"},{"type":"function","doc":"","title":"eprof.profile/5","ref":"eprof.html#profile/5"},{"type":"function","doc":"This function spawns a process `P` that [`apply(Module, Function,\nArgs)`](`apply/3`), and then starts profiling for `P` and the\nprocesses in `Rootset` (and any new processes spawned from them).\n\n`Rootset` is a list of pids and registered names.\n\nInformation about activity in any profiled process is stored in the Eprof\ndatabase.\n\nIf tracing could be enabled for `P` and all processes in `Rootset`, the function\nreturns `{ok,Value}` when `Fun()`/`apply` returns with the value `Value`, or\n`{error,Reason}` if `Fun()`/`apply` fails with exit reason `Reason`. Otherwise\nit returns `{error, Reason}` immediately.\n\nThe `set_on_spawn` option will active call time tracing for all processes\nspawned by processes in the rootset. This is the default behaviour.\n\nThe programmer must ensure that the function given as argument is truly\nsynchronous and that no work continues after the function has returned a value.","title":"eprof.profile/6","ref":"eprof.html#profile/6"},{"type":"function","doc":"Starts the Eprof server which holds the internal state of the collected data.","title":"eprof.start/0","ref":"eprof.html#start/0"},{"type":"function","doc":"","title":"eprof.start_profiling/1","ref":"eprof.html#start_profiling/1"},{"type":"function","doc":"","title":"eprof.start_profiling/2","ref":"eprof.html#start_profiling/2"},{"type":"function","doc":"Starts profiling for the processes in `Rootset` (and any new processes spawned\nfrom them).\n\nInformation about activity in any profiled process is stored in the\nEprof database.\n\n`Rootset` is a list of pids and registered names.\n\nThe function returns `profiling` if tracing could be enabled for all processes\nin `Rootset`, or `error` otherwise.\n\nA pattern can be selected to narrow the profiling. For instance a specific\nmodule can be selected, and only the code executed in that module will be\nprofiled.\n\nThe `set_on_spawn` option will active call time tracing for all processes\nspawned by processes in the rootset. This is the default behaviour.","title":"eprof.start_profiling/3","ref":"eprof.html#start_profiling/3"},{"type":"function","doc":"Stops the Eprof server.","title":"eprof.stop/0","ref":"eprof.html#stop/0"},{"type":"function","doc":"Stops profiling started with `start_profiling/1` or `profile/1`.","title":"eprof.stop_profiling/0","ref":"eprof.html#stop_profiling/0"},{"type":"type","doc":"","title":"eprof.analyze_type/0","ref":"eprof.html#t:analyze_type/0"},{"type":"type","doc":"","title":"eprof.trace_pattern_mfa/0","ref":"eprof.html#t:trace_pattern_mfa/0"},{"type":"module","doc":"A Time Profiling Tool using trace to file for minimal runtime performance\nimpact.\n\nThis module is used to profile a program to find out how the execution time is\nused. Tracing to file is used to minimize the runtime performance degradation.\n\nThe `fprof` module uses tracing to collect profiling data, hence there is no\nneed for special compilation of any module to be profiled. When it starts\ntracing, `fprof` will erase all previous tracing in the node and set the\nnecessary trace flags on the profiling target processes as well as local call\ntrace on all functions in all loaded modules and all modules to be loaded.\n`fprof` disable all tracing in the node when it stops tracing.\n\n`fprof` presents both _own time_ that is, how much time a function has\nused for its own execution, and _accumulated time_ that is, including\ncalled functions. All presented times are collected using trace\ntimestamps. `fprof` tries to collect CPU time timestamps, if the host\nmachine OS supports it. Therefore, the times can be wallclock times and\nOS scheduling will randomly strike all called functions in a\npresumably fair way.\n\nHowever, if the profiling time is short, and the host machine OS does\nnot support high resolution CPU time measurements, a few OS\nschedulings can show up as ridiculously long execution times for\nfunctions doing practically nothing. As an example, it has been\nobserved that a function that more or less just composing a tuple, was\nrunning 100 times slower than normal. When tracing was repeated, the\nexecution time was normal.\n\nProfiling is essentially done in 3 steps:\n\n- Tracing: to a file. The trace data contains entries for function\n calls, returns to function, process scheduling, other process\n related events (for example `spawn`), and garbage collection. All trace\n entries are timestamped.\n\n- Profiling: the trace file is read, the execution call stack is\n simulated, and raw profile data is calculated from the simulated call stack\n and the trace timestamps. The profile data is stored in the `fprof` server\n state. During this step the trace data may be dumped in text format to file or\n console.\n\n- Analysing: the raw profile data is sorted, filtered and dumped in\n text format either to file or console. The text format intended to be both\n readable for a human reader, as well as parsable with the standard erlang\n parsing tools.\n\nSince `fprof` sends trace data to afile, the runtime performance\ndegradation is minimized, but still far from negligible, especially\nfor programs that themselves use the filesystem heavily. Where the\ntrace file is placed is also important, for example, on Unix systems\n`/tmp` is usually a good choice since it is essentially a RAM disk,\nwhile any network-mounted disk is a bad idea.\n\n`fprof` can also skip the file step and trace to a tracer process that does the\nprofiling in runtime.\n\n[](){: #analysis }","title":"fprof","ref":"fprof.html"},{"type":"module","doc":"This section describes the output format of the `analyse/1` function.\n\nThe format is parsable with the standard Erlang parsing tools\n`m:erl_scan` and `m:erl_parse`, `file:consult/1`, or `io:read/2`. The\nparse format is not described here — it should be easy enough for the\ninterested reader to try it out. Note that some flags to\n[`analyse/1`](`analyse/1`) will affect the format.\n\nThe following example was run on Erlang/OTP R8 on Solaris 8; all OTP\ninternals in this example are version dependent.\n\nAs an example, we will use the following function, which is a\nslightly modified benchmark function from module `m:file`:\n\n```erlang\n-module(foo).\n-export([create_file_slow/2]).\n\ncreate_file_slow(Name, N) when is_integer(N), N >= 0 ->\n {ok, FD} =\n file:open(Name, [raw, write, delayed_write, binary]),\n if N > 256 ->\n ok = file:write(FD,\n lists:map(fun (X) -> < > end,\n lists:seq(0, 255))),\n ok = create_file_slow(FD, 256, N);\n true ->\n ok = create_file_slow(FD, 0, N)\n end,\n ok = file:close(FD).\n\ncreate_file_slow(FD, M, M) ->\n ok;\ncreate_file_slow(FD, M, N) ->\n ok = file:write(FD, < >),\n create_file_slow(FD, M+1, N).\n```\n\nLet us have a look at the printout after running:\n\n```erlang\n1> fprof:apply(foo, create_file_slow, [junk, 1024]).\n2> fprof:profile().\n3> fprof:analyse().\n```\n\nThe printout starts with:\n\n```erlang\n%% Analysis results:\n{ analysis_options,\n [{callers, true},\n {sort, acc},\n {totals, false},\n {details, true}]}.\n\n% CNT ACC OWN\n[{ totals, 9627, 1691.119, 1659.074}]. %%%\n```\n\nThe `CNT` column shows the total number of function calls that was found in the\ntrace. In the `ACC` column is the total time of the trace from first timestamp to\nlast. And in the `OWN` column is the sum of the execution time in functions found\nin the trace, not including called functions. In this case it is very close to\nthe `ACC` time since the emulator had practically nothing to do except\nexecuting our test program.\n\nAll time values in the printout are in milliseconds.\n\nThe printout continues:\n\n```erlang\n% CNT ACC OWN\n[{ \"<0.28.0>\", 9627,undefined, 1659.074}]. %%\n```\n\nThis is the printout header of one process. The printout contains only this one\nprocess since we called `fprof:apply/3` that traces only the current process.\nTherefore the `CNT` and `OWN` columns perfectly matches the totals above. The `ACC`\ncolumn is undefined since summing the `ACC` times of all calls in the process\nmakes no sense — one would get something like the `ACC` value from totals above\nmultiplied by the average depth of the call stack.\n\nAll paragraphs up to the next process header only concerns function calls within\nthis process.\n\nNow we come to something more interesting:\n\n```erlang\n{[{undefined, 0, 1691.076, 0.030}],\n { {fprof,apply_start_stop,4}, 0, 1691.076, 0.030}, %\n [{{foo,create_file_slow,2}, 1, 1691.046, 0.103},\n {suspend, 1, 0.000, 0.000}]}.\n\n{[{{fprof,apply_start_stop,4}, 1, 1691.046, 0.103}],\n { {foo,create_file_slow,2}, 1, 1691.046, 0.103}, %\n [{{file,close,1}, 1, 1398.873, 0.019},\n {{foo,create_file_slow,3}, 1, 249.678, 0.029},\n {{file,open,2}, 1, 20.778, 0.055},\n {{lists,map,2}, 1, 16.590, 0.043},\n {{lists,seq,2}, 1, 4.708, 0.017},\n {{file,write,2}, 1, 0.316, 0.021}]}.\n```\n\nThe printout consists of one paragraph per called function. The function\n_marked_ with `%` is the one the paragraph concerns — `foo:create_file_slow/2`.\nAbove the marked function are the _calling_ functions — those that has called\nthe marked, and below are those _called_ by the marked function.\n\nThe paragraphs are per default sorted in descending order of the `ACC` column for\nthe marked function. The calling list and called list within one paragraph are\nalso per default sorted in descending order of their `ACC` column.\n\nThe columns are:\n\n* `CNT` - the number of times the function has been called\n* `ACC` - the time spent in the function including called functions\n* `OWN` - the time spent in the function not including called functions\n\nThe rows for the _calling_ functions contain statistics for the _marked_\nfunction with the constraint that only the occasions when a call was made from\nthe _row's_ function to the _marked_ function are accounted for.\n\nThe row for the _marked_ function simply contains the sum of all _calling_ rows.\n\nThe rows for the _called_ functions contains statistics for the _row's_ function\nwith the constraint that only the occasions when a call was made from the\n_marked_ to the _row's_ function are accounted for.\n\nSo, we see that `foo:create_file_slow/2` used very little time for its own\nexecution. It spent most of its time in `file:close/1`. The function\n`foo:create_file_slow/3` that writes 3/4 of the file contents is the second\nbiggest time thief.\n\nWe also see that the call to `file:write/2` that writes 1/4 of the file contents\ntakes very little time in itself. What takes time is to build the data\n(`lists:seq/2` and `lists:map/2`).\n\nThe function `undefined` that has called `fprof:apply_start_stop/4` is an\nunknown function because that call was not recorded in the trace. It was only\nrecorded that the execution returned from `fprof:apply_start_stop/4` to some\nother function above in the call stack, or that the process exited from there.\n\nLet us continue down the printout to find:\n\n```erlang\n{[{{foo,create_file_slow,2}, 1, 249.678, 0.029},\n {{foo,create_file_slow,3}, 768, 0.000, 23.294}],\n { {foo,create_file_slow,3}, 769, 249.678, 23.323}, %\n [{{file,write,2}, 768, 220.314, 14.539},\n {suspend, 57, 6.041, 0.000},\n {{foo,create_file_slow,3}, 768, 0.000, 23.294}]}.\n```\n\nIf you compare with the code you will see there also that\n`foo:create_file_slow/3` was called only from `foo:create_file_slow/2` and\nitself, and called only `file:write/2`, note the number of calls to\n`file:write/2`. But here we see that `suspend` was called a few times. This is a\npseudo function that indicates that the process was suspended while executing in\n`foo:create_file_slow/3`, and since there is no `receive` or `erlang:yield/0` in\nthe code, it must be Erlang scheduling suspensions, or the trace file driver\ncompensating for large file write operations (these are regarded as a schedule\nout followed by a schedule in to the same process).\n\nLet us find the `suspend` entry:\n\n```erlang\n{[{{file,write,2}, 53, 6.281, 0.000},\n {{foo,create_file_slow,3}, 57, 6.041, 0.000},\n {{prim_file,drv_command,4}, 50, 4.582, 0.000},\n {{prim_file,drv_get_response,1}, 34, 2.986, 0.000},\n {{lists,map,2}, 10, 2.104, 0.000},\n {{prim_file,write,2}, 17, 1.852, 0.000},\n {{erlang,port_command,2}, 15, 1.713, 0.000},\n {{prim_file,drv_command,2}, 22, 1.482, 0.000},\n {{prim_file,translate_response,2}, 11, 1.441, 0.000},\n {{prim_file,'-drv_command/2-fun-0-',1}, 15, 1.340, 0.000},\n {{lists,seq,4}, 3, 0.880, 0.000},\n {{foo,'-create_file_slow/2-fun-0-',1}, 5, 0.523, 0.000},\n {{erlang,bump_reductions,1}, 4, 0.503, 0.000},\n {{prim_file,open_int_setopts,3}, 1, 0.165, 0.000},\n {{prim_file,i32,4}, 1, 0.109, 0.000},\n {{fprof,apply_start_stop,4}, 1, 0.000, 0.000}],\n { suspend, 299, 32.002, 0.000}, %\n [ ]}.\n```\n\nWe find no particularly long suspend times, so no function seems to have waited\nin a receive statement. Actually, `prim_file:drv_command/4` contains a receive\nstatement, but in this test program, the message lies in the process receive\nbuffer when the receive statement is entered. We also see that the total suspend\ntime for the test run is small.\n\nThe `suspend` pseudo function has an `OWN` time of zero. This is to prevent\nthe process total `OWN` time from including time in suspension. Whether suspend\ntime is really `ACC` or `OWN` time is more of a philosophical question.\n\nNow we look at another interesting pseudo function, `garbage_collect`:\n\n```erlang\n{[{{prim_file,drv_command,4}, 25, 0.873, 0.873},\n {{prim_file,write,2}, 16, 0.692, 0.692},\n {{lists,map,2}, 2, 0.195, 0.195}],\n { garbage_collect, 43, 1.760, 1.760}, %\n [ ]}.\n```\n\nHere we see that no function stands out, which is very normal.\n\nThe `garbage_collect` pseudo function has not an `OWN` time of zero like\n`suspend`, instead it is equal to the `ACC` time.\n\nGarbage collection often occurs while a process is suspended, but `fprof` hides\nthis fact by pretending that the suspended function was first unsuspended and\nthen garbage collected. Otherwise the printout would show `garbage_collect`\nbeing called from `suspend`, but not which function that might have caused the\ngarbage collection.\n\nLet us now get back to the test code:\n\n```erlang\n{[{{foo,create_file_slow,3}, 768, 220.314, 14.539},\n {{foo,create_file_slow,2}, 1, 0.316, 0.021}],\n { {file,write,2}, 769, 220.630, 14.560}, %\n [{{prim_file,write,2}, 769, 199.789, 22.573},\n {suspend, 53, 6.281, 0.000}]}.\n```\n\nNot unexpectedly, we see that `file:write/2` was called from\n`foo:create_file_slow/3` and `foo:create_file_slow/2`. The number of calls in\neach case as well as the used time are also confirms the previous results.\n\nWe see that `file:write/2` only calls `prim_file:write/2`, but let us refrain\nfrom digging into the internals of the kernel application.\n\nIf we nevertheless _do_ dig down we find the call to the linked-in driver\nthat does the file operations towards the host operating system:\n\n```erlang\n{[{{prim_file,drv_command,4}, 772, 1458.356, 1456.643}],\n { {erlang,port_command,2}, 772, 1458.356, 1456.643}, %\n [{suspend, 15, 1.713, 0.000}]}.\n```\n\nThis is 86 % of the total run time, and as we saw before it is the close\noperation the absolutely biggest contributor. We find a comparison ratio a\nlittle bit up in the call stack:\n\n```erlang\n{[{{prim_file,close,1}, 1, 1398.748, 0.024},\n {{prim_file,write,2}, 769, 174.672, 12.810},\n {{prim_file,open_int,4}, 1, 19.755, 0.017},\n {{prim_file,open_int_setopts,3}, 1, 0.147, 0.016}],\n { {prim_file,drv_command,2}, 772, 1593.322, 12.867}, %\n [{{prim_file,drv_command,4}, 772, 1578.973, 27.265},\n {suspend, 22, 1.482, 0.000}]}.\n```\n\nThe time for file operations in the linked in driver distributes itself as 1 %\nfor open, 11 % for write, and 87 % for close. All data is probably buffered in\nthe operating system until the close.\n\nThe observant reader may notice that the ACC times for\n`prim_file:drv_command/2` and `prim_file:drv_command/4` is not equal between the\nparagraphs above, even though it is easy to believe that\n`prim_file:drv_command/2` is just a passthrough function.\n\nThe missing time can be found in the paragraph for `prim_file:drv_command/4`\nwhere it is evident that not only `prim_file:drv_command/2` is called but also a\nfun:\n\n```erlang\n{[{{prim_file,drv_command,2}, 772, 1578.973, 27.265}],\n { {prim_file,drv_command,4}, 772, 1578.973, 27.265}, %\n [{{erlang,port_command,2}, 772, 1458.356, 1456.643},\n {{prim_file,'-drv_command/2-fun-0-',1}, 772, 87.897, 12.736},\n {suspend, 50, 4.582, 0.000},\n {garbage_collect, 25, 0.873, 0.873}]}.\n```\n\nAnd some more missing time can be explained by the fact that\n`prim_file:open_int/4` both calls `prim_file:drv_command/2` directly as well as\nthrough `prim_file:open_int_setopts/3`, which complicates the picture.\n\n```erlang\n{[{{prim_file,open,2}, 1, 20.309, 0.029},\n {{prim_file,open_int,4}, 1, 0.000, 0.057}],\n { {prim_file,open_int,4}, 2, 20.309, 0.086}, %\n [{{prim_file,drv_command,2}, 1, 19.755, 0.017},\n {{prim_file,open_int_setopts,3}, 1, 0.360, 0.032},\n {{prim_file,drv_open,2}, 1, 0.071, 0.030},\n {{erlang,list_to_binary,1}, 1, 0.020, 0.020},\n {{prim_file,i32,1}, 1, 0.017, 0.017},\n {{prim_file,open_int,4}, 1, 0.000, 0.057}]}.\n.\n.\n.\n{[{{prim_file,open_int,4}, 1, 0.360, 0.032},\n {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}],\n { {prim_file,open_int_setopts,3}, 2, 0.360, 0.048}, %\n [{suspend, 1, 0.165, 0.000},\n {{prim_file,drv_command,2}, 1, 0.147, 0.016},\n {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}]}.\n```","title":"Analysis format - fprof","ref":"fprof.html#module-analysis-format"},{"type":"module","doc":"The actual supervision of execution times is in itself a CPU-intensive activity.\nA message is written on the trace file for every function call that is made by\nthe profiled code.\n\nThe `ACC` time calculation is sometimes difficult to make correct, since it is\ndifficult to define. This happens especially when a function occurs in several\ninstances in the call stack, for example by calling itself perhaps through other\nfunctions and perhaps even non-tail recursively.\n\nTo produce sensible results, `fprof` tries not to charge any function more than\nonce for `ACC` time. The instance highest up (with longest duration) in the call\nstack is chosen.\n\nSometimes a function can unexpectedly waste a lot (some 10 ms or more depending\non host machine OS) of `OWN` (and `ACC`) time, even functions that do practically\nnothing at all. The problem may be that the OS has chosen to schedule out the\nErlang runtime system process for a while, and if the OS does not support high\nresolution CPU time measurements `fprof` will use wallclock time for its\ncalculations, and it will appear as if functions are randomly burning virtual\nmachine time.","title":"Notes - fprof","ref":"fprof.html#module-notes"},{"type":"module","doc":"[fprof - The File Trace Profiler](fprof_chapter.md), `m:dbg`, `m:eprof`","title":"See Also - fprof","ref":"fprof.html#module-see-also"},{"type":"function","doc":"","title":"fprof.analyse/0","ref":"fprof.html#analyse/0"},{"type":"function","doc":"Analyses raw profile data in the `fprof` server.\n\nIf `Arg` is an atom, this call is equivalent to `analyse([Arg])`.\n\nIf `Arg` is a a tuple `{Option, _}`, this call is equivalent to\n`analyse([Option])`.\n\nOtherwise `Arg` must be a list of valid options.\n\nIf called when no raw profile data is available, `{error, no_profile}`\nis returned.\n\n`Destfile` is used to call `file:open/2`.\n\nOption description:\n\n- **`dest` | `{dest, Dest}`** - Specifies the destination for the analysis. If\n this option is not given or it is `dest`, the destination will be the caller's\n group leader, otherwise the destination `Dest` is either the `t:pid/0` of an\n I/O device or a filename. If the filename is `[]`, `\"fprof.analysis\"` is used\n instead.\n\n- **`append`** - Causes the analysis to be appended to the destination file.\n This option is only allowed with the `{dest, Destfile}` option.\n\n- **`{cols, Cols}`** - Specifies the number of columns in the analysis text. If\n this option is not given the number of columns is set to 80.\n\n- **`callers` | `{callers, true}`** - Prints callers and called information in\n the analysis. This is the default.\n\n- **`{callers, false}` | `no_callers`** - Suppresses the printing of callers and\n called information in the analysis.\n\n- **`{sort, SortSpec}`** - Specifies if the analysis should be sorted according\n to the ACC column, which is the default, or the OWN column. See\n [Analysis Format](`m:fprof#analysis`) below.\n\n- **`totals` | `{totals, true}`** - Includes a section containing call\n statistics for all calls regardless of process, in the analysis.\n\n- **`{totals, false}`** - Suppresses the totals section in the analysis, which\n is the default.\n\n- **`details` | `{details, true}`** - Prints call statistics for each process in\n the analysis. This is the default.\n\n- **`{details, false}` | `no_details`** - Suppresses the call statistics for\n each process from the analysis.","title":"fprof.analyse/1","ref":"fprof.html#analyse/1"},{"type":"function","doc":"","title":"fprof.analyse/2","ref":"fprof.html#analyse/2"},{"type":"function","doc":"","title":"fprof.apply/2","ref":"fprof.html#apply/2"},{"type":"function","doc":"Calls the given function surrounded by\n[`trace([start, ...])`](`trace/1`) and\n[`trace(stop)`](`trace/1`).\n\nIf the function arguments (`Arg1`, `Arg2`, and `Arg3`) are `Module`\n(an atom), `Function` (an atom), and `Args` (a list), the function\nwill be called using\n[`erlang:apply(Module, Function, Args)`](`erlang:apply/3`).\n\nIf the function arguments are `Func` (a fun), `Args` (a list), and\n`OptionList` (a list of options), the fun will be called using\n[`erlang:apply(Func, Args)`](`erlang:apply/2`).\n\nSome effort is made to keep the trace clean from unnecessary trace messages;\ntracing is started and stopped from a spawned process while `erlang:apply/2`\nis called in the current process only surrounded by `receive` and `send`\nstatements towards the trace starting process. The trace starting process exits\nwhen it is not needed any more.\n\nThe `TraceStartOption` is any option allowed for `trace/1`. The\noptions `[start, {procs, [self() | PidList]} | OptList]` are given to\n[`trace/1`](`trace/1`), where `OptList` is `OptionList` with the\n`continue`, `start` and `{procs, _}` options removed.\n\nThe `continue` option inhibits the call to [`trace(stop)`](`trace/1`) and leaves\nit up to the caller to stop tracing at a suitable time.","title":"fprof.apply/3","ref":"fprof.html#apply/3"},{"type":"function","doc":"","title":"fprof.apply/4","ref":"fprof.html#apply/4"},{"type":"function","doc":"","title":"fprof.profile/0","ref":"fprof.html#profile/0"},{"type":"function","doc":"Compiles a trace into raw profile data held by the `fprof` server.\n\nIf `Arg` is an atom, this call is equivalent to `profile([Arg])`.\n\nIf `Arg` is a tuple `{OptionName, OptionValue}`,\nthis call is equivalent to `profile([Arg])`.\n\nOtherwise, `Arg` must be a list of options.\n\n`Dumpfile` is used to call `file:open/2`, and `Filename` is used to call\n[`dbg:trace_port(file, Filename)`](`dbg:trace_port/2`).\n\nThe following options are supported:\n\n- **`file` | `{file, Filename}`** - Reads the file `Filename` and creates raw\n profile data that is stored in RAM by the `fprof` server. If the option `file`\n is given, or none of these options are given, the file `fprof.trace` is\n read. The call will return when the whole trace has been read with the return\n value `ok` if successful. This option is not allowed with the `start` or\n `stop` options.\n\n- **`dump` | `{dump, Dump}`** - Specifies the destination for the trace text\n dump. If this option is not given, no dump is generated, if it is `dump` the\n destination will be the caller's group leader, otherwise the destination\n `Dump` is either the pid of an I/O device or a filename. If the\n filename is `[]`, `\"fprof.dump\"` is used instead. This option cannot be\n combined with the `stop` option.\n\n- **`append`** - Causes the trace text dump to be appended to the destination\n file. This option is only allowed with the `{dump, Dumpfile}` option.\n\n- **`start`** - Starts a tracer process that profiles trace data in runtime. The\n call will return immediately with the return value `{ok, Tracer}` if\n successful. This option is not allowed with the `stop`, `file`, or\n `{file, Filename}` options.\n\n- **`stop`** - Stops the tracer process that profiles trace data in runtime. The\n return value will be value `ok` if successful. This option cannot be combined\n with the `start`, `file`, or `{file, Filename}` options.","title":"fprof.profile/1","ref":"fprof.html#profile/1"},{"type":"function","doc":"","title":"fprof.profile/2","ref":"fprof.html#profile/2"},{"type":"function","doc":"Starts the `fprof` server.\n\nNote that there is seldom any need to call this function directly, since\nthe server will be automatically started by any function that will need it.","title":"fprof.start/0","ref":"fprof.html#start/0"},{"type":"function","doc":"","title":"fprof.stop/0","ref":"fprof.html#stop/0"},{"type":"function","doc":"Stops the `fprof` server.\n\nThe supplied `Reason` becomes the exit reason for the server process. By default,\nany `Reason` other than `kill` sends a request to the server and waits for it to\nclean up, reply, and exit. If `Reason` is `kill`, the server is bluntly killed.\n\nIf the `fprof` server is not running, this function returns immediately.\n\n> #### Note {: .info }\n>\n> When the `fprof` server is stopped the collected raw profile data is lost.","title":"fprof.stop/1","ref":"fprof.html#stop/1"},{"type":"function","doc":"Starts or stops tracing.\n\nIf `Arg` is atom `verbose`, this call is equivalent to\n`trace([start, verbose])`.\n\nIf `Arg` is an atom, this call is equivalent to\n`trace([Arg])`.\n\nIf `Arg` is a tuple `{OptionName, OptionValue}`, this call is equivalent to\n`trace([Arg])`.\n\nOtherwise, `Arg` has to be a list of [trace options](`t:trace_option/0`).\n\n`PidSpec` and `Tracer` are used in calls to\n[`erlang:trace(PidSpec, true, [{tracer, Tracer} | Flags])`](`erlang:trace/3`),\nand `Filename` is used to call\n[`dbg:trace_port(file, Filename)`](`dbg:trace_port/2`).\n\nOption description:\n\n- **`stop`** - Stops a running `fprof` trace and clears all tracing from the\n node. Either option `stop` or `start` must be specified, but not both.\n\n- **`start`** - Clears all tracing from the node and starts a new `fprof` trace.\n Either option `start` or `stop` must be specified, but not both.\n\n- **`verbose` | `{verbose, boolean()}`** - The `verbose` or\n `{verbose, true}` options add some trace flags that `fprof` does not need, but that\n can be interesting for general debugging purposes. These options are only allowed\n with the `start` option.\n\n- **`cpu_time` | `{cpu_time, boolean()}`** - The `cpu_time` or\n `{cpu_time, true}` options make the timestamps in the trace be in CPU time instead of\n the default wallclock time. These options are only allowed with the\n `start` option.\n\n > #### Note {: .info }\n >\n > Getting correct values out of `cpu_time` can be difficult. The best way to get\n > correct values is to run using a single scheduler and bind that scheduler to\n > a specific CPU. For example:\n >\n > ```bash\n > erl +S 1 +sbt db`\n > ```\n\n- **`{procs, PidSpec}` | `{procs, [PidSpec]}`** - Specifies which processes that\n should be traced. If this option is not given, the calling process is traced.\n All processes spawned by the traced processes are also traced. This option is\n only allowed with the `start` option.\n\n- **`file` | `{file, Filename}`** - Specifies the filename of the trace. If the\n option `file` is given, or none of these options are given, the file\n `fprof.trace` is used. This option is only allowed with the `start` option,\n but not with the `{tracer, Tracer}` option.\n\n- **`{tracer, Tracer}`** - Specifies that trace to process or port shall be done\n instead of trace to file. This option is only allowed with the `start` option,\n but not with the `{file, Filename}` option.","title":"fprof.trace/1","ref":"fprof.html#trace/1"},{"type":"function","doc":"Starts or stop tracing.\n\nIf `What` is atom `start`, this call is equivalent to\n[`trace([start, {file, Value}])`](`trace/1`).\n\nIf `What` is atom `verbose`, this call is equivalent to\n[`trace([start, verbose, {file, Value}])`](`trace/1`).\n\nIf `What` is a tuple `{OptionName, OptionValue}`,\nthis call is equivalent to\n[`trace([What])`](`trace/1`).","title":"fprof.trace/2","ref":"fprof.html#trace/2"},{"type":"type","doc":"","title":"fprof.analyse_option/0","ref":"fprof.html#t:analyse_option/0"},{"type":"type","doc":"","title":"fprof.apply_option/0","ref":"fprof.html#t:apply_option/0"},{"type":"type","doc":"","title":"fprof.pid_spec/0","ref":"fprof.html#t:pid_spec/0"},{"type":"type","doc":"","title":"fprof.profile_option/0","ref":"fprof.html#t:profile_option/0"},{"type":"type","doc":"","title":"fprof.trace_option/0","ref":"fprof.html#t:trace_option/0"},{"type":"module","doc":"A runtime system Lock Profiling tool.\n\nThe `lcnt` module is used to profile the internal ethread locks in the Erlang\nRuntime System. With `lcnt` enabled, internal counters in the runtime system are\nupdated each time a lock is taken. The counters stores information about the\nnumber of acquisition tries and the number of collisions that has occurred\nduring the acquisition tries. The counters also record the waiting time a lock\nhas caused for a blocked thread when a collision has occurred.\n\nThe data produced by the lock counters will give an estimate on how well the\nruntime system will behave from a parallelizable view point for the scenarios\ntested. This tool was mainly developed to help Erlang runtime developers iron\nout potential and generic bottlenecks.\n\nLocks in the emulator are named after what type of resource they protect and\nwhere in the emulator they are initialized, those are lock 'classes'. Most of\nthose locks are also instantiated several times, and given unique identifiers,\nto increase locking granularity. Typically an instantiated lock protects a\ndisjunct set of the resource, for example ets tables, processes or ports. In\nother cases it protects a specific range of a resource, for example `pix_lock`\nwhich protects index to process mappings, and is given a unique number within\nthe class. A unique lock in `lcnt` is referenced by a name (class) and an\nidentifier: `{Name, Id}`.\n\nSome locks in the system are static and protects global resources, for example\n`bif_timers` and the `run_queue` locks. Other locks are dynamic and not\nnecessarily long lived, for example process locks and ets-table locks. The\nstatistics data from short lived locks can be stored separately when the locks\nare deleted. This behavior is by default turned off to save memory but can be\nturned on via `lcnt:rt_opt({copy_save, true})`. The `lcnt:apply/1,2,3` functions\nenables this behavior during profiling.","title":"lcnt","ref":"lcnt.html"},{"type":"module","doc":"[LCNT User's Guide](lcnt_chapter.md)","title":"See Also - lcnt","ref":"lcnt.html#module-see-also"},{"type":"function","doc":"","title":"lcnt.apply/1","ref":"lcnt.html#apply/1"},{"type":"function","doc":"Sets up lock counters, applies `Fun` with `Args`, and cleans up.\n\nClears the lock counters and then setups the instrumentation to save all\ndestroyed locks. After setup the function is called, passing the elements in\n`Args` as arguments. When the function returns the statistics are immediately\ncollected to the server. After the collection the instrumentation is returned to\nits previous behavior. The result of the applied function is returned.\n\n> #### Warning {: .warning }\n>\n> This function should only be used for micro-benchmarks; it sets `copy_save` to\n> `true` for the duration of the call, which can quickly lead to running out of\n> memory.","title":"lcnt.apply/2","ref":"lcnt.html#apply/2"},{"type":"function","doc":"","title":"lcnt.apply/3","ref":"lcnt.html#apply/3"},{"type":"function","doc":"","title":"lcnt.clear/0","ref":"lcnt.html#clear/0"},{"type":"function","doc":"Clears the internal lock statistics from the runtime system.\n\nThis clears the data in the runtime system but not in server. All\ncounters for static locks are zeroed, all dynamic locks currently\nalive are zeroed and all saved locks now destroyed are removed. It\nalso resets the duration timer.","title":"lcnt.clear/1","ref":"lcnt.html#clear/1"},{"type":"function","doc":"","title":"lcnt.collect/0","ref":"lcnt.html#collect/0"},{"type":"function","doc":"Collects lock statistics from the runtime system.\n\nThe function starts a server if it is not already started. It then\npopulates the server with lock statistics. If the server held any\nlock statistics data before the collect then that data is lost.","title":"lcnt.collect/1","ref":"lcnt.html#collect/1"},{"type":"function","doc":"","title":"lcnt.conflicts/0","ref":"lcnt.html#conflicts/0"},{"type":"function","doc":"Prints a list of internal locks and its statistics.\n\nFor option description, see [`lcnt:inspect/2`](`inspect/2`).","title":"lcnt.conflicts/1","ref":"lcnt.html#conflicts/1"},{"type":"function","doc":"Prints `lcnt` server state and generic information about collected lock\nstatistics.","title":"lcnt.information/0","ref":"lcnt.html#information/0"},{"type":"function","doc":"","title":"lcnt.inspect/1","ref":"lcnt.html#inspect/1"},{"type":"function","doc":"Prints a list of internal lock counters for a specific lock.\n\nLock `Name` and `Id` for ports and processes are interchangeable with the use of\n[`lcnt:swap_pid_keys/0`](`swap_pid_keys/0`) and is the reason why `t:pid/0` and\n`t:port/0` options can be used in both `Name` and `Id` space. Both pids and\nports are special identifiers with stripped creation and can be recreated with\n[`lcnt:pid/2,3`](`pid/3`) and [`lcnt:port/1,2`](`port/2`).\n\nOption description:\n\n- **`{combine, boolean()}`** - Combine the statistics from different instances\n of a lock class. \n Default: `true`\n\n- **`{locations, boolean()}`** - Print the statistics by source file and line\n numbers. \n Default: `false`\n\n- **`{max_locks, MaxLocks}`** - Maximum number of locks printed or no limit with\n `none`. \n Default: `20`\n\n- **`{print, PrintOptions}`** - Printing options:\n\n - **`name`** - Named lock or named set of locks (classes). The same name used\n for initializing the lock in the VM.\n\n - **`id`** - Internal id for set of locks, not always unique. This could be\n table name for ets tables (db_tab), port id for ports, integer identifiers\n for allocators, etc.\n\n - **`type`** - Type of lock: `rw_mutex`, `mutex`, `spinlock`, `rw_spinlock` or\n `proclock`.\n\n - **`entry`** - In combination with `{locations, true}` this option prints the\n lock operations source file and line number entry-points along with\n statistics for each entry.\n\n - **`tries`** - Number of acquisitions of this lock.\n\n - **`colls`** - Number of collisions when a thread tried to acquire this lock.\n This is when a trylock is EBUSY, a write try on read held rw_lock, a try\n read on write held rw_lock, a thread tries to lock an already locked lock.\n (Internal states supervises this.)\n\n - **`ratio`** - The ratio between the number of collisions and the number of\n tries (acquisitions) in percentage.\n\n - **`time`** - Accumulated waiting time for this lock. This could be greater\n than actual wall clock time, it is accumulated for all threads. Trylock\n conflicts does not accumulate time.\n\n - **`duration`** - Percentage of accumulated waiting time of wall clock time.\n This percentage can be higher than 100% since accumulated time is from all\n threads.\n\n Default: `[name,id,tries,colls,ratio,time,duration]`\n\n- **`{reverse, boolean()}`** - Reverses the order of sorting. \n Default: `false`\n\n- **`{sort, Sort}`** - Column sorting orders. \n Default: `time`\n\n- **`{thresholds, Thresholds}`** - Filtering thresholds. Anything values above\n the threshold value are passed through. \n Default: `[{tries, 0}, {colls, 0}, {time, 0}]`","title":"lcnt.inspect/2","ref":"lcnt.html#inspect/2"},{"type":"function","doc":"Restores previously saved data to the server.","title":"lcnt.load/1","ref":"lcnt.html#load/1"},{"type":"function","doc":"","title":"lcnt.locations/0","ref":"lcnt.html#locations/0"},{"type":"function","doc":"Prints a list of internal lock counters by source code locations.\n\nFor option description, see [`lcnt:inspect/2`](`inspect/2`).","title":"lcnt.locations/1","ref":"lcnt.html#locations/1"},{"type":"function","doc":"","title":"lcnt.pid/2","ref":"lcnt.html#pid/2"},{"type":"function","doc":"Creates a process id with creation 0.","title":"lcnt.pid/3","ref":"lcnt.html#pid/3"},{"type":"function","doc":"","title":"lcnt.port/1","ref":"lcnt.html#port/1"},{"type":"function","doc":"Creates a port id with creation 0.","title":"lcnt.port/2","ref":"lcnt.html#port/2"},{"type":"function","doc":"","title":"lcnt.rt_clear/0","ref":"lcnt.html#rt_clear/0"},{"type":"function","doc":"Clear the internal counters.\n\nEquivalent to [`lcnt:clear(Node)`](`clear/1`).","title":"lcnt.rt_clear/1","ref":"lcnt.html#rt_clear/1"},{"type":"function","doc":"","title":"lcnt.rt_collect/0","ref":"lcnt.html#rt_collect/0"},{"type":"function","doc":"Returns a list of raw lock counter data.","title":"lcnt.rt_collect/1","ref":"lcnt.html#rt_collect/1"},{"type":"function","doc":"Return the current category mask for the current node.","title":"lcnt.rt_mask/0","ref":"lcnt.html#rt_mask/0"},{"type":"function","doc":"Sets the current lock category mask for the current node or\nretrieves the current mask for a remote node.\n\nIf `Arg` is an atom, it is assumed to be a node, and this\ncall returns the current lock category mask for node `Arg`.\n\nIf `Arg` is a list, this call is equivalent to\n[`rt_mask(node(), Arg)`](`rt_mask/2`).","title":"lcnt.rt_mask/1","ref":"lcnt.html#rt_mask/1"},{"type":"function","doc":"Sets the lock category mask according to `Categories` on node `Node`.\n\nThis call will fail if the `copy_save` option is enabled; see\n[`lcnt:rt_opt/2`](`rt_opt/2`).\n\nValid categories are:\n\n- `allocator`\n- `db` (ETS tables)\n- `debug`\n- `distribution`\n- `generic`\n- `io`\n- `process`\n- `scheduler`\n\nThis list is subject to change at any time, as is the category any given lock\nbelongs to.","title":"lcnt.rt_mask/2","ref":"lcnt.html#rt_mask/2"},{"type":"function","doc":"","title":"lcnt.rt_opt/1","ref":"lcnt.html#rt_opt/1"},{"type":"function","doc":"Sets a single option on node `Node`.\n\nOption description:\n\n- **`{copy_save, boolean()}`** - Retains the statistics of destroyed locks. \n Default: `false`\n\n > #### Warning {: .warning }\n >\n > This option will use a lot of memory when enabled, which must be reclaimed\n > with [`lcnt:rt_clear/0,1`](`lcnt:rt_clear/1`). Note that it makes no\n > distinction between locks that were destroyed and locks for which counting\n > was disabled, so enabling this option will disable changes to the lock\n > category mask.\n\n- **`{process_locks, boolean()}`** - Profile process locks, equal to adding\n `process` to the lock category mask; see `lcnt:rt_mask/2`. \n Default: `true`","title":"lcnt.rt_opt/2","ref":"lcnt.html#rt_opt/2"},{"type":"function","doc":"Saves the collected data to file.","title":"lcnt.save/1","ref":"lcnt.html#save/1"},{"type":"function","doc":"Starts the lock profiler server.\n\nThe server only act as a medium for the user and performs filtering\nand printing of data collected by `lcnt:collect/1`.","title":"lcnt.start/0","ref":"lcnt.html#start/0"},{"type":"function","doc":"Stops the lock profiler server.","title":"lcnt.stop/0","ref":"lcnt.html#stop/0"},{"type":"function","doc":"Swaps places on `Name` and `Id` space for ports and processes.","title":"lcnt.swap_pid_keys/0","ref":"lcnt.html#swap_pid_keys/0"},{"type":"type","doc":"","title":"lcnt.category_atom/0","ref":"lcnt.html#t:category_atom/0"},{"type":"type","doc":"","title":"lcnt.lock_counter_data/0","ref":"lcnt.html#t:lock_counter_data/0"},{"type":"type","doc":"","title":"lcnt.option/0","ref":"lcnt.html#t:option/0"},{"type":"type","doc":"","title":"lcnt.print/0","ref":"lcnt.html#t:print/0"},{"type":"type","doc":"","title":"lcnt.sort/0","ref":"lcnt.html#t:sort/0"},{"type":"type","doc":"","title":"lcnt.threshold/0","ref":"lcnt.html#t:threshold/0"},{"type":"module","doc":"A Make Utility for Erlang\n\nThe module `make` provides a set of functions similar to the UNIX type `Make`\nfunctions.","title":"make","ref":"make.html"},{"type":"module","doc":"[`make:all/0,1`](`all/1`) and [`make:files/1,2`](`files/2`) first looks for\n`{emake, Emake}` in options, then in the current working directory for a file\nnamed `Emakefile`. If present `Emake` should contain elements like this:\n\n```text\nModules.\n{Modules,Options}.\n```\n\n`Modules` is an atom or a list of atoms. It can be\n\n- a module name, for exmaple, `file1`\n- a module name in another directory, for exmaple, `'../foo/file3'`\n- a set of modules specified with a wildcards, for exmaple, `'file*'`\n- a wildcard indicating all modules in current directory, that is: `'*'`\n- a list of any of the above, for exmaple, `['file*','../foo/file3','File4']`\n\n`Options` is a list of compiler options.\n\n`Emakefile` is read from top to bottom. If a module matches more than one entry,\nthe first match is used. For example, the following `Emakefile` means that\n`file1` should be compiled with the options `[debug_info,{i,\"../foo\"}]`, while\nall other files in the current directory should be compiled with only the\n`debug_info` flag.\n\n```erlang\n{'file1',[debug_info,{i,\"../foo\"}]}.\n{'*',[debug_info]}.\n```","title":"Emakefile - make","ref":"make.html#module-emakefile"},{"type":"module","doc":"[The Compiler Application](`m:compile`)","title":"See Also - make","ref":"make.html#module-see-also"},{"type":"function","doc":"","title":"make.all/0","ref":"make.html#all/0"},{"type":"function","doc":"This function determines the set of modules to compile and the compile options\nto use, by first looking for the `emake` make option, if not present reads the\nconfiguration from a file named `Emakefile` (see below). If no such file is\nfound, the set of modules to compile defaults to all modules in the current\nworking directory.\n\nTraversing the set of modules, it then recompiles every module for which at\nleast one of the following conditions apply:\n\n- there is no object file, or\n- the source file has been modified since it was last compiled, or,\n- an include file has been modified since the source file was last compiled.\n\nAs a side effect, the function prints the name of each module it tries to\ncompile. If compilation fails for a module, the make procedure stops and `error`\nis returned.\n\n`Options` is a list of options for `make` and the Erlang compiler. The following\n`make` options exist:\n\n- `noexec`\n No execution mode. Just prints the name of each module that needs to be\n compiled.\n- `load`\n Load mode. Loads all recompiled modules.\n- `netload`\n Net load mode. Loads all recompiled modules on all known nodes.\n- `{emake, Emake}`\n Rather than reading the `Emakefile` specify configuration explicitly.\n\nAll items in `Options` that are not make options are assumed to be compiler\noptions and are passed as-is to `compile:file/2`.","title":"make.all/1","ref":"make.html#all/1"},{"type":"function","doc":"","title":"make.files/1","ref":"make.html#files/1"},{"type":"function","doc":"This function does exactly the same thing as [`all/0,1`](`all/0`), but for the\nspecified `ModFiles`, which is a list of module or file names.\n\nThe file extension `.erl` can be omitted.\n\nThe `Emakefile` (if it exists) in the current directory is searched for compiler\noptions for each module. If a given module does not exist in `Emakefile` or if\n`Emakefile` does not exist, the module is still compiled.","title":"make.files/2","ref":"make.html#files/2"},{"type":"module","doc":"Generate Emacs TAGS file from Erlang source files\n\nA `TAGS` file is used by Emacs to find function and variable definitions in any\nsource file in large projects. This module can generate a `TAGS` file from\nErlang source files. It recognises functions, records, and macro definitions.","title":"tags","ref":"tags.html"},{"type":"module","doc":"The functions in this module have an optional argument `Options`. It\nis a list which can contain the following elements:\n\n- `{outfile, NameOfTAGSFile}` Create a `TAGS` file named `NameOfTAGSFile`.\n- `{outdir, NameOfDirectory}` Create a file named `TAGS` in the directory\n `NameOfDirectory`.\n\nThe default behaviour is to create a file named `TAGS` in the current directory.","title":"Options - tags","ref":"tags.html#module-options"},{"type":"module","doc":"- `tags:root([{outfile, \"root.TAGS\"}]).`\n\n This command will create a file named `root.TAGS` in the current directory.\n The file will contain references to all Erlang source files in the Erlang\n distribution.\n\n- `tags:files([\"foo.erl\", \"bar.erl\", \"baz.erl\"], [{outdir, \"../projectdir\"}]).`\n\n This command will create a file named `TAGS` placed it in the\n directory `../projectdir`. The file contains information about the\n functions, records, and macro definitions of the three files.","title":"Examples - tags","ref":"tags.html#module-examples"},{"type":"module","doc":"- Richard M. Stallman. GNU Emacs Manual, chapter \"Editing Programs\", section\n \"Tag Tables\". Free Software Foundation, 1995.\n- Anders Lindgren. The Erlang editing mode for Emacs. Ericsson, 1998.","title":"See Also - tags","ref":"tags.html#module-see-also"},{"type":"function","doc":"","title":"tags.dir/1","ref":"tags.html#dir/1"},{"type":"function","doc":"Create a `TAGS` file for all files in directory `Dir`.","title":"tags.dir/2","ref":"tags.html#dir/2"},{"type":"function","doc":"","title":"tags.dirs/1","ref":"tags.html#dirs/1"},{"type":"function","doc":"Create a `TAGS` file for all files in any directory in `DirList`.","title":"tags.dirs/2","ref":"tags.html#dirs/2"},{"type":"function","doc":"","title":"tags.file/1","ref":"tags.html#file/1"},{"type":"function","doc":"Create a `TAGS` file for the file `File`.","title":"tags.file/2","ref":"tags.html#file/2"},{"type":"function","doc":"","title":"tags.files/1","ref":"tags.html#files/1"},{"type":"function","doc":"Create a `TAGS` file for the files in the list `FileList`.","title":"tags.files/2","ref":"tags.html#files/2"},{"type":"function","doc":"","title":"tags.root/0","ref":"tags.html#root/0"},{"type":"function","doc":"Create a `TAGS` file covering all files in the Erlang distribution.","title":"tags.root/1","ref":"tags.html#root/1"},{"type":"function","doc":"","title":"tags.subdir/1","ref":"tags.html#subdir/1"},{"type":"function","doc":"Descend recursively into the directory `Dir` and create a `TAGS` file based on\nall files found.","title":"tags.subdir/2","ref":"tags.html#subdir/2"},{"type":"function","doc":"","title":"tags.subdirs/1","ref":"tags.html#subdirs/1"},{"type":"function","doc":"Descend recursively into the directories in `DirList` and create a `TAGS`\nfile based on all files found.","title":"tags.subdirs/2","ref":"tags.html#subdirs/2"},{"type":"type","doc":"","title":"tags.option/0","ref":"tags.html#t:option/0"},{"type":"module","doc":"Process Tracing Profiling Tool\n\n`tprof` provides convenience helpers for Erlang process profiling using\nthe trace BIFs.\n\n> #### Warning {: .warning }\n>\n> This module aims to replace `eprof` and `cprof` into a unified API for\n> measuring call count, time, and allocation. It is experimental in Erlang/OTP\n> 27.0.\n\nIt is possible to analyze the number of calls, the time spent by function, and\nheap allocations by function. Profiling can be done [ad-hoc](#module-ad-hoc-profiling)\n or run in a [server-aided mode](#module-server-aided-profiling) for deeper\nintrospection of the code running in production. The server-aided mode can be\nrun using the default tprof server or an isolated `t:server/0` started through\n[`start(#{ session => atom() })`](`start/1`).\n\nThere are [three kinds of profiling](`t:trace_type/0`) supported by this module:\n\n- `call_count`\n- `call_time`\n- `call_memory`\n\nThe default is `call_count`, which has the smallest peformance impact\nand memory footprint, but it does not support per-process\nprofiling. For this reason, all of the examples below uses\n`call_memory`, which measures heap allocation, and provide a more complex\nfeature set to demonstrate.\n\nErlang terms that do not fit in a single machine word are allocated on\nthe process heap. For example, a function returning a tuple of two\nelements needs to allocate the tuple on the process heap. The actual\nconsumption is three words, because the runtime systems also need an\nextra word to store the tuple size.\n\n> #### Note {: .info }\n>\n> Expect a slowdown in the program execution when profiling is enabled.\n>\n> For profiling convenience, measurements are accumulated for functions that are\n> not enabled in some trace pattern. Consider this call stack example:\n>\n> ```text\n> top_traced_function(...)\n> not_traced_function()\n> bottom_traced_function()\n> ```\n>\n> Allocations that happened within `not_traced_function` will be added to\n> the allocations for `top_traced_function`. However, allocations that occurred\n> within `bottom_traced_function` are not included in the `top_traced_function`.\n> To only keep track of each function own allocations, it is necessary to\n> trace all functions.\n\n> #### Warning {: .warning }\n>\n> Avoid hot code reloading for modules participating in the tracing.\n> Reloading a module disables tracing and discards the accumulated statistics.\n> The `tprof` results will probably be incorrect when the profiled code was\n> reloading during a profiling session.","title":"tprof","ref":"tprof.html"},{"type":"module","doc":"Ad-hoc profiling is convenient for profiling a single function call.\n\nFor example:\n\n```erlang\n1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).\n\n****** Process <0.92.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\nok\n```\n\nBy default tracing is enabled for all functions in all modules. When funs\nare created in the interactive shell, parts of shell code are also traced:\n\n```erlang\n1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).\n\n****** Process <0.95.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nerl_eval:do_apply/7 1 3 3.00 [ 3.61]\nerl_eval:match_list/6 1 3 3.00 [ 3.61]\nlists:reverse/1 1 4 4.00 [ 4.82]\nerl_eval:expr_list/7 3 7 2.33 [ 8.43]\nerl_eval:ret_expr/3 4 16 4.00 [19.28]\nerl_eval:merge_bindings/4 3 18 6.00 [21.69]\nlists:seq_loop/3 5 32 6.40 [38.55]\n 83 [100.0]\nok\n```\n\nHowever, it is possible to limit the trace to specific functions or modules:\n\n```erlang\n2> tprof:profile(fun() -> lists:seq(1, 16) end,\n #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).\n****** Process <0.98.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\n\nok\n```\n\nAd-hoc profiling results can be printed in a few different ways. The following\nexamples use the `test` module defined like this:\n\n```erlang\n-module(test).\n-export([test_spawn/0]).\ntest_spawn() ->\n {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),\n receive\n {'DOWN', MRef, process, Pid, normal} ->\n done\n end.\n```\n\nBy default per-process statistics is shown:\n\n```erlang\n1> tprof:profile(test, test_spawn, [], #{type => call_memory}).\n\n****** Process <0.176.0> -- 23.66 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\nerlang:spawn_opt/4 1 6 6 [27.27]\ntest:test_spawn/0 1 14 14 [63.64]\n 22 [100.0]\n\n****** Process <0.177.0> -- 76.34 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:apply/2 1 7 7 [ 9.86]\nlists:seq_loop/3 9 64 7 [90.14]\n 71 [100.0]\n```\n\nThe following example prints the combined memory allocation of all\nprocesses, sorted by the total number of allocated words in descending\norder:\n\n```erlang\n2> tprof:profile(test, test_spawn, [],\n #{type => call_memory, report => {total, {measurement, descending}}}).\n\nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 9 64 7 [68.82]\ntest:test_spawn/0 1 14 14 [15.05]\nerlang:apply/2 1 7 7 [ 7.53]\nerlang:spawn_opt/4 1 6 6 [ 6.45]\nerlang:spawn_monitor/1 1 2 2 [ 2.15]\n 93 [100.0]\n```\n\nThe profiling data can also be collected for further inspection:\n\n```erlang\n3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,\n #{type => call_memory, report => return}).\n<...>\n4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).\n\n****** Process <0.223.0> -- 23.66 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\ntest:test_spawn/0 1 14 14 [63.64]\nerlang:spawn_opt/4 1 6 6 [27.27]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\n 22 [100.0]\n\n****** Process <0.224.0> -- 76.34 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 9 64 7 [90.14]\nerlang:apply/2 1 7 7 [ 9.86]\n 71 [100.0]\n```\n\nWhich processes that are profiled depends on the profiling type.\n\n* `call_count` (default) counts calls in all processes.\n\n* `call_time` and `call_memory` limits the profiling to the processes\n spawned from the user-provided function (using the `set_on_spawn`\n option for `trace:process/4`).\n\n`call_time` and `call_memory` can be restricted to profile a single process:\n\n```erlang\n2> tprof:profile(test, test_spawn, [],\n #{type => call_memory, set_on_spawn => false}).\n\n****** Process <0.183.0> -- 100.00 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\nerlang:spawn_opt/4 1 6 6 [27.27]\ntest:test_spawn/0 1 14 14 [63.64]\n```\n\n[](){: #pg_example }\n\nErlang programs can perform expensive operations in other processes\nthan the original one. You can include multiple, new, or even all\nprocesses in the trace when measuring time or memory:\n\n```erlang\n7> pg:start_link().\n{ok,<0.252.0>}\n8> tprof:profile(fun() -> pg:join(group, self()) end,\n #{type => call_memory, rootset => [pg]}).\n****** Process <0.252.0> -- 52.86 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\npg:leave_local_update_ets/5 1 2 2 [ 1.80]\ngen:reply/2 1 3 3 [ 2.70]\nerlang:monitor/2 1 3 3 [ 2.70]\ngen_server:try_handle_call/4 1 3 3 [ 2.70]\ngen_server:try_dispatch/4 1 3 3 [ 2.70]\nmaps:iterator/1 2 4 2 [ 3.60]\nmaps:take/2 1 6 6 [ 5.41]\npg:join_local_update_ets/5 1 8 8 [ 7.21]\npg:handle_info/2 1 8 8 [ 7.21]\npg:handle_call/3 1 9 9 [ 8.11]\ngen_server:loop/7 2 9 4 [ 8.11]\nets:lookup/2 2 10 5 [ 9.01]\npg:join_local/3 1 11 11 [ 9.91]\npg:notify_group/5 2 16 8 [14.41]\nerlang:setelement/3 2 16 8 [14.41]\n 111 [100.0]\n\n****** Process <0.255.0> -- 47.14 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerl_eval:match_list/6 1 3 3 [ 3.03]\nerlang:monitor/2 1 3 3 [ 3.03]\nlists:reverse/1 2 4 2 [ 4.04]\npg:join/3 1 4 4 [ 4.04]\nerl_eval:add_bindings/2 1 5 5 [ 5.05]\nerl_eval:do_apply/7 2 6 3 [ 6.06]\ngen:call/4 1 8 8 [ 8.08]\nerl_eval:expr_list/7 4 10 2 [10.10]\ngen:do_call/4 1 16 16 [16.16]\nerl_eval:ret_expr/3 4 16 4 [16.16]\nerl_eval:merge_bindings/4 3 24 8 [24.24]\n 99 [100.0]\n```\n\nBy default, there is no limit for the profiling time. For ac-hoc\nprofiling, is is possible to configure a time limit. If the profiled\nfunction does not return before that time expires, the process is\nterminated with reason `kill`. Any unlinked children processes started\nby the user-supplied function are kept; it is the responsibility of\nthe developer to take care of such processes.\n\n```erlang\n9> tprof:profile(timer, sleep, [100000], #{timeout => 1000}).\n```\n\nBy default, only one ad-hoc or server-aided profiling session is\nallowed at any point in time. It is possible to force multiple ad-hoc\nsessions concurrently, but it is the responsibility of the developer\nto ensure that trace patterns do not overlap:\n\n```erlang\n1> tprof:profile(fun() -> lists:seq(1, 32) end,\n #{registered => false, pattern => [{lists, '_', '_'}]}).\n```","title":"Ad-hoc profiling - tprof","ref":"tprof.html#module-ad-hoc-profiling"},{"type":"module","doc":"Server-aided profiling can be done on a system that is up and\nrunning. To do that, start the `tprof` server, and then add trace\npatterns and processes to trace while the system handles actual\ntraffic. Data can extracted, inspected, and printed at any time. The\nfollowing example traces activity of all processes supervised by\nthe Kernel supervisor:\n\n```erlang\n1> tprof:start(#{type => call_memory}).\n{ok,<0.200.0>}\n2> tprof:enable_trace({all_children, kernel_sup}).\n34\n3> tprof:set_pattern('_', '_' , '_').\n16728\n4> Sample = tprof:collect().\n{call_memory,\n [{gen_server,try_dispatch,4,[{<0.154.0>,2,6}]},\n {erlang,iolist_to_iovec,1,[{<0.161.0>,1,8}]},\n<...>\n5 > tprof:format(tprof:inspect(Sample)).\n\n****** Process <0.154.0> -- 14.21 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nmaps:iterator/1 2 4 2 [15.38]\ngen_server:try_dispatch/4 2 6 3 [23.08]\nnet_kernel:handle_info/2 2 16 8 [61.54]\n 26 [100.0]\n\n****** Process <0.161.0> -- 85.79 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\ndisk_log:handle/2 2 2 1 [ 1.27]\ndisk_log_1:maybe_start_timer/1 1 3 3 [ 1.91]\ndisk_log_1:mf_write_cache/1 1 3 3 [ 1.91]\n<...>\n```\n\n[](){: #inspect_example }\n\nIt is possible to profile the entire running system, and then examine individual\nprocesses:\n\n```erlang\n1> tprof:start(#{type => call_memory}).\n2> tprof:enable_trace(all), tprof:set_pattern('_', '_' , '_').\n9041\n3> timer:sleep(10000), tprof:disable_trace(all), Sample = tprof:collect().\n{call_memory,\n [{user_drv,server,3,[{<0.64.0>,12,136}]},\n {user_drv,contains_ctrl_g_or_ctrl_c,1,[{<0.64.0>,80,10}]},\n<...>\n4> Inspected = tprof:inspect(Sample, process, measurement), Shell = maps:get(self(), Inspected).\n{call_memory, 2743,\n [{shell,{enc,0},1,2,2,0.07291286912139992},\n<...>\n5> tprof:format(Shell).\n\nFUNCTION CALLS WORDS PER CALL [ %]\n<...>\nerl_lint:start/2 2 300 150 [10.94]\nshell:used_records/1 114 342 3 [12.47]\n```","title":"Server-aided profiling - tprof","ref":"tprof.html#module-server-aided-profiling"},{"type":"function","doc":"Disables tracing functions matching the supplied pattern.\n\n```erlang\n1> tprof:set_pattern(lists, seq, '_').\n2\n2> tprof:clear_pattern(lists, seq, 3).\n1\n3> tprof:get_trace_map().\n#{lists => [{seq,2}]}\n```\n\nRequires that the default `tprof` server has been [`started`](`start/1`).","title":"tprof.clear_pattern/3","ref":"tprof.html#clear_pattern/3"},{"type":"function","doc":"Equivalent to [`clear_pattern(Mod, Fun, Arity)`](`clear_pattern/3`) but uses the provided `Server`.","title":"tprof.clear_pattern/4","ref":"tprof.html#clear_pattern/4"},{"type":"function","doc":"Returns statistics for current trace map.","title":"tprof.collect/0","ref":"tprof.html#collect/0"},{"type":"function","doc":"Equivalent to `collect/0` but uses the provided `Server`.","title":"tprof.collect/1","ref":"tprof.html#collect/1"},{"type":"function","doc":"Resumes previously paused profiling.","title":"tprof.continue/0","ref":"tprof.html#continue/0"},{"type":"function","doc":"Equivalent to `continue/0` but uses the provided `Server`.","title":"tprof.continue/1","ref":"tprof.html#continue/1"},{"type":"function","doc":"","title":"tprof.disable_trace/1","ref":"tprof.html#disable_trace/1"},{"type":"function","doc":"Stops accumulating traces for specified processes.\n\nSee `enable_trace/2` for a description of the options.\n\nThe profile data accumulated before the process is removed from the\ntraced list is retained. This makes it possible to enable tracing for\nmany or all processes in the system, sleep for a short period of\ntime, then disable tracing for all processes (to avoid system\noverload), but keeping profile data.","title":"tprof.disable_trace/2","ref":"tprof.html#disable_trace/2"},{"type":"function","doc":"","title":"tprof.disable_trace/3","ref":"tprof.html#disable_trace/3"},{"type":"function","doc":"","title":"tprof.enable_trace/1","ref":"tprof.html#enable_trace/1"},{"type":"function","doc":"Similar to `trace:process/4`, but supports a few more options for tracing\nconvenience.\n\nTracing per process is not supported by `call_count` profilers.\n\n`Spec` is either a process identifier (pid) for a local process, one of the\nfollowing atoms, or a list of local process identifiers or their registered\nnames:\n\n- **`all`** - All currently existing processes and all that will be\n created in the future.\n\n- **`existing`** - All currently existing processes.\n\n- **`new`** - All processes that will be created in the future.\n\n- **`children`** - All currently running processes that were directly spawned by\n the specified process. This mode is helpful for tracing workers of a single\n supervisor.\n\n- **`all_children`** - All currently running processes that were spawned by the\n specified process, or any recursive descendant of it. This mode is designed to\n facilitate tracing of supervision trees.\n\nReturns the number of processes for which tracing was enabled.\n\nWhen a list of pids, `children` or `all_children` is used, the processes that\ntracing failed to be enabled on will also be returned. Tracing can fail to be\nenabled if the process has terminated before tracing could be enabled.\n\n> #### Note {: .info }\n>\n> The profiling server does not keep track of processes that were added to the\n> tracing set. It is permitted to stop the profiling server (wiping out any\n> accumulated data), restart the server, set entirely different tracing pattern\n> keeping the list of traced processes for future use. Use\n> [`disable_trace(Processes)`](`disable_trace/2`) to clear the list of traced\n> processes.\n\nSpecify `Options` to modify tracing behavior:\n\n- **`set_on_spawn`** - Automatically start tracing for processes spawned by the\n traced process. On by default.","title":"tprof.enable_trace/2","ref":"tprof.html#enable_trace/2"},{"type":"function","doc":"Equivalent to `enable_trace/2` but uses the provided `Server`.","title":"tprof.enable_trace/3","ref":"tprof.html#enable_trace/3"},{"type":"function","doc":"Formats profile data transformed with [`inspect/3`](`inspect/3`), outputting to\nthe default output device.","title":"tprof.format/1","ref":"tprof.html#format/1"},{"type":"function","doc":"Formats profile transformed with [`inspect/3`](`inspect/3`),\noutputting to device `IoDevice`.","title":"tprof.format/2","ref":"tprof.html#format/2"},{"type":"function","doc":"Returns a map of module names to functions with their arities.","title":"tprof.get_trace_map/0","ref":"tprof.html#get_trace_map/0"},{"type":"function","doc":"Equivalent to `get_trace_map/0` but uses the provided `Server`.","title":"tprof.get_trace_map/1","ref":"tprof.html#get_trace_map/1"},{"type":"function","doc":"Equivalent to [`inspect(Profile, process, percent)`](`inspect/3`).\n\nTransforms raw profile into a map of process identifiers to a tuple containing total count\nof words allocated, and a list of all traced functions sorted in the ascending\norder by the allocation percentage.","title":"tprof.inspect/1","ref":"tprof.html#inspect/1"},{"type":"function","doc":"Transforms raw data returned by tracing BIFs into a form convenient for\nsubsequent analysis and formatting.\n\n* When the `Type` argument is `process`, this function returns a map of process\n identifiers with corresponding profiling results sorted by the selected column.\n\n* When `Type` argument is `total` or when profiling by `call_count`, this function\n returns a map with a single `all` key with profiling results from all processes.\n\nThe inspected profile data can be leveraged to\n[print profiling results](`m:tprof#inspect_example`).","title":"tprof.inspect/3","ref":"tprof.html#inspect/3"},{"type":"function","doc":"Pauses trace collection for all currently traced functions, retaining existing traces.\n\nUse `continue/0` to resume trace collection.","title":"tprof.pause/0","ref":"tprof.html#pause/0"},{"type":"function","doc":"Equivalent to `pause/0` but uses the provided `Server`.","title":"tprof.pause/1","ref":"tprof.html#pause/1"},{"type":"function","doc":"","title":"tprof.profile/1","ref":"tprof.html#profile/1"},{"type":"function","doc":"Does ad-hoc profiling of the call `Fun()`.\n\nBy default, the result is formatted to the output device; use the `report`\noption to change this behavior.\n\nAd-hoc profiling starts a new instance of `tprof` server, runs the\nprofiling routine, extracts results, and shuts down the server.\n\nSee `profile/4` for a list of the supported options.","title":"tprof.profile/2","ref":"tprof.html#profile/2"},{"type":"function","doc":"","title":"tprof.profile/3","ref":"tprof.html#profile/3"},{"type":"function","doc":"Does ad-hoc profiling for the call `apply(Module, Function, Args)`.\n\nBy default, the result is formatted to the output device; use option `report`\nto change this behavior.\n\nAd-hoc profiling starts a new instance of `tprof` server, runs the\nprofiling routine, extracts results, and shuts down the server.\n\nThe ad-hoc profiler supports the following `Options`:\n\n- **`type`** - The type of profiling to perform.\n\n- **`device`** - Specifies I/O devices to print the profile to. Useful to\n redirect text output to console or `standard_error`.\n\n- **`pattern`** - Specifies a trace pattern, or a list of trace patterns to\n enable. By default, all functions (`{'_', '_', '_'}`) are traced.\n\n- **`report`** - Controls output format. The default is `process`; printing\n per-process profiling data sorted by percentage of the total allocation.\n Specify `report => return` to suppress printing and get the raw data for\n further evaluation with `inspect/3` and formatting with `format/2`.\n\n- **`rootset`** - Includes extra processes in the trace list. Useful for\n profiling allocations for `m:gen_server`, calls, or other allocations caused\n by inter-process communications. See [this example](`m:tprof#pg_example`).\n\n- **`set_on_spawn`** - Automatically start tracing for processes spawned by the\n traced process. Enabled by default.\n\n- **`timeout`** - Terminate profiling after the specified amount of time\n (milliseconds).","title":"tprof.profile/4","ref":"tprof.html#profile/4"},{"type":"function","doc":"Clears accumulated profiles and starts profiling if it was paused.","title":"tprof.restart/0","ref":"tprof.html#restart/0"},{"type":"function","doc":"Equivalent to `restart/0` but uses the provided `Server`.","title":"tprof.restart/1","ref":"tprof.html#restart/1"},{"type":"function","doc":"Enables tracing for all functions matching the supplied pattern.\n\nPatterns are additive, following the same rules as `trace:function/4`.\nReturns the number of functions matching the supplied pattern.\n\n```erlang\n1> tprof:set_pattern(lists, seq, '_').\n2\n2> tprof:set_pattern(lists, keyfind, 3).\n1\n3> tprof:get_trace_map().\n#{lists => [{keyfind,3},{seq,2},{seq,3}]}\n```\n\nIf no functions match the pattern, an `error` tuple is returned:\n\n```erlang\n> tprof:set_pattern(no_module, func, '_').\n{error,{trace_pattern,no_module,func,'_'}}\n```\n\nRequires that the default `tprof` server has been [`started`](`start/1`).","title":"tprof.set_pattern/3","ref":"tprof.html#set_pattern/3"},{"type":"function","doc":"Equivalent to `set_pattern/3` but uses the provided `Server`.","title":"tprof.set_pattern/4","ref":"tprof.html#set_pattern/4"},{"type":"function","doc":"","title":"tprof.start/0","ref":"tprof.html#start/0"},{"type":"function","doc":"Starts the server, not supervised.\n\nProfiling server stores current trace patterns and owns the [trace session](`t:trace:session/0`)\nused for profiling.\n\nIf no `session` is provided in `Config`, then a default session called `tprof` is\nused and the profiling server is [registered](`register/2`) as `tprof`.\n\nIf `session` is provided in `Config`, then a session with that name is created\nand all profiling is done within that session. The profiling server is not [registered](`register/2`)\nin this case. When using `m:tprof` like this the `t:pid/0` returned from this\nfunction needs to be provided to the functions in this module.","title":"tprof.start/1","ref":"tprof.html#start/1"},{"type":"function","doc":"","title":"tprof.start_link/0","ref":"tprof.html#start_link/0"},{"type":"function","doc":"Equivalent to `start/1` but also links the profiling server to the caller.","title":"tprof.start_link/1","ref":"tprof.html#start_link/1"},{"type":"function","doc":"Stops the default `tprof` server and disable tracing enabled by the server.","title":"tprof.stop/0","ref":"tprof.html#stop/0"},{"type":"function","doc":"Equivalent to `stop/0` but uses the provided `Server`.","title":"tprof.stop/1","ref":"tprof.html#stop/1"},{"type":"type","doc":"Column to sort by `inspect/3` or [`profile/4`](`profile/4`).\n\n- **`module`** - Module name.\n\n- **`function`** - Function name.\n\n- **`calls`** - Number of calls to the function.\n\n- **`measurement`** - Total measurement (call count, time, or heap allocation)\n throughout all calls to the function.\n\n- **`measurement_per_call`** - Measurement (call count, time, or heap\n allocation) on average per function call.\n\n- **`percent`** - Percentage of measurement to total amount during the entire\n profile collection.","title":"tprof.column/0","ref":"tprof.html#t:column/0"},{"type":"type","doc":"A process identifier (pid) or a registered process name.","title":"tprof.process/0","ref":"tprof.html#t:process/0"},{"type":"type","doc":"Inspected data for a single function of the specified `Module`.","title":"tprof.profile_line/0","ref":"tprof.html#t:profile_line/0"},{"type":"type","doc":"Ad-hoc profiler options; see [`profile/4`](`profile/4`).","title":"tprof.profile_options/0","ref":"tprof.html#t:profile_options/0"},{"type":"type","doc":"Profile of a single process, or combined profile of multiple processes, sorted\nby a selected column.","title":"tprof.profile_result/0","ref":"tprof.html#t:profile_result/0"},{"type":"type","doc":"","title":"tprof.rootset/0","ref":"tprof.html#t:rootset/0"},{"type":"type","doc":"A tprof server.\n\nEach server uses a separate `t:trace:session/0` in order to\nkeep profiling isolated.","title":"tprof.server/0","ref":"tprof.html#t:server/0"},{"type":"type","doc":"","title":"tprof.sort_by/0","ref":"tprof.html#t:sort_by/0"},{"type":"type","doc":"","title":"tprof.start_options/0","ref":"tprof.html#t:start_options/0"},{"type":"type","doc":"Raw data extracted from tracing BIFs.","title":"tprof.trace_info/0","ref":"tprof.html#t:trace_info/0"},{"type":"type","doc":"Traced functions (with their arities) grouped by module name,\nor `all` if all code is traced.","title":"tprof.trace_map/0","ref":"tprof.html#t:trace_map/0"},{"type":"type","doc":"Options for enabling profiling of the selected processes; see `enable_trace/2`.","title":"tprof.trace_options/0","ref":"tprof.html#t:trace_options/0"},{"type":"type","doc":"","title":"tprof.trace_pattern/0","ref":"tprof.html#t:trace_pattern/0"},{"type":"type","doc":"The type of profiling that the tprof server will do.\n\n- **call_count** - Counts the number of calls made to functions. This\n is a global profiling event that cannot be limited to specific processes.\n See [call_count](`trace#call_count`) in `trace:function/4` for more details.\n- **call_time** - Counts the accumulated time spent in functions.\n See [call_time](`trace#call_time`) in `trace:function/4` for more details.\n- **call_memory** - Counts the accumulated memory allocated in functions.\n See [call_memory](`trace#call_memory`) in `trace:function/4` for more details.","title":"tprof.trace_type/0","ref":"tprof.html#t:trace_type/0"},{"type":"module","doc":"A Cross Reference Tool for analyzing dependencies between functions, modules,\napplications, and releases.\n\nCalls between functions are either _local calls_{: #local_call } such as `f()`,\nor _external calls_{: #external_call } such as `mod:f()`.\n\n_Module data_{:#module_data }, which are extracted from BEAM files,\ninclude local functions, exported functions, local calls, and external\ncalls. By default, calls to built-in functions (BIF) are ignored, but\nif the option `builtins`, accepted by some of this module's functions,\nis set to `true`, calls to BIFs are included as well. It is the\nanalyzing OTP version that decides what functions are BIFs.\nFunctional objects are assumed to be called where they are created\n(and nowhere else).\n\n_Unresolved calls_{: #unresolved_call } are calls to `apply` or\n`spawn` with variable module, variable function, or variable\narguments. Examples are `M:F(a)`, [`apply(M, f, [a])`](`apply/3`), and\n[`spawn(m, f(), Args)`](`spawn/3`). Unresolved calls are represented\nby calls where variable modules have been replaced with the atom\n`'$M_EXPR'`, variable functions have been replaced with the atom\n`'$F_EXPR'`, and variable number of arguments have been replaced with\nthe number `-1`. The above mentioned examples are represented by calls\nto `'$M_EXPR':'$F_EXPR'/1`, `'$M_EXPR':f/1`, and `m:'$F_EXPR'/-1`. The\nunresolved calls are a subset of the external calls.\n\n> #### Warning {: .warning }\n>\n> Unresolved calls make module data incomplete, which implies that the results\n> of analyses may be invalid.\n\n_Applications_ are collections of modules. The BEAM files for the\nmodules are located in the `ebin` subdirectory of the application\ndirectory. The name of the application directory determines the name\nand version of the application.\n\n_Releases_ are collections of applications located in the `lib` subdirectory of\nthe release directory. There is more to read about applications and releases in\nthe Design Principles book.\n\n_Xref servers_{: #xref_server } are identified by names, supplied when\ncreating new servers. Each Xref server holds a set of releases, a set\nof applications, and a set of modules with module data. Xref servers\nare independent of each other, and all analyses are evaluated in the\ncontext of one single Xref server (exceptions are the functions\n[`m/1`](`m/1`) and [`d/1`](`d/1`) which do not use servers at\nall).\n\nThe _mode_{: #mode } of an Xref server determines what module data are\nextracted from BEAM files as modules are added to the server. BEAM\nfiles compiled with the option `debug_info` contain [](){: #debug_info\n} \"debug information\", which is an abstract representation of the\ncode.\n\n- In `functions` mode, which is the default mode, function calls\n and line numbers are extracted from debug information.\n\n- In `modules` mode, debug information is ignored if present, but\n dependencies between modules are extracted from other parts of the\n BEAM files. The `modules` mode is significantly less time and space\n consuming than the `functions` mode, but the analyses that can be\n done are limited.\n\nAn _analyzed module_{: #analyzed_module } is a module that has been added to an\nXref server together with its module data. A _library module_{: #library_module\n} is a module located in some directory mentioned in the _library path_{:\n#library_path }. A library module is said to be used if some of its exported\nfunctions are used by some analyzed module. An _unknown module_{:\n#unknown_module } is a module that is neither an analyzed module nor a library\nmodule, but whose exported functions are used by some analyzed module.\n\nAn _unknown function_{: #unknown_function } is a used function that is\nneither local or exported by any analyzed module nor exported by any\nlibrary module. An _undefined function_{: #undefined_function } is an\nexternally used function that is not exported by any analyzed module\nor library module. With this notion, a local function can be an\nundefined function, namely if it is externally used from some\nmodule. All unknown functions are also undefined functions; there is a\n[figure](xref_chapter.md#venn2) in the User's Guide that illustrates\nthis relationship.\n\nThe module attribute tag `deprecated` can be used to inform\nXref about _deprecated functions_{: #deprecated_function } and optionally when\nfunctions are planned to be removed. A few examples show the idea:\n\n- `-deprecated({f,1}).` - The exported function `f/1` is deprecated.\n Nothing is said whether `f/1` will be removed or not.\n\n- `-deprecated({f,1,\"Use g/1 instead\"}).` - As above but with a descriptive\n string. The string is currently unused by `xref` but other tools can make use\n of it.\n\n- `-deprecated({f,'_'}).` - All exported functions `f/0`, `f/1`, and so on\n are deprecated.\n\n- `-deprecated(module).` - All exported functions in the module are\n deprecated. Equivalent to `-deprecated({'_','_'}).`.\n\n- `-deprecated([{g,1,next_version}]).` - The function `g/1` is deprecated\n and will be removed in next version.\n\n- `-deprecated([{g,2,next_major_release}]).` - The function `g/2` is\n deprecated and will be removed in next major release.\n\n- `-deprecated([{g,3,eventually}]).` - The function `g/3` is deprecated\n and will eventually be removed.\n\n- `-deprecated({'_','_',eventually}).` - All exported functions in the\n module are deprecated and will eventually be removed.\n\nBefore any analysis can take place, module data must be _set up_. For instance,\nthe cross reference and the unknown functions are computed when all module data\nare known. The functions that need complete data\n([`analyze/2,3`](`analyze/3`), [`q/2,3`](`q/3`), [`variables/1,2`](`variables/2`)\ntake care of setting up data automatically. Module data need to be set up\n(again) after calls to any of the `add`, `replace`, `remove`,\n[`set_library_path/2,3`](`set_library_path/3`), or\n[`update/1,2`](`update/2`) functions.\n\nThe result of setting up module data is the _Call Graph_{: #call_graph }. A\n(directed) graph consists of a set of vertices and a set of (directed) edges.\nThe edges represent _calls_{: #call } (From, To) between functions, modules,\napplications, or releases. From is said to call To, and To is said to be used by\nFrom. The vertices of the Call Graph are the functions of all module data: local\nand exported functions of analyzed modules; used BIFs; used exported functions\nof library modules; and unknown functions. The functions `module_info/0,1` added\nby the compiler are included among the exported functions, but only when called\nfrom some module. The edges are the function calls of all module data. A\nconsequence of the edges being a set is that there is only one edge if a\nfunction is locally or externally used several times on one and the same line of\ncode.\n\nThe Call Graph is [](){: #representation } represented by Erlang terms (the sets\nare lists), which is suitable for many analyses. But for analyses that look at\nchains of calls, a list representation is much too slow. Instead the\nrepresentation offered by the `digraph` module is used. The translation of the\nlist representation of the Call Graph - or a subgraph thereof - to the `digraph`\nrepresentation does not come for free, so the language used for expressing\nqueries to be described below has a special operator for this task and a\npossibility to save the `digraph` representation for subsequent analyses.\n\nIn addition to the Call Graph there is a graph called the _Inter Call Graph_{:\n#inter_call_graph }. This is a graph of calls (From, To) such that there is a\nchain of calls from From to To in the Call Graph, and every From and To is an\nexported function or an unused local function. The vertices are the same as for\nthe Call Graph.\n\nCalls between modules, applications and releases are also directed graphs. The\n_types_{: #type } of the vertices and edges of these graphs are (ranging from\nthe most special to the most general): `Fun` for functions; `Mod` for modules;\n`App` for applications; and `Rel` for releases. The following paragraphs will\ndescribe the different constructs of the language used for selecting and\nanalyzing parts of the graphs, beginning with the _constants_{: #constants }:\n\n- Expression ::= Constants\n- Constants ::= Consts | Consts `:` Type | RegExpr\n- Consts ::= Constant | `[`Constant`,` ...`]` | `{`Constant`,` ...`}`\n- Constant ::= Call | Const\n- Call ::= FunSpec `->` FunSpec | `{`MFA`,` MFA`}` | AtomConst `->` AtomConst |\n `{`AtomConst`,` AtomConst`}`\n- Const ::= AtomConst | FunSpec | MFA\n- AtomConst ::= Application | Module | Release\n- FunSpec ::= Module `:` Function `/` Arity\n- MFA ::= `{`Module`,` Function`,` Arity`}`\n- RegExpr ::= RegString `:` Type | RegFunc | RegFunc `:` Type\n- RegFunc ::= RegModule `:` RegFunction `/` RegArity\n- RegModule ::= RegAtom\n- RegFunction ::= RegAtom\n- RegArity ::= RegString | Number | `_` | `-1`\n- RegAtom ::= RegString | Atom | `_`\n- RegString ::= - a regular expression, as described in the `re` module,\n enclosed in double quotes -\n- Type ::= `Fun` | `Mod` | `App` | `Rel`\n- Function ::= Atom\n- Application ::= Atom\n- Module ::= Atom\n- Release ::= Atom\n- Arity ::= Number | `-1`\n- Atom ::= - same as Erlang atoms -\n- Number ::= - same as non-negative Erlang integers -\n\nExamples of constants are: `kernel`, `kernel->stdlib`, `[kernel, sasl]`,\n`[pg -> mnesia, {tv, mnesia}] : Mod`. It is an error if an instance of `Const`\ndoes not match any vertex of any graph. If there are more than one vertex\nmatching an untyped instance of `AtomConst`, then the one of the most general\ntype is chosen. A list of constants is interpreted as a set of constants, all of\nthe same type. A tuple of constants constitute a chain of calls (which may, but\ndoes not have to, correspond to an actual chain of calls of some graph).\nAssigning a type to a list or tuple of `Constant` is equivalent to assigning the\ntype to each `Constant`.\n\n_Regular expressions_{: #regexp } are used as a means to select some of the\nvertices of a graph. A `RegExpr` consisting of a `RegString` and a type - an\nexample is `\"xref_.*\" : Mod` \\- is interpreted as those modules (or applications\nor releases, depending on the type) that match the expression. Similarly, a\n`RegFunc` is interpreted as those vertices of the Call Graph that match the\nexpression. An example is `\"xref_.*\":\"add_.*\"/\"(2|3)\"`, which matches all `add`\nfunctions of arity two or three of any of the xref modules. Another example, one\nthat matches all functions of arity 10 or more: `_:_/\"[1-9].+\"`. Here `_` is an\nabbreviation for `\".*\"`, that is, the regular expression that matches anything.\n\nThe syntax of _variables_{: #variable } is simple:\n\n- Expression ::= Variable\n- Variable ::= - same as Erlang variables -\n\nThere are two kinds of variables:\n\n* **Predefined variables** {: #predefined_variable } - hold module data, and\n cannot be assigned to but only used in queries.\n\n* **User variables** {: #user_variable } - can be assigned to, and are\n typically used for temporary results while evaluating a query, and\n for keeping results of queries for use in subsequent queries.\n\nThe predefined variables are (variables marked with (\\*) are available\nin `functions` mode only):\n\n- **`E`** - Call Graph Edges (\\*).\n\n- **`V`** - Call Graph Vertices (\\*).\n\n- **`M`** - Modules. All modules: analyzed modules, used library modules, and\n unknown modules.\n\n- **`A`** - Applications.\n\n- **`R`** - Releases.\n\n- **`ME`** - Module Edges. All module calls.\n\n- **`AE`** - Application Edges. All application calls.\n\n- **`RE`** - Release Edges. All release calls.\n\n- **`L`** - Local Functions (\\*). All local functions of analyzed modules.\n\n- **`X`** - Exported Functions. All exported functions of analyzed modules and\n all used exported functions of library modules.\n\n- **`F`** - Functions (\\*).\n\n- **`B`** - Used BIFs. `B` is empty if `builtins` is `false` for all analyzed\n modules.\n\n- **`U`** - Unknown Functions.\n\n- **`UU`** - Unused Functions (\\*). All local and exported functions of analyzed\n modules that have not been used.\n\n- **`XU`** - Externally Used Functions. Functions of all modules - including\n local functions - that have been used in some external call.\n\n- **`LU`** - Locally Used Functions (\\*). Functions of all modules that have\n been used in some local call.\n\n- **`OL`** - Functions with an attribute tag `on_load` (\\*).\n\n- **`LC`** - Local Calls (\\*).\n\n- **`XC`** - External Calls (\\*).\n\n- **`AM`** - Analyzed Modules.\n\n- **`UM`** - Unknown Modules.\n\n- **`LM`** - Used Library Modules.\n\n- **`UC`** - Unresolved Calls. Empty in `modules` mode.\n\n- **`EE`** - Inter Call Graph Edges (\\*).\n\n- **`DF`** - Deprecated Functions. All deprecated exported functions and all\n used deprecated BIFs.\n\n- **`DF_1`** - Deprecated Functions. All deprecated functions to be removed in\n next version.\n\n- **`DF_2`** - Deprecated Functions. All deprecated functions to be removed in\n next version or next major release.\n\n- **`DF_3`** - Deprecated Functions. All deprecated functions to be removed in\n next version, next major release, or later.\n\nThese are a few [](){: #simple_facts } facts about the predefined variables (the\nset operators `+` (union) and `-` (difference) as well as the cast operator\n`(`Type`)` are described below):\n\n- `F` is equal to `L + X`.\n- `V` is equal to `X + L + B + U`, where `X`, `L`, `B` and `U` are pairwise\n disjoint (that is, have no elements in common).\n- `UU` is equal to `V - (XU + LU)`, where `LU` and `XU` may have elements in\n common. Put in another way:\n- `V` is equal to `UU + XU + LU`.\n- `OL` is a subset of `F`.\n- `E` is equal to `LC + XC`. Note that `LC` and `XC` may have elements in\n common, namely if some function is locally and externally used from one and\n the same function.\n- `U` is a subset of `XU`.\n- `B` is a subset of `XU`.\n- `LU` is equal to `range LC`.\n- `XU` is equal to `range XC`.\n- `LU` is a subset of `F`.\n- `UU` is a subset of `F`.\n- `range UC` is a subset of `U`.\n- `M` is equal to `AM + LM + UM`, where `AM`, `LM` and `UM` are pairwise\n disjoint.\n- `ME` is equal to `(Mod) E`.\n- `AE` is equal to `(App) E`.\n- `RE` is equal to `(Rel) E`.\n- `(Mod) V` is a subset of `M`. Equality holds if all analyzed modules have some\n local, exported, or unknown function.\n- `(App) M` is a subset of `A`. Equality holds if all applications have some\n module.\n- `(Rel) A` is a subset of `R`. Equality holds if all releases have some\n application.\n- `DF_1` is a subset of `DF_2`.\n- `DF_2` is a subset of `DF_3`.\n- `DF_3` is a subset of `DF`.\n- `DF` is a subset of `X + B`.\n\nAn important notion is that of _conversion_{: #conversion } of expressions. The\nsyntax of a cast expression is:\n\n- Expression ::= `(` Type `)` Expression\n\nThe interpretation of the cast operator depends on the named type `Type`, the\ntype of `Expression`, and the structure of the elements of the interpretation of\n`Expression`. If the named type is equal to the expression type, no conversion\nis done. Otherwise, the conversion is done one step at a time; `(Fun) (App) RE`,\nfor instance, is equivalent to `(Fun) (Mod) (App) RE`. Now assume that the\ninterpretation of `Expression` is a set of constants (functions, modules,\napplications or releases). If the named type is more general than the expression\ntype, say `Mod` and `Fun` respectively, then the interpretation of the cast\nexpression is the set of modules that have at least one of their functions\nmentioned in the interpretation of the expression. If the named type is more\nspecial than the expression type, say `Fun` and `Mod`, then the interpretation\nis the set of all the functions of the modules (in `modules` mode, the\nconversion is partial since the local functions are not known). The conversions\nto and from applications and releases work analogously. For instance,\n`(App) \"xref_.*\" : Mod` returns all applications containing at least one module\nsuch that `xref_` is a prefix of the module name.\n\nNow assume that the interpretation of `Expression` is a set of calls. If the\nnamed type is more general than the expression type, say `Mod` and `Fun`\nrespectively, then the interpretation of the cast expression is the set of calls\n(M1, M2) such that the interpretation of the expression contains a call from\nsome function of M1 to some function of M2. If the named type is more special\nthan the expression type, say `Fun` and `Mod`, then the interpretation is the\nset of all function calls (F1, F2) such that the interpretation of the\nexpression contains a call (M1, M2) and F1 is a function of M1 and F2 is a\nfunction of M2 (in `modules` mode, there are no functions calls, so a cast to\n`Fun` always yields an empty set). Again, the conversions to and from\napplications and releases work analogously.\n\nThe interpretation of constants and variables are sets, and those sets can be\nused as the basis for forming new sets by the application of _set operators_{:\n#set_operator }. The syntax:\n\n- Expression ::= Expression BinarySetOp Expression\n- BinarySetOp ::= `+` | `*` | `-`\n\n`+`, `*` and `-` are interpreted as union, intersection and difference\nrespectively: the union of two sets contains the elements of both sets; the\nintersection of two sets contains the elements common to both sets; and the\ndifference of two sets contains the elements of the first set that are not\nmembers of the second set. The elements of the two sets must be of the same\nstructure; for instance, a function call cannot be combined with a function. But\nif a cast operator can make the elements compatible, then the more general\nelements are converted to the less general element type. For instance, `M + F`\nis equivalent to `(Fun) M + F`, and `E - AE` is equivalent to `E - (Fun) AE`.\nOne more example: `X * xref : Mod` is interpreted as the set of functions\nexported by the module `xref`; `xref : Mod` is converted to the more special\ntype of `X` (`Fun`, that is) yielding all functions of `xref`, and the\nintersection with `X` (all functions exported by analyzed modules and library\nmodules) is interpreted as those functions that are exported by some module\n_and_ functions of `xref`.\n\nThere are also unary set operators:\n\n- Expression ::= UnarySetOp Expression\n- UnarySetOp ::= `domain` | `range` | `strict`\n\nRecall that a call is a pair (From, To). `domain` applied to a set of calls is\ninterpreted as the set of all vertices From, and `range` as the set of all\nvertices To. The interpretation of the `strict` operator is the operand with all\ncalls on the form (A, A) removed.\n\nThe interpretation of the _restriction operators_{: #restriction } is a subset\nof the first operand, a set of calls. The second operand, a set of vertices, is\nconverted to the type of the first operand. The syntax of the restriction\noperators:\n\n- Expression ::= Expression RestrOp Expression\n- RestrOp ::= `|`\n- RestrOp ::= `||`\n- RestrOp ::= `|||`\n\nThe interpretation in some detail for the three operators:\n\n- **`|`** - The subset of calls from any of the vertices.\n\n- **`||`** - The subset of calls to any of the vertices.\n\n- **`|||`** - The subset of calls to and from any of the vertices. For all sets\n of calls `CS` and all sets of vertices `VS`, `CS ||| VS ` is equivalent to\n `CS | VS * CS || VS`.\n\n[](){: #graph_analyses } Two functions (modules, applications, releases) belong\nto the same strongly connected component if they call each other (in)directly.\nThe interpretation of the `components` operator is the set of strongly connected\ncomponents of a set of calls. The `condensation` of a set of calls is a new set\nof calls between the strongly connected components such that there is an edge\nbetween two components if there is some constant of the first component that\ncalls some constant of the second component.\n\nThe interpretation of the `of` operator is a chain of calls of the second\noperand (a set of calls) that passes throw all of the vertices of the first\noperand (a tuple of constants), in the given order. The second operand is\nconverted to the type of the first operand. For instance, the `of` operator can\nbe used for finding out whether a function calls another function indirectly,\nand the chain of calls demonstrates how. The syntax of the graph analyzing\noperators:\n\n- Expression ::= Expression BinaryGraphOp Expression\n- Expression ::= UnaryGraphOp Expression\n- UnaryGraphOp ::= `components` | `condensation`\n- BinaryGraphOp ::= `of`\n\nAs was mentioned before, the graph analyses operate on the `digraph`\nrepresentation of graphs. By default, the `digraph` representation is created\nwhen needed (and deleted when no longer used), but it can also be created\nexplicitly by use of the `closure` operator:\n\n- Expression ::= ClosureOp Expression\n- ClosureOp ::= `closure`\n\nThe interpretation of the `closure` operator is the transitive closure of the\noperand.\n\nThe restriction operators are defined for closures as well;\n`closure E | xref : Mod` is interpreted as the direct or indirect function calls\nfrom the `xref` module, while the interpretation of `E | xref : Mod` is the set\nof direct calls from `xref`. If some graph is to be used in several graph\nanalyses, it saves time to assign the `digraph` representation of the graph to a\nuser variable, and then make sure that every graph analysis operates on that\nvariable instead of the list representation of the graph.\n\nThe lines where functions are defined (more precisely: where the first clause\nbegins) and the lines where functions are used are available in `functions`\nmode. The line numbers refer to the files where the functions are defined. This\nholds also for files included with the `-include` and `-include_lib` directives,\nwhich may result in functions defined apparently in the same line. The _line\noperators_ are used for assigning line numbers to functions and for assigning\nsets of line numbers to function calls. The syntax is similar to the one of the\ncast operator:\n\n- Expression ::= `(` LineOp`)` Expression\n- Expression ::= `(` XLineOp`)` Expression\n- LineOp ::= `Lin` | `ELin` | `LLin` | `XLin`\n- XLineOp ::= `XXL`\n\nThe interpretation of the `Lin` operator applied to a set of functions assigns\nto each function the line number where the function is defined. Unknown\nfunctions and functions of library modules are assigned the number 0.\n\nThe interpretation of some LineOp operator applied to a set of function calls\nassigns to each call the set of line numbers where the first function calls the\nsecond function. Not all calls are assigned line numbers by all operators:\n\n- the `Lin` operator is defined for Call Graph Edges;\n- the `LLin` operator is defined for Local Calls.\n- the `XLin` operator is defined for External Calls.\n- the `ELin` operator is defined for Inter Call Graph Edges.\n\nThe `Lin` (`LLin`, `XLin`) operator assigns the lines where calls (local calls,\nexternal calls) are made. The `ELin` operator assigns to each call (From, To),\nfor which it is defined, every line L such that there is a chain of calls from\nFrom to To beginning with a call on line L.\n\nThe `XXL` operator is defined for the interpretation of any of the LineOp\noperators applied to a set of function calls. The result is that of replacing\nthe function call with a line numbered function call, that is, each of the two\nfunctions of the call is replaced by a pair of the function and the line where\nthe function is defined. The effect of the `XXL` operator can be undone by the\nLineOp operators. For instance, `(Lin) (XXL) (Lin) E` is equivalent to\n`(Lin) E`.\n\nThe `+`, `-`, `*`, and `#` operators are defined for line number expressions,\nprovided the operands are compatible. The LineOp operators are also defined for\nmodules, applications, and releases; the operand is implicitly converted to\nfunctions. Similarly, the cast operator is defined for the interpretation of the\nLineOp operators.\n\nThe interpretation of the _counting operator_{: #count } is the number of\nelements of a set. The operator is undefined for closures. The `+`, `-` and `*`\noperators are interpreted as the obvious arithmetical operators when applied to\nnumbers. The syntax of the counting operator:\n\n- Expression ::= CountOp Expression\n- CountOp ::= `#`\n\nAll binary operators are left associative; for instance, `A | B  || C` is\nequivalent to `(A | B) || C`. The following is a list of all operators, in\nincreasing order of _precedence_{: #precedence }:\n\n- `+`, `-`\n- `*`\n- `#`\n- `|`, `||`, `|||`\n- `of`\n- `(`Type`)`\n- `closure`, `components`, `condensation`, `domain`, `range`, `strict`\n\nParentheses are used for grouping, either to make an expression more readable or\nto override the default precedence of operators:\n\n- Expression ::= `(` Expression `)`\n\nA _query_{: #query } is a non-empty sequence of statements. A statement is\neither an assignment of a user variable or an expression. The value of an\nassignment is the value of the right hand side expression. It makes no sense to\nput a plain expression anywhere else but last in queries. The syntax of queries\nis summarized by these productions:\n\n- Query ::= Statement`,` ...\n- Statement ::= Assignment | Expression\n- Assignment ::= Variable `:=` Expression | Variable `=` Expression\n\nA variable cannot be assigned a new value unless first removed. Variables\nassigned to by the `=` operator are removed at the end of the query, while\nvariables assigned to by the `:=` operator can only be removed by calls to\n`forget`. There are no user variables when module data need to be set up again;\nif any of the functions that make it necessary to set up module data again is\ncalled, all user variables are forgotten.","title":"xref","ref":"xref.html"},{"type":"module","doc":"`m:beam_lib`, `m:digraph`, `m:digraph_utils`, `m:re`,\n[User's Guide for Xref](xref_chapter.md)","title":"See Also - xref","ref":"xref.html#module-see-also"},{"type":"function","doc":"","title":"xref.add_application/2","ref":"xref.html#add_application/2"},{"type":"function","doc":"Adds an application, the modules of the application, and\n[module data](`m:xref#module_data`) of the modules to an\n[Xref server](`m:xref#xref_server`).\n\nThe modules will be members of the application. The default is to use\nthe base name of the directory with the version removed as application\nname, but this can be overridden by the `name` option. Returns the\nname of the application.\n\nIf the given directory has a subdirectory named `ebin`, modules (BEAM files) are\nsearched for in that directory, otherwise modules are searched for in the given\ndirectory.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","title":"xref.add_application/3","ref":"xref.html#add_application/3"},{"type":"function","doc":"","title":"xref.add_directory/2","ref":"xref.html#add_directory/2"},{"type":"function","doc":"Adds the modules found in the given directory and the\n[modules' data](`m:xref#module_data`) to an [Xref server](`m:xref#xref_server`).\n\nThe default is not to examine subdirectories, but if the option `recurse` has\nthe value `true`, modules are searched for in subdirectories on all levels as\nwell as in the given directory. Returns a sorted list of the names of the added\nmodules.\n\nThe modules added will not be members of any applications.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","title":"xref.add_directory/3","ref":"xref.html#add_directory/3"},{"type":"function","doc":"","title":"xref.add_module/2","ref":"xref.html#add_module/2"},{"type":"function","doc":"Adds a module and its [module data](`m:xref#module_data`) to an\n[Xref server](`m:xref#xref_server`).\n\nThe module will not be member of any application. Returns the name of the module.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, and the BEAM\nfile contains no [debug information](`m:xref#debug_info`), the error message\n`no_debug_info` is returned.","title":"xref.add_module/3","ref":"xref.html#add_module/3"},{"type":"function","doc":"","title":"xref.add_release/2","ref":"xref.html#add_release/2"},{"type":"function","doc":"Adds a release, the applications of the release, the modules of the\napplications, and [module data](`m:xref#module_data`) of the modules to an\n[Xref server](`m:xref#xref_server`).\n\nThe applications will be members of the release, and the modules will\nbe members of the applications. The default is to use the base name of\nthe directory as release name, but this can be overridden by the\n`name` option. Returns the name of the release.\n\nIf the given directory has a subdirectory named `lib`, the directories in that\ndirectory are assumed to be application directories, otherwise all\nsubdirectories of the given directory are assumed to be application directories.\nIf there are several versions of some application, the one with the highest\nversion is chosen.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","title":"xref.add_release/3","ref":"xref.html#add_release/3"},{"type":"function","doc":"","title":"xref.analyze/2","ref":"xref.html#analyze/2"},{"type":"function","doc":"[](){: #analyze } Evaluates a predefined analysis.\n\nReturns a sorted list without duplicates of `t:call/0` or\n`t:constant/0`, depending on the chosen analysis. The predefined\nanalyses, which operate on all [analyzed\nmodules](`m:xref#analyzed_module`), are (analyses marked with (\\*) are\navailable only in [mode `functions`](`m:xref#mode`)):\n\n- **`undefined_function_calls`(\\*)** - Returns a list of calls to\n [undefined functions](`m:xref#undefined_function`).\n\n- **`undefined_functions`** - Returns a list of\n [undefined functions](`m:xref#undefined_function`).\n\n- **`locals_not_used`(\\*)** - Returns a list of local functions that have not\n been locally used.\n\n- **`exports_not_used`** - Returns a list of exported functions that have not\n been externally used. Note that in `modules` mode, `M:behaviour_info/1` is\n never reported as unused.\n\n- **`deprecated_function_calls`(\\*)** - Returns a list of external calls to\n [deprecated functions](`m:xref#deprecated_function`).\n\n- **`{deprecated_function_calls, DeprFlag}`(\\*)** - Returns a list of external\n calls to deprecated functions. If `DeprFlag` is equal to `next_version`, calls\n to functions to be removed in next version are returned. If `DeprFlag` is\n equal to `next_major_release`, calls to functions to be removed in next major\n release are returned as well as calls to functions to be removed in next\n version. Finally, if `DeprFlag` is equal to `eventually`, all calls to\n functions to be removed are returned, including calls to functions to be\n removed in next version or next major release.\n\n- **`deprecated_functions`** - Returns a list of externally used deprecated\n functions.\n\n- **`{deprecated_functions, DeprFlag}`** - Returns a list of externally used\n deprecated functions. If `DeprFlag` is equal to `next_version`, functions to\n be removed in next version are returned. If `DeprFlag` is equal to\n `next_major_release`, functions to be removed in next major release are\n returned as well as functions to be removed in next version. Finally, if\n `DeprFlag` is equal to `eventually`, all functions to be removed are returned,\n including functions to be removed in next version or next major release.\n\n- **`{call, FuncSpec}`(\\*)** - Returns a list of functions called by some of the\n given functions.\n\n- **`{use, FuncSpec}`(\\*)** - Returns a list of functions that use some of the\n given functions.\n\n- **`{module_call, ModSpec}`** - Returns a list of modules called by some of the\n given modules.\n\n- **`{module_use, ModSpec}`** - Returns a list of modules that use some of the\n given modules.\n\n- **`{application_call, AppSpec}`** - Returns a list of applications called by\n some of the given applications.\n\n- **`{application_use, AppSpec}`** - Returns a list of applications that use\n some of the given applications.\n\n- **`{release_call, RelSpec}`** - Returns a list of releases called by some of\n the given releases.\n\n- **`{release_use, RelSpec}`** - Returns a list of releases that use some of the\n given releases.","title":"xref.analyze/3","ref":"xref.html#analyze/3"},{"type":"function","doc":"The modules found in the given directory are checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions.\n\nThe code path is used as [library path](`m:xref#library_path`).\n\nIf some of the found BEAM files contain\n[debug information](`m:xref#debug_info`), then those modules are checked and a\nlist of tuples is returned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of calls to deprecated\n functions;\n- `undefined`, the second element is a sorted list of calls to undefined\n functions;\n- `unused`, the second element is a sorted list of unused local functions.\n\nIf no BEAM file contains debug information, then a list of tuples is returned.\nThe first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of externally used\n deprecated functions;\n- `undefined`, the second element is a sorted list of undefined functions.","title":"xref.d/1","ref":"xref.html#d/1"},{"type":"function","doc":"Removes all [user variables](`m:xref#user_variable`) of an\n[Xref server](`m:xref#xref_server`).","title":"xref.forget/1","ref":"xref.html#forget/1"},{"type":"function","doc":"Removes the [user variables](`m:xref#user_variable`) given by `Variables` from\nan [Xref server](`m:xref#xref_server`).","title":"xref.forget/2","ref":"xref.html#forget/2"},{"type":"function","doc":"Given the error returned by any function of this module, the function\n`format_error` returns a descriptive string of the error in English.\n\nFor file errors, the function `file:format_error/1` is called.","title":"xref.format_error/1","ref":"xref.html#format_error/1"},{"type":"function","doc":"Returns a list of all options and their default values.","title":"xref.get_default/1","ref":"xref.html#get_default/1"},{"type":"function","doc":"Returns the default value for option `Option`.","title":"xref.get_default/2","ref":"xref.html#get_default/2"},{"type":"function","doc":"Returns the [library path](`m:xref#library_path`).","title":"xref.get_library_path/1","ref":"xref.html#get_library_path/1"},{"type":"function","doc":"The `info/1` function returns information as a list of pairs `{Tag, term()` in\nsome order about the state and the [module data](`m:xref#module_data`) of an\n[Xref server](`m:xref#xref_server`).\n\n[`info/1`](`info/1`) returns information with the following tags (tags marked\nwith (\\*) are only available in `functions` mode):\n\n- `library_path`, the [library path](`m:xref#library_path`);\n- `mode`, the [mode](`m:xref#mode`);\n- `no_releases`, number of releases;\n- `no_applications`, total number of applications (of all releases);\n- `no_analyzed_modules`, total number of\n [analyzed modules](`m:xref#analyzed_module`);\n- `no_calls` (\\*), total number of calls (in all modules), regarding instances\n of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), total number of [local calls](`m:xref#local_call`),\n resolved [external calls](`m:xref#external_call`) and\n [unresolved calls](`m:xref#unresolved_call`);\n- `no_functions` (\\*), total number of local and exported functions;\n- `no_inter_function_calls` (\\*), total number of calls of the\n [Inter Call Graph](`m:xref#inter_call_graph`).","title":"xref.info/1","ref":"xref.html#info/1"},{"type":"function","doc":"Returns information about all items belonging to category `Category`.\nSee `info/3` for details.","title":"xref.info/2","ref":"xref.html#info/2"},{"type":"function","doc":"The `info` functions return information as a list of pairs `{Tag, term()}` in\nsome order about the state and the [module data](`m:xref#module_data`) of an\n[Xref server](`m:xref#xref_server`).\n\n[`info/2`](`info/2`) and [`info/3`](`info/3`) return information about all or\nsome of the analyzed modules, applications, releases, or library modules of an\nXref server. The following information is returned for every analyzed module:\n\n- `application`, an empty list if the module does not belong to any application,\n otherwise a list of the application name;\n- `builtins`, whether calls to BIFs are included in the module's data;\n- `directory`, the directory where the module's BEAM file is located;\n- `no_calls` (\\*), number of calls, regarding instances of one function call in\n different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls;\n- `no_functions` (\\*), number of local and exported functions;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph;\n\nThe following information is returned for every application:\n\n- `directory`, the directory where the modules' BEAM files are located;\n- `no_analyzed_modules`, number of analyzed modules;\n- `no_calls` (\\*), number of calls of the application's modules, regarding\n instances of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls of the application's modules;\n- `no_functions` (\\*), number of local and exported functions of the\n application's modules;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph of the\n application's modules;\n- `release`, an empty list if the application does not belong to any release,\n otherwise a list of the release name;\n- `version`, the application's version as a list of numbers. For instance, the\n directory \"kernel-2.6\" results in the application name `kernel` and the\n application version \\[2,6]; \"kernel\" yields the name `kernel` and the version\n [].\n\nThe following information is returned for every release:\n\n- `directory`, the release directory;\n- `no_analyzed_modules`, number of analyzed modules;\n- `no_applications`, number of applications;\n- `no_calls` (\\*), number of calls of the release's modules, regarding instances\n of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls of the release's modules;\n- `no_functions` (\\*), number of local and exported functions of the release's\n modules;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph of the\n release's modules.\n\nThe following information is returned for every library module:\n\n- `directory`, the directory where the\n [library module's](`m:xref#library_module`) BEAM file is located.\n\nFor every number of calls, functions, and so on returned by the `no_` tags, there is a\nquery returning the same number. Listed below are examples of such queries. Some\nof the queries return the sum of a two or more of the `no_` tags numbers. `mod`\n(`app`, `rel`) refers to any module (application, release).\n\n- `no_analyzed_modules`\n\n - `\"# AM\"` (info/1)\n - `\"# (Mod) app:App\"` (application)\n - `\"# (Mod) rel:Rel\"` (release)\n\n- `no_applications`\n\n - `\"# A\"` (info/1)\n\n- `no_calls`. The sum of the number of resolved and unresolved calls:\n\n - `\"# (XLin) E + # (LLin) E\"` (info/1)\n - `\"T = E | mod:Mod, # (LLin) T + # (XLin) T\"` (module)\n - `\"T = E | app:App, # (LLin) T + # (XLin) T\"` (application)\n - `\"T = E | rel:Rel, # (LLin) T + # (XLin) T\"` (release)\n\n- `no_functions`. Functions in library modules and the functions\n `module_info/0,1` are not counted by `info`. Assuming that\n `\"Extra := _:module_info/\\\"(0|1)\\\" + LM\"` has been evaluated, the sum of the\n number of local and exported functions are:\n\n - `\"# (F - Extra)\"` (info/1)\n - `\"# (F * mod:Mod - Extra)\"` (module)\n - `\"# (F * app:App - Extra)\"` (application)\n - `\"# (F * rel:Rel - Extra)\"` (release)\n\n- `no_function_calls`. The sum of the number of local calls, resolved external\n calls and unresolved calls:\n\n - `\"# LC + # XC\"` (info/1)\n - `\"# LC | mod:Mod + # XC | mod:Mod\"` (module)\n - `\"# LC | app:App + # XC | app:App\"` (application)\n - `\"# LC | rel:Rel + # XC | mod:Rel\"` (release)\n\n- `no_inter_function_calls`\n\n - `\"# EE\"` (info/1)\n - `\"# EE | mod:Mod\"` (module)\n - `\"# EE | app:App\"` (application)\n - `\"# EE | rel:Rel\"` (release)\n\n- `no_releases`\n\n - `\"# R\"` (info/1)","title":"xref.info/3","ref":"xref.html#info/3"},{"type":"function","doc":"The given BEAM file (with or without the `.beam` extension) or the file found by\ncalling `code:which(Module)` is checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions.\n\nThe code path is used as [library path](`m:xref#library_path`).\n\nIf the BEAM file contains [debug information](`m:xref#debug_info`), a list\nof tuples is returned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of calls to deprecated\n functions;\n- `undefined`, the second element is a sorted list of calls to undefined\n functions;\n- `unused`, the second element is a sorted list of unused local functions.\n\nIf the BEAM file does not contain debug information, a list of tuples is\nreturned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of externally used\n deprecated functions;\n- `undefined`, the second element is a sorted list of undefined functions.","title":"xref.m/1","ref":"xref.html#m/1"},{"type":"function","doc":"","title":"xref.q/2","ref":"xref.html#q/2"},{"type":"function","doc":"Evaluates a [query](`m:xref#query`) in the context of an\n[Xref server](`m:xref#xref_server`), and returns the value of the last\nstatement.\n\nThe syntax of the value depends on the expression:\n\n- A set of calls is represented by a sorted list without duplicates of\n `t:call/0`.\n- A set of constants is represented by a sorted list without duplicates of\n `t:constant/0`.\n- A set of strongly connected components is a sorted list without duplicates of\n `Component`.\n- A set of calls between strongly connected components is a sorted list without\n duplicates of `ComponentCall`.\n- A chain of calls is represented by a list of `t:constant/0`. The list contains\n the From vertex of every call and the To vertex of the last call.\n- The `of` operator returns `false` if no chain of calls between the given\n constants can be found.\n- The value of the `closure` operator (the `digraph` representation) is\n represented by the atom `'closure()'`.\n- A set of line numbered functions is represented by a sorted list without\n duplicates of `DefineAt`.\n- A set of line numbered function calls is represented by a sorted list without\n duplicates of `CallAt`.\n- A set of line numbered functions and function calls is represented by a sorted\n list without duplicates of `AllLines`.\n\nFor both `CallAt` and `AllLines` it holds that for no list element is\n`LineNumbers` an empty list; such elements have been removed. The constants of\n`component` and the integers of `LineNumbers` are sorted and without duplicates.","title":"xref.q/3","ref":"xref.html#q/3"},{"type":"function","doc":"Removes applications and their modules and [module data](`m:xref#module_data`)\nfrom an [Xref server](`m:xref#xref_server`).","title":"xref.remove_application/2","ref":"xref.html#remove_application/2"},{"type":"function","doc":"Removes [analyzed modules](`m:xref#analyzed_module`) and\n[module data](`m:xref#module_data`) from an [Xref server](`m:xref#xref_server`).","title":"xref.remove_module/2","ref":"xref.html#remove_module/2"},{"type":"function","doc":"Removes releases and their applications, modules, and\n[module data](`m:xref#module_data`) from an [Xref server](`m:xref#xref_server`).","title":"xref.remove_release/2","ref":"xref.html#remove_release/2"},{"type":"function","doc":"","title":"xref.replace_application/3","ref":"xref.html#replace_application/3"},{"type":"function","doc":"Replaces the modules of an application with other modules read from an\napplication directory.\n\nRelease membership of the application is retained. Note that the name\nof the application is kept; the name of the given directory is not\nused.","title":"xref.replace_application/4","ref":"xref.html#replace_application/4"},{"type":"function","doc":"","title":"xref.replace_module/3","ref":"xref.html#replace_module/3"},{"type":"function","doc":"Replaces [module data](`m:xref#module_data`) of an\n[analyzed module](`m:xref#analyzed_module`) with data read from a BEAM file.\n\nApplication membership of the module is retained, and so is the value of the\n`builtins` option of the module. An error is returned if the name of the read\nmodule differs from the given module.\n\nThe `update` function is an alternative for updating module data of recompiled\nmodules.","title":"xref.replace_module/4","ref":"xref.html#replace_module/4"},{"type":"function","doc":"Sets default values for multiple options given by `OptionValues`.\n\nSee `set_default/3` for the name of options and their allowed values.","title":"xref.set_default/2","ref":"xref.html#set_default/2"},{"type":"function","doc":"Sets the default value of one or more options.\n\nThe options that can be set this way are:\n\n- `builtins`, with initial default value `false`;\n- `recurse`, with initial default value `false`;\n- `verbose`, with initial default value `false`;\n- `warnings`, with initial default value `true`.\n\nThe initial default values are set when creating an\n[Xref server](`m:xref#xref_server`).","title":"xref.set_default/3","ref":"xref.html#set_default/3"},{"type":"function","doc":"","title":"xref.set_library_path/2","ref":"xref.html#set_library_path/2"},{"type":"function","doc":"Sets the [library path](`m:xref#library_path`).\n\nIf the given path is a list of directories, the set of [library\nmodules](`m:xref#library_module`) is determined by choosing the first\nmodule encountered while traversing the directories in the given\norder, for those modules that occur in more than one directory. By\ndefault, the library path is an empty list.\n\nThe library path `code_path`{: #code_path } is used by the functions\n[`m/1`](`m/1`) and [`d/1`](`d/1`), but can also be set explicitly. However,\nnote that the code path will be traversed once for each used\n[library module](`m:xref#library_module`) while setting up module data. On the\nother hand, if there are only a few modules that are used but not analyzed,\nusing `code_path` may be faster than setting the library path to\n`code:get_path/0`.\n\nIf the library path is set to `code_path`, the set of library modules is not\ndetermined, and the `info` functions will return empty lists of library modules.","title":"xref.set_library_path/3","ref":"xref.html#set_library_path/3"},{"type":"function","doc":"Creates an [Xref server](`m:xref#xref_server`).\n\nThe process can optionally be given a name. The default\n[mode](`m:xref#mode`) is `functions`. Options that are\nnot recognized by Xref are passed on to `gen_server:start/4`.","title":"xref.start/1","ref":"xref.html#start/1"},{"type":"function","doc":"Creates an [Xref server](`m:xref#xref_server`) with a given name.\n\nThe default [mode](`m:xref#mode`) is `functions`. Options that are\nnot recognized by Xref are passed on to `gen_server:start/4`.","title":"xref.start/2","ref":"xref.html#start/2"},{"type":"function","doc":"Stops an [Xref server](`m:xref#xref_server`).","title":"xref.stop/1","ref":"xref.html#stop/1"},{"type":"function","doc":"","title":"xref.update/1","ref":"xref.html#update/1"},{"type":"function","doc":"Replaces the [module data](`m:xref#module_data`) of all\n[analyzed modules](`m:xref#analyzed_module`) the BEAM files of which have been\nmodified since last read by an `add` function or `update`.\n\nApplication membership of the modules is retained, and so is the value\nof the `builtins`option. Returns a sorted list of the names of\nthe replaced modules.","title":"xref.update/2","ref":"xref.html#update/2"},{"type":"function","doc":"","title":"xref.variables/1","ref":"xref.html#variables/1"},{"type":"function","doc":"Returns a sorted lists of the names of the variables of an\n[Xref server](`m:xref#xref_server`).\n\nThe default is to return only the\n[user variables](`m:xref#user_variable`).","title":"xref.variables/2","ref":"xref.html#variables/2"},{"type":"type","doc":"","title":"xref.add_dir_rsn/0","ref":"xref.html#t:add_dir_rsn/0"},{"type":"type","doc":"","title":"xref.add_mod_rsn/0","ref":"xref.html#t:add_mod_rsn/0"},{"type":"type","doc":"","title":"xref.analysis/0","ref":"xref.html#t:analysis/0"},{"type":"type","doc":"","title":"xref.analyze_rsn/0","ref":"xref.html#t:analyze_rsn/0"},{"type":"type","doc":"","title":"xref.answer/0","ref":"xref.html#t:answer/0"},{"type":"type","doc":"","title":"xref.app_spec/0","ref":"xref.html#t:app_spec/0"},{"type":"type","doc":"","title":"xref.application/0","ref":"xref.html#t:application/0"},{"type":"type","doc":"","title":"xref.call/0","ref":"xref.html#t:call/0"},{"type":"type","doc":"","title":"xref.component/0","ref":"xref.html#t:component/0"},{"type":"type","doc":"","title":"xref.constant/0","ref":"xref.html#t:constant/0"},{"type":"type","doc":"","title":"xref.define_at/0","ref":"xref.html#t:define_at/0"},{"type":"type","doc":"","title":"xref.depr_flag/0","ref":"xref.html#t:depr_flag/0"},{"type":"type","doc":"","title":"xref.directory/0","ref":"xref.html#t:directory/0"},{"type":"type","doc":"","title":"xref.file/0","ref":"xref.html#t:file/0"},{"type":"type","doc":"","title":"xref.file_error/0","ref":"xref.html#t:file_error/0"},{"type":"type","doc":"","title":"xref.func_spec/0","ref":"xref.html#t:func_spec/0"},{"type":"type","doc":"","title":"xref.funcall/0","ref":"xref.html#t:funcall/0"},{"type":"type","doc":"","title":"xref.function_name/0","ref":"xref.html#t:function_name/0"},{"type":"type","doc":"","title":"xref.info/0","ref":"xref.html#t:info/0"},{"type":"type","doc":"","title":"xref.library/0","ref":"xref.html#t:library/0"},{"type":"type","doc":"","title":"xref.library_path/0","ref":"xref.html#t:library_path/0"},{"type":"type","doc":"","title":"xref.mod_spec/0","ref":"xref.html#t:mod_spec/0"},{"type":"type","doc":"","title":"xref.mode/0","ref":"xref.html#t:mode/0"},{"type":"type","doc":"","title":"xref.path/0","ref":"xref.html#t:path/0"},{"type":"type","doc":"","title":"xref.q_rsn/0","ref":"xref.html#t:q_rsn/0"},{"type":"type","doc":"","title":"xref.rel_spec/0","ref":"xref.html#t:rel_spec/0"},{"type":"type","doc":"","title":"xref.release/0","ref":"xref.html#t:release/0"},{"type":"type","doc":"","title":"xref.string_position/0","ref":"xref.html#t:string_position/0"},{"type":"type","doc":"","title":"xref.variable/0","ref":"xref.html#t:variable/0"},{"type":"type","doc":"","title":"xref.xarity/0","ref":"xref.html#t:xarity/0"},{"type":"type","doc":"","title":"xref.xmfa/0","ref":"xref.html#t:xmfa/0"},{"type":"type","doc":"","title":"xref.xref/0","ref":"xref.html#t:xref/0"},{"type":"extras","doc":"\n# Tools Release Notes\n\nThis document describes the changes made to the Tools application.","title":"Tools Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Tools 4.0 - Tools Release Notes","ref":"notes.html#tools-4-0"},{"type":"extras","doc":"- Dialyzer warnings due to type specs added in `m:dbg` have been eliminated.\n\n Own Id: OTP-18860\n\n- In Erlang/OTP 26, doing a `m:cover` analysis on the `line` level would return multiple entries for lines on which multiple functions were defined.\n \n For example, consider this module:\n \n -module(foo).\n -export([bar/0, baz/0]).\n \n bar() -> ok. baz() -> not_ok.\n \n In Erlang/OTP 26, analysing on the `line` level would return two entries\n for line 4:\n \n 1> cover:compile_module(foo).\n {ok,foo}\n 2> foo:bar().\n ok\n 3> cover:analyse(foo, coverage, line).\n {ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}\n 4> cover:analyse(foo, calls, line).\n {ok,[{{foo,4},1},{{foo,4},0}]}\n \n In Erlang/OTP 27, there will only be a single entry for line 4:\n \n 1> cover:compile_module(foo).\n {ok,foo}\n 2> foo:bar().\n ok\n 3> cover:analyse(foo, coverage, line).\n {ok,[{{foo,4},{1,0}}]}\n 4> cover:analyse(foo, calls, line).\n {ok,[{{foo,4},1}]}\n\n Own Id: OTP-18998 Aux Id: [GH-8159], [PR-8182]\n\n- Fixed align command in emacs mode.\n\n Own Id: OTP-19026 Aux Id: [PR-8155]\n\n[GH-8159]: https://github.com/erlang/otp/issues/8159\n[PR-8182]: https://github.com/erlang/otp/pull/8182\n[PR-8155]: https://github.com/erlang/otp/pull/8155","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Triple-Quoted Strings has been implemented as per [EEP 64](https://www.erlang.org/eeps/eep-0064). See [String](`e:system:data_types.md#string`) in the Reference Manual.\n \n Example:\n \n ```erlang\n 1> \"\"\"\n a\n b\n c\n \"\"\".\n \"a\\nb\\nc\"\n ```\n \n Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:\n \n ```erlang\n 1> \"abc\"\"xyz\".\n \"xyz\".\n * 1:6: adjacent string literals without intervening white space\n ```\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-18750 Aux Id: OTP-18746, [PR-7313], [PR-7451]\n\n- There is a new tool `m:tprof`, which combines the functionality of `m:eprof` and `m:cprof` under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.\n \n *Example*:\n \n ```erlang\n 1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).\n \n ****** Process <0.92.0> -- 100.00% of total *** \n FUNCTION CALLS WORDS PER CALL [ %]\n lists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\n ok\n ```\n\n Own Id: OTP-18756 Aux Id: [PR-6639]\n\n- Native coverage support has been implemented in the JIT. It will automatically be used by the `m:cover` tool to reduce the execution overhead when running cover-compiled code.\n \n There are also new APIs to support native coverage without using the `cover` tool.\n \n To instrument code for native coverage it must be compiled with the [`line_coverage`](`m:compile#line_coverage`) option.\n \n To enable native coverage in the runtime system, start it like so:\n \n ```text\n $ erl +JPcover true\n ```\n \n There are also the following new functions for supporting native coverage:\n \n * `code:coverage_support/0`\n * `code:get_coverage/2`\n * `code:reset_coverage/1`\n * `code:get_coverage_mode/0`\n * `code:get_coverage_mode/1`\n * `code:set_coverage_mode/1`\n\n Own Id: OTP-18856 Aux Id: [PR-7856]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Improved the align command in emacs mode.\n\n Own Id: OTP-19080 Aux Id: [PR-8288]\n\n[PR-7313]: https://github.com/erlang/otp/pull/7313\n[PR-7451]: https://github.com/erlang/otp/pull/7451\n[PR-6639]: https://github.com/erlang/otp/pull/6639\n[PR-7856]: https://github.com/erlang/otp/pull/7856\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8288]: https://github.com/erlang/otp/pull/8288","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.6 - Tools Release Notes","ref":"notes.html#tools-3-6"},{"type":"extras","doc":"- Map comprehensions as suggested in EEP 58 has now been implemented.\n\n Own Id: OTP-18413 Aux Id: EEP-58, PR-6727\n\n- The `instrument` module has been moved from `tools` to `runtime_tools`.\n\n Own Id: OTP-18487 Aux Id: PR-6829","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.5.3 - Tools Release Notes","ref":"notes.html#tools-3-5-3"},{"type":"extras","doc":"- Removed the previously undocumented and unsupported `emem` tool.\n\n Own Id: OTP-17892 Aux Id: PR-5591","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.5.2 - Tools Release Notes","ref":"notes.html#tools-3-5-2"},{"type":"extras","doc":"- Erlang-mode fixed for newer versions of xref using CL-Lib structures instead\n of EIEIO classes.\n\n Own Id: OTP-17746 Aux Id: GH-5314, PR-5324","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.5.1 - Tools Release Notes","ref":"notes.html#tools-3-5-1"},{"type":"extras","doc":"- The `cover` tool would not work on modules compiled with the `tuple_calls`\n option.\n\n Own Id: OTP-17440 Aux Id: GH-4796","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.5 - Tools Release Notes","ref":"notes.html#tools-3-5"},{"type":"extras","doc":"- For cover-compiled code, the error behaviour of list and binary comprehensions\n that used `andalso`/`orelse` in guards could be changed so that a filter that\n was supposed be evaluated in guard context was evaluated in body context. That\n is, there was a possibility that comprehensions that did not raise exceptions\n could raise exceptions when being run using `cover`.\n\n Own Id: OTP-17221 Aux Id: PR-4547","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support for handling abstract code created before OTP R15 has been dropped.\n\n Own Id: OTP-16678 Aux Id: PR-2627\n\n- Add types and specifications for documentation.\n\n Own Id: OTP-16957\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.4.4 - Tools Release Notes","ref":"notes.html#tools-3-4-4"},{"type":"extras","doc":"- `cover` would crash when compiling a module having an exported function named\n `clauses`.\n\n Own Id: OTP-17162 Aux Id: GH-4549, PR-2997, PR-4555, elixir-lang/elixir#10666\n\n- If `beam_lib` is asked to return abstract code for a BEAM file produced by\n Elixir and Elixir is not installed on the computer, `beam_lib` will no longer\n crash, but will return an error tuple. The `cover:compile_beam()` and\n `cover:compile_beam_directory()` functions have been updated to also return an\n error tuple in that situation.\n\n Own Id: OTP-17194 Aux Id: GH-4353\n\n- Make emacs mode work on emacs-27.\n\n Own Id: OTP-17225 Aux Id: PR-4542, GH-4451","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.4.3 - Tools Release Notes","ref":"notes.html#tools-3-4-3"},{"type":"extras","doc":"- Correct the Xref analysis `undefined_functions` to not report internally\n generated behaviour_info/1.\n\n Own Id: OTP-17191 Aux Id: OTP-16922, ERL-1476, GH-4192","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.4.2 - Tools Release Notes","ref":"notes.html#tools-3-4-2"},{"type":"extras","doc":"- Correct the Xref analysis `exports_not_used` to not report internally\n generated `behaviour_info/1`.\n\n Own Id: OTP-16922 Aux Id: PR-2752","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.4.1 - Tools Release Notes","ref":"notes.html#tools-3-4-1"},{"type":"extras","doc":"- Correct the Xref analysis `locals_not_used` to find functions called\n exclusively from `on_load` functions.\n\n Own Id: OTP-16854 Aux Id: PR-2750","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.4 - Tools Release Notes","ref":"notes.html#tools-3-4"},{"type":"extras","doc":"- Updates for new `erlang:term_to_iovec()` BIF.\n\n Own Id: OTP-16128 Aux Id: OTP-15618\n\n- Improved the presentation of allocations and carriers in the `instrument`\n module.\n\n Own Id: OTP-16327\n\n- Minor updates due to the new spawn improvements made.\n\n Own Id: OTP-16368 Aux Id: OTP-15251","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.3.1.1 - Tools Release Notes","ref":"notes.html#tools-3-3-1-1"},{"type":"extras","doc":"- `cover` would crash when compiling a module having an exported function named\n `clauses`.\n\n Own Id: OTP-17162 Aux Id: GH-4549, PR-2997, PR-4555, elixir-lang/elixir#10666","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.3.1 - Tools Release Notes","ref":"notes.html#tools-3-3-1"},{"type":"extras","doc":"- An Emacs warning due to lacking type in defcustom declaration has been fixed.\n\n Own Id: OTP-16356\n\n- Improve emacs indentation.\n\n Own Id: OTP-16472 Aux Id: ERL-1140\n\n- The cover tool could generate instrumented code for a module that would cause\n warnings to be issued.\n\n Own Id: OTP-16476 Aux Id: ERL-1147\n\n- Fixed generated [fprof analysis format](`m:fprof#analysis`) to also handle\n data in maps.\n\n Own Id: OTP-16498 Aux Id: ERL-814","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.3 - Tools Release Notes","ref":"notes.html#tools-3-3"},{"type":"extras","doc":"- Improve `-spec` indentation in emacs mode.\n\n Own Id: OTP-16164","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The Emacs erlang-mode function that lets the user open the documentation for\n an Erlang/OTP function in an Emacs buffer has been improved. Bugs in this\n function has been fixed and and the user will now be asked if the man pages\n should be downloaded automatically by Emacs when they can't be found on the\n system. To test this functionality, put the cursor over the function name in a\n call to an Erlang/OTP function (e.g., \"io:format(\"arg\")\") and type C-c C-d\n (i.e., Ctrl-key and c-key and then Ctrl-key and d-key). There is also a new\n menu item under the Erlang menu (labeled \"Man - Function Under Cursor\").\n\n Own Id: OTP-16174","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.2.1 - Tools Release Notes","ref":"notes.html#tools-3-2-1"},{"type":"extras","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.2 - Tools Release Notes","ref":"notes.html#tools-3-2"},{"type":"extras","doc":"- Add `cprof` and `tags` modules to .app file so that they are included in\n releases.\n\n Own Id: OTP-15534 Aux Id: PR-2078\n\n- Improved documentation parsing in emacs erldoc functionality.\n\n Own Id: OTP-15699 Aux Id: PR-2184","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The `cover` tool now uses the `counters` module instead of `ets` for updating\n the counters for how many times a line has been executed. By default, Cover\n will work with distributed nodes, but a new function `cover:local_only/0`\n allows running the Cover in a restricted but faster local-only mode.\n\n The increase in speed will vary depending on the type of code being\n cover-compiled, but as an example, the compiler test suite runs more than\n twice as fast with the new Cover.\n\n Own Id: OTP-15575","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.1.0.1 - Tools Release Notes","ref":"notes.html#tools-3-1-0-1"},{"type":"extras","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 3.1 - Tools Release Notes","ref":"notes.html#tools-3-1"},{"type":"extras","doc":"- Minor fixes for `make clean`.\n\n Own Id: OTP-15657","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- In the HTML file generated by `cover:analyse_to_file/1,2`, a link is now added\n to the line number. This makes it easier to share pointers to specific lines.\n\n Own Id: OTP-15541\n\n- Uncovered lines are now marked with a sad face, `:-(`, in the HTML output from\n `cover:analyse_to_file/1,2`. This is to make these lines easier to find by\n search.\n\n Own Id: OTP-15542","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.0.2 - Tools Release Notes","ref":"notes.html#tools-3-0-2"},{"type":"extras","doc":"- Remove emacs warnings and added more tests.\n\n Own Id: OTP-15476","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.0.1 - Tools Release Notes","ref":"notes.html#tools-3-0-1"},{"type":"extras","doc":"- The HTML pages generated by cover:analyse_to_file/1 and related functions is\n improved for readability.\n\n Own Id: OTP-15213 Aux Id: PR-1807\n\n- Add alignment functionality in emacs.\n\n Own Id: OTP-15239 Aux Id: PR-1728","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 3.0 - Tools Release Notes","ref":"notes.html#tools-3-0"},{"type":"extras","doc":"- Added `instrument:allocations` and `instrument:carriers` for retrieving\n information about memory utilization and fragmentation.\n\n The old `instrument` interface has been removed, as have the related options\n `+Mim` and `+Mis`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14961","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.11.2.2 - Tools Release Notes","ref":"notes.html#tools-2-11-2-2"},{"type":"extras","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.11.2.1 - Tools Release Notes","ref":"notes.html#tools-2-11-2-1"},{"type":"extras","doc":"- Minor fixes for `make clean`.\n\n Own Id: OTP-15657","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.11.2 - Tools Release Notes","ref":"notes.html#tools-2-11-2"},{"type":"extras","doc":"- A counting bug is corrected in `Cover`. The bug was introduced in Erlang/OTP\n 18.0.\n\n Own Id: OTP-14817 Aux Id: PR 1641\n\n- The `lcnt` server will no longer crash if `lcnt:information/0` is called\n before `lcnt:collect/0`.\n\n Own Id: OTP-14912\n\n- `lcnt:collect` will now implicitly start the `lcnt` server, as per the\n documentation.\n\n Own Id: OTP-14913","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improved indentation in emacs and various other updates.\n\n Own Id: OTP-14944","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.11.1 - Tools Release Notes","ref":"notes.html#tools-2-11-1"},{"type":"extras","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.11 - Tools Release Notes","ref":"notes.html#tools-2-11"},{"type":"extras","doc":"- The predefined Xref analysis `locals_not_used` no longer reports unused\n functions with the `-on_load()` attribute.\n\n The new predefined Xref variable `OL` holds all functions with the\n `-on_load()` attribute.\n\n Own Id: OTP-14344\n\n- In fprof when sampling multiple processes and analyzing with totals set to\n true, the output now sums together all caller and callee entries which\n concerns the same function. Previous behaviour was to report each contributing\n entry separately.\n\n Own Id: OTP-14500","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Lock counting can now be fully toggled at runtime in the lock counting\n emulator (`-emu_type lcnt`). Everything is enabled by default to match the old\n behavior, but specific categories can be toggled at will with minimal runtime\n overhead when disabled. Refer to the documentation on `lcnt:rt_mask/1` for\n details.\n\n Own Id: OTP-13170\n\n- `lcnt:collect` and `lcnt:clear` will no longer block all other threads in the\n runtime system.\n\n Own Id: OTP-14412\n\n- General Unicode improvements.\n\n Own Id: OTP-14462\n\n- Tools are updated to show Unicode atoms correctly.\n\n Own Id: OTP-14464\n\n- Add `erlang:iolist_to_iovec/1`, which converts an iolist() to an\n erlang:iovec(), which suitable for use with `enif_inspect_iovec`.\n\n Own Id: OTP-14520","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.10.1 - Tools Release Notes","ref":"notes.html#tools-2-10-1"},{"type":"extras","doc":"- In OTP-20.0, the behavior of c, make, and ct_make was changed so that in some\n cases the beam files by default would be written to the directory where the\n source files were found. This is now changed back to the old behavior so beam\n files are by default written to current directory.\n\n Own Id: OTP-14489 Aux Id: ERL-438","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.10 - Tools Release Notes","ref":"notes.html#tools-2-10"},{"type":"extras","doc":"- In some situations, `make:all()` and friends did not detect changes in include\n files located in the current directory. This is now corrected.\n\n Own Id: OTP-14339 Aux Id: ERL-395","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The `make` module now accepts the `{emake,Emake}` option.\n\n Own Id: OTP-14253\n\n- Miscellaneous updates due to atoms containing arbitrary Unicode characters.\n\n Own Id: OTP-14285","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.9.1 - Tools Release Notes","ref":"notes.html#tools-2-9-1"},{"type":"extras","doc":"- Improved edoc support in emacs mode.\n\n Own Id: OTP-14217 Aux Id: PR-1282","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.9 - Tools Release Notes","ref":"notes.html#tools-2-9"},{"type":"extras","doc":"- Fix unhandled trace event send_to_non_existing_process in fprof.\n\n Own Id: OTP-13998","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improved edoc support in emacs erlang-mode.\n\n Own Id: OTP-13945 Aux Id: PR-1157\n\n- Added erldoc to emacs mode which opens html documentation in browser from\n emacs. For example `M-x erldoc-browse RET lists:foreach/2`.\n\n Own Id: OTP-14018 Aux Id: PR-1197","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.8.6 - Tools Release Notes","ref":"notes.html#tools-2-8-6"},{"type":"extras","doc":"- Errors in type specification and Emacs template generation for\n `gen_statem:code_change/4` has been fixed from bugs.erlang.org's Jira cases\n ERL-172 and ERL-187.\n\n Own Id: OTP-13746 Aux Id: ERL-172, ERL-187\n\n- Fix gc_start/gc_end in fprof tags when parsing old trace logs.\n\n Own Id: OTP-13778 Aux Id: PR-1136\n\n- `make` (tools) and `ct_make` (common_test) would crash if an Erlang source\n file contained a `-warning()` directive.\n\n Own Id: OTP-13855","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.8.5 - Tools Release Notes","ref":"notes.html#tools-2-8-5"},{"type":"extras","doc":"- Correct a bug when adding multiple modules to an Xref server. The bug was\n introduced in OTP-19.0.\n\n Own Id: OTP-13708 Aux Id: ERL-173","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.8.4 - Tools Release Notes","ref":"notes.html#tools-2-8-4"},{"type":"extras","doc":"- Update fprof to use the new 'spawned' trace event to determine when a process\n has been created.\n\n Own Id: OTP-13499","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Optimize adding multiple modules to an Xref server.\n\n Own Id: OTP-13593\n\n- Various emacs mode improvements, such as better tags support.\n\n Own Id: OTP-13610","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.8.3 - Tools Release Notes","ref":"notes.html#tools-2-8-3"},{"type":"extras","doc":"- `cover:compile_beam/1` and `cover:compile_beam_directory/1,2` crashed when\n trying to compile a beam file without a `'file'` attribute. This has been\n corrected and an error is returned instead.\n\n Thanks to Louis-Philippe Gauthier for reporting this bug.\n\n Own Id: OTP-13200\n\n- Fix a bit string comprehension bug in Cover.\n\n Own Id: OTP-13277 Aux Id: PR 856","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.8.2 - Tools Release Notes","ref":"notes.html#tools-2-8-2"},{"type":"extras","doc":"- The emacs mode does not add a newline after the arrow on -callback lines\n anymore.\n\n Own Id: OTP-13042","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.8.1 - Tools Release Notes","ref":"notes.html#tools-2-8-1"},{"type":"extras","doc":"- If a module includes eunit.hrl, a parse transform adds the function test/0 on\n line 0 in the module. A bug in OTP-18.0 caused cover:analyse_to_file/1 to fail\n to insert cover data in the output file when line 0 existed in the cover data\n table. This is now corrected.\n\n Own Id: OTP-12981","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.8 - Tools Release Notes","ref":"notes.html#tools-2-8"},{"type":"extras","doc":"- In order to improve performance of the cover tool, new functions are added for\n cover compilation and analysis on multiple files. This allows for more\n parallelisation.\n\n Some improvements of the data base access is also done in order to improve the\n performance when analysing and resetting cover data.\n\n Minor incompatibility: An error reason from analyse_to_file is changed from\n no_source_code_found to \\{no_source_code_found,Module\\}.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12330 Aux Id: seq12757\n\n- Attempting to do a `cover` analysis when neither source code nor beam file\n could be found would hang the `cover` server. Corrected to return a proper\n error.\n\n Own Id: OTP-12806","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Allow maps for supervisor flags and child specs\n\n Earlier, supervisor flags and child specs were given as tuples. While this is\n kept for backwards compatibility, it is now also allowed to give these\n parameters as maps, see [sup_flags](`m:supervisor#sup_flags`) and\n [child_spec](`m:supervisor#child_spec`).\n\n Own Id: OTP-11043\n\n- Remove Mnemosyne rules support.\n\n Own Id: OTP-12511\n\n- Add printout of total number of calls and time in eprof\n\n Own Id: OTP-12681","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.7.2 - Tools Release Notes","ref":"notes.html#tools-2-7-2"},{"type":"extras","doc":"- Fix lcnt sorting and printout of histograms.\n\n Own Id: OTP-12364\n\n- Fix a Unicode bug in the `tags` module.\n\n Own Id: OTP-12567\n\n- Fix tags completion in erlang.el for GNU Emacs 23+\n\n Own Id: OTP-12583","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.7.1 - Tools Release Notes","ref":"notes.html#tools-2-7-1"},{"type":"extras","doc":"- Fixed a typo in erlang-mode comment.\n\n Own Id: OTP-12214\n\n- Add a skeleton for -spec in Erlang mode for Emacs\n\n Own Id: OTP-12283","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Cover no longer crashes when compiling `receive` and the like with just an\n `after` clause. Thanks to José Valim for providing a fix.\n\n Own Id: OTP-12328","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.7 - Tools Release Notes","ref":"notes.html#tools-2-7"},{"type":"extras","doc":"- Add log2 histogram to lcnt for lock wait time\n\n Own Id: OTP-12059","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.15 - Tools Release Notes","ref":"notes.html#tools-2-6-15"},{"type":"extras","doc":"- Removed `erlang:bitstr_to_list/1` and `erlang:list_to_bitstr/1`. They were\n added by mistake, and have always raised an `undefined` exception when called.\n\n Own Id: OTP-11942","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.14 - Tools Release Notes","ref":"notes.html#tools-2-6-14"},{"type":"extras","doc":"- Removed the support for the query keyword from emacs mode (Thanks to Paul\n Oliver)\n\n Own Id: OTP-11568\n\n- Emacs mode improvements (Thanks to Steve Vinoski)\n\n Own Id: OTP-11601\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744\n\n- The emacs erlang mode now match erlang keywords more carefully (Thanks to\n Steve Vinoski)\n\n Own Id: OTP-11786\n\n- The emacs erlang-mode now auto loads for more file types (Thanks to Phil\n Hagelberg)\n\n Own Id: OTP-11788","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `cover` can run on itself. Also, support for reading BEAM files produced by\n ancient OTP versions before R9C has been removed.\n\n Own Id: OTP-11692\n\n- Support maps in cover\n\n Own Id: OTP-11764","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.13 - Tools Release Notes","ref":"notes.html#tools-2-6-13"},{"type":"extras","doc":"- Erlang-specific compilation error regexp is added in erlang-eunit.el. This\n defvar was earlier in erlang.el, but was erroneously removed in R15B02, while\n still used by erlang-eunit.el.\n\n Own Id: OTP-11417 Aux Id: seq12447\n\n- Take compiler options from beam in cover:compile_beam. Thanks to Péter Gömöri.\n\n Own Id: OTP-11439\n\n- Silence warnings (Thanks to Anthony Ramine)\n\n Own Id: OTP-11517","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add iodata, nonempty_string to built-in type highlighting for emacs. Thanks to\n Paul Oliver.\n\n Own Id: OTP-11394","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.12 - Tools Release Notes","ref":"notes.html#tools-2-6-12"},{"type":"extras","doc":"- Remove trailing spaces in Emacs templates. Thanks to Roberto Aloi.\n\n Own Id: OTP-11198\n\n- Fixed the Emacs erlang-mode to accommodate the coding style where lists\n written across several lines have each line starting with a comma. Thanks to\n Magnus Henoch.\n\n Own Id: OTP-11242\n\n- Make the Emacs Erlang mode TRAMP-aware when compiling. Thanks to Tomas\n Abrahamsson.\n\n Own Id: OTP-11270","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.11 - Tools Release Notes","ref":"notes.html#tools-2-6-11"},{"type":"extras","doc":"- When cover:stop(Node) was called on a non-existing node, a process waiting for\n cover data from the node would hang forever. This has been corrected.\n\n Own Id: OTP-10979","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make cover smarter about finding source from beam.\n\n In particular, search using the source path in module_info if the current\n heuristic fails.\n\n Own Id: OTP-10902\n\n- Remove Flymake dependency in erlang-pkg.el. Thanks to Magnus Henoch.\n\n Own Id: OTP-10930\n\n- Erlang-mode: Add autoload cookies for file extension associations. Thanks to\n Magnus Henoch.\n\n Own Id: OTP-10999\n\n- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016\n\n- Fix a race condition when there're several applications in apps directory.\n Thanks to Manuel Rubio.\n\n Own Id: OTP-11028\n\n- New option for eprof, 'set_on_spawn'. This option was previously always on and\n is also the default.\n\n Own Id: OTP-11144","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.10 - Tools Release Notes","ref":"notes.html#tools-2-6-10"},{"type":"extras","doc":"- Fix a bug in cover when used with no_auto_import. Thanks to José Valim.\n\n Own Id: OTP-10778","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.9 - Tools Release Notes","ref":"notes.html#tools-2-6-9"},{"type":"extras","doc":"- Add missing modules in app-file\n\n Own Id: OTP-10439\n\n- Make erlang-mode more compatible with package.el (Thanks to Gleb Peregud)\n\n Own Id: OTP-10465\n\n- Fix various typos (thanks to Tuncer Ayaz)\n\n Own Id: OTP-10611\n\n- Add separate face for exported functions (Thanks to Thomas Järvstrand)\n\n Own Id: OTP-10637\n\n- The BIF highlighting in the emacs mode has been updated to correspond with the\n correct BIFs.\n\n Own Id: OTP-10774","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support for Unicode has been implemented.\n\n Own Id: OTP-10302\n\n- A new function, cover:flush(Nodes), is added which will fetch data from remote\n nodes without stopping cover on those nodes. This is used by test_server and\n common_test when it is safe to assume that the node will be terminated after\n the test anyway. The purpose is to avoid processes crashing when re-loading\n the original beam if the processes is still running old code.\n\n Remote nodes will now continue to count code coverage if the connection to the\n main node is broken. Earlier, a broken connection would cause the cover_server\n on the remote node to die and thus any still cover compiled modules would\n cause process crash when trying to insert cover data in ets tables that used\n to exist on the cover_server. The new functionality also involves\n synchronization with the main node if the nodes are reconnected.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10523 Aux Id: OTP-10427\n\n- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Fix syntax highlighting of $\\\\' in Emacs mode. Thanks to Magnus Henoch.\n\n Own Id: OTP-10766","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.8 - Tools Release Notes","ref":"notes.html#tools-2-6-8"},{"type":"extras","doc":"- The last tuple fun call has been removed from fprof.\n\n Own Id: OTP-10091 Aux Id: seq12067\n\n- Fix indentation of record fields in Emacs (Thanks to Tomas Abrahamsson)\n\n Own Id: OTP-10120\n\n- Documentation fixes (Thanks to Ricardo Catalinas Jiménez )\n\n Own Id: OTP-10121\n\n- Remove Erlang-specific compilation error regexp in erlang.el\n\n Own Id: OTP-10168\n\n- Fix highlighting of atoms ending with a dollar sign\n\n Like this: 'atom$'. In that example, the last single quote should be\n recognised as ending the atom. This needs a font-lock workaround similar to\n the one for strings. Thanks to Magnus Henoch\n\n Own Id: OTP-10178\n\n- Xref now accepts filenames with character codes greater than 126. (Thanks to\n Emile Joubert for reporting the issue.)\n\n Own Id: OTP-10192\n\n- Add test_indentation target to lib/tools/emacs/Makefile\n\n Automatically indent test.erl.orig, save to test.erl, and compare to\n test.erl.intended. Thanks to Magnus Henoch.\n\n Own Id: OTP-10226","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.7 - Tools Release Notes","ref":"notes.html#tools-2-6-7"},{"type":"extras","doc":"- Makefiles in erts, hipe and tools have been corrected to enable parallel make,\n i.e MAKEFLAGS=-jX where X is the parallelity number. As a result of this\n dependencies were corrected since that is what is needed for parallel make to\n work.\n\n Own Id: OTP-9857 Aux Id: OTP-9451\n\n- Minor suppressions and fixes of compilation warnings\n\n Own Id: OTP-10016","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.6.6 - Tools Release Notes","ref":"notes.html#tools-2-6-6-6"},{"type":"extras","doc":"- Update system profiling principles to reflect eprof performance improvements.\n\n Own Id: OTP-9656\n\n- \\[cover] fix leftover \\{'DOWN', ..\\} msg in callers queue\n\n After stopping cover with cover:stop() there could still be a \\{'DOWN',...\\}\n leftover message in the calling process's message queue. This unexpected\n leftover could be eliminated if erlang:demonitor/2 with option flush would be\n used in certain points\n\n Own Id: OTP-9694\n\n- Add deps as erlang-flymake include directory.\n\n Update erlang-flymake to recognize the \"deps\" folder as an include directory.\n This makes erlang-flymake compatible with the rebar dependency management\n tool's default folder structure, which puts included dependencies in\n \"deps\".(Thanks to Kevin Albrecht)\n\n Own Id: OTP-9791","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Variables are now now allowed in '`fun M:F/A`' as suggested by Richard O'Keefe\n in EEP-23.\n\n The representation of '`fun M:F/A`' in the abstract format has been changed in\n an incompatible way. Tools that directly read or manipulate the abstract\n format (such as parse transforms) may need to be updated. The compiler can\n handle both the new and the old format (i.e. extracting the abstract format\n from a pre-R15 BEAM file and compiling it using compile:forms/1,2 will work).\n The `syntax_tools` application can also handle both formats.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9643\n\n- Tuple funs (a two-element tuple with a module name and a function) are now\n officially deprecated and will be removed in R16. Use '`fun M:F/A`' instead.\n To make you aware that your system uses tuple funs, the very first time a\n tuple fun is applied, a warning will be sent to the error logger.\n\n Own Id: OTP-9649\n\n- Eliminate use of deprecated regexp module\n\n Own Id: OTP-9810","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.6.5 - Tools Release Notes","ref":"notes.html#tools-2-6-6-5"},{"type":"extras","doc":"- Teach the emacs mode to compile yecc and leex files\n\n If visiting a .yrl or .xrl file in emacs with erlang-mode, then the\n \\`erlang-compile' function (normally bound to C-c C-k), now knows how to\n compile yecc and leex files, and then, if that compilation succeeds, also\n compiles the resulting .erl files.\n\n Also introduce a \\`erlang-compile-command-function-alist' to make it possible\n to hook in other functions for computing compilation commands/expressions,\n depending on file name. (Thanks to Tomas Abrahamsson )\n\n Own Id: OTP-9503","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Bugs in xref(3) have been fixed. (Thanks to Matthias Lang.)\n\n Own Id: OTP-9416","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.6.4 - Tools Release Notes","ref":"notes.html#tools-2-6-6-4"},{"type":"extras","doc":"- Change make:files to behave more like erlc\n\n This change removes the unnecessary checks on the files when make:files is\n called and allows the error checking to be done in compile:file, where the\n error messages are produced. It does not affect the return value.\n\n (Thanks to Sam bobroff)\n\n Own Id: OTP-9179\n\n- add user specified compiler options on form reloading\n\n In order to be able to test non-exported functions from another (test) module\n it is necessary to compile the specific module (at least during the test\n phase) with the export*all compiler option. This allows complete separation of\n testing and productive code. At the moment it is not possible to combine this\n with a test code coverage using the cover module. The problem is that when\n cover compiling a module using cover:compile*\\* the code is reloaded into the\n emulator omitting/filtering the passed user options. In my example above the\n export_all option would be removed and the non-exported functions cannot be\n called any more. (Thanks to Tobias Schlager)\n\n Own Id: OTP-9204\n\n- Inhibit electric newline after \"->\" when inside a type spec\n\n The Erlang mode for Emacs inserts a newline after every \"->\", which saves you\n one keystroke when writing a function, but that is inappropriate when writing\n a type spec, as you'd normally keep the spec on one line. This change inhibits\n the automatic insertion when the current line starts with \"-spec\" or\n \"-type\".(Thanks to Magnus Henoch)\n\n Own Id: OTP-9255\n\n- Add a check logic to prevent file descriptor leak\n\n cover module handle files as raw in export and import. Assert counts of ports\n are the same at the beginning and at the end of the test case.(Thanks to\n Shunichi Shinohara)\n\n Own Id: OTP-9300","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.6.3 - Tools Release Notes","ref":"notes.html#tools-2-6-6-3"},{"type":"extras","doc":"- Declare indentation options as \"safe\" in erlang-mode for Emacs\n\n Emacs has a facility for setting options on a per-file basis based on comments\n in the source file. By default, all options are considered \"unsafe\", and the\n user is queried before the variable is set. This patch declares the variables\n erlang-indent-level, erlang-indent-guard and erlang-argument-indent to be\n safe, if the value specified in the source file is valid.\n\n Such declarations usually look like this:\n\n %% -_- erlang-indent-level: 2 -_-\n\n and appear on the first line of the file. (thanks to Magnus Henoch)\n\n Own Id: OTP-9122","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Cover has been improved to take less memory and allow parallel analysis of\n cover data. Data collection from nodes is now done in parallel and it is now\n possible to issue multiple analyse and analyse_to_file requests at the same\n time. A new function call async_analyse_to_file has also been introduced, see\n the documentation for more details.\n\n Own Id: OTP-9043 Aux Id: seq11771","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.6.2 - Tools Release Notes","ref":"notes.html#tools-2-6-6-2"},{"type":"extras","doc":"- eprof: API sort mismatch has now been fixed.\n\n Own Id: OTP-8853\n\n- eprof: fix division by zero in statistics\n\n Own Id: OTP-8963","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.6.1 - Tools Release Notes","ref":"notes.html#tools-2-6-6-1"},{"type":"extras","doc":"- `cover` will now show ampersand characters in the source code correctly.\n (Thanks to Tom Moertel.)\n\n Own Id: OTP-8776","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.6 - Tools Release Notes","ref":"notes.html#tools-2-6-6"},{"type":"extras","doc":"- A race condition affecting Cover has been removed.\n\n Own Id: OTP-8469\n\n- Emacs improvements:\n\n Fixed emacs-mode installation problems.\n\n Fixed a couple of -spec and -type indentation and font-lock problems.\n\n Fixed error messages on emacs-21.\n\n Magnus Henoch fixed several issues.\n\n Ralf Doering, Klas Johansson and Chris Bernard contributed various emacs-eunit\n improvements.\n\n Klas Johansson and Dave Peticolas added emacs-flymake support.\n\n Own Id: OTP-8530","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Xref has been updated to use the `re` module instead of the deprecated\n `regexp` module.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8472\n\n- When given the option `{builtins,true}` Xref now adds calls to operators.\n\n Own Id: OTP-8647\n\n- `eprof` has been reimplemented with support in the Erlang virtual machine and\n is now both faster (i.e. slows down the code being measured less) and scales\n much better. In measurements we saw speed-ups compared to the old eprof\n ranging from 6 times (for sequential code that only uses one scheduler/core)\n up to 84 times (for parallel code that uses 8 cores).\n\n Note: The API for the `eprof` has been cleaned up and extended. See the\n documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8706","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.5.1 - Tools Release Notes","ref":"notes.html#tools-2-6-5-1"},{"type":"extras","doc":"- A bug concerning bit comprehensions has been fixed in Cover. The bug was\n introduced in R13B03. (Thanks to Matthew Sackman.)\n\n Own Id: OTP-8340","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add lock profiling tool.\n\n The Lock profiling tool, lcnt, can make use of the internal lock statistics\n when the runtime system is built with this feature enabled.\n\n This provides a mechanism to examine potential lock bottlenecks within the\n runtime itself.\n\n \\- Add erts_debug:lock_counters(\\{copy_save, bool()\\}). This option enables or\n disables statistics saving for destroyed processes and ets-tables. Enabling\n this might consume a lot of memory.\n\n \\- Add id-numbering for lock classes which is otherwise undefined.\n\n Own Id: OTP-8424\n\n- emacs: Moved code skeletons to a separate file and and added a configurable\n variable to choose skeleton. Thanks Dave Peticolas.\n\n Own Id: OTP-8446","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.5 - Tools Release Notes","ref":"notes.html#tools-2-6-5"},{"type":"extras","doc":"- The coverage analysis tool `cover` has been improved when it comes to handling\n list and bit string comprehensions (a counter for each qualifier), bit syntax\n expressions (the Value and Size expressions), and try expressions (the body\n called `Exprs` in the Reference Manual). A few (not all) situations where\n several expressions are put on the same line are also handled better than\n before.\n\n Own Id: OTP-8188 Aux Id: seq11397\n\n- When loading Cover compiled code on remote nodes running code in the loaded\n module, a `badarg` failure was sometimes the result. This bug has been fixed.\n\n Own Id: OTP-8270 Aux Id: seq11423\n\n- The short-circuit operators `andalso` and `orelse` are now handled correctly\n by the coverage analysis tool `cover` (it is no longer checked that the second\n argument returns a Boolean value.)\n\n Own Id: OTP-8273","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.4 - Tools Release Notes","ref":"notes.html#tools-2-6-4"},{"type":"extras","doc":"- `cover` now properly escapes greater-than and less-than characters in comments\n in HTML reports. (Thanks to Magnus Henoch.)\n\n Own Id: OTP-7939","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.3 - Tools Release Notes","ref":"notes.html#tools-2-6-3"},{"type":"extras","doc":"- xref:start/1 does now allow anonymous XREF processes to be started\n\n Own Id: OTP-7831","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6.2 - Tools Release Notes","ref":"notes.html#tools-2-6-2"},{"type":"extras","doc":"- A bug in the Xref scanner has been fixed.\n\n Own Id: OTP-7423\n\n- A bug in Fprof where the function 'undefined' appeared to call 'undefined' has\n been corrected.\n\n Own Id: OTP-7509","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.6.1 - Tools Release Notes","ref":"notes.html#tools-2-6-1"},{"type":"extras","doc":"- The documentation has been updated so as to reflect the last updates of the\n Erlang shell as well as the minor modifications of the control sequence `p` of\n the `io_lib` module.\n\n Superfluous empty lines have been removed from code examples and from Erlang\n shell examples.\n\n Own Id: OTP-6944 Aux Id: OTP-6554, OTP-6911\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`).\n\n Own Id: OTP-7009\n\n- The coverage analysis tool `cover` now handles the short-circuit Boolean\n expressions `andalso/2` and `orelse/2` properly.\n\n Own Id: OTP-7095","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.6 - Tools Release Notes","ref":"notes.html#tools-2-6"},{"type":"extras","doc":"- The `cover` tool could use huge amounts of memory when used in a distributed\n system.\n\n Own Id: OTP-6758","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.5.5 - Tools Release Notes","ref":"notes.html#tools-2-5-5"},{"type":"extras","doc":"- Missing buffer-local declaration in erlang.el has been added. Before this fix\n there could arise problems in other emacs modes after visiting a buffer using\n the erlang mode.\n\n Own Id: OTP-6721\n\n- Key-map for 'backward-delete-char-untabif updated to work properly with\n Xemacs.\n\n Own Id: OTP-6723","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Minor updates of Xref.\n\n Own Id: OTP-6586\n\n- Minor Makefile changes.\n\n Own Id: OTP-6689 Aux Id: OTP-6742\n\n- \"C-u C-c C-k\" now does a compile with both \"debug_info\" and \"export_all\".\n\n Own Id: OTP-6741","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.5.4.1 - Tools Release Notes","ref":"notes.html#tools-2-5-4-1"},{"type":"extras","doc":"- Changes due to internal interface changes in the erts application which are\n needed at compile-time. No functionality has been changed.\n\n Own Id: OTP-6611 Aux Id: OTP-6580","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.5.4 - Tools Release Notes","ref":"notes.html#tools-2-5-4"},{"type":"extras","doc":"- Made change to support the function erlang-find-tag for xemacs and emacs-21.\n\n Own Id: OTP-6512","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Minor updates of xref for future compatibility.\n\n Own Id: OTP-6513","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.5.3 - Tools Release Notes","ref":"notes.html#tools-2-5-3"},{"type":"extras","doc":"- `eprof` did not work reliably in the SMP emulator, because the trace receiver\n process could not process the trace messages fast enough. Therefore, `eprof`\n now blocks the other schedulers while profiling.\n\n Own Id: OTP-6373","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.5.2 - Tools Release Notes","ref":"notes.html#tools-2-5-2"},{"type":"extras","doc":"- Fprof traces could become truncated for the SMP emulator. This bug has now\n been corrected.\n\n Own Id: OTP-6246","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.5.1 - Tools Release Notes","ref":"notes.html#tools-2-5-1"},{"type":"extras","doc":"- eprof now works somewhat better in the SMP emulator.\n\n Own Id: OTP-6152","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.5 - Tools Release Notes","ref":"notes.html#tools-2-5"},{"type":"extras","doc":"- Fixed some bugs in `make`:\n\n `make:files/1,2` can now handle a file in another directory as argument,\n similar to `make:all/0,1`.\n\n When specifying a file name including the `.erl` extension in `Emakefile`,\n `make:all/0,1` looked for the object code in the wrong place.\n\n When specifying a file name including the `.erl` extension in `Emakefile` and\n some compile options for the file, `make:files/0,1` did not use the options as\n it should do.\n\n Own Id: OTP-6057 Aux Id: seq10299\n\n- `cover`: When `cover:stop()` was called, the cover compiled code was not\n unloaded (as stated in the documentation) but simply marked as 'old'. This\n meant that processes lingering in (or with funs referencing to) the cover\n compiled code would survive even when the cover server and its ETS tables was\n terminated.\n\n Now the cover compiled code is unloaded, meaning that processes lingering\n in/with references to it will be killed when `cover:stop` is called, instead\n of later crashing with `badarg` when trying to bump counters in ETS tables no\n longer existing.","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Replaced call to deprecated function `file:file_info/1` with call to\n `filelib:is_dir/1` and `filelib:is_regular/1` in `tags.erl`.\n\n Own Id: OTP-6079","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.4.7 - Tools Release Notes","ref":"notes.html#tools-2-4-7"},{"type":"extras","doc":"- A bug in `fprof` profiling causing erroneous inconsistent trace failure has\n been corrected.\n\n Own Id: OTP-5922 Aux Id: seq10203","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.4.6 - Tools Release Notes","ref":"notes.html#tools-2-4-6"},{"type":"extras","doc":"- Emacs: `erlang-man-function` and `erlang-man-module` used a pattern matching\n to find the requested module that sometimes yielded unexpected results. For\n example, `erlang-man-module file` would display the man page for\n `CosFileTransfer_File`.\n\n Own Id: OTP-5746 Aux Id: seq10096\n\n- Some compiler warnings and Dialyzer warnings were eliminated in the Tools\n application.\n\n When tracing to a port (which `fprof` does), there could be fake schedule\n out/schedule in messages sent for a process that had exited.\n\n Own Id: OTP-5757","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.4.5 - Tools Release Notes","ref":"notes.html#tools-2-4-5"},{"type":"extras","doc":"- The cross reference tool `xref` did not handle the new `fun M:F/A` construct\n properly. This problem has been fixed.\n\n Own Id: OTP-5653","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.4.4 - Tools Release Notes","ref":"notes.html#tools-2-4-4"},{"type":"extras","doc":"- The `cover` tool did not escape '<' and '>' not being part of HTML tags in\n HTML log files.\n\n Own Id: OTP-5588","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.4.3 - Tools Release Notes","ref":"notes.html#tools-2-4-3"},{"type":"extras","doc":"- It is now possible to encrypt the debug information in beam files, to help\n keep the source code secret. See `m:compile` for how to provide the key for\n encrypting, and `m:beam_lib` for how to provide the key for decryption so that\n tools such as Debugger, `xref`, or `cover` can be used.\n\n The `beam_lib:chunks/2` functions now accepts an additional chunk type\n '`compile_info`' to retrieve the compilation information directly as a term.\n (Thanks to Tobias Lindahl.)\n\n Own Id: OTP-5460 Aux Id: seq9787","title":"Improvements and New Features - Tools Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Tools 2.4.2 - Tools Release Notes","ref":"notes.html#tools-2-4-2"},{"type":"extras","doc":"- The `cover` tool could not analyze empty modules on module level.\n\n Own Id: OTP-5418","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Tools 2.4.1 - Tools Release Notes","ref":"notes.html#tools-2-4-1"},{"type":"extras","doc":"- The `xref` analysis `locals_not_used` could return too many functions. This\n problem has been fixed.\n\n Own Id: OTP-5071\n\n- The `cover` tool could not always compile parse transformed modules. This\n problem has been fixed.\n\n Own Id: OTP-5305","title":"Fixed Bugs and Malfunctions - Tools Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"\n# cover - The Coverage Analysis Tool","title":"cover - The Coverage Analysis Tool","ref":"cover_chapter.html"},{"type":"extras","doc":"The module `cover` provides a set of functions for coverage analysis of Erlang\nprograms, counting how many times each [executable line](cover_chapter.md#lines)\nis executed.\n\nCoverage analysis can be used to verify test cases, making sure all relevant\ncode is covered, and can be helpful when looking for bottlenecks in the code.","title":"Introduction - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#introduction"},{"type":"extras","doc":"","title":"Getting Started With Cover - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#getting-started-with-cover"},{"type":"extras","doc":"Assume that a test case for the following program should be verified:\n\n```erlang\n-module(channel).\n-behaviour(gen_server).\n\n-export([start_link/0,stop/0]).\n-export([alloc/0,free/1]). % client interface\n-export([init/1,handle_call/3,terminate/2]). % callback functions\n\nstart_link() ->\n gen_server:start_link({local,channel}, channel, [], []).\n\nstop() ->\n gen_server:call(channel, stop).\n\n%%%-Client interface functions-------------------------------------------\n\nalloc() ->\n gen_server:call(channel, alloc).\n\nfree(Channel) ->\n gen_server:call(channel, {free,Channel}).\n\n%%%-gen_server callback functions----------------------------------------\n\ninit(_Arg) ->\n {ok,channels()}.\n\nhandle_call(stop, _Client, Channels) ->\n {stop,normal,ok,Channels};\n\nhandle_call(alloc, _Client, Channels) ->\n {Ch,Channels2} = alloc(Channels),\n {reply,{ok,Ch},Channels2};\n\nhandle_call({free,Channel}, _Client, Channels) ->\n Channels2 = free(Channel, Channels),\n {reply,ok,Channels2}.\n\nterminate(_Reason, _Channels) ->\n ok.\n\n%%%-Internal functions---------------------------------------------------\n\nchannels() ->\n [ch1,ch2,ch3].\n\nalloc([Channel|Channels]) ->\n {Channel,Channels};\nalloc([]) ->\n false.\n\nfree(Channel, Channels) ->\n [Channel|Channels].\n```\n\nThe test case is implemented as follows:\n\n```erlang\n-module(test).\n-export([s/0]).\n\ns() ->\n {ok,Pid} = channel:start_link(),\n {ok,Ch1} = channel:alloc(),\n ok = channel:free(Ch1),\n ok = channel:stop().\n```","title":"Example - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#example"},{"type":"extras","doc":"First of all, Cover must be started. This spawns a process which owns the Cover\ndatabase where all coverage data will be stored.\n\n```erlang\n1> cover:start().\n{ok,<0.90.0>}\n```\n\nTo include other nodes in the coverage analysis, use\n`cover:start/1`. All cover-compiled modules will then be loaded on all\nnodes, and data from all nodes will be summed up when analysing. For\nsimplicity this example only involves the current node.\n\nBefore any analysis can take place, the involved modules must be\n_cover-compiled_. This means that some extra information is added to\nthe module before beging compiled into a binary and\n[loaded](cover_chapter.md#loading). The source file of the module is\nnot affected and no `.beam` file is created.\n\n```erlang\n2> cover:compile_module(channel).\n{ok,channel}\n```\n\nEach time a function in the cover-compiled module `channel` is called,\ninformation about the call will be added to the Cover database. Run the test\ncase:\n\n```text\n3> test:s().\nok\n```\n\nCover analysis is performed by examining the contents of the Cover database. The\noutput is determined by two parameters, `Level` and `Analysis`. `Analysis` is\neither `coverage` or `calls` and determines the type of the analysis. `Level` is\neither `module`, `function`, `clause`, or `line` and determines the level of the\nanalysis.","title":"Preparation - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#preparation"},{"type":"extras","doc":"Analysis of type `coverage` is used to find out how much of the code has been\nexecuted and how much has not been executed. Coverage is represented by a tuple\n`{Cov,NotCov}`, where `Cov` is the number of executable lines that have been\nexecuted at least once and `NotCov` is the number of executable lines that have\nnot been executed.\n\nIf the analysis is made on module level, the result is given for the entire\nmodule as a tuple `{Module,{Cov,NotCov}}`:\n\n```erlang\n4> cover:analyse(channel, coverage, module).\n{ok,{channel,{14,1}}}\n```\n\nFor `channel`, the result shows that 14 lines in the module are covered but one\nline is not covered.\n\nIf the analysis is made on function level, the result is given as a list of\ntuples `{Function,{Cov,NotCov}}`, one for each function in the module. A\nfunction is specified by its module name, function name and arity:\n\n```erlang\n5> cover:analyse(channel, coverage, function).\n{ok,[{{channel,start_link,0},{1,0}},\n {{channel,stop,0},{1,0}},\n {{channel,alloc,0},{1,0}},\n {{channel,free,1},{1,0}},\n {{channel,init,1},{1,0}},\n {{channel,handle_call,3},{5,0}},\n {{channel,terminate,2},{1,0}},\n {{channel,channels,0},{1,0}},\n {{channel,alloc,1},{1,1}},\n {{channel,free,2},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is in the function\n`channel:alloc/1`.\n\nIf the analysis is made on clause level, the result is given as a list of tuples\n`{Clause,{Cov,NotCov}}`, one for each function clause in the module. A clause is\nspecified by its module name, function name, arity and position within the\nfunction definition:\n\n```erlang\n6> cover:analyse(channel, coverage, clause).\n{ok,[{{channel,start_link,0,1},{1,0}},\n {{channel,stop,0,1},{1,0}},\n {{channel,alloc,0,1},{1,0}},\n {{channel,free,1,1},{1,0}},\n {{channel,init,1,1},{1,0}},\n {{channel,handle_call,3,1},{1,0}},\n {{channel,handle_call,3,2},{2,0}},\n {{channel,handle_call,3,3},{2,0}},\n {{channel,terminate,2,1},{1,0}},\n {{channel,channels,0,1},{1,0}},\n {{channel,alloc,1,1},{1,0}},\n {{channel,alloc,1,2},{0,1}},\n {{channel,free,2,1},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is in the second clause\nof `channel:alloc/1`.\n\nFinally, if the analysis is made on line level, the result is given as a list of\ntuples `{Line,{Cov,NotCov}}`, one for each executable line in the source code. A\nline is specified by its module name and line number.\n\n```erlang\n7> cover:analyse(channel, coverage, line).\n{ok,[{{channel,9},{1,0}},\n {{channel,12},{1,0}},\n {{channel,17},{1,0}},\n {{channel,20},{1,0}},\n {{channel,25},{1,0}},\n {{channel,28},{1,0}},\n {{channel,31},{1,0}},\n {{channel,32},{1,0}},\n {{channel,35},{1,0}},\n {{channel,36},{1,0}},\n {{channel,39},{1,0}},\n {{channel,44},{1,0}},\n {{channel,47},{1,0}},\n {{channel,49},{0,1}},\n {{channel,52},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is line number 49.","title":"Coverage Analysis - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#coverage-analysis"},{"type":"extras","doc":"Analysis of type `calls` is used to find out how many times something has been\ncalled and is represented by an integer `Calls`.\n\nIf the analysis is made on module level, the result is given as a tuple\n`{Module,Calls}`. Here `Calls` is the total number of calls to functions in the\nmodule:\n\n```erlang\n8> cover:analyse(channel, calls, module).\n{ok,{channel,12}}\n```\n\nFor `channel`, the result shows that a total of twelve calls have been made to\nfunctions in the module.\n\nIf the analysis is made on function level, the result is given as a list of\ntuples `{Function,Calls}`. Here `Calls` is the number of calls to each function:\n\n```erlang\n9> cover:analyse(channel, calls, function).\n{ok,[{{channel,start_link,0},1},\n {{channel,stop,0},1},\n {{channel,alloc,0},1},\n {{channel,free,1},1},\n {{channel,init,1},1},\n {{channel,handle_call,3},3},\n {{channel,terminate,2},1},\n {{channel,channels,0},1},\n {{channel,alloc,1},1},\n {{channel,free,2},1}]}\n```\n\nFor `channel`, the result shows that `handle_call/3` is the most called function\nin the module (three calls). All other functions have been called once.\n\nIf the analysis is made on clause level, the result is given as a list of tuples\n`{Clause,Calls}`. Here `Calls` is the number of calls to each function clause:\n\n```erlang\n10> cover:analyse(channel, calls, clause).\n{ok,[{{channel,start_link,0,1},1},\n {{channel,stop,0,1},1},\n {{channel,alloc,0,1},1},\n {{channel,free,1,1},1},\n {{channel,init,1,1},1},\n {{channel,handle_call,3,1},1},\n {{channel,handle_call,3,2},1},\n {{channel,handle_call,3,3},1},\n {{channel,terminate,2,1},1},\n {{channel,channels,0,1},1},\n {{channel,alloc,1,1},1},\n {{channel,alloc,1,2},0},\n {{channel,free,2,1},1}]}\n```\n\nFor `channel`, the result shows that all clauses have been called once, except\nthe second clause of `channel:alloc/1` which has not been called at all.\n\nFinally, if the analysis is made on line level, the result is given as a list of\ntuples `{Line,Calls}`. Here `Calls` is the number of times each line has been\nexecuted:\n\n```erlang\n11> cover:analyse(channel, calls, line).\n{ok,[{{channel,9},1},\n {{channel,12},1},\n {{channel,17},1},\n {{channel,20},1},\n {{channel,25},1},\n {{channel,28},1},\n {{channel,31},1},\n {{channel,32},1},\n {{channel,35},1},\n {{channel,36},1},\n {{channel,39},1},\n {{channel,44},1},\n {{channel,47},1},\n {{channel,49},0},\n {{channel,52},1}]}\n```\n\nFor `channel`, the result shows that all lines have been executed once, except\nline number 49 which has not been executed at all.","title":"Call Statistics - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#call-statistics"},{"type":"extras","doc":"A line level calls analysis of `channel` can be written to a file using\n`cover:analyse_to_file/1`:\n\n```erlang\n12> cover:analyse_to_file(channel).\n{ok,\"channel.COVER.out\"}\n```\n\nThe function creates a copy of `channel.erl` where it for each executable line\nis specified how many times that line has been executed. The output file is\ncalled `channel.COVER.out`.\n\n```erlang\nFile generated from /Users/bjorng/git/otp/channel.erl by COVER 2024-03-20 at 13:25:04\n\n****************************************************************************\n\n | -module(channel).\n | -behaviour(gen_server).\n |\n | -export([start_link/0,stop/0]).\n | -export([alloc/0,free/1]). % client interface\n | -export([init/1,handle_call/3,terminate/2]). % callback functions\n |\n | start_link() ->\n 1..| gen_server:start_link({local,channel}, channel, [], []).\n |\n | stop() ->\n 1..| gen_server:call(channel, stop).\n |\n | %%%-Client interface functions-------------------------------------------\n |\n | alloc() ->\n 1..| gen_server:call(channel, alloc).\n |\n | free(Channel) ->\n 1..| gen_server:call(channel, {free,Channel}).\n |\n | %%%-gen_server callback functions----------------------------------------\n |\n | init(_Arg) ->\n 1..| {ok,channels()}.\n |\n | handle_call(stop, _Client, Channels) ->\n 1..| {stop,normal,ok,Channels};\n |\n | handle_call(alloc, _Client, Channels) ->\n 1..| {Ch,Channels2} = alloc(Channels),\n 1..| {reply,{ok,Ch},Channels2};\n |\n | handle_call({free,Channel}, _Client, Channels) ->\n 1..| Channels2 = free(Channel, Channels),\n 1..| {reply,ok,Channels2}.\n |\n | terminate(_Reason, _Channels) ->\n 1..| ok.\n |\n | %%%-Internal functions---------------------------------------------------\n |\n | channels() ->\n 1..| [ch1,ch2,ch3].\n |\n | alloc([Channel|Channels]) ->\n 1..| {Channel,Channels};\n | alloc([]) ->\n 0..| false.\n |\n | free(Channel, Channels) ->\n 1..| [Channel|Channels].\n```","title":"Analysis to File - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#analysis-to-file"},{"type":"extras","doc":"By looking at the results from the analyses, it can be deduced that\nthe test case does not cover the case when all channels are allocated\nand `test.erl` should be extended accordingly. Incidentally, when the\ntest case is corrected a bug in `channel` will be discovered.\n\nWhen the Cover analysis is ready, Cover is stopped and all cover-compiled\nmodules are [unloaded](cover_chapter.md#loading). The code for `channel` is now\nloaded as usual from a `.beam` file in the current path.\n\n```erlang\n13> code:which(channel).\ncover_compiled\n14> cover:stop().\nok\n15> code:which(channel).\n\"./channel.beam\"\n```","title":"Conclusion - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#conclusion"},{"type":"extras","doc":"","title":"Miscellaneous - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#miscellaneous"},{"type":"extras","doc":"Execution of code in cover-compiled modules is slower and more memory consuming\nthan for regularly compiled modules. As the Cover database contains information\nabout each executable line in each cover-compiled module, performance decreases\nproportionally to the size and number of the cover-compiled modules.\n\nTo improve performance when analysing cover results it is possible to do\nmultiple calls to [analyse](`cover:analyse/1`) and\n[analyse_to_file](`cover:analyse_to_file/1`) at once. You can also use the\n[async_analyse_to_file](`cover:async_analyse_to_file/1`) convenience function.\n\n[](){: #lines }","title":"Performance - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#performance"},{"type":"extras","doc":"Cover uses the concept of _executable lines_, which is code lines containing\nan executable expression such as a matching or a function call. A blank line or\na line containing a comment, function head or pattern in a `case` or `receive`\nstatement is not executable.\n\nIn the example below, lines number 2, 4, 6, 8, and 11 are executable lines:\n\n```erlang\n1: is_loaded(Module, Compiled) ->\n2: case get_file(Module, Compiled) of\n3: {ok,File} ->\n4: case code:which(Module) of\n5: ?TAG ->\n6: {loaded,File};\n7: _ ->\n8: unloaded\n9: end;\n10: false ->\n11: false\n12: end.\n```\n\n[](){: #loading }","title":"Executable Lines - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#executable-lines"},{"type":"extras","doc":"When a module is cover-compiled, it is also loaded using the normal code loading\nmechanism of Erlang. This means that if a cover-compiled module is re-loaded\nduring a Cover session, for example using `c(Module)`, it will no longer be\ncover-compiled.\n\nUse `cover:is_compiled/1` or `code:which/1` to see whether or not a\nmodule is cover-compiled (and still loaded).\n\nWhen Cover is stopped, all cover-compiled modules are unloaded.","title":"Code Loading Mechanism - cover - The Coverage Analysis Tool","ref":"cover_chapter.html#code-loading-mechanism"},{"type":"extras","doc":"\n# cprof - The Call Count Profiler\n\n`cprof` is a profiling tool that can be used to get a picture of how often\ndifferent functions in the system are called.\n\n`cprof` uses breakpoints similar to local call trace, but containing counters,\nto collect profiling data. Therefore there is no need for special compilation of\nany module to be profiled.\n\n`cprof` presents all profiled modules in descending total call count order, and\nfor each module presents all profiled functions also in descending call count\norder. A call count limit can be specified to filter out all functions below the\nlimit.\n\nProfiling is done in the following steps:\n\n- **[`cprof:start/*`](`cprof:start/3`)** - Starts profiling with\n zeroed call counters for specified functions by setting call count\n breakpoints on them.\n\n- **`Mod:Fun()`** - Runs the code to be profiled.\n\n- **[`cprof:pause/*`](`cprof:pause/3`)** - Pauses the call counters for\n specified functions. This minimizes the impact of code running in\n the background or in the shell. Call counters are automatically\n paused when they \"hit the ceiling\" of the host machine word\n size. For a 32 bit host the maximum counter value is 2,147,483,647.\n\n- **[`cprof:analyse/*`](`cprof:analyse/2`)** - Collects call counters\n and computes the result.\n\n- **[`cprof:restart/*`](`cprof:restart/3`)** - Restarts the call\n counters from zero for specified functions. Can be used to collect a\n new set of counters without having to stop and start call count\n profiling.\n\n- **[`cprof:stop/0..3`](`cprof:stop/3`)** - Stops profiling by\n removing call count breakpoints from specified functions.\n\nFunctions can be specified as either all in the system, all in one module, all\narities of one function, one function, or all functions in all modules not yet\nloaded. BIFs cannot be call-count traced.\n\nThe analysis result can either be for a single module or for all modules. In either\ncase a call count limit can be given to filter out the functions with a call\ncount below the limit. The all modules analysis does _not_ contain the module\n`cprof` itself; the only way to analyze `cprof` is by specifying it as a single\nmodule to analyse.\n\nCall count tracing is very lightweight compared to other forms of tracing since\nno trace message has to be generated. Some measurements indicates performance\ndegradations in the vicinity of 10 percent.\n\nThe following sections show some examples of profiling with `m:cprof`.","title":"cprof - The Call Count Profiler","ref":"cprof_chapter.html"},{"type":"extras","doc":"From the Erlang shell:\n\n```erlang\n1> cprof:start(), cprof:pause(). % Stop counters just after start\n8492\n2> cprof:analyse().\n{539,\n [{shell,155,\n [{{shell,prep_check,1},55},\n {{shell,used_records,4},45},\n {{shell,used_records,1},45},\n {{shell,used_record_defs,2},1},\n {{shell,record_defs,2},1},\n {{shell,record_bindings,2},1},\n {{shell,exprs,7},1},\n {{shell,expr,4},1},\n {{shell,expand_records,2},1},\n {{shell,check_command,2},1},\n {{shell,apply_fun,3},1},\n {{shell,'-exprs/7-lc$^0/1-0-',1},1},\n {{shell,'-eval_loop/3-fun-0-',3},1}]},\n %% Information about many modules omitted.\n .\n .\n .\n %% Here is the last part.\n {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},\n {otp_internal,1,[{{otp_internal,obsolete,3},1}]},\n {maps,1,[{{maps,from_list,1},1}]},\n {erl_internal,1,[{{erl_internal,bif,3},1}]}]}\n3> cprof:analyse(cprof).\n{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}\n4> cprof:stop().\n8586\n```\n\nThe example showed some of the background work that the shell performs just to\ninterpret the first command line.\n\nWhat is captured in this example is the part of the work the shell does while\ninterpreting the command line that occurs between the actual calls to\n[`cprof:start()`](`cprof:start/0`) and [`cprof:analyse()`](`cprof:analyse/1`).","title":"Example: Background work - cprof - The Call Count Profiler","ref":"cprof_chapter.html#example-background-work"},{"type":"extras","doc":"From the Erlang shell:\n\n```erlang\n1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.\n1\n2> cprof:analyse(calendar).\n{calendar,9,\n [{{calendar,last_day_of_the_month1,2},1},\n {{calendar,last_day_of_the_month,2},1},\n {{calendar,is_leap_year1,1},1},\n {{calendar,is_leap_year,1},1},\n {{calendar,dy,1},1},\n {{calendar,dm,1},1},\n {{calendar,df,2},1},\n {{calendar,day_of_the_week,3},1},\n {{calendar,date_to_gregorian_days,3},1}]}\n3> cprof:stop().\n8648\n```\n\nThe example tells us that \"Aktiebolaget LM Ericsson & Co\" was registered on a\nMonday (since the return value of the first command is 1), and that the\n`calendar` module needed 9 function calls to calculate that.\n\nUsing `cprof:analyse()` in this example also shows approximately the same\nbackground work as in the first example.","title":"Example: One module - cprof - The Call Count Profiler","ref":"cprof_chapter.html#example-one-module"},{"type":"extras","doc":"Write a module:\n\n```erlang\n-module(sort).\n-export([do/1]).\n\ndo(N) ->\n cprof:stop(),\n cprof:start(),\n do(N, []).\n\ndo(0, L) ->\n R = lists:sort(L),\n cprof:pause(),\n R;\ndo(N, L) ->\n do(N-1, [rand:uniform(256)-1 | L]).\n```\n\nFrom the Erlang shell:\n\n```erlang\n1> c(sort).\n{ok,sort}\n2> rand:seed(default, 42), ok.\nok.\n3> sort:do(1000).\n[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]\n4> cprof:analyse().\n{13180,\n [{lists,6173,\n [{{lists,rmerge3_1,6},1045},\n {{lists,rmerge3_2,6},977},\n {{lists,split_1,5},652},\n {{lists,merge3_1,6},579},\n {{lists,merge3_2,6},577},\n {{lists,rmerge3_12_3,6},511},\n {{lists,split_1_1,6},347},\n {{lists,merge3_12_3,6},310},\n {{lists,rmerge3_21_3,6},282},\n {{lists,merge3_21_3,6},221},\n {{lists,merge2_1,4},154},\n {{lists,merge2_2,5},138},\n {{lists,reverse,2},106},\n {{lists,rmerge2_2,5},87},\n {{lists,rmergel,2},81},\n {{lists,rmerge2_1,4},75},\n {{lists,mergel,2},28},\n {{lists,keyfind,3},2},\n {{lists,sort,1},1}]},\n {rand,5000,\n [{{rand,uniform_s,2},1000},\n {{rand,uniform,1},1000},\n {{rand,seed_put,1},1000},\n {{rand,seed_get,0},1000},\n {{rand,exsss_uniform,2},1000}]},\n {erlang,1004,\n [{{erlang,put,2},1000},\n {{erlang,trace_pattern,3},2},\n {{erlang,ensure_tracer_module_loaded,2},2}]},\n {sort,1001,[{{sort,do,2},1001}]},\n {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}\n5> cprof:stop().\n12625\n```\n\nThe example shows some details of how `lists:sort/1` works. It used 6173\nfunction calls in module `m:lists` to complete the work.\n\nThis time, since the shell was not involved in starting and stopping `cprof`, no\nother work was done in the system during the profiling.","title":"Example: In the code - cprof - The Call Count Profiler","ref":"cprof_chapter.html#example-in-the-code"},{"type":"extras","doc":"\n# The Erlang mode for Emacs","title":"The Erlang mode for Emacs","ref":"erlang_mode_chapter.html"},{"type":"extras","doc":"The purpose of this user guide is to introduce you to the Erlang mode\nfor Emacs and gives some relevant background information of the\nfunctions and features. See also [Erlang mode reference\nmanual](../references/erlang.el.md) The purpose of the Erlang mode\nitself is to facilitate the developing process for the Erlang\nprogrammer.","title":"Purpose - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#purpose"},{"type":"extras","doc":"Basic knowledge of Emacs and Erlang/OTP.","title":"Pre-requisites - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#pre-requisites"},{"type":"extras","doc":"Two Elisp modules are included in this tool package for\nEmacs. `erlang.el` defines the actual Erlang mode and\n`erlang-start.el` makes some nice initializations.","title":"Elisp - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#elisp"},{"type":"extras","doc":"To set up the Erlang Emacs mode on a UNIX systems, edit or create the file `.emacs`\nin the your home directory.\n\nBelow is a complete example of what should be added to a user's `.emacs`\nprovided that OTP is installed in the directory `/usr/local/otp `:\n\n```text\n(setq load-path (cons \"/usr/local/otp/lib/tools- /emacs\"\nload-path))\n(setq erlang-root-dir \"/usr/local/otp\")\n(setq exec-path (cons \"/usr/local/otp/bin\" exec-path))\n(require 'erlang-start)\n```","title":"Setup on UNIX - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#setup-on-unix"},{"type":"extras","doc":"To set up the Erlang Emacs mode on a Windows systems, edit/create the file\n`.emacs`, the location of the file depends on the configuration of the system.\nIf the _HOME_ environment variable is set, Emacs will look for the `.emacs` file\nin the directory indicated by the `HOME` variable. If `HOME` is not set, Emacs\nwill look for the `.emacs` file in `C:\\ `.\n\nBelow is a complete example of what should be added to a user's `.emacs`\nprovided that OTP is installed in the directory `C:\\Program Files\\Erlang OTP`:\n\n```lisp\n(setq load-path (cons \"C:/Program Files/Erlang OTP/lib/tools- /emacs\"\nload-path))\n(setq erlang-root-dir \"C:/Program Files/Erlang OTP\")\n(setq exec-path (cons \"C:/Program Files/Erlang OTP/bin\" exec-path))\n(require 'erlang-start)\n```\n\n> #### Note {: .info }\n>\n> In `.emacs`, the slash character (`/`) can be used as path separator. But if you\n> decide to use the backslash character (`\\`), note that backslashes have to be\n> doubled, since they are treated as escape characters by Emacs.","title":"Setup on Windows - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#setup-on-windows"},{"type":"extras","doc":"The \"Oxford Advanced Learners Dictionary of Current English\" says the following\nabout the word \"indent\":\n\n> \"start (a line of print or writing) farther from the margin than the others\".\n\nThe Erlang mode does, of course, provide this feature. The layout used is based\non the common use of the language.\n\nIt is strongly recommended to use this feature and avoid to indent lines in a\nnonstandard way. Some motivations are:\n\n- Code using the same layout is easy to read and maintain.\n- Since several features of Erlang mode is based on the standard layout they\n might not work correctly if a nonstandard layout is used.\n\nThe indentation features can be used to reindent large sections of a file. If\nsome lines use nonstandard indentation they will be reindented.","title":"Indentation - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#indentation"},{"type":"extras","doc":"- _`M-x erlang-mode RET`_ \\- This command activates the Erlang major mode for\n the current buffer. When this mode is active the mode line contain the word\n \"Erlang\".\n\nWhen the Erlang mode is correctly installed, it is automatically activated when\na file ending in `.erl` or `.hrl` is opened in Emacs.\n\nWhen a file is saved the name in the `-module().` line is checked against the\nfile name. Should they mismatch Emacs can change the module specifier so that it\nmatches the file name. By default, the user is asked before the change is\nperformed.\n\nAn \"electric\" command is a character that in addition to just inserting the\ncharacter performs some type of action. For example the `;` character is typed\nin a situation where is ends a function clause a new function header is\ngenerated. The electric commands are as follows:\n\n- `erlang-electric-comma` \\- Insert a comma character and possibly a new\n indented line.\n- `erlang-electric-semicolon` \\- Insert a semicolon character and possibly a\n prototype for the next line.\n- `erlang-electric-gt` \\- Insert a `>` character and possible a new indented line.\n\nTo disable all electric commands set the variable `erlang-electric-commands` to\nthe empty list. In short, place the following line in your `.emacs`\\-file:\n\n```text\n(setq erlang-electric-commands '())\n```","title":"Editing - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#editing"},{"type":"extras","doc":"It is possible for Emacs to use colors when displaying a buffer. By \"syntax\nhighlighting\", we mean that syntactic components, for example keywords and\nfunction names, will be colored.\n\nThe basic idea of syntax highlighting is to make the structure of a program\nclearer. For example, the highlighting will make it easier to spot simple bugs.\nHave not you ever written a variable in lower-case only? With syntax\nhighlighting a variable will colored while atoms will be shown with the normal\ntext color.","title":"Syntax highlighting - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#syntax-highlighting"},{"type":"extras","doc":"Tags is a standard Emacs package used to record information about source files\nin large development projects. In addition to listing the files of a project, a\ntags file normally contains information about all functions and variables that\nare defined. By far, the most useful command of the tags system is its ability\nto find the definition of functions in any file in the project. But the Tags\nsystem is not limited to this feature, for example, it is possible to do a text\nsearch in all files in a project, or to perform a project-wide search and\nreplace.\n\nIn order to use the Tags system a file named `TAGS` must be created. The file\ncan be seen as a database over all functions, records, and macros in all files\nin the project. The `TAGS` file can be created using two different methods for\nErlang. The first is the standard Emacs utility \"etags\", the second is by using\nthe Erlang module `tags`.","title":"Tags - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#tags"},{"type":"extras","doc":"`etags` is a program that is part of the Emacs distribution. It is normally\nexecuted from a command line, like a Unix shell or a DOS box.\n\nThe `etags` program of fairly modern versions of Emacs and XEmacs has native\nsupport for Erlang. To check if your version does include this support, issue\nthe command `etags --help` at a the command line prompt. At the end of the help\ntext there is a list of supported languages. Unless Erlang is a member of this\nlist I suggest that you should upgrade to a newer version of Emacs.\n\nAs seen in the help text — unless you have not upgraded your Emacs yet — `etags`\nassociate the file extensions `.erl` and `.hrl` with Erlang.\n\nBasically, the `etags` utility is run using the following form:\n\n```bash\netags file1.erl file2.erl\n```\n\nThis will create a file named `TAGS` in the current directory.\n\nThe `etags` utility can also read a list of files from its standard input by\nsupplying a single dash in place of the file names. This feature is useful when\na project consists of a large number of files. The standard UNIX command `find`\ncan be used to generate the list of files, for example:\n\n```bash\nfind . -name \"*.[he]rl\" -print | etags -\n```\n\nThe above line will create a `TAGS` file covering all the Erlang source files in\nthe current directory, and in the subdirectories below.\n\nSee the GNU Emacs Manual and the etags man page for more info.","title":"Etags - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#etags"},{"type":"extras","doc":"The look and feel on an Erlang shell inside Emacs should be the same as in a\nnormal Erlang shell. There is just one major difference, the cursor keys will\nactually move the cursor around just like in any normal Emacs buffer. The\ncommand line history can be accessed by the following commands:\n\n- *`C-up `*or _`M-p `_(`comint-previous-input`) - Move to the previous line in\n the input history.\n- *`C-down `*or _`M-n `_(`comint-next-input`) - Move to the next line in the\n input history.\n\nIf the Erlang shell buffer would be killed the command line history is saved to\na file. The command line history is automatically retrieved when a new Erlang\nshell is started.","title":"Shell - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#shell"},{"type":"extras","doc":"The classic edit-compile-bugfix cycle for Erlang is to edit the source file in\nan editor, save it to a file and switch to an Erlang shell. In the shell the\ncompilation command is given. Should the compilation fail you have to bring out\nthe editor and locate the correct line.\n\nWith the Erlang editing mode the entire edit-compile-bugfix cycle can be\nperformed without leaving Emacs. Emacs can order Erlang to compile a file and it\ncan parse the error messages to automatically place the point on the erroneous\nlines.","title":"Compilation - The Erlang mode for Emacs","ref":"erlang_mode_chapter.html#compilation"},{"type":"extras","doc":"\n# fprof - The File Trace Profiler\n\n`m:fprof` is a profiling tool that can be used to get a picture of how much\nprocessing time different functions consumes and in which processes.\n\n`fprof` uses tracing with timestamps to collect profiling data. Therefore there\nis no need for special compilation of any module to be profiled.\n\n`fprof` presents wall clock times from the host machine OS, with the assumption\nthat OS scheduling will randomly load the profiled functions in a fair way. Both\n_own time_, that is, the time used by a function for its own execution, and\n_accumulated time_, that is, execution time including called functions.\n\nProfiling is essentially done in 3 steps:\n\n- Tracing to a file.\n\n- Profiling: the trace file is read and raw profile data is collected\n into an internal RAM storage on the node. During this step the trace data may\n be dumped in text format to file or console.\n\n- Analysing: the raw profile data is sorted and dumped in text format\n either to file or console.\n\nSince `fprof` stores trace data to a file, the runtime performance degradation is\nminimized, but still far from negligible, especially for programs that themselves\nuse the filesystem heavily. Where the trace file is placed is also important;\non Unix systems `/tmp` is usually a good choice, while any\nnetwork-mounted disk is a bad choice.\n\n`fprof` can also skip the file step and trace to a tracer process of its own that\ndoes the profiling in runtime.\n\nThe following sections show some examples of how to profile with `m:fprof`.","title":"fprof - The File Trace Profiler","ref":"fprof_chapter.html"},{"type":"extras","doc":"If you can edit and recompile the source code, it is convenient to\ninsert [`fprof:trace(start)`](`fprof:trace/1`) and\n[`fprof:trace(stop)`](`fprof:trace/1`) before and after the code to be profiled.\nAll spawned processes are also traced. If you want some other filename than\nthe default, use [`fprof:trace(start, \"my_fprof.trace\")`](`fprof:trace/2`).\n\nWhen execution is finished, the raw profile can be processed using\n[`fprof:profile()`](`fprof:profile/0`),\nor [`fprof:profile(file, \"my_fprof.trace\")`](`fprof:profile/2`)\nfor a non-default filename.\n\nFinally create an informative table dumped on the console with\n[`fprof:analyse()`](`fprof:analyse/0`), or on file with\n[`fprof:analyse(dest, [])`](`fprof:analyse/2`), or\n[`fprof:analyse([{dest, \"my_fprof.analysis\"}, {cols, 120}])`](`fprof:analyse/1`)\nfor a wider listing of a non-default filename.","title":"Profiling from the source code - fprof - The File Trace Profiler","ref":"fprof_chapter.html#profiling-from-the-source-code"},{"type":"extras","doc":"If you have one function that does the task that you want to profile, and the\nfunction returns when the profiling should stop, it is convenient to use\n[`fprof:apply(Module, Function, Args)`](`fprof:apply/3`) for the tracing step.\n\nIf the tracing should continue after the function has returned, for\nexample if it is a start function that spawns processes to be\nprofiled, use\n[`fprof:apply(M, F, Args, [continue | OtherOpts])`](`fprof:apply/4`).\nThe tracing has to be stopped at a suitable later time using\n[`fprof:trace(stop)`](`fprof:trace/1`).","title":"Profiling a function - fprof - The File Trace Profiler","ref":"fprof_chapter.html#profiling-a-function"},{"type":"extras","doc":"It is also possible to trace immediately into the profiling process that creates\nthe raw profile data, that is to short circuit the tracing and profiling steps\nso that the filesystem is not used for tracing.\n\nDo something like this:\n\n```erlang\n{ok, Tracer} = fprof:profile(start),\nfprof:trace([start, {tracer, Tracer}]),\n%% Run code to profile\nfprof:trace(stop);\n```\n\nThis puts less load on the filesystem, but much more load on the Erlang runtime\nsystem.","title":"Immediate profiling - fprof - The File Trace Profiler","ref":"fprof_chapter.html#immediate-profiling"},{"type":"extras","doc":"\n# lcnt - The Lock Profiler\n\nInternally in the Erlang runtime system locks are used to protect resources from\nbeing updated from multiple threads in a fatal way. Locks are necessary to\nensure that the runtime system works properly, but it also introduces\nlimitations, namely _lock contention_ and _locking overhead_.\n\nWith lock contention we mean when one thread locks a resource, and another\nthread (or threads) tries to acquire the same resource at the same time. The\nlock will deny the other thread access to the resource and the thread will be\nblocked from continuing its execution. The second thread has to wait until the\nfirst thread has completed its access to the resource and unlocked it. The\n`lcnt` tool measures these lock conflicts.\n\nLocks have an inherent cost in execution time and memory space. It takes time to\ninitialize, destroy, acquire, or release locks. To decrease lock contention\nit is sometimes necessary to use finer-grained locking strategies. This\nusually also increases the locking overhead. Hence there is a tradeoff between\nlock contention and overhead. In general, lock contention increases with the\nnumber of threads running concurrently.\n\nThe `lcnt` tool does not measure locking overhead.","title":"lcnt - The Lock Profiler","ref":"lcnt_chapter.html"},{"type":"extras","doc":"For investigation of locks in the emulator we use an internal tool called `lcnt`\n(short for lock-count). The VM needs to be compiled with this option enabled. To\ncompile a lock-counting VM along with a normal VM, use:\n\n```text\ncd $ERL_TOP\n./configure --enable-lock-counter\nmake\n```\n\nStart the lock-counting VM like this:\n\n```text\n$ERL_TOP/bin/erl -emu_type lcnt\n```\n\nTo verify that lock counting is enabled check that `[lock-counting]` appears in\nthe status text when the VM is started.\n\n```text\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n```","title":"Enabling lock-counting - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#enabling-lock-counting"},{"type":"extras","doc":"Once you have a lock counting enabled VM the module `lcnt` can be used. The\nmodule is intended to be used from the current running nodes shell. To access\nremote nodes use [`lcnt:clear(Node)`](`lcnt:clear/1`) and\n[`lcnt:collect(Node)`](`lcnt:collect/1`).\n\nAll locks are continuously monitored and its statistics updated. Use\n[`lcnt:clear/0`](`lcnt:clear/1`) to initially clear all counters\nbefore running any specific tests. This command will also reset the\ninternal duration timer.\n\nTo retrieve lock statistics information, use\n[`lcnt:collect/0,1`](`lcnt:collect/1`). The collect operation will\nstart a `lcnt` server if it not already started. All collected data\nwill be stored in an Erlang term and uploaded to the server along with\nthe duration time. The duration time is the time between\n[`lcnt:clear/0,1`](`lcnt:clear/1`) and\n[`lcnt:collect/0,1`](`lcnt:collect/1`).\n\nOnce the data is collected to the server it can be filtered, sorted, and printed\nin multiple ways.","title":"Getting started - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#getting-started"},{"type":"extras","doc":"Here is an example of running the [Big Bang Benchmark](#the-big-bang-benchmark):\n\n```text\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n\nEshell V15.0 (press Ctrl+G to abort, type help(). for help)\n1> lcnt:rt_opt({copy_save, true}).\nfalse\n2> lcnt:clear(), big:bang(1000), lcnt:collect().\nok\n3> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 590799 8875 1.5022 37906 2.2167\n proc_msgq 1048 2515180 4667 0.1856 20962 1.2258\n proc_main 1048 2195317 23775 1.0830 1664 0.0973\nok\n```\n\nAnother way to to profile a specific function is to use `lcnt:apply/3` or\n`lcnt:apply/1`, which calls `lcnt:clear/0` before calling the function and\n`lcnt:collect/0` after its invocation. This method should only be used in\nmicro-benchmarks since it sets `copy_save` to `true` for the duration of the\nfunction call, which may cause the emulator to run out of memory if attempted\nunder load.\n\n```text\n1> lcnt:apply(fun() -> big:bang(1000) end).\n1845411\n2> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 582789 9237 1.5850 41929 2.2633\n proc_msgq 1047 2494483 4731 0.1897 11173 0.6031\n proc_main 1047 2192806 23283 1.0618 1500 0.0810\nok\n```\n\nThe process locks are sorted after its class like all other locks. It is\nconvenient to look at specific processes and ports as classes. We can do this by\nswapping class and class identifiers with `lcnt:swap_pid_keys/0`.\n\n```text\n3> lcnt:swap_pid_keys().\nok\n4> lcnt:conflicts([{print, [name, tries, ratio, time]}]).\n lock #tries collisions [%] time [us]\n ----- ------- --------------- ----------\n run_queue 582789 1.5850 41929\n 5692 0.5095 484\n 4989 0.4410 393\n 6319 2.1839 284\n 6077 1.9747 198\n 5071 1.3015 192\n 5846 1.7106 186\n 6305 1.2054 179\n 5820 1.2715 176\n 6329 1.4852 168\n 5172 0.8701 167\n 5306 0.4146 166\n 5838 1.9870 160\n 6346 1.5443 143\n 5542 0.4331 141\n 5260 0.2662 137\n 5610 0.9447 127\n 5354 0.5230 118\n 5845 0.9239 115\n 5140 0.7782 108\nok\n```","title":"Example of usage - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#example-of-usage"},{"type":"extras","doc":"From the Erlang shell:\n\n```erlang\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n\nEshell V15.0 (press Ctrl+G to abort, type help(). for help)\n1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},\n {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},\n {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.\nok\n2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).\n .\n .\n .\nignore\n```\n\nInitial configuring of the benchmark is done. It is time to profile the actual\nMnesia benchmark:\n\n```erlang\n3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,\n true}|Conf]), Tps/60 end).\n .\n .\n .\n50204.666666666664\n```\n\nThe benchmark runs for 60 seconds (followed by verification and\nanalysis), and then returns the number of transactions per seconds.\n\n```text\n4> lcnt:swap_pid_keys().\nok\n5> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 89329288 3227515 3.6131 5018119 8.3606\n mnesia_locker 5 64793236 8231226 12.7038 98654 0.1644\n db_tab 3012324 416847817 140631 0.0337 75308 0.1255\n 5 14499900 36934 0.2547 4878 0.0081\n 5 14157504 35797 0.2528 4727 0.0079\n 5 14194934 34510 0.2431 4403 0.0073\n 5 14149447 35326 0.2497 4150 0.0069\n 5 14316525 35675 0.2492 4116 0.0069\n 5 14241146 35358 0.2483 4101 0.0068\n 5 14224491 35182 0.2473 4094 0.0068\n 5 14190075 35328 0.2490 4075 0.0068\n 5 14308906 35031 0.2448 3896 0.0065\n 5 14457330 36182 0.2503 3856 0.0064\n mnesia_tm 5 28149333 179294 0.6369 1057 0.0018\n pix_lock 1024 132 1 0.7576 549 0.0009\n 5 17 2 11.7647 87 0.0001\n 5 1335 6 0.4494 1 0.0000\nok\n```\n\nThe `id` header represents the number of unique identifiers under a\nclass when the option `{combine, true}` is used (which is enabled by\ndefault). It will otherwise show the specific identifier. The `db_tab`\nlisting shows 3,012,324 unique locks, which is one for each ETS table\ncreated. Mnesia creates one ETS table for each transaction.\n\nThe listing shows also shows that the `mnesia_locker` process has highly contended locks.\nUsing `lcnt:inspect/1` more information can be displayed for that process:\n\n```text\n6> lcnt:inspect(mnesia_locker).\n lock id #tries #collisions collisions [%] time [us] duration [%] histogram [log2(us)]\n ----- --- ------- ------------ --------------- ---------- ------------- ---------------------\n mnesia_locker proc_main 19853372 7591248 38.2366 80550 0.1342 |. ...X........ |\n mnesia_locker proc_msgq 30917225 639627 2.0688 17126 0.0285 |. .X......... |\n mnesia_locker proc_status 9348426 351 0.0038 978 0.0016 | .xxX. . |\n mnesia_locker proc_btm 0 0 0.0000 0 0.0000 | |\n mnesia_locker proc_trace 4674213 0 0.0000 0 0.0000 | |\nok\n```\n\nListing the conflicts without class combiner:\n\n```text\n7> lcnt:conflicts([{combine, false}, {print, [name, id, tries, ratio, time]}]).\n lock id #tries collisions [%] time [us]\n ----- --- ------- --------------- ----------\n run_queue 2 31075249 3.5676 1728233\n run_queue 1 29738521 3.6348 1683219\n run_queue 3 27912150 3.6429 1573593\n mnesia_locker proc_main 19853372 38.2366 80550\n db_tab mnesia_transient_decision 3012281 2.5675 55104\n run_queue 4 512077 3.7041 29486\n mnesia_locker proc_msgq 30917225 2.0688 17126\n db_tab account 6044562 0.3599 7909\n db_tab branch 6026659 0.3132 5654\n db_tab teller 6044659 0.2684 4727\n proc_main 3207155 0.7178 3726\n proc_main 3138532 0.7485 3593\n proc_main 3133180 0.7156 3547\n proc_main 3165128 0.7609 3517\n proc_main 3128838 0.7525 3477\n proc_main 3137627 0.7559 3433\n proc_main 3144886 0.7509 3425\n proc_main 3149315 0.7487 3372\n proc_main 3196546 0.7591 3310\n proc_main 3164333 0.7483 3309\nok\n```\n\nIn this scenario the locks for the scheduler's run queues dominate the time waiting\nfor locks. The most contended lock for ETS tables is for the `mnesia_transient_decision`\nETS table.\n\nHere is how to show the information for the ETS tables.\n\n```text\n8> lcnt:inspect(db_tab, [{print, [name, id, tries, colls, ratio, duration]}]).\n lock id #tries #collisions collisions [%] duration [%]\n ----- --- ------- ------------ --------------- -------------\n db_tab mnesia_transient_decision 3012281 77341 2.5675 0.0918\n db_tab account 6044562 21753 0.3599 0.0132\n db_tab branch 6026659 18873 0.3132 0.0094\n db_tab teller 6044659 16221 0.2684 0.0079\n db_tab history 3012281 4005 0.1330 0.0022\n db_tab mnesia_stats 3071064 2437 0.0794 0.0010\n db_tab mnesia_trans_store 15 0 0.0000 0.0000\n db_tab mnesia_decision 3012281 0 0.0000 0.0000\n db_tab schema 0 0 0.0000 0.0000\n db_tab dets 0 0 0.0000 0.0000\n db_tab dets_owners 0 0 0.0000 0.0000\n db_tab dets_registry 0 0 0.0000 0.0000\n db_tab mnesia_lock_queue 36154974 0 0.0000 0.0000\n db_tab mnesia_sticky_locks 12108098 0 0.0000 0.0000\n db_tab mnesia_tid_locks 27176721 0 0.0000 0.0000\n db_tab mnesia_held_locks 48321870 0 0.0000 0.0000\n db_tab mnesia_subscr 0 0 0.0000 0.0000\n db_tab mnesia_gvar 102680683 1 0.0000 0.0000\n db_tab user_functions 0 0 0.0000 0.0000\n db_tab shell_records 0 0 0.0000 0.0000\nok\n```","title":"Example with Mnesia Transaction Benchmark - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#example-with-mnesia-transaction-benchmark"},{"type":"extras","doc":"Typically high `time` values are bad and this is often the thing to look for.\nHowever, one should also look for high lock acquisition frequencies (`#tries`)\nsince locks generate overhead and because high frequency could become\nproblematic if they begin to have conflicts even if it is not shown in a\nparticular test.","title":"Deciphering the output - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#deciphering-the-output"},{"type":"extras","doc":"```erlang\n-module(big).\n-export([bang/1]).\n\npinger([], [], true) ->\n receive\n\t{procs, Procs, ReportTo} ->\n\t pinger(Procs, [], ReportTo)\n end;\npinger([], [], false) ->\n receive {ping, From} -> From ! {pong, self()} end,\n pinger([],[],false);\npinger([], [], ReportTo) ->\n ReportTo ! {done, self()},\n pinger([],[],false);\npinger([], [Po|Pos] = Pongers, ReportTo) ->\n receive\n\t{ping, From} ->\n\t From ! {pong, self()},\n\t pinger([], Pongers, ReportTo);\n\t{pong, Po} ->\n\t pinger([], Pos, ReportTo)\n end;\npinger([Pi|Pis], Pongers, ReportTo) ->\n receive {ping, From} -> From ! {pong, self()}\n after 0 -> ok\n end,\n Pi ! {ping, self()},\n pinger(Pis, [Pi|Pongers], ReportTo).\n\nspawn_procs(N) when N =< 0 ->\n [];\nspawn_procs(N) ->\n [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].\n\nsend_procs([], Msg) ->\n Msg;\nsend_procs([P|Ps], Msg) ->\n P ! Msg,\n send_procs(Ps, Msg).\n\nreceive_msgs([]) ->\n ok;\nreceive_msgs([M|Ms]) ->\n receive\n\tM ->\n\t receive_msgs(Ms)\n end.\n\nbang(N) when integer(N) ->\n Procs = spawn_procs(N),\n RMsgs = lists:map(fun (P) -> {done, P} end, Procs),\n Start = now(),\n send_procs(Procs, {procs, Procs, self()}),\n receive_msgs(RMsgs),\n Stop = now(),\n lists:foreach(fun (P) -> exit(P, normal) end, Procs),\n timer:now_diff(Stop, Start).\n```","title":"The Big Bang Benchmark - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#the-big-bang-benchmark"},{"type":"extras","doc":"[LCNT Reference Manual](`m:lcnt`)","title":"See Also - lcnt - The Lock Profiler","ref":"lcnt_chapter.html#see-also"},{"type":"extras","doc":"\n# Xref - The Cross Reference Tool\n\nXref is a cross reference tool that can be used for finding dependencies between\nfunctions, modules, applications and releases. It does so by analyzing the\ndefined functions and the function calls.\n\nIn order to make Xref easy to use, there are predefined analyses that perform\nsome common tasks. Typically, a module or a release can be checked for calls to\nundefined functions. For the somewhat more advanced user there is a small but\nflexible language that can be used for selecting parts of the analyzed\nsystem and for doing some simple graph analyses on selected calls.\n\nThe following sections show some features of Xref, beginning with a module check\nand a predefined analysis. Then follow examples that can be skipped on the first\nreading; not all of the concepts used are explained, and it is assumed that the\n[reference manual](`m:xref`) has been at least skimmed.","title":"Xref - The Cross Reference Tool","ref":"xref_chapter.html"},{"type":"extras","doc":"Assume we want to check the following module:\n\n```erlang\n-module(my_module).\n\n-export([t/1]).\n\nt(A) ->\n my_module:t2(A).\n\nt2(_) ->\n true.\n```\n\nCross reference data are read from BEAM files, so the first step when checking\nan edited module is to compile it:\n\n```erlang\n1> c(my_module, debug_info).\n./my_module.erl:10: Warning: function t2/1 is unused\n{ok, my_module}\n```\n\nThe `debug_info` option ensures that the BEAM file contains debug information,\nwhich makes it possible to find unused local functions.\n\nThe module can now be checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions:\n\n```erlang\n2> xref:m(my_module)\n[{deprecated,[]},\n {undefined,[{{my_module,t,1},{my_module,t2,1}}]},\n {unused,[{my_module,t2,1}]}]\n```\n\n`m/1` is also suitable for checking that the BEAM file of a module that is about\nto be loaded into a running a system does not call any undefined functions. In\neither case, the code path of the code server (see the module `code`) is used\nfor finding modules that export externally called functions not exported by the\nchecked module itself, so called [library modules](`m:xref#library_module`).","title":"Module Check - Xref - The Cross Reference Tool","ref":"xref_chapter.html#module-check"},{"type":"extras","doc":"In the last example the module to analyze was given as an argument to `m/1`, and\nthe code path was (implicitly) used as [library path](`m:xref#library_path`). In\nthis example an [xref server](`m:xref#xref_server`) will be used, which makes it\npossible to analyze applications and releases, and also to select the library\npath explicitly.\n\nEach Xref server is referred to by a unique name. The name is given when\ncreating the server:\n\n```erlang\n1> xref:start(s).\n{ok,<0.27.0>}\n```\n\nNext the system to be analyzed is added to the Xref server. Here the system will\nbe OTP, so no library path will be needed. Otherwise, when analyzing a system\nthat uses OTP, the OTP modules are typically made library modules by setting the\nlibrary path to the default OTP code path (or to `code_path`, see the\n[reference manual](`m:xref#code_path`)). By default, the names of read BEAM\nfiles and warnings are output when adding analyzed modules, but these messages\ncan be avoided by setting default values of some options:\n\n```erlang\n2> xref:set_default(s, [{verbose,false}, {warnings,false}]).\nok\n3> xref:add_release(s, code:lib_dir(), {name, otp}).\n{ok,otp}\n```\n\n`add_release/3` assumes that all subdirectories of the library directory\nreturned by [`code:lib_dir()`](`code:lib_dir/0`) contain applications;\nthe effect is that of reading all BEAM files for the application.\n\nIt is now easy to check the release for calls to undefined functions:\n\n```erlang\n4> xref:analyze(s, undefined_function_calls).\n{ok, [...]}\n```\n\nWe can now continue with further analyses, or we can delete the Xref server:\n\n```erlang\n5> xref:stop(s).\n```\n\nThe check for calls to undefined functions is an example of a predefined\nanalysis, probably the most useful one. Other examples are the analyses that\nfind unused local functions, or functions that call some given functions. See\nthe [analyze/2,3](`m:xref#analyze`) functions for a complete list of predefined\nanalyses.\n\nEach predefined analysis is a shorthand for a [query](`m:xref#query`), a\nsentence of a tiny language providing cross reference data as values of\n[predefined variables](`m:xref#predefined_variable`). The check for calls to\nundefined functions can thus be stated as a query:\n\n```erlang\n4> xref:q(s, \"(XC - UC) || (XU - X - B)\").\n{ok,[...]}\n```\n\nThe query asks for the restriction of external calls except the unresolved calls\nto calls to functions that are externally used but neither exported nor built-in\nfunctions (the `||` operator restricts the used functions while the `|` operator\nrestricts the calling functions). The `-` operator returns the difference of two\nsets, and the `+` operator to be used below returns the union of two sets.\n\nThe relationships between the predefined variables `XU`, `X`, `B` and a few\nothers are worth elaborating upon. The reference manual mentions two ways of\nexpressing the set of all functions, one that focuses on how they are defined:\n`X + L + B + U`, and one that focuses on how they are used: `UU + LU + XU`. The\nreference also mentions some [facts](`m:xref#simple_facts`) about the variables:\n\n- `F` is equal to `L + X` (the defined functions are the local functions and the\n external functions);\n- `U` is a subset of `XU` (the unknown functions are a subset of the externally\n used functions since the compiler ensures that locally used functions are\n defined);\n- `B` is a subset of `XU` (calls to built-in functions are always external by\n definition, and unused built-in functions are ignored);\n- `LU` is a subset of `F` (the locally used functions are either local functions\n or exported functions, again ensured by the compiler);\n- `UU` is equal to `F - (XU + LU)` (the unused functions are defined functions\n that are neither used externally nor locally);\n- `UU` is a subset of `F` (the unused functions are defined in analyzed\n modules).\n\nUsing these facts, the two small circles in the picture below can be combined.\n\n![Definition and use of functions](assets/venn1.gif \"Definition and use of functions\")\n\nIt is often clarifying to mark the variables of a query in such a circle. This\nis illustrated in the picture below for some of the predefined analyses. Note\nthat local functions used by local functions only are not marked in the\n`locals_not_used` circle.[](){: #venn2 }\n\n![Some predefined analyses as subsets of all functions](assets/venn2.gif \"Some predefined analyses as subsets of all functions\")","title":"Predefined Analysis - Xref - The Cross Reference Tool","ref":"xref_chapter.html#predefined-analysis"},{"type":"extras","doc":"The module check and the predefined analyses are useful, but limited. Sometimes\nmore flexibility is needed, for instance one might not need to apply a graph\nanalysis on all calls, but some subset will do equally well. That flexibility is\nprovided with a simple language. Below are some expressions of the language with\ncomments, focusing on elements of the language rather than providing useful\nexamples. The analyzed system is assumed to be OTP, so in order to run the\nqueries, first evaluate these calls:\n\n```erlang\nxref:start(s).\nxref:add_release(s, code:root_dir()).\n```\n\n- **`xref:q(s, \"(Fun) xref : Mod\").`** - All functions of the `xref` module.\n\n- **`xref:q(s, \"xref : Mod * X\").`** - All exported functions of the `xref`\n module. The first operand of the intersection operator `*` is implicitly\n converted to the more special type of the second operand.\n\n- **`xref:q(s, \"(Mod) tools\").`** - All modules of the Tools application.\n\n- **`xref:q(s, '\"xref_.*\" : Mod').`** - All modules with a name beginning with\n `xref_`.\n\n- **`xref:q(s, \"# E | X \").`** - Number of calls from exported functions.\n\n- **`xref:q(s, \"XC || L \").`** - All external calls to local functions.\n\n- **`xref:q(s, \"XC * LC\").`** - All calls that have both an external and a local\n version.\n\n- **`xref:q(s, \"(LLin) (LC * XC)\").`** - The lines where the local calls of the\n last example are made.\n\n- **`xref:q(s, \"(XLin) (LC * XC)\").`** - The lines where the external calls of\n the example before last are made.\n\n- **`xref:q(s, \"XC * (ME - strict ME)\").`** - External calls within some module.\n\n- **`xref:q(s, \"E ||| kernel\").`** - All calls within the Kernel application.\n\n- **`xref:q(s, \"closure E | kernel || kernel\").`** - All direct and indirect\n calls within the Kernel application. Both the calling and the used functions\n of indirect calls are defined in modules of the kernel application, but it is\n possible that some functions outside the kernel application are used by\n indirect calls.\n\n- **`xref:q(s, \"{toolbar,debugger}:Mod of ME\").`** - A chain of module calls\n from `toolbar` to `debugger`, if there is such a chain, otherwise `false`. The\n chain of calls is represented by a list of modules, `toolbar` being the first\n element and `debugger`the last element.\n\n- **`xref:q(s, \"closure E | toolbar:Mod || debugger:Mod\").`** - All (in)direct\n calls from functions in `toolbar` to functions in `debugger`.\n\n- **`xref:q(s, \"(Fun) xref -> xref_base\").`** - All function calls from `xref`\n to `xref_base`.\n\n- **`xref:q(s, \"E * xref -> xref_base\").`** - Same interpretation as last\n expression.\n\n- **`xref:q(s, \"E || xref_base | xref\").`** - Same interpretation as last\n expression.\n\n- **`xref:q(s, \"E * [xref -> lists, xref_base -> digraph]\").`** - All function\n calls from `xref` to `lists`, and all function calls from `xref_base` to\n `digraph`.\n\n- **`xref:q(s, \"E | [xref, xref_base] || [lists, digraph]\").`** - All function\n calls from `xref` and `xref_base` to `lists` and `digraph`.\n\n- **`xref:q(s, \"components EE\").`** - All strongly connected components of the\n Inter Call Graph. Each component is a set of exported or unused local\n functions that call each other (in)directly.\n\n- **`xref:q(s, \"X * digraph * range (closure (E | digraph) | (L * digraph))\").`** -\n All exported functions of the `digraph` module used (in)directly by some\n function in `digraph`.\n\n- **`xref:q(s, \"L * yeccparser:Mod - range (closure (E |`**\n\n- **`yeccparser:Mod) | (X * yeccparser:Mod))\").`** - The interpretation is left\n as an exercise.","title":"Expressions - Xref - The Cross Reference Tool","ref":"xref_chapter.html#expressions"},{"type":"extras","doc":"The list [representation of graphs](`m:xref#representation`) is used analyzing\ndirect calls, while the `digraph` representation is suited for analyzing\nindirect calls. The restriction operators (`|`, `||` and `|||`) are the only\noperators that accept both representations. This means that in order to analyze\nindirect calls using restriction, the `closure` operator (which creates the\n`digraph` representation of graphs) has to be explicitly applied.\n\nAs an example of analyzing indirect calls, the following Erlang function tries\nto answer the question: if we want to know which modules are used indirectly by\nsome module(s), is it worth while using the\n[function graph](`m:xref#call_graph`) rather than the module graph? Recall that\na module M1 is said to call a module M2 if there is some function in M1 that\ncalls some function in M2. It would be nice if we could use the much smaller\nmodule graph, since it is available also in the light weight\n`modules`[mode](`m:xref#mode`) of Xref servers.\n\n```erlang\nt(S) ->\n {ok, _} = xref:q(S, \"Eplus := closure E\"),\n {ok, Ms} = xref:q(S, \"AM\"),\n Fun = fun(M, N) ->\n Q = io_lib:format(\"# (Mod) (Eplus | ~p : Mod)\", [M]),\n {ok, N0} = xref:q(S, lists:flatten(Q)),\n N + N0\n end,\n Sum = lists:foldl(Fun, 0, Ms),\n ok = xref:forget(S, 'Eplus'),\n {ok, Tot} = xref:q(S, \"# (closure ME | AM)\"),\n 100 * ((Tot - Sum) / Tot).\n```\n\nComments on the code:\n\n- We want to find the reduction of the closure of the function graph to modules.\n The direct expression for doing that would be `(Mod) (closure E | AM)`, but\n then we would have to represent all of the transitive closure of E in memory.\n Instead the number of indirectly used modules is found for each analyzed\n module, and the sum over all modules is calculated.\n- A user variable is employed for holding the `digraph` representation of the\n function graph for use in many queries. The reason is efficiency. As opposed\n to the `=` operator, the `:=` operator saves a value for subsequent analyses.\n Here might be the place to note that equal subexpressions within a query are\n evaluated only once; `=` cannot be used for speeding things up.\n- `Eplus | ~p : Mod`. The `|` operator converts the second operand to the type\n of the first operand. In this case the module is converted to all functions of\n the module. It is necessary to assign a type to the module (`: Mod`),\n otherwise modules like `kernel` would be converted to all functions of the\n application with the same name; the most general constant is used in cases of\n ambiguity.\n- Since we are only interested in a ratio, the unary operator `#` that counts\n the elements of the operand is used. It cannot be applied to the `digraph`\n representation of graphs.\n- We could find the size of the closure of the module graph with a loop similar\n to one used for the function graph, but since the module graph is so much\n smaller, a more direct method is feasible.\n\nWhen the Erlang function `t/1` was applied to an Xref server loaded with the\ncurrent version of OTP, the returned value was close to 84 (percent). This means\nthat the number of indirectly used modules is approximately six times greater\nwhen using the module graph. So the answer to the above stated question is that\nit is definitely worth while using the function graph for this particular\nanalysis. Finally, note that in the presence of unresolved calls, the graphs may\nbe incomplete, which means that there may be indirectly used modules that do not\nshow up.","title":"Graph Analysis - Xref - The Cross Reference Tool","ref":"xref_chapter.html#graph-analysis"},{"type":"extras","doc":"# Erlang mode for Emacs\n\nPossibly the most important feature of an editor designed for programmers is the\nability to indent a line of code in accordance with the structure of the\nprogramming language. The Erlang mode does, of course, provide this feature. The\nlayout used is based on the common use of the language. The mode also provides\nthings as syntax highlighting, electric commands, module name verification,\ncomment support including paragraph filling, skeletons, tags support etc.\n\nIn the following descriptions the use of the word _Point_ means: \"Point can be\nseen as the position of the cursor. More precisely, the point is the position\nbetween two characters while the cursor is drawn over the character following\nthe point\".","title":"Erlang mode for Emacs","ref":"erlang-el.html"},{"type":"extras","doc":"The following command are directly available for indentation.\n\n- _`TAB`_ (`erlang-indent-command`) - Indents the current line of code.\n- _`M-C-\\`_ (`indent-region`) - Indents all lines in the region.\n- _`M-l`_ (`indent-for-comment`) - Insert a comment character to the right of\n the code on the line (if any).\n\nLines containing comment are indented differently depending on the number of\n%-characters used:\n\n- Lines with one %-character is indented to the right of the code. The column\n is specified by the variable `comment-column`, by default column 48 is used.\n- Lines with two %-characters will be indented to the same depth as code would\n have been in the same situation.\n- Lines with three of more %-characters are indented to the left margin.\n- _`C-c C-q`_ (`erlang-indent-function`) - Indents the current Erlang\n function.\n- _`M-x erlang-indent-clause RET`_ - Indent the current Erlang clause.\n- _`M-x erlang-indent-current-buffer RET`_ - Indent the entire buffer.","title":"Indent - Erlang mode for Emacs","ref":"erlang-el.html#indent"},{"type":"extras","doc":"When editing normal text in text mode you can let Emacs reformat the text by the\n`fill-paragraph` command. This command will not work for comments since it will\ntreat the comment characters as words. The Erlang editing mode provides a\ncommand that knows about the Erlang comment structure and can be used to fill\ntext paragraphs in comments. Ex:\n\n```erlang\n%% This is just a very simple test to show\n%% how the Erlang fill\n%% paragraph command works.\n```\n\nClearly, the text is badly formatted. Instead of formatting this paragraph line\nby line, let's try `erlang-fill-paragraph` by pressing _`M-q`_. The result is:\n\n```erlang\n%% This is just a very simple test to show how the Erlang fill\n%% paragraph command works.\n```","title":"Edit - Fill Comment - Erlang mode for Emacs","ref":"erlang-el.html#edit-fill-comment"},{"type":"extras","doc":"_`C-c C-c`_ will put comment characters at the beginning of all lines in a\nmarked region. If you want to have two comment characters instead of one you can\ndo _`C-u 2 C-c C-c`_\n\n_`C-c C-u`_ will undo a comment-region command.","title":"Edit - Comment/Uncomment Region - Erlang mode for Emacs","ref":"erlang-el.html#edit-comment-uncomment-region"},{"type":"extras","doc":"- _`M-C-a`_ (`erlang-beginning-of-function`) - Move the point to the beginning\n of the current or preceding Erlang function. With an numeric argument (ex\n _`C-u 2 M-C-a`_) the function skips backwards over this many Erlang\n functions. Should the argument be negative the point is moved to the\n beginning of a function below the current function.\n- _`C-c M-a`_ (`erlang-beginning-of-clause`) - As above but move point to the\n beginning of the current or preceding Erlang clause.\n- _`M-C-e`_ (`erlang-end-of-function`) - Move to the end of the current or\n following Erlang function. With an numeric argument (ex _`C-u 2 M-C-e`_) the\n function skips backwards over this many Erlang functions. Should the\n argument be negative the point is moved to the end of a function below the\n current function.\n- _`C-c M-e`_ (`erlang-end-of-clause`) - As above but move point to the end of\n the current or following Erlang clause.","title":"Edit - Moving the point - Erlang mode for Emacs","ref":"erlang-el.html#edit-moving-the-point"},{"type":"extras","doc":"- _`M-C-h`_ (`erlang-mark-function`) - Put the region around the current\n Erlang function. The point is placed in the beginning and the mark at the\n end of the function.\n- _`C-c M-h`_ (`erlang-mark-clause`) Put the region around the current Erlang\n clause. The point is placed in the beginning and the mark at the end of the\n function.","title":"Edit - Marking - Erlang mode for Emacs","ref":"erlang-el.html#edit-marking"},{"type":"extras","doc":"- _`C-c C-j`_ (`erlang-generate-new-clause`) - Create a new clause in the\n current Erlang function. The point is placed between the parentheses of the\n argument list.\n- _`C-c C-y`_ (`erlang-clone-arguments`) - Copy the function arguments of the\n preceding Erlang clause. This command is useful when defining a new clause\n with almost the same argument as the preceding.","title":"Edit - Function Header Commands - Erlang mode for Emacs","ref":"erlang-el.html#edit-function-header-commands"},{"type":"extras","doc":"- _`C-c C-a`_ (`align-current`) - aligns comments, arrows, assignments,\n and type annotations around the cursor.\n\n```erlang\nExample:\n\nsum(L) -> sum(L, 0).\nsum([H|T], Sum) -> sum(T, Sum + H); % recurse\nsum([], Sum) -> Sum. % base case\n\n-record { two :: int(), % hello\n three = hello :: string(), % there\n four = 42 :: int() }.\n\nbecomes:\n\nsum(L) -> sum(L, 0).\nsum([H|T], Sum) -> sum(T, Sum + H); % recurse\nsum([], Sum) -> Sum. % base case\n\n-record { two :: int(), % hello\n three = hello :: string(), % there\n four = 42 :: int() }.\n```","title":"Edit - Alignment - Erlang mode for Emacs","ref":"erlang-el.html#edit-alignment"},{"type":"extras","doc":"The syntax highlighting can be activated from the Erlang menu. There are four\ndifferent alternatives:\n\n- Off: Normal black and white display.\n- Level 1: Function headers, reserved words, comments, strings, quoted atoms,\n and character constants will be colored.\n- Level 2: The above, attributes, Erlang bif:s, guards, and words in comments\n enclosed in single quotes will be colored.\n- Level 3: The above, variables, records, and macros will be colored. (This\n level is also known as the Christmas tree level.)","title":"Syntax highlighting - Erlang mode for Emacs","ref":"erlang-el.html#syntax-highlighting"},{"type":"extras","doc":"For the tag commands to work it requires that you have generated a tag file. See\n[Erlang mode users guide](erlang_mode_chapter.md#tags)\n\n- _`M-.`_ (`find-tag`) - Find a function definition. The default value is the\n function name under the point.\n- Find Tag (`erlang-find-tag`) - Like the Elisp-function\n `find-tag'. Capable of retrieving Erlang modules. Tags can be given on the forms `tag',\n `module:', `module:tag'.\n- _`M-+`_ (`erlang-find-next-tag`) - Find the next occurrence of tag.\n- _`M-TAB`_ (`erlang-complete-tag`) - Perform completion on the tag entered in\n a tag search. Completes to the set of names listed in the current tags\n table.\n- Tags aprops (`tags-apropos`) - Display list of all tags in tags table REGEXP\n matches.\n- _`C-x t s`_ (`tags-search`) - Search through all files listed in tags table\n for match for REGEXP. Stops when a match is found.","title":"Tags - Erlang mode for Emacs","ref":"erlang-el.html#tags"},{"type":"extras","doc":"A skeleton is a piece of pre-written code that can be inserted into the buffer.\nErlang mode comes with a set of predefined skeletons. The skeletons can be\naccessed either from the Erlang menu of from commands named\n`tempo-template-erlang-*`, as the skeletons is defined using the standard Emacs\npackage \"tempo\". Here follows a brief description of the available skeletons:\n\n- Simple skeletons: If, Case, Receive, Receive After, Receive Loop - Basic\n code constructs.\n- Header elements: Module, Author - These commands insert lines on the form\n `-module('xxx').` and `-author('my@home').`. They can be used directly, but\n are also used as part of the full headers described below.\n- Full Headers: Small (minimum requirement), Medium (with fields for basic\n information about the module), and Large Header (medium header with some\n extra layout structure).\n- Small Server - skeleton for a simple server not using OTP.\n- Application - skeletons for the OTP application behavior\n- Supervisor - skeleton for the OTP supervisor behavior\n- Supervisor Bridge - skeleton for the OTP supervisor bridge behavior\n- gen_server - skeleton for the OTP gen_server behavior\n- gen_event - skeleton for the OTP gen_event behavior\n- gen_fsm - skeleton for the OTP gen_fsm behavior\n- gen_statem (StateName/3) - skeleton for the OTP gen_statem behavior using\n state name functions\n- gen_statem (handle_event/4) - skeleton for the OTP gen_statem behavior using\n one state function\n- Library module - skeleton for a module that does not implement a process.\n- Corba callback - skeleton for a Corba callback module.\n- Erlang test suite - skeleton for a callback module for the erlang test\n server.","title":"Skeletons - Erlang mode for Emacs","ref":"erlang-el.html#skeletons"},{"type":"extras","doc":"- New shell (`erlang-shell`) - Starts a new Erlang shell.\n- _`C-c C-z,`_ (`erlang-shell-display `) - Displays an Erlang shell, or starts\n a new one if there is no shell started.","title":"Shell - Erlang mode for Emacs","ref":"erlang-el.html#shell"},{"type":"extras","doc":"- _`C-c C-k,`_ (`erlang-compile`) - Compiles the Erlang module in the current\n buffer. You can also use _`C-u C-c C-k`_ to debug compile the module with\n the debug options `debug_info` and `export_all`.\n- _`C-c C-l,`_ (`erlang-compile-display`) - Display compilation output.\n- _``C-u C-x` ``_ Start parsing the compiler output from the beginning. This\n command will place the point on the line where the first error was found.\n- _`` C-x` ``_ (`erlang-next-error`) - Move the point on to the next error.\n The buffer displaying the compilation errors will be updated so that the\n current error will be visible.","title":"Compile - Erlang mode for Emacs","ref":"erlang-el.html#compile"},{"type":"extras","doc":"On unix you can view the manual pages in emacs. In order to find the manual\npages, the variable `erlang-root-dir` should be bound to the name of the\ndirectory containing the Erlang installation. The name should not include the\nfinal slash. Practically, you should add a line on the following form to your\n~/.emacs,\n\n```text\n(setq erlang-root-dir \"/the/erlang/root/dir/goes/here\")\n```","title":"Man - Erlang mode for Emacs","ref":"erlang-el.html#man"},{"type":"extras","doc":"- _`M-x imenu-add-to-menubar RET`_ - This command will create the IMenu menu\n containing all the functions in the current buffer.The command will ask you\n for a suitable name for the menu. Not supported by Xemacs.","title":"Starting IMenu - Erlang mode for Emacs","ref":"erlang-el.html#starting-imenu"},{"type":"extras","doc":"- _`M-x erlang-version RET`_ - This command displays the version number of the\n Erlang editing mode. Remember to always supply the version number when\n asking questions about the Erlang mode.","title":"Version - Erlang mode for Emacs","ref":"erlang-el.html#version"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/tools-4.0/doc/html/dist/search_data-8780CEA5.js b/prs/8803/lib/tools-4.0/doc/html/dist/search_data-8780CEA5.js deleted file mode 100644 index 05eea50e9b454..0000000000000 --- a/prs/8803/lib/tools-4.0/doc/html/dist/search_data-8780CEA5.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"cover","doc":"A Coverage Analysis Tool for Erlang\n\nThe module `cover` provides a set of functions for coverage analysis\nof Erlang programs, counting how many times each _executable line_ of\ncode is executed when a program is run. Executable lines are\nlines in the body of a clause in a function, `case`,\n`receive`, or `try`. Lines in clause heads, blank lines, and lines\ncontaining only comments are not executable.\n\nCoverage analysis can be used to verify that test cases covers all\nrelevant line in the code being test. It can also be helpful when\nlooking for bottlenecks in the code.\n\nBefore any analysis can take place, the involved modules has to be\n_cover-compiled_. This means that some extra information is added to\nthe module before it is compiled into a binary which then is\nloaded. The source file of the module is not affected and no `.beam`\nfile is created. If the runtime system supports coverage natively,\nCover will automatically use that functionality to lower the execution\noverhead for cover-compiled code.\n\n> #### Change {: .info }\n>\n> Native coverage support was added in Erlang/OTP 27.\n\nEach time a function in a cover-compiled module is called, information about the\ncall is added to an internal database of Cover. The coverage analysis is\nperformed by examining the contents of the Cover database. The output `Answer`\nis determined by two parameters: `Level` and `Analysis`.\n\n- `Level = module`\n\n `Answer = {Module,Value}`, where `Module` is the module name.\n\n- `Level = function`\n\n `Answer = [{Function,Value}]`, one tuple for each function in the module. A\n function is specified by its module name `M`, function name `F` and arity `A`\n as a tuple `{M,F,A}`.\n\n- `Level = clause`\n\n `Answer = [{Clause,Value}]`, one tuple for each clause in the module. A clause\n is specified by its module name `M`, function name `F`, arity `A` and position\n in the function definition `C` as a tuple `{M,F,A,C}`.\n\n- `Level = line`\n\n `Answer = [{Line,Value}]`, one tuple for each executable line in the module. A\n line is specified by its module name `M` and line number in the source file\n `N` as a tuple `{M,N}`.\n\n- `Analysis = coverage`\n\n `Value = {Cov,NotCov}` where `Cov` is the number of executable lines in the\n module, function, clause or line that have been executed at least once and\n `NotCov` is the number of executable lines that have not been executed.\n\n- `Analysis = calls`\n\n `Value = Calls` which is the number of times the module, function, or clause\n has been called. In the case of line level analysis, `Calls` is the number of\n times the line has been executed.","ref":"cover.html"},{"type":"module","title":"Distribution - cover","doc":"Cover can be used in a distributed Erlang system. One of the nodes in the system\nhas to be selected as the _main node_, and all Cover commands must be\nexecuted from that node. The error reason `not_main_node` is returned if an\ninterface function is called on one of the remote nodes.\n\nUse `cover:start/1` and `cover:stop/1` to add or remove nodes. The\nsame cover-compiled code will be loaded on each node, and analysis\nwill collect and sum up coverage data results from all nodes.\n\nTo only collect data from remote nodes without stopping `cover` on those nodes,\nuse `cover:flush/1`\n\nIf the connection to a remote node goes down, the main node will mark it as\nlost. If the node comes back it will be added again. If the remote node was\nalive during the disconnected period, cover data from before and during this\nperiod will be included in the analysis.","ref":"cover.html#module-distribution"},{"type":"function","title":"cover.analyse/0","doc":"","ref":"cover.html#analyse/0"},{"type":"function","title":"cover.analyse/1","doc":"Analyzes one or more modules as specified by `Arg`.\n\nIf `Arg` is one of the values in [`analysis()`](`t:analysis/0`), this\ncall is equivalent to [`analyse('_', Arg, function)`](`analyse/3`).\n\nIf `Arg` is one of the values in [`level()`](`t:level/0`), this\ncall is equivalent to [`analyse('_', coverage, Arg)`](`analyse/3`).\n\nOtherwise `Arg` is assumed to be a module name, and this call is equivalent\nto [`analyse(Arg, coverage, function)`](`analyse/3`).\n\n> #### Note {: .info }\n>\n> To analyze a module whose name overlaps with one the values in\n> [`analysis()`](`t:analysis/0`) or [`level()`](`t:level/0`), the module\n> name has to be in a list. For example, to analyze a module named `calls`:\n>\n> ```\n> cover:analyse([calls]).\n> ```","ref":"cover.html#analyse/1"},{"type":"function","title":"cover.analyse/2","doc":"Analyzes one or more modules as specified by `Arg1` and `Arg2`.\n\nIf `Arg1` is one of the values in [`analysis()`](`t:analysis/0`) and\n`Arg2` is one of the values in [`level()`](`t:level/0`), this\ncall is equivalent to [`analyse('_', Arg1, Arg2)`](`analyse/3`).\n\nIf `Arg2` is one of the values in [`analysis()`](`t:analysis/0`),\n`Arg1` is assumed to be a module and this call is equivalent to\n[`analyse(Arg1, Arg2, function)`](`analyse/3`).\n\nIf `Arg2` is one of the values in [`level()`](`t:level/0`), `Arg1` is\nassumed to be a module and this call is equivalent to [`analyse(Arg1,\ncoverage, Arg2)`](`analyse/3`).\n\n> #### Note {: .info }\n>\n> To analyze a module whose name overlaps with one of the values in\n> [`analysis()`](`t:analysis/0`), the module name needs to be in a\n> list. For example, to analyze a module named `calls`:\n>\n> ```\n> cover:analyse([calls], function).\n> ```","ref":"cover.html#analyse/2"},{"type":"function","title":"cover.analyse/3","doc":"Perform analysis of one or more cover-compiled modules, as specified by\n`Analysis` and `Level`, by examining the contents of the internal\ndatabase.\n\nIf `Modules` is an atom (a single module), the return is `OneResult`,\notherwise the return is `{result, Ok, Fail}`.\n\nIf `Modules` is atom `'_'`, all modules that have data in the cover data table\nare analysed. Note that this includes both cover-compiled modules and imported\nmodules.\n\nIf a given module is not cover-compiled, this is indicated by the error reason\n`{not_cover_compiled, Module}`.","ref":"cover.html#analyse/3"},{"type":"function","title":"cover.analyse_to_file/0","doc":"","ref":"cover.html#analyse_to_file/0"},{"type":"function","title":"cover.analyse_to_file/1","doc":"If `Arg` is a list of [`analyse_option()`](`t:analyse_option/0`)\noptions, this call is equivalent to [`analyse_to_file('_',\nArg)`](`analyse_to_file/2`).\n\nOtherwise `Arg` is assumed to be a module, and this call is equivalent to\n[`analyse_to_file(Arg, [])`](`analyse_to_file/2`).\n\n> #### Note {: .info }\n>\n> To analyze a module of the name `html` (which overlaps with an option\n> in [`analyse_option()`](`t:analyse_option/0`)), it is necessary to\n> use `cover:analyse_to_file/2`:\n>\n> ```\n> cover:analyse_to_file([html], []).\n> ```","ref":"cover.html#analyse_to_file/1"},{"type":"function","title":"cover.analyse_to_file/2","doc":"Outputs copies of the source code for the given modules annotated with\nexecution counts for each executable line.\n\nThe output file `OutFile` defaults to `Module.COVER.out`, and to `Module.COVER.html`\nif option `html` is used.\n\nIf `Modules` is an atom (one module), the return will be `Answer`, otherwise the\nreturn will be a list, `{result, Ok, Fail}`.\n\nIf `Modules` is '_', all modules that have data in the Cover data table\nare analysed. Note that this includes both cover-compiled modules and imported\nmodules.\n\nIf a module is not cover-compiled, this is indicated by the error reason\n`{not_cover_compiled, Module}`.\n\nIf the source file and/or the output file cannot be opened using `file:open/2`,\nthe function returns `{error, {file, File, Reason}}`, where `File` is the file\nname and `Reason` is the error reason.\n\nIf a module was cover compiled from the `.beam` file, that is, using\n`compile_beam/1` or\n[`compile_beam_directory/0,1` ](`compile_beam_directory/0`), it is assumed that\nthe source code can be found in one of the following locations:\n\n- the same directory as the `.beam` file\n- `../src` relative to the directory with `.beam` file\n- the source path in `Module:module_info(compile)`, in which case two paths\n are examined:\n * first the one constructed by joining `../src` and the tail of the compiled path\n below a trailing `src` component\n * the compiled path itself\n\nIf no source code is found, this is indicated by the error reason\n`{no_source_code_found, Module}`.","ref":"cover.html#analyse_to_file/2"},{"type":"function","title":"cover.async_analyse_to_file/1","doc":"","ref":"cover.html#async_analyse_to_file/1"},{"type":"function","title":"cover.async_analyse_to_file/2","doc":"","ref":"cover.html#async_analyse_to_file/2"},{"type":"function","title":"cover.async_analyse_to_file/3","doc":"This function works the same way as\n[`analyse_to_file/2`](`analyse_to_file/2`) except that it is asynchronous instead\nof synchronous.\n\nThe spawned process will link with the caller when created. If an\nerror of type [`analyse_rsn()`](`t:analyse_rsn/0`) occurs while doing\nthe cover analysis the process will crash with the same error reason\nas [`analyse_to_file`](`analyse_to_file/1`) would return.","ref":"cover.html#async_analyse_to_file/3"},{"type":"function","title":"cover.compile/1","doc":"","ref":"cover.html#compile/1"},{"type":"function","title":"cover.compile/2","doc":"","ref":"cover.html#compile/2"},{"type":"function","title":"cover.compile_beam/1","doc":"Cover-compiles one or more modules based `.beam` files containing\nabstract code (option `debug_info`).\n\nCover-compiling from `.beam` files is faster than compiling from\nsource and less hassle, because there is no need to supply options for\ninclude paths or macros. However, the existing `.beam` files must have\nbeen compiled with option\n[`debug_info`](`e:compiler:compile.md#debug_info`) so that they contain\n[*abstract code*](`e:erts:absform`).\n\nIf abstract code is missing, the error reason `{no_abstract_code,\nBeamFile}` is returned. If the abstract code is encrypted, and no key\nis available for decrypting it, the error reason\n`{encrypted_abstract_code, BeamFile}` is returned.\n\nIf only the module name (that is, not the full name of the `.beam`\nfile) is given to this function, the `.beam` file is found by calling\n[`code:which(Module)`](`code:which/1`). If no `.beam` file is found,\nthe error reason `non_existing` is returned. If the module is already\ncover compiled with [`compile_beam/1`](`compile_beam/1`), the `.beam`\nfile will be picked from the same location as the first time it was\ncompiled. If the module is already cover-compiled with\n`compile_module/2`, there is no way to find the correct `.beam` file,\nso the error reason `{already_cover_compiled, no_beam_found, Module}`\nis returned.\n\n`{error, BeamFile}` is returned if the compiled code cannot be loaded on the\nnode.\n\nIf a list of `ModFiles` is given as input, a list of `Result` will be returned.\nThe order of the returned list is undefined.","ref":"cover.html#compile_beam/1"},{"type":"function","title":"cover.compile_beam_directory/0","doc":"","ref":"cover.html#compile_beam_directory/0"},{"type":"function","title":"cover.compile_beam_directory/1","doc":"Cover-compiles all `.beam` files in directory `Dir` in the same way\nas `compile_beam/1`.\n\nThis function returns a list of [`compile_beam_result()`](`t:compile_beam_result/0`)\nif successful. Otherwise, it returns `{error, eacces}` if the directory is not\nreadable, and `{error, enoent}` if the directory does not exist.","ref":"cover.html#compile_beam_directory/1"},{"type":"function","title":"cover.compile_directory/0","doc":"","ref":"cover.html#compile_directory/0"},{"type":"function","title":"cover.compile_directory/1","doc":"","ref":"cover.html#compile_directory/1"},{"type":"function","title":"cover.compile_directory/2","doc":"Compiles all modules (`.erl` files) in a directory `Dir` for Cover analysis the\nsame way as [`compile_module/1,2`](`compile_module/1`) and returns a list of\n[`Result`](`t:compile_result/0`).\n\nThis function returns `{error, eacces}` if the directory is not readable or\n`{error, enoent}` if the directory does not exist.","ref":"cover.html#compile_directory/2"},{"type":"function","title":"cover.compile_module/1","doc":"","ref":"cover.html#compile_module/1"},{"type":"function","title":"cover.compile_module/2","doc":"Cover-compiles one or more modules.\n\nThe module is given by its module name `Module` or by its file name\n`File`.\n\nThe `.erl` extension can be omitted. If the module is not located in\nthe current directory, the full path to it must be specified.\n\n`Options` is a list of compiler options. Only options defining include\nfile directories and macros are passed to `compile:file/2`;\neverything else is ignored.\n\nIf the module is successfully cover-compiled, the function returns\n`{ok, Module}`. Otherwise the function returns `{error, File}`. Errors and\nwarnings are printed as they occur.\n\nIf a list of `ModFiles` is given as input, a list of [`Result`](`t:compile_result/0`)\nwill be returned. The order of the returned results in the list is undefined.\n\nNote that the internal database is initialized during the compilation,\nwhich means that any previously collected coverage data for the module\nis lost.","ref":"cover.html#compile_module/2"},{"type":"function","title":"cover.export/1","doc":"","ref":"cover.html#export/1"},{"type":"function","title":"cover.export/2","doc":"Exports the current coverage data for `Module` to the file `ExportFile`.\n\nIt is recommended to name the `ExportFile` with the extension `.coverdata`.\n\nIf `Module` is '_', data for all cover-compiled or earlier imported\nmodules is exported.\n\nThis function is useful if coverage data from different systems is to be merged.\n\nSee also `import/1`.","ref":"cover.html#export/2"},{"type":"function","title":"cover.flush/1","doc":"Fetches data from the Cover database on the remote nodes and stores it on the main\nnode.","ref":"cover.html#flush/1"},{"type":"function","title":"cover.import/1","doc":"Imports coverage data from the file `ExportFile` created with\n[`export/1,2`](`export/2`).\n\nAny analysis performed after this call will include the imported data.\n\nNote that when compiling a module _all existing coverage data is removed_,\nincluding imported data. If a module is already compiled when data is imported,\nthe imported data is _added_ to the existing coverage data.\n\nCoverage data from several export files can be imported into one system. The\ncoverage data is then added up when analysing.\n\nCoverage data for a module cannot be imported from the same file twice unless\nthe module is first reset or compiled. The check is based on the filename, so\nyou can easily fool the system by renaming your export file.","ref":"cover.html#import/1"},{"type":"function","title":"cover.imported/0","doc":"Returns a list of all imported files.","ref":"cover.html#imported/0"},{"type":"function","title":"cover.imported_modules/0","doc":"Returns a list of all modules for which there are imported data.","ref":"cover.html#imported_modules/0"},{"type":"function","title":"cover.is_compiled/1","doc":"Returns `{file, File}` if the module `Module` is cover-compiled, or `false`\notherwise.\n\n`File` is the `.erl` file used by [`compile_module/1,2`](`compile_module/2`)\nor the `.beam` file used by `compile_beam/1`.","ref":"cover.html#is_compiled/1"},{"type":"function","title":"cover.local_only/0","doc":"Only support running Cover on the local node.\n\nThis function has to be called before any modules have been compiled or\nany nodes added. When running in this mode, modules will be\ncover-compiled in a more efficient way, but the resulting code will\nonly work on the same node they were compiled on.","ref":"cover.html#local_only/0"},{"type":"function","title":"cover.modules/0","doc":"Returns a list with all modules that are currently cover-compiled.","ref":"cover.html#modules/0"},{"type":"function","title":"cover.reset/0","doc":"Resets all coverage data for all cover-compiled modules in the Cover\ndatabase on all nodes.","ref":"cover.html#reset/0"},{"type":"function","title":"cover.reset/1","doc":"Resets all coverage data for the cover-compiled module `Module` in the Cover\ndatabase on all nodes.\n\nIf `Module` is not cover-compiled, the function returns\n`{error, {not_cover_compiled, Module}}`.","ref":"cover.html#reset/1"},{"type":"function","title":"cover.start/0","doc":"Starts the Cover server which owns the Cover internal database. This function is\ncalled automatically by the other functions in the module.","ref":"cover.html#start/0"},{"type":"function","title":"cover.start/1","doc":"Starts a Cover server on the each of given nodes, and loads all cover compiled\nmodules.\n\nThis call will fail if `cover:local_only/0` has been called.","ref":"cover.html#start/1"},{"type":"function","title":"cover.stop/0","doc":"Stops the Cover server and unloads all cover-compiled code.","ref":"cover.html#stop/0"},{"type":"function","title":"cover.stop/1","doc":"Stops the Cover server and unloads all cover-compiled code on the given nodes.\n\nData stored in the Cover database on the remote nodes is fetched and stored on\nthe main node.","ref":"cover.html#stop/1"},{"type":"function","title":"cover.which_nodes/0","doc":"Returns a list with all nodes that are part of the coverage analysis.\n\nNote that the current node is not included, because it is always part\nof the analysis.","ref":"cover.html#which_nodes/0"},{"type":"type","title":"cover.analyse_answer/0","doc":"","ref":"cover.html#t:analyse_answer/0"},{"type":"type","title":"cover.analyse_fail/0","doc":"","ref":"cover.html#t:analyse_fail/0"},{"type":"type","title":"cover.analyse_file_fail/0","doc":"","ref":"cover.html#t:analyse_file_fail/0"},{"type":"type","title":"cover.analyse_file_ok/0","doc":"","ref":"cover.html#t:analyse_file_ok/0"},{"type":"type","title":"cover.analyse_item/0","doc":"","ref":"cover.html#t:analyse_item/0"},{"type":"type","title":"cover.analyse_ok/0","doc":"","ref":"cover.html#t:analyse_ok/0"},{"type":"type","title":"cover.analyse_option/0","doc":"","ref":"cover.html#t:analyse_option/0"},{"type":"type","title":"cover.analyse_rsn/0","doc":"","ref":"cover.html#t:analyse_rsn/0"},{"type":"type","title":"cover.analyse_value/0","doc":"","ref":"cover.html#t:analyse_value/0"},{"type":"type","title":"cover.analysis/0","doc":"","ref":"cover.html#t:analysis/0"},{"type":"type","title":"cover.beam_mod_file/0","doc":"","ref":"cover.html#t:beam_mod_file/0"},{"type":"type","title":"cover.beam_mod_files/0","doc":"","ref":"cover.html#t:beam_mod_files/0"},{"type":"type","title":"cover.compile_beam_result/0","doc":"","ref":"cover.html#t:compile_beam_result/0"},{"type":"type","title":"cover.compile_beam_rsn/0","doc":"","ref":"cover.html#t:compile_beam_rsn/0"},{"type":"type","title":"cover.compile_result/0","doc":"","ref":"cover.html#t:compile_result/0"},{"type":"type","title":"cover.export_reason/0","doc":"","ref":"cover.html#t:export_reason/0"},{"type":"type","title":"cover.file_error/0","doc":"","ref":"cover.html#t:file_error/0"},{"type":"type","title":"cover.level/0","doc":"","ref":"cover.html#t:level/0"},{"type":"type","title":"cover.mod_file/0","doc":"","ref":"cover.html#t:mod_file/0"},{"type":"type","title":"cover.mod_files/0","doc":"","ref":"cover.html#t:mod_files/0"},{"type":"type","title":"cover.modules/0","doc":"","ref":"cover.html#t:modules/0"},{"type":"type","title":"cover.one_result/0","doc":"","ref":"cover.html#t:one_result/0"},{"type":"type","title":"cover.option/0","doc":"","ref":"cover.html#t:option/0"},{"type":"module","title":"cprof","doc":"A simple Call Count Profiling Tool using breakpoints for minimal runtime\nperformance impact.\n\nThe `cprof` module is used to profile a program to find out how many times\ndifferent functions are called. To minimize runtime performance impact,\nbreakpoints containing counters are used.\n\nSince breakpoints are used there is no need for special compilation of the\nmodules to be profiled. These breakpoints can only be set on BEAM code, so\nBIFs cannot be call-count traced.\n\nThe size of the call counters is the host machine word size. One bit is used\nwhen pausing the counter, so the maximum counter value for a 32-bit host\nis 2,147,483,647.\n\nThe profiling result is delivered as a term containing a sorted list of entries,\none per module. Each module entry contains a sorted list of functions. The\nsorting order in both cases is of decreasing call count.\n\nCall count tracing is lightweight compared to other forms of tracing,\nsuch as `m:eprof` or `m:fprof`, since no trace messages have to be\ngenerated. Some measurements indicates that the performance degradation is\nabout 10 percent.\n\nFor more information and some examples, see the\n[User's Guide for `cprof`](cprof_chapter.md).","ref":"cprof.html"},{"type":"function","title":"cprof.analyse/0","doc":"","ref":"cprof.html#analyse/0"},{"type":"function","title":"cprof.analyse/1","doc":"Collect call counters for one or more modules.\n\nIf `ModLimit` is a module name (an atom), this call is equivalent to\n[`analyse(ModLimit, 1)`](`analyse/2`).\n\nIf `ModLimit` is an integer, this function calls\n[`analyse(Module, ModLimit)`](`analyse/2`) for each `Module` that is\ncurrently loaded (except the `cprof` module itself).\nThe result from those calls are returned in a list.","ref":"cprof.html#analyse/1"},{"type":"function","title":"cprof.analyse/2","doc":"Collects and analyses all call counters for module `Module`.\n\nThis function returns:\n\n```\n{Module, ModuleCount, FuncAnalysisList}\n```\n\nwhere `FuncAnalysisList` is a list of tuples, one for each function:\n\n```\n{{Module, FunctionName, Arity}, FuncCallCount}\n```\n\nIf call counters are still running while `analyse/0,1,2` is executing, the result\ncould be inconsistent. This happens if the process executing `analyse/0,1,2`\nis scheduled out so some other process can increment the counters that are\nbeing analysed. Calling [`pause()`](`pause/0`) before analysing takes care of\nthat problem.\n\nAll functions with a `FuncCallCount` lower than `Limit` are excluded from\n`FuncAnalysisList`. They are still included in `ModCallCount`, though.","ref":"cprof.html#analyse/2"},{"type":"function","title":"cprof.pause/0","doc":"Pause call count tracing for all functions in all modules and stop it for all\nfunctions in modules to be loaded.\n\nThis call is equivalent to\n[`pause('_', '_', '_') + stop({on_load})`](`pause/3`).","ref":"cprof.html#pause/0"},{"type":"function","title":"cprof.pause/1","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`pause(FuncSpec, '_', '_')`](`pause/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`pause(Module, Name, Arity)`](`pause/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be paused for all functions in modules to be loaded.","ref":"cprof.html#pause/1"},{"type":"function","title":"cprof.pause/2","doc":"","ref":"cprof.html#pause/2"},{"type":"function","title":"cprof.pause/3","doc":"Pause call counters for matching functions in matching modules.\n\nThe call counters for all matching functions that have call count breakpoints\nare paused at their current count.\n\nReturn the number of matching functions that can have call count breakpoints,\nthe same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","ref":"cprof.html#pause/3"},{"type":"function","title":"cprof.restart/0","doc":"","ref":"cprof.html#restart/0"},{"type":"function","title":"cprof.restart/1","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`restart(FuncSpec, '_', '_')`](`restart/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`restart(Module, Name, Arity)`](`restart/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be set to zero and running for all functions in\nmodules to be loaded.","ref":"cprof.html#restart/1"},{"type":"function","title":"cprof.restart/2","doc":"","ref":"cprof.html#restart/2"},{"type":"function","title":"cprof.restart/3","doc":"Restart call counters for the matching functions in matching modules that are\ncall-count traced.\n\nThe call counters for all matching functions that has call count breakpoints\nare set to zero and running.\n\nReturn the number of matching functions that can have call count breakpoints,\nthe same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","ref":"cprof.html#restart/3"},{"type":"function","title":"cprof.start/0","doc":"Start call count tracing for all functions in all modules, and also for all\nfunctions in modules to be loaded.\n\nThis is equivalent to\n[`start('_', '_', '_') + start({on_load})`](`start/3`).","ref":"cprof.html#start/0"},{"type":"function","title":"cprof.start/1","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`start(FuncSpec, '_', '_')`](`start/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`start(Module, Name, Arity)`](`start/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters will be set to zero and running for all functions in\nmodules to be loaded.","ref":"cprof.html#start/1"},{"type":"function","title":"cprof.start/2","doc":"","ref":"cprof.html#start/2"},{"type":"function","title":"cprof.start/3","doc":"Start call count tracing for matching functions in matching modules.\n\nSet call count breakpoints on the matching functions that has no call count\nbreakpoints. Call counters are set to zero and running for all matching\nfunctions.\n\nReturn the number of matching functions that has call count breakpoints.","ref":"cprof.html#start/3"},{"type":"function","title":"cprof.stop/0","doc":"Stop call count tracing for all functions in all modules, and also for all\nfunctions in modules to be loaded.\n\nThis is equivalent to\n[`stop('_', '_', '_') + stop({on_load})`](`stop/3`).","ref":"cprof.html#stop/0"},{"type":"function","title":"cprof.stop/1","doc":"If `FuncSpec` is an atom, it is assumed to be a module name, and\nthis call is equivalent to [`stop(FuncSpec, '_', '_')`](`stop/3`).\n\nIf `FuncSpec` is an MFA tuple, `{Module, Name, Arity`}, this call\nis equivalent to [`stop(Module, Name, Arity)`](`stop/3`).\n\nIf `FuncSpec` is tuple `{FS}`, `FS` is the first argument to\n`erlang:trace_pattern/3`. For example, if `FuncSpec` is `{on_load}`,\ncall counters be disabled for all functions in modules to be loaded.","ref":"cprof.html#stop/1"},{"type":"function","title":"cprof.stop/2","doc":"","ref":"cprof.html#stop/2"},{"type":"function","title":"cprof.stop/3","doc":"Stop call count tracing for matching functions in matching modules.\n\nRemove call count breakpoints from the matching functions that has call count\nbreakpoints.\n\nReturn the number of matching functions that can have call count breakpoints,\nwhich is the same as [`start/*`](`start/3`) with the same arguments would have\nreturned.","ref":"cprof.html#stop/3"},{"type":"type","title":"cprof.func_analysis_list/0","doc":"","ref":"cprof.html#t:func_analysis_list/0"},{"type":"type","title":"cprof.mod_analysis/0","doc":"","ref":"cprof.html#t:mod_analysis/0"},{"type":"type","title":"cprof.mod_analysis_list/0","doc":"","ref":"cprof.html#t:mod_analysis_list/0"},{"type":"module","title":"eprof","doc":"A Time Profiling Tool for Erlang\n\nThe module `eprof` provides a set of functions for time profiling of Erlang\nprograms to find out how the execution time is used. The profiling is done using\nthe Erlang trace BIFs. Tracing of local function calls for a specified set of\nprocesses is enabled when profiling is begun, and disabled when profiling is\nstopped.\n\nWhen using Eprof, expect a slowdown in program execution.","ref":"eprof.html"},{"type":"function","title":"eprof.analyze/0","doc":"","ref":"eprof.html#analyze/0"},{"type":"function","title":"eprof.analyze/1","doc":"If `TypeOpts` is an atom, it is assumed to be a module name, and this\ncall is equivalent to [`analyze(TypeOpts, [])`](`analyze/2`).\n\nOtherwise, if `TypeOpts` is a list, it assumed to be a list of options, and this\ncall is equivalent to [`analyze(procs, TypeOpts)`](`analyze/2`).","ref":"eprof.html#analyze/1"},{"type":"function","title":"eprof.analyze/2","doc":"Call this function when profiling has been stopped to display the results.\n\nIf `Type` is `procs`, the time spent in each function is shown separately\nfor each profiled process.\n\nIf `Type` is `total`, the time spent in each function is shown combined\nfor each profiled process.\n\nTime is shown as percentage of total time and as absolute time in micro seconds.","ref":"eprof.html#analyze/2"},{"type":"function","title":"eprof.log/1","doc":"Call this function to ensure that the results displayed by\n[`analyze/0,1,2`](`analyze/0`) are printed to the file `File` as well as to the\nscreen.","ref":"eprof.html#log/1"},{"type":"function","title":"eprof.profile/1","doc":"If `FunRootset` is a fun, this call is equivalent to\n[`profile([], FunRootset)`](`profile/2`).\n\nIf `FunRootset` is a list, it is assumed to be a `Rootset`, and this\ncall is equivalent to [`start_profiling(Rootset)`](`start_profiling/1`).","ref":"eprof.html#profile/1"},{"type":"function","title":"eprof.profile/2","doc":"If `Arg1` is a fun and `Arg2` is list, this call is equivalent to\n[`profile([], Arg1, {'_','_','_'}, Arg2)`](`profile/4`).\n\nIf `Arg1` is a list and `Arg2` is a fun, this call is equivalent to\n[`profile(Arg1, Arg2, {'_','_','_'}, Arg1)`](`profile/4`).","ref":"eprof.html#profile/2"},{"type":"function","title":"eprof.profile/3","doc":"","ref":"eprof.html#profile/3"},{"type":"function","title":"eprof.profile/4","doc":"This function spawns a process that applies a fun or an an function,\nand then starts profiling for the spawned proceses as well as the\nprocesses in `Rootset` (and any new processes spawned from them).\n\nIf `Arg1` is a fun, `Arg2` is expected to be a trace pattern, and\n`Arg3` a list of options. In that case, this call is equivalent to:\n\n[`profile(Rootset, erlang, apply, [Arg1, []], Arg2, Arg3)`](`profile/6`)\n\nIf `Arg1` is an atom, `Arg1` is assumed to be a module name, `Arg2` the\nname of the function in that module, and `Arg3` a list of arguments to\nbe used when calling that function. In that case, this call is equivalent\nto:\n\n[`profile(Rootset, Arg1, Arg2, Arg3, {'_','_','_'}, [{set_on_spawn, true}])`](`profile/6`)","ref":"eprof.html#profile/4"},{"type":"function","title":"eprof.profile/5","doc":"","ref":"eprof.html#profile/5"},{"type":"function","title":"eprof.profile/6","doc":"This function spawns a process `P` that [`apply(Module, Function,\nArgs)`](`apply/3`), and then starts profiling for `P` and the\nprocesses in `Rootset` (and any new processes spawned from them).\n\n`Rootset` is a list of pids and registered names.\n\nInformation about activity in any profiled process is stored in the Eprof\ndatabase.\n\nIf tracing could be enabled for `P` and all processes in `Rootset`, the function\nreturns `{ok,Value}` when `Fun()`/`apply` returns with the value `Value`, or\n`{error,Reason}` if `Fun()`/`apply` fails with exit reason `Reason`. Otherwise\nit returns `{error, Reason}` immediately.\n\nThe `set_on_spawn` option will active call time tracing for all processes\nspawned by processes in the rootset. This is the default behaviour.\n\nThe programmer must ensure that the function given as argument is truly\nsynchronous and that no work continues after the function has returned a value.","ref":"eprof.html#profile/6"},{"type":"function","title":"eprof.start/0","doc":"Starts the Eprof server which holds the internal state of the collected data.","ref":"eprof.html#start/0"},{"type":"function","title":"eprof.start_profiling/1","doc":"","ref":"eprof.html#start_profiling/1"},{"type":"function","title":"eprof.start_profiling/2","doc":"","ref":"eprof.html#start_profiling/2"},{"type":"function","title":"eprof.start_profiling/3","doc":"Starts profiling for the processes in `Rootset` (and any new processes spawned\nfrom them).\n\nInformation about activity in any profiled process is stored in the\nEprof database.\n\n`Rootset` is a list of pids and registered names.\n\nThe function returns `profiling` if tracing could be enabled for all processes\nin `Rootset`, or `error` otherwise.\n\nA pattern can be selected to narrow the profiling. For instance a specific\nmodule can be selected, and only the code executed in that module will be\nprofiled.\n\nThe `set_on_spawn` option will active call time tracing for all processes\nspawned by processes in the rootset. This is the default behaviour.","ref":"eprof.html#start_profiling/3"},{"type":"function","title":"eprof.stop/0","doc":"Stops the Eprof server.","ref":"eprof.html#stop/0"},{"type":"function","title":"eprof.stop_profiling/0","doc":"Stops profiling started with `start_profiling/1` or `profile/1`.","ref":"eprof.html#stop_profiling/0"},{"type":"type","title":"eprof.analyze_type/0","doc":"","ref":"eprof.html#t:analyze_type/0"},{"type":"type","title":"eprof.trace_pattern_mfa/0","doc":"","ref":"eprof.html#t:trace_pattern_mfa/0"},{"type":"module","title":"fprof","doc":"A Time Profiling Tool using trace to file for minimal runtime performance\nimpact.\n\nThis module is used to profile a program to find out how the execution time is\nused. Tracing to file is used to minimize the runtime performance degradation.\n\nThe `fprof` module uses tracing to collect profiling data, hence there is no\nneed for special compilation of any module to be profiled. When it starts\ntracing, `fprof` will erase all previous tracing in the node and set the\nnecessary trace flags on the profiling target processes as well as local call\ntrace on all functions in all loaded modules and all modules to be loaded.\n`fprof` disable all tracing in the node when it stops tracing.\n\n`fprof` presents both _own time_ that is, how much time a function has\nused for its own execution, and _accumulated time_ that is, including\ncalled functions. All presented times are collected using trace\ntimestamps. `fprof` tries to collect CPU time timestamps, if the host\nmachine OS supports it. Therefore, the times can be wallclock times and\nOS scheduling will randomly strike all called functions in a\npresumably fair way.\n\nHowever, if the profiling time is short, and the host machine OS does\nnot support high resolution CPU time measurements, a few OS\nschedulings can show up as ridiculously long execution times for\nfunctions doing practically nothing. As an example, it has been\nobserved that a function that more or less just composing a tuple, was\nrunning 100 times slower than normal. When tracing was repeated, the\nexecution time was normal.\n\nProfiling is essentially done in 3 steps:\n\n- Tracing: to a file. The trace data contains entries for function\n calls, returns to function, process scheduling, other process\n related events (for example `spawn`), and garbage collection. All trace\n entries are timestamped.\n\n- Profiling: the trace file is read, the execution call stack is\n simulated, and raw profile data is calculated from the simulated call stack\n and the trace timestamps. The profile data is stored in the `fprof` server\n state. During this step the trace data may be dumped in text format to file or\n console.\n\n- Analysing: the raw profile data is sorted, filtered and dumped in\n text format either to file or console. The text format intended to be both\n readable for a human reader, as well as parsable with the standard erlang\n parsing tools.\n\nSince `fprof` sends trace data to afile, the runtime performance\ndegradation is minimized, but still far from negligible, especially\nfor programs that themselves use the filesystem heavily. Where the\ntrace file is placed is also important, for example, on Unix systems\n`/tmp` is usually a good choice since it is essentially a RAM disk,\nwhile any network-mounted disk is a bad idea.\n\n`fprof` can also skip the file step and trace to a tracer process that does the\nprofiling in runtime.\n\n[](){: #analysis }","ref":"fprof.html"},{"type":"module","title":"Analysis format - fprof","doc":"This section describes the output format of the `analyse/1` function.\n\nThe format is parsable with the standard Erlang parsing tools\n`m:erl_scan` and `m:erl_parse`, `file:consult/1`, or `io:read/2`. The\nparse format is not described here — it should be easy enough for the\ninterested reader to try it out. Note that some flags to\n[`analyse/1`](`analyse/1`) will affect the format.\n\nThe following example was run on Erlang/OTP R8 on Solaris 8; all OTP\ninternals in this example are version dependent.\n\nAs an example, we will use the following function, which is a\nslightly modified benchmark function from module `m:file`:\n\n```erlang\n-module(foo).\n-export([create_file_slow/2]).\n\ncreate_file_slow(Name, N) when is_integer(N), N >= 0 ->\n {ok, FD} =\n file:open(Name, [raw, write, delayed_write, binary]),\n if N > 256 ->\n ok = file:write(FD,\n lists:map(fun (X) -> < > end,\n lists:seq(0, 255))),\n ok = create_file_slow(FD, 256, N);\n true ->\n ok = create_file_slow(FD, 0, N)\n end,\n ok = file:close(FD).\n\ncreate_file_slow(FD, M, M) ->\n ok;\ncreate_file_slow(FD, M, N) ->\n ok = file:write(FD, < >),\n create_file_slow(FD, M+1, N).\n```\n\nLet us have a look at the printout after running:\n\n```erlang\n1> fprof:apply(foo, create_file_slow, [junk, 1024]).\n2> fprof:profile().\n3> fprof:analyse().\n```\n\nThe printout starts with:\n\n```erlang\n%% Analysis results:\n{ analysis_options,\n [{callers, true},\n {sort, acc},\n {totals, false},\n {details, true}]}.\n\n% CNT ACC OWN\n[{ totals, 9627, 1691.119, 1659.074}]. %%%\n```\n\nThe `CNT` column shows the total number of function calls that was found in the\ntrace. In the `ACC` column is the total time of the trace from first timestamp to\nlast. And in the `OWN` column is the sum of the execution time in functions found\nin the trace, not including called functions. In this case it is very close to\nthe `ACC` time since the emulator had practically nothing to do except\nexecuting our test program.\n\nAll time values in the printout are in milliseconds.\n\nThe printout continues:\n\n```erlang\n% CNT ACC OWN\n[{ \"<0.28.0>\", 9627,undefined, 1659.074}]. %%\n```\n\nThis is the printout header of one process. The printout contains only this one\nprocess since we called `fprof:apply/3` that traces only the current process.\nTherefore the `CNT` and `OWN` columns perfectly matches the totals above. The `ACC`\ncolumn is undefined since summing the `ACC` times of all calls in the process\nmakes no sense — one would get something like the `ACC` value from totals above\nmultiplied by the average depth of the call stack.\n\nAll paragraphs up to the next process header only concerns function calls within\nthis process.\n\nNow we come to something more interesting:\n\n```erlang\n{[{undefined, 0, 1691.076, 0.030}],\n { {fprof,apply_start_stop,4}, 0, 1691.076, 0.030}, %\n [{{foo,create_file_slow,2}, 1, 1691.046, 0.103},\n {suspend, 1, 0.000, 0.000}]}.\n\n{[{{fprof,apply_start_stop,4}, 1, 1691.046, 0.103}],\n { {foo,create_file_slow,2}, 1, 1691.046, 0.103}, %\n [{{file,close,1}, 1, 1398.873, 0.019},\n {{foo,create_file_slow,3}, 1, 249.678, 0.029},\n {{file,open,2}, 1, 20.778, 0.055},\n {{lists,map,2}, 1, 16.590, 0.043},\n {{lists,seq,2}, 1, 4.708, 0.017},\n {{file,write,2}, 1, 0.316, 0.021}]}.\n```\n\nThe printout consists of one paragraph per called function. The function\n_marked_ with `%` is the one the paragraph concerns — `foo:create_file_slow/2`.\nAbove the marked function are the _calling_ functions — those that has called\nthe marked, and below are those _called_ by the marked function.\n\nThe paragraphs are per default sorted in descending order of the `ACC` column for\nthe marked function. The calling list and called list within one paragraph are\nalso per default sorted in descending order of their `ACC` column.\n\nThe columns are:\n\n* `CNT` - the number of times the function has been called\n* `ACC` - the time spent in the function including called functions\n* `OWN` - the time spent in the function not including called functions\n\nThe rows for the _calling_ functions contain statistics for the _marked_\nfunction with the constraint that only the occasions when a call was made from\nthe _row's_ function to the _marked_ function are accounted for.\n\nThe row for the _marked_ function simply contains the sum of all _calling_ rows.\n\nThe rows for the _called_ functions contains statistics for the _row's_ function\nwith the constraint that only the occasions when a call was made from the\n_marked_ to the _row's_ function are accounted for.\n\nSo, we see that `foo:create_file_slow/2` used very little time for its own\nexecution. It spent most of its time in `file:close/1`. The function\n`foo:create_file_slow/3` that writes 3/4 of the file contents is the second\nbiggest time thief.\n\nWe also see that the call to `file:write/2` that writes 1/4 of the file contents\ntakes very little time in itself. What takes time is to build the data\n(`lists:seq/2` and `lists:map/2`).\n\nThe function `undefined` that has called `fprof:apply_start_stop/4` is an\nunknown function because that call was not recorded in the trace. It was only\nrecorded that the execution returned from `fprof:apply_start_stop/4` to some\nother function above in the call stack, or that the process exited from there.\n\nLet us continue down the printout to find:\n\n```erlang\n{[{{foo,create_file_slow,2}, 1, 249.678, 0.029},\n {{foo,create_file_slow,3}, 768, 0.000, 23.294}],\n { {foo,create_file_slow,3}, 769, 249.678, 23.323}, %\n [{{file,write,2}, 768, 220.314, 14.539},\n {suspend, 57, 6.041, 0.000},\n {{foo,create_file_slow,3}, 768, 0.000, 23.294}]}.\n```\n\nIf you compare with the code you will see there also that\n`foo:create_file_slow/3` was called only from `foo:create_file_slow/2` and\nitself, and called only `file:write/2`, note the number of calls to\n`file:write/2`. But here we see that `suspend` was called a few times. This is a\npseudo function that indicates that the process was suspended while executing in\n`foo:create_file_slow/3`, and since there is no `receive` or `erlang:yield/0` in\nthe code, it must be Erlang scheduling suspensions, or the trace file driver\ncompensating for large file write operations (these are regarded as a schedule\nout followed by a schedule in to the same process).\n\nLet us find the `suspend` entry:\n\n```erlang\n{[{{file,write,2}, 53, 6.281, 0.000},\n {{foo,create_file_slow,3}, 57, 6.041, 0.000},\n {{prim_file,drv_command,4}, 50, 4.582, 0.000},\n {{prim_file,drv_get_response,1}, 34, 2.986, 0.000},\n {{lists,map,2}, 10, 2.104, 0.000},\n {{prim_file,write,2}, 17, 1.852, 0.000},\n {{erlang,port_command,2}, 15, 1.713, 0.000},\n {{prim_file,drv_command,2}, 22, 1.482, 0.000},\n {{prim_file,translate_response,2}, 11, 1.441, 0.000},\n {{prim_file,'-drv_command/2-fun-0-',1}, 15, 1.340, 0.000},\n {{lists,seq,4}, 3, 0.880, 0.000},\n {{foo,'-create_file_slow/2-fun-0-',1}, 5, 0.523, 0.000},\n {{erlang,bump_reductions,1}, 4, 0.503, 0.000},\n {{prim_file,open_int_setopts,3}, 1, 0.165, 0.000},\n {{prim_file,i32,4}, 1, 0.109, 0.000},\n {{fprof,apply_start_stop,4}, 1, 0.000, 0.000}],\n { suspend, 299, 32.002, 0.000}, %\n [ ]}.\n```\n\nWe find no particularly long suspend times, so no function seems to have waited\nin a receive statement. Actually, `prim_file:drv_command/4` contains a receive\nstatement, but in this test program, the message lies in the process receive\nbuffer when the receive statement is entered. We also see that the total suspend\ntime for the test run is small.\n\nThe `suspend` pseudo function has an `OWN` time of zero. This is to prevent\nthe process total `OWN` time from including time in suspension. Whether suspend\ntime is really `ACC` or `OWN` time is more of a philosophical question.\n\nNow we look at another interesting pseudo function, `garbage_collect`:\n\n```erlang\n{[{{prim_file,drv_command,4}, 25, 0.873, 0.873},\n {{prim_file,write,2}, 16, 0.692, 0.692},\n {{lists,map,2}, 2, 0.195, 0.195}],\n { garbage_collect, 43, 1.760, 1.760}, %\n [ ]}.\n```\n\nHere we see that no function stands out, which is very normal.\n\nThe `garbage_collect` pseudo function has not an `OWN` time of zero like\n`suspend`, instead it is equal to the `ACC` time.\n\nGarbage collection often occurs while a process is suspended, but `fprof` hides\nthis fact by pretending that the suspended function was first unsuspended and\nthen garbage collected. Otherwise the printout would show `garbage_collect`\nbeing called from `suspend`, but not which function that might have caused the\ngarbage collection.\n\nLet us now get back to the test code:\n\n```erlang\n{[{{foo,create_file_slow,3}, 768, 220.314, 14.539},\n {{foo,create_file_slow,2}, 1, 0.316, 0.021}],\n { {file,write,2}, 769, 220.630, 14.560}, %\n [{{prim_file,write,2}, 769, 199.789, 22.573},\n {suspend, 53, 6.281, 0.000}]}.\n```\n\nNot unexpectedly, we see that `file:write/2` was called from\n`foo:create_file_slow/3` and `foo:create_file_slow/2`. The number of calls in\neach case as well as the used time are also confirms the previous results.\n\nWe see that `file:write/2` only calls `prim_file:write/2`, but let us refrain\nfrom digging into the internals of the kernel application.\n\nIf we nevertheless _do_ dig down we find the call to the linked-in driver\nthat does the file operations towards the host operating system:\n\n```erlang\n{[{{prim_file,drv_command,4}, 772, 1458.356, 1456.643}],\n { {erlang,port_command,2}, 772, 1458.356, 1456.643}, %\n [{suspend, 15, 1.713, 0.000}]}.\n```\n\nThis is 86 % of the total run time, and as we saw before it is the close\noperation the absolutely biggest contributor. We find a comparison ratio a\nlittle bit up in the call stack:\n\n```erlang\n{[{{prim_file,close,1}, 1, 1398.748, 0.024},\n {{prim_file,write,2}, 769, 174.672, 12.810},\n {{prim_file,open_int,4}, 1, 19.755, 0.017},\n {{prim_file,open_int_setopts,3}, 1, 0.147, 0.016}],\n { {prim_file,drv_command,2}, 772, 1593.322, 12.867}, %\n [{{prim_file,drv_command,4}, 772, 1578.973, 27.265},\n {suspend, 22, 1.482, 0.000}]}.\n```\n\nThe time for file operations in the linked in driver distributes itself as 1 %\nfor open, 11 % for write, and 87 % for close. All data is probably buffered in\nthe operating system until the close.\n\nThe observant reader may notice that the ACC times for\n`prim_file:drv_command/2` and `prim_file:drv_command/4` is not equal between the\nparagraphs above, even though it is easy to believe that\n`prim_file:drv_command/2` is just a passthrough function.\n\nThe missing time can be found in the paragraph for `prim_file:drv_command/4`\nwhere it is evident that not only `prim_file:drv_command/2` is called but also a\nfun:\n\n```erlang\n{[{{prim_file,drv_command,2}, 772, 1578.973, 27.265}],\n { {prim_file,drv_command,4}, 772, 1578.973, 27.265}, %\n [{{erlang,port_command,2}, 772, 1458.356, 1456.643},\n {{prim_file,'-drv_command/2-fun-0-',1}, 772, 87.897, 12.736},\n {suspend, 50, 4.582, 0.000},\n {garbage_collect, 25, 0.873, 0.873}]}.\n```\n\nAnd some more missing time can be explained by the fact that\n`prim_file:open_int/4` both calls `prim_file:drv_command/2` directly as well as\nthrough `prim_file:open_int_setopts/3`, which complicates the picture.\n\n```erlang\n{[{{prim_file,open,2}, 1, 20.309, 0.029},\n {{prim_file,open_int,4}, 1, 0.000, 0.057}],\n { {prim_file,open_int,4}, 2, 20.309, 0.086}, %\n [{{prim_file,drv_command,2}, 1, 19.755, 0.017},\n {{prim_file,open_int_setopts,3}, 1, 0.360, 0.032},\n {{prim_file,drv_open,2}, 1, 0.071, 0.030},\n {{erlang,list_to_binary,1}, 1, 0.020, 0.020},\n {{prim_file,i32,1}, 1, 0.017, 0.017},\n {{prim_file,open_int,4}, 1, 0.000, 0.057}]}.\n.\n.\n.\n{[{{prim_file,open_int,4}, 1, 0.360, 0.032},\n {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}],\n { {prim_file,open_int_setopts,3}, 2, 0.360, 0.048}, %\n [{suspend, 1, 0.165, 0.000},\n {{prim_file,drv_command,2}, 1, 0.147, 0.016},\n {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}]}.\n```","ref":"fprof.html#module-analysis-format"},{"type":"module","title":"Notes - fprof","doc":"The actual supervision of execution times is in itself a CPU-intensive activity.\nA message is written on the trace file for every function call that is made by\nthe profiled code.\n\nThe `ACC` time calculation is sometimes difficult to make correct, since it is\ndifficult to define. This happens especially when a function occurs in several\ninstances in the call stack, for example by calling itself perhaps through other\nfunctions and perhaps even non-tail recursively.\n\nTo produce sensible results, `fprof` tries not to charge any function more than\nonce for `ACC` time. The instance highest up (with longest duration) in the call\nstack is chosen.\n\nSometimes a function can unexpectedly waste a lot (some 10 ms or more depending\non host machine OS) of `OWN` (and `ACC`) time, even functions that do practically\nnothing at all. The problem may be that the OS has chosen to schedule out the\nErlang runtime system process for a while, and if the OS does not support high\nresolution CPU time measurements `fprof` will use wallclock time for its\ncalculations, and it will appear as if functions are randomly burning virtual\nmachine time.","ref":"fprof.html#module-notes"},{"type":"module","title":"See Also - fprof","doc":"[fprof - The File Trace Profiler](fprof_chapter.md), `m:dbg`, `m:eprof`","ref":"fprof.html#module-see-also"},{"type":"function","title":"fprof.analyse/0","doc":"","ref":"fprof.html#analyse/0"},{"type":"function","title":"fprof.analyse/1","doc":"Analyses raw profile data in the `fprof` server.\n\nIf `Arg` is an atom, this call is equivalent to `analyse([Arg])`.\n\nIf `Arg` is a a tuple `{Option, _}`, this call is equivalent to\n`analyse([Option])`.\n\nOtherwise `Arg` must be a list of valid options.\n\nIf called when no raw profile data is available, `{error, no_profile}`\nis returned.\n\n`Destfile` is used to call `file:open/2`.\n\nOption description:\n\n- **`dest` | `{dest, Dest}`** - Specifies the destination for the analysis. If\n this option is not given or it is `dest`, the destination will be the caller's\n group leader, otherwise the destination `Dest` is either the `t:pid/0` of an\n I/O device or a filename. If the filename is `[]`, `\"fprof.analysis\"` is used\n instead.\n\n- **`append`** - Causes the analysis to be appended to the destination file.\n This option is only allowed with the `{dest, Destfile}` option.\n\n- **`{cols, Cols}`** - Specifies the number of columns in the analysis text. If\n this option is not given the number of columns is set to 80.\n\n- **`callers` | `{callers, true}`** - Prints callers and called information in\n the analysis. This is the default.\n\n- **`{callers, false}` | `no_callers`** - Suppresses the printing of callers and\n called information in the analysis.\n\n- **`{sort, SortSpec}`** - Specifies if the analysis should be sorted according\n to the ACC column, which is the default, or the OWN column. See\n [Analysis Format](`m:fprof#analysis`) below.\n\n- **`totals` | `{totals, true}`** - Includes a section containing call\n statistics for all calls regardless of process, in the analysis.\n\n- **`{totals, false}`** - Suppresses the totals section in the analysis, which\n is the default.\n\n- **`details` | `{details, true}`** - Prints call statistics for each process in\n the analysis. This is the default.\n\n- **`{details, false}` | `no_details`** - Suppresses the call statistics for\n each process from the analysis.","ref":"fprof.html#analyse/1"},{"type":"function","title":"fprof.analyse/2","doc":"","ref":"fprof.html#analyse/2"},{"type":"function","title":"fprof.apply/2","doc":"","ref":"fprof.html#apply/2"},{"type":"function","title":"fprof.apply/3","doc":"Calls the given function surrounded by\n[`trace([start, ...])`](`trace/1`) and\n[`trace(stop)`](`trace/1`).\n\nIf the function arguments (`Arg1`, `Arg2`, and `Arg3`) are `Module`\n(an atom), `Function` (an atom), and `Args` (a list), the function\nwill be called using\n[`erlang:apply(Module, Function, Args)`](`erlang:apply/3`).\n\nIf the function arguments are `Func` (a fun), `Args` (a list), and\n`OptionList` (a list of options), the fun will be called using\n[`erlang:apply(Func, Args)`](`erlang:apply/2`).\n\nSome effort is made to keep the trace clean from unnecessary trace messages;\ntracing is started and stopped from a spawned process while `erlang:apply/2`\nis called in the current process only surrounded by `receive` and `send`\nstatements towards the trace starting process. The trace starting process exits\nwhen it is not needed any more.\n\nThe `TraceStartOption` is any option allowed for `trace/1`. The\noptions `[start, {procs, [self() | PidList]} | OptList]` are given to\n[`trace/1`](`trace/1`), where `OptList` is `OptionList` with the\n`continue`, `start` and `{procs, _}` options removed.\n\nThe `continue` option inhibits the call to [`trace(stop)`](`trace/1`) and leaves\nit up to the caller to stop tracing at a suitable time.","ref":"fprof.html#apply/3"},{"type":"function","title":"fprof.apply/4","doc":"","ref":"fprof.html#apply/4"},{"type":"function","title":"fprof.profile/0","doc":"","ref":"fprof.html#profile/0"},{"type":"function","title":"fprof.profile/1","doc":"Compiles a trace into raw profile data held by the `fprof` server.\n\nIf `Arg` is an atom, this call is equivalent to `profile([Arg])`.\n\nIf `Arg` is a tuple `{OptionName, OptionValue}`,\nthis call is equivalent to `profile([Arg])`.\n\nOtherwise, `Arg` must be a list of options.\n\n`Dumpfile` is used to call `file:open/2`, and `Filename` is used to call\n[`dbg:trace_port(file, Filename)`](`dbg:trace_port/2`).\n\nThe following options are supported:\n\n- **`file` | `{file, Filename}`** - Reads the file `Filename` and creates raw\n profile data that is stored in RAM by the `fprof` server. If the option `file`\n is given, or none of these options are given, the file `fprof.trace` is\n read. The call will return when the whole trace has been read with the return\n value `ok` if successful. This option is not allowed with the `start` or\n `stop` options.\n\n- **`dump` | `{dump, Dump}`** - Specifies the destination for the trace text\n dump. If this option is not given, no dump is generated, if it is `dump` the\n destination will be the caller's group leader, otherwise the destination\n `Dump` is either the pid of an I/O device or a filename. If the\n filename is `[]`, `\"fprof.dump\"` is used instead. This option cannot be\n combined with the `stop` option.\n\n- **`append`** - Causes the trace text dump to be appended to the destination\n file. This option is only allowed with the `{dump, Dumpfile}` option.\n\n- **`start`** - Starts a tracer process that profiles trace data in runtime. The\n call will return immediately with the return value `{ok, Tracer}` if\n successful. This option is not allowed with the `stop`, `file`, or\n `{file, Filename}` options.\n\n- **`stop`** - Stops the tracer process that profiles trace data in runtime. The\n return value will be value `ok` if successful. This option cannot be combined\n with the `start`, `file`, or `{file, Filename}` options.","ref":"fprof.html#profile/1"},{"type":"function","title":"fprof.profile/2","doc":"","ref":"fprof.html#profile/2"},{"type":"function","title":"fprof.start/0","doc":"Starts the `fprof` server.\n\nNote that there is seldom any need to call this function directly, since\nthe server will be automatically started by any function that will need it.","ref":"fprof.html#start/0"},{"type":"function","title":"fprof.stop/0","doc":"","ref":"fprof.html#stop/0"},{"type":"function","title":"fprof.stop/1","doc":"Stops the `fprof` server.\n\nThe supplied `Reason` becomes the exit reason for the server process. By default,\nany `Reason` other than `kill` sends a request to the server and waits for it to\nclean up, reply, and exit. If `Reason` is `kill`, the server is bluntly killed.\n\nIf the `fprof` server is not running, this function returns immediately.\n\n> #### Note {: .info }\n>\n> When the `fprof` server is stopped the collected raw profile data is lost.","ref":"fprof.html#stop/1"},{"type":"function","title":"fprof.trace/1","doc":"Starts or stops tracing.\n\nIf `Arg` is atom `verbose`, this call is equivalent to\n`trace([start, verbose])`.\n\nIf `Arg` is an atom, this call is equivalent to\n`trace([Arg])`.\n\nIf `Arg` is a tuple `{OptionName, OptionValue}`, this call is equivalent to\n`trace([Arg])`.\n\nOtherwise, `Arg` has to be a list of [trace options](`t:trace_option/0`).\n\n`PidSpec` and `Tracer` are used in calls to\n[`erlang:trace(PidSpec, true, [{tracer, Tracer} | Flags])`](`erlang:trace/3`),\nand `Filename` is used to call\n[`dbg:trace_port(file, Filename)`](`dbg:trace_port/2`).\n\nOption description:\n\n- **`stop`** - Stops a running `fprof` trace and clears all tracing from the\n node. Either option `stop` or `start` must be specified, but not both.\n\n- **`start`** - Clears all tracing from the node and starts a new `fprof` trace.\n Either option `start` or `stop` must be specified, but not both.\n\n- **`verbose` | `{verbose, boolean()}`** - The `verbose` or\n `{verbose, true}` options add some trace flags that `fprof` does not need, but that\n can be interesting for general debugging purposes. These options are only allowed\n with the `start` option.\n\n- **`cpu_time` | `{cpu_time, boolean()}`** - The `cpu_time` or\n `{cpu_time, true}` options make the timestamps in the trace be in CPU time instead of\n the default wallclock time. These options are only allowed with the\n `start` option.\n\n > #### Note {: .info }\n >\n > Getting correct values out of `cpu_time` can be difficult. The best way to get\n > correct values is to run using a single scheduler and bind that scheduler to\n > a specific CPU. For example:\n >\n > ```bash\n > erl +S 1 +sbt db`\n > ```\n\n- **`{procs, PidSpec}` | `{procs, [PidSpec]}`** - Specifies which processes that\n should be traced. If this option is not given, the calling process is traced.\n All processes spawned by the traced processes are also traced. This option is\n only allowed with the `start` option.\n\n- **`file` | `{file, Filename}`** - Specifies the filename of the trace. If the\n option `file` is given, or none of these options are given, the file\n `fprof.trace` is used. This option is only allowed with the `start` option,\n but not with the `{tracer, Tracer}` option.\n\n- **`{tracer, Tracer}`** - Specifies that trace to process or port shall be done\n instead of trace to file. This option is only allowed with the `start` option,\n but not with the `{file, Filename}` option.","ref":"fprof.html#trace/1"},{"type":"function","title":"fprof.trace/2","doc":"Starts or stop tracing.\n\nIf `What` is atom `start`, this call is equivalent to\n[`trace([start, {file, Value}])`](`trace/1`).\n\nIf `What` is atom `verbose`, this call is equivalent to\n[`trace([start, verbose, {file, Value}])`](`trace/1`).\n\nIf `What` is a tuple `{OptionName, OptionValue}`,\nthis call is equivalent to\n[`trace([What])`](`trace/1`).","ref":"fprof.html#trace/2"},{"type":"type","title":"fprof.analyse_option/0","doc":"","ref":"fprof.html#t:analyse_option/0"},{"type":"type","title":"fprof.apply_option/0","doc":"","ref":"fprof.html#t:apply_option/0"},{"type":"type","title":"fprof.pid_spec/0","doc":"","ref":"fprof.html#t:pid_spec/0"},{"type":"type","title":"fprof.profile_option/0","doc":"","ref":"fprof.html#t:profile_option/0"},{"type":"type","title":"fprof.trace_option/0","doc":"","ref":"fprof.html#t:trace_option/0"},{"type":"module","title":"lcnt","doc":"A runtime system Lock Profiling tool.\n\nThe `lcnt` module is used to profile the internal ethread locks in the Erlang\nRuntime System. With `lcnt` enabled, internal counters in the runtime system are\nupdated each time a lock is taken. The counters stores information about the\nnumber of acquisition tries and the number of collisions that has occurred\nduring the acquisition tries. The counters also record the waiting time a lock\nhas caused for a blocked thread when a collision has occurred.\n\nThe data produced by the lock counters will give an estimate on how well the\nruntime system will behave from a parallelizable view point for the scenarios\ntested. This tool was mainly developed to help Erlang runtime developers iron\nout potential and generic bottlenecks.\n\nLocks in the emulator are named after what type of resource they protect and\nwhere in the emulator they are initialized, those are lock 'classes'. Most of\nthose locks are also instantiated several times, and given unique identifiers,\nto increase locking granularity. Typically an instantiated lock protects a\ndisjunct set of the resource, for example ets tables, processes or ports. In\nother cases it protects a specific range of a resource, for example `pix_lock`\nwhich protects index to process mappings, and is given a unique number within\nthe class. A unique lock in `lcnt` is referenced by a name (class) and an\nidentifier: `{Name, Id}`.\n\nSome locks in the system are static and protects global resources, for example\n`bif_timers` and the `run_queue` locks. Other locks are dynamic and not\nnecessarily long lived, for example process locks and ets-table locks. The\nstatistics data from short lived locks can be stored separately when the locks\nare deleted. This behavior is by default turned off to save memory but can be\nturned on via `lcnt:rt_opt({copy_save, true})`. The `lcnt:apply/1,2,3` functions\nenables this behavior during profiling.","ref":"lcnt.html"},{"type":"module","title":"See Also - lcnt","doc":"[LCNT User's Guide](lcnt_chapter.md)","ref":"lcnt.html#module-see-also"},{"type":"function","title":"lcnt.apply/1","doc":"","ref":"lcnt.html#apply/1"},{"type":"function","title":"lcnt.apply/2","doc":"Sets up lock counters, applies `Fun` with `Args`, and cleans up.\n\nClears the lock counters and then setups the instrumentation to save all\ndestroyed locks. After setup the function is called, passing the elements in\n`Args` as arguments. When the function returns the statistics are immediately\ncollected to the server. After the collection the instrumentation is returned to\nits previous behavior. The result of the applied function is returned.\n\n> #### Warning {: .warning }\n>\n> This function should only be used for micro-benchmarks; it sets `copy_save` to\n> `true` for the duration of the call, which can quickly lead to running out of\n> memory.","ref":"lcnt.html#apply/2"},{"type":"function","title":"lcnt.apply/3","doc":"","ref":"lcnt.html#apply/3"},{"type":"function","title":"lcnt.clear/0","doc":"","ref":"lcnt.html#clear/0"},{"type":"function","title":"lcnt.clear/1","doc":"Clears the internal lock statistics from the runtime system.\n\nThis clears the data in the runtime system but not in server. All\ncounters for static locks are zeroed, all dynamic locks currently\nalive are zeroed and all saved locks now destroyed are removed. It\nalso resets the duration timer.","ref":"lcnt.html#clear/1"},{"type":"function","title":"lcnt.collect/0","doc":"","ref":"lcnt.html#collect/0"},{"type":"function","title":"lcnt.collect/1","doc":"Collects lock statistics from the runtime system.\n\nThe function starts a server if it is not already started. It then\npopulates the server with lock statistics. If the server held any\nlock statistics data before the collect then that data is lost.","ref":"lcnt.html#collect/1"},{"type":"function","title":"lcnt.conflicts/0","doc":"","ref":"lcnt.html#conflicts/0"},{"type":"function","title":"lcnt.conflicts/1","doc":"Prints a list of internal locks and its statistics.\n\nFor option description, see [`lcnt:inspect/2`](`inspect/2`).","ref":"lcnt.html#conflicts/1"},{"type":"function","title":"lcnt.information/0","doc":"Prints `lcnt` server state and generic information about collected lock\nstatistics.","ref":"lcnt.html#information/0"},{"type":"function","title":"lcnt.inspect/1","doc":"","ref":"lcnt.html#inspect/1"},{"type":"function","title":"lcnt.inspect/2","doc":"Prints a list of internal lock counters for a specific lock.\n\nLock `Name` and `Id` for ports and processes are interchangeable with the use of\n[`lcnt:swap_pid_keys/0`](`swap_pid_keys/0`) and is the reason why `t:pid/0` and\n`t:port/0` options can be used in both `Name` and `Id` space. Both pids and\nports are special identifiers with stripped creation and can be recreated with\n[`lcnt:pid/2,3`](`pid/3`) and [`lcnt:port/1,2`](`port/2`).\n\nOption description:\n\n- **`{combine, boolean()}`** - Combine the statistics from different instances\n of a lock class. \n Default: `true`\n\n- **`{locations, boolean()}`** - Print the statistics by source file and line\n numbers. \n Default: `false`\n\n- **`{max_locks, MaxLocks}`** - Maximum number of locks printed or no limit with\n `none`. \n Default: `20`\n\n- **`{print, PrintOptions}`** - Printing options:\n\n - **`name`** - Named lock or named set of locks (classes). The same name used\n for initializing the lock in the VM.\n\n - **`id`** - Internal id for set of locks, not always unique. This could be\n table name for ets tables (db_tab), port id for ports, integer identifiers\n for allocators, etc.\n\n - **`type`** - Type of lock: `rw_mutex`, `mutex`, `spinlock`, `rw_spinlock` or\n `proclock`.\n\n - **`entry`** - In combination with `{locations, true}` this option prints the\n lock operations source file and line number entry-points along with\n statistics for each entry.\n\n - **`tries`** - Number of acquisitions of this lock.\n\n - **`colls`** - Number of collisions when a thread tried to acquire this lock.\n This is when a trylock is EBUSY, a write try on read held rw_lock, a try\n read on write held rw_lock, a thread tries to lock an already locked lock.\n (Internal states supervises this.)\n\n - **`ratio`** - The ratio between the number of collisions and the number of\n tries (acquisitions) in percentage.\n\n - **`time`** - Accumulated waiting time for this lock. This could be greater\n than actual wall clock time, it is accumulated for all threads. Trylock\n conflicts does not accumulate time.\n\n - **`duration`** - Percentage of accumulated waiting time of wall clock time.\n This percentage can be higher than 100% since accumulated time is from all\n threads.\n\n Default: `[name,id,tries,colls,ratio,time,duration]`\n\n- **`{reverse, boolean()}`** - Reverses the order of sorting. \n Default: `false`\n\n- **`{sort, Sort}`** - Column sorting orders. \n Default: `time`\n\n- **`{thresholds, Thresholds}`** - Filtering thresholds. Anything values above\n the threshold value are passed through. \n Default: `[{tries, 0}, {colls, 0}, {time, 0}]`","ref":"lcnt.html#inspect/2"},{"type":"function","title":"lcnt.load/1","doc":"Restores previously saved data to the server.","ref":"lcnt.html#load/1"},{"type":"function","title":"lcnt.locations/0","doc":"","ref":"lcnt.html#locations/0"},{"type":"function","title":"lcnt.locations/1","doc":"Prints a list of internal lock counters by source code locations.\n\nFor option description, see [`lcnt:inspect/2`](`inspect/2`).","ref":"lcnt.html#locations/1"},{"type":"function","title":"lcnt.pid/2","doc":"","ref":"lcnt.html#pid/2"},{"type":"function","title":"lcnt.pid/3","doc":"Creates a process id with creation 0.","ref":"lcnt.html#pid/3"},{"type":"function","title":"lcnt.port/1","doc":"","ref":"lcnt.html#port/1"},{"type":"function","title":"lcnt.port/2","doc":"Creates a port id with creation 0.","ref":"lcnt.html#port/2"},{"type":"function","title":"lcnt.rt_clear/0","doc":"","ref":"lcnt.html#rt_clear/0"},{"type":"function","title":"lcnt.rt_clear/1","doc":"Clear the internal counters.\n\nEquivalent to [`lcnt:clear(Node)`](`clear/1`).","ref":"lcnt.html#rt_clear/1"},{"type":"function","title":"lcnt.rt_collect/0","doc":"","ref":"lcnt.html#rt_collect/0"},{"type":"function","title":"lcnt.rt_collect/1","doc":"Returns a list of raw lock counter data.","ref":"lcnt.html#rt_collect/1"},{"type":"function","title":"lcnt.rt_mask/0","doc":"Return the current category mask for the current node.","ref":"lcnt.html#rt_mask/0"},{"type":"function","title":"lcnt.rt_mask/1","doc":"Sets the current lock category mask for the current node or\nretrieves the current mask for a remote node.\n\nIf `Arg` is an atom, it is assumed to be a node, and this\ncall returns the current lock category mask for node `Arg`.\n\nIf `Arg` is a list, this call is equivalent to\n[`rt_mask(node(), Arg)`](`rt_mask/2`).","ref":"lcnt.html#rt_mask/1"},{"type":"function","title":"lcnt.rt_mask/2","doc":"Sets the lock category mask according to `Categories` on node `Node`.\n\nThis call will fail if the `copy_save` option is enabled; see\n[`lcnt:rt_opt/2`](`rt_opt/2`).\n\nValid categories are:\n\n- `allocator`\n- `db` (ETS tables)\n- `debug`\n- `distribution`\n- `generic`\n- `io`\n- `process`\n- `scheduler`\n\nThis list is subject to change at any time, as is the category any given lock\nbelongs to.","ref":"lcnt.html#rt_mask/2"},{"type":"function","title":"lcnt.rt_opt/1","doc":"","ref":"lcnt.html#rt_opt/1"},{"type":"function","title":"lcnt.rt_opt/2","doc":"Sets a single option on node `Node`.\n\nOption description:\n\n- **`{copy_save, boolean()}`** - Retains the statistics of destroyed locks. \n Default: `false`\n\n > #### Warning {: .warning }\n >\n > This option will use a lot of memory when enabled, which must be reclaimed\n > with [`lcnt:rt_clear/0,1`](`lcnt:rt_clear/1`). Note that it makes no\n > distinction between locks that were destroyed and locks for which counting\n > was disabled, so enabling this option will disable changes to the lock\n > category mask.\n\n- **`{process_locks, boolean()}`** - Profile process locks, equal to adding\n `process` to the lock category mask; see `lcnt:rt_mask/2`. \n Default: `true`","ref":"lcnt.html#rt_opt/2"},{"type":"function","title":"lcnt.save/1","doc":"Saves the collected data to file.","ref":"lcnt.html#save/1"},{"type":"function","title":"lcnt.start/0","doc":"Starts the lock profiler server.\n\nThe server only act as a medium for the user and performs filtering\nand printing of data collected by `lcnt:collect/1`.","ref":"lcnt.html#start/0"},{"type":"function","title":"lcnt.stop/0","doc":"Stops the lock profiler server.","ref":"lcnt.html#stop/0"},{"type":"function","title":"lcnt.swap_pid_keys/0","doc":"Swaps places on `Name` and `Id` space for ports and processes.","ref":"lcnt.html#swap_pid_keys/0"},{"type":"type","title":"lcnt.category_atom/0","doc":"","ref":"lcnt.html#t:category_atom/0"},{"type":"type","title":"lcnt.lock_counter_data/0","doc":"","ref":"lcnt.html#t:lock_counter_data/0"},{"type":"type","title":"lcnt.option/0","doc":"","ref":"lcnt.html#t:option/0"},{"type":"type","title":"lcnt.print/0","doc":"","ref":"lcnt.html#t:print/0"},{"type":"type","title":"lcnt.sort/0","doc":"","ref":"lcnt.html#t:sort/0"},{"type":"type","title":"lcnt.threshold/0","doc":"","ref":"lcnt.html#t:threshold/0"},{"type":"module","title":"make","doc":"A Make Utility for Erlang\n\nThe module `make` provides a set of functions similar to the UNIX type `Make`\nfunctions.","ref":"make.html"},{"type":"module","title":"Emakefile - make","doc":"[`make:all/0,1`](`all/1`) and [`make:files/1,2`](`files/2`) first looks for\n`{emake, Emake}` in options, then in the current working directory for a file\nnamed `Emakefile`. If present `Emake` should contain elements like this:\n\n```text\nModules.\n{Modules,Options}.\n```\n\n`Modules` is an atom or a list of atoms. It can be\n\n- a module name, for exmaple, `file1`\n- a module name in another directory, for exmaple, `'../foo/file3'`\n- a set of modules specified with a wildcards, for exmaple, `'file*'`\n- a wildcard indicating all modules in current directory, that is: `'*'`\n- a list of any of the above, for exmaple, `['file*','../foo/file3','File4']`\n\n`Options` is a list of compiler options.\n\n`Emakefile` is read from top to bottom. If a module matches more than one entry,\nthe first match is used. For example, the following `Emakefile` means that\n`file1` should be compiled with the options `[debug_info,{i,\"../foo\"}]`, while\nall other files in the current directory should be compiled with only the\n`debug_info` flag.\n\n```erlang\n{'file1',[debug_info,{i,\"../foo\"}]}.\n{'*',[debug_info]}.\n```","ref":"make.html#module-emakefile"},{"type":"module","title":"See Also - make","doc":"[The Compiler Application](`m:compile`)","ref":"make.html#module-see-also"},{"type":"function","title":"make.all/0","doc":"","ref":"make.html#all/0"},{"type":"function","title":"make.all/1","doc":"This function determines the set of modules to compile and the compile options\nto use, by first looking for the `emake` make option, if not present reads the\nconfiguration from a file named `Emakefile` (see below). If no such file is\nfound, the set of modules to compile defaults to all modules in the current\nworking directory.\n\nTraversing the set of modules, it then recompiles every module for which at\nleast one of the following conditions apply:\n\n- there is no object file, or\n- the source file has been modified since it was last compiled, or,\n- an include file has been modified since the source file was last compiled.\n\nAs a side effect, the function prints the name of each module it tries to\ncompile. If compilation fails for a module, the make procedure stops and `error`\nis returned.\n\n`Options` is a list of options for `make` and the Erlang compiler. The following\n`make` options exist:\n\n- `noexec`\n No execution mode. Just prints the name of each module that needs to be\n compiled.\n- `load`\n Load mode. Loads all recompiled modules.\n- `netload`\n Net load mode. Loads all recompiled modules on all known nodes.\n- `{emake, Emake}`\n Rather than reading the `Emakefile` specify configuration explicitly.\n\nAll items in `Options` that are not make options are assumed to be compiler\noptions and are passed as-is to `compile:file/2`.","ref":"make.html#all/1"},{"type":"function","title":"make.files/1","doc":"","ref":"make.html#files/1"},{"type":"function","title":"make.files/2","doc":"This function does exactly the same thing as [`all/0,1`](`all/0`), but for the\nspecified `ModFiles`, which is a list of module or file names.\n\nThe file extension `.erl` can be omitted.\n\nThe `Emakefile` (if it exists) in the current directory is searched for compiler\noptions for each module. If a given module does not exist in `Emakefile` or if\n`Emakefile` does not exist, the module is still compiled.","ref":"make.html#files/2"},{"type":"module","title":"tags","doc":"Generate Emacs TAGS file from Erlang source files\n\nA `TAGS` file is used by Emacs to find function and variable definitions in any\nsource file in large projects. This module can generate a `TAGS` file from\nErlang source files. It recognises functions, records, and macro definitions.","ref":"tags.html"},{"type":"module","title":"Options - tags","doc":"The functions in this module have an optional argument `Options`. It\nis a list which can contain the following elements:\n\n- `{outfile, NameOfTAGSFile}` Create a `TAGS` file named `NameOfTAGSFile`.\n- `{outdir, NameOfDirectory}` Create a file named `TAGS` in the directory\n `NameOfDirectory`.\n\nThe default behaviour is to create a file named `TAGS` in the current directory.","ref":"tags.html#module-options"},{"type":"module","title":"Examples - tags","doc":"- `tags:root([{outfile, \"root.TAGS\"}]).`\n\n This command will create a file named `root.TAGS` in the current directory.\n The file will contain references to all Erlang source files in the Erlang\n distribution.\n\n- `tags:files([\"foo.erl\", \"bar.erl\", \"baz.erl\"], [{outdir, \"../projectdir\"}]).`\n\n This command will create a file named `TAGS` placed it in the\n directory `../projectdir`. The file contains information about the\n functions, records, and macro definitions of the three files.","ref":"tags.html#module-examples"},{"type":"module","title":"See Also - tags","doc":"- Richard M. Stallman. GNU Emacs Manual, chapter \"Editing Programs\", section\n \"Tag Tables\". Free Software Foundation, 1995.\n- Anders Lindgren. The Erlang editing mode for Emacs. Ericsson, 1998.","ref":"tags.html#module-see-also"},{"type":"function","title":"tags.dir/1","doc":"","ref":"tags.html#dir/1"},{"type":"function","title":"tags.dir/2","doc":"Create a `TAGS` file for all files in directory `Dir`.","ref":"tags.html#dir/2"},{"type":"function","title":"tags.dirs/1","doc":"","ref":"tags.html#dirs/1"},{"type":"function","title":"tags.dirs/2","doc":"Create a `TAGS` file for all files in any directory in `DirList`.","ref":"tags.html#dirs/2"},{"type":"function","title":"tags.file/1","doc":"","ref":"tags.html#file/1"},{"type":"function","title":"tags.file/2","doc":"Create a `TAGS` file for the file `File`.","ref":"tags.html#file/2"},{"type":"function","title":"tags.files/1","doc":"","ref":"tags.html#files/1"},{"type":"function","title":"tags.files/2","doc":"Create a `TAGS` file for the files in the list `FileList`.","ref":"tags.html#files/2"},{"type":"function","title":"tags.root/0","doc":"","ref":"tags.html#root/0"},{"type":"function","title":"tags.root/1","doc":"Create a `TAGS` file covering all files in the Erlang distribution.","ref":"tags.html#root/1"},{"type":"function","title":"tags.subdir/1","doc":"","ref":"tags.html#subdir/1"},{"type":"function","title":"tags.subdir/2","doc":"Descend recursively into the directory `Dir` and create a `TAGS` file based on\nall files found.","ref":"tags.html#subdir/2"},{"type":"function","title":"tags.subdirs/1","doc":"","ref":"tags.html#subdirs/1"},{"type":"function","title":"tags.subdirs/2","doc":"Descend recursively into the directories in `DirList` and create a `TAGS`\nfile based on all files found.","ref":"tags.html#subdirs/2"},{"type":"type","title":"tags.option/0","doc":"","ref":"tags.html#t:option/0"},{"type":"module","title":"tprof","doc":"Process Tracing Profiling Tool\n\n`tprof` provides convenience helpers for Erlang process profiling using\nthe trace BIFs.\n\n> #### Warning {: .warning }\n>\n> This module aims to replace `eprof` and `cprof` into a unified API for\n> measuring call count, time, and allocation. It is experimental in Erlang/OTP\n> 27.0.\n\nIt is possible to analyze the number of calls, the time spent by function, and\nheap allocations by function. Profiling can be done [ad-hoc](#module-ad-hoc-profiling)\n or run in a [server-aided mode](#module-server-aided-profiling) for deeper\nintrospection of the code running in production. The server-aided mode can be\nrun using the default tprof server or an isolated `t:server/0` started through\n[`start(#{ session => atom() })`](`start/1`).\n\nThere are [three kinds of profiling](`t:trace_type/0`) supported by this module:\n\n- `call_count`\n- `call_time`\n- `call_memory`\n\nThe default is `call_count`, which has the smallest peformance impact\nand memory footprint, but it does not support per-process\nprofiling. For this reason, all of the examples below uses\n`call_memory`, which measures heap allocation, and provide a more complex\nfeature set to demonstrate.\n\nErlang terms that do not fit in a single machine word are allocated on\nthe process heap. For example, a function returning a tuple of two\nelements needs to allocate the tuple on the process heap. The actual\nconsumption is three words, because the runtime systems also need an\nextra word to store the tuple size.\n\n> #### Note {: .info }\n>\n> Expect a slowdown in the program execution when profiling is enabled.\n>\n> For profiling convenience, measurements are accumulated for functions that are\n> not enabled in some trace pattern. Consider this call stack example:\n>\n> ```text\n> top_traced_function(...)\n> not_traced_function()\n> bottom_traced_function()\n> ```\n>\n> Allocations that happened within `not_traced_function` will be added to\n> the allocations for `top_traced_function`. However, allocations that occurred\n> within `bottom_traced_function` are not included in the `top_traced_function`.\n> To only keep track of each function own allocations, it is necessary to\n> trace all functions.\n\n> #### Warning {: .warning }\n>\n> Avoid hot code reloading for modules participating in the tracing.\n> Reloading a module disables tracing and discards the accumulated statistics.\n> The `tprof` results will probably be incorrect when the profiled code was\n> reloading during a profiling session.","ref":"tprof.html"},{"type":"module","title":"Ad-hoc profiling - tprof","doc":"Ad-hoc profiling is convenient for profiling a single function call.\n\nFor example:\n\n```erlang\n1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).\n\n****** Process <0.92.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\nok\n```\n\nBy default tracing is enabled for all functions in all modules. When funs\nare created in the interactive shell, parts of shell code are also traced:\n\n```erlang\n1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).\n\n****** Process <0.95.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nerl_eval:do_apply/7 1 3 3.00 [ 3.61]\nerl_eval:match_list/6 1 3 3.00 [ 3.61]\nlists:reverse/1 1 4 4.00 [ 4.82]\nerl_eval:expr_list/7 3 7 2.33 [ 8.43]\nerl_eval:ret_expr/3 4 16 4.00 [19.28]\nerl_eval:merge_bindings/4 3 18 6.00 [21.69]\nlists:seq_loop/3 5 32 6.40 [38.55]\n 83 [100.0]\nok\n```\n\nHowever, it is possible to limit the trace to specific functions or modules:\n\n```erlang\n2> tprof:profile(fun() -> lists:seq(1, 16) end,\n #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).\n****** Process <0.98.0> -- 100.00% of total *** \nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\n\nok\n```\n\nAd-hoc profiling results can be printed in a few different ways. The following\nexamples use the `test` module defined like this:\n\n```erlang\n-module(test).\n-export([test_spawn/0]).\ntest_spawn() ->\n {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),\n receive\n {'DOWN', MRef, process, Pid, normal} ->\n done\n end.\n```\n\nBy default per-process statistics is shown:\n\n```erlang\n1> tprof:profile(test, test_spawn, [], #{type => call_memory}).\n\n****** Process <0.176.0> -- 23.66 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\nerlang:spawn_opt/4 1 6 6 [27.27]\ntest:test_spawn/0 1 14 14 [63.64]\n 22 [100.0]\n\n****** Process <0.177.0> -- 76.34 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:apply/2 1 7 7 [ 9.86]\nlists:seq_loop/3 9 64 7 [90.14]\n 71 [100.0]\n```\n\nThe following example prints the combined memory allocation of all\nprocesses, sorted by the total number of allocated words in descending\norder:\n\n```erlang\n2> tprof:profile(test, test_spawn, [],\n #{type => call_memory, report => {total, {measurement, descending}}}).\n\nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 9 64 7 [68.82]\ntest:test_spawn/0 1 14 14 [15.05]\nerlang:apply/2 1 7 7 [ 7.53]\nerlang:spawn_opt/4 1 6 6 [ 6.45]\nerlang:spawn_monitor/1 1 2 2 [ 2.15]\n 93 [100.0]\n```\n\nThe profiling data can also be collected for further inspection:\n\n```erlang\n3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,\n #{type => call_memory, report => return}).\n<...>\n4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).\n\n****** Process <0.223.0> -- 23.66 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\ntest:test_spawn/0 1 14 14 [63.64]\nerlang:spawn_opt/4 1 6 6 [27.27]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\n 22 [100.0]\n\n****** Process <0.224.0> -- 76.34 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nlists:seq_loop/3 9 64 7 [90.14]\nerlang:apply/2 1 7 7 [ 9.86]\n 71 [100.0]\n```\n\nWhich processes that are profiled depends on the profiling type.\n\n* `call_count` (default) counts calls in all processes.\n\n* `call_time` and `call_memory` limits the profiling to the processes\n spawned from the user-provided function (using the `set_on_spawn`\n option for `trace:process/4`).\n\n`call_time` and `call_memory` can be restricted to profile a single process:\n\n```erlang\n2> tprof:profile(test, test_spawn, [],\n #{type => call_memory, set_on_spawn => false}).\n\n****** Process <0.183.0> -- 100.00 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerlang:spawn_monitor/1 1 2 2 [ 9.09]\nerlang:spawn_opt/4 1 6 6 [27.27]\ntest:test_spawn/0 1 14 14 [63.64]\n```\n\n[](){: #pg_example }\n\nErlang programs can perform expensive operations in other processes\nthan the original one. You can include multiple, new, or even all\nprocesses in the trace when measuring time or memory:\n\n```erlang\n7> pg:start_link().\n{ok,<0.252.0>}\n8> tprof:profile(fun() -> pg:join(group, self()) end,\n #{type => call_memory, rootset => [pg]}).\n****** Process <0.252.0> -- 52.86 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\npg:leave_local_update_ets/5 1 2 2 [ 1.80]\ngen:reply/2 1 3 3 [ 2.70]\nerlang:monitor/2 1 3 3 [ 2.70]\ngen_server:try_handle_call/4 1 3 3 [ 2.70]\ngen_server:try_dispatch/4 1 3 3 [ 2.70]\nmaps:iterator/1 2 4 2 [ 3.60]\nmaps:take/2 1 6 6 [ 5.41]\npg:join_local_update_ets/5 1 8 8 [ 7.21]\npg:handle_info/2 1 8 8 [ 7.21]\npg:handle_call/3 1 9 9 [ 8.11]\ngen_server:loop/7 2 9 4 [ 8.11]\nets:lookup/2 2 10 5 [ 9.01]\npg:join_local/3 1 11 11 [ 9.91]\npg:notify_group/5 2 16 8 [14.41]\nerlang:setelement/3 2 16 8 [14.41]\n 111 [100.0]\n\n****** Process <0.255.0> -- 47.14 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nerl_eval:match_list/6 1 3 3 [ 3.03]\nerlang:monitor/2 1 3 3 [ 3.03]\nlists:reverse/1 2 4 2 [ 4.04]\npg:join/3 1 4 4 [ 4.04]\nerl_eval:add_bindings/2 1 5 5 [ 5.05]\nerl_eval:do_apply/7 2 6 3 [ 6.06]\ngen:call/4 1 8 8 [ 8.08]\nerl_eval:expr_list/7 4 10 2 [10.10]\ngen:do_call/4 1 16 16 [16.16]\nerl_eval:ret_expr/3 4 16 4 [16.16]\nerl_eval:merge_bindings/4 3 24 8 [24.24]\n 99 [100.0]\n```\n\nBy default, there is no limit for the profiling time. For ac-hoc\nprofiling, is is possible to configure a time limit. If the profiled\nfunction does not return before that time expires, the process is\nterminated with reason `kill`. Any unlinked children processes started\nby the user-supplied function are kept; it is the responsibility of\nthe developer to take care of such processes.\n\n```erlang\n9> tprof:profile(timer, sleep, [100000], #{timeout => 1000}).\n```\n\nBy default, only one ad-hoc or server-aided profiling session is\nallowed at any point in time. It is possible to force multiple ad-hoc\nsessions concurrently, but it is the responsibility of the developer\nto ensure that trace patterns do not overlap:\n\n```erlang\n1> tprof:profile(fun() -> lists:seq(1, 32) end,\n #{registered => false, pattern => [{lists, '_', '_'}]}).\n```","ref":"tprof.html#module-ad-hoc-profiling"},{"type":"module","title":"Server-aided profiling - tprof","doc":"Server-aided profiling can be done on a system that is up and\nrunning. To do that, start the `tprof` server, and then add trace\npatterns and processes to trace while the system handles actual\ntraffic. Data can extracted, inspected, and printed at any time. The\nfollowing example traces activity of all processes supervised by\nthe Kernel supervisor:\n\n```erlang\n1> tprof:start(#{type => call_memory}).\n{ok,<0.200.0>}\n2> tprof:enable_trace({all_children, kernel_sup}).\n34\n3> tprof:set_pattern('_', '_' , '_').\n16728\n4> Sample = tprof:collect().\n{call_memory,\n [{gen_server,try_dispatch,4,[{<0.154.0>,2,6}]},\n {erlang,iolist_to_iovec,1,[{<0.161.0>,1,8}]},\n<...>\n5 > tprof:format(tprof:inspect(Sample)).\n\n****** Process <0.154.0> -- 14.21 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\nmaps:iterator/1 2 4 2 [15.38]\ngen_server:try_dispatch/4 2 6 3 [23.08]\nnet_kernel:handle_info/2 2 16 8 [61.54]\n 26 [100.0]\n\n****** Process <0.161.0> -- 85.79 % of total allocations ***\nFUNCTION CALLS WORDS PER CALL [ %]\ndisk_log:handle/2 2 2 1 [ 1.27]\ndisk_log_1:maybe_start_timer/1 1 3 3 [ 1.91]\ndisk_log_1:mf_write_cache/1 1 3 3 [ 1.91]\n<...>\n```\n\n[](){: #inspect_example }\n\nIt is possible to profile the entire running system, and then examine individual\nprocesses:\n\n```erlang\n1> tprof:start(#{type => call_memory}).\n2> tprof:enable_trace(all), tprof:set_pattern('_', '_' , '_').\n9041\n3> timer:sleep(10000), tprof:disable_trace(all), Sample = tprof:collect().\n{call_memory,\n [{user_drv,server,3,[{<0.64.0>,12,136}]},\n {user_drv,contains_ctrl_g_or_ctrl_c,1,[{<0.64.0>,80,10}]},\n<...>\n4> Inspected = tprof:inspect(Sample, process, measurement), Shell = maps:get(self(), Inspected).\n{call_memory, 2743,\n [{shell,{enc,0},1,2,2,0.07291286912139992},\n<...>\n5> tprof:format(Shell).\n\nFUNCTION CALLS WORDS PER CALL [ %]\n<...>\nerl_lint:start/2 2 300 150 [10.94]\nshell:used_records/1 114 342 3 [12.47]\n```","ref":"tprof.html#module-server-aided-profiling"},{"type":"function","title":"tprof.clear_pattern/3","doc":"Disables tracing functions matching the supplied pattern.\n\n```erlang\n1> tprof:set_pattern(lists, seq, '_').\n2\n2> tprof:clear_pattern(lists, seq, 3).\n1\n3> tprof:get_trace_map().\n#{lists => [{seq,2}]}\n```\n\nRequires that the default `tprof` server has been [`started`](`start/1`).","ref":"tprof.html#clear_pattern/3"},{"type":"function","title":"tprof.clear_pattern/4","doc":"Equivalent to [`clear_pattern(Mod, Fun, Arity)`](`clear_pattern/3`) but uses the provided `Server`.","ref":"tprof.html#clear_pattern/4"},{"type":"function","title":"tprof.collect/0","doc":"Returns statistics for current trace map.","ref":"tprof.html#collect/0"},{"type":"function","title":"tprof.collect/1","doc":"Equivalent to `collect/0` but uses the provided `Server`.","ref":"tprof.html#collect/1"},{"type":"function","title":"tprof.continue/0","doc":"Resumes previously paused profiling.","ref":"tprof.html#continue/0"},{"type":"function","title":"tprof.continue/1","doc":"Equivalent to `continue/0` but uses the provided `Server`.","ref":"tprof.html#continue/1"},{"type":"function","title":"tprof.disable_trace/1","doc":"","ref":"tprof.html#disable_trace/1"},{"type":"function","title":"tprof.disable_trace/2","doc":"Stops accumulating traces for specified processes.\n\nSee `enable_trace/2` for a description of the options.\n\nThe profile data accumulated before the process is removed from the\ntraced list is retained. This makes it possible to enable tracing for\nmany or all processes in the system, sleep for a short period of\ntime, then disable tracing for all processes (to avoid system\noverload), but keeping profile data.","ref":"tprof.html#disable_trace/2"},{"type":"function","title":"tprof.disable_trace/3","doc":"","ref":"tprof.html#disable_trace/3"},{"type":"function","title":"tprof.enable_trace/1","doc":"","ref":"tprof.html#enable_trace/1"},{"type":"function","title":"tprof.enable_trace/2","doc":"Similar to `trace:process/4`, but supports a few more options for tracing\nconvenience.\n\nTracing per process is not supported by `call_count` profilers.\n\n`Spec` is either a process identifier (pid) for a local process, one of the\nfollowing atoms, or a list of local process identifiers or their registered\nnames:\n\n- **`all`** - All currently existing processes and all that will be\n created in the future.\n\n- **`existing`** - All currently existing processes.\n\n- **`new`** - All processes that will be created in the future.\n\n- **`children`** - All currently running processes that were directly spawned by\n the specified process. This mode is helpful for tracing workers of a single\n supervisor.\n\n- **`all_children`** - All currently running processes that were spawned by the\n specified process, or any recursive descendant of it. This mode is designed to\n facilitate tracing of supervision trees.\n\nReturns the number of processes for which tracing was enabled.\n\nWhen a list of pids, `children` or `all_children` is used, the processes that\ntracing failed to be enabled on will also be returned. Tracing can fail to be\nenabled if the process has terminated before tracing could be enabled.\n\n> #### Note {: .info }\n>\n> The profiling server does not keep track of processes that were added to the\n> tracing set. It is permitted to stop the profiling server (wiping out any\n> accumulated data), restart the server, set entirely different tracing pattern\n> keeping the list of traced processes for future use. Use\n> [`disable_trace(Processes)`](`disable_trace/2`) to clear the list of traced\n> processes.\n\nSpecify `Options` to modify tracing behavior:\n\n- **`set_on_spawn`** - Automatically start tracing for processes spawned by the\n traced process. On by default.","ref":"tprof.html#enable_trace/2"},{"type":"function","title":"tprof.enable_trace/3","doc":"Equivalent to `enable_trace/2` but uses the provided `Server`.","ref":"tprof.html#enable_trace/3"},{"type":"function","title":"tprof.format/1","doc":"Formats profile data transformed with [`inspect/3`](`inspect/3`), outputting to\nthe default output device.","ref":"tprof.html#format/1"},{"type":"function","title":"tprof.format/2","doc":"Formats profile transformed with [`inspect/3`](`inspect/3`),\noutputting to device `IoDevice`.","ref":"tprof.html#format/2"},{"type":"function","title":"tprof.get_trace_map/0","doc":"Returns a map of module names to functions with their arities.","ref":"tprof.html#get_trace_map/0"},{"type":"function","title":"tprof.get_trace_map/1","doc":"Equivalent to `get_trace_map/0` but uses the provided `Server`.","ref":"tprof.html#get_trace_map/1"},{"type":"function","title":"tprof.inspect/1","doc":"Equivalent to [`inspect(Profile, process, percent)`](`inspect/3`).\n\nTransforms raw profile into a map of process identifiers to a tuple containing total count\nof words allocated, and a list of all traced functions sorted in the ascending\norder by the allocation percentage.","ref":"tprof.html#inspect/1"},{"type":"function","title":"tprof.inspect/3","doc":"Transforms raw data returned by tracing BIFs into a form convenient for\nsubsequent analysis and formatting.\n\n* When the `Type` argument is `process`, this function returns a map of process\n identifiers with corresponding profiling results sorted by the selected column.\n\n* When `Type` argument is `total` or when profiling by `call_count`, this function\n returns a map with a single `all` key with profiling results from all processes.\n\nThe inspected profile data can be leveraged to\n[print profiling results](`m:tprof#inspect_example`).","ref":"tprof.html#inspect/3"},{"type":"function","title":"tprof.pause/0","doc":"Pauses trace collection for all currently traced functions, retaining existing traces.\n\nUse `continue/0` to resume trace collection.","ref":"tprof.html#pause/0"},{"type":"function","title":"tprof.pause/1","doc":"Equivalent to `pause/0` but uses the provided `Server`.","ref":"tprof.html#pause/1"},{"type":"function","title":"tprof.profile/1","doc":"","ref":"tprof.html#profile/1"},{"type":"function","title":"tprof.profile/2","doc":"Does ad-hoc profiling of the call `Fun()`.\n\nBy default, the result is formatted to the output device; use the `report`\noption to change this behavior.\n\nAd-hoc profiling starts a new instance of `tprof` server, runs the\nprofiling routine, extracts results, and shuts down the server.\n\nSee `profile/4` for a list of the supported options.","ref":"tprof.html#profile/2"},{"type":"function","title":"tprof.profile/3","doc":"","ref":"tprof.html#profile/3"},{"type":"function","title":"tprof.profile/4","doc":"Does ad-hoc profiling for the call `apply(Module, Function, Args)`.\n\nBy default, the result is formatted to the output device; use option `report`\nto change this behavior.\n\nAd-hoc profiling starts a new instance of `tprof` server, runs the\nprofiling routine, extracts results, and shuts down the server.\n\nThe ad-hoc profiler supports the following `Options`:\n\n- **`type`** - The type of profiling to perform.\n\n- **`device`** - Specifies I/O devices to print the profile to. Useful to\n redirect text output to console or `standard_error`.\n\n- **`pattern`** - Specifies a trace pattern, or a list of trace patterns to\n enable. By default, all functions (`{'_', '_', '_'}`) are traced.\n\n- **`report`** - Controls output format. The default is `process`; printing\n per-process profiling data sorted by percentage of the total allocation.\n Specify `report => return` to suppress printing and get the raw data for\n further evaluation with `inspect/3` and formatting with `format/2`.\n\n- **`rootset`** - Includes extra processes in the trace list. Useful for\n profiling allocations for `m:gen_server`, calls, or other allocations caused\n by inter-process communications. See [this example](`m:tprof#pg_example`).\n\n- **`set_on_spawn`** - Automatically start tracing for processes spawned by the\n traced process. Enabled by default.\n\n- **`timeout`** - Terminate profiling after the specified amount of time\n (milliseconds).","ref":"tprof.html#profile/4"},{"type":"function","title":"tprof.restart/0","doc":"Clears accumulated profiles and starts profiling if it was paused.","ref":"tprof.html#restart/0"},{"type":"function","title":"tprof.restart/1","doc":"Equivalent to `restart/0` but uses the provided `Server`.","ref":"tprof.html#restart/1"},{"type":"function","title":"tprof.set_pattern/3","doc":"Enables tracing for all functions matching the supplied pattern.\n\nPatterns are additive, following the same rules as `trace:function/4`.\nReturns the number of functions matching the supplied pattern.\n\n```erlang\n1> tprof:set_pattern(lists, seq, '_').\n2\n2> tprof:set_pattern(lists, keyfind, 3).\n1\n3> tprof:get_trace_map().\n#{lists => [{keyfind,3},{seq,2},{seq,3}]}\n```\n\nIf no functions match the pattern, an `error` tuple is returned:\n\n```erlang\n> tprof:set_pattern(no_module, func, '_').\n{error,{trace_pattern,no_module,func,'_'}}\n```\n\nRequires that the default `tprof` server has been [`started`](`start/1`).","ref":"tprof.html#set_pattern/3"},{"type":"function","title":"tprof.set_pattern/4","doc":"Equivalent to `set_pattern/3` but uses the provided `Server`.","ref":"tprof.html#set_pattern/4"},{"type":"function","title":"tprof.start/0","doc":"","ref":"tprof.html#start/0"},{"type":"function","title":"tprof.start/1","doc":"Starts the server, not supervised.\n\nProfiling server stores current trace patterns and owns the [trace session](`t:trace:session/0`)\nused for profiling.\n\nIf no `session` is provided in `Config`, then a default session called `tprof` is\nused and the profiling server is [registered](`register/2`) as `tprof`.\n\nIf `session` is provided in `Config`, then a session with that name is created\nand all profiling is done within that session. The profiling server is not [registered](`register/2`)\nin this case. When using `m:tprof` like this the `t:pid/0` returned from this\nfunction needs to be provided to the functions in this module.","ref":"tprof.html#start/1"},{"type":"function","title":"tprof.start_link/0","doc":"","ref":"tprof.html#start_link/0"},{"type":"function","title":"tprof.start_link/1","doc":"Equivalent to `start/1` but also links the profiling server to the caller.","ref":"tprof.html#start_link/1"},{"type":"function","title":"tprof.stop/0","doc":"Stops the default `tprof` server and disable tracing enabled by the server.","ref":"tprof.html#stop/0"},{"type":"function","title":"tprof.stop/1","doc":"Equivalent to `stop/0` but uses the provided `Server`.","ref":"tprof.html#stop/1"},{"type":"type","title":"tprof.column/0","doc":"Column to sort by `inspect/3` or [`profile/4`](`profile/4`).\n\n- **`module`** - Module name.\n\n- **`function`** - Function name.\n\n- **`calls`** - Number of calls to the function.\n\n- **`measurement`** - Total measurement (call count, time, or heap allocation)\n throughout all calls to the function.\n\n- **`measurement_per_call`** - Measurement (call count, time, or heap\n allocation) on average per function call.\n\n- **`percent`** - Percentage of measurement to total amount during the entire\n profile collection.","ref":"tprof.html#t:column/0"},{"type":"type","title":"tprof.process/0","doc":"A process identifier (pid) or a registered process name.","ref":"tprof.html#t:process/0"},{"type":"type","title":"tprof.profile_line/0","doc":"Inspected data for a single function of the specified `Module`.","ref":"tprof.html#t:profile_line/0"},{"type":"type","title":"tprof.profile_options/0","doc":"Ad-hoc profiler options; see [`profile/4`](`profile/4`).","ref":"tprof.html#t:profile_options/0"},{"type":"type","title":"tprof.profile_result/0","doc":"Profile of a single process, or combined profile of multiple processes, sorted\nby a selected column.","ref":"tprof.html#t:profile_result/0"},{"type":"type","title":"tprof.rootset/0","doc":"","ref":"tprof.html#t:rootset/0"},{"type":"type","title":"tprof.server/0","doc":"A tprof server.\n\nEach server uses a separate `t:trace:session/0` in order to\nkeep profiling isolated.","ref":"tprof.html#t:server/0"},{"type":"type","title":"tprof.sort_by/0","doc":"","ref":"tprof.html#t:sort_by/0"},{"type":"type","title":"tprof.start_options/0","doc":"","ref":"tprof.html#t:start_options/0"},{"type":"type","title":"tprof.trace_info/0","doc":"Raw data extracted from tracing BIFs.","ref":"tprof.html#t:trace_info/0"},{"type":"type","title":"tprof.trace_map/0","doc":"Traced functions (with their arities) grouped by module name,\nor `all` if all code is traced.","ref":"tprof.html#t:trace_map/0"},{"type":"type","title":"tprof.trace_options/0","doc":"Options for enabling profiling of the selected processes; see `enable_trace/2`.","ref":"tprof.html#t:trace_options/0"},{"type":"type","title":"tprof.trace_pattern/0","doc":"","ref":"tprof.html#t:trace_pattern/0"},{"type":"type","title":"tprof.trace_type/0","doc":"The type of profiling that the tprof server will do.\n\n- **call_count** - Counts the number of calls made to functions. This\n is a global profiling event that cannot be limited to specific processes.\n See [call_count](`trace#call_count`) in `trace:function/4` for more details.\n- **call_time** - Counts the accumulated time spent in functions.\n See [call_time](`trace#call_time`) in `trace:function/4` for more details.\n- **call_memory** - Counts the accumulated memory allocated in functions.\n See [call_memory](`trace#call_memory`) in `trace:function/4` for more details.","ref":"tprof.html#t:trace_type/0"},{"type":"module","title":"xref","doc":"A Cross Reference Tool for analyzing dependencies between functions, modules,\napplications, and releases.\n\nCalls between functions are either _local calls_{: #local_call } such as `f()`,\nor _external calls_{: #external_call } such as `mod:f()`.\n\n_Module data_{:#module_data }, which are extracted from BEAM files,\ninclude local functions, exported functions, local calls, and external\ncalls. By default, calls to built-in functions (BIF) are ignored, but\nif the option `builtins`, accepted by some of this module's functions,\nis set to `true`, calls to BIFs are included as well. It is the\nanalyzing OTP version that decides what functions are BIFs.\nFunctional objects are assumed to be called where they are created\n(and nowhere else).\n\n_Unresolved calls_{: #unresolved_call } are calls to `apply` or\n`spawn` with variable module, variable function, or variable\narguments. Examples are `M:F(a)`, [`apply(M, f, [a])`](`apply/3`), and\n[`spawn(m, f(), Args)`](`spawn/3`). Unresolved calls are represented\nby calls where variable modules have been replaced with the atom\n`'$M_EXPR'`, variable functions have been replaced with the atom\n`'$F_EXPR'`, and variable number of arguments have been replaced with\nthe number `-1`. The above mentioned examples are represented by calls\nto `'$M_EXPR':'$F_EXPR'/1`, `'$M_EXPR':f/1`, and `m:'$F_EXPR'/-1`. The\nunresolved calls are a subset of the external calls.\n\n> #### Warning {: .warning }\n>\n> Unresolved calls make module data incomplete, which implies that the results\n> of analyses may be invalid.\n\n_Applications_ are collections of modules. The BEAM files for the\nmodules are located in the `ebin` subdirectory of the application\ndirectory. The name of the application directory determines the name\nand version of the application.\n\n_Releases_ are collections of applications located in the `lib` subdirectory of\nthe release directory. There is more to read about applications and releases in\nthe Design Principles book.\n\n_Xref servers_{: #xref_server } are identified by names, supplied when\ncreating new servers. Each Xref server holds a set of releases, a set\nof applications, and a set of modules with module data. Xref servers\nare independent of each other, and all analyses are evaluated in the\ncontext of one single Xref server (exceptions are the functions\n[`m/1`](`m/1`) and [`d/1`](`d/1`) which do not use servers at\nall).\n\nThe _mode_{: #mode } of an Xref server determines what module data are\nextracted from BEAM files as modules are added to the server. BEAM\nfiles compiled with the option `debug_info` contain [](){: #debug_info\n} \"debug information\", which is an abstract representation of the\ncode.\n\n- In `functions` mode, which is the default mode, function calls\n and line numbers are extracted from debug information.\n\n- In `modules` mode, debug information is ignored if present, but\n dependencies between modules are extracted from other parts of the\n BEAM files. The `modules` mode is significantly less time and space\n consuming than the `functions` mode, but the analyses that can be\n done are limited.\n\nAn _analyzed module_{: #analyzed_module } is a module that has been added to an\nXref server together with its module data. A _library module_{: #library_module\n} is a module located in some directory mentioned in the _library path_{:\n#library_path }. A library module is said to be used if some of its exported\nfunctions are used by some analyzed module. An _unknown module_{:\n#unknown_module } is a module that is neither an analyzed module nor a library\nmodule, but whose exported functions are used by some analyzed module.\n\nAn _unknown function_{: #unknown_function } is a used function that is\nneither local or exported by any analyzed module nor exported by any\nlibrary module. An _undefined function_{: #undefined_function } is an\nexternally used function that is not exported by any analyzed module\nor library module. With this notion, a local function can be an\nundefined function, namely if it is externally used from some\nmodule. All unknown functions are also undefined functions; there is a\n[figure](xref_chapter.md#venn2) in the User's Guide that illustrates\nthis relationship.\n\nThe module attribute tag `deprecated` can be used to inform\nXref about _deprecated functions_{: #deprecated_function } and optionally when\nfunctions are planned to be removed. A few examples show the idea:\n\n- `-deprecated({f,1}).` - The exported function `f/1` is deprecated.\n Nothing is said whether `f/1` will be removed or not.\n\n- `-deprecated({f,1,\"Use g/1 instead\"}).` - As above but with a descriptive\n string. The string is currently unused by `xref` but other tools can make use\n of it.\n\n- `-deprecated({f,'_'}).` - All exported functions `f/0`, `f/1`, and so on\n are deprecated.\n\n- `-deprecated(module).` - All exported functions in the module are\n deprecated. Equivalent to `-deprecated({'_','_'}).`.\n\n- `-deprecated([{g,1,next_version}]).` - The function `g/1` is deprecated\n and will be removed in next version.\n\n- `-deprecated([{g,2,next_major_release}]).` - The function `g/2` is\n deprecated and will be removed in next major release.\n\n- `-deprecated([{g,3,eventually}]).` - The function `g/3` is deprecated\n and will eventually be removed.\n\n- `-deprecated({'_','_',eventually}).` - All exported functions in the\n module are deprecated and will eventually be removed.\n\nBefore any analysis can take place, module data must be _set up_. For instance,\nthe cross reference and the unknown functions are computed when all module data\nare known. The functions that need complete data\n([`analyze/2,3`](`analyze/3`), [`q/2,3`](`q/3`), [`variables/1,2`](`variables/2`)\ntake care of setting up data automatically. Module data need to be set up\n(again) after calls to any of the `add`, `replace`, `remove`,\n[`set_library_path/2,3`](`set_library_path/3`), or\n[`update/1,2`](`update/2`) functions.\n\nThe result of setting up module data is the _Call Graph_{: #call_graph }. A\n(directed) graph consists of a set of vertices and a set of (directed) edges.\nThe edges represent _calls_{: #call } (From, To) between functions, modules,\napplications, or releases. From is said to call To, and To is said to be used by\nFrom. The vertices of the Call Graph are the functions of all module data: local\nand exported functions of analyzed modules; used BIFs; used exported functions\nof library modules; and unknown functions. The functions `module_info/0,1` added\nby the compiler are included among the exported functions, but only when called\nfrom some module. The edges are the function calls of all module data. A\nconsequence of the edges being a set is that there is only one edge if a\nfunction is locally or externally used several times on one and the same line of\ncode.\n\nThe Call Graph is [](){: #representation } represented by Erlang terms (the sets\nare lists), which is suitable for many analyses. But for analyses that look at\nchains of calls, a list representation is much too slow. Instead the\nrepresentation offered by the `digraph` module is used. The translation of the\nlist representation of the Call Graph - or a subgraph thereof - to the `digraph`\nrepresentation does not come for free, so the language used for expressing\nqueries to be described below has a special operator for this task and a\npossibility to save the `digraph` representation for subsequent analyses.\n\nIn addition to the Call Graph there is a graph called the _Inter Call Graph_{:\n#inter_call_graph }. This is a graph of calls (From, To) such that there is a\nchain of calls from From to To in the Call Graph, and every From and To is an\nexported function or an unused local function. The vertices are the same as for\nthe Call Graph.\n\nCalls between modules, applications and releases are also directed graphs. The\n_types_{: #type } of the vertices and edges of these graphs are (ranging from\nthe most special to the most general): `Fun` for functions; `Mod` for modules;\n`App` for applications; and `Rel` for releases. The following paragraphs will\ndescribe the different constructs of the language used for selecting and\nanalyzing parts of the graphs, beginning with the _constants_{: #constants }:\n\n- Expression ::= Constants\n- Constants ::= Consts | Consts `:` Type | RegExpr\n- Consts ::= Constant | `[`Constant`,` ...`]` | `{`Constant`,` ...`}`\n- Constant ::= Call | Const\n- Call ::= FunSpec `->` FunSpec | `{`MFA`,` MFA`}` | AtomConst `->` AtomConst |\n `{`AtomConst`,` AtomConst`}`\n- Const ::= AtomConst | FunSpec | MFA\n- AtomConst ::= Application | Module | Release\n- FunSpec ::= Module `:` Function `/` Arity\n- MFA ::= `{`Module`,` Function`,` Arity`}`\n- RegExpr ::= RegString `:` Type | RegFunc | RegFunc `:` Type\n- RegFunc ::= RegModule `:` RegFunction `/` RegArity\n- RegModule ::= RegAtom\n- RegFunction ::= RegAtom\n- RegArity ::= RegString | Number | `_` | `-1`\n- RegAtom ::= RegString | Atom | `_`\n- RegString ::= - a regular expression, as described in the `re` module,\n enclosed in double quotes -\n- Type ::= `Fun` | `Mod` | `App` | `Rel`\n- Function ::= Atom\n- Application ::= Atom\n- Module ::= Atom\n- Release ::= Atom\n- Arity ::= Number | `-1`\n- Atom ::= - same as Erlang atoms -\n- Number ::= - same as non-negative Erlang integers -\n\nExamples of constants are: `kernel`, `kernel->stdlib`, `[kernel, sasl]`,\n`[pg -> mnesia, {tv, mnesia}] : Mod`. It is an error if an instance of `Const`\ndoes not match any vertex of any graph. If there are more than one vertex\nmatching an untyped instance of `AtomConst`, then the one of the most general\ntype is chosen. A list of constants is interpreted as a set of constants, all of\nthe same type. A tuple of constants constitute a chain of calls (which may, but\ndoes not have to, correspond to an actual chain of calls of some graph).\nAssigning a type to a list or tuple of `Constant` is equivalent to assigning the\ntype to each `Constant`.\n\n_Regular expressions_{: #regexp } are used as a means to select some of the\nvertices of a graph. A `RegExpr` consisting of a `RegString` and a type - an\nexample is `\"xref_.*\" : Mod` \\- is interpreted as those modules (or applications\nor releases, depending on the type) that match the expression. Similarly, a\n`RegFunc` is interpreted as those vertices of the Call Graph that match the\nexpression. An example is `\"xref_.*\":\"add_.*\"/\"(2|3)\"`, which matches all `add`\nfunctions of arity two or three of any of the xref modules. Another example, one\nthat matches all functions of arity 10 or more: `_:_/\"[1-9].+\"`. Here `_` is an\nabbreviation for `\".*\"`, that is, the regular expression that matches anything.\n\nThe syntax of _variables_{: #variable } is simple:\n\n- Expression ::= Variable\n- Variable ::= - same as Erlang variables -\n\nThere are two kinds of variables:\n\n* **Predefined variables** {: #predefined_variable } - hold module data, and\n cannot be assigned to but only used in queries.\n\n* **User variables** {: #user_variable } - can be assigned to, and are\n typically used for temporary results while evaluating a query, and\n for keeping results of queries for use in subsequent queries.\n\nThe predefined variables are (variables marked with (\\*) are available\nin `functions` mode only):\n\n- **`E`** - Call Graph Edges (\\*).\n\n- **`V`** - Call Graph Vertices (\\*).\n\n- **`M`** - Modules. All modules: analyzed modules, used library modules, and\n unknown modules.\n\n- **`A`** - Applications.\n\n- **`R`** - Releases.\n\n- **`ME`** - Module Edges. All module calls.\n\n- **`AE`** - Application Edges. All application calls.\n\n- **`RE`** - Release Edges. All release calls.\n\n- **`L`** - Local Functions (\\*). All local functions of analyzed modules.\n\n- **`X`** - Exported Functions. All exported functions of analyzed modules and\n all used exported functions of library modules.\n\n- **`F`** - Functions (\\*).\n\n- **`B`** - Used BIFs. `B` is empty if `builtins` is `false` for all analyzed\n modules.\n\n- **`U`** - Unknown Functions.\n\n- **`UU`** - Unused Functions (\\*). All local and exported functions of analyzed\n modules that have not been used.\n\n- **`XU`** - Externally Used Functions. Functions of all modules - including\n local functions - that have been used in some external call.\n\n- **`LU`** - Locally Used Functions (\\*). Functions of all modules that have\n been used in some local call.\n\n- **`OL`** - Functions with an attribute tag `on_load` (\\*).\n\n- **`LC`** - Local Calls (\\*).\n\n- **`XC`** - External Calls (\\*).\n\n- **`AM`** - Analyzed Modules.\n\n- **`UM`** - Unknown Modules.\n\n- **`LM`** - Used Library Modules.\n\n- **`UC`** - Unresolved Calls. Empty in `modules` mode.\n\n- **`EE`** - Inter Call Graph Edges (\\*).\n\n- **`DF`** - Deprecated Functions. All deprecated exported functions and all\n used deprecated BIFs.\n\n- **`DF_1`** - Deprecated Functions. All deprecated functions to be removed in\n next version.\n\n- **`DF_2`** - Deprecated Functions. All deprecated functions to be removed in\n next version or next major release.\n\n- **`DF_3`** - Deprecated Functions. All deprecated functions to be removed in\n next version, next major release, or later.\n\nThese are a few [](){: #simple_facts } facts about the predefined variables (the\nset operators `+` (union) and `-` (difference) as well as the cast operator\n`(`Type`)` are described below):\n\n- `F` is equal to `L + X`.\n- `V` is equal to `X + L + B + U`, where `X`, `L`, `B` and `U` are pairwise\n disjoint (that is, have no elements in common).\n- `UU` is equal to `V - (XU + LU)`, where `LU` and `XU` may have elements in\n common. Put in another way:\n- `V` is equal to `UU + XU + LU`.\n- `OL` is a subset of `F`.\n- `E` is equal to `LC + XC`. Note that `LC` and `XC` may have elements in\n common, namely if some function is locally and externally used from one and\n the same function.\n- `U` is a subset of `XU`.\n- `B` is a subset of `XU`.\n- `LU` is equal to `range LC`.\n- `XU` is equal to `range XC`.\n- `LU` is a subset of `F`.\n- `UU` is a subset of `F`.\n- `range UC` is a subset of `U`.\n- `M` is equal to `AM + LM + UM`, where `AM`, `LM` and `UM` are pairwise\n disjoint.\n- `ME` is equal to `(Mod) E`.\n- `AE` is equal to `(App) E`.\n- `RE` is equal to `(Rel) E`.\n- `(Mod) V` is a subset of `M`. Equality holds if all analyzed modules have some\n local, exported, or unknown function.\n- `(App) M` is a subset of `A`. Equality holds if all applications have some\n module.\n- `(Rel) A` is a subset of `R`. Equality holds if all releases have some\n application.\n- `DF_1` is a subset of `DF_2`.\n- `DF_2` is a subset of `DF_3`.\n- `DF_3` is a subset of `DF`.\n- `DF` is a subset of `X + B`.\n\nAn important notion is that of _conversion_{: #conversion } of expressions. The\nsyntax of a cast expression is:\n\n- Expression ::= `(` Type `)` Expression\n\nThe interpretation of the cast operator depends on the named type `Type`, the\ntype of `Expression`, and the structure of the elements of the interpretation of\n`Expression`. If the named type is equal to the expression type, no conversion\nis done. Otherwise, the conversion is done one step at a time; `(Fun) (App) RE`,\nfor instance, is equivalent to `(Fun) (Mod) (App) RE`. Now assume that the\ninterpretation of `Expression` is a set of constants (functions, modules,\napplications or releases). If the named type is more general than the expression\ntype, say `Mod` and `Fun` respectively, then the interpretation of the cast\nexpression is the set of modules that have at least one of their functions\nmentioned in the interpretation of the expression. If the named type is more\nspecial than the expression type, say `Fun` and `Mod`, then the interpretation\nis the set of all the functions of the modules (in `modules` mode, the\nconversion is partial since the local functions are not known). The conversions\nto and from applications and releases work analogously. For instance,\n`(App) \"xref_.*\" : Mod` returns all applications containing at least one module\nsuch that `xref_` is a prefix of the module name.\n\nNow assume that the interpretation of `Expression` is a set of calls. If the\nnamed type is more general than the expression type, say `Mod` and `Fun`\nrespectively, then the interpretation of the cast expression is the set of calls\n(M1, M2) such that the interpretation of the expression contains a call from\nsome function of M1 to some function of M2. If the named type is more special\nthan the expression type, say `Fun` and `Mod`, then the interpretation is the\nset of all function calls (F1, F2) such that the interpretation of the\nexpression contains a call (M1, M2) and F1 is a function of M1 and F2 is a\nfunction of M2 (in `modules` mode, there are no functions calls, so a cast to\n`Fun` always yields an empty set). Again, the conversions to and from\napplications and releases work analogously.\n\nThe interpretation of constants and variables are sets, and those sets can be\nused as the basis for forming new sets by the application of _set operators_{:\n#set_operator }. The syntax:\n\n- Expression ::= Expression BinarySetOp Expression\n- BinarySetOp ::= `+` | `*` | `-`\n\n`+`, `*` and `-` are interpreted as union, intersection and difference\nrespectively: the union of two sets contains the elements of both sets; the\nintersection of two sets contains the elements common to both sets; and the\ndifference of two sets contains the elements of the first set that are not\nmembers of the second set. The elements of the two sets must be of the same\nstructure; for instance, a function call cannot be combined with a function. But\nif a cast operator can make the elements compatible, then the more general\nelements are converted to the less general element type. For instance, `M + F`\nis equivalent to `(Fun) M + F`, and `E - AE` is equivalent to `E - (Fun) AE`.\nOne more example: `X * xref : Mod` is interpreted as the set of functions\nexported by the module `xref`; `xref : Mod` is converted to the more special\ntype of `X` (`Fun`, that is) yielding all functions of `xref`, and the\nintersection with `X` (all functions exported by analyzed modules and library\nmodules) is interpreted as those functions that are exported by some module\n_and_ functions of `xref`.\n\nThere are also unary set operators:\n\n- Expression ::= UnarySetOp Expression\n- UnarySetOp ::= `domain` | `range` | `strict`\n\nRecall that a call is a pair (From, To). `domain` applied to a set of calls is\ninterpreted as the set of all vertices From, and `range` as the set of all\nvertices To. The interpretation of the `strict` operator is the operand with all\ncalls on the form (A, A) removed.\n\nThe interpretation of the _restriction operators_{: #restriction } is a subset\nof the first operand, a set of calls. The second operand, a set of vertices, is\nconverted to the type of the first operand. The syntax of the restriction\noperators:\n\n- Expression ::= Expression RestrOp Expression\n- RestrOp ::= `|`\n- RestrOp ::= `||`\n- RestrOp ::= `|||`\n\nThe interpretation in some detail for the three operators:\n\n- **`|`** - The subset of calls from any of the vertices.\n\n- **`||`** - The subset of calls to any of the vertices.\n\n- **`|||`** - The subset of calls to and from any of the vertices. For all sets\n of calls `CS` and all sets of vertices `VS`, `CS ||| VS ` is equivalent to\n `CS | VS * CS || VS`.\n\n[](){: #graph_analyses } Two functions (modules, applications, releases) belong\nto the same strongly connected component if they call each other (in)directly.\nThe interpretation of the `components` operator is the set of strongly connected\ncomponents of a set of calls. The `condensation` of a set of calls is a new set\nof calls between the strongly connected components such that there is an edge\nbetween two components if there is some constant of the first component that\ncalls some constant of the second component.\n\nThe interpretation of the `of` operator is a chain of calls of the second\noperand (a set of calls) that passes throw all of the vertices of the first\noperand (a tuple of constants), in the given order. The second operand is\nconverted to the type of the first operand. For instance, the `of` operator can\nbe used for finding out whether a function calls another function indirectly,\nand the chain of calls demonstrates how. The syntax of the graph analyzing\noperators:\n\n- Expression ::= Expression BinaryGraphOp Expression\n- Expression ::= UnaryGraphOp Expression\n- UnaryGraphOp ::= `components` | `condensation`\n- BinaryGraphOp ::= `of`\n\nAs was mentioned before, the graph analyses operate on the `digraph`\nrepresentation of graphs. By default, the `digraph` representation is created\nwhen needed (and deleted when no longer used), but it can also be created\nexplicitly by use of the `closure` operator:\n\n- Expression ::= ClosureOp Expression\n- ClosureOp ::= `closure`\n\nThe interpretation of the `closure` operator is the transitive closure of the\noperand.\n\nThe restriction operators are defined for closures as well;\n`closure E | xref : Mod` is interpreted as the direct or indirect function calls\nfrom the `xref` module, while the interpretation of `E | xref : Mod` is the set\nof direct calls from `xref`. If some graph is to be used in several graph\nanalyses, it saves time to assign the `digraph` representation of the graph to a\nuser variable, and then make sure that every graph analysis operates on that\nvariable instead of the list representation of the graph.\n\nThe lines where functions are defined (more precisely: where the first clause\nbegins) and the lines where functions are used are available in `functions`\nmode. The line numbers refer to the files where the functions are defined. This\nholds also for files included with the `-include` and `-include_lib` directives,\nwhich may result in functions defined apparently in the same line. The _line\noperators_ are used for assigning line numbers to functions and for assigning\nsets of line numbers to function calls. The syntax is similar to the one of the\ncast operator:\n\n- Expression ::= `(` LineOp`)` Expression\n- Expression ::= `(` XLineOp`)` Expression\n- LineOp ::= `Lin` | `ELin` | `LLin` | `XLin`\n- XLineOp ::= `XXL`\n\nThe interpretation of the `Lin` operator applied to a set of functions assigns\nto each function the line number where the function is defined. Unknown\nfunctions and functions of library modules are assigned the number 0.\n\nThe interpretation of some LineOp operator applied to a set of function calls\nassigns to each call the set of line numbers where the first function calls the\nsecond function. Not all calls are assigned line numbers by all operators:\n\n- the `Lin` operator is defined for Call Graph Edges;\n- the `LLin` operator is defined for Local Calls.\n- the `XLin` operator is defined for External Calls.\n- the `ELin` operator is defined for Inter Call Graph Edges.\n\nThe `Lin` (`LLin`, `XLin`) operator assigns the lines where calls (local calls,\nexternal calls) are made. The `ELin` operator assigns to each call (From, To),\nfor which it is defined, every line L such that there is a chain of calls from\nFrom to To beginning with a call on line L.\n\nThe `XXL` operator is defined for the interpretation of any of the LineOp\noperators applied to a set of function calls. The result is that of replacing\nthe function call with a line numbered function call, that is, each of the two\nfunctions of the call is replaced by a pair of the function and the line where\nthe function is defined. The effect of the `XXL` operator can be undone by the\nLineOp operators. For instance, `(Lin) (XXL) (Lin) E` is equivalent to\n`(Lin) E`.\n\nThe `+`, `-`, `*`, and `#` operators are defined for line number expressions,\nprovided the operands are compatible. The LineOp operators are also defined for\nmodules, applications, and releases; the operand is implicitly converted to\nfunctions. Similarly, the cast operator is defined for the interpretation of the\nLineOp operators.\n\nThe interpretation of the _counting operator_{: #count } is the number of\nelements of a set. The operator is undefined for closures. The `+`, `-` and `*`\noperators are interpreted as the obvious arithmetical operators when applied to\nnumbers. The syntax of the counting operator:\n\n- Expression ::= CountOp Expression\n- CountOp ::= `#`\n\nAll binary operators are left associative; for instance, `A | B  || C` is\nequivalent to `(A | B) || C`. The following is a list of all operators, in\nincreasing order of _precedence_{: #precedence }:\n\n- `+`, `-`\n- `*`\n- `#`\n- `|`, `||`, `|||`\n- `of`\n- `(`Type`)`\n- `closure`, `components`, `condensation`, `domain`, `range`, `strict`\n\nParentheses are used for grouping, either to make an expression more readable or\nto override the default precedence of operators:\n\n- Expression ::= `(` Expression `)`\n\nA _query_{: #query } is a non-empty sequence of statements. A statement is\neither an assignment of a user variable or an expression. The value of an\nassignment is the value of the right hand side expression. It makes no sense to\nput a plain expression anywhere else but last in queries. The syntax of queries\nis summarized by these productions:\n\n- Query ::= Statement`,` ...\n- Statement ::= Assignment | Expression\n- Assignment ::= Variable `:=` Expression | Variable `=` Expression\n\nA variable cannot be assigned a new value unless first removed. Variables\nassigned to by the `=` operator are removed at the end of the query, while\nvariables assigned to by the `:=` operator can only be removed by calls to\n`forget`. There are no user variables when module data need to be set up again;\nif any of the functions that make it necessary to set up module data again is\ncalled, all user variables are forgotten.","ref":"xref.html"},{"type":"module","title":"See Also - xref","doc":"`m:beam_lib`, `m:digraph`, `m:digraph_utils`, `m:re`,\n[User's Guide for Xref](xref_chapter.md)","ref":"xref.html#module-see-also"},{"type":"function","title":"xref.add_application/2","doc":"","ref":"xref.html#add_application/2"},{"type":"function","title":"xref.add_application/3","doc":"Adds an application, the modules of the application, and\n[module data](`m:xref#module_data`) of the modules to an\n[Xref server](`m:xref#xref_server`).\n\nThe modules will be members of the application. The default is to use\nthe base name of the directory with the version removed as application\nname, but this can be overridden by the `name` option. Returns the\nname of the application.\n\nIf the given directory has a subdirectory named `ebin`, modules (BEAM files) are\nsearched for in that directory, otherwise modules are searched for in the given\ndirectory.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","ref":"xref.html#add_application/3"},{"type":"function","title":"xref.add_directory/2","doc":"","ref":"xref.html#add_directory/2"},{"type":"function","title":"xref.add_directory/3","doc":"Adds the modules found in the given directory and the\n[modules' data](`m:xref#module_data`) to an [Xref server](`m:xref#xref_server`).\n\nThe default is not to examine subdirectories, but if the option `recurse` has\nthe value `true`, modules are searched for in subdirectories on all levels as\nwell as in the given directory. Returns a sorted list of the names of the added\nmodules.\n\nThe modules added will not be members of any applications.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","ref":"xref.html#add_directory/3"},{"type":"function","title":"xref.add_module/2","doc":"","ref":"xref.html#add_module/2"},{"type":"function","title":"xref.add_module/3","doc":"Adds a module and its [module data](`m:xref#module_data`) to an\n[Xref server](`m:xref#xref_server`).\n\nThe module will not be member of any application. Returns the name of the module.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, and the BEAM\nfile contains no [debug information](`m:xref#debug_info`), the error message\n`no_debug_info` is returned.","ref":"xref.html#add_module/3"},{"type":"function","title":"xref.add_release/2","doc":"","ref":"xref.html#add_release/2"},{"type":"function","title":"xref.add_release/3","doc":"Adds a release, the applications of the release, the modules of the\napplications, and [module data](`m:xref#module_data`) of the modules to an\n[Xref server](`m:xref#xref_server`).\n\nThe applications will be members of the release, and the modules will\nbe members of the applications. The default is to use the base name of\nthe directory as release name, but this can be overridden by the\n`name` option. Returns the name of the release.\n\nIf the given directory has a subdirectory named `lib`, the directories in that\ndirectory are assumed to be application directories, otherwise all\nsubdirectories of the given directory are assumed to be application directories.\nIf there are several versions of some application, the one with the highest\nversion is chosen.\n\nIf the [mode](`m:xref#mode`) of the Xref server is `functions`, BEAM files that\ncontain no [debug information](`m:xref#debug_info`) are ignored.","ref":"xref.html#add_release/3"},{"type":"function","title":"xref.analyze/2","doc":"","ref":"xref.html#analyze/2"},{"type":"function","title":"xref.analyze/3","doc":"[](){: #analyze } Evaluates a predefined analysis.\n\nReturns a sorted list without duplicates of `t:call/0` or\n`t:constant/0`, depending on the chosen analysis. The predefined\nanalyses, which operate on all [analyzed\nmodules](`m:xref#analyzed_module`), are (analyses marked with (\\*) are\navailable only in [mode `functions`](`m:xref#mode`)):\n\n- **`undefined_function_calls`(\\*)** - Returns a list of calls to\n [undefined functions](`m:xref#undefined_function`).\n\n- **`undefined_functions`** - Returns a list of\n [undefined functions](`m:xref#undefined_function`).\n\n- **`locals_not_used`(\\*)** - Returns a list of local functions that have not\n been locally used.\n\n- **`exports_not_used`** - Returns a list of exported functions that have not\n been externally used. Note that in `modules` mode, `M:behaviour_info/1` is\n never reported as unused.\n\n- **`deprecated_function_calls`(\\*)** - Returns a list of external calls to\n [deprecated functions](`m:xref#deprecated_function`).\n\n- **`{deprecated_function_calls, DeprFlag}`(\\*)** - Returns a list of external\n calls to deprecated functions. If `DeprFlag` is equal to `next_version`, calls\n to functions to be removed in next version are returned. If `DeprFlag` is\n equal to `next_major_release`, calls to functions to be removed in next major\n release are returned as well as calls to functions to be removed in next\n version. Finally, if `DeprFlag` is equal to `eventually`, all calls to\n functions to be removed are returned, including calls to functions to be\n removed in next version or next major release.\n\n- **`deprecated_functions`** - Returns a list of externally used deprecated\n functions.\n\n- **`{deprecated_functions, DeprFlag}`** - Returns a list of externally used\n deprecated functions. If `DeprFlag` is equal to `next_version`, functions to\n be removed in next version are returned. If `DeprFlag` is equal to\n `next_major_release`, functions to be removed in next major release are\n returned as well as functions to be removed in next version. Finally, if\n `DeprFlag` is equal to `eventually`, all functions to be removed are returned,\n including functions to be removed in next version or next major release.\n\n- **`{call, FuncSpec}`(\\*)** - Returns a list of functions called by some of the\n given functions.\n\n- **`{use, FuncSpec}`(\\*)** - Returns a list of functions that use some of the\n given functions.\n\n- **`{module_call, ModSpec}`** - Returns a list of modules called by some of the\n given modules.\n\n- **`{module_use, ModSpec}`** - Returns a list of modules that use some of the\n given modules.\n\n- **`{application_call, AppSpec}`** - Returns a list of applications called by\n some of the given applications.\n\n- **`{application_use, AppSpec}`** - Returns a list of applications that use\n some of the given applications.\n\n- **`{release_call, RelSpec}`** - Returns a list of releases called by some of\n the given releases.\n\n- **`{release_use, RelSpec}`** - Returns a list of releases that use some of the\n given releases.","ref":"xref.html#analyze/3"},{"type":"function","title":"xref.d/1","doc":"The modules found in the given directory are checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions.\n\nThe code path is used as [library path](`m:xref#library_path`).\n\nIf some of the found BEAM files contain\n[debug information](`m:xref#debug_info`), then those modules are checked and a\nlist of tuples is returned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of calls to deprecated\n functions;\n- `undefined`, the second element is a sorted list of calls to undefined\n functions;\n- `unused`, the second element is a sorted list of unused local functions.\n\nIf no BEAM file contains debug information, then a list of tuples is returned.\nThe first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of externally used\n deprecated functions;\n- `undefined`, the second element is a sorted list of undefined functions.","ref":"xref.html#d/1"},{"type":"function","title":"xref.forget/1","doc":"Removes all [user variables](`m:xref#user_variable`) of an\n[Xref server](`m:xref#xref_server`).","ref":"xref.html#forget/1"},{"type":"function","title":"xref.forget/2","doc":"Removes the [user variables](`m:xref#user_variable`) given by `Variables` from\nan [Xref server](`m:xref#xref_server`).","ref":"xref.html#forget/2"},{"type":"function","title":"xref.format_error/1","doc":"Given the error returned by any function of this module, the function\n`format_error` returns a descriptive string of the error in English.\n\nFor file errors, the function `file:format_error/1` is called.","ref":"xref.html#format_error/1"},{"type":"function","title":"xref.get_default/1","doc":"Returns a list of all options and their default values.","ref":"xref.html#get_default/1"},{"type":"function","title":"xref.get_default/2","doc":"Returns the default value for option `Option`.","ref":"xref.html#get_default/2"},{"type":"function","title":"xref.get_library_path/1","doc":"Returns the [library path](`m:xref#library_path`).","ref":"xref.html#get_library_path/1"},{"type":"function","title":"xref.info/1","doc":"The `info/1` function returns information as a list of pairs `{Tag, term()` in\nsome order about the state and the [module data](`m:xref#module_data`) of an\n[Xref server](`m:xref#xref_server`).\n\n[`info/1`](`info/1`) returns information with the following tags (tags marked\nwith (\\*) are only available in `functions` mode):\n\n- `library_path`, the [library path](`m:xref#library_path`);\n- `mode`, the [mode](`m:xref#mode`);\n- `no_releases`, number of releases;\n- `no_applications`, total number of applications (of all releases);\n- `no_analyzed_modules`, total number of\n [analyzed modules](`m:xref#analyzed_module`);\n- `no_calls` (\\*), total number of calls (in all modules), regarding instances\n of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), total number of [local calls](`m:xref#local_call`),\n resolved [external calls](`m:xref#external_call`) and\n [unresolved calls](`m:xref#unresolved_call`);\n- `no_functions` (\\*), total number of local and exported functions;\n- `no_inter_function_calls` (\\*), total number of calls of the\n [Inter Call Graph](`m:xref#inter_call_graph`).","ref":"xref.html#info/1"},{"type":"function","title":"xref.info/2","doc":"Returns information about all items belonging to category `Category`.\nSee `info/3` for details.","ref":"xref.html#info/2"},{"type":"function","title":"xref.info/3","doc":"The `info` functions return information as a list of pairs `{Tag, term()}` in\nsome order about the state and the [module data](`m:xref#module_data`) of an\n[Xref server](`m:xref#xref_server`).\n\n[`info/2`](`info/2`) and [`info/3`](`info/3`) return information about all or\nsome of the analyzed modules, applications, releases, or library modules of an\nXref server. The following information is returned for every analyzed module:\n\n- `application`, an empty list if the module does not belong to any application,\n otherwise a list of the application name;\n- `builtins`, whether calls to BIFs are included in the module's data;\n- `directory`, the directory where the module's BEAM file is located;\n- `no_calls` (\\*), number of calls, regarding instances of one function call in\n different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls;\n- `no_functions` (\\*), number of local and exported functions;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph;\n\nThe following information is returned for every application:\n\n- `directory`, the directory where the modules' BEAM files are located;\n- `no_analyzed_modules`, number of analyzed modules;\n- `no_calls` (\\*), number of calls of the application's modules, regarding\n instances of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls of the application's modules;\n- `no_functions` (\\*), number of local and exported functions of the\n application's modules;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph of the\n application's modules;\n- `release`, an empty list if the application does not belong to any release,\n otherwise a list of the release name;\n- `version`, the application's version as a list of numbers. For instance, the\n directory \"kernel-2.6\" results in the application name `kernel` and the\n application version \\[2,6]; \"kernel\" yields the name `kernel` and the version\n [].\n\nThe following information is returned for every release:\n\n- `directory`, the release directory;\n- `no_analyzed_modules`, number of analyzed modules;\n- `no_applications`, number of applications;\n- `no_calls` (\\*), number of calls of the release's modules, regarding instances\n of one function call in different lines as separate calls;\n- `no_function_calls` (\\*), number of local calls, resolved external calls and\n unresolved calls of the release's modules;\n- `no_functions` (\\*), number of local and exported functions of the release's\n modules;\n- `no_inter_function_calls` (\\*), number of calls of the Inter Call Graph of the\n release's modules.\n\nThe following information is returned for every library module:\n\n- `directory`, the directory where the\n [library module's](`m:xref#library_module`) BEAM file is located.\n\nFor every number of calls, functions, and so on returned by the `no_` tags, there is a\nquery returning the same number. Listed below are examples of such queries. Some\nof the queries return the sum of a two or more of the `no_` tags numbers. `mod`\n(`app`, `rel`) refers to any module (application, release).\n\n- `no_analyzed_modules`\n\n - `\"# AM\"` (info/1)\n - `\"# (Mod) app:App\"` (application)\n - `\"# (Mod) rel:Rel\"` (release)\n\n- `no_applications`\n\n - `\"# A\"` (info/1)\n\n- `no_calls`. The sum of the number of resolved and unresolved calls:\n\n - `\"# (XLin) E + # (LLin) E\"` (info/1)\n - `\"T = E | mod:Mod, # (LLin) T + # (XLin) T\"` (module)\n - `\"T = E | app:App, # (LLin) T + # (XLin) T\"` (application)\n - `\"T = E | rel:Rel, # (LLin) T + # (XLin) T\"` (release)\n\n- `no_functions`. Functions in library modules and the functions\n `module_info/0,1` are not counted by `info`. Assuming that\n `\"Extra := _:module_info/\\\"(0|1)\\\" + LM\"` has been evaluated, the sum of the\n number of local and exported functions are:\n\n - `\"# (F - Extra)\"` (info/1)\n - `\"# (F * mod:Mod - Extra)\"` (module)\n - `\"# (F * app:App - Extra)\"` (application)\n - `\"# (F * rel:Rel - Extra)\"` (release)\n\n- `no_function_calls`. The sum of the number of local calls, resolved external\n calls and unresolved calls:\n\n - `\"# LC + # XC\"` (info/1)\n - `\"# LC | mod:Mod + # XC | mod:Mod\"` (module)\n - `\"# LC | app:App + # XC | app:App\"` (application)\n - `\"# LC | rel:Rel + # XC | mod:Rel\"` (release)\n\n- `no_inter_function_calls`\n\n - `\"# EE\"` (info/1)\n - `\"# EE | mod:Mod\"` (module)\n - `\"# EE | app:App\"` (application)\n - `\"# EE | rel:Rel\"` (release)\n\n- `no_releases`\n\n - `\"# R\"` (info/1)","ref":"xref.html#info/3"},{"type":"function","title":"xref.m/1","doc":"The given BEAM file (with or without the `.beam` extension) or the file found by\ncalling `code:which(Module)` is checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions.\n\nThe code path is used as [library path](`m:xref#library_path`).\n\nIf the BEAM file contains [debug information](`m:xref#debug_info`), a list\nof tuples is returned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of calls to deprecated\n functions;\n- `undefined`, the second element is a sorted list of calls to undefined\n functions;\n- `unused`, the second element is a sorted list of unused local functions.\n\nIf the BEAM file does not contain debug information, a list of tuples is\nreturned. The first element of each tuple is one of:\n\n- `deprecated`, the second element is a sorted list of externally used\n deprecated functions;\n- `undefined`, the second element is a sorted list of undefined functions.","ref":"xref.html#m/1"},{"type":"function","title":"xref.q/2","doc":"","ref":"xref.html#q/2"},{"type":"function","title":"xref.q/3","doc":"Evaluates a [query](`m:xref#query`) in the context of an\n[Xref server](`m:xref#xref_server`), and returns the value of the last\nstatement.\n\nThe syntax of the value depends on the expression:\n\n- A set of calls is represented by a sorted list without duplicates of\n `t:call/0`.\n- A set of constants is represented by a sorted list without duplicates of\n `t:constant/0`.\n- A set of strongly connected components is a sorted list without duplicates of\n `Component`.\n- A set of calls between strongly connected components is a sorted list without\n duplicates of `ComponentCall`.\n- A chain of calls is represented by a list of `t:constant/0`. The list contains\n the From vertex of every call and the To vertex of the last call.\n- The `of` operator returns `false` if no chain of calls between the given\n constants can be found.\n- The value of the `closure` operator (the `digraph` representation) is\n represented by the atom `'closure()'`.\n- A set of line numbered functions is represented by a sorted list without\n duplicates of `DefineAt`.\n- A set of line numbered function calls is represented by a sorted list without\n duplicates of `CallAt`.\n- A set of line numbered functions and function calls is represented by a sorted\n list without duplicates of `AllLines`.\n\nFor both `CallAt` and `AllLines` it holds that for no list element is\n`LineNumbers` an empty list; such elements have been removed. The constants of\n`component` and the integers of `LineNumbers` are sorted and without duplicates.","ref":"xref.html#q/3"},{"type":"function","title":"xref.remove_application/2","doc":"Removes applications and their modules and [module data](`m:xref#module_data`)\nfrom an [Xref server](`m:xref#xref_server`).","ref":"xref.html#remove_application/2"},{"type":"function","title":"xref.remove_module/2","doc":"Removes [analyzed modules](`m:xref#analyzed_module`) and\n[module data](`m:xref#module_data`) from an [Xref server](`m:xref#xref_server`).","ref":"xref.html#remove_module/2"},{"type":"function","title":"xref.remove_release/2","doc":"Removes releases and their applications, modules, and\n[module data](`m:xref#module_data`) from an [Xref server](`m:xref#xref_server`).","ref":"xref.html#remove_release/2"},{"type":"function","title":"xref.replace_application/3","doc":"","ref":"xref.html#replace_application/3"},{"type":"function","title":"xref.replace_application/4","doc":"Replaces the modules of an application with other modules read from an\napplication directory.\n\nRelease membership of the application is retained. Note that the name\nof the application is kept; the name of the given directory is not\nused.","ref":"xref.html#replace_application/4"},{"type":"function","title":"xref.replace_module/3","doc":"","ref":"xref.html#replace_module/3"},{"type":"function","title":"xref.replace_module/4","doc":"Replaces [module data](`m:xref#module_data`) of an\n[analyzed module](`m:xref#analyzed_module`) with data read from a BEAM file.\n\nApplication membership of the module is retained, and so is the value of the\n`builtins` option of the module. An error is returned if the name of the read\nmodule differs from the given module.\n\nThe `update` function is an alternative for updating module data of recompiled\nmodules.","ref":"xref.html#replace_module/4"},{"type":"function","title":"xref.set_default/2","doc":"Sets default values for multiple options given by `OptionValues`.\n\nSee `set_default/3` for the name of options and their allowed values.","ref":"xref.html#set_default/2"},{"type":"function","title":"xref.set_default/3","doc":"Sets the default value of one or more options.\n\nThe options that can be set this way are:\n\n- `builtins`, with initial default value `false`;\n- `recurse`, with initial default value `false`;\n- `verbose`, with initial default value `false`;\n- `warnings`, with initial default value `true`.\n\nThe initial default values are set when creating an\n[Xref server](`m:xref#xref_server`).","ref":"xref.html#set_default/3"},{"type":"function","title":"xref.set_library_path/2","doc":"","ref":"xref.html#set_library_path/2"},{"type":"function","title":"xref.set_library_path/3","doc":"Sets the [library path](`m:xref#library_path`).\n\nIf the given path is a list of directories, the set of [library\nmodules](`m:xref#library_module`) is determined by choosing the first\nmodule encountered while traversing the directories in the given\norder, for those modules that occur in more than one directory. By\ndefault, the library path is an empty list.\n\nThe library path `code_path`{: #code_path } is used by the functions\n[`m/1`](`m/1`) and [`d/1`](`d/1`), but can also be set explicitly. However,\nnote that the code path will be traversed once for each used\n[library module](`m:xref#library_module`) while setting up module data. On the\nother hand, if there are only a few modules that are used but not analyzed,\nusing `code_path` may be faster than setting the library path to\n`code:get_path/0`.\n\nIf the library path is set to `code_path`, the set of library modules is not\ndetermined, and the `info` functions will return empty lists of library modules.","ref":"xref.html#set_library_path/3"},{"type":"function","title":"xref.start/1","doc":"Creates an [Xref server](`m:xref#xref_server`).\n\nThe process can optionally be given a name. The default\n[mode](`m:xref#mode`) is `functions`. Options that are\nnot recognized by Xref are passed on to `gen_server:start/4`.","ref":"xref.html#start/1"},{"type":"function","title":"xref.start/2","doc":"Creates an [Xref server](`m:xref#xref_server`) with a given name.\n\nThe default [mode](`m:xref#mode`) is `functions`. Options that are\nnot recognized by Xref are passed on to `gen_server:start/4`.","ref":"xref.html#start/2"},{"type":"function","title":"xref.stop/1","doc":"Stops an [Xref server](`m:xref#xref_server`).","ref":"xref.html#stop/1"},{"type":"function","title":"xref.update/1","doc":"","ref":"xref.html#update/1"},{"type":"function","title":"xref.update/2","doc":"Replaces the [module data](`m:xref#module_data`) of all\n[analyzed modules](`m:xref#analyzed_module`) the BEAM files of which have been\nmodified since last read by an `add` function or `update`.\n\nApplication membership of the modules is retained, and so is the value\nof the `builtins`option. Returns a sorted list of the names of\nthe replaced modules.","ref":"xref.html#update/2"},{"type":"function","title":"xref.variables/1","doc":"","ref":"xref.html#variables/1"},{"type":"function","title":"xref.variables/2","doc":"Returns a sorted lists of the names of the variables of an\n[Xref server](`m:xref#xref_server`).\n\nThe default is to return only the\n[user variables](`m:xref#user_variable`).","ref":"xref.html#variables/2"},{"type":"type","title":"xref.add_dir_rsn/0","doc":"","ref":"xref.html#t:add_dir_rsn/0"},{"type":"type","title":"xref.add_mod_rsn/0","doc":"","ref":"xref.html#t:add_mod_rsn/0"},{"type":"type","title":"xref.analysis/0","doc":"","ref":"xref.html#t:analysis/0"},{"type":"type","title":"xref.analyze_rsn/0","doc":"","ref":"xref.html#t:analyze_rsn/0"},{"type":"type","title":"xref.answer/0","doc":"","ref":"xref.html#t:answer/0"},{"type":"type","title":"xref.app_spec/0","doc":"","ref":"xref.html#t:app_spec/0"},{"type":"type","title":"xref.application/0","doc":"","ref":"xref.html#t:application/0"},{"type":"type","title":"xref.call/0","doc":"","ref":"xref.html#t:call/0"},{"type":"type","title":"xref.component/0","doc":"","ref":"xref.html#t:component/0"},{"type":"type","title":"xref.constant/0","doc":"","ref":"xref.html#t:constant/0"},{"type":"type","title":"xref.define_at/0","doc":"","ref":"xref.html#t:define_at/0"},{"type":"type","title":"xref.depr_flag/0","doc":"","ref":"xref.html#t:depr_flag/0"},{"type":"type","title":"xref.directory/0","doc":"","ref":"xref.html#t:directory/0"},{"type":"type","title":"xref.file/0","doc":"","ref":"xref.html#t:file/0"},{"type":"type","title":"xref.file_error/0","doc":"","ref":"xref.html#t:file_error/0"},{"type":"type","title":"xref.func_spec/0","doc":"","ref":"xref.html#t:func_spec/0"},{"type":"type","title":"xref.funcall/0","doc":"","ref":"xref.html#t:funcall/0"},{"type":"type","title":"xref.function_name/0","doc":"","ref":"xref.html#t:function_name/0"},{"type":"type","title":"xref.info/0","doc":"","ref":"xref.html#t:info/0"},{"type":"type","title":"xref.library/0","doc":"","ref":"xref.html#t:library/0"},{"type":"type","title":"xref.library_path/0","doc":"","ref":"xref.html#t:library_path/0"},{"type":"type","title":"xref.mod_spec/0","doc":"","ref":"xref.html#t:mod_spec/0"},{"type":"type","title":"xref.mode/0","doc":"","ref":"xref.html#t:mode/0"},{"type":"type","title":"xref.path/0","doc":"","ref":"xref.html#t:path/0"},{"type":"type","title":"xref.q_rsn/0","doc":"","ref":"xref.html#t:q_rsn/0"},{"type":"type","title":"xref.rel_spec/0","doc":"","ref":"xref.html#t:rel_spec/0"},{"type":"type","title":"xref.release/0","doc":"","ref":"xref.html#t:release/0"},{"type":"type","title":"xref.string_position/0","doc":"","ref":"xref.html#t:string_position/0"},{"type":"type","title":"xref.variable/0","doc":"","ref":"xref.html#t:variable/0"},{"type":"type","title":"xref.xarity/0","doc":"","ref":"xref.html#t:xarity/0"},{"type":"type","title":"xref.xmfa/0","doc":"","ref":"xref.html#t:xmfa/0"},{"type":"type","title":"xref.xref/0","doc":"","ref":"xref.html#t:xref/0"},{"type":"extras","title":"Tools Release Notes","doc":"\n# Tools Release Notes\n\nThis document describes the changes made to the Tools application.","ref":"notes.html"},{"type":"extras","title":"Tools 4.0 - Tools Release Notes","doc":"","ref":"notes.html#tools-4-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Dialyzer warnings due to type specs added in `m:dbg` have been eliminated.\n\n Own Id: OTP-18860\n\n- In Erlang/OTP 26, doing a `m:cover` analysis on the `line` level would return multiple entries for lines on which multiple functions were defined.\n \n For example, consider this module:\n \n -module(foo).\n -export([bar/0, baz/0]).\n \n bar() -> ok. baz() -> not_ok.\n \n In Erlang/OTP 26, analysing on the `line` level would return two entries\n for line 4:\n \n 1> cover:compile_module(foo).\n {ok,foo}\n 2> foo:bar().\n ok\n 3> cover:analyse(foo, coverage, line).\n {ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}\n 4> cover:analyse(foo, calls, line).\n {ok,[{{foo,4},1},{{foo,4},0}]}\n \n In Erlang/OTP 27, there will only be a single entry for line 4:\n \n 1> cover:compile_module(foo).\n {ok,foo}\n 2> foo:bar().\n ok\n 3> cover:analyse(foo, coverage, line).\n {ok,[{{foo,4},{1,0}}]}\n 4> cover:analyse(foo, calls, line).\n {ok,[{{foo,4},1}]}\n\n Own Id: OTP-18998 Aux Id: [GH-8159], [PR-8182]\n\n- Fixed align command in emacs mode.\n\n Own Id: OTP-19026 Aux Id: [PR-8155]\n\n[GH-8159]: https://github.com/erlang/otp/issues/8159\n[PR-8182]: https://github.com/erlang/otp/pull/8182\n[PR-8155]: https://github.com/erlang/otp/pull/8155","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Triple-Quoted Strings has been implemented as per [EEP 64](https://www.erlang.org/eeps/eep-0064). See [String](`e:system:data_types.md#string`) in the Reference Manual.\n \n Example:\n \n ```erlang\n 1> \"\"\"\n a\n b\n c\n \"\"\".\n \"a\\nb\\nc\"\n ```\n \n Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:\n \n ```erlang\n 1> \"abc\"\"xyz\".\n \"xyz\".\n * 1:6: adjacent string literals without intervening white space\n ```\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-18750 Aux Id: OTP-18746, [PR-7313], [PR-7451]\n\n- There is a new tool `m:tprof`, which combines the functionality of `m:eprof` and `m:cprof` under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.\n \n *Example*:\n \n ```erlang\n 1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).\n \n ****** Process <0.92.0> -- 100.00% of total *** \n FUNCTION CALLS WORDS PER CALL [ %]\n lists:seq_loop/3 5 32 6.40 [100.00]\n 32 [ 100.0]\n ok\n ```\n\n Own Id: OTP-18756 Aux Id: [PR-6639]\n\n- Native coverage support has been implemented in the JIT. It will automatically be used by the `m:cover` tool to reduce the execution overhead when running cover-compiled code.\n \n There are also new APIs to support native coverage without using the `cover` tool.\n \n To instrument code for native coverage it must be compiled with the [`line_coverage`](`m:compile#line_coverage`) option.\n \n To enable native coverage in the runtime system, start it like so:\n \n ```text\n $ erl +JPcover true\n ```\n \n There are also the following new functions for supporting native coverage:\n \n * `code:coverage_support/0`\n * `code:get_coverage/2`\n * `code:reset_coverage/1`\n * `code:get_coverage_mode/0`\n * `code:get_coverage_mode/1`\n * `code:set_coverage_mode/1`\n\n Own Id: OTP-18856 Aux Id: [PR-7856]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Improved the align command in emacs mode.\n\n Own Id: OTP-19080 Aux Id: [PR-8288]\n\n[PR-7313]: https://github.com/erlang/otp/pull/7313\n[PR-7451]: https://github.com/erlang/otp/pull/7451\n[PR-6639]: https://github.com/erlang/otp/pull/6639\n[PR-7856]: https://github.com/erlang/otp/pull/7856\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8288]: https://github.com/erlang/otp/pull/8288","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-6"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Map comprehensions as suggested in EEP 58 has now been implemented.\n\n Own Id: OTP-18413 Aux Id: EEP-58, PR-6727\n\n- The `instrument` module has been moved from `tools` to `runtime_tools`.\n\n Own Id: OTP-18487 Aux Id: PR-6829","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.5.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-5-3"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Removed the previously undocumented and unsupported `emem` tool.\n\n Own Id: OTP-17892 Aux Id: PR-5591","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.5.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Erlang-mode fixed for newer versions of xref using CL-Lib structures instead\n of EIEIO classes.\n\n Own Id: OTP-17746 Aux Id: GH-5314, PR-5324","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.5.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The `cover` tool would not work on modules compiled with the `tuple_calls`\n option.\n\n Own Id: OTP-17440 Aux Id: GH-4796","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- For cover-compiled code, the error behaviour of list and binary comprehensions\n that used `andalso`/`orelse` in guards could be changed so that a filter that\n was supposed be evaluated in guard context was evaluated in body context. That\n is, there was a possibility that comprehensions that did not raise exceptions\n could raise exceptions when being run using `cover`.\n\n Own Id: OTP-17221 Aux Id: PR-4547","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Support for handling abstract code created before OTP R15 has been dropped.\n\n Own Id: OTP-16678 Aux Id: PR-2627\n\n- Add types and specifications for documentation.\n\n Own Id: OTP-16957\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.4.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-4-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` would crash when compiling a module having an exported function named\n `clauses`.\n\n Own Id: OTP-17162 Aux Id: GH-4549, PR-2997, PR-4555, elixir-lang/elixir#10666\n\n- If `beam_lib` is asked to return abstract code for a BEAM file produced by\n Elixir and Elixir is not installed on the computer, `beam_lib` will no longer\n crash, but will return an error tuple. The `cover:compile_beam()` and\n `cover:compile_beam_directory()` functions have been updated to also return an\n error tuple in that situation.\n\n Own Id: OTP-17194 Aux Id: GH-4353\n\n- Make emacs mode work on emacs-27.\n\n Own Id: OTP-17225 Aux Id: PR-4542, GH-4451","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.4.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Correct the Xref analysis `undefined_functions` to not report internally\n generated behaviour_info/1.\n\n Own Id: OTP-17191 Aux Id: OTP-16922, ERL-1476, GH-4192","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.4.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Correct the Xref analysis `exports_not_used` to not report internally\n generated `behaviour_info/1`.\n\n Own Id: OTP-16922 Aux Id: PR-2752","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.4.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Correct the Xref analysis `locals_not_used` to find functions called\n exclusively from `on_load` functions.\n\n Own Id: OTP-16854 Aux Id: PR-2750","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-4"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Updates for new `erlang:term_to_iovec()` BIF.\n\n Own Id: OTP-16128 Aux Id: OTP-15618\n\n- Improved the presentation of allocations and carriers in the `instrument`\n module.\n\n Own Id: OTP-16327\n\n- Minor updates due to the new spawn improvements made.\n\n Own Id: OTP-16368 Aux Id: OTP-15251","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.3.1.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-3-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` would crash when compiling a module having an exported function named\n `clauses`.\n\n Own Id: OTP-17162 Aux Id: GH-4549, PR-2997, PR-4555, elixir-lang/elixir#10666","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.3.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- An Emacs warning due to lacking type in defcustom declaration has been fixed.\n\n Own Id: OTP-16356\n\n- Improve emacs indentation.\n\n Own Id: OTP-16472 Aux Id: ERL-1140\n\n- The cover tool could generate instrumented code for a module that would cause\n warnings to be issued.\n\n Own Id: OTP-16476 Aux Id: ERL-1147\n\n- Fixed generated [fprof analysis format](`m:fprof#analysis`) to also handle\n data in maps.\n\n Own Id: OTP-16498 Aux Id: ERL-814","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Improve `-spec` indentation in emacs mode.\n\n Own Id: OTP-16164","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- The Emacs erlang-mode function that lets the user open the documentation for\n an Erlang/OTP function in an Emacs buffer has been improved. Bugs in this\n function has been fixed and and the user will now be asked if the man pages\n should be downloaded automatically by Emacs when they can't be found on the\n system. To test this functionality, put the cursor over the function name in a\n call to an Erlang/OTP function (e.g., \"io:format(\"arg\")\") and type C-c C-d\n (i.e., Ctrl-key and c-key and then Ctrl-key and d-key). There is also a new\n menu item under the Erlang menu (labeled \"Man - Function Under Cursor\").\n\n Own Id: OTP-16174","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.2.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Add `cprof` and `tags` modules to .app file so that they are included in\n releases.\n\n Own Id: OTP-15534 Aux Id: PR-2078\n\n- Improved documentation parsing in emacs erldoc functionality.\n\n Own Id: OTP-15699 Aux Id: PR-2184","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- The `cover` tool now uses the `counters` module instead of `ets` for updating\n the counters for how many times a line has been executed. By default, Cover\n will work with distributed nodes, but a new function `cover:local_only/0`\n allows running the Cover in a restricted but faster local-only mode.\n\n The increase in speed will vary depending on the type of code being\n cover-compiled, but as an example, the compiler test suite runs more than\n twice as fast with the new Cover.\n\n Own Id: OTP-15575","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.1.0.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-1-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 3.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Minor fixes for `make clean`.\n\n Own Id: OTP-15657","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- In the HTML file generated by `cover:analyse_to_file/1,2`, a link is now added\n to the line number. This makes it easier to share pointers to specific lines.\n\n Own Id: OTP-15541\n\n- Uncovered lines are now marked with a sad face, `:-(`, in the HTML output from\n `cover:analyse_to_file/1,2`. This is to make these lines easier to find by\n search.\n\n Own Id: OTP-15542","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.0.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-0-2"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Remove emacs warnings and added more tests.\n\n Own Id: OTP-15476","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.0.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-0-1"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- The HTML pages generated by cover:analyse_to_file/1 and related functions is\n improved for readability.\n\n Own Id: OTP-15213 Aux Id: PR-1807\n\n- Add alignment functionality in emacs.\n\n Own Id: OTP-15239 Aux Id: PR-1728","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 3.0 - Tools Release Notes","doc":"","ref":"notes.html#tools-3-0"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Added `instrument:allocations` and `instrument:carriers` for retrieving\n information about memory utilization and fragmentation.\n\n The old `instrument` interface has been removed, as have the related options\n `+Mim` and `+Mis`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14961","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.11.2.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-11-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` would fail to start if two processes tried to start it at the exact\n same time.\n\n Own Id: OTP-15813 Aux Id: ERL-943","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.11.2.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-11-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Minor fixes for `make clean`.\n\n Own Id: OTP-15657","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.11.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-11-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- A counting bug is corrected in `Cover`. The bug was introduced in Erlang/OTP\n 18.0.\n\n Own Id: OTP-14817 Aux Id: PR 1641\n\n- The `lcnt` server will no longer crash if `lcnt:information/0` is called\n before `lcnt:collect/0`.\n\n Own Id: OTP-14912\n\n- `lcnt:collect` will now implicitly start the `lcnt` server, as per the\n documentation.\n\n Own Id: OTP-14913","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Improved indentation in emacs and various other updates.\n\n Own Id: OTP-14944","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.11.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.11 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The predefined Xref analysis `locals_not_used` no longer reports unused\n functions with the `-on_load()` attribute.\n\n The new predefined Xref variable `OL` holds all functions with the\n `-on_load()` attribute.\n\n Own Id: OTP-14344\n\n- In fprof when sampling multiple processes and analyzing with totals set to\n true, the output now sums together all caller and callee entries which\n concerns the same function. Previous behaviour was to report each contributing\n entry separately.\n\n Own Id: OTP-14500","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Lock counting can now be fully toggled at runtime in the lock counting\n emulator (`-emu_type lcnt`). Everything is enabled by default to match the old\n behavior, but specific categories can be toggled at will with minimal runtime\n overhead when disabled. Refer to the documentation on `lcnt:rt_mask/1` for\n details.\n\n Own Id: OTP-13170\n\n- `lcnt:collect` and `lcnt:clear` will no longer block all other threads in the\n runtime system.\n\n Own Id: OTP-14412\n\n- General Unicode improvements.\n\n Own Id: OTP-14462\n\n- Tools are updated to show Unicode atoms correctly.\n\n Own Id: OTP-14464\n\n- Add `erlang:iolist_to_iovec/1`, which converts an iolist() to an\n erlang:iovec(), which suitable for use with `enif_inspect_iovec`.\n\n Own Id: OTP-14520","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.10.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- In OTP-20.0, the behavior of c, make, and ct_make was changed so that in some\n cases the beam files by default would be written to the directory where the\n source files were found. This is now changed back to the old behavior so beam\n files are by default written to current directory.\n\n Own Id: OTP-14489 Aux Id: ERL-438","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.10 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- In some situations, `make:all()` and friends did not detect changes in include\n files located in the current directory. This is now corrected.\n\n Own Id: OTP-14339 Aux Id: ERL-395","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- The `make` module now accepts the `{emake,Emake}` option.\n\n Own Id: OTP-14253\n\n- Miscellaneous updates due to atoms containing arbitrary Unicode characters.\n\n Own Id: OTP-14285","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.9.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-9-1"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Improved edoc support in emacs mode.\n\n Own Id: OTP-14217 Aux Id: PR-1282","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.9 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Fix unhandled trace event send_to_non_existing_process in fprof.\n\n Own Id: OTP-13998","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Improved edoc support in emacs erlang-mode.\n\n Own Id: OTP-13945 Aux Id: PR-1157\n\n- Added erldoc to emacs mode which opens html documentation in browser from\n emacs. For example `M-x erldoc-browse RET lists:foreach/2`.\n\n Own Id: OTP-14018 Aux Id: PR-1197","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.8.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Errors in type specification and Emacs template generation for\n `gen_statem:code_change/4` has been fixed from bugs.erlang.org's Jira cases\n ERL-172 and ERL-187.\n\n Own Id: OTP-13746 Aux Id: ERL-172, ERL-187\n\n- Fix gc_start/gc_end in fprof tags when parsing old trace logs.\n\n Own Id: OTP-13778 Aux Id: PR-1136\n\n- `make` (tools) and `ct_make` (common_test) would crash if an Erlang source\n file contained a `-warning()` directive.\n\n Own Id: OTP-13855","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.8.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Correct a bug when adding multiple modules to an Xref server. The bug was\n introduced in OTP-19.0.\n\n Own Id: OTP-13708 Aux Id: ERL-173","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.8.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Update fprof to use the new 'spawned' trace event to determine when a process\n has been created.\n\n Own Id: OTP-13499","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Optimize adding multiple modules to an Xref server.\n\n Own Id: OTP-13593\n\n- Various emacs mode improvements, such as better tags support.\n\n Own Id: OTP-13610","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.8.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover:compile_beam/1` and `cover:compile_beam_directory/1,2` crashed when\n trying to compile a beam file without a `'file'` attribute. This has been\n corrected and an error is returned instead.\n\n Thanks to Louis-Philippe Gauthier for reporting this bug.\n\n Own Id: OTP-13200\n\n- Fix a bit string comprehension bug in Cover.\n\n Own Id: OTP-13277 Aux Id: PR 856","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.8.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The emacs mode does not add a newline after the arrow on -callback lines\n anymore.\n\n Own Id: OTP-13042","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.8.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- If a module includes eunit.hrl, a parse transform adds the function test/0 on\n line 0 in the module. A bug in OTP-18.0 caused cover:analyse_to_file/1 to fail\n to insert cover data in the output file when line 0 existed in the cover data\n table. This is now corrected.\n\n Own Id: OTP-12981","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.8 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- In order to improve performance of the cover tool, new functions are added for\n cover compilation and analysis on multiple files. This allows for more\n parallelisation.\n\n Some improvements of the data base access is also done in order to improve the\n performance when analysing and resetting cover data.\n\n Minor incompatibility: An error reason from analyse_to_file is changed from\n no_source_code_found to \\{no_source_code_found,Module\\}.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12330 Aux Id: seq12757\n\n- Attempting to do a `cover` analysis when neither source code nor beam file\n could be found would hang the `cover` server. Corrected to return a proper\n error.\n\n Own Id: OTP-12806","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Allow maps for supervisor flags and child specs\n\n Earlier, supervisor flags and child specs were given as tuples. While this is\n kept for backwards compatibility, it is now also allowed to give these\n parameters as maps, see [sup_flags](`m:supervisor#sup_flags`) and\n [child_spec](`m:supervisor#child_spec`).\n\n Own Id: OTP-11043\n\n- Remove Mnemosyne rules support.\n\n Own Id: OTP-12511\n\n- Add printout of total number of calls and time in eprof\n\n Own Id: OTP-12681","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.7.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-7-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Fix lcnt sorting and printout of histograms.\n\n Own Id: OTP-12364\n\n- Fix a Unicode bug in the `tags` module.\n\n Own Id: OTP-12567\n\n- Fix tags completion in erlang.el for GNU Emacs 23+\n\n Own Id: OTP-12583","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.7.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Fixed a typo in erlang-mode comment.\n\n Own Id: OTP-12214\n\n- Add a skeleton for -spec in Erlang mode for Emacs\n\n Own Id: OTP-12283","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Cover no longer crashes when compiling `receive` and the like with just an\n `after` clause. Thanks to José Valim for providing a fix.\n\n Own Id: OTP-12328","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.7 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-7"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Add log2 histogram to lcnt for lock wait time\n\n Own Id: OTP-12059","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.15 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-15"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Removed `erlang:bitstr_to_list/1` and `erlang:list_to_bitstr/1`. They were\n added by mistake, and have always raised an `undefined` exception when called.\n\n Own Id: OTP-11942","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.14 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-14"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Removed the support for the query keyword from emacs mode (Thanks to Paul\n Oliver)\n\n Own Id: OTP-11568\n\n- Emacs mode improvements (Thanks to Steve Vinoski)\n\n Own Id: OTP-11601\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744\n\n- The emacs erlang mode now match erlang keywords more carefully (Thanks to\n Steve Vinoski)\n\n Own Id: OTP-11786\n\n- The emacs erlang-mode now auto loads for more file types (Thanks to Phil\n Hagelberg)\n\n Own Id: OTP-11788","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- `cover` can run on itself. Also, support for reading BEAM files produced by\n ancient OTP versions before R9C has been removed.\n\n Own Id: OTP-11692\n\n- Support maps in cover\n\n Own Id: OTP-11764","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.13 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-13"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Erlang-specific compilation error regexp is added in erlang-eunit.el. This\n defvar was earlier in erlang.el, but was erroneously removed in R15B02, while\n still used by erlang-eunit.el.\n\n Own Id: OTP-11417 Aux Id: seq12447\n\n- Take compiler options from beam in cover:compile_beam. Thanks to Péter Gömöri.\n\n Own Id: OTP-11439\n\n- Silence warnings (Thanks to Anthony Ramine)\n\n Own Id: OTP-11517","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Add iodata, nonempty_string to built-in type highlighting for emacs. Thanks to\n Paul Oliver.\n\n Own Id: OTP-11394","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.12 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-12"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Remove trailing spaces in Emacs templates. Thanks to Roberto Aloi.\n\n Own Id: OTP-11198\n\n- Fixed the Emacs erlang-mode to accommodate the coding style where lists\n written across several lines have each line starting with a comma. Thanks to\n Magnus Henoch.\n\n Own Id: OTP-11242\n\n- Make the Emacs Erlang mode TRAMP-aware when compiling. Thanks to Tomas\n Abrahamsson.\n\n Own Id: OTP-11270","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.11 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- When cover:stop(Node) was called on a non-existing node, a process waiting for\n cover data from the node would hang forever. This has been corrected.\n\n Own Id: OTP-10979","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Make cover smarter about finding source from beam.\n\n In particular, search using the source path in module_info if the current\n heuristic fails.\n\n Own Id: OTP-10902\n\n- Remove Flymake dependency in erlang-pkg.el. Thanks to Magnus Henoch.\n\n Own Id: OTP-10930\n\n- Erlang-mode: Add autoload cookies for file extension associations. Thanks to\n Magnus Henoch.\n\n Own Id: OTP-10999\n\n- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016\n\n- Fix a race condition when there're several applications in apps directory.\n Thanks to Manuel Rubio.\n\n Own Id: OTP-11028\n\n- New option for eprof, 'set_on_spawn'. This option was previously always on and\n is also the default.\n\n Own Id: OTP-11144","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.10 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-10"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Fix a bug in cover when used with no_auto_import. Thanks to José Valim.\n\n Own Id: OTP-10778","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.9 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Add missing modules in app-file\n\n Own Id: OTP-10439\n\n- Make erlang-mode more compatible with package.el (Thanks to Gleb Peregud)\n\n Own Id: OTP-10465\n\n- Fix various typos (thanks to Tuncer Ayaz)\n\n Own Id: OTP-10611\n\n- Add separate face for exported functions (Thanks to Thomas Järvstrand)\n\n Own Id: OTP-10637\n\n- The BIF highlighting in the emacs mode has been updated to correspond with the\n correct BIFs.\n\n Own Id: OTP-10774","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Support for Unicode has been implemented.\n\n Own Id: OTP-10302\n\n- A new function, cover:flush(Nodes), is added which will fetch data from remote\n nodes without stopping cover on those nodes. This is used by test_server and\n common_test when it is safe to assume that the node will be terminated after\n the test anyway. The purpose is to avoid processes crashing when re-loading\n the original beam if the processes is still running old code.\n\n Remote nodes will now continue to count code coverage if the connection to the\n main node is broken. Earlier, a broken connection would cause the cover_server\n on the remote node to die and thus any still cover compiled modules would\n cause process crash when trying to insert cover data in ets tables that used\n to exist on the cover_server. The new functionality also involves\n synchronization with the main node if the nodes are reconnected.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10523 Aux Id: OTP-10427\n\n- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Fix syntax highlighting of $\\\\' in Emacs mode. Thanks to Magnus Henoch.\n\n Own Id: OTP-10766","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.8 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The last tuple fun call has been removed from fprof.\n\n Own Id: OTP-10091 Aux Id: seq12067\n\n- Fix indentation of record fields in Emacs (Thanks to Tomas Abrahamsson)\n\n Own Id: OTP-10120\n\n- Documentation fixes (Thanks to Ricardo Catalinas Jiménez )\n\n Own Id: OTP-10121\n\n- Remove Erlang-specific compilation error regexp in erlang.el\n\n Own Id: OTP-10168\n\n- Fix highlighting of atoms ending with a dollar sign\n\n Like this: 'atom$'. In that example, the last single quote should be\n recognised as ending the atom. This needs a font-lock workaround similar to\n the one for strings. Thanks to Magnus Henoch\n\n Own Id: OTP-10178\n\n- Xref now accepts filenames with character codes greater than 126. (Thanks to\n Emile Joubert for reporting the issue.)\n\n Own Id: OTP-10192\n\n- Add test_indentation target to lib/tools/emacs/Makefile\n\n Automatically indent test.erl.orig, save to test.erl, and compare to\n test.erl.intended. Thanks to Magnus Henoch.\n\n Own Id: OTP-10226","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.7 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Makefiles in erts, hipe and tools have been corrected to enable parallel make,\n i.e MAKEFLAGS=-jX where X is the parallelity number. As a result of this\n dependencies were corrected since that is what is needed for parallel make to\n work.\n\n Own Id: OTP-9857 Aux Id: OTP-9451\n\n- Minor suppressions and fixes of compilation warnings\n\n Own Id: OTP-10016","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.6.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Update system profiling principles to reflect eprof performance improvements.\n\n Own Id: OTP-9656\n\n- \\[cover] fix leftover \\{'DOWN', ..\\} msg in callers queue\n\n After stopping cover with cover:stop() there could still be a \\{'DOWN',...\\}\n leftover message in the calling process's message queue. This unexpected\n leftover could be eliminated if erlang:demonitor/2 with option flush would be\n used in certain points\n\n Own Id: OTP-9694\n\n- Add deps as erlang-flymake include directory.\n\n Update erlang-flymake to recognize the \"deps\" folder as an include directory.\n This makes erlang-flymake compatible with the rebar dependency management\n tool's default folder structure, which puts included dependencies in\n \"deps\".(Thanks to Kevin Albrecht)\n\n Own Id: OTP-9791","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Variables are now now allowed in '`fun M:F/A`' as suggested by Richard O'Keefe\n in EEP-23.\n\n The representation of '`fun M:F/A`' in the abstract format has been changed in\n an incompatible way. Tools that directly read or manipulate the abstract\n format (such as parse transforms) may need to be updated. The compiler can\n handle both the new and the old format (i.e. extracting the abstract format\n from a pre-R15 BEAM file and compiling it using compile:forms/1,2 will work).\n The `syntax_tools` application can also handle both formats.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9643\n\n- Tuple funs (a two-element tuple with a module name and a function) are now\n officially deprecated and will be removed in R16. Use '`fun M:F/A`' instead.\n To make you aware that your system uses tuple funs, the very first time a\n tuple fun is applied, a warning will be sent to the error logger.\n\n Own Id: OTP-9649\n\n- Eliminate use of deprecated regexp module\n\n Own Id: OTP-9810","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.6.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Teach the emacs mode to compile yecc and leex files\n\n If visiting a .yrl or .xrl file in emacs with erlang-mode, then the\n \\`erlang-compile' function (normally bound to C-c C-k), now knows how to\n compile yecc and leex files, and then, if that compilation succeeds, also\n compiles the resulting .erl files.\n\n Also introduce a \\`erlang-compile-command-function-alist' to make it possible\n to hook in other functions for computing compilation commands/expressions,\n depending on file name. (Thanks to Tomas Abrahamsson )\n\n Own Id: OTP-9503","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Bugs in xref(3) have been fixed. (Thanks to Matthias Lang.)\n\n Own Id: OTP-9416","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.6.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Change make:files to behave more like erlc\n\n This change removes the unnecessary checks on the files when make:files is\n called and allows the error checking to be done in compile:file, where the\n error messages are produced. It does not affect the return value.\n\n (Thanks to Sam bobroff)\n\n Own Id: OTP-9179\n\n- add user specified compiler options on form reloading\n\n In order to be able to test non-exported functions from another (test) module\n it is necessary to compile the specific module (at least during the test\n phase) with the export*all compiler option. This allows complete separation of\n testing and productive code. At the moment it is not possible to combine this\n with a test code coverage using the cover module. The problem is that when\n cover compiling a module using cover:compile*\\* the code is reloaded into the\n emulator omitting/filtering the passed user options. In my example above the\n export_all option would be removed and the non-exported functions cannot be\n called any more. (Thanks to Tobias Schlager)\n\n Own Id: OTP-9204\n\n- Inhibit electric newline after \"->\" when inside a type spec\n\n The Erlang mode for Emacs inserts a newline after every \"->\", which saves you\n one keystroke when writing a function, but that is inappropriate when writing\n a type spec, as you'd normally keep the spec on one line. This change inhibits\n the automatic insertion when the current line starts with \"-spec\" or\n \"-type\".(Thanks to Magnus Henoch)\n\n Own Id: OTP-9255\n\n- Add a check logic to prevent file descriptor leak\n\n cover module handle files as raw in export and import. Assert counts of ports\n are the same at the beginning and at the end of the test case.(Thanks to\n Shunichi Shinohara)\n\n Own Id: OTP-9300","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.6.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Declare indentation options as \"safe\" in erlang-mode for Emacs\n\n Emacs has a facility for setting options on a per-file basis based on comments\n in the source file. By default, all options are considered \"unsafe\", and the\n user is queried before the variable is set. This patch declares the variables\n erlang-indent-level, erlang-indent-guard and erlang-argument-indent to be\n safe, if the value specified in the source file is valid.\n\n Such declarations usually look like this:\n\n %% -_- erlang-indent-level: 2 -_-\n\n and appear on the first line of the file. (thanks to Magnus Henoch)\n\n Own Id: OTP-9122","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Cover has been improved to take less memory and allow parallel analysis of\n cover data. Data collection from nodes is now done in parallel and it is now\n possible to issue multiple analyse and analyse_to_file requests at the same\n time. A new function call async_analyse_to_file has also been introduced, see\n the documentation for more details.\n\n Own Id: OTP-9043 Aux Id: seq11771","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.6.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- eprof: API sort mismatch has now been fixed.\n\n Own Id: OTP-8853\n\n- eprof: fix division by zero in statistics\n\n Own Id: OTP-8963","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.6.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` will now show ampersand characters in the source code correctly.\n (Thanks to Tom Moertel.)\n\n Own Id: OTP-8776","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- A race condition affecting Cover has been removed.\n\n Own Id: OTP-8469\n\n- Emacs improvements:\n\n Fixed emacs-mode installation problems.\n\n Fixed a couple of -spec and -type indentation and font-lock problems.\n\n Fixed error messages on emacs-21.\n\n Magnus Henoch fixed several issues.\n\n Ralf Doering, Klas Johansson and Chris Bernard contributed various emacs-eunit\n improvements.\n\n Klas Johansson and Dave Peticolas added emacs-flymake support.\n\n Own Id: OTP-8530","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Xref has been updated to use the `re` module instead of the deprecated\n `regexp` module.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8472\n\n- When given the option `{builtins,true}` Xref now adds calls to operators.\n\n Own Id: OTP-8647\n\n- `eprof` has been reimplemented with support in the Erlang virtual machine and\n is now both faster (i.e. slows down the code being measured less) and scales\n much better. In measurements we saw speed-ups compared to the old eprof\n ranging from 6 times (for sequential code that only uses one scheduler/core)\n up to 84 times (for parallel code that uses 8 cores).\n\n Note: The API for the `eprof` has been cleaned up and extended. See the\n documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8706","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.5.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- A bug concerning bit comprehensions has been fixed in Cover. The bug was\n introduced in R13B03. (Thanks to Matthew Sackman.)\n\n Own Id: OTP-8340","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Add lock profiling tool.\n\n The Lock profiling tool, lcnt, can make use of the internal lock statistics\n when the runtime system is built with this feature enabled.\n\n This provides a mechanism to examine potential lock bottlenecks within the\n runtime itself.\n\n \\- Add erts_debug:lock_counters(\\{copy_save, bool()\\}). This option enables or\n disables statistics saving for destroyed processes and ets-tables. Enabling\n this might consume a lot of memory.\n\n \\- Add id-numbering for lock classes which is otherwise undefined.\n\n Own Id: OTP-8424\n\n- emacs: Moved code skeletons to a separate file and and added a configurable\n variable to choose skeleton. Thanks Dave Peticolas.\n\n Own Id: OTP-8446","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The coverage analysis tool `cover` has been improved when it comes to handling\n list and bit string comprehensions (a counter for each qualifier), bit syntax\n expressions (the Value and Size expressions), and try expressions (the body\n called `Exprs` in the Reference Manual). A few (not all) situations where\n several expressions are put on the same line are also handled better than\n before.\n\n Own Id: OTP-8188 Aux Id: seq11397\n\n- When loading Cover compiled code on remote nodes running code in the loaded\n module, a `badarg` failure was sometimes the result. This bug has been fixed.\n\n Own Id: OTP-8270 Aux Id: seq11423\n\n- The short-circuit operators `andalso` and `orelse` are now handled correctly\n by the coverage analysis tool `cover` (it is no longer checked that the second\n argument returns a Boolean value.)\n\n Own Id: OTP-8273","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `cover` now properly escapes greater-than and less-than characters in comments\n in HTML reports. (Thanks to Magnus Henoch.)\n\n Own Id: OTP-7939","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-3"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- xref:start/1 does now allow anonymous XREF processes to be started\n\n Own Id: OTP-7831","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- A bug in the Xref scanner has been fixed.\n\n Own Id: OTP-7423\n\n- A bug in Fprof where the function 'undefined' appeared to call 'undefined' has\n been corrected.\n\n Own Id: OTP-7509","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.6.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6-1"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- The documentation has been updated so as to reflect the last updates of the\n Erlang shell as well as the minor modifications of the control sequence `p` of\n the `io_lib` module.\n\n Superfluous empty lines have been removed from code examples and from Erlang\n shell examples.\n\n Own Id: OTP-6944 Aux Id: OTP-6554, OTP-6911\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`).\n\n Own Id: OTP-7009\n\n- The coverage analysis tool `cover` now handles the short-circuit Boolean\n expressions `andalso/2` and `orelse/2` properly.\n\n Own Id: OTP-7095","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The `cover` tool could use huge amounts of memory when used in a distributed\n system.\n\n Own Id: OTP-6758","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.5.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Missing buffer-local declaration in erlang.el has been added. Before this fix\n there could arise problems in other emacs modes after visiting a buffer using\n the erlang mode.\n\n Own Id: OTP-6721\n\n- Key-map for 'backward-delete-char-untabif updated to work properly with\n Xemacs.\n\n Own Id: OTP-6723","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Minor updates of Xref.\n\n Own Id: OTP-6586\n\n- Minor Makefile changes.\n\n Own Id: OTP-6689 Aux Id: OTP-6742\n\n- \"C-u C-c C-k\" now does a compile with both \"debug_info\" and \"export_all\".\n\n Own Id: OTP-6741","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.5.4.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-4-1"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Changes due to internal interface changes in the erts application which are\n needed at compile-time. No functionality has been changed.\n\n Own Id: OTP-6611 Aux Id: OTP-6580","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.5.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Made change to support the function erlang-find-tag for xemacs and emacs-21.\n\n Own Id: OTP-6512","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Minor updates of xref for future compatibility.\n\n Own Id: OTP-6513","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.5.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- `eprof` did not work reliably in the SMP emulator, because the trace receiver\n process could not process the trace messages fast enough. Therefore, `eprof`\n now blocks the other schedulers while profiling.\n\n Own Id: OTP-6373","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.5.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Fprof traces could become truncated for the SMP emulator. This bug has now\n been corrected.\n\n Own Id: OTP-6246","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.5.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- eprof now works somewhat better in the SMP emulator.\n\n Own Id: OTP-6152","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Fixed some bugs in `make`:\n\n `make:files/1,2` can now handle a file in another directory as argument,\n similar to `make:all/0,1`.\n\n When specifying a file name including the `.erl` extension in `Emakefile`,\n `make:all/0,1` looked for the object code in the wrong place.\n\n When specifying a file name including the `.erl` extension in `Emakefile` and\n some compile options for the file, `make:files/0,1` did not use the options as\n it should do.\n\n Own Id: OTP-6057 Aux Id: seq10299\n\n- `cover`: When `cover:stop()` was called, the cover compiled code was not\n unloaded (as stated in the documentation) but simply marked as 'old'. This\n meant that processes lingering in (or with funs referencing to) the cover\n compiled code would survive even when the cover server and its ETS tables was\n terminated.\n\n Now the cover compiled code is unloaded, meaning that processes lingering\n in/with references to it will be killed when `cover:stop` is called, instead\n of later crashing with `badarg` when trying to bump counters in ETS tables no\n longer existing.","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- Replaced call to deprecated function `file:file_info/1` with call to\n `filelib:is_dir/1` and `filelib:is_regular/1` in `tags.erl`.\n\n Own Id: OTP-6079","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.4.7 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- A bug in `fprof` profiling causing erroneous inconsistent trace failure has\n been corrected.\n\n Own Id: OTP-5922 Aux Id: seq10203","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.4.6 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- Emacs: `erlang-man-function` and `erlang-man-module` used a pattern matching\n to find the requested module that sometimes yielded unexpected results. For\n example, `erlang-man-module file` would display the man page for\n `CosFileTransfer_File`.\n\n Own Id: OTP-5746 Aux Id: seq10096\n\n- Some compiler warnings and Dialyzer warnings were eliminated in the Tools\n application.\n\n When tracing to a port (which `fprof` does), there could be fake schedule\n out/schedule in messages sent for a process that had exited.\n\n Own Id: OTP-5757","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.4.5 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The cross reference tool `xref` did not handle the new `fun M:F/A` construct\n properly. This problem has been fixed.\n\n Own Id: OTP-5653","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.4.4 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The `cover` tool did not escape '<' and '>' not being part of HTML tags in\n HTML log files.\n\n Own Id: OTP-5588","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.4.3 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-3"},{"type":"extras","title":"Improvements and New Features - Tools Release Notes","doc":"- It is now possible to encrypt the debug information in beam files, to help\n keep the source code secret. See `m:compile` for how to provide the key for\n encrypting, and `m:beam_lib` for how to provide the key for decryption so that\n tools such as Debugger, `xref`, or `cover` can be used.\n\n The `beam_lib:chunks/2` functions now accepts an additional chunk type\n '`compile_info`' to retrieve the compilation information directly as a term.\n (Thanks to Tobias Lindahl.)\n\n Own Id: OTP-5460 Aux Id: seq9787","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Tools 2.4.2 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The `cover` tool could not analyze empty modules on module level.\n\n Own Id: OTP-5418","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Tools 2.4.1 - Tools Release Notes","doc":"","ref":"notes.html#tools-2-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Tools Release Notes","doc":"- The `xref` analysis `locals_not_used` could return too many functions. This\n problem has been fixed.\n\n Own Id: OTP-5071\n\n- The `cover` tool could not always compile parse transformed modules. This\n problem has been fixed.\n\n Own Id: OTP-5305","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"cover - The Coverage Analysis Tool","doc":"\n# cover - The Coverage Analysis Tool","ref":"cover_chapter.html"},{"type":"extras","title":"Introduction - cover - The Coverage Analysis Tool","doc":"The module `cover` provides a set of functions for coverage analysis of Erlang\nprograms, counting how many times each [executable line](cover_chapter.md#lines)\nis executed.\n\nCoverage analysis can be used to verify test cases, making sure all relevant\ncode is covered, and can be helpful when looking for bottlenecks in the code.","ref":"cover_chapter.html#introduction"},{"type":"extras","title":"Getting Started With Cover - cover - The Coverage Analysis Tool","doc":"","ref":"cover_chapter.html#getting-started-with-cover"},{"type":"extras","title":"Example - cover - The Coverage Analysis Tool","doc":"Assume that a test case for the following program should be verified:\n\n```erlang\n-module(channel).\n-behaviour(gen_server).\n\n-export([start_link/0,stop/0]).\n-export([alloc/0,free/1]). % client interface\n-export([init/1,handle_call/3,terminate/2]). % callback functions\n\nstart_link() ->\n gen_server:start_link({local,channel}, channel, [], []).\n\nstop() ->\n gen_server:call(channel, stop).\n\n%%%-Client interface functions-------------------------------------------\n\nalloc() ->\n gen_server:call(channel, alloc).\n\nfree(Channel) ->\n gen_server:call(channel, {free,Channel}).\n\n%%%-gen_server callback functions----------------------------------------\n\ninit(_Arg) ->\n {ok,channels()}.\n\nhandle_call(stop, _Client, Channels) ->\n {stop,normal,ok,Channels};\n\nhandle_call(alloc, _Client, Channels) ->\n {Ch,Channels2} = alloc(Channels),\n {reply,{ok,Ch},Channels2};\n\nhandle_call({free,Channel}, _Client, Channels) ->\n Channels2 = free(Channel, Channels),\n {reply,ok,Channels2}.\n\nterminate(_Reason, _Channels) ->\n ok.\n\n%%%-Internal functions---------------------------------------------------\n\nchannels() ->\n [ch1,ch2,ch3].\n\nalloc([Channel|Channels]) ->\n {Channel,Channels};\nalloc([]) ->\n false.\n\nfree(Channel, Channels) ->\n [Channel|Channels].\n```\n\nThe test case is implemented as follows:\n\n```erlang\n-module(test).\n-export([s/0]).\n\ns() ->\n {ok,Pid} = channel:start_link(),\n {ok,Ch1} = channel:alloc(),\n ok = channel:free(Ch1),\n ok = channel:stop().\n```","ref":"cover_chapter.html#example"},{"type":"extras","title":"Preparation - cover - The Coverage Analysis Tool","doc":"First of all, Cover must be started. This spawns a process which owns the Cover\ndatabase where all coverage data will be stored.\n\n```erlang\n1> cover:start().\n{ok,<0.90.0>}\n```\n\nTo include other nodes in the coverage analysis, use\n`cover:start/1`. All cover-compiled modules will then be loaded on all\nnodes, and data from all nodes will be summed up when analysing. For\nsimplicity this example only involves the current node.\n\nBefore any analysis can take place, the involved modules must be\n_cover-compiled_. This means that some extra information is added to\nthe module before beging compiled into a binary and\n[loaded](cover_chapter.md#loading). The source file of the module is\nnot affected and no `.beam` file is created.\n\n```erlang\n2> cover:compile_module(channel).\n{ok,channel}\n```\n\nEach time a function in the cover-compiled module `channel` is called,\ninformation about the call will be added to the Cover database. Run the test\ncase:\n\n```text\n3> test:s().\nok\n```\n\nCover analysis is performed by examining the contents of the Cover database. The\noutput is determined by two parameters, `Level` and `Analysis`. `Analysis` is\neither `coverage` or `calls` and determines the type of the analysis. `Level` is\neither `module`, `function`, `clause`, or `line` and determines the level of the\nanalysis.","ref":"cover_chapter.html#preparation"},{"type":"extras","title":"Coverage Analysis - cover - The Coverage Analysis Tool","doc":"Analysis of type `coverage` is used to find out how much of the code has been\nexecuted and how much has not been executed. Coverage is represented by a tuple\n`{Cov,NotCov}`, where `Cov` is the number of executable lines that have been\nexecuted at least once and `NotCov` is the number of executable lines that have\nnot been executed.\n\nIf the analysis is made on module level, the result is given for the entire\nmodule as a tuple `{Module,{Cov,NotCov}}`:\n\n```erlang\n4> cover:analyse(channel, coverage, module).\n{ok,{channel,{14,1}}}\n```\n\nFor `channel`, the result shows that 14 lines in the module are covered but one\nline is not covered.\n\nIf the analysis is made on function level, the result is given as a list of\ntuples `{Function,{Cov,NotCov}}`, one for each function in the module. A\nfunction is specified by its module name, function name and arity:\n\n```erlang\n5> cover:analyse(channel, coverage, function).\n{ok,[{{channel,start_link,0},{1,0}},\n {{channel,stop,0},{1,0}},\n {{channel,alloc,0},{1,0}},\n {{channel,free,1},{1,0}},\n {{channel,init,1},{1,0}},\n {{channel,handle_call,3},{5,0}},\n {{channel,terminate,2},{1,0}},\n {{channel,channels,0},{1,0}},\n {{channel,alloc,1},{1,1}},\n {{channel,free,2},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is in the function\n`channel:alloc/1`.\n\nIf the analysis is made on clause level, the result is given as a list of tuples\n`{Clause,{Cov,NotCov}}`, one for each function clause in the module. A clause is\nspecified by its module name, function name, arity and position within the\nfunction definition:\n\n```erlang\n6> cover:analyse(channel, coverage, clause).\n{ok,[{{channel,start_link,0,1},{1,0}},\n {{channel,stop,0,1},{1,0}},\n {{channel,alloc,0,1},{1,0}},\n {{channel,free,1,1},{1,0}},\n {{channel,init,1,1},{1,0}},\n {{channel,handle_call,3,1},{1,0}},\n {{channel,handle_call,3,2},{2,0}},\n {{channel,handle_call,3,3},{2,0}},\n {{channel,terminate,2,1},{1,0}},\n {{channel,channels,0,1},{1,0}},\n {{channel,alloc,1,1},{1,0}},\n {{channel,alloc,1,2},{0,1}},\n {{channel,free,2,1},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is in the second clause\nof `channel:alloc/1`.\n\nFinally, if the analysis is made on line level, the result is given as a list of\ntuples `{Line,{Cov,NotCov}}`, one for each executable line in the source code. A\nline is specified by its module name and line number.\n\n```erlang\n7> cover:analyse(channel, coverage, line).\n{ok,[{{channel,9},{1,0}},\n {{channel,12},{1,0}},\n {{channel,17},{1,0}},\n {{channel,20},{1,0}},\n {{channel,25},{1,0}},\n {{channel,28},{1,0}},\n {{channel,31},{1,0}},\n {{channel,32},{1,0}},\n {{channel,35},{1,0}},\n {{channel,36},{1,0}},\n {{channel,39},{1,0}},\n {{channel,44},{1,0}},\n {{channel,47},{1,0}},\n {{channel,49},{0,1}},\n {{channel,52},{1,0}}]}\n```\n\nFor `channel`, the result shows that the uncovered line is line number 49.","ref":"cover_chapter.html#coverage-analysis"},{"type":"extras","title":"Call Statistics - cover - The Coverage Analysis Tool","doc":"Analysis of type `calls` is used to find out how many times something has been\ncalled and is represented by an integer `Calls`.\n\nIf the analysis is made on module level, the result is given as a tuple\n`{Module,Calls}`. Here `Calls` is the total number of calls to functions in the\nmodule:\n\n```erlang\n8> cover:analyse(channel, calls, module).\n{ok,{channel,12}}\n```\n\nFor `channel`, the result shows that a total of twelve calls have been made to\nfunctions in the module.\n\nIf the analysis is made on function level, the result is given as a list of\ntuples `{Function,Calls}`. Here `Calls` is the number of calls to each function:\n\n```erlang\n9> cover:analyse(channel, calls, function).\n{ok,[{{channel,start_link,0},1},\n {{channel,stop,0},1},\n {{channel,alloc,0},1},\n {{channel,free,1},1},\n {{channel,init,1},1},\n {{channel,handle_call,3},3},\n {{channel,terminate,2},1},\n {{channel,channels,0},1},\n {{channel,alloc,1},1},\n {{channel,free,2},1}]}\n```\n\nFor `channel`, the result shows that `handle_call/3` is the most called function\nin the module (three calls). All other functions have been called once.\n\nIf the analysis is made on clause level, the result is given as a list of tuples\n`{Clause,Calls}`. Here `Calls` is the number of calls to each function clause:\n\n```erlang\n10> cover:analyse(channel, calls, clause).\n{ok,[{{channel,start_link,0,1},1},\n {{channel,stop,0,1},1},\n {{channel,alloc,0,1},1},\n {{channel,free,1,1},1},\n {{channel,init,1,1},1},\n {{channel,handle_call,3,1},1},\n {{channel,handle_call,3,2},1},\n {{channel,handle_call,3,3},1},\n {{channel,terminate,2,1},1},\n {{channel,channels,0,1},1},\n {{channel,alloc,1,1},1},\n {{channel,alloc,1,2},0},\n {{channel,free,2,1},1}]}\n```\n\nFor `channel`, the result shows that all clauses have been called once, except\nthe second clause of `channel:alloc/1` which has not been called at all.\n\nFinally, if the analysis is made on line level, the result is given as a list of\ntuples `{Line,Calls}`. Here `Calls` is the number of times each line has been\nexecuted:\n\n```erlang\n11> cover:analyse(channel, calls, line).\n{ok,[{{channel,9},1},\n {{channel,12},1},\n {{channel,17},1},\n {{channel,20},1},\n {{channel,25},1},\n {{channel,28},1},\n {{channel,31},1},\n {{channel,32},1},\n {{channel,35},1},\n {{channel,36},1},\n {{channel,39},1},\n {{channel,44},1},\n {{channel,47},1},\n {{channel,49},0},\n {{channel,52},1}]}\n```\n\nFor `channel`, the result shows that all lines have been executed once, except\nline number 49 which has not been executed at all.","ref":"cover_chapter.html#call-statistics"},{"type":"extras","title":"Analysis to File - cover - The Coverage Analysis Tool","doc":"A line level calls analysis of `channel` can be written to a file using\n`cover:analyse_to_file/1`:\n\n```erlang\n12> cover:analyse_to_file(channel).\n{ok,\"channel.COVER.out\"}\n```\n\nThe function creates a copy of `channel.erl` where it for each executable line\nis specified how many times that line has been executed. The output file is\ncalled `channel.COVER.out`.\n\n```erlang\nFile generated from /Users/bjorng/git/otp/channel.erl by COVER 2024-03-20 at 13:25:04\n\n****************************************************************************\n\n | -module(channel).\n | -behaviour(gen_server).\n |\n | -export([start_link/0,stop/0]).\n | -export([alloc/0,free/1]). % client interface\n | -export([init/1,handle_call/3,terminate/2]). % callback functions\n |\n | start_link() ->\n 1..| gen_server:start_link({local,channel}, channel, [], []).\n |\n | stop() ->\n 1..| gen_server:call(channel, stop).\n |\n | %%%-Client interface functions-------------------------------------------\n |\n | alloc() ->\n 1..| gen_server:call(channel, alloc).\n |\n | free(Channel) ->\n 1..| gen_server:call(channel, {free,Channel}).\n |\n | %%%-gen_server callback functions----------------------------------------\n |\n | init(_Arg) ->\n 1..| {ok,channels()}.\n |\n | handle_call(stop, _Client, Channels) ->\n 1..| {stop,normal,ok,Channels};\n |\n | handle_call(alloc, _Client, Channels) ->\n 1..| {Ch,Channels2} = alloc(Channels),\n 1..| {reply,{ok,Ch},Channels2};\n |\n | handle_call({free,Channel}, _Client, Channels) ->\n 1..| Channels2 = free(Channel, Channels),\n 1..| {reply,ok,Channels2}.\n |\n | terminate(_Reason, _Channels) ->\n 1..| ok.\n |\n | %%%-Internal functions---------------------------------------------------\n |\n | channels() ->\n 1..| [ch1,ch2,ch3].\n |\n | alloc([Channel|Channels]) ->\n 1..| {Channel,Channels};\n | alloc([]) ->\n 0..| false.\n |\n | free(Channel, Channels) ->\n 1..| [Channel|Channels].\n```","ref":"cover_chapter.html#analysis-to-file"},{"type":"extras","title":"Conclusion - cover - The Coverage Analysis Tool","doc":"By looking at the results from the analyses, it can be deduced that\nthe test case does not cover the case when all channels are allocated\nand `test.erl` should be extended accordingly. Incidentally, when the\ntest case is corrected a bug in `channel` will be discovered.\n\nWhen the Cover analysis is ready, Cover is stopped and all cover-compiled\nmodules are [unloaded](cover_chapter.md#loading). The code for `channel` is now\nloaded as usual from a `.beam` file in the current path.\n\n```erlang\n13> code:which(channel).\ncover_compiled\n14> cover:stop().\nok\n15> code:which(channel).\n\"./channel.beam\"\n```","ref":"cover_chapter.html#conclusion"},{"type":"extras","title":"Miscellaneous - cover - The Coverage Analysis Tool","doc":"","ref":"cover_chapter.html#miscellaneous"},{"type":"extras","title":"Performance - cover - The Coverage Analysis Tool","doc":"Execution of code in cover-compiled modules is slower and more memory consuming\nthan for regularly compiled modules. As the Cover database contains information\nabout each executable line in each cover-compiled module, performance decreases\nproportionally to the size and number of the cover-compiled modules.\n\nTo improve performance when analysing cover results it is possible to do\nmultiple calls to [analyse](`cover:analyse/1`) and\n[analyse_to_file](`cover:analyse_to_file/1`) at once. You can also use the\n[async_analyse_to_file](`cover:async_analyse_to_file/1`) convenience function.\n\n[](){: #lines }","ref":"cover_chapter.html#performance"},{"type":"extras","title":"Executable Lines - cover - The Coverage Analysis Tool","doc":"Cover uses the concept of _executable lines_, which is code lines containing\nan executable expression such as a matching or a function call. A blank line or\na line containing a comment, function head or pattern in a `case` or `receive`\nstatement is not executable.\n\nIn the example below, lines number 2, 4, 6, 8, and 11 are executable lines:\n\n```erlang\n1: is_loaded(Module, Compiled) ->\n2: case get_file(Module, Compiled) of\n3: {ok,File} ->\n4: case code:which(Module) of\n5: ?TAG ->\n6: {loaded,File};\n7: _ ->\n8: unloaded\n9: end;\n10: false ->\n11: false\n12: end.\n```\n\n[](){: #loading }","ref":"cover_chapter.html#executable-lines"},{"type":"extras","title":"Code Loading Mechanism - cover - The Coverage Analysis Tool","doc":"When a module is cover-compiled, it is also loaded using the normal code loading\nmechanism of Erlang. This means that if a cover-compiled module is re-loaded\nduring a Cover session, for example using `c(Module)`, it will no longer be\ncover-compiled.\n\nUse `cover:is_compiled/1` or `code:which/1` to see whether or not a\nmodule is cover-compiled (and still loaded).\n\nWhen Cover is stopped, all cover-compiled modules are unloaded.","ref":"cover_chapter.html#code-loading-mechanism"},{"type":"extras","title":"cprof - The Call Count Profiler","doc":"\n# cprof - The Call Count Profiler\n\n`cprof` is a profiling tool that can be used to get a picture of how often\ndifferent functions in the system are called.\n\n`cprof` uses breakpoints similar to local call trace, but containing counters,\nto collect profiling data. Therefore there is no need for special compilation of\nany module to be profiled.\n\n`cprof` presents all profiled modules in descending total call count order, and\nfor each module presents all profiled functions also in descending call count\norder. A call count limit can be specified to filter out all functions below the\nlimit.\n\nProfiling is done in the following steps:\n\n- **[`cprof:start/*`](`cprof:start/3`)** - Starts profiling with\n zeroed call counters for specified functions by setting call count\n breakpoints on them.\n\n- **`Mod:Fun()`** - Runs the code to be profiled.\n\n- **[`cprof:pause/*`](`cprof:pause/3`)** - Pauses the call counters for\n specified functions. This minimizes the impact of code running in\n the background or in the shell. Call counters are automatically\n paused when they \"hit the ceiling\" of the host machine word\n size. For a 32 bit host the maximum counter value is 2,147,483,647.\n\n- **[`cprof:analyse/*`](`cprof:analyse/2`)** - Collects call counters\n and computes the result.\n\n- **[`cprof:restart/*`](`cprof:restart/3`)** - Restarts the call\n counters from zero for specified functions. Can be used to collect a\n new set of counters without having to stop and start call count\n profiling.\n\n- **[`cprof:stop/0..3`](`cprof:stop/3`)** - Stops profiling by\n removing call count breakpoints from specified functions.\n\nFunctions can be specified as either all in the system, all in one module, all\narities of one function, one function, or all functions in all modules not yet\nloaded. BIFs cannot be call-count traced.\n\nThe analysis result can either be for a single module or for all modules. In either\ncase a call count limit can be given to filter out the functions with a call\ncount below the limit. The all modules analysis does _not_ contain the module\n`cprof` itself; the only way to analyze `cprof` is by specifying it as a single\nmodule to analyse.\n\nCall count tracing is very lightweight compared to other forms of tracing since\nno trace message has to be generated. Some measurements indicates performance\ndegradations in the vicinity of 10 percent.\n\nThe following sections show some examples of profiling with `m:cprof`.","ref":"cprof_chapter.html"},{"type":"extras","title":"Example: Background work - cprof - The Call Count Profiler","doc":"From the Erlang shell:\n\n```erlang\n1> cprof:start(), cprof:pause(). % Stop counters just after start\n8492\n2> cprof:analyse().\n{539,\n [{shell,155,\n [{{shell,prep_check,1},55},\n {{shell,used_records,4},45},\n {{shell,used_records,1},45},\n {{shell,used_record_defs,2},1},\n {{shell,record_defs,2},1},\n {{shell,record_bindings,2},1},\n {{shell,exprs,7},1},\n {{shell,expr,4},1},\n {{shell,expand_records,2},1},\n {{shell,check_command,2},1},\n {{shell,apply_fun,3},1},\n {{shell,'-exprs/7-lc$^0/1-0-',1},1},\n {{shell,'-eval_loop/3-fun-0-',3},1}]},\n %% Information about many modules omitted.\n .\n .\n .\n %% Here is the last part.\n {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},\n {otp_internal,1,[{{otp_internal,obsolete,3},1}]},\n {maps,1,[{{maps,from_list,1},1}]},\n {erl_internal,1,[{{erl_internal,bif,3},1}]}]}\n3> cprof:analyse(cprof).\n{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}\n4> cprof:stop().\n8586\n```\n\nThe example showed some of the background work that the shell performs just to\ninterpret the first command line.\n\nWhat is captured in this example is the part of the work the shell does while\ninterpreting the command line that occurs between the actual calls to\n[`cprof:start()`](`cprof:start/0`) and [`cprof:analyse()`](`cprof:analyse/1`).","ref":"cprof_chapter.html#example-background-work"},{"type":"extras","title":"Example: One module - cprof - The Call Count Profiler","doc":"From the Erlang shell:\n\n```erlang\n1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.\n1\n2> cprof:analyse(calendar).\n{calendar,9,\n [{{calendar,last_day_of_the_month1,2},1},\n {{calendar,last_day_of_the_month,2},1},\n {{calendar,is_leap_year1,1},1},\n {{calendar,is_leap_year,1},1},\n {{calendar,dy,1},1},\n {{calendar,dm,1},1},\n {{calendar,df,2},1},\n {{calendar,day_of_the_week,3},1},\n {{calendar,date_to_gregorian_days,3},1}]}\n3> cprof:stop().\n8648\n```\n\nThe example tells us that \"Aktiebolaget LM Ericsson & Co\" was registered on a\nMonday (since the return value of the first command is 1), and that the\n`calendar` module needed 9 function calls to calculate that.\n\nUsing `cprof:analyse()` in this example also shows approximately the same\nbackground work as in the first example.","ref":"cprof_chapter.html#example-one-module"},{"type":"extras","title":"Example: In the code - cprof - The Call Count Profiler","doc":"Write a module:\n\n```erlang\n-module(sort).\n-export([do/1]).\n\ndo(N) ->\n cprof:stop(),\n cprof:start(),\n do(N, []).\n\ndo(0, L) ->\n R = lists:sort(L),\n cprof:pause(),\n R;\ndo(N, L) ->\n do(N-1, [rand:uniform(256)-1 | L]).\n```\n\nFrom the Erlang shell:\n\n```erlang\n1> c(sort).\n{ok,sort}\n2> rand:seed(default, 42), ok.\nok.\n3> sort:do(1000).\n[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]\n4> cprof:analyse().\n{13180,\n [{lists,6173,\n [{{lists,rmerge3_1,6},1045},\n {{lists,rmerge3_2,6},977},\n {{lists,split_1,5},652},\n {{lists,merge3_1,6},579},\n {{lists,merge3_2,6},577},\n {{lists,rmerge3_12_3,6},511},\n {{lists,split_1_1,6},347},\n {{lists,merge3_12_3,6},310},\n {{lists,rmerge3_21_3,6},282},\n {{lists,merge3_21_3,6},221},\n {{lists,merge2_1,4},154},\n {{lists,merge2_2,5},138},\n {{lists,reverse,2},106},\n {{lists,rmerge2_2,5},87},\n {{lists,rmergel,2},81},\n {{lists,rmerge2_1,4},75},\n {{lists,mergel,2},28},\n {{lists,keyfind,3},2},\n {{lists,sort,1},1}]},\n {rand,5000,\n [{{rand,uniform_s,2},1000},\n {{rand,uniform,1},1000},\n {{rand,seed_put,1},1000},\n {{rand,seed_get,0},1000},\n {{rand,exsss_uniform,2},1000}]},\n {erlang,1004,\n [{{erlang,put,2},1000},\n {{erlang,trace_pattern,3},2},\n {{erlang,ensure_tracer_module_loaded,2},2}]},\n {sort,1001,[{{sort,do,2},1001}]},\n {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}\n5> cprof:stop().\n12625\n```\n\nThe example shows some details of how `lists:sort/1` works. It used 6173\nfunction calls in module `m:lists` to complete the work.\n\nThis time, since the shell was not involved in starting and stopping `cprof`, no\nother work was done in the system during the profiling.","ref":"cprof_chapter.html#example-in-the-code"},{"type":"extras","title":"The Erlang mode for Emacs","doc":"\n# The Erlang mode for Emacs","ref":"erlang_mode_chapter.html"},{"type":"extras","title":"Purpose - The Erlang mode for Emacs","doc":"The purpose of this user guide is to introduce you to the Erlang mode\nfor Emacs and gives some relevant background information of the\nfunctions and features. See also [Erlang mode reference\nmanual](../references/erlang.el.md) The purpose of the Erlang mode\nitself is to facilitate the developing process for the Erlang\nprogrammer.","ref":"erlang_mode_chapter.html#purpose"},{"type":"extras","title":"Pre-requisites - The Erlang mode for Emacs","doc":"Basic knowledge of Emacs and Erlang/OTP.","ref":"erlang_mode_chapter.html#pre-requisites"},{"type":"extras","title":"Elisp - The Erlang mode for Emacs","doc":"Two Elisp modules are included in this tool package for\nEmacs. `erlang.el` defines the actual Erlang mode and\n`erlang-start.el` makes some nice initializations.","ref":"erlang_mode_chapter.html#elisp"},{"type":"extras","title":"Setup on UNIX - The Erlang mode for Emacs","doc":"To set up the Erlang Emacs mode on a UNIX systems, edit or create the file `.emacs`\nin the your home directory.\n\nBelow is a complete example of what should be added to a user's `.emacs`\nprovided that OTP is installed in the directory `/usr/local/otp `:\n\n```text\n(setq load-path (cons \"/usr/local/otp/lib/tools- /emacs\"\nload-path))\n(setq erlang-root-dir \"/usr/local/otp\")\n(setq exec-path (cons \"/usr/local/otp/bin\" exec-path))\n(require 'erlang-start)\n```","ref":"erlang_mode_chapter.html#setup-on-unix"},{"type":"extras","title":"Setup on Windows - The Erlang mode for Emacs","doc":"To set up the Erlang Emacs mode on a Windows systems, edit/create the file\n`.emacs`, the location of the file depends on the configuration of the system.\nIf the _HOME_ environment variable is set, Emacs will look for the `.emacs` file\nin the directory indicated by the `HOME` variable. If `HOME` is not set, Emacs\nwill look for the `.emacs` file in `C:\\ `.\n\nBelow is a complete example of what should be added to a user's `.emacs`\nprovided that OTP is installed in the directory `C:\\Program Files\\Erlang OTP`:\n\n```lisp\n(setq load-path (cons \"C:/Program Files/Erlang OTP/lib/tools- /emacs\"\nload-path))\n(setq erlang-root-dir \"C:/Program Files/Erlang OTP\")\n(setq exec-path (cons \"C:/Program Files/Erlang OTP/bin\" exec-path))\n(require 'erlang-start)\n```\n\n> #### Note {: .info }\n>\n> In `.emacs`, the slash character (`/`) can be used as path separator. But if you\n> decide to use the backslash character (`\\`), note that backslashes have to be\n> doubled, since they are treated as escape characters by Emacs.","ref":"erlang_mode_chapter.html#setup-on-windows"},{"type":"extras","title":"Indentation - The Erlang mode for Emacs","doc":"The \"Oxford Advanced Learners Dictionary of Current English\" says the following\nabout the word \"indent\":\n\n> \"start (a line of print or writing) farther from the margin than the others\".\n\nThe Erlang mode does, of course, provide this feature. The layout used is based\non the common use of the language.\n\nIt is strongly recommended to use this feature and avoid to indent lines in a\nnonstandard way. Some motivations are:\n\n- Code using the same layout is easy to read and maintain.\n- Since several features of Erlang mode is based on the standard layout they\n might not work correctly if a nonstandard layout is used.\n\nThe indentation features can be used to reindent large sections of a file. If\nsome lines use nonstandard indentation they will be reindented.","ref":"erlang_mode_chapter.html#indentation"},{"type":"extras","title":"Editing - The Erlang mode for Emacs","doc":"- _`M-x erlang-mode RET`_ \\- This command activates the Erlang major mode for\n the current buffer. When this mode is active the mode line contain the word\n \"Erlang\".\n\nWhen the Erlang mode is correctly installed, it is automatically activated when\na file ending in `.erl` or `.hrl` is opened in Emacs.\n\nWhen a file is saved the name in the `-module().` line is checked against the\nfile name. Should they mismatch Emacs can change the module specifier so that it\nmatches the file name. By default, the user is asked before the change is\nperformed.\n\nAn \"electric\" command is a character that in addition to just inserting the\ncharacter performs some type of action. For example the `;` character is typed\nin a situation where is ends a function clause a new function header is\ngenerated. The electric commands are as follows:\n\n- `erlang-electric-comma` \\- Insert a comma character and possibly a new\n indented line.\n- `erlang-electric-semicolon` \\- Insert a semicolon character and possibly a\n prototype for the next line.\n- `erlang-electric-gt` \\- Insert a `>` character and possible a new indented line.\n\nTo disable all electric commands set the variable `erlang-electric-commands` to\nthe empty list. In short, place the following line in your `.emacs`\\-file:\n\n```text\n(setq erlang-electric-commands '())\n```","ref":"erlang_mode_chapter.html#editing"},{"type":"extras","title":"Syntax highlighting - The Erlang mode for Emacs","doc":"It is possible for Emacs to use colors when displaying a buffer. By \"syntax\nhighlighting\", we mean that syntactic components, for example keywords and\nfunction names, will be colored.\n\nThe basic idea of syntax highlighting is to make the structure of a program\nclearer. For example, the highlighting will make it easier to spot simple bugs.\nHave not you ever written a variable in lower-case only? With syntax\nhighlighting a variable will colored while atoms will be shown with the normal\ntext color.","ref":"erlang_mode_chapter.html#syntax-highlighting"},{"type":"extras","title":"Tags - The Erlang mode for Emacs","doc":"Tags is a standard Emacs package used to record information about source files\nin large development projects. In addition to listing the files of a project, a\ntags file normally contains information about all functions and variables that\nare defined. By far, the most useful command of the tags system is its ability\nto find the definition of functions in any file in the project. But the Tags\nsystem is not limited to this feature, for example, it is possible to do a text\nsearch in all files in a project, or to perform a project-wide search and\nreplace.\n\nIn order to use the Tags system a file named `TAGS` must be created. The file\ncan be seen as a database over all functions, records, and macros in all files\nin the project. The `TAGS` file can be created using two different methods for\nErlang. The first is the standard Emacs utility \"etags\", the second is by using\nthe Erlang module `tags`.","ref":"erlang_mode_chapter.html#tags"},{"type":"extras","title":"Etags - The Erlang mode for Emacs","doc":"`etags` is a program that is part of the Emacs distribution. It is normally\nexecuted from a command line, like a Unix shell or a DOS box.\n\nThe `etags` program of fairly modern versions of Emacs and XEmacs has native\nsupport for Erlang. To check if your version does include this support, issue\nthe command `etags --help` at a the command line prompt. At the end of the help\ntext there is a list of supported languages. Unless Erlang is a member of this\nlist I suggest that you should upgrade to a newer version of Emacs.\n\nAs seen in the help text — unless you have not upgraded your Emacs yet — `etags`\nassociate the file extensions `.erl` and `.hrl` with Erlang.\n\nBasically, the `etags` utility is run using the following form:\n\n```bash\netags file1.erl file2.erl\n```\n\nThis will create a file named `TAGS` in the current directory.\n\nThe `etags` utility can also read a list of files from its standard input by\nsupplying a single dash in place of the file names. This feature is useful when\na project consists of a large number of files. The standard UNIX command `find`\ncan be used to generate the list of files, for example:\n\n```bash\nfind . -name \"*.[he]rl\" -print | etags -\n```\n\nThe above line will create a `TAGS` file covering all the Erlang source files in\nthe current directory, and in the subdirectories below.\n\nSee the GNU Emacs Manual and the etags man page for more info.","ref":"erlang_mode_chapter.html#etags"},{"type":"extras","title":"Shell - The Erlang mode for Emacs","doc":"The look and feel on an Erlang shell inside Emacs should be the same as in a\nnormal Erlang shell. There is just one major difference, the cursor keys will\nactually move the cursor around just like in any normal Emacs buffer. The\ncommand line history can be accessed by the following commands:\n\n- *`C-up `*or _`M-p `_(`comint-previous-input`) - Move to the previous line in\n the input history.\n- *`C-down `*or _`M-n `_(`comint-next-input`) - Move to the next line in the\n input history.\n\nIf the Erlang shell buffer would be killed the command line history is saved to\na file. The command line history is automatically retrieved when a new Erlang\nshell is started.","ref":"erlang_mode_chapter.html#shell"},{"type":"extras","title":"Compilation - The Erlang mode for Emacs","doc":"The classic edit-compile-bugfix cycle for Erlang is to edit the source file in\nan editor, save it to a file and switch to an Erlang shell. In the shell the\ncompilation command is given. Should the compilation fail you have to bring out\nthe editor and locate the correct line.\n\nWith the Erlang editing mode the entire edit-compile-bugfix cycle can be\nperformed without leaving Emacs. Emacs can order Erlang to compile a file and it\ncan parse the error messages to automatically place the point on the erroneous\nlines.","ref":"erlang_mode_chapter.html#compilation"},{"type":"extras","title":"fprof - The File Trace Profiler","doc":"\n# fprof - The File Trace Profiler\n\n`m:fprof` is a profiling tool that can be used to get a picture of how much\nprocessing time different functions consumes and in which processes.\n\n`fprof` uses tracing with timestamps to collect profiling data. Therefore there\nis no need for special compilation of any module to be profiled.\n\n`fprof` presents wall clock times from the host machine OS, with the assumption\nthat OS scheduling will randomly load the profiled functions in a fair way. Both\n_own time_, that is, the time used by a function for its own execution, and\n_accumulated time_, that is, execution time including called functions.\n\nProfiling is essentially done in 3 steps:\n\n- Tracing to a file.\n\n- Profiling: the trace file is read and raw profile data is collected\n into an internal RAM storage on the node. During this step the trace data may\n be dumped in text format to file or console.\n\n- Analysing: the raw profile data is sorted and dumped in text format\n either to file or console.\n\nSince `fprof` stores trace data to a file, the runtime performance degradation is\nminimized, but still far from negligible, especially for programs that themselves\nuse the filesystem heavily. Where the trace file is placed is also important;\non Unix systems `/tmp` is usually a good choice, while any\nnetwork-mounted disk is a bad choice.\n\n`fprof` can also skip the file step and trace to a tracer process of its own that\ndoes the profiling in runtime.\n\nThe following sections show some examples of how to profile with `m:fprof`.","ref":"fprof_chapter.html"},{"type":"extras","title":"Profiling from the source code - fprof - The File Trace Profiler","doc":"If you can edit and recompile the source code, it is convenient to\ninsert [`fprof:trace(start)`](`fprof:trace/1`) and\n[`fprof:trace(stop)`](`fprof:trace/1`) before and after the code to be profiled.\nAll spawned processes are also traced. If you want some other filename than\nthe default, use [`fprof:trace(start, \"my_fprof.trace\")`](`fprof:trace/2`).\n\nWhen execution is finished, the raw profile can be processed using\n[`fprof:profile()`](`fprof:profile/0`),\nor [`fprof:profile(file, \"my_fprof.trace\")`](`fprof:profile/2`)\nfor a non-default filename.\n\nFinally create an informative table dumped on the console with\n[`fprof:analyse()`](`fprof:analyse/0`), or on file with\n[`fprof:analyse(dest, [])`](`fprof:analyse/2`), or\n[`fprof:analyse([{dest, \"my_fprof.analysis\"}, {cols, 120}])`](`fprof:analyse/1`)\nfor a wider listing of a non-default filename.","ref":"fprof_chapter.html#profiling-from-the-source-code"},{"type":"extras","title":"Profiling a function - fprof - The File Trace Profiler","doc":"If you have one function that does the task that you want to profile, and the\nfunction returns when the profiling should stop, it is convenient to use\n[`fprof:apply(Module, Function, Args)`](`fprof:apply/3`) for the tracing step.\n\nIf the tracing should continue after the function has returned, for\nexample if it is a start function that spawns processes to be\nprofiled, use\n[`fprof:apply(M, F, Args, [continue | OtherOpts])`](`fprof:apply/4`).\nThe tracing has to be stopped at a suitable later time using\n[`fprof:trace(stop)`](`fprof:trace/1`).","ref":"fprof_chapter.html#profiling-a-function"},{"type":"extras","title":"Immediate profiling - fprof - The File Trace Profiler","doc":"It is also possible to trace immediately into the profiling process that creates\nthe raw profile data, that is to short circuit the tracing and profiling steps\nso that the filesystem is not used for tracing.\n\nDo something like this:\n\n```erlang\n{ok, Tracer} = fprof:profile(start),\nfprof:trace([start, {tracer, Tracer}]),\n%% Run code to profile\nfprof:trace(stop);\n```\n\nThis puts less load on the filesystem, but much more load on the Erlang runtime\nsystem.","ref":"fprof_chapter.html#immediate-profiling"},{"type":"extras","title":"lcnt - The Lock Profiler","doc":"\n# lcnt - The Lock Profiler\n\nInternally in the Erlang runtime system locks are used to protect resources from\nbeing updated from multiple threads in a fatal way. Locks are necessary to\nensure that the runtime system works properly, but it also introduces\nlimitations, namely _lock contention_ and _locking overhead_.\n\nWith lock contention we mean when one thread locks a resource, and another\nthread (or threads) tries to acquire the same resource at the same time. The\nlock will deny the other thread access to the resource and the thread will be\nblocked from continuing its execution. The second thread has to wait until the\nfirst thread has completed its access to the resource and unlocked it. The\n`lcnt` tool measures these lock conflicts.\n\nLocks have an inherent cost in execution time and memory space. It takes time to\ninitialize, destroy, acquire, or release locks. To decrease lock contention\nit is sometimes necessary to use finer-grained locking strategies. This\nusually also increases the locking overhead. Hence there is a tradeoff between\nlock contention and overhead. In general, lock contention increases with the\nnumber of threads running concurrently.\n\nThe `lcnt` tool does not measure locking overhead.","ref":"lcnt_chapter.html"},{"type":"extras","title":"Enabling lock-counting - lcnt - The Lock Profiler","doc":"For investigation of locks in the emulator we use an internal tool called `lcnt`\n(short for lock-count). The VM needs to be compiled with this option enabled. To\ncompile a lock-counting VM along with a normal VM, use:\n\n```text\ncd $ERL_TOP\n./configure --enable-lock-counter\nmake\n```\n\nStart the lock-counting VM like this:\n\n```text\n$ERL_TOP/bin/erl -emu_type lcnt\n```\n\nTo verify that lock counting is enabled check that `[lock-counting]` appears in\nthe status text when the VM is started.\n\n```text\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n```","ref":"lcnt_chapter.html#enabling-lock-counting"},{"type":"extras","title":"Getting started - lcnt - The Lock Profiler","doc":"Once you have a lock counting enabled VM the module `lcnt` can be used. The\nmodule is intended to be used from the current running nodes shell. To access\nremote nodes use [`lcnt:clear(Node)`](`lcnt:clear/1`) and\n[`lcnt:collect(Node)`](`lcnt:collect/1`).\n\nAll locks are continuously monitored and its statistics updated. Use\n[`lcnt:clear/0`](`lcnt:clear/1`) to initially clear all counters\nbefore running any specific tests. This command will also reset the\ninternal duration timer.\n\nTo retrieve lock statistics information, use\n[`lcnt:collect/0,1`](`lcnt:collect/1`). The collect operation will\nstart a `lcnt` server if it not already started. All collected data\nwill be stored in an Erlang term and uploaded to the server along with\nthe duration time. The duration time is the time between\n[`lcnt:clear/0,1`](`lcnt:clear/1`) and\n[`lcnt:collect/0,1`](`lcnt:collect/1`).\n\nOnce the data is collected to the server it can be filtered, sorted, and printed\nin multiple ways.","ref":"lcnt_chapter.html#getting-started"},{"type":"extras","title":"Example of usage - lcnt - The Lock Profiler","doc":"Here is an example of running the [Big Bang Benchmark](#the-big-bang-benchmark):\n\n```text\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n\nEshell V15.0 (press Ctrl+G to abort, type help(). for help)\n1> lcnt:rt_opt({copy_save, true}).\nfalse\n2> lcnt:clear(), big:bang(1000), lcnt:collect().\nok\n3> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 590799 8875 1.5022 37906 2.2167\n proc_msgq 1048 2515180 4667 0.1856 20962 1.2258\n proc_main 1048 2195317 23775 1.0830 1664 0.0973\nok\n```\n\nAnother way to to profile a specific function is to use `lcnt:apply/3` or\n`lcnt:apply/1`, which calls `lcnt:clear/0` before calling the function and\n`lcnt:collect/0` after its invocation. This method should only be used in\nmicro-benchmarks since it sets `copy_save` to `true` for the duration of the\nfunction call, which may cause the emulator to run out of memory if attempted\nunder load.\n\n```text\n1> lcnt:apply(fun() -> big:bang(1000) end).\n1845411\n2> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 582789 9237 1.5850 41929 2.2633\n proc_msgq 1047 2494483 4731 0.1897 11173 0.6031\n proc_main 1047 2192806 23283 1.0618 1500 0.0810\nok\n```\n\nThe process locks are sorted after its class like all other locks. It is\nconvenient to look at specific processes and ports as classes. We can do this by\nswapping class and class identifiers with `lcnt:swap_pid_keys/0`.\n\n```text\n3> lcnt:swap_pid_keys().\nok\n4> lcnt:conflicts([{print, [name, tries, ratio, time]}]).\n lock #tries collisions [%] time [us]\n ----- ------- --------------- ----------\n run_queue 582789 1.5850 41929\n 5692 0.5095 484\n 4989 0.4410 393\n 6319 2.1839 284\n 6077 1.9747 198\n 5071 1.3015 192\n 5846 1.7106 186\n 6305 1.2054 179\n 5820 1.2715 176\n 6329 1.4852 168\n 5172 0.8701 167\n 5306 0.4146 166\n 5838 1.9870 160\n 6346 1.5443 143\n 5542 0.4331 141\n 5260 0.2662 137\n 5610 0.9447 127\n 5354 0.5230 118\n 5845 0.9239 115\n 5140 0.7782 108\nok\n```","ref":"lcnt_chapter.html#example-of-usage"},{"type":"extras","title":"Example with Mnesia Transaction Benchmark - lcnt - The Lock Profiler","doc":"From the Erlang shell:\n\n```erlang\nErlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]\n\nEshell V15.0 (press Ctrl+G to abort, type help(). for help)\n1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},\n {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},\n {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.\nok\n2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).\n .\n .\n .\nignore\n```\n\nInitial configuring of the benchmark is done. It is time to profile the actual\nMnesia benchmark:\n\n```erlang\n3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,\n true}|Conf]), Tps/60 end).\n .\n .\n .\n50204.666666666664\n```\n\nThe benchmark runs for 60 seconds (followed by verification and\nanalysis), and then returns the number of transactions per seconds.\n\n```text\n4> lcnt:swap_pid_keys().\nok\n5> lcnt:conflicts().\n lock id #tries #collisions collisions [%] time [us] duration [%]\n ----- --- ------- ------------ --------------- ---------- -------------\n run_queue 10 89329288 3227515 3.6131 5018119 8.3606\n mnesia_locker 5 64793236 8231226 12.7038 98654 0.1644\n db_tab 3012324 416847817 140631 0.0337 75308 0.1255\n 5 14499900 36934 0.2547 4878 0.0081\n 5 14157504 35797 0.2528 4727 0.0079\n 5 14194934 34510 0.2431 4403 0.0073\n 5 14149447 35326 0.2497 4150 0.0069\n 5 14316525 35675 0.2492 4116 0.0069\n 5 14241146 35358 0.2483 4101 0.0068\n 5 14224491 35182 0.2473 4094 0.0068\n 5 14190075 35328 0.2490 4075 0.0068\n 5 14308906 35031 0.2448 3896 0.0065\n 5 14457330 36182 0.2503 3856 0.0064\n mnesia_tm 5 28149333 179294 0.6369 1057 0.0018\n pix_lock 1024 132 1 0.7576 549 0.0009\n 5 17 2 11.7647 87 0.0001\n 5 1335 6 0.4494 1 0.0000\nok\n```\n\nThe `id` header represents the number of unique identifiers under a\nclass when the option `{combine, true}` is used (which is enabled by\ndefault). It will otherwise show the specific identifier. The `db_tab`\nlisting shows 3,012,324 unique locks, which is one for each ETS table\ncreated. Mnesia creates one ETS table for each transaction.\n\nThe listing shows also shows that the `mnesia_locker` process has highly contended locks.\nUsing `lcnt:inspect/1` more information can be displayed for that process:\n\n```text\n6> lcnt:inspect(mnesia_locker).\n lock id #tries #collisions collisions [%] time [us] duration [%] histogram [log2(us)]\n ----- --- ------- ------------ --------------- ---------- ------------- ---------------------\n mnesia_locker proc_main 19853372 7591248 38.2366 80550 0.1342 |. ...X........ |\n mnesia_locker proc_msgq 30917225 639627 2.0688 17126 0.0285 |. .X......... |\n mnesia_locker proc_status 9348426 351 0.0038 978 0.0016 | .xxX. . |\n mnesia_locker proc_btm 0 0 0.0000 0 0.0000 | |\n mnesia_locker proc_trace 4674213 0 0.0000 0 0.0000 | |\nok\n```\n\nListing the conflicts without class combiner:\n\n```text\n7> lcnt:conflicts([{combine, false}, {print, [name, id, tries, ratio, time]}]).\n lock id #tries collisions [%] time [us]\n ----- --- ------- --------------- ----------\n run_queue 2 31075249 3.5676 1728233\n run_queue 1 29738521 3.6348 1683219\n run_queue 3 27912150 3.6429 1573593\n mnesia_locker proc_main 19853372 38.2366 80550\n db_tab mnesia_transient_decision 3012281 2.5675 55104\n run_queue 4 512077 3.7041 29486\n mnesia_locker proc_msgq 30917225 2.0688 17126\n db_tab account 6044562 0.3599 7909\n db_tab branch 6026659 0.3132 5654\n db_tab teller 6044659 0.2684 4727\n proc_main 3207155 0.7178 3726\n proc_main 3138532 0.7485 3593\n proc_main 3133180 0.7156 3547\n proc_main 3165128 0.7609 3517\n proc_main 3128838 0.7525 3477\n proc_main 3137627 0.7559 3433\n proc_main 3144886 0.7509 3425\n proc_main 3149315 0.7487 3372\n proc_main 3196546 0.7591 3310\n proc_main 3164333 0.7483 3309\nok\n```\n\nIn this scenario the locks for the scheduler's run queues dominate the time waiting\nfor locks. The most contended lock for ETS tables is for the `mnesia_transient_decision`\nETS table.\n\nHere is how to show the information for the ETS tables.\n\n```text\n8> lcnt:inspect(db_tab, [{print, [name, id, tries, colls, ratio, duration]}]).\n lock id #tries #collisions collisions [%] duration [%]\n ----- --- ------- ------------ --------------- -------------\n db_tab mnesia_transient_decision 3012281 77341 2.5675 0.0918\n db_tab account 6044562 21753 0.3599 0.0132\n db_tab branch 6026659 18873 0.3132 0.0094\n db_tab teller 6044659 16221 0.2684 0.0079\n db_tab history 3012281 4005 0.1330 0.0022\n db_tab mnesia_stats 3071064 2437 0.0794 0.0010\n db_tab mnesia_trans_store 15 0 0.0000 0.0000\n db_tab mnesia_decision 3012281 0 0.0000 0.0000\n db_tab schema 0 0 0.0000 0.0000\n db_tab dets 0 0 0.0000 0.0000\n db_tab dets_owners 0 0 0.0000 0.0000\n db_tab dets_registry 0 0 0.0000 0.0000\n db_tab mnesia_lock_queue 36154974 0 0.0000 0.0000\n db_tab mnesia_sticky_locks 12108098 0 0.0000 0.0000\n db_tab mnesia_tid_locks 27176721 0 0.0000 0.0000\n db_tab mnesia_held_locks 48321870 0 0.0000 0.0000\n db_tab mnesia_subscr 0 0 0.0000 0.0000\n db_tab mnesia_gvar 102680683 1 0.0000 0.0000\n db_tab user_functions 0 0 0.0000 0.0000\n db_tab shell_records 0 0 0.0000 0.0000\nok\n```","ref":"lcnt_chapter.html#example-with-mnesia-transaction-benchmark"},{"type":"extras","title":"Deciphering the output - lcnt - The Lock Profiler","doc":"Typically high `time` values are bad and this is often the thing to look for.\nHowever, one should also look for high lock acquisition frequencies (`#tries`)\nsince locks generate overhead and because high frequency could become\nproblematic if they begin to have conflicts even if it is not shown in a\nparticular test.","ref":"lcnt_chapter.html#deciphering-the-output"},{"type":"extras","title":"The Big Bang Benchmark - lcnt - The Lock Profiler","doc":"```erlang\n-module(big).\n-export([bang/1]).\n\npinger([], [], true) ->\n receive\n\t{procs, Procs, ReportTo} ->\n\t pinger(Procs, [], ReportTo)\n end;\npinger([], [], false) ->\n receive {ping, From} -> From ! {pong, self()} end,\n pinger([],[],false);\npinger([], [], ReportTo) ->\n ReportTo ! {done, self()},\n pinger([],[],false);\npinger([], [Po|Pos] = Pongers, ReportTo) ->\n receive\n\t{ping, From} ->\n\t From ! {pong, self()},\n\t pinger([], Pongers, ReportTo);\n\t{pong, Po} ->\n\t pinger([], Pos, ReportTo)\n end;\npinger([Pi|Pis], Pongers, ReportTo) ->\n receive {ping, From} -> From ! {pong, self()}\n after 0 -> ok\n end,\n Pi ! {ping, self()},\n pinger(Pis, [Pi|Pongers], ReportTo).\n\nspawn_procs(N) when N =< 0 ->\n [];\nspawn_procs(N) ->\n [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].\n\nsend_procs([], Msg) ->\n Msg;\nsend_procs([P|Ps], Msg) ->\n P ! Msg,\n send_procs(Ps, Msg).\n\nreceive_msgs([]) ->\n ok;\nreceive_msgs([M|Ms]) ->\n receive\n\tM ->\n\t receive_msgs(Ms)\n end.\n\nbang(N) when integer(N) ->\n Procs = spawn_procs(N),\n RMsgs = lists:map(fun (P) -> {done, P} end, Procs),\n Start = now(),\n send_procs(Procs, {procs, Procs, self()}),\n receive_msgs(RMsgs),\n Stop = now(),\n lists:foreach(fun (P) -> exit(P, normal) end, Procs),\n timer:now_diff(Stop, Start).\n```","ref":"lcnt_chapter.html#the-big-bang-benchmark"},{"type":"extras","title":"See Also - lcnt - The Lock Profiler","doc":"[LCNT Reference Manual](`m:lcnt`)","ref":"lcnt_chapter.html#see-also"},{"type":"extras","title":"Xref - The Cross Reference Tool","doc":"\n# Xref - The Cross Reference Tool\n\nXref is a cross reference tool that can be used for finding dependencies between\nfunctions, modules, applications and releases. It does so by analyzing the\ndefined functions and the function calls.\n\nIn order to make Xref easy to use, there are predefined analyses that perform\nsome common tasks. Typically, a module or a release can be checked for calls to\nundefined functions. For the somewhat more advanced user there is a small but\nflexible language that can be used for selecting parts of the analyzed\nsystem and for doing some simple graph analyses on selected calls.\n\nThe following sections show some features of Xref, beginning with a module check\nand a predefined analysis. Then follow examples that can be skipped on the first\nreading; not all of the concepts used are explained, and it is assumed that the\n[reference manual](`m:xref`) has been at least skimmed.","ref":"xref_chapter.html"},{"type":"extras","title":"Module Check - Xref - The Cross Reference Tool","doc":"Assume we want to check the following module:\n\n```erlang\n-module(my_module).\n\n-export([t/1]).\n\nt(A) ->\n my_module:t2(A).\n\nt2(_) ->\n true.\n```\n\nCross reference data are read from BEAM files, so the first step when checking\nan edited module is to compile it:\n\n```erlang\n1> c(my_module, debug_info).\n./my_module.erl:10: Warning: function t2/1 is unused\n{ok, my_module}\n```\n\nThe `debug_info` option ensures that the BEAM file contains debug information,\nwhich makes it possible to find unused local functions.\n\nThe module can now be checked for calls to\n[deprecated functions](`m:xref#deprecated_function`), calls to\n[undefined functions](`m:xref#undefined_function`), and for unused local\nfunctions:\n\n```erlang\n2> xref:m(my_module)\n[{deprecated,[]},\n {undefined,[{{my_module,t,1},{my_module,t2,1}}]},\n {unused,[{my_module,t2,1}]}]\n```\n\n`m/1` is also suitable for checking that the BEAM file of a module that is about\nto be loaded into a running a system does not call any undefined functions. In\neither case, the code path of the code server (see the module `code`) is used\nfor finding modules that export externally called functions not exported by the\nchecked module itself, so called [library modules](`m:xref#library_module`).","ref":"xref_chapter.html#module-check"},{"type":"extras","title":"Predefined Analysis - Xref - The Cross Reference Tool","doc":"In the last example the module to analyze was given as an argument to `m/1`, and\nthe code path was (implicitly) used as [library path](`m:xref#library_path`). In\nthis example an [xref server](`m:xref#xref_server`) will be used, which makes it\npossible to analyze applications and releases, and also to select the library\npath explicitly.\n\nEach Xref server is referred to by a unique name. The name is given when\ncreating the server:\n\n```erlang\n1> xref:start(s).\n{ok,<0.27.0>}\n```\n\nNext the system to be analyzed is added to the Xref server. Here the system will\nbe OTP, so no library path will be needed. Otherwise, when analyzing a system\nthat uses OTP, the OTP modules are typically made library modules by setting the\nlibrary path to the default OTP code path (or to `code_path`, see the\n[reference manual](`m:xref#code_path`)). By default, the names of read BEAM\nfiles and warnings are output when adding analyzed modules, but these messages\ncan be avoided by setting default values of some options:\n\n```erlang\n2> xref:set_default(s, [{verbose,false}, {warnings,false}]).\nok\n3> xref:add_release(s, code:lib_dir(), {name, otp}).\n{ok,otp}\n```\n\n`add_release/3` assumes that all subdirectories of the library directory\nreturned by [`code:lib_dir()`](`code:lib_dir/0`) contain applications;\nthe effect is that of reading all BEAM files for the application.\n\nIt is now easy to check the release for calls to undefined functions:\n\n```erlang\n4> xref:analyze(s, undefined_function_calls).\n{ok, [...]}\n```\n\nWe can now continue with further analyses, or we can delete the Xref server:\n\n```erlang\n5> xref:stop(s).\n```\n\nThe check for calls to undefined functions is an example of a predefined\nanalysis, probably the most useful one. Other examples are the analyses that\nfind unused local functions, or functions that call some given functions. See\nthe [analyze/2,3](`m:xref#analyze`) functions for a complete list of predefined\nanalyses.\n\nEach predefined analysis is a shorthand for a [query](`m:xref#query`), a\nsentence of a tiny language providing cross reference data as values of\n[predefined variables](`m:xref#predefined_variable`). The check for calls to\nundefined functions can thus be stated as a query:\n\n```erlang\n4> xref:q(s, \"(XC - UC) || (XU - X - B)\").\n{ok,[...]}\n```\n\nThe query asks for the restriction of external calls except the unresolved calls\nto calls to functions that are externally used but neither exported nor built-in\nfunctions (the `||` operator restricts the used functions while the `|` operator\nrestricts the calling functions). The `-` operator returns the difference of two\nsets, and the `+` operator to be used below returns the union of two sets.\n\nThe relationships between the predefined variables `XU`, `X`, `B` and a few\nothers are worth elaborating upon. The reference manual mentions two ways of\nexpressing the set of all functions, one that focuses on how they are defined:\n`X + L + B + U`, and one that focuses on how they are used: `UU + LU + XU`. The\nreference also mentions some [facts](`m:xref#simple_facts`) about the variables:\n\n- `F` is equal to `L + X` (the defined functions are the local functions and the\n external functions);\n- `U` is a subset of `XU` (the unknown functions are a subset of the externally\n used functions since the compiler ensures that locally used functions are\n defined);\n- `B` is a subset of `XU` (calls to built-in functions are always external by\n definition, and unused built-in functions are ignored);\n- `LU` is a subset of `F` (the locally used functions are either local functions\n or exported functions, again ensured by the compiler);\n- `UU` is equal to `F - (XU + LU)` (the unused functions are defined functions\n that are neither used externally nor locally);\n- `UU` is a subset of `F` (the unused functions are defined in analyzed\n modules).\n\nUsing these facts, the two small circles in the picture below can be combined.\n\n![Definition and use of functions](assets/venn1.gif \"Definition and use of functions\")\n\nIt is often clarifying to mark the variables of a query in such a circle. This\nis illustrated in the picture below for some of the predefined analyses. Note\nthat local functions used by local functions only are not marked in the\n`locals_not_used` circle.[](){: #venn2 }\n\n![Some predefined analyses as subsets of all functions](assets/venn2.gif \"Some predefined analyses as subsets of all functions\")","ref":"xref_chapter.html#predefined-analysis"},{"type":"extras","title":"Expressions - Xref - The Cross Reference Tool","doc":"The module check and the predefined analyses are useful, but limited. Sometimes\nmore flexibility is needed, for instance one might not need to apply a graph\nanalysis on all calls, but some subset will do equally well. That flexibility is\nprovided with a simple language. Below are some expressions of the language with\ncomments, focusing on elements of the language rather than providing useful\nexamples. The analyzed system is assumed to be OTP, so in order to run the\nqueries, first evaluate these calls:\n\n```erlang\nxref:start(s).\nxref:add_release(s, code:root_dir()).\n```\n\n- **`xref:q(s, \"(Fun) xref : Mod\").`** - All functions of the `xref` module.\n\n- **`xref:q(s, \"xref : Mod * X\").`** - All exported functions of the `xref`\n module. The first operand of the intersection operator `*` is implicitly\n converted to the more special type of the second operand.\n\n- **`xref:q(s, \"(Mod) tools\").`** - All modules of the Tools application.\n\n- **`xref:q(s, '\"xref_.*\" : Mod').`** - All modules with a name beginning with\n `xref_`.\n\n- **`xref:q(s, \"# E | X \").`** - Number of calls from exported functions.\n\n- **`xref:q(s, \"XC || L \").`** - All external calls to local functions.\n\n- **`xref:q(s, \"XC * LC\").`** - All calls that have both an external and a local\n version.\n\n- **`xref:q(s, \"(LLin) (LC * XC)\").`** - The lines where the local calls of the\n last example are made.\n\n- **`xref:q(s, \"(XLin) (LC * XC)\").`** - The lines where the external calls of\n the example before last are made.\n\n- **`xref:q(s, \"XC * (ME - strict ME)\").`** - External calls within some module.\n\n- **`xref:q(s, \"E ||| kernel\").`** - All calls within the Kernel application.\n\n- **`xref:q(s, \"closure E | kernel || kernel\").`** - All direct and indirect\n calls within the Kernel application. Both the calling and the used functions\n of indirect calls are defined in modules of the kernel application, but it is\n possible that some functions outside the kernel application are used by\n indirect calls.\n\n- **`xref:q(s, \"{toolbar,debugger}:Mod of ME\").`** - A chain of module calls\n from `toolbar` to `debugger`, if there is such a chain, otherwise `false`. The\n chain of calls is represented by a list of modules, `toolbar` being the first\n element and `debugger`the last element.\n\n- **`xref:q(s, \"closure E | toolbar:Mod || debugger:Mod\").`** - All (in)direct\n calls from functions in `toolbar` to functions in `debugger`.\n\n- **`xref:q(s, \"(Fun) xref -> xref_base\").`** - All function calls from `xref`\n to `xref_base`.\n\n- **`xref:q(s, \"E * xref -> xref_base\").`** - Same interpretation as last\n expression.\n\n- **`xref:q(s, \"E || xref_base | xref\").`** - Same interpretation as last\n expression.\n\n- **`xref:q(s, \"E * [xref -> lists, xref_base -> digraph]\").`** - All function\n calls from `xref` to `lists`, and all function calls from `xref_base` to\n `digraph`.\n\n- **`xref:q(s, \"E | [xref, xref_base] || [lists, digraph]\").`** - All function\n calls from `xref` and `xref_base` to `lists` and `digraph`.\n\n- **`xref:q(s, \"components EE\").`** - All strongly connected components of the\n Inter Call Graph. Each component is a set of exported or unused local\n functions that call each other (in)directly.\n\n- **`xref:q(s, \"X * digraph * range (closure (E | digraph) | (L * digraph))\").`** -\n All exported functions of the `digraph` module used (in)directly by some\n function in `digraph`.\n\n- **`xref:q(s, \"L * yeccparser:Mod - range (closure (E |`**\n\n- **`yeccparser:Mod) | (X * yeccparser:Mod))\").`** - The interpretation is left\n as an exercise.","ref":"xref_chapter.html#expressions"},{"type":"extras","title":"Graph Analysis - Xref - The Cross Reference Tool","doc":"The list [representation of graphs](`m:xref#representation`) is used analyzing\ndirect calls, while the `digraph` representation is suited for analyzing\nindirect calls. The restriction operators (`|`, `||` and `|||`) are the only\noperators that accept both representations. This means that in order to analyze\nindirect calls using restriction, the `closure` operator (which creates the\n`digraph` representation of graphs) has to be explicitly applied.\n\nAs an example of analyzing indirect calls, the following Erlang function tries\nto answer the question: if we want to know which modules are used indirectly by\nsome module(s), is it worth while using the\n[function graph](`m:xref#call_graph`) rather than the module graph? Recall that\na module M1 is said to call a module M2 if there is some function in M1 that\ncalls some function in M2. It would be nice if we could use the much smaller\nmodule graph, since it is available also in the light weight\n`modules`[mode](`m:xref#mode`) of Xref servers.\n\n```erlang\nt(S) ->\n {ok, _} = xref:q(S, \"Eplus := closure E\"),\n {ok, Ms} = xref:q(S, \"AM\"),\n Fun = fun(M, N) ->\n Q = io_lib:format(\"# (Mod) (Eplus | ~p : Mod)\", [M]),\n {ok, N0} = xref:q(S, lists:flatten(Q)),\n N + N0\n end,\n Sum = lists:foldl(Fun, 0, Ms),\n ok = xref:forget(S, 'Eplus'),\n {ok, Tot} = xref:q(S, \"# (closure ME | AM)\"),\n 100 * ((Tot - Sum) / Tot).\n```\n\nComments on the code:\n\n- We want to find the reduction of the closure of the function graph to modules.\n The direct expression for doing that would be `(Mod) (closure E | AM)`, but\n then we would have to represent all of the transitive closure of E in memory.\n Instead the number of indirectly used modules is found for each analyzed\n module, and the sum over all modules is calculated.\n- A user variable is employed for holding the `digraph` representation of the\n function graph for use in many queries. The reason is efficiency. As opposed\n to the `=` operator, the `:=` operator saves a value for subsequent analyses.\n Here might be the place to note that equal subexpressions within a query are\n evaluated only once; `=` cannot be used for speeding things up.\n- `Eplus | ~p : Mod`. The `|` operator converts the second operand to the type\n of the first operand. In this case the module is converted to all functions of\n the module. It is necessary to assign a type to the module (`: Mod`),\n otherwise modules like `kernel` would be converted to all functions of the\n application with the same name; the most general constant is used in cases of\n ambiguity.\n- Since we are only interested in a ratio, the unary operator `#` that counts\n the elements of the operand is used. It cannot be applied to the `digraph`\n representation of graphs.\n- We could find the size of the closure of the module graph with a loop similar\n to one used for the function graph, but since the module graph is so much\n smaller, a more direct method is feasible.\n\nWhen the Erlang function `t/1` was applied to an Xref server loaded with the\ncurrent version of OTP, the returned value was close to 84 (percent). This means\nthat the number of indirectly used modules is approximately six times greater\nwhen using the module graph. So the answer to the above stated question is that\nit is definitely worth while using the function graph for this particular\nanalysis. Finally, note that in the presence of unresolved calls, the graphs may\nbe incomplete, which means that there may be indirectly used modules that do not\nshow up.","ref":"xref_chapter.html#graph-analysis"},{"type":"extras","title":"Erlang mode for Emacs","doc":"# Erlang mode for Emacs\n\nPossibly the most important feature of an editor designed for programmers is the\nability to indent a line of code in accordance with the structure of the\nprogramming language. The Erlang mode does, of course, provide this feature. The\nlayout used is based on the common use of the language. The mode also provides\nthings as syntax highlighting, electric commands, module name verification,\ncomment support including paragraph filling, skeletons, tags support etc.\n\nIn the following descriptions the use of the word _Point_ means: \"Point can be\nseen as the position of the cursor. More precisely, the point is the position\nbetween two characters while the cursor is drawn over the character following\nthe point\".","ref":"erlang-el.html"},{"type":"extras","title":"Indent - Erlang mode for Emacs","doc":"The following command are directly available for indentation.\n\n- _`TAB`_ (`erlang-indent-command`) - Indents the current line of code.\n- _`M-C-\\`_ (`indent-region`) - Indents all lines in the region.\n- _`M-l`_ (`indent-for-comment`) - Insert a comment character to the right of\n the code on the line (if any).\n\nLines containing comment are indented differently depending on the number of\n%-characters used:\n\n- Lines with one %-character is indented to the right of the code. The column\n is specified by the variable `comment-column`, by default column 48 is used.\n- Lines with two %-characters will be indented to the same depth as code would\n have been in the same situation.\n- Lines with three of more %-characters are indented to the left margin.\n- _`C-c C-q`_ (`erlang-indent-function`) - Indents the current Erlang\n function.\n- _`M-x erlang-indent-clause RET`_ - Indent the current Erlang clause.\n- _`M-x erlang-indent-current-buffer RET`_ - Indent the entire buffer.","ref":"erlang-el.html#indent"},{"type":"extras","title":"Edit - Fill Comment - Erlang mode for Emacs","doc":"When editing normal text in text mode you can let Emacs reformat the text by the\n`fill-paragraph` command. This command will not work for comments since it will\ntreat the comment characters as words. The Erlang editing mode provides a\ncommand that knows about the Erlang comment structure and can be used to fill\ntext paragraphs in comments. Ex:\n\n```erlang\n%% This is just a very simple test to show\n%% how the Erlang fill\n%% paragraph command works.\n```\n\nClearly, the text is badly formatted. Instead of formatting this paragraph line\nby line, let's try `erlang-fill-paragraph` by pressing _`M-q`_. The result is:\n\n```erlang\n%% This is just a very simple test to show how the Erlang fill\n%% paragraph command works.\n```","ref":"erlang-el.html#edit-fill-comment"},{"type":"extras","title":"Edit - Comment/Uncomment Region - Erlang mode for Emacs","doc":"_`C-c C-c`_ will put comment characters at the beginning of all lines in a\nmarked region. If you want to have two comment characters instead of one you can\ndo _`C-u 2 C-c C-c`_\n\n_`C-c C-u`_ will undo a comment-region command.","ref":"erlang-el.html#edit-comment-uncomment-region"},{"type":"extras","title":"Edit - Moving the point - Erlang mode for Emacs","doc":"- _`M-C-a`_ (`erlang-beginning-of-function`) - Move the point to the beginning\n of the current or preceding Erlang function. With an numeric argument (ex\n _`C-u 2 M-C-a`_) the function skips backwards over this many Erlang\n functions. Should the argument be negative the point is moved to the\n beginning of a function below the current function.\n- _`C-c M-a`_ (`erlang-beginning-of-clause`) - As above but move point to the\n beginning of the current or preceding Erlang clause.\n- _`M-C-e`_ (`erlang-end-of-function`) - Move to the end of the current or\n following Erlang function. With an numeric argument (ex _`C-u 2 M-C-e`_) the\n function skips backwards over this many Erlang functions. Should the\n argument be negative the point is moved to the end of a function below the\n current function.\n- _`C-c M-e`_ (`erlang-end-of-clause`) - As above but move point to the end of\n the current or following Erlang clause.","ref":"erlang-el.html#edit-moving-the-point"},{"type":"extras","title":"Edit - Marking - Erlang mode for Emacs","doc":"- _`M-C-h`_ (`erlang-mark-function`) - Put the region around the current\n Erlang function. The point is placed in the beginning and the mark at the\n end of the function.\n- _`C-c M-h`_ (`erlang-mark-clause`) Put the region around the current Erlang\n clause. The point is placed in the beginning and the mark at the end of the\n function.","ref":"erlang-el.html#edit-marking"},{"type":"extras","title":"Edit - Function Header Commands - Erlang mode for Emacs","doc":"- _`C-c C-j`_ (`erlang-generate-new-clause`) - Create a new clause in the\n current Erlang function. The point is placed between the parentheses of the\n argument list.\n- _`C-c C-y`_ (`erlang-clone-arguments`) - Copy the function arguments of the\n preceding Erlang clause. This command is useful when defining a new clause\n with almost the same argument as the preceding.","ref":"erlang-el.html#edit-function-header-commands"},{"type":"extras","title":"Edit - Alignment - Erlang mode for Emacs","doc":"- _`C-c C-a`_ (`align-current`) - aligns comments, arrows, assignments,\n and type annotations around the cursor.\n\n```erlang\nExample:\n\nsum(L) -> sum(L, 0).\nsum([H|T], Sum) -> sum(T, Sum + H); % recurse\nsum([], Sum) -> Sum. % base case\n\n-record { two :: int(), % hello\n three = hello :: string(), % there\n four = 42 :: int() }.\n\nbecomes:\n\nsum(L) -> sum(L, 0).\nsum([H|T], Sum) -> sum(T, Sum + H); % recurse\nsum([], Sum) -> Sum. % base case\n\n-record { two :: int(), % hello\n three = hello :: string(), % there\n four = 42 :: int() }.\n```","ref":"erlang-el.html#edit-alignment"},{"type":"extras","title":"Syntax highlighting - Erlang mode for Emacs","doc":"The syntax highlighting can be activated from the Erlang menu. There are four\ndifferent alternatives:\n\n- Off: Normal black and white display.\n- Level 1: Function headers, reserved words, comments, strings, quoted atoms,\n and character constants will be colored.\n- Level 2: The above, attributes, Erlang bif:s, guards, and words in comments\n enclosed in single quotes will be colored.\n- Level 3: The above, variables, records, and macros will be colored. (This\n level is also known as the Christmas tree level.)","ref":"erlang-el.html#syntax-highlighting"},{"type":"extras","title":"Tags - Erlang mode for Emacs","doc":"For the tag commands to work it requires that you have generated a tag file. See\n[Erlang mode users guide](erlang_mode_chapter.md#tags)\n\n- _`M-.`_ (`find-tag`) - Find a function definition. The default value is the\n function name under the point.\n- Find Tag (`erlang-find-tag`) - Like the Elisp-function\n `find-tag'. Capable of retrieving Erlang modules. Tags can be given on the forms `tag',\n `module:', `module:tag'.\n- _`M-+`_ (`erlang-find-next-tag`) - Find the next occurrence of tag.\n- _`M-TAB`_ (`erlang-complete-tag`) - Perform completion on the tag entered in\n a tag search. Completes to the set of names listed in the current tags\n table.\n- Tags aprops (`tags-apropos`) - Display list of all tags in tags table REGEXP\n matches.\n- _`C-x t s`_ (`tags-search`) - Search through all files listed in tags table\n for match for REGEXP. Stops when a match is found.","ref":"erlang-el.html#tags"},{"type":"extras","title":"Skeletons - Erlang mode for Emacs","doc":"A skeleton is a piece of pre-written code that can be inserted into the buffer.\nErlang mode comes with a set of predefined skeletons. The skeletons can be\naccessed either from the Erlang menu of from commands named\n`tempo-template-erlang-*`, as the skeletons is defined using the standard Emacs\npackage \"tempo\". Here follows a brief description of the available skeletons:\n\n- Simple skeletons: If, Case, Receive, Receive After, Receive Loop - Basic\n code constructs.\n- Header elements: Module, Author - These commands insert lines on the form\n `-module('xxx').` and `-author('my@home').`. They can be used directly, but\n are also used as part of the full headers described below.\n- Full Headers: Small (minimum requirement), Medium (with fields for basic\n information about the module), and Large Header (medium header with some\n extra layout structure).\n- Small Server - skeleton for a simple server not using OTP.\n- Application - skeletons for the OTP application behavior\n- Supervisor - skeleton for the OTP supervisor behavior\n- Supervisor Bridge - skeleton for the OTP supervisor bridge behavior\n- gen_server - skeleton for the OTP gen_server behavior\n- gen_event - skeleton for the OTP gen_event behavior\n- gen_fsm - skeleton for the OTP gen_fsm behavior\n- gen_statem (StateName/3) - skeleton for the OTP gen_statem behavior using\n state name functions\n- gen_statem (handle_event/4) - skeleton for the OTP gen_statem behavior using\n one state function\n- Library module - skeleton for a module that does not implement a process.\n- Corba callback - skeleton for a Corba callback module.\n- Erlang test suite - skeleton for a callback module for the erlang test\n server.","ref":"erlang-el.html#skeletons"},{"type":"extras","title":"Shell - Erlang mode for Emacs","doc":"- New shell (`erlang-shell`) - Starts a new Erlang shell.\n- _`C-c C-z,`_ (`erlang-shell-display `) - Displays an Erlang shell, or starts\n a new one if there is no shell started.","ref":"erlang-el.html#shell"},{"type":"extras","title":"Compile - Erlang mode for Emacs","doc":"- _`C-c C-k,`_ (`erlang-compile`) - Compiles the Erlang module in the current\n buffer. You can also use _`C-u C-c C-k`_ to debug compile the module with\n the debug options `debug_info` and `export_all`.\n- _`C-c C-l,`_ (`erlang-compile-display`) - Display compilation output.\n- _``C-u C-x` ``_ Start parsing the compiler output from the beginning. This\n command will place the point on the line where the first error was found.\n- _`` C-x` ``_ (`erlang-next-error`) - Move the point on to the next error.\n The buffer displaying the compilation errors will be updated so that the\n current error will be visible.","ref":"erlang-el.html#compile"},{"type":"extras","title":"Man - Erlang mode for Emacs","doc":"On unix you can view the manual pages in emacs. In order to find the manual\npages, the variable `erlang-root-dir` should be bound to the name of the\ndirectory containing the Erlang installation. The name should not include the\nfinal slash. Practically, you should add a line on the following form to your\n~/.emacs,\n\n```text\n(setq erlang-root-dir \"/the/erlang/root/dir/goes/here\")\n```","ref":"erlang-el.html#man"},{"type":"extras","title":"Starting IMenu - Erlang mode for Emacs","doc":"- _`M-x imenu-add-to-menubar RET`_ - This command will create the IMenu menu\n containing all the functions in the current buffer.The command will ask you\n for a suitable name for the menu. Not supported by Xemacs.","ref":"erlang-el.html#starting-imenu"},{"type":"extras","title":"Version - Erlang mode for Emacs","doc":"- _`M-x erlang-version RET`_ - This command displays the version number of the\n Erlang editing mode. Remember to always supply the version number when\n asking questions about the Erlang mode.","ref":"erlang-el.html#version"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/tools-4.0/doc/html/erlang-el.html b/prs/8803/lib/tools-4.0/doc/html/erlang-el.html index eab5fc9dd064a..e49841369d212 100644 --- a/prs/8803/lib/tools-4.0/doc/html/erlang-el.html +++ b/prs/8803/lib/tools-4.0/doc/html/erlang-el.html @@ -211,23 +211,23 @@

    • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
    Example:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    -sum([], Sum) -> Sum.   % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
    +sum([], Sum) -> Sum.   % base case
     
    --record { two :: int(), % hello
    -          three = hello :: string(),    % there
    -          four = 42 :: int() }.
    +-record { two :: int(), % hello
    +          three = hello :: string(),    % there
    +          four = 42 :: int() }.
     
     becomes:
     
    -sum(L) -> sum(L, 0).
    -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    -sum([], Sum)    -> Sum.             % base case
    +sum(L) -> sum(L, 0).
    +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
    +sum([], Sum)    -> Sum.             % base case
     
    --record { two           :: int(),    % hello
    -          three = hello :: string(), % there
    -          four  = 42    :: int() }.

    +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/fprof.html b/prs/8803/lib/tools-4.0/doc/html/fprof.html index 6d4b4c703b31d..524aafea9540a 100644 --- a/prs/8803/lib/tools-4.0/doc/html/fprof.html +++ b/prs/8803/lib/tools-4.0/doc/html/fprof.html @@ -175,61 +175,61 @@

    interested reader to try it out. Note that some flags to analyse/1 will affect the format.

    The following example was run on Erlang/OTP R8 on Solaris 8; all OTP internals in this example are version dependent.

    As an example, we will use the following function, which is a -slightly modified benchmark function from module file:

    -module(foo).
    --export([create_file_slow/2]).
    +slightly modified benchmark function from module file:

    -module(foo).
    +-export([create_file_slow/2]).
     
    -create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    -    {ok, FD} =
    -        file:open(Name, [raw, write, delayed_write, binary]),
    +create_file_slow(Name, N) when is_integer(N), N >= 0 ->
    +    {ok, FD} =
    +        file:open(Name, [raw, write, delayed_write, binary]),
         if N > 256 ->
    -            ok = file:write(FD,
    -                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    -                            lists:seq(0, 255))),
    -            ok = create_file_slow(FD, 256, N);
    +            ok = file:write(FD,
    +                            lists:map(fun (X) -> <<X:32/unsigned>> end,
    +                            lists:seq(0, 255))),
    +            ok = create_file_slow(FD, 256, N);
            true ->
    -            ok = create_file_slow(FD, 0, N)
    +            ok = create_file_slow(FD, 0, N)
         end,
    -    ok = file:close(FD).
    +    ok = file:close(FD).
     
    -create_file_slow(FD, M, M) ->
    +create_file_slow(FD, M, M) ->
         ok;
    -create_file_slow(FD, M, N) ->
    -    ok = file:write(FD, <<M:32/unsigned>>),
    -    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    -2> fprof:profile().
    -3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    -{  analysis_options,
    - [{callers, true},
    -  {sort, acc},
    -  {totals, false},
    -  {details, true}]}.
    +create_file_slow(FD, M, N) ->
    +    ok = file:write(FD, <<M:32/unsigned>>),
    +    create_file_slow(FD, M+1, N).

    Let us have a look at the printout after running:

    1> fprof:apply(foo, create_file_slow, [junk, 1024]).
    +2> fprof:profile().
    +3> fprof:analyse().

    The printout starts with:

    %% Analysis results:
    +{  analysis_options,
    + [{callers, true},
    +  {sort, acc},
    +  {totals, false},
    +  {details, true}]}.
     
     %                                       CNT       ACC       OWN
    -[{ totals,                             9627, 1691.119, 1659.074}].  %%%

    The CNT column shows the total number of function calls that was found in the +[{ totals, 9627, 1691.119, 1659.074}]. %%%

    The CNT column shows the total number of function calls that was found in the trace. In the ACC column is the total time of the trace from first timestamp to last. And in the OWN column is the sum of the execution time in functions found in the trace, not including called functions. In this case it is very close to the ACC time since the emulator had practically nothing to do except executing our test program.

    All time values in the printout are in milliseconds.

    The printout continues:

    %                                       CNT       ACC       OWN
    -[{ "<0.28.0>",                         9627,undefined, 1659.074}].   %%

    This is the printout header of one process. The printout contains only this one +[{ "<0.28.0>", 9627,undefined, 1659.074}]. %%

    This is the printout header of one process. The printout contains only this one process since we called fprof:apply/3 that traces only the current process. Therefore the CNT and OWN columns perfectly matches the totals above. The ACC column is undefined since summing the ACC times of all calls in the process makes no sense — one would get something like the ACC value from totals above multiplied by the average depth of the call stack.

    All paragraphs up to the next process header only concerns function calls within -this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    - { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    - [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    -  {suspend,                               1,    0.000,    0.000}]}.
    -
    -{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    - { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    - [{{file,close,1},                        1, 1398.873,    0.019},
    -  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    -  {{file,open,2},                         1,   20.778,    0.055},
    -  {{lists,map,2},                         1,   16.590,    0.043},
    -  {{lists,seq,2},                         1,    4.708,    0.017},
    -  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function +this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    + { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    + [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    +  {suspend,                               1,    0.000,    0.000}]}.
    +
    +{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    + { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    + [{{file,close,1},                        1, 1398.873,    0.019},
    +  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    +  {{file,open,2},                         1,   20.778,    0.055},
    +  {{lists,map,2},                         1,   16.590,    0.043},
    +  {{lists,seq,2},                         1,    4.708,    0.017},
    +  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function marked with % is the one the paragraph concerns — foo:create_file_slow/2. Above the marked function are the calling functions — those that has called the marked, and below are those called by the marked function.

    The paragraphs are per default sorted in descending order of the ACC column for @@ -246,12 +246,12 @@

    (lists:seq/2 and lists:map/2).

    The function undefined that has called fprof:apply_start_stop/4 is an unknown function because that call was not recorded in the trace. It was only recorded that the execution returned from fprof:apply_start_stop/4 to some -other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    - { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    - [{{file,write,2},                      768,  220.314,   14.539},
    -  {suspend,                              57,    6.041,    0.000},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that +other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    + { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    + [{{file,write,2},                      768,  220.314,   14.539},
    +  {suspend,                              57,    6.041,    0.000},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that foo:create_file_slow/3 was called only from foo:create_file_slow/2 and itself, and called only file:write/2, note the number of calls to file:write/2. But here we see that suspend was called a few times. This is a @@ -259,88 +259,88 @@

    foo:create_file_slow/3, and since there is no 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 schedule -out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    -  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    -  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    -  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    -  {{lists,map,2},                        10,    2.104,    0.000},
    -  {{prim_file,write,2},                  17,    1.852,    0.000},
    -  {{erlang,port_command,2},              15,    1.713,    0.000},
    -  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    -  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    -  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    -  {{lists,seq,4},                         3,    0.880,    0.000},
    -  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    -  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    -  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    -  {{prim_file,i32,4},                     1,    0.109,    0.000},
    -  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    - { suspend,                             299,   32.002,    0.000},     %
    - [ ]}.

    We find no particularly long suspend times, so no function seems to have waited +out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    +  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    +  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    +  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    +  {{lists,map,2},                        10,    2.104,    0.000},
    +  {{prim_file,write,2},                  17,    1.852,    0.000},
    +  {{erlang,port_command,2},              15,    1.713,    0.000},
    +  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    +  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    +  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    +  {{lists,seq,4},                         3,    0.880,    0.000},
    +  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    +  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    +  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    +  {{prim_file,i32,4},                     1,    0.109,    0.000},
    +  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    + { suspend,                             299,   32.002,    0.000},     %
    + [ ]}.

    We find no particularly long suspend times, so no function seems to have waited in a receive statement. Actually, prim_file:drv_command/4 contains a receive statement, but in this test program, the message lies in the process receive buffer when the receive statement is entered. We also see that the total suspend time for the test run is small.

    The suspend pseudo function has an OWN time of zero. This is to prevent the process total OWN time from 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 pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    -  {{prim_file,write,2},                  16,    0.692,    0.692},
    -  {{lists,map,2},                         2,    0.195,    0.195}],
    - { garbage_collect,                      43,    1.760,    1.760},     %
    - [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like +time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    +  {{prim_file,write,2},                  16,    0.692,    0.692},
    +  {{lists,map,2},                         2,    0.195,    0.195}],
    + { garbage_collect,                      43,    1.760,    1.760},     %
    + [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like suspend, instead it is equal to the ACC time.

    Garbage collection often occurs while a process is suspended, but fprof hides this fact by pretending that the suspended function was first unsuspended and then garbage collected. Otherwise the printout would show garbage_collect being called from suspend, but not which function that might have caused the -garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    -  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    - { {file,write,2},                      769,  220.630,   14.560},     %
    - [{{prim_file,write,2},                 769,  199.789,   22.573},
    -  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from +garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    +  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    + { {file,write,2},                      769,  220.630,   14.560},     %
    + [{{prim_file,write,2},                 769,  199.789,   22.573},
    +  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from foo:create_file_slow/3 and foo:create_file_slow/2. The number of calls in each case as well as the used time are also confirms the previous results.

    We see that file:write/2 only calls prim_file:write/2, but let us refrain from digging into the internals of the kernel application.

    If we nevertheless do dig down we find the call to the linked-in driver -that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    - { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    - [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close +that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    + { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    + [{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 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},
    -  {{prim_file,open_int,4},                1,   19.755,    0.017},
    -  {{prim_file,open_int_setopts,3},        1,    0.147,    0.016}],
    - { {prim_file,drv_command,2},           772, 1593.322,   12.867},     %
    - [{{prim_file,drv_command,4},           772, 1578.973,   27.265},
    -  {suspend,                              22,    1.482,    0.000}]}.

    The time for file operations in the linked in driver distributes itself as 1 % +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},
    +  {{prim_file,open_int,4},                1,   19.755,    0.017},
    +  {{prim_file,open_int_setopts,3},        1,    0.147,    0.016}],
    + { {prim_file,drv_command,2},           772, 1593.322,   12.867},     %
    + [{{prim_file,drv_command,4},           772, 1578.973,   27.265},
    +  {suspend,                              22,    1.482,    0.000}]}.

    The time for file operations in the linked in driver distributes itself as 1 % for open, 11 % for write, and 87 % for close. All data is probably buffered in the operating system until the close.

    The observant 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 believe that prim_file:drv_command/2 is just a passthrough function.

    The missing time can be found in the paragraph for prim_file:drv_command/4 where it is evident that not only prim_file:drv_command/2 is called but also a -fun:

    {[{{prim_file,drv_command,2},           772, 1578.973,   27.265}],
    - { {prim_file,drv_command,4},           772, 1578.973,   27.265},     %
    - [{{erlang,port_command,2},             772, 1458.356, 1456.643},
    -  {{prim_file,'-drv_command/2-fun-0-',1}, 772,   87.897,   12.736},
    -  {suspend,                              50,    4.582,    0.000},
    -  {garbage_collect,                      25,    0.873,    0.873}]}.

    And some more missing time can be explained by the fact that +fun:

    {[{{prim_file,drv_command,2},           772, 1578.973,   27.265}],
    + { {prim_file,drv_command,4},           772, 1578.973,   27.265},     %
    + [{{erlang,port_command,2},             772, 1458.356, 1456.643},
    +  {{prim_file,'-drv_command/2-fun-0-',1}, 772,   87.897,   12.736},
    +  {suspend,                              50,    4.582,    0.000},
    +  {garbage_collect,                      25,    0.873,    0.873}]}.

    And some more missing time can be explained by the fact that prim_file:open_int/4 both calls prim_file:drv_command/2 directly as well as -through prim_file:open_int_setopts/3, which complicates the picture.

    {[{{prim_file,open,2},                    1,   20.309,    0.029},
    -  {{prim_file,open_int,4},                1,    0.000,    0.057}],
    - { {prim_file,open_int,4},                2,   20.309,    0.086},     %
    - [{{prim_file,drv_command,2},             1,   19.755,    0.017},
    -  {{prim_file,open_int_setopts,3},        1,    0.360,    0.032},
    -  {{prim_file,drv_open,2},                1,    0.071,    0.030},
    -  {{erlang,list_to_binary,1},             1,    0.020,    0.020},
    -  {{prim_file,i32,1},                     1,    0.017,    0.017},
    -  {{prim_file,open_int,4},                1,    0.000,    0.057}]}.
    +through prim_file:open_int_setopts/3, which complicates the picture.

    {[{{prim_file,open,2},                    1,   20.309,    0.029},
    +  {{prim_file,open_int,4},                1,    0.000,    0.057}],
    + { {prim_file,open_int,4},                2,   20.309,    0.086},     %
    + [{{prim_file,drv_command,2},             1,   19.755,    0.017},
    +  {{prim_file,open_int_setopts,3},        1,    0.360,    0.032},
    +  {{prim_file,drv_open,2},                1,    0.071,    0.030},
    +  {{erlang,list_to_binary,1},             1,    0.020,    0.020},
    +  {{prim_file,i32,1},                     1,    0.017,    0.017},
    +  {{prim_file,open_int,4},                1,    0.000,    0.057}]}.
     .
     .
     .
    -{[{{prim_file,open_int,4},                1,    0.360,    0.032},
    -  {{prim_file,open_int_setopts,3},        1,    0.000,    0.016}],
    - { {prim_file,open_int_setopts,3},        2,    0.360,    0.048},     %
    - [{suspend,                               1,    0.165,    0.000},
    -  {{prim_file,drv_command,2},             1,    0.147,    0.016},
    -  {{prim_file,open_int_setopts,3},        1,    0.000,    0.016}]}.

    +{[{{prim_file,open_int,4}, 1, 0.360, 0.032}, + {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}], + { {prim_file,open_int_setopts,3}, 2, 0.360, 0.048}, % + [{suspend, 1, 0.165, 0.000}, + {{prim_file,drv_command,2}, 1, 0.147, 0.016}, + {{prim_file,open_int_setopts,3}, 1, 0.000, 0.016}]}.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/fprof_chapter.html b/prs/8803/lib/tools-4.0/doc/html/fprof_chapter.html index 936926bee746d..9d16205eaf11c 100644 --- a/prs/8803/lib/tools-4.0/doc/html/fprof_chapter.html +++ b/prs/8803/lib/tools-4.0/doc/html/fprof_chapter.html @@ -176,10 +176,10 @@

    It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    -fprof:trace([start, {tracer, Tracer}]),
    +so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    +fprof:trace([start, {tracer, Tracer}]),
     %% Run code to profile
    -fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime system.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/lcnt_chapter.html b/prs/8803/lib/tools-4.0/doc/html/lcnt_chapter.html index 5d97767461fff..0497bb806488b 100644 --- a/prs/8803/lib/tools-4.0/doc/html/lcnt_chapter.html +++ b/prs/8803/lib/tools-4.0/doc/html/lcnt_chapter.html @@ -233,20 +233,20 @@

    Example with Mnesia Transaction Benchmark

    -

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -350,63 +350,63 @@ 

    The Big Bang Benchmark

    -
    -module(big).
    --export([bang/1]).
    +
    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    +bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    diff --git a/prs/8803/lib/tools-4.0/doc/html/make.html b/prs/8803/lib/tools-4.0/doc/html/make.html index 7c3ecf905bccb..812af65c4b9b9 100644 --- a/prs/8803/lib/tools-4.0/doc/html/make.html +++ b/prs/8803/lib/tools-4.0/doc/html/make.html @@ -142,8 +142,8 @@

    the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/notes.html b/prs/8803/lib/tools-4.0/doc/html/notes.html index 6c1b5b2f240af..94b60f51ada27 100644 --- a/prs/8803/lib/tools-4.0/doc/html/notes.html +++ b/prs/8803/lib/tools-4.0/doc/html/notes.html @@ -137,25 +137,25 @@

    Fixed Bugs and Malfunctions

    -
    • Dialyzer warnings due to type specs added in dbg have been eliminated.

      Own Id: OTP-18860

    • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

      For example, consider this module:

      -module(foo).
      --export([bar/0, baz/0]).
      +
      • Dialyzer warnings due to type specs added in dbg have been eliminated.

        Own Id: OTP-18860

      • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

        For example, consider this module:

        -module(foo).
        +-export([bar/0, baz/0]).
         
        -bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries -for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries +for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      +3> cover:analyse(foo, coverage, line). +{ok,[{{foo,4},{1,0}}]} +4> cover:analyse(foo, calls, line). +{ok,[{{foo,4},1}]}

      Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

    • Fixed align command in emacs mode.

      Own Id: OTP-19026 Aux Id: PR-8155

    @@ -168,12 +168,12 @@

    """. "a\nb\nc"

    Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:

    1> "abc""xyz".
     "xyz".
    -* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
    +* 1:6: adjacent string literals without intervening white space

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

  • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

    Example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
     
     ****** Process <0.92.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     ok

    Own Id: OTP-18756 Aux Id: PR-6639

  • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

    There are also new APIs to support native coverage without using the cover tool.

    To instrument code for native coverage it must be compiled with the line_coverage option.

    To enable native coverage in the runtime system, start it like so:

    $ erl +JPcover true

    There are also the following new functions for supporting native coverage:

    Own Id: OTP-18856 Aux Id: PR-7856

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Improved the align command in emacs mode.

    Own Id: OTP-19080 Aux Id: PR-8288

  • diff --git a/prs/8803/lib/tools-4.0/doc/html/search.html b/prs/8803/lib/tools-4.0/doc/html/search.html index 3be83af99fa17..4fb54c2acc0fd 100644 --- a/prs/8803/lib/tools-4.0/doc/html/search.html +++ b/prs/8803/lib/tools-4.0/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    diff --git a/prs/8803/lib/tools-4.0/doc/html/tools.epub b/prs/8803/lib/tools-4.0/doc/html/tools.epub index 2c683467fe1ebdf6f205769711ee267a99153db3..832be4d8de7ab426f0a7c2db78399e1a66a140fc 100644 GIT binary patch delta 72981 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 U+yE4~fwye{(xFFIAQJ)bf4^L5LjV8( diff --git a/prs/8803/lib/tools-4.0/doc/html/tprof.html b/prs/8803/lib/tools-4.0/doc/html/tprof.html index a87075abfde31..8006072e5b417 100644 --- a/prs/8803/lib/tools-4.0/doc/html/tprof.html +++ b/prs/8803/lib/tools-4.0/doc/html/tprof.html @@ -160,137 +160,137 @@

    Ad-hoc profiling

    -

    Ad-hoc profiling is convenient for profiling a single function call.

    For example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
    +

    Ad-hoc profiling is convenient for profiling a single function call.

    For example:

    1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
     
     ****** Process <0.92.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     ok

    By default tracing is enabled for all functions in all modules. When funs -are created in the interactive shell, parts of shell code are also traced:

    1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
    +are created in the interactive shell, parts of shell code are also traced:

    1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
     
     ****** Process <0.95.0>  --  100.00% of total *** 
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -erl_eval:do_apply/7            1      3      3.00  [ 3.61]
    -erl_eval:match_list/6          1      3      3.00  [ 3.61]
    -lists:reverse/1                1      4      4.00  [ 4.82]
    -erl_eval:expr_list/7           3      7      2.33  [ 8.43]
    -erl_eval:ret_expr/3            4     16      4.00  [19.28]
    -erl_eval:merge_bindings/4      3     18      6.00  [21.69]
    -lists:seq_loop/3               5     32      6.40  [38.55]
    -                                     83            [100.0]
    -ok

    However, it is possible to limit the trace to specific functions or modules:

    2> tprof:profile(fun() -> lists:seq(1, 16) end,
    -                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
    +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    +erl_eval:do_apply/7            1      3      3.00  [ 3.61]
    +erl_eval:match_list/6          1      3      3.00  [ 3.61]
    +lists:reverse/1                1      4      4.00  [ 4.82]
    +erl_eval:expr_list/7           3      7      2.33  [ 8.43]
    +erl_eval:ret_expr/3            4     16      4.00  [19.28]
    +erl_eval:merge_bindings/4      3     18      6.00  [21.69]
    +lists:seq_loop/3               5     32      6.40  [38.55]
    +                                     83            [100.0]
    +ok

    However, it is possible to limit the trace to specific functions or modules:

    2> tprof:profile(fun() -> lists:seq(1, 16) end,
    +                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
     ****** Process <0.98.0>  --  100.00% of total *** 
    -FUNCTION          CALLS  WORDS  PER CALL  [     %]
    -lists:seq_loop/3      5     32      6.40  [100.00]
    -                            32            [ 100.0]
    +FUNCTION          CALLS  WORDS  PER CALL  [     %]
    +lists:seq_loop/3      5     32      6.40  [100.00]
    +                            32            [ 100.0]
     
     ok

    Ad-hoc profiling results can be printed in a few different ways. The following -examples use the test module defined like this:

    -module(test).
    --export([test_spawn/0]).
    -test_spawn() ->
    -    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
    +examples use the test module defined like this:

    -module(test).
    +-export([test_spawn/0]).
    +test_spawn() ->
    +    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
         receive
    -        {'DOWN', MRef, process, Pid, normal} ->
    +        {'DOWN', MRef, process, Pid, normal} ->
                 done
    -    end.

    By default per-process statistics is shown:

    1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
    +    end.

    By default per-process statistics is shown:

    1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
     
     ****** Process <0.176.0>    -- 23.66 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -test:test_spawn/0           1     14        14  [63.64]
    -                                  22            [100.0]
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +erlang:spawn_monitor/1      1      2         2  [ 9.09]
    +erlang:spawn_opt/4          1      6         6  [27.27]
    +test:test_spawn/0           1     14        14  [63.64]
    +                                  22            [100.0]
     
     ****** Process <0.177.0>    -- 76.34 % of total allocations ***
    -FUNCTION           CALLS  WORDS  PER CALL  [    %]
    -erlang:apply/2         1      7         7  [ 9.86]
    -lists:seq_loop/3       9     64         7  [90.14]
    -                             71            [100.0]

    The following example prints the combined memory allocation of all +FUNCTION CALLS WORDS PER CALL [ %] +erlang:apply/2 1 7 7 [ 9.86] +lists:seq_loop/3 9 64 7 [90.14] + 71 [100.0]

    The following example prints the combined memory allocation of all processes, sorted by the total number of allocated words in descending -order:

    2> tprof:profile(test, test_spawn, [],
    -                 #{type => call_memory, report => {total, {measurement, descending}}}).
    -
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -lists:seq_loop/3            9     64         7  [68.82]
    -test:test_spawn/0           1     14        14  [15.05]
    -erlang:apply/2              1      7         7  [ 7.53]
    -erlang:spawn_opt/4          1      6         6  [ 6.45]
    -erlang:spawn_monitor/1      1      2         2  [ 2.15]
    -                                  93            [100.0]

    The profiling data can also be collected for further inspection:

    3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
    -                                       #{type => call_memory, report => return}).
    +order:

    2> tprof:profile(test, test_spawn, [],
    +                 #{type => call_memory, report => {total, {measurement, descending}}}).
    +
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +lists:seq_loop/3            9     64         7  [68.82]
    +test:test_spawn/0           1     14        14  [15.05]
    +erlang:apply/2              1      7         7  [ 7.53]
    +erlang:spawn_opt/4          1      6         6  [ 6.45]
    +erlang:spawn_monitor/1      1      2         2  [ 2.15]
    +                                  93            [100.0]

    The profiling data can also be collected for further inspection:

    3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
    +                                       #{type => call_memory, report => return}).
     <...>
    -4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
    +4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
     
     ****** Process <0.223.0>    -- 23.66 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -test:test_spawn/0           1     14        14  [63.64]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -                                  22            [100.0]
    +FUNCTION                CALLS  WORDS  PER CALL  [    %]
    +test:test_spawn/0           1     14        14  [63.64]
    +erlang:spawn_opt/4          1      6         6  [27.27]
    +erlang:spawn_monitor/1      1      2         2  [ 9.09]
    +                                  22            [100.0]
     
     ****** Process <0.224.0>    -- 76.34 % of total allocations ***
    -FUNCTION           CALLS  WORDS  PER CALL  [    %]
    -lists:seq_loop/3       9     64         7  [90.14]
    -erlang:apply/2         1      7         7  [ 9.86]
    -                             71            [100.0]

    Which processes that are profiled depends on the profiling type.

    • call_count (default) counts calls in all processes.

    • call_time and call_memory limits the profiling to the processes +FUNCTION CALLS WORDS PER CALL [ %] +lists:seq_loop/3 9 64 7 [90.14] +erlang:apply/2 1 7 7 [ 9.86] + 71 [100.0]

    Which processes that are profiled depends on the profiling type.

    • call_count (default) counts calls in all processes.

    • call_time and call_memory limits the profiling to the processes spawned from the user-provided function (using the set_on_spawn -option for trace:process/4).

    call_time and call_memory can be restricted to profile a single process:

    2> tprof:profile(test, test_spawn, [],
    -                 #{type => call_memory, set_on_spawn => false}).
    +option for trace:process/4).

    call_time and call_memory can be restricted to profile a single process:

    2> tprof:profile(test, test_spawn, [],
    +                 #{type => call_memory, set_on_spawn => false}).
     
     ****** Process <0.183.0>    -- 100.00 % of total allocations ***
    -FUNCTION                CALLS  WORDS  PER CALL  [    %]
    -erlang:spawn_monitor/1      1      2         2  [ 9.09]
    -erlang:spawn_opt/4          1      6         6  [27.27]
    -test:test_spawn/0           1     14        14  [63.64]

    Erlang programs can perform expensive operations in other processes +FUNCTION CALLS WORDS PER CALL [ %] +erlang:spawn_monitor/1 1 2 2 [ 9.09] +erlang:spawn_opt/4 1 6 6 [27.27] +test:test_spawn/0 1 14 14 [63.64]

    Erlang programs can perform expensive operations in other processes than the original one. You can include multiple, new, or even all -processes in the trace when measuring time or memory:

    7> pg:start_link().
    -{ok,<0.252.0>}
    -8> tprof:profile(fun() -> pg:join(group, self()) end,
    -                 #{type => call_memory, rootset => [pg]}).
    +processes in the trace when measuring time or memory:

    7> pg:start_link().
    +{ok,<0.252.0>}
    +8> tprof:profile(fun() -> pg:join(group, self()) end,
    +                 #{type => call_memory, rootset => [pg]}).
     ****** Process <0.252.0>    -- 52.86 % of total allocations ***
    -FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    -pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    -gen:reply/2                       1      3         3  [ 2.70]
    -erlang:monitor/2                  1      3         3  [ 2.70]
    -gen_server:try_handle_call/4      1      3         3  [ 2.70]
    -gen_server:try_dispatch/4         1      3         3  [ 2.70]
    -maps:iterator/1                   2      4         2  [ 3.60]
    -maps:take/2                       1      6         6  [ 5.41]
    -pg:join_local_update_ets/5        1      8         8  [ 7.21]
    -pg:handle_info/2                  1      8         8  [ 7.21]
    -pg:handle_call/3                  1      9         9  [ 8.11]
    -gen_server:loop/7                 2      9         4  [ 8.11]
    -ets:lookup/2                      2     10         5  [ 9.01]
    -pg:join_local/3                   1     11        11  [ 9.91]
    -pg:notify_group/5                 2     16         8  [14.41]
    -erlang:setelement/3               2     16         8  [14.41]
    -                                       111            [100.0]
    +FUNCTION                      CALLS  WORDS  PER CALL  [    %]
    +pg:leave_local_update_ets/5       1      2         2  [ 1.80]
    +gen:reply/2                       1      3         3  [ 2.70]
    +erlang:monitor/2                  1      3         3  [ 2.70]
    +gen_server:try_handle_call/4      1      3         3  [ 2.70]
    +gen_server:try_dispatch/4         1      3         3  [ 2.70]
    +maps:iterator/1                   2      4         2  [ 3.60]
    +maps:take/2                       1      6         6  [ 5.41]
    +pg:join_local_update_ets/5        1      8         8  [ 7.21]
    +pg:handle_info/2                  1      8         8  [ 7.21]
    +pg:handle_call/3                  1      9         9  [ 8.11]
    +gen_server:loop/7                 2      9         4  [ 8.11]
    +ets:lookup/2                      2     10         5  [ 9.01]
    +pg:join_local/3                   1     11        11  [ 9.91]
    +pg:notify_group/5                 2     16         8  [14.41]
    +erlang:setelement/3               2     16         8  [14.41]
    +                                       111            [100.0]
     
     ****** Process <0.255.0>    -- 47.14 % of total allocations ***
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -erl_eval:match_list/6          1      3         3  [ 3.03]
    -erlang:monitor/2               1      3         3  [ 3.03]
    -lists:reverse/1                2      4         2  [ 4.04]
    -pg:join/3                      1      4         4  [ 4.04]
    -erl_eval:add_bindings/2        1      5         5  [ 5.05]
    -erl_eval:do_apply/7            2      6         3  [ 6.06]
    -gen:call/4                     1      8         8  [ 8.08]
    -erl_eval:expr_list/7           4     10         2  [10.10]
    -gen:do_call/4                  1     16        16  [16.16]
    -erl_eval:ret_expr/3            4     16         4  [16.16]
    -erl_eval:merge_bindings/4      3     24         8  [24.24]
    -                                     99            [100.0]

    By default, there is no limit for the profiling time. For ac-hoc +FUNCTION CALLS WORDS PER CALL [ %] +erl_eval:match_list/6 1 3 3 [ 3.03] +erlang:monitor/2 1 3 3 [ 3.03] +lists:reverse/1 2 4 2 [ 4.04] +pg:join/3 1 4 4 [ 4.04] +erl_eval:add_bindings/2 1 5 5 [ 5.05] +erl_eval:do_apply/7 2 6 3 [ 6.06] +gen:call/4 1 8 8 [ 8.08] +erl_eval:expr_list/7 4 10 2 [10.10] +gen:do_call/4 1 16 16 [16.16] +erl_eval:ret_expr/3 4 16 4 [16.16] +erl_eval:merge_bindings/4 3 24 8 [24.24] + 99 [100.0]

    By default, there is no limit for the profiling time. For ac-hoc profiling, is is possible to configure a time limit. If the profiled function does not return before that time expires, the process is terminated with reason kill. Any unlinked children processes started by the user-supplied function are kept; it is the responsibility of -the developer to take care of such processes.

    9> tprof:profile(timer, sleep, [100000], #{timeout => 1000}).

    By default, only one ad-hoc or server-aided profiling session is +the developer to take care of such processes.

    9> tprof:profile(timer, sleep, [100000], #{timeout => 1000}).

    By default, only one ad-hoc or server-aided profiling session is allowed at any point in time. It is possible to force multiple ad-hoc sessions concurrently, but it is the responsibility of the developer -to ensure that trace patterns do not overlap:

    1> tprof:profile(fun() -> lists:seq(1, 32) end,
    -    #{registered => false, pattern => [{lists, '_', '_'}]}).

    +to ensure that trace patterns do not overlap:

    1> tprof:profile(fun() -> lists:seq(1, 32) end,
    +    #{registered => false, pattern => [{lists, '_', '_'}]}).

    @@ -301,50 +301,50 @@

    patterns and processes to trace while the system handles actual traffic. Data can extracted, inspected, and printed at any time. The following example traces activity of all processes supervised by -the Kernel supervisor:

    1> tprof:start(#{type => call_memory}).
    -{ok,<0.200.0>}
    -2> tprof:enable_trace({all_children, kernel_sup}).
    +the Kernel supervisor:

    1> tprof:start(#{type => call_memory}).
    +{ok,<0.200.0>}
    +2> tprof:enable_trace({all_children, kernel_sup}).
     34
    -3> tprof:set_pattern('_', '_' , '_').
    +3> tprof:set_pattern('_', '_' , '_').
     16728
    -4> Sample = tprof:collect().
    -{call_memory,
    -    [{gen_server,try_dispatch,4,[{<0.154.0>,2,6}]},
    -     {erlang,iolist_to_iovec,1,[{<0.161.0>,1,8}]},
    +4> Sample = tprof:collect().
    +{call_memory,
    +    [{gen_server,try_dispatch,4,[{<0.154.0>,2,6}]},
    +     {erlang,iolist_to_iovec,1,[{<0.161.0>,1,8}]},
     <...>
    -5 > tprof:format(tprof:inspect(Sample)).
    +5 > tprof:format(tprof:inspect(Sample)).
     
     ****** Process <0.154.0>    -- 14.21 % of total allocations ***
    -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    -maps:iterator/1                2      4         2  [15.38]
    -gen_server:try_dispatch/4      2      6         3  [23.08]
    -net_kernel:handle_info/2       2     16         8  [61.54]
    -                                     26            [100.0]
    +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
    +maps:iterator/1                2      4         2  [15.38]
    +gen_server:try_dispatch/4      2      6         3  [23.08]
    +net_kernel:handle_info/2       2     16         8  [61.54]
    +                                     26            [100.0]
     
     ****** Process <0.161.0>    -- 85.79 % of total allocations ***
    -FUNCTION                        CALLS  WORDS  PER CALL  [    %]
    -disk_log:handle/2                   2      2         1  [ 1.27]
    -disk_log_1:maybe_start_timer/1      1      3         3  [ 1.91]
    -disk_log_1:mf_write_cache/1         1      3         3  [ 1.91]
    +FUNCTION                        CALLS  WORDS  PER CALL  [    %]
    +disk_log:handle/2                   2      2         1  [ 1.27]
    +disk_log_1:maybe_start_timer/1      1      3         3  [ 1.91]
    +disk_log_1:mf_write_cache/1         1      3         3  [ 1.91]
     <...>

    It is possible to profile the entire running system, and then examine individual -processes:

    1> tprof:start(#{type => call_memory}).
    -2> tprof:enable_trace(all), tprof:set_pattern('_', '_' , '_').
    +processes:

    1> tprof:start(#{type => call_memory}).
    +2> tprof:enable_trace(all), tprof:set_pattern('_', '_' , '_').
     9041
    -3> timer:sleep(10000), tprof:disable_trace(all), Sample = tprof:collect().
    -{call_memory,
    -    [{user_drv,server,3,[{<0.64.0>,12,136}]},
    -     {user_drv,contains_ctrl_g_or_ctrl_c,1,[{<0.64.0>,80,10}]},
    +3> timer:sleep(10000), tprof:disable_trace(all), Sample = tprof:collect().
    +{call_memory,
    +    [{user_drv,server,3,[{<0.64.0>,12,136}]},
    +     {user_drv,contains_ctrl_g_or_ctrl_c,1,[{<0.64.0>,80,10}]},
     <...>
    -4> Inspected = tprof:inspect(Sample, process, measurement), Shell = maps:get(self(), Inspected).
    -{call_memory, 2743,
    -    [{shell,{enc,0},1,2,2,0.07291286912139992},
    +4> Inspected = tprof:inspect(Sample, process, measurement), Shell = maps:get(self(), Inspected).
    +{call_memory, 2743,
    +    [{shell,{enc,0},1,2,2,0.07291286912139992},
     <...>
    -5> tprof:format(Shell).
    +5> tprof:format(Shell).
     
    -FUNCTION                           CALLS  WORDS  PER CALL  [    %]
    +FUNCTION                           CALLS  WORDS  PER CALL  [    %]
     <...>
    -erl_lint:start/2                       2    300       150  [10.94]
    -shell:used_records/1                 114    342         3  [12.47]
    +
    erl_lint:start/2 2 300 150 [10.94] +shell:used_records/1 114 342 3 [12.47]
    @@ -1370,12 +1370,12 @@

    clear_pattern(Mod, Fun, Arity)

    -

    Disables tracing functions matching the supplied pattern.

    1> tprof:set_pattern(lists, seq, '_').
    +

    Disables tracing functions matching the supplied pattern.

    1> tprof:set_pattern(lists, seq, '_').
     2
    -2> tprof:clear_pattern(lists, seq, 3).
    +2> tprof:clear_pattern(lists, seq, 3).
     1
    -3> tprof:get_trace_map().
    -#{lists => [{seq,2}]}

    Requires that the default tprof server has been started.

    +3>
    tprof:get_trace_map(). +#{lists => [{seq,2}]}

    Requires that the default tprof server has been started.

    @@ -2217,13 +2217,13 @@

    set_pattern(Mod, Fun, Arity)

    Enables tracing for all functions matching the supplied pattern.

    Patterns are additive, following the same rules as trace:function/4. -Returns the number of functions matching the supplied pattern.

    1> tprof:set_pattern(lists, seq, '_').
    +Returns the number of functions matching the supplied pattern.

    1> tprof:set_pattern(lists, seq, '_').
     2
    -2> tprof:set_pattern(lists, keyfind, 3).
    +2> tprof:set_pattern(lists, keyfind, 3).
     1
    -3> tprof:get_trace_map().
    -#{lists => [{keyfind,3},{seq,2},{seq,3}]}

    If no functions match the pattern, an error tuple is returned:

    > tprof:set_pattern(no_module, func, '_').
    -{error,{trace_pattern,no_module,func,'_'}}

    Requires that the default tprof server has been started.

    +3>
    tprof:get_trace_map(). +#{lists => [{keyfind,3},{seq,2},{seq,3}]}

    If no functions match the pattern, an error tuple is returned:

    > tprof:set_pattern(no_module, func, '_').
    +{error,{trace_pattern,no_module,func,'_'}}

    Requires that the default tprof server has been started.

    diff --git a/prs/8803/lib/tools-4.0/doc/html/xref_chapter.html b/prs/8803/lib/tools-4.0/doc/html/xref_chapter.html index 235a909dd6a9f..98ef63b52d08d 100644 --- a/prs/8803/lib/tools-4.0/doc/html/xref_chapter.html +++ b/prs/8803/lib/tools-4.0/doc/html/xref_chapter.html @@ -140,25 +140,25 @@

    Module Check

    -

    Assume we want to check the following module:

    -module(my_module).
    +

    Assume we want to check the following module:

    -module(my_module).
     
    --export([t/1]).
    +-export([t/1]).
     
    -t(A) ->
    -  my_module:t2(A).
    +t(A) ->
    +  my_module:t2(A).
     
    -t2(_) ->
    +t2(_) ->
       true.

    Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

    1> c(my_module, debug_info).
    +an edited module is to compile it:

    1> c(my_module, debug_info).
     ./my_module.erl:10: Warning: function t2/1 is unused
    -{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

    The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

    The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

    2> xref:m(my_module)
    -[{deprecated,[]},
    - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    - {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

    2> xref:m(my_module)
    +[{deprecated,[]},
    + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
    + {unused,[{my_module,t2,1}]}]

    m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -173,28 +173,28 @@

    this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

    Each Xref server is referred to by a unique name. The name is given when -creating the server:

    1> xref:start(s).
    -{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

    1> xref:start(s).
    +{ok,<0.27.0>}

    Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
    +can be avoided by setting default values of some options:

    2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
     ok
    -3> xref:add_release(s, code:lib_dir(), {name, otp}).
    -{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

    add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    -{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

    It is now easy to check the release for calls to undefined functions:

    4> xref:analyze(s, undefined_function_calls).
    +{ok, [...]}

    We can now continue with further analyses, or we can delete the Xref server:

    5> xref:stop(s).

    The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

    Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    -{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

    4> xref:q(s, "(XC - UC) || (XU - X - B)").
    +{ok,[...]}

    The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -224,8 +224,8 @@

    provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

    xref:start(s).
    -xref:add_release(s, code:root_dir()).
    • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

    • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

      xref:start(s).
      +xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

      • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

      • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

      • xref:q(s, "# E | X "). - Number of calls from exported functions.

      • xref:q(s, "XC || L "). - All external calls to local functions.

      • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -268,18 +268,18 @@

        a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

        t(S) ->
        -  {ok, _} = xref:q(S, "Eplus := closure E"),
        -  {ok, Ms} = xref:q(S, "AM"),
        -  Fun = fun(M, N) ->
        -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
        -      {ok, N0} = xref:q(S, lists:flatten(Q)),
        +modulesmode of Xref servers.

        t(S) ->
        +  {ok, _} = xref:q(S, "Eplus := closure E"),
        +  {ok, Ms} = xref:q(S, "AM"),
        +  Fun = fun(M, N) ->
        +      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)"),
        -  100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

        Comments on the code:

        • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed diff --git a/prs/8803/lib/wx-2.4.2/doc/html/.build b/prs/8803/lib/wx-2.4.2/doc/html/.build index 10926f64fa527..7b8b4c992d7b8 100644 --- a/prs/8803/lib/wx-2.4.2/doc/html/.build +++ b/prs/8803/lib/wx-2.4.2/doc/html/.build @@ -19,7 +19,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-7004C420.js +dist/search_data-DBD265E3.js dist/sidebar_items-F4763ED4.js gl.html glu.html diff --git a/prs/8803/lib/wx-2.4.2/doc/html/chapter.html b/prs/8803/lib/wx-2.4.2/doc/html/chapter.html index 73744cf54bb06..1b9741ffbce89 100644 --- a/prs/8803/lib/wx-2.4.2/doc/html/chapter.html +++ b/prs/8803/lib/wx-2.4.2/doc/html/chapter.html @@ -161,13 +161,13 @@

          is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

          For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          -  MyWin.CenterOnParent(wxVERTICAL);
          +wxWindow:centerOnParent. The following C++ code:

            wxWindow MyWin = new wxWindow();
          +  MyWin.CenterOnParent(wxVERTICAL);
             ...
          -  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
          +  delete MyWin;

          would in erlang look like:

            MyWin = wxWindow:new(),
          +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
             ...
          -  wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

          When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

          • wxPoint is represented by {Xcoord,Ycoord}

          • wxSize is represented by {Width,Height}

          • wxRect is represented by {Xcoord,Ycoord,Width,Height}

          • wxColour is represented by {Red,Green,Blue[,Alpha]}

          • wxString is represented by unicode:charlist()

          • wxGBPosition is represented by {Row,Column}

          • wxGBSpan is represented by {RowSpan,ColumnSPan}

          • wxGridCellCoords is represented by {Row,Column}

          In the places where the erlang API differs from the original one it should be @@ -195,14 +195,14 @@

          from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

            wx:new(),
          -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          -  Env = wx:get_env(),
          -  spawn(fun() ->
          -           wx:set_env(Env),
          +called wx:new() will not be able use each others objects.

            wx:new(),
          +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
          +  Env = wx:get_env(),
          +  spawn(fun() ->
          +           wx:set_env(Env),
                      %% Here you can do wx calls from your helper process.
                      ...
          -        end),
          +        end),
             ...

          When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

          The wx application never cleans or garbage collects memory as long as the user diff --git a/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-7004C420.js b/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-7004C420.js deleted file mode 100644 index 0d1ae411375fa..0000000000000 --- a/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-7004C420.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","doc":"Erlang wrapper functions for OpenGL\n\nStandard OpenGL API\n\nThis documents the functions as a brief version of the complete\n[OpenGL reference pages.](https://www.khronos.org/registry/OpenGL-Refpages/)","title":"gl","ref":"gl.html"},{"type":"function","doc":"The accumulation buffer is an extended-range color buffer. Images are not\nrendered into it. Rather, images rendered into one of the color buffers are\nadded to the contents of the accumulation buffer after rendering. Effects such\nas antialiasing (of points, lines, and polygons), motion blur, and depth of\nfield can be created by accumulating images generated with different\ntransformation matrices.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAccum.xml)","title":"gl.accum/2","ref":"gl.html#accum/2"},{"type":"function","doc":"[`gl:activeShaderProgram/2`](`activeShaderProgram/2`) sets the linked program\nnamed by `Program` to be the active program for the program pipeline object\n`Pipeline`. The active program in the active program pipeline object is the\ntarget of calls to [`gl:uniform()`](`uniform1f/2`) when no program has been made\ncurrent through a call to [`gl:useProgram/1`](`useProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glActiveShaderProgram.xhtml)","title":"gl.activeShaderProgram/2","ref":"gl.html#activeShaderProgram/2"},{"type":"function","doc":"[`gl:activeTexture/1`](`activeTexture/1`) selects which texture unit subsequent\ntexture state calls will affect. The number of texture units an implementation\nsupports is implementation dependent, but must be at least 80.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glActiveTexture.xhtml)","title":"gl.activeTexture/1","ref":"gl.html#activeTexture/1"},{"type":"function","doc":"The alpha test discards fragments depending on the outcome of a comparison\nbetween an incoming fragment's alpha value and a constant reference value.\n[`gl:alphaFunc/2`](`alphaFunc/2`) specifies the reference value and the\ncomparison function. The comparison is performed only if alpha testing is\nenabled. By default, it is not enabled. (See [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) of `?GL_ALPHA_TEST`.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAlphaFunc.xml)","title":"gl.alphaFunc/2","ref":"gl.html#alphaFunc/2"},{"type":"function","doc":"GL establishes a \\`\\`working set'' of textures that are resident in texture\nmemory. These textures can be bound to a texture target much more efficiently\nthan textures that are not resident.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAreTexturesResident.xml)","title":"gl.areTexturesResident/1","ref":"gl.html#areTexturesResident/1"},{"type":"function","doc":"[`gl:arrayElement/1`](`arrayElement/1`) commands are used within\n[`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pairs to specify\nvertex and attribute data for point, line, and polygon primitives. If\n`?GL_VERTEX_ARRAY` is enabled when [`gl:arrayElement/1`](`arrayElement/1`) is\ncalled, a single vertex is drawn, using vertex and attribute data taken from\nlocation `I` of the enabled arrays. If `?GL_VERTEX_ARRAY` is not enabled, no\ndrawing occurs but the attributes corresponding to the enabled arrays are\nmodified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glArrayElement.xml)","title":"gl.arrayElement/1","ref":"gl.html#arrayElement/1"},{"type":"function","doc":"In order to create a complete shader program, there must be a way to specify the\nlist of things that will be linked together. Program objects provide this\nmechanism. Shaders that are to be linked together in a program object must first\nbe attached to that program object. [`gl:attachShader/2`](`attachShader/2`)\nattaches the shader object specified by `Shader` to the program object specified\nby `Program`. This indicates that `Shader` will be included in link operations\nthat will be performed on `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glAttachShader.xhtml)","title":"gl.attachShader/2","ref":"gl.html#attachShader/2"},{"type":"function","doc":"","title":"gl.begin/1","ref":"gl.html#begin/1"},{"type":"function","doc":"","title":"gl.beginConditionalRender/2","ref":"gl.html#beginConditionalRender/2"},{"type":"function","doc":"","title":"gl.beginQuery/2","ref":"gl.html#beginQuery/2"},{"type":"function","doc":"","title":"gl.beginQueryIndexed/3","ref":"gl.html#beginQueryIndexed/3"},{"type":"function","doc":"","title":"gl.beginTransformFeedback/1","ref":"gl.html#beginTransformFeedback/1"},{"type":"function","doc":"[`gl:bindAttribLocation/3`](`bindAttribLocation/3`) is used to associate a\nuser-defined attribute variable in the program object specified by `Program`\nwith a generic vertex attribute index. The name of the user-defined attribute\nvariable is passed as a null terminated string in `Name`. The generic vertex\nattribute index to be bound to this variable is specified by `Index`. When\n`Program` is made part of current state, values provided via the generic vertex\nattribute `Index` will modify the value of the user-defined attribute variable\nspecified by `Name`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindAttribLocation.xhtml)","title":"gl.bindAttribLocation/3","ref":"gl.html#bindAttribLocation/3"},{"type":"function","doc":"[`gl:bindBuffer/2`](`bindBuffer/2`) binds a buffer object to the specified\nbuffer binding point. Calling [`gl:bindBuffer/2`](`bindBuffer/2`) with `Target`\nset to one of the accepted symbolic constants and `Buffer` set to the name of a\nbuffer object binds that buffer object name to the target. If no buffer object\nwith name `Buffer` exists, one is created with that name. When a buffer object\nis bound to a target, the previous binding for that target is automatically\nbroken.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffer.xhtml)","title":"gl.bindBuffer/2","ref":"gl.html#bindBuffer/2"},{"type":"function","doc":"[`gl:bindBufferBase/3`](`bindBufferBase/3`) binds the buffer object `Buffer` to\nthe binding point at index `Index` of the array of targets specified by\n`Target`. Each `Target` represents an indexed array of buffer binding points, as\nwell as a single general binding point that can be used by other buffer\nmanipulation functions such as [`gl:bindBuffer/2`](`bindBuffer/2`) or\n`glMapBuffer`. In addition to binding `Buffer` to the indexed buffer binding\ntarget, [`gl:bindBufferBase/3`](`bindBufferBase/3`) also binds `Buffer` to the\ngeneric buffer binding point specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBufferBase.xhtml)","title":"gl.bindBufferBase/3","ref":"gl.html#bindBufferBase/3"},{"type":"function","doc":"[`gl:bindBufferRange/5`](`bindBufferRange/5`) binds a range the buffer object\n`Buffer` represented by `Offset` and `Size` to the binding point at index\n`Index` of the array of targets specified by `Target`. Each `Target` represents\nan indexed array of buffer binding points, as well as a single general binding\npoint that can be used by other buffer manipulation functions such as\n[`gl:bindBuffer/2`](`bindBuffer/2`) or `glMapBuffer`. In addition to binding a\nrange of `Buffer` to the indexed buffer binding target,\n[`gl:bindBufferRange/5`](`bindBufferRange/5`) also binds the range to the\ngeneric buffer binding point specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBufferRange.xhtml)","title":"gl.bindBufferRange/5","ref":"gl.html#bindBufferRange/5"},{"type":"function","doc":"[`gl:bindBuffersBase/3`](`bindBuffersBase/3`) binds a set of `Count` buffer\nobjects whose names are given in the array `Buffers` to the `Count` consecutive\nbinding points starting from index `First` of the array of targets specified by\n`Target`. If `Buffers` is `?NULL` then\n[`gl:bindBuffersBase/3`](`bindBuffersBase/3`) unbinds any buffers that are\ncurrently bound to the referenced binding points. Assuming no errors are\ngenerated, it is equivalent to the following pseudo-code, which calls\n[`gl:bindBufferBase/3`](`bindBufferBase/3`), with the exception that the\nnon-indexed `Target` is not changed by\n[`gl:bindBuffersBase/3`](`bindBuffersBase/3`):\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffersBase.xhtml)","title":"gl.bindBuffersBase/3","ref":"gl.html#bindBuffersBase/3"},{"type":"function","doc":"[`gl:bindBuffersRange/5`](`bindBuffersRange/5`) binds a set of `Count` ranges\nfrom buffer objects whose names are given in the array `Buffers` to the `Count`\nconsecutive binding points starting from index `First` of the array of targets\nspecified by `Target`. `Offsets` specifies the address of an array containing\n`Count` starting offsets within the buffers, and `Sizes` specifies the address\nof an array of `Count` sizes of the ranges. If `Buffers` is `?NULL` then\n`Offsets` and `Sizes` are ignored and\n[`gl:bindBuffersRange/5`](`bindBuffersRange/5`) unbinds any buffers that are\ncurrently bound to the referenced binding points. Assuming no errors are\ngenerated, it is equivalent to the following pseudo-code, which calls\n[`gl:bindBufferRange/5`](`bindBufferRange/5`), with the exception that the\nnon-indexed `Target` is not changed by\n[`gl:bindBuffersRange/5`](`bindBuffersRange/5`):\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffersRange.xhtml)","title":"gl.bindBuffersRange/5","ref":"gl.html#bindBuffersRange/5"},{"type":"function","doc":"[`gl:bindFragDataLocation/3`](`bindFragDataLocation/3`) explicitly specifies the\nbinding of the user-defined varying out variable `Name` to fragment shader color\nnumber `ColorNumber` for program `Program`. If `Name` was bound previously, its\nassigned binding is replaced with `ColorNumber`. `Name` must be a\nnull-terminated string. `ColorNumber` must be less than `?GL_MAX_DRAW_BUFFERS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFragDataLocation.xhtml)","title":"gl.bindFragDataLocation/3","ref":"gl.html#bindFragDataLocation/3"},{"type":"function","doc":"[`gl:bindFragDataLocationIndexed/4`](`bindFragDataLocationIndexed/4`) specifies\nthat the varying out variable `Name` in `Program` should be bound to fragment\ncolor `ColorNumber` when the program is next linked. `Index` may be zero or one\nto specify that the color be used as either the first or second color input to\nthe blend equation, respectively.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFragDataLocationIndexed.xhtml)","title":"gl.bindFragDataLocationIndexed/4","ref":"gl.html#bindFragDataLocationIndexed/4"},{"type":"function","doc":"[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) binds the framebuffer object with\nname `Framebuffer` to the framebuffer target specified by `Target`. `Target`\nmust be either `?GL_DRAW_FRAMEBUFFER`, `?GL_READ_FRAMEBUFFER` or\n`?GL_FRAMEBUFFER`. If a framebuffer object is bound to `?GL_DRAW_FRAMEBUFFER` or\n`?GL_READ_FRAMEBUFFER`, it becomes the target for rendering or readback\noperations, respectively, until it is deleted or another framebuffer is bound to\nthe corresponding bind point. Calling\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) with `Target` set to\n`?GL_FRAMEBUFFER` binds `Framebuffer` to both the read and draw framebuffer\ntargets. `Framebuffer` is the name of a framebuffer object previously returned\nfrom a call to [`gl:genFramebuffers/1`](`genFramebuffers/1`), or zero to break\nthe existing binding of a framebuffer object to `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFramebuffer.xhtml)","title":"gl.bindFramebuffer/2","ref":"gl.html#bindFramebuffer/2"},{"type":"function","doc":"[`gl:bindImageTexture/7`](`bindImageTexture/7`) binds a single level of a\ntexture to an image unit for the purpose of reading and writing it from shaders.\n`Unit` specifies the zero-based index of the image unit to which to bind the\ntexture level. `Texture` specifies the name of an existing texture object to\nbind to the image unit. If `Texture` is zero, then any existing binding to the\nimage unit is broken. `Level` specifies the level of the texture to bind to the\nimage unit.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTexture.xhtml)","title":"gl.bindImageTexture/7","ref":"gl.html#bindImageTexture/7"},{"type":"function","doc":"[`gl:bindImageTextures/2`](`bindImageTextures/2`) binds images from an array of\nexisting texture objects to a specified number of consecutive image units.\n`Count` specifies the number of texture objects whose names are stored in the\narray `Textures`. That number of texture names are read from the array and bound\nto the `Count` consecutive texture units starting from `First`. If the name zero\nappears in the `Textures` array, any existing binding to the image unit is\nreset. Any non-zero entry in `Textures` must be the name of an existing texture\nobject. When a non-zero entry in `Textures` is present, the image at level zero\nis bound, the binding is considered layered, with the first layer set to zero,\nand the image is bound for read-write access. The image unit format parameter is\ntaken from the internal format of the image at level zero of the texture object.\nFor cube map textures, the internal format of the positive X image of level zero\nis used. If `Textures` is `?NULL` then it is as if an appropriately sized array\ncontaining only zeros had been specified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTextures.xhtml)","title":"gl.bindImageTextures/2","ref":"gl.html#bindImageTextures/2"},{"type":"function","doc":"[`gl:bindProgramPipeline/1`](`bindProgramPipeline/1`) binds a program pipeline\nobject to the current context. `Pipeline` must be a name previously returned\nfrom a call to [`gl:genProgramPipelines/1`](`genProgramPipelines/1`). If no\nprogram pipeline exists with name `Pipeline` then a new pipeline object is\ncreated with that name and initialized to the default state vector.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindProgramPipeline.xhtml)","title":"gl.bindProgramPipeline/1","ref":"gl.html#bindProgramPipeline/1"},{"type":"function","doc":"[`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) binds the renderbuffer object\nwith name `Renderbuffer` to the renderbuffer target specified by `Target`.\n`Target` must be `?GL_RENDERBUFFER`. `Renderbuffer` is the name of a\nrenderbuffer object previously returned from a call to\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`), or zero to break the existing\nbinding of a renderbuffer object to `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindRenderbuffer.xhtml)","title":"gl.bindRenderbuffer/2","ref":"gl.html#bindRenderbuffer/2"},{"type":"function","doc":"[`gl:bindSampler/2`](`bindSampler/2`) binds `Sampler` to the texture unit at\nindex `Unit`. `Sampler` must be zero or the name of a sampler object previously\nreturned from a call to [`gl:genSamplers/1`](`genSamplers/1`). `Unit` must be\nless than the value of `?GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindSampler.xhtml)","title":"gl.bindSampler/2","ref":"gl.html#bindSampler/2"},{"type":"function","doc":"[`gl:bindSamplers/2`](`bindSamplers/2`) binds samplers from an array of existing\nsampler objects to a specified number of consecutive sampler units. `Count`\nspecifies the number of sampler objects whose names are stored in the array\n`Samplers`. That number of sampler names is read from the array and bound to the\n`Count` consecutive sampler units starting from `First`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindSamplers.xhtml)","title":"gl.bindSamplers/2","ref":"gl.html#bindSamplers/2"},{"type":"function","doc":"[`gl:bindTexture/2`](`bindTexture/2`) lets you create or use a named texture.\nCalling [`gl:bindTexture/2`](`bindTexture/2`) with `Target` set to\n`?GL_TEXTURE_1D`, `?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, `?GL_TEXTURE_BUFFER`, `?GL_TEXTURE_2D_MULTISAMPLE`\nor `?GL_TEXTURE_2D_MULTISAMPLE_ARRAY` and `Texture` set to the name of the new\ntexture binds the texture name to the target. When a texture is bound to a\ntarget, the previous binding for that target is automatically broken.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTexture.xhtml)","title":"gl.bindTexture/2","ref":"gl.html#bindTexture/2"},{"type":"function","doc":"[`gl:bindTextures/2`](`bindTextures/2`) binds an array of existing texture\nobjects to a specified number of consecutive texture units. `Count` specifies\nthe number of texture objects whose names are stored in the array `Textures`.\nThat number of texture names are read from the array and bound to the `Count`\nconsecutive texture units starting from `First`. The target, or type of texture\nis deduced from the texture object and each texture is bound to the\ncorresponding target of the texture unit. If the name zero appears in the\n`Textures` array, any existing binding to any target of the texture unit is\nreset and the default texture for that target is bound in its place. Any\nnon-zero entry in `Textures` must be the name of an existing texture object. If\n`Textures` is `?NULL` then it is as if an appropriately sized array containing\nonly zeros had been specified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTextures.xhtml)","title":"gl.bindTextures/2","ref":"gl.html#bindTextures/2"},{"type":"function","doc":"[`gl:bindTextureUnit/2`](`bindTextureUnit/2`) binds an existing texture object\nto the texture unit numbered `Unit`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTextureUnit.xhtml)","title":"gl.bindTextureUnit/2","ref":"gl.html#bindTextureUnit/2"},{"type":"function","doc":"[`gl:bindTransformFeedback/2`](`bindTransformFeedback/2`) binds the transform\nfeedback object with name `Id` to the current GL state. `Id` must be a name\npreviously returned from a call to\n[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`). If `Id` has not\npreviously been bound, a new transform feedback object with name `Id` and\ninitialized with the default transform state vector is created.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTransformFeedback.xhtml)","title":"gl.bindTransformFeedback/2","ref":"gl.html#bindTransformFeedback/2"},{"type":"function","doc":"[`gl:bindVertexArray/1`](`bindVertexArray/1`) binds the vertex array object with\nname `Array`. `Array` is the name of a vertex array object previously returned\nfrom a call to [`gl:genVertexArrays/1`](`genVertexArrays/1`), or zero to break\nthe existing vertex array object binding.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexArray.xhtml)","title":"gl.bindVertexArray/1","ref":"gl.html#bindVertexArray/1"},{"type":"function","doc":"","title":"gl.bindVertexBuffer/4","ref":"gl.html#bindVertexBuffer/4"},{"type":"function","doc":"","title":"gl.bindVertexBuffers/4","ref":"gl.html#bindVertexBuffers/4"},{"type":"function","doc":"A bitmap is a binary image. When drawn, the bitmap is positioned relative to the\ncurrent raster position, and frame buffer pixels corresponding to 1's in the\nbitmap are written using the current raster color or index. Frame buffer pixels\ncorresponding to 0's in the bitmap are not modified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBitmap.xml)","title":"gl.bitmap/7","ref":"gl.html#bitmap/7"},{"type":"function","doc":"The `?GL_BLEND_COLOR` may be used to calculate the source and destination\nblending factors. The color components are clamped to the range \\[0 1] before\nbeing stored. See [`gl:blendFunc/2`](`blendFunc/2`) for a complete description\nof the blending operations. Initially the `?GL_BLEND_COLOR` is set to (0, 0, 0,\n0).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendColor.xhtml)","title":"gl.blendColor/4","ref":"gl.html#blendColor/4"},{"type":"function","doc":"","title":"gl.blendEquation/1","ref":"gl.html#blendEquation/1"},{"type":"function","doc":"The blend equations determine how a new pixel (the ''source'' color) is combined\nwith a pixel already in the framebuffer (the ''destination'' color). This\nfunction sets both the RGB blend equation and the alpha blend equation to a\nsingle equation. [`gl:blendEquationi/2`](`blendEquation/1`) specifies the blend\nequation for a single draw buffer whereas\n[`gl:blendEquation/1`](`blendEquation/1`) sets the blend equation for all draw\nbuffers.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendEquation.xhtml)","title":"gl.blendEquationi/2","ref":"gl.html#blendEquationi/2"},{"type":"function","doc":"","title":"gl.blendEquationSeparate/2","ref":"gl.html#blendEquationSeparate/2"},{"type":"function","doc":"The blend equations determines how a new pixel (the ''source'' color) is\ncombined with a pixel already in the framebuffer (the ''destination'' color).\nThese functions specify one blend equation for the RGB-color components and one\nblend equation for the alpha component.\n[`gl:blendEquationSeparatei/3`](`blendEquationSeparate/2`) specifies the blend\nequations for a single draw buffer whereas\n[`gl:blendEquationSeparate/2`](`blendEquationSeparate/2`) sets the blend\nequations for all draw buffers.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendEquationSeparate.xhtml)","title":"gl.blendEquationSeparatei/3","ref":"gl.html#blendEquationSeparatei/3"},{"type":"function","doc":"","title":"gl.blendFunc/2","ref":"gl.html#blendFunc/2"},{"type":"function","doc":"Pixels can be drawn using a function that blends the incoming (source) RGBA\nvalues with the RGBA values that are already in the frame buffer (the\ndestination values). Blending is initially disabled. Use\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) with argument\n`?GL_BLEND` to enable and disable blending.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendFunc.xhtml)","title":"gl.blendFunci/3","ref":"gl.html#blendFunci/3"},{"type":"function","doc":"","title":"gl.blendFuncSeparate/4","ref":"gl.html#blendFuncSeparate/4"},{"type":"function","doc":"Pixels can be drawn using a function that blends the incoming (source) RGBA\nvalues with the RGBA values that are already in the frame buffer (the\ndestination values). Blending is initially disabled. Use\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) with argument\n`?GL_BLEND` to enable and disable blending.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendFuncSeparate.xhtml)","title":"gl.blendFuncSeparatei/5","ref":"gl.html#blendFuncSeparatei/5"},{"type":"function","doc":"[`gl:blitFramebuffer/10`](`blitFramebuffer/10`) and `glBlitNamedFramebuffer`\ntransfer a rectangle of pixel values from one region of a read framebuffer to\nanother region of a draw framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlitFramebuffer.xhtml)","title":"gl.blitFramebuffer/10","ref":"gl.html#blitFramebuffer/10"},{"type":"function","doc":"[`gl:bufferData/4`](`bufferData/4`) and `glNamedBufferData` create a new data\nstore for a buffer object. In case of [`gl:bufferData/4`](`bufferData/4`), the\nbuffer object currently bound to `Target` is used. For `glNamedBufferData`, a\nbuffer object associated with ID specified by the caller in `Buffer` will be\nused instead.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferData.xhtml)","title":"gl.bufferData/4","ref":"gl.html#bufferData/4"},{"type":"function","doc":"[`gl:bufferStorage/4`](`bufferStorage/4`) and `glNamedBufferStorage` create a\nnew immutable data store. For [`gl:bufferStorage/4`](`bufferStorage/4`), the\nbuffer object currently bound to `Target` will be initialized. For\n`glNamedBufferStorage`, `Buffer` is the name of the buffer object that will be\nconfigured. The size of the data store is specified by `Size`. If an initial\ndata is available, its address may be supplied in `Data`. Otherwise, to create\nan uninitialized data store, `Data` should be `?NULL`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferStorage.xhtml)","title":"gl.bufferStorage/4","ref":"gl.html#bufferStorage/4"},{"type":"function","doc":"[`gl:bufferSubData/4`](`bufferSubData/4`) and `glNamedBufferSubData` redefine\nsome or all of the data store for the specified buffer object. Data starting at\nbyte offset `Offset` and extending for `Size` bytes is copied to the data store\nfrom the memory pointed to by `Data`. `Offset` and `Size` must define a range\nlying entirely within the buffer object's data store.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml)","title":"gl.bufferSubData/4","ref":"gl.html#bufferSubData/4"},{"type":"function","doc":"[`gl:callList/1`](`callList/1`) causes the named display list to be executed.\nThe commands saved in the display list are executed in order, just as if they\nwere called without using a display list. If `List` has not been defined as a\ndisplay list, [`gl:callList/1`](`callList/1`) is ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCallList.xml)","title":"gl.callList/1","ref":"gl.html#callList/1"},{"type":"function","doc":"[`gl:callLists/1`](`callLists/1`) causes each display list in the list of names\npassed as `Lists` to be executed. As a result, the commands saved in each\ndisplay list are executed in order, just as if they were called without using a\ndisplay list. Names of display lists that have not been defined are ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCallLists.xml)","title":"gl.callLists/1","ref":"gl.html#callLists/1"},{"type":"function","doc":"[`gl:checkFramebufferStatus/1`](`checkFramebufferStatus/1`) and\n`glCheckNamedFramebufferStatus` return the completeness status of a framebuffer\nobject when treated as a read or draw framebuffer, depending on the value of\n`Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCheckFramebufferStatus.xhtml)","title":"gl.checkFramebufferStatus/1","ref":"gl.html#checkFramebufferStatus/1"},{"type":"function","doc":"[`gl:clampColor/2`](`clampColor/2`) controls color clamping that is performed\nduring [`gl:readPixels/7`](`readPixels/7`). `Target` must be\n`?GL_CLAMP_READ_COLOR`. If `Clamp` is `?GL_TRUE`, read color clamping is\nenabled; if `Clamp` is `?GL_FALSE`, read color clamping is disabled. If `Clamp`\nis `?GL_FIXED_ONLY`, read color clamping is enabled only if the selected read\nbuffer has fixed point components and disabled otherwise.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClampColor.xhtml)","title":"gl.clampColor/2","ref":"gl.html#clampColor/2"},{"type":"function","doc":"[`gl:clear/1`](`clear/1`) sets the bitplane area of the window to values\npreviously selected by [`gl:clearColor/4`](`clearColor/4`),\n[`gl:clearDepth/1`](`clearDepth/1`), and\n[`gl:clearStencil/1`](`clearStencil/1`). Multiple color buffers can be cleared\nsimultaneously by selecting more than one buffer at a time using\n[`gl:drawBuffer/1`](`drawBuffer/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClear.xhtml)","title":"gl.clear/1","ref":"gl.html#clear/1"},{"type":"function","doc":"[`gl:clearAccum/4`](`clearAccum/4`) specifies the red, green, blue, and alpha\nvalues used by [`gl:clear/1`](`clear/1`) to clear the accumulation buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClearAccum.xml)","title":"gl.clearAccum/4","ref":"gl.html#clearAccum/4"},{"type":"function","doc":"","title":"gl.clearBufferData/5","ref":"gl.html#clearBufferData/5"},{"type":"function","doc":"","title":"gl.clearBufferfi/4","ref":"gl.html#clearBufferfi/4"},{"type":"function","doc":"","title":"gl.clearBufferfv/3","ref":"gl.html#clearBufferfv/3"},{"type":"function","doc":"","title":"gl.clearBufferiv/3","ref":"gl.html#clearBufferiv/3"},{"type":"function","doc":"","title":"gl.clearBufferSubData/7","ref":"gl.html#clearBufferSubData/7"},{"type":"function","doc":"These commands clear a specified buffer of a framebuffer to specified value(s).\nFor [`gl:clearBuffer*()`](`clearBufferiv/3`), the framebuffer is the currently\nbound draw framebuffer object. For `glClearNamedFramebuffer*`, `Framebuffer` is\nzero, indicating the default draw framebuffer, or the name of a framebuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearBuffer.xhtml)","title":"gl.clearBufferuiv/3","ref":"gl.html#clearBufferuiv/3"},{"type":"function","doc":"[`gl:clearColor/4`](`clearColor/4`) specifies the red, green, blue, and alpha\nvalues used by [`gl:clear/1`](`clear/1`) to clear the color buffers. Values\nspecified by [`gl:clearColor/4`](`clearColor/4`) are clamped to the range \\[0\n1].\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearColor.xhtml)","title":"gl.clearColor/4","ref":"gl.html#clearColor/4"},{"type":"function","doc":"","title":"gl.clearDepth/1","ref":"gl.html#clearDepth/1"},{"type":"function","doc":"[`gl:clearDepth/1`](`clearDepth/1`) specifies the depth value used by\n[`gl:clear/1`](`clear/1`) to clear the depth buffer. Values specified by\n[`gl:clearDepth/1`](`clearDepth/1`) are clamped to the range \\[0 1].\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearDepth.xhtml)","title":"gl.clearDepthf/1","ref":"gl.html#clearDepthf/1"},{"type":"function","doc":"[`gl:clearIndex/1`](`clearIndex/1`) specifies the index used by\n[`gl:clear/1`](`clear/1`) to clear the color index buffers. `C` is not clamped.\nRather, `C` is converted to a fixed-point value with unspecified precision to\nthe right of the binary point. The integer part of this value is then masked\nwith 2 m-1, where m is the number of bits in a color index stored in the frame\nbuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClearIndex.xml)","title":"gl.clearIndex/1","ref":"gl.html#clearIndex/1"},{"type":"function","doc":"[`gl:clearStencil/1`](`clearStencil/1`) specifies the index used by\n[`gl:clear/1`](`clear/1`) to clear the stencil buffer. `S` is masked with 2 m-1,\nwhere m is the number of bits in the stencil buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearStencil.xhtml)","title":"gl.clearStencil/1","ref":"gl.html#clearStencil/1"},{"type":"function","doc":"[`gl:clearTexImage/5`](`clearTexImage/5`) fills all an image contained in a\ntexture with an application supplied value. `Texture` must be the name of an\nexisting texture. Further, `Texture` may not be the name of a buffer texture,\nnor may its internal format be compressed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearTexImage.xhtml)","title":"gl.clearTexImage/5","ref":"gl.html#clearTexImage/5"},{"type":"function","doc":"[`gl:clearTexSubImage/11`](`clearTexSubImage/11`) fills all or part of an image\ncontained in a texture with an application supplied value. `Texture` must be the\nname of an existing texture. Further, `Texture` may not be the name of a buffer\ntexture, nor may its internal format be compressed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearTexSubImage.xhtml)","title":"gl.clearTexSubImage/11","ref":"gl.html#clearTexSubImage/11"},{"type":"function","doc":"[`gl:clientActiveTexture/1`](`clientActiveTexture/1`) selects the vertex array\nclient state parameters to be modified by\n[`gl:texCoordPointer/4`](`texCoordPointer/4`), and enabled or disabled with\n[`gl:enableClientState/1`](`enableClientState/1`) or\n[`gl:disableClientState/1`](`enableClientState/1`), respectively, when called\nwith a parameter of `?GL_TEXTURE_COORD_ARRAY`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClientActiveTexture.xml)","title":"gl.clientActiveTexture/1","ref":"gl.html#clientActiveTexture/1"},{"type":"function","doc":"[`gl:clientWaitSync/3`](`clientWaitSync/3`) causes the client to block and wait\nfor the sync object specified by `Sync` to become signaled. If `Sync` is\nsignaled when [`gl:clientWaitSync/3`](`clientWaitSync/3`) is called,\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) returns immediately, otherwise it\nwill block and wait for up to `Timeout` nanoseconds for `Sync` to become\nsignaled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClientWaitSync.xhtml)","title":"gl.clientWaitSync/3","ref":"gl.html#clientWaitSync/3"},{"type":"function","doc":"[`gl:clipControl/2`](`clipControl/2`) controls the clipping volume behavior and\nthe clip coordinate to window coordinate transformation behavior.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClipControl.xhtml)","title":"gl.clipControl/2","ref":"gl.html#clipControl/2"},{"type":"function","doc":"Geometry is always clipped against the boundaries of a six-plane frustum in `x`,\n`y`, and `z`. [`gl:clipPlane/2`](`clipPlane/2`) allows the specification of\nadditional planes, not necessarily perpendicular to the `x`, `y`, or `z` axis,\nagainst which all geometry is clipped. To determine the maximum number of\nadditional clipping planes, call [`gl:getIntegerv/1`](`getBooleanv/1`) with\nargument `?GL_MAX_CLIP_PLANES`. All implementations support at least six such\nclipping planes. Because the resulting clipping region is the intersection of\nthe defined half-spaces, it is always convex.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClipPlane.xml)","title":"gl.clipPlane/2","ref":"gl.html#clipPlane/2"},{"type":"function","doc":"","title":"gl.color3b/3","ref":"gl.html#color3b/3"},{"type":"function","doc":"","title":"gl.color3bv/1","ref":"gl.html#color3bv/1"},{"type":"function","doc":"","title":"gl.color3d/3","ref":"gl.html#color3d/3"},{"type":"function","doc":"","title":"gl.color3dv/1","ref":"gl.html#color3dv/1"},{"type":"function","doc":"","title":"gl.color3f/3","ref":"gl.html#color3f/3"},{"type":"function","doc":"","title":"gl.color3fv/1","ref":"gl.html#color3fv/1"},{"type":"function","doc":"","title":"gl.color3i/3","ref":"gl.html#color3i/3"},{"type":"function","doc":"","title":"gl.color3iv/1","ref":"gl.html#color3iv/1"},{"type":"function","doc":"","title":"gl.color3s/3","ref":"gl.html#color3s/3"},{"type":"function","doc":"","title":"gl.color3sv/1","ref":"gl.html#color3sv/1"},{"type":"function","doc":"","title":"gl.color3ub/3","ref":"gl.html#color3ub/3"},{"type":"function","doc":"","title":"gl.color3ubv/1","ref":"gl.html#color3ubv/1"},{"type":"function","doc":"","title":"gl.color3ui/3","ref":"gl.html#color3ui/3"},{"type":"function","doc":"","title":"gl.color3uiv/1","ref":"gl.html#color3uiv/1"},{"type":"function","doc":"","title":"gl.color3us/3","ref":"gl.html#color3us/3"},{"type":"function","doc":"","title":"gl.color3usv/1","ref":"gl.html#color3usv/1"},{"type":"function","doc":"","title":"gl.color4b/4","ref":"gl.html#color4b/4"},{"type":"function","doc":"","title":"gl.color4bv/1","ref":"gl.html#color4bv/1"},{"type":"function","doc":"","title":"gl.color4d/4","ref":"gl.html#color4d/4"},{"type":"function","doc":"","title":"gl.color4dv/1","ref":"gl.html#color4dv/1"},{"type":"function","doc":"","title":"gl.color4f/4","ref":"gl.html#color4f/4"},{"type":"function","doc":"","title":"gl.color4fv/1","ref":"gl.html#color4fv/1"},{"type":"function","doc":"","title":"gl.color4i/4","ref":"gl.html#color4i/4"},{"type":"function","doc":"","title":"gl.color4iv/1","ref":"gl.html#color4iv/1"},{"type":"function","doc":"","title":"gl.color4s/4","ref":"gl.html#color4s/4"},{"type":"function","doc":"","title":"gl.color4sv/1","ref":"gl.html#color4sv/1"},{"type":"function","doc":"","title":"gl.color4ub/4","ref":"gl.html#color4ub/4"},{"type":"function","doc":"","title":"gl.color4ubv/1","ref":"gl.html#color4ubv/1"},{"type":"function","doc":"","title":"gl.color4ui/4","ref":"gl.html#color4ui/4"},{"type":"function","doc":"","title":"gl.color4uiv/1","ref":"gl.html#color4uiv/1"},{"type":"function","doc":"","title":"gl.color4us/4","ref":"gl.html#color4us/4"},{"type":"function","doc":"The GL stores both a current single-valued color index and a current four-valued\nRGBA color. [`gl:color()`](`color3b/3`) sets a new four-valued RGBA color.\n[`gl:color()`](`color3b/3`) has two major variants: [`gl:color3()`](`color3b/3`)\nand [`gl:color4()`](`color3b/3`). [`gl:color3()`](`color3b/3`) variants specify\nnew red, green, and blue values explicitly and set the current alpha value to\n1.0 (full intensity) implicitly. [`gl:color4()`](`color3b/3`) variants specify\nall four color components explicitly.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColor.xml)","title":"gl.color4usv/1","ref":"gl.html#color4usv/1"},{"type":"function","doc":"","title":"gl.colorMask/4","ref":"gl.html#colorMask/4"},{"type":"function","doc":"[`gl:colorMask/4`](`colorMask/4`) and [`gl:colorMaski/5`](`colorMask/4`) specify\nwhether the individual color components in the frame buffer can or cannot be\nwritten. [`gl:colorMaski/5`](`colorMask/4`) sets the mask for a specific draw\nbuffer, whereas [`gl:colorMask/4`](`colorMask/4`) sets the mask for all draw\nbuffers. If `Red` is `?GL_FALSE`, for example, no change is made to the red\ncomponent of any pixel in any of the color buffers, regardless of the drawing\noperation attempted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glColorMask.xhtml)","title":"gl.colorMaski/5","ref":"gl.html#colorMaski/5"},{"type":"function","doc":"[`gl:colorMaterial/2`](`colorMaterial/2`) specifies which material parameters\ntrack the current color. When `?GL_COLOR_MATERIAL` is enabled, the material\nparameter or parameters specified by `Mode`, of the material or materials\nspecified by `Face`, track the current color at all times.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorMaterial.xml)","title":"gl.colorMaterial/2","ref":"gl.html#colorMaterial/2"},{"type":"function","doc":"[`gl:colorPointer/4`](`colorPointer/4`) specifies the location and data format\nof an array of color components to use when rendering. `Size` specifies the\nnumber of components per color, and must be 3 or 4. `Type` specifies the data\ntype of each color component, and `Stride` specifies the byte stride from one\ncolor to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays. (Single-array storage may be more efficient\non some implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorPointer.xml)","title":"gl.colorPointer/4","ref":"gl.html#colorPointer/4"},{"type":"function","doc":"[`gl:colorSubTable/6`](`colorSubTable/6`) is used to respecify a contiguous\nportion of a color table previously defined using\n[`gl:colorTable/6`](`colorTable/6`). The pixels referenced by `Data` replace the\nportion of the existing table from indices `Start` to start+count-1, inclusive.\nThis region may not include any entries outside the range of the color table as\nit was originally specified. It is not an error to specify a subtexture with\nwidth of 0, but such a specification has no effect.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorSubTable.xml)","title":"gl.colorSubTable/6","ref":"gl.html#colorSubTable/6"},{"type":"function","doc":"[`gl:colorTable/6`](`colorTable/6`) may be used in two ways: to test the actual\nsize and color resolution of a lookup table given a particular set of\nparameters, or to load the contents of a color lookup table. Use the targets\n`?GL_PROXY_*` for the first case and the other targets for the second case.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorTable.xml)","title":"gl.colorTable/6","ref":"gl.html#colorTable/6"},{"type":"function","doc":"","title":"gl.colorTableParameterfv/3","ref":"gl.html#colorTableParameterfv/3"},{"type":"function","doc":"[`gl:colorTableParameter()`](`colorTableParameterfv/3`) is used to specify the\nscale factors and bias terms applied to color components when they are loaded\ninto a color table. `Target` indicates which color table the scale and bias\nterms apply to; it must be set to `?GL_COLOR_TABLE`,\n`?GL_POST_CONVOLUTION_COLOR_TABLE`, or `?GL_POST_COLOR_MATRIX_COLOR_TABLE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorTableParameter.xml)","title":"gl.colorTableParameteriv/3","ref":"gl.html#colorTableParameteriv/3"},{"type":"function","doc":"[`gl:compileShader/1`](`compileShader/1`) compiles the source code strings that\nhave been stored in the shader object specified by `Shader`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompileShader.xhtml)","title":"gl.compileShader/1","ref":"gl.html#compileShader/1"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage1D.xhtml)","title":"gl.compressedTexImage1D/7","ref":"gl.html#compressedTexImage1D/7"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage2D.xhtml)","title":"gl.compressedTexImage2D/8","ref":"gl.html#compressedTexImage2D/8"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage3D.xhtml)","title":"gl.compressedTexImage3D/9","ref":"gl.html#compressedTexImage3D/9"},{"type":"function","doc":"","title":"gl.compressedTexSubImage1D/7","ref":"gl.html#compressedTexSubImage1D/7"},{"type":"function","doc":"","title":"gl.compressedTexSubImage2D/9","ref":"gl.html#compressedTexSubImage2D/9"},{"type":"function","doc":"","title":"gl.compressedTexSubImage3D/11","ref":"gl.html#compressedTexSubImage3D/11"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage1D.xhtml)","title":"gl.compressedTextureSubImage1D/7","ref":"gl.html#compressedTextureSubImage1D/7"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage2D.xhtml)","title":"gl.compressedTextureSubImage2D/9","ref":"gl.html#compressedTextureSubImage2D/9"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage3D.xhtml)","title":"gl.compressedTextureSubImage3D/11","ref":"gl.html#compressedTextureSubImage3D/11"},{"type":"function","doc":"[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`) builds a one-dimensional\nconvolution filter kernel from an array of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionFilter1D.xml)","title":"gl.convolutionFilter1D/6","ref":"gl.html#convolutionFilter1D/6"},{"type":"function","doc":"[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`) builds a two-dimensional\nconvolution filter kernel from an array of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionFilter2D.xml)","title":"gl.convolutionFilter2D/7","ref":"gl.html#convolutionFilter2D/7"},{"type":"function","doc":"","title":"gl.convolutionParameterf/3","ref":"gl.html#convolutionParameterf/3"},{"type":"function","doc":"","title":"gl.convolutionParameterfv/3","ref":"gl.html#convolutionParameterfv/3"},{"type":"function","doc":"","title":"gl.convolutionParameteri/3","ref":"gl.html#convolutionParameteri/3"},{"type":"function","doc":"[`gl:convolutionParameter()`](`convolutionParameterf/3`) sets the value of a\nconvolution parameter.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionParameter.xml)","title":"gl.convolutionParameteriv/3","ref":"gl.html#convolutionParameteriv/3"},{"type":"function","doc":"[`gl:copyBufferSubData/5`](`copyBufferSubData/5`) and `glCopyNamedBufferSubData`\ncopy part of the data store attached to a source buffer object to the data store\nattached to a destination buffer object. The number of basic machine units\nindicated by `Size` is copied from the source at offset `ReadOffset` to the\ndestination at `WriteOffset`. `ReadOffset`, `WriteOffset` and `Size` are in\nterms of basic machine units.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyBufferSubData.xhtml)","title":"gl.copyBufferSubData/5","ref":"gl.html#copyBufferSubData/5"},{"type":"function","doc":"[`gl:copyColorSubTable/5`](`copyColorSubTable/5`) is used to respecify a\ncontiguous portion of a color table previously defined using\n[`gl:colorTable/6`](`colorTable/6`). The pixels copied from the framebuffer\nreplace the portion of the existing table from indices `Start` to start+x-1,\ninclusive. This region may not include any entries outside the range of the\ncolor table, as was originally specified. It is not an error to specify a\nsubtexture with width of 0, but such a specification has no effect.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyColorSubTable.xml)","title":"gl.copyColorSubTable/5","ref":"gl.html#copyColorSubTable/5"},{"type":"function","doc":"[`gl:copyColorTable/5`](`copyColorTable/5`) loads a color table with pixels from\nthe current `?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:colorTable/6`](`colorTable/6`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyColorTable.xml)","title":"gl.copyColorTable/5","ref":"gl.html#copyColorTable/5"},{"type":"function","doc":"[`gl:copyConvolutionFilter1D/5`](`copyConvolutionFilter1D/5`) defines a\none-dimensional convolution filter kernel with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyConvolutionFilter1D.xml)","title":"gl.copyConvolutionFilter1D/5","ref":"gl.html#copyConvolutionFilter1D/5"},{"type":"function","doc":"[`gl:copyConvolutionFilter2D/6`](`copyConvolutionFilter2D/6`) defines a\ntwo-dimensional convolution filter kernel with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyConvolutionFilter2D.xml)","title":"gl.copyConvolutionFilter2D/6","ref":"gl.html#copyConvolutionFilter2D/6"},{"type":"function","doc":"[`gl:copyImageSubData/15`](`copyImageSubData/15`) may be used to copy data from\none image (i.e. texture or renderbuffer) to another.\n[`gl:copyImageSubData/15`](`copyImageSubData/15`) does not perform\ngeneral-purpose conversions such as scaling, resizing, blending, color-space, or\nformat conversions. It should be considered to operate in a manner similar to a\nCPU memcpy. CopyImageSubData can copy between images with different internal\nformats, provided the formats are compatible.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyImageSubData.xhtml)","title":"gl.copyImageSubData/15","ref":"gl.html#copyImageSubData/15"},{"type":"function","doc":"[`gl:copyPixels/5`](`copyPixels/5`) copies a screen-aligned rectangle of pixels\nfrom the specified frame buffer location to a region relative to the current\nraster position. Its operation is well defined only if the entire pixel source\nregion is within the exposed portion of the window. Results of copies from\noutside the window, or from regions of the window that are not exposed, are\nhardware dependent and undefined.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyPixels.xml)","title":"gl.copyPixels/5","ref":"gl.html#copyPixels/5"},{"type":"function","doc":"[`gl:copyTexImage1D/7`](`copyTexImage1D/7`) defines a one-dimensional texture\nimage with pixels from the current `?GL_READ_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexImage1D.xhtml)","title":"gl.copyTexImage1D/7","ref":"gl.html#copyTexImage1D/7"},{"type":"function","doc":"[`gl:copyTexImage2D/8`](`copyTexImage2D/8`) defines a two-dimensional texture\nimage, or cube-map texture image with pixels from the current `?GL_READ_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexImage2D.xhtml)","title":"gl.copyTexImage2D/8","ref":"gl.html#copyTexImage2D/8"},{"type":"function","doc":"[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`) and `glCopyTextureSubImage1D`\nreplace a portion of a one-dimensional texture image with pixels from the\ncurrent `?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:texSubImage1D/7`](`texSubImage1D/7`)). For\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`), the texture object that is\nbound to `Target` will be used for the process. For `glCopyTextureSubImage1D`,\n`Texture` tells which texture object should be used for the purpose of the call.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage1D.xhtml)","title":"gl.copyTexSubImage1D/6","ref":"gl.html#copyTexSubImage1D/6"},{"type":"function","doc":"[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`) and `glCopyTextureSubImage2D`\nreplace a rectangular portion of a two-dimensional texture image, cube-map\ntexture image, rectangular image, or a linear portion of a number of slices of a\none-dimensional array texture with pixels from the current `?GL_READ_BUFFER`\n(rather than from main memory, as is the case for\n[`gl:texSubImage2D/9`](`texSubImage2D/9`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage2D.xhtml)","title":"gl.copyTexSubImage2D/8","ref":"gl.html#copyTexSubImage2D/8"},{"type":"function","doc":"[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`) and `glCopyTextureSubImage3D`\nfunctions replace a rectangular portion of a three-dimensional or\ntwo-dimensional array texture image with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage3D.xhtml)","title":"gl.copyTexSubImage3D/9","ref":"gl.html#copyTexSubImage3D/9"},{"type":"function","doc":"[`gl:createBuffers/1`](`createBuffers/1`) returns `N` previously unused buffer\nnames in `Buffers`, each representing a new buffer object initialized as if it\nhad been bound to an unspecified target.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateBuffers.xhtml)","title":"gl.createBuffers/1","ref":"gl.html#createBuffers/1"},{"type":"function","doc":"[`gl:createFramebuffers/1`](`createFramebuffers/1`) returns `N` previously\nunused framebuffer names in `Framebuffers`, each representing a new framebuffer\nobject initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateFramebuffers.xhtml)","title":"gl.createFramebuffers/1","ref":"gl.html#createFramebuffers/1"},{"type":"function","doc":"[`gl:createProgram/0`](`createProgram/0`) creates an empty program object and\nreturns a non-zero value by which it can be referenced. A program object is an\nobject to which shader objects can be attached. This provides a mechanism to\nspecify the shader objects that will be linked to create a program. It also\nprovides a means for checking the compatibility of the shaders that will be used\nto create a program (for instance, checking the compatibility between a vertex\nshader and a fragment shader). When no longer needed as part of a program\nobject, shader objects can be detached.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateProgram.xhtml)","title":"gl.createProgram/0","ref":"gl.html#createProgram/0"},{"type":"function","doc":"[`gl:createProgramPipelines/1`](`createProgramPipelines/1`) returns `N`\npreviously unused program pipeline names in `Pipelines`, each representing a new\nprogram pipeline object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateProgramPipelines.xhtml)","title":"gl.createProgramPipelines/1","ref":"gl.html#createProgramPipelines/1"},{"type":"function","doc":"[`gl:createQueries/2`](`createQueries/2`) returns `N` previously unused query\nobject names in `Ids`, each representing a new query object with the specified\n`Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateQueries.xhtml)","title":"gl.createQueries/2","ref":"gl.html#createQueries/2"},{"type":"function","doc":"[`gl:createRenderbuffers/1`](`createRenderbuffers/1`) returns `N` previously\nunused renderbuffer object names in `Renderbuffers`, each representing a new\nrenderbuffer object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateRenderbuffers.xhtml)","title":"gl.createRenderbuffers/1","ref":"gl.html#createRenderbuffers/1"},{"type":"function","doc":"[`gl:createSamplers/1`](`createSamplers/1`) returns `N` previously unused\nsampler names in `Samplers`, each representing a new sampler object initialized\nto the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateSamplers.xhtml)","title":"gl.createSamplers/1","ref":"gl.html#createSamplers/1"},{"type":"function","doc":"[`gl:createShader/1`](`createShader/1`) creates an empty shader object and\nreturns a non-zero value by which it can be referenced. A shader object is used\nto maintain the source code strings that define a shader. `ShaderType` indicates\nthe type of shader to be created. Five types of shader are supported. A shader\nof type `?GL_COMPUTE_SHADER` is a shader that is intended to run on the\nprogrammable compute processor. A shader of type `?GL_VERTEX_SHADER` is a shader\nthat is intended to run on the programmable vertex processor. A shader of type\n`?GL_TESS_CONTROL_SHADER` is a shader that is intended to run on the\nprogrammable tessellation processor in the control stage. A shader of type\n`?GL_TESS_EVALUATION_SHADER` is a shader that is intended to run on the\nprogrammable tessellation processor in the evaluation stage. A shader of type\n`?GL_GEOMETRY_SHADER` is a shader that is intended to run on the programmable\ngeometry processor. A shader of type `?GL_FRAGMENT_SHADER` is a shader that is\nintended to run on the programmable fragment processor.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateShader.xhtml)","title":"gl.createShader/1","ref":"gl.html#createShader/1"},{"type":"function","doc":"[`gl:createShaderProgram()`](`createShaderProgramv/2`) creates a program object\ncontaining compiled and linked shaders for a single stage specified by `Type`.\n`Strings` refers to an array of `Count` strings from which to create the shader\nexecutables.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateShaderProgram.xhtml)","title":"gl.createShaderProgramv/2","ref":"gl.html#createShaderProgramv/2"},{"type":"function","doc":"[`gl:createTextures/2`](`createTextures/2`) returns `N` previously unused\ntexture names in `Textures`, each representing a new texture object of the\ndimensionality and type specified by `Target` and initialized to the default\nvalues for that texture type.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateTextures.xhtml)","title":"gl.createTextures/2","ref":"gl.html#createTextures/2"},{"type":"function","doc":"[`gl:createTransformFeedbacks/1`](`createTransformFeedbacks/1`) returns `N`\npreviously unused transform feedback object names in `Ids`, each representing a\nnew transform feedback object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateTransformFeedbacks.xhtml)","title":"gl.createTransformFeedbacks/1","ref":"gl.html#createTransformFeedbacks/1"},{"type":"function","doc":"[`gl:createVertexArrays/1`](`createVertexArrays/1`) returns `N` previously\nunused vertex array object names in `Arrays`, each representing a new vertex\narray object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateVertexArrays.xhtml)","title":"gl.createVertexArrays/1","ref":"gl.html#createVertexArrays/1"},{"type":"function","doc":"[`gl:cullFace/1`](`cullFace/1`) specifies whether front- or back-facing facets\nare culled (as specified by `mode`) when facet culling is enabled. Facet culling\nis initially disabled. To enable and disable facet culling, call the\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) commands with the\nargument `?GL_CULL_FACE`. Facets include triangles, quadrilaterals, polygons,\nand rectangles.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCullFace.xhtml)","title":"gl.cullFace/1","ref":"gl.html#cullFace/1"},{"type":"function","doc":"[`gl:debugMessageControl/5`](`debugMessageControl/5`) controls the reporting of\ndebug messages generated by a debug context. The parameters `Source`, `Type` and\n`Severity` form a filter to select messages from the pool of potential messages\ngenerated by the GL.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDebugMessageControl.xhtml)","title":"gl.debugMessageControl/5","ref":"gl.html#debugMessageControl/5"},{"type":"function","doc":"[`gl:debugMessageInsert/5`](`debugMessageInsert/5`) inserts a user-supplied\nmessage into the debug output queue. `Source` specifies the source that will be\nused to classify the message and must be `?GL_DEBUG_SOURCE_APPLICATION` or\n`?GL_DEBUG_SOURCE_THIRD_PARTY`. All other sources are reserved for use by the GL\nimplementation. `Type` indicates the type of the message to be inserted and may\nbe one of `?GL_DEBUG_TYPE_ERROR`, `?GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR`,\n`?GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR`, `?GL_DEBUG_TYPE_PORTABILITY`,\n`?GL_DEBUG_TYPE_PERFORMANCE`, `?GL_DEBUG_TYPE_MARKER`,\n`?GL_DEBUG_TYPE_PUSH_GROUP`, `?GL_DEBUG_TYPE_POP_GROUP`, or\n`?GL_DEBUG_TYPE_OTHER`. `Severity` indicates the severity of the message and may\nbe `?GL_DEBUG_SEVERITY_LOW`, `?GL_DEBUG_SEVERITY_MEDIUM`,\n`?GL_DEBUG_SEVERITY_HIGH` or `?GL_DEBUG_SEVERITY_NOTIFICATION`. `Id` is\navailable for application defined use and may be any value. This value will be\nrecorded and used to identify the message.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDebugMessageInsert.xhtml)","title":"gl.debugMessageInsert/5","ref":"gl.html#debugMessageInsert/5"},{"type":"function","doc":"[`gl:deleteBuffers/1`](`deleteBuffers/1`) deletes `N` buffer objects named by\nthe elements of the array `Buffers`. After a buffer object is deleted, it has no\ncontents, and its name is free for reuse (for example by\n[`gl:genBuffers/1`](`genBuffers/1`)). If a buffer object that is currently bound\nis deleted, the binding reverts to 0 (the absence of any buffer object).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteBuffers.xhtml)","title":"gl.deleteBuffers/1","ref":"gl.html#deleteBuffers/1"},{"type":"function","doc":"[`gl:deleteFramebuffers/1`](`deleteFramebuffers/1`) deletes the `N` framebuffer\nobjects whose names are stored in the array addressed by `Framebuffers`. The\nname zero is reserved by the GL and is silently ignored, should it occur in\n`Framebuffers`, as are other unused names. Once a framebuffer object is deleted,\nits name is again unused and it has no attachments. If a framebuffer that is\ncurrently bound to one or more of the targets `?GL_DRAW_FRAMEBUFFER` or\n`?GL_READ_FRAMEBUFFER` is deleted, it is as though\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) had been executed with the\ncorresponding `Target` and `Framebuffer` zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteFramebuffers.xhtml)","title":"gl.deleteFramebuffers/1","ref":"gl.html#deleteFramebuffers/1"},{"type":"function","doc":"[`gl:deleteLists/2`](`deleteLists/2`) causes a contiguous group of display lists\nto be deleted. `List` is the name of the first display list to be deleted, and\n`Range` is the number of display lists to delete. All display lists d with\nlist<= d<= list+range-1 are deleted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glDeleteLists.xml)","title":"gl.deleteLists/2","ref":"gl.html#deleteLists/2"},{"type":"function","doc":"[`gl:deleteProgram/1`](`deleteProgram/1`) frees the memory and invalidates the\nname associated with the program object specified by `Program.` This command\neffectively undoes the effects of a call to\n[`gl:createProgram/0`](`createProgram/0`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteProgram.xhtml)","title":"gl.deleteProgram/1","ref":"gl.html#deleteProgram/1"},{"type":"function","doc":"[`gl:deleteProgramPipelines/1`](`deleteProgramPipelines/1`) deletes the `N`\nprogram pipeline objects whose names are stored in the array `Pipelines`. Unused\nnames in `Pipelines` are ignored, as is the name zero. After a program pipeline\nobject is deleted, its name is again unused and it has no contents. If program\npipeline object that is currently bound is deleted, the binding for that object\nreverts to zero and no program pipeline object becomes current.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteProgramPipelines.xhtml)","title":"gl.deleteProgramPipelines/1","ref":"gl.html#deleteProgramPipelines/1"},{"type":"function","doc":"[`gl:deleteQueries/1`](`deleteQueries/1`) deletes `N` query objects named by the\nelements of the array `Ids`. After a query object is deleted, it has no\ncontents, and its name is free for reuse (for example by\n[`gl:genQueries/1`](`genQueries/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteQueries.xhtml)","title":"gl.deleteQueries/1","ref":"gl.html#deleteQueries/1"},{"type":"function","doc":"[`gl:deleteRenderbuffers/1`](`deleteRenderbuffers/1`) deletes the `N`\nrenderbuffer objects whose names are stored in the array addressed by\n`Renderbuffers`. The name zero is reserved by the GL and is silently ignored,\nshould it occur in `Renderbuffers`, as are other unused names. Once a\nrenderbuffer object is deleted, its name is again unused and it has no contents.\nIf a renderbuffer that is currently bound to the target `?GL_RENDERBUFFER` is\ndeleted, it is as though [`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) had\nbeen executed with a `Target` of `?GL_RENDERBUFFER` and a `Name` of zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteRenderbuffers.xhtml)","title":"gl.deleteRenderbuffers/1","ref":"gl.html#deleteRenderbuffers/1"},{"type":"function","doc":"[`gl:deleteSamplers/1`](`deleteSamplers/1`) deletes `N` sampler objects named by\nthe elements of the array `Samplers`. After a sampler object is deleted, its\nname is again unused. If a sampler object that is currently bound to a sampler\nunit is deleted, it is as though [`gl:bindSampler/2`](`bindSampler/2`) is called\nwith unit set to the unit the sampler is bound to and sampler zero. Unused names\nin samplers are silently ignored, as is the reserved name zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteSamplers.xhtml)","title":"gl.deleteSamplers/1","ref":"gl.html#deleteSamplers/1"},{"type":"function","doc":"[`gl:deleteShader/1`](`deleteShader/1`) frees the memory and invalidates the\nname associated with the shader object specified by `Shader`. This command\neffectively undoes the effects of a call to\n[`gl:createShader/1`](`createShader/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteShader.xhtml)","title":"gl.deleteShader/1","ref":"gl.html#deleteShader/1"},{"type":"function","doc":"[`gl:deleteSync/1`](`deleteSync/1`) deletes the sync object specified by `Sync`.\nIf the fence command corresponding to the specified sync object has completed,\nor if no [`gl:waitSync/3`](`waitSync/3`) or\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) commands are blocking on `Sync`, the\nobject is deleted immediately. Otherwise, `Sync` is flagged for deletion and\nwill be deleted when it is no longer associated with any fence command and is no\nlonger blocking any [`gl:waitSync/3`](`waitSync/3`) or\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) command. In either case, after\n[`gl:deleteSync/1`](`deleteSync/1`) returns, the name `Sync` is invalid and can\nno longer be used to refer to the sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteSync.xhtml)","title":"gl.deleteSync/1","ref":"gl.html#deleteSync/1"},{"type":"function","doc":"[`gl:deleteTextures/1`](`deleteTextures/1`) deletes `N` textures named by the\nelements of the array `Textures`. After a texture is deleted, it has no contents\nor dimensionality, and its name is free for reuse (for example by\n[`gl:genTextures/1`](`genTextures/1`)). If a texture that is currently bound is\ndeleted, the binding reverts to 0 (the default texture).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteTextures.xhtml)","title":"gl.deleteTextures/1","ref":"gl.html#deleteTextures/1"},{"type":"function","doc":"[`gl:deleteTransformFeedbacks/1`](`deleteTransformFeedbacks/1`) deletes the `N`\ntransform feedback objects whose names are stored in the array `Ids`. Unused\nnames in `Ids` are ignored, as is the name zero. After a transform feedback\nobject is deleted, its name is again unused and it has no contents. If an active\ntransform feedback object is deleted, its name immediately becomes unused, but\nthe underlying object is not deleted until it is no longer active.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteTransformFeedbacks.xhtml)","title":"gl.deleteTransformFeedbacks/1","ref":"gl.html#deleteTransformFeedbacks/1"},{"type":"function","doc":"[`gl:deleteVertexArrays/1`](`deleteVertexArrays/1`) deletes `N` vertex array\nobjects whose names are stored in the array addressed by `Arrays`. Once a vertex\narray object is deleted it has no contents and its name is again unused. If a\nvertex array object that is currently bound is deleted, the binding for that\nobject reverts to zero and the default vertex array becomes current. Unused\nnames in `Arrays` are silently ignored, as is the value zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteVertexArrays.xhtml)","title":"gl.deleteVertexArrays/1","ref":"gl.html#deleteVertexArrays/1"},{"type":"function","doc":"[`gl:depthFunc/1`](`depthFunc/1`) specifies the function used to compare each\nincoming pixel depth value with the depth value present in the depth buffer. The\ncomparison is performed only if depth testing is enabled. (See\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) of\n`?GL_DEPTH_TEST`.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthFunc.xhtml)","title":"gl.depthFunc/1","ref":"gl.html#depthFunc/1"},{"type":"function","doc":"[`gl:depthMask/1`](`depthMask/1`) specifies whether the depth buffer is enabled\nfor writing. If `Flag` is `?GL_FALSE`, depth buffer writing is disabled.\nOtherwise, it is enabled. Initially, depth buffer writing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthMask.xhtml)","title":"gl.depthMask/1","ref":"gl.html#depthMask/1"},{"type":"function","doc":"","title":"gl.depthRange/2","ref":"gl.html#depthRange/2"},{"type":"function","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes. Each viewport has an\nindependent depth range specified as a linear mapping of the normalized depth\ncoordinates in this range to window depth coordinates. Regardless of the actual\ndepth buffer implementation, window coordinate depth values are treated as\nthough they range from 0 through 1 (like color components).\n[`gl:depthRangeArray()`](`depthRangeArrayv/2`) specifies a linear mapping of the\nnormalized depth coordinates in this range to window depth coordinates for each\nviewport in the range [`First`, `First` \\+ `Count`). Thus, the values accepted\nby [`gl:depthRangeArray()`](`depthRangeArrayv/2`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRangeArray.xhtml)","title":"gl.depthRangeArrayv/2","ref":"gl.html#depthRangeArrayv/2"},{"type":"function","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes.\n[`gl:depthRange/2`](`depthRange/2`) specifies a linear mapping of the normalized\ndepth coordinates in this range to window depth coordinates. Regardless of the\nactual depth buffer implementation, window coordinate depth values are treated\nas though they range from 0 through 1 (like color components). Thus, the values\naccepted by [`gl:depthRange/2`](`depthRange/2`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRange.xhtml)","title":"gl.depthRangef/2","ref":"gl.html#depthRangef/2"},{"type":"function","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes. Each viewport has an\nindependent depth range specified as a linear mapping of the normalized depth\ncoordinates in this range to window depth coordinates. Regardless of the actual\ndepth buffer implementation, window coordinate depth values are treated as\nthough they range from 0 through 1 (like color components).\n[`gl:depthRangeIndexed/3`](`depthRangeIndexed/3`) specifies a linear mapping of\nthe normalized depth coordinates in this range to window depth coordinates for a\nspecified viewport. Thus, the values accepted by\n[`gl:depthRangeIndexed/3`](`depthRangeIndexed/3`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRangeIndexed.xhtml)","title":"gl.depthRangeIndexed/3","ref":"gl.html#depthRangeIndexed/3"},{"type":"function","doc":"[`gl:detachShader/2`](`detachShader/2`) detaches the shader object specified by\n`Shader` from the program object specified by `Program`. This command can be\nused to undo the effect of the command [`gl:attachShader/2`](`attachShader/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDetachShader.xhtml)","title":"gl.detachShader/2","ref":"gl.html#detachShader/2"},{"type":"function","doc":"","title":"gl.disable/1","ref":"gl.html#disable/1"},{"type":"function","doc":"","title":"gl.disableClientState/1","ref":"gl.html#disableClientState/1"},{"type":"function","doc":"","title":"gl.disablei/2","ref":"gl.html#disablei/2"},{"type":"function","doc":"","title":"gl.disableVertexArrayAttrib/2","ref":"gl.html#disableVertexArrayAttrib/2"},{"type":"function","doc":"","title":"gl.disableVertexAttribArray/1","ref":"gl.html#disableVertexAttribArray/1"},{"type":"function","doc":"[`gl:dispatchCompute/3`](`dispatchCompute/3`) launches one or more compute work\ngroups. Each work group is processed by the active program object for the\ncompute shader stage. While the individual shader invocations within a work\ngroup are executed as a unit, work groups are executed completely independently\nand in unspecified order. `Num_groups_x`, `Num_groups_y` and `Num_groups_z`\nspecify the number of local work groups that will be dispatched in the X, Y and\nZ dimensions, respectively.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDispatchCompute.xhtml)","title":"gl.dispatchCompute/3","ref":"gl.html#dispatchCompute/3"},{"type":"function","doc":"[`gl:dispatchComputeIndirect/1`](`dispatchComputeIndirect/1`) launches one or\nmore compute work groups using parameters stored in the buffer object currently\nbound to the `?GL_DISPATCH_INDIRECT_BUFFER` target. Each work group is processed\nby the active program object for the compute shader stage. While the individual\nshader invocations within a work group are executed as a unit, work groups are\nexecuted completely independently and in unspecified order. `Indirect` contains\nthe offset into the data store of the buffer object bound to the\n`?GL_DISPATCH_INDIRECT_BUFFER` target at which the parameters are stored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDispatchComputeIndirect.xhtml)","title":"gl.dispatchComputeIndirect/1","ref":"gl.html#dispatchComputeIndirect/1"},{"type":"function","doc":"[`gl:drawArrays/3`](`drawArrays/3`) specifies multiple geometric primitives with\nvery few subroutine calls. Instead of calling a GL procedure to pass each\nindividual vertex, normal, texture coordinate, edge flag, or color, you can\nprespecify separate arrays of vertices, normals, and colors and use them to\nconstruct a sequence of primitives with a single call to\n[`gl:drawArrays/3`](`drawArrays/3`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArrays.xhtml)","title":"gl.drawArrays/3","ref":"gl.html#drawArrays/3"},{"type":"function","doc":"[`gl:drawArraysIndirect/2`](`drawArraysIndirect/2`) specifies multiple geometric\nprimitives with very few subroutine calls.\n[`gl:drawArraysIndirect/2`](`drawArraysIndirect/2`) behaves similarly to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`),\nexecept that the parameters to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nare stored in memory at the address given by `Indirect`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysIndirect.xhtml)","title":"gl.drawArraysIndirect/2","ref":"gl.html#drawArraysIndirect/2"},{"type":"function","doc":"[`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`) behaves identically to\n[`gl:drawArrays/3`](`drawArrays/3`) except that `Instancecount` instances of the\nrange of elements are executed and the value of the internal counter\n`InstanceID` advances for each iteration. `InstanceID` is an internal 32-bit\ninteger counter that may be read by a vertex shader as `?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysInstanced.xhtml)","title":"gl.drawArraysInstanced/4","ref":"gl.html#drawArraysInstanced/4"},{"type":"function","doc":"[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nbehaves identically to [`gl:drawArrays/3`](`drawArrays/3`) except that\n`Instancecount` instances of the range of elements are executed and the value of\nthe internal counter `InstanceID` advances for each iteration. `InstanceID` is\nan internal 32-bit integer counter that may be read by a vertex shader as\n`?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysInstancedBaseInstance.xhtml)","title":"gl.drawArraysInstancedBaseInstance/5","ref":"gl.html#drawArraysInstancedBaseInstance/5"},{"type":"function","doc":"When colors are written to the frame buffer, they are written into the color\nbuffers specified by [`gl:drawBuffer/1`](`drawBuffer/1`). One of the following\nvalues can be used for default framebuffer:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawBuffer.xhtml)","title":"gl.drawBuffer/1","ref":"gl.html#drawBuffer/1"},{"type":"function","doc":"[`gl:drawBuffers/1`](`drawBuffers/1`) and `glNamedFramebufferDrawBuffers` define\nan array of buffers into which outputs from the fragment shader data will be\nwritten. If a fragment shader writes a value to one or more user defined output\nvariables, then the value of each variable will be written into the buffer\nspecified at a location within `Bufs` corresponding to the location assigned to\nthat user defined output. The draw buffer used for user defined outputs assigned\nto locations greater than or equal to `N` is implicitly set to `?GL_NONE` and\nany data written to such an output is discarded.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawBuffers.xhtml)","title":"gl.drawBuffers/1","ref":"gl.html#drawBuffers/1"},{"type":"function","doc":"[`gl:drawElements/4`](`drawElements/4`) specifies multiple geometric primitives\nwith very few subroutine calls. Instead of calling a GL function to pass each\nindividual vertex, normal, texture coordinate, edge flag, or color, you can\nprespecify separate arrays of vertices, normals, and so on, and use them to\nconstruct a sequence of primitives with a single call to\n[`gl:drawElements/4`](`drawElements/4`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElements.xhtml)","title":"gl.drawElements/4","ref":"gl.html#drawElements/4"},{"type":"function","doc":"[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`) behaves identically\nto [`gl:drawElements/4`](`drawElements/4`) except that the `i`th element\ntransferred by the corresponding draw call will be taken from element\n`Indices`\\[i] + `Basevertex` of each enabled array. If the resulting value is\nlarger than the maximum value representable by `Type`, it is as if the\ncalculation were upconverted to 32-bit unsigned integers (with wrapping on\noverflow conditions). The operation is undefined if the sum would be negative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsBaseVertex.xhtml)","title":"gl.drawElementsBaseVertex/5","ref":"gl.html#drawElementsBaseVertex/5"},{"type":"function","doc":"[`gl:drawElementsIndirect/3`](`drawElementsIndirect/3`) specifies multiple\nindexed geometric primitives with very few subroutine calls.\n[`gl:drawElementsIndirect/3`](`drawElementsIndirect/3`) behaves similarly to\n[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`),\nexecpt that the parameters to\n[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`)\nare stored in memory at the address given by `Indirect`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsIndirect.xhtml)","title":"gl.drawElementsIndirect/3","ref":"gl.html#drawElementsIndirect/3"},{"type":"function","doc":"[`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`) behaves identically to\n[`gl:drawElements/4`](`drawElements/4`) except that `Instancecount` instances of\nthe set of elements are executed and the value of the internal counter\n`InstanceID` advances for each iteration. `InstanceID` is an internal 32-bit\ninteger counter that may be read by a vertex shader as `?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstanced.xhtml)","title":"gl.drawElementsInstanced/5","ref":"gl.html#drawElementsInstanced/5"},{"type":"function","doc":"[`gl:drawElementsInstancedBaseInstance/6`](`drawElementsInstancedBaseInstance/6`)\nbehaves identically to [`gl:drawElements/4`](`drawElements/4`) except that\n`Instancecount` instances of the set of elements are executed and the value of\nthe internal counter `InstanceID` advances for each iteration. `InstanceID` is\nan internal 32-bit integer counter that may be read by a vertex shader as\n`?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseInstance.xhtml)","title":"gl.drawElementsInstancedBaseInstance/6","ref":"gl.html#drawElementsInstancedBaseInstance/6"},{"type":"function","doc":"[`gl:drawElementsInstancedBaseVertex/6`](`drawElementsInstancedBaseVertex/6`)\nbehaves identically to [`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`)\nexcept that the `i`th element transferred by the corresponding draw call will be\ntaken from element `Indices`\\[i] + `Basevertex` of each enabled array. If the\nresulting value is larger than the maximum value representable by `Type`, it is\nas if the calculation were upconverted to 32-bit unsigned integers (with\nwrapping on overflow conditions). The operation is undefined if the sum would be\nnegative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseVertex.xhtml)","title":"gl.drawElementsInstancedBaseVertex/6","ref":"gl.html#drawElementsInstancedBaseVertex/6"},{"type":"function","doc":"[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`)\nbehaves identically to [`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`)\nexcept that the `i`th element transferred by the corresponding draw call will be\ntaken from element `Indices`\\[i] + `Basevertex` of each enabled array. If the\nresulting value is larger than the maximum value representable by `Type`, it is\nas if the calculation were upconverted to 32-bit unsigned integers (with\nwrapping on overflow conditions). The operation is undefined if the sum would be\nnegative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseVertexBaseInstance.xhtml)","title":"gl.drawElementsInstancedBaseVertexBaseInstance/7","ref":"gl.html#drawElementsInstancedBaseVertexBaseInstance/7"},{"type":"function","doc":"[`gl:drawPixels/5`](`drawPixels/5`) reads pixel data from memory and writes it\ninto the frame buffer relative to the current raster position, provided that the\nraster position is valid. Use [`gl:rasterPos()`](`rasterPos2d/2`) or\n[`gl:windowPos()`](`windowPos2d/2`) to set the current raster position; use\n[`gl:get()`](`getBooleanv/1`) with argument `?GL_CURRENT_RASTER_POSITION_VALID`\nto determine if the specified raster position is valid, and\n[`gl:get()`](`getBooleanv/1`) with argument `?GL_CURRENT_RASTER_POSITION` to\nquery the raster position.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glDrawPixels.xml)","title":"gl.drawPixels/5","ref":"gl.html#drawPixels/5"},{"type":"function","doc":"[`gl:drawRangeElements/6`](`drawRangeElements/6`) is a restricted form of\n[`gl:drawElements/4`](`drawElements/4`). `Mode`, and `Count` match the\ncorresponding arguments to [`gl:drawElements/4`](`drawElements/4`), with the\nadditional constraint that all values in the arrays `Count` must lie between\n`Start` and `End`, inclusive.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawRangeElements.xhtml)","title":"gl.drawRangeElements/6","ref":"gl.html#drawRangeElements/6"},{"type":"function","doc":"[`gl:drawRangeElementsBaseVertex/7`](`drawRangeElementsBaseVertex/7`) is a\nrestricted form of [`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`).\n`Mode`, `Count` and `Basevertex` match the corresponding arguments to\n[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`), with the additional\nconstraint that all values in the array `Indices` must lie between `Start` and\n`End`, inclusive, prior to adding `Basevertex`. Index values lying outside the\nrange [`Start`, `End`] are treated in the same way as\n[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`). The `i`th element\ntransferred by the corresponding draw call will be taken from element\n`Indices`\\[i] + `Basevertex` of each enabled array. If the resulting value is\nlarger than the maximum value representable by `Type`, it is as if the\ncalculation were upconverted to 32-bit unsigned integers (with wrapping on\noverflow conditions). The operation is undefined if the sum would be negative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawRangeElementsBaseVertex.xhtml)","title":"gl.drawRangeElementsBaseVertex/7","ref":"gl.html#drawRangeElementsBaseVertex/7"},{"type":"function","doc":"[`gl:drawTransformFeedback/2`](`drawTransformFeedback/2`) draws primitives of a\ntype specified by `Mode` using a count retrieved from the transform feedback\nspecified by `Id`. Calling\n[`gl:drawTransformFeedback/2`](`drawTransformFeedback/2`) is equivalent to\ncalling [`gl:drawArrays/3`](`drawArrays/3`) with `Mode` as specified, `First`\nset to zero, and `Count` set to the number of vertices captured on vertex stream\nzero the last time transform feedback was active on the transform feedback\nobject named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedback.xhtml)","title":"gl.drawTransformFeedback/2","ref":"gl.html#drawTransformFeedback/2"},{"type":"function","doc":"[`gl:drawTransformFeedbackInstanced/3`](`drawTransformFeedbackInstanced/3`)\ndraws multiple copies of a range of primitives of a type specified by `Mode`\nusing a count retrieved from the transform feedback stream specified by `Stream`\nof the transform feedback object specified by `Id`. Calling\n[`gl:drawTransformFeedbackInstanced/3`](`drawTransformFeedbackInstanced/3`) is\nequivalent to calling [`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`) with\n`Mode` and `Instancecount` as specified, `First` set to zero, and `Count` set to\nthe number of vertices captured on vertex stream zero the last time transform\nfeedback was active on the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackInstanced.xhtml)","title":"gl.drawTransformFeedbackInstanced/3","ref":"gl.html#drawTransformFeedbackInstanced/3"},{"type":"function","doc":"[`gl:drawTransformFeedbackStream/3`](`drawTransformFeedbackStream/3`) draws\nprimitives of a type specified by `Mode` using a count retrieved from the\ntransform feedback stream specified by `Stream` of the transform feedback object\nspecified by `Id`. Calling\n[`gl:drawTransformFeedbackStream/3`](`drawTransformFeedbackStream/3`) is\nequivalent to calling [`gl:drawArrays/3`](`drawArrays/3`) with `Mode` as\nspecified, `First` set to zero, and `Count` set to the number of vertices\ncaptured on vertex stream `Stream` the last time transform feedback was active\non the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackStream.xhtml)","title":"gl.drawTransformFeedbackStream/3","ref":"gl.html#drawTransformFeedbackStream/3"},{"type":"function","doc":"[`gl:drawTransformFeedbackStreamInstanced/4`](`drawTransformFeedbackStreamInstanced/4`)\ndraws multiple copies of a range of primitives of a type specified by `Mode`\nusing a count retrieved from the transform feedback stream specified by `Stream`\nof the transform feedback object specified by `Id`. Calling\n[`gl:drawTransformFeedbackStreamInstanced/4`](`drawTransformFeedbackStreamInstanced/4`)\nis equivalent to calling [`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`)\nwith `Mode` and `Instancecount` as specified, `First` set to zero, and `Count`\nset to the number of vertices captured on vertex stream `Stream` the last time\ntransform feedback was active on the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackStreamInstanced.xhtml)","title":"gl.drawTransformFeedbackStreamInstanced/4","ref":"gl.html#drawTransformFeedbackStreamInstanced/4"},{"type":"function","doc":"","title":"gl.edgeFlag/1","ref":"gl.html#edgeFlag/1"},{"type":"function","doc":"[`gl:edgeFlagPointer/2`](`edgeFlagPointer/2`) specifies the location and data\nformat of an array of boolean edge flags to use when rendering. `Stride`\nspecifies the byte stride from one edge flag to the next, allowing vertices and\nattributes to be packed into a single array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEdgeFlagPointer.xml)","title":"gl.edgeFlagPointer/2","ref":"gl.html#edgeFlagPointer/2"},{"type":"function","doc":"Each vertex of a polygon, separate triangle, or separate quadrilateral specified\nbetween a [`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pair is\nmarked as the start of either a boundary or nonboundary edge. If the current\nedge flag is true when the vertex is specified, the vertex is marked as the\nstart of a boundary edge. Otherwise, the vertex is marked as the start of a\nnonboundary edge. [`gl:edgeFlag/1`](`edgeFlag/1`) sets the edge flag bit to\n`?GL_TRUE` if `Flag` is `?GL_TRUE` and to `?GL_FALSE` otherwise.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEdgeFlag.xml)","title":"gl.edgeFlagv/1","ref":"gl.html#edgeFlagv/1"},{"type":"function","doc":"","title":"gl.enable/1","ref":"gl.html#enable/1"},{"type":"function","doc":"[`gl:enableClientState/1`](`enableClientState/1`) and\n[`gl:disableClientState/1`](`enableClientState/1`) enable or disable individual\nclient-side capabilities. By default, all client-side capabilities are disabled.\nBoth [`gl:enableClientState/1`](`enableClientState/1`) and\n[`gl:disableClientState/1`](`enableClientState/1`) take a single argument,\n`Cap`, which can assume one of the following values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEnableClientState.xml)","title":"gl.enableClientState/1","ref":"gl.html#enableClientState/1"},{"type":"function","doc":"[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) enable and disable\nvarious capabilities. Use [`gl:isEnabled/1`](`isEnabled/1`) or\n[`gl:get()`](`getBooleanv/1`) to determine the current setting of any\ncapability. The initial value for each capability with the exception of\n`?GL_DITHER` and `?GL_MULTISAMPLE` is `?GL_FALSE`. The initial value for\n`?GL_DITHER` and `?GL_MULTISAMPLE` is `?GL_TRUE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnable.xhtml)","title":"gl.enablei/2","ref":"gl.html#enablei/2"},{"type":"function","doc":"","title":"gl.enableVertexArrayAttrib/2","ref":"gl.html#enableVertexArrayAttrib/2"},{"type":"function","doc":"[`gl:enableVertexAttribArray/1`](`enableVertexAttribArray/1`) and\n[`gl:enableVertexArrayAttrib/2`](`disableVertexAttribArray/1`) enable the\ngeneric vertex attribute array specified by `Index`.\n[`gl:enableVertexAttribArray/1`](`enableVertexAttribArray/1`) uses currently\nbound vertex array object for the operation, whereas\n[`gl:enableVertexArrayAttrib/2`](`disableVertexAttribArray/1`) updates state of\nthe vertex array object with ID `Vaobj`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnableVertexAttribArray.xhtml)","title":"gl.enableVertexAttribArray/1","ref":"gl.html#enableVertexAttribArray/1"},{"type":"function","doc":"[`gl:'begin'/1`](`'begin'/1`) and [`gl:'end'/0`](`'begin'/1`) delimit the\nvertices that define a primitive or a group of like primitives.\n[`gl:'begin'/1`](`'begin'/1`) accepts a single argument that specifies in which\nof ten ways the vertices are interpreted. Taking n as an integer count starting\nat one, and N as the total number of vertices specified, the interpretations are\nas follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBegin.xml)","title":"gl.end/0","ref":"gl.html#end/0"},{"type":"function","doc":"Conditional rendering is started using\n[`gl:beginConditionalRender/2`](`beginConditionalRender/2`) and ended using\n[`gl:endConditionalRender/0`](`beginConditionalRender/2`). During conditional\nrendering, all vertex array commands, as well as [`gl:clear/1`](`clear/1`) and\n[`gl:clearBuffer()`](`clearBufferiv/3`) have no effect if the\n(`?GL_SAMPLES_PASSED`) result of the query object `Id` is zero, or if the\n(`?GL_ANY_SAMPLES_PASSED`) result is `?GL_FALSE`. The results of commands\nsetting the current vertex state, such as\n[`gl:vertexAttrib()`](`vertexAttrib1d/2`) are undefined. If the\n(`?GL_SAMPLES_PASSED`) result is non-zero or if the (`?GL_ANY_SAMPLES_PASSED`)\nresult is `?GL_TRUE`, such commands are not discarded. The `Id` parameter to\n[`gl:beginConditionalRender/2`](`beginConditionalRender/2`) must be the name of\na query object previously returned from a call to\n[`gl:genQueries/1`](`genQueries/1`). `Mode` specifies how the results of the\nquery object are to be interpreted. If `Mode` is `?GL_QUERY_WAIT`, the GL waits\nfor the results of the query to be available and then uses the results to\ndetermine if subsequent rendering commands are discarded. If `Mode` is\n`?GL_QUERY_NO_WAIT`, the GL may choose to unconditionally execute the subsequent\nrendering commands without waiting for the query to complete.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginConditionalRender.xhtml)","title":"gl.endConditionalRender/0","ref":"gl.html#endConditionalRender/0"},{"type":"function","doc":"","title":"gl.endList/0","ref":"gl.html#endList/0"},{"type":"function","doc":"[`gl:beginQuery/2`](`beginQuery/2`) and [`gl:endQuery/1`](`beginQuery/2`)\ndelimit the boundaries of a query object. `Query` must be a name previously\nreturned from a call to [`gl:genQueries/1`](`genQueries/1`). If a query object\nwith name `Id` does not yet exist it is created with the type determined by\n`Target`. `Target` must be one of `?GL_SAMPLES_PASSED`,\n`?GL_ANY_SAMPLES_PASSED`, `?GL_PRIMITIVES_GENERATED`,\n`?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN`, or `?GL_TIME_ELAPSED`. The behavior\nof the query object depends on its type and is as follows.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginQuery.xhtml)","title":"gl.endQuery/1","ref":"gl.html#endQuery/1"},{"type":"function","doc":"[`gl:beginQueryIndexed/3`](`beginQueryIndexed/3`) and\n[`gl:endQueryIndexed/2`](`beginQueryIndexed/3`) delimit the boundaries of a\nquery object. `Query` must be a name previously returned from a call to\n[`gl:genQueries/1`](`genQueries/1`). If a query object with name `Id` does not\nyet exist it is created with the type determined by `Target`. `Target` must be\none of `?GL_SAMPLES_PASSED`, `?GL_ANY_SAMPLES_PASSED`,\n`?GL_PRIMITIVES_GENERATED`, `?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN`, or\n`?GL_TIME_ELAPSED`. The behavior of the query object depends on its type and is\nas follows.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginQueryIndexed.xhtml)","title":"gl.endQueryIndexed/2","ref":"gl.html#endQueryIndexed/2"},{"type":"function","doc":"Transform feedback mode captures the values of varying variables written by the\nvertex shader (or, if active, the geometry shader). Transform feedback is said\nto be active after a call to\n[`gl:beginTransformFeedback/1`](`beginTransformFeedback/1`) until a subsequent\ncall to [`gl:endTransformFeedback/0`](`beginTransformFeedback/1`). Transform\nfeedback commands must be paired.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginTransformFeedback.xhtml)","title":"gl.endTransformFeedback/0","ref":"gl.html#endTransformFeedback/0"},{"type":"function","doc":"","title":"gl.evalCoord1d/1","ref":"gl.html#evalCoord1d/1"},{"type":"function","doc":"","title":"gl.evalCoord1dv/1","ref":"gl.html#evalCoord1dv/1"},{"type":"function","doc":"","title":"gl.evalCoord1f/1","ref":"gl.html#evalCoord1f/1"},{"type":"function","doc":"","title":"gl.evalCoord1fv/1","ref":"gl.html#evalCoord1fv/1"},{"type":"function","doc":"","title":"gl.evalCoord2d/2","ref":"gl.html#evalCoord2d/2"},{"type":"function","doc":"","title":"gl.evalCoord2dv/1","ref":"gl.html#evalCoord2dv/1"},{"type":"function","doc":"","title":"gl.evalCoord2f/2","ref":"gl.html#evalCoord2f/2"},{"type":"function","doc":"[`gl:evalCoord1()`](`evalCoord1d/1`) evaluates enabled one-dimensional maps at\nargument `U`. [`gl:evalCoord2()`](`evalCoord1d/1`) does the same for\ntwo-dimensional maps using two domain values, `U` and `V`. To define a map, call\n`glMap1` and `glMap2`; to enable and disable it, call\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalCoord.xml)","title":"gl.evalCoord2fv/1","ref":"gl.html#evalCoord2fv/1"},{"type":"function","doc":"","title":"gl.evalMesh1/3","ref":"gl.html#evalMesh1/3"},{"type":"function","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used in\ntandem to efficiently generate and evaluate a series of evenly-spaced map domain\nvalues. [`gl:evalMesh()`](`evalMesh1/3`) steps through the integer domain of a\none- or two-dimensional grid, whose range is the domain of the evaluation maps\nspecified by `glMap1` and `glMap2`. `Mode` determines whether the resulting\nvertices are connected as points, lines, or filled polygons.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalMesh.xml)","title":"gl.evalMesh2/5","ref":"gl.html#evalMesh2/5"},{"type":"function","doc":"","title":"gl.evalPoint1/1","ref":"gl.html#evalPoint1/1"},{"type":"function","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used in\ntandem to efficiently generate and evaluate a series of evenly spaced map domain\nvalues. [`gl:evalPoint()`](`evalPoint1/1`) can be used to evaluate a single grid\npoint in the same gridspace that is traversed by\n[`gl:evalMesh()`](`evalMesh1/3`). Calling [`gl:evalPoint1/1`](`evalPoint1/1`) is\nequivalent to calling glEvalCoord1( i.ð u+u 1 ); where ð u=(u 2-u 1)/n\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalPoint.xml)","title":"gl.evalPoint2/2","ref":"gl.html#evalPoint2/2"},{"type":"function","doc":"The [`gl:feedbackBuffer/3`](`feedbackBuffer/3`) function controls feedback.\nFeedback, like selection, is a GL mode. The mode is selected by calling\n[`gl:renderMode/1`](`renderMode/1`) with `?GL_FEEDBACK`. When the GL is in\nfeedback mode, no pixels are produced by rasterization. Instead, information\nabout primitives that would have been rasterized is fed back to the application\nusing the GL.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFeedbackBuffer.xml)","title":"gl.feedbackBuffer/3","ref":"gl.html#feedbackBuffer/3"},{"type":"function","doc":"[`gl:fenceSync/2`](`fenceSync/2`) creates a new fence sync object, inserts a\nfence command into the GL command stream and associates it with that sync\nobject, and returns a non-zero name corresponding to the sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFenceSync.xhtml)","title":"gl.fenceSync/2","ref":"gl.html#fenceSync/2"},{"type":"function","doc":"[`gl:finish/0`](`finish/0`) does not return until the effects of all previously\ncalled GL commands are complete. Such effects include all changes to GL state,\nall changes to connection state, and all changes to the frame buffer contents.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFinish.xhtml)","title":"gl.finish/0","ref":"gl.html#finish/0"},{"type":"function","doc":"Different GL implementations buffer commands in several different locations,\nincluding network buffers and the graphics accelerator itself.\n[`gl:flush/0`](`flush/0`) empties all of these buffers, causing all issued\ncommands to be executed as quickly as they are accepted by the actual rendering\nengine. Though this execution may not be completed in any particular time\nperiod, it does complete in finite time.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFlush.xhtml)","title":"gl.flush/0","ref":"gl.html#flush/0"},{"type":"function","doc":"","title":"gl.flushMappedBufferRange/3","ref":"gl.html#flushMappedBufferRange/3"},{"type":"function","doc":"[`gl:flushMappedBufferRange/3`](`flushMappedBufferRange/3`) indicates that\nmodifications have been made to a range of a mapped buffer object. The buffer\nobject must previously have been mapped with the `?GL_MAP_FLUSH_EXPLICIT_BIT`\nflag.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFlushMappedBufferRange.xhtml)","title":"gl.flushMappedNamedBufferRange/3","ref":"gl.html#flushMappedNamedBufferRange/3"},{"type":"function","doc":"","title":"gl.fogCoordd/1","ref":"gl.html#fogCoordd/1"},{"type":"function","doc":"","title":"gl.fogCoorddv/1","ref":"gl.html#fogCoorddv/1"},{"type":"function","doc":"","title":"gl.fogCoordf/1","ref":"gl.html#fogCoordf/1"},{"type":"function","doc":"[`gl:fogCoord()`](`fogCoordf/1`) specifies the fog coordinate that is associated\nwith each vertex and the current raster position. The value specified is\ninterpolated and used in computing the fog color (see [`gl:fog()`](`fogf/2`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFogCoord.xml)","title":"gl.fogCoordfv/1","ref":"gl.html#fogCoordfv/1"},{"type":"function","doc":"[`gl:fogCoordPointer/3`](`fogCoordPointer/3`) specifies the location and data\nformat of an array of fog coordinates to use when rendering. `Type` specifies\nthe data type of each fog coordinate, and `Stride` specifies the byte stride\nfrom one fog coordinate to the next, allowing vertices and attributes to be\npacked into a single array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFogCoordPointer.xml)","title":"gl.fogCoordPointer/3","ref":"gl.html#fogCoordPointer/3"},{"type":"function","doc":"","title":"gl.fogf/2","ref":"gl.html#fogf/2"},{"type":"function","doc":"","title":"gl.fogfv/2","ref":"gl.html#fogfv/2"},{"type":"function","doc":"","title":"gl.fogi/2","ref":"gl.html#fogi/2"},{"type":"function","doc":"Fog is initially disabled. While enabled, fog affects rasterized geometry,\nbitmaps, and pixel blocks, but not buffer clear operations. To enable and\ndisable fog, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_FOG`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFog.xml)","title":"gl.fogiv/2","ref":"gl.html#fogiv/2"},{"type":"function","doc":"[`gl:framebufferParameteri/3`](`framebufferParameteri/3`) and\n`glNamedFramebufferParameteri` modify the value of the parameter named `Pname`\nin the specified framebuffer object. There are no modifiable parameters of the\ndefault draw and read framebuffer, so they are not valid targets of these\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferParameteri.xhtml)","title":"gl.framebufferParameteri/3","ref":"gl.html#framebufferParameteri/3"},{"type":"function","doc":"[`gl:framebufferRenderbuffer/4`](`framebufferRenderbuffer/4`) and\n`glNamedFramebufferRenderbuffer` attaches a renderbuffer as one of the logical\nbuffers of the specified framebuffer object. Renderbuffers cannot be attached to\nthe default draw and read framebuffer, so they are not valid targets of these\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferRenderbuffer.xhtml)","title":"gl.framebufferRenderbuffer/4","ref":"gl.html#framebufferRenderbuffer/4"},{"type":"function","doc":"","title":"gl.framebufferTexture1D/5","ref":"gl.html#framebufferTexture1D/5"},{"type":"function","doc":"","title":"gl.framebufferTexture2D/5","ref":"gl.html#framebufferTexture2D/5"},{"type":"function","doc":"","title":"gl.framebufferTexture3D/6","ref":"gl.html#framebufferTexture3D/6"},{"type":"function","doc":"","title":"gl.framebufferTexture/4","ref":"gl.html#framebufferTexture/4"},{"type":"function","doc":"","title":"gl.framebufferTextureFaceARB/5","ref":"gl.html#framebufferTextureFaceARB/5"},{"type":"function","doc":"These commands attach a selected mipmap level or image of a texture object as\none of the logical buffers of the specified framebuffer object. Textures cannot\nbe attached to the default draw and read framebuffer, so they are not valid\ntargets of these commands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferTexture.xhtml)","title":"gl.framebufferTextureLayer/5","ref":"gl.html#framebufferTextureLayer/5"},{"type":"function","doc":"In a scene composed entirely of opaque closed surfaces, back-facing polygons are\nnever visible. Eliminating these invisible polygons has the obvious benefit of\nspeeding up the rendering of the image. To enable and disable elimination of\nback-facing polygons, call [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) with argument `?GL_CULL_FACE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFrontFace.xhtml)","title":"gl.frontFace/1","ref":"gl.html#frontFace/1"},{"type":"function","doc":"[`gl:frustum/6`](`frustum/6`) describes a perspective matrix that produces a\nperspective projection. The current matrix (see\n[`gl:matrixMode/1`](`matrixMode/1`)) is multiplied by this matrix and the result\nreplaces the current matrix, as if [`gl:multMatrix()`](`multMatrixd/1`) were\ncalled with the following matrix as its argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml)","title":"gl.frustum/6","ref":"gl.html#frustum/6"},{"type":"function","doc":"[`gl:genBuffers/1`](`genBuffers/1`) returns `N` buffer object names in\n`Buffers`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genBuffers/1`](`genBuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenBuffers.xhtml)","title":"gl.genBuffers/1","ref":"gl.html#genBuffers/1"},{"type":"function","doc":"","title":"gl.generateMipmap/1","ref":"gl.html#generateMipmap/1"},{"type":"function","doc":"[`gl:generateMipmap/1`](`generateMipmap/1`) and\n[`gl:generateTextureMipmap/1`](`generateMipmap/1`) generates mipmaps for the\nspecified texture object. For [`gl:generateMipmap/1`](`generateMipmap/1`), the\ntexture object that is bound to `Target`. For\n[`gl:generateTextureMipmap/1`](`generateMipmap/1`), `Texture` is the name of the\ntexture object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenerateMipmap.xhtml)","title":"gl.generateTextureMipmap/1","ref":"gl.html#generateTextureMipmap/1"},{"type":"function","doc":"[`gl:genFramebuffers/1`](`genFramebuffers/1`) returns `N` framebuffer object\nnames in `Ids`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genFramebuffers/1`](`genFramebuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenFramebuffers.xhtml)","title":"gl.genFramebuffers/1","ref":"gl.html#genFramebuffers/1"},{"type":"function","doc":"[`gl:genLists/1`](`genLists/1`) has one argument, `Range`. It returns an integer\n`n` such that `Range` contiguous empty display lists, named n, n+1, ...,\nn+range-1, are created. If `Range` is 0, if there is no group of `Range`\ncontiguous names available, or if any error is generated, no display lists are\ngenerated, and 0 is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGenLists.xml)","title":"gl.genLists/1","ref":"gl.html#genLists/1"},{"type":"function","doc":"[`gl:genProgramPipelines/1`](`genProgramPipelines/1`) returns `N` previously\nunused program pipeline object names in `Pipelines`. These names are marked as\nused, for the purposes of [`gl:genProgramPipelines/1`](`genProgramPipelines/1`)\nonly, but they acquire program pipeline state only when they are first bound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenProgramPipelines.xhtml)","title":"gl.genProgramPipelines/1","ref":"gl.html#genProgramPipelines/1"},{"type":"function","doc":"[`gl:genQueries/1`](`genQueries/1`) returns `N` query object names in `Ids`.\nThere is no guarantee that the names form a contiguous set of integers; however,\nit is guaranteed that none of the returned names was in use immediately before\nthe call to [`gl:genQueries/1`](`genQueries/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenQueries.xhtml)","title":"gl.genQueries/1","ref":"gl.html#genQueries/1"},{"type":"function","doc":"[`gl:genRenderbuffers/1`](`genRenderbuffers/1`) returns `N` renderbuffer object\nnames in `Renderbuffers`. There is no guarantee that the names form a contiguous\nset of integers; however, it is guaranteed that none of the returned names was\nin use immediately before the call to\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenRenderbuffers.xhtml)","title":"gl.genRenderbuffers/1","ref":"gl.html#genRenderbuffers/1"},{"type":"function","doc":"[`gl:genSamplers/1`](`genSamplers/1`) returns `N` sampler object names in\n`Samplers`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genSamplers/1`](`genSamplers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenSamplers.xhtml)","title":"gl.genSamplers/1","ref":"gl.html#genSamplers/1"},{"type":"function","doc":"[`gl:genTextures/1`](`genTextures/1`) returns `N` texture names in `Textures`.\nThere is no guarantee that the names form a contiguous set of integers; however,\nit is guaranteed that none of the returned names was in use immediately before\nthe call to [`gl:genTextures/1`](`genTextures/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenTextures.xhtml)","title":"gl.genTextures/1","ref":"gl.html#genTextures/1"},{"type":"function","doc":"[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`) returns `N` previously\nunused transform feedback object names in `Ids`. These names are marked as used,\nfor the purposes of [`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`)\nonly, but they acquire transform feedback state only when they are first bound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenTransformFeedbacks.xhtml)","title":"gl.genTransformFeedbacks/1","ref":"gl.html#genTransformFeedbacks/1"},{"type":"function","doc":"[`gl:genVertexArrays/1`](`genVertexArrays/1`) returns `N` vertex array object\nnames in `Arrays`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genVertexArrays/1`](`genVertexArrays/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenVertexArrays.xhtml)","title":"gl.genVertexArrays/1","ref":"gl.html#genVertexArrays/1"},{"type":"function","doc":"[`gl:getActiveAttrib/3`](`getActiveAttrib/3`) returns information about an\nactive attribute variable in the program object specified by `Program`. The\nnumber of active attributes can be obtained by calling\n[`gl:getProgram()`](`getProgramiv/2`) with the value `?GL_ACTIVE_ATTRIBUTES`. A\nvalue of 0 for `Index` selects the first active attribute variable. Permissible\nvalues for `Index` range from zero to the number of active attribute variables\nminus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveAttrib.xhtml)","title":"gl.getActiveAttrib/3","ref":"gl.html#getActiveAttrib/3"},{"type":"function","doc":"[`gl:getActiveSubroutineName/4`](`getActiveSubroutineName/4`) queries the name\nof an active shader subroutine uniform from the program object given in\n`Program`. `Index` specifies the index of the shader subroutine uniform within\nthe shader stage given by `Stage`, and must between zero and the value of\n`?GL_ACTIVE_SUBROUTINES` minus one for the shader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveSubroutineName.xhtml)","title":"gl.getActiveSubroutineName/4","ref":"gl.html#getActiveSubroutineName/4"},{"type":"function","doc":"[`gl:getActiveSubroutineUniformName/4`](`getActiveSubroutineUniformName/4`)\nretrieves the name of an active shader subroutine uniform. `Program` contains\nthe name of the program containing the uniform. `Shadertype` specifies the stage\nfor which the uniform location, given by `Index`, is valid. `Index` must be\nbetween zero and the value of `?GL_ACTIVE_SUBROUTINE_UNIFORMS` minus one for the\nshader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveSubroutineUniformName.xhtml)","title":"gl.getActiveSubroutineUniformName/4","ref":"gl.html#getActiveSubroutineUniformName/4"},{"type":"function","doc":"[`gl:getActiveUniform/3`](`getActiveUniform/3`) returns information about an\nactive uniform variable in the program object specified by `Program`. The number\nof active uniform variables can be obtained by calling\n[`gl:getProgram()`](`getProgramiv/2`) with the value `?GL_ACTIVE_UNIFORMS`. A\nvalue of 0 for `Index` selects the first active uniform variable. Permissible\nvalues for `Index` range from zero to the number of active uniform variables\nminus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniform.xhtml)","title":"gl.getActiveUniform/3","ref":"gl.html#getActiveUniform/3"},{"type":"function","doc":"[`gl:getActiveUniformBlockiv/4`](`getActiveUniformBlockiv/4`) retrieves\ninformation about an active uniform block within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformBlock.xhtml)","title":"gl.getActiveUniformBlockiv/4","ref":"gl.html#getActiveUniformBlockiv/4"},{"type":"function","doc":"[`gl:getActiveUniformBlockName/3`](`getActiveUniformBlockName/3`) retrieves the\nname of the active uniform block at `UniformBlockIndex` within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformBlockName.xhtml)","title":"gl.getActiveUniformBlockName/3","ref":"gl.html#getActiveUniformBlockName/3"},{"type":"function","doc":"[`gl:getActiveUniformName/3`](`getActiveUniformName/3`) returns the name of the\nactive uniform at `UniformIndex` within `Program`. If `UniformName` is not NULL,\nup to `BufSize` characters (including a nul-terminator) will be written into the\narray whose address is specified by `UniformName`. If `Length` is not NULL, the\nnumber of characters that were (or would have been) written into `UniformName`\n(not including the nul-terminator) will be placed in the variable whose address\nis specified in `Length`. If `Length` is NULL, no length is returned. The length\nof the longest uniform name in `Program` is given by the value of\n`?GL_ACTIVE_UNIFORM_MAX_LENGTH`, which can be queried with\n[`gl:getProgram()`](`getProgramiv/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformName.xhtml)","title":"gl.getActiveUniformName/3","ref":"gl.html#getActiveUniformName/3"},{"type":"function","doc":"[`gl:getActiveUniformsiv/3`](`getActiveUniformsiv/3`) queries the value of the\nparameter named `Pname` for each of the uniforms within `Program` whose indices\nare specified in the array of `UniformCount` unsigned integers `UniformIndices`.\nUpon success, the value of the parameter for each uniform is written into the\ncorresponding entry in the array whose address is given in `Params`. If an error\nis generated, nothing is written into `Params`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformsiv.xhtml)","title":"gl.getActiveUniformsiv/3","ref":"gl.html#getActiveUniformsiv/3"},{"type":"function","doc":"[`gl:getAttachedShaders/2`](`getAttachedShaders/2`) returns the names of the\nshader objects attached to `Program`. The names of shader objects that are\nattached to `Program` will be returned in `Shaders.` The actual number of shader\nnames written into `Shaders` is returned in `Count.` If no shader objects are\nattached to `Program`, `Count` is set to 0. The maximum number of shader names\nthat may be returned in `Shaders` is specified by `MaxCount`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetAttachedShaders.xhtml)","title":"gl.getAttachedShaders/2","ref":"gl.html#getAttachedShaders/2"},{"type":"function","doc":"[`gl:getAttribLocation/2`](`getAttribLocation/2`) queries the previously linked\nprogram object specified by `Program` for the attribute variable specified by\n`Name` and returns the index of the generic vertex attribute that is bound to\nthat attribute variable. If `Name` is a matrix attribute variable, the index of\nthe first column of the matrix is returned. If the named attribute variable is\nnot an active attribute in the specified program object or if `Name` starts with\nthe reserved prefix \"gl\\_\", a value of -1 is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetAttribLocation.xhtml)","title":"gl.getAttribLocation/2","ref":"gl.html#getAttribLocation/2"},{"type":"function","doc":"","title":"gl.getBooleani_v/2","ref":"gl.html#getBooleani_v/2"},{"type":"function","doc":"","title":"gl.getBooleanv/1","ref":"gl.html#getBooleanv/1"},{"type":"function","doc":"","title":"gl.getBufferParameteri64v/2","ref":"gl.html#getBufferParameteri64v/2"},{"type":"function","doc":"[`gl:getBufferParameteriv/2`](`getBufferParameteriv/2`) returns in `Data` a\nselected parameter of the buffer object specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetBufferParameteriv.xml)","title":"gl.getBufferParameteriv/2","ref":"gl.html#getBufferParameteriv/2"},{"type":"function","doc":"These functions return in `Data` a selected parameter of the specified buffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetBufferParameter.xhtml)","title":"gl.getBufferParameterivARB/2","ref":"gl.html#getBufferParameterivARB/2"},{"type":"function","doc":"[`gl:getBufferSubData/4`](`getBufferSubData/4`) and `glGetNamedBufferSubData`\nreturn some or all of the data contents of the data store of the specified\nbuffer object. Data starting at byte offset `Offset` and extending for `Size`\nbytes is copied from the buffer object's data store to the memory pointed to by\n`Data`. An error is thrown if the buffer object is currently mapped, or if\n`Offset` and `Size` together define a range beyond the bounds of the buffer\nobject's data store.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetBufferSubData.xhtml)","title":"gl.getBufferSubData/4","ref":"gl.html#getBufferSubData/4"},{"type":"function","doc":"[`gl:getClipPlane/1`](`getClipPlane/1`) returns in `Equation` the four\ncoefficients of the plane equation for `Plane`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetClipPlane.xml)","title":"gl.getClipPlane/1","ref":"gl.html#getClipPlane/1"},{"type":"function","doc":"[`gl:getColorTable/4`](`getColorTable/4`) returns in `Table` the contents of the\ncolor table specified by `Target`. No pixel transfer operations are performed,\nbut pixel storage modes that are applicable to\n[`gl:readPixels/7`](`readPixels/7`) are performed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetColorTable.xml)","title":"gl.getColorTable/4","ref":"gl.html#getColorTable/4"},{"type":"function","doc":"","title":"gl.getColorTableParameterfv/2","ref":"gl.html#getColorTableParameterfv/2"},{"type":"function","doc":"Returns parameters specific to color table `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetColorTableParameter.xml)","title":"gl.getColorTableParameteriv/2","ref":"gl.html#getColorTableParameteriv/2"},{"type":"function","doc":"[`gl:getCompressedTexImage/3`](`getCompressedTexImage/3`) and\n`glGetnCompressedTexImage` return the compressed texture image associated with\n`Target` and `Lod` into `Pixels`. `glGetCompressedTextureImage` serves the same\npurpose, but instead of taking a texture target, it takes the ID of the texture\nobject. `Pixels` should be an array of `BufSize` bytes for\n`glGetnCompresedTexImage` and `glGetCompressedTextureImage` functions, and of\n`?GL_TEXTURE_COMPRESSED_IMAGE_SIZE` bytes in case of\n[`gl:getCompressedTexImage/3`](`getCompressedTexImage/3`). If the actual data\ntakes less space than `BufSize`, the remaining bytes will not be touched.\n`Target` specifies the texture target, to which the texture the data the\nfunction should extract the data from is bound to. `Lod` specifies the\nlevel-of-detail number of the desired image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetCompressedTexImage.xhtml)","title":"gl.getCompressedTexImage/3","ref":"gl.html#getCompressedTexImage/3"},{"type":"function","doc":"[`gl:getConvolutionFilter/4`](`getConvolutionFilter/4`) returns the current 1D\nor 2D convolution filter kernel as an image. The one- or two-dimensional image\nis placed in `Image` according to the specifications in `Format` and `Type`. No\npixel transfer operations are performed on this image, but the relevant pixel\nstorage modes are applied.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetConvolutionFilter.xml)","title":"gl.getConvolutionFilter/4","ref":"gl.html#getConvolutionFilter/4"},{"type":"function","doc":"","title":"gl.getConvolutionParameterfv/2","ref":"gl.html#getConvolutionParameterfv/2"},{"type":"function","doc":"[`gl:getConvolutionParameter()`](`getConvolutionParameterfv/2`) retrieves\nconvolution parameters. `Target` determines which convolution filter is queried.\n`Pname` determines which parameter is returned:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetConvolutionParameter.xml)","title":"gl.getConvolutionParameteriv/2","ref":"gl.html#getConvolutionParameteriv/2"},{"type":"function","doc":"[`gl:getDebugMessageLog/2`](`getDebugMessageLog/2`) retrieves messages from the\ndebug message log. A maximum of `Count` messages are retrieved from the log. If\n`Sources` is not NULL then the source of each message is written into up to\n`Count` elements of the array. If `Types` is not NULL then the type of each\nmessage is written into up to `Count` elements of the array. If `Id` is not NULL\nthen the identifier of each message is written into up to `Count` elements of\nthe array. If `Severities` is not NULL then the severity of each message is\nwritten into up to `Count` elements of the array. If `Lengths` is not NULL then\nthe length of each message is written into up to `Count` elements of the array.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetDebugMessageLog.xhtml)","title":"gl.getDebugMessageLog/2","ref":"gl.html#getDebugMessageLog/2"},{"type":"function","doc":"","title":"gl.getDoublei_v/2","ref":"gl.html#getDoublei_v/2"},{"type":"function","doc":"","title":"gl.getDoublev/1","ref":"gl.html#getDoublev/1"},{"type":"function","doc":"[`gl:getError/0`](`getError/0`) returns the value of the error flag. Each\ndetectable error is assigned a numeric code and symbolic name. When an error\noccurs, the error flag is set to the appropriate error code value. No other\nerrors are recorded until [`gl:getError/0`](`getError/0`) is called, the error\ncode is returned, and the flag is reset to `?GL_NO_ERROR`. If a call to\n[`gl:getError/0`](`getError/0`) returns `?GL_NO_ERROR`, there has been no\ndetectable error since the last call to [`gl:getError/0`](`getError/0`), or\nsince the GL was initialized.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml)","title":"gl.getError/0","ref":"gl.html#getError/0"},{"type":"function","doc":"","title":"gl.getFloati_v/2","ref":"gl.html#getFloati_v/2"},{"type":"function","doc":"","title":"gl.getFloatv/1","ref":"gl.html#getFloatv/1"},{"type":"function","doc":"[`gl:getFragDataIndex/2`](`getFragDataIndex/2`) returns the index of the\nfragment color to which the variable `Name` was bound when the program object\n`Program` was last linked. If `Name` is not a varying out variable of `Program`,\nor if an error occurs, -1 will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFragDataIndex.xhtml)","title":"gl.getFragDataIndex/2","ref":"gl.html#getFragDataIndex/2"},{"type":"function","doc":"[`gl:getFragDataLocation/2`](`getFragDataLocation/2`) retrieves the assigned\ncolor number binding for the user-defined varying out variable `Name` for\nprogram `Program`. `Program` must have previously been linked. `Name` must be a\nnull-terminated string. If `Name` is not the name of an active user-defined\nvarying out fragment shader variable within `Program`, -1 will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFragDataLocation.xhtml)","title":"gl.getFragDataLocation/2","ref":"gl.html#getFragDataLocation/2"},{"type":"function","doc":"[`gl:getFramebufferAttachmentParameteriv/3`](`getFramebufferAttachmentParameteriv/3`)\nand `glGetNamedFramebufferAttachmentParameteriv` return parameters of\nattachments of a specified framebuffer object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFramebufferAttachmentParameter.xhtml)","title":"gl.getFramebufferAttachmentParameteriv/3","ref":"gl.html#getFramebufferAttachmentParameteriv/3"},{"type":"function","doc":"[`gl:getFramebufferParameteriv/2`](`getFramebufferParameteriv/2`) and\n`glGetNamedFramebufferParameteriv` query parameters of a specified framebuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFramebufferParameter.xhtml)","title":"gl.getFramebufferParameteriv/2","ref":"gl.html#getFramebufferParameteriv/2"},{"type":"function","doc":"Certain events can result in a reset of the GL context. Such a reset causes all\ncontext state to be lost and requires the application to recreate all objects in\nthe affected context.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetGraphicsResetStatus.xhtml)","title":"gl.getGraphicsResetStatus/0","ref":"gl.html#getGraphicsResetStatus/0"},{"type":"function","doc":"[`gl:getHistogram/5`](`getHistogram/5`) returns the current histogram table as a\none-dimensional image with the same width as the histogram. No pixel transfer\noperations are performed on this image, but pixel storage modes that are\napplicable to 1D images are honored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetHistogram.xml)","title":"gl.getHistogram/5","ref":"gl.html#getHistogram/5"},{"type":"function","doc":"","title":"gl.getHistogramParameterfv/2","ref":"gl.html#getHistogramParameterfv/2"},{"type":"function","doc":"[`gl:getHistogramParameter()`](`getHistogramParameterfv/2`) is used to query\nparameter values for the current histogram or for a proxy. The histogram state\ninformation may be queried by calling\n[`gl:getHistogramParameter()`](`getHistogramParameterfv/2`) with a `Target` of\n`?GL_HISTOGRAM` (to obtain information for the current histogram table) or\n`?GL_PROXY_HISTOGRAM` (to obtain information from the most recent proxy request)\nand one of the following values for the `Pname` argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetHistogramParameter.xml)","title":"gl.getHistogramParameteriv/2","ref":"gl.html#getHistogramParameteriv/2"},{"type":"function","doc":"","title":"gl.getInteger64i_v/2","ref":"gl.html#getInteger64i_v/2"},{"type":"function","doc":"","title":"gl.getInteger64v/1","ref":"gl.html#getInteger64v/1"},{"type":"function","doc":"","title":"gl.getIntegeri_v/2","ref":"gl.html#getIntegeri_v/2"},{"type":"function","doc":"These commands return values for simple state variables in GL. `Pname` is a\nsymbolic constant indicating the state variable to be returned, and `Data` is a\npointer to an array of the indicated type in which to place the returned data.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGet.xhtml)","title":"gl.getIntegerv/1","ref":"gl.html#getIntegerv/1"},{"type":"function","doc":"","title":"gl.getInternalformati64v/4","ref":"gl.html#getInternalformati64v/4"},{"type":"function","doc":"No documentation available.","title":"gl.getInternalformativ/4","ref":"gl.html#getInternalformativ/4"},{"type":"function","doc":"","title":"gl.getLightfv/2","ref":"gl.html#getLightfv/2"},{"type":"function","doc":"[`gl:getLight()`](`getLightfv/2`) returns in `Params` the value or values of a\nlight source parameter. `Light` names the light and is a symbolic name of the\nform `?GL_LIGHT` i where i ranges from 0 to the value of `?GL_MAX_LIGHTS` \\- 1.\n`?GL_MAX_LIGHTS` is an implementation dependent constant that is greater than or\nequal to eight. `Pname` specifies one of ten light source parameters, again by\nsymbolic name.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetLight.xml)","title":"gl.getLightiv/2","ref":"gl.html#getLightiv/2"},{"type":"function","doc":"","title":"gl.getMapdv/3","ref":"gl.html#getMapdv/3"},{"type":"function","doc":"","title":"gl.getMapfv/3","ref":"gl.html#getMapfv/3"},{"type":"function","doc":"`glMap1` and `glMap2` define evaluators. [`gl:getMap()`](`getMapdv/3`) returns\nevaluator parameters. `Target` chooses a map, `Query` selects a specific\nparameter, and `V` points to storage where the values will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMap.xml)","title":"gl.getMapiv/3","ref":"gl.html#getMapiv/3"},{"type":"function","doc":"","title":"gl.getMaterialfv/2","ref":"gl.html#getMaterialfv/2"},{"type":"function","doc":"[`gl:getMaterial()`](`getMaterialfv/2`) returns in `Params` the value or values\nof parameter `Pname` of material `Face`. Six parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMaterial.xml)","title":"gl.getMaterialiv/2","ref":"gl.html#getMaterialiv/2"},{"type":"function","doc":"[`gl:getMinmax/5`](`getMinmax/5`) returns the accumulated minimum and maximum\npixel values (computed on a per-component basis) in a one-dimensional image of\nwidth 2. The first set of return values are the minima, and the second set of\nreturn values are the maxima. The format of the return values is determined by\n`Format`, and their type is determined by `Types`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMinmax.xml)","title":"gl.getMinmax/5","ref":"gl.html#getMinmax/5"},{"type":"function","doc":"","title":"gl.getMinmaxParameterfv/2","ref":"gl.html#getMinmaxParameterfv/2"},{"type":"function","doc":"[`gl:getMinmaxParameter()`](`getMinmaxParameterfv/2`) retrieves parameters for\nthe current minmax table by setting `Pname` to one of the following values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMinmaxParameter.xml)","title":"gl.getMinmaxParameteriv/2","ref":"gl.html#getMinmaxParameteriv/2"},{"type":"function","doc":"[`gl:getMultisamplefv/2`](`getMultisamplefv/2`) queries the location of a given\nsample. `Pname` specifies the sample parameter to retrieve and must be\n`?GL_SAMPLE_POSITION`. `Index` corresponds to the sample for which the location\nshould be returned. The sample location is returned as two floating-point values\nin `Val[0]` and `Val[1]`, each between 0 and 1, corresponding to the `X` and `Y`\nlocations respectively in the GL pixel space of that sample. (0.5, 0.5) this\ncorresponds to the pixel center. `Index` must be between zero and the value of\n`?GL_SAMPLES` minus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetMultisample.xhtml)","title":"gl.getMultisamplefv/2","ref":"gl.html#getMultisamplefv/2"},{"type":"function","doc":"","title":"gl.getPixelMapfv/2","ref":"gl.html#getPixelMapfv/2"},{"type":"function","doc":"","title":"gl.getPixelMapuiv/2","ref":"gl.html#getPixelMapuiv/2"},{"type":"function","doc":"See the [`gl:pixelMap()`](`pixelMapfv/3`) reference page for a description of\nthe acceptable values for the `Map` parameter.\n[`gl:getPixelMap()`](`getPixelMapfv/2`) returns in `Data` the contents of the\npixel map specified in `Map`. Pixel maps are used during the execution of\n[`gl:readPixels/7`](`readPixels/7`), [`gl:drawPixels/5`](`drawPixels/5`),\n[`gl:copyPixels/5`](`copyPixels/5`), [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`),\n[`gl:texSubImage3D/11`](`texSubImage3D/11`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`), and\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`). to map color indices, stencil\nindices, color components, and depth components to other values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetPixelMap.xml)","title":"gl.getPixelMapusv/2","ref":"gl.html#getPixelMapusv/2"},{"type":"function","doc":"[`gl:getPolygonStipple/0`](`getPolygonStipple/0`) returns to `Pattern` a 32×32\npolygon stipple pattern. The pattern is packed into memory as if\n[`gl:readPixels/7`](`readPixels/7`) with both `height` and `width` of 32, `type`\nof `?GL_BITMAP`, and `format` of `?GL_COLOR_INDEX` were called, and the stipple\npattern were stored in an internal 32×32 color index buffer. Unlike\n[`gl:readPixels/7`](`readPixels/7`), however, pixel transfer operations (shift,\noffset, pixel map) are not applied to the returned stipple image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetPolygonStipple.xml)","title":"gl.getPolygonStipple/0","ref":"gl.html#getPolygonStipple/0"},{"type":"function","doc":"[`gl:getProgramBinary/2`](`getProgramBinary/2`) returns a binary representation\nof the compiled and linked executable for `Program` into the array of bytes\nwhose address is specified in `Binary`. The maximum number of bytes that may be\nwritten into `Binary` is specified by `BufSize`. If the program binary is\ngreater in size than `BufSize` bytes, then an error is generated, otherwise the\nactual number of bytes written into `Binary` is returned in the variable whose\naddress is given by `Length`. If `Length` is `?NULL`, then no length is\nreturned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramBinary.xhtml)","title":"gl.getProgramBinary/2","ref":"gl.html#getProgramBinary/2"},{"type":"function","doc":"[`gl:getProgramInfoLog/2`](`getProgramInfoLog/2`) returns the information log\nfor the specified program object. The information log for a program object is\nmodified when the program object is linked or validated. The string that is\nreturned will be null terminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramInfoLog.xhtml)","title":"gl.getProgramInfoLog/2","ref":"gl.html#getProgramInfoLog/2"},{"type":"function","doc":"[`gl:getProgramInterfaceiv/3`](`getProgramInterfaceiv/3`) queries the property\nof the interface identifed by `ProgramInterface` in `Program`, the property name\nof which is given by `Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramInterface.xhtml)","title":"gl.getProgramInterfaceiv/3","ref":"gl.html#getProgramInterfaceiv/3"},{"type":"function","doc":"[`gl:getProgram()`](`getProgramiv/2`) returns in `Params` the value of a\nparameter for a specific program object. The following parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgram.xhtml)","title":"gl.getProgramiv/2","ref":"gl.html#getProgramiv/2"},{"type":"function","doc":"[`gl:getProgramPipelineInfoLog/2`](`getProgramPipelineInfoLog/2`) retrieves the\ninfo log for the program pipeline object `Pipeline`. The info log, including its\nnull terminator, is written into the array of characters whose address is given\nby `InfoLog`. The maximum number of characters that may be written into\n`InfoLog` is given by `BufSize`, and the actual number of characters written\ninto `InfoLog` is returned in the integer whose address is given by `Length`. If\n`Length` is `?NULL`, no length is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramPipelineInfoLog.xhtml)","title":"gl.getProgramPipelineInfoLog/2","ref":"gl.html#getProgramPipelineInfoLog/2"},{"type":"function","doc":"[`gl:getProgramPipelineiv/2`](`getProgramPipelineiv/2`) retrieves the value of a\nproperty of the program pipeline object `Pipeline`. `Pname` specifies the name\nof the parameter whose value to retrieve. The value of the parameter is written\nto the variable whose address is given by `Params`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramPipeline.xhtml)","title":"gl.getProgramPipelineiv/2","ref":"gl.html#getProgramPipelineiv/2"},{"type":"function","doc":"[`gl:getProgramResourceIndex/3`](`getProgramResourceIndex/3`) returns the\nunsigned integer index assigned to a resource named `Name` in the interface type\n`ProgramInterface` of program object `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceIndex.xhtml)","title":"gl.getProgramResourceIndex/3","ref":"gl.html#getProgramResourceIndex/3"},{"type":"function","doc":"[`gl:getProgramResourceLocation/3`](`getProgramResourceLocation/3`) returns the\nlocation assigned to the variable named `Name` in interface `ProgramInterface`\nof program object `Program`. `Program` must be the name of a program that has\nbeen linked successfully. `ProgramInterface` must be one of `?GL_UNIFORM`,\n`?GL_PROGRAM_INPUT`, `?GL_PROGRAM_OUTPUT`, `?GL_VERTEX_SUBROUTINE_UNIFORM`,\n`?GL_TESS_CONTROL_SUBROUTINE_UNIFORM`, `?GL_TESS_EVALUATION_SUBROUTINE_UNIFORM`,\n`?GL_GEOMETRY_SUBROUTINE_UNIFORM`, `?GL_FRAGMENT_SUBROUTINE_UNIFORM`,\n`?GL_COMPUTE_SUBROUTINE_UNIFORM`, or `?GL_TRANSFORM_FEEDBACK_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceLocation.xhtml)","title":"gl.getProgramResourceLocation/3","ref":"gl.html#getProgramResourceLocation/3"},{"type":"function","doc":"[`gl:getProgramResourceLocationIndex/3`](`getProgramResourceLocationIndex/3`)\nreturns the fragment color index assigned to the variable named `Name` in\ninterface `ProgramInterface` of program object `Program`. `Program` must be the\nname of a program that has been linked successfully. `ProgramInterface` must be\n`?GL_PROGRAM_OUTPUT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceLocationIndex.xhtml)","title":"gl.getProgramResourceLocationIndex/3","ref":"gl.html#getProgramResourceLocationIndex/3"},{"type":"function","doc":"[`gl:getProgramResourceName/4`](`getProgramResourceName/4`) retrieves the name\nstring assigned to the single active resource with an index of `Index` in the\ninterface `ProgramInterface` of program object `Program`. `Index` must be less\nthan the number of entries in the active resource list for `ProgramInterface`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceName.xhtml)","title":"gl.getProgramResourceName/4","ref":"gl.html#getProgramResourceName/4"},{"type":"function","doc":"[`gl:getProgramStage()`](`getProgramStageiv/3`) queries a parameter of a shader\nstage attached to a program object. `Program` contains the name of the program\nto which the shader is attached. `Shadertype` specifies the stage from which to\nquery the parameter. `Pname` specifies which parameter should be queried. The\nvalue or values of the parameter to be queried is returned in the variable whose\naddress is given in `Values`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramStage.xhtml)","title":"gl.getProgramStageiv/3","ref":"gl.html#getProgramStageiv/3"},{"type":"function","doc":"","title":"gl.getQueryBufferObjecti64v/4","ref":"gl.html#getQueryBufferObjecti64v/4"},{"type":"function","doc":"","title":"gl.getQueryBufferObjectiv/4","ref":"gl.html#getQueryBufferObjectiv/4"},{"type":"function","doc":"","title":"gl.getQueryBufferObjectui64v/4","ref":"gl.html#getQueryBufferObjectui64v/4"},{"type":"function","doc":"","title":"gl.getQueryBufferObjectuiv/4","ref":"gl.html#getQueryBufferObjectuiv/4"},{"type":"function","doc":"[`gl:getQueryIndexediv/3`](`getQueryIndexediv/3`) returns in `Params` a selected\nparameter of the indexed query object target specified by `Target` and `Index`.\n`Index` specifies the index of the query object target and must be between zero\nand a target-specific maxiumum.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryIndexed.xhtml)","title":"gl.getQueryIndexediv/3","ref":"gl.html#getQueryIndexediv/3"},{"type":"function","doc":"[`gl:getQueryiv/2`](`getQueryiv/2`) returns in `Params` a selected parameter of\nthe query object target specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryiv.xhtml)","title":"gl.getQueryiv/2","ref":"gl.html#getQueryiv/2"},{"type":"function","doc":"","title":"gl.getQueryObjecti64v/2","ref":"gl.html#getQueryObjecti64v/2"},{"type":"function","doc":"","title":"gl.getQueryObjectiv/2","ref":"gl.html#getQueryObjectiv/2"},{"type":"function","doc":"","title":"gl.getQueryObjectui64v/2","ref":"gl.html#getQueryObjectui64v/2"},{"type":"function","doc":"These commands return a selected parameter of the query object specified by\n`Id`. [`gl:getQueryObject()`](`getQueryObjectiv/2`) returns in `Params` a\nselected parameter of the query object specified by `Id`.\n[`gl:getQueryBufferObject()`](`getQueryObjectiv/2`) returns in `Buffer` a\nselected parameter of the query object specified by `Id`, by writing it to\n`Buffer`'s data store at the byte offset specified by `Offset`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryObject.xhtml)","title":"gl.getQueryObjectuiv/2","ref":"gl.html#getQueryObjectuiv/2"},{"type":"function","doc":"[`gl:getRenderbufferParameteriv/2`](`getRenderbufferParameteriv/2`) and\n`glGetNamedRenderbufferParameteriv` query parameters of a specified renderbuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetRenderbufferParameter.xhtml)","title":"gl.getRenderbufferParameteriv/2","ref":"gl.html#getRenderbufferParameteriv/2"},{"type":"function","doc":"","title":"gl.getSamplerParameterfv/2","ref":"gl.html#getSamplerParameterfv/2"},{"type":"function","doc":"","title":"gl.getSamplerParameterIiv/2","ref":"gl.html#getSamplerParameterIiv/2"},{"type":"function","doc":"","title":"gl.getSamplerParameterIuiv/2","ref":"gl.html#getSamplerParameterIuiv/2"},{"type":"function","doc":"[`gl:getSamplerParameter()`](`getSamplerParameteriv/2`) returns in `Params` the\nvalue or values of the sampler parameter specified as `Pname`. `Sampler` defines\nthe target sampler, and must be the name of an existing sampler object, returned\nfrom a previous call to [`gl:genSamplers/1`](`genSamplers/1`). `Pname` accepts\nthe same symbols as [`gl:samplerParameter()`](`samplerParameteri/3`), with the\nsame interpretations:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSamplerParameter.xhtml)","title":"gl.getSamplerParameteriv/2","ref":"gl.html#getSamplerParameteriv/2"},{"type":"function","doc":"[`gl:getShaderInfoLog/2`](`getShaderInfoLog/2`) returns the information log for\nthe specified shader object. The information log for a shader object is modified\nwhen the shader is compiled. The string that is returned will be null\nterminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderInfoLog.xhtml)","title":"gl.getShaderInfoLog/2","ref":"gl.html#getShaderInfoLog/2"},{"type":"function","doc":"[`gl:getShader()`](`getShaderiv/2`) returns in `Params` the value of a parameter\nfor a specific shader object. The following parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShader.xhtml)","title":"gl.getShaderiv/2","ref":"gl.html#getShaderiv/2"},{"type":"function","doc":"[`gl:getShaderPrecisionFormat/2`](`getShaderPrecisionFormat/2`) retrieves the\nnumeric range and precision for the implementation's representation of\nquantities in different numeric formats in specified shader type. `ShaderType`\nspecifies the type of shader for which the numeric precision and range is to be\nretrieved and must be one of `?GL_VERTEX_SHADER` or `?GL_FRAGMENT_SHADER`.\n`PrecisionType` specifies the numeric format to query and must be one of\n`?GL_LOW_FLOAT`, `?GL_MEDIUM_FLOAT``?GL_HIGH_FLOAT`, `?GL_LOW_INT`,\n`?GL_MEDIUM_INT`, or `?GL_HIGH_INT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderPrecisionFormat.xhtml)","title":"gl.getShaderPrecisionFormat/2","ref":"gl.html#getShaderPrecisionFormat/2"},{"type":"function","doc":"[`gl:getShaderSource/2`](`getShaderSource/2`) returns the concatenation of the\nsource code strings from the shader object specified by `Shader`. The source\ncode strings for a shader object are the result of a previous call to\n[`gl:shaderSource/2`](`shaderSource/2`). The string returned by the function\nwill be null terminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderSource.xhtml)","title":"gl.getShaderSource/2","ref":"gl.html#getShaderSource/2"},{"type":"function","doc":"","title":"gl.getString/1","ref":"gl.html#getString/1"},{"type":"function","doc":"[`gl:getString/1`](`getString/1`) returns a pointer to a static string\ndescribing some aspect of the current GL connection. `Name` can be one of the\nfollowing:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetString.xhtml)","title":"gl.getStringi/2","ref":"gl.html#getStringi/2"},{"type":"function","doc":"[`gl:getSubroutineIndex/3`](`getSubroutineIndex/3`) returns the index of a\nsubroutine uniform within a shader stage attached to a program object. `Program`\ncontains the name of the program to which the shader is attached. `Shadertype`\nspecifies the stage from which to query shader subroutine index. `Name` contains\nthe null-terminated name of the subroutine uniform whose name to query.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSubroutineIndex.xhtml)","title":"gl.getSubroutineIndex/3","ref":"gl.html#getSubroutineIndex/3"},{"type":"function","doc":"[`gl:getSubroutineUniformLocation/3`](`getSubroutineUniformLocation/3`) returns\nthe location of the subroutine uniform variable `Name` in the shader stage of\ntype `Shadertype` attached to `Program`, with behavior otherwise identical to\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSubroutineUniformLocation.xhtml)","title":"gl.getSubroutineUniformLocation/3","ref":"gl.html#getSubroutineUniformLocation/3"},{"type":"function","doc":"[`gl:getSynciv/3`](`getSynciv/3`) retrieves properties of a sync object. `Sync`\nspecifies the name of the sync object whose properties to retrieve.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSync.xhtml)","title":"gl.getSynciv/3","ref":"gl.html#getSynciv/3"},{"type":"function","doc":"","title":"gl.getTexEnvfv/2","ref":"gl.html#getTexEnvfv/2"},{"type":"function","doc":"[`gl:getTexEnv()`](`getTexEnvfv/2`) returns in `Params` selected values of a\ntexture environment that was specified with [`gl:texEnv()`](`texEnvf/3`).\n`Target` specifies a texture environment.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetTexEnv.xml)","title":"gl.getTexEnviv/2","ref":"gl.html#getTexEnviv/2"},{"type":"function","doc":"","title":"gl.getTexGendv/2","ref":"gl.html#getTexGendv/2"},{"type":"function","doc":"","title":"gl.getTexGenfv/2","ref":"gl.html#getTexGenfv/2"},{"type":"function","doc":"[`gl:getTexGen()`](`getTexGendv/2`) returns in `Params` selected parameters of a\ntexture coordinate generation function that was specified using\n[`gl:texGen()`](`texGend/3`). `Coord` names one of the (`s`, `t`, `r`, `q`)\ntexture coordinates, using the symbolic constant `?GL_S`, `?GL_T`, `?GL_R`, or\n`?GL_Q`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetTexGen.xml)","title":"gl.getTexGeniv/2","ref":"gl.html#getTexGeniv/2"},{"type":"function","doc":"[`gl:getTexImage/5`](`getTexImage/5`), `glGetnTexImage` and `glGetTextureImage`\nfunctions return a texture image into `Pixels`. For\n[`gl:getTexImage/5`](`getTexImage/5`) and `glGetnTexImage`, `Target` specifies\nwhether the desired texture image is one specified by\n[`gl:texImage1D/8`](`texImage1D/8`) (`?GL_TEXTURE_1D`),\n[`gl:texImage2D/9`](`texImage2D/9`) (`?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_2D` or any of `?GL_TEXTURE_CUBE_MAP_*`),\nor [`gl:texImage3D/10`](`texImage3D/10`) (`?GL_TEXTURE_2D_ARRAY`,\n`?GL_TEXTURE_3D`, `?GL_TEXTURE_CUBE_MAP_ARRAY`). For `glGetTextureImage`,\n`Texture` specifies the texture object name. In addition to types of textures\naccepted by [`gl:getTexImage/5`](`getTexImage/5`) and `glGetnTexImage`, the\nfunction also accepts cube map texture objects (with effective target\n`?GL_TEXTURE_CUBE_MAP`). `Level` specifies the level-of-detail number of the\ndesired image. `Format` and `Type` specify the format and type of the desired\nimage array. See the reference page for [`gl:texImage1D/8`](`texImage1D/8`) for\na description of the acceptable values for the `Format` and `Type` parameters,\nrespectively. For glGetnTexImage and glGetTextureImage functions, bufSize tells\nthe size of the buffer to receive the retrieved pixel data. `glGetnTexImage` and\n`glGetTextureImage` do not write more than `BufSize` bytes into `Pixels`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexImage.xhtml)","title":"gl.getTexImage/5","ref":"gl.html#getTexImage/5"},{"type":"function","doc":"","title":"gl.getTexLevelParameterfv/3","ref":"gl.html#getTexLevelParameterfv/3"},{"type":"function","doc":"[`gl:getTexLevelParameterfv/3`](`getTexLevelParameterfv/3`),\n[`gl:getTexLevelParameteriv/3`](`getTexLevelParameterfv/3`),\n`glGetTextureLevelParameterfv` and `glGetTextureLevelParameteriv` return in\n`Params` texture parameter values for a specific level-of-detail value,\nspecified as `Level`. For the first two functions, `Target` defines the target\ntexture, either `?GL_TEXTURE_1D`, `?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`,\n`?GL_PROXY_TEXTURE_1D`, `?GL_PROXY_TEXTURE_2D`, `?GL_PROXY_TEXTURE_3D`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_X`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_X`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_Y`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_Y`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_Z`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_Z`, or\n`?GL_PROXY_TEXTURE_CUBE_MAP`. The remaining two take a `Texture` argument which\nspecifies the name of the texture object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexLevelParameter.xhtml)","title":"gl.getTexLevelParameteriv/3","ref":"gl.html#getTexLevelParameteriv/3"},{"type":"function","doc":"","title":"gl.getTexParameterfv/2","ref":"gl.html#getTexParameterfv/2"},{"type":"function","doc":"","title":"gl.getTexParameterIiv/2","ref":"gl.html#getTexParameterIiv/2"},{"type":"function","doc":"","title":"gl.getTexParameterIuiv/2","ref":"gl.html#getTexParameterIuiv/2"},{"type":"function","doc":"[`gl:getTexParameter()`](`getTexParameterfv/2`) and `glGetTextureParameter`\nreturn in `Params` the value or values of the texture parameter specified as\n`Pname`. `Target` defines the target texture. `?GL_TEXTURE_1D`,\n`?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, `?GL_TEXTURE_2D_MULTISAMPLE`, or\n`?GL_TEXTURE_2D_MULTISAMPLE_ARRAY` specify one-, two-, or three-dimensional,\none-dimensional array, two-dimensional array, rectangle, cube-mapped or\ncube-mapped array, two-dimensional multisample, or two-dimensional multisample\narray texturing, respectively. `Pname` accepts the same symbols as\n[`gl:texParameter()`](`texParameterf/3`), with the same interpretations:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexParameter.xhtml)","title":"gl.getTexParameteriv/2","ref":"gl.html#getTexParameteriv/2"},{"type":"function","doc":"Information about the set of varying variables in a linked program that will be\ncaptured during transform feedback may be retrieved by calling\n[`gl:getTransformFeedbackVarying/3`](`getTransformFeedbackVarying/3`).\n[`gl:getTransformFeedbackVarying/3`](`getTransformFeedbackVarying/3`) provides\ninformation about the varying variable selected by `Index`. An `Index` of 0\nselects the first varying variable specified in the `Varyings` array passed to\n[`gl:transformFeedbackVaryings/3`](`transformFeedbackVaryings/3`), and an\n`Index` of the value of `?GL_TRANSFORM_FEEDBACK_VARYINGS` minus one selects the\nlast such variable.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTransformFeedbackVarying.xhtml)","title":"gl.getTransformFeedbackVarying/3","ref":"gl.html#getTransformFeedbackVarying/3"},{"type":"function","doc":"[`gl:getUniformBlockIndex/2`](`getUniformBlockIndex/2`) retrieves the index of a\nuniform block within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformBlockIndex.xhtml)","title":"gl.getUniformBlockIndex/2","ref":"gl.html#getUniformBlockIndex/2"},{"type":"function","doc":"","title":"gl.getUniformdv/2","ref":"gl.html#getUniformdv/2"},{"type":"function","doc":"","title":"gl.getUniformfv/2","ref":"gl.html#getUniformfv/2"},{"type":"function","doc":"[`gl:getUniformIndices/2`](`getUniformIndices/2`) retrieves the indices of a\nnumber of uniforms within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformIndices.xhtml)","title":"gl.getUniformIndices/2","ref":"gl.html#getUniformIndices/2"},{"type":"function","doc":"","title":"gl.getUniformiv/2","ref":"gl.html#getUniformiv/2"},{"type":"function","doc":"`glGetUniformLocation `returns an integer that represents the location of a\nspecific uniform variable within a program object. `Name` must be a null\nterminated string that contains no white space. `Name` must be an active uniform\nvariable name in `Program` that is not a structure, an array of structures, or a\nsubcomponent of a vector or a matrix. This function returns -1 if `Name` does\nnot correspond to an active uniform variable in `Program`, if `Name` starts with\nthe reserved prefix \"gl\\_\", or if `Name` is associated with an atomic counter or\na named uniform block.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformLocation.xhtml)","title":"gl.getUniformLocation/2","ref":"gl.html#getUniformLocation/2"},{"type":"function","doc":"[`gl:getUniformSubroutine()`](`getUniformSubroutineuiv/2`) retrieves the value\nof the subroutine uniform at location `Location` for shader stage `Shadertype`\nof the current program. `Location` must be less than the value of\n`?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS` for the shader currently in use at\nshader stage `Shadertype`. The value of the subroutine uniform is returned in\n`Values`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformSubroutine.xhtml)","title":"gl.getUniformSubroutineuiv/2","ref":"gl.html#getUniformSubroutineuiv/2"},{"type":"function","doc":"[`gl:getUniform()`](`getUniformfv/2`) and `glGetnUniform` return in `Params` the\nvalue(s) of the specified uniform variable. The type of the uniform variable\nspecified by `Location` determines the number of values returned. If the uniform\nvariable is defined in the shader as a boolean, int, or float, a single value\nwill be returned. If it is defined as a vec2, ivec2, or bvec2, two values will\nbe returned. If it is defined as a vec3, ivec3, or bvec3, three values will be\nreturned, and so on. To query values stored in uniform variables declared as\narrays, call [`gl:getUniform()`](`getUniformfv/2`) for each element of the\narray. To query values stored in uniform variables declared as structures, call\n[`gl:getUniform()`](`getUniformfv/2`) for each field in the structure. The\nvalues for uniform variables declared as a matrix will be returned in column\nmajor order.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniform.xhtml)","title":"gl.getUniformuiv/2","ref":"gl.html#getUniformuiv/2"},{"type":"function","doc":"","title":"gl.getVertexAttribdv/2","ref":"gl.html#getVertexAttribdv/2"},{"type":"function","doc":"","title":"gl.getVertexAttribfv/2","ref":"gl.html#getVertexAttribfv/2"},{"type":"function","doc":"","title":"gl.getVertexAttribIiv/2","ref":"gl.html#getVertexAttribIiv/2"},{"type":"function","doc":"","title":"gl.getVertexAttribIuiv/2","ref":"gl.html#getVertexAttribIuiv/2"},{"type":"function","doc":"[`gl:getVertexAttrib()`](`getVertexAttribdv/2`) returns in `Params` the value of\na generic vertex attribute parameter. The generic vertex attribute to be queried\nis specified by `Index`, and the parameter to be queried is specified by\n`Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetVertexAttrib.xhtml)","title":"gl.getVertexAttribiv/2","ref":"gl.html#getVertexAttribiv/2"},{"type":"function","doc":"","title":"gl.getVertexAttribLdv/2","ref":"gl.html#getVertexAttribLdv/2"},{"type":"function","doc":"Certain aspects of GL behavior, when there is room for interpretation, can be\ncontrolled with hints. A hint is specified with two arguments. `Target` is a\nsymbolic constant indicating the behavior to be controlled, and `Mode` is\nanother symbolic constant indicating the desired behavior. The initial value for\neach `Target` is `?GL_DONT_CARE`. `Mode` can be one of the following:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glHint.xhtml)","title":"gl.hint/2","ref":"gl.html#hint/2"},{"type":"function","doc":"When `?GL_HISTOGRAM` is enabled, RGBA color components are converted to\nhistogram table indices by clamping to the range \\[0,1], multiplying by the\nwidth of the histogram table, and rounding to the nearest integer. The table\nentries selected by the RGBA indices are then incremented. (If the internal\nformat of the histogram table includes luminance, then the index derived from\nthe R color component determines the luminance table entry to be incremented.)\nIf a histogram table entry is incremented beyond its maximum value, then its\nvalue becomes undefined. (This is not an error.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glHistogram.xml)","title":"gl.histogram/4","ref":"gl.html#histogram/4"},{"type":"function","doc":"","title":"gl.indexd/1","ref":"gl.html#indexd/1"},{"type":"function","doc":"","title":"gl.indexdv/1","ref":"gl.html#indexdv/1"},{"type":"function","doc":"","title":"gl.indexf/1","ref":"gl.html#indexf/1"},{"type":"function","doc":"","title":"gl.indexfv/1","ref":"gl.html#indexfv/1"},{"type":"function","doc":"","title":"gl.indexi/1","ref":"gl.html#indexi/1"},{"type":"function","doc":"","title":"gl.indexiv/1","ref":"gl.html#indexiv/1"},{"type":"function","doc":"[`gl:indexMask/1`](`indexMask/1`) controls the writing of individual bits in the\ncolor index buffers. The least significant n bits of `Mask`, where n is the\nnumber of bits in a color index buffer, specify a mask. Where a 1 (one) appears\nin the mask, it's possible to write to the corresponding bit in the color index\nbuffer (or buffers). Where a 0 (zero) appears, the corresponding bit is\nwrite-protected.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndexMask.xml)","title":"gl.indexMask/1","ref":"gl.html#indexMask/1"},{"type":"function","doc":"[`gl:indexPointer/3`](`indexPointer/3`) specifies the location and data format\nof an array of color indexes to use when rendering. `Type` specifies the data\ntype of each color index and `Stride` specifies the byte stride from one color\nindex to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndexPointer.xml)","title":"gl.indexPointer/3","ref":"gl.html#indexPointer/3"},{"type":"function","doc":"","title":"gl.indexs/1","ref":"gl.html#indexs/1"},{"type":"function","doc":"","title":"gl.indexsv/1","ref":"gl.html#indexsv/1"},{"type":"function","doc":"","title":"gl.indexub/1","ref":"gl.html#indexub/1"},{"type":"function","doc":"[`gl:index()`](`indexd/1`) updates the current (single-valued) color index. It\ntakes one argument, the new value for the current color index.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndex.xml)","title":"gl.indexubv/1","ref":"gl.html#indexubv/1"},{"type":"function","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers.\n[`gl:initNames/0`](`initNames/0`) causes the name stack to be initialized to its\ndefault empty state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glInitNames.xml)","title":"gl.initNames/0","ref":"gl.html#initNames/0"},{"type":"function","doc":"[`gl:interleavedArrays/3`](`interleavedArrays/3`) lets you specify and enable\nindividual color, normal, texture and vertex arrays whose elements are part of a\nlarger aggregate array element. For some implementations, this is more efficient\nthan specifying the arrays separately.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glInterleavedArrays.xml)","title":"gl.interleavedArrays/3","ref":"gl.html#interleavedArrays/3"},{"type":"function","doc":"[`gl:invalidateBufferData/1`](`invalidateBufferData/1`) invalidates all of the\ncontent of the data store of a buffer object. After invalidation, the content of\nthe buffer's data store becomes undefined.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateBufferData.xhtml)","title":"gl.invalidateBufferData/1","ref":"gl.html#invalidateBufferData/1"},{"type":"function","doc":"[`gl:invalidateBufferSubData/3`](`invalidateBufferSubData/3`) invalidates all or\npart of the content of the data store of a buffer object. After invalidation,\nthe content of the specified range of the buffer's data store becomes undefined.\nThe start of the range is given by `Offset` and its size is given by `Length`,\nboth measured in basic machine units.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateBufferSubData.xhtml)","title":"gl.invalidateBufferSubData/3","ref":"gl.html#invalidateBufferSubData/3"},{"type":"function","doc":"[`gl:invalidateFramebuffer/2`](`invalidateFramebuffer/2`) and\n`glInvalidateNamedFramebufferData` invalidate the entire contents of a specified\nset of attachments of a framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateFramebuffer.xhtml)","title":"gl.invalidateFramebuffer/2","ref":"gl.html#invalidateFramebuffer/2"},{"type":"function","doc":"[`gl:invalidateSubFramebuffer/6`](`invalidateSubFramebuffer/6`) and\n`glInvalidateNamedFramebufferSubData` invalidate the contents of a specified\nregion of a specified set of attachments of a framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateSubFramebuffer.xhtml)","title":"gl.invalidateSubFramebuffer/6","ref":"gl.html#invalidateSubFramebuffer/6"},{"type":"function","doc":"[`gl:invalidateTexSubImage/8`](`invalidateTexSubImage/8`) invalidates all of a\ntexture image. `Texture` and `Level` indicated which texture image is being\ninvalidated. After this command, data in the texture image has undefined values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateTexImage.xhtml)","title":"gl.invalidateTexImage/2","ref":"gl.html#invalidateTexImage/2"},{"type":"function","doc":"[`gl:invalidateTexSubImage/8`](`invalidateTexSubImage/8`) invalidates all or\npart of a texture image. `Texture` and `Level` indicated which texture image is\nbeing invalidated. After this command, data in that subregion have undefined\nvalues. `Xoffset`, `Yoffset`, `Zoffset`, `Width`, `Height`, and `Depth` are\ninterpreted as they are in [`gl:texSubImage3D/11`](`texSubImage3D/11`). For\ntexture targets that don't have certain dimensions, this command treats those\ndimensions as having a size of 1. For example, to invalidate a portion of a two-\ndimensional texture, the application would use `Zoffset` equal to zero and\n`Depth` equal to one. Cube map textures are treated as an array of six slices in\nthe z-dimension, where a value of `Zoffset` is interpreted as specifying face\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_X` \\+ `Zoffset`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateTexSubImage.xhtml)","title":"gl.invalidateTexSubImage/8","ref":"gl.html#invalidateTexSubImage/8"},{"type":"function","doc":"[`gl:isBuffer/1`](`isBuffer/1`) returns `?GL_TRUE` if `Buffer` is currently the\nname of a buffer object. If `Buffer` is zero, or is a non-zero value that is not\ncurrently the name of a buffer object, or if an error occurs,\n[`gl:isBuffer/1`](`isBuffer/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsBuffer.xhtml)","title":"gl.isBuffer/1","ref":"gl.html#isBuffer/1"},{"type":"function","doc":"","title":"gl.isEnabled/1","ref":"gl.html#isEnabled/1"},{"type":"function","doc":"[`gl:isEnabled/1`](`isEnabled/1`) returns `?GL_TRUE` if `Cap` is an enabled\ncapability and returns `?GL_FALSE` otherwise. Boolean states that are indexed\nmay be tested with [`gl:isEnabledi/2`](`isEnabled/1`). For\n[`gl:isEnabledi/2`](`isEnabled/1`), `Index` specifies the index of the\ncapability to test. `Index` must be between zero and the count of indexed\ncapabilities for `Cap`. Initially all capabilities except `?GL_DITHER` are\ndisabled; `?GL_DITHER` is initially enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsEnabled.xhtml)","title":"gl.isEnabledi/2","ref":"gl.html#isEnabledi/2"},{"type":"function","doc":"[`gl:isFramebuffer/1`](`isFramebuffer/1`) returns `?GL_TRUE` if `Framebuffer` is\ncurrently the name of a framebuffer object. If `Framebuffer` is zero, or if\n`?framebuffer` is not the name of a framebuffer object, or if an error occurs,\n[`gl:isFramebuffer/1`](`isFramebuffer/1`) returns `?GL_FALSE`. If `Framebuffer`\nis a name returned by [`gl:genFramebuffers/1`](`genFramebuffers/1`), by that has\nnot yet been bound through a call to\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`), then the name is not a\nframebuffer object and [`gl:isFramebuffer/1`](`isFramebuffer/1`) returns\n`?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsFramebuffer.xhtml)","title":"gl.isFramebuffer/1","ref":"gl.html#isFramebuffer/1"},{"type":"function","doc":"[`gl:isList/1`](`isList/1`) returns `?GL_TRUE` if `List` is the name of a\ndisplay list and returns `?GL_FALSE` if it is not, or if an error occurs.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIsList.xml)","title":"gl.isList/1","ref":"gl.html#isList/1"},{"type":"function","doc":"[`gl:isProgram/1`](`isProgram/1`) returns `?GL_TRUE` if `Program` is the name of\na program object previously created with\n[`gl:createProgram/0`](`createProgram/0`) and not yet deleted with\n[`gl:deleteProgram/1`](`deleteProgram/1`). If `Program` is zero or a non-zero\nvalue that is not the name of a program object, or if an error occurs,\n[`gl:isProgram/1`](`isProgram/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsProgram.xhtml)","title":"gl.isProgram/1","ref":"gl.html#isProgram/1"},{"type":"function","doc":"[`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns `?GL_TRUE` if\n`Pipeline` is currently the name of a program pipeline object. If `Pipeline` is\nzero, or if `?pipeline` is not the name of a program pipeline object, or if an\nerror occurs, [`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns\n`?GL_FALSE`. If `Pipeline` is a name returned by\n[`gl:genProgramPipelines/1`](`genProgramPipelines/1`), but that has not yet been\nbound through a call to [`gl:bindProgramPipeline/1`](`bindProgramPipeline/1`),\nthen the name is not a program pipeline object and\n[`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsProgramPipeline.xhtml)","title":"gl.isProgramPipeline/1","ref":"gl.html#isProgramPipeline/1"},{"type":"function","doc":"[`gl:isQuery/1`](`isQuery/1`) returns `?GL_TRUE` if `Id` is currently the name\nof a query object. If `Id` is zero, or is a non-zero value that is not currently\nthe name of a query object, or if an error occurs, [`gl:isQuery/1`](`isQuery/1`)\nreturns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsQuery.xhtml)","title":"gl.isQuery/1","ref":"gl.html#isQuery/1"},{"type":"function","doc":"[`gl:isRenderbuffer/1`](`isRenderbuffer/1`) returns `?GL_TRUE` if `Renderbuffer`\nis currently the name of a renderbuffer object. If `Renderbuffer` is zero, or if\n`Renderbuffer` is not the name of a renderbuffer object, or if an error occurs,\n[`gl:isRenderbuffer/1`](`isRenderbuffer/1`) returns `?GL_FALSE`. If\n`Renderbuffer` is a name returned by\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`), by that has not yet been bound\nthrough a call to [`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) or\n[`gl:framebufferRenderbuffer/4`](`framebufferRenderbuffer/4`), then the name is\nnot a renderbuffer object and [`gl:isRenderbuffer/1`](`isRenderbuffer/1`)\nreturns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsRenderbuffer.xhtml)","title":"gl.isRenderbuffer/1","ref":"gl.html#isRenderbuffer/1"},{"type":"function","doc":"[`gl:isSampler/1`](`isSampler/1`) returns `?GL_TRUE` if `Id` is currently the\nname of a sampler object. If `Id` is zero, or is a non-zero value that is not\ncurrently the name of a sampler object, or if an error occurs,\n[`gl:isSampler/1`](`isSampler/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsSampler.xhtml)","title":"gl.isSampler/1","ref":"gl.html#isSampler/1"},{"type":"function","doc":"[`gl:isShader/1`](`isShader/1`) returns `?GL_TRUE` if `Shader` is the name of a\nshader object previously created with [`gl:createShader/1`](`createShader/1`)\nand not yet deleted with [`gl:deleteShader/1`](`deleteShader/1`). If `Shader` is\nzero or a non-zero value that is not the name of a shader object, or if an error\noccurs, `glIsShader `returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsShader.xhtml)","title":"gl.isShader/1","ref":"gl.html#isShader/1"},{"type":"function","doc":"[`gl:isSync/1`](`isSync/1`) returns `?GL_TRUE` if `Sync` is currently the name\nof a sync object. If `Sync` is not the name of a sync object, or if an error\noccurs, [`gl:isSync/1`](`isSync/1`) returns `?GL_FALSE`. Note that zero is not\nthe name of a sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsSync.xhtml)","title":"gl.isSync/1","ref":"gl.html#isSync/1"},{"type":"function","doc":"[`gl:isTexture/1`](`isTexture/1`) returns `?GL_TRUE` if `Texture` is currently\nthe name of a texture. If `Texture` is zero, or is a non-zero value that is not\ncurrently the name of a texture, or if an error occurs,\n[`gl:isTexture/1`](`isTexture/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsTexture.xhtml)","title":"gl.isTexture/1","ref":"gl.html#isTexture/1"},{"type":"function","doc":"[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_TRUE` if `Id`\nis currently the name of a transform feedback object. If `Id` is zero, or if\n`?id` is not the name of a transform feedback object, or if an error occurs,\n[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_FALSE`. If\n`Id` is a name returned by\n[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`), but that has not yet\nbeen bound through a call to\n[`gl:bindTransformFeedback/2`](`bindTransformFeedback/2`), then the name is not\na transform feedback object and\n[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsTransformFeedback.xhtml)","title":"gl.isTransformFeedback/1","ref":"gl.html#isTransformFeedback/1"},{"type":"function","doc":"[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_TRUE` if `Array` is\ncurrently the name of a vertex array object. If `Array` is zero, or if `Array`\nis not the name of a vertex array object, or if an error occurs,\n[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_FALSE`. If `Array` is a\nname returned by [`gl:genVertexArrays/1`](`genVertexArrays/1`), by that has not\nyet been bound through a call to [`gl:bindVertexArray/1`](`bindVertexArray/1`),\nthen the name is not a vertex array object and\n[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsVertexArray.xhtml)","title":"gl.isVertexArray/1","ref":"gl.html#isVertexArray/1"},{"type":"function","doc":"","title":"gl.lightf/3","ref":"gl.html#lightf/3"},{"type":"function","doc":"","title":"gl.lightfv/3","ref":"gl.html#lightfv/3"},{"type":"function","doc":"","title":"gl.lighti/3","ref":"gl.html#lighti/3"},{"type":"function","doc":"[`gl:light()`](`lightf/3`) sets the values of individual light source\nparameters. `Light` names the light and is a symbolic name of the form\n`?GL_LIGHT` i, where i ranges from 0 to the value of `?GL_MAX_LIGHTS` \\- 1.\n`Pname` specifies one of ten light source parameters, again by symbolic name.\n`Params` is either a single value or a pointer to an array that contains the new\nvalues.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLight.xml)","title":"gl.lightiv/3","ref":"gl.html#lightiv/3"},{"type":"function","doc":"","title":"gl.lightModelf/2","ref":"gl.html#lightModelf/2"},{"type":"function","doc":"","title":"gl.lightModelfv/2","ref":"gl.html#lightModelfv/2"},{"type":"function","doc":"","title":"gl.lightModeli/2","ref":"gl.html#lightModeli/2"},{"type":"function","doc":"[`gl:lightModel()`](`lightModelf/2`) sets the lighting model parameter. `Pname`\nnames a parameter and `Params` gives the new value. There are three lighting\nmodel parameters:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLightModel.xml)","title":"gl.lightModeliv/2","ref":"gl.html#lightModeliv/2"},{"type":"function","doc":"Line stippling masks out certain fragments produced by rasterization; those\nfragments will not be drawn. The masking is achieved by using three parameters:\nthe 16-bit line stipple pattern `Pattern`, the repeat count `Factor`, and an\ninteger stipple counter s.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLineStipple.xml)","title":"gl.lineStipple/2","ref":"gl.html#lineStipple/2"},{"type":"function","doc":"[`gl:lineWidth/1`](`lineWidth/1`) specifies the rasterized width of both aliased\nand antialiased lines. Using a line width other than 1 has different effects,\ndepending on whether line antialiasing is enabled. To enable and disable line\nantialiasing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_LINE_SMOOTH`. Line antialiasing is initially disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLineWidth.xhtml)","title":"gl.lineWidth/1","ref":"gl.html#lineWidth/1"},{"type":"function","doc":"[`gl:linkProgram/1`](`linkProgram/1`) links the program object specified by\n`Program`. If any shader objects of type `?GL_VERTEX_SHADER` are attached to\n`Program`, they will be used to create an executable that will run on the\nprogrammable vertex processor. If any shader objects of type\n`?GL_GEOMETRY_SHADER` are attached to `Program`, they will be used to create an\nexecutable that will run on the programmable geometry processor. If any shader\nobjects of type `?GL_FRAGMENT_SHADER` are attached to `Program`, they will be\nused to create an executable that will run on the programmable fragment\nprocessor.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLinkProgram.xhtml)","title":"gl.linkProgram/1","ref":"gl.html#linkProgram/1"},{"type":"function","doc":"[`gl:callLists/1`](`callLists/1`) specifies an array of offsets. Display-list\nnames are generated by adding `Base` to each offset. Names that reference valid\ndisplay lists are executed; the others are ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glListBase.xml)","title":"gl.listBase/1","ref":"gl.html#listBase/1"},{"type":"function","doc":"[`gl:loadIdentity/0`](`loadIdentity/0`) replaces the current matrix with the\nidentity matrix. It is semantically equivalent to calling\n[`gl:loadMatrix()`](`loadMatrixd/1`) with the identity matrix\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadIdentity.xml)","title":"gl.loadIdentity/0","ref":"gl.html#loadIdentity/0"},{"type":"function","doc":"","title":"gl.loadMatrixd/1","ref":"gl.html#loadMatrixd/1"},{"type":"function","doc":"[`gl:loadMatrix()`](`loadMatrixd/1`) replaces the current matrix with the one\nwhose elements are specified by `M`. The current matrix is the projection\nmatrix, modelview matrix, or texture matrix, depending on the current matrix\nmode (see [`gl:matrixMode/1`](`matrixMode/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadMatrix.xml)","title":"gl.loadMatrixf/1","ref":"gl.html#loadMatrixf/1"},{"type":"function","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers\nand is initially empty.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadName.xml)","title":"gl.loadName/1","ref":"gl.html#loadName/1"},{"type":"function","doc":"","title":"gl.loadTransposeMatrixd/1","ref":"gl.html#loadTransposeMatrixd/1"},{"type":"function","doc":"[`gl:loadTransposeMatrix()`](`loadTransposeMatrixf/1`) replaces the current\nmatrix with the one whose elements are specified by `M`. The current matrix is\nthe projection matrix, modelview matrix, or texture matrix, depending on the\ncurrent matrix mode (see [`gl:matrixMode/1`](`matrixMode/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadTransposeMatrix.xml)","title":"gl.loadTransposeMatrixf/1","ref":"gl.html#loadTransposeMatrixf/1"},{"type":"function","doc":"[`gl:logicOp/1`](`logicOp/1`) specifies a logical operation that, when enabled,\nis applied between the incoming RGBA color and the RGBA color at the\ncorresponding location in the frame buffer. To enable or disable the logical\noperation, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nusing the symbolic constant `?GL_COLOR_LOGIC_OP`. The initial value is disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLogicOp.xhtml)","title":"gl.logicOp/1","ref":"gl.html#logicOp/1"},{"type":"function","doc":"","title":"gl.map1d/6","ref":"gl.html#map1d/6"},{"type":"function","doc":"Evaluators provide a way to use polynomial or rational polynomial mapping to\nproduce vertices, normals, texture coordinates, and colors. The values produced\nby an evaluator are sent to further stages of GL processing just as if they had\nbeen presented using [`gl:vertex()`](`vertex2d/2`),\n[`gl:normal()`](`normal3b/3`), [`gl:texCoord()`](`texCoord1d/1`), and\n[`gl:color()`](`color3b/3`) commands, except that the generated values do not\nupdate the current normal, texture coordinates, or color.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMap1.xml)","title":"gl.map1f/6","ref":"gl.html#map1f/6"},{"type":"function","doc":"","title":"gl.map2d/10","ref":"gl.html#map2d/10"},{"type":"function","doc":"Evaluators provide a way to use polynomial or rational polynomial mapping to\nproduce vertices, normals, texture coordinates, and colors. The values produced\nby an evaluator are sent on to further stages of GL processing just as if they\nhad been presented using [`gl:vertex()`](`vertex2d/2`),\n[`gl:normal()`](`normal3b/3`), [`gl:texCoord()`](`texCoord1d/1`), and\n[`gl:color()`](`color3b/3`) commands, except that the generated values do not\nupdate the current normal, texture coordinates, or color.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMap2.xml)","title":"gl.map2f/10","ref":"gl.html#map2f/10"},{"type":"function","doc":"","title":"gl.mapGrid1d/3","ref":"gl.html#mapGrid1d/3"},{"type":"function","doc":"","title":"gl.mapGrid1f/3","ref":"gl.html#mapGrid1f/3"},{"type":"function","doc":"","title":"gl.mapGrid2d/6","ref":"gl.html#mapGrid2d/6"},{"type":"function","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used\ntogether to efficiently generate and evaluate a series of evenly-spaced map\ndomain values. [`gl:evalMesh()`](`evalMesh1/3`) steps through the integer domain\nof a one- or two-dimensional grid, whose range is the domain of the evaluation\nmaps specified by `glMap1` and `glMap2`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMapGrid.xml)","title":"gl.mapGrid2f/6","ref":"gl.html#mapGrid2f/6"},{"type":"function","doc":"","title":"gl.materialf/3","ref":"gl.html#materialf/3"},{"type":"function","doc":"","title":"gl.materialfv/3","ref":"gl.html#materialfv/3"},{"type":"function","doc":"","title":"gl.materiali/3","ref":"gl.html#materiali/3"},{"type":"function","doc":"[`gl:material()`](`materialf/3`) assigns values to material parameters. There\nare two matched sets of material parameters. One, the `front-facing` set, is\nused to shade points, lines, bitmaps, and all polygons (when two-sided lighting\nis disabled), or just front-facing polygons (when two-sided lighting is\nenabled). The other set, `back-facing`, is used to shade back-facing polygons\nonly when two-sided lighting is enabled. Refer to the\n[`gl:lightModel()`](`lightModelf/2`) reference page for details concerning one-\nand two-sided lighting calculations.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMaterial.xml)","title":"gl.materialiv/3","ref":"gl.html#materialiv/3"},{"type":"function","doc":"[`gl:matrixMode/1`](`matrixMode/1`) sets the current matrix mode. `Mode` can\nassume one of four values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMatrixMode.xml)","title":"gl.matrixMode/1","ref":"gl.html#matrixMode/1"},{"type":"function","doc":"","title":"gl.memoryBarrier/1","ref":"gl.html#memoryBarrier/1"},{"type":"function","doc":"[`gl:memoryBarrier/1`](`memoryBarrier/1`) defines a barrier ordering the memory\ntransactions issued prior to the command relative to those issued after the\nbarrier. For the purposes of this ordering, memory transactions performed by\nshaders are considered to be issued by the rendering command that triggered the\nexecution of the shader. `Barriers` is a bitfield indicating the set of\noperations that are synchronized with shader stores; the bits used in `Barriers`\nare as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml)","title":"gl.memoryBarrierByRegion/1","ref":"gl.html#memoryBarrierByRegion/1"},{"type":"function","doc":"When `?GL_MINMAX` is enabled, the RGBA components of incoming pixels are\ncompared to the minimum and maximum values for each component, which are stored\nin the two-element minmax table. (The first element stores the minima, and the\nsecond element stores the maxima.) If a pixel component is greater than the\ncorresponding component in the maximum element, then the maximum element is\nupdated with the pixel component value. If a pixel component is less than the\ncorresponding component in the minimum element, then the minimum element is\nupdated with the pixel component value. (In both cases, if the internal format\nof the minmax table includes luminance, then the R color component of incoming\npixels is used for comparison.) The contents of the minmax table may be\nretrieved at a later time by calling [`gl:getMinmax/5`](`getMinmax/5`). The\nminmax operation is enabled or disabled by calling [`gl:enable/1`](`enable/1`)\nor [`gl:disable/1`](`enable/1`), respectively, with an argument of `?GL_MINMAX`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMinmax.xml)","title":"gl.minmax/3","ref":"gl.html#minmax/3"},{"type":"function","doc":"[`gl:minSampleShading/1`](`minSampleShading/1`) specifies the rate at which\nsamples are shaded within a covered pixel. Sample-rate shading is enabled by\ncalling [`gl:enable/1`](`enable/1`) with the parameter `?GL_SAMPLE_SHADING`. If\n`?GL_MULTISAMPLE` or `?GL_SAMPLE_SHADING` is disabled, sample shading has no\neffect. Otherwise, an implementation must provide at least as many unique color\nvalues for each covered fragment as specified by `Value` times `Samples` where\n`Samples` is the value of `?GL_SAMPLES` for the current framebuffer. At least 1\nsample for each covered fragment is generated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMinSampleShading.xhtml)","title":"gl.minSampleShading/1","ref":"gl.html#minSampleShading/1"},{"type":"function","doc":"[`gl:multiDrawArrays/3`](`multiDrawArrays/3`) specifies multiple sets of\ngeometric primitives with very few subroutine calls. Instead of calling a GL\nprocedure to pass each individual vertex, normal, texture coordinate, edge flag,\nor color, you can prespecify separate arrays of vertices, normals, and colors\nand use them to construct a sequence of primitives with a single call to\n[`gl:multiDrawArrays/3`](`multiDrawArrays/3`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawArrays.xhtml)","title":"gl.multiDrawArrays/3","ref":"gl.html#multiDrawArrays/3"},{"type":"function","doc":"[`gl:multiDrawArraysIndirect/4`](`multiDrawArraysIndirect/4`) specifies multiple\ngeometric primitives with very few subroutine calls.\n[`gl:multiDrawArraysIndirect/4`](`multiDrawArraysIndirect/4`) behaves similarly\nto a multitude of calls to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`),\nexecept that the parameters to each call to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nare stored in an array in memory at the address given by `Indirect`, separated\nby the stride, in basic machine units, specified by `Stride`. If `Stride` is\nzero, then the array is assumed to be tightly packed in memory.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawArraysIndirect.xhtml)","title":"gl.multiDrawArraysIndirect/4","ref":"gl.html#multiDrawArraysIndirect/4"},{"type":"function","doc":"No documentation available.","title":"gl.multiDrawArraysIndirectCount/5","ref":"gl.html#multiDrawArraysIndirectCount/5"},{"type":"function","doc":"","title":"gl.multiTexCoord1d/2","ref":"gl.html#multiTexCoord1d/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1dv/2","ref":"gl.html#multiTexCoord1dv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1f/2","ref":"gl.html#multiTexCoord1f/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1fv/2","ref":"gl.html#multiTexCoord1fv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1i/2","ref":"gl.html#multiTexCoord1i/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1iv/2","ref":"gl.html#multiTexCoord1iv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1s/2","ref":"gl.html#multiTexCoord1s/2"},{"type":"function","doc":"","title":"gl.multiTexCoord1sv/2","ref":"gl.html#multiTexCoord1sv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord2d/3","ref":"gl.html#multiTexCoord2d/3"},{"type":"function","doc":"","title":"gl.multiTexCoord2dv/2","ref":"gl.html#multiTexCoord2dv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord2f/3","ref":"gl.html#multiTexCoord2f/3"},{"type":"function","doc":"","title":"gl.multiTexCoord2fv/2","ref":"gl.html#multiTexCoord2fv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord2i/3","ref":"gl.html#multiTexCoord2i/3"},{"type":"function","doc":"","title":"gl.multiTexCoord2iv/2","ref":"gl.html#multiTexCoord2iv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord2s/3","ref":"gl.html#multiTexCoord2s/3"},{"type":"function","doc":"","title":"gl.multiTexCoord2sv/2","ref":"gl.html#multiTexCoord2sv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord3d/4","ref":"gl.html#multiTexCoord3d/4"},{"type":"function","doc":"","title":"gl.multiTexCoord3dv/2","ref":"gl.html#multiTexCoord3dv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord3f/4","ref":"gl.html#multiTexCoord3f/4"},{"type":"function","doc":"","title":"gl.multiTexCoord3fv/2","ref":"gl.html#multiTexCoord3fv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord3i/4","ref":"gl.html#multiTexCoord3i/4"},{"type":"function","doc":"","title":"gl.multiTexCoord3iv/2","ref":"gl.html#multiTexCoord3iv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord3s/4","ref":"gl.html#multiTexCoord3s/4"},{"type":"function","doc":"","title":"gl.multiTexCoord3sv/2","ref":"gl.html#multiTexCoord3sv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord4d/5","ref":"gl.html#multiTexCoord4d/5"},{"type":"function","doc":"","title":"gl.multiTexCoord4dv/2","ref":"gl.html#multiTexCoord4dv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord4f/5","ref":"gl.html#multiTexCoord4f/5"},{"type":"function","doc":"","title":"gl.multiTexCoord4fv/2","ref":"gl.html#multiTexCoord4fv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord4i/5","ref":"gl.html#multiTexCoord4i/5"},{"type":"function","doc":"","title":"gl.multiTexCoord4iv/2","ref":"gl.html#multiTexCoord4iv/2"},{"type":"function","doc":"","title":"gl.multiTexCoord4s/5","ref":"gl.html#multiTexCoord4s/5"},{"type":"function","doc":"[`gl:multiTexCoord()`](`multiTexCoord1d/2`) specifies texture coordinates in\none, two, three, or four dimensions.\n[`gl:multiTexCoord1()`](`multiTexCoord1d/2`) sets the current texture\ncoordinates to (s 0 0 1); a call to [`gl:multiTexCoord2()`](`multiTexCoord1d/2`)\nsets them to (s t 0 1). Similarly, [`gl:multiTexCoord3()`](`multiTexCoord1d/2`)\nspecifies the texture coordinates as (s t r 1), and\n[`gl:multiTexCoord4()`](`multiTexCoord1d/2`) defines all four components\nexplicitly as (s t r q).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultiTexCoord.xml)","title":"gl.multiTexCoord4sv/2","ref":"gl.html#multiTexCoord4sv/2"},{"type":"function","doc":"","title":"gl.multMatrixd/1","ref":"gl.html#multMatrixd/1"},{"type":"function","doc":"[`gl:multMatrix()`](`multMatrixd/1`) multiplies the current matrix with the one\nspecified using `M`, and replaces the current matrix with the product.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultMatrix.xml)","title":"gl.multMatrixf/1","ref":"gl.html#multMatrixf/1"},{"type":"function","doc":"","title":"gl.multTransposeMatrixd/1","ref":"gl.html#multTransposeMatrixd/1"},{"type":"function","doc":"[`gl:multTransposeMatrix()`](`multTransposeMatrixf/1`) multiplies the current\nmatrix with the one specified using `M`, and replaces the current matrix with\nthe product.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultTransposeMatrix.xml)","title":"gl.multTransposeMatrixf/1","ref":"gl.html#multTransposeMatrixf/1"},{"type":"function","doc":"Display lists are groups of GL commands that have been stored for subsequent\nexecution. Display lists are created with [`gl:newList/2`](`newList/2`). All\nsubsequent commands are placed in the display list, in the order issued, until\n[`gl:endList/0`](`newList/2`) is called.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNewList.xml)","title":"gl.newList/2","ref":"gl.html#newList/2"},{"type":"function","doc":"","title":"gl.normal3b/3","ref":"gl.html#normal3b/3"},{"type":"function","doc":"","title":"gl.normal3bv/1","ref":"gl.html#normal3bv/1"},{"type":"function","doc":"","title":"gl.normal3d/3","ref":"gl.html#normal3d/3"},{"type":"function","doc":"","title":"gl.normal3dv/1","ref":"gl.html#normal3dv/1"},{"type":"function","doc":"","title":"gl.normal3f/3","ref":"gl.html#normal3f/3"},{"type":"function","doc":"","title":"gl.normal3fv/1","ref":"gl.html#normal3fv/1"},{"type":"function","doc":"","title":"gl.normal3i/3","ref":"gl.html#normal3i/3"},{"type":"function","doc":"","title":"gl.normal3iv/1","ref":"gl.html#normal3iv/1"},{"type":"function","doc":"","title":"gl.normal3s/3","ref":"gl.html#normal3s/3"},{"type":"function","doc":"The current normal is set to the given coordinates whenever\n[`gl:normal()`](`normal3b/3`) is issued. Byte, short, or integer arguments are\nconverted to floating-point format with a linear mapping that maps the most\npositive representable integer value to 1.0 and the most negative representable\ninteger value to -1.0.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNormal.xml)","title":"gl.normal3sv/1","ref":"gl.html#normal3sv/1"},{"type":"function","doc":"[`gl:normalPointer/3`](`normalPointer/3`) specifies the location and data format\nof an array of normals to use when rendering. `Type` specifies the data type of\neach normal coordinate, and `Stride` specifies the byte stride from one normal\nto the next, allowing vertices and attributes to be packed into a single array\nor stored in separate arrays. (Single-array storage may be more efficient on\nsome implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNormalPointer.xml)","title":"gl.normalPointer/3","ref":"gl.html#normalPointer/3"},{"type":"function","doc":"[`gl:objectPtrLabel/3`](`objectPtrLabel/3`) labels the sync object identified by\n`Ptr`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glObjectPtrLabel.xhtml)","title":"gl.objectPtrLabel/3","ref":"gl.html#objectPtrLabel/3"},{"type":"function","doc":"[`gl:ortho/6`](`ortho/6`) describes a transformation that produces a parallel\nprojection. The current matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is\nmultiplied by this matrix and the result replaces the current matrix, as if\n[`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix as\nits argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml)","title":"gl.ortho/6","ref":"gl.html#ortho/6"},{"type":"function","doc":"[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPassThrough.xml)","title":"gl.passThrough/1","ref":"gl.html#passThrough/1"},{"type":"function","doc":"","title":"gl.patchParameterfv/2","ref":"gl.html#patchParameterfv/2"},{"type":"function","doc":"[`gl:patchParameter()`](`patchParameteri/2`) specifies the parameters that will\nbe used for patch primitives. `Pname` specifies the parameter to modify and must\nbe either `?GL_PATCH_VERTICES`, `?GL_PATCH_DEFAULT_OUTER_LEVEL` or\n`?GL_PATCH_DEFAULT_INNER_LEVEL`. For\n[`gl:patchParameteri/2`](`patchParameteri/2`), `Value` specifies the new value\nfor the parameter specified by `Pname`. For\n[`gl:patchParameterfv/2`](`patchParameteri/2`), `Values` specifies the address\nof an array containing the new values for the parameter specified by `Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPatchParameter.xhtml)","title":"gl.patchParameteri/2","ref":"gl.html#patchParameteri/2"},{"type":"function","doc":"[`gl:pauseTransformFeedback/0`](`pauseTransformFeedback/0`) pauses transform\nfeedback operations on the currently active transform feedback object. When\ntransform feedback operations are paused, transform feedback is still considered\nactive and changing most transform feedback state related to the object results\nin an error. However, a new transform feedback object may be bound while\ntransform feedback is paused.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPauseTransformFeedback.xhtml)","title":"gl.pauseTransformFeedback/0","ref":"gl.html#pauseTransformFeedback/0"},{"type":"function","doc":"","title":"gl.pixelMapfv/3","ref":"gl.html#pixelMapfv/3"},{"type":"function","doc":"","title":"gl.pixelMapuiv/3","ref":"gl.html#pixelMapuiv/3"},{"type":"function","doc":"[`gl:pixelMap()`](`pixelMapfv/3`) sets up translation tables, or `maps`, used by\n[`gl:copyPixels/5`](`copyPixels/5`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`),\n[`gl:drawPixels/5`](`drawPixels/5`), [`gl:readPixels/7`](`readPixels/7`),\n[`gl:texImage1D/8`](`texImage1D/8`), [`gl:texImage2D/9`](`texImage2D/9`),\n[`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`). Additionally, if the ARB_imaging\nsubset is supported, the routines [`gl:colorTable/6`](`colorTable/6`),\n[`gl:colorSubTable/6`](`colorSubTable/6`),\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`),\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`),\n[`gl:histogram/4`](`histogram/4`), [`gl:minmax/3`](`minmax/3`), and\n[`gl:separableFilter2D/8`](`separableFilter2D/8`). Use of these maps is\ndescribed completely in the [`gl:pixelTransfer()`](`pixelTransferf/2`) reference\npage, and partly in the reference pages for the pixel and texture image\ncommands. Only the specification of the maps is described in this reference\npage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelMap.xml)","title":"gl.pixelMapusv/3","ref":"gl.html#pixelMapusv/3"},{"type":"function","doc":"","title":"gl.pixelStoref/2","ref":"gl.html#pixelStoref/2"},{"type":"function","doc":"[`gl:pixelStore()`](`pixelStoref/2`) sets pixel storage modes that affect the\noperation of subsequent [`gl:readPixels/7`](`readPixels/7`) as well as the\nunpacking of texture patterns (see [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`),\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)),\n[`gl:compressedTexImage1D/7`](`compressedTexImage1D/7`),\n[`gl:compressedTexImage2D/8`](`compressedTexImage2D/8`),\n[`gl:compressedTexImage3D/9`](`compressedTexImage3D/9`),\n[`gl:compressedTexSubImage1D/7`](`compressedTexSubImage1D/7`),\n[`gl:compressedTexSubImage2D/9`](`compressedTexSubImage2D/9`) or\n[`gl:compressedTexSubImage1D/7`](`compressedTexSubImage1D/7`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPixelStore.xhtml)","title":"gl.pixelStorei/2","ref":"gl.html#pixelStorei/2"},{"type":"function","doc":"","title":"gl.pixelTransferf/2","ref":"gl.html#pixelTransferf/2"},{"type":"function","doc":"[`gl:pixelTransfer()`](`pixelTransferf/2`) sets pixel transfer modes that affect\nthe operation of subsequent [`gl:copyPixels/5`](`copyPixels/5`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`),\n[`gl:drawPixels/5`](`drawPixels/5`), [`gl:readPixels/7`](`readPixels/7`),\n[`gl:texImage1D/8`](`texImage1D/8`), [`gl:texImage2D/9`](`texImage2D/9`),\n[`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`) commands. Additionally, if the\nARB_imaging subset is supported, the routines\n[`gl:colorTable/6`](`colorTable/6`), [`gl:colorSubTable/6`](`colorSubTable/6`),\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`),\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`),\n[`gl:histogram/4`](`histogram/4`), [`gl:minmax/3`](`minmax/3`), and\n[`gl:separableFilter2D/8`](`separableFilter2D/8`) are also affected. The\nalgorithms that are specified by pixel transfer modes operate on pixels after\nthey are read from the frame buffer\n([`gl:copyPixels/5`](`copyPixels/5`)[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`), and\n[`gl:readPixels/7`](`readPixels/7`)), or unpacked from client memory\n([`gl:drawPixels/5`](`drawPixels/5`), [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)). Pixel transfer operations happen\nin the same order, and in the same manner, regardless of the command that\nresulted in the pixel operation. Pixel storage modes (see\n[`gl:pixelStore()`](`pixelStoref/2`)) control the unpacking of pixels being read\nfrom client memory and the packing of pixels being written back into client\nmemory.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelTransfer.xml)","title":"gl.pixelTransferi/2","ref":"gl.html#pixelTransferi/2"},{"type":"function","doc":"[`gl:pixelZoom/2`](`pixelZoom/2`) specifies values for the x and y zoom factors.\nDuring the execution of [`gl:drawPixels/5`](`drawPixels/5`) or\n[`gl:copyPixels/5`](`copyPixels/5`), if ( xr, yr) is the current raster\nposition, and a given element is in the mth row and nth column of the pixel\nrectangle, then pixels whose centers are in the rectangle with corners at\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelZoom.xml)","title":"gl.pixelZoom/2","ref":"gl.html#pixelZoom/2"},{"type":"function","doc":"","title":"gl.pointParameterf/2","ref":"gl.html#pointParameterf/2"},{"type":"function","doc":"","title":"gl.pointParameterfv/2","ref":"gl.html#pointParameterfv/2"},{"type":"function","doc":"","title":"gl.pointParameteri/2","ref":"gl.html#pointParameteri/2"},{"type":"function","doc":"The following values are accepted for `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPointParameter.xhtml)","title":"gl.pointParameteriv/2","ref":"gl.html#pointParameteriv/2"},{"type":"function","doc":"[`gl:pointSize/1`](`pointSize/1`) specifies the rasterized diameter of points.\nIf point size mode is disabled (see [`gl:enable/1`](`enable/1`) with parameter\n`?GL_PROGRAM_POINT_SIZE`), this value will be used to rasterize points.\nOtherwise, the value written to the shading language built-in variable\ngl_PointSize will be used.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPointSize.xhtml)","title":"gl.pointSize/1","ref":"gl.html#pointSize/1"},{"type":"function","doc":"[`gl:polygonMode/2`](`polygonMode/2`) controls the interpretation of polygons\nfor rasterization. `Face` describes which polygons `Mode` applies to: both front\nand back-facing polygons (`?GL_FRONT_AND_BACK`). The polygon mode affects only\nthe final rasterization of polygons. In particular, a polygon's vertices are lit\nand the polygon is clipped and possibly culled before these modes are applied.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPolygonMode.xhtml)","title":"gl.polygonMode/2","ref":"gl.html#polygonMode/2"},{"type":"function","doc":"When `?GL_POLYGON_OFFSET_FILL`, `?GL_POLYGON_OFFSET_LINE`, or\n`?GL_POLYGON_OFFSET_POINT` is enabled, each fragment's `depth` value will be\noffset after it is interpolated from the `depth` values of the appropriate\nvertices. The value of the offset is factor×DZ+r×units, where DZ is a\nmeasurement of the change in depth relative to the screen area of the polygon,\nand r is the smallest value that is guaranteed to produce a resolvable offset\nfor a given implementation. The offset is added before the depth test is\nperformed and before the value is written into the depth buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPolygonOffset.xhtml)","title":"gl.polygonOffset/2","ref":"gl.html#polygonOffset/2"},{"type":"function","doc":"No documentation available.","title":"gl.polygonOffsetClamp/3","ref":"gl.html#polygonOffsetClamp/3"},{"type":"function","doc":"Polygon stippling, like line stippling (see\n[`gl:lineStipple/2`](`lineStipple/2`)), masks out certain fragments produced by\nrasterization, creating a pattern. Stippling is independent of polygon\nantialiasing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPolygonStipple.xml)","title":"gl.polygonStipple/1","ref":"gl.html#polygonStipple/1"},{"type":"function","doc":"","title":"gl.popAttrib/0","ref":"gl.html#popAttrib/0"},{"type":"function","doc":"","title":"gl.popClientAttrib/0","ref":"gl.html#popClientAttrib/0"},{"type":"function","doc":"","title":"gl.popDebugGroup/0","ref":"gl.html#popDebugGroup/0"},{"type":"function","doc":"","title":"gl.popMatrix/0","ref":"gl.html#popMatrix/0"},{"type":"function","doc":"","title":"gl.popName/0","ref":"gl.html#popName/0"},{"type":"function","doc":"[`gl:primitiveRestartIndex/1`](`primitiveRestartIndex/1`) specifies a vertex\narray element that is treated specially when primitive restarting is enabled.\nThis is known as the primitive restart index.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPrimitiveRestartIndex.xhtml)","title":"gl.primitiveRestartIndex/1","ref":"gl.html#primitiveRestartIndex/1"},{"type":"function","doc":"[`gl:prioritizeTextures/2`](`prioritizeTextures/2`) assigns the `N` texture\npriorities given in `Priorities` to the `N` textures named in `Textures`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPrioritizeTextures.xml)","title":"gl.prioritizeTextures/2","ref":"gl.html#prioritizeTextures/2"},{"type":"function","doc":"[`gl:programBinary/3`](`programBinary/3`) loads a program object with a program\nbinary previously returned from [`gl:getProgramBinary/2`](`getProgramBinary/2`).\n`BinaryFormat` and `Binary` must be those returned by a previous call to\n[`gl:getProgramBinary/2`](`getProgramBinary/2`), and `Length` must be the length\nreturned by [`gl:getProgramBinary/2`](`getProgramBinary/2`), or by\n[`gl:getProgram()`](`getProgramiv/2`) when called with `Pname` set to\n`?GL_PROGRAM_BINARY_LENGTH`. If these conditions are not met, loading the\nprogram binary will fail and `Program`'s `?GL_LINK_STATUS` will be set to\n`?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramBinary.xhtml)","title":"gl.programBinary/3","ref":"gl.html#programBinary/3"},{"type":"function","doc":"[`gl:programParameter()`](`programParameteri/3`) specifies a new value for the\nparameter nameed by `Pname` for the program object `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramParameter.xhtml)","title":"gl.programParameteri/3","ref":"gl.html#programParameteri/3"},{"type":"function","doc":"","title":"gl.programUniform1d/3","ref":"gl.html#programUniform1d/3"},{"type":"function","doc":"","title":"gl.programUniform1dv/3","ref":"gl.html#programUniform1dv/3"},{"type":"function","doc":"","title":"gl.programUniform1f/3","ref":"gl.html#programUniform1f/3"},{"type":"function","doc":"","title":"gl.programUniform1fv/3","ref":"gl.html#programUniform1fv/3"},{"type":"function","doc":"","title":"gl.programUniform1i/3","ref":"gl.html#programUniform1i/3"},{"type":"function","doc":"","title":"gl.programUniform1iv/3","ref":"gl.html#programUniform1iv/3"},{"type":"function","doc":"","title":"gl.programUniform1ui/3","ref":"gl.html#programUniform1ui/3"},{"type":"function","doc":"","title":"gl.programUniform1uiv/3","ref":"gl.html#programUniform1uiv/3"},{"type":"function","doc":"","title":"gl.programUniform2d/4","ref":"gl.html#programUniform2d/4"},{"type":"function","doc":"","title":"gl.programUniform2dv/3","ref":"gl.html#programUniform2dv/3"},{"type":"function","doc":"","title":"gl.programUniform2f/4","ref":"gl.html#programUniform2f/4"},{"type":"function","doc":"","title":"gl.programUniform2fv/3","ref":"gl.html#programUniform2fv/3"},{"type":"function","doc":"","title":"gl.programUniform2i/4","ref":"gl.html#programUniform2i/4"},{"type":"function","doc":"","title":"gl.programUniform2iv/3","ref":"gl.html#programUniform2iv/3"},{"type":"function","doc":"","title":"gl.programUniform2ui/4","ref":"gl.html#programUniform2ui/4"},{"type":"function","doc":"","title":"gl.programUniform2uiv/3","ref":"gl.html#programUniform2uiv/3"},{"type":"function","doc":"","title":"gl.programUniform3d/5","ref":"gl.html#programUniform3d/5"},{"type":"function","doc":"","title":"gl.programUniform3dv/3","ref":"gl.html#programUniform3dv/3"},{"type":"function","doc":"","title":"gl.programUniform3f/5","ref":"gl.html#programUniform3f/5"},{"type":"function","doc":"","title":"gl.programUniform3fv/3","ref":"gl.html#programUniform3fv/3"},{"type":"function","doc":"","title":"gl.programUniform3i/5","ref":"gl.html#programUniform3i/5"},{"type":"function","doc":"","title":"gl.programUniform3iv/3","ref":"gl.html#programUniform3iv/3"},{"type":"function","doc":"","title":"gl.programUniform3ui/5","ref":"gl.html#programUniform3ui/5"},{"type":"function","doc":"","title":"gl.programUniform3uiv/3","ref":"gl.html#programUniform3uiv/3"},{"type":"function","doc":"","title":"gl.programUniform4d/6","ref":"gl.html#programUniform4d/6"},{"type":"function","doc":"","title":"gl.programUniform4dv/3","ref":"gl.html#programUniform4dv/3"},{"type":"function","doc":"","title":"gl.programUniform4f/6","ref":"gl.html#programUniform4f/6"},{"type":"function","doc":"","title":"gl.programUniform4fv/3","ref":"gl.html#programUniform4fv/3"},{"type":"function","doc":"","title":"gl.programUniform4i/6","ref":"gl.html#programUniform4i/6"},{"type":"function","doc":"","title":"gl.programUniform4iv/3","ref":"gl.html#programUniform4iv/3"},{"type":"function","doc":"","title":"gl.programUniform4ui/6","ref":"gl.html#programUniform4ui/6"},{"type":"function","doc":"","title":"gl.programUniform4uiv/3","ref":"gl.html#programUniform4uiv/3"},{"type":"function","doc":"","title":"gl.programUniformMatrix2dv/4","ref":"gl.html#programUniformMatrix2dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix2fv/4","ref":"gl.html#programUniformMatrix2fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix2x3dv/4","ref":"gl.html#programUniformMatrix2x3dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix2x3fv/4","ref":"gl.html#programUniformMatrix2x3fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix2x4dv/4","ref":"gl.html#programUniformMatrix2x4dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix2x4fv/4","ref":"gl.html#programUniformMatrix2x4fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3dv/4","ref":"gl.html#programUniformMatrix3dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3fv/4","ref":"gl.html#programUniformMatrix3fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3x2dv/4","ref":"gl.html#programUniformMatrix3x2dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3x2fv/4","ref":"gl.html#programUniformMatrix3x2fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3x4dv/4","ref":"gl.html#programUniformMatrix3x4dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix3x4fv/4","ref":"gl.html#programUniformMatrix3x4fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix4dv/4","ref":"gl.html#programUniformMatrix4dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix4fv/4","ref":"gl.html#programUniformMatrix4fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix4x2dv/4","ref":"gl.html#programUniformMatrix4x2dv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix4x2fv/4","ref":"gl.html#programUniformMatrix4x2fv/4"},{"type":"function","doc":"","title":"gl.programUniformMatrix4x3dv/4","ref":"gl.html#programUniformMatrix4x3dv/4"},{"type":"function","doc":"[`gl:programUniform()`](`programUniform1i/3`) modifies the value of a uniform\nvariable or a uniform variable array. The location of the uniform variable to be\nmodified is specified by `Location`, which should be a value returned by\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n[`gl:programUniform()`](`programUniform1i/3`) operates on the program object\nspecified by `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramUniform.xhtml)","title":"gl.programUniformMatrix4x3fv/4","ref":"gl.html#programUniformMatrix4x3fv/4"},{"type":"function","doc":"`Flatshading` a vertex shader varying output means to assign all vetices of the\nprimitive the same value for that output. The vertex from which these values is\nderived is known as the `provoking vertex` and\n[`gl:provokingVertex/1`](`provokingVertex/1`) specifies which vertex is to be\nused as the source of data for flat shaded varyings.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProvokingVertex.xhtml)","title":"gl.provokingVertex/1","ref":"gl.html#provokingVertex/1"},{"type":"function","doc":"[`gl:pushAttrib/1`](`pushAttrib/1`) takes one argument, a mask that indicates\nwhich groups of state variables to save on the attribute stack. Symbolic\nconstants are used to set bits in the mask. `Mask` is typically constructed by\nspecifying the bitwise-or of several of these constants together. The special\nmask `?GL_ALL_ATTRIB_BITS` can be used to save all stackable states.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushAttrib.xml)","title":"gl.pushAttrib/1","ref":"gl.html#pushAttrib/1"},{"type":"function","doc":"[`gl:pushClientAttrib/1`](`pushClientAttrib/1`) takes one argument, a mask that\nindicates which groups of client-state variables to save on the client attribute\nstack. Symbolic constants are used to set bits in the mask. `Mask` is typically\nconstructed by specifying the bitwise-or of several of these constants together.\nThe special mask `?GL_CLIENT_ALL_ATTRIB_BITS` can be used to save all stackable\nclient state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushClientAttrib.xml)","title":"gl.pushClientAttrib/1","ref":"gl.html#pushClientAttrib/1"},{"type":"function","doc":"[`gl:pushDebugGroup/4`](`pushDebugGroup/4`) pushes a debug group described by\nthe string `Message` into the command stream. The value of `Id` specifies the ID\nof messages generated. The parameter `Length` contains the number of characters\nin `Message`. If `Length` is negative, it is implied that `Message` contains a\nnull terminated string. The message has the specified `Source` and `Id`, the\n`Type``?GL_DEBUG_TYPE_PUSH_GROUP`, and\n`Severity``?GL_DEBUG_SEVERITY_NOTIFICATION`. The GL will put a new debug group\non top of the debug group stack which inherits the control of the volume of\ndebug output of the debug group previously residing on the top of the debug\ngroup stack. Because debug groups are strictly hierarchical, any additional\ncontrol of the debug output volume will only apply within the active debug group\nand the debug groups pushed on top of the active debug group.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPushDebugGroup.xhtml)","title":"gl.pushDebugGroup/4","ref":"gl.html#pushDebugGroup/4"},{"type":"function","doc":"There is a stack of matrices for each of the matrix modes. In `?GL_MODELVIEW`\nmode, the stack depth is at least 32. In the other modes, `?GL_COLOR`,\n`?GL_PROJECTION`, and `?GL_TEXTURE`, the depth is at least 2. The current matrix\nin any mode is the matrix on the top of the stack for that mode.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushMatrix.xml)","title":"gl.pushMatrix/0","ref":"gl.html#pushMatrix/0"},{"type":"function","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers\nand is initially empty.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushName.xml)","title":"gl.pushName/1","ref":"gl.html#pushName/1"},{"type":"function","doc":"[`gl:queryCounter/2`](`queryCounter/2`) causes the GL to record the current time\ninto the query object named `Id`. `Target` must be `?GL_TIMESTAMP`. The time is\nrecorded after all previous commands on the GL client and server state and the\nframebuffer have been fully realized. When the time is recorded, the query\nresult for that object is marked available.\n[`gl:queryCounter/2`](`queryCounter/2`) timer queries can be used within a\n[`gl:beginQuery/2`](`beginQuery/2`) / [`gl:endQuery/1`](`beginQuery/2`) block\nwhere the target is `?GL_TIME_ELAPSED` and it does not affect the result of that\nquery object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glQueryCounter.xhtml)","title":"gl.queryCounter/2","ref":"gl.html#queryCounter/2"},{"type":"function","doc":"","title":"gl.rasterPos2d/2","ref":"gl.html#rasterPos2d/2"},{"type":"function","doc":"","title":"gl.rasterPos2dv/1","ref":"gl.html#rasterPos2dv/1"},{"type":"function","doc":"","title":"gl.rasterPos2f/2","ref":"gl.html#rasterPos2f/2"},{"type":"function","doc":"","title":"gl.rasterPos2fv/1","ref":"gl.html#rasterPos2fv/1"},{"type":"function","doc":"","title":"gl.rasterPos2i/2","ref":"gl.html#rasterPos2i/2"},{"type":"function","doc":"","title":"gl.rasterPos2iv/1","ref":"gl.html#rasterPos2iv/1"},{"type":"function","doc":"","title":"gl.rasterPos2s/2","ref":"gl.html#rasterPos2s/2"},{"type":"function","doc":"","title":"gl.rasterPos2sv/1","ref":"gl.html#rasterPos2sv/1"},{"type":"function","doc":"","title":"gl.rasterPos3d/3","ref":"gl.html#rasterPos3d/3"},{"type":"function","doc":"","title":"gl.rasterPos3dv/1","ref":"gl.html#rasterPos3dv/1"},{"type":"function","doc":"","title":"gl.rasterPos3f/3","ref":"gl.html#rasterPos3f/3"},{"type":"function","doc":"","title":"gl.rasterPos3fv/1","ref":"gl.html#rasterPos3fv/1"},{"type":"function","doc":"","title":"gl.rasterPos3i/3","ref":"gl.html#rasterPos3i/3"},{"type":"function","doc":"","title":"gl.rasterPos3iv/1","ref":"gl.html#rasterPos3iv/1"},{"type":"function","doc":"","title":"gl.rasterPos3s/3","ref":"gl.html#rasterPos3s/3"},{"type":"function","doc":"","title":"gl.rasterPos3sv/1","ref":"gl.html#rasterPos3sv/1"},{"type":"function","doc":"","title":"gl.rasterPos4d/4","ref":"gl.html#rasterPos4d/4"},{"type":"function","doc":"","title":"gl.rasterPos4dv/1","ref":"gl.html#rasterPos4dv/1"},{"type":"function","doc":"","title":"gl.rasterPos4f/4","ref":"gl.html#rasterPos4f/4"},{"type":"function","doc":"","title":"gl.rasterPos4fv/1","ref":"gl.html#rasterPos4fv/1"},{"type":"function","doc":"","title":"gl.rasterPos4i/4","ref":"gl.html#rasterPos4i/4"},{"type":"function","doc":"","title":"gl.rasterPos4iv/1","ref":"gl.html#rasterPos4iv/1"},{"type":"function","doc":"","title":"gl.rasterPos4s/4","ref":"gl.html#rasterPos4s/4"},{"type":"function","doc":"The GL maintains a 3D position in window coordinates. This position, called the\nraster position, is used to position pixel and bitmap write operations. It is\nmaintained with subpixel accuracy. See [`gl:bitmap/7`](`bitmap/7`),\n[`gl:drawPixels/5`](`drawPixels/5`), and [`gl:copyPixels/5`](`copyPixels/5`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRasterPos.xml)","title":"gl.rasterPos4sv/1","ref":"gl.html#rasterPos4sv/1"},{"type":"function","doc":"[`gl:readBuffer/1`](`readBuffer/1`) specifies a color buffer as the source for\nsubsequent [`gl:readPixels/7`](`readPixels/7`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`), and\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`) commands. `Mode` accepts one\nof twelve or more predefined values. In a fully configured system, `?GL_FRONT`,\n`?GL_LEFT`, and `?GL_FRONT_LEFT` all name the front left buffer,\n`?GL_FRONT_RIGHT` and `?GL_RIGHT` name the front right buffer, and\n`?GL_BACK_LEFT` and `?GL_BACK` name the back left buffer. Further more, the\nconstants `?GL_COLOR_ATTACHMENT``i` may be used to indicate the `i`th color\nattachment where `i` ranges from zero to the value of\n`?GL_MAX_COLOR_ATTACHMENTS` minus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReadBuffer.xhtml)","title":"gl.readBuffer/1","ref":"gl.html#readBuffer/1"},{"type":"function","doc":"[`gl:readPixels/7`](`readPixels/7`) and `glReadnPixels` return pixel data from\nthe frame buffer, starting with the pixel whose lower left corner is at location\n(`X`, `Y`), into client memory starting at location `Data`. Several parameters\ncontrol the processing of the pixel data before it is placed into client memory.\nThese parameters are set with [`gl:pixelStore()`](`pixelStoref/2`). This\nreference page describes the effects on [`gl:readPixels/7`](`readPixels/7`) and\n`glReadnPixels` of most, but not all of the parameters specified by these three\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReadPixels.xhtml)","title":"gl.readPixels/7","ref":"gl.html#readPixels/7"},{"type":"function","doc":"","title":"gl.rectd/4","ref":"gl.html#rectd/4"},{"type":"function","doc":"","title":"gl.rectdv/2","ref":"gl.html#rectdv/2"},{"type":"function","doc":"","title":"gl.rectf/4","ref":"gl.html#rectf/4"},{"type":"function","doc":"","title":"gl.rectfv/2","ref":"gl.html#rectfv/2"},{"type":"function","doc":"","title":"gl.recti/4","ref":"gl.html#recti/4"},{"type":"function","doc":"","title":"gl.rectiv/2","ref":"gl.html#rectiv/2"},{"type":"function","doc":"","title":"gl.rects/4","ref":"gl.html#rects/4"},{"type":"function","doc":"[`gl:rect()`](`rectd/4`) supports efficient specification of rectangles as two\ncorner points. Each rectangle command takes four arguments, organized either as\ntwo consecutive pairs of (x y) coordinates or as two pointers to arrays, each\ncontaining an (x y) pair. The resulting rectangle is defined in the z=0 plane.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRect.xml)","title":"gl.rectsv/2","ref":"gl.html#rectsv/2"},{"type":"function","doc":"[`gl:releaseShaderCompiler/0`](`releaseShaderCompiler/0`) provides a hint to the\nimplementation that it may free internal resources associated with its shader\ncompiler. [`gl:compileShader/1`](`compileShader/1`) may subsequently be called\nand the implementation may at that time reallocate resources previously freed by\nthe call to [`gl:releaseShaderCompiler/0`](`releaseShaderCompiler/0`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReleaseShaderCompiler.xhtml)","title":"gl.releaseShaderCompiler/0","ref":"gl.html#releaseShaderCompiler/0"},{"type":"function","doc":"[`gl:renderbufferStorage/4`](`renderbufferStorage/4`) is equivalent to calling\n[`gl:renderbufferStorageMultisample/5`](`renderbufferStorageMultisample/5`) with\nthe `Samples` set to zero, and `glNamedRenderbufferStorage` is equivalent to\ncalling `glNamedRenderbufferStorageMultisample` with the samples set to zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glRenderbufferStorage.xhtml)","title":"gl.renderbufferStorage/4","ref":"gl.html#renderbufferStorage/4"},{"type":"function","doc":"[`gl:renderbufferStorageMultisample/5`](`renderbufferStorageMultisample/5`) and\n`glNamedRenderbufferStorageMultisample` establish the data storage, format,\ndimensions and number of samples of a renderbuffer object's image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glRenderbufferStorageMultisample.xhtml)","title":"gl.renderbufferStorageMultisample/5","ref":"gl.html#renderbufferStorageMultisample/5"},{"type":"function","doc":"[`gl:renderMode/1`](`renderMode/1`) sets the rasterization mode. It takes one\nargument, `Mode`, which can assume one of three predefined values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRenderMode.xml)","title":"gl.renderMode/1","ref":"gl.html#renderMode/1"},{"type":"function","doc":"[`gl:resetHistogram/1`](`resetHistogram/1`) resets all the elements of the\ncurrent histogram table to zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glResetHistogram.xml)","title":"gl.resetHistogram/1","ref":"gl.html#resetHistogram/1"},{"type":"function","doc":"[`gl:resetMinmax/1`](`resetMinmax/1`) resets the elements of the current minmax\ntable to their initial values: the \\`\\`maximum'' element receives the minimum\npossible component values, and the \\`\\`minimum'' element receives the maximum\npossible component values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glResetMinmax.xml)","title":"gl.resetMinmax/1","ref":"gl.html#resetMinmax/1"},{"type":"function","doc":"[`gl:resumeTransformFeedback/0`](`resumeTransformFeedback/0`) resumes transform\nfeedback operations on the currently active transform feedback object. When\ntransform feedback operations are paused, transform feedback is still considered\nactive and changing most transform feedback state related to the object results\nin an error. However, a new transform feedback object may be bound while\ntransform feedback is paused.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glResumeTransformFeedback.xhtml)","title":"gl.resumeTransformFeedback/0","ref":"gl.html#resumeTransformFeedback/0"},{"type":"function","doc":"","title":"gl.rotated/4","ref":"gl.html#rotated/4"},{"type":"function","doc":"[`gl:rotate()`](`rotated/4`) produces a rotation of `Angle` degrees around the\nvector (x y z). The current matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is\nmultiplied by a rotation matrix with the product replacing the current matrix,\nas if [`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix\nas its argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml)","title":"gl.rotatef/4","ref":"gl.html#rotatef/4"},{"type":"function","doc":"Multisampling samples a pixel multiple times at various implementation-dependent\nsubpixel locations to generate antialiasing effects. Multisampling transparently\nantialiases points, lines, polygons, and images if it is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSampleCoverage.xhtml)","title":"gl.sampleCoverage/2","ref":"gl.html#sampleCoverage/2"},{"type":"function","doc":"[`gl:sampleMaski/2`](`sampleMaski/2`) sets one 32-bit sub-word of the multi-word\nsample mask, `?GL_SAMPLE_MASK_VALUE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSampleMaski.xhtml)","title":"gl.sampleMaski/2","ref":"gl.html#sampleMaski/2"},{"type":"function","doc":"","title":"gl.samplerParameterf/3","ref":"gl.html#samplerParameterf/3"},{"type":"function","doc":"","title":"gl.samplerParameterfv/3","ref":"gl.html#samplerParameterfv/3"},{"type":"function","doc":"","title":"gl.samplerParameterIiv/3","ref":"gl.html#samplerParameterIiv/3"},{"type":"function","doc":"","title":"gl.samplerParameterIuiv/3","ref":"gl.html#samplerParameterIuiv/3"},{"type":"function","doc":"","title":"gl.samplerParameteri/3","ref":"gl.html#samplerParameteri/3"},{"type":"function","doc":"[`gl:samplerParameter()`](`samplerParameteri/3`) assigns the value or values in\n`Params` to the sampler parameter specified as `Pname`. `Sampler` specifies the\nsampler object to be modified, and must be the name of a sampler object\npreviously returned from a call to [`gl:genSamplers/1`](`genSamplers/1`). The\nfollowing symbols are accepted in `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSamplerParameter.xhtml)","title":"gl.samplerParameteriv/3","ref":"gl.html#samplerParameteriv/3"},{"type":"function","doc":"","title":"gl.scaled/3","ref":"gl.html#scaled/3"},{"type":"function","doc":"[`gl:scale()`](`scaled/3`) produces a nonuniform scaling along the `x`, `y`, and\n`z` axes. The three parameters indicate the desired scale factor along each of\nthe three axes.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glScale.xml)","title":"gl.scalef/3","ref":"gl.html#scalef/3"},{"type":"function","doc":"[`gl:scissor/4`](`scissor/4`) defines a rectangle, called the scissor box, in\nwindow coordinates. The first two arguments, `X` and `Y`, specify the lower left\ncorner of the box. `Width` and `Height` specify the width and height of the box.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissor.xhtml)","title":"gl.scissor/4","ref":"gl.html#scissor/4"},{"type":"function","doc":"[`gl:scissorArrayv/2`](`scissorArrayv/2`) defines rectangles, called scissor\nboxes, in window coordinates for each viewport. `First` specifies the index of\nthe first scissor box to modify and `Count` specifies the number of scissor\nboxes to modify. `First` must be less than the value of `?GL_MAX_VIEWPORTS`, and\n`First` \\+ `Count` must be less than or equal to the value of\n`?GL_MAX_VIEWPORTS`. `V` specifies the address of an array containing integers\nspecifying the lower left corner of the scissor boxes, and the width and height\nof the scissor boxes, in that order.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissorArray.xhtml)","title":"gl.scissorArrayv/2","ref":"gl.html#scissorArrayv/2"},{"type":"function","doc":"","title":"gl.scissorIndexed/5","ref":"gl.html#scissorIndexed/5"},{"type":"function","doc":"[`gl:scissorIndexed/5`](`scissorIndexed/5`) defines the scissor box for a\nspecified viewport. `Index` specifies the index of scissor box to modify.\n`Index` must be less than the value of `?GL_MAX_VIEWPORTS`. For\n[`gl:scissorIndexed/5`](`scissorIndexed/5`), `Left`, `Bottom`, `Width` and\n`Height` specify the left, bottom, width and height of the scissor box, in\npixels, respectively. For [`gl:scissorIndexedv/2`](`scissorIndexed/5`), `V`\nspecifies the address of an array containing integers specifying the lower left\ncorner of the scissor box, and the width and height of the scissor box, in that\norder.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissorIndexed.xhtml)","title":"gl.scissorIndexedv/2","ref":"gl.html#scissorIndexedv/2"},{"type":"function","doc":"","title":"gl.secondaryColor3b/3","ref":"gl.html#secondaryColor3b/3"},{"type":"function","doc":"","title":"gl.secondaryColor3bv/1","ref":"gl.html#secondaryColor3bv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3d/3","ref":"gl.html#secondaryColor3d/3"},{"type":"function","doc":"","title":"gl.secondaryColor3dv/1","ref":"gl.html#secondaryColor3dv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3f/3","ref":"gl.html#secondaryColor3f/3"},{"type":"function","doc":"","title":"gl.secondaryColor3fv/1","ref":"gl.html#secondaryColor3fv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3i/3","ref":"gl.html#secondaryColor3i/3"},{"type":"function","doc":"","title":"gl.secondaryColor3iv/1","ref":"gl.html#secondaryColor3iv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3s/3","ref":"gl.html#secondaryColor3s/3"},{"type":"function","doc":"","title":"gl.secondaryColor3sv/1","ref":"gl.html#secondaryColor3sv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3ub/3","ref":"gl.html#secondaryColor3ub/3"},{"type":"function","doc":"","title":"gl.secondaryColor3ubv/1","ref":"gl.html#secondaryColor3ubv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3ui/3","ref":"gl.html#secondaryColor3ui/3"},{"type":"function","doc":"","title":"gl.secondaryColor3uiv/1","ref":"gl.html#secondaryColor3uiv/1"},{"type":"function","doc":"","title":"gl.secondaryColor3us/3","ref":"gl.html#secondaryColor3us/3"},{"type":"function","doc":"The GL stores both a primary four-valued RGBA color and a secondary four-valued\nRGBA color (where alpha is always set to 0.0) that is associated with every\nvertex.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSecondaryColor.xml)","title":"gl.secondaryColor3usv/1","ref":"gl.html#secondaryColor3usv/1"},{"type":"function","doc":"[`gl:secondaryColorPointer/4`](`secondaryColorPointer/4`) specifies the location\nand data format of an array of color components to use when rendering. `Size`\nspecifies the number of components per color, and must be 3. `Type` specifies\nthe data type of each color component, and `Stride` specifies the byte stride\nfrom one color to the next, allowing vertices and attributes to be packed into a\nsingle array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSecondaryColorPointer.xml)","title":"gl.secondaryColorPointer/4","ref":"gl.html#secondaryColorPointer/4"},{"type":"function","doc":"[`gl:selectBuffer/2`](`selectBuffer/2`) has two arguments: `Buffer` is a pointer\nto an array of unsigned integers, and `Size` indicates the size of the array.\n`Buffer` returns values from the name stack (see\n[`gl:initNames/0`](`initNames/0`), [`gl:loadName/1`](`loadName/1`),\n[`gl:pushName/1`](`pushName/1`)) when the rendering mode is `?GL_SELECT` (see\n[`gl:renderMode/1`](`renderMode/1`)). [`gl:selectBuffer/2`](`selectBuffer/2`)\nmust be issued before selection mode is enabled, and it must not be issued while\nthe rendering mode is `?GL_SELECT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSelectBuffer.xml)","title":"gl.selectBuffer/2","ref":"gl.html#selectBuffer/2"},{"type":"function","doc":"[`gl:separableFilter2D/8`](`separableFilter2D/8`) builds a two-dimensional\nseparable convolution filter kernel from two arrays of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSeparableFilter2D.xml)","title":"gl.separableFilter2D/8","ref":"gl.html#separableFilter2D/8"},{"type":"function","doc":"GL primitives can have either flat or smooth shading. Smooth shading, the\ndefault, causes the computed colors of vertices to be interpolated as the\nprimitive is rasterized, typically assigning different colors to each resulting\npixel fragment. Flat shading selects the computed color of just one vertex and\nassigns it to all the pixel fragments generated by rasterizing a single\nprimitive. In either case, the computed color of a vertex is the result of\nlighting if lighting is enabled, or it is the current color at the time the\nvertex was specified if lighting is disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glShadeModel.xml)","title":"gl.shadeModel/1","ref":"gl.html#shadeModel/1"},{"type":"function","doc":"[`gl:shaderBinary/3`](`shaderBinary/3`) loads pre-compiled shader binary code\ninto the `Count` shader objects whose handles are given in `Shaders`. `Binary`\npoints to `Length` bytes of binary shader code stored in client memory.\n`BinaryFormat` specifies the format of the pre-compiled code.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderBinary.xhtml)","title":"gl.shaderBinary/3","ref":"gl.html#shaderBinary/3"},{"type":"function","doc":"[`gl:shaderSource/2`](`shaderSource/2`) sets the source code in `Shader` to the\nsource code in the array of strings specified by `String`. Any source code\npreviously stored in the shader object is completely replaced. The number of\nstrings in the array is specified by `Count`. If `Length` is `?NULL`, each\nstring is assumed to be null terminated. If `Length` is a value other than\n`?NULL`, it points to an array containing a string length for each of the\ncorresponding elements of `String`. Each element in the `Length` array may\ncontain the length of the corresponding string (the null character is not\ncounted as part of the string length) or a value less than 0 to indicate that\nthe string is null terminated. The source code strings are not scanned or parsed\nat this time; they are simply copied into the specified shader object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderSource.xhtml)","title":"gl.shaderSource/2","ref":"gl.html#shaderSource/2"},{"type":"function","doc":"[`gl:shaderStorageBlockBinding/3`](`shaderStorageBlockBinding/3`), changes the\nactive shader storage block with an assigned index of `StorageBlockIndex` in\nprogram object `Program`. `StorageBlockIndex` must be an active shader storage\nblock index in `Program`. `StorageBlockBinding` must be less than the value of\n`?GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS`. If successful,\n[`gl:shaderStorageBlockBinding/3`](`shaderStorageBlockBinding/3`) specifies that\n`Program` will use the data store of the buffer object bound to the binding\npoint `StorageBlockBinding` to read and write the values of the buffer variables\nin the shader storage block identified by `StorageBlockIndex`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderStorageBlockBinding.xhtml)","title":"gl.shaderStorageBlockBinding/3","ref":"gl.html#shaderStorageBlockBinding/3"},{"type":"function","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. Stencil planes are first drawn into using GL drawing primitives, then\ngeometry and images are rendered using the stencil planes to mask out portions\nof the screen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilFunc.xhtml)","title":"gl.stencilFunc/3","ref":"gl.html#stencilFunc/3"},{"type":"function","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilFuncSeparate.xhtml)","title":"gl.stencilFuncSeparate/4","ref":"gl.html#stencilFuncSeparate/4"},{"type":"function","doc":"[`gl:stencilMask/1`](`stencilMask/1`) controls the writing of individual bits in\nthe stencil planes. The least significant n bits of `Mask`, where n is the\nnumber of bits in the stencil buffer, specify a mask. Where a 1 appears in the\nmask, it's possible to write to the corresponding bit in the stencil buffer.\nWhere a 0 appears, the corresponding bit is write-protected. Initially, all bits\nare enabled for writing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilMask.xhtml)","title":"gl.stencilMask/1","ref":"gl.html#stencilMask/1"},{"type":"function","doc":"[`gl:stencilMaskSeparate/2`](`stencilMaskSeparate/2`) controls the writing of\nindividual bits in the stencil planes. The least significant n bits of `Mask`,\nwhere n is the number of bits in the stencil buffer, specify a mask. Where a 1\nappears in the mask, it's possible to write to the corresponding bit in the\nstencil buffer. Where a 0 appears, the corresponding bit is write-protected.\nInitially, all bits are enabled for writing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilMaskSeparate.xhtml)","title":"gl.stencilMaskSeparate/2","ref":"gl.html#stencilMaskSeparate/2"},{"type":"function","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilOp.xhtml)","title":"gl.stencilOp/3","ref":"gl.html#stencilOp/3"},{"type":"function","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilOpSeparate.xhtml)","title":"gl.stencilOpSeparate/4","ref":"gl.html#stencilOpSeparate/4"},{"type":"function","doc":"","title":"gl.texBuffer/3","ref":"gl.html#texBuffer/3"},{"type":"function","doc":"","title":"gl.texBufferRange/5","ref":"gl.html#texBufferRange/5"},{"type":"function","doc":"","title":"gl.texCoord1d/1","ref":"gl.html#texCoord1d/1"},{"type":"function","doc":"","title":"gl.texCoord1dv/1","ref":"gl.html#texCoord1dv/1"},{"type":"function","doc":"","title":"gl.texCoord1f/1","ref":"gl.html#texCoord1f/1"},{"type":"function","doc":"","title":"gl.texCoord1fv/1","ref":"gl.html#texCoord1fv/1"},{"type":"function","doc":"","title":"gl.texCoord1i/1","ref":"gl.html#texCoord1i/1"},{"type":"function","doc":"","title":"gl.texCoord1iv/1","ref":"gl.html#texCoord1iv/1"},{"type":"function","doc":"","title":"gl.texCoord1s/1","ref":"gl.html#texCoord1s/1"},{"type":"function","doc":"","title":"gl.texCoord1sv/1","ref":"gl.html#texCoord1sv/1"},{"type":"function","doc":"","title":"gl.texCoord2d/2","ref":"gl.html#texCoord2d/2"},{"type":"function","doc":"","title":"gl.texCoord2dv/1","ref":"gl.html#texCoord2dv/1"},{"type":"function","doc":"","title":"gl.texCoord2f/2","ref":"gl.html#texCoord2f/2"},{"type":"function","doc":"","title":"gl.texCoord2fv/1","ref":"gl.html#texCoord2fv/1"},{"type":"function","doc":"","title":"gl.texCoord2i/2","ref":"gl.html#texCoord2i/2"},{"type":"function","doc":"","title":"gl.texCoord2iv/1","ref":"gl.html#texCoord2iv/1"},{"type":"function","doc":"","title":"gl.texCoord2s/2","ref":"gl.html#texCoord2s/2"},{"type":"function","doc":"","title":"gl.texCoord2sv/1","ref":"gl.html#texCoord2sv/1"},{"type":"function","doc":"","title":"gl.texCoord3d/3","ref":"gl.html#texCoord3d/3"},{"type":"function","doc":"","title":"gl.texCoord3dv/1","ref":"gl.html#texCoord3dv/1"},{"type":"function","doc":"","title":"gl.texCoord3f/3","ref":"gl.html#texCoord3f/3"},{"type":"function","doc":"","title":"gl.texCoord3fv/1","ref":"gl.html#texCoord3fv/1"},{"type":"function","doc":"","title":"gl.texCoord3i/3","ref":"gl.html#texCoord3i/3"},{"type":"function","doc":"","title":"gl.texCoord3iv/1","ref":"gl.html#texCoord3iv/1"},{"type":"function","doc":"","title":"gl.texCoord3s/3","ref":"gl.html#texCoord3s/3"},{"type":"function","doc":"","title":"gl.texCoord3sv/1","ref":"gl.html#texCoord3sv/1"},{"type":"function","doc":"","title":"gl.texCoord4d/4","ref":"gl.html#texCoord4d/4"},{"type":"function","doc":"","title":"gl.texCoord4dv/1","ref":"gl.html#texCoord4dv/1"},{"type":"function","doc":"","title":"gl.texCoord4f/4","ref":"gl.html#texCoord4f/4"},{"type":"function","doc":"","title":"gl.texCoord4fv/1","ref":"gl.html#texCoord4fv/1"},{"type":"function","doc":"","title":"gl.texCoord4i/4","ref":"gl.html#texCoord4i/4"},{"type":"function","doc":"","title":"gl.texCoord4iv/1","ref":"gl.html#texCoord4iv/1"},{"type":"function","doc":"","title":"gl.texCoord4s/4","ref":"gl.html#texCoord4s/4"},{"type":"function","doc":"[`gl:texCoord()`](`texCoord1d/1`) specifies texture coordinates in one, two,\nthree, or four dimensions. [`gl:texCoord1()`](`texCoord1d/1`) sets the current\ntexture coordinates to (s 0 0 1); a call to [`gl:texCoord2()`](`texCoord1d/1`)\nsets them to (s t 0 1). Similarly, [`gl:texCoord3()`](`texCoord1d/1`) specifies\nthe texture coordinates as (s t r 1), and [`gl:texCoord4()`](`texCoord1d/1`)\ndefines all four components explicitly as (s t r q).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexCoord.xml)","title":"gl.texCoord4sv/1","ref":"gl.html#texCoord4sv/1"},{"type":"function","doc":"[`gl:texCoordPointer/4`](`texCoordPointer/4`) specifies the location and data\nformat of an array of texture coordinates to use when rendering. `Size`\nspecifies the number of coordinates per texture coordinate set, and must be 1,\n2, 3, or 4. `Type` specifies the data type of each texture coordinate, and\n`Stride` specifies the byte stride from one texture coordinate set to the next,\nallowing vertices and attributes to be packed into a single array or stored in\nseparate arrays. (Single-array storage may be more efficient on some\nimplementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexCoordPointer.xml)","title":"gl.texCoordPointer/4","ref":"gl.html#texCoordPointer/4"},{"type":"function","doc":"","title":"gl.texEnvf/3","ref":"gl.html#texEnvf/3"},{"type":"function","doc":"","title":"gl.texEnvfv/3","ref":"gl.html#texEnvfv/3"},{"type":"function","doc":"","title":"gl.texEnvi/3","ref":"gl.html#texEnvi/3"},{"type":"function","doc":"A texture environment specifies how texture values are interpreted when a\nfragment is textured. When `Target` is `?GL_TEXTURE_FILTER_CONTROL`, `Pname`\nmust be `?GL_TEXTURE_LOD_BIAS`. When `Target` is `?GL_TEXTURE_ENV`, `Pname` can\nbe `?GL_TEXTURE_ENV_MODE`, `?GL_TEXTURE_ENV_COLOR`, `?GL_COMBINE_RGB`,\n`?GL_COMBINE_ALPHA`, `?GL_RGB_SCALE`, `?GL_ALPHA_SCALE`, `?GL_SRC0_RGB`,\n`?GL_SRC1_RGB`, `?GL_SRC2_RGB`, `?GL_SRC0_ALPHA`, `?GL_SRC1_ALPHA`, or\n`?GL_SRC2_ALPHA`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml)","title":"gl.texEnviv/3","ref":"gl.html#texEnviv/3"},{"type":"function","doc":"","title":"gl.texGend/3","ref":"gl.html#texGend/3"},{"type":"function","doc":"","title":"gl.texGendv/3","ref":"gl.html#texGendv/3"},{"type":"function","doc":"","title":"gl.texGenf/3","ref":"gl.html#texGenf/3"},{"type":"function","doc":"","title":"gl.texGenfv/3","ref":"gl.html#texGenfv/3"},{"type":"function","doc":"","title":"gl.texGeni/3","ref":"gl.html#texGeni/3"},{"type":"function","doc":"[`gl:texGen()`](`texGend/3`) selects a texture-coordinate generation function or\nsupplies coefficients for one of the functions. `Coord` names one of the (`s`,\n`t`, `r`, `q`) texture coordinates; it must be one of the symbols `?GL_S`,\n`?GL_T`, `?GL_R`, or `?GL_Q`. `Pname` must be one of three symbolic constants:\n`?GL_TEXTURE_GEN_MODE`, `?GL_OBJECT_PLANE`, or `?GL_EYE_PLANE`. If `Pname` is\n`?GL_TEXTURE_GEN_MODE`, then `Params` chooses a mode, one of\n`?GL_OBJECT_LINEAR`, `?GL_EYE_LINEAR`, `?GL_SPHERE_MAP`, `?GL_NORMAL_MAP`, or\n`?GL_REFLECTION_MAP`. If `Pname` is either `?GL_OBJECT_PLANE` or\n`?GL_EYE_PLANE`, `Params` contains coefficients for the corresponding texture\ngeneration function.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexGen.xml)","title":"gl.texGeniv/3","ref":"gl.html#texGeniv/3"},{"type":"function","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable and disable one-dimensional\ntexturing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_TEXTURE_1D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage1D.xhtml)","title":"gl.texImage1D/8","ref":"gl.html#texImage1D/8"},{"type":"function","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml)","title":"gl.texImage2D/9","ref":"gl.html#texImage2D/9"},{"type":"function","doc":"[`gl:texImage2DMultisample/6`](`texImage2DMultisample/6`) establishes the data\nstorage, format, dimensions and number of samples of a multisample texture's\nimage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2DMultisample.xhtml)","title":"gl.texImage2DMultisample/6","ref":"gl.html#texImage2DMultisample/6"},{"type":"function","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable and disable\nthree-dimensional texturing, call [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) with argument `?GL_TEXTURE_3D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage3D.xhtml)","title":"gl.texImage3D/10","ref":"gl.html#texImage3D/10"},{"type":"function","doc":"[`gl:texImage3DMultisample/7`](`texImage3DMultisample/7`) establishes the data\nstorage, format, dimensions and number of samples of a multisample texture's\nimage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage3DMultisample.xhtml)","title":"gl.texImage3DMultisample/7","ref":"gl.html#texImage3DMultisample/7"},{"type":"function","doc":"","title":"gl.texParameterf/3","ref":"gl.html#texParameterf/3"},{"type":"function","doc":"","title":"gl.texParameterfv/3","ref":"gl.html#texParameterfv/3"},{"type":"function","doc":"","title":"gl.texParameterIiv/3","ref":"gl.html#texParameterIiv/3"},{"type":"function","doc":"","title":"gl.texParameterIuiv/3","ref":"gl.html#texParameterIuiv/3"},{"type":"function","doc":"","title":"gl.texParameteri/3","ref":"gl.html#texParameteri/3"},{"type":"function","doc":"[`gl:texParameter()`](`texParameterf/3`) and\n[`gl:textureParameter()`](`texParameterf/3`) assign the value or values in\n`Params` to the texture parameter specified as `Pname`. For\n[`gl:texParameter()`](`texParameterf/3`), `Target` defines the target texture,\neither `?GL_TEXTURE_1D`, `?GL_TEXTURE_1D_ARRAY`, `?GL_TEXTURE_2D`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_2D_MULTISAMPLE`,\n`?GL_TEXTURE_2D_MULTISAMPLE_ARRAY`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, or `?GL_TEXTURE_RECTANGLE`. The following symbols\nare accepted in `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexParameter.xhtml)","title":"gl.texParameteriv/3","ref":"gl.html#texParameteriv/3"},{"type":"function","doc":"[`gl:texStorage1D/4`](`texStorage1D/4`) and\n[`gl:textureStorage1D()`](`texStorage1D/4`) specify the storage requirements for\nall levels of a one-dimensional texture simultaneously. Once a texture is\nspecified with this command, the format and dimensions of all levels become\nimmutable unless it is a proxy texture. The contents of the image may still be\nmodified, however, its storage requirements may not change. Such a texture is\nreferred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage1D.xhtml)","title":"gl.texStorage1D/4","ref":"gl.html#texStorage1D/4"},{"type":"function","doc":"[`gl:texStorage2D/5`](`texStorage2D/5`) and\n[`gl:textureStorage2D()`](`texStorage2D/5`) specify the storage requirements for\nall levels of a two-dimensional texture or one-dimensional texture array\nsimultaneously. Once a texture is specified with this command, the format and\ndimensions of all levels become immutable unless it is a proxy texture. The\ncontents of the image may still be modified, however, its storage requirements\nmay not change. Such a texture is referred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage2D.xhtml)","title":"gl.texStorage2D/5","ref":"gl.html#texStorage2D/5"},{"type":"function","doc":"[`gl:texStorage2DMultisample/6`](`texStorage2DMultisample/6`) and\n[`gl:textureStorage2DMultisample()`](`texStorage2DMultisample/6`) specify the\nstorage requirements for a two-dimensional multisample texture. Once a texture\nis specified with this command, its format and dimensions become immutable\nunless it is a proxy texture. The contents of the image may still be modified,\nhowever, its storage requirements may not change. Such a texture is referred to\nas an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage2DMultisample.xhtml)","title":"gl.texStorage2DMultisample/6","ref":"gl.html#texStorage2DMultisample/6"},{"type":"function","doc":"[`gl:texStorage3D/6`](`texStorage3D/6`) and\n[`gl:textureStorage3D()`](`texStorage3D/6`) specify the storage requirements for\nall levels of a three-dimensional, two-dimensional array or cube-map array\ntexture simultaneously. Once a texture is specified with this command, the\nformat and dimensions of all levels become immutable unless it is a proxy\ntexture. The contents of the image may still be modified, however, its storage\nrequirements may not change. Such a texture is referred to as an\n`immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage3D.xhtml)","title":"gl.texStorage3D/6","ref":"gl.html#texStorage3D/6"},{"type":"function","doc":"[`gl:texStorage3DMultisample/7`](`texStorage3DMultisample/7`) and\n[`gl:textureStorage3DMultisample()`](`texStorage3DMultisample/7`) specify the\nstorage requirements for a two-dimensional multisample array texture. Once a\ntexture is specified with this command, its format and dimensions become\nimmutable unless it is a proxy texture. The contents of the image may still be\nmodified, however, its storage requirements may not change. Such a texture is\nreferred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage3DMultisample.xhtml)","title":"gl.texStorage3DMultisample/7","ref":"gl.html#texStorage3DMultisample/7"},{"type":"function","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable or disable one-dimensional\ntexturing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_TEXTURE_1D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage1D.xhtml)","title":"gl.texSubImage1D/7","ref":"gl.html#texSubImage1D/7"},{"type":"function","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage2D.xhtml)","title":"gl.texSubImage2D/9","ref":"gl.html#texSubImage2D/9"},{"type":"function","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage3D.xhtml)","title":"gl.texSubImage3D/11","ref":"gl.html#texSubImage3D/11"},{"type":"function","doc":"The values of rendered fragments are undefined when a shader stage fetches\ntexels and the same texels are written via fragment shader outputs, even if the\nreads and writes are not in the same drawing command. To safely read the result\nof a written texel via a texel fetch in a subsequent drawing command, call\n[`gl:textureBarrier/0`](`textureBarrier/0`) between the two drawing commands to\nguarantee that writes have completed and caches have been invalidated before\nsubsequent drawing commands are executed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTextureBarrier.xhtml)","title":"gl.textureBarrier/0","ref":"gl.html#textureBarrier/0"},{"type":"function","doc":"[`gl:texBuffer/3`](`texBuffer/3`) and [`gl:textureBuffer/3`](`texBuffer/3`)\nattaches the data store of a specified buffer object to a specified texture\nobject, and specify the storage format for the texture image found in the buffer\nobject. The texture object must be a buffer texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexBuffer.xhtml)","title":"gl.textureBuffer/3","ref":"gl.html#textureBuffer/3"},{"type":"function","doc":"[`gl:texBufferRange/5`](`texBufferRange/5`) and\n[`gl:textureBufferRange/5`](`texBufferRange/5`) attach a range of the data store\nof a specified buffer object to a specified texture object, and specify the\nstorage format for the texture image found in the buffer object. The texture\nobject must be a buffer texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexBufferRange.xhtml)","title":"gl.textureBufferRange/5","ref":"gl.html#textureBufferRange/5"},{"type":"function","doc":"[`gl:textureView/8`](`textureView/8`) initializes a texture object as an alias,\nor view of another texture object, sharing some or all of the parent texture's\ndata store with the initialized texture. `Texture` specifies a name previously\nreserved by a successful call to [`gl:genTextures/1`](`genTextures/1`) but that\nhas not yet been bound or given a target. `Target` specifies the target for the\nnewly initialized texture and must be compatible with the target of the parent\ntexture, given in `Origtexture` as specified in the following table:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTextureView.xhtml)","title":"gl.textureView/8","ref":"gl.html#textureView/8"},{"type":"function","doc":"[`gl:transformFeedbackBufferBase/3`](`transformFeedbackBufferBase/3`) binds the\nbuffer object `Buffer` to the binding point at index `Index` of the transform\nfeedback object `Xfb`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackBufferBase.xhtml)","title":"gl.transformFeedbackBufferBase/3","ref":"gl.html#transformFeedbackBufferBase/3"},{"type":"function","doc":"[`gl:transformFeedbackBufferRange/5`](`transformFeedbackBufferRange/5`) binds a\nrange of the buffer object `Buffer` represented by `Offset` and `Size` to the\nbinding point at index `Index` of the transform feedback object `Xfb`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackBufferRange.xhtml)","title":"gl.transformFeedbackBufferRange/5","ref":"gl.html#transformFeedbackBufferRange/5"},{"type":"function","doc":"The names of the vertex or geometry shader outputs to be recorded in transform\nfeedback mode are specified using\n[`gl:transformFeedbackVaryings/3`](`transformFeedbackVaryings/3`). When a\ngeometry shader is active, transform feedback records the values of selected\ngeometry shader output variables from the emitted vertices. Otherwise, the\nvalues of the selected vertex shader outputs are recorded.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackVaryings.xhtml)","title":"gl.transformFeedbackVaryings/3","ref":"gl.html#transformFeedbackVaryings/3"},{"type":"function","doc":"","title":"gl.translated/3","ref":"gl.html#translated/3"},{"type":"function","doc":"[`gl:translate()`](`translated/3`) produces a translation by (x y z). The\ncurrent matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is multiplied by this\ntranslation matrix, with the product replacing the current matrix, as if\n[`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix for\nits argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml)","title":"gl.translatef/3","ref":"gl.html#translatef/3"},{"type":"function","doc":"","title":"gl.uniform1d/2","ref":"gl.html#uniform1d/2"},{"type":"function","doc":"","title":"gl.uniform1dv/2","ref":"gl.html#uniform1dv/2"},{"type":"function","doc":"","title":"gl.uniform1f/2","ref":"gl.html#uniform1f/2"},{"type":"function","doc":"","title":"gl.uniform1fv/2","ref":"gl.html#uniform1fv/2"},{"type":"function","doc":"","title":"gl.uniform1i/2","ref":"gl.html#uniform1i/2"},{"type":"function","doc":"","title":"gl.uniform1iv/2","ref":"gl.html#uniform1iv/2"},{"type":"function","doc":"","title":"gl.uniform1ui/2","ref":"gl.html#uniform1ui/2"},{"type":"function","doc":"","title":"gl.uniform1uiv/2","ref":"gl.html#uniform1uiv/2"},{"type":"function","doc":"","title":"gl.uniform2d/3","ref":"gl.html#uniform2d/3"},{"type":"function","doc":"","title":"gl.uniform2dv/2","ref":"gl.html#uniform2dv/2"},{"type":"function","doc":"","title":"gl.uniform2f/3","ref":"gl.html#uniform2f/3"},{"type":"function","doc":"","title":"gl.uniform2fv/2","ref":"gl.html#uniform2fv/2"},{"type":"function","doc":"","title":"gl.uniform2i/3","ref":"gl.html#uniform2i/3"},{"type":"function","doc":"","title":"gl.uniform2iv/2","ref":"gl.html#uniform2iv/2"},{"type":"function","doc":"","title":"gl.uniform2ui/3","ref":"gl.html#uniform2ui/3"},{"type":"function","doc":"","title":"gl.uniform2uiv/2","ref":"gl.html#uniform2uiv/2"},{"type":"function","doc":"","title":"gl.uniform3d/4","ref":"gl.html#uniform3d/4"},{"type":"function","doc":"","title":"gl.uniform3dv/2","ref":"gl.html#uniform3dv/2"},{"type":"function","doc":"","title":"gl.uniform3f/4","ref":"gl.html#uniform3f/4"},{"type":"function","doc":"","title":"gl.uniform3fv/2","ref":"gl.html#uniform3fv/2"},{"type":"function","doc":"","title":"gl.uniform3i/4","ref":"gl.html#uniform3i/4"},{"type":"function","doc":"","title":"gl.uniform3iv/2","ref":"gl.html#uniform3iv/2"},{"type":"function","doc":"","title":"gl.uniform3ui/4","ref":"gl.html#uniform3ui/4"},{"type":"function","doc":"","title":"gl.uniform3uiv/2","ref":"gl.html#uniform3uiv/2"},{"type":"function","doc":"","title":"gl.uniform4d/5","ref":"gl.html#uniform4d/5"},{"type":"function","doc":"","title":"gl.uniform4dv/2","ref":"gl.html#uniform4dv/2"},{"type":"function","doc":"","title":"gl.uniform4f/5","ref":"gl.html#uniform4f/5"},{"type":"function","doc":"","title":"gl.uniform4fv/2","ref":"gl.html#uniform4fv/2"},{"type":"function","doc":"","title":"gl.uniform4i/5","ref":"gl.html#uniform4i/5"},{"type":"function","doc":"","title":"gl.uniform4iv/2","ref":"gl.html#uniform4iv/2"},{"type":"function","doc":"","title":"gl.uniform4ui/5","ref":"gl.html#uniform4ui/5"},{"type":"function","doc":"","title":"gl.uniform4uiv/2","ref":"gl.html#uniform4uiv/2"},{"type":"function","doc":"Binding points for active uniform blocks are assigned using\n[`gl:uniformBlockBinding/3`](`uniformBlockBinding/3`). Each of a program's\nactive uniform blocks has a corresponding uniform buffer binding point.\n`Program` is the name of a program object for which the command\n[`gl:linkProgram/1`](`linkProgram/1`) has been issued in the past.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniformBlockBinding.xhtml)","title":"gl.uniformBlockBinding/3","ref":"gl.html#uniformBlockBinding/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2dv/3","ref":"gl.html#uniformMatrix2dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2fv/3","ref":"gl.html#uniformMatrix2fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2x3dv/3","ref":"gl.html#uniformMatrix2x3dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2x3fv/3","ref":"gl.html#uniformMatrix2x3fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2x4dv/3","ref":"gl.html#uniformMatrix2x4dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix2x4fv/3","ref":"gl.html#uniformMatrix2x4fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3dv/3","ref":"gl.html#uniformMatrix3dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3fv/3","ref":"gl.html#uniformMatrix3fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3x2dv/3","ref":"gl.html#uniformMatrix3x2dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3x2fv/3","ref":"gl.html#uniformMatrix3x2fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3x4dv/3","ref":"gl.html#uniformMatrix3x4dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix3x4fv/3","ref":"gl.html#uniformMatrix3x4fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix4dv/3","ref":"gl.html#uniformMatrix4dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix4fv/3","ref":"gl.html#uniformMatrix4fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix4x2dv/3","ref":"gl.html#uniformMatrix4x2dv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix4x2fv/3","ref":"gl.html#uniformMatrix4x2fv/3"},{"type":"function","doc":"","title":"gl.uniformMatrix4x3dv/3","ref":"gl.html#uniformMatrix4x3dv/3"},{"type":"function","doc":"[`gl:uniform()`](`uniform1f/2`) modifies the value of a uniform variable or a\nuniform variable array. The location of the uniform variable to be modified is\nspecified by `Location`, which should be a value returned by\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n[`gl:uniform()`](`uniform1f/2`) operates on the program object that was made\npart of current state by calling [`gl:useProgram/1`](`useProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniform.xhtml)","title":"gl.uniformMatrix4x3fv/3","ref":"gl.html#uniformMatrix4x3fv/3"},{"type":"function","doc":"[`gl:uniformSubroutines()`](`uniformSubroutinesuiv/2`) loads all active\nsubroutine uniforms for shader stage `Shadertype` of the current program with\nsubroutine indices from `Indices`, storing `Indices[i]` into the uniform at\nlocation `I`. `Count` must be equal to the value of\n`?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS` for the program currently in use at\nshader stage `Shadertype`. Furthermore, all values in `Indices` must be less\nthan the value of `?GL_ACTIVE_SUBROUTINES` for the shader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniformSubroutines.xhtml)","title":"gl.uniformSubroutinesuiv/2","ref":"gl.html#uniformSubroutinesuiv/2"},{"type":"function","doc":"[`gl:useProgram/1`](`useProgram/1`) installs the program object specified by\n`Program` as part of current rendering state. One or more executables are\ncreated in a program object by successfully attaching shader objects to it with\n[`gl:attachShader/2`](`attachShader/2`), successfully compiling the shader\nobjects with [`gl:compileShader/1`](`compileShader/1`), and successfully linking\nthe program object with [`gl:linkProgram/1`](`linkProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUseProgram.xhtml)","title":"gl.useProgram/1","ref":"gl.html#useProgram/1"},{"type":"function","doc":"[`gl:useProgramStages/3`](`useProgramStages/3`) binds executables from a program\nobject associated with a specified set of shader stages to the program pipeline\nobject given by `Pipeline`. `Pipeline` specifies the program pipeline object to\nwhich to bind the executables. `Stages` contains a logical combination of bits\nindicating the shader stages to use within `Program` with the program pipeline\nobject `Pipeline`. `Stages` must be a logical combination of\n`?GL_VERTEX_SHADER_BIT`, `?GL_TESS_CONTROL_SHADER_BIT`,\n`?GL_TESS_EVALUATION_SHADER_BIT`, `?GL_GEOMETRY_SHADER_BIT`,\n`?GL_FRAGMENT_SHADER_BIT` and `?GL_COMPUTE_SHADER_BIT`. Additionally, the\nspecial value `?GL_ALL_SHADER_BITS` may be specified to indicate that all\nexecutables contained in `Program` should be installed in `Pipeline`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUseProgramStages.xhtml)","title":"gl.useProgramStages/3","ref":"gl.html#useProgramStages/3"},{"type":"function","doc":"[`gl:validateProgram/1`](`validateProgram/1`) checks to see whether the\nexecutables contained in `Program` can execute given the current OpenGL state.\nThe information generated by the validation process will be stored in\n`Program`'s information log. The validation information may consist of an empty\nstring, or it may be a string containing information about how the current\nprogram object interacts with the rest of current OpenGL state. This provides a\nway for OpenGL implementers to convey more information about why the current\nprogram is inefficient, suboptimal, failing to execute, and so on.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glValidateProgram.xhtml)","title":"gl.validateProgram/1","ref":"gl.html#validateProgram/1"},{"type":"function","doc":"[`gl:validateProgramPipeline/1`](`validateProgramPipeline/1`) instructs the\nimplementation to validate the shader executables contained in `Pipeline`\nagainst the current GL state. The implementation may use this as an opportunity\nto perform any internal shader modifications that may be required to ensure\ncorrect operation of the installed shaders given the current GL state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glValidateProgramPipeline.xhtml)","title":"gl.validateProgramPipeline/1","ref":"gl.html#validateProgramPipeline/1"},{"type":"function","doc":"","title":"gl.vertex2d/2","ref":"gl.html#vertex2d/2"},{"type":"function","doc":"","title":"gl.vertex2dv/1","ref":"gl.html#vertex2dv/1"},{"type":"function","doc":"","title":"gl.vertex2f/2","ref":"gl.html#vertex2f/2"},{"type":"function","doc":"","title":"gl.vertex2fv/1","ref":"gl.html#vertex2fv/1"},{"type":"function","doc":"","title":"gl.vertex2i/2","ref":"gl.html#vertex2i/2"},{"type":"function","doc":"","title":"gl.vertex2iv/1","ref":"gl.html#vertex2iv/1"},{"type":"function","doc":"","title":"gl.vertex2s/2","ref":"gl.html#vertex2s/2"},{"type":"function","doc":"","title":"gl.vertex2sv/1","ref":"gl.html#vertex2sv/1"},{"type":"function","doc":"","title":"gl.vertex3d/3","ref":"gl.html#vertex3d/3"},{"type":"function","doc":"","title":"gl.vertex3dv/1","ref":"gl.html#vertex3dv/1"},{"type":"function","doc":"","title":"gl.vertex3f/3","ref":"gl.html#vertex3f/3"},{"type":"function","doc":"","title":"gl.vertex3fv/1","ref":"gl.html#vertex3fv/1"},{"type":"function","doc":"","title":"gl.vertex3i/3","ref":"gl.html#vertex3i/3"},{"type":"function","doc":"","title":"gl.vertex3iv/1","ref":"gl.html#vertex3iv/1"},{"type":"function","doc":"","title":"gl.vertex3s/3","ref":"gl.html#vertex3s/3"},{"type":"function","doc":"","title":"gl.vertex3sv/1","ref":"gl.html#vertex3sv/1"},{"type":"function","doc":"","title":"gl.vertex4d/4","ref":"gl.html#vertex4d/4"},{"type":"function","doc":"","title":"gl.vertex4dv/1","ref":"gl.html#vertex4dv/1"},{"type":"function","doc":"","title":"gl.vertex4f/4","ref":"gl.html#vertex4f/4"},{"type":"function","doc":"","title":"gl.vertex4fv/1","ref":"gl.html#vertex4fv/1"},{"type":"function","doc":"","title":"gl.vertex4i/4","ref":"gl.html#vertex4i/4"},{"type":"function","doc":"","title":"gl.vertex4iv/1","ref":"gl.html#vertex4iv/1"},{"type":"function","doc":"","title":"gl.vertex4s/4","ref":"gl.html#vertex4s/4"},{"type":"function","doc":"[`gl:vertex()`](`vertex2d/2`) commands are used within\n[`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pairs to specify\npoint, line, and polygon vertices. The current color, normal, texture\ncoordinates, and fog coordinate are associated with the vertex when\n[`gl:vertex()`](`vertex2d/2`) is called.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glVertex.xml)","title":"gl.vertex4sv/1","ref":"gl.html#vertex4sv/1"},{"type":"function","doc":"","title":"gl.vertexArrayAttribBinding/3","ref":"gl.html#vertexArrayAttribBinding/3"},{"type":"function","doc":"","title":"gl.vertexArrayAttribFormat/6","ref":"gl.html#vertexArrayAttribFormat/6"},{"type":"function","doc":"","title":"gl.vertexArrayAttribIFormat/5","ref":"gl.html#vertexArrayAttribIFormat/5"},{"type":"function","doc":"","title":"gl.vertexArrayAttribLFormat/5","ref":"gl.html#vertexArrayAttribLFormat/5"},{"type":"function","doc":"","title":"gl.vertexArrayBindingDivisor/3","ref":"gl.html#vertexArrayBindingDivisor/3"},{"type":"function","doc":"[`gl:vertexArrayElementBuffer/2`](`vertexArrayElementBuffer/2`) binds a buffer\nobject with id `Buffer` to the element array buffer bind point of a vertex array\nobject with id `Vaobj`. If `Buffer` is zero, any existing element array buffer\nbinding to `Vaobj` is removed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexArrayElementBuffer.xhtml)","title":"gl.vertexArrayElementBuffer/2","ref":"gl.html#vertexArrayElementBuffer/2"},{"type":"function","doc":"[`gl:bindVertexBuffer/4`](`bindVertexBuffer/4`) and\n[`gl:vertexArrayVertexBuffer/5`](`bindVertexBuffer/4`) bind the buffer named\n`Buffer` to the vertex buffer binding point whose index is given by\n`Bindingindex`. [`gl:bindVertexBuffer/4`](`bindVertexBuffer/4`) modifies the\nbinding of the currently bound vertex array object, whereas\n[`gl:vertexArrayVertexBuffer/5`](`bindVertexBuffer/4`) allows the caller to\nspecify ID of the vertex array object with an argument named `Vaobj`, for which\nthe binding should be modified. `Offset` and `Stride` specify the offset of the\nfirst element within the buffer and the distance between elements within the\nbuffer, respectively, and are both measured in basic machine units.\n`Bindingindex` must be less than the value of `?GL_MAX_VERTEX_ATTRIB_BINDINGS`.\n`Offset` and `Stride` must be greater than or equal to zero. If `Buffer` is\nzero, then any buffer currently bound to the specified binding point is unbound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexBuffer.xhtml)","title":"gl.vertexArrayVertexBuffer/5","ref":"gl.html#vertexArrayVertexBuffer/5"},{"type":"function","doc":"[`gl:bindVertexBuffers/4`](`bindVertexBuffers/4`) and\n[`gl:vertexArrayVertexBuffers/5`](`bindVertexBuffers/4`) bind storage from an\narray of existing buffer objects to a specified number of consecutive vertex\nbuffer binding points units in a vertex array object. For\n[`gl:bindVertexBuffers/4`](`bindVertexBuffers/4`), the vertex array object is\nthe currently bound vertex array object. For\n[`gl:vertexArrayVertexBuffers/5`](`bindVertexBuffers/4`), `Vaobj` is the name of\nthe vertex array object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexBuffers.xhtml)","title":"gl.vertexArrayVertexBuffers/5","ref":"gl.html#vertexArrayVertexBuffers/5"},{"type":"function","doc":"","title":"gl.vertexAttrib1d/2","ref":"gl.html#vertexAttrib1d/2"},{"type":"function","doc":"","title":"gl.vertexAttrib1dv/2","ref":"gl.html#vertexAttrib1dv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib1f/2","ref":"gl.html#vertexAttrib1f/2"},{"type":"function","doc":"","title":"gl.vertexAttrib1fv/2","ref":"gl.html#vertexAttrib1fv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib1s/2","ref":"gl.html#vertexAttrib1s/2"},{"type":"function","doc":"","title":"gl.vertexAttrib1sv/2","ref":"gl.html#vertexAttrib1sv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib2d/3","ref":"gl.html#vertexAttrib2d/3"},{"type":"function","doc":"","title":"gl.vertexAttrib2dv/2","ref":"gl.html#vertexAttrib2dv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib2f/3","ref":"gl.html#vertexAttrib2f/3"},{"type":"function","doc":"","title":"gl.vertexAttrib2fv/2","ref":"gl.html#vertexAttrib2fv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib2s/3","ref":"gl.html#vertexAttrib2s/3"},{"type":"function","doc":"","title":"gl.vertexAttrib2sv/2","ref":"gl.html#vertexAttrib2sv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib3d/4","ref":"gl.html#vertexAttrib3d/4"},{"type":"function","doc":"","title":"gl.vertexAttrib3dv/2","ref":"gl.html#vertexAttrib3dv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib3f/4","ref":"gl.html#vertexAttrib3f/4"},{"type":"function","doc":"","title":"gl.vertexAttrib3fv/2","ref":"gl.html#vertexAttrib3fv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib3s/4","ref":"gl.html#vertexAttrib3s/4"},{"type":"function","doc":"","title":"gl.vertexAttrib3sv/2","ref":"gl.html#vertexAttrib3sv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4bv/2","ref":"gl.html#vertexAttrib4bv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4d/5","ref":"gl.html#vertexAttrib4d/5"},{"type":"function","doc":"","title":"gl.vertexAttrib4dv/2","ref":"gl.html#vertexAttrib4dv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4f/5","ref":"gl.html#vertexAttrib4f/5"},{"type":"function","doc":"","title":"gl.vertexAttrib4fv/2","ref":"gl.html#vertexAttrib4fv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4iv/2","ref":"gl.html#vertexAttrib4iv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nbv/2","ref":"gl.html#vertexAttrib4Nbv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Niv/2","ref":"gl.html#vertexAttrib4Niv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nsv/2","ref":"gl.html#vertexAttrib4Nsv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nub/5","ref":"gl.html#vertexAttrib4Nub/5"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nubv/2","ref":"gl.html#vertexAttrib4Nubv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nuiv/2","ref":"gl.html#vertexAttrib4Nuiv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4Nusv/2","ref":"gl.html#vertexAttrib4Nusv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4s/5","ref":"gl.html#vertexAttrib4s/5"},{"type":"function","doc":"","title":"gl.vertexAttrib4sv/2","ref":"gl.html#vertexAttrib4sv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4ubv/2","ref":"gl.html#vertexAttrib4ubv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4uiv/2","ref":"gl.html#vertexAttrib4uiv/2"},{"type":"function","doc":"","title":"gl.vertexAttrib4usv/2","ref":"gl.html#vertexAttrib4usv/2"},{"type":"function","doc":"[`gl:vertexAttribBinding/2`](`vertexAttribBinding/2`) and\n[`gl:vertexArrayAttribBinding/3`](`vertexAttribBinding/2`) establishes an\nassociation between the generic vertex attribute of a vertex array object whose\nindex is given by `Attribindex`, and a vertex buffer binding whose index is\ngiven by `Bindingindex`. For\n[`gl:vertexAttribBinding/2`](`vertexAttribBinding/2`), the vertex array object\naffected is that currently bound. For\n[`gl:vertexArrayAttribBinding/3`](`vertexAttribBinding/2`), `Vaobj` is the name\nof the vertex array object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribBinding.xhtml)","title":"gl.vertexAttribBinding/2","ref":"gl.html#vertexAttribBinding/2"},{"type":"function","doc":"[`gl:vertexAttribDivisor/2`](`vertexAttribDivisor/2`) modifies the rate at which\ngeneric vertex attributes advance when rendering multiple instances of\nprimitives in a single draw call. If `Divisor` is zero, the attribute at slot\n`Index` advances once per vertex. If `Divisor` is non-zero, the attribute\nadvances once per `Divisor` instances of the set(s) of vertices being rendered.\nAn attribute is referred to as instanced if its\n`?GL_VERTEX_ATTRIB_ARRAY_DIVISOR` value is non-zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribDivisor.xhtml)","title":"gl.vertexAttribDivisor/2","ref":"gl.html#vertexAttribDivisor/2"},{"type":"function","doc":"","title":"gl.vertexAttribFormat/5","ref":"gl.html#vertexAttribFormat/5"},{"type":"function","doc":"","title":"gl.vertexAttribI1i/2","ref":"gl.html#vertexAttribI1i/2"},{"type":"function","doc":"","title":"gl.vertexAttribI1iv/2","ref":"gl.html#vertexAttribI1iv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI1ui/2","ref":"gl.html#vertexAttribI1ui/2"},{"type":"function","doc":"","title":"gl.vertexAttribI1uiv/2","ref":"gl.html#vertexAttribI1uiv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI2i/3","ref":"gl.html#vertexAttribI2i/3"},{"type":"function","doc":"","title":"gl.vertexAttribI2iv/2","ref":"gl.html#vertexAttribI2iv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI2ui/3","ref":"gl.html#vertexAttribI2ui/3"},{"type":"function","doc":"","title":"gl.vertexAttribI2uiv/2","ref":"gl.html#vertexAttribI2uiv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI3i/4","ref":"gl.html#vertexAttribI3i/4"},{"type":"function","doc":"","title":"gl.vertexAttribI3iv/2","ref":"gl.html#vertexAttribI3iv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI3ui/4","ref":"gl.html#vertexAttribI3ui/4"},{"type":"function","doc":"","title":"gl.vertexAttribI3uiv/2","ref":"gl.html#vertexAttribI3uiv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4bv/2","ref":"gl.html#vertexAttribI4bv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4i/5","ref":"gl.html#vertexAttribI4i/5"},{"type":"function","doc":"","title":"gl.vertexAttribI4iv/2","ref":"gl.html#vertexAttribI4iv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4sv/2","ref":"gl.html#vertexAttribI4sv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4ubv/2","ref":"gl.html#vertexAttribI4ubv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4ui/5","ref":"gl.html#vertexAttribI4ui/5"},{"type":"function","doc":"","title":"gl.vertexAttribI4uiv/2","ref":"gl.html#vertexAttribI4uiv/2"},{"type":"function","doc":"","title":"gl.vertexAttribI4usv/2","ref":"gl.html#vertexAttribI4usv/2"},{"type":"function","doc":"","title":"gl.vertexAttribIFormat/4","ref":"gl.html#vertexAttribIFormat/4"},{"type":"function","doc":"","title":"gl.vertexAttribIPointer/5","ref":"gl.html#vertexAttribIPointer/5"},{"type":"function","doc":"","title":"gl.vertexAttribL1d/2","ref":"gl.html#vertexAttribL1d/2"},{"type":"function","doc":"","title":"gl.vertexAttribL1dv/2","ref":"gl.html#vertexAttribL1dv/2"},{"type":"function","doc":"","title":"gl.vertexAttribL2d/3","ref":"gl.html#vertexAttribL2d/3"},{"type":"function","doc":"","title":"gl.vertexAttribL2dv/2","ref":"gl.html#vertexAttribL2dv/2"},{"type":"function","doc":"","title":"gl.vertexAttribL3d/4","ref":"gl.html#vertexAttribL3d/4"},{"type":"function","doc":"","title":"gl.vertexAttribL3dv/2","ref":"gl.html#vertexAttribL3dv/2"},{"type":"function","doc":"","title":"gl.vertexAttribL4d/5","ref":"gl.html#vertexAttribL4d/5"},{"type":"function","doc":"The [`gl:vertexAttrib()`](`vertexAttrib1d/2`) family of entry points allows an\napplication to pass generic vertex attributes in numbered locations.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttrib.xhtml)","title":"gl.vertexAttribL4dv/2","ref":"gl.html#vertexAttribL4dv/2"},{"type":"function","doc":"","title":"gl.vertexAttribLFormat/4","ref":"gl.html#vertexAttribLFormat/4"},{"type":"function","doc":"[`gl:vertexAttribFormat/5`](`vertexAttribFormat/5`),\n[`gl:vertexAttribIFormat/4`](`vertexAttribIPointer/5`) and\n[`gl:vertexAttribLFormat/4`](`vertexAttribIPointer/5`), as well as\n[`gl:vertexArrayAttribFormat/6`](`vertexAttribIPointer/5`),\n[`gl:vertexArrayAttribIFormat/5`](`vertexAttribIPointer/5`) and\n[`gl:vertexArrayAttribLFormat/5`](`vertexAttribIPointer/5`) specify the\norganization of data in vertex arrays. The first three calls operate on the\nbound vertex array object, whereas the last three ones modify the state of a\nvertex array object with ID `Vaobj`. `Attribindex` specifies the index of the\ngeneric vertex attribute array whose data layout is being described, and must be\nless than the value of `?GL_MAX_VERTEX_ATTRIBS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribFormat.xhtml)","title":"gl.vertexAttribLPointer/5","ref":"gl.html#vertexAttribLPointer/5"},{"type":"function","doc":"[`gl:vertexAttribPointer/6`](`vertexAttribPointer/6`),\n[`gl:vertexAttribIPointer/5`](`vertexAttribIPointer/5`) and\n[`gl:vertexAttribLPointer/5`](`vertexAttribIPointer/5`) specify the location and\ndata format of the array of generic vertex attributes at index `Index` to use\nwhen rendering. `Size` specifies the number of components per attribute and must\nbe 1, 2, 3, 4, or `?GL_BGRA`. `Type` specifies the data type of each component,\nand `Stride` specifies the byte stride from one attribute to the next, allowing\nvertices and attributes to be packed into a single array or stored in separate\narrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml)","title":"gl.vertexAttribPointer/6","ref":"gl.html#vertexAttribPointer/6"},{"type":"function","doc":"[`gl:vertexBindingDivisor/2`](`vertexBindingDivisor/2`) and\n[`gl:vertexArrayBindingDivisor/3`](`vertexBindingDivisor/2`) modify the rate at\nwhich generic vertex attributes advance when rendering multiple instances of\nprimitives in a single draw command. If `Divisor` is zero, the attributes using\nthe buffer bound to `Bindingindex` advance once per vertex. If `Divisor` is\nnon-zero, the attributes advance once per `Divisor` instances of the set(s) of\nvertices being rendered. An attribute is referred to as `instanced` if the\ncorresponding `Divisor` value is non-zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexBindingDivisor.xhtml)","title":"gl.vertexBindingDivisor/2","ref":"gl.html#vertexBindingDivisor/2"},{"type":"function","doc":"[`gl:vertexPointer/4`](`vertexPointer/4`) specifies the location and data format\nof an array of vertex coordinates to use when rendering. `Size` specifies the\nnumber of coordinates per vertex, and must be 2, 3, or 4. `Type` specifies the\ndata type of each coordinate, and `Stride` specifies the byte stride from one\nvertex to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays. (Single-array storage may be more efficient\non some implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glVertexPointer.xml)","title":"gl.vertexPointer/4","ref":"gl.html#vertexPointer/4"},{"type":"function","doc":"[`gl:viewport/4`](`viewport/4`) specifies the affine transformation of x and y\nfrom normalized device coordinates to window coordinates. Let (x nd y nd) be\nnormalized device coordinates. Then the window coordinates (x w y w) are\ncomputed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewport.xhtml)","title":"gl.viewport/4","ref":"gl.html#viewport/4"},{"type":"function","doc":"[`gl:viewportArrayv/2`](`viewportArrayv/2`) specifies the parameters for\nmultiple viewports simulataneously. `First` specifies the index of the first\nviewport to modify and `Count` specifies the number of viewports to modify.\n`First` must be less than the value of `?GL_MAX_VIEWPORTS`, and `First` \\+\n`Count` must be less than or equal to the value of `?GL_MAX_VIEWPORTS`.\nViewports whose indices lie outside the range [`First`, `First` \\+ `Count`) are\nnot modified. `V` contains the address of an array of floating point values\nspecifying the left ( x), bottom ( y), width ( w), and height ( h) of each\nviewport, in that order. x and y give the location of the viewport's lower left\ncorner, and w and h give the width and height of the viewport, respectively. The\nviewport specifies the affine transformation of x and y from normalized device\ncoordinates to window coordinates. Let (x nd y nd) be normalized device\ncoordinates. Then the window coordinates (x w y w) are computed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewportArray.xhtml)","title":"gl.viewportArrayv/2","ref":"gl.html#viewportArrayv/2"},{"type":"function","doc":"","title":"gl.viewportIndexedf/5","ref":"gl.html#viewportIndexedf/5"},{"type":"function","doc":"[`gl:viewportIndexedf/5`](`viewportIndexedf/5`) and\n[`gl:viewportIndexedfv/2`](`viewportIndexedf/5`) specify the parameters for a\nsingle viewport. `Index` specifies the index of the viewport to modify. `Index`\nmust be less than the value of `?GL_MAX_VIEWPORTS`. For\n[`gl:viewportIndexedf/5`](`viewportIndexedf/5`), `X`, `Y`, `W`, and `H` specify\nthe left, bottom, width and height of the viewport in pixels, respectively. For\n[`gl:viewportIndexedfv/2`](`viewportIndexedf/5`), `V` contains the address of an\narray of floating point values specifying the left ( x), bottom ( y), width (\nw), and height ( h) of each viewport, in that order. x and y give the location\nof the viewport's lower left corner, and w and h give the width and height of\nthe viewport, respectively. The viewport specifies the affine transformation of\nx and y from normalized device coordinates to window coordinates. Let (x nd y\nnd) be normalized device coordinates. Then the window coordinates (x w y w) are\ncomputed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewportIndexed.xhtml)","title":"gl.viewportIndexedfv/2","ref":"gl.html#viewportIndexedfv/2"},{"type":"function","doc":"[`gl:waitSync/3`](`waitSync/3`) causes the GL server to block and wait until\n`Sync` becomes signaled. `Sync` is the name of an existing sync object upon\nwhich to wait. `Flags` and `Timeout` are currently not used and must be set to\nzero and the special value `?GL_TIMEOUT_IGNORED`, respectively\n\n`Flags` and `Timeout` are placeholders for anticipated future extensions of sync\nobject capabilities. They must have these reserved values in order that existing\ncode calling [`gl:waitSync/3`](`waitSync/3`) operate properly in the presence of\nsuch extensions.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glWaitSync.xhtml)","title":"gl.waitSync/3","ref":"gl.html#waitSync/3"},{"type":"function","doc":"","title":"gl.windowPos2d/2","ref":"gl.html#windowPos2d/2"},{"type":"function","doc":"","title":"gl.windowPos2dv/1","ref":"gl.html#windowPos2dv/1"},{"type":"function","doc":"","title":"gl.windowPos2f/2","ref":"gl.html#windowPos2f/2"},{"type":"function","doc":"","title":"gl.windowPos2fv/1","ref":"gl.html#windowPos2fv/1"},{"type":"function","doc":"","title":"gl.windowPos2i/2","ref":"gl.html#windowPos2i/2"},{"type":"function","doc":"","title":"gl.windowPos2iv/1","ref":"gl.html#windowPos2iv/1"},{"type":"function","doc":"","title":"gl.windowPos2s/2","ref":"gl.html#windowPos2s/2"},{"type":"function","doc":"","title":"gl.windowPos2sv/1","ref":"gl.html#windowPos2sv/1"},{"type":"function","doc":"","title":"gl.windowPos3d/3","ref":"gl.html#windowPos3d/3"},{"type":"function","doc":"","title":"gl.windowPos3dv/1","ref":"gl.html#windowPos3dv/1"},{"type":"function","doc":"","title":"gl.windowPos3f/3","ref":"gl.html#windowPos3f/3"},{"type":"function","doc":"","title":"gl.windowPos3fv/1","ref":"gl.html#windowPos3fv/1"},{"type":"function","doc":"","title":"gl.windowPos3i/3","ref":"gl.html#windowPos3i/3"},{"type":"function","doc":"","title":"gl.windowPos3iv/1","ref":"gl.html#windowPos3iv/1"},{"type":"function","doc":"","title":"gl.windowPos3s/3","ref":"gl.html#windowPos3s/3"},{"type":"function","doc":"The GL maintains a 3D position in window coordinates. This position, called the\nraster position, is used to position pixel and bitmap write operations. It is\nmaintained with subpixel accuracy. See [`gl:bitmap/7`](`bitmap/7`),\n[`gl:drawPixels/5`](`drawPixels/5`), and [`gl:copyPixels/5`](`copyPixels/5`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glWindowPos.xml)","title":"gl.windowPos3sv/1","ref":"gl.html#windowPos3sv/1"},{"type":"type","doc":"","title":"gl.clamp/0","ref":"gl.html#t:clamp/0"},{"type":"type","doc":"","title":"gl.enum/0","ref":"gl.html#t:enum/0"},{"type":"type","doc":"","title":"gl.f/0","ref":"gl.html#t:f/0"},{"type":"type","doc":"","title":"gl.i/0","ref":"gl.html#t:i/0"},{"type":"type","doc":"","title":"gl.m12/0","ref":"gl.html#t:m12/0"},{"type":"type","doc":"","title":"gl.m16/0","ref":"gl.html#t:m16/0"},{"type":"type","doc":"","title":"gl.matrix/0","ref":"gl.html#t:matrix/0"},{"type":"type","doc":"","title":"gl.mem/0","ref":"gl.html#t:mem/0"},{"type":"type","doc":"","title":"gl.offset/0","ref":"gl.html#t:offset/0"},{"type":"module","doc":"Erlang wrapper functions for OpenGL\n\nStandard OpenGL API\n\nThis documents the functions as a brief version of the complete\n[OpenGL reference pages.](https://www.khronos.org/registry/OpenGL-Refpages/)","title":"glu","ref":"glu.html"},{"type":"function","doc":"[`glu:build1DMipmapLevels/9`](`build1DMipmapLevels/9`) builds a subset of\nprefiltered one-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild1DMipmapLevels.xml)","title":"glu.build1DMipmapLevels/9","ref":"glu.html#build1DMipmapLevels/9"},{"type":"function","doc":"[`glu:build1DMipmaps/6`](`build1DMipmaps/6`) builds a series of prefiltered\none-dimensional texture maps of decreasing resolutions called a mipmap. This is\nused for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild1DMipmaps.xml)","title":"glu.build1DMipmaps/6","ref":"glu.html#build1DMipmaps/6"},{"type":"function","doc":"[`glu:build2DMipmapLevels/10`](`build2DMipmapLevels/10`) builds a subset of\nprefiltered two-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild2DMipmapLevels.xml)","title":"glu.build2DMipmapLevels/10","ref":"glu.html#build2DMipmapLevels/10"},{"type":"function","doc":"[`glu:build2DMipmaps/7`](`build2DMipmaps/7`) builds a series of prefiltered\ntwo-dimensional texture maps of decreasing resolutions called a mipmap. This is\nused for the antialiasing of texture-mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild2DMipmaps.xml)","title":"glu.build2DMipmaps/7","ref":"glu.html#build2DMipmaps/7"},{"type":"function","doc":"[`glu:build3DMipmapLevels/11`](`build3DMipmapLevels/11`) builds a subset of\nprefiltered three-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild3DMipmapLevels.xml)","title":"glu.build3DMipmapLevels/11","ref":"glu.html#build3DMipmapLevels/11"},{"type":"function","doc":"[`glu:build3DMipmaps/8`](`build3DMipmaps/8`) builds a series of prefiltered\nthree-dimensional texture maps of decreasing resolutions called a mipmap. This\nis used for the antialiasing of texture-mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild3DMipmaps.xml)","title":"glu.build3DMipmaps/8","ref":"glu.html#build3DMipmaps/8"},{"type":"function","doc":"[`glu:checkExtension/2`](`checkExtension/2`) returns `?GLU_TRUE` if `ExtName` is\nsupported otherwise `?GLU_FALSE` is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluCheckExtension.xml)","title":"glu.checkExtension/2","ref":"glu.html#checkExtension/2"},{"type":"function","doc":"[`glu:cylinder/6`](`cylinder/6`) draws a cylinder oriented along the `z` axis.\nThe base of the cylinder is placed at `z` = 0 and the top at z=height. Like a\nsphere, a cylinder is subdivided around the `z` axis into slices and along the\n`z` axis into stacks.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluCylinder.xml)","title":"glu.cylinder/6","ref":"glu.html#cylinder/6"},{"type":"function","doc":"[`glu:deleteQuadric/1`](`deleteQuadric/1`) destroys the quadrics object (created\nwith [`glu:newQuadric/0`](`newQuadric/0`)) and frees any memory it uses. Once\n[`glu:deleteQuadric/1`](`deleteQuadric/1`) has been called, `Quad` cannot be\nused again.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluDeleteQuadric.xml)","title":"glu.deleteQuadric/1","ref":"glu.html#deleteQuadric/1"},{"type":"function","doc":"[`glu:disk/5`](`disk/5`) renders a disk on the `z` = 0 plane. The disk has a\nradius of `Outer` and contains a concentric circular hole with a radius of\n`Inner`. If `Inner` is 0, then no hole is generated. The disk is subdivided\naround the `z` axis into slices (like pizza slices) and also about the `z` axis\ninto rings (as specified by `Slices` and `Loops`, respectively).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluDisk.xml)","title":"glu.disk/5","ref":"glu.html#disk/5"},{"type":"function","doc":"[`glu:errorString/1`](`errorString/1`) produces an error string from a GL or GLU\nerror code. The string is in ISO Latin 1 format. For example,\n[`glu:errorString/1`](`errorString/1`)(`?GLU_OUT_OF_MEMORY`) returns the string\n`out of memory`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluErrorString.xml)","title":"glu.errorString/1","ref":"glu.html#errorString/1"},{"type":"function","doc":"[`glu:getString/1`](`getString/1`) returns a pointer to a static string\ndescribing the GLU version or the GLU extensions that are supported.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluGetString.xml)","title":"glu.getString/1","ref":"glu.html#getString/1"},{"type":"function","doc":"[`glu:lookAt/9`](`lookAt/9`) creates a viewing matrix derived from an eye point,\na reference point indicating the center of the scene, and an `UP` vector.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml)","title":"glu.lookAt/9","ref":"glu.html#lookAt/9"},{"type":"function","doc":"[`glu:newQuadric/0`](`newQuadric/0`) creates and returns a pointer to a new\nquadrics object. This object must be referred to when calling quadrics rendering\nand control functions. A return value of 0 means that there is not enough memory\nto allocate the object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluNewQuadric.xml)","title":"glu.newQuadric/0","ref":"glu.html#newQuadric/0"},{"type":"function","doc":"[`glu:ortho2D/4`](`ortho2D/4`) sets up a two-dimensional orthographic viewing\nregion. This is equivalent to calling `gl:ortho/6` with near=-1 and far=1.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluOrtho2D.xml)","title":"glu.ortho2D/4","ref":"glu.html#ortho2D/4"},{"type":"function","doc":"[`glu:partialDisk/7`](`partialDisk/7`) renders a partial disk on the z=0 plane.\nA partial disk is similar to a full disk, except that only the subset of the\ndisk from `Start` through `Start` \\+ `Sweep` is included (where 0 degrees is\nalong the +f2yf axis, 90 degrees along the +`x` axis, 180 degrees along the -`y`\naxis, and 270 degrees along the -`x` axis).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPartialDisk.xml)","title":"glu.partialDisk/7","ref":"glu.html#partialDisk/7"},{"type":"function","doc":"[`glu:perspective/4`](`perspective/4`) specifies a viewing frustum into the\nworld coordinate system. In general, the aspect ratio in\n[`glu:perspective/4`](`perspective/4`) should match the aspect ratio of the\nassociated viewport. For example, aspect=2.0 means the viewer's angle of view is\ntwice as wide in `x` as it is in `y`. If the viewport is twice as wide as it is\ntall, it displays the image without distortion.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml)","title":"glu.perspective/4","ref":"glu.html#perspective/4"},{"type":"function","doc":"[`glu:pickMatrix/5`](`pickMatrix/5`) creates a projection matrix that can be\nused to restrict drawing to a small region of the viewport. This is typically\nuseful to determine what objects are being drawn near the cursor. Use\n[`glu:pickMatrix/5`](`pickMatrix/5`) to restrict drawing to a small region\naround the cursor. Then, enter selection mode (with `gl:renderMode/1`) and\nrerender the scene. All primitives that would have been drawn near the cursor\nare identified and stored in the selection buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPickMatrix.xml)","title":"glu.pickMatrix/5","ref":"glu.html#pickMatrix/5"},{"type":"function","doc":"[`glu:project/6`](`project/6`) transforms the specified object coordinates into\nwindow coordinates using `Model`, `Proj`, and `View`. The result is stored in\n`WinX`, `WinY`, and `WinZ`. A return value of `?GLU_TRUE` indicates success, a\nreturn value of `?GLU_FALSE` indicates failure.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml)","title":"glu.project/6","ref":"glu.html#project/6"},{"type":"function","doc":"[`glu:quadricDrawStyle/2`](`quadricDrawStyle/2`) specifies the draw style for\nquadrics rendered with `Quad`. The legal values are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricDrawStyle.xml)","title":"glu.quadricDrawStyle/2","ref":"glu.html#quadricDrawStyle/2"},{"type":"function","doc":"[`glu:quadricNormals/2`](`quadricNormals/2`) specifies what kind of normals are\ndesired for quadrics rendered with `Quad`. The legal values are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricNormals.xml)","title":"glu.quadricNormals/2","ref":"glu.html#quadricNormals/2"},{"type":"function","doc":"[`glu:quadricOrientation/2`](`quadricOrientation/2`) specifies what kind of\norientation is desired for quadrics rendered with `Quad`. The `Orientation`\nvalues are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricOrientation.xml)","title":"glu.quadricOrientation/2","ref":"glu.html#quadricOrientation/2"},{"type":"function","doc":"[`glu:quadricTexture/2`](`quadricTexture/2`) specifies if texture coordinates\nshould be generated for quadrics rendered with `Quad`. If the value of `Texture`\nis `?GLU_TRUE`, then texture coordinates are generated, and if `Texture` is\n`?GLU_FALSE`, they are not. The initial value is `?GLU_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricTexture.xml)","title":"glu.quadricTexture/2","ref":"glu.html#quadricTexture/2"},{"type":"function","doc":"[`glu:scaleImage/9`](`scaleImage/9`) scales a pixel image using the appropriate\npixel store modes to unpack data from the source image and pack data into the\ndestination image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluScaleImage.xml)","title":"glu.scaleImage/9","ref":"glu.html#scaleImage/9"},{"type":"function","doc":"[`glu:sphere/4`](`sphere/4`) draws a sphere of the given radius centered around\nthe origin. The sphere is subdivided around the `z` axis into slices and along\nthe `z` axis into stacks (similar to lines of longitude and latitude).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluSphere.xml)","title":"glu.sphere/4","ref":"glu.html#sphere/4"},{"type":"function","doc":"Triangulates a polygon, the polygon is specified by a `Normal` and `Vs` a list\nof vertex positions.\n\nThe function returns a list of indices of the vertices and a binary (64bit\nnative float) containing an array of vertex positions, it starts with the\nvertices in `Vs` and may contain newly created vertices in the end.","title":"glu.tesselate/2","ref":"glu.html#tesselate/2"},{"type":"function","doc":"[`glu:unProject/6`](`unProject/6`) maps the specified window coordinates into\nobject coordinates using `Model`, `Proj`, and `View`. The result is stored in\n`ObjX`, `ObjY`, and `ObjZ`. A return value of `?GLU_TRUE` indicates success; a\nreturn value of `?GLU_FALSE` indicates failure.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml)","title":"glu.unProject4/9","ref":"glu.html#unProject4/9"},{"type":"function","doc":"","title":"glu.unProject/6","ref":"glu.html#unProject/6"},{"type":"type","doc":"","title":"glu.enum/0","ref":"glu.html#t:enum/0"},{"type":"type","doc":"","title":"glu.f/0","ref":"glu.html#t:f/0"},{"type":"type","doc":"","title":"glu.i/0","ref":"glu.html#t:i/0"},{"type":"type","doc":"","title":"glu.m12/0","ref":"glu.html#t:m12/0"},{"type":"type","doc":"","title":"glu.m16/0","ref":"glu.html#t:m16/0"},{"type":"type","doc":"","title":"glu.matrix/0","ref":"glu.html#t:matrix/0"},{"type":"type","doc":"","title":"glu.mem/0","ref":"glu.html#t:mem/0"},{"type":"type","doc":"","title":"glu.vertex/0","ref":"glu.html#t:vertex/0"},{"type":"module","doc":"A port of wxWidgets.\n\nA port of [wxWidgets](http://www.wxwidgets.org/).\n\nThis is the base api of [wxWidgets](http://www.wxwidgets.org/). This module\ncontains functions for starting and stopping the wx-server, as well as other\nutility functions.\n\nwxWidgets is object oriented, and not functional. Thus, in Wx a module\nrepresents a class, and the object created by this class has an own type,\nwxCLASS(). This module represents the base class, and all other wxMODULE's are\nsub-classes of this class.\n\nObjects of a class are created with wxCLASS:new(...) and destroyed with\nwxCLASS:destroy(). Member functions are called with wxCLASS:member(Object, ...)\ninstead of as in C++ Object.member(...).\n\nSub class modules inherit (non static) functions from their parents. The\ninherited functions are not documented in the sub-classes.\n\nThis erlang port of wxWidgets tries to be a one-to-one mapping with the original\nwxWidgets library. Some things are different though, as the optional arguments\nuse property lists and can be in any order. The main difference is the event\nhandling which is different from the original library. See `m:wxEvtHandler`.\n\nThe following classes are implemented directly as erlang types: \nwxPoint=\\{x,y\\},wxSize=\\{w,h\\},wxRect=\\{x,y,w,h\\},wxColour=\\{r,g,b \\[,a]\\},\nwxString=[unicode:chardata()](`t:unicode:chardata/0`),\nwxGBPosition=\\{r,c\\},wxGBSpan=\\{rs,cs\\},wxGridCellCoords=\\{r,c\\}.\n\nwxWidgets uses a process specific environment, which is created by\n[wx:new/0](`new/0`). To be able to use the environment from other processes,\ncall `get_env/0` to retrieve the environment and `set_env/1` to assign the\nenvironment in the other process.\n\nGlobal (classless) functions are located in the wx_misc module.","title":"wx","ref":"wx.html"},{"type":"module","doc":"- **[](){: #type-wx_colour } wx_colour() = \\{R::byte(), G::byte(), B::byte()\\} |\n [wx_colour4()](`m:wx#type-wx_colour4`)**\n\n- **[](){: #type-wx_colour4 } wx_colour4() = \\{R::byte(), G::byte(), B::byte(),\n A::byte()\\}**\n\n- **[](){: #type-wx_datetime } wx_datetime() = \\{\\{Year::integer(),\n Month::integer(), Day::integer()\\}, \\{Hour::integer(), Minute::integer(),\n Second::integer()\\}\\}**\n\n In Local Timezone\n\n- **[](){: #type-wx_enum } wx_enum() = integer()**\n\n Constant defined in wx.hrl\n\n- **[](){: #type-wx_env } wx_env() = #wx_env\\{\\}**\n\n Opaque process environment\n\n- **[](){: #type-wx_memory } wx_memory() = binary() | #wx_mem\\{\\}**\n\n Opaque memory reference\n\n- **[](){: #type-wx_object } wx_object() = #wx_ref\\{\\}**\n\n Opaque object reference\n\n- **[](){: #type-wx_wxHtmlLinkInfo } wx_wxHtmlLinkInfo() =\n #wxHtmlLinkInfo\\{href=[unicode:chardata()](`t:unicode:chardata/0`),\n target=[unicode:chardata()](`t:unicode:chardata/0`)\\}**\n\n- **[](){: #type-wx_wxMouseState } wx_wxMouseState() =\n #wxMouseState\\{x=integer(), y=integer(), leftDown=boolean(),\n middleDown=boolean(), rightDown=boolean(), controlDown=boolean(),\n shiftDown=boolean(), altDown=boolean(), metaDown=boolean(),\n cmdDown=boolean()\\}**\n\n See #wxMouseState\\{\\} defined in wx.hrl","title":"DATA TYPES - wx","ref":"wx.html#module-data-types"},{"type":"function","doc":"batch(Fun::function()) -> term()\n\nBatches all `wx` commands used in the fun. Improves performance of the command\nprocessing by grabbing the wxWidgets thread so that no event processing will be\ndone before the complete batch of commands is invoked.\n\n_See also:_ `foldl/3`, `foldr/3`, `foreach/2`, `map/2`.","title":"wx.batch/1","ref":"wx.html#batch/1"},{"type":"function","doc":"create_memory(Size::integer()) -> wx_memory()\n\nCreates a memory area (of Size in bytes) which can be used by an external\nlibrary (i.e. opengl). It is up to the client to keep a reference to this object\nso it does not get garbage collected by erlang while still in use by the\nexternal library.\n\nThis is far from erlang's intentional usage and can crash the erlang emulator.\nUse it carefully.","title":"wx.create_memory/1","ref":"wx.html#create_memory/1"},{"type":"function","doc":"debug(Debug::Level | [Level]) -> ok\n\nSets debug level. If debug level is 'verbose' or 'trace' each call is printed on\nconsole. If Level is 'driver' each allocated object and deletion is printed on\nthe console.","title":"wx.debug/1","ref":"wx.html#debug/1"},{"type":"function","doc":"demo() -> ok | {error, atom()}\n\nStarts a Wx demo if examples directory exists and is compiled","title":"wx.demo/0","ref":"wx.html#demo/0"},{"type":"function","doc":"destroy() -> ok\n\nStops a wx server.","title":"wx.destroy/0","ref":"wx.html#destroy/0"},{"type":"function","doc":"equal(Wx_ref::wx_object(), X2::wx_object()) -> boolean()\n\nReturns true if both arguments references the same object, false otherwise","title":"wx.equal/2","ref":"wx.html#equal/2"},{"type":"function","doc":"foldl(Fun::function(), Acc::term(), List::list()) -> term()\n\nBehaves like `lists:foldl/3` but batches wx commands. See `batch/1`.","title":"wx.foldl/3","ref":"wx.html#foldl/3"},{"type":"function","doc":"foldr(Fun::function(), Acc::term(), List::list()) -> term()\n\nBehaves like `lists:foldr/3` but batches wx commands. See `batch/1`.","title":"wx.foldr/3","ref":"wx.html#foldr/3"},{"type":"function","doc":"foreach(Fun::function(), List::list()) -> ok\n\nBehaves like `lists:foreach/2` but batches wx commands. See `batch/1`.","title":"wx.foreach/2","ref":"wx.html#foreach/2"},{"type":"function","doc":"get_env() -> wx_env()\n\nGets this process's current wx environment. Can be sent to other processes to\nallow them use this process wx environment.\n\n_See also:_ `set_env/1`.","title":"wx.get_env/0","ref":"wx.html#get_env/0"},{"type":"function","doc":"get_memory_bin(Wx_mem::wx_memory()) -> binary()\n\nReturns the memory area as a binary.","title":"wx.get_memory_bin/1","ref":"wx.html#get_memory_bin/1"},{"type":"function","doc":"getObjectType(Wx_ref::wx_object()) -> atom()\n\nReturns the object type","title":"wx.getObjectType/1","ref":"wx.html#getObjectType/1"},{"type":"function","doc":"is_null(Wx_ref::wx_object()) -> boolean()\n\nReturns true if object is null, false otherwise","title":"wx.is_null/1","ref":"wx.html#is_null/1"},{"type":"function","doc":"map(Fun::function(), List::list()) -> list()\n\nBehaves like `lists:map/2` but batches wx commands. See `batch/1`.","title":"wx.map/2","ref":"wx.html#map/2"},{"type":"function","doc":"new() -> wx_object()\n\nStarts a wx server.","title":"wx.new/0","ref":"wx.html#new/0"},{"type":"function","doc":"new(Options::[Option]) -> wx_object()\n\nStarts a wx server. Option may be \\{debug, Level\\}, see debug/1. Or\n\\{silent_start, Bool\\}, which causes error messages at startup to be suppressed.\nThe latter can be used as a silent test of whether wx is properly installed or\nnot.","title":"wx.new/1","ref":"wx.html#new/1"},{"type":"function","doc":"null() -> wx_object()\n\nReturns the null object","title":"wx.null/0","ref":"wx.html#null/0"},{"type":"function","doc":"parent_class(X1) -> term()","title":"wx.parent_class/1","ref":"wx.html#parent_class/1"},{"type":"function","doc":"release_memory(Wx_mem::wx_memory()) -> ok","title":"wx.release_memory/1","ref":"wx.html#release_memory/1"},{"type":"function","doc":"retain_memory(Wx_mem::wx_memory()) -> ok\n\nSaves the memory from deletion until release_memory/1 is called. If\nrelease_memory/1 is not called the memory will not be garbage collected.","title":"wx.retain_memory/1","ref":"wx.html#retain_memory/1"},{"type":"function","doc":"set_env(Wx_env::wx_env()) -> ok\n\nSets the process wx environment, allows this process to use another process wx\nenvironment.","title":"wx.set_env/1","ref":"wx.html#set_env/1"},{"type":"function","doc":"subscribe_events() -> ok\n\nAdds the calling process to the list of of processes that are listening to wx\napplication events.\n\nAt the moment these are all MacOSX specific events corresponding to\n`MacNewFile()` and friends from wxWidgets\n[wxApp](https://docs.wxwidgets.org/trunk/classwx_app.html):\n\n- `{new_file, \"\"}`\n- `{open_file, Filename}`\n- `{print_file, Filename}`\n- `{open_url, Url}`\n- `{reopen_app, \"\"}`\n\nThe call always returns ok but will have sent any already received events to the\ncalling process.","title":"wx.subscribe_events/0","ref":"wx.html#subscribe_events/0"},{"type":"function","doc":"typeCast(Old::wx_object(), NewType::atom()) -> wx_object()\n\nCasts the object to class NewType. It is needed when using functions like\nwxWindow:findWindow/2, which returns a generic wxObject type.","title":"wx.typeCast/2","ref":"wx.html#typeCast/2"},{"type":"type","doc":"","title":"wx.wx_colour4/0","ref":"wx.html#t:wx_colour4/0"},{"type":"type","doc":"","title":"wx.wx_colour/0","ref":"wx.html#t:wx_colour/0"},{"type":"type","doc":"","title":"wx.wx_datetime/0","ref":"wx.html#t:wx_datetime/0"},{"type":"type","doc":"","title":"wx.wx_enum/0","ref":"wx.html#t:wx_enum/0"},{"type":"type","doc":"","title":"wx.wx_env/0","ref":"wx.html#t:wx_env/0"},{"type":"type","doc":"","title":"wx.wx_memory/0","ref":"wx.html#t:wx_memory/0"},{"type":"type","doc":"","title":"wx.wx_object/0","ref":"wx.html#t:wx_object/0"},{"type":"type","doc":"","title":"wx.wx_wxHtmlLinkInfo/0","ref":"wx.html#t:wx_wxHtmlLinkInfo/0"},{"type":"type","doc":"","title":"wx.wx_wxMouseState/0","ref":"wx.html#t:wx_wxMouseState/0"},{"type":"module","doc":"An object used by an application wishing to create an accelerator table (see `m:wxAcceleratorTable`).\n\nSee:\n* `m:wxAcceleratorTable`\n\n* `wxWindow:setAcceleratorTable/2`\n\nwxWidgets docs: [wxAcceleratorEntry](https://docs.wxwidgets.org/3.2/classwx_accelerator_entry.html)","title":"wxAcceleratorEntry","ref":"wxAcceleratorEntry.html"},{"type":"function","doc":"Destroys the object","title":"wxAcceleratorEntry.destroy/1","ref":"wxAcceleratorEntry.html#destroy/1"},{"type":"function","doc":"Returns the command identifier for the accelerator table entry.","title":"wxAcceleratorEntry.getCommand/1","ref":"wxAcceleratorEntry.html#getCommand/1"},{"type":"function","doc":"Returns the flags for the accelerator table entry.","title":"wxAcceleratorEntry.getFlags/1","ref":"wxAcceleratorEntry.html#getFlags/1"},{"type":"function","doc":"Returns the keycode for the accelerator table entry.","title":"wxAcceleratorEntry.getKeyCode/1","ref":"wxAcceleratorEntry.html#getKeyCode/1"},{"type":"function","doc":"","title":"wxAcceleratorEntry.new/0","ref":"wxAcceleratorEntry.html#new/0"},{"type":"function","doc":"Copy ctor.","title":"wxAcceleratorEntry.new/1","ref":"wxAcceleratorEntry.html#new/1"},{"type":"function","doc":"","title":"wxAcceleratorEntry.set/4","ref":"wxAcceleratorEntry.html#set/4"},{"type":"function","doc":"Sets the accelerator entry parameters.","title":"wxAcceleratorEntry.set/5","ref":"wxAcceleratorEntry.html#set/5"},{"type":"type","doc":"","title":"wxAcceleratorEntry.wxAcceleratorEntry/0","ref":"wxAcceleratorEntry.html#t:wxAcceleratorEntry/0"},{"type":"module","doc":"An accelerator table allows the application to specify a table of keyboard shortcuts for\nmenu or button commands.\n\nThe object ?wxNullAcceleratorTable is defined to be a table with no data, and is the\ninitial accelerator table for a window.\n\nExample:\n\nRemark: An accelerator takes precedence over normal processing and can be a convenient\nway to program some event handling. For example, you can use an accelerator table to\nenable a dialog with a multi-line text control to accept CTRL-Enter as meaning 'OK'.\n\nPredefined objects (include wx.hrl): ?wxNullAcceleratorTable\n\nSee:\n* `m:wxAcceleratorEntry`\n\n* `wxWindow:setAcceleratorTable/2`\n\nwxWidgets docs: [wxAcceleratorTable](https://docs.wxwidgets.org/3.2/classwx_accelerator_table.html)","title":"wxAcceleratorTable","ref":"wxAcceleratorTable.html"},{"type":"function","doc":"Destroys the object","title":"wxAcceleratorTable.destroy/1","ref":"wxAcceleratorTable.html#destroy/1"},{"type":"function","doc":"Returns true if the accelerator table is valid.","title":"wxAcceleratorTable.isOk/1","ref":"wxAcceleratorTable.html#isOk/1"},{"type":"function","doc":"Default ctor.","title":"wxAcceleratorTable.new/0","ref":"wxAcceleratorTable.html#new/0"},{"type":"function","doc":"Initializes the accelerator table from an array of `m:wxAcceleratorEntry`.","title":"wxAcceleratorTable.new/2","ref":"wxAcceleratorTable.html#new/2"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxAcceleratorTable.ok/1","ref":"wxAcceleratorTable.html#ok/1"},{"type":"type","doc":"","title":"wxAcceleratorTable.wxAcceleratorTable/0","ref":"wxAcceleratorTable.html#t:wxAcceleratorTable/0"},{"type":"module","doc":"An activate event is sent when a window or application is being activated or deactivated.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxActivateEvent](https://docs.wxwidgets.org/3.2/classwx_activate_event.html)","title":"wxActivateEvent","ref":"wxActivateEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxActivateEventType` to subscribe to events of this type.","title":"Events - wxActivateEvent","ref":"wxActivateEvent.html#module-events"},{"type":"function","doc":"Returns true if the application or window is being activated, false otherwise.","title":"wxActivateEvent.getActive/1","ref":"wxActivateEvent.html#getActive/1"},{"type":"type","doc":"","title":"wxActivateEvent.wxActivate/0","ref":"wxActivateEvent.html#t:wxActivate/0"},{"type":"type","doc":"","title":"wxActivateEvent.wxActivateEvent/0","ref":"wxActivateEvent.html#t:wxActivateEvent/0"},{"type":"type","doc":"","title":"wxActivateEvent.wxActivateEventType/0","ref":"wxActivateEvent.html#t:wxActivateEventType/0"},{"type":"module","doc":"`m:wxArtProvider` class is used to customize the look of wxWidgets application.\n\nWhen wxWidgets needs to display an icon or a bitmap (e.g. in the standard file dialog),\nit does not use a hard-coded resource but asks `m:wxArtProvider` for it instead. This way\nusers can plug in their own `m:wxArtProvider` class and easily replace standard art with\ntheir own version.\n\nAll that is needed is to derive a class from `m:wxArtProvider`, override either its `wxArtProvider::CreateBitmap()`\n(not implemented in wx) and/or its `wxArtProvider::CreateIconBundle()` (not implemented\nin wx) methods and register the provider with `wxArtProvider::Push()` (not implemented in wx):\n\nIf you need bitmap images (of the same artwork) that should be displayed at different\nsizes you should probably consider overriding `wxArtProvider::CreateIconBundle` (not\nimplemented in wx) and supplying icon bundles that contain different bitmap sizes.\n\nThere's another way of taking advantage of this class: you can use it in your code and\nuse platform native icons as provided by `getBitmap/2` or `getIcon/2`.\n\nIdentifying art resources\n\nEvery bitmap and icon bundle are known to `m:wxArtProvider` under an unique ID that is\nused when requesting a resource from it. The ID is represented by the ?wxArtID type and\ncan have one of these predefined values (you can see bitmaps represented by these\nconstants in the page_samples_artprov):\n\nAdditionally, any string recognized by custom art providers registered using `wxArtProvider::Push`\n(not implemented in wx) may be used.\n\nNote: When running under GTK+ 2, GTK+ stock item IDs (e.g. `\"gtk-cdrom\"`) may be used as\nwell: For a list of the GTK+ stock items please refer to the [GTK+ documentation page](http://library.gnome.org/devel/gtk/stable/gtk-Stock-Items.html).\nIt is also possible to load icons from the current icon theme by specifying their name\n(without extension and directory components). Icon themes recognized by GTK+ follow the\nfreedesktop.org [Icon Themes specification](http://freedesktop.org/Standards/icon-theme-spec).\nNote that themes are not guaranteed to contain all icons, so `m:wxArtProvider` may return\n?wxNullBitmap or ?wxNullIcon. The default theme is typically installed in `/usr/share/icons/hicolor`.\n\nClients\n\nThe `client` is the entity that calls `m:wxArtProvider`'s `getBitmap/2` or `getIcon/2` function. It is\nrepresented by wxClientID type and can have one of these values:\n\n* `wxART_TOOLBAR`\n\n* `wxART_MENU`\n\n* `wxART_BUTTON`\n\n* `wxART_FRAME_ICON`\n\n* `wxART_CMN_DIALOG`\n\n* `wxART_HELP_BROWSER`\n\n* `wxART_MESSAGE_BOX`\n\n* `wxART_OTHER` (used for all requests that don't fit into any of the categories above)\n\nClient ID serve as a hint to `m:wxArtProvider` that is supposed to help it to choose the\nbest looking bitmap. For example it is often desirable to use slightly different icons in\nmenus and toolbars even though they represent the same action (e.g. wxART_FILE_OPEN).\nRemember that this is really only a hint for `m:wxArtProvider` - it is common that `getBitmap/2`\nreturns identical bitmap for different client values!\n\nSee:\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_artprov)\n\n* `m:wxArtProvider`\n\nwxWidgets docs: [wxArtProvider](https://docs.wxwidgets.org/3.2/classwx_art_provider.html)","title":"wxArtProvider","ref":"wxArtProvider.html"},{"type":"function","doc":"","title":"wxArtProvider.getBitmap/1","ref":"wxArtProvider.html#getBitmap/1"},{"type":"function","doc":"Query registered providers for bitmap with given ID.\n\nReturn: The bitmap if one of registered providers recognizes the ID or wxNullBitmap\notherwise.","title":"wxArtProvider.getBitmap/2","ref":"wxArtProvider.html#getBitmap/2"},{"type":"function","doc":"","title":"wxArtProvider.getIcon/1","ref":"wxArtProvider.html#getIcon/1"},{"type":"function","doc":"Same as `getBitmap/2`, but return a `m:wxIcon` object (or ?wxNullIcon on failure).","title":"wxArtProvider.getIcon/2","ref":"wxArtProvider.html#getIcon/2"},{"type":"type","doc":"","title":"wxArtProvider.wxArtProvider/0","ref":"wxArtProvider.html#t:wxArtProvider/0"},{"type":"module","doc":"`m:wxAuiDockArt` is part of the wxAUI class framework.\n\nSee also overview_aui.\n\n`m:wxAuiDockArt` is the art provider: provides all drawing functionality to the wxAui\ndock manager. This allows the dock manager to have a pluggable look-and-feel.\n\nBy default, a `m:wxAuiManager` uses an instance of this class called `wxAuiDefaultDockArt`\n(not implemented in wx) which provides bitmap art and a colour scheme that is adapted to\nthe major platforms' look. You can either derive from that class to alter its behaviour or\nwrite a completely new dock art class. Call `wxAuiManager:setArtProvider/2` to force wxAUI to use your new dock art provider.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiPaneInfo`\n\nwxWidgets docs: [wxAuiDockArt](https://docs.wxwidgets.org/3.2/classwx_aui_dock_art.html)","title":"wxAuiDockArt","ref":"wxAuiDockArt.html"},{"type":"function","doc":"Get the colour of a certain setting.\n\n`id` can be one of the colour values of `wxAuiPaneDockArtSetting`.","title":"wxAuiDockArt.getColour/2","ref":"wxAuiDockArt.html#getColour/2"},{"type":"function","doc":"Get a font setting.","title":"wxAuiDockArt.getFont/2","ref":"wxAuiDockArt.html#getFont/2"},{"type":"function","doc":"Get the value of a certain setting.\n\n`id` can be one of the size values of `wxAuiPaneDockArtSetting`.","title":"wxAuiDockArt.getMetric/2","ref":"wxAuiDockArt.html#getMetric/2"},{"type":"function","doc":"Set a certain setting with the value `colour`.\n\n`id` can be one of the colour values of `wxAuiPaneDockArtSetting`.","title":"wxAuiDockArt.setColour/3","ref":"wxAuiDockArt.html#setColour/3"},{"type":"function","doc":"Set a font setting.","title":"wxAuiDockArt.setFont/3","ref":"wxAuiDockArt.html#setFont/3"},{"type":"function","doc":"Set a certain setting with the value `new\\_val`.\n\n`id` can be one of the size values of `wxAuiPaneDockArtSetting`.","title":"wxAuiDockArt.setMetric/3","ref":"wxAuiDockArt.html#setMetric/3"},{"type":"type","doc":"","title":"wxAuiDockArt.wxAuiDockArt/0","ref":"wxAuiDockArt.html#t:wxAuiDockArt/0"},{"type":"module","doc":"`m:wxAuiManager` is the central class of the wxAUI class framework.\n\n`m:wxAuiManager` manages the panes associated with it for a particular `m:wxFrame`, using\na pane's `m:wxAuiPaneInfo` information to determine each pane's docking and floating behaviour.\n\n`m:wxAuiManager` uses wxWidgets' sizer mechanism to plan the layout of each frame. It\nuses a replaceable dock art class to do all drawing, so all drawing is localized in one\narea, and may be customized depending on an application's specific needs.\n\n`m:wxAuiManager` works as follows: the programmer adds panes to the class, or makes\nchanges to existing pane properties (dock position, floating state, show state, etc.). To\napply these changes, `m:wxAuiManager`'s `update/1` function is called. This batch processing can be\nused to avoid flicker, by modifying more than one pane at a time, and then \"committing\"\nall of the changes at once by calling `update/1`.\n\nPanes can be added quite easily:\n\nLater on, the positions can be modified easily. The following will float an existing pane\nin a tool window:\n\nLayers, Rows and Directions, Positions\n\nInside wxAUI, the docking layout is figured out by checking several pane parameters. Four\nof these are important for determining where a pane will end up:\n\n* Direction: Each docked pane has a direction, Top, Bottom, Left, Right, or Center. This is\nfairly self-explanatory. The pane will be placed in the location specified by this\nvariable.\n\n* Position: More than one pane can be placed inside of a dock. Imagine two panes being\ndocked on the left side of a window. One pane can be placed over another. In\nproportionally managed docks, the pane position indicates its sequential position,\nstarting with zero. So, in our scenario with two panes docked on the left side, the top\npane in the dock would have position 0, and the second one would occupy position 1.\n\n* Row: A row can allow for two docks to be placed next to each other. One of the most\ncommon places for this to happen is in the toolbar. Multiple toolbar rows are allowed, the\nfirst row being row 0, and the second row 1. Rows can also be used on vertically docked\npanes.\n\n* Layer: A layer is akin to an onion. Layer 0 is the very center of the managed pane. Thus,\nif a pane is in layer 0, it will be closest to the center window (also sometimes known as\nthe \"content window\"). Increasing layers \"swallow up\" all layers of a lower value. This\ncan look very similar to multiple rows, but is different because all panes in a lower\nlevel yield to panes in higher levels. The best way to understand layers is by running the\nwxAUI sample.","title":"wxAuiManager","ref":"wxAuiManager.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxAUI_MGR_ALLOW_FLOATING: Allow a pane to be undocked to take the form of a `m:wxMiniFrame`.\n\n* wxAUI_MGR_ALLOW_ACTIVE_PANE: Change the color of the title bar of the pane when it is\nactivated.\n\n* wxAUI_MGR_TRANSPARENT_DRAG: Make the pane transparent during its movement.\n\n* wxAUI_MGR_TRANSPARENT_HINT: The possible location for docking is indicated by a\ntranslucent area.\n\n* wxAUI_MGR_VENETIAN_BLINDS_HINT: The possible location for docking is indicated by\ngradually appearing partially transparent hint.\n\n* wxAUI_MGR_RECTANGLE_HINT: The possible location for docking is indicated by a rectangular\noutline.\n\n* wxAUI_MGR_HINT_FADE: The translucent area where the pane could be docked appears\ngradually.\n\n* wxAUI_MGR_NO_VENETIAN_BLINDS_FADE: Used in complement of wxAUI_MGR_VENETIAN_BLINDS_HINT\nto show the docking hint immediately.\n\n* wxAUI_MGR_LIVE_RESIZE: When a docked pane is resized, its content is refreshed in live\n(instead of moving the border alone and refreshing the content at the end).\n\n* wxAUI_MGR_DEFAULT: Default behaviour, combines: wxAUI_MGR_ALLOW_FLOATING |\nwxAUI_MGR_TRANSPARENT_HINT | wxAUI_MGR_HINT_FADE | wxAUI_MGR_NO_VENETIAN_BLINDS_FADE.\n\nSee:\n* [Overview aui](https://docs.wxwidgets.org/3.2/overview_aui.html#overview_aui)\n\n* `m:wxAuiNotebook`\n\n* `m:wxAuiDockArt`\n\n* `m:wxAuiPaneInfo`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxAuiManager](https://docs.wxwidgets.org/3.2/classwx_aui_manager.html)","title":"Styles - wxAuiManager","ref":"wxAuiManager.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`aui_pane_button`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_close`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_maximize`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_restore`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_activated`](`m:wxAuiManagerEvent`)\n\n* [`aui_render`](`m:wxAuiManagerEvent`)","title":"Events - wxAuiManager","ref":"wxAuiManager.html#module-events"},{"type":"function","doc":"","title":"wxAuiManager.addPane/2","ref":"wxAuiManager.html#addPane/2"},{"type":"function","doc":"`addPane/4` tells the frame manager to start managing a child window.\n\nThere are several versions of this function. The first version allows the full spectrum\nof pane parameter possibilities. The second version is used for simpler user interfaces\nwhich do not require as much configuration. The last version allows a drop position to be\nspecified, which will determine where the pane will be added.","title":"wxAuiManager.addPane/3","ref":"wxAuiManager.html#addPane/3"},{"type":"function","doc":"","title":"wxAuiManager.addPane/4","ref":"wxAuiManager.html#addPane/4"},{"type":"function","doc":"Destroys the object","title":"wxAuiManager.destroy/1","ref":"wxAuiManager.html#destroy/1"},{"type":"function","doc":"Tells the `m:wxAuiManager` to stop managing the pane specified by window.\n\nThe window, if in a floated frame, is reparented to the frame managed by `m:wxAuiManager`.","title":"wxAuiManager.detachPane/2","ref":"wxAuiManager.html#detachPane/2"},{"type":"function","doc":"Returns an array of all panes managed by the frame manager.","title":"wxAuiManager.getAllPanes/1","ref":"wxAuiManager.html#getAllPanes/1"},{"type":"function","doc":"Returns the current art provider being used.\n\nSee: `m:wxAuiDockArt`","title":"wxAuiManager.getArtProvider/1","ref":"wxAuiManager.html#getArtProvider/1"},{"type":"function","doc":"Returns the current dock constraint values.\n\nSee `setDockSizeConstraint/3` for more information.","title":"wxAuiManager.getDockSizeConstraint/1","ref":"wxAuiManager.html#getDockSizeConstraint/1"},{"type":"function","doc":"Returns the current ?wxAuiManagerOption's flags.","title":"wxAuiManager.getFlags/1","ref":"wxAuiManager.html#getFlags/1"},{"type":"function","doc":"Returns the frame currently being managed by `m:wxAuiManager`.","title":"wxAuiManager.getManagedWindow/1","ref":"wxAuiManager.html#getManagedWindow/1"},{"type":"function","doc":"Calling this method will return the `m:wxAuiManager` for a given window.\n\nThe `window` parameter should specify any child window or sub-child window of the frame\nor window managed by `m:wxAuiManager`.\n\nThe `window` parameter need not be managed by the manager itself, nor does it even need\nto be a child or sub-child of a managed window. It must however be inside the window\nhierarchy underneath the managed window.","title":"wxAuiManager.getManager/1","ref":"wxAuiManager.html#getManager/1"},{"type":"function","doc":"`getPane/2` is used to lookup a `m:wxAuiPaneInfo` object either by window pointer or by\npane name, which acts as a unique id for a window pane.\n\nThe returned `m:wxAuiPaneInfo` object may then be modified to change a pane's look, state\nor position. After one or more modifications to `m:wxAuiPaneInfo`, `update/1` should be called to\ncommit the changes to the user interface. If the lookup failed (meaning the pane could not\nbe found in the manager), a call to the returned `m:wxAuiPaneInfo`'s IsOk() method will\nreturn false.","title":"wxAuiManager.getPane/2","ref":"wxAuiManager.html#getPane/2"},{"type":"function","doc":"`hideHint/1` hides any docking hint that may be visible.","title":"wxAuiManager.hideHint/1","ref":"wxAuiManager.html#hideHint/1"},{"type":"function","doc":"","title":"wxAuiManager.insertPane/3","ref":"wxAuiManager.html#insertPane/3"},{"type":"function","doc":"This method is used to insert either a previously unmanaged pane window into the frame\nmanager, or to insert a currently managed pane somewhere else.\n\n`insertPane/4` will push all panes, rows, or docks aside and insert the window into the position\nspecified by `insert_location`.\n\nBecause `insert_location` can specify either a pane, dock row, or dock layer, the `insert_level`\nparameter is used to disambiguate this. The parameter `insert_level` can take a value of\nwxAUI_INSERT_PANE, wxAUI_INSERT_ROW or wxAUI_INSERT_DOCK.","title":"wxAuiManager.insertPane/4","ref":"wxAuiManager.html#insertPane/4"},{"type":"function","doc":"`loadPaneInfo/3` is similar to LoadPerspective, with the exception that it only loads\ninformation about a single pane.\n\nThis method writes the serialized data into the passed pane. Pointers to UI elements are\nnot modified.\n\nNote: This operation also changes the name in the pane information!\n\nSee: `loadPerspective/3`\n\nSee: `savePaneInfo/2`\n\nSee: `savePerspective/1`","title":"wxAuiManager.loadPaneInfo/3","ref":"wxAuiManager.html#loadPaneInfo/3"},{"type":"function","doc":"","title":"wxAuiManager.loadPerspective/2","ref":"wxAuiManager.html#loadPerspective/2"},{"type":"function","doc":"Loads a saved perspective.\n\nA perspective is the layout state of an AUI managed window.\n\nAll currently existing panes that have an object in \"perspective\" with the same name\n(\"equivalent\") will receive the layout parameters of the object in \"perspective\". Existing\npanes that do not have an equivalent in \"perspective\" remain unchanged, objects in\n\"perspective\" having no equivalent in the manager are ignored.\n\nSee: `loadPaneInfo/3`\n\nSee: `loadPerspective/3`\n\nSee: `savePerspective/1`","title":"wxAuiManager.loadPerspective/3","ref":"wxAuiManager.html#loadPerspective/3"},{"type":"function","doc":"","title":"wxAuiManager.new/0","ref":"wxAuiManager.html#new/0"},{"type":"function","doc":"Constructor.","title":"wxAuiManager.new/1","ref":"wxAuiManager.html#new/1"},{"type":"function","doc":"`savePaneInfo/2` is similar to SavePerspective, with the exception that it only saves\ninformation about a single pane.\n\nReturn: The serialized layout parameters of the pane are returned within the string.\nInformation about the pointers to UI elements stored in the pane are not serialized.\n\nSee: `loadPaneInfo/3`\n\nSee: `loadPerspective/3`\n\nSee: `savePerspective/1`","title":"wxAuiManager.savePaneInfo/2","ref":"wxAuiManager.html#savePaneInfo/2"},{"type":"function","doc":"Saves the entire user interface layout into an encoded `wxString` (not implemented in\nwx), which can then be stored by the application (probably using wxConfig).\n\nSee: `loadPerspective/3`\n\nSee: `loadPaneInfo/3`\n\nSee: `savePaneInfo/2`","title":"wxAuiManager.savePerspective/1","ref":"wxAuiManager.html#savePerspective/1"},{"type":"function","doc":"Instructs `m:wxAuiManager` to use art provider specified by parameter `art\\_provider` for\nall drawing calls.\n\nThis allows pluggable look-and-feel features. The previous art provider object, if any,\nwill be deleted by `m:wxAuiManager`.\n\nSee: `m:wxAuiDockArt`","title":"wxAuiManager.setArtProvider/2","ref":"wxAuiManager.html#setArtProvider/2"},{"type":"function","doc":"When a user creates a new dock by dragging a window into a docked position, often times\nthe large size of the window will create a dock that is unwieldy large.\n\n`m:wxAuiManager` by default limits the size of any new dock to 1/3 of the window size.\nFor horizontal docks, this would be 1/3 of the window height. For vertical docks, 1/3 of\nthe width.\n\nCalling this function will adjust this constraint value. The numbers must be between 0.0\nand 1.0. For instance, calling SetDockSizeContraint with 0.5, 0.5 will cause new docks to\nbe limited to half of the size of the entire managed window.","title":"wxAuiManager.setDockSizeConstraint/3","ref":"wxAuiManager.html#setDockSizeConstraint/3"},{"type":"function","doc":"This method is used to specify ?wxAuiManagerOption's flags.\n\n`flags` specifies options which allow the frame management behaviour to be modified.","title":"wxAuiManager.setFlags/2","ref":"wxAuiManager.html#setFlags/2"},{"type":"function","doc":"Called to specify the frame or window which is to be managed by `m:wxAuiManager`.\n\nFrame management is not restricted to just frames. Child windows or custom controls are\nalso allowed.","title":"wxAuiManager.setManagedWindow/2","ref":"wxAuiManager.html#setManagedWindow/2"},{"type":"function","doc":"This function is used by controls to explicitly show a hint window at the specified\nrectangle.\n\nIt is rarely called, and is mostly used by controls implementing custom pane drag/drop\nbehaviour. The specified rectangle should be in screen coordinates.","title":"wxAuiManager.showHint/2","ref":"wxAuiManager.html#showHint/2"},{"type":"function","doc":"Dissociate the managed window from the manager.\n\nThis function may be called before the managed frame or window is destroyed, but, since\nwxWidgets 3.1.4, it's unnecessary to call it explicitly, as it will be called\nautomatically when this window is destroyed, as well as when the manager itself is.","title":"wxAuiManager.unInit/1","ref":"wxAuiManager.html#unInit/1"},{"type":"function","doc":"This method is called after any number of changes are made to any of the managed panes.\n\n`update/1` must be invoked after `addPane/4` or `insertPane/4` are called in order to \"realize\" or \"commit\" the changes. In\naddition, any number of changes may be made to `m:wxAuiPaneInfo` structures (retrieved\nwith `getPane/2`), but to realize the changes, `update/1` must be called. This construction allows pane flicker\nto be avoided by updating the whole layout at one time.","title":"wxAuiManager.update/1","ref":"wxAuiManager.html#update/1"},{"type":"type","doc":"","title":"wxAuiManager.wxAuiManager/0","ref":"wxAuiManager.html#t:wxAuiManager/0"},{"type":"module","doc":"Event used to indicate various actions taken with `m:wxAuiManager`.\n\nSee `m:wxAuiManager` for available event types.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiPaneInfo`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxAuiManagerEvent](https://docs.wxwidgets.org/3.2/classwx_aui_manager_event.html)","title":"wxAuiManagerEvent","ref":"wxAuiManagerEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxAuiManagerEventType` to subscribe to events of this type.","title":"Events - wxAuiManagerEvent","ref":"wxAuiManagerEvent.html#module-events"},{"type":"function","doc":"Return: true if this event can be vetoed.\n\nSee: `veto/2`","title":"wxAuiManagerEvent.canVeto/1","ref":"wxAuiManagerEvent.html#canVeto/1"},{"type":"function","doc":"Return: The ID of the button that was clicked.","title":"wxAuiManagerEvent.getButton/1","ref":"wxAuiManagerEvent.html#getButton/1"},{"type":"function","doc":"","title":"wxAuiManagerEvent.getDC/1","ref":"wxAuiManagerEvent.html#getDC/1"},{"type":"function","doc":"Return: The `m:wxAuiManager` this event is associated with.","title":"wxAuiManagerEvent.getManager/1","ref":"wxAuiManagerEvent.html#getManager/1"},{"type":"function","doc":"Return: The pane this event is associated with.","title":"wxAuiManagerEvent.getPane/1","ref":"wxAuiManagerEvent.html#getPane/1"},{"type":"function","doc":"Return: true if this event was vetoed.\n\nSee: `veto/2`","title":"wxAuiManagerEvent.getVeto/1","ref":"wxAuiManagerEvent.html#getVeto/1"},{"type":"function","doc":"Sets the ID of the button clicked that triggered this event.","title":"wxAuiManagerEvent.setButton/2","ref":"wxAuiManagerEvent.html#setButton/2"},{"type":"function","doc":"Sets whether or not this event can be vetoed.","title":"wxAuiManagerEvent.setCanVeto/2","ref":"wxAuiManagerEvent.html#setCanVeto/2"},{"type":"function","doc":"","title":"wxAuiManagerEvent.setDC/2","ref":"wxAuiManagerEvent.html#setDC/2"},{"type":"function","doc":"Sets the `m:wxAuiManager` this event is associated with.","title":"wxAuiManagerEvent.setManager/2","ref":"wxAuiManagerEvent.html#setManager/2"},{"type":"function","doc":"Sets the pane this event is associated with.","title":"wxAuiManagerEvent.setPane/2","ref":"wxAuiManagerEvent.html#setPane/2"},{"type":"function","doc":"","title":"wxAuiManagerEvent.veto/1","ref":"wxAuiManagerEvent.html#veto/1"},{"type":"function","doc":"Cancels the action indicated by this event if `canVeto/1` is true.","title":"wxAuiManagerEvent.veto/2","ref":"wxAuiManagerEvent.html#veto/2"},{"type":"type","doc":"","title":"wxAuiManagerEvent.wxAuiManager/0","ref":"wxAuiManagerEvent.html#t:wxAuiManager/0"},{"type":"type","doc":"","title":"wxAuiManagerEvent.wxAuiManagerEvent/0","ref":"wxAuiManagerEvent.html#t:wxAuiManagerEvent/0"},{"type":"type","doc":"","title":"wxAuiManagerEvent.wxAuiManagerEventType/0","ref":"wxAuiManagerEvent.html#t:wxAuiManagerEventType/0"},{"type":"module","doc":"`m:wxAuiNotebook` is part of the wxAUI class framework, which represents a notebook\ncontrol, managing multiple windows with associated tabs.\n\nSee also overview_aui.\n\n`m:wxAuiNotebook` is a notebook control which implements many features common in\napplications with dockable panes. Specifically, `m:wxAuiNotebook` implements functionality\nwhich allows the user to rearrange tab order via drag-and-drop, split the tab window into\nmany different splitter configurations, and toggle through different themes to customize\nthe control's look and feel.\n\nThe default theme that is used is `wxAuiDefaultTabArt` (not implemented in wx), which\nprovides a modern, glossy look and feel. The theme can be changed by calling `setArtProvider/2`.","title":"wxAuiNotebook","ref":"wxAuiNotebook.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxAUI_NB_DEFAULT_STYLE: Defined as wxAUI_NB_TOP | wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_MOVE\n| wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_CLOSE_ON_ACTIVE_TAB | wxAUI_NB_MIDDLE_CLICK_CLOSE.\n\n* wxAUI_NB_TAB_SPLIT: Allows the tab control to be split by dragging a tab.\n\n* wxAUI_NB_TAB_MOVE: Allows a tab to be moved horizontally by dragging.\n\n* wxAUI_NB_TAB_EXTERNAL_MOVE: Allows a tab to be moved to another tab control.\n\n* wxAUI_NB_TAB_FIXED_WIDTH: With this style, all tabs have the same width.\n\n* wxAUI_NB_SCROLL_BUTTONS: With this style, left and right scroll buttons are displayed.\n\n* wxAUI_NB_WINDOWLIST_BUTTON: With this style, a drop-down list of windows is available.\n\n* wxAUI_NB_CLOSE_BUTTON: With this style, a close button is available on the tab bar.\n\n* wxAUI_NB_CLOSE_ON_ACTIVE_TAB: With this style, the close button is visible on the active\ntab.\n\n* wxAUI_NB_CLOSE_ON_ALL_TABS: With this style, the close button is visible on all tabs.\n\n* wxAUI_NB_MIDDLE_CLICK_CLOSE: With this style, middle click on a tab closes the tab.\n\n* wxAUI_NB_TOP: With this style, tabs are drawn along the top of the notebook.\n\n* wxAUI_NB_BOTTOM: With this style, tabs are drawn along the bottom of the notebook.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxAuiNotebook](https://docs.wxwidgets.org/3.2/classwx_aui_notebook.html)","title":"Styles - wxAuiNotebook","ref":"wxAuiNotebook.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_auinotebook_page_close`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_closed`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_changed`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_changing`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_button`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_begin_drag`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_end_drag`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_drag_motion`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_allow_dnd`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_drag_done`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_middle_down`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_middle_up`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_right_down`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_right_up`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_bg_dclick`](`m:wxAuiNotebookEvent`)","title":"Events - wxAuiNotebook","ref":"wxAuiNotebook.html#module-events"},{"type":"function","doc":"","title":"wxAuiNotebook.addPage/3","ref":"wxAuiNotebook.html#addPage/3"},{"type":"function","doc":"Adds a page.\n\nIf the `select` parameter is true, calling this will generate a page change event.","title":"wxAuiNotebook.addPage/4","ref":"wxAuiNotebook.html#addPage/4"},{"type":"function","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function may generate the page changing events.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/6`\n\nSince: 2.9.3","title":"wxAuiNotebook.addPage/5","ref":"wxAuiNotebook.html#addPage/5"},{"type":"function","doc":"","title":"wxAuiNotebook.create/2","ref":"wxAuiNotebook.html#create/2"},{"type":"function","doc":"Creates the notebook window.","title":"wxAuiNotebook.create/3","ref":"wxAuiNotebook.html#create/3"},{"type":"function","doc":"Constructs the book control with the given parameters.","title":"wxAuiNotebook.create/4","ref":"wxAuiNotebook.html#create/4"},{"type":"function","doc":"Deletes a page at the given index.\n\nCalling this method will generate a page change event.","title":"wxAuiNotebook.deletePage/2","ref":"wxAuiNotebook.html#deletePage/2"},{"type":"function","doc":"Destroys the object","title":"wxAuiNotebook.destroy/1","ref":"wxAuiNotebook.html#destroy/1"},{"type":"function","doc":"Returns the associated art provider.","title":"wxAuiNotebook.getArtProvider/1","ref":"wxAuiNotebook.html#getArtProvider/1"},{"type":"function","doc":"Returns the page specified by the given index.","title":"wxAuiNotebook.getPage/2","ref":"wxAuiNotebook.html#getPage/2"},{"type":"function","doc":"Returns the tab bitmap for the page.","title":"wxAuiNotebook.getPageBitmap/2","ref":"wxAuiNotebook.html#getPageBitmap/2"},{"type":"function","doc":"Returns the number of pages in the notebook.","title":"wxAuiNotebook.getPageCount/1","ref":"wxAuiNotebook.html#getPageCount/1"},{"type":"function","doc":"Returns the page index for the specified window.\n\nIf the window is not found in the notebook, wxNOT_FOUND is returned.","title":"wxAuiNotebook.getPageIndex/2","ref":"wxAuiNotebook.html#getPageIndex/2"},{"type":"function","doc":"Returns the tab label for the page.","title":"wxAuiNotebook.getPageText/2","ref":"wxAuiNotebook.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page.","title":"wxAuiNotebook.getSelection/1","ref":"wxAuiNotebook.html#getSelection/1"},{"type":"function","doc":"","title":"wxAuiNotebook.insertPage/4","ref":"wxAuiNotebook.html#insertPage/4"},{"type":"function","doc":"`insertPage/6` is similar to AddPage, but allows the ability to specify the insert\nlocation.\n\nIf the `select` parameter is true, calling this will generate a page change event.","title":"wxAuiNotebook.insertPage/5","ref":"wxAuiNotebook.html#insertPage/5"},{"type":"function","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/5`\n\nSince: 2.9.3","title":"wxAuiNotebook.insertPage/6","ref":"wxAuiNotebook.html#insertPage/6"},{"type":"function","doc":"Default ctor.","title":"wxAuiNotebook.new/0","ref":"wxAuiNotebook.html#new/0"},{"type":"function","doc":"","title":"wxAuiNotebook.new/1","ref":"wxAuiNotebook.html#new/1"},{"type":"function","doc":"Constructor.\n\nCreates a wxAuiNotebok control.","title":"wxAuiNotebook.new/2","ref":"wxAuiNotebook.html#new/2"},{"type":"function","doc":"Removes a page, without deleting the window pointer.","title":"wxAuiNotebook.removePage/2","ref":"wxAuiNotebook.html#removePage/2"},{"type":"function","doc":"Sets the art provider to be used by the notebook.","title":"wxAuiNotebook.setArtProvider/2","ref":"wxAuiNotebook.html#setArtProvider/2"},{"type":"function","doc":"Sets the font for drawing the tab labels, using a bold version of the font for selected\ntab labels.","title":"wxAuiNotebook.setFont/2","ref":"wxAuiNotebook.html#setFont/2"},{"type":"function","doc":"Sets the bitmap for the page.\n\nTo remove a bitmap from the tab caption, pass wxNullBitmap.","title":"wxAuiNotebook.setPageBitmap/3","ref":"wxAuiNotebook.html#setPageBitmap/3"},{"type":"function","doc":"Sets the tab label for the page.","title":"wxAuiNotebook.setPageText/3","ref":"wxAuiNotebook.html#setPageText/3"},{"type":"function","doc":"Sets the page selection.\n\nCalling this method will generate a page change event.","title":"wxAuiNotebook.setSelection/2","ref":"wxAuiNotebook.html#setSelection/2"},{"type":"function","doc":"Sets the tab height.\n\nBy default, the tab control height is calculated by measuring the text height and bitmap\nsizes on the tab captions. Calling this method will override that calculation and set the\ntab control to the specified height parameter. A call to this method will override any\ncall to `setUniformBitmapSize/2`.\n\nSpecifying -1 as the height will return the control to its default auto-sizing behaviour.","title":"wxAuiNotebook.setTabCtrlHeight/2","ref":"wxAuiNotebook.html#setTabCtrlHeight/2"},{"type":"function","doc":"Ensure that all tabs have the same height, even if some of them don't have bitmaps.\n\nPassing ?wxDefaultSize as `size` undoes the effect of a previous call to this function\nand instructs the control to use dynamic tab height.","title":"wxAuiNotebook.setUniformBitmapSize/2","ref":"wxAuiNotebook.html#setUniformBitmapSize/2"},{"type":"type","doc":"","title":"wxAuiNotebook.wxAuiNotebook/0","ref":"wxAuiNotebook.html#t:wxAuiNotebook/0"},{"type":"module","doc":"This class is used by the events generated by `m:wxAuiNotebook`.\n\nSee:\n* `m:wxAuiNotebook`\n\n* `m:wxBookCtrlEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxAuiNotebookEvent](https://docs.wxwidgets.org/3.2/classwx_aui_notebook_event.html)","title":"wxAuiNotebookEvent","ref":"wxAuiNotebookEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxAuiNotebookEventType` to subscribe to events of this type.","title":"Events - wxAuiNotebookEvent","ref":"wxAuiNotebookEvent.html#module-events"},{"type":"function","doc":"","title":"wxAuiNotebookEvent.getDragSource/1","ref":"wxAuiNotebookEvent.html#getDragSource/1"},{"type":"function","doc":"Returns the page that was selected before the change, `wxNOT\\_FOUND` if none was\nselected.","title":"wxAuiNotebookEvent.getOldSelection/1","ref":"wxAuiNotebookEvent.html#getOldSelection/1"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: under Windows, `getSelection/1` will return the same value as `getOldSelection/1` when called from the `EVT_BOOKCTRL_PAGE_CHANGING`\nhandler and not the page which is going to be selected.","title":"wxAuiNotebookEvent.getSelection/1","ref":"wxAuiNotebookEvent.html#getSelection/1"},{"type":"function","doc":"","title":"wxAuiNotebookEvent.setDragSource/2","ref":"wxAuiNotebookEvent.html#setDragSource/2"},{"type":"function","doc":"Sets the id of the page selected before the change.","title":"wxAuiNotebookEvent.setOldSelection/2","ref":"wxAuiNotebookEvent.html#setOldSelection/2"},{"type":"function","doc":"Sets the selection member variable.","title":"wxAuiNotebookEvent.setSelection/2","ref":"wxAuiNotebookEvent.html#setSelection/2"},{"type":"type","doc":"","title":"wxAuiNotebookEvent.wxAuiNotebook/0","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebook/0"},{"type":"type","doc":"","title":"wxAuiNotebookEvent.wxAuiNotebookEvent/0","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebookEvent/0"},{"type":"type","doc":"","title":"wxAuiNotebookEvent.wxAuiNotebookEventType/0","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebookEventType/0"},{"type":"module","doc":"`m:wxAuiPaneInfo` is part of the wxAUI class framework.\n\nSee also overview_aui.\n\n`m:wxAuiPaneInfo` specifies all the parameters for a pane. These parameters specify where\nthe pane is on the screen, whether it is docked or floating, or hidden. In addition, these\nparameters specify the pane's docked position, floating position, preferred size, minimum\nsize, caption text among many other parameters.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiDockArt`\n\nwxWidgets docs: [wxAuiPaneInfo](https://docs.wxwidgets.org/3.2/classwx_aui_pane_info.html)","title":"wxAuiPaneInfo","ref":"wxAuiPaneInfo.html"},{"type":"function","doc":"`bestSize/3` sets the ideal size for the pane.\n\nThe docking manager will attempt to use this size as much as possible when docking or\nfloating the pane.","title":"wxAuiPaneInfo.bestSize/2","ref":"wxAuiPaneInfo.html#bestSize/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.bestSize/3","ref":"wxAuiPaneInfo.html#bestSize/3"},{"type":"function","doc":"`bottom/1` sets the pane dock position to the bottom side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_BOTTOM).","title":"wxAuiPaneInfo.bottom/1","ref":"wxAuiPaneInfo.html#bottom/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.bottomDockable/1","ref":"wxAuiPaneInfo.html#bottomDockable/1"},{"type":"function","doc":"`bottomDockable/2` indicates whether a pane can be docked at the bottom of the frame.","title":"wxAuiPaneInfo.bottomDockable/2","ref":"wxAuiPaneInfo.html#bottomDockable/2"},{"type":"function","doc":"`caption/2` sets the caption of the pane.","title":"wxAuiPaneInfo.caption/2","ref":"wxAuiPaneInfo.html#caption/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.captionVisible/1","ref":"wxAuiPaneInfo.html#captionVisible/1"},{"type":"function","doc":"CaptionVisible indicates that a pane caption should be visible.\n\nIf false, no pane caption is drawn.","title":"wxAuiPaneInfo.captionVisible/2","ref":"wxAuiPaneInfo.html#captionVisible/2"},{"type":"function","doc":"`Center()` (not implemented in wx) sets the pane dock position to the left side of the\nframe.\n\nThe centre pane is the space in the middle after all border panes (left, top, right,\nbottom) are subtracted from the layout. This is the same thing as calling\nDirection(wxAUI_DOCK_CENTRE).","title":"wxAuiPaneInfo.centre/1","ref":"wxAuiPaneInfo.html#centre/1"},{"type":"function","doc":"`centrePane/1` specifies that the pane should adopt the default center pane settings.\n\nCentre panes usually do not have caption bars. This function provides an easy way of\npreparing a pane to be displayed in the center dock position.","title":"wxAuiPaneInfo.centrePane/1","ref":"wxAuiPaneInfo.html#centrePane/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.closeButton/1","ref":"wxAuiPaneInfo.html#closeButton/1"},{"type":"function","doc":"`closeButton/2` indicates that a close button should be drawn for the pane.","title":"wxAuiPaneInfo.closeButton/2","ref":"wxAuiPaneInfo.html#closeButton/2"},{"type":"function","doc":"`defaultPane/1` specifies that the pane should adopt the default pane settings.","title":"wxAuiPaneInfo.defaultPane/1","ref":"wxAuiPaneInfo.html#defaultPane/1"},{"type":"function","doc":"Destroys the object","title":"wxAuiPaneInfo.destroy/1","ref":"wxAuiPaneInfo.html#destroy/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.destroyOnClose/1","ref":"wxAuiPaneInfo.html#destroyOnClose/1"},{"type":"function","doc":"`destroyOnClose/2` indicates whether a pane should be destroyed when it is closed.\n\nNormally a pane is simply hidden when the close button is clicked. Setting DestroyOnClose\nto true will cause the window to be destroyed when the user clicks the pane's close\nbutton.","title":"wxAuiPaneInfo.destroyOnClose/2","ref":"wxAuiPaneInfo.html#destroyOnClose/2"},{"type":"function","doc":"`direction/2` determines the direction of the docked pane.\n\nIt is functionally the same as calling `left/1`, `right/1`, `top/1` or `bottom/1`, except that docking direction may be\nspecified programmatically via the parameter.","title":"wxAuiPaneInfo.direction/2","ref":"wxAuiPaneInfo.html#direction/2"},{"type":"function","doc":"`dock/1` indicates that a pane should be docked.\n\nIt is the opposite of `float/1`.","title":"wxAuiPaneInfo.dock/1","ref":"wxAuiPaneInfo.html#dock/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.dockable/1","ref":"wxAuiPaneInfo.html#dockable/1"},{"type":"function","doc":"`dockable/2` specifies whether a frame can be docked or not.\n\nIt is the same as specifying\nTopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b).","title":"wxAuiPaneInfo.dockable/2","ref":"wxAuiPaneInfo.html#dockable/2"},{"type":"function","doc":"`fixed/1` forces a pane to be fixed size so that it cannot be resized.\n\nAfter calling `fixed/1`, `isFixed/1` will return true.","title":"wxAuiPaneInfo.fixed/1","ref":"wxAuiPaneInfo.html#fixed/1"},{"type":"function","doc":"`float/1` indicates that a pane should be floated.\n\nIt is the opposite of `dock/1`.","title":"wxAuiPaneInfo.float/1","ref":"wxAuiPaneInfo.html#float/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.floatable/1","ref":"wxAuiPaneInfo.html#floatable/1"},{"type":"function","doc":"`floatable/2` sets whether the user will be able to undock a pane and turn it into a\nfloating window.","title":"wxAuiPaneInfo.floatable/2","ref":"wxAuiPaneInfo.html#floatable/2"},{"type":"function","doc":"`floatingPosition/3` sets the position of the floating pane.","title":"wxAuiPaneInfo.floatingPosition/2","ref":"wxAuiPaneInfo.html#floatingPosition/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.floatingPosition/3","ref":"wxAuiPaneInfo.html#floatingPosition/3"},{"type":"function","doc":"`floatingSize/3` sets the size of the floating pane.","title":"wxAuiPaneInfo.floatingSize/2","ref":"wxAuiPaneInfo.html#floatingSize/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.floatingSize/3","ref":"wxAuiPaneInfo.html#floatingSize/3"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getDirection/1","ref":"wxAuiPaneInfo.html#getDirection/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getFloatingPosition/1","ref":"wxAuiPaneInfo.html#getFloatingPosition/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getFloatingSize/1","ref":"wxAuiPaneInfo.html#getFloatingSize/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getFrame/1","ref":"wxAuiPaneInfo.html#getFrame/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getLayer/1","ref":"wxAuiPaneInfo.html#getLayer/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getPosition/1","ref":"wxAuiPaneInfo.html#getPosition/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getRow/1","ref":"wxAuiPaneInfo.html#getRow/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.getWindow/1","ref":"wxAuiPaneInfo.html#getWindow/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.gripper/1","ref":"wxAuiPaneInfo.html#gripper/1"},{"type":"function","doc":"`gripper/2` indicates that a gripper should be drawn for the pane.","title":"wxAuiPaneInfo.gripper/2","ref":"wxAuiPaneInfo.html#gripper/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.gripperTop/1","ref":"wxAuiPaneInfo.html#gripperTop/1"},{"type":"function","doc":"`gripperTop/2` indicates that a gripper should be drawn at the top of the pane.","title":"wxAuiPaneInfo.gripperTop/2","ref":"wxAuiPaneInfo.html#gripperTop/2"},{"type":"function","doc":"`hasBorder/1` returns true if the pane displays a border.","title":"wxAuiPaneInfo.hasBorder/1","ref":"wxAuiPaneInfo.html#hasBorder/1"},{"type":"function","doc":"`hasCaption/1` returns true if the pane displays a caption.","title":"wxAuiPaneInfo.hasCaption/1","ref":"wxAuiPaneInfo.html#hasCaption/1"},{"type":"function","doc":"`hasCloseButton/1` returns true if the pane displays a button to close the pane.","title":"wxAuiPaneInfo.hasCloseButton/1","ref":"wxAuiPaneInfo.html#hasCloseButton/1"},{"type":"function","doc":"`hasFlag/2` returns true if the property specified by flag is active for the pane.","title":"wxAuiPaneInfo.hasFlag/2","ref":"wxAuiPaneInfo.html#hasFlag/2"},{"type":"function","doc":"`hasGripper/1` returns true if the pane displays a gripper.","title":"wxAuiPaneInfo.hasGripper/1","ref":"wxAuiPaneInfo.html#hasGripper/1"},{"type":"function","doc":"`hasGripper/1` returns true if the pane displays a gripper at the top.","title":"wxAuiPaneInfo.hasGripperTop/1","ref":"wxAuiPaneInfo.html#hasGripperTop/1"},{"type":"function","doc":"`hasMaximizeButton/1` returns true if the pane displays a button to maximize the pane.","title":"wxAuiPaneInfo.hasMaximizeButton/1","ref":"wxAuiPaneInfo.html#hasMaximizeButton/1"},{"type":"function","doc":"`hasMinimizeButton/1` returns true if the pane displays a button to minimize the pane.","title":"wxAuiPaneInfo.hasMinimizeButton/1","ref":"wxAuiPaneInfo.html#hasMinimizeButton/1"},{"type":"function","doc":"`hasPinButton/1` returns true if the pane displays a button to float the pane.","title":"wxAuiPaneInfo.hasPinButton/1","ref":"wxAuiPaneInfo.html#hasPinButton/1"},{"type":"function","doc":"`hide/1` indicates that a pane should be hidden.","title":"wxAuiPaneInfo.hide/1","ref":"wxAuiPaneInfo.html#hide/1"},{"type":"function","doc":"`isBottomDockable/1` returns true if the pane can be docked at the bottom of the managed\nframe.","title":"wxAuiPaneInfo.isBottomDockable/1","ref":"wxAuiPaneInfo.html#isBottomDockable/1"},{"type":"function","doc":"`isDocked/1` returns true if the pane is currently docked.","title":"wxAuiPaneInfo.isDocked/1","ref":"wxAuiPaneInfo.html#isDocked/1"},{"type":"function","doc":"`isFixed/1` returns true if the pane cannot be resized.","title":"wxAuiPaneInfo.isFixed/1","ref":"wxAuiPaneInfo.html#isFixed/1"},{"type":"function","doc":"`isFloatable/1` returns true if the pane can be undocked and displayed as a floating\nwindow.","title":"wxAuiPaneInfo.isFloatable/1","ref":"wxAuiPaneInfo.html#isFloatable/1"},{"type":"function","doc":"`isFloating/1` returns true if the pane is floating.","title":"wxAuiPaneInfo.isFloating/1","ref":"wxAuiPaneInfo.html#isFloating/1"},{"type":"function","doc":"`isLeftDockable/1` returns true if the pane can be docked on the left of the managed\nframe.","title":"wxAuiPaneInfo.isLeftDockable/1","ref":"wxAuiPaneInfo.html#isLeftDockable/1"},{"type":"function","doc":"IsMoveable() returns true if the docked frame can be undocked or moved to another dock\nposition.","title":"wxAuiPaneInfo.isMovable/1","ref":"wxAuiPaneInfo.html#isMovable/1"},{"type":"function","doc":"`isOk/1` returns true if the `m:wxAuiPaneInfo` structure is valid.\n\nA pane structure is valid if it has an associated window.","title":"wxAuiPaneInfo.isOk/1","ref":"wxAuiPaneInfo.html#isOk/1"},{"type":"function","doc":"`isResizable/1` returns true if the pane can be resized.","title":"wxAuiPaneInfo.isResizable/1","ref":"wxAuiPaneInfo.html#isResizable/1"},{"type":"function","doc":"`isRightDockable/1` returns true if the pane can be docked on the right of the managed\nframe.","title":"wxAuiPaneInfo.isRightDockable/1","ref":"wxAuiPaneInfo.html#isRightDockable/1"},{"type":"function","doc":"`isShown/1` returns true if the pane is currently shown.","title":"wxAuiPaneInfo.isShown/1","ref":"wxAuiPaneInfo.html#isShown/1"},{"type":"function","doc":"`isToolbar/1` returns true if the pane contains a toolbar.","title":"wxAuiPaneInfo.isToolbar/1","ref":"wxAuiPaneInfo.html#isToolbar/1"},{"type":"function","doc":"`isTopDockable/1` returns true if the pane can be docked at the top of the managed frame.","title":"wxAuiPaneInfo.isTopDockable/1","ref":"wxAuiPaneInfo.html#isTopDockable/1"},{"type":"function","doc":"`layer/2` determines the layer of the docked pane.\n\nThe dock layer is similar to an onion, the inner-most layer being layer 0. Each shell\nmoving in the outward direction has a higher layer number. This allows for more complex\ndocking layout formation.","title":"wxAuiPaneInfo.layer/2","ref":"wxAuiPaneInfo.html#layer/2"},{"type":"function","doc":"`left/1` sets the pane dock position to the left side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_LEFT).","title":"wxAuiPaneInfo.left/1","ref":"wxAuiPaneInfo.html#left/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.leftDockable/1","ref":"wxAuiPaneInfo.html#leftDockable/1"},{"type":"function","doc":"`leftDockable/2` indicates whether a pane can be docked on the left of the frame.","title":"wxAuiPaneInfo.leftDockable/2","ref":"wxAuiPaneInfo.html#leftDockable/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.maximizeButton/1","ref":"wxAuiPaneInfo.html#maximizeButton/1"},{"type":"function","doc":"`maximizeButton/2` indicates that a maximize button should be drawn for the pane.","title":"wxAuiPaneInfo.maximizeButton/2","ref":"wxAuiPaneInfo.html#maximizeButton/2"},{"type":"function","doc":"`maxSize/3` sets the maximum size of the pane.","title":"wxAuiPaneInfo.maxSize/2","ref":"wxAuiPaneInfo.html#maxSize/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.maxSize/3","ref":"wxAuiPaneInfo.html#maxSize/3"},{"type":"function","doc":"","title":"wxAuiPaneInfo.minimizeButton/1","ref":"wxAuiPaneInfo.html#minimizeButton/1"},{"type":"function","doc":"`minimizeButton/2` indicates that a minimize button should be drawn for the pane.","title":"wxAuiPaneInfo.minimizeButton/2","ref":"wxAuiPaneInfo.html#minimizeButton/2"},{"type":"function","doc":"`minSize/3` sets the minimum size of the pane.\n\nPlease note that this is only partially supported as of this writing.","title":"wxAuiPaneInfo.minSize/2","ref":"wxAuiPaneInfo.html#minSize/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.minSize/3","ref":"wxAuiPaneInfo.html#minSize/3"},{"type":"function","doc":"","title":"wxAuiPaneInfo.movable/1","ref":"wxAuiPaneInfo.html#movable/1"},{"type":"function","doc":"Movable indicates whether a frame can be moved.","title":"wxAuiPaneInfo.movable/2","ref":"wxAuiPaneInfo.html#movable/2"},{"type":"function","doc":"`name/2` sets the name of the pane so it can be referenced in lookup functions.\n\nIf a name is not specified by the user, a random name is assigned to the pane when it is\nadded to the manager.","title":"wxAuiPaneInfo.name/2","ref":"wxAuiPaneInfo.html#name/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.new/0","ref":"wxAuiPaneInfo.html#new/0"},{"type":"function","doc":"Copy constructor.","title":"wxAuiPaneInfo.new/1","ref":"wxAuiPaneInfo.html#new/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.paneBorder/1","ref":"wxAuiPaneInfo.html#paneBorder/1"},{"type":"function","doc":"PaneBorder indicates that a border should be drawn for the pane.","title":"wxAuiPaneInfo.paneBorder/2","ref":"wxAuiPaneInfo.html#paneBorder/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.pinButton/1","ref":"wxAuiPaneInfo.html#pinButton/1"},{"type":"function","doc":"`pinButton/2` indicates that a pin button should be drawn for the pane.","title":"wxAuiPaneInfo.pinButton/2","ref":"wxAuiPaneInfo.html#pinButton/2"},{"type":"function","doc":"`position/2` determines the position of the docked pane.","title":"wxAuiPaneInfo.position/2","ref":"wxAuiPaneInfo.html#position/2"},{"type":"function","doc":"","title":"wxAuiPaneInfo.resizable/1","ref":"wxAuiPaneInfo.html#resizable/1"},{"type":"function","doc":"`resizable/2` allows a pane to be resized if the parameter is true, and forces it to be a\nfixed size if the parameter is false.\n\nThis is simply an antonym for `fixed/1`.","title":"wxAuiPaneInfo.resizable/2","ref":"wxAuiPaneInfo.html#resizable/2"},{"type":"function","doc":"`right/1` sets the pane dock position to the right side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_RIGHT).","title":"wxAuiPaneInfo.right/1","ref":"wxAuiPaneInfo.html#right/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.rightDockable/1","ref":"wxAuiPaneInfo.html#rightDockable/1"},{"type":"function","doc":"`rightDockable/2` indicates whether a pane can be docked on the right of the frame.","title":"wxAuiPaneInfo.rightDockable/2","ref":"wxAuiPaneInfo.html#rightDockable/2"},{"type":"function","doc":"`row/2` determines the row of the docked pane.","title":"wxAuiPaneInfo.row/2","ref":"wxAuiPaneInfo.html#row/2"},{"type":"function","doc":"Write the safe parts of a PaneInfo object \"source\" into \"this\".\n\n\"Safe parts\" are all non-UI elements (e.g. all layout determining parameters like the\nsize, position etc.). \"Unsafe parts\" (pointers to button, frame and window) are not\nmodified by this write operation.\n\nRemark: This method is used when loading perspectives.","title":"wxAuiPaneInfo.safeSet/2","ref":"wxAuiPaneInfo.html#safeSet/2"},{"type":"function","doc":"`setFlag/3` turns the property given by flag on or off with the option_state parameter.","title":"wxAuiPaneInfo.setFlag/3","ref":"wxAuiPaneInfo.html#setFlag/3"},{"type":"function","doc":"","title":"wxAuiPaneInfo.show/1","ref":"wxAuiPaneInfo.html#show/1"},{"type":"function","doc":"`show/2` indicates that a pane should be shown.","title":"wxAuiPaneInfo.show/2","ref":"wxAuiPaneInfo.html#show/2"},{"type":"function","doc":"`toolbarPane/1` specifies that the pane should adopt the default toolbar pane settings.","title":"wxAuiPaneInfo.toolbarPane/1","ref":"wxAuiPaneInfo.html#toolbarPane/1"},{"type":"function","doc":"`top/1` sets the pane dock position to the top of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_TOP).","title":"wxAuiPaneInfo.top/1","ref":"wxAuiPaneInfo.html#top/1"},{"type":"function","doc":"","title":"wxAuiPaneInfo.topDockable/1","ref":"wxAuiPaneInfo.html#topDockable/1"},{"type":"function","doc":"`topDockable/2` indicates whether a pane can be docked at the top of the frame.","title":"wxAuiPaneInfo.topDockable/2","ref":"wxAuiPaneInfo.html#topDockable/2"},{"type":"function","doc":"`window/2` assigns the window pointer that the `m:wxAuiPaneInfo` should use.\n\nThis normally does not need to be specified, as the window pointer is automatically\nassigned to the `m:wxAuiPaneInfo` structure as soon as it is added to the manager.","title":"wxAuiPaneInfo.window/2","ref":"wxAuiPaneInfo.html#window/2"},{"type":"type","doc":"","title":"wxAuiPaneInfo.wxAuiPaneInfo/0","ref":"wxAuiPaneInfo.html#t:wxAuiPaneInfo/0"},{"type":"module","doc":"Another standard tab art provider for `m:wxAuiNotebook`.\n\n`m:wxAuiSimpleTabArt` is derived from `m:wxAuiTabArt` demonstrating how to write a\ncompletely new tab art class. It can also be used as alternative to `wxAuiDefaultTabArt`\n(not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxAuiTabArt`\n\nwxWidgets docs: [wxAuiSimpleTabArt](https://docs.wxwidgets.org/3.2/classwx_aui_simple_tab_art.html)","title":"wxAuiSimpleTabArt","ref":"wxAuiSimpleTabArt.html"},{"type":"function","doc":"Destroys the object","title":"wxAuiSimpleTabArt.destroy/1","ref":"wxAuiSimpleTabArt.html#destroy/1"},{"type":"function","doc":"","title":"wxAuiSimpleTabArt.new/0","ref":"wxAuiSimpleTabArt.html#new/0"},{"type":"type","doc":"","title":"wxAuiSimpleTabArt.wxAuiSimpleTabArt/0","ref":"wxAuiSimpleTabArt.html#t:wxAuiSimpleTabArt/0"},{"type":"module","doc":"Tab art provider defines all the drawing functions used by `m:wxAuiNotebook`.\n\nThis allows the `m:wxAuiNotebook` to have a pluggable look-and-feel.\n\nBy default, a `m:wxAuiNotebook` uses an instance of this class called `wxAuiDefaultTabArt`\n(not implemented in wx) which provides bitmap art and a colour scheme that is adapted to\nthe major platforms' look. You can either derive from that class to alter its behaviour or\nwrite a completely new tab art class.\n\nAnother example of creating a new `m:wxAuiNotebook` tab bar is `m:wxAuiSimpleTabArt`.\n\nCall `wxAuiNotebook:setArtProvider/2` to make use of this new tab art.\n\nwxWidgets docs: [wxAuiTabArt](https://docs.wxwidgets.org/3.2/classwx_aui_tab_art.html)","title":"wxAuiTabArt","ref":"wxAuiTabArt.html"},{"type":"function","doc":"Sets the colour of the selected tab.\n\nSince: 2.9.2","title":"wxAuiTabArt.setActiveColour/2","ref":"wxAuiTabArt.html#setActiveColour/2"},{"type":"function","doc":"Sets the colour of the inactive tabs.\n\nSince: 2.9.2","title":"wxAuiTabArt.setColour/2","ref":"wxAuiTabArt.html#setColour/2"},{"type":"function","doc":"Sets flags.","title":"wxAuiTabArt.setFlags/2","ref":"wxAuiTabArt.html#setFlags/2"},{"type":"function","doc":"Sets the font used for calculating measurements.","title":"wxAuiTabArt.setMeasuringFont/2","ref":"wxAuiTabArt.html#setMeasuringFont/2"},{"type":"function","doc":"Sets the normal font for drawing labels.","title":"wxAuiTabArt.setNormalFont/2","ref":"wxAuiTabArt.html#setNormalFont/2"},{"type":"function","doc":"Sets the font for drawing text for selected UI elements.","title":"wxAuiTabArt.setSelectedFont/2","ref":"wxAuiTabArt.html#setSelectedFont/2"},{"type":"type","doc":"","title":"wxAuiTabArt.wxAuiTabArt/0","ref":"wxAuiTabArt.html#t:wxAuiTabArt/0"},{"type":"module","doc":"This class encapsulates the concept of a platform-dependent bitmap, either monochrome or\ncolour or colour with alpha channel support.\n\nIf you need direct access the bitmap data instead going through drawing to it using `m:wxMemoryDC`\nyou need to use the `wxPixelData` (not implemented in wx) class (either wxNativePixelData\nfor RGB bitmaps or wxAlphaPixelData for bitmaps with an additionally alpha channel).\n\nNote that many `m:wxBitmap` functions take a `type` parameter, which is a value of the\n?wxBitmapType enumeration. The validity of those values depends however on the platform\nwhere your program is running and from the wxWidgets configuration. If all possible\nwxWidgets settings are used:\n\n* wxMSW supports BMP and ICO files, BMP and ICO resources;\n\n* wxGTK supports any file supported by gdk-pixbuf;\n\n* wxMac supports PICT resources;\n\n* wxX11 supports XPM files, XPM data, XBM data;\n\nIn addition, `m:wxBitmap` can load and save all formats that `m:wxImage` can; see `m:wxImage`\nfor more info. Of course, you must have loaded the `m:wxImage` handlers (see\n?wxInitAllImageHandlers() and `wxImage::AddHandler` (not implemented in wx)). Note that\nall available wxBitmapHandlers for a given wxWidgets port are automatically loaded at\nstartup so you won't need to use `wxBitmap::AddHandler` (not implemented in wx).\n\nMore on the difference between `m:wxImage` and `m:wxBitmap`: `m:wxImage` is just a buffer\nof RGB bytes with an optional buffer for the alpha bytes. It is all generic, platform\nindependent and image file format independent code. It includes generic code for scaling,\nresizing, clipping, and other manipulations of the image data. OTOH, `m:wxBitmap` is\nintended to be a wrapper of whatever is the native image format that is quickest/easiest\nto draw to a DC or to be the target of the drawing operations performed on a `m:wxMemoryDC`.\nBy splitting the responsibilities between wxImage/wxBitmap like this then it's easier to\nuse generic code shared by all platforms and image types for generic operations and\nplatform specific code where performance or compatibility is needed.\n\nPredefined objects (include wx.hrl): ?wxNullBitmap\n\nSee:\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap)\n\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap_supportedformats)\n\n* `wxDC:blit/6`\n\n* `m:wxIcon`\n\n* `m:wxCursor`\n\n* `m:wxMemoryDC`\n\n* `m:wxImage`\n\nwxWidgets docs: [wxBitmap](https://docs.wxwidgets.org/3.2/classwx_bitmap.html)","title":"wxBitmap","ref":"wxBitmap.html"},{"type":"function","doc":"Creates an image from a platform-dependent bitmap.\n\nThis preserves mask information so that bitmaps and images can be converted back and\nforth without loss in that respect.","title":"wxBitmap.convertToImage/1","ref":"wxBitmap.html#convertToImage/1"},{"type":"function","doc":"Creates the bitmap from an icon.","title":"wxBitmap.copyFromIcon/2","ref":"wxBitmap.html#copyFromIcon/2"},{"type":"function","doc":"","title":"wxBitmap.create/2","ref":"wxBitmap.html#create/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxBitmap.create/3","ref":"wxBitmap.html#create/3"},{"type":"function","doc":"Create a bitmap compatible with the given DC, inheriting its magnification factor.\n\nReturn: true if the creation was successful.\n\nSince: 3.1.0","title":"wxBitmap.create/4","ref":"wxBitmap.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxBitmap.destroy/1","ref":"wxBitmap.html#destroy/1"},{"type":"function","doc":"Gets the colour depth of the bitmap.\n\nA value of 1 indicates a monochrome bitmap.","title":"wxBitmap.getDepth/1","ref":"wxBitmap.html#getDepth/1"},{"type":"function","doc":"Gets the height of the bitmap in pixels.\n\nSee: `getWidth/1`","title":"wxBitmap.getHeight/1","ref":"wxBitmap.html#getHeight/1"},{"type":"function","doc":"Gets the associated mask (if any) which may have been loaded from a file or set for the\nbitmap.\n\nSee:\n* `setMask/2`\n\n* `m:wxMask`","title":"wxBitmap.getMask/1","ref":"wxBitmap.html#getMask/1"},{"type":"function","doc":"Gets the associated palette (if any) which may have been loaded from a file or set for\nthe bitmap.\n\nSee: `m:wxPalette`","title":"wxBitmap.getPalette/1","ref":"wxBitmap.html#getPalette/1"},{"type":"function","doc":"Returns a sub bitmap of the current one as long as the rect belongs entirely to the\nbitmap.\n\nThis function preserves bit depth and mask information.","title":"wxBitmap.getSubBitmap/2","ref":"wxBitmap.html#getSubBitmap/2"},{"type":"function","doc":"Gets the width of the bitmap in pixels.\n\nSee: `getHeight/1`","title":"wxBitmap.getWidth/1","ref":"wxBitmap.html#getWidth/1"},{"type":"function","doc":"Returns true if bitmap data is present.","title":"wxBitmap.isOk/1","ref":"wxBitmap.html#isOk/1"},{"type":"function","doc":"","title":"wxBitmap.loadFile/2","ref":"wxBitmap.html#loadFile/2"},{"type":"function","doc":"Loads a bitmap from a file or resource.\n\nReturn: true if the operation succeeded, false otherwise.\n\nRemark: A palette may be associated with the bitmap if one exists (especially for colour\nWindows bitmaps), and if the code supports it. You can check if one has been created by\nusing the `getPalette/1` member.\n\nSee: `saveFile/4`","title":"wxBitmap.loadFile/3","ref":"wxBitmap.html#loadFile/3"},{"type":"function","doc":"Default constructor.\n\nConstructs a bitmap object with no data; an assignment or another member function such as `create/4`\nor `loadFile/3` must be called subsequently.","title":"wxBitmap.new/0","ref":"wxBitmap.html#new/0"},{"type":"function","doc":"","title":"wxBitmap.new/1","ref":"wxBitmap.html#new/1"},{"type":"function","doc":"Creates this bitmap object from the given image.\n\nThis has to be done to actually display an image as you cannot draw an image directly on\na window.\n\nThe resulting bitmap will use the provided colour depth (or that of the current system if\ndepth is ?wxBITMAP\\_SCREEN\\_DEPTH) which entails that a colour reduction may take place.\n\nOn Windows, if there is a palette present (set with SetPalette), it will be used when\ncreating the `m:wxBitmap` (most useful in 8-bit display mode). On other platforms, the\npalette is currently ignored.","title":"wxBitmap.new/2","ref":"wxBitmap.html#new/2"},{"type":"function","doc":"Creates a new bitmap.\n\nA depth of ?wxBITMAP\\_SCREEN\\_DEPTH indicates the depth of the current screen or visual.\n\nSome platforms only support 1 for monochrome and ?wxBITMAP\\_SCREEN\\_DEPTH for the current\ncolour setting.\n\nA depth of 32 including an alpha channel is supported under MSW, Mac and GTK+.","title":"wxBitmap.new/3","ref":"wxBitmap.html#new/3"},{"type":"function","doc":"Creates a bitmap from the given array `bits`.\n\nYou should only use this function for monochrome bitmaps (depth 1) in portable programs:\nin this case the bits parameter should contain an XBM image.\n\nFor other bit depths, the behaviour is platform dependent: under Windows, the data is\npassed without any changes to the underlying CreateBitmap() API. Under other platforms,\nonly monochrome bitmaps may be created using this constructor and `m:wxImage` should be\nused for creating colour bitmaps from static data.","title":"wxBitmap.new/4","ref":"wxBitmap.html#new/4"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxBitmap.ok/1","ref":"wxBitmap.html#ok/1"},{"type":"function","doc":"","title":"wxBitmap.saveFile/3","ref":"wxBitmap.html#saveFile/3"},{"type":"function","doc":"Saves a bitmap in the named file.\n\nReturn: true if the operation succeeded, false otherwise.\n\nRemark: Depending on how wxWidgets has been configured, not all formats may be available.\n\nSee: `loadFile/3`","title":"wxBitmap.saveFile/4","ref":"wxBitmap.html#saveFile/4"},{"type":"function","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the depth member (does not affect the bitmap data).","title":"wxBitmap.setDepth/2","ref":"wxBitmap.html#setDepth/2"},{"type":"function","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the height member (does not affect the bitmap data).","title":"wxBitmap.setHeight/2","ref":"wxBitmap.html#setHeight/2"},{"type":"function","doc":"Sets the mask for this bitmap.\n\nRemark: The bitmap object owns the mask once this has been called.\n\nNote: A mask can be set also for bitmap with an alpha channel but doing so under wxMSW is\nnot recommended because performance of drawing such bitmap is not very good.\n\nSee:\n* `getMask/1`\n\n* `m:wxMask`","title":"wxBitmap.setMask/2","ref":"wxBitmap.html#setMask/2"},{"type":"function","doc":"Sets the associated palette.\n\n(Not implemented under GTK+).\n\nSee: `m:wxPalette`","title":"wxBitmap.setPalette/2","ref":"wxBitmap.html#setPalette/2"},{"type":"function","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the width member (does not affect the bitmap data).","title":"wxBitmap.setWidth/2","ref":"wxBitmap.html#setWidth/2"},{"type":"type","doc":"","title":"wxBitmap.wxBitmap/0","ref":"wxBitmap.html#t:wxBitmap/0"},{"type":"module","doc":"A bitmap button is a control that contains a bitmap.\n\nNotice that since wxWidgets 2.9.1 bitmap display is supported by the base `m:wxButton`\nclass itself and the only tiny advantage of using this class is that it allows specifying\nthe bitmap in its constructor, unlike `m:wxButton`. Please see the base class\ndocumentation for more information about images support in `m:wxButton`.","title":"wxBitmapButton","ref":"wxBitmapButton.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxBU_LEFT: Left-justifies the bitmap label.\n\n* wxBU_TOP: Aligns the bitmap label to the top of the button.\n\n* wxBU_RIGHT: Right-justifies the bitmap label.\n\n* wxBU_BOTTOM: Aligns the bitmap label to the bottom of the button. Note that the\nwxBU_EXACTFIT style supported by `m:wxButton` is not used by this class as bitmap buttons\ndon't have any minimal standard size by default.\n\nSee: `m:wxButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxButton`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxBitmapButton](https://docs.wxwidgets.org/3.2/classwx_bitmap_button.html)","title":"Styles - wxBitmapButton","ref":"wxBitmapButton.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_button_clicked`](`m:wxCommandEvent`)","title":"Events - wxBitmapButton","ref":"wxBitmapButton.html#module-events"},{"type":"function","doc":"","title":"wxBitmapButton.create/4","ref":"wxBitmapButton.html#create/4"},{"type":"function","doc":"Button creation function for two-step creation.\n\nFor more details, see `new/4`.","title":"wxBitmapButton.create/5","ref":"wxBitmapButton.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxBitmapButton.destroy/1","ref":"wxBitmapButton.html#destroy/1"},{"type":"function","doc":"Default ctor.","title":"wxBitmapButton.new/0","ref":"wxBitmapButton.html#new/0"},{"type":"function","doc":"","title":"wxBitmapButton.new/3","ref":"wxBitmapButton.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a button.\n\nRemark: The bitmap parameter is normally the only bitmap you need to provide, and\nwxWidgets will draw the button correctly in its different states. If you want more\ncontrol, call any of the functions `SetBitmapPressed()` (not implemented in wx), `wxButton:setBitmapFocus/2`, `wxButton:setBitmapDisabled/2`.\n\nSee: `create/5`","title":"wxBitmapButton.new/4","ref":"wxBitmapButton.html#new/4"},{"type":"function","doc":"Helper function creating a standard-looking \"Close\" button.\n\nTo get the best results, platform-specific code may need to be used to create a small,\ntitle bar-like \"Close\" button. This function is provided to avoid the need to test for the\ncurrent platform and creates the button with as native look as possible.\n\nReturn: The new button.\n\nSince: 2.9.5","title":"wxBitmapButton.newCloseButton/2","ref":"wxBitmapButton.html#newCloseButton/2"},{"type":"type","doc":"","title":"wxBitmapButton.wxBitmapButton/0","ref":"wxBitmapButton.html#t:wxBitmapButton/0"},{"type":"module","doc":"`m:wxBitmapDataObject` is a specialization of `m:wxDataObject` for bitmap data.\n\nIt can be used without change to paste data into the `m:wxClipboard` or a `wxDropSource`\n(not implemented in wx). A user may wish to derive a new class from this class for\nproviding a bitmap on-demand in order to minimize memory consumption when offering data in\nseveral formats, such as a bitmap and GIF.\n\nThis class may be used as is, but `getBitmap/1` may be overridden to increase efficiency.\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* `m:wxDataObject`\n\n* `m:wxFileDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxBitmapDataObject](https://docs.wxwidgets.org/3.2/classwx_bitmap_data_object.html)","title":"wxBitmapDataObject","ref":"wxBitmapDataObject.html"},{"type":"function","doc":"Destroys the object","title":"wxBitmapDataObject.destroy/1","ref":"wxBitmapDataObject.html#destroy/1"},{"type":"function","doc":"Returns the bitmap associated with the data object.\n\nYou may wish to override this method when offering data on-demand, but this is not\nrequired by wxWidgets' internals. Use this method to get data in bitmap form from the `m:wxClipboard`.","title":"wxBitmapDataObject.getBitmap/1","ref":"wxBitmapDataObject.html#getBitmap/1"},{"type":"function","doc":"","title":"wxBitmapDataObject.new/0","ref":"wxBitmapDataObject.html#new/0"},{"type":"function","doc":"Constructor, optionally passing a bitmap (otherwise use `setBitmap/2` later).","title":"wxBitmapDataObject.new/1","ref":"wxBitmapDataObject.html#new/1"},{"type":"function","doc":"Sets the bitmap associated with the data object.\n\nThis method is called when the data object receives data. Usually there will be no reason\nto override this function.","title":"wxBitmapDataObject.setBitmap/2","ref":"wxBitmapDataObject.html#setBitmap/2"},{"type":"type","doc":"","title":"wxBitmapDataObject.wxBitmapDataObject/0","ref":"wxBitmapDataObject.html#t:wxBitmapDataObject/0"},{"type":"module","doc":"A book control is a convenient way of displaying multiple pages of information, displayed\none page at a time.\n\nwxWidgets has five variants of this control:\n\n* `m:wxChoicebook`: controlled by a `m:wxChoice`\n\n* `m:wxListbook`: controlled by a `m:wxListCtrl`\n\n* `m:wxNotebook`: uses a row of tabs\n\n* `m:wxTreebook`: controlled by a `m:wxTreeCtrl`\n\n* `m:wxToolbook`: controlled by a `m:wxToolBar`\n\nThis abstract class is the parent of all these book controls, and provides their basic\ninterface. This is a pure virtual class so you cannot allocate it directly.\n\nSee: [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxBookCtrlBase](https://docs.wxwidgets.org/3.2/classwx_book_ctrl_base.html)","title":"wxBookCtrlBase","ref":"wxBookCtrlBase.html"},{"type":"function","doc":"","title":"wxBookCtrlBase.addPage/3","ref":"wxBookCtrlBase.html#addPage/3"},{"type":"function","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","title":"wxBookCtrlBase.addPage/4","ref":"wxBookCtrlBase.html#addPage/4"},{"type":"function","doc":"","title":"wxBookCtrlBase.advanceSelection/1","ref":"wxBookCtrlBase.html#advanceSelection/1"},{"type":"function","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","title":"wxBookCtrlBase.advanceSelection/2","ref":"wxBookCtrlBase.html#advanceSelection/2"},{"type":"function","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","title":"wxBookCtrlBase.changeSelection/2","ref":"wxBookCtrlBase.html#changeSelection/2"},{"type":"function","doc":"Deletes all pages.","title":"wxBookCtrlBase.deleteAllPages/1","ref":"wxBookCtrlBase.html#deleteAllPages/1"},{"type":"function","doc":"Deletes the specified page, and the associated window.\n\nThe call to this function generates the page changing events when deleting the currently\nselected page or a page preceding it in the index order, but it does `not` send any events\nwhen deleting the last page: while in this case the selection also changes, it becomes\ninvalid and for compatibility reasons the control never generates events with the invalid\nselection index.","title":"wxBookCtrlBase.deletePage/2","ref":"wxBookCtrlBase.html#deletePage/2"},{"type":"function","doc":"Returns the currently selected page or NULL.","title":"wxBookCtrlBase.getCurrentPage/1","ref":"wxBookCtrlBase.html#getCurrentPage/1"},{"type":"function","doc":"Returns the window at the given page position.","title":"wxBookCtrlBase.getPage/2","ref":"wxBookCtrlBase.html#getPage/2"},{"type":"function","doc":"Returns the number of pages in the control.","title":"wxBookCtrlBase.getPageCount/1","ref":"wxBookCtrlBase.html#getPageCount/1"},{"type":"function","doc":"Returns the string for the given page.","title":"wxBookCtrlBase.getPageText/2","ref":"wxBookCtrlBase.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","title":"wxBookCtrlBase.getSelection/1","ref":"wxBookCtrlBase.html#getSelection/1"},{"type":"function","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","title":"wxBookCtrlBase.hitTest/2","ref":"wxBookCtrlBase.html#hitTest/2"},{"type":"function","doc":"","title":"wxBookCtrlBase.insertPage/4","ref":"wxBookCtrlBase.html#insertPage/4"},{"type":"function","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","title":"wxBookCtrlBase.insertPage/5","ref":"wxBookCtrlBase.html#insertPage/5"},{"type":"function","doc":"Deletes the specified page, without deleting the associated window.\n\nSee `deletePage/2` for a note about the events generated by this function.","title":"wxBookCtrlBase.removePage/2","ref":"wxBookCtrlBase.html#removePage/2"},{"type":"function","doc":"Sets the text for the given page.","title":"wxBookCtrlBase.setPageText/3","ref":"wxBookCtrlBase.html#setPageText/3"},{"type":"function","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","title":"wxBookCtrlBase.setSelection/2","ref":"wxBookCtrlBase.html#setSelection/2"},{"type":"type","doc":"","title":"wxBookCtrlBase.wxBookCtrlBase/0","ref":"wxBookCtrlBase.html#t:wxBookCtrlBase/0"},{"type":"module","doc":"This class represents the events generated by book controls (`m:wxNotebook`, `m:wxListbook`, `m:wxChoicebook`, `m:wxTreebook`, `m:wxAuiNotebook`).\n\nThe PAGE_CHANGING events are sent before the current page is changed. It allows the\nprogram to examine the current page (which can be retrieved with `getOldSelection/1`) and to veto the page\nchange by calling `wxNotifyEvent:veto/1` if, for example, the current values in the controls of the old page are invalid.\n\nThe PAGE_CHANGED events are sent after the page has been changed and the program cannot\nveto it any more, it just informs it about the page change.\n\nTo summarize, if the program is interested in validating the page values before allowing\nthe user to change it, it should process the PAGE_CHANGING event, otherwise PAGE_CHANGED\nis probably enough. In any case, it is probably unnecessary to process both events at once.\n\nSee:\n* `m:wxNotebook`\n\n* `m:wxListbook`\n\n* `m:wxChoicebook`\n\n* `m:wxTreebook`\n\n* `m:wxToolbook`\n\n* `m:wxAuiNotebook`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxBookCtrlEvent](https://docs.wxwidgets.org/3.2/classwx_book_ctrl_event.html)","title":"wxBookCtrlEvent","ref":"wxBookCtrlEvent.html"},{"type":"function","doc":"Returns the page that was selected before the change, `wxNOT\\_FOUND` if none was\nselected.","title":"wxBookCtrlEvent.getOldSelection/1","ref":"wxBookCtrlEvent.html#getOldSelection/1"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: under Windows, `getSelection/1` will return the same value as `getOldSelection/1` when called from the `EVT_BOOKCTRL_PAGE_CHANGING`\nhandler and not the page which is going to be selected.","title":"wxBookCtrlEvent.getSelection/1","ref":"wxBookCtrlEvent.html#getSelection/1"},{"type":"function","doc":"Sets the id of the page selected before the change.","title":"wxBookCtrlEvent.setOldSelection/2","ref":"wxBookCtrlEvent.html#setOldSelection/2"},{"type":"function","doc":"Sets the selection member variable.","title":"wxBookCtrlEvent.setSelection/2","ref":"wxBookCtrlEvent.html#setSelection/2"},{"type":"type","doc":"","title":"wxBookCtrlEvent.wxBookCtrl/0","ref":"wxBookCtrlEvent.html#t:wxBookCtrl/0"},{"type":"type","doc":"","title":"wxBookCtrlEvent.wxBookCtrlEvent/0","ref":"wxBookCtrlEvent.html#t:wxBookCtrlEvent/0"},{"type":"type","doc":"","title":"wxBookCtrlEvent.wxBookCtrlEventType/0","ref":"wxBookCtrlEvent.html#t:wxBookCtrlEventType/0"},{"type":"module","doc":"The basic idea behind a box sizer is that windows will most often be laid out in rather\nsimple basic geometry, typically in a row or a column or several hierarchies of either.\n\nFor more information, please see overview_sizer_box.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxBoxSizer](https://docs.wxwidgets.org/3.2/classwx_box_sizer.html)","title":"wxBoxSizer","ref":"wxBoxSizer.html"},{"type":"function","doc":"Destroys the object","title":"wxBoxSizer.destroy/1","ref":"wxBoxSizer.html#destroy/1"},{"type":"function","doc":"Returns the orientation of the box sizer, either wxVERTICAL or wxHORIZONTAL.","title":"wxBoxSizer.getOrientation/1","ref":"wxBoxSizer.html#getOrientation/1"},{"type":"function","doc":"Constructor for a `m:wxBoxSizer`.\n\n`orient` may be either of wxVERTICAL or wxHORIZONTAL for creating either a column sizer\nor a row sizer.","title":"wxBoxSizer.new/1","ref":"wxBoxSizer.html#new/1"},{"type":"type","doc":"","title":"wxBoxSizer.wxBoxSizer/0","ref":"wxBoxSizer.html#t:wxBoxSizer/0"},{"type":"module","doc":"A brush is a drawing tool for filling in areas.\n\nIt is used for painting the background of rectangles, ellipses, etc. It has a colour and\na style.\n\nOn a monochrome display, wxWidgets shows all brushes as white unless the colour is really black.\n\nDo not initialize objects on the stack before the program commences, since other required\nstructures may not have been set up yet. Instead, define global pointers to objects and\ncreate them in `wxApp::OnInit` (not implemented in wx) or when required.\n\nAn application may wish to create brushes with different characteristics dynamically, and\nthere is the consequent danger that a large number of duplicate brushes will be created.\nTherefore an application may wish to get a pointer to a brush by using the global list of\nbrushes ?wxTheBrushList, and calling the member function `wxBrushList::FindOrCreateBrush()`\n(not implemented in wx).\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullBrush\n\n* ?wxBLACK\\_BRUSH\n\n* ?wxBLUE\\_BRUSH\n\n* ?wxCYAN\\_BRUSH\n\n* ?wxGREEN\\_BRUSH\n\n* ?wxYELLOW\\_BRUSH\n\n* ?wxGREY\\_BRUSH\n\n* ?wxLIGHT\\_GREY\\_BRUSH\n\n* ?wxMEDIUM\\_GREY\\_BRUSH\n\n* ?wxRED\\_BRUSH\n\n* ?wxTRANSPARENT\\_BRUSH\n\n* ?wxWHITE\\_BRUSH\n\nSee:\n* `m:wxDC`\n\n* `wxDC:setBrush/2`\n\nwxWidgets docs: [wxBrush](https://docs.wxwidgets.org/3.2/classwx_brush.html)","title":"wxBrush","ref":"wxBrush.html"},{"type":"function","doc":"Destroys the object","title":"wxBrush.destroy/1","ref":"wxBrush.html#destroy/1"},{"type":"function","doc":"Returns a reference to the brush colour.\n\nSee: `setColour/4`","title":"wxBrush.getColour/1","ref":"wxBrush.html#getColour/1"},{"type":"function","doc":"Gets a pointer to the stipple bitmap.\n\nIf the brush does not have a `wxBRUSHSTYLE_STIPPLE` style, this bitmap may be non-NULL\nbut uninitialised (i.e. `m:wxBitmap`:`isOk/1` returns false).\n\nSee: `setStipple/2`","title":"wxBrush.getStipple/1","ref":"wxBrush.html#getStipple/1"},{"type":"function","doc":"Returns the brush style, one of the ?wxBrushStyle values.\n\nSee:\n* `setStyle/2`\n\n* `setColour/4`\n\n* `setStipple/2`","title":"wxBrush.getStyle/1","ref":"wxBrush.html#getStyle/1"},{"type":"function","doc":"Returns true if the style of the brush is any of hatched fills.\n\nSee: `getStyle/1`","title":"wxBrush.isHatch/1","ref":"wxBrush.html#isHatch/1"},{"type":"function","doc":"Returns true if the brush is initialised.\n\nNotice that an uninitialized brush object can't be queried for any brush properties and\nall calls to the accessor methods on it will result in an assert failure.","title":"wxBrush.isOk/1","ref":"wxBrush.html#isOk/1"},{"type":"function","doc":"Default constructor.\n\nThe brush will be uninitialised, and `m:wxBrush`:`isOk/1` will return false.","title":"wxBrush.new/0","ref":"wxBrush.html#new/0"},{"type":"function","doc":"Copy constructor, uses reference counting.","title":"wxBrush.new/1","ref":"wxBrush.html#new/1"},{"type":"function","doc":"Constructs a brush from a colour object and `style`.","title":"wxBrush.new/2","ref":"wxBrush.html#new/2"},{"type":"function","doc":"Sets the brush colour using red, green and blue values.\n\nSee: `getColour/1`","title":"wxBrush.setColour/2","ref":"wxBrush.html#setColour/2"},{"type":"function","doc":"","title":"wxBrush.setColour/4","ref":"wxBrush.html#setColour/4"},{"type":"function","doc":"Sets the stipple bitmap.\n\nRemark: The style will be set to `wxBRUSHSTYLE_STIPPLE`, unless the bitmap has a mask\nassociated to it, in which case the style will be set to `wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE`.\n\nSee: `m:wxBitmap`","title":"wxBrush.setStipple/2","ref":"wxBrush.html#setStipple/2"},{"type":"function","doc":"Sets the brush style.\n\nSee: `getStyle/1`","title":"wxBrush.setStyle/2","ref":"wxBrush.html#setStyle/2"},{"type":"type","doc":"","title":"wxBrush.wxBrush/0","ref":"wxBrush.html#t:wxBrush/0"},{"type":"module","doc":"This class provides a simple way to avoid flicker: when drawing on it, everything is in\nfact first drawn on an in-memory buffer (a `m:wxBitmap`) and then copied to the screen,\nusing the associated `m:wxDC`, only once, when this object is destroyed.\n\n`m:wxBufferedDC` itself is typically associated with `m:wxClientDC`, if you want to use\nit in your `EVT_PAINT` handler, you should look at `m:wxBufferedPaintDC` instead.\n\nWhen used like this, a valid `DC` must be specified in the constructor while the `buffer`\nbitmap doesn't have to be explicitly provided, by default this class will allocate the\nbitmap of required size itself. However using a dedicated bitmap can speed up the\nredrawing process by eliminating the repeated creation and destruction of a possibly big\nbitmap. Otherwise, `m:wxBufferedDC` can be used in the same way as any other device context.\n\nAnother possible use for `m:wxBufferedDC` is to use it to maintain a backing store for\nthe window contents. In this case, the associated `DC` may be NULL but a valid backing\nstore bitmap should be specified.\n\nFinally, please note that GTK+ 2.0 as well as macOS provide double buffering themselves\nnatively. You can either use `wxWindow:isDoubleBuffered/1` to determine whether you need to use buffering or not, or\nuse `wxAutoBufferedPaintDC` (not implemented in wx) to avoid needless double buffering on\nthe systems which already do it automatically.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxBufferedPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxMemoryDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxBufferedDC](https://docs.wxwidgets.org/3.2/classwx_buffered_d_c.html)","title":"wxBufferedDC","ref":"wxBufferedDC.html"},{"type":"function","doc":"Destroys the object","title":"wxBufferedDC.destroy/1","ref":"wxBufferedDC.html#destroy/1"},{"type":"function","doc":"","title":"wxBufferedDC.init/2","ref":"wxBufferedDC.html#init/2"},{"type":"function","doc":"","title":"wxBufferedDC.init/3","ref":"wxBufferedDC.html#init/3"},{"type":"function","doc":"Initializes the object created using the default constructor.\n\nPlease see the constructors for parameter details.","title":"wxBufferedDC.init/4","ref":"wxBufferedDC.html#init/4"},{"type":"function","doc":"Default constructor.\n\nYou must call one of the `init/4` methods later in order to use the device context.","title":"wxBufferedDC.new/0","ref":"wxBufferedDC.html#new/0"},{"type":"function","doc":"","title":"wxBufferedDC.new/1","ref":"wxBufferedDC.html#new/1"},{"type":"function","doc":"Creates a buffer for the provided dc.\n\n`init/4` must not be called when using this constructor.","title":"wxBufferedDC.new/2","ref":"wxBufferedDC.html#new/2"},{"type":"function","doc":"Creates a buffer for the provided `dc`.\n\n`init/4` must not be called when using this constructor.","title":"wxBufferedDC.new/3","ref":"wxBufferedDC.html#new/3"},{"type":"type","doc":"","title":"wxBufferedDC.wxBufferedDC/0","ref":"wxBufferedDC.html#t:wxBufferedDC/0"},{"type":"module","doc":"This is a subclass of `m:wxBufferedDC` which can be used inside of an `EVT\\_PAINT()`\nevent handler to achieve double-buffered drawing.\n\nJust use this class instead of `m:wxPaintDC` and make sure `wxWindow:setBackgroundStyle/2` is called with\nwxBG_STYLE_PAINT somewhere in the class initialization code, and that's all you have to do\nto (mostly) avoid flicker. The only thing to watch out for is that if you are using this\nclass together with `wxScrolled` (not implemented in wx), you probably do `not` want to\ncall `wxScrolledWindow:prepareDC/2` on it as it already does this internally for the real underlying `m:wxPaintDC`.\n\nSee:\n* `m:wxDC`\n\n* `m:wxBufferedDC`\n\n* `m:wxPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBufferedDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxBufferedPaintDC](https://docs.wxwidgets.org/3.2/classwx_buffered_paint_d_c.html)","title":"wxBufferedPaintDC","ref":"wxBufferedPaintDC.html"},{"type":"function","doc":"Destroys the object","title":"wxBufferedPaintDC.destroy/1","ref":"wxBufferedPaintDC.html#destroy/1"},{"type":"function","doc":"","title":"wxBufferedPaintDC.new/1","ref":"wxBufferedPaintDC.html#new/1"},{"type":"function","doc":"","title":"wxBufferedPaintDC.new/2","ref":"wxBufferedPaintDC.html#new/2"},{"type":"function","doc":"As with `m:wxBufferedDC`, you may either provide the bitmap to be used for buffering or\nlet this object create one internally (in the latter case, the size of the client part of\nthe window is used).\n\nPass wxBUFFER_CLIENT_AREA for the `style` parameter to indicate that just the client area\nof the window is buffered, or wxBUFFER_VIRTUAL_AREA to indicate that the buffer bitmap\ncovers the virtual area.","title":"wxBufferedPaintDC.new/3","ref":"wxBufferedPaintDC.html#new/3"},{"type":"type","doc":"","title":"wxBufferedPaintDC.wxBufferedPaintDC/0","ref":"wxBufferedPaintDC.html#t:wxBufferedPaintDC/0"},{"type":"module","doc":"A button is a control that contains a text string, and is one of the most common elements\nof a GUI.\n\nIt may be placed on a `m:wxDialog` or on a `m:wxPanel` panel, or indeed on almost any\nother window.\n\nBy default, i.e. if none of the alignment styles are specified, the label is centered\nboth horizontally and vertically. If the button has both a label and a bitmap, the\nalignment styles above specify the location of the rectangle combining both the label and\nthe bitmap and the bitmap position set with `wxButton::SetBitmapPosition()` (not\nimplemented in wx) defines the relative position of the bitmap with respect to the label\n(however currently non-default alignment combinations are not implemented on all platforms).\n\nSince version 2.9.1 `m:wxButton` supports showing both text and an image (currently only\nwhen using wxMSW, wxGTK or wxOSX/Cocoa ports), see `SetBitmap()` (not implemented in wx)\nand `setBitmapLabel/2`, `setBitmapDisabled/2` &c methods. In the previous wxWidgets versions this functionality was only\navailable in (the now trivial) `m:wxBitmapButton` class which was only capable of showing\nan image without text.\n\nA button may have either a single image for all states or different images for the\nfollowing states (different images are not currently supported under macOS where the\nnormal image is used for all states):\n\n* `normal:` the default state\n\n* `disabled:` bitmap shown when the button is disabled.\n\n* `pressed:` bitmap shown when the button is pushed (e.g. while the user keeps the mouse\nbutton pressed on it)\n\n* `focus:` bitmap shown when the button has keyboard focus (but is not pressed as in this\ncase the button is in the pressed state)\n\n* `current:` bitmap shown when the mouse is over the button (but it is not pressed although\nit may have focus). Notice that if current bitmap is not specified but the current\nplatform UI uses hover images for the buttons (such as Windows or GTK+), then the focus\nbitmap is used for hover state as well. This makes it possible to set focus bitmap only to\nget reasonably good behaviour on all platforms.\n\nAll of the bitmaps must be of the same size and the normal bitmap must be set first (to\na valid bitmap), before setting any other ones. Also, if the size of the bitmaps is\nchanged later, you need to change the size of the normal bitmap before setting any other\nbitmaps with the new size (and you do need to reset all of them as their original values\ncan be lost when the normal bitmap size changes).\n\nThe position of the image inside the button be configured using `SetBitmapPosition()`\n(not implemented in wx). By default the image is on the left of the text.\n\nPlease also notice that GTK+ uses a global setting called `gtk-button-images` to\ndetermine if the images should be shown in the buttons at all. If it is off (which is the\ncase in e.g. Gnome 2.28 by default), no images will be shown, consistently with the native behaviour.","title":"wxButton","ref":"wxButton.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxBU_LEFT: Left-justifies the label. Windows and GTK+ only.\n\n* wxBU_TOP: Aligns the label to the top of the button. Windows and GTK+ only.\n\n* wxBU_RIGHT: Right-justifies the bitmap label. Windows and GTK+ only.\n\n* wxBU_BOTTOM: Aligns the label to the bottom of the button. Windows and GTK+ only.\n\n* wxBU_EXACTFIT: By default, all buttons are made of at least the standard button size,\neven if their contents is small enough to fit into a smaller size. This is done for\nconsistency as most platforms use buttons of the same size in the native dialogs, but can\nbe overridden by specifying this flag. If it is given, the button will be made just big\nenough for its contents. Notice that under MSW the button will still have at least the\nstandard height, even with this style, if it has a non-empty label.\n\n* wxBU_NOTEXT: Disables the display of the text label in the button even if it has one or\nits id is one of the standard stock ids with an associated label: without using this style\na button which is only supposed to show a bitmap but uses a standard id would display a\nlabel too.\n\n* wxBORDER_NONE: Creates a button without border. This is currently implemented in MSW,\nGTK2 and OSX/Cocoa.\n\nSee: `m:wxBitmapButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxButton](https://docs.wxwidgets.org/3.2/classwx_button.html)","title":"Styles - wxButton","ref":"wxButton.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_button_clicked`](`m:wxCommandEvent`)","title":"Events - wxButton","ref":"wxButton.html#module-events"},{"type":"function","doc":"","title":"wxButton.create/3","ref":"wxButton.html#create/3"},{"type":"function","doc":"Button creation function for two-step creation.\n\nFor more details, see `new/3`.","title":"wxButton.create/4","ref":"wxButton.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxButton.destroy/1","ref":"wxButton.html#destroy/1"},{"type":"function","doc":"Returns the bitmap for the disabled state, which may be invalid.\n\nSee: `setBitmapDisabled/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.getBitmapDisabled/1","ref":"wxButton.html#getBitmapDisabled/1"},{"type":"function","doc":"Returns the bitmap for the focused state, which may be invalid.\n\nSee: `setBitmapFocus/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.getBitmapFocus/1","ref":"wxButton.html#getBitmapFocus/1"},{"type":"function","doc":"Returns the bitmap for the normal state.\n\nThis is exactly the same as `GetBitmap()` (not implemented in wx) but uses a name\nbackwards-compatible with `m:wxBitmapButton`.\n\nSee: `setBitmapLabel/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.getBitmapLabel/1","ref":"wxButton.html#getBitmapLabel/1"},{"type":"function","doc":"Returns the default size for the buttons.\n\nIt is advised to make all the dialog buttons of the same size and this function allows\nretrieving the (platform, and current font dependent) size which should be the best suited\nfor this.\n\nThe optional `win` argument is new since wxWidgets 3.1.3 and allows to get a per-monitor\nDPI specific size.","title":"wxButton.getDefaultSize/0","ref":"wxButton.html#getDefaultSize/0"},{"type":"function","doc":"","title":"wxButton.getDefaultSize/1","ref":"wxButton.html#getDefaultSize/1"},{"type":"function","doc":"Default ctor.","title":"wxButton.new/0","ref":"wxButton.html#new/0"},{"type":"function","doc":"","title":"wxButton.new/2","ref":"wxButton.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a button.\n\nThe preferred way to create standard buttons is to use default value of `label`. If no\nlabel is supplied and `id` is one of standard IDs from this list, a standard label will be\nused. In other words, if you use a predefined `wxID_XXX` constant, just omit the label\ncompletely rather than specifying it. In particular, help buttons (the ones with `id` of `wxID_HELP`)\nunder macOS can't display any label at all and while `m:wxButton` will detect if the\nstandard \"Help\" label is used and ignore it, using any other label will prevent the button\nfrom correctly appearing as a help button and so should be avoided.\n\nIn addition to that, the button will be decorated with stock icons under GTK+ 2.\n\nSee: `create/4`","title":"wxButton.new/3","ref":"wxButton.html#new/3"},{"type":"function","doc":"Sets the bitmap for the disabled button appearance.\n\nIf `bitmap` is invalid, the disabled bitmap is set to the automatically generated greyed\nout version of the normal bitmap, i.e. the same bitmap as is used by default if this\nmethod is not called at all. Use `SetBitmap()` (not implemented in wx) with an invalid\nbitmap to remove the bitmap completely (for all states).\n\nSee:\n* `getBitmapDisabled/1`\n\n* `setBitmapLabel/2`\n\n* `setBitmapFocus/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.setBitmapDisabled/2","ref":"wxButton.html#setBitmapDisabled/2"},{"type":"function","doc":"Sets the bitmap for the button appearance when it has the keyboard focus.\n\nIf `bitmap` is invalid, the normal bitmap will be used in the focused state.\n\nSee:\n* `getBitmapFocus/1`\n\n* `setBitmapLabel/2`\n\n* `setBitmapDisabled/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.setBitmapFocus/2","ref":"wxButton.html#setBitmapFocus/2"},{"type":"function","doc":"Sets the bitmap label for the button.\n\nRemark: This is the bitmap used for the unselected state, and for all other states if no\nother bitmaps are provided.\n\nSee: `getBitmapLabel/1`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","title":"wxButton.setBitmapLabel/2","ref":"wxButton.html#setBitmapLabel/2"},{"type":"function","doc":"This sets the button to be the default item in its top-level window (e.g.\n\nthe panel or the dialog box containing it).\n\nAs normal, pressing return causes the default button to be depressed when the return key\nis pressed.\n\nSee also `wxWindow:setFocus/1` which sets the keyboard focus for windows and text panel items, and `wxTopLevelWindow::SetDefaultItem()`\n(not implemented in wx).\n\nRemark: Under Windows, only dialog box buttons respond to this function.\n\nReturn: the old default item (possibly NULL)","title":"wxButton.setDefault/1","ref":"wxButton.html#setDefault/1"},{"type":"function","doc":"Sets the string label for the button.","title":"wxButton.setLabel/2","ref":"wxButton.html#setLabel/2"},{"type":"type","doc":"","title":"wxButton.wxButton/0","ref":"wxButton.html#t:wxButton/0"},{"type":"module","doc":"The calendar control allows the user to pick a date.\n\nThe user can move the current selection using the keyboard and select the date\n(generating `EVT_CALENDAR` event) by pressing ` ` or double clicking it.\n\nGeneric calendar has advanced possibilities for the customization of its display,\ndescribed below. If you want to use these possibilities on every platform, use\nwxGenericCalendarCtrl instead of `m:wxCalendarCtrl`.\n\nAll global settings (such as colours and fonts used) can, of course, be changed. But\nalso, the display style for each day in the month can be set independently using `m:wxCalendarDateAttr`\nclass.\n\nAn item without custom attributes is drawn with the default colours and font and without\nborder, but setting custom attributes with `setAttr/3` allows modifying its appearance. Just create a\ncustom attribute object and set it for the day you want to be displayed specially (note\nthat the control will take ownership of the pointer, i.e. it will delete it itself). A day\nmay be marked as being a holiday, even if it is not recognized as one by `wx_datetime()` using the `wxCalendarDateAttr:setHoliday/2` method.\n\nAs the attributes are specified for each day, they may change when the month is changed,\nso you will often want to update them in `EVT_CALENDAR_PAGE_CHANGED` event handler.\n\nIf neither the `wxCAL_SUNDAY_FIRST` or `wxCAL_MONDAY_FIRST` style is given, the first day\nof the week is determined from operating system's settings, if possible. The native wxGTK\ncalendar chooses the first weekday based on locale, and these styles have no effect on it.","title":"wxCalendarCtrl","ref":"wxCalendarCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCAL_SUNDAY_FIRST: Show Sunday as the first day in the week (not in wxGTK)\n\n* wxCAL_MONDAY_FIRST: Show Monday as the first day in the week (not in wxGTK)\n\n* wxCAL_SHOW_HOLIDAYS: Highlight holidays in the calendar (only generic)\n\n* wxCAL_NO_YEAR_CHANGE: Disable the year changing (deprecated, only generic)\n\n* wxCAL_NO_MONTH_CHANGE: Disable the month (and, implicitly, the year) changing\n\n* wxCAL_SHOW_SURROUNDING_WEEKS: Show the neighbouring weeks in the previous and next months\n(only generic, always on for the native controls)\n\n* wxCAL_SEQUENTIAL_MONTH_SELECTION: Use alternative, more compact, style for the month and\nyear selection controls. (only generic)\n\n* wxCAL_SHOW_WEEK_NUMBERS: Show week numbers on the left side of the calendar. (not in\ngeneric)\n\nSee:\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_calendar)\n\n* `m:wxCalendarDateAttr`\n\n* `m:wxCalendarEvent`\n\n* `m:wxDatePickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCalendarCtrl](https://docs.wxwidgets.org/3.2/classwx_calendar_ctrl.html)","title":"Styles - wxCalendarCtrl","ref":"wxCalendarCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`calendar_sel_changed`](`m:wxCalendarEvent`)\n\n* [`calendar_weekday_clicked`](`m:wxCalendarEvent`)","title":"Events - wxCalendarCtrl","ref":"wxCalendarCtrl.html#module-events"},{"type":"function","doc":"","title":"wxCalendarCtrl.create/3","ref":"wxCalendarCtrl.html#create/3"},{"type":"function","doc":"Creates the control.\n\nSee `wxWindow:new/3` for the meaning of the parameters and the control overview for the possible styles.","title":"wxCalendarCtrl.create/4","ref":"wxCalendarCtrl.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxCalendarCtrl.destroy/1","ref":"wxCalendarCtrl.html#destroy/1"},{"type":"function","doc":"","title":"wxCalendarCtrl.enableHolidayDisplay/1","ref":"wxCalendarCtrl.html#enableHolidayDisplay/1"},{"type":"function","doc":"This function should be used instead of changing `wxCAL\\_SHOW\\_HOLIDAYS` style bit\ndirectly.\n\nIt enables or disables the special highlighting of the holidays.","title":"wxCalendarCtrl.enableHolidayDisplay/2","ref":"wxCalendarCtrl.html#enableHolidayDisplay/2"},{"type":"function","doc":"","title":"wxCalendarCtrl.enableMonthChange/1","ref":"wxCalendarCtrl.html#enableMonthChange/1"},{"type":"function","doc":"This function should be used instead of changing `wxCAL\\_NO\\_MONTH\\_CHANGE` style bit.\n\nIt allows or disallows the user to change the month interactively. Note that if the month\ncannot be changed, the year cannot be changed neither.\n\nReturn: true if the value of this option really changed or false if it was already set to\nthe requested value.","title":"wxCalendarCtrl.enableMonthChange/2","ref":"wxCalendarCtrl.html#enableMonthChange/2"},{"type":"function","doc":"","title":"wxCalendarCtrl.enableYearChange/1","ref":"wxCalendarCtrl.html#enableYearChange/1"},{"type":"function","doc":"Deprecated:\n\nThis function should be used instead of changing `wxCAL_NO_YEAR_CHANGE` style bit\ndirectly. It allows or disallows the user to change the year interactively. Only in\ngeneric `m:wxCalendarCtrl`.","title":"wxCalendarCtrl.enableYearChange/2","ref":"wxCalendarCtrl.html#enableYearChange/2"},{"type":"function","doc":"Returns the attribute for the given date (should be in the range 1...31).\n\nThe returned pointer may be NULL. Only in generic `m:wxCalendarCtrl`.","title":"wxCalendarCtrl.getAttr/2","ref":"wxCalendarCtrl.html#getAttr/2"},{"type":"function","doc":"Gets the currently selected date.","title":"wxCalendarCtrl.getDate/1","ref":"wxCalendarCtrl.html#getDate/1"},{"type":"function","doc":"Gets the background colour of the header part of the calendar window.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHeaderColours/3`","title":"wxCalendarCtrl.getHeaderColourBg/1","ref":"wxCalendarCtrl.html#getHeaderColourBg/1"},{"type":"function","doc":"Gets the foreground colour of the header part of the calendar window.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHeaderColours/3`","title":"wxCalendarCtrl.getHeaderColourFg/1","ref":"wxCalendarCtrl.html#getHeaderColourFg/1"},{"type":"function","doc":"Gets the background highlight colour.\n\nOnly in generic `m:wxCalendarCtrl`.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHighlightColours/3`","title":"wxCalendarCtrl.getHighlightColourBg/1","ref":"wxCalendarCtrl.html#getHighlightColourBg/1"},{"type":"function","doc":"Gets the foreground highlight colour.\n\nOnly in generic `m:wxCalendarCtrl`.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHighlightColours/3`","title":"wxCalendarCtrl.getHighlightColourFg/1","ref":"wxCalendarCtrl.html#getHighlightColourFg/1"},{"type":"function","doc":"Return the background colour currently used for holiday highlighting.\n\nOnly useful with generic `m:wxCalendarCtrl` as native versions currently don't support\nholidays display at all and always return `wxNullColour`.\n\nSee: `setHolidayColours/3`","title":"wxCalendarCtrl.getHolidayColourBg/1","ref":"wxCalendarCtrl.html#getHolidayColourBg/1"},{"type":"function","doc":"Return the foreground colour currently used for holiday highlighting.\n\nOnly useful with generic `m:wxCalendarCtrl` as native versions currently don't support\nholidays display at all and always return `wxNullColour`.\n\nSee: `setHolidayColours/3`","title":"wxCalendarCtrl.getHolidayColourFg/1","ref":"wxCalendarCtrl.html#getHolidayColourFg/1"},{"type":"function","doc":"Returns one of wxCalendarHitTestResult constants and fills either `date` or `wd` pointer\nwith the corresponding value depending on the hit test code.\n\nNot implemented in wxGTK currently.","title":"wxCalendarCtrl.hitTest/2","ref":"wxCalendarCtrl.html#hitTest/2"},{"type":"function","doc":"Default constructor.","title":"wxCalendarCtrl.new/0","ref":"wxCalendarCtrl.html#new/0"},{"type":"function","doc":"","title":"wxCalendarCtrl.new/2","ref":"wxCalendarCtrl.html#new/2"},{"type":"function","doc":"Does the same as `create/4` method.","title":"wxCalendarCtrl.new/3","ref":"wxCalendarCtrl.html#new/3"},{"type":"function","doc":"Clears any attributes associated with the given day (in the range 1...31).\n\nOnly in generic `m:wxCalendarCtrl`.","title":"wxCalendarCtrl.resetAttr/2","ref":"wxCalendarCtrl.html#resetAttr/2"},{"type":"function","doc":"Associates the attribute with the specified date (in the range 1...31).\n\nIf the pointer is NULL, the items attribute is cleared. Only in generic `m:wxCalendarCtrl`.","title":"wxCalendarCtrl.setAttr/3","ref":"wxCalendarCtrl.html#setAttr/3"},{"type":"function","doc":"Sets the current date.\n\nThe `date` parameter must be valid and in the currently valid range as set by `SetDateRange()`\n(not implemented in wx), otherwise the current date is not changed and the function\nreturns false and, additionally, triggers an assertion failure if the date is invalid.","title":"wxCalendarCtrl.setDate/2","ref":"wxCalendarCtrl.html#setDate/2"},{"type":"function","doc":"Set the colours used for painting the weekdays at the top of the control.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and does nothing\nin the native versions.","title":"wxCalendarCtrl.setHeaderColours/3","ref":"wxCalendarCtrl.html#setHeaderColours/3"},{"type":"function","doc":"Set the colours to be used for highlighting the currently selected date.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and does nothing\nin the native versions.","title":"wxCalendarCtrl.setHighlightColours/3","ref":"wxCalendarCtrl.html#setHighlightColours/3"},{"type":"function","doc":"Marks the specified day as being a holiday in the current month.\n\nThis method is only implemented in the generic version of the control and does nothing in\nthe native ones.","title":"wxCalendarCtrl.setHoliday/2","ref":"wxCalendarCtrl.html#setHoliday/2"},{"type":"function","doc":"Sets the colours to be used for the holidays highlighting.\n\nThis method is only implemented in the generic version of the control and does nothing in\nthe native ones. It should also only be called if the window style includes `wxCAL_SHOW_HOLIDAYS`\nflag or `enableHolidayDisplay/2` had been called.","title":"wxCalendarCtrl.setHolidayColours/3","ref":"wxCalendarCtrl.html#setHolidayColours/3"},{"type":"type","doc":"","title":"wxCalendarCtrl.wxCalendarCtrl/0","ref":"wxCalendarCtrl.html#t:wxCalendarCtrl/0"},{"type":"module","doc":"`m:wxCalendarDateAttr` is a custom attributes for a calendar date.\n\nThe objects of this class are used with `m:wxCalendarCtrl`.\n\nSee: `m:wxCalendarCtrl`\n\nwxWidgets docs: [wxCalendarDateAttr](https://docs.wxwidgets.org/3.2/classwx_calendar_date_attr.html)","title":"wxCalendarDateAttr","ref":"wxCalendarDateAttr.html"},{"type":"function","doc":"Destroys the object","title":"wxCalendarDateAttr.destroy/1","ref":"wxCalendarDateAttr.html#destroy/1"},{"type":"function","doc":"Returns the background colour set for the calendar date.","title":"wxCalendarDateAttr.getBackgroundColour/1","ref":"wxCalendarDateAttr.html#getBackgroundColour/1"},{"type":"function","doc":"Returns the border set for the calendar date.","title":"wxCalendarDateAttr.getBorder/1","ref":"wxCalendarDateAttr.html#getBorder/1"},{"type":"function","doc":"Returns the border colour set for the calendar date.","title":"wxCalendarDateAttr.getBorderColour/1","ref":"wxCalendarDateAttr.html#getBorderColour/1"},{"type":"function","doc":"Returns the font set for the calendar date.","title":"wxCalendarDateAttr.getFont/1","ref":"wxCalendarDateAttr.html#getFont/1"},{"type":"function","doc":"Returns the text colour set for the calendar date.","title":"wxCalendarDateAttr.getTextColour/1","ref":"wxCalendarDateAttr.html#getTextColour/1"},{"type":"function","doc":"Returns true if a non-default text background colour is set.","title":"wxCalendarDateAttr.hasBackgroundColour/1","ref":"wxCalendarDateAttr.html#hasBackgroundColour/1"},{"type":"function","doc":"Returns true if a non-default (i.e. any) border is set.","title":"wxCalendarDateAttr.hasBorder/1","ref":"wxCalendarDateAttr.html#hasBorder/1"},{"type":"function","doc":"Returns true if a non-default border colour is set.","title":"wxCalendarDateAttr.hasBorderColour/1","ref":"wxCalendarDateAttr.html#hasBorderColour/1"},{"type":"function","doc":"Returns true if a non-default font is set.","title":"wxCalendarDateAttr.hasFont/1","ref":"wxCalendarDateAttr.html#hasFont/1"},{"type":"function","doc":"Returns true if a non-default text foreground colour is set.","title":"wxCalendarDateAttr.hasTextColour/1","ref":"wxCalendarDateAttr.html#hasTextColour/1"},{"type":"function","doc":"Returns true if this calendar day is displayed as a holiday.","title":"wxCalendarDateAttr.isHoliday/1","ref":"wxCalendarDateAttr.html#isHoliday/1"},{"type":"function","doc":"","title":"wxCalendarDateAttr.new/0","ref":"wxCalendarDateAttr.html#new/0"},{"type":"function","doc":"Constructor for specifying all `m:wxCalendarDateAttr` properties.","title":"wxCalendarDateAttr.new/1","ref":"wxCalendarDateAttr.html#new/1"},{"type":"function","doc":"Constructor using default properties except the given border.","title":"wxCalendarDateAttr.new/2","ref":"wxCalendarDateAttr.html#new/2"},{"type":"function","doc":"Sets the text background colour to use.","title":"wxCalendarDateAttr.setBackgroundColour/2","ref":"wxCalendarDateAttr.html#setBackgroundColour/2"},{"type":"function","doc":"Sets the border to use.","title":"wxCalendarDateAttr.setBorder/2","ref":"wxCalendarDateAttr.html#setBorder/2"},{"type":"function","doc":"Sets the border colour to use.","title":"wxCalendarDateAttr.setBorderColour/2","ref":"wxCalendarDateAttr.html#setBorderColour/2"},{"type":"function","doc":"Sets the font to use.","title":"wxCalendarDateAttr.setFont/2","ref":"wxCalendarDateAttr.html#setFont/2"},{"type":"function","doc":"If `holiday` is true, this calendar day will be displayed as a holiday.","title":"wxCalendarDateAttr.setHoliday/2","ref":"wxCalendarDateAttr.html#setHoliday/2"},{"type":"function","doc":"Sets the text (foreground) colour to use.","title":"wxCalendarDateAttr.setTextColour/2","ref":"wxCalendarDateAttr.html#setTextColour/2"},{"type":"type","doc":"","title":"wxCalendarDateAttr.wxCalendarDateAttr/0","ref":"wxCalendarDateAttr.html#t:wxCalendarDateAttr/0"},{"type":"module","doc":"The `m:wxCalendarEvent` class is used together with `m:wxCalendarCtrl`.\n\nSee: `m:wxCalendarCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDateEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCalendarEvent](https://docs.wxwidgets.org/3.2/classwx_calendar_event.html)","title":"wxCalendarEvent","ref":"wxCalendarEvent.html"},{"type":"function","doc":"Returns the date.","title":"wxCalendarEvent.getDate/1","ref":"wxCalendarEvent.html#getDate/1"},{"type":"function","doc":"Returns the week day on which the user clicked in `EVT\\_CALENDAR\\_WEEKDAY\\_CLICKED`\nhandler.\n\nIt doesn't make sense to call this function in other handlers.","title":"wxCalendarEvent.getWeekDay/1","ref":"wxCalendarEvent.html#getWeekDay/1"},{"type":"type","doc":"","title":"wxCalendarEvent.wxCalendar/0","ref":"wxCalendarEvent.html#t:wxCalendar/0"},{"type":"type","doc":"","title":"wxCalendarEvent.wxCalendarEvent/0","ref":"wxCalendarEvent.html#t:wxCalendarEvent/0"},{"type":"type","doc":"","title":"wxCalendarEvent.wxCalendarEventType/0","ref":"wxCalendarEvent.html#t:wxCalendarEventType/0"},{"type":"module","doc":"A caret is a blinking cursor showing the position where the typed text will appear.\n\nText controls usually have their own caret but `m:wxCaret` provides a way to use a caret\nin other windows.\n\nCurrently, the caret appears as a rectangle of the given size. In the future, it will be\npossible to specify a bitmap to be used for the caret shape.\n\nA caret is always associated with a window and the current caret can be retrieved using `wxWindow:getCaret/1`.\nThe same caret can't be reused in two different windows.\n\nwxWidgets docs: [wxCaret](https://docs.wxwidgets.org/3.2/classwx_caret.html)","title":"wxCaret","ref":"wxCaret.html"},{"type":"function","doc":"","title":"wxCaret.create/3","ref":"wxCaret.html#create/3"},{"type":"function","doc":"Creates a caret with the given size (in pixels) and associates it with the `window` (same\nas the equivalent constructors).","title":"wxCaret.create/4","ref":"wxCaret.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxCaret.destroy/1","ref":"wxCaret.html#destroy/1"},{"type":"function","doc":"Returns the blink time which is measured in milliseconds and is the time elapsed between\n2 inversions of the caret (blink time of the caret is the same for all carets, so this\nfunctions is static).","title":"wxCaret.getBlinkTime/0","ref":"wxCaret.html#getBlinkTime/0"},{"type":"function","doc":"","title":"wxCaret.getPosition/1","ref":"wxCaret.html#getPosition/1"},{"type":"function","doc":"","title":"wxCaret.getSize/1","ref":"wxCaret.html#getSize/1"},{"type":"function","doc":"Get the window the caret is associated with.","title":"wxCaret.getWindow/1","ref":"wxCaret.html#getWindow/1"},{"type":"function","doc":"Hides the caret, same as Show(false).","title":"wxCaret.hide/1","ref":"wxCaret.html#hide/1"},{"type":"function","doc":"Returns true if the caret was created successfully.","title":"wxCaret.isOk/1","ref":"wxCaret.html#isOk/1"},{"type":"function","doc":"Returns true if the caret is visible and false if it is permanently hidden (if it is\nblinking and not shown currently but will be after the next blink, this method still\nreturns true).","title":"wxCaret.isVisible/1","ref":"wxCaret.html#isVisible/1"},{"type":"function","doc":"","title":"wxCaret.move/2","ref":"wxCaret.html#move/2"},{"type":"function","doc":"Move the caret to given position (in logical coordinates).","title":"wxCaret.move/3","ref":"wxCaret.html#move/3"},{"type":"function","doc":"","title":"wxCaret.new/2","ref":"wxCaret.html#new/2"},{"type":"function","doc":"Creates a caret with the given size (in pixels) and associates it with the `window`.","title":"wxCaret.new/3","ref":"wxCaret.html#new/3"},{"type":"function","doc":"Sets the blink time for all the carets.\n\nWarning:\n\nUnder Windows, this function will change the blink time for all carets permanently (until\nthe next time it is called), even for carets in other applications.\n\nSee: `getBlinkTime/0`","title":"wxCaret.setBlinkTime/1","ref":"wxCaret.html#setBlinkTime/1"},{"type":"function","doc":"","title":"wxCaret.setSize/2","ref":"wxCaret.html#setSize/2"},{"type":"function","doc":"Changes the size of the caret.","title":"wxCaret.setSize/3","ref":"wxCaret.html#setSize/3"},{"type":"function","doc":"","title":"wxCaret.show/1","ref":"wxCaret.html#show/1"},{"type":"function","doc":"Shows or hides the caret.\n\nNotice that if the caret was hidden N times, it must be shown N times as well to reappear\non the screen.","title":"wxCaret.show/2","ref":"wxCaret.html#show/2"},{"type":"type","doc":"","title":"wxCaret.wxCaret/0","ref":"wxCaret.html#t:wxCaret/0"},{"type":"module","doc":"A checkbox is a labelled box which by default is either on (checkmark is visible) or off\n(no checkmark).\n\nOptionally (when the wxCHK_3STATE style flag is set) it can have a third state, called\nthe mixed or undetermined state. Often this is used as a \"Does Not Apply\" state.","title":"wxCheckBox","ref":"wxCheckBox.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCHK_2STATE: Create a 2-state checkbox. This is the default.\n\n* wxCHK_3STATE: Create a 3-state checkbox. Not implemented in wxGTK1.\n\n* wxCHK_ALLOW_3RD_STATE_FOR_USER: By default a user can't set a 3-state checkbox to the\nthird state. It can only be done from code. Using this flags allows the user to set the\ncheckbox to the third state by clicking.\n\n* wxALIGN_RIGHT: Makes the text appear on the left of the checkbox.\n\nSee:\n* `m:wxRadioButton`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCheckBox](https://docs.wxwidgets.org/3.2/classwx_check_box.html)","title":"Styles - wxCheckBox","ref":"wxCheckBox.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_checkbox_clicked`](`m:wxCommandEvent`)","title":"Events - wxCheckBox","ref":"wxCheckBox.html#module-events"},{"type":"function","doc":"","title":"wxCheckBox.create/4","ref":"wxCheckBox.html#create/4"},{"type":"function","doc":"Creates the checkbox for two-step construction.\n\nSee `new/4` for details.","title":"wxCheckBox.create/5","ref":"wxCheckBox.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxCheckBox.destroy/1","ref":"wxCheckBox.html#destroy/1"},{"type":"function","doc":"Gets the state of a 3-state checkbox.\n\nAsserts when the function is used with a 2-state checkbox.","title":"wxCheckBox.get3StateValue/1","ref":"wxCheckBox.html#get3StateValue/1"},{"type":"function","doc":"Gets the state of a 2-state checkbox.\n\nReturn: Returns true if it is checked, false otherwise.","title":"wxCheckBox.getValue/1","ref":"wxCheckBox.html#getValue/1"},{"type":"function","doc":"Returns whether or not the user can set the checkbox to the third state.\n\nReturn: true if the user can set the third state of this checkbox, false if it can only\nbe set programmatically or if it's a 2-state checkbox.","title":"wxCheckBox.is3rdStateAllowedForUser/1","ref":"wxCheckBox.html#is3rdStateAllowedForUser/1"},{"type":"function","doc":"Returns whether or not the checkbox is a 3-state checkbox.\n\nReturn: true if this checkbox is a 3-state checkbox, false if it's a 2-state checkbox.","title":"wxCheckBox.is3State/1","ref":"wxCheckBox.html#is3State/1"},{"type":"function","doc":"This is just a maybe more readable synonym for `getValue/1`: just as the latter, it\nreturns true if the checkbox is checked and false otherwise.","title":"wxCheckBox.isChecked/1","ref":"wxCheckBox.html#isChecked/1"},{"type":"function","doc":"Default constructor.\n\nSee: `create/5`","title":"wxCheckBox.new/0","ref":"wxCheckBox.html#new/0"},{"type":"function","doc":"","title":"wxCheckBox.new/3","ref":"wxCheckBox.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a checkbox.\n\nSee: `create/5`","title":"wxCheckBox.new/4","ref":"wxCheckBox.html#new/4"},{"type":"function","doc":"Sets the checkbox to the given state.\n\nThis does not cause a `wxEVT_CHECKBOX` event to get emitted.\n\nAsserts when the checkbox is a 2-state checkbox and setting the state to\nwxCHK_UNDETERMINED.","title":"wxCheckBox.set3StateValue/2","ref":"wxCheckBox.html#set3StateValue/2"},{"type":"function","doc":"Sets the checkbox to the given state.\n\nThis does not cause a `wxEVT_CHECKBOX` event to get emitted.","title":"wxCheckBox.setValue/2","ref":"wxCheckBox.html#setValue/2"},{"type":"type","doc":"","title":"wxCheckBox.wxCheckBox/0","ref":"wxCheckBox.html#t:wxCheckBox/0"},{"type":"module","doc":"A `m:wxCheckListBox` is like a `m:wxListBox`, but allows items to be checked or\nunchecked.\n\nWhen using this class under Windows wxWidgets must be compiled with wxUSE_OWNER_DRAWN set\nto 1.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxChoice`\n\n* `m:wxComboBox`\n\n* `m:wxListCtrl`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxListBox`\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCheckListBox](https://docs.wxwidgets.org/3.2/classwx_check_list_box.html)","title":"wxCheckListBox","ref":"wxCheckListBox.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_checklistbox_toggled`](`m:wxCommandEvent`)","title":"Events - wxCheckListBox","ref":"wxCheckListBox.html#module-events"},{"type":"function","doc":"","title":"wxCheckListBox.check/2","ref":"wxCheckListBox.html#check/2"},{"type":"function","doc":"Checks the given item.\n\nNote that calling this method does not result in a `wxEVT_CHECKLISTBOX` event being emitted.","title":"wxCheckListBox.check/3","ref":"wxCheckListBox.html#check/3"},{"type":"function","doc":"Destroys the object","title":"wxCheckListBox.destroy/1","ref":"wxCheckListBox.html#destroy/1"},{"type":"function","doc":"Returns true if the given item is checked, false otherwise.","title":"wxCheckListBox.isChecked/2","ref":"wxCheckListBox.html#isChecked/2"},{"type":"function","doc":"Default constructor.","title":"wxCheckListBox.new/0","ref":"wxCheckListBox.html#new/0"},{"type":"function","doc":"","title":"wxCheckListBox.new/2","ref":"wxCheckListBox.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a list box.","title":"wxCheckListBox.new/3","ref":"wxCheckListBox.html#new/3"},{"type":"type","doc":"","title":"wxCheckListBox.wxCheckListBox/0","ref":"wxCheckListBox.html#t:wxCheckListBox/0"},{"type":"module","doc":"A child focus event is sent to a (parent-)window when one of its child windows gains\nfocus, so that the window could restore the focus back to its corresponding child if it\nloses it now and regains later.\n\nNotice that child window is the direct child of the window receiving event. Use `wxWindow:findFocus/0` to\nretrieve the window which is actually getting focus.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxChildFocusEvent](https://docs.wxwidgets.org/3.2/classwx_child_focus_event.html)","title":"wxChildFocusEvent","ref":"wxChildFocusEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxChildFocusEventType` to subscribe to events of this type.","title":"Events - wxChildFocusEvent","ref":"wxChildFocusEvent.html#module-events"},{"type":"function","doc":"Returns the direct child which receives the focus, or a (grand-)parent of the control\nreceiving the focus.\n\nTo get the actually focused control use `wxWindow:findFocus/0`.","title":"wxChildFocusEvent.getWindow/1","ref":"wxChildFocusEvent.html#getWindow/1"},{"type":"type","doc":"","title":"wxChildFocusEvent.wxChildFocus/0","ref":"wxChildFocusEvent.html#t:wxChildFocus/0"},{"type":"type","doc":"","title":"wxChildFocusEvent.wxChildFocusEvent/0","ref":"wxChildFocusEvent.html#t:wxChildFocusEvent/0"},{"type":"type","doc":"","title":"wxChildFocusEvent.wxChildFocusEventType/0","ref":"wxChildFocusEvent.html#t:wxChildFocusEventType/0"},{"type":"module","doc":"A choice item is used to select one of a list of strings.\n\nUnlike a `m:wxListBox`, only the selection is visible until the user pulls down the menu\nof choices.","title":"wxChoice","ref":"wxChoice.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCB_SORT: Sorts the entries alphabetically.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxComboBox`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxChoice](https://docs.wxwidgets.org/3.2/classwx_choice.html)","title":"Styles - wxChoice","ref":"wxChoice.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_choice_selected`](`m:wxCommandEvent`)","title":"Events - wxChoice","ref":"wxChoice.html#module-events"},{"type":"function","doc":"","title":"wxChoice.create/6","ref":"wxChoice.html#create/6"},{"type":"function","doc":"","title":"wxChoice.create/7","ref":"wxChoice.html#create/7"},{"type":"function","doc":"Deletes an item from the control.\n\nThe client data associated with the item will be also deleted if it is owned by the\ncontrol. Note that it is an error (signalled by an assert failure in debug builds) to\nremove an item with the index negative or greater or equal than the number of items in the control.\n\nIf there is a currently selected item below the item being deleted, i.e. if `wxControlWithItems:getSelection/1` returns a\nvalid index greater than or equal to `n`, the selection is invalidated when this function\nis called. However if the selected item appears before the item being deleted, the\nselection is preserved unchanged.\n\nSee: `wxControlWithItems:clear/1`","title":"wxChoice.delete/2","ref":"wxChoice.html#delete/2"},{"type":"function","doc":"Destroys the object","title":"wxChoice.destroy/1","ref":"wxChoice.html#destroy/1"},{"type":"function","doc":"Gets the number of columns in this choice item.\n\nRemark: This is implemented for GTK and Motif only and always returns 1 for the other\nplatforms.","title":"wxChoice.getColumns/1","ref":"wxChoice.html#getColumns/1"},{"type":"function","doc":"Default constructor.\n\nSee: `create/7`","title":"wxChoice.new/0","ref":"wxChoice.html#new/0"},{"type":"function","doc":"","title":"wxChoice.new/2","ref":"wxChoice.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a choice.\n\nSee: `create/7`","title":"wxChoice.new/3","ref":"wxChoice.html#new/3"},{"type":"function","doc":"","title":"wxChoice.setColumns/1","ref":"wxChoice.html#setColumns/1"},{"type":"function","doc":"Sets the number of columns in this choice item.\n\nRemark: This is implemented for GTK and Motif only and doesn’t do anything under other\nplatforms.","title":"wxChoice.setColumns/2","ref":"wxChoice.html#setColumns/2"},{"type":"type","doc":"","title":"wxChoice.wxChoice/0","ref":"wxChoice.html#t:wxChoice/0"},{"type":"module","doc":"`m:wxChoicebook` is a class similar to `m:wxNotebook`, but uses a `m:wxChoice` control to\nshow the labels instead of the tabs.\n\nFor usage documentation of this class, please refer to the base abstract class\nwxBookCtrl. You can also use the page_samples_notebook to see `m:wxChoicebook` in action.\n\n`m:wxChoicebook` allows the use of wxBookCtrlBase::GetControlSizer(), allowing a program\nto add other controls next to the choice control. This is particularly useful when screen\nspace is restricted, as it often is when `m:wxChoicebook` is being employed.","title":"wxChoicebook","ref":"wxChoicebook.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCHB_DEFAULT: Choose the default location for the labels depending on the current\nplatform (but currently it's the same everywhere, namely wxCHB_TOP).\n\n* wxCHB_TOP: Place labels above the page area.\n\n* wxCHB_LEFT: Place labels on the left side.\n\n* wxCHB_RIGHT: Place labels on the right side.\n\n* wxCHB_BOTTOM: Place labels below the page area.\n\nSee:\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxChoicebook](https://docs.wxwidgets.org/3.2/classwx_choicebook.html)","title":"Styles - wxChoicebook","ref":"wxChoicebook.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`choicebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`choicebook_page_changing`](`m:wxBookCtrlEvent`)","title":"Events - wxChoicebook","ref":"wxChoicebook.html#module-events"},{"type":"function","doc":"","title":"wxChoicebook.addPage/3","ref":"wxChoicebook.html#addPage/3"},{"type":"function","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","title":"wxChoicebook.addPage/4","ref":"wxChoicebook.html#addPage/4"},{"type":"function","doc":"","title":"wxChoicebook.advanceSelection/1","ref":"wxChoicebook.html#advanceSelection/1"},{"type":"function","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","title":"wxChoicebook.advanceSelection/2","ref":"wxChoicebook.html#advanceSelection/2"},{"type":"function","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxChoicebook.assignImageList/2","ref":"wxChoicebook.html#assignImageList/2"},{"type":"function","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","title":"wxChoicebook.changeSelection/2","ref":"wxChoicebook.html#changeSelection/2"},{"type":"function","doc":"","title":"wxChoicebook.create/3","ref":"wxChoicebook.html#create/3"},{"type":"function","doc":"Create the choicebook control that has already been constructed with the default\nconstructor.","title":"wxChoicebook.create/4","ref":"wxChoicebook.html#create/4"},{"type":"function","doc":"Deletes all pages.","title":"wxChoicebook.deleteAllPages/1","ref":"wxChoicebook.html#deleteAllPages/1"},{"type":"function","doc":"Destroys the object","title":"wxChoicebook.destroy/1","ref":"wxChoicebook.html#destroy/1"},{"type":"function","doc":"Returns the currently selected page or NULL.","title":"wxChoicebook.getCurrentPage/1","ref":"wxChoicebook.html#getCurrentPage/1"},{"type":"function","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxChoicebook.getImageList/1","ref":"wxChoicebook.html#getImageList/1"},{"type":"function","doc":"Returns the window at the given page position.","title":"wxChoicebook.getPage/2","ref":"wxChoicebook.html#getPage/2"},{"type":"function","doc":"Returns the number of pages in the control.","title":"wxChoicebook.getPageCount/1","ref":"wxChoicebook.html#getPageCount/1"},{"type":"function","doc":"Returns the image index for the given page.","title":"wxChoicebook.getPageImage/2","ref":"wxChoicebook.html#getPageImage/2"},{"type":"function","doc":"Returns the string for the given page.","title":"wxChoicebook.getPageText/2","ref":"wxChoicebook.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","title":"wxChoicebook.getSelection/1","ref":"wxChoicebook.html#getSelection/1"},{"type":"function","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","title":"wxChoicebook.hitTest/2","ref":"wxChoicebook.html#hitTest/2"},{"type":"function","doc":"","title":"wxChoicebook.insertPage/4","ref":"wxChoicebook.html#insertPage/4"},{"type":"function","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","title":"wxChoicebook.insertPage/5","ref":"wxChoicebook.html#insertPage/5"},{"type":"function","doc":"Constructs a choicebook control.","title":"wxChoicebook.new/0","ref":"wxChoicebook.html#new/0"},{"type":"function","doc":"","title":"wxChoicebook.new/2","ref":"wxChoicebook.html#new/2"},{"type":"function","doc":"","title":"wxChoicebook.new/3","ref":"wxChoicebook.html#new/3"},{"type":"function","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","title":"wxChoicebook.setImageList/2","ref":"wxChoicebook.html#setImageList/2"},{"type":"function","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","title":"wxChoicebook.setPageImage/3","ref":"wxChoicebook.html#setPageImage/3"},{"type":"function","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","title":"wxChoicebook.setPageSize/2","ref":"wxChoicebook.html#setPageSize/2"},{"type":"function","doc":"Sets the text for the given page.","title":"wxChoicebook.setPageText/3","ref":"wxChoicebook.html#setPageText/3"},{"type":"function","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","title":"wxChoicebook.setSelection/2","ref":"wxChoicebook.html#setSelection/2"},{"type":"type","doc":"","title":"wxChoicebook.wxChoicebook/0","ref":"wxChoicebook.html#t:wxChoicebook/0"},{"type":"module","doc":"`m:wxClientDC` is primarily useful for obtaining information about the window from\noutside EVT\\_PAINT() handler.\n\nTypical use of this class is to obtain the extent of some text string in order to\nallocate enough size for a window, e.g.\n\nNote: While `m:wxClientDC` may also be used for drawing on the client area of a window\nfrom outside an EVT_PAINT() handler in some ports, this does `not` work on all platforms\n(neither wxOSX nor wxGTK with GTK 3 Wayland backend support this, so drawing using `m:wxClientDC`\nsimply doesn't have any effect there) and the only portable way of drawing is via `m:wxPaintDC`.\nTo redraw a small part of the window, use `wxWindow:refreshRect/3` to invalidate just this part and check `wxWindow:getUpdateRegion/1` in the\npaint event handler to redraw this part only.\n\n`m:wxClientDC` objects should normally be constructed as temporary stack objects, i.e.\ndon't store a `m:wxClientDC` object.\n\nA `m:wxClientDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxWindowDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindowDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxClientDC](https://docs.wxwidgets.org/3.2/classwx_client_d_c.html)","title":"wxClientDC","ref":"wxClientDC.html"},{"type":"function","doc":"Destroys the object","title":"wxClientDC.destroy/1","ref":"wxClientDC.html#destroy/1"},{"type":"function","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","title":"wxClientDC.new/1","ref":"wxClientDC.html#new/1"},{"type":"type","doc":"","title":"wxClientDC.wxClientDC/0","ref":"wxClientDC.html#t:wxClientDC/0"},{"type":"module","doc":"A class for manipulating the clipboard.\n\nTo use the clipboard, you call member functions of the global ?wxTheClipboard object.\n\nSee the overview_dataobject for further information.\n\nCall `open/1` to get ownership of the clipboard. If this operation returns true, you now own the\nclipboard. Call `setData/2` to put data on the clipboard, or `getData/2` to retrieve data from the clipboard.\nCall `close/1` to close the clipboard and relinquish ownership. You should keep the clipboard open\nonly momentarily.\n\nFor example:\n\nNote: On GTK, the clipboard behavior can vary depending on the configuration of the\nend-user's machine. In order for the clipboard data to persist after the window closes, a\nclipboard manager must be installed. Some clipboard managers will automatically flush the\nclipboard after each new piece of data is added, while others will not. The @Flush()\nfunction will force the clipboard manager to flush the data.\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* [Overview dataobject](https://docs.wxwidgets.org/3.2/overview_dataobject.html#overview_dataobject)\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxClipboard](https://docs.wxwidgets.org/3.2/classwx_clipboard.html)","title":"wxClipboard","ref":"wxClipboard.html"},{"type":"function","doc":"Call this function to add the data object to the clipboard.\n\nThis is an obsolete synonym for `setData/2`.","title":"wxClipboard.addData/2","ref":"wxClipboard.html#addData/2"},{"type":"function","doc":"Clears the global clipboard object and the system's clipboard if possible.","title":"wxClipboard.clear/1","ref":"wxClipboard.html#clear/1"},{"type":"function","doc":"Call this function to close the clipboard, having opened it with `open/1`.","title":"wxClipboard.close/1","ref":"wxClipboard.html#close/1"},{"type":"function","doc":"Destroys the object","title":"wxClipboard.destroy/1","ref":"wxClipboard.html#destroy/1"},{"type":"function","doc":"Flushes the clipboard: this means that the data which is currently on clipboard will stay\navailable even after the application exits (possibly eating memory), otherwise the\nclipboard will be emptied on exit.\n\nCurrently this method is implemented in MSW and GTK and always returns false otherwise.\n\nNote: On GTK, only the non-primary selection can be flushed. Calling this function when\nthe clipboard is using the primary selection will return false and not make any data\navailable after the program exits.\n\nReturn: false if the operation is unsuccessful for any reason.","title":"wxClipboard.flush/1","ref":"wxClipboard.html#flush/1"},{"type":"function","doc":"Returns the global instance (wxTheClipboard) of the clipboard object.","title":"wxClipboard.get/0","ref":"wxClipboard.html#get/0"},{"type":"function","doc":"Call this function to fill `data` with data on the clipboard, if available in the\nrequired format.\n\nReturns true on success.","title":"wxClipboard.getData/2","ref":"wxClipboard.html#getData/2"},{"type":"function","doc":"Returns true if the clipboard has been opened.","title":"wxClipboard.isOpened/1","ref":"wxClipboard.html#isOpened/1"},{"type":"function","doc":"Returns true if there is data which matches the data format of the given data object\ncurrently `available` on the clipboard.","title":"wxClipboard.isSupported/2","ref":"wxClipboard.html#isSupported/2"},{"type":"function","doc":"Default constructor.","title":"wxClipboard.new/0","ref":"wxClipboard.html#new/0"},{"type":"function","doc":"Call this function to open the clipboard before calling `setData/2` and `getData/2`.\n\nCall `close/1` when you have finished with the clipboard. You should keep the clipboard open for\nonly a very short time.\n\nReturn: true on success. This should be tested (as in the sample shown above).","title":"wxClipboard.open/1","ref":"wxClipboard.html#open/1"},{"type":"function","doc":"Call this function to set the data object to the clipboard.\n\nThe new data object replaces any previously set one, so if the application wants to\nprovide clipboard data in several different formats, it must use a composite data object\nsupporting all of the formats instead of calling this function several times with\ndifferent data objects as this would only leave data from the last one in the clipboard.\n\nAfter this function has been called, the clipboard owns the data, so do not delete the\ndata explicitly.","title":"wxClipboard.setData/2","ref":"wxClipboard.html#setData/2"},{"type":"function","doc":"","title":"wxClipboard.usePrimarySelection/1","ref":"wxClipboard.html#usePrimarySelection/1"},{"type":"function","doc":"On platforms supporting it (all X11-based ports), `m:wxClipboard` uses the CLIPBOARD X11\nselection by default.\n\nWhen this function is called with true, all subsequent clipboard operations will use\nPRIMARY selection until this function is called again with false.\n\nOn the other platforms, there is no PRIMARY selection and so all clipboard operations\nwill fail. This allows implementing the standard X11 handling of the clipboard which\nconsists in copying data to the CLIPBOARD selection only when the user explicitly requests\nit (i.e. by selecting the \"Copy\" menu command) but putting the currently selected text\ninto the PRIMARY selection automatically, without overwriting the normal clipboard\ncontents with the currently selected text on the other platforms.","title":"wxClipboard.usePrimarySelection/2","ref":"wxClipboard.html#usePrimarySelection/2"},{"type":"type","doc":"","title":"wxClipboard.wxClipboard/0","ref":"wxClipboard.html#t:wxClipboard/0"},{"type":"module","doc":"This class represents the events generated by a control (typically a `m:wxTextCtrl` but\nother windows can generate these events as well) when its content gets copied or cut to,\nor pasted from the clipboard.\n\nThere are three types of corresponding events `wxEVT_TEXT_COPY`, `wxEVT_TEXT_CUT` and `wxEVT_TEXT_PASTE`.\n\nIf any of these events is processed (without being skipped) by an event handler, the\ncorresponding operation doesn't take place which allows preventing the text from being\ncopied from or pasted to a control. It is also possible to examine the clipboard contents\nin the PASTE event handler and transform it in some way before inserting in a control -\nfor example, changing its case or removing invalid characters.\n\nFinally notice that a CUT event is always preceded by the COPY event which makes it\npossible to only process the latter if it doesn't matter if the text was copied or cut.\n\nNote: These events are currently only generated by `m:wxTextCtrl` in wxGTK and wxOSX but\nare also generated by `m:wxComboBox` without wxCB_READONLY style in wxMSW.\n\nSee: `m:wxClipboard`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxClipboardTextEvent](https://docs.wxwidgets.org/3.2/classwx_clipboard_text_event.html)","title":"wxClipboardTextEvent","ref":"wxClipboardTextEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxClipboardTextEventType` to subscribe to events of this type.","title":"Events - wxClipboardTextEvent","ref":"wxClipboardTextEvent.html#module-events"},{"type":"type","doc":"","title":"wxClipboardTextEvent.wxClipboardText/0","ref":"wxClipboardTextEvent.html#t:wxClipboardText/0"},{"type":"type","doc":"","title":"wxClipboardTextEvent.wxClipboardTextEvent/0","ref":"wxClipboardTextEvent.html#t:wxClipboardTextEvent/0"},{"type":"type","doc":"","title":"wxClipboardTextEvent.wxClipboardTextEventType/0","ref":"wxClipboardTextEvent.html#t:wxClipboardTextEventType/0"},{"type":"module","doc":"This event class contains information about window and session close events.\n\nThe handler function for EVT_CLOSE is called when the user has tried to close a a frame\nor dialog box using the window manager (X) or system menu (Windows). It can also be\ninvoked by the application itself programmatically, for example by calling the `wxWindow:close/2` function.\n\nYou should check whether the application is forcing the deletion of the window using `canVeto/1`. If\nthis is false, you `must` destroy the window using `wxWindow:'Destroy'/1`.\n\nIf the return value is true, it is up to you whether you respond by destroying the window.\n\nIf you don't destroy the window, you should call `veto/2` to let the calling code know that you\ndid not destroy the window. This allows the `wxWindow:close/2` function to return true or false depending on\nwhether the close instruction was honoured or not.\n\nExample of a `m:wxCloseEvent` handler:\n\nThe EVT_END_SESSION event is slightly different as it is sent by the system when the user\nsession is ending (e.g. because of log out or shutdown) and so all windows are being\nforcefully closed. At least under MSW, after the handler for this event is executed the\nprogram is simply killed by the system. Because of this, the default handler for this\nevent provided by wxWidgets calls all the usual cleanup code (including `wxApp::OnExit()`\n(not implemented in wx)) so that it could still be executed and exit()s the process\nitself, without waiting for being killed. If this behaviour is for some reason\nundesirable, make sure that you define a handler for this event in your wxApp-derived\nclass and do not call `event.Skip()` in it (but be aware that the system will still kill\nyour application).\n\nSee:\n* `wxWindow:close/2`\n\n* [Overview windowdeletion](https://docs.wxwidgets.org/3.2/overview_windowdeletion.html#overview_windowdeletion)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCloseEvent](https://docs.wxwidgets.org/3.2/classwx_close_event.html)","title":"wxCloseEvent","ref":"wxCloseEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxCloseEventType` to subscribe to events of this type.","title":"Events - wxCloseEvent","ref":"wxCloseEvent.html#module-events"},{"type":"function","doc":"Returns true if you can veto a system shutdown or a window close event.\n\nVetoing a window close event is not possible if the calling code wishes to force the\napplication to exit, and so this function must be called to check this.","title":"wxCloseEvent.canVeto/1","ref":"wxCloseEvent.html#canVeto/1"},{"type":"function","doc":"Returns true if the user is just logging off or false if the system is shutting down.\n\nThis method can only be called for end session and query end session events, it doesn't\nmake sense for close window event.","title":"wxCloseEvent.getLoggingOff/1","ref":"wxCloseEvent.html#getLoggingOff/1"},{"type":"function","doc":"Sets the 'can veto' flag.","title":"wxCloseEvent.setCanVeto/2","ref":"wxCloseEvent.html#setCanVeto/2"},{"type":"function","doc":"Sets the 'logging off' flag.","title":"wxCloseEvent.setLoggingOff/2","ref":"wxCloseEvent.html#setLoggingOff/2"},{"type":"function","doc":"","title":"wxCloseEvent.veto/1","ref":"wxCloseEvent.html#veto/1"},{"type":"function","doc":"Call this from your event handler to veto a system shutdown or to signal to the calling\napplication that a window close did not happen.\n\nYou can only veto a shutdown if `canVeto/1` returns true.","title":"wxCloseEvent.veto/2","ref":"wxCloseEvent.html#veto/2"},{"type":"type","doc":"","title":"wxCloseEvent.wxClose/0","ref":"wxCloseEvent.html#t:wxClose/0"},{"type":"type","doc":"","title":"wxCloseEvent.wxCloseEvent/0","ref":"wxCloseEvent.html#t:wxCloseEvent/0"},{"type":"type","doc":"","title":"wxCloseEvent.wxCloseEventType/0","ref":"wxCloseEvent.html#t:wxCloseEventType/0"},{"type":"module","doc":"This class holds a variety of information related to colour dialogs.\n\nSee:\n* `wx_color()`\n\n* `m:wxColourDialog`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_colour)\n\nwxWidgets docs: [wxColourData](https://docs.wxwidgets.org/3.2/classwx_colour_data.html)","title":"wxColourData","ref":"wxColourData.html"},{"type":"function","doc":"Destroys the object","title":"wxColourData.destroy/1","ref":"wxColourData.html#destroy/1"},{"type":"function","doc":"Under Windows, determines whether the Windows colour dialog will display the full dialog\nwith custom colour selection controls.\n\nHas no meaning under other platforms.\n\nThe default value is true.","title":"wxColourData.getChooseFull/1","ref":"wxColourData.html#getChooseFull/1"},{"type":"function","doc":"Gets the current colour associated with the colour dialog.\n\nThe default colour is black.","title":"wxColourData.getColour/1","ref":"wxColourData.html#getColour/1"},{"type":"function","doc":"Returns custom colours associated with the colour dialog.","title":"wxColourData.getCustomColour/2","ref":"wxColourData.html#getCustomColour/2"},{"type":"function","doc":"Constructor.\n\nInitializes the custom colours to `wxNullColour`, the `data` colour setting to black, and\nthe `choose` full setting to true.","title":"wxColourData.new/0","ref":"wxColourData.html#new/0"},{"type":"function","doc":"Under Windows, tells the Windows colour dialog to display the full dialog with custom\ncolour selection controls.\n\nUnder other platforms, has no effect.\n\nThe default value is true.","title":"wxColourData.setChooseFull/2","ref":"wxColourData.html#setChooseFull/2"},{"type":"function","doc":"Sets the default colour for the colour dialog.\n\nThe default colour is black.","title":"wxColourData.setColour/2","ref":"wxColourData.html#setColour/2"},{"type":"function","doc":"Sets custom colours for the colour dialog.","title":"wxColourData.setCustomColour/3","ref":"wxColourData.html#setCustomColour/3"},{"type":"type","doc":"","title":"wxColourData.wxColourData/0","ref":"wxColourData.html#t:wxColourData/0"},{"type":"module","doc":"This class represents the colour chooser dialog.\n\nStarting from wxWidgets 3.1.3 and currently in the MSW port only, this dialog generates\nwxEVT_COLOUR_CHANGED events while it is being shown, i.e. from inside its `wxDialog:showModal/1` method, that\nnotify the program about the change of the currently selected colour and allow it to e.g.\npreview the effect of selecting this colour. Note that if you react to this event, you\nshould also correctly revert to the previously selected colour if the dialog is cancelled\nby the user.\n\nExample of using this class with dynamic feedback for the selected colour:\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_colour)\n\n* `wx_color()`\n\n* `m:wxColourData`\n\n* ?wxGetColourFromUser()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxColourDialog](https://docs.wxwidgets.org/3.2/classwx_colour_dialog.html)","title":"wxColourDialog","ref":"wxColourDialog.html"},{"type":"function","doc":"","title":"wxColourDialog.create/2","ref":"wxColourDialog.html#create/2"},{"type":"function","doc":"Same as `new/2`.","title":"wxColourDialog.create/3","ref":"wxColourDialog.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxColourDialog.destroy/1","ref":"wxColourDialog.html#destroy/1"},{"type":"function","doc":"Returns the colour data associated with the colour dialog.","title":"wxColourDialog.getColourData/1","ref":"wxColourDialog.html#getColourData/1"},{"type":"function","doc":"","title":"wxColourDialog.new/0","ref":"wxColourDialog.html#new/0"},{"type":"function","doc":"","title":"wxColourDialog.new/1","ref":"wxColourDialog.html#new/1"},{"type":"function","doc":"Constructor.\n\nPass a parent window, and optionally a pointer to a block of colour data, which will be\ncopied to the colour dialog's colour data.\n\nCustom colours from colour data object will be used in the dialog's colour palette.\nInvalid entries in custom colours list will be ignored on some platforms(GTK) or replaced\nwith white colour on platforms where custom colours palette has fixed size (MSW).\n\nSee: `m:wxColourData`","title":"wxColourDialog.new/2","ref":"wxColourDialog.html#new/2"},{"type":"type","doc":"","title":"wxColourDialog.wxColourDialog/0","ref":"wxColourDialog.html#t:wxColourDialog/0"},{"type":"module","doc":"This control allows the user to select a colour.\n\nThe generic implementation is a button which brings up a `m:wxColourDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe colour-chooser dialog. It is only available if `wxUSE_COLOURPICKERCTRL` is set to 1\n(the default).","title":"wxColourPickerCtrl","ref":"wxColourPickerCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCLRP_DEFAULT_STYLE: The default style: 0.\n\n* wxCLRP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxColourPickerCtrl` and which can be used by the user to\nspecify a colour (see SetColour). The text control is automatically synchronized with\nbutton's value. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxCLRP_SHOW_LABEL: Shows the colour in HTML form (AABBCC) as colour button label (instead\nof no label at all).\n\n* wxCLRP_SHOW_ALPHA: Allows selecting opacity in the colour-chooser (effective under wxGTK\nand wxOSX).\n\nSee:\n* `m:wxColourDialog`\n\n* `m:wxColourPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxColourPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_colour_picker_ctrl.html)","title":"Styles - wxColourPickerCtrl","ref":"wxColourPickerCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_colourpicker_changed`](`m:wxColourPickerEvent`)","title":"Events - wxColourPickerCtrl","ref":"wxColourPickerCtrl.html#module-events"},{"type":"function","doc":"","title":"wxColourPickerCtrl.create/3","ref":"wxColourPickerCtrl.html#create/3"},{"type":"function","doc":"Creates a colour picker with the given arguments.\n\nReturn: true if the control was successfully created or false if creation failed.","title":"wxColourPickerCtrl.create/4","ref":"wxColourPickerCtrl.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxColourPickerCtrl.destroy/1","ref":"wxColourPickerCtrl.html#destroy/1"},{"type":"function","doc":"Returns the currently selected colour.","title":"wxColourPickerCtrl.getColour/1","ref":"wxColourPickerCtrl.html#getColour/1"},{"type":"function","doc":"","title":"wxColourPickerCtrl.new/0","ref":"wxColourPickerCtrl.html#new/0"},{"type":"function","doc":"","title":"wxColourPickerCtrl.new/2","ref":"wxColourPickerCtrl.html#new/2"},{"type":"function","doc":"Initializes the object and calls `create/4` with all the parameters.","title":"wxColourPickerCtrl.new/3","ref":"wxColourPickerCtrl.html#new/3"},{"type":"function","doc":"Sets the currently selected colour.\n\nSee `wxColour::Set()` (not implemented in wx).","title":"wxColourPickerCtrl.setColour/2","ref":"wxColourPickerCtrl.html#setColour/2"},{"type":"type","doc":"","title":"wxColourPickerCtrl.wxColourPickerCtrl/0","ref":"wxColourPickerCtrl.html#t:wxColourPickerCtrl/0"},{"type":"module","doc":"This event class is used for the events generated by `m:wxColourPickerCtrl`.\n\nSee: `m:wxColourPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxColourPickerEvent](https://docs.wxwidgets.org/3.2/classwx_colour_picker_event.html)","title":"wxColourPickerEvent","ref":"wxColourPickerEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxColourPickerEventType` to subscribe to events of this type.","title":"Events - wxColourPickerEvent","ref":"wxColourPickerEvent.html#module-events"},{"type":"function","doc":"Retrieve the colour the user has just selected.","title":"wxColourPickerEvent.getColour/1","ref":"wxColourPickerEvent.html#getColour/1"},{"type":"type","doc":"","title":"wxColourPickerEvent.wxColourPicker/0","ref":"wxColourPickerEvent.html#t:wxColourPicker/0"},{"type":"type","doc":"","title":"wxColourPickerEvent.wxColourPickerEvent/0","ref":"wxColourPickerEvent.html#t:wxColourPickerEvent/0"},{"type":"type","doc":"","title":"wxColourPickerEvent.wxColourPickerEventType/0","ref":"wxColourPickerEvent.html#t:wxColourPickerEventType/0"},{"type":"module","doc":"A combobox is like a combination of an edit control and a listbox.\n\nIt can be displayed as static list with editable or read-only text field; or a drop-down\nlist with text field; or a drop-down list without a text field depending on the platform\nand presence of wxCB_READONLY style.\n\nA combobox permits a single selection only. Combobox items are numbered from zero.\n\nIf you need a customized combobox, have a look at `wxComboCtrl` (not implemented in wx), `wxOwnerDrawnComboBox`\n(not implemented in wx), `wxComboPopup` (not implemented in wx) and the ready-to-use `wxBitmapComboBox`\n(not implemented in wx).\n\nPlease refer to `wxTextEntry` (not implemented in wx) documentation for the description\nof methods operating with the text entry part of the combobox and to `wxItemContainer`\n(not implemented in wx) for the methods operating with the list of strings. Notice that at\nleast under MSW `m:wxComboBox` doesn't behave correctly if it contains strings differing\nin case only so portable programs should avoid adding such strings to this control.","title":"wxComboBox","ref":"wxComboBox.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCB_SIMPLE: Creates a combobox with a permanently displayed list. Windows only.\n\n* wxCB_DROPDOWN: Creates a combobox with a drop-down list. MSW and Motif only.\n\n* wxCB_READONLY: A combobox with this style behaves like a `m:wxChoice` (and may look in\nthe same way as well, although this is platform-dependent), i.e. it allows the user to\nchoose from the list of options but doesn't allow to enter a value not present in the\nlist.\n\n* wxCB_SORT: Sorts the entries in the list alphabetically.\n\n* wxTE_PROCESS_ENTER: The control will generate the event `wxEVT_TEXT_ENTER` that can be\nhandled by the program. Otherwise, i.e. either if this style not specified at all, or it\nis used, but there is no event handler for this event or the event handler called `wxEvent:skip/2` to\navoid overriding the default handling, pressing Enter key is either processed internally\nby the control or used to activate the default button of the dialog, if any.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxTextCtrl`\n\n* `m:wxChoice`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxComboBox](https://docs.wxwidgets.org/3.2/classwx_combo_box.html)","title":"Styles - wxComboBox","ref":"wxComboBox.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_combobox_selected`](`m:wxCommandEvent`)\n\n* [`command_text_updated`](`m:wxCommandEvent`)\n\n* [`command_text_enter`](`m:wxCommandEvent`)\n\n* [`combobox_dropdown`](`m:wxCommandEvent`)\n\n* [`combobox_closeup`](`m:wxCommandEvent`)","title":"Events - wxComboBox","ref":"wxComboBox.html#module-events"},{"type":"function","doc":"Returns true if the selection can be copied to the clipboard.","title":"wxComboBox.canCopy/1","ref":"wxComboBox.html#canCopy/1"},{"type":"function","doc":"Returns true if the selection can be cut to the clipboard.","title":"wxComboBox.canCut/1","ref":"wxComboBox.html#canCut/1"},{"type":"function","doc":"Returns true if the contents of the clipboard can be pasted into the text control.\n\nOn some platforms (Motif, GTK) this is an approximation and returns true if the control\nis editable, false otherwise.","title":"wxComboBox.canPaste/1","ref":"wxComboBox.html#canPaste/1"},{"type":"function","doc":"Returns true if there is a redo facility available and the last operation can be redone.","title":"wxComboBox.canRedo/1","ref":"wxComboBox.html#canRedo/1"},{"type":"function","doc":"Returns true if there is an undo facility available and the last operation can be undone.","title":"wxComboBox.canUndo/1","ref":"wxComboBox.html#canUndo/1"},{"type":"function","doc":"Copies the selected text to the clipboard.","title":"wxComboBox.copy/1","ref":"wxComboBox.html#copy/1"},{"type":"function","doc":"","title":"wxComboBox.create/7","ref":"wxComboBox.html#create/7"},{"type":"function","doc":"","title":"wxComboBox.create/8","ref":"wxComboBox.html#create/8"},{"type":"function","doc":"Copies the selected text to the clipboard and removes it from the control.","title":"wxComboBox.cut/1","ref":"wxComboBox.html#cut/1"},{"type":"function","doc":"Destroys the object","title":"wxComboBox.destroy/1","ref":"wxComboBox.html#destroy/1"},{"type":"function","doc":"Same as `wxTextCtrl:getInsertionPoint/1`.\n\nNote: Under wxMSW, this function always returns 0 if the combobox doesn't have the focus.","title":"wxComboBox.getInsertionPoint/1","ref":"wxComboBox.html#getInsertionPoint/1"},{"type":"function","doc":"Returns the zero based index of the last position in the text control, which is equal to\nthe number of characters in the control.","title":"wxComboBox.getLastPosition/1","ref":"wxComboBox.html#getLastPosition/1"},{"type":"function","doc":"Gets the contents of the control.\n\nNotice that for a multiline text control, the lines will be separated by (Unix-style) `\\n`\ncharacters, even under Windows where they are separated by a `\\r\\n` sequence in the\nnative control.","title":"wxComboBox.getValue/1","ref":"wxComboBox.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxComboBox.new/0","ref":"wxComboBox.html#new/0"},{"type":"function","doc":"","title":"wxComboBox.new/2","ref":"wxComboBox.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a combobox.\n\nSee: `create/8`","title":"wxComboBox.new/3","ref":"wxComboBox.html#new/3"},{"type":"function","doc":"Pastes text from the clipboard to the text item.","title":"wxComboBox.paste/1","ref":"wxComboBox.html#paste/1"},{"type":"function","doc":"If there is a redo facility and the last operation can be redone, redoes the last\noperation.\n\nDoes nothing if there is no redo facility.","title":"wxComboBox.redo/1","ref":"wxComboBox.html#redo/1"},{"type":"function","doc":"Removes the text starting at the first given position up to (but not including) the\ncharacter at the last position.\n\nThis function puts the current insertion point position at `to` as a side effect.","title":"wxComboBox.remove/3","ref":"wxComboBox.html#remove/3"},{"type":"function","doc":"Replaces the text starting at the first position up to (but not including) the character\nat the last position with the given text.\n\nThis function puts the current insertion point position at `to` as a side effect.","title":"wxComboBox.replace/4","ref":"wxComboBox.html#replace/4"},{"type":"function","doc":"Sets the insertion point at the given position.","title":"wxComboBox.setInsertionPoint/2","ref":"wxComboBox.html#setInsertionPoint/2"},{"type":"function","doc":"Sets the insertion point at the end of the text control.\n\nThis is equivalent to calling `setInsertionPoint/2` with `getLastPosition/1` argument.","title":"wxComboBox.setInsertionPointEnd/1","ref":"wxComboBox.html#setInsertionPointEnd/1"},{"type":"function","doc":"Sets the selection to the given item `n` or removes the selection entirely if `n` == `wxNOT\\_FOUND`.\n\nNote that this does not cause any command events to be emitted nor does it deselect any\nother items in the controls which support multiple selections.\n\nSee:\n* `wxControlWithItems:setString/3`\n\n* `wxControlWithItems:setStringSelection/2`","title":"wxComboBox.setSelection/2","ref":"wxComboBox.html#setSelection/2"},{"type":"function","doc":"Same as `wxTextCtrl:setSelection/3`.","title":"wxComboBox.setSelection/3","ref":"wxComboBox.html#setSelection/3"},{"type":"function","doc":"Sets the text for the combobox text field.\n\nFor normal, editable comboboxes with a text entry field calling this method will generate\na `wxEVT_TEXT` event, consistently with `wxTextCtrl:setValue/2` behaviour, use `wxTextCtrl:changeValue/2` if this is undesirable.\n\nFor controls with `wxCB_READONLY` style the method behaves somewhat differently: the\nstring must be in the combobox choices list (the check for this is case-insensitive) and `wxEVT_TEXT`\nis `not` generated in this case.","title":"wxComboBox.setValue/2","ref":"wxComboBox.html#setValue/2"},{"type":"function","doc":"If there is an undo facility and the last operation can be undone, undoes the last\noperation.\n\nDoes nothing if there is no undo facility.","title":"wxComboBox.undo/1","ref":"wxComboBox.html#undo/1"},{"type":"type","doc":"","title":"wxComboBox.wxComboBox/0","ref":"wxComboBox.html#t:wxComboBox/0"},{"type":"module","doc":"This event class contains information about command events, which originate from a\nvariety of simple controls.\n\nNote that wxCommandEvents and wxCommandEvent-derived event classes by default and unlike\nother wxEvent-derived classes propagate upward from the source window (the window which\nemits the event) up to the first parent which processes the event. Be sure to read overview_events_propagation.\n\nMore complex controls, such as `m:wxTreeCtrl`, have separate command event classes.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCommandEvent](https://docs.wxwidgets.org/3.2/classwx_command_event.html)","title":"wxCommandEvent","ref":"wxCommandEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxCommandEventType` to subscribe to events of this type.","title":"Events - wxCommandEvent","ref":"wxCommandEvent.html#module-events"},{"type":"function","doc":"Returns client object pointer for a listbox or choice selection event (not valid for a\ndeselection).","title":"wxCommandEvent.getClientData/1","ref":"wxCommandEvent.html#getClientData/1"},{"type":"function","doc":"Returns extra information dependent on the event objects type.\n\nIf the event comes from a listbox selection, it is a boolean determining whether the\nevent was a selection (true) or a deselection (false). A listbox deselection only occurs\nfor multiple-selection boxes, and in this case the index and string values are\nindeterminate and the listbox must be examined by the application.","title":"wxCommandEvent.getExtraLong/1","ref":"wxCommandEvent.html#getExtraLong/1"},{"type":"function","doc":"Returns the integer identifier corresponding to a listbox, choice or radiobox selection\n(only if the event was a selection, not a deselection), or a boolean value representing\nthe value of a checkbox.\n\nFor a menu item, this method returns -1 if the item is not checkable or a boolean value\n(true or false) for checkable items indicating the new state of the item.","title":"wxCommandEvent.getInt/1","ref":"wxCommandEvent.html#getInt/1"},{"type":"function","doc":"Returns item index for a listbox or choice selection event (not valid for a deselection).","title":"wxCommandEvent.getSelection/1","ref":"wxCommandEvent.html#getSelection/1"},{"type":"function","doc":"Returns item string for a listbox or choice selection event.\n\nIf one or several items have been deselected, returns the index of the first deselected\nitem. If some items have been selected and others deselected at the same time, it will\nreturn the index of the first selected item.","title":"wxCommandEvent.getString/1","ref":"wxCommandEvent.html#getString/1"},{"type":"function","doc":"This method can be used with checkbox and menu events: for the checkboxes, the method\nreturns true for a selection event and false for a deselection one.\n\nFor the menu events, this method indicates if the menu item just has become checked or\nunchecked (and thus only makes sense for checkable menu items).\n\nNotice that this method cannot be used with `m:wxCheckListBox` currently.","title":"wxCommandEvent.isChecked/1","ref":"wxCommandEvent.html#isChecked/1"},{"type":"function","doc":"For a listbox or similar event, returns true if it is a selection, false if it is a\ndeselection.\n\nIf some items have been selected and others deselected at the same time, it will return\ntrue.","title":"wxCommandEvent.isSelection/1","ref":"wxCommandEvent.html#isSelection/1"},{"type":"function","doc":"Sets the `m_commandInt` member.","title":"wxCommandEvent.setInt/2","ref":"wxCommandEvent.html#setInt/2"},{"type":"function","doc":"Sets the `m_commandString` member.","title":"wxCommandEvent.setString/2","ref":"wxCommandEvent.html#setString/2"},{"type":"type","doc":"","title":"wxCommandEvent.wxCommand/0","ref":"wxCommandEvent.html#t:wxCommand/0"},{"type":"type","doc":"","title":"wxCommandEvent.wxCommandEvent/0","ref":"wxCommandEvent.html#t:wxCommandEvent/0"},{"type":"type","doc":"","title":"wxCommandEvent.wxCommandEventType/0","ref":"wxCommandEvent.html#t:wxCommandEventType/0"},{"type":"module","doc":"This class is used for context menu events, sent to give the application a chance to show\na context (popup) menu for a `m:wxWindow`.\n\nNote that if `getPosition/1` returns wxDefaultPosition, this means that the event originated from a\nkeyboard context button event, and you should compute a suitable position yourself, for\nexample by calling `wx_misc:getMousePosition/0`.\n\nNotice that the exact sequence of mouse events is different across the platforms. For\nexample, under MSW the context menu event is generated after `EVT_RIGHT_UP` event and only\nif it was not handled but under GTK the context menu event is generated after `EVT_RIGHT_DOWN`\nevent. This is correct in the sense that it ensures that the context menu is shown\naccording to the current platform UI conventions and also means that you must not handle\n(or call `wxEvent:skip/2` in your handler if you do have one) neither right mouse down nor right mouse up\nevent if you plan on handling `EVT_CONTEXT_MENU` event.\n\nSee:\n* `m:wxCommandEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxContextMenuEvent](https://docs.wxwidgets.org/3.2/classwx_context_menu_event.html)","title":"wxContextMenuEvent","ref":"wxContextMenuEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxContextMenuEventType` to subscribe to events of this type.","title":"Events - wxContextMenuEvent","ref":"wxContextMenuEvent.html#module-events"},{"type":"function","doc":"Returns the position in screen coordinates at which the menu should be shown.\n\nUse `wxWindow:screenToClient/2` to convert to client coordinates.\n\nYou can also omit a position from `wxWindow:popupMenu/4` in order to use the current mouse pointer position.\n\nIf the event originated from a keyboard event, the value returned from this function will\nbe wxDefaultPosition.","title":"wxContextMenuEvent.getPosition/1","ref":"wxContextMenuEvent.html#getPosition/1"},{"type":"function","doc":"Sets the position at which the menu should be shown.","title":"wxContextMenuEvent.setPosition/2","ref":"wxContextMenuEvent.html#setPosition/2"},{"type":"type","doc":"","title":"wxContextMenuEvent.wxContextMenu/0","ref":"wxContextMenuEvent.html#t:wxContextMenu/0"},{"type":"type","doc":"","title":"wxContextMenuEvent.wxContextMenuEvent/0","ref":"wxContextMenuEvent.html#t:wxContextMenuEvent/0"},{"type":"type","doc":"","title":"wxContextMenuEvent.wxContextMenuEventType/0","ref":"wxContextMenuEvent.html#t:wxContextMenuEventType/0"},{"type":"module","doc":"This is the base class for a control or \"widget\".\n\nA control is generally a small window which processes user input and/or displays one or\nmore item of data.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxControl](https://docs.wxwidgets.org/3.2/classwx_control.html)","title":"wxControl","ref":"wxControl.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_text_copy`](`m:wxClipboardTextEvent`)\n\n* [`command_text_cut`](`m:wxClipboardTextEvent`)\n\n* [`command_text_paste`](`m:wxClipboardTextEvent`)","title":"Events - wxControl","ref":"wxControl.html#module-events"},{"type":"function","doc":"Returns the control's label, as it was passed to `setLabel/2`.\n\nNote that the returned string may contains mnemonics (\"&\" characters) if they were passed\nto the `setLabel/2` function; use `GetLabelText()` (not implemented in wx) if they are undesired.\n\nAlso note that the returned string is always the string which was passed to `setLabel/2` but may be\ndifferent from the string passed to `SetLabelText()` (not implemented in wx) (since this\nlast one escapes mnemonic characters).","title":"wxControl.getLabel/1","ref":"wxControl.html#getLabel/1"},{"type":"function","doc":"Sets the control's label.\n\nAll \"&\" characters in the `label` are special and indicate that the following character\nis a `mnemonic` for this control and can be used to activate it from the keyboard\n(typically by using `Alt` key in combination with it). To insert a literal ampersand\ncharacter, you need to double it, i.e. use \"&&\". If this behaviour is undesirable, use `SetLabelText()`\n(not implemented in wx) instead.","title":"wxControl.setLabel/2","ref":"wxControl.html#setLabel/2"},{"type":"type","doc":"","title":"wxControl.wxControl/0","ref":"wxControl.html#t:wxControl/0"},{"type":"module","doc":"This is convenience class that derives from both `m:wxControl` and `wxItemContainer` (not\nimplemented in wx).\n\nIt is used as basis for some wxWidgets controls (`m:wxChoice` and `m:wxListBox`).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxControlWithItems](https://docs.wxwidgets.org/3.2/classwx_control_with_items.html)","title":"wxControlWithItems","ref":"wxControlWithItems.html"},{"type":"function","doc":"Appends item into the control.\n\nReturn: The return value is the index of the newly inserted item. Note that this may be\ndifferent from the last one if the control is sorted (e.g. has `wxLB_SORT` or `wxCB_SORT`\nstyle).","title":"wxControlWithItems.append/2","ref":"wxControlWithItems.html#append/2"},{"type":"function","doc":"Appends item into the control.\n\nReturn: The return value is the index of the newly inserted item. Note that this may be\ndifferent from the last one if the control is sorted (e.g. has `wxLB_SORT` or `wxCB_SORT`\nstyle).","title":"wxControlWithItems.append/3","ref":"wxControlWithItems.html#append/3"},{"type":"function","doc":"Appends several items at once into the control.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","title":"wxControlWithItems.appendStrings/2","ref":"wxControlWithItems.html#appendStrings/2"},{"type":"function","doc":"Appends several items at once into the control.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","title":"wxControlWithItems.appendStrings/3","ref":"wxControlWithItems.html#appendStrings/3"},{"type":"function","doc":"Removes all items from the control.\n\n`clear/1` also deletes the client data of the existing items if it is owned by the control.","title":"wxControlWithItems.clear/1","ref":"wxControlWithItems.html#clear/1"},{"type":"function","doc":"Deletes an item from the control.\n\nThe client data associated with the item will be also deleted if it is owned by the\ncontrol. Note that it is an error (signalled by an assert failure in debug builds) to\nremove an item with the index negative or greater or equal than the number of items in the control.\n\nIf there is a currently selected item below the item being deleted, i.e. if `getSelection/1` returns a\nvalid index greater than or equal to `n`, the selection is invalidated when this function\nis called. However if the selected item appears before the item being deleted, the\nselection is preserved unchanged.\n\nSee: `clear/1`","title":"wxControlWithItems.delete/2","ref":"wxControlWithItems.html#delete/2"},{"type":"function","doc":"","title":"wxControlWithItems.findString/2","ref":"wxControlWithItems.html#findString/2"},{"type":"function","doc":"Finds an item whose label matches the given string.\n\nReturn: The zero-based position of the item, or wxNOT_FOUND if the string was not found.","title":"wxControlWithItems.findString/3","ref":"wxControlWithItems.html#findString/3"},{"type":"function","doc":"Returns a pointer to the client data associated with the given item (if any).\n\nIt is an error to call this function for a control which doesn't have typed client data\nat all although it is OK to call it even if the given item doesn't have any client data\nassociated with it (but other items do).\n\nNotice that the returned pointer is still owned by the control and will be deleted by it,\nuse `DetachClientObject()` (not implemented in wx) if you want to remove the pointer from\nthe control.\n\nReturn: A pointer to the client data, or NULL if not present.","title":"wxControlWithItems.getClientData/2","ref":"wxControlWithItems.html#getClientData/2"},{"type":"function","doc":"Returns the number of items in the control.\n\nSee: `isEmpty/1`","title":"wxControlWithItems.getCount/1","ref":"wxControlWithItems.html#getCount/1"},{"type":"function","doc":"Returns the index of the selected item or `wxNOT\\_FOUND` if no item is selected.\n\nReturn: The position of the current selection.\n\nRemark: This method can be used with single selection list boxes only, you should use `wxListBox:getSelections/1`\nfor the list boxes with wxLB_MULTIPLE style.\n\nSee:\n* `setSelection/2`\n\n* `getStringSelection/1`","title":"wxControlWithItems.getSelection/1","ref":"wxControlWithItems.html#getSelection/1"},{"type":"function","doc":"Returns the label of the item with the given index.\n\nReturn: The label of the item or an empty string if the position was invalid.","title":"wxControlWithItems.getString/2","ref":"wxControlWithItems.html#getString/2"},{"type":"function","doc":"Returns the label of the selected item or an empty string if no item is selected.\n\nSee: `getSelection/1`","title":"wxControlWithItems.getStringSelection/1","ref":"wxControlWithItems.html#getStringSelection/1"},{"type":"function","doc":"Inserts item into the control.\n\nReturn: The return value is the index of the newly inserted item. If the insertion failed\nfor some reason, -1 is returned.","title":"wxControlWithItems.insert/3","ref":"wxControlWithItems.html#insert/3"},{"type":"function","doc":"Inserts item into the control.\n\nReturn: The return value is the index of the newly inserted item. If the insertion failed\nfor some reason, -1 is returned.","title":"wxControlWithItems.insert/4","ref":"wxControlWithItems.html#insert/4"},{"type":"function","doc":"Inserts several items at once into the control.\n\nNotice that calling this method is usually much faster than inserting them one by one if\nyou need to insert a lot of items.\n\nReturn: The return value is the index of the last inserted item. If the insertion failed\nfor some reason, -1 is returned.","title":"wxControlWithItems.insertStrings/3","ref":"wxControlWithItems.html#insertStrings/3"},{"type":"function","doc":"Inserts several items at once into the control.\n\nNotice that calling this method is usually much faster than inserting them one by one if\nyou need to insert a lot of items.\n\nReturn: The return value is the index of the last inserted item. If the insertion failed\nfor some reason, -1 is returned.","title":"wxControlWithItems.insertStrings/4","ref":"wxControlWithItems.html#insertStrings/4"},{"type":"function","doc":"Returns true if the control is empty or false if it has some items.\n\nSee: `getCount/1`","title":"wxControlWithItems.isEmpty/1","ref":"wxControlWithItems.html#isEmpty/1"},{"type":"function","doc":"This is the same as `setSelection/2` and exists only because it is slightly more natural\nfor controls which support multiple selection.","title":"wxControlWithItems.select/2","ref":"wxControlWithItems.html#select/2"},{"type":"function","doc":"Associates the given typed client data pointer with the given item: the `data` object\nwill be deleted when the item is deleted (either explicitly by using `delete/2` or\nimplicitly when the control itself is destroyed).\n\nNote that it is an error to call this function if any untyped client data pointers had\nbeen associated with the control items before.","title":"wxControlWithItems.setClientData/3","ref":"wxControlWithItems.html#setClientData/3"},{"type":"function","doc":"Sets the selection to the given item `n` or removes the selection entirely if `n` == `wxNOT\\_FOUND`.\n\nNote that this does not cause any command events to be emitted nor does it deselect any\nother items in the controls which support multiple selections.\n\nSee:\n* `setString/3`\n\n* `setStringSelection/2`","title":"wxControlWithItems.setSelection/2","ref":"wxControlWithItems.html#setSelection/2"},{"type":"function","doc":"Sets the label for the given item.","title":"wxControlWithItems.setString/3","ref":"wxControlWithItems.html#setString/3"},{"type":"function","doc":"Selects the item with the specified string in the control.\n\nThis method doesn't cause any command events to be emitted.\n\nNotice that this method is case-insensitive, i.e. the string is compared with all the\nelements of the control case-insensitively and the first matching entry is selected, even\nif it doesn't have exactly the same case as this string and there is an exact match afterwards.\n\nReturn: true if the specified string has been selected, false if it wasn't found in the\ncontrol.","title":"wxControlWithItems.setStringSelection/2","ref":"wxControlWithItems.html#setStringSelection/2"},{"type":"type","doc":"","title":"wxControlWithItems.wxControlWithItems/0","ref":"wxControlWithItems.html#t:wxControlWithItems/0"},{"type":"module","doc":"A cursor is a small bitmap usually used for denoting where the mouse pointer is, with a\npicture that might indicate the interpretation of a mouse click.\n\nAs with icons, cursors in X and MS Windows are created in a different manner. Therefore,\nseparate cursors will be created for the different environments. Platform-specific methods\nfor creating a `m:wxCursor` object are catered for, and this is an occasion where\nconditional compilation will probably be required (see `m:wxIcon` for an example).\n\nA single cursor object may be used in many windows (any subwindow type). The wxWidgets\nconvention is to set the cursor for a window, as in X, rather than to set it globally as\nin MS Windows, although a global `wx_misc:setCursor/1` function is also available for MS Windows use.\n\nCreating a Custom Cursor\n\nThe following is an example of creating a cursor from 32x32 bitmap data (down_bits) and a\nmask (down_mask) where 1 is black and 0 is white for the bits, and 1 is opaque and 0 is\ntransparent for the mask. It works on Windows and GTK+.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullCursor\n\n* ?wxSTANDARD\\_CURSOR\n\n* ?wxHOURGLASS\\_CURSOR\n\n* ?wxCROSS\\_CURSOR\n\nSee:\n* `m:wxBitmap`\n\n* `m:wxIcon`\n\n* `wxWindow:setCursor/2`\n\n* `wx_misc:setCursor/1`\n\n* ?wxStockCursor\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxCursor](https://docs.wxwidgets.org/3.2/classwx_cursor.html)","title":"wxCursor","ref":"wxCursor.html"},{"type":"function","doc":"Destroys the object","title":"wxCursor.destroy/1","ref":"wxCursor.html#destroy/1"},{"type":"function","doc":"Returns true if cursor data is present.","title":"wxCursor.isOk/1","ref":"wxCursor.html#isOk/1"},{"type":"function","doc":"Default constructor.","title":"wxCursor.new/0","ref":"wxCursor.html#new/0"},{"type":"function","doc":"Constructs a cursor using a cursor identifier.","title":"wxCursor.new/1","ref":"wxCursor.html#new/1"},{"type":"function","doc":"Constructs a cursor by passing a string resource name or filename.\n\nThe arguments `hotSpotX` and `hotSpotY` are only used when there's no hotspot info in the\nresource/image-file to load (e.g. when using `wxBITMAP_TYPE_ICO` under wxMSW or `wxBITMAP_TYPE_XPM`\nunder wxGTK).","title":"wxCursor.new/2","ref":"wxCursor.html#new/2"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxCursor.ok/1","ref":"wxCursor.html#ok/1"},{"type":"type","doc":"","title":"wxCursor.wxCursor/0","ref":"wxCursor.html#t:wxCursor/0"},{"type":"module","doc":"A `m:wxDC` is a `\"device context\"` onto which graphics and text can be drawn.\n\nIt is intended to represent different output devices and offers a common abstract API for\ndrawing on any of them.\n\nwxWidgets offers an alternative drawing API based on the modern drawing backends GDI+,\nCoreGraphics, Cairo and Direct2D. See `m:wxGraphicsContext`, `m:wxGraphicsRenderer` and\nrelated classes. There is also a `m:wxGCDC` linking the APIs by offering the `m:wxDC` API\non top of a `m:wxGraphicsContext`.\n\n`m:wxDC` is an abstract base class and cannot be created directly. Use `m:wxPaintDC`, `m:wxClientDC`, `m:wxWindowDC`, `m:wxScreenDC`, `m:wxMemoryDC`\nor `wxPrinterDC` (not implemented in wx). Notice that device contexts which are\nassociated with windows (i.e. `m:wxClientDC`, `m:wxWindowDC` and `m:wxPaintDC`) use the\nwindow font and colours by default (starting with wxWidgets 2.9.0) but the other device\ncontext classes use system-default values so you always must set the appropriate fonts and\ncolours before using them.\n\nIn addition to the versions of the methods documented below, there are also versions\nwhich accept single {X,Y} parameter instead of the two wxCoord ones or {X,Y} and\n{Width,Height} instead of the four wxCoord parameters.\n\nBeginning with wxWidgets 2.9.0 the entire `m:wxDC` code has been reorganized. All\nplatform dependent code (actually all drawing code) has been moved into backend classes\nwhich derive from a common wxDCImpl class. The user-visible classes such as `m:wxClientDC`\nand `m:wxPaintDC` merely forward all calls to the backend implementation.\n\nDevice and logical units\n\nIn the `m:wxDC` context there is a distinction between `logical` units and `device` units.\n\n`Device` units are the units native to the particular device; e.g. for a screen, a device\nunit is a `pixel`. For a printer, the device unit is defined by the resolution of the\nprinter (usually given in `DPI:` dot-per-inch).\n\nAll `m:wxDC` functions use instead `logical` units, unless where explicitly stated.\nLogical units are arbitrary units mapped to device units using the current mapping mode\n(see `setMapMode/2`).\n\nThis mechanism allows reusing the same code which prints on e.g. a window on the screen\nto print on e.g. a paper.\n\nSupport for Transparency / Alpha Channel\n\nIn general `m:wxDC` methods don't support alpha transparency and the alpha component of `wx_color()`\nis simply ignored and you need to use `m:wxGraphicsContext` for full transparency support.\nThere are, however, a few exceptions: first, under macOS and GTK+ 3 colours with alpha\nchannel are supported in all the normal wxDC-derived classes as they use `m:wxGraphicsContext`\ninternally. Second, under all platforms `wxSVGFileDC` (not implemented in wx) also fully\nsupports alpha channel. In both of these cases the instances of `m:wxPen` or `m:wxBrush`\nthat are built from `wx_color()` use the colour's alpha values when stroking or filling.\n\nSupport for Transformation Matrix\n\nOn some platforms (currently under MSW, GTK+ 3, macOS) `m:wxDC` has support for applying\nan arbitrary affine transformation matrix to its coordinate system (since 3.1.1 this\nfeature is also supported by `m:wxGCDC` in all ports). Call `CanUseTransformMatrix()` (not\nimplemented in wx) to check if this support is available and then call `SetTransformMatrix()`\n(not implemented in wx) if it is. If the transformation matrix is not supported, `SetTransformMatrix()`\n(not implemented in wx) always simply returns `false` and doesn't do anything.\n\nThis feature is only available when `wxUSE_DC_TRANSFORM_MATRIX` build option is enabled.\n\nSee:\n* [Overview dc](https://docs.wxwidgets.org/3.2/overview_dc.html#overview_dc)\n\n* `m:wxGraphicsContext`\n\nwxWidgets docs: [wxDC](https://docs.wxwidgets.org/3.2/classwx_d_c.html)","title":"wxDC","ref":"wxDC.html"},{"type":"function","doc":"","title":"wxDC.blit/5","ref":"wxDC.html#blit/5"},{"type":"function","doc":"Copy from a source DC to this DC.\n\nWith this method you can specify the destination coordinates and the size of area to copy\nwhich will be the same for both the source and target DCs. If you need to apply scaling\nwhile copying, use `StretchBlit()` (not implemented in wx).\n\nNotice that source DC coordinates `xsrc` and `ysrc` are interpreted using the current\nsource DC coordinate system, i.e. the scale, origin position and axis directions are taken\ninto account when transforming them to physical (pixel) coordinates.\n\nRemark: There is partial support for `blit/6` in `m:wxPostScriptDC`, under X.\n\nSee:\n* `m:wxMemoryDC`\n\n* `m:wxBitmap`\n\n* `m:wxMask`","title":"wxDC.blit/6","ref":"wxDC.html#blit/6"},{"type":"function","doc":"Adds the specified point to the bounding box which can be retrieved with `minX/1`, `maxX/1`\nand `minY/1`, `maxY/1` functions.\n\nSee: `resetBoundingBox/1`","title":"wxDC.calcBoundingBox/3","ref":"wxDC.html#calcBoundingBox/3"},{"type":"function","doc":"Clears the device context using the current background brush.\n\nNote that `setBackground/2` method must be used to set the brush used by `clear/1`, the brush used for filling the\nshapes set by `setBrush/2` is ignored by it.\n\nIf no background brush was set, solid white brush is used to clear the device context.","title":"wxDC.clear/1","ref":"wxDC.html#clear/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.crossHair/2","ref":"wxDC.html#crossHair/2"},{"type":"function","doc":"Destroys the current clipping region so that none of the DC is clipped.\n\nSee: `setClippingRegion/3`","title":"wxDC.destroyClippingRegion/1","ref":"wxDC.html#destroyClippingRegion/1"},{"type":"function","doc":"Convert `device` X coordinate to logical coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","title":"wxDC.deviceToLogicalX/2","ref":"wxDC.html#deviceToLogicalX/2"},{"type":"function","doc":"Convert `device` X coordinate to relative logical coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a width, for example.","title":"wxDC.deviceToLogicalXRel/2","ref":"wxDC.html#deviceToLogicalXRel/2"},{"type":"function","doc":"Converts `device` Y coordinate to logical coordinate, using the current mapping mode,\nuser scale factor, device origin and axis orientation.","title":"wxDC.deviceToLogicalY/2","ref":"wxDC.html#deviceToLogicalY/2"},{"type":"function","doc":"Convert `device` Y coordinate to relative logical coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a height, for example.","title":"wxDC.deviceToLogicalYRel/2","ref":"wxDC.html#deviceToLogicalYRel/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawArc/4","ref":"wxDC.html#drawArc/4"},{"type":"function","doc":"","title":"wxDC.drawBitmap/3","ref":"wxDC.html#drawBitmap/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawBitmap/4","ref":"wxDC.html#drawBitmap/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawCheckMark/2","ref":"wxDC.html#drawCheckMark/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawCircle/3","ref":"wxDC.html#drawCircle/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawEllipse/2","ref":"wxDC.html#drawEllipse/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawEllipse/3","ref":"wxDC.html#drawEllipse/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawEllipticArc/5","ref":"wxDC.html#drawEllipticArc/5"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawIcon/3","ref":"wxDC.html#drawIcon/3"},{"type":"function","doc":"","title":"wxDC.drawLabel/3","ref":"wxDC.html#drawLabel/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawLabel/4","ref":"wxDC.html#drawLabel/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawLine/3","ref":"wxDC.html#drawLine/3"},{"type":"function","doc":"","title":"wxDC.drawLines/2","ref":"wxDC.html#drawLines/2"},{"type":"function","doc":"Draws lines using an array of points of size `n` adding the optional offset coordinate.\n\nThe current pen is used for drawing the lines.","title":"wxDC.drawLines/3","ref":"wxDC.html#drawLines/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawPoint/2","ref":"wxDC.html#drawPoint/2"},{"type":"function","doc":"","title":"wxDC.drawPolygon/2","ref":"wxDC.html#drawPolygon/2"},{"type":"function","doc":"Draws a filled polygon using an array of points of size `n`, adding the optional offset\ncoordinate.\n\nThe first and last points are automatically closed.\n\nThe last argument specifies the fill rule: `wxODDEVEN_RULE` (the default) or `wxWINDING_RULE`.\n\nThe current pen is used for drawing the outline, and the current brush for filling the\nshape. Using a transparent brush suppresses filling.","title":"wxDC.drawPolygon/3","ref":"wxDC.html#drawPolygon/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawRectangle/2","ref":"wxDC.html#drawRectangle/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawRectangle/3","ref":"wxDC.html#drawRectangle/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawRotatedText/4","ref":"wxDC.html#drawRotatedText/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawRoundedRectangle/3","ref":"wxDC.html#drawRoundedRectangle/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawRoundedRectangle/4","ref":"wxDC.html#drawRoundedRectangle/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.drawText/3","ref":"wxDC.html#drawText/3"},{"type":"function","doc":"Ends a document (only relevant when outputting to a printer).","title":"wxDC.endDoc/1","ref":"wxDC.html#endDoc/1"},{"type":"function","doc":"Ends a document page (only relevant when outputting to a printer).","title":"wxDC.endPage/1","ref":"wxDC.html#endPage/1"},{"type":"function","doc":"","title":"wxDC.floodFill/3","ref":"wxDC.html#floodFill/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.floodFill/4","ref":"wxDC.html#floodFill/4"},{"type":"function","doc":"Gets the brush used for painting the background.\n\nSee: `setBackground/2`","title":"wxDC.getBackground/1","ref":"wxDC.html#getBackground/1"},{"type":"function","doc":"Returns the current background mode: `wxPENSTYLE\\_SOLID` or `wxPENSTYLE\\_TRANSPARENT`.\n\nSee: `setBackgroundMode/2`","title":"wxDC.getBackgroundMode/1","ref":"wxDC.html#getBackgroundMode/1"},{"type":"function","doc":"Gets the current brush.\n\nSee: `setBrush/2`","title":"wxDC.getBrush/1","ref":"wxDC.html#getBrush/1"},{"type":"function","doc":"Gets the character height of the currently set font.","title":"wxDC.getCharHeight/1","ref":"wxDC.html#getCharHeight/1"},{"type":"function","doc":"Gets the average character width of the currently set font.","title":"wxDC.getCharWidth/1","ref":"wxDC.html#getCharWidth/1"},{"type":"function","doc":"` Gets the rectangle surrounding the current clipping region. If no clipping region is set\nthis function returns the extent of the device context. @remarks Clipping region is given\nin logical coordinates. @param x If non- NULL , filled in with\nthe logical horizontal coordinate of the top left corner of the clipping region if the\nfunction returns true or 0 otherwise. @param y If non- NULL ,\nfilled in with the logical vertical coordinate of the top left corner of the clipping\nregion if the function returns true or 0 otherwise. @param width If non- NULL , filled in with the width of the clipping region if the\nfunction returns true or the device context width otherwise. @param height If non- NULL , filled in with the height of the clipping region if the\nfunction returns true or the device context height otherwise. `\n\nReturn: true if there is a clipping region or false if there is no active clipping region\n(note that this return value is available only since wxWidgets 3.1.2, this function didn't\nreturn anything in the previous versions).","title":"wxDC.getClippingBox/1","ref":"wxDC.html#getClippingBox/1"},{"type":"function","doc":"Gets the current font.\n\nNotice that even although each device context object has some default font after\ncreation, this method would return a ?wxNullFont initially and only after calling `setFont/2` a valid\nfont is returned.","title":"wxDC.getFont/1","ref":"wxDC.html#getFont/1"},{"type":"function","doc":"Gets the current layout direction of the device context.\n\nOn platforms where RTL layout is supported, the return value will either be `wxLayout_LeftToRight`\nor `wxLayout_RightToLeft`. If RTL layout is not supported, the return value will be `wxLayout_Default`.\n\nSee: `setLayoutDirection/2`","title":"wxDC.getLayoutDirection/1","ref":"wxDC.html#getLayoutDirection/1"},{"type":"function","doc":"Gets the current logical function.\n\nSee: `setLogicalFunction/2`","title":"wxDC.getLogicalFunction/1","ref":"wxDC.html#getLogicalFunction/1"},{"type":"function","doc":"Gets the current mapping mode for the device context.\n\nSee: `setMapMode/2`","title":"wxDC.getMapMode/1","ref":"wxDC.html#getMapMode/1"},{"type":"function","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure.\n\nReturn: The text extent as a {Width,Height} object.\n\nNote: This function works with both single-line and multi-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getTextExtent/3`","title":"wxDC.getMultiLineTextExtent/2","ref":"wxDC.html#getMultiLineTextExtent/2"},{"type":"function","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure, `heightLine`, if non NULL, is where to store the\nheight of a single line.\n\nThe text extent is set in the given `w` and `h` pointers.\n\nIf the optional parameter `font` is specified and valid, then it is used for the text\nextent calculation, otherwise the currently selected font is used.\n\nIf `string` is empty, its horizontal extent is 0 but, for convenience when using this\nfunction for allocating enough space for a possibly multi-line string, its vertical extent\nis the same as the height of an empty line of text. Please note that this behaviour\ndiffers from that of `getTextExtent/3`.\n\nNote: This function works with both single-line and multi-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getTextExtent/3`","title":"wxDC.getMultiLineTextExtent/3","ref":"wxDC.html#getMultiLineTextExtent/3"},{"type":"function","doc":"Fills the `widths` array with the widths from the beginning of `text` to the\ncorresponding character of `text`.\n\nThe generic version simply builds a running total of the widths of each character using `getTextExtent/3`,\nhowever if the various platforms have a native API function that is faster or more\naccurate than the generic implementation then it should be used instead.\n\nSee:\n* `getMultiLineTextExtent/3`\n\n* `getTextExtent/3`","title":"wxDC.getPartialTextExtents/2","ref":"wxDC.html#getPartialTextExtents/2"},{"type":"function","doc":"Gets the current pen.\n\nSee: `setPen/2`","title":"wxDC.getPen/1","ref":"wxDC.html#getPen/1"},{"type":"function","doc":"Gets in `colour` the colour at the specified location.\n\nThis method isn't available for `m:wxPostScriptDC` or `wxMetafileDC` (not implemented in\nwx) nor for any DC in wxOSX port and simply returns false there.\n\nNote: Setting a pixel can be done using `drawPoint/2`.\n\nNote: This method shouldn't be used with `m:wxPaintDC` as accessing the DC while drawing\ncan result in unexpected results, notably in wxGTK.","title":"wxDC.getPixel/2","ref":"wxDC.html#getPixel/2"},{"type":"function","doc":"Returns the resolution of the device in pixels per inch.","title":"wxDC.getPPI/1","ref":"wxDC.html#getPPI/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.getSize/1","ref":"wxDC.html#getSize/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.getSizeMM/1","ref":"wxDC.html#getSizeMM/1"},{"type":"function","doc":"Gets the current text background colour.\n\nSee: `setTextBackground/2`","title":"wxDC.getTextBackground/1","ref":"wxDC.html#getTextBackground/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.getTextExtent/2","ref":"wxDC.html#getTextExtent/2"},{"type":"function","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure, `descent` is the dimension from the baseline of\nthe font to the bottom of the descender, and `externalLeading` is any extra vertical space\nadded to the font by the font designer (usually is zero).\n\nThe text extent is returned in `w` and `h` pointers or as a {Width,Height} object\ndepending on which version of this function is used.\n\nIf the optional parameter `font` is specified and valid, then it is used for the text\nextent calculation. Otherwise the currently selected font is.\n\nIf `string` is empty, its extent is 0 in both directions, as expected.\n\nNote: This function only works with single-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getMultiLineTextExtent/3`","title":"wxDC.getTextExtent/3","ref":"wxDC.html#getTextExtent/3"},{"type":"function","doc":"Gets the current text foreground colour.\n\nSee: `setTextForeground/2`","title":"wxDC.getTextForeground/1","ref":"wxDC.html#getTextForeground/1"},{"type":"function","doc":"Gets the current user scale factor.\n\nSee: `setUserScale/3`","title":"wxDC.getUserScale/1","ref":"wxDC.html#getUserScale/1"},{"type":"function","doc":"Fill the area specified by rect with a radial gradient, starting from `initialColour` at\nthe centre of the circle and fading to `destColour` on the circle outside.\n\nThe circle is placed at the centre of `rect`.\n\nNote: Currently this function is very slow, don't use it for real-time drawing.","title":"wxDC.gradientFillConcentric/4","ref":"wxDC.html#gradientFillConcentric/4"},{"type":"function","doc":"Fill the area specified by rect with a radial gradient, starting from `initialColour` at\nthe centre of the circle and fading to `destColour` on the circle outside.\n\n`circleCenter` are the relative coordinates of centre of the circle in the specified `rect`.\n\nNote: Currently this function is very slow, don't use it for real-time drawing.","title":"wxDC.gradientFillConcentric/5","ref":"wxDC.html#gradientFillConcentric/5"},{"type":"function","doc":"","title":"wxDC.gradientFillLinear/4","ref":"wxDC.html#gradientFillLinear/4"},{"type":"function","doc":"Fill the area specified by `rect` with a linear gradient, starting from `initialColour`\nand eventually fading to `destColour`.\n\nThe `nDirection` specifies the direction of the colour change, default is to use `initialColour`\non the left part of the rectangle and `destColour` on the right one.","title":"wxDC.gradientFillLinear/5","ref":"wxDC.html#gradientFillLinear/5"},{"type":"function","doc":"Returns true if the DC is ok to use.","title":"wxDC.isOk/1","ref":"wxDC.html#isOk/1"},{"type":"function","doc":"Converts logical X coordinate to device coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","title":"wxDC.logicalToDeviceX/2","ref":"wxDC.html#logicalToDeviceX/2"},{"type":"function","doc":"Converts logical X coordinate to relative device coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a width, for example.","title":"wxDC.logicalToDeviceXRel/2","ref":"wxDC.html#logicalToDeviceXRel/2"},{"type":"function","doc":"Converts logical Y coordinate to device coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","title":"wxDC.logicalToDeviceY/2","ref":"wxDC.html#logicalToDeviceY/2"},{"type":"function","doc":"Converts logical Y coordinate to relative device coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a height, for example.","title":"wxDC.logicalToDeviceYRel/2","ref":"wxDC.html#logicalToDeviceYRel/2"},{"type":"function","doc":"Gets the maximum horizontal extent used in drawing commands so far.","title":"wxDC.maxX/1","ref":"wxDC.html#maxX/1"},{"type":"function","doc":"Gets the maximum vertical extent used in drawing commands so far.","title":"wxDC.maxY/1","ref":"wxDC.html#maxY/1"},{"type":"function","doc":"Gets the minimum horizontal extent used in drawing commands so far.","title":"wxDC.minX/1","ref":"wxDC.html#minX/1"},{"type":"function","doc":"Gets the minimum vertical extent used in drawing commands so far.","title":"wxDC.minY/1","ref":"wxDC.html#minY/1"},{"type":"function","doc":"Resets the bounding box: after a call to this function, the bounding box doesn't contain\nanything.\n\nSee: `calcBoundingBox/3`","title":"wxDC.resetBoundingBox/1","ref":"wxDC.html#resetBoundingBox/1"},{"type":"function","doc":"Sets the x and y axis orientation (i.e. the direction from lowest to highest values on\nthe axis).\n\nThe default orientation is x axis from left to right and y axis from top down.","title":"wxDC.setAxisOrientation/3","ref":"wxDC.html#setAxisOrientation/3"},{"type":"function","doc":"Sets the current background brush for the DC.","title":"wxDC.setBackground/2","ref":"wxDC.html#setBackground/2"},{"type":"function","doc":"`mode` may be one of `wxPENSTYLE\\_SOLID` and `wxPENSTYLE\\_TRANSPARENT`.\n\nThis setting determines whether text will be drawn with a background colour or not.","title":"wxDC.setBackgroundMode/2","ref":"wxDC.html#setBackgroundMode/2"},{"type":"function","doc":"Sets the current brush for the DC.\n\nIf the argument is ?wxNullBrush (or another invalid brush; see `wxBrush:isOk/1`), the current brush is\nselected out of the device context (leaving `m:wxDC` without any valid brush), allowing\nthe current brush to be destroyed safely.\n\nSee:\n* `m:wxBrush`\n\n* `m:wxMemoryDC`","title":"wxDC.setBrush/2","ref":"wxDC.html#setBrush/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.setClippingRegion/2","ref":"wxDC.html#setClippingRegion/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxDC.setClippingRegion/3","ref":"wxDC.html#setClippingRegion/3"},{"type":"function","doc":"Sets the device origin (i.e. the origin in pixels after scaling has been applied).\n\nThis function may be useful in Windows printing operations for placing a graphic on a\npage.","title":"wxDC.setDeviceOrigin/3","ref":"wxDC.html#setDeviceOrigin/3"},{"type":"function","doc":"Sets the current font for the DC.\n\nIf the argument is ?wxNullFont (or another invalid font; see `wxFont:isOk/1`), the current font is\nselected out of the device context (leaving `m:wxDC` without any valid font), allowing the\ncurrent font to be destroyed safely.\n\nSee: `m:wxFont`","title":"wxDC.setFont/2","ref":"wxDC.html#setFont/2"},{"type":"function","doc":"Sets the current layout direction for the device context.\n\nSee: `getLayoutDirection/1`","title":"wxDC.setLayoutDirection/2","ref":"wxDC.html#setLayoutDirection/2"},{"type":"function","doc":"Sets the current logical function for the device context.\n\nNote: This function is not fully supported in all ports, due to the limitations of the\nunderlying drawing model. Notably, `wxINVERT` which was commonly used for drawing rubber\nbands or other moving outlines in the past, is not, and will not, be supported by wxGTK3\nand wxMac. The suggested alternative is to draw temporarily objects normally and refresh\nthe (affected part of the) window to remove them later.\n\nIt determines how a `source` pixel (from a pen or brush colour, or source device context\nif using `blit/6`) combines with a `destination` pixel in the current device context. Text drawing\nis not affected by this function.\n\nSee ?wxRasterOperationMode enumeration values for more info.\n\nThe default is `wxCOPY`, which simply draws with the current colour. The others combine\nthe current colour and the background using a logical operation.","title":"wxDC.setLogicalFunction/2","ref":"wxDC.html#setLogicalFunction/2"},{"type":"function","doc":"The mapping mode of the device context defines the unit of measurement used to convert `logical`\nunits to `device` units.\n\nNote that in X, text drawing isn't handled consistently with the mapping mode; a font is\nalways specified in point size. However, setting the user scale (see `setUserScale/3`) scales the text\nappropriately. In Windows, scalable TrueType fonts are always used; in X, results depend\non availability of fonts, but usually a reasonable match is found.\n\nThe coordinate origin is always at the top left of the screen/printer.\n\nDrawing to a Windows printer device context uses the current mapping mode, but mapping\nmode is currently ignored for PostScript output.","title":"wxDC.setMapMode/2","ref":"wxDC.html#setMapMode/2"},{"type":"function","doc":"If this is a window DC or memory DC, assigns the given palette to the window or bitmap\nassociated with the DC.\n\nIf the argument is ?wxNullPalette, the current palette is selected out of the device\ncontext, and the original palette restored.\n\nSee: `m:wxPalette`","title":"wxDC.setPalette/2","ref":"wxDC.html#setPalette/2"},{"type":"function","doc":"Sets the current pen for the DC.\n\nIf the argument is ?wxNullPen (or another invalid pen; see `wxPen:isOk/1`), the current pen is selected\nout of the device context (leaving `m:wxDC` without any valid pen), allowing the current\npen to be destroyed safely.\n\nSee: `m:wxMemoryDC`","title":"wxDC.setPen/2","ref":"wxDC.html#setPen/2"},{"type":"function","doc":"Sets the current text background colour for the DC.","title":"wxDC.setTextBackground/2","ref":"wxDC.html#setTextBackground/2"},{"type":"function","doc":"Sets the current text foreground colour for the DC.\n\nSee: `m:wxMemoryDC`","title":"wxDC.setTextForeground/2","ref":"wxDC.html#setTextForeground/2"},{"type":"function","doc":"Sets the user scaling factor, useful for applications which require 'zooming'.","title":"wxDC.setUserScale/3","ref":"wxDC.html#setUserScale/3"},{"type":"function","doc":"Starts a document (only relevant when outputting to a printer).\n\n`message` is a message to show while printing.","title":"wxDC.startDoc/2","ref":"wxDC.html#startDoc/2"},{"type":"function","doc":"Starts a document page (only relevant when outputting to a printer).","title":"wxDC.startPage/1","ref":"wxDC.html#startPage/1"},{"type":"type","doc":"","title":"wxDC.wxDC/0","ref":"wxDC.html#t:wxDC/0"},{"type":"module","doc":"Connects an overlay with a drawing DC.\n\nSee:\n* `m:wxOverlay`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxDCOverlay](https://docs.wxwidgets.org/3.2/classwx_d_c_overlay.html)","title":"wxDCOverlay","ref":"wxDCOverlay.html"},{"type":"function","doc":"Clears the layer, restoring the state at the last init.","title":"wxDCOverlay.clear/1","ref":"wxDCOverlay.html#clear/1"},{"type":"function","doc":"Destroys the object","title":"wxDCOverlay.destroy/1","ref":"wxDCOverlay.html#destroy/1"},{"type":"function","doc":"Convenience wrapper that behaves the same using the entire area of the dc.","title":"wxDCOverlay.new/2","ref":"wxDCOverlay.html#new/2"},{"type":"function","doc":"Connects this overlay to the corresponding drawing dc, if the overlay is not initialized\nyet this call will do so.","title":"wxDCOverlay.new/6","ref":"wxDCOverlay.html#new/6"},{"type":"type","doc":"","title":"wxDCOverlay.wxDCOverlay/0","ref":"wxDCOverlay.html#t:wxDCOverlay/0"},{"type":"module","doc":"A `m:wxDataObject` represents data that can be copied to or from the clipboard, or\ndragged and dropped.\n\nThe important thing about `m:wxDataObject` is that this is a 'smart' piece of data unlike\n'dumb' data containers such as memory buffers or files. Being 'smart' here means that the\ndata object itself should know what data formats it supports and how to render itself in\neach of its supported formats.\n\nA supported format, incidentally, is exactly the format in which the data can be\nrequested from a data object or from which the data object may be set. In the general\ncase, an object may support different formats on 'input' and 'output', i.e. it may be able\nto render itself in a given format but not be created from data on this format or vice\nversa. `m:wxDataObject` defines the `wxDataObject::Direction` (not implemented in wx)\nenumeration type which distinguishes between them.\n\nSee `wxDataFormat` (not implemented in wx) documentation for more about formats.\n\nNot surprisingly, being 'smart' comes at a price of added complexity. This is reasonable\nfor the situations when you really need to support multiple formats, but may be annoying\nif you only want to do something simple like cut and paste text.\n\nTo provide a solution for both cases, wxWidgets has two predefined classes which derive\nfrom `m:wxDataObject`: `wxDataObjectSimple` (not implemented in wx) and `wxDataObjectComposite`\n(not implemented in wx). `wxDataObjectSimple` (not implemented in wx) is the simplest `m:wxDataObject`\npossible and only holds data in a single format (such as HTML or text) and `wxDataObjectComposite`\n(not implemented in wx) is the simplest way to implement a `m:wxDataObject` that does\nsupport multiple formats because it achieves this by simply holding several `wxDataObjectSimple`\n(not implemented in wx) objects.\n\nSo, you have several solutions when you need a `m:wxDataObject` class (and you need one\nas soon as you want to transfer data via the clipboard or drag and drop):\n\nPlease note that the easiest way to use drag and drop and the clipboard with multiple\nformats is by using `wxDataObjectComposite` (not implemented in wx), but it is not the\nmost efficient one as each `wxDataObjectSimple` (not implemented in wx) would contain the\nwhole data in its respective formats. Now imagine that you want to paste 200 pages of text\nin your proprietary format, as well as Word, RTF, HTML, Unicode and plain text to the\nclipboard and even today's computers are in trouble. For this case, you will have to\nderive from `m:wxDataObject` directly and make it enumerate its formats and provide the\ndata in the requested format on demand.\n\nNote that neither the GTK+ data transfer mechanisms for clipboard and drag and drop, nor\nOLE data transfer, `copies` any data until another application actually requests the data.\nThis is in contrast to the 'feel' offered to the user of a program who would normally\nthink that the data resides in the clipboard after having pressed 'Copy' - in reality it\nis only declared to be `available`.\n\nYou may also derive your own data object classes from `wxCustomDataObject` (not\nimplemented in wx) for user-defined types. The format of user-defined data is given as a\nmime-type string literal, such as \"application/word\" or \"image/png\". These strings are\nused as they are under Unix (so far only GTK+) to identify a format and are translated\ninto their Windows equivalent under Win32 (using the OLE IDataObject for data exchange to\nand from the clipboard and for drag and drop). Note that the format string translation\nunder Windows is not yet finished.\n\nEach class derived directly from `m:wxDataObject` must override and implement all of its\nfunctions which are pure virtual in the base class. The data objects which only render\ntheir data or only set it (i.e. work in only one direction), should return 0 from `GetFormatCount()`\n(not implemented in wx).\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_dnd)\n\n* `m:wxFileDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxBitmapDataObject`\n\nwxWidgets docs: [wxDataObject](https://docs.wxwidgets.org/3.2/classwx_data_object.html)","title":"wxDataObject","ref":"wxDataObject.html"},{"type":"type","doc":"","title":"wxDataObject.wxDataObject/0","ref":"wxDataObject.html#t:wxDataObject/0"},{"type":"module","doc":"This event class holds information about a date change and is used together with `m:wxDatePickerCtrl`.\n\nIt also serves as a base class for `m:wxCalendarEvent`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDateEvent](https://docs.wxwidgets.org/3.2/classwx_date_event.html)","title":"wxDateEvent","ref":"wxDateEvent.html"},{"type":"function","doc":"Returns the date.","title":"wxDateEvent.getDate/1","ref":"wxDateEvent.html#getDate/1"},{"type":"type","doc":"","title":"wxDateEvent.wxDate/0","ref":"wxDateEvent.html#t:wxDate/0"},{"type":"type","doc":"","title":"wxDateEvent.wxDateEvent/0","ref":"wxDateEvent.html#t:wxDateEvent/0"},{"type":"type","doc":"","title":"wxDateEvent.wxDateEventType/0","ref":"wxDateEvent.html#t:wxDateEventType/0"},{"type":"module","doc":"This control allows the user to select a date.\n\nUnlike `m:wxCalendarCtrl`, which is a relatively big control, `m:wxDatePickerCtrl` is\nimplemented as a small window showing the currently selected date. The control can be\nedited using the keyboard, and can also display a popup window for more user-friendly date\nselection, depending on the styles used and the platform.\n\nIt is only available if `wxUSE_DATEPICKCTRL` is set to 1.","title":"wxDatePickerCtrl","ref":"wxDatePickerCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxDP_SPIN: Creates a control without a month calendar drop down but with\nspin-control-like arrows to change individual date components. This style is not supported\nby the generic version.\n\n* wxDP_DROPDOWN: Creates a control with a month calendar drop-down part from which the user\ncan select a date. This style is not supported in OSX/Cocoa native version.\n\n* wxDP_DEFAULT: Creates a control with the style that is best supported for the current\nplatform (currently wxDP_SPIN under Windows and OSX/Cocoa and wxDP_DROPDOWN elsewhere).\n\n* wxDP_ALLOWNONE: With this style, the control allows the user to not enter any valid date\nat all. Without it - the default - the control always has some valid date. This style is\nnot supported in OSX/Cocoa native version.\n\n* wxDP_SHOWCENTURY: Forces display of the century in the default date format. Without this\nstyle the century could be displayed, or not, depending on the default date representation\nin the system. This style is not supported in OSX/Cocoa native version currently. As can\nbe seen from the remarks above, most of the control style are only supported in the native\nMSW implementation. In portable code it's recommended to use `wxDP_DEFAULT` style only,\npossibly combined with `wxDP_SHOWCENTURY` (this is also the style used by default if none\nis specified).\n\nSee:\n* `m:wxCalendarCtrl`\n\n* `m:wxDateEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDatePickerCtrl](https://docs.wxwidgets.org/3.2/classwx_date_picker_ctrl.html)","title":"Styles - wxDatePickerCtrl","ref":"wxDatePickerCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`date_changed`](`m:wxDateEvent`)","title":"Events - wxDatePickerCtrl","ref":"wxDatePickerCtrl.html#module-events"},{"type":"function","doc":"Destroys the object","title":"wxDatePickerCtrl.destroy/1","ref":"wxDatePickerCtrl.html#destroy/1"},{"type":"function","doc":"If the control had been previously limited to a range of dates using `setRange/3`,\nreturns the lower and upper bounds of this range.\n\nIf no range is set (or only one of the bounds is set), `dt1` and/or `dt2` are set to be invalid.\n\nNotice that when using a native MSW implementation of this control the lower range is\nalways set, even if `setRange/3` hadn't been called explicitly, as the native control only supports\ndates later than year 1601.\n\nReturn: false if no range limits are currently set, true if at least one bound is set.","title":"wxDatePickerCtrl.getRange/3","ref":"wxDatePickerCtrl.html#getRange/3"},{"type":"function","doc":"Returns the currently entered date.\n\nFor a control with `wxDP_ALLOWNONE` style the returned value may be invalid if no date is\nentered, otherwise it is always valid.","title":"wxDatePickerCtrl.getValue/1","ref":"wxDatePickerCtrl.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxDatePickerCtrl.new/0","ref":"wxDatePickerCtrl.html#new/0"},{"type":"function","doc":"","title":"wxDatePickerCtrl.new/2","ref":"wxDatePickerCtrl.html#new/2"},{"type":"function","doc":"Initializes the object and calls `Create()` (not implemented in wx) with all the\nparameters.","title":"wxDatePickerCtrl.new/3","ref":"wxDatePickerCtrl.html#new/3"},{"type":"function","doc":"Sets the valid range for the date selection.\n\nIf `dt1` is valid, it becomes the earliest date (inclusive) accepted by the control. If `dt2`\nis valid, it becomes the latest possible date.\n\nNotice that if the current value is not inside the new range, it will be adjusted to lie\ninside it, i.e. calling this method can change the control value, however no events are\ngenerated by it.\n\nRemark: If the current value of the control is outside of the newly set range bounds, the\nbehaviour is undefined.","title":"wxDatePickerCtrl.setRange/3","ref":"wxDatePickerCtrl.html#setRange/3"},{"type":"function","doc":"Changes the current value of the control.\n\nThe date should be valid unless the control was created with `wxDP_ALLOWNONE` style and\nincluded in the currently selected range, if any.\n\nCalling this method does not result in a date change event.","title":"wxDatePickerCtrl.setValue/2","ref":"wxDatePickerCtrl.html#setValue/2"},{"type":"type","doc":"","title":"wxDatePickerCtrl.wxDatePickerCtrl/0","ref":"wxDatePickerCtrl.html#t:wxDatePickerCtrl/0"},{"type":"module","doc":"A dialog box is a window with a title bar and sometimes a system menu, which can be moved\naround the screen.\n\nIt can contain controls and other windows and is often used to allow the user to make\nsome choice or to answer a question.\n\nDialogs can be made scrollable, automatically, for computers with low resolution screens:\nplease see overview_dialog_autoscrolling for further details.\n\nDialogs usually contain either a single button allowing to close the dialog or two\nbuttons, one accepting the changes and the other one discarding them (such button, if\npresent, is automatically activated if the user presses the \"Esc\" key). By default,\nbuttons with the standard wxID_OK and wxID_CANCEL identifiers behave as expected. Starting\nwith wxWidgets 2.7 it is also possible to use a button with a different identifier\ninstead, see `setAffirmativeId/2` and `SetEscapeId()` (not implemented in wx).\n\nAlso notice that the `createButtonSizer/2` should be used to create the buttons appropriate for the current\nplatform and positioned correctly (including their order which is platform-dependent).\n\nModal and Modeless\n\nThere are two kinds of dialog, modal and modeless. A modal dialog blocks program flow and\nuser input on other windows until it is dismissed, whereas a modeless dialog behaves more\nlike a frame in that program flow continues, and input in other windows is still possible.\nTo show a modal dialog you should use the `showModal/1` method while to show a dialog modelessly you\nsimply use `show/2`, just as with frames.\n\nNote that the modal dialog is one of the very few examples of wxWindow-derived objects\nwhich may be created on the stack and not on the heap. In other words, while most windows\nwould be created like this:\n\nYou can achieve the same result with dialogs by using simpler code:\n\nAn application can define a `m:wxCloseEvent` handler for the dialog to respond to system\nclose events.","title":"wxDialog","ref":"wxDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxCAPTION: Puts a caption on the dialog box.\n\n* wxDEFAULT_DIALOG_STYLE: Equivalent to a combination of wxCAPTION, wxCLOSE_BOX and\nwxSYSTEM_MENU (the last one is not used under Unix).\n\n* wxRESIZE_BORDER: Display a resizable frame around the window.\n\n* wxSYSTEM_MENU: Display a system menu.\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the dialog.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the dialog.\n\n* wxTHICK_FRAME: Display a thick frame around the window.\n\n* wxSTAY_ON_TOP: The dialog stays on top of all other windows.\n\n* wxNO_3D: This style is obsolete and doesn't do anything any more, don't use it in any new\ncode.\n\n* wxDIALOG_NO_PARENT: By default, a dialog created with a NULL parent window will be given\nthe `application's top level window` (not implemented in wx) as parent. Use this style to\nprevent this from happening and create an orphan dialog. This is not recommended for modal\ndialogs.\n\n* wxDIALOG_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. Note that this is an extended style\nand must be set by calling `wxWindow:setExtraStyle/2` before Create is called (two-step construction).\n\n* wxDIALOG_EX_METAL: On macOS, frames with this style will be shown with a metallic look.\nThis is an extra style. Under Unix or Linux, MWM (the Motif Window Manager) or other\nwindow managers recognizing the MHM hints should be running for any of these styles to\nhave an effect.\n\nSee:\n* [Overview dialog](https://docs.wxwidgets.org/3.2/overview_dialog.html#overview_dialog)\n\n* `m:wxFrame`\n\n* [Overview validator](https://docs.wxwidgets.org/3.2/overview_validator.html#overview_validator)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDialog](https://docs.wxwidgets.org/3.2/classwx_dialog.html)","title":"Styles - wxDialog","ref":"wxDialog.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`close_window`](`m:wxCloseEvent`)\n\n* [`init_dialog`](`m:wxInitDialogEvent`)","title":"Events - wxDialog","ref":"wxDialog.html#module-events"},{"type":"function","doc":"","title":"wxDialog.create/4","ref":"wxDialog.html#create/4"},{"type":"function","doc":"Used for two-step dialog box construction.\n\nSee: `new/4`","title":"wxDialog.create/5","ref":"wxDialog.html#create/5"},{"type":"function","doc":"Creates a sizer with standard buttons.\n\n`flags` is a bit list of the following flags: wxOK, wxCANCEL, wxYES, wxNO, wxAPPLY,\nwxCLOSE, wxHELP, wxNO_DEFAULT.\n\nThe sizer lays out the buttons in a manner appropriate to the platform.\n\nThis function uses `createStdDialogButtonSizer/2` internally for most platforms but doesn't create the sizer at all for\nthe platforms with hardware buttons (such as smartphones) for which it sets up the\nhardware buttons appropriately and returns NULL, so don't forget to test that the return\nvalue is valid before using it.","title":"wxDialog.createButtonSizer/2","ref":"wxDialog.html#createButtonSizer/2"},{"type":"function","doc":"Creates a `m:wxStdDialogButtonSizer` with standard buttons.\n\n`flags` is a bit list of the following flags: wxOK, wxCANCEL, wxYES, wxNO, wxAPPLY,\nwxCLOSE, wxHELP, wxNO_DEFAULT.\n\nThe sizer lays out the buttons in a manner appropriate to the platform.","title":"wxDialog.createStdDialogButtonSizer/2","ref":"wxDialog.html#createStdDialogButtonSizer/2"},{"type":"function","doc":"Destroys the object","title":"wxDialog.destroy/1","ref":"wxDialog.html#destroy/1"},{"type":"function","doc":"Ends a modal dialog, passing a value to be returned from the `showModal/1` invocation.\n\nSee:\n* `showModal/1`\n\n* `getReturnCode/1`\n\n* `setReturnCode/2`","title":"wxDialog.endModal/2","ref":"wxDialog.html#endModal/2"},{"type":"function","doc":"Gets the identifier of the button which works like standard OK button in this dialog.\n\nSee: `setAffirmativeId/2`","title":"wxDialog.getAffirmativeId/1","ref":"wxDialog.html#getAffirmativeId/1"},{"type":"function","doc":"Gets the return code for this window.\n\nRemark: A return code is normally associated with a modal dialog, where `showModal/1` returns a code\nto the application.\n\nSee:\n* `setReturnCode/2`\n\n* `showModal/1`\n\n* `endModal/2`","title":"wxDialog.getReturnCode/1","ref":"wxDialog.html#getReturnCode/1"},{"type":"function","doc":"Returns true if the dialog box is modal, false otherwise.","title":"wxDialog.isModal/1","ref":"wxDialog.html#isModal/1"},{"type":"function","doc":"Default constructor.","title":"wxDialog.new/0","ref":"wxDialog.html#new/0"},{"type":"function","doc":"","title":"wxDialog.new/3","ref":"wxDialog.html#new/3"},{"type":"function","doc":"Constructor.\n\nSee: `create/5`","title":"wxDialog.new/4","ref":"wxDialog.html#new/4"},{"type":"function","doc":"Sets the identifier to be used as OK button.\n\nWhen the button with this identifier is pressed, the dialog calls `wxWindow:validate/1` and `wxWindow:transferDataFromWindow/1` and, if they both\nreturn true, closes the dialog with the affirmative id return code.\n\nAlso, when the user presses a hardware OK button on the devices having one or the special\nOK button in the PocketPC title bar, an event with this id is generated.\n\nBy default, the affirmative id is wxID_OK.\n\nSee: `getAffirmativeId/1`","title":"wxDialog.setAffirmativeId/2","ref":"wxDialog.html#setAffirmativeId/2"},{"type":"function","doc":"Sets the return code for this window.\n\nA return code is normally associated with a modal dialog, where `showModal/1` returns a code to the\napplication. The function `endModal/2` calls `setReturnCode/2`.\n\nSee:\n* `getReturnCode/1`\n\n* `showModal/1`\n\n* `endModal/2`","title":"wxDialog.setReturnCode/2","ref":"wxDialog.html#setReturnCode/2"},{"type":"function","doc":"","title":"wxDialog.show/1","ref":"wxDialog.html#show/1"},{"type":"function","doc":"Hides or shows the dialog.\n\nThe preferred way of dismissing a modal dialog is to use `endModal/2`.","title":"wxDialog.show/2","ref":"wxDialog.html#show/2"},{"type":"function","doc":"Shows an application-modal dialog.\n\nProgram flow does not return until the dialog has been dismissed with `endModal/2`.\n\nNotice that it is possible to call `showModal/1` for a dialog which had been previously shown with `show/2`,\nthis allows making an existing modeless dialog modal. However `showModal/1` can't be called twice\nwithout intervening `endModal/2` calls.\n\nNote that this function creates a temporary event loop which takes precedence over the\napplication's main event loop (see `wxEventLoopBase` (not implemented in wx)) and which is\ndestroyed when the dialog is dismissed. This also results in a call to `wxApp::ProcessPendingEvents()`\n(not implemented in wx).\n\nReturn: The value set with `setReturnCode/2`.\n\nSee:\n* `endModal/2`\n\n* `getReturnCode/1`\n\n* `setReturnCode/2`","title":"wxDialog.showModal/1","ref":"wxDialog.html#showModal/1"},{"type":"type","doc":"","title":"wxDialog.wxDialog/0","ref":"wxDialog.html#t:wxDialog/0"},{"type":"module","doc":"This class represents the directory chooser dialog.","title":"wxDirDialog","ref":"wxDirDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxDD_DEFAULT_STYLE: Equivalent to a combination of wxDEFAULT_DIALOG_STYLE and\nwxRESIZE_BORDER.\n\n* wxDD_DIR_MUST_EXIST: The dialog will allow the user to choose only an existing folder.\nWhen this style is not given, a \"Create new directory\" button is added to the dialog (on\nWindows) or some other way is provided to the user to type the name of a new folder.\n\n* wxDD_CHANGE_DIR: Change the current working directory to the directory chosen by the\nuser.\n\nNote: This flag cannot be used with the `wxDD_MULTIPLE` style.\n\n* wxDD_MULTIPLE: Allow the user to select multiple directories. This flag is only\navailable since wxWidgets 3.1.4\n\n* wxDD_SHOW_HIDDEN: Show hidden and system folders. This flag is only available since\nwxWidgets 3.1.4 Notice that `wxRESIZE_BORDER` has special side effect under Windows where\ntwo different directory selection dialogs are available and this style also implicitly\nselects the new version as the old one always has fixed size. As the new version is almost\nalways preferable, it is recommended that `wxRESIZE_BORDER` style be always used. This is\nthe case if the dialog is created with the default style value but if you need to use any\nadditional styles you should still specify `wxDD_DEFAULT_STYLE` unless you explicitly need\nto use the old dialog version under Windows. E.g. do instead of just using `wxDD_DIR_MUST_EXIST`\nstyle alone.\n\nRemark: MacOS 10.11+ does not display a title bar on the dialog. Use `setMessage/2` to change the\nstring displayed to the user at the top of the dialog after creation. The `wxTopLevelWindow:setTitle/2` method is\nprovided for compatibility with pre-10.11 MacOS versions that do still support displaying\nthe title bar.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_dir)\n\n* `m:wxFileDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDirDialog](https://docs.wxwidgets.org/3.2/classwx_dir_dialog.html)","title":"Styles - wxDirDialog","ref":"wxDirDialog.html#module-styles"},{"type":"function","doc":"Destroys the object","title":"wxDirDialog.destroy/1","ref":"wxDirDialog.html#destroy/1"},{"type":"function","doc":"Returns the message that will be displayed on the dialog.","title":"wxDirDialog.getMessage/1","ref":"wxDirDialog.html#getMessage/1"},{"type":"function","doc":"Returns the default or user-selected path.\n\nNote: This function can't be used with dialogs which have the `wxDD_MULTIPLE` style, use `GetPaths()`\n(not implemented in wx) instead.","title":"wxDirDialog.getPath/1","ref":"wxDirDialog.html#getPath/1"},{"type":"function","doc":"","title":"wxDirDialog.new/1","ref":"wxDirDialog.html#new/1"},{"type":"function","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","title":"wxDirDialog.new/2","ref":"wxDirDialog.html#new/2"},{"type":"function","doc":"Sets the message that will be displayed on the dialog.","title":"wxDirDialog.setMessage/2","ref":"wxDirDialog.html#setMessage/2"},{"type":"function","doc":"Sets the default path.","title":"wxDirDialog.setPath/2","ref":"wxDirDialog.html#setPath/2"},{"type":"type","doc":"","title":"wxDirDialog.wxDirDialog/0","ref":"wxDirDialog.html#t:wxDirDialog/0"},{"type":"module","doc":"This control allows the user to select a directory.\n\nThe generic implementation is a button which brings up a `m:wxDirDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe dir-chooser dialog. It is only available if `wxUSE_DIRPICKERCTRL` is set to 1 (the default).","title":"wxDirPickerCtrl","ref":"wxDirPickerCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxDIRP_DEFAULT_STYLE: The default style: includes wxDIRP_DIR_MUST_EXIST and, under wxMSW\nonly, wxDIRP_USE_TEXTCTRL.\n\n* wxDIRP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxDirPickerCtrl` and which can be used by the user to specify\na path (see SetPath). The text control is automatically synchronized with button's value.\nUse functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxDIRP_DIR_MUST_EXIST: Creates a picker which allows selecting only existing directories\nin the popup `m:wxDirDialog`. Notice that, as with `wxFLP_FILE_MUST_EXIST`, it is still\npossible to enter a non-existent directory even when this file is specified if `wxDIRP_USE_TEXTCTRL`\nstyle is also used. Also note that if `wxDIRP_USE_TEXTCTRL` is not used, the native wxGTK\nimplementation always uses this style as it doesn't support selecting non-existent\ndirectories.\n\n* wxDIRP_CHANGE_DIR: Change current working directory on each user directory selection\nchange.\n\n* wxDIRP_SMALL: Use smaller version of the control with a small \"...\" button instead of the\nnormal \"Browse\" one. This flag is new since wxWidgets 2.9.3.\n\nSee:\n* `m:wxDirDialog`\n\n* `m:wxFileDirPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDirPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_dir_picker_ctrl.html)","title":"Styles - wxDirPickerCtrl","ref":"wxDirPickerCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_dirpicker_changed`](`m:wxFileDirPickerEvent`)","title":"Events - wxDirPickerCtrl","ref":"wxDirPickerCtrl.html#module-events"},{"type":"function","doc":"","title":"wxDirPickerCtrl.create/3","ref":"wxDirPickerCtrl.html#create/3"},{"type":"function","doc":"Creates the widgets with the given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","title":"wxDirPickerCtrl.create/4","ref":"wxDirPickerCtrl.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxDirPickerCtrl.destroy/1","ref":"wxDirPickerCtrl.html#destroy/1"},{"type":"function","doc":"Returns the absolute path of the currently selected directory.","title":"wxDirPickerCtrl.getPath/1","ref":"wxDirPickerCtrl.html#getPath/1"},{"type":"function","doc":"","title":"wxDirPickerCtrl.new/0","ref":"wxDirPickerCtrl.html#new/0"},{"type":"function","doc":"","title":"wxDirPickerCtrl.new/2","ref":"wxDirPickerCtrl.html#new/2"},{"type":"function","doc":"Initializes the object and calls `create/4` with all the parameters.","title":"wxDirPickerCtrl.new/3","ref":"wxDirPickerCtrl.html#new/3"},{"type":"function","doc":"Sets the absolute path of the currently selected directory.\n\nIf the control uses `wxDIRP_DIR_MUST_EXIST` and does not use `wxDIRP_USE_TEXTCTRL` style,\nthe `dirname` must be a name of an existing directory and will be simply ignored by the\nnative wxGTK implementation if this is not the case.","title":"wxDirPickerCtrl.setPath/2","ref":"wxDirPickerCtrl.html#setPath/2"},{"type":"type","doc":"","title":"wxDirPickerCtrl.wxDirPickerCtrl/0","ref":"wxDirPickerCtrl.html#t:wxDirPickerCtrl/0"},{"type":"module","doc":"Determines the sizes and locations of displays connected to the system.\n\nwxWidgets docs: [wxDisplay](https://docs.wxwidgets.org/3.2/classwx_display.html)","title":"wxDisplay","ref":"wxDisplay.html"},{"type":"function","doc":"Destroys the object","title":"wxDisplay.destroy/1","ref":"wxDisplay.html#destroy/1"},{"type":"function","doc":"Returns the client area of the display.\n\nThe client area is the part of the display available for the normal (non full screen)\nwindows, usually it is the same as `getGeometry/1` but it could be less if there is a taskbar (or\nequivalent) on this display.","title":"wxDisplay.getClientArea/1","ref":"wxDisplay.html#getClientArea/1"},{"type":"function","doc":"Returns the number of connected displays.","title":"wxDisplay.getCount/0","ref":"wxDisplay.html#getCount/0"},{"type":"function","doc":"Returns the index of the display on which the given point lies, or `wxNOT\\_FOUND` if the\npoint is not on any connected display.","title":"wxDisplay.getFromPoint/1","ref":"wxDisplay.html#getFromPoint/1"},{"type":"function","doc":"Returns the index of the display on which the given window lies.\n\nIf the window is on more than one display it gets the display that overlaps the window\nthe most.\n\nReturns `wxNOT_FOUND` if the window is not on any connected display.","title":"wxDisplay.getFromWindow/1","ref":"wxDisplay.html#getFromWindow/1"},{"type":"function","doc":"Returns the bounding rectangle of the display whose index was passed to the constructor.\n\nSee:\n* `getClientArea/1`\n\n* `wx_misc:displaySize/0`","title":"wxDisplay.getGeometry/1","ref":"wxDisplay.html#getGeometry/1"},{"type":"function","doc":"Returns the display's name.\n\nThe returned value is currently an empty string under all platforms except MSW.","title":"wxDisplay.getName/1","ref":"wxDisplay.html#getName/1"},{"type":"function","doc":"Returns display resolution in pixels per inch.\n\nHorizontal and vertical resolution are returned in `x` and `y` components of the\n{Width,Height} object respectively.\n\nIf the resolution information is not available, returns.\n\nSince: 3.1.2","title":"wxDisplay.getPPI/1","ref":"wxDisplay.html#getPPI/1"},{"type":"function","doc":"Returns true if the object was initialized successfully.","title":"wxDisplay.isOk/1","ref":"wxDisplay.html#isOk/1"},{"type":"function","doc":"Returns true if the display is the primary display.\n\nThe primary display is the one whose index is 0.","title":"wxDisplay.isPrimary/1","ref":"wxDisplay.html#isPrimary/1"},{"type":"function","doc":"Default constructor creating `m:wxDisplay` object representing the primary display.","title":"wxDisplay.new/0","ref":"wxDisplay.html#new/0"},{"type":"function","doc":"Constructor creating the display object associated with the given window.\n\nThis is the most convenient way of finding the display on which the given window is shown\nwhile falling back to the default display if it is not shown at all or positioned outside\nof any display.\n\nSee: `getFromWindow/1`\n\nSince: 3.1.2","title":"wxDisplay.new/1","ref":"wxDisplay.html#new/1"},{"type":"type","doc":"","title":"wxDisplay.wxDisplay/0","ref":"wxDisplay.html#t:wxDisplay/0"},{"type":"module","doc":"A display changed event is sent to top-level windows when the display resolution has\nchanged.\n\nThis event is currently emitted under Windows only.\n\nSee: `m:wxDisplay`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDisplayChangedEvent](https://docs.wxwidgets.org/3.2/classwx_display_changed_event.html)","title":"wxDisplayChangedEvent","ref":"wxDisplayChangedEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxDisplayChangedEventType` to subscribe to events of this type.","title":"Events - wxDisplayChangedEvent","ref":"wxDisplayChangedEvent.html#module-events"},{"type":"type","doc":"","title":"wxDisplayChangedEvent.wxDisplayChanged/0","ref":"wxDisplayChangedEvent.html#t:wxDisplayChanged/0"},{"type":"type","doc":"","title":"wxDisplayChangedEvent.wxDisplayChangedEvent/0","ref":"wxDisplayChangedEvent.html#t:wxDisplayChangedEvent/0"},{"type":"type","doc":"","title":"wxDisplayChangedEvent.wxDisplayChangedEventType/0","ref":"wxDisplayChangedEvent.html#t:wxDisplayChangedEventType/0"},{"type":"module","doc":"This class is used for drop files events, that is, when files have been dropped onto the\nwindow.\n\nThe window must have previously been enabled for dropping by calling `wxWindow:dragAcceptFiles/2`.\n\nImportant note: this is a separate implementation to the more general drag and drop\nimplementation documented in the overview_dnd. It uses the older, Windows message-based\napproach of dropping files.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:dragAcceptFiles/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDropFilesEvent](https://docs.wxwidgets.org/3.2/classwx_drop_files_event.html)","title":"wxDropFilesEvent","ref":"wxDropFilesEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxDropFilesEventType` to subscribe to events of this type.","title":"Events - wxDropFilesEvent","ref":"wxDropFilesEvent.html#module-events"},{"type":"function","doc":"Returns an array of filenames.","title":"wxDropFilesEvent.getFiles/1","ref":"wxDropFilesEvent.html#getFiles/1"},{"type":"function","doc":"Returns the number of files dropped.","title":"wxDropFilesEvent.getNumberOfFiles/1","ref":"wxDropFilesEvent.html#getNumberOfFiles/1"},{"type":"function","doc":"Returns the position at which the files were dropped.\n\nReturns an array of filenames.","title":"wxDropFilesEvent.getPosition/1","ref":"wxDropFilesEvent.html#getPosition/1"},{"type":"type","doc":"","title":"wxDropFilesEvent.wxDropFiles/0","ref":"wxDropFilesEvent.html#t:wxDropFiles/0"},{"type":"type","doc":"","title":"wxDropFilesEvent.wxDropFilesEvent/0","ref":"wxDropFilesEvent.html#t:wxDropFilesEvent/0"},{"type":"type","doc":"","title":"wxDropFilesEvent.wxDropFilesEventType/0","ref":"wxDropFilesEvent.html#t:wxDropFilesEventType/0"},{"type":"module","doc":"An erase event is sent when a window's background needs to be repainted.\n\nOn some platforms, such as GTK+, this event is simulated (simply generated just before\nthe paint event) and may cause flicker. It is therefore recommended that you set the text\nbackground colour explicitly in order to prevent flicker. The default background colour\nunder GTK+ is grey.\n\nTo intercept this event, use the EVT_ERASE_BACKGROUND macro in an event table definition.\n\nYou must use the device context returned by `getDC/1` to draw on, don't create a `m:wxPaintDC` in\nthe event handler.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxEraseEvent](https://docs.wxwidgets.org/3.2/classwx_erase_event.html)","title":"wxEraseEvent","ref":"wxEraseEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxEraseEventType` to subscribe to events of this type.","title":"Events - wxEraseEvent","ref":"wxEraseEvent.html#module-events"},{"type":"function","doc":"Returns the device context associated with the erase event to draw on.\n\nThe returned pointer is never NULL.","title":"wxEraseEvent.getDC/1","ref":"wxEraseEvent.html#getDC/1"},{"type":"type","doc":"","title":"wxEraseEvent.wxErase/0","ref":"wxEraseEvent.html#t:wxErase/0"},{"type":"type","doc":"","title":"wxEraseEvent.wxEraseEvent/0","ref":"wxEraseEvent.html#t:wxEraseEvent/0"},{"type":"type","doc":"","title":"wxEraseEvent.wxEraseEventType/0","ref":"wxEraseEvent.html#t:wxEraseEventType/0"},{"type":"module","doc":"An event is a structure holding information about an event passed to a callback or member\nfunction.\n\n`m:wxEvent` used to be a multipurpose event object, and is an abstract base class for\nother event classes (see below).\n\nFor more information about events, see the overview_events overview.\n\nSee:\n* `m:wxCommandEvent`\n\n* `m:wxMouseEvent`\n\nwxWidgets docs: [wxEvent](https://docs.wxwidgets.org/3.2/classwx_event.html)","title":"wxEvent","ref":"wxEvent.html"},{"type":"function","doc":"Returns the identifier associated with this event, such as a button command id.","title":"wxEvent.getId/1","ref":"wxEvent.html#getId/1"},{"type":"function","doc":"Returns true if the event handler should be skipped, false otherwise.","title":"wxEvent.getSkipped/1","ref":"wxEvent.html#getSkipped/1"},{"type":"function","doc":"Gets the timestamp for the event.\n\nThe timestamp is the time in milliseconds since some fixed moment (not necessarily the\nstandard Unix Epoch, so only differences between the timestamps and not their absolute\nvalues usually make sense).\n\nWarning:\n\nwxWidgets returns a non-NULL timestamp only for mouse and key events (see `m:wxMouseEvent`\nand `m:wxKeyEvent`).","title":"wxEvent.getTimestamp/1","ref":"wxEvent.html#getTimestamp/1"},{"type":"function","doc":"Returns true if the event is or is derived from `m:wxCommandEvent` else it returns false.\n\nNote: exists only for optimization purposes.","title":"wxEvent.isCommandEvent/1","ref":"wxEvent.html#isCommandEvent/1"},{"type":"function","doc":"Sets the propagation level to the given value (for example returned from an earlier call\nto `stopPropagation/1`).","title":"wxEvent.resumePropagation/2","ref":"wxEvent.html#resumePropagation/2"},{"type":"function","doc":"Test if this event should be propagated or not, i.e. if the propagation level is\ncurrently greater than 0.","title":"wxEvent.shouldPropagate/1","ref":"wxEvent.html#shouldPropagate/1"},{"type":"function","doc":"","title":"wxEvent.skip/1","ref":"wxEvent.html#skip/1"},{"type":"function","doc":"This method can be used inside an event handler to control whether further event handlers\nbound to this event will be called after the current one returns.\n\nWithout `skip/2` (or equivalently if Skip(false) is used), the event will not be processed any\nmore. If Skip(true) is called, the event processing system continues searching for a\nfurther handler function for this event, even though it has been processed already in the\ncurrent handler.\n\nIn general, it is recommended to skip all non-command events to allow the default\nhandling to take place. The command events are, however, normally not skipped as usually a\nsingle command such as a button click or menu item selection must only be processed by one\nhandler.","title":"wxEvent.skip/2","ref":"wxEvent.html#skip/2"},{"type":"function","doc":"Stop the event from propagating to its parent window.\n\nReturns the old propagation level value which may be later passed to `resumePropagation/2` to allow\npropagating the event again.","title":"wxEvent.stopPropagation/1","ref":"wxEvent.html#stopPropagation/1"},{"type":"type","doc":"","title":"wxEvent.wxEvent/0","ref":"wxEvent.html#t:wxEvent/0"},{"type":"module","doc":"The Event handler\n\nA class that can handle events from the windowing system. `m:wxWindow` is (and\ntherefore all window classes are) derived from this class.\n\nTo get events from wxwidgets objects you subscribe to them by calling `connect/3`.\n\nIf the `callback` option is not supplied events are sent as messages.\n\nThese messages will be `#wx{}` where `EventRecord` is a record that depends on\nthe `wxEventType`. The records are defined in: `wx/include/wx.hrl`.\n\nIf a callback was supplied to connect, the callback will be invoked (in another\nprocess) to handle the event. The callback should be of arity 2.\n\n`fun Callback (EventRecord::wx(), EventObject::wxObject()).`\n\nNote: The callback will be in executed in new process each time.\n\nSee:\n[Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events_processing)\n\nwxWidgets docs:\n[wxEvtHandler](https://docs.wxwidgets.org/3.2/classwx_evt_handler.html)","title":"wxEvtHandler","ref":"wxEvtHandler.html"},{"type":"function","doc":"","title":"wxEvtHandler.connect/2","ref":"wxEvtHandler.html#connect/2"},{"type":"function","doc":"This function subscribes to events.\n\nSubscribes to events of type `EventType`, in the range `id`, `lastId`.\n\nThe events will be received as messages if no callback is supplied.\n\nOptions\n\nid:`{id, integer()} `The identifier (or first of the identifier range) to be\nassociated with this event handler. Default is ?wxID_ANY\n\nlastid:`{lastId,integer()} `The second part of the identifier range. If used\n'id' must be set as the starting identifier range. Default is ?wxID_ANY\n\nskip:`{skip,boolean()} `If skip is true further event_handlers will be called.\nThis is not used if the 'callback' option is used. Default is `false`.\n\ncallback:`{callback,function()} `Use a\ncallback`fun(EventRecord::wx(),EventObject::wxObject()) `to process the event.\nDefault not specified i.e. a message will be delivered to the process calling\nthis function.\n\nuserData:`{userData,term()} `An erlang term that will be sent with the event.\nDefault: [].","title":"wxEvtHandler.connect/3","ref":"wxEvtHandler.html#connect/3"},{"type":"function","doc":"","title":"wxEvtHandler.disconnect/1","ref":"wxEvtHandler.html#disconnect/1"},{"type":"function","doc":"","title":"wxEvtHandler.disconnect/2","ref":"wxEvtHandler.html#disconnect/2"},{"type":"function","doc":"This function unsubscribes the process or callback fun from the event handler.\n\nEventType may be the atom 'null' to match any eventtype. Notice that the options\nskip and userdata is not used to match the eventhandler.","title":"wxEvtHandler.disconnect/3","ref":"wxEvtHandler.html#disconnect/3"},{"type":"type","doc":"","title":"wxEvtHandler.event/0","ref":"wxEvtHandler.html#t:event/0"},{"type":"type","doc":"","title":"wxEvtHandler.wx/0","ref":"wxEvtHandler.html#t:wx/0"},{"type":"type","doc":"","title":"wxEvtHandler.wxEventType/0","ref":"wxEvtHandler.html#t:wxEventType/0"},{"type":"type","doc":"","title":"wxEvtHandler.wxEvtHandler/0","ref":"wxEvtHandler.html#t:wxEvtHandler/0"},{"type":"module","doc":"`m:wxFileDataObject` is a specialization of `m:wxDataObject` for file names.\n\nThe program works with it just as if it were a list of absolute file names, but\ninternally it uses the same format as Explorer and other compatible programs under Windows\nor GNOME/KDE file manager under Unix which makes it possible to receive files from them\nusing this class.\n\nSee:\n* `m:wxDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxBitmapDataObject`\n\n* `m:wxDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxFileDataObject](https://docs.wxwidgets.org/3.2/classwx_file_data_object.html)","title":"wxFileDataObject","ref":"wxFileDataObject.html"},{"type":"function","doc":"Adds a file to the file list represented by this data object (Windows only).","title":"wxFileDataObject.addFile/2","ref":"wxFileDataObject.html#addFile/2"},{"type":"function","doc":"Destroys the object","title":"wxFileDataObject.destroy/1","ref":"wxFileDataObject.html#destroy/1"},{"type":"function","doc":"Returns the array of file names.","title":"wxFileDataObject.getFilenames/1","ref":"wxFileDataObject.html#getFilenames/1"},{"type":"function","doc":"Constructor.","title":"wxFileDataObject.new/0","ref":"wxFileDataObject.html#new/0"},{"type":"type","doc":"","title":"wxFileDataObject.wxFileDataObject/0","ref":"wxFileDataObject.html#t:wxFileDataObject/0"},{"type":"module","doc":"This class represents the file chooser dialog.\n\nThe path and filename are distinct elements of a full file pathname. If path is\n?wxEmptyString, the current directory will be used. If filename is ?wxEmptyString, no\ndefault filename will be supplied. The wildcard determines what files are displayed in the\nfile selector, and file extension supplies a type extension for the required filename.\n\nThe typical usage for the open file dialog is:\n\nThe typical usage for the save file dialog is instead somewhat simpler:\n\nRemark: All implementations of the `m:wxFileDialog` provide a wildcard filter. Typing a\nfilename containing wildcards (*, ?) in the filename text item, and clicking on Ok, will\nresult in only those files matching the pattern being displayed. The wildcard may be a\nspecification for multiple types of file with a description for each, such as: It must be\nnoted that wildcard support in the native Motif file dialog is quite limited: only one\nfile type is supported, and it is displayed without the descriptive test; \"BMP files\n(*.bmp)|*.bmp\" is displayed as \"*.bmp\", and both \"BMP files (*.bmp)|*.bmp|GIF files\n(*.gif)|*.gif\" and \"Image files|*.bmp;*.gif\" are errors. On Mac macOS in the open file\ndialog the filter choice box is not shown by default. Instead all given wildcards are\nappplied at the same time: So in the above example all bmp, gif and png files are\ndisplayed. To enforce the display of the filter choice set the corresponding `m:wxSystemOptions`\nbefore calling the file open dialog: But in contrast to Windows and Unix, where the file\ntype choice filters only the selected files, on Mac macOS even in this case the dialog\nshows all files matching all file types. The files which does not match the currently\nselected file type are greyed out and are not selectable.","title":"wxFileDialog","ref":"wxFileDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxFD_DEFAULT_STYLE: Equivalent to `wxFD_OPEN`.\n\n* wxFD_OPEN: This is an open dialog; usually this means that the default button's label of\nthe dialog is \"Open\". Cannot be combined with `wxFD_SAVE`.\n\n* wxFD_SAVE: This is a save dialog; usually this means that the default button's label of\nthe dialog is \"Save\". Cannot be combined with `wxFD_OPEN`.\n\n* wxFD_OVERWRITE_PROMPT: For save dialog only: prompt for a confirmation if a file will be\noverwritten.\n\n* wxFD_NO_FOLLOW: Directs the dialog to return the path and file name of the selected\nshortcut file, not its target as it does by default. Currently this flag is only\nimplemented in wxMSW and wxOSX (where it prevents aliases from being resolved). The\nnon-dereferenced link path is always returned, even without this flag, under Unix and so\nusing it there doesn't do anything. This flag was added in wxWidgets 3.1.0.\n\n* wxFD_FILE_MUST_EXIST: For open dialog only: the user may only select files that actually\nexist. Notice that under macOS the file dialog with `wxFD_OPEN` style always behaves as if\nthis style was specified, because it is impossible to choose a file that doesn't exist\nfrom a standard macOS file dialog.\n\n* wxFD_MULTIPLE: For open dialog only: allows selecting multiple files.\n\n* wxFD_CHANGE_DIR: Change the current working directory (when the dialog is dismissed) to\nthe directory where the file(s) chosen by the user are.\n\n* wxFD_PREVIEW: Show the preview of the selected files (currently only supported by wxGTK).\n\n* wxFD_SHOW_HIDDEN: Show hidden files. This flag was added in wxWidgets 3.1.3\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_file)\n\n* ?wxFileSelector()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFileDialog](https://docs.wxwidgets.org/3.2/classwx_file_dialog.html)","title":"Styles - wxFileDialog","ref":"wxFileDialog.html#module-styles"},{"type":"function","doc":"Destroys the object","title":"wxFileDialog.destroy/1","ref":"wxFileDialog.html#destroy/1"},{"type":"function","doc":"Returns the default directory.","title":"wxFileDialog.getDirectory/1","ref":"wxFileDialog.html#getDirectory/1"},{"type":"function","doc":"Returns the default filename.\n\nNote: This function can't be used with dialogs which have the `wxFD_MULTIPLE` style, use `getFilenames/1`\ninstead.","title":"wxFileDialog.getFilename/1","ref":"wxFileDialog.html#getFilename/1"},{"type":"function","doc":"Fills the array `filenames` with the names of the files chosen.\n\nThis function should only be used with the dialogs which have `wxFD_MULTIPLE` style, use `getFilename/1`\nfor the others.\n\nNote that under Windows, if the user selects shortcuts, the filenames include paths,\nsince the application cannot determine the full path of each referenced file by appending\nthe directory containing the shortcuts to the filename.","title":"wxFileDialog.getFilenames/1","ref":"wxFileDialog.html#getFilenames/1"},{"type":"function","doc":"Returns the index into the list of filters supplied, optionally, in the wildcard\nparameter.\n\nBefore the dialog is shown, this is the index which will be used when the dialog is first displayed.\n\nAfter the dialog is shown, this is the index selected by the user.","title":"wxFileDialog.getFilterIndex/1","ref":"wxFileDialog.html#getFilterIndex/1"},{"type":"function","doc":"Returns the message that will be displayed on the dialog.","title":"wxFileDialog.getMessage/1","ref":"wxFileDialog.html#getMessage/1"},{"type":"function","doc":"Returns the full path (directory and filename) of the selected file.\n\nNote: This function can't be used with dialogs which have the `wxFD_MULTIPLE` style, use `getPaths/1`\ninstead.","title":"wxFileDialog.getPath/1","ref":"wxFileDialog.html#getPath/1"},{"type":"function","doc":"Fills the array `paths` with the full paths of the files chosen.\n\nThis function should only be used with the dialogs which have `wxFD_MULTIPLE` style, use `getPath/1`\nfor the others.","title":"wxFileDialog.getPaths/1","ref":"wxFileDialog.html#getPaths/1"},{"type":"function","doc":"Returns the file dialog wildcard.","title":"wxFileDialog.getWildcard/1","ref":"wxFileDialog.html#getWildcard/1"},{"type":"function","doc":"","title":"wxFileDialog.new/1","ref":"wxFileDialog.html#new/1"},{"type":"function","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","title":"wxFileDialog.new/2","ref":"wxFileDialog.html#new/2"},{"type":"function","doc":"Sets the default directory.","title":"wxFileDialog.setDirectory/2","ref":"wxFileDialog.html#setDirectory/2"},{"type":"function","doc":"Sets the default filename.\n\nIn wxGTK this will have little effect unless a default directory has previously been set.","title":"wxFileDialog.setFilename/2","ref":"wxFileDialog.html#setFilename/2"},{"type":"function","doc":"Sets the default filter index, starting from zero.","title":"wxFileDialog.setFilterIndex/2","ref":"wxFileDialog.html#setFilterIndex/2"},{"type":"function","doc":"Sets the message that will be displayed on the dialog.","title":"wxFileDialog.setMessage/2","ref":"wxFileDialog.html#setMessage/2"},{"type":"function","doc":"Sets the path (the combined directory and filename that will be returned when the dialog\nis dismissed).","title":"wxFileDialog.setPath/2","ref":"wxFileDialog.html#setPath/2"},{"type":"function","doc":"Sets the wildcard, which can contain multiple file types, for example: \"BMP files\n(\\*.bmp)|\\*.bmp|GIF files (\\*.gif)|\\*.gif\".\n\nNote that the native Motif dialog has some limitations with respect to wildcards; see the\nRemarks section above.","title":"wxFileDialog.setWildcard/2","ref":"wxFileDialog.html#setWildcard/2"},{"type":"type","doc":"","title":"wxFileDialog.wxFileDialog/0","ref":"wxFileDialog.html#t:wxFileDialog/0"},{"type":"module","doc":"This event class is used for the events generated by `m:wxFilePickerCtrl` and by `m:wxDirPickerCtrl`.\n\nSee:\n* `m:wxFilePickerCtrl`\n\n* `m:wxDirPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFileDirPickerEvent](https://docs.wxwidgets.org/3.2/classwx_file_dir_picker_event.html)","title":"wxFileDirPickerEvent","ref":"wxFileDirPickerEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxFileDirPickerEventType` to subscribe to events of this type.","title":"Events - wxFileDirPickerEvent","ref":"wxFileDirPickerEvent.html#module-events"},{"type":"function","doc":"Retrieve the absolute path of the file/directory the user has just selected.","title":"wxFileDirPickerEvent.getPath/1","ref":"wxFileDirPickerEvent.html#getPath/1"},{"type":"type","doc":"","title":"wxFileDirPickerEvent.wxFileDirPicker/0","ref":"wxFileDirPickerEvent.html#t:wxFileDirPicker/0"},{"type":"type","doc":"","title":"wxFileDirPickerEvent.wxFileDirPickerEvent/0","ref":"wxFileDirPickerEvent.html#t:wxFileDirPickerEvent/0"},{"type":"type","doc":"","title":"wxFileDirPickerEvent.wxFileDirPickerEventType/0","ref":"wxFileDirPickerEvent.html#t:wxFileDirPickerEventType/0"},{"type":"module","doc":"This control allows the user to select a file.\n\nThe generic implementation is a button which brings up a `m:wxFileDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe file-chooser dialog. It is only available if `wxUSE_FILEPICKERCTRL` is set to 1 (the default).","title":"wxFilePickerCtrl","ref":"wxFilePickerCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxFLP_DEFAULT_STYLE: The default style: includes wxFLP_OPEN | wxFLP_FILE_MUST_EXIST and,\nunder wxMSW and wxOSX, wxFLP_USE_TEXTCTRL.\n\n* wxFLP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxFilePickerCtrl` and which can be used by the user to\nspecify a path (see SetPath). The text control is automatically synchronized with button's\nvalue. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxFLP_OPEN: Creates a picker which allows the user to select a file to open.\n\n* wxFLP_SAVE: Creates a picker which allows the user to select a file to save.\n\n* wxFLP_OVERWRITE_PROMPT: Can be combined with wxFLP_SAVE only: ask confirmation to the\nuser before selecting a file.\n\n* wxFLP_FILE_MUST_EXIST: Can be combined with wxFLP_OPEN only: the file selected in the\npopup `m:wxFileDialog` must be an existing file. Notice that it still remains possible for\nthe user to enter a non-existent file name in the text control if `wxFLP_USE_TEXTCTRL` is\nalso used, this flag is a hint for the user rather than a guarantee that the selected file\ndoes exist for the program.\n\n* wxFLP_CHANGE_DIR: Change current working directory on each user file selection change.\n\n* wxFLP_SMALL: Use smaller version of the control with a small \"...\" button instead of the\nnormal \"Browse\" one. This flag is new since wxWidgets 2.9.3.\n\nSee:\n* `m:wxFileDialog`\n\n* `m:wxFileDirPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFilePickerCtrl](https://docs.wxwidgets.org/3.2/classwx_file_picker_ctrl.html)","title":"Styles - wxFilePickerCtrl","ref":"wxFilePickerCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_filepicker_changed`](`m:wxFileDirPickerEvent`)","title":"Events - wxFilePickerCtrl","ref":"wxFilePickerCtrl.html#module-events"},{"type":"function","doc":"","title":"wxFilePickerCtrl.create/3","ref":"wxFilePickerCtrl.html#create/3"},{"type":"function","doc":"Creates this widget with the given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","title":"wxFilePickerCtrl.create/4","ref":"wxFilePickerCtrl.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxFilePickerCtrl.destroy/1","ref":"wxFilePickerCtrl.html#destroy/1"},{"type":"function","doc":"Returns the absolute path of the currently selected file.","title":"wxFilePickerCtrl.getPath/1","ref":"wxFilePickerCtrl.html#getPath/1"},{"type":"function","doc":"","title":"wxFilePickerCtrl.new/0","ref":"wxFilePickerCtrl.html#new/0"},{"type":"function","doc":"","title":"wxFilePickerCtrl.new/2","ref":"wxFilePickerCtrl.html#new/2"},{"type":"function","doc":"Initializes the object and calls `create/4` with all the parameters.","title":"wxFilePickerCtrl.new/3","ref":"wxFilePickerCtrl.html#new/3"},{"type":"function","doc":"Sets the absolute path of the currently selected file.\n\nIf the control uses `wxFLP_FILE_MUST_EXIST` and does not use `wxFLP_USE_TEXTCTRL` style,\nthe `filename` must be a name of an existing file and will be simply ignored by the native\nwxGTK implementation if this is not the case (the generic implementation used under the\nother platforms accepts even invalid file names currently, but this is subject to change\nin the future, don't rely on being able to use non-existent paths with it).","title":"wxFilePickerCtrl.setPath/2","ref":"wxFilePickerCtrl.html#setPath/2"},{"type":"type","doc":"","title":"wxFilePickerCtrl.wxFilePickerCtrl/0","ref":"wxFilePickerCtrl.html#t:wxFilePickerCtrl/0"},{"type":"module","doc":"`m:wxFindReplaceData` holds the data for `m:wxFindReplaceDialog`.\n\nIt is used to initialize the dialog with the default values and will keep the last values\nfrom the dialog when it is closed. It is also updated each time a `wxFindDialogEvent` (not\nimplemented in wx) is generated so instead of using the `wxFindDialogEvent` (not\nimplemented in wx) methods you can also directly query this object.\n\nNote that all `SetXXX()` methods may only be called before showing the dialog and calling\nthem has no effect later.\n\nwxWidgets docs: [wxFindReplaceData](https://docs.wxwidgets.org/3.2/classwx_find_replace_data.html)","title":"wxFindReplaceData","ref":"wxFindReplaceData.html"},{"type":"function","doc":"Destroys the object","title":"wxFindReplaceData.destroy/1","ref":"wxFindReplaceData.html#destroy/1"},{"type":"function","doc":"Get the string to find.","title":"wxFindReplaceData.getFindString/1","ref":"wxFindReplaceData.html#getFindString/1"},{"type":"function","doc":"Get the combination of `wxFindReplaceFlags` values.","title":"wxFindReplaceData.getFlags/1","ref":"wxFindReplaceData.html#getFlags/1"},{"type":"function","doc":"Get the replacement string.","title":"wxFindReplaceData.getReplaceString/1","ref":"wxFindReplaceData.html#getReplaceString/1"},{"type":"function","doc":"","title":"wxFindReplaceData.new/0","ref":"wxFindReplaceData.html#new/0"},{"type":"function","doc":"Constructor initializes the flags to default value (0).","title":"wxFindReplaceData.new/1","ref":"wxFindReplaceData.html#new/1"},{"type":"function","doc":"Set the string to find (used as initial value by the dialog).","title":"wxFindReplaceData.setFindString/2","ref":"wxFindReplaceData.html#setFindString/2"},{"type":"function","doc":"Set the flags to use to initialize the controls of the dialog.","title":"wxFindReplaceData.setFlags/2","ref":"wxFindReplaceData.html#setFlags/2"},{"type":"function","doc":"Set the replacement string (used as initial value by the dialog).","title":"wxFindReplaceData.setReplaceString/2","ref":"wxFindReplaceData.html#setReplaceString/2"},{"type":"type","doc":"","title":"wxFindReplaceData.wxFindReplaceData/0","ref":"wxFindReplaceData.html#t:wxFindReplaceData/0"},{"type":"module","doc":"`m:wxFindReplaceDialog` is a standard modeless dialog which is used to allow the user to\nsearch for some text (and possibly replace it with something else).\n\nThe actual searching is supposed to be done in the owner window which is the parent of\nthis dialog. Note that it means that unlike for the other standard dialogs this one `must`\nhave a parent window. Also note that there is no way to use this dialog in a modal way; it\nis always, by design and implementation, modeless.\n\nPlease see the page_samples_dialogs sample for an example of using it.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFindReplaceDialog](https://docs.wxwidgets.org/3.2/classwx_find_replace_dialog.html)","title":"wxFindReplaceDialog","ref":"wxFindReplaceDialog.html"},{"type":"function","doc":"","title":"wxFindReplaceDialog.create/4","ref":"wxFindReplaceDialog.html#create/4"},{"type":"function","doc":"Creates the dialog; use `wxWindow:show/2` to show it on screen.\n\nThe `parent` and `data` parameters must be non-NULL.","title":"wxFindReplaceDialog.create/5","ref":"wxFindReplaceDialog.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxFindReplaceDialog.destroy/1","ref":"wxFindReplaceDialog.html#destroy/1"},{"type":"function","doc":"Get the `m:wxFindReplaceData` object used by this dialog.","title":"wxFindReplaceDialog.getData/1","ref":"wxFindReplaceDialog.html#getData/1"},{"type":"function","doc":"","title":"wxFindReplaceDialog.new/0","ref":"wxFindReplaceDialog.html#new/0"},{"type":"function","doc":"","title":"wxFindReplaceDialog.new/3","ref":"wxFindReplaceDialog.html#new/3"},{"type":"function","doc":"After using default constructor `create/5` must be called.\n\nThe `parent` and `data` parameters must be non-NULL.","title":"wxFindReplaceDialog.new/4","ref":"wxFindReplaceDialog.html#new/4"},{"type":"type","doc":"","title":"wxFindReplaceDialog.wxFindReplaceDialog/0","ref":"wxFindReplaceDialog.html#t:wxFindReplaceDialog/0"},{"type":"module","doc":"A flex grid sizer is a sizer which lays out its children in a two-dimensional table with\nall table fields in one row having the same height and all fields in one column having the\nsame width, but all rows or all columns are not necessarily the same height or width as in\nthe `m:wxGridSizer`.\n\nSince wxWidgets 2.5.0, `m:wxFlexGridSizer` can also size items equally in one direction\nbut unequally (\"flexibly\") in the other. If the sizer is only flexible in one direction\n(this can be changed using `setFlexibleDirection/2`), it needs to be decided how the sizer should grow in the other\n(\"non-flexible\") direction in order to fill the available space. The `setNonFlexibleGrowMode/2` method serves this purpose.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxFlexGridSizer](https://docs.wxwidgets.org/3.2/classwx_flex_grid_sizer.html)","title":"wxFlexGridSizer","ref":"wxFlexGridSizer.html"},{"type":"function","doc":"","title":"wxFlexGridSizer.addGrowableCol/2","ref":"wxFlexGridSizer.html#addGrowableCol/2"},{"type":"function","doc":"Specifies that column `idx` (starting from zero) should be grown if there is extra space\navailable to the sizer.\n\nThe `proportion` parameter has the same meaning as the stretch factor for the sizers (see `m:wxBoxSizer`)\nexcept that if all proportions are 0, then all columns are resized equally (instead of not\nbeing resized at all).\n\nNotice that the column must not be already growable, if you need to change the proportion\nyou must call `removeGrowableCol/2` first and then make it growable (with a different proportion) again. You\ncan use `IsColGrowable()` (not implemented in wx) to check whether a column is already\ngrowable.","title":"wxFlexGridSizer.addGrowableCol/3","ref":"wxFlexGridSizer.html#addGrowableCol/3"},{"type":"function","doc":"","title":"wxFlexGridSizer.addGrowableRow/2","ref":"wxFlexGridSizer.html#addGrowableRow/2"},{"type":"function","doc":"Specifies that row idx (starting from zero) should be grown if there is extra space\navailable to the sizer.\n\nThis is identical to `addGrowableCol/3` except that it works with rows and not columns.","title":"wxFlexGridSizer.addGrowableRow/3","ref":"wxFlexGridSizer.html#addGrowableRow/3"},{"type":"function","doc":"Destroys the object","title":"wxFlexGridSizer.destroy/1","ref":"wxFlexGridSizer.html#destroy/1"},{"type":"function","doc":"Returns a ?wxOrientation value that specifies whether the sizer flexibly resizes its\ncolumns, rows, or both (default).\n\nReturn: One of the following values:\n\n* wxVERTICAL: Rows are flexibly sized.\n\n* wxHORIZONTAL: Columns are flexibly sized.\n\n* wxBOTH: Both rows and columns are flexibly sized (this is the default value).\n\nSee: `setFlexibleDirection/2`","title":"wxFlexGridSizer.getFlexibleDirection/1","ref":"wxFlexGridSizer.html#getFlexibleDirection/1"},{"type":"function","doc":"Returns the value that specifies how the sizer grows in the \"non-flexible\" direction if\nthere is one.\n\nThe behaviour of the elements in the flexible direction (i.e. both rows and columns by\ndefault, or rows only if `getFlexibleDirection/1` is `wxVERTICAL` or columns only if it is `wxHORIZONTAL`) is\nalways governed by their proportion as specified in the call to `addGrowableRow/3` or `addGrowableCol/3`. What happens in the\nother direction depends on the value of returned by this function as described below.\n\nReturn: One of the following values:\n\n* wxFLEX_GROWMODE_NONE: Sizer doesn't grow its elements at all in the non-flexible direction.\n\n* wxFLEX_GROWMODE_SPECIFIED: Sizer honors growable columns/rows set with `addGrowableCol/3` and `addGrowableRow/3` in the\nnon-flexible direction as well. In this case equal sizing applies to minimum sizes of\ncolumns or rows (this is the default value).\n\n* wxFLEX_GROWMODE_ALL: Sizer equally stretches all columns or rows in the non-flexible\ndirection, independently of the proportions applied in the flexible direction.\n\nSee:\n* `setFlexibleDirection/2`\n\n* `setNonFlexibleGrowMode/2`","title":"wxFlexGridSizer.getNonFlexibleGrowMode/1","ref":"wxFlexGridSizer.html#getNonFlexibleGrowMode/1"},{"type":"function","doc":"","title":"wxFlexGridSizer.new/1","ref":"wxFlexGridSizer.html#new/1"},{"type":"function","doc":"","title":"wxFlexGridSizer.new/2","ref":"wxFlexGridSizer.html#new/2"},{"type":"function","doc":"","title":"wxFlexGridSizer.new/3","ref":"wxFlexGridSizer.html#new/3"},{"type":"function","doc":"","title":"wxFlexGridSizer.new/4","ref":"wxFlexGridSizer.html#new/4"},{"type":"function","doc":"Specifies that the `idx` column index is no longer growable.","title":"wxFlexGridSizer.removeGrowableCol/2","ref":"wxFlexGridSizer.html#removeGrowableCol/2"},{"type":"function","doc":"Specifies that the `idx` row index is no longer growable.","title":"wxFlexGridSizer.removeGrowableRow/2","ref":"wxFlexGridSizer.html#removeGrowableRow/2"},{"type":"function","doc":"Specifies whether the sizer should flexibly resize its columns, rows, or both.\n\nArgument `direction` can be `wxVERTICAL`, `wxHORIZONTAL` or `wxBOTH` (which is the\ndefault value). Any other value is ignored.\n\nSee `getFlexibleDirection/1` for the explanation of these values. Note that this method does not trigger\nrelayout.","title":"wxFlexGridSizer.setFlexibleDirection/2","ref":"wxFlexGridSizer.html#setFlexibleDirection/2"},{"type":"function","doc":"Specifies how the sizer should grow in the non-flexible direction if there is one (so `setFlexibleDirection/2`\nmust have been called previously).\n\nArgument `mode` can be one of those documented in `getNonFlexibleGrowMode/1`, please see there for their\nexplanation. Note that this method does not trigger relayout.","title":"wxFlexGridSizer.setNonFlexibleGrowMode/2","ref":"wxFlexGridSizer.html#setNonFlexibleGrowMode/2"},{"type":"type","doc":"","title":"wxFlexGridSizer.wxFlexGridSizer/0","ref":"wxFlexGridSizer.html#t:wxFlexGridSizer/0"},{"type":"module","doc":"A focus event is sent when a window's focus changes.\n\nThe window losing focus receives a \"kill focus\" event while the window gaining it gets a\n\"set focus\" one.\n\nNotice that the set focus event happens both when the user gives focus to the window\n(whether using the mouse or keyboard) and when it is done from the program itself using `wxWindow:setFocus/1`.\n\nThe focus event handlers should almost invariably call `wxEvent:skip/2` on their event argument to allow\nthe default handling to take place. Failure to do this may result in incorrect behaviour\nof the native controls. Also note that wxEVT_KILL_FOCUS handler must not call `wxWindow:setFocus/1` as this,\nagain, is not supported by all native controls. If you need to do this, consider using the `Delayed Action Mechanism`\n(not implemented in wx) described in `m:wxIdleEvent` documentation.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFocusEvent](https://docs.wxwidgets.org/3.2/classwx_focus_event.html)","title":"wxFocusEvent","ref":"wxFocusEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxFocusEventType` to subscribe to events of this type.","title":"Events - wxFocusEvent","ref":"wxFocusEvent.html#module-events"},{"type":"function","doc":"Returns the window associated with this event, that is the window which had the focus\nbefore for the `wxEVT\\_SET\\_FOCUS` event and the window which is going to receive focus\nfor the `wxEVT\\_KILL\\_FOCUS` one.\n\nWarning: the window pointer may be NULL!","title":"wxFocusEvent.getWindow/1","ref":"wxFocusEvent.html#getWindow/1"},{"type":"type","doc":"","title":"wxFocusEvent.wxFocus/0","ref":"wxFocusEvent.html#t:wxFocus/0"},{"type":"type","doc":"","title":"wxFocusEvent.wxFocusEvent/0","ref":"wxFocusEvent.html#t:wxFocusEvent/0"},{"type":"type","doc":"","title":"wxFocusEvent.wxFocusEventType/0","ref":"wxFocusEvent.html#t:wxFocusEventType/0"},{"type":"module","doc":"A font is an object which determines the appearance of text.\n\nFonts are used for drawing text to a device context, and setting the appearance of a\nwindow's text, see `wxDC:setFont/2` and `wxWindow:setFont/2`.\n\nThe easiest way to create a custom font is to use `wxFontInfo` (not implemented in wx)\nobject to specify the font attributes and then use `new/5` constructor. Alternatively, you could\nstart with one of the pre-defined fonts or use `wxWindow:getFont/1` and modify the font, e.g. by increasing\nits size using `MakeLarger()` (not implemented in wx) or changing its weight using `MakeBold()`\n(not implemented in wx).\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nYou can retrieve the current system font settings with `m:wxSystemSettings`.\n\nPredefined objects (include wx.hrl): ?wxNullFont, ?wxNORMAL\\_FONT, ?wxSMALL\\_FONT,\n?wxITALIC\\_FONT, ?wxSWISS\\_FONT\n\nSee:\n* [Overview font](https://docs.wxwidgets.org/3.2/overview_font.html#overview_font)\n\n* `wxDC:setFont/2`\n\n* `wxDC:drawText/3`\n\n* `wxDC:getTextExtent/3`\n\n* `m:wxFontDialog`\n\n* `m:wxSystemSettings`\n\nwxWidgets docs: [wxFont](https://docs.wxwidgets.org/3.2/classwx_font.html)","title":"wxFont","ref":"wxFont.html"},{"type":"function","doc":"Destroys the object","title":"wxFont.destroy/1","ref":"wxFont.html#destroy/1"},{"type":"function","doc":"Returns the current application's default encoding.\n\nSee:\n* [Overview fontencoding](https://docs.wxwidgets.org/3.2/overview_fontencoding.html#overview_fontencoding)\n\n* `setDefaultEncoding/1`","title":"wxFont.getDefaultEncoding/0","ref":"wxFont.html#getDefaultEncoding/0"},{"type":"function","doc":"Returns the face name associated with the font, or the empty string if there is no face\ninformation.\n\nSee: `setFaceName/2`","title":"wxFont.getFaceName/1","ref":"wxFont.html#getFaceName/1"},{"type":"function","doc":"Gets the font family if possible.\n\nAs described in ?wxFontFamily docs the returned value acts as a rough, basic\nclassification of the main font properties (look, spacing).\n\nIf the current font face name is not recognized by `m:wxFont` or by the underlying\nsystem, `wxFONTFAMILY_DEFAULT` is returned.\n\nNote that currently this function is not very precise and so not particularly useful.\nFont families mostly make sense only for font creation, see `setFamily/2`.\n\nSee: `setFamily/2`","title":"wxFont.getFamily/1","ref":"wxFont.html#getFamily/1"},{"type":"function","doc":"Returns the platform-dependent string completely describing this font.\n\nReturned string is always non-empty unless the font is invalid (in which case an assert\nis triggered).\n\nNote that the returned string is not meant to be shown or edited by the user: a typical\nuse of this function is for serializing in string-form a `m:wxFont` object.\n\nSee: `getNativeFontInfoUserDesc/1`","title":"wxFont.getNativeFontInfoDesc/1","ref":"wxFont.html#getNativeFontInfoDesc/1"},{"type":"function","doc":"Returns a user-friendly string for this font object.\n\nReturned string is always non-empty unless the font is invalid (in which case an assert\nis triggered).\n\nThe string does not encode all `m:wxFont` infos under all platforms; e.g. under wxMSW the\nfont family is not present in the returned string.\n\nSome examples of the formats of returned strings (which are platform-dependent) are in `SetNativeFontInfoUserDesc()`\n(not implemented in wx).\n\nSee: `getNativeFontInfoDesc/1`","title":"wxFont.getNativeFontInfoUserDesc/1","ref":"wxFont.html#getNativeFontInfoUserDesc/1"},{"type":"function","doc":"Gets the point size as an integer number.\n\nThis function is kept for compatibility reasons. New code should use `GetFractionalPointSize()`\n(not implemented in wx) and support fractional point sizes.\n\nSee: `setPointSize/2`","title":"wxFont.getPointSize/1","ref":"wxFont.html#getPointSize/1"},{"type":"function","doc":"Gets the font style.\n\nSee ?wxFontStyle for a list of valid styles.\n\nSee: `setStyle/2`","title":"wxFont.getStyle/1","ref":"wxFont.html#getStyle/1"},{"type":"function","doc":"Returns true if the font is underlined, false otherwise.\n\nSee: `setUnderlined/2`","title":"wxFont.getUnderlined/1","ref":"wxFont.html#getUnderlined/1"},{"type":"function","doc":"Gets the font weight.\n\nSee ?wxFontWeight for a list of valid weight identifiers.\n\nSee: `setWeight/2`","title":"wxFont.getWeight/1","ref":"wxFont.html#getWeight/1"},{"type":"function","doc":"Returns true if the font is a fixed width (or monospaced) font, false if it is a\nproportional one or font is invalid.\n\nNote that this function under some platforms is different from just testing for the font\nfamily being equal to `wxFONTFAMILY_TELETYPE` because native platform-specific functions\nare used for the check (resulting in a more accurate return value).","title":"wxFont.isFixedWidth/1","ref":"wxFont.html#isFixedWidth/1"},{"type":"function","doc":"Returns true if this object is a valid font, false otherwise.","title":"wxFont.isOk/1","ref":"wxFont.html#isOk/1"},{"type":"function","doc":"Default ctor.","title":"wxFont.new/0","ref":"wxFont.html#new/0"},{"type":"function","doc":"Copy constructor, uses reference counting.","title":"wxFont.new/1","ref":"wxFont.html#new/1"},{"type":"function","doc":"Equivalent to: `new/5`","title":"wxFont.new/4","ref":"wxFont.html#new/4"},{"type":"function","doc":"Creates a font object with the specified attributes and size in pixels.\n\nNotice that the use of this constructor is often more verbose and less readable than the\nuse of constructor from `wxFontInfo` (not implemented in wx), consider using that\nconstructor instead.\n\nRemark: If the desired font does not exist, the closest match will be chosen. Under\nWindows, only scalable TrueType fonts are used.","title":"wxFont.new/5","ref":"wxFont.html#new/5"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxFont.ok/1","ref":"wxFont.html#ok/1"},{"type":"function","doc":"Sets the default font encoding.\n\nSee:\n* [Overview fontencoding](https://docs.wxwidgets.org/3.2/overview_fontencoding.html#overview_fontencoding)\n\n* `getDefaultEncoding/0`","title":"wxFont.setDefaultEncoding/1","ref":"wxFont.html#setDefaultEncoding/1"},{"type":"function","doc":"Sets the facename for the font.\n\nRemark: To avoid portability problems, don't rely on a specific face, but specify the\nfont family instead (see ?wxFontFamily and `setFamily/2`).\n\nReturn: true if the given face name exists; if the face name doesn't exist in the user's\nsystem then the font is invalidated (so that `isOk/1` will return false) and false is returned.\n\nSee:\n* `getFaceName/1`\n\n* `setFamily/2`","title":"wxFont.setFaceName/2","ref":"wxFont.html#setFaceName/2"},{"type":"function","doc":"Sets the font family.\n\nAs described in ?wxFontFamily docs the given `family` value acts as a rough, basic\nindication of the main font properties (look, spacing).\n\nNote that changing the font family results in changing the font face name.\n\nSee:\n* `getFamily/1`\n\n* `setFaceName/2`","title":"wxFont.setFamily/2","ref":"wxFont.html#setFamily/2"},{"type":"function","doc":"Sets the font size in points to an integer value.\n\nThis is a legacy version of the function only supporting integer point sizes. It can\nstill be used, but to avoid unnecessarily restricting the font size in points to integer\nvalues, consider using the new (added in wxWidgets 3.1.2) `SetFractionalPointSize()` (not\nimplemented in wx) function instead.","title":"wxFont.setPointSize/2","ref":"wxFont.html#setPointSize/2"},{"type":"function","doc":"Sets the font style.\n\nSee: `getStyle/1`","title":"wxFont.setStyle/2","ref":"wxFont.html#setStyle/2"},{"type":"function","doc":"Sets underlining.\n\nSee: `getUnderlined/1`","title":"wxFont.setUnderlined/2","ref":"wxFont.html#setUnderlined/2"},{"type":"function","doc":"Sets the font weight.\n\nSee: `getWeight/1`","title":"wxFont.setWeight/2","ref":"wxFont.html#setWeight/2"},{"type":"type","doc":"","title":"wxFont.wxFont/0","ref":"wxFont.html#t:wxFont/0"},{"type":"module","doc":"This class holds a variety of information related to font dialogs.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_font)\n\n* `m:wxFont`\n\n* `m:wxFontDialog`\n\nwxWidgets docs: [wxFontData](https://docs.wxwidgets.org/3.2/classwx_font_data.html)","title":"wxFontData","ref":"wxFontData.html"},{"type":"function","doc":"Destroys the object","title":"wxFontData.destroy/1","ref":"wxFontData.html#destroy/1"},{"type":"function","doc":"Enables or disables \"effects\" under Windows or generic only.\n\nThis refers to the controls for manipulating colour, strikeout and underline properties.\n\nThe default value is true.","title":"wxFontData.enableEffects/2","ref":"wxFontData.html#enableEffects/2"},{"type":"function","doc":"Under Windows, returns a flag determining whether symbol fonts can be selected.\n\nHas no effect on other platforms.\n\nThe default value is true.","title":"wxFontData.getAllowSymbols/1","ref":"wxFontData.html#getAllowSymbols/1"},{"type":"function","doc":"Gets the font chosen by the user if the user pressed OK (`wxFontDialog::ShowModal()` (not\nimplemented in wx) returned wxID\\_OK).","title":"wxFontData.getChosenFont/1","ref":"wxFontData.html#getChosenFont/1"},{"type":"function","doc":"Gets the colour associated with the font dialog.\n\nThe default value is black.","title":"wxFontData.getColour/1","ref":"wxFontData.html#getColour/1"},{"type":"function","doc":"Determines whether \"effects\" are enabled under Windows.\n\nThis refers to the controls for manipulating colour, strikeout and underline properties.\n\nThe default value is true.","title":"wxFontData.getEnableEffects/1","ref":"wxFontData.html#getEnableEffects/1"},{"type":"function","doc":"Gets the font that will be initially used by the font dialog.\n\nThis should have previously been set by the application.","title":"wxFontData.getInitialFont/1","ref":"wxFontData.html#getInitialFont/1"},{"type":"function","doc":"Returns true if the Help button will be shown (Windows only).\n\nThe default value is false.","title":"wxFontData.getShowHelp/1","ref":"wxFontData.html#getShowHelp/1"},{"type":"function","doc":"Constructor.\n\nInitializes `fontColour` to black, `showHelp` to false, `allowSymbols` to true, `enableEffects`\nto true, `minSize` to 0 and `maxSize` to 0.","title":"wxFontData.new/0","ref":"wxFontData.html#new/0"},{"type":"function","doc":"Copy Constructor.","title":"wxFontData.new/1","ref":"wxFontData.html#new/1"},{"type":"function","doc":"Under Windows, determines whether symbol fonts can be selected.\n\nHas no effect on other platforms.\n\nThe default value is true.","title":"wxFontData.setAllowSymbols/2","ref":"wxFontData.html#setAllowSymbols/2"},{"type":"function","doc":"Sets the font that will be returned to the user (for internal use only).","title":"wxFontData.setChosenFont/2","ref":"wxFontData.html#setChosenFont/2"},{"type":"function","doc":"Sets the colour that will be used for the font foreground colour.\n\nThe default colour is black.","title":"wxFontData.setColour/2","ref":"wxFontData.html#setColour/2"},{"type":"function","doc":"Sets the font that will be initially used by the font dialog.","title":"wxFontData.setInitialFont/2","ref":"wxFontData.html#setInitialFont/2"},{"type":"function","doc":"Sets the valid range for the font point size (Windows only).\n\nThe default is 0, 0 (unrestricted range).","title":"wxFontData.setRange/3","ref":"wxFontData.html#setRange/3"},{"type":"function","doc":"Determines whether the Help button will be displayed in the font dialog (Windows only).\n\nThe default value is false.","title":"wxFontData.setShowHelp/2","ref":"wxFontData.html#setShowHelp/2"},{"type":"type","doc":"","title":"wxFontData.wxFontData/0","ref":"wxFontData.html#t:wxFontData/0"},{"type":"module","doc":"This class represents the font chooser dialog.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_font)\n\n* `m:wxFontData`\n\n* ?wxGetFontFromUser()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFontDialog](https://docs.wxwidgets.org/3.2/classwx_font_dialog.html)","title":"wxFontDialog","ref":"wxFontDialog.html"},{"type":"function","doc":"Creates the dialog if the `m:wxFontDialog` object had been initialized using the default\nconstructor.\n\nReturn: true on success and false if an error occurred.","title":"wxFontDialog.create/3","ref":"wxFontDialog.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxFontDialog.destroy/1","ref":"wxFontDialog.html#destroy/1"},{"type":"function","doc":"Returns the `m:wxFontData` associated with the font dialog.","title":"wxFontDialog.getFontData/1","ref":"wxFontDialog.html#getFontData/1"},{"type":"function","doc":"Default ctor.\n\n`create/3` must be called before the dialog can be shown.","title":"wxFontDialog.new/0","ref":"wxFontDialog.html#new/0"},{"type":"function","doc":"Constructor.\n\nPass a parent window, and the `m:wxFontData` object to be used to initialize the dialog\ncontrols.","title":"wxFontDialog.new/2","ref":"wxFontDialog.html#new/2"},{"type":"type","doc":"","title":"wxFontDialog.wxFontDialog/0","ref":"wxFontDialog.html#t:wxFontDialog/0"},{"type":"module","doc":"This control allows the user to select a font.\n\nThe generic implementation is a button which brings up a `m:wxFontDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe font-chooser dialog. It is only available if `wxUSE_FONTPICKERCTRL` is set to 1 (the default).","title":"wxFontPickerCtrl","ref":"wxFontPickerCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxFNTP_DEFAULT_STYLE: The default style: wxFNTP_FONTDESC_AS_LABEL |\nwxFNTP_USEFONT_FOR_LABEL.\n\n* wxFNTP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxFontPickerCtrl` and which can be used by the user to\nspecify a font (see SetSelectedFont). The text control is automatically synchronized with\nbutton's value. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxFNTP_FONTDESC_AS_LABEL: Keeps the label of the button updated with the fontface name\nand the font size. E.g. choosing \"Times New Roman bold, italic with size 10\" from the\nfontdialog, will update the label (overwriting any previous label) with the \"Times New\nRoman, 10\" text.\n\n* wxFNTP_USEFONT_FOR_LABEL: Uses the currently selected font to draw the label of the\nbutton.\n\nSee:\n* `m:wxFontDialog`\n\n* `m:wxFontPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFontPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_font_picker_ctrl.html)","title":"Styles - wxFontPickerCtrl","ref":"wxFontPickerCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_fontpicker_changed`](`m:wxFontPickerEvent`)","title":"Events - wxFontPickerCtrl","ref":"wxFontPickerCtrl.html#module-events"},{"type":"function","doc":"","title":"wxFontPickerCtrl.create/3","ref":"wxFontPickerCtrl.html#create/3"},{"type":"function","doc":"Creates this widget with given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","title":"wxFontPickerCtrl.create/4","ref":"wxFontPickerCtrl.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxFontPickerCtrl.destroy/1","ref":"wxFontPickerCtrl.html#destroy/1"},{"type":"function","doc":"Returns the maximum point size value allowed for the user-chosen font.","title":"wxFontPickerCtrl.getMaxPointSize/1","ref":"wxFontPickerCtrl.html#getMaxPointSize/1"},{"type":"function","doc":"Returns the currently selected font.\n\nNote that this function is completely different from `wxWindow:getFont/1`.","title":"wxFontPickerCtrl.getSelectedFont/1","ref":"wxFontPickerCtrl.html#getSelectedFont/1"},{"type":"function","doc":"","title":"wxFontPickerCtrl.new/0","ref":"wxFontPickerCtrl.html#new/0"},{"type":"function","doc":"","title":"wxFontPickerCtrl.new/2","ref":"wxFontPickerCtrl.html#new/2"},{"type":"function","doc":"Initializes the object and calls `create/4` with all the parameters.","title":"wxFontPickerCtrl.new/3","ref":"wxFontPickerCtrl.html#new/3"},{"type":"function","doc":"Sets the maximum point size value allowed for the user-chosen font.\n\nThe default value is 100. Note that big fonts can require a lot of memory and CPU time\nboth for creation and for rendering; thus, specially because the user has the option to\nspecify the fontsize through a text control (see wxFNTP_USE_TEXTCTRL), it's a good idea to\nput a limit to the maximum font size when huge fonts do not make much sense.","title":"wxFontPickerCtrl.setMaxPointSize/2","ref":"wxFontPickerCtrl.html#setMaxPointSize/2"},{"type":"function","doc":"Sets the currently selected font.\n\nNote that this function is completely different from `wxWindow:setFont/2`.","title":"wxFontPickerCtrl.setSelectedFont/2","ref":"wxFontPickerCtrl.html#setSelectedFont/2"},{"type":"type","doc":"","title":"wxFontPickerCtrl.wxFontPickerCtrl/0","ref":"wxFontPickerCtrl.html#t:wxFontPickerCtrl/0"},{"type":"module","doc":"This event class is used for the events generated by `m:wxFontPickerCtrl`.\n\nSee: `m:wxFontPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFontPickerEvent](https://docs.wxwidgets.org/3.2/classwx_font_picker_event.html)","title":"wxFontPickerEvent","ref":"wxFontPickerEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxFontPickerEventType` to subscribe to events of this type.","title":"Events - wxFontPickerEvent","ref":"wxFontPickerEvent.html#module-events"},{"type":"function","doc":"Retrieve the font the user has just selected.","title":"wxFontPickerEvent.getFont/1","ref":"wxFontPickerEvent.html#getFont/1"},{"type":"type","doc":"","title":"wxFontPickerEvent.wxFontPicker/0","ref":"wxFontPickerEvent.html#t:wxFontPicker/0"},{"type":"type","doc":"","title":"wxFontPickerEvent.wxFontPickerEvent/0","ref":"wxFontPickerEvent.html#t:wxFontPickerEvent/0"},{"type":"type","doc":"","title":"wxFontPickerEvent.wxFontPickerEventType/0","ref":"wxFontPickerEvent.html#t:wxFontPickerEventType/0"},{"type":"module","doc":"A frame is a window whose size and position can (usually) be changed by the user.\n\nIt usually has thick borders and a title bar, and can optionally contain a menu bar,\ntoolbar and status bar. A frame can contain any window that is not a frame or dialog.\n\nA frame that has a status bar and toolbar, created via the `createStatusBar/2` and `createToolBar/2` functions, manages these\nwindows and adjusts the value returned by `wxWindow:getClientSize/1` to reflect the remaining size available to\napplication windows.\n\nRemark: An application should normally define an `m:wxCloseEvent` handler for the frame\nto respond to system close events, for example so that related data and subwindows can be\ncleaned up.\n\nDefault event processing\n\n`m:wxFrame` processes the following events:\n\n* `wxEVT_SIZE:` if the frame has exactly one child window, not counting the status and\ntoolbar, this child is resized to take the entire frame client area. If two or more\nwindows are present, they should be laid out explicitly either by manually handling `wxEVT_SIZE`\nor using sizers;\n\n* `wxEVT_MENU_HIGHLIGHT:` the default implementation displays the help string associated\nwith the selected item in the first pane of the status bar, if there is one.","title":"wxFrame","ref":"wxFrame.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxDEFAULT_FRAME_STYLE: Defined as wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER |\nwxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN.\n\n* wxICONIZE: Display the frame iconized (minimized). Windows only.\n\n* wxCAPTION: Puts a caption on the frame. Notice that this flag is required by\nwxMINIMIZE_BOX, wxMAXIMIZE_BOX and wxCLOSE_BOX on most systems as the corresponding\nbuttons cannot be shown if the window has no title bar at all. I.e. if wxCAPTION is not\nspecified those styles would be simply ignored.\n\n* wxMINIMIZE: Identical to wxICONIZE. Windows only.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the frame.\n\n* wxMAXIMIZE: Displays the frame maximized. Windows and GTK+ only.\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the frame. Notice that under wxGTK\nwxRESIZE_BORDER must be used as well or this style is ignored.\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxSTAY_ON_TOP: Stay on top of all other windows, see also wxFRAME_FLOAT_ON_PARENT.\n\n* wxSYSTEM_MENU: Displays a system menu containing the list of various windows commands in\nthe window title bar. Unlike wxMINIMIZE_BOX, wxMAXIMIZE_BOX and wxCLOSE_BOX styles this\nstyle can be used without wxCAPTION, at least under Windows, and makes the system menu\navailable without showing it on screen in this case. However it is recommended to only use\nit together with wxCAPTION for consistent behaviour under all platforms.\n\n* wxRESIZE_BORDER: Displays a resizable border around the window.\n\n* wxFRAME_TOOL_WINDOW: Causes a frame with a small title bar to be created; the frame does\nnot appear in the taskbar under Windows or GTK+.\n\n* wxFRAME_NO_TASKBAR: Creates an otherwise normal frame but it does not appear in the\ntaskbar under Windows or GTK+ (note that it will minimize to the desktop window under\nWindows which may seem strange to the users and thus it might be better to use this style\nonly without wxMINIMIZE_BOX style). In wxGTK, the flag is respected only if the window\nmanager supports _NET_WM_STATE_SKIP_TASKBAR hint.\n\n* wxFRAME_FLOAT_ON_PARENT: The frame will always be on top of its parent (unlike\nwxSTAY_ON_TOP). A frame created with this style must have a non-NULL parent.\n\n* wxFRAME_SHAPED: Windows with this style are allowed to have their shape changed with the `wxTopLevelWindow:setShape/2`\nmethod. The default frame style is for normal, resizable frames. To create a frame which\ncannot be resized by user, you may use the following combination of styles:\n\nSee also the overview_windowstyles.","title":"Styles - wxFrame","ref":"wxFrame.html#module-styles"},{"type":"module","doc":"This class supports the following extra styles:\n\n* wxFRAME_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. Note that this is an extended style\nand must be set by calling SetExtraStyle before Create is called (two-step construction).\nYou cannot use this style together with wxMAXIMIZE_BOX or wxMINIMIZE_BOX, so you should\nuse wxDEFAULT_FRAME_STYLE ~ (wxMINIMIZE_BOX | wxMAXIMIZE_BOX) for the frames having this\nstyle (the dialogs don't have a minimize or a maximize box by default)\n\n* wxFRAME_EX_METAL: On macOS, frames with this style will be shown with a metallic look.\nThis is an extra style.\n\nSee:\n* `m:wxMDIParentFrame`\n\n* `m:wxMDIChildFrame`\n\n* `m:wxMiniFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFrame](https://docs.wxwidgets.org/3.2/classwx_frame.html)","title":"Extra Styles - wxFrame","ref":"wxFrame.html#module-extra-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`close_window`](`m:wxCloseEvent`)\n\n* [`iconize`](`m:wxIconizeEvent`)\n\n* [`menu_open`](`m:wxMenuEvent`)\n\n* [`menu_close`](`m:wxMenuEvent`)\n\n* [`menu_highlight`](`m:wxMenuEvent`)","title":"Events - wxFrame","ref":"wxFrame.html#module-events"},{"type":"function","doc":"","title":"wxFrame.create/4","ref":"wxFrame.html#create/4"},{"type":"function","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","title":"wxFrame.create/5","ref":"wxFrame.html#create/5"},{"type":"function","doc":"","title":"wxFrame.createStatusBar/1","ref":"wxFrame.html#createStatusBar/1"},{"type":"function","doc":"Creates a status bar at the bottom of the frame.\n\nReturn: A pointer to the status bar if it was created successfully, NULL otherwise.\n\nRemark: The width of the status bar is the whole width of the frame (adjusted\nautomatically when resizing), and the height and text size are chosen by the host\nwindowing system.\n\nSee:\n* `setStatusText/3`\n\n* `getStatusBar/1`","title":"wxFrame.createStatusBar/2","ref":"wxFrame.html#createStatusBar/2"},{"type":"function","doc":"","title":"wxFrame.createToolBar/1","ref":"wxFrame.html#createToolBar/1"},{"type":"function","doc":"Creates a toolbar at the top or left of the frame.\n\nReturn: A pointer to the toolbar if it was created successfully, NULL otherwise.\n\nRemark: By default, the toolbar is an instance of `m:wxToolBar`. To use a different\nclass, override `OnCreateToolBar()` (not implemented in wx). When a toolbar has been\ncreated with this function, or made known to the frame with `setToolBar/2`, the frame will manage the\ntoolbar position and adjust the return value from `wxWindow:getClientSize/1` to reflect the available space for\napplication windows. Under Pocket PC, you should always use this function for creating the\ntoolbar to be managed by the frame, so that wxWidgets can use a combined menubar and\ntoolbar. Where you manage your own toolbars, create a `m:wxToolBar` as usual.\n\nSee:\n* `createStatusBar/2`\n\n* `setToolBar/2`\n\n* `getToolBar/1`","title":"wxFrame.createToolBar/2","ref":"wxFrame.html#createToolBar/2"},{"type":"function","doc":"Destroys the object","title":"wxFrame.destroy/1","ref":"wxFrame.html#destroy/1"},{"type":"function","doc":"Returns the origin of the frame client area (in client coordinates).\n\nIt may be different from (0, 0) if the frame has a toolbar.","title":"wxFrame.getClientAreaOrigin/1","ref":"wxFrame.html#getClientAreaOrigin/1"},{"type":"function","doc":"Returns a pointer to the menubar currently associated with the frame (if any).\n\nSee:\n* `setMenuBar/2`\n\n* `m:wxMenuBar`\n\n* `m:wxMenu`","title":"wxFrame.getMenuBar/1","ref":"wxFrame.html#getMenuBar/1"},{"type":"function","doc":"Returns a pointer to the status bar currently associated with the frame (if any).\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`","title":"wxFrame.getStatusBar/1","ref":"wxFrame.html#getStatusBar/1"},{"type":"function","doc":"Returns the status bar pane used to display menu and toolbar help.\n\nSee: `setStatusBarPane/2`","title":"wxFrame.getStatusBarPane/1","ref":"wxFrame.html#getStatusBarPane/1"},{"type":"function","doc":"Returns a pointer to the toolbar currently associated with the frame (if any).\n\nSee:\n* `createToolBar/2`\n\n* `m:wxToolBar`\n\n* `setToolBar/2`","title":"wxFrame.getToolBar/1","ref":"wxFrame.html#getToolBar/1"},{"type":"function","doc":"Default constructor.","title":"wxFrame.new/0","ref":"wxFrame.html#new/0"},{"type":"function","doc":"","title":"wxFrame.new/3","ref":"wxFrame.html#new/3"},{"type":"function","doc":"Constructor, creating the window.\n\nRemark: For Motif, MWM (the Motif Window Manager) should be running for any window styles\nto work (otherwise all styles take effect).\n\nSee: `create/5`","title":"wxFrame.new/4","ref":"wxFrame.html#new/4"},{"type":"function","doc":"Simulate a menu command.","title":"wxFrame.processCommand/2","ref":"wxFrame.html#processCommand/2"},{"type":"function","doc":"","title":"wxFrame.sendSizeEvent/1","ref":"wxFrame.html#sendSizeEvent/1"},{"type":"function","doc":"This function sends a dummy `m:wxSizeEvent` to the window allowing it to re-layout its\nchildren positions.\n\nIt is sometimes useful to call this function after adding or deleting a children after\nthe frame creation or if a child size changes. Note that if the frame is using either\nsizers or constraints for the children layout, it is enough to call `wxWindow:layout/1` directly and this\nfunction should not be used in this case.\n\nIf `flags` includes `wxSEND_EVENT_POST` value, this function posts the event, i.e.\nschedules it for later processing, instead of dispatching it directly. You can also use `PostSizeEvent()`\n(not implemented in wx) as a more readable equivalent of calling this function with this flag.","title":"wxFrame.sendSizeEvent/2","ref":"wxFrame.html#sendSizeEvent/2"},{"type":"function","doc":"Tells the frame to show the given menu bar.\n\nRemark: If the frame is destroyed, the menu bar and its menus will be destroyed also, so\ndo not delete the menu bar explicitly (except by resetting the frame's menu bar to another\nframe or NULL). Under Windows, a size event is generated, so be sure to initialize data\nmembers properly before calling `setMenuBar/2`. Note that on some platforms, it is not possible to call\nthis function twice for the same frame object.\n\nSee:\n* `getMenuBar/1`\n\n* `m:wxMenuBar`\n\n* `m:wxMenu`","title":"wxFrame.setMenuBar/2","ref":"wxFrame.html#setMenuBar/2"},{"type":"function","doc":"Associates a status bar with the frame.\n\nIf `statusBar` is NULL, then the status bar, if present, is detached from the frame, but `not`\ndeleted.\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`\n\n* `getStatusBar/1`","title":"wxFrame.setStatusBar/2","ref":"wxFrame.html#setStatusBar/2"},{"type":"function","doc":"Set the status bar pane used to display menu and toolbar help.\n\nUsing -1 disables help display.","title":"wxFrame.setStatusBarPane/2","ref":"wxFrame.html#setStatusBarPane/2"},{"type":"function","doc":"","title":"wxFrame.setStatusText/2","ref":"wxFrame.html#setStatusText/2"},{"type":"function","doc":"Sets the status bar text and updates the status bar display.\n\nThis is a simple wrapper for `wxStatusBar:setStatusText/3` which doesn't do anything if the frame has no status bar,\ni.e. `getStatusBar/1` returns NULL.\n\nRemark: Use an empty string to clear the status bar.\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`","title":"wxFrame.setStatusText/3","ref":"wxFrame.html#setStatusText/3"},{"type":"function","doc":"Sets the widths of the fields in the status bar.\n\nRemark: The widths of the variable fields are calculated from the total width of all\nfields, minus the sum of widths of the non-variable fields, divided by the number of\nvariable fields.","title":"wxFrame.setStatusWidths/2","ref":"wxFrame.html#setStatusWidths/2"},{"type":"function","doc":"Associates a toolbar with the frame.","title":"wxFrame.setToolBar/2","ref":"wxFrame.html#setToolBar/2"},{"type":"type","doc":"","title":"wxFrame.wxFrame/0","ref":"wxFrame.html#t:wxFrame/0"},{"type":"module","doc":"The `m:wxGBSizerItem` class is used by the `m:wxGridBagSizer` for tracking the items in\nthe sizer.\n\nIt adds grid position and spanning information to the normal `m:wxSizerItem` by adding `wxGBPosition`\n(not implemented in wx) and `wxGBSpan` (not implemented in wx) attributes. Most of the\ntime you will not need to use a `m:wxGBSizerItem` directly in your code, but there are a\ncouple of cases where it is handy.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizerItem`\n\nwxWidgets docs: [wxGBSizerItem](https://docs.wxwidgets.org/3.2/classwx_g_b_sizer_item.html)","title":"wxGBSizerItem","ref":"wxGBSizerItem.html"},{"type":"type","doc":"","title":"wxGBSizerItem.wxGBSizerItem/0","ref":"wxGBSizerItem.html#t:wxGBSizerItem/0"},{"type":"module","doc":"`m:wxGCDC` is a device context that draws on a `m:wxGraphicsContext`.\n\n`m:wxGCDC` does its best to implement `m:wxDC` API, but the following features are not\n(fully) implemented because `m:wxGraphicsContext` doesn't support them:\n\n* `wxDC:getPixel/2` method is not implemented and always returns false because modern graphics layers don't\nsupport retrieving the contents of the drawn pixels.\n\n* `wxDC:floodFill/4` method is not, and can't be, implemented, as its functionality relies on reading the\npixels from `m:wxGraphicsContext` too.\n\n* `wxDC:setLogicalFunction/2` method only works with `wxCOPY`, `wxOR`, `wxNO_OP`, `wxCLEAR` and `wxXOR` functions,\nattempts to use any other function (including `wxINVERT`) don't do anything.\n\n* Similarly, ?wxRasterOperationMode parameter of `wxDC:blit/6` and `StretchBlit()` (not implemented in\nwx) can only be one of the supported logical functions listed above, using any other\nfunction will result in an assertion failure and not drawing anything.\n\n* For Direct2D-based `m:wxGraphicsContext`, only true-type fonts can be used in the\nfont-related functions.\n\nSee:\n* `m:wxDC`\n\n* `m:wxGraphicsContext`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxGCDC](https://docs.wxwidgets.org/3.2/classwx_g_c_d_c.html)","title":"wxGCDC","ref":"wxGCDC.html"},{"type":"function","doc":"Destroys the object","title":"wxGCDC.destroy/1","ref":"wxGCDC.html#destroy/1"},{"type":"function","doc":"Retrieves associated `m:wxGraphicsContext`.","title":"wxGCDC.getGraphicsContext/1","ref":"wxGCDC.html#getGraphicsContext/1"},{"type":"function","doc":"","title":"wxGCDC.new/0","ref":"wxGCDC.html#new/0"},{"type":"function","doc":"Constructs a `m:wxGCDC` from a `m:wxWindowDC`.","title":"wxGCDC.new/1","ref":"wxGCDC.html#new/1"},{"type":"function","doc":"Set the graphics context to be used for this `m:wxGCDC`.\n\nNote that this object takes ownership of `context` and will delete it when it is\ndestroyed or when `setGraphicsContext/2` is called again.\n\nAlso, unlike the constructor taking `m:wxGraphicsContext`, this method will reapply the\ncurrent font, pen and brush, so that this object continues to use them, if they had been\nchanged before (which is never the case when constructing `m:wxGCDC` directly from `m:wxGraphicsContext`).","title":"wxGCDC.setGraphicsContext/2","ref":"wxGCDC.html#setGraphicsContext/2"},{"type":"type","doc":"","title":"wxGCDC.wxGCDC/0","ref":"wxGCDC.html#t:wxGCDC/0"},{"type":"module","doc":"`m:wxGLCanvas` is a class for displaying OpenGL graphics.\n\nIt is always used in conjunction with `m:wxGLContext` as the context can only be made\ncurrent (i.e. active for the OpenGL commands) when it is associated to a `m:wxGLCanvas`.\n\nMore precisely, you first need to create a `m:wxGLCanvas` window and then create an\ninstance of a `m:wxGLContext` that is initialized with this `m:wxGLCanvas` and then later\nuse either `setCurrent/2` with the instance of the `m:wxGLContext` or `wxGLContext:setCurrent/2` with the instance of the `m:wxGLCanvas`\n(which might be not the same as was used for the creation of the context) to bind the\nOpenGL state that is represented by the rendering context to the canvas, and then finally\ncall `swapBuffers/1` to swap the buffers of the OpenGL canvas and thus show your current output.\n\nPlease note that `m:wxGLContext` always uses physical pixels, even on the platforms where `m:wxWindow`\nuses logical pixels, affected by the coordinate scaling, on high DPI displays. Thus, if\nyou want to set the OpenGL view port to the size of entire window, you must multiply the\nresult returned by `wxWindow:getClientSize/1` by `wxWindow:getContentScaleFactor/1` before passing it to `glViewport()`. Same considerations apply to\nother OpenGL functions and other coordinates, notably those retrieved from `m:wxMouseEvent`\nin the event handlers.\n\nNotice that versions of wxWidgets previous to 2.9 used to implicitly create a `m:wxGLContext`\ninside `m:wxGLCanvas` itself. This is still supported in the current version but is\ndeprecated now and will be removed in the future, please update your code to create the\nrendering contexts explicitly.\n\nTo set up the attributes for the canvas (number of bits for the depth buffer, number of\nbits for the stencil buffer and so on) you pass them in the constructor using a `wxGLAttributes`\n(not implemented in wx) instance. You can still use the way before 3.1.0 (setting up the\ncorrect values of the `attribList` parameter) but it's discouraged.\n\nNote: On those platforms which use a configure script (e.g. Linux and macOS) OpenGL\nsupport is automatically enabled if the relative headers and libraries are found. To\nswitch it on under the other platforms (e.g. Windows), you need to edit the `setup.h` file\nand set `wxUSE_GLCANVAS` to `1` and then also pass `USE_OPENGL=1` to the make utility. You\nmay also need to add `opengl32.lib` (and `glu32.lib` for old OpenGL versions) to the list\nof the libraries your program is linked with.\n\nSee: `m:wxGLContext`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGLCanvas](https://docs.wxwidgets.org/3.2/classwx_g_l_canvas.html)","title":"wxGLCanvas","ref":"wxGLCanvas.html"},{"type":"function","doc":"","title":"wxGLCanvas.createSurface/1","ref":"wxGLCanvas.html#createSurface/1"},{"type":"function","doc":"Destroys the object","title":"wxGLCanvas.destroy/1","ref":"wxGLCanvas.html#destroy/1"},{"type":"function","doc":"Determines if a canvas having the specified attributes is available.\n\nThis only applies for visual attributes, not rendering context attributes. Please, use\nthe new form of this method, using `wxGLAttributes` (not implemented in wx).\n\nReturn: true if attributes are supported.","title":"wxGLCanvas.isDisplaySupported/1","ref":"wxGLCanvas.html#isDisplaySupported/1"},{"type":"function","doc":"","title":"wxGLCanvas.new/1","ref":"wxGLCanvas.html#new/1"},{"type":"function","doc":"This constructor is still available only for compatibility reasons.\n\nPlease use the constructor with `wxGLAttributes` (not implemented in wx) instead.\n\nIf `attribList` is not specified, `wxGLAttributes::PlatformDefaults()` (not implemented\nin wx) is used, plus some other attributes (see below).","title":"wxGLCanvas.new/2","ref":"wxGLCanvas.html#new/2"},{"type":"function","doc":"Makes the OpenGL state that is represented by the OpenGL rendering context `context`\ncurrent, i.e.\n\nit will be used by all subsequent OpenGL calls.\n\nThis is equivalent to `wxGLContext:setCurrent/2` called with this window as parameter.\n\nNote: This function may only be called when the window is shown on screen, in particular\nit can't usually be called from the constructor as the window isn't yet shown at this moment.\n\nReturn: false if an error occurred.","title":"wxGLCanvas.setCurrent/2","ref":"wxGLCanvas.html#setCurrent/2"},{"type":"function","doc":"Swaps the double-buffer of this window, making the back-buffer the front-buffer and vice\nversa, so that the output of the previous OpenGL commands is displayed on the window.\n\nReturn: false if an error occurred.","title":"wxGLCanvas.swapBuffers/1","ref":"wxGLCanvas.html#swapBuffers/1"},{"type":"type","doc":"","title":"wxGLCanvas.wxGLCanvas/0","ref":"wxGLCanvas.html#t:wxGLCanvas/0"},{"type":"module","doc":"An instance of a `m:wxGLContext` represents the state of an OpenGL state machine and the\nconnection between OpenGL and the system.\n\nThe OpenGL state includes everything that can be set with the OpenGL API: colors,\nrendering variables, buffer data ids, texture objects, etc. It is possible to have\nmultiple rendering contexts share buffer data and textures. This feature is specially\nuseful when the application use multiple threads for updating data into the memory of the\ngraphics card.\n\nWhether one only rendering context is used with or bound to multiple output windows or if\neach window has its own bound context is a developer decision. It is important to take\ninto account that GPU makers may set different pointers to the same OGL function for\ndifferent contexts. The way these pointers are retrieved from the OGL driver should be\nused again for each new context.\n\nBinding (making current) a rendering context with another instance of a `m:wxGLCanvas`\nhowever works only if the both `m:wxGLCanvas` instances were created with the same attributes.\n\nOpenGL version 3 introduced a new type of specification profile, the modern core profile.\nThe old compatibility profile maintains all legacy features. Since wxWidgets 3.1.0 you can\nchoose the type of context and even ask for a specified OGL version number. However, its\nadvised to use only core profile as the compatibility profile may run a bit slower.\n\nOpenGL core profile specification defines several flags at context creation that\ndetermine not only the type of context but also some features. Some of these flags can be\nset in the list of attributes used at `m:wxGLCanvas` ctor. But since wxWidgets 3.1.0 it is\nstrongly encouraged to use the new mechanism: setting the context attributes with a `wxGLContextAttrs`\n(not implemented in wx) object and the canvas attributes with a `wxGLAttributes` (not\nimplemented in wx) object.\n\nThe best way of knowing if your OpenGL environment supports a specific type of context is\ncreating a `m:wxGLContext` instance and checking `isOK/1`. If it returns false, then simply delete\nthat instance and create a new one with other attributes.\n\nwxHAS_OPENGL_ES is defined on platforms that only have this implementation available\n(e.g. the iPhone) and don't support the full specification.\n\nSee: `m:wxGLCanvas`\n\nwxWidgets docs: [wxGLContext](https://docs.wxwidgets.org/3.2/classwx_g_l_context.html)","title":"wxGLContext","ref":"wxGLContext.html"},{"type":"function","doc":"Destroys the object","title":"wxGLContext.destroy/1","ref":"wxGLContext.html#destroy/1"},{"type":"function","doc":"Checks if the underlying OpenGL rendering context was correctly created by the system\nwith the requested attributes.\n\nIf this function returns false then the `m:wxGLContext` object is useless and should be\ndeleted and recreated with different attributes.\n\nSince: 3.1.0","title":"wxGLContext.isOK/1","ref":"wxGLContext.html#isOK/1"},{"type":"function","doc":"","title":"wxGLContext.new/1","ref":"wxGLContext.html#new/1"},{"type":"function","doc":"Constructor.","title":"wxGLContext.new/2","ref":"wxGLContext.html#new/2"},{"type":"function","doc":"Makes the OpenGL state that is represented by this rendering context current with the `m:wxGLCanvas`\n`win`.\n\nNote: `win` can be a different `m:wxGLCanvas` window than the one that was passed to the\nconstructor of this rendering context. If `RC` is an object of type `m:wxGLContext`, the\nstatements `\"RC.SetCurrent(win);\"` and `\"win.SetCurrent(RC);\"` are equivalent, see `wxGLCanvas:setCurrent/2`.","title":"wxGLContext.setCurrent/2","ref":"wxGLContext.html#setCurrent/2"},{"type":"type","doc":"","title":"wxGLContext.wxGLContext/0","ref":"wxGLContext.html#t:wxGLContext/0"},{"type":"module","doc":"A gauge is a horizontal or vertical bar which shows a quantity (often time).\n\n`m:wxGauge` supports two working modes: determinate and indeterminate progress.\n\nThe first is the usual working mode (see `setValue/2` and `setRange/2`) while the second can be used when the\nprogram is doing some processing but you don't know how much progress is being done. In\nthis case, you can periodically call the `pulse/1` function to make the progress bar switch to\nindeterminate mode (graphically it's usually a set of blocks which move or bounce in the\nbar control).\n\n`m:wxGauge` supports dynamic switch between these two work modes.\n\nThere are no user commands for the gauge.","title":"wxGauge","ref":"wxGauge.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxGA_HORIZONTAL: Creates a horizontal gauge.\n\n* wxGA_VERTICAL: Creates a vertical gauge.\n\n* wxGA_SMOOTH: Creates smooth progress bar with one pixel wide update step (not supported\nby all platforms).\n\n* wxGA_TEXT: Display the current value in percents in the gauge itself. This style is only\nsupported in wxQt and ignored under the other platforms. This flag is only available in\nwxWidgets 3.1.0 and later.\n\n* wxGA_PROGRESS: Reflect the value of gauge in the application taskbar button under Windows\n7 and later and the dock icon under macOS, ignored under the other platforms. This flag is\nonly available in wxWidgets 3.1.0 and later.\n\nSee:\n* `m:wxSlider`\n\n* `m:wxScrollBar`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGauge](https://docs.wxwidgets.org/3.2/classwx_gauge.html)","title":"Styles - wxGauge","ref":"wxGauge.html#module-styles"},{"type":"function","doc":"","title":"wxGauge.create/4","ref":"wxGauge.html#create/4"},{"type":"function","doc":"Creates the gauge for two-step construction.\n\nSee `new/4` for further details.","title":"wxGauge.create/5","ref":"wxGauge.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxGauge.destroy/1","ref":"wxGauge.html#destroy/1"},{"type":"function","doc":"Returns the maximum position of the gauge.\n\nSee: `setRange/2`","title":"wxGauge.getRange/1","ref":"wxGauge.html#getRange/1"},{"type":"function","doc":"Returns the current position of the gauge.\n\nSee: `setValue/2`","title":"wxGauge.getValue/1","ref":"wxGauge.html#getValue/1"},{"type":"function","doc":"Returns true if the gauge is vertical (has `wxGA_VERTICAL` style) and false otherwise.","title":"wxGauge.isVertical/1","ref":"wxGauge.html#isVertical/1"},{"type":"function","doc":"Default constructor.","title":"wxGauge.new/0","ref":"wxGauge.html#new/0"},{"type":"function","doc":"","title":"wxGauge.new/3","ref":"wxGauge.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a gauge.\n\nSee: `create/5`","title":"wxGauge.new/4","ref":"wxGauge.html#new/4"},{"type":"function","doc":"Switch the gauge to indeterminate mode (if required) and makes the gauge move a bit to\nindicate the user that some progress has been made.\n\nNote: After calling this function the value returned by `getValue/1` is undefined and thus you need\nto explicitly call `setValue/2` if you want to restore the determinate mode.","title":"wxGauge.pulse/1","ref":"wxGauge.html#pulse/1"},{"type":"function","doc":"Sets the range (maximum value) of the gauge.\n\nThis function makes the gauge switch to determinate mode, if it's not already.\n\nWhen the gauge is in indeterminate mode, under wxMSW the gauge repeatedly goes from zero\nto `range` and back; under other ports when in indeterminate mode, the `range` setting is ignored.\n\nSee: `getRange/1`","title":"wxGauge.setRange/2","ref":"wxGauge.html#setRange/2"},{"type":"function","doc":"Sets the position of the gauge.\n\nThe `pos` must be between 0 and the gauge range as returned by `getRange/1`, inclusive.\n\nThis function makes the gauge switch to determinate mode, if it was in indeterminate mode before.\n\nSee: `getValue/1`","title":"wxGauge.setValue/2","ref":"wxGauge.html#setValue/2"},{"type":"type","doc":"","title":"wxGauge.wxGauge/0","ref":"wxGauge.html#t:wxGauge/0"},{"type":"module","doc":"This control can be used to place a directory listing (with optional files) on an\narbitrary window.\n\nThe control contains a `m:wxTreeCtrl` window representing the directory hierarchy, and\noptionally, a `m:wxChoice` window containing a list of filters.","title":"wxGenericDirCtrl","ref":"wxGenericDirCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxDIRCTRL_DIR_ONLY: Only show directories, and not files.\n\n* wxDIRCTRL_3D_INTERNAL: Use 3D borders for internal controls. This is the default.\n\n* wxDIRCTRL_SELECT_FIRST: When setting the default path, select the first file in the\ndirectory.\n\n* wxDIRCTRL_SHOW_FILTERS: Show the drop-down filter list.\n\n* wxDIRCTRL_EDIT_LABELS: Allow the folder and file labels to be editable.\n\n* wxDIRCTRL_MULTIPLE: Allows multiple files and folders to be selected.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGenericDirCtrl](https://docs.wxwidgets.org/3.2/classwx_generic_dir_ctrl.html)","title":"Styles - wxGenericDirCtrl","ref":"wxGenericDirCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`dirctrl_selectionchanged`](`m:wxTreeEvent`)\n\n* [`dirctrl_fileactivated`](`m:wxTreeEvent`)","title":"Events - wxGenericDirCtrl","ref":"wxGenericDirCtrl.html#module-events"},{"type":"function","doc":"Collapses the entire tree.","title":"wxGenericDirCtrl.collapseTree/1","ref":"wxGenericDirCtrl.html#collapseTree/1"},{"type":"function","doc":"","title":"wxGenericDirCtrl.create/2","ref":"wxGenericDirCtrl.html#create/2"},{"type":"function","doc":"Create function for two-step construction.\n\nSee `new/2` for details.","title":"wxGenericDirCtrl.create/3","ref":"wxGenericDirCtrl.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxGenericDirCtrl.destroy/1","ref":"wxGenericDirCtrl.html#destroy/1"},{"type":"function","doc":"Tries to expand as much of the given `path` as possible, so that the filename or\ndirectory is visible in the tree control.","title":"wxGenericDirCtrl.expandPath/2","ref":"wxGenericDirCtrl.html#expandPath/2"},{"type":"function","doc":"Gets the default path.","title":"wxGenericDirCtrl.getDefaultPath/1","ref":"wxGenericDirCtrl.html#getDefaultPath/1"},{"type":"function","doc":"Gets selected filename path only (else empty string).\n\nThis function doesn't count a directory as a selection.","title":"wxGenericDirCtrl.getFilePath/1","ref":"wxGenericDirCtrl.html#getFilePath/1"},{"type":"function","doc":"Returns the filter string.","title":"wxGenericDirCtrl.getFilter/1","ref":"wxGenericDirCtrl.html#getFilter/1"},{"type":"function","doc":"Returns the current filter index (zero-based).","title":"wxGenericDirCtrl.getFilterIndex/1","ref":"wxGenericDirCtrl.html#getFilterIndex/1"},{"type":"function","doc":"Gets the currently-selected directory or filename.","title":"wxGenericDirCtrl.getPath/1","ref":"wxGenericDirCtrl.html#getPath/1"},{"type":"function","doc":"Gets the path corresponding to the given tree control item.\n\nSince: 2.9.5","title":"wxGenericDirCtrl.getPath/2","ref":"wxGenericDirCtrl.html#getPath/2"},{"type":"function","doc":"Returns the root id for the tree control.","title":"wxGenericDirCtrl.getRootId/1","ref":"wxGenericDirCtrl.html#getRootId/1"},{"type":"function","doc":"Returns a pointer to the tree control.","title":"wxGenericDirCtrl.getTreeCtrl/1","ref":"wxGenericDirCtrl.html#getTreeCtrl/1"},{"type":"function","doc":"Initializes variables.","title":"wxGenericDirCtrl.init/1","ref":"wxGenericDirCtrl.html#init/1"},{"type":"function","doc":"Default constructor.","title":"wxGenericDirCtrl.new/0","ref":"wxGenericDirCtrl.html#new/0"},{"type":"function","doc":"","title":"wxGenericDirCtrl.new/1","ref":"wxGenericDirCtrl.html#new/1"},{"type":"function","doc":"Main constructor.","title":"wxGenericDirCtrl.new/2","ref":"wxGenericDirCtrl.html#new/2"},{"type":"function","doc":"Collapse and expand the tree, thus re-creating it from scratch.\n\nMay be used to update the displayed directory content.","title":"wxGenericDirCtrl.reCreateTree/1","ref":"wxGenericDirCtrl.html#reCreateTree/1"},{"type":"function","doc":"Sets the default path.","title":"wxGenericDirCtrl.setDefaultPath/2","ref":"wxGenericDirCtrl.html#setDefaultPath/2"},{"type":"function","doc":"Sets the filter string.","title":"wxGenericDirCtrl.setFilter/2","ref":"wxGenericDirCtrl.html#setFilter/2"},{"type":"function","doc":"Sets the current filter index (zero-based).","title":"wxGenericDirCtrl.setFilterIndex/2","ref":"wxGenericDirCtrl.html#setFilterIndex/2"},{"type":"function","doc":"Sets the current path.","title":"wxGenericDirCtrl.setPath/2","ref":"wxGenericDirCtrl.html#setPath/2"},{"type":"type","doc":"","title":"wxGenericDirCtrl.wxGenericDirCtrl/0","ref":"wxGenericDirCtrl.html#t:wxGenericDirCtrl/0"},{"type":"module","doc":"A `m:wxGraphicsBrush` is a native representation of a brush.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createBrush/2` or `wxGraphicsRenderer:createBrush/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsBrush](https://docs.wxwidgets.org/3.2/classwx_graphics_brush.html)","title":"wxGraphicsBrush","ref":"wxGraphicsBrush.html"},{"type":"type","doc":"","title":"wxGraphicsBrush.wxGraphicsBrush/0","ref":"wxGraphicsBrush.html#t:wxGraphicsBrush/0"},{"type":"module","doc":"A `m:wxGraphicsContext` instance is the object that is drawn upon.\n\nIt is created by a renderer using `wxGraphicsRenderer:createContext/2`. This can be either directly using a renderer\ninstance, or indirectly using the static convenience `create/1` functions of `m:wxGraphicsContext`\nthat always delegate the task to the default renderer.\n\nRemark: For some renderers (like Direct2D or Cairo) processing of drawing operations may\nbe deferred (Direct2D render target normally builds up a batch of rendering commands but\ndefers processing of these commands, Cairo operates on a separate surface) so to make\ndrawing results visible you need to update the content of the context by calling `wxGraphicsContext::Flush()`\n(not implemented in wx) or by destroying the context.\n\nSee:\n* `wxGraphicsRenderer:createContext/2`\n\n* `m:wxGCDC`\n\n* `m:wxDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsContext](https://docs.wxwidgets.org/3.2/classwx_graphics_context.html)","title":"wxGraphicsContext","ref":"wxGraphicsContext.html"},{"type":"function","doc":"Sets the clipping region to the intersection of the given region and the previously set\nclipping region.\n\nThe clipping region is an area to which drawing is restricted.\n\nRemark:\n\n* Clipping region should be given in logical coordinates.\n\n* Calling this function can only make the clipping region smaller, never larger.\n\n* You need to call `resetClip/1` first if you want to set the clipping region exactly to the region specified.\n\n* If resulting clipping region is empty, then all drawing upon the context is clipped out\n(all changes made by drawing operations are masked out).","title":"wxGraphicsContext.clip/2","ref":"wxGraphicsContext.html#clip/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxGraphicsContext.clip/5","ref":"wxGraphicsContext.html#clip/5"},{"type":"function","doc":"Concatenates the passed in transform with the current transform of this context.","title":"wxGraphicsContext.concatTransform/2","ref":"wxGraphicsContext.html#concatTransform/2"},{"type":"function","doc":"Create a lightweight context that can be used only for measuring text.","title":"wxGraphicsContext.create/0","ref":"wxGraphicsContext.html#create/0"},{"type":"function","doc":"Creates a `m:wxGraphicsContext` from a `m:wxWindowDC`.\n\nSee: `wxGraphicsRenderer:createContext/2`","title":"wxGraphicsContext.create/1","ref":"wxGraphicsContext.html#create/1"},{"type":"function","doc":"Creates a native brush from a `m:wxBrush`.","title":"wxGraphicsContext.createBrush/2","ref":"wxGraphicsContext.html#createBrush/2"},{"type":"function","doc":"","title":"wxGraphicsContext.createFont/2","ref":"wxGraphicsContext.html#createFont/2"},{"type":"function","doc":"Creates a native graphics font from a `m:wxFont` and a text colour.\n\nRemark: For Direct2D graphics fonts can be created from TrueType fonts only.","title":"wxGraphicsContext.createFont/3","ref":"wxGraphicsContext.html#createFont/3"},{"type":"function","doc":"Creates a font object with the specified attributes.\n\nThe use of overload taking `m:wxFont` is preferred, see `wxGraphicsRenderer:createFont/4` for more details.\n\nRemark: For Direct2D graphics fonts can be created from TrueType fonts only.\n\nSince: 2.9.3","title":"wxGraphicsContext.createFont/4","ref":"wxGraphicsContext.html#createFont/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxGraphicsContext.createLinearGradientBrush/6","ref":"wxGraphicsContext.html#createLinearGradientBrush/6"},{"type":"function","doc":"` Creates a native brush with a linear gradient. The brush starts at (@a x1, @a y1) and\nends at (@a x2, @a y2). Either just the start and end gradient colours (@a c1 and @a c2)\nor full set of gradient @a stops can be specified. The version taking\nwxGraphicsGradientStops is new in wxWidgets 2.9.1. `\nThe `matrix` parameter was added in wxWidgets 3.1.3","title":"wxGraphicsContext.createLinearGradientBrush/7","ref":"wxGraphicsContext.html#createLinearGradientBrush/7"},{"type":"function","doc":"","title":"wxGraphicsContext.createMatrix/1","ref":"wxGraphicsContext.html#createMatrix/1"},{"type":"function","doc":"Creates a native affine transformation matrix from the passed in values.\n\nThe default parameters result in an identity matrix.","title":"wxGraphicsContext.createMatrix/2","ref":"wxGraphicsContext.html#createMatrix/2"},{"type":"function","doc":"Creates a native graphics path which is initially empty.","title":"wxGraphicsContext.createPath/1","ref":"wxGraphicsContext.html#createPath/1"},{"type":"function","doc":"Creates a native pen from a `m:wxPen`.\n\nPrefer to use the overload taking `wxGraphicsPenInfo` (not implemented in wx) unless you\nalready have a `m:wxPen` as constructing one only to pass it to this method is wasteful.","title":"wxGraphicsContext.createPen/2","ref":"wxGraphicsContext.html#createPen/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxGraphicsContext.createRadialGradientBrush/7","ref":"wxGraphicsContext.html#createRadialGradientBrush/7"},{"type":"function","doc":"` Creates a native brush with a radial gradient. The brush originates at (@a startX, @a\nstartY) and ends on a circle around (@a endX, @a endY) with the given @a radius. The\ngradient may be specified either by its start and end colours @a oColor and @a cColor or\nby a full set of gradient @a stops. The version taking wxGraphicsGradientStops is new in\nwxWidgets 2.9.1. `\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","title":"wxGraphicsContext.createRadialGradientBrush/8","ref":"wxGraphicsContext.html#createRadialGradientBrush/8"},{"type":"function","doc":"Destroys the object","title":"wxGraphicsContext.destroy/1","ref":"wxGraphicsContext.html#destroy/1"},{"type":"function","doc":"Draws the bitmap.\n\nIn case of a mono bitmap, this is treated as a mask and the current brushed is used for\nfilling.","title":"wxGraphicsContext.drawBitmap/6","ref":"wxGraphicsContext.html#drawBitmap/6"},{"type":"function","doc":"Draws an ellipse.","title":"wxGraphicsContext.drawEllipse/5","ref":"wxGraphicsContext.html#drawEllipse/5"},{"type":"function","doc":"Draws the icon.","title":"wxGraphicsContext.drawIcon/6","ref":"wxGraphicsContext.html#drawIcon/6"},{"type":"function","doc":"","title":"wxGraphicsContext.drawLines/2","ref":"wxGraphicsContext.html#drawLines/2"},{"type":"function","doc":"Draws a polygon.","title":"wxGraphicsContext.drawLines/3","ref":"wxGraphicsContext.html#drawLines/3"},{"type":"function","doc":"","title":"wxGraphicsContext.drawPath/2","ref":"wxGraphicsContext.html#drawPath/2"},{"type":"function","doc":"Draws the path by first filling and then stroking.","title":"wxGraphicsContext.drawPath/3","ref":"wxGraphicsContext.html#drawPath/3"},{"type":"function","doc":"Draws a rectangle.","title":"wxGraphicsContext.drawRectangle/5","ref":"wxGraphicsContext.html#drawRectangle/5"},{"type":"function","doc":"Draws a rounded rectangle.","title":"wxGraphicsContext.drawRoundedRectangle/6","ref":"wxGraphicsContext.html#drawRoundedRectangle/6"},{"type":"function","doc":"Draws text at the defined position.","title":"wxGraphicsContext.drawText/4","ref":"wxGraphicsContext.html#drawText/4"},{"type":"function","doc":"Draws text at the defined position.","title":"wxGraphicsContext.drawText/5","ref":"wxGraphicsContext.html#drawText/5"},{"type":"function","doc":"Draws text at the defined position.","title":"wxGraphicsContext.drawText/6","ref":"wxGraphicsContext.html#drawText/6"},{"type":"function","doc":"","title":"wxGraphicsContext.fillPath/2","ref":"wxGraphicsContext.html#fillPath/2"},{"type":"function","doc":"Fills the path with the current brush.","title":"wxGraphicsContext.fillPath/3","ref":"wxGraphicsContext.html#fillPath/3"},{"type":"function","doc":"Fills the `widths` array with the widths from the beginning of `text` to the\ncorresponding character of `text`.","title":"wxGraphicsContext.getPartialTextExtents/2","ref":"wxGraphicsContext.html#getPartialTextExtents/2"},{"type":"function","doc":"Gets the dimensions of the string using the currently selected font.","title":"wxGraphicsContext.getTextExtent/2","ref":"wxGraphicsContext.html#getTextExtent/2"},{"type":"function","doc":"Gets the current transformation matrix of this context.","title":"wxGraphicsContext.getTransform/1","ref":"wxGraphicsContext.html#getTransform/1"},{"type":"function","doc":"Resets the clipping to original shape.","title":"wxGraphicsContext.resetClip/1","ref":"wxGraphicsContext.html#resetClip/1"},{"type":"function","doc":"Rotates the current transformation matrix (in radians).","title":"wxGraphicsContext.rotate/2","ref":"wxGraphicsContext.html#rotate/2"},{"type":"function","doc":"Scales the current transformation matrix.","title":"wxGraphicsContext.scale/3","ref":"wxGraphicsContext.html#scale/3"},{"type":"function","doc":"Sets the brush for filling paths.","title":"wxGraphicsContext.setBrush/2","ref":"wxGraphicsContext.html#setBrush/2"},{"type":"function","doc":"Sets the font for drawing text.","title":"wxGraphicsContext.setFont/2","ref":"wxGraphicsContext.html#setFont/2"},{"type":"function","doc":"Sets the font for drawing text.\n\nRemark: For Direct2D only TrueType fonts can be used.","title":"wxGraphicsContext.setFont/3","ref":"wxGraphicsContext.html#setFont/3"},{"type":"function","doc":"Sets the pen used for stroking.","title":"wxGraphicsContext.setPen/2","ref":"wxGraphicsContext.html#setPen/2"},{"type":"function","doc":"Sets the current transformation matrix of this context.","title":"wxGraphicsContext.setTransform/2","ref":"wxGraphicsContext.html#setTransform/2"},{"type":"function","doc":"Strokes a single line.","title":"wxGraphicsContext.strokeLine/5","ref":"wxGraphicsContext.html#strokeLine/5"},{"type":"function","doc":"Stroke lines connecting all the points.\n\nUnlike the other overload of this function, this method draws a single polyline and not a\nnumber of disconnected lines.","title":"wxGraphicsContext.strokeLines/2","ref":"wxGraphicsContext.html#strokeLines/2"},{"type":"function","doc":"Strokes along a path with the current pen.","title":"wxGraphicsContext.strokePath/2","ref":"wxGraphicsContext.html#strokePath/2"},{"type":"function","doc":"Translates the current transformation matrix.","title":"wxGraphicsContext.translate/3","ref":"wxGraphicsContext.html#translate/3"},{"type":"type","doc":"","title":"wxGraphicsContext.wxGraphicsContext/0","ref":"wxGraphicsContext.html#t:wxGraphicsContext/0"},{"type":"module","doc":"A `m:wxGraphicsFont` is a native representation of a font.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createFont/4` or `wxGraphicsRenderer:createFont/4`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsFont](https://docs.wxwidgets.org/3.2/classwx_graphics_font.html)","title":"wxGraphicsFont","ref":"wxGraphicsFont.html"},{"type":"type","doc":"","title":"wxGraphicsFont.wxGraphicsFont/0","ref":"wxGraphicsFont.html#t:wxGraphicsFont/0"},{"type":"module","doc":"Represents a collection of wxGraphicGradientStop values for use with\nCreateLinearGradientBrush and CreateRadialGradientBrush.\n\nThe stops are maintained in order of position. If two or more stops are added with the\nsame position then the one(s) added later come later. This can be useful for producing\ndiscontinuities in the colour gradient.\n\nNotice that this class is write-once, you can't modify the stops once they had been added.\n\nSince: 2.9.1\n\nwxWidgets docs: [wxGraphicsGradientStops](https://docs.wxwidgets.org/3.2/classwx_graphics_gradient_stops.html)","title":"wxGraphicsGradientStops","ref":"wxGraphicsGradientStops.html"},{"type":"function","doc":"Add a new stop.","title":"wxGraphicsGradientStops.add/3","ref":"wxGraphicsGradientStops.html#add/3"},{"type":"function","doc":"Destroys the object","title":"wxGraphicsGradientStops.destroy/1","ref":"wxGraphicsGradientStops.html#destroy/1"},{"type":"function","doc":"Returns the number of stops.","title":"wxGraphicsGradientStops.getCount/1","ref":"wxGraphicsGradientStops.html#getCount/1"},{"type":"function","doc":"Returns the end colour.","title":"wxGraphicsGradientStops.getEndColour/1","ref":"wxGraphicsGradientStops.html#getEndColour/1"},{"type":"function","doc":"Returns the start colour.","title":"wxGraphicsGradientStops.getStartColour/1","ref":"wxGraphicsGradientStops.html#getStartColour/1"},{"type":"function","doc":"Returns the stop at the given index.","title":"wxGraphicsGradientStops.item/2","ref":"wxGraphicsGradientStops.html#item/2"},{"type":"function","doc":"","title":"wxGraphicsGradientStops.new/0","ref":"wxGraphicsGradientStops.html#new/0"},{"type":"function","doc":"Initializes the gradient stops with the given boundary colours.\n\nCreates a `m:wxGraphicsGradientStops` instance with start colour given by `startCol` and\nend colour given by `endCol`.","title":"wxGraphicsGradientStops.new/1","ref":"wxGraphicsGradientStops.html#new/1"},{"type":"function","doc":"Set the end colour to `col`.","title":"wxGraphicsGradientStops.setEndColour/2","ref":"wxGraphicsGradientStops.html#setEndColour/2"},{"type":"function","doc":"Set the start colour to `col`.","title":"wxGraphicsGradientStops.setStartColour/2","ref":"wxGraphicsGradientStops.html#setStartColour/2"},{"type":"type","doc":"","title":"wxGraphicsGradientStops.wxGraphicsGradientStops/0","ref":"wxGraphicsGradientStops.html#t:wxGraphicsGradientStops/0"},{"type":"module","doc":"A `m:wxGraphicsMatrix` is a native representation of an affine matrix.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createMatrix/2` or `wxGraphicsRenderer:createMatrix/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsMatrix](https://docs.wxwidgets.org/3.2/classwx_graphics_matrix.html)","title":"wxGraphicsMatrix","ref":"wxGraphicsMatrix.html"},{"type":"function","doc":"Concatenates the matrix passed with the current matrix.\n\nThe effect of the resulting transformation is to first apply the transformation in `t` to\nthe coordinates and then apply the transformation in the current matrix to the coordinates.","title":"wxGraphicsMatrix.concat/2","ref":"wxGraphicsMatrix.html#concat/2"},{"type":"function","doc":"Returns the component values of the matrix via the argument pointers.","title":"wxGraphicsMatrix.get/1","ref":"wxGraphicsMatrix.html#get/1"},{"type":"function","doc":"Inverts the matrix.","title":"wxGraphicsMatrix.invert/1","ref":"wxGraphicsMatrix.html#invert/1"},{"type":"function","doc":"Returns true if the elements of the transformation matrix are equal.","title":"wxGraphicsMatrix.isEqual/2","ref":"wxGraphicsMatrix.html#isEqual/2"},{"type":"function","doc":"Return true if this is the identity matrix.","title":"wxGraphicsMatrix.isIdentity/1","ref":"wxGraphicsMatrix.html#isIdentity/1"},{"type":"function","doc":"Rotates this matrix clockwise (in radians).","title":"wxGraphicsMatrix.rotate/2","ref":"wxGraphicsMatrix.html#rotate/2"},{"type":"function","doc":"Scales this matrix.","title":"wxGraphicsMatrix.scale/3","ref":"wxGraphicsMatrix.html#scale/3"},{"type":"function","doc":"","title":"wxGraphicsMatrix.set/1","ref":"wxGraphicsMatrix.html#set/1"},{"type":"function","doc":"Sets the matrix to the respective values (default values are the identity matrix).","title":"wxGraphicsMatrix.set/2","ref":"wxGraphicsMatrix.html#set/2"},{"type":"function","doc":"Applies this matrix to a distance (ie.\n\nperforms all transforms except translations).","title":"wxGraphicsMatrix.transformDistance/1","ref":"wxGraphicsMatrix.html#transformDistance/1"},{"type":"function","doc":"Applies this matrix to a point.","title":"wxGraphicsMatrix.transformPoint/1","ref":"wxGraphicsMatrix.html#transformPoint/1"},{"type":"function","doc":"Translates this matrix.","title":"wxGraphicsMatrix.translate/3","ref":"wxGraphicsMatrix.html#translate/3"},{"type":"type","doc":"","title":"wxGraphicsMatrix.wxGraphicsMatrix/0","ref":"wxGraphicsMatrix.html#t:wxGraphicsMatrix/0"},{"type":"module","doc":"This class is the superclass of native graphics objects like pens etc.\n\nIt allows reference counting. Not instantiated by user code.\n\nSee:\n* `m:wxGraphicsBrush`\n\n* `m:wxGraphicsPen`\n\n* `m:wxGraphicsMatrix`\n\n* `m:wxGraphicsPath`\n\nwxWidgets docs: [wxGraphicsObject](https://docs.wxwidgets.org/3.2/classwx_graphics_object.html)","title":"wxGraphicsObject","ref":"wxGraphicsObject.html"},{"type":"function","doc":"Destroys the object","title":"wxGraphicsObject.destroy/1","ref":"wxGraphicsObject.html#destroy/1"},{"type":"function","doc":"Returns the renderer that was used to create this instance, or NULL if it has not been\ninitialized yet.","title":"wxGraphicsObject.getRenderer/1","ref":"wxGraphicsObject.html#getRenderer/1"},{"type":"function","doc":"Return: false if this object is valid, otherwise returns true.","title":"wxGraphicsObject.isNull/1","ref":"wxGraphicsObject.html#isNull/1"},{"type":"type","doc":"","title":"wxGraphicsObject.wxGraphicsObject/0","ref":"wxGraphicsObject.html#t:wxGraphicsObject/0"},{"type":"module","doc":"A `m:wxGraphicsPath` is a native representation of a geometric path.\n\nThe contents are specific and private to the respective renderer. Instances are reference\ncounted and can therefore be assigned as usual. The only way to get a valid instance is by\nusing `wxGraphicsContext:createPath/1` or `wxGraphicsRenderer:createPath/1`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsPath](https://docs.wxwidgets.org/3.2/classwx_graphics_path.html)","title":"wxGraphicsPath","ref":"wxGraphicsPath.html"},{"type":"function","doc":"","title":"wxGraphicsPath.addArc/6","ref":"wxGraphicsPath.html#addArc/6"},{"type":"function","doc":"Adds an arc of a circle.\n\nThe circle is defined by the coordinates of its centre (`x`, `y`) or `c` and its radius `r`.\nThe arc goes from the starting angle `startAngle` to `endAngle` either clockwise or\ncounter-clockwise depending on the value of `clockwise` argument.\n\nThe angles are measured in radians but, contrary to the usual mathematical convention,\nare always `clockwise` from the horizontal axis.\n\nIf for clockwise arc `endAngle` is less than `startAngle` it will be progressively\nincreased by 2*pi until it is greater than `startAngle`. If for counter-clockwise arc `endAngle`\nis greater than `startAngle` it will be progressively decreased by 2*pi until it is less\nthan `startAngle`.\n\nIf there is a current point set, an initial line segment will be added to the path to\nconnect the current point to the beginning of the arc.","title":"wxGraphicsPath.addArc/7","ref":"wxGraphicsPath.html#addArc/7"},{"type":"function","doc":"Adds an arc (of a circle with radius `r`) that is tangent to the line connecting current\npoint and (`x1`, `y1`) and to the line connecting (`x1`, `y1`) and (`x2`, `y2`).\n\nIf the current point and the starting point of the arc are different, a straight line\nconnecting these points is also appended. If there is no current point before the call to `addArcToPoint/6`\nthis function will behave as if preceded by a call to MoveToPoint(0, 0). After this call\nthe current point will be at the ending point of the arc.","title":"wxGraphicsPath.addArcToPoint/6","ref":"wxGraphicsPath.html#addArcToPoint/6"},{"type":"function","doc":"Appends a circle around (`x`,`y`) with radius `r` as a new closed subpath.\n\nAfter this call the current point will be at (x+`r`, `y`).","title":"wxGraphicsPath.addCircle/4","ref":"wxGraphicsPath.html#addCircle/4"},{"type":"function","doc":"Adds a cubic bezier curve from the current point, using two control points and an end\npoint.\n\nIf there is no current point before the call to `addCurveToPoint/7` this function will behave as if preceded\nby a call to MoveToPoint(`c1`).","title":"wxGraphicsPath.addCurveToPoint/4","ref":"wxGraphicsPath.html#addCurveToPoint/4"},{"type":"function","doc":"Adds a cubic bezier curve from the current point, using two control points and an end\npoint.\n\nIf there is no current point before the call to `addCurveToPoint/7` this function will behave as if preceded\nby a call to MoveToPoint(`cx1`, `cy1`).","title":"wxGraphicsPath.addCurveToPoint/7","ref":"wxGraphicsPath.html#addCurveToPoint/7"},{"type":"function","doc":"Appends an ellipse fitting into the passed in rectangle as a new closed subpath.\n\nAfter this call the current point will be at (x+`w`, y+`h/2`).","title":"wxGraphicsPath.addEllipse/5","ref":"wxGraphicsPath.html#addEllipse/5"},{"type":"function","doc":"Adds a straight line from the current point to `p`.\n\nIf current point is not yet set before the call to `addLineToPoint/3` this function will behave as `moveToPoint/3`.","title":"wxGraphicsPath.addLineToPoint/2","ref":"wxGraphicsPath.html#addLineToPoint/2"},{"type":"function","doc":"Adds a straight line from the current point to (`x`,`y`).\n\nIf current point is not yet set before the call to `addLineToPoint/3` this function will behave as `moveToPoint/3`.","title":"wxGraphicsPath.addLineToPoint/3","ref":"wxGraphicsPath.html#addLineToPoint/3"},{"type":"function","doc":"Adds another path onto the current path.\n\nAfter this call the current point will be at the added path's current point. For Direct2D\nthe path being appended shouldn't contain a started non-empty subpath when this function\nis called.","title":"wxGraphicsPath.addPath/2","ref":"wxGraphicsPath.html#addPath/2"},{"type":"function","doc":"Adds a quadratic bezier curve from the current point, using a control point and an end\npoint.\n\nIf there is no current point before the call to `addQuadCurveToPoint/5` this function will behave as if preceded\nby a call to MoveToPoint(`cx`, `cy`).","title":"wxGraphicsPath.addQuadCurveToPoint/5","ref":"wxGraphicsPath.html#addQuadCurveToPoint/5"},{"type":"function","doc":"Appends a rectangle as a new closed subpath.\n\nAfter this call the current point will be at (`x`, `y`).","title":"wxGraphicsPath.addRectangle/5","ref":"wxGraphicsPath.html#addRectangle/5"},{"type":"function","doc":"Appends a rounded rectangle as a new closed subpath.\n\nIf `radius` equals 0 this function will behave as `addRectangle/5`, otherwise after this call the current\npoint will be at (x+`w`, y+`h/2`).","title":"wxGraphicsPath.addRoundedRectangle/6","ref":"wxGraphicsPath.html#addRoundedRectangle/6"},{"type":"function","doc":"Closes the current sub-path.\n\nAfter this call the current point will be at the joined endpoint of the sub-path.","title":"wxGraphicsPath.closeSubpath/1","ref":"wxGraphicsPath.html#closeSubpath/1"},{"type":"function","doc":"","title":"wxGraphicsPath.contains/2","ref":"wxGraphicsPath.html#contains/2"},{"type":"function","doc":"Return: true if the point is within the path.","title":"wxGraphicsPath.contains/3","ref":"wxGraphicsPath.html#contains/3"},{"type":"function","doc":"Return: true if the point is within the path.","title":"wxGraphicsPath.contains/4","ref":"wxGraphicsPath.html#contains/4"},{"type":"function","doc":"Gets the bounding box enclosing all points (possibly including control points).","title":"wxGraphicsPath.getBox/1","ref":"wxGraphicsPath.html#getBox/1"},{"type":"function","doc":"Gets the last point of the current path, (0,0) if not yet set.","title":"wxGraphicsPath.getCurrentPoint/1","ref":"wxGraphicsPath.html#getCurrentPoint/1"},{"type":"function","doc":"Begins a new subpath at `p`.","title":"wxGraphicsPath.moveToPoint/2","ref":"wxGraphicsPath.html#moveToPoint/2"},{"type":"function","doc":"Begins a new subpath at (`x`,`y`).","title":"wxGraphicsPath.moveToPoint/3","ref":"wxGraphicsPath.html#moveToPoint/3"},{"type":"function","doc":"Transforms each point of this path by the matrix.\n\nFor Direct2D the current path shouldn't contain a started non-empty subpath when this\nfunction is called.","title":"wxGraphicsPath.transform/2","ref":"wxGraphicsPath.html#transform/2"},{"type":"type","doc":"","title":"wxGraphicsPath.wxGraphicsPath/0","ref":"wxGraphicsPath.html#t:wxGraphicsPath/0"},{"type":"module","doc":"A `m:wxGraphicsPen` is a native representation of a pen.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createPen/2` or `wxGraphicsRenderer::CreatePen()` (not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsPen](https://docs.wxwidgets.org/3.2/classwx_graphics_pen.html)","title":"wxGraphicsPen","ref":"wxGraphicsPen.html"},{"type":"type","doc":"","title":"wxGraphicsPen.wxGraphicsPen/0","ref":"wxGraphicsPen.html#t:wxGraphicsPen/0"},{"type":"module","doc":"A `m:wxGraphicsRenderer` is the instance corresponding to the rendering engine used.\n\nThere may be multiple instances on a system, if there are different rendering engines\npresent, but there is always only one instance per engine. This instance is pointed back\nto by all objects created by it (`m:wxGraphicsContext`, `m:wxGraphicsPath` etc.) and can\nbe retrieved through their `wxGraphicsObject:getRenderer/1` method. Therefore you can create an additional instance of a\npath etc. by calling `wxGraphicsObject:getRenderer/1` and then using the appropriate CreateXXX() function of that renderer.\n\nwxWidgets docs: [wxGraphicsRenderer](https://docs.wxwidgets.org/3.2/classwx_graphics_renderer.html)","title":"wxGraphicsRenderer","ref":"wxGraphicsRenderer.html"},{"type":"function","doc":"Creates a native brush from a `m:wxBrush`.","title":"wxGraphicsRenderer.createBrush/2","ref":"wxGraphicsRenderer.html#createBrush/2"},{"type":"function","doc":"Creates a `m:wxGraphicsContext` from a `m:wxWindowDC`.","title":"wxGraphicsRenderer.createContext/2","ref":"wxGraphicsRenderer.html#createContext/2"},{"type":"function","doc":"","title":"wxGraphicsRenderer.createFont/2","ref":"wxGraphicsRenderer.html#createFont/2"},{"type":"function","doc":"Creates a native graphics font from a `m:wxFont` and a text colour.","title":"wxGraphicsRenderer.createFont/3","ref":"wxGraphicsRenderer.html#createFont/3"},{"type":"function","doc":"Creates a graphics font with the given characteristics.\n\nIf possible, the `createFont/4` overload taking `m:wxFont` should be used instead. The main advantage\nof this overload is that it can be used without X server connection under Unix when using Cairo.\n\nSince: 2.9.3","title":"wxGraphicsRenderer.createFont/4","ref":"wxGraphicsRenderer.html#createFont/4"},{"type":"function","doc":"Creates a native brush with a linear gradient.\n\nStops support is new since wxWidgets 2.9.1, previously only the start and end colours\ncould be specified.\n\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","title":"wxGraphicsRenderer.createLinearGradientBrush/6","ref":"wxGraphicsRenderer.html#createLinearGradientBrush/6"},{"type":"function","doc":"","title":"wxGraphicsRenderer.createMatrix/1","ref":"wxGraphicsRenderer.html#createMatrix/1"},{"type":"function","doc":"Creates a native affine transformation matrix from the passed in values.\n\nThe defaults result in an identity matrix.","title":"wxGraphicsRenderer.createMatrix/2","ref":"wxGraphicsRenderer.html#createMatrix/2"},{"type":"function","doc":"Creates a native graphics path which is initially empty.","title":"wxGraphicsRenderer.createPath/1","ref":"wxGraphicsRenderer.html#createPath/1"},{"type":"function","doc":"Creates a native brush with a radial gradient.\n\nStops support is new since wxWidgets 2.9.1, previously only the start and end colours\ncould be specified.\n\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","title":"wxGraphicsRenderer.createRadialGradientBrush/7","ref":"wxGraphicsRenderer.html#createRadialGradientBrush/7"},{"type":"function","doc":"Returns the default renderer on this platform.\n\nOn macOS this is the Core Graphics (a.k.a. Quartz 2D) renderer, on MSW the GDIPlus\nrenderer, and on GTK we currently default to the Cairo renderer.","title":"wxGraphicsRenderer.getDefaultRenderer/0","ref":"wxGraphicsRenderer.html#getDefaultRenderer/0"},{"type":"type","doc":"","title":"wxGraphicsRenderer.wxGraphicsRenderer/0","ref":"wxGraphicsRenderer.html#t:wxGraphicsRenderer/0"},{"type":"module","doc":"`m:wxGrid` and its related classes are used for displaying and editing tabular data.\n\nThey provide a rich set of features for display, editing, and interacting with a variety\nof data sources. For simple applications, and to help you get started, `m:wxGrid` is the\nonly class you need to refer to directly. It will set up default instances of the other\nclasses and manage them for you. For more complex applications you can derive your own\nclasses for custom grid views, grid data tables, cell editors and renderers. The\noverview_grid has examples of simple and more complex applications, explains the\nrelationship between the various grid classes and has a summary of the keyboard shortcuts\nand mouse functions provided by `m:wxGrid`.\n\nA `wxGridTableBase` (not implemented in wx) class holds the actual data to be displayed\nby a `m:wxGrid` class. One or more `m:wxGrid` classes may act as a view for one table\nclass. The default table class is called `wxGridStringTable` (not implemented in wx) and\nholds an array of strings. An instance of such a class is created by `createGrid/4`.\n\n`m:wxGridCellRenderer` is the abstract base class for rendering contents in a cell. The\nfollowing renderers are predefined:\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\n* `wxGridCellDateRenderer` (not implemented in wx)\n\n* `wxGridCellDateTimeRenderer` (not implemented in wx)\n\nThe look of a cell can be further defined using `m:wxGridCellAttr`. An object of this\ntype may be returned by `wxGridTableBase::GetAttr()` (not implemented in wx).\n\n`m:wxGridCellEditor` is the abstract base class for editing the value of a cell. The\nfollowing editors are predefined:\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\n* `wxGridCellDateEditor` (not implemented in wx)\n\nPlease see `m:wxGridEvent`, `wxGridSizeEvent` (not implemented in wx), `wxGridRangeSelectEvent`\n(not implemented in wx), and `wxGridEditorCreatedEvent` (not implemented in wx) for the\ndocumentation of all event types you can use with `m:wxGrid`.\n\nSee: [Overview grid](https://docs.wxwidgets.org/3.2/overview_grid.html#overview_grid)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGrid](https://docs.wxwidgets.org/3.2/classwx_grid.html)","title":"wxGrid","ref":"wxGrid.html"},{"type":"function","doc":"","title":"wxGrid.appendCols/1","ref":"wxGrid.html#appendCols/1"},{"type":"function","doc":"Appends one or more new columns to the right of the grid.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::AppendCols()` (not implemented in wx).\nSee `insertCols/2` for further information.\n\nReturn: true on success or false if appending columns failed.","title":"wxGrid.appendCols/2","ref":"wxGrid.html#appendCols/2"},{"type":"function","doc":"","title":"wxGrid.appendRows/1","ref":"wxGrid.html#appendRows/1"},{"type":"function","doc":"Appends one or more new rows to the bottom of the grid.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::AppendRows()` (not implemented in wx).\nSee `insertRows/2` for further information.\n\nReturn: true on success or false if appending rows failed.","title":"wxGrid.appendRows/2","ref":"wxGrid.html#appendRows/2"},{"type":"function","doc":"Automatically sets the height and width of all rows and columns to fit their contents.","title":"wxGrid.autoSize/1","ref":"wxGrid.html#autoSize/1"},{"type":"function","doc":"","title":"wxGrid.autoSizeColumn/2","ref":"wxGrid.html#autoSizeColumn/2"},{"type":"function","doc":"Automatically sizes the column to fit its contents.\n\nIf `setAsMin` is true the calculated width will also be set as the minimal width for the\ncolumn.","title":"wxGrid.autoSizeColumn/3","ref":"wxGrid.html#autoSizeColumn/3"},{"type":"function","doc":"","title":"wxGrid.autoSizeColumns/1","ref":"wxGrid.html#autoSizeColumns/1"},{"type":"function","doc":"Automatically sizes all columns to fit their contents.\n\nIf `setAsMin` is true the calculated widths will also be set as the minimal widths for\nthe columns.","title":"wxGrid.autoSizeColumns/2","ref":"wxGrid.html#autoSizeColumns/2"},{"type":"function","doc":"","title":"wxGrid.autoSizeRow/2","ref":"wxGrid.html#autoSizeRow/2"},{"type":"function","doc":"Automatically sizes the row to fit its contents.\n\nIf `setAsMin` is true the calculated height will also be set as the minimal height for\nthe row.","title":"wxGrid.autoSizeRow/3","ref":"wxGrid.html#autoSizeRow/3"},{"type":"function","doc":"","title":"wxGrid.autoSizeRows/1","ref":"wxGrid.html#autoSizeRows/1"},{"type":"function","doc":"Automatically sizes all rows to fit their contents.\n\nIf `setAsMin` is true the calculated heights will also be set as the minimal heights for\nthe rows.","title":"wxGrid.autoSizeRows/2","ref":"wxGrid.html#autoSizeRows/2"},{"type":"function","doc":"Increments the grid's batch count.\n\nWhen the count is greater than zero repainting of the grid is suppressed. Each call to\nBeginBatch must be matched by a later call to `endBatch/1`. Code that does a lot of grid modification\ncan be enclosed between `beginBatch/1` and `endBatch/1` calls to avoid screen flicker. The final `endBatch/1` call will cause\nthe grid to be repainted.\n\nNotice that you should use `wxGridUpdateLocker` (not implemented in wx) which ensures\nthat there is always a matching `endBatch/1` call for this `beginBatch/1` if possible instead of calling this method\ndirectly.","title":"wxGrid.beginBatch/1","ref":"wxGrid.html#beginBatch/1"},{"type":"function","doc":"Convert grid cell coordinates to grid window pixel coordinates.\n\nThis function returns the rectangle that encloses the block of cells limited by `topLeft`\nand `bottomRight` cell in device coords and clipped to the client size of the grid window.\n\nSince: 3.1.3 Parameter `gridWindow` has been added.\n\nSee: `cellToRect/3`","title":"wxGrid.blockToDeviceRect/3","ref":"wxGrid.html#blockToDeviceRect/3"},{"type":"function","doc":"Return true if the dragging of cells is enabled or false otherwise.","title":"wxGrid.canDragCell/1","ref":"wxGrid.html#canDragCell/1"},{"type":"function","doc":"Returns true if columns can be moved by dragging with the mouse.\n\nColumns can be moved by dragging on their labels.","title":"wxGrid.canDragColMove/1","ref":"wxGrid.html#canDragColMove/1"},{"type":"function","doc":"Returns true if the given column can be resized by dragging with the mouse.\n\nThis function returns true if resizing the columns interactively is globally enabled,\ni.e. if `disableDragColSize/1` hadn't been called, and if this column wasn't explicitly marked as non-resizable\nwith `DisableColResize()` (not implemented in wx).","title":"wxGrid.canDragColSize/2","ref":"wxGrid.html#canDragColSize/2"},{"type":"function","doc":"Return true if row edges inside the grid can be dragged to resize the rows.\n\nSee:\n* `canDragGridSize/1`\n\n* `canDragRowSize/2`\n\nSince: 3.1.4","title":"wxGrid.canDragGridRowEdges/1","ref":"wxGrid.html#canDragGridRowEdges/1"},{"type":"function","doc":"Return true if the dragging of grid lines to resize rows and columns is enabled or false\notherwise.","title":"wxGrid.canDragGridSize/1","ref":"wxGrid.html#canDragGridSize/1"},{"type":"function","doc":"Returns true if the given row can be resized by dragging with the mouse.\n\nThis is the same as `canDragColSize/2` but for rows.","title":"wxGrid.canDragRowSize/2","ref":"wxGrid.html#canDragRowSize/2"},{"type":"function","doc":"Returns true if the in-place edit control for the current grid cell can be used and false\notherwise.\n\nThis function always returns false for the read-only cells.","title":"wxGrid.canEnableCellControl/1","ref":"wxGrid.html#canEnableCellControl/1"},{"type":"function","doc":"Return the rectangle corresponding to the grid cell's size and position in logical\ncoordinates.\n\nSee: `blockToDeviceRect/3`","title":"wxGrid.cellToRect/2","ref":"wxGrid.html#cellToRect/2"},{"type":"function","doc":"Return the rectangle corresponding to the grid cell's size and position in logical\ncoordinates.\n\nSee: `blockToDeviceRect/3`","title":"wxGrid.cellToRect/3","ref":"wxGrid.html#cellToRect/3"},{"type":"function","doc":"Clears all data in the underlying grid table and repaints the grid.\n\nThe table is not deleted by this function. If you are using a derived table class then\nyou need to override `wxGridTableBase::Clear()` (not implemented in wx) for this function\nto have any effect.","title":"wxGrid.clearGrid/1","ref":"wxGrid.html#clearGrid/1"},{"type":"function","doc":"Deselects all cells that are currently selected.","title":"wxGrid.clearSelection/1","ref":"wxGrid.html#clearSelection/1"},{"type":"function","doc":"","title":"wxGrid.createGrid/3","ref":"wxGrid.html#createGrid/3"},{"type":"function","doc":"Creates a grid with the specified initial number of rows and columns.\n\nCall this directly after the grid constructor. When you use this function `m:wxGrid` will\ncreate and manage a simple table of string values for you. All of the grid data will be\nstored in memory.\n\nFor applications with more complex data types or relationships, or for dealing with very\nlarge datasets, you should derive your own grid table class and pass a table object to the\ngrid with `SetTable()` (not implemented in wx) or `AssignTable()` (not implemented in wx).","title":"wxGrid.createGrid/4","ref":"wxGrid.html#createGrid/4"},{"type":"function","doc":"","title":"wxGrid.deleteCols/1","ref":"wxGrid.html#deleteCols/1"},{"type":"function","doc":"Deletes one or more columns from a grid starting at the specified position.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::DeleteCols()` (not implemented in wx).\nSee `insertCols/2` for further information.\n\nReturn: true on success or false if deleting columns failed.","title":"wxGrid.deleteCols/2","ref":"wxGrid.html#deleteCols/2"},{"type":"function","doc":"","title":"wxGrid.deleteRows/1","ref":"wxGrid.html#deleteRows/1"},{"type":"function","doc":"Deletes one or more rows from a grid starting at the specified position.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::DeleteRows()` (not implemented in wx).\nSee `insertRows/2` for further information.\n\nReturn: true on success or false if deleting rows failed.","title":"wxGrid.deleteRows/2","ref":"wxGrid.html#deleteRows/2"},{"type":"function","doc":"Destroys the object","title":"wxGrid.destroy/1","ref":"wxGrid.html#destroy/1"},{"type":"function","doc":"Disables in-place editing of grid cells.\n\nEquivalent to calling EnableCellEditControl(false).","title":"wxGrid.disableCellEditControl/1","ref":"wxGrid.html#disableCellEditControl/1"},{"type":"function","doc":"Disables column sizing by dragging with the mouse.\n\nEquivalent to passing false to `enableDragColSize/2`.","title":"wxGrid.disableDragColSize/1","ref":"wxGrid.html#disableDragColSize/1"},{"type":"function","doc":"Disable mouse dragging of grid lines to resize rows and columns.\n\nEquivalent to passing false to `enableDragGridSize/2`","title":"wxGrid.disableDragGridSize/1","ref":"wxGrid.html#disableDragGridSize/1"},{"type":"function","doc":"Disables row sizing by dragging with the mouse.\n\nEquivalent to passing false to `enableDragRowSize/2`.","title":"wxGrid.disableDragRowSize/1","ref":"wxGrid.html#disableDragRowSize/1"},{"type":"function","doc":"","title":"wxGrid.enableCellEditControl/1","ref":"wxGrid.html#enableCellEditControl/1"},{"type":"function","doc":"Enables or disables in-place editing of grid cell data.\n\nEnabling in-place editing generates `wxEVT_GRID_EDITOR_SHOWN` and, if it isn't vetoed by\nthe application, shows the in-place editor which allows the user to change the cell value.\n\nDisabling in-place editing does nothing if the in-place editor isn't currently shown,\notherwise the `wxEVT_GRID_EDITOR_HIDDEN` event is generated but, unlike the \"shown\" event,\nit can't be vetoed and the in-place editor is dismissed unconditionally.\n\nNote that it is an error to call this function if the current cell is read-only, use `canEnableCellControl/1` to\ncheck for this precondition.","title":"wxGrid.enableCellEditControl/2","ref":"wxGrid.html#enableCellEditControl/2"},{"type":"function","doc":"","title":"wxGrid.enableDragColSize/1","ref":"wxGrid.html#enableDragColSize/1"},{"type":"function","doc":"Enables or disables column sizing by dragging with the mouse.","title":"wxGrid.enableDragColSize/2","ref":"wxGrid.html#enableDragColSize/2"},{"type":"function","doc":"","title":"wxGrid.enableDragGridSize/1","ref":"wxGrid.html#enableDragGridSize/1"},{"type":"function","doc":"Enables or disables row and column resizing by dragging gridlines with the mouse.","title":"wxGrid.enableDragGridSize/2","ref":"wxGrid.html#enableDragGridSize/2"},{"type":"function","doc":"","title":"wxGrid.enableDragRowSize/1","ref":"wxGrid.html#enableDragRowSize/1"},{"type":"function","doc":"Enables or disables row sizing by dragging with the mouse.","title":"wxGrid.enableDragRowSize/2","ref":"wxGrid.html#enableDragRowSize/2"},{"type":"function","doc":"Makes the grid globally editable or read-only.\n\nIf the edit argument is false this function sets the whole grid as read-only. If the\nargument is true the grid is set to the default state where cells may be editable. In the\ndefault state you can set single grid cells and whole rows and columns to be editable or\nread-only via `wxGridCellAttr:setReadOnly/2`. For single cells you can also use the shortcut function `setReadOnly/4`.\n\nFor more information about controlling grid cell attributes see the `m:wxGridCellAttr`\nclass and the overview_grid.","title":"wxGrid.enableEditing/2","ref":"wxGrid.html#enableEditing/2"},{"type":"function","doc":"","title":"wxGrid.enableGridLines/1","ref":"wxGrid.html#enableGridLines/1"},{"type":"function","doc":"Turns the drawing of grid lines on or off.","title":"wxGrid.enableGridLines/2","ref":"wxGrid.html#enableGridLines/2"},{"type":"function","doc":"Decrements the grid's batch count.\n\nWhen the count is greater than zero repainting of the grid is suppressed. Each previous\ncall to `beginBatch/1` must be matched by a later call to `endBatch/1`. Code that does a lot of grid modification\ncan be enclosed between `beginBatch/1` and `endBatch/1` calls to avoid screen flicker. The final `endBatch/1` will cause the\ngrid to be repainted.","title":"wxGrid.endBatch/1","ref":"wxGrid.html#endBatch/1"},{"type":"function","doc":"Overridden `m:wxWindow` method.","title":"wxGrid.fit/1","ref":"wxGrid.html#fit/1"},{"type":"function","doc":"Causes immediate repainting of the grid.\n\nUse this instead of the usual `wxWindow:refresh/2`.","title":"wxGrid.forceRefresh/1","ref":"wxGrid.html#forceRefresh/1"},{"type":"function","doc":"Returns the number of times that `beginBatch/1` has been called without (yet) matching\ncalls to `endBatch/1`.\n\nWhile the grid's batch count is greater than zero the display will not be updated.","title":"wxGrid.getBatchCount/1","ref":"wxGrid.html#getBatchCount/1"},{"type":"function","doc":"Sets the arguments to the horizontal and vertical text alignment values for the grid cell\nat the specified location.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.getCellAlignment/3","ref":"wxGrid.html#getCellAlignment/3"},{"type":"function","doc":"Returns the background colour of the cell at the specified location.","title":"wxGrid.getCellBackgroundColour/3","ref":"wxGrid.html#getCellBackgroundColour/3"},{"type":"function","doc":"Returns a pointer to the editor for the cell at the specified location.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getCellEditor/3","ref":"wxGrid.html#getCellEditor/3"},{"type":"function","doc":"Returns the font for text in the grid cell at the specified location.","title":"wxGrid.getCellFont/3","ref":"wxGrid.html#getCellFont/3"},{"type":"function","doc":"Returns a pointer to the renderer for the grid cell at the specified location.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getCellRenderer/3","ref":"wxGrid.html#getCellRenderer/3"},{"type":"function","doc":"Returns the text colour for the grid cell at the specified location.","title":"wxGrid.getCellTextColour/3","ref":"wxGrid.html#getCellTextColour/3"},{"type":"function","doc":"Returns the string contained in the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `setCellValue/4` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanGetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","title":"wxGrid.getCellValue/2","ref":"wxGrid.html#getCellValue/2"},{"type":"function","doc":"Returns the string contained in the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `setCellValue/4` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanGetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","title":"wxGrid.getCellValue/3","ref":"wxGrid.html#getCellValue/3"},{"type":"function","doc":"Sets the arguments to the current column label alignment values.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.getColLabelAlignment/1","ref":"wxGrid.html#getColLabelAlignment/1"},{"type":"function","doc":"Returns the current height of the column labels.","title":"wxGrid.getColLabelSize/1","ref":"wxGrid.html#getColLabelSize/1"},{"type":"function","doc":"Returns the specified column label.\n\nThe default grid table class provides column labels of the form A,B...Z,AA,AB...ZZ,AAA...\nIf you are using a custom grid table you can override `wxGridTableBase::GetColLabelValue()`\n(not implemented in wx) to provide your own labels.","title":"wxGrid.getColLabelValue/2","ref":"wxGrid.html#getColLabelValue/2"},{"type":"function","doc":"Returns the minimal width to which a column may be resized.\n\nUse `setColMinimalAcceptableWidth/2` to change this value globally or `setColMinimalWidth/3` to do it for individual columns.\n\nSee: `getRowMinimalAcceptableHeight/1`","title":"wxGrid.getColMinimalAcceptableWidth/1","ref":"wxGrid.html#getColMinimalAcceptableWidth/1"},{"type":"function","doc":"Returns the default cell alignment.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.\n\nSee: `setDefaultCellAlignment/3`","title":"wxGrid.getDefaultCellAlignment/1","ref":"wxGrid.html#getDefaultCellAlignment/1"},{"type":"function","doc":"Returns the current default background colour for grid cells.","title":"wxGrid.getDefaultCellBackgroundColour/1","ref":"wxGrid.html#getDefaultCellBackgroundColour/1"},{"type":"function","doc":"Returns the current default font for grid cell text.","title":"wxGrid.getDefaultCellFont/1","ref":"wxGrid.html#getDefaultCellFont/1"},{"type":"function","doc":"Returns the current default colour for grid cell text.","title":"wxGrid.getDefaultCellTextColour/1","ref":"wxGrid.html#getDefaultCellTextColour/1"},{"type":"function","doc":"Returns the default height for column labels.","title":"wxGrid.getDefaultColLabelSize/1","ref":"wxGrid.html#getDefaultColLabelSize/1"},{"type":"function","doc":"Returns the current default width for grid columns.","title":"wxGrid.getDefaultColSize/1","ref":"wxGrid.html#getDefaultColSize/1"},{"type":"function","doc":"Returns a pointer to the current default grid cell editor.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","title":"wxGrid.getDefaultEditor/1","ref":"wxGrid.html#getDefaultEditor/1"},{"type":"function","doc":"Returns the default editor for the specified cell.\n\nThe base class version returns the editor appropriate for the current cell type but this\nmethod may be overridden in the derived classes to use custom editors for some cells by default.\n\nNotice that the same may be achieved in a usually simpler way by associating a custom\neditor with the given cell or cells.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getDefaultEditorForCell/2","ref":"wxGrid.html#getDefaultEditorForCell/2"},{"type":"function","doc":"Returns the default editor for the specified cell.\n\nThe base class version returns the editor appropriate for the current cell type but this\nmethod may be overridden in the derived classes to use custom editors for some cells by default.\n\nNotice that the same may be achieved in a usually simpler way by associating a custom\neditor with the given cell or cells.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getDefaultEditorForCell/3","ref":"wxGrid.html#getDefaultEditorForCell/3"},{"type":"function","doc":"Returns the default editor for the cells containing values of the given type.\n\nThe base class version returns the editor which was associated with the specified `typeName`\nwhen it was registered `registerDataType/4` but this function may be overridden to return something\ndifferent. This allows overriding an editor used for one of the standard types.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getDefaultEditorForType/2","ref":"wxGrid.html#getDefaultEditorForType/2"},{"type":"function","doc":"Returns a pointer to the current default grid cell renderer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getDefaultRenderer/1","ref":"wxGrid.html#getDefaultRenderer/1"},{"type":"function","doc":"Returns the default renderer for the given cell.\n\nThe base class version returns the renderer appropriate for the current cell type but\nthis method may be overridden in the derived classes to use custom renderers for some\ncells by default.\n\nThe caller must call DecRef() on the returned pointer.","title":"wxGrid.getDefaultRendererForCell/3","ref":"wxGrid.html#getDefaultRendererForCell/3"},{"type":"function","doc":"Returns the default renderer for the cell containing values of the given type.\n\nSee: `getDefaultEditorForType/2`","title":"wxGrid.getDefaultRendererForType/2","ref":"wxGrid.html#getDefaultRendererForType/2"},{"type":"function","doc":"Returns the default width for the row labels.","title":"wxGrid.getDefaultRowLabelSize/1","ref":"wxGrid.html#getDefaultRowLabelSize/1"},{"type":"function","doc":"Returns the current default height for grid rows.","title":"wxGrid.getDefaultRowSize/1","ref":"wxGrid.html#getDefaultRowSize/1"},{"type":"function","doc":"Return the column labels window.\n\nThis window is not shown if the columns labels were hidden using `HideColLabels()` (not\nimplemented in wx).\n\nDepending on whether `UseNativeColHeader()` (not implemented in wx) was called or not\nthis can be either a `wxHeaderCtrl` (not implemented in wx) or a plain `m:wxWindow`. This\nfunction returns a valid window pointer in either case but in the former case you can also\nuse `GetGridColHeader()` (not implemented in wx) to access it if you need\nwxHeaderCtrl-specific functionality.","title":"wxGrid.getGridColLabelWindow/1","ref":"wxGrid.html#getGridColLabelWindow/1"},{"type":"function","doc":"Return the window in the top left grid corner.\n\nThis window is shown only of both columns and row labels are shown and normally doesn't\ncontain anything. Clicking on it is handled by `m:wxGrid` however and can be used to\nselect the entire grid.","title":"wxGrid.getGridCornerLabelWindow/1","ref":"wxGrid.html#getGridCornerLabelWindow/1"},{"type":"function","doc":"Returns the current grid cell column position.","title":"wxGrid.getGridCursorCol/1","ref":"wxGrid.html#getGridCursorCol/1"},{"type":"function","doc":"Returns the current grid cell row position.","title":"wxGrid.getGridCursorRow/1","ref":"wxGrid.html#getGridCursorRow/1"},{"type":"function","doc":"Returns the colour used for grid lines.","title":"wxGrid.getGridLineColour/1","ref":"wxGrid.html#getGridLineColour/1"},{"type":"function","doc":"Return the row labels window.\n\nThis window is not shown if the row labels were hidden using `HideRowLabels()` (not\nimplemented in wx).","title":"wxGrid.getGridRowLabelWindow/1","ref":"wxGrid.html#getGridRowLabelWindow/1"},{"type":"function","doc":"Return the main grid window containing the grid cells.\n\nThis window is always shown.","title":"wxGrid.getGridWindow/1","ref":"wxGrid.html#getGridWindow/1"},{"type":"function","doc":"Returns the colour used for the background of row and column labels.","title":"wxGrid.getLabelBackgroundColour/1","ref":"wxGrid.html#getLabelBackgroundColour/1"},{"type":"function","doc":"Returns the font used for row and column labels.","title":"wxGrid.getLabelFont/1","ref":"wxGrid.html#getLabelFont/1"},{"type":"function","doc":"Returns the colour used for row and column label text.","title":"wxGrid.getLabelTextColour/1","ref":"wxGrid.html#getLabelTextColour/1"},{"type":"function","doc":"Returns the total number of grid columns.\n\nThis is the same as the number of columns in the underlying grid table.","title":"wxGrid.getNumberCols/1","ref":"wxGrid.html#getNumberCols/1"},{"type":"function","doc":"Returns the total number of grid rows.\n\nThis is the same as the number of rows in the underlying grid table.","title":"wxGrid.getNumberRows/1","ref":"wxGrid.html#getNumberRows/1"},{"type":"function","doc":"Returns the attribute for the given cell creating one if necessary.\n\nIf the cell already has an attribute, it is returned. Otherwise a new attribute is\ncreated, associated with the cell and returned. In any case the caller must call DecRef()\non the returned pointer.\n\nPrefer to use `GetOrCreateCellAttrPtr()` (not implemented in wx) to avoid the need to\ncall DecRef() on the returned pointer.\n\nThis function may only be called if `CanHaveAttributes()` (not implemented in wx) returns\ntrue.","title":"wxGrid.getOrCreateCellAttr/3","ref":"wxGrid.html#getOrCreateCellAttr/3"},{"type":"function","doc":"Returns the alignment used for row labels.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.getRowLabelAlignment/1","ref":"wxGrid.html#getRowLabelAlignment/1"},{"type":"function","doc":"Returns the current width of the row labels.","title":"wxGrid.getRowLabelSize/1","ref":"wxGrid.html#getRowLabelSize/1"},{"type":"function","doc":"Returns the specified row label.\n\nThe default grid table class provides numeric row labels. If you are using a custom grid\ntable you can override `wxGridTableBase::GetRowLabelValue()` (not implemented in wx) to\nprovide your own labels.","title":"wxGrid.getRowLabelValue/2","ref":"wxGrid.html#getRowLabelValue/2"},{"type":"function","doc":"Returns the minimal size to which rows can be resized.\n\nUse `setRowMinimalAcceptableHeight/2` to change this value globally or `setRowMinimalHeight/3` to do it for individual cells.\n\nSee: `getColMinimalAcceptableWidth/1`","title":"wxGrid.getRowMinimalAcceptableHeight/1","ref":"wxGrid.html#getRowMinimalAcceptableHeight/1"},{"type":"function","doc":"Returns the height of the specified row.","title":"wxGrid.getRowSize/2","ref":"wxGrid.html#getRowSize/2"},{"type":"function","doc":"Returns the number of pixels per horizontal scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineY/1`\n\n* `setScrollLineX/2`\n\n* `setScrollLineY/2`","title":"wxGrid.getScrollLineX/1","ref":"wxGrid.html#getScrollLineX/1"},{"type":"function","doc":"Returns the number of pixels per vertical scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `setScrollLineX/2`\n\n* `setScrollLineY/2`","title":"wxGrid.getScrollLineY/1","ref":"wxGrid.html#getScrollLineY/1"},{"type":"function","doc":"Returns an array of individually selected cells.\n\nNotice that this array does `not` contain all the selected cells in general as it doesn't\ninclude the cells selected as part of column, row or block selection. You must use this\nmethod, `getSelectedCols/1`, `getSelectedRows/1` and `getSelectionBlockTopLeft/1` and `getSelectionBlockBottomRight/1` methods to obtain the entire selection in general.\n\nPlease notice this behaviour is by design and is needed in order to support grids of\narbitrary size (when an entire column is selected in a grid with a million of columns, we\ndon't want to create an array with a million of entries in this function, instead it\nreturns an empty array and `getSelectedCols/1` returns an array containing one element).\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","title":"wxGrid.getSelectedCells/1","ref":"wxGrid.html#getSelectedCells/1"},{"type":"function","doc":"Returns an array of selected columns.\n\nPlease notice that this method alone is not sufficient to find all the selected columns\nas it contains only the columns which were individually selected but not those being part\nof the block selection or being selected in virtue of all of their cells being selected\nindividually, please see `getSelectedCells/1` for more details.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","title":"wxGrid.getSelectedCols/1","ref":"wxGrid.html#getSelectedCols/1"},{"type":"function","doc":"Returns an array of selected rows.\n\nPlease notice that this method alone is not sufficient to find all the selected rows as\nit contains only the rows which were individually selected but not those being part of the\nblock selection or being selected in virtue of all of their cells being selected\nindividually, please see `getSelectedCells/1` for more details.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","title":"wxGrid.getSelectedRows/1","ref":"wxGrid.html#getSelectedRows/1"},{"type":"function","doc":"Returns the colour used for drawing the selection background.","title":"wxGrid.getSelectionBackground/1","ref":"wxGrid.html#getSelectionBackground/1"},{"type":"function","doc":"Returns an array of the bottom right corners of blocks of selected cells.\n\nPlease see `getSelectedCells/1` for more information about the selection representation in `m:wxGrid`.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.\n\nSee: `getSelectionBlockTopLeft/1`","title":"wxGrid.getSelectionBlockBottomRight/1","ref":"wxGrid.html#getSelectionBlockBottomRight/1"},{"type":"function","doc":"Returns an array of the top left corners of blocks of selected cells.\n\nPlease see `getSelectedCells/1` for more information about the selection representation in `m:wxGrid`.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.\n\nSee: `getSelectionBlockBottomRight/1`","title":"wxGrid.getSelectionBlockTopLeft/1","ref":"wxGrid.html#getSelectionBlockTopLeft/1"},{"type":"function","doc":"Returns the colour used for drawing the selection foreground.","title":"wxGrid.getSelectionForeground/1","ref":"wxGrid.html#getSelectionForeground/1"},{"type":"function","doc":"Returns true if drawing of grid lines is turned on, false otherwise.","title":"wxGrid.gridLinesEnabled/1","ref":"wxGrid.html#gridLinesEnabled/1"},{"type":"function","doc":"Hides the in-place cell edit control.","title":"wxGrid.hideCellEditControl/1","ref":"wxGrid.html#hideCellEditControl/1"},{"type":"function","doc":"","title":"wxGrid.insertCols/1","ref":"wxGrid.html#insertCols/1"},{"type":"function","doc":"Inserts one or more new columns into a grid with the first new column at the specified\nposition.\n\nNotice that inserting the columns in the grid requires grid table cooperation: when this\nmethod is called, grid object begins by requesting the underlying grid table to insert new\ncolumns. If this is successful the table notifies the grid and the grid updates the\ndisplay. For a default grid (one where you have called `createGrid/4`) this process is automatic. If you\nare using a custom grid table (specified with `SetTable()` (not implemented in wx) or `AssignTable()`\n(not implemented in wx)) then you must override `wxGridTableBase::InsertCols()` (not\nimplemented in wx) in your derived table class.\n\nReturn: true if the columns were successfully inserted, false if an error occurred (most\nlikely the table couldn't be updated).","title":"wxGrid.insertCols/2","ref":"wxGrid.html#insertCols/2"},{"type":"function","doc":"","title":"wxGrid.insertRows/1","ref":"wxGrid.html#insertRows/1"},{"type":"function","doc":"Inserts one or more new rows into a grid with the first new row at the specified\nposition.\n\nNotice that you must implement `wxGridTableBase::InsertRows()` (not implemented in wx) if\nyou use a grid with a custom table, please see `insertCols/2` for more information.\n\nReturn: true if the rows were successfully inserted, false if an error occurred (most\nlikely the table couldn't be updated).","title":"wxGrid.insertRows/2","ref":"wxGrid.html#insertRows/2"},{"type":"function","doc":"Returns true if the in-place edit control is currently enabled.","title":"wxGrid.isCellEditControlEnabled/1","ref":"wxGrid.html#isCellEditControlEnabled/1"},{"type":"function","doc":"Returns true if the current cell is read-only.\n\nSee:\n* `setReadOnly/4`\n\n* `isReadOnly/3`","title":"wxGrid.isCurrentCellReadOnly/1","ref":"wxGrid.html#isCurrentCellReadOnly/1"},{"type":"function","doc":"Returns false if the whole grid has been set as read-only or true otherwise.\n\nSee `enableEditing/2` for more information about controlling the editing status of grid cells.","title":"wxGrid.isEditable/1","ref":"wxGrid.html#isEditable/1"},{"type":"function","doc":"Returns true if the given cell is selected.","title":"wxGrid.isInSelection/2","ref":"wxGrid.html#isInSelection/2"},{"type":"function","doc":"Returns true if the given cell is selected.","title":"wxGrid.isInSelection/3","ref":"wxGrid.html#isInSelection/3"},{"type":"function","doc":"Returns true if the cell at the specified location can't be edited.\n\nSee:\n* `setReadOnly/4`\n\n* `isCurrentCellReadOnly/1`","title":"wxGrid.isReadOnly/3","ref":"wxGrid.html#isReadOnly/3"},{"type":"function","doc":"Returns true if there are currently any selected cells, rows, columns or blocks.","title":"wxGrid.isSelection/1","ref":"wxGrid.html#isSelection/1"},{"type":"function","doc":"","title":"wxGrid.isVisible/2","ref":"wxGrid.html#isVisible/2"},{"type":"function","doc":"Returns true if a cell is either entirely or at least partially visible in the grid\nwindow.\n\nBy default, the cell must be entirely visible for this function to return true but if `wholeCellVisible`\nis false, the function returns true even if the cell is only partially visible.","title":"wxGrid.isVisible/3","ref":"wxGrid.html#isVisible/3"},{"type":"function","doc":"Returns true if a cell is either entirely or at least partially visible in the grid\nwindow.\n\nBy default, the cell must be entirely visible for this function to return true but if `wholeCellVisible`\nis false, the function returns true even if the cell is only partially visible.","title":"wxGrid.isVisible/4","ref":"wxGrid.html#isVisible/4"},{"type":"function","doc":"Brings the specified cell into the visible grid cell area with minimal scrolling.\n\nDoes nothing if the cell is already visible.","title":"wxGrid.makeCellVisible/2","ref":"wxGrid.html#makeCellVisible/2"},{"type":"function","doc":"Brings the specified cell into the visible grid cell area with minimal scrolling.\n\nDoes nothing if the cell is already visible.","title":"wxGrid.makeCellVisible/3","ref":"wxGrid.html#makeCellVisible/3"},{"type":"function","doc":"Moves the grid cursor down by one row.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorDown/2","ref":"wxGrid.html#moveCursorDown/2"},{"type":"function","doc":"Moves the grid cursor down in the current column such that it skips to the beginning or\nend of a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorDownBlock/2","ref":"wxGrid.html#moveCursorDownBlock/2"},{"type":"function","doc":"Moves the grid cursor left by one column.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorLeft/2","ref":"wxGrid.html#moveCursorLeft/2"},{"type":"function","doc":"Moves the grid cursor left in the current row such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorLeftBlock/2","ref":"wxGrid.html#moveCursorLeftBlock/2"},{"type":"function","doc":"Moves the grid cursor right by one column.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorRight/2","ref":"wxGrid.html#moveCursorRight/2"},{"type":"function","doc":"Moves the grid cursor right in the current row such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorRightBlock/2","ref":"wxGrid.html#moveCursorRightBlock/2"},{"type":"function","doc":"Moves the grid cursor up by one row.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorUp/2","ref":"wxGrid.html#moveCursorUp/2"},{"type":"function","doc":"Moves the grid cursor up in the current column such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","title":"wxGrid.moveCursorUpBlock/2","ref":"wxGrid.html#moveCursorUpBlock/2"},{"type":"function","doc":"Moves the grid cursor down by some number of rows so that the previous bottom visible row\nbecomes the top visible row.","title":"wxGrid.movePageDown/1","ref":"wxGrid.html#movePageDown/1"},{"type":"function","doc":"Moves the grid cursor up by some number of rows so that the previous top visible row\nbecomes the bottom visible row.","title":"wxGrid.movePageUp/1","ref":"wxGrid.html#movePageUp/1"},{"type":"function","doc":"Default constructor.\n\nYou must call `Create()` (not implemented in wx) to really create the grid window and\nalso call `createGrid/4` or `SetTable()` (not implemented in wx) or `AssignTable()` (not implemented in\nwx) to initialize its contents.","title":"wxGrid.new/0","ref":"wxGrid.html#new/0"},{"type":"function","doc":"","title":"wxGrid.new/2","ref":"wxGrid.html#new/2"},{"type":"function","doc":"Constructor creating the grid window.\n\nYou must call either `createGrid/4` or `SetTable()` (not implemented in wx) or `AssignTable()` (not\nimplemented in wx) to initialize the grid contents before using it.","title":"wxGrid.new/3","ref":"wxGrid.html#new/3"},{"type":"function","doc":"Register a new data type.\n\nThe data types allow to naturally associate specific renderers and editors to the cells\ncontaining values of the given type. For example, the grid automatically registers a data\ntype with the name `wxGRID_VALUE_STRING` which uses `m:wxGridCellStringRenderer` and `m:wxGridCellTextEditor`\nas its renderer and editor respectively - this is the data type used by all the cells of\nthe default `wxGridStringTable` (not implemented in wx), so this renderer and editor are\nused by default for all grid cells.\n\nHowever if a custom table returns `wxGRID_VALUE_BOOL` from its `wxGridTableBase::GetTypeName()`\n(not implemented in wx) method, then `m:wxGridCellBoolRenderer` and `m:wxGridCellBoolEditor`\nare used for it because the grid also registers a boolean data type with this name.\n\nAnd as this mechanism is completely generic, you may register your own data types using\nyour own custom renderers and editors. Just remember that the table must identify a cell\nas being of the given type for them to be used for this cell.","title":"wxGrid.registerDataType/4","ref":"wxGrid.html#registerDataType/4"},{"type":"function","doc":"Sets the value of the current grid cell to the current in-place edit control value.\n\nThis is called automatically when the grid cursor moves from the current cell to a new\ncell. It is also a good idea to call this function when closing a grid since any edits to\nthe final cell location will not be saved otherwise.","title":"wxGrid.saveEditControlValue/1","ref":"wxGrid.html#saveEditControlValue/1"},{"type":"function","doc":"Selects all cells in the grid.","title":"wxGrid.selectAll/1","ref":"wxGrid.html#selectAll/1"},{"type":"function","doc":"","title":"wxGrid.selectBlock/3","ref":"wxGrid.html#selectBlock/3"},{"type":"function","doc":"Selects a rectangular block of cells.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.","title":"wxGrid.selectBlock/4","ref":"wxGrid.html#selectBlock/4"},{"type":"function","doc":"","title":"wxGrid.selectBlock/5","ref":"wxGrid.html#selectBlock/5"},{"type":"function","doc":"Selects a rectangular block of cells.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.","title":"wxGrid.selectBlock/6","ref":"wxGrid.html#selectBlock/6"},{"type":"function","doc":"","title":"wxGrid.selectCol/2","ref":"wxGrid.html#selectCol/2"},{"type":"function","doc":"Selects the specified column.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.\n\nThis method won't select anything if the current selection mode is wxGridSelectRows.","title":"wxGrid.selectCol/3","ref":"wxGrid.html#selectCol/3"},{"type":"function","doc":"","title":"wxGrid.selectRow/2","ref":"wxGrid.html#selectRow/2"},{"type":"function","doc":"Selects the specified row.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\nrow will be added to the existing selection.\n\nThis method won't select anything if the current selection mode is wxGridSelectColumns.","title":"wxGrid.selectRow/3","ref":"wxGrid.html#selectRow/3"},{"type":"function","doc":"Sets the horizontal and vertical alignment for grid cell text at the specified location.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.setCellAlignment/5","ref":"wxGrid.html#setCellAlignment/5"},{"type":"function","doc":"Set the background colour for the given cell or all cells by default.","title":"wxGrid.setCellBackgroundColour/4","ref":"wxGrid.html#setCellBackgroundColour/4"},{"type":"function","doc":"Sets the editor for the grid cell at the specified location.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","title":"wxGrid.setCellEditor/4","ref":"wxGrid.html#setCellEditor/4"},{"type":"function","doc":"Sets the font for text in the grid cell at the specified location.","title":"wxGrid.setCellFont/4","ref":"wxGrid.html#setCellFont/4"},{"type":"function","doc":"Sets the renderer for the grid cell at the specified location.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.","title":"wxGrid.setCellRenderer/4","ref":"wxGrid.html#setCellRenderer/4"},{"type":"function","doc":"Sets the text colour for the given cell.","title":"wxGrid.setCellTextColour/4","ref":"wxGrid.html#setCellTextColour/4"},{"type":"function","doc":"Sets the string value for the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `getCellValue/3` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanSetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","title":"wxGrid.setCellValue/3","ref":"wxGrid.html#setCellValue/3"},{"type":"function","doc":"Sets the string value for the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `getCellValue/3` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanSetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","title":"wxGrid.setCellValue/4","ref":"wxGrid.html#setCellValue/4"},{"type":"function","doc":"Sets the cell attributes for all cells in the specified column.\n\nFor more information about controlling grid cell attributes see the `m:wxGridCellAttr`\ncell attribute class and the overview_grid.","title":"wxGrid.setColAttr/3","ref":"wxGrid.html#setColAttr/3"},{"type":"function","doc":"Sets the specified column to display boolean values.\n\nSee: `setColFormatCustom/3`","title":"wxGrid.setColFormatBool/2","ref":"wxGrid.html#setColFormatBool/2"},{"type":"function","doc":"Sets the specified column to display data in a custom format.\n\nThis method provides an alternative to defining a custom grid table which would return `typeName`\nfrom its GetTypeName() method for the cells in this column: while it doesn't really\nchange the type of the cells in this column, it does associate the renderer and editor\nused for the cells of the specified type with them.\n\nSee the overview_grid for more information on working with custom data types.","title":"wxGrid.setColFormatCustom/3","ref":"wxGrid.html#setColFormatCustom/3"},{"type":"function","doc":"","title":"wxGrid.setColFormatFloat/2","ref":"wxGrid.html#setColFormatFloat/2"},{"type":"function","doc":"Sets the specified column to display floating point values with the given width and\nprecision.\n\nSee: `setColFormatCustom/3`","title":"wxGrid.setColFormatFloat/3","ref":"wxGrid.html#setColFormatFloat/3"},{"type":"function","doc":"Sets the specified column to display integer values.\n\nSee: `setColFormatCustom/3`","title":"wxGrid.setColFormatNumber/2","ref":"wxGrid.html#setColFormatNumber/2"},{"type":"function","doc":"Sets the horizontal and vertical alignment of column label text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.setColLabelAlignment/3","ref":"wxGrid.html#setColLabelAlignment/3"},{"type":"function","doc":"Sets the height of the column labels.\n\nIf `height` equals to `wxGRID_AUTOSIZE` then height is calculated automatically so that\nno label is truncated. Note that this could be slow for a large table.","title":"wxGrid.setColLabelSize/2","ref":"wxGrid.html#setColLabelSize/2"},{"type":"function","doc":"Set the value for the given column label.\n\nIf you are using a custom grid table you must override `wxGridTableBase::SetColLabelValue()`\n(not implemented in wx) for this to have any effect.","title":"wxGrid.setColLabelValue/3","ref":"wxGrid.html#setColLabelValue/3"},{"type":"function","doc":"Sets the minimal `width` to which the user can resize columns.\n\nSee: `getColMinimalAcceptableWidth/1`","title":"wxGrid.setColMinimalAcceptableWidth/2","ref":"wxGrid.html#setColMinimalAcceptableWidth/2"},{"type":"function","doc":"Sets the minimal `width` for the specified column `col`.\n\nIt is usually best to call this method during grid creation as calling it later will not\nresize the column to the given minimal width even if it is currently narrower than it.\n\n`width` must be greater than the minimal acceptable column width as returned by `getColMinimalAcceptableWidth/1`.","title":"wxGrid.setColMinimalWidth/3","ref":"wxGrid.html#setColMinimalWidth/3"},{"type":"function","doc":"Sets the width of the specified column.","title":"wxGrid.setColSize/3","ref":"wxGrid.html#setColSize/3"},{"type":"function","doc":"Sets the default horizontal and vertical alignment for grid cell text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.setDefaultCellAlignment/3","ref":"wxGrid.html#setDefaultCellAlignment/3"},{"type":"function","doc":"Sets the default background colour for grid cells.","title":"wxGrid.setDefaultCellBackgroundColour/2","ref":"wxGrid.html#setDefaultCellBackgroundColour/2"},{"type":"function","doc":"Sets the default font to be used for grid cell text.","title":"wxGrid.setDefaultCellFont/2","ref":"wxGrid.html#setDefaultCellFont/2"},{"type":"function","doc":"Sets the current default colour for grid cell text.","title":"wxGrid.setDefaultCellTextColour/2","ref":"wxGrid.html#setDefaultCellTextColour/2"},{"type":"function","doc":"","title":"wxGrid.setDefaultColSize/2","ref":"wxGrid.html#setDefaultColSize/2"},{"type":"function","doc":"Sets the default width for columns in the grid.\n\nThis will only affect columns subsequently added to the grid unless `resizeExistingCols`\nis true.\n\nIf `width` is less than `getColMinimalAcceptableWidth/1`, then the minimal acceptable width is used instead of it.","title":"wxGrid.setDefaultColSize/3","ref":"wxGrid.html#setDefaultColSize/3"},{"type":"function","doc":"Sets the default editor for grid cells.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","title":"wxGrid.setDefaultEditor/2","ref":"wxGrid.html#setDefaultEditor/2"},{"type":"function","doc":"Sets the default renderer for grid cells.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.","title":"wxGrid.setDefaultRenderer/2","ref":"wxGrid.html#setDefaultRenderer/2"},{"type":"function","doc":"","title":"wxGrid.setDefaultRowSize/2","ref":"wxGrid.html#setDefaultRowSize/2"},{"type":"function","doc":"Sets the default height for rows in the grid.\n\nThis will only affect rows subsequently added to the grid unless `resizeExistingRows` is true.\n\nIf `height` is less than `getRowMinimalAcceptableHeight/1`, then the minimal acceptable height is used instead of it.","title":"wxGrid.setDefaultRowSize/3","ref":"wxGrid.html#setDefaultRowSize/3"},{"type":"function","doc":"Set the grid cursor to the specified cell.\n\nThe grid cursor indicates the current cell and can be moved by the user using the arrow\nkeys or the mouse.\n\nCalling this function generates a `wxEVT_GRID_SELECT_CELL` event and if the event handler\nvetoes this event, the cursor is not moved.\n\nThis function doesn't make the target call visible, use `GoToCell()` (not implemented in\nwx) to do this.","title":"wxGrid.setGridCursor/2","ref":"wxGrid.html#setGridCursor/2"},{"type":"function","doc":"Set the grid cursor to the specified cell.\n\nThe grid cursor indicates the current cell and can be moved by the user using the arrow\nkeys or the mouse.\n\nCalling this function generates a `wxEVT_GRID_SELECT_CELL` event and if the event handler\nvetoes this event, the cursor is not moved.\n\nThis function doesn't make the target call visible, use `GoToCell()` (not implemented in\nwx) to do this.","title":"wxGrid.setGridCursor/3","ref":"wxGrid.html#setGridCursor/3"},{"type":"function","doc":"Sets the colour used to draw grid lines.","title":"wxGrid.setGridLineColour/2","ref":"wxGrid.html#setGridLineColour/2"},{"type":"function","doc":"Sets the background colour for row and column labels.","title":"wxGrid.setLabelBackgroundColour/2","ref":"wxGrid.html#setLabelBackgroundColour/2"},{"type":"function","doc":"Sets the font for row and column labels.","title":"wxGrid.setLabelFont/2","ref":"wxGrid.html#setLabelFont/2"},{"type":"function","doc":"Sets the colour for row and column label text.","title":"wxGrid.setLabelTextColour/2","ref":"wxGrid.html#setLabelTextColour/2"},{"type":"function","doc":"Sets the extra margins used around the grid area.\n\nA grid may occupy more space than needed for its data display and this function allows\nsetting how big this extra space is","title":"wxGrid.setMargins/3","ref":"wxGrid.html#setMargins/3"},{"type":"function","doc":"","title":"wxGrid.setReadOnly/3","ref":"wxGrid.html#setReadOnly/3"},{"type":"function","doc":"Makes the cell at the specified location read-only or editable.\n\nSee: `isReadOnly/3`","title":"wxGrid.setReadOnly/4","ref":"wxGrid.html#setReadOnly/4"},{"type":"function","doc":"Sets the cell attributes for all cells in the specified row.\n\nThe grid takes ownership of the attribute pointer.\n\nSee the `m:wxGridCellAttr` class for more information about controlling cell attributes.","title":"wxGrid.setRowAttr/3","ref":"wxGrid.html#setRowAttr/3"},{"type":"function","doc":"Sets the horizontal and vertical alignment of row label text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGrid.setRowLabelAlignment/3","ref":"wxGrid.html#setRowLabelAlignment/3"},{"type":"function","doc":"Sets the width of the row labels.\n\nIf `width` equals `wxGRID_AUTOSIZE` then width is calculated automatically so that no\nlabel is truncated. Note that this could be slow for a large table.","title":"wxGrid.setRowLabelSize/2","ref":"wxGrid.html#setRowLabelSize/2"},{"type":"function","doc":"Sets the value for the given row label.\n\nIf you are using a derived grid table you must override `wxGridTableBase::SetRowLabelValue()`\n(not implemented in wx) for this to have any effect.","title":"wxGrid.setRowLabelValue/3","ref":"wxGrid.html#setRowLabelValue/3"},{"type":"function","doc":"Sets the minimal row `height` used by default.\n\nSee `setColMinimalAcceptableWidth/2` for more information.","title":"wxGrid.setRowMinimalAcceptableHeight/2","ref":"wxGrid.html#setRowMinimalAcceptableHeight/2"},{"type":"function","doc":"Sets the minimal `height` for the specified `row`.\n\nSee `setColMinimalWidth/3` for more information.","title":"wxGrid.setRowMinimalHeight/3","ref":"wxGrid.html#setRowMinimalHeight/3"},{"type":"function","doc":"Sets the height of the specified row.\n\nSee `setColSize/3` for more information.","title":"wxGrid.setRowSize/3","ref":"wxGrid.html#setRowSize/3"},{"type":"function","doc":"Sets the number of pixels per horizontal scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `getScrollLineY/1`\n\n* `setScrollLineY/2`","title":"wxGrid.setScrollLineX/2","ref":"wxGrid.html#setScrollLineX/2"},{"type":"function","doc":"Sets the number of pixels per vertical scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `getScrollLineY/1`\n\n* `setScrollLineX/2`","title":"wxGrid.setScrollLineY/2","ref":"wxGrid.html#setScrollLineY/2"},{"type":"function","doc":"Set the colour to be used for drawing the selection background.","title":"wxGrid.setSelectionBackground/2","ref":"wxGrid.html#setSelectionBackground/2"},{"type":"function","doc":"Set the colour to be used for drawing the selection foreground.","title":"wxGrid.setSelectionForeground/2","ref":"wxGrid.html#setSelectionForeground/2"},{"type":"function","doc":"Set the selection behaviour of the grid.\n\nThe existing selection is converted to conform to the new mode if possible and discarded\notherwise (e.g. any individual selected cells are deselected if the new mode allows only\nthe selection of the entire rows or columns).","title":"wxGrid.setSelectionMode/2","ref":"wxGrid.html#setSelectionMode/2"},{"type":"function","doc":"Displays the active in-place cell edit control for the current cell after it was hidden.\n\nThis method should only be called after calling `hideCellEditControl/1`, to start editing the current grid cell\nuse `enableCellEditControl/2` instead.","title":"wxGrid.showCellEditControl/1","ref":"wxGrid.html#showCellEditControl/1"},{"type":"function","doc":"","title":"wxGrid.xToCol/2","ref":"wxGrid.html#xToCol/2"},{"type":"function","doc":"Returns the column at the given pixel position depending on the window.\n\nReturn: The column index or `wxNOT_FOUND`.","title":"wxGrid.xToCol/3","ref":"wxGrid.html#xToCol/3"},{"type":"function","doc":"Returns the column whose right hand edge is close to the given logical `x` position.\n\nIf no column edge is near to this position `wxNOT_FOUND` is returned.","title":"wxGrid.xToEdgeOfCol/2","ref":"wxGrid.html#xToEdgeOfCol/2"},{"type":"function","doc":"Returns the row whose bottom edge is close to the given logical `y` position.\n\nIf no row edge is near to this position `wxNOT_FOUND` is returned.","title":"wxGrid.yToEdgeOfRow/2","ref":"wxGrid.html#yToEdgeOfRow/2"},{"type":"function","doc":"","title":"wxGrid.yToRow/2","ref":"wxGrid.html#yToRow/2"},{"type":"function","doc":"Returns the grid row that corresponds to the logical `y` coordinate.\n\nThe parameter `gridWindow` is new since wxWidgets 3.1.3. If it is specified, i.e.\nnon-NULL, only the cells of this window are considered, i.e. the function returns `wxNOT_FOUND`\nif `y` is out of bounds.\n\nIf `gridWindow` is NULL, the function returns `wxNOT_FOUND` only if there is no row at\nall at the `y` position.","title":"wxGrid.yToRow/3","ref":"wxGrid.html#yToRow/3"},{"type":"type","doc":"","title":"wxGrid.wxGrid/0","ref":"wxGrid.html#t:wxGrid/0"},{"type":"module","doc":"A `m:wxSizer` that can lay out items in a virtual grid like a `m:wxFlexGridSizer` but in\nthis case explicit positioning of the items is allowed using `wxGBPosition` (not\nimplemented in wx), and items can optionally span more than one row and/or column using `wxGBSpan`\n(not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFlexGridSizer`\n\n* `m:wxGridSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxGridBagSizer](https://docs.wxwidgets.org/3.2/classwx_grid_bag_sizer.html)","title":"wxGridBagSizer","ref":"wxGridBagSizer.html"},{"type":"function","doc":"","title":"wxGridBagSizer.add/2","ref":"wxGridBagSizer.html#add/2"},{"type":"function","doc":"","title":"wxGridBagSizer.add/3","ref":"wxGridBagSizer.html#add/3"},{"type":"function","doc":"Adds the given item to the given position.\n\nReturn: A valid pointer if the item was successfully placed at the given position, or\nNULL if something was already there.","title":"wxGridBagSizer.add/4","ref":"wxGridBagSizer.html#add/4"},{"type":"function","doc":"Adds a spacer to the given position.\n\n`width` and `height` specify the dimension of the spacer to be added.\n\nReturn: A valid pointer if the spacer was successfully placed at the given position, or\nNULL if something was already there.","title":"wxGridBagSizer.add/5","ref":"wxGridBagSizer.html#add/5"},{"type":"function","doc":"Called when the managed size of the sizer is needed or when layout needs done.","title":"wxGridBagSizer.calcMin/1","ref":"wxGridBagSizer.html#calcMin/1"},{"type":"function","doc":"","title":"wxGridBagSizer.checkForIntersection/2","ref":"wxGridBagSizer.html#checkForIntersection/2"},{"type":"function","doc":"Look at all items and see if any intersect (or would overlap) the given item.\n\nReturns true if so, false if there would be no overlap. If an `excludeItem` is given then\nit will not be checked for intersection, for example it may be the item we are checking\nthe position of.","title":"wxGridBagSizer.checkForIntersection/3","ref":"wxGridBagSizer.html#checkForIntersection/3"},{"type":"function","doc":"","title":"wxGridBagSizer.checkForIntersection/4","ref":"wxGridBagSizer.html#checkForIntersection/4"},{"type":"function","doc":"Destroys the object","title":"wxGridBagSizer.destroy/1","ref":"wxGridBagSizer.html#destroy/1"},{"type":"function","doc":"Find the sizer item for the given window or subsizer, returns NULL if not found.\n\n(non-recursive)","title":"wxGridBagSizer.findItem/2","ref":"wxGridBagSizer.html#findItem/2"},{"type":"function","doc":"Return the sizer item located at the point given in pt, or NULL if there is no item at\nthat point.\n\nThe (x,y) coordinates in `pt` correspond to the client coordinates of the window using\nthe sizer for layout. (non-recursive)","title":"wxGridBagSizer.findItemAtPoint/2","ref":"wxGridBagSizer.html#findItemAtPoint/2"},{"type":"function","doc":"Return the sizer item for the given grid cell, or NULL if there is no item at that\nposition.\n\n(non-recursive)","title":"wxGridBagSizer.findItemAtPosition/2","ref":"wxGridBagSizer.html#findItemAtPosition/2"},{"type":"function","doc":"Return the sizer item that has a matching user data (it only compares pointer values) or\nNULL if not found.\n\n(non-recursive)","title":"wxGridBagSizer.findItemWithData/2","ref":"wxGridBagSizer.html#findItemWithData/2"},{"type":"function","doc":"Get the size of the specified cell, including hgap and vgap.\n\nOnly valid after window layout has been performed.","title":"wxGridBagSizer.getCellSize/3","ref":"wxGridBagSizer.html#getCellSize/3"},{"type":"function","doc":"Get the size used for cells in the grid with no item.","title":"wxGridBagSizer.getEmptyCellSize/1","ref":"wxGridBagSizer.html#getEmptyCellSize/1"},{"type":"function","doc":"","title":"wxGridBagSizer.getItemPosition/2","ref":"wxGridBagSizer.html#getItemPosition/2"},{"type":"function","doc":"","title":"wxGridBagSizer.getItemSpan/2","ref":"wxGridBagSizer.html#getItemSpan/2"},{"type":"function","doc":"","title":"wxGridBagSizer.new/0","ref":"wxGridBagSizer.html#new/0"},{"type":"function","doc":"Constructor, with optional parameters to specify the gap between the rows and columns.","title":"wxGridBagSizer.new/1","ref":"wxGridBagSizer.html#new/1"},{"type":"function","doc":"Set the size used for cells in the grid with no item.","title":"wxGridBagSizer.setEmptyCellSize/2","ref":"wxGridBagSizer.html#setEmptyCellSize/2"},{"type":"function","doc":"","title":"wxGridBagSizer.setItemPosition/3","ref":"wxGridBagSizer.html#setItemPosition/3"},{"type":"function","doc":"","title":"wxGridBagSizer.setItemSpan/3","ref":"wxGridBagSizer.html#setItemSpan/3"},{"type":"type","doc":"","title":"wxGridBagSizer.wxGridBagSizer/0","ref":"wxGridBagSizer.html#t:wxGridBagSizer/0"},{"type":"module","doc":"This class can be used to alter the cells' appearance in the grid by changing their\nattributes from the defaults.\n\nAn object of this class may be returned by `wxGridTableBase::GetAttr()` (not implemented\nin wx).\n\nNote that objects of this class are reference-counted and it's recommended to use\nwxGridCellAttrPtr smart pointer class when working with them to avoid memory leaks.\n\nwxWidgets docs: [wxGridCellAttr](https://docs.wxwidgets.org/3.2/classwx_grid_cell_attr.html)","title":"wxGridCellAttr","ref":"wxGridCellAttr.html"},{"type":"function","doc":"Get the alignment to use for the cell with the given attribute.\n\nIf this attribute doesn't specify any alignment, the default attribute alignment is used\n(which can be changed using `wxGrid:setDefaultCellAlignment/3` but is left and top by default).\n\nNotice that `hAlign` and `vAlign` values are always overwritten by this function, use `GetNonDefaultAlignment()`\n(not implemented in wx) if this is not desirable.","title":"wxGridCellAttr.getAlignment/1","ref":"wxGridCellAttr.html#getAlignment/1"},{"type":"function","doc":"Returns the background colour.","title":"wxGridCellAttr.getBackgroundColour/1","ref":"wxGridCellAttr.html#getBackgroundColour/1"},{"type":"function","doc":"Returns the cell editor.\n\nThe caller is responsible for calling `DecRef()` (not implemented in wx) on the returned\npointer, use `GetEditorPtr()` (not implemented in wx) to do it automatically.","title":"wxGridCellAttr.getEditor/4","ref":"wxGridCellAttr.html#getEditor/4"},{"type":"function","doc":"Returns the font.","title":"wxGridCellAttr.getFont/1","ref":"wxGridCellAttr.html#getFont/1"},{"type":"function","doc":"Returns the cell renderer.\n\nThe caller is responsible for calling `DecRef()` (not implemented in wx) on the returned\npointer, use `GetRendererPtr()` (not implemented in wx) to do it automatically.","title":"wxGridCellAttr.getRenderer/4","ref":"wxGridCellAttr.html#getRenderer/4"},{"type":"function","doc":"Returns the text colour.","title":"wxGridCellAttr.getTextColour/1","ref":"wxGridCellAttr.html#getTextColour/1"},{"type":"function","doc":"Returns true if this attribute has a valid alignment set.","title":"wxGridCellAttr.hasAlignment/1","ref":"wxGridCellAttr.html#hasAlignment/1"},{"type":"function","doc":"Returns true if this attribute has a valid background colour set.","title":"wxGridCellAttr.hasBackgroundColour/1","ref":"wxGridCellAttr.html#hasBackgroundColour/1"},{"type":"function","doc":"Returns true if this attribute has a valid cell editor set.","title":"wxGridCellAttr.hasEditor/1","ref":"wxGridCellAttr.html#hasEditor/1"},{"type":"function","doc":"Returns true if this attribute has a valid font set.","title":"wxGridCellAttr.hasFont/1","ref":"wxGridCellAttr.html#hasFont/1"},{"type":"function","doc":"Returns true if this attribute has a valid cell renderer set.","title":"wxGridCellAttr.hasRenderer/1","ref":"wxGridCellAttr.html#hasRenderer/1"},{"type":"function","doc":"Returns true if this attribute has a valid text colour set.","title":"wxGridCellAttr.hasTextColour/1","ref":"wxGridCellAttr.html#hasTextColour/1"},{"type":"function","doc":"Returns true if this cell is set as read-only.","title":"wxGridCellAttr.isReadOnly/1","ref":"wxGridCellAttr.html#isReadOnly/1"},{"type":"function","doc":"Sets the alignment.\n\n`hAlign` can be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT` and `vAlign`\ncan be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","title":"wxGridCellAttr.setAlignment/3","ref":"wxGridCellAttr.html#setAlignment/3"},{"type":"function","doc":"Sets the background colour.","title":"wxGridCellAttr.setBackgroundColour/2","ref":"wxGridCellAttr.html#setBackgroundColour/2"},{"type":"function","doc":"","title":"wxGridCellAttr.setDefAttr/2","ref":"wxGridCellAttr.html#setDefAttr/2"},{"type":"function","doc":"Sets the editor to be used with the cells with this attribute.","title":"wxGridCellAttr.setEditor/2","ref":"wxGridCellAttr.html#setEditor/2"},{"type":"function","doc":"Sets the font.","title":"wxGridCellAttr.setFont/2","ref":"wxGridCellAttr.html#setFont/2"},{"type":"function","doc":"","title":"wxGridCellAttr.setReadOnly/1","ref":"wxGridCellAttr.html#setReadOnly/1"},{"type":"function","doc":"Sets the cell as read-only.","title":"wxGridCellAttr.setReadOnly/2","ref":"wxGridCellAttr.html#setReadOnly/2"},{"type":"function","doc":"Sets the renderer to be used for cells with this attribute.\n\nTakes ownership of the pointer.","title":"wxGridCellAttr.setRenderer/2","ref":"wxGridCellAttr.html#setRenderer/2"},{"type":"function","doc":"Sets the text colour.","title":"wxGridCellAttr.setTextColour/2","ref":"wxGridCellAttr.html#setTextColour/2"},{"type":"type","doc":"","title":"wxGridCellAttr.wxGridCellAttr/0","ref":"wxGridCellAttr.html#t:wxGridCellAttr/0"},{"type":"module","doc":"Grid cell editor for boolean data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellBoolEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_bool_editor.html)","title":"wxGridCellBoolEditor","ref":"wxGridCellBoolEditor.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellBoolEditor.destroy/1","ref":"wxGridCellBoolEditor.html#destroy/1"},{"type":"function","doc":"Returns true if the given `value` is equal to the string representation of the truth\nvalue we currently use (see `useStringValues/1`).","title":"wxGridCellBoolEditor.isTrueValue/1","ref":"wxGridCellBoolEditor.html#isTrueValue/1"},{"type":"function","doc":"Default constructor.","title":"wxGridCellBoolEditor.new/0","ref":"wxGridCellBoolEditor.html#new/0"},{"type":"function","doc":"","title":"wxGridCellBoolEditor.useStringValues/0","ref":"wxGridCellBoolEditor.html#useStringValues/0"},{"type":"function","doc":"This method allows you to customize the values returned by `wxGridCellNumberEditor:getValue/1`\nfor the cell using this editor.\n\nBy default, the default values of the arguments are used, i.e. `\"1\"` is returned if the\ncell is checked and an empty string otherwise.","title":"wxGridCellBoolEditor.useStringValues/1","ref":"wxGridCellBoolEditor.html#useStringValues/1"},{"type":"type","doc":"","title":"wxGridCellBoolEditor.wxGridCellBoolEditor/0","ref":"wxGridCellBoolEditor.html#t:wxGridCellBoolEditor/0"},{"type":"module","doc":"This class may be used to format boolean data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellBoolRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_bool_renderer.html)","title":"wxGridCellBoolRenderer","ref":"wxGridCellBoolRenderer.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellBoolRenderer.destroy/1","ref":"wxGridCellBoolRenderer.html#destroy/1"},{"type":"function","doc":"","title":"wxGridCellBoolRenderer.new/0","ref":"wxGridCellBoolRenderer.html#new/0"},{"type":"type","doc":"","title":"wxGridCellBoolRenderer.wxGridCellBoolRenderer/0","ref":"wxGridCellBoolRenderer.html#t:wxGridCellBoolRenderer/0"},{"type":"module","doc":"Grid cell editor for string data providing the user a choice from a list of strings.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellChoiceEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_choice_editor.html)","title":"wxGridCellChoiceEditor","ref":"wxGridCellChoiceEditor.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellChoiceEditor.destroy/1","ref":"wxGridCellChoiceEditor.html#destroy/1"},{"type":"function","doc":"","title":"wxGridCellChoiceEditor.new/1","ref":"wxGridCellChoiceEditor.html#new/1"},{"type":"function","doc":"Choice cell renderer ctor.","title":"wxGridCellChoiceEditor.new/2","ref":"wxGridCellChoiceEditor.html#new/2"},{"type":"function","doc":"Parameters string format is \"item1[,item2[...,itemN]]\".\n\nThis method can be called before the editor is used for the first time, or later, in\nwhich case it replaces the previously specified strings with the new ones.","title":"wxGridCellChoiceEditor.setParameters/2","ref":"wxGridCellChoiceEditor.html#setParameters/2"},{"type":"type","doc":"","title":"wxGridCellChoiceEditor.wxGridCellChoiceEditor/0","ref":"wxGridCellChoiceEditor.html#t:wxGridCellChoiceEditor/0"},{"type":"module","doc":"This class is responsible for providing and manipulating the in-place edit controls for\nthe grid.\n\nInstances of `m:wxGridCellEditor` (actually, instances of derived classes since it is an\nabstract class) can be associated with the cell attributes for individual cells, rows,\ncolumns, or even for the entire grid.\n\nNormally `m:wxGridCellEditor` shows some UI control allowing the user to edit the cell,\nbut starting with wxWidgets 3.1.4 it's also possible to define \"activatable\" cell editors,\nthat change the value of the cell directly when it's activated (typically by pressing\nSpace key or clicking on it), see `TryActivate()` (not implemented in wx) method. Note\nthat when implementing an editor which is always activatable, i.e. never shows any\nin-place editor, it is more convenient to derive its class from `wxGridCellActivatableEditor`\n(not implemented in wx) than from `m:wxGridCellEditor` itself.\n\nSee:\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nwxWidgets docs: [wxGridCellEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_editor.html)","title":"wxGridCellEditor","ref":"wxGridCellEditor.html"},{"type":"function","doc":"Creates the actual edit control.","title":"wxGridCellEditor.create/4","ref":"wxGridCellEditor.html#create/4"},{"type":"function","doc":"Some types of controls on some platforms may need some help with the Return key.","title":"wxGridCellEditor.handleReturn/2","ref":"wxGridCellEditor.html#handleReturn/2"},{"type":"function","doc":"Returns true if the edit control has been created.","title":"wxGridCellEditor.isCreated/1","ref":"wxGridCellEditor.html#isCreated/1"},{"type":"function","doc":"Reset the value in the control back to its starting value.","title":"wxGridCellEditor.reset/1","ref":"wxGridCellEditor.html#reset/1"},{"type":"function","doc":"Size and position the edit control.","title":"wxGridCellEditor.setSize/2","ref":"wxGridCellEditor.html#setSize/2"},{"type":"function","doc":"","title":"wxGridCellEditor.show/2","ref":"wxGridCellEditor.html#show/2"},{"type":"function","doc":"Show or hide the edit control, use the specified attributes to set colours/fonts for it.","title":"wxGridCellEditor.show/3","ref":"wxGridCellEditor.html#show/3"},{"type":"function","doc":"If the editor is enabled by clicking on the cell, this method will be called.","title":"wxGridCellEditor.startingClick/1","ref":"wxGridCellEditor.html#startingClick/1"},{"type":"function","doc":"If the editor is enabled by pressing keys on the grid, this will be called to let the\neditor do something about that first key if desired.","title":"wxGridCellEditor.startingKey/2","ref":"wxGridCellEditor.html#startingKey/2"},{"type":"type","doc":"","title":"wxGridCellEditor.wxGridCellEditor/0","ref":"wxGridCellEditor.html#t:wxGridCellEditor/0"},{"type":"module","doc":"The editor for floating point numbers data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellFloatEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_float_editor.html)","title":"wxGridCellFloatEditor","ref":"wxGridCellFloatEditor.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellFloatEditor.destroy/1","ref":"wxGridCellFloatEditor.html#destroy/1"},{"type":"function","doc":"","title":"wxGridCellFloatEditor.new/0","ref":"wxGridCellFloatEditor.html#new/0"},{"type":"function","doc":"Float cell editor ctor.","title":"wxGridCellFloatEditor.new/1","ref":"wxGridCellFloatEditor.html#new/1"},{"type":"function","doc":"The parameters string format is \"width[,precision[,format]]\" where `format` should be\nchosen between f|e|g|E|G (f is used by default)","title":"wxGridCellFloatEditor.setParameters/2","ref":"wxGridCellFloatEditor.html#setParameters/2"},{"type":"type","doc":"","title":"wxGridCellFloatEditor.wxGridCellFloatEditor/0","ref":"wxGridCellFloatEditor.html#t:wxGridCellFloatEditor/0"},{"type":"module","doc":"This class may be used to format floating point data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellStringRenderer`\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellFloatRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_float_renderer.html)","title":"wxGridCellFloatRenderer","ref":"wxGridCellFloatRenderer.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellFloatRenderer.destroy/1","ref":"wxGridCellFloatRenderer.html#destroy/1"},{"type":"function","doc":"Returns the precision.","title":"wxGridCellFloatRenderer.getPrecision/1","ref":"wxGridCellFloatRenderer.html#getPrecision/1"},{"type":"function","doc":"Returns the width.","title":"wxGridCellFloatRenderer.getWidth/1","ref":"wxGridCellFloatRenderer.html#getWidth/1"},{"type":"function","doc":"","title":"wxGridCellFloatRenderer.new/0","ref":"wxGridCellFloatRenderer.html#new/0"},{"type":"function","doc":"Float cell renderer ctor.","title":"wxGridCellFloatRenderer.new/1","ref":"wxGridCellFloatRenderer.html#new/1"},{"type":"function","doc":"The parameters string format is \"width[,precision[,format]]\" where `format` should be\nchosen between f|e|g|E|G (f is used by default)","title":"wxGridCellFloatRenderer.setParameters/2","ref":"wxGridCellFloatRenderer.html#setParameters/2"},{"type":"function","doc":"Sets the precision.","title":"wxGridCellFloatRenderer.setPrecision/2","ref":"wxGridCellFloatRenderer.html#setPrecision/2"},{"type":"function","doc":"Sets the width.","title":"wxGridCellFloatRenderer.setWidth/2","ref":"wxGridCellFloatRenderer.html#setWidth/2"},{"type":"type","doc":"","title":"wxGridCellFloatRenderer.wxGridCellFloatRenderer/0","ref":"wxGridCellFloatRenderer.html#t:wxGridCellFloatRenderer/0"},{"type":"module","doc":"Grid cell editor for numeric integer data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellTextEditor`\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellNumberEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_number_editor.html)","title":"wxGridCellNumberEditor","ref":"wxGridCellNumberEditor.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellNumberEditor.destroy/1","ref":"wxGridCellNumberEditor.html#destroy/1"},{"type":"function","doc":"Returns the value currently in the editor control.","title":"wxGridCellNumberEditor.getValue/1","ref":"wxGridCellNumberEditor.html#getValue/1"},{"type":"function","doc":"","title":"wxGridCellNumberEditor.new/0","ref":"wxGridCellNumberEditor.html#new/0"},{"type":"function","doc":"Allows you to specify the range for acceptable data.\n\nValues equal to -1 for both `min` and `max` indicate that no range checking should be\ndone.","title":"wxGridCellNumberEditor.new/1","ref":"wxGridCellNumberEditor.html#new/1"},{"type":"function","doc":"Parameters string format is \"min,max\".","title":"wxGridCellNumberEditor.setParameters/2","ref":"wxGridCellNumberEditor.html#setParameters/2"},{"type":"type","doc":"","title":"wxGridCellNumberEditor.wxGridCellNumberEditor/0","ref":"wxGridCellNumberEditor.html#t:wxGridCellNumberEditor/0"},{"type":"module","doc":"This class may be used to format integer data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellStringRenderer`\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellNumberRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_number_renderer.html)","title":"wxGridCellNumberRenderer","ref":"wxGridCellNumberRenderer.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellNumberRenderer.destroy/1","ref":"wxGridCellNumberRenderer.html#destroy/1"},{"type":"function","doc":"Default constructor.","title":"wxGridCellNumberRenderer.new/0","ref":"wxGridCellNumberRenderer.html#new/0"},{"type":"type","doc":"","title":"wxGridCellNumberRenderer.wxGridCellNumberRenderer/0","ref":"wxGridCellNumberRenderer.html#t:wxGridCellNumberRenderer/0"},{"type":"module","doc":"This class is responsible for actually drawing the cell in the grid.\n\nYou may pass it to the `m:wxGridCellAttr` (below) to change the format of one given cell\nor to `wxGrid:setDefaultRenderer/2` to change the view of all cells. This is an abstract class, and you will normally\nuse one of the predefined derived classes or derive your own class from it.\n\nSee:\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nwxWidgets docs: [wxGridCellRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_renderer.html)","title":"wxGridCellRenderer","ref":"wxGridCellRenderer.html"},{"type":"function","doc":"Draw the given cell on the provided DC inside the given rectangle using the style\nspecified by the attribute and the default or selected state corresponding to the\nisSelected value.\n\nThis pure virtual function has a default implementation which will prepare the DC using\nthe given attribute: it will draw the rectangle with the background colour from attr and\nset the text colour and font.","title":"wxGridCellRenderer.draw/8","ref":"wxGridCellRenderer.html#draw/8"},{"type":"function","doc":"Get the preferred size of the cell for its contents.\n\nThis method must be overridden in the derived classes to return the minimal fitting size\nfor displaying the content of the given grid cell.","title":"wxGridCellRenderer.getBestSize/6","ref":"wxGridCellRenderer.html#getBestSize/6"},{"type":"type","doc":"","title":"wxGridCellRenderer.wxGridCellRenderer/0","ref":"wxGridCellRenderer.html#t:wxGridCellRenderer/0"},{"type":"module","doc":"This class may be used to format string data in a cell; it is the default for string\ncells.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellStringRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_string_renderer.html)","title":"wxGridCellStringRenderer","ref":"wxGridCellStringRenderer.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellStringRenderer.destroy/1","ref":"wxGridCellStringRenderer.html#destroy/1"},{"type":"function","doc":"","title":"wxGridCellStringRenderer.new/0","ref":"wxGridCellStringRenderer.html#new/0"},{"type":"type","doc":"","title":"wxGridCellStringRenderer.wxGridCellStringRenderer/0","ref":"wxGridCellStringRenderer.html#t:wxGridCellStringRenderer/0"},{"type":"module","doc":"Grid cell editor for string/text data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellTextEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_text_editor.html)","title":"wxGridCellTextEditor","ref":"wxGridCellTextEditor.html"},{"type":"function","doc":"Destroys the object","title":"wxGridCellTextEditor.destroy/1","ref":"wxGridCellTextEditor.html#destroy/1"},{"type":"function","doc":"","title":"wxGridCellTextEditor.new/0","ref":"wxGridCellTextEditor.html#new/0"},{"type":"function","doc":"Text cell editor constructor.","title":"wxGridCellTextEditor.new/1","ref":"wxGridCellTextEditor.html#new/1"},{"type":"function","doc":"The parameters string format is \"n\" where n is a number representing the maximum width.","title":"wxGridCellTextEditor.setParameters/2","ref":"wxGridCellTextEditor.html#setParameters/2"},{"type":"type","doc":"","title":"wxGridCellTextEditor.wxGridCellTextEditor/0","ref":"wxGridCellTextEditor.html#t:wxGridCellTextEditor/0"},{"type":"module","doc":"This event class contains information about various grid events.\n\nNotice that all grid event table macros are available in two versions: `EVT_GRID_XXX` and `EVT_GRID_CMD_XXX`.\nThe only difference between the two is that the former doesn't allow to specify the grid\nwindow identifier and so takes a single parameter, the event handler, but is not suitable\nif there is more than one grid control in the window where the event table is used (as it\nwould catch the events from all the grids). The version with `CMD` takes the id as first\nargument and the event handler as the second one and so can be used with multiple grids as\nwell. Otherwise there are no difference between the two and only the versions without the\nid are documented below for brevity.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxGridEvent](https://docs.wxwidgets.org/3.2/classwx_grid_event.html)","title":"wxGridEvent","ref":"wxGridEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxGridEventType` to subscribe to events of this type.","title":"Events - wxGridEvent","ref":"wxGridEvent.html#module-events"},{"type":"function","doc":"Returns true if the Alt key was down at the time of the event.","title":"wxGridEvent.altDown/1","ref":"wxGridEvent.html#altDown/1"},{"type":"function","doc":"Returns true if the Control key was down at the time of the event.","title":"wxGridEvent.controlDown/1","ref":"wxGridEvent.html#controlDown/1"},{"type":"function","doc":"Column at which the event occurred.\n\nNotice that for a `wxEVT_GRID_SELECT_CELL` event this column is the column of the newly\nselected cell while the previously selected cell can be retrieved using `wxGrid:getGridCursorCol/1`.","title":"wxGridEvent.getCol/1","ref":"wxGridEvent.html#getCol/1"},{"type":"function","doc":"Position in pixels at which the event occurred.","title":"wxGridEvent.getPosition/1","ref":"wxGridEvent.html#getPosition/1"},{"type":"function","doc":"Row at which the event occurred.\n\nNotice that for a `wxEVT_GRID_SELECT_CELL` event this row is the row of the newly\nselected cell while the previously selected cell can be retrieved using `wxGrid:getGridCursorRow/1`.","title":"wxGridEvent.getRow/1","ref":"wxGridEvent.html#getRow/1"},{"type":"function","doc":"Returns true if the Meta key was down at the time of the event.","title":"wxGridEvent.metaDown/1","ref":"wxGridEvent.html#metaDown/1"},{"type":"function","doc":"Returns true if the user is selecting grid cells, or false if deselecting.","title":"wxGridEvent.selecting/1","ref":"wxGridEvent.html#selecting/1"},{"type":"function","doc":"Returns true if the Shift key was down at the time of the event.","title":"wxGridEvent.shiftDown/1","ref":"wxGridEvent.html#shiftDown/1"},{"type":"type","doc":"","title":"wxGridEvent.wxGrid/0","ref":"wxGridEvent.html#t:wxGrid/0"},{"type":"type","doc":"","title":"wxGridEvent.wxGridEvent/0","ref":"wxGridEvent.html#t:wxGridEvent/0"},{"type":"type","doc":"","title":"wxGridEvent.wxGridEventType/0","ref":"wxGridEvent.html#t:wxGridEventType/0"},{"type":"module","doc":"A grid sizer is a sizer which lays out its children in a two-dimensional table with all\ntable fields having the same size, i.e.\n\nthe width of each field is the width of the widest child, the height of each field is the\nheight of the tallest child.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxGridSizer](https://docs.wxwidgets.org/3.2/classwx_grid_sizer.html)","title":"wxGridSizer","ref":"wxGridSizer.html"},{"type":"function","doc":"Destroys the object","title":"wxGridSizer.destroy/1","ref":"wxGridSizer.html#destroy/1"},{"type":"function","doc":"Returns the number of columns that has been specified for the sizer.\n\nReturns zero if the sizer is automatically adjusting the number of columns depending on\nnumber of its children. To get the effective number of columns or rows being currently\nused, see `GetEffectiveColsCount()` (not implemented in wx)","title":"wxGridSizer.getCols/1","ref":"wxGridSizer.html#getCols/1"},{"type":"function","doc":"Returns the horizontal gap (in pixels) between cells in the sizer.","title":"wxGridSizer.getHGap/1","ref":"wxGridSizer.html#getHGap/1"},{"type":"function","doc":"Returns the number of rows that has been specified for the sizer.\n\nReturns zero if the sizer is automatically adjusting the number of rows depending on\nnumber of its children. To get the effective number of columns or rows being currently\nused, see `GetEffectiveRowsCount()` (not implemented in wx).","title":"wxGridSizer.getRows/1","ref":"wxGridSizer.html#getRows/1"},{"type":"function","doc":"Returns the vertical gap (in pixels) between the cells in the sizer.","title":"wxGridSizer.getVGap/1","ref":"wxGridSizer.html#getVGap/1"},{"type":"function","doc":"","title":"wxGridSizer.new/1","ref":"wxGridSizer.html#new/1"},{"type":"function","doc":"","title":"wxGridSizer.new/2","ref":"wxGridSizer.html#new/2"},{"type":"function","doc":"","title":"wxGridSizer.new/3","ref":"wxGridSizer.html#new/3"},{"type":"function","doc":"","title":"wxGridSizer.new/4","ref":"wxGridSizer.html#new/4"},{"type":"function","doc":"Sets the number of columns in the sizer.","title":"wxGridSizer.setCols/2","ref":"wxGridSizer.html#setCols/2"},{"type":"function","doc":"Sets the horizontal gap (in pixels) between cells in the sizer.","title":"wxGridSizer.setHGap/2","ref":"wxGridSizer.html#setHGap/2"},{"type":"function","doc":"Sets the number of rows in the sizer.","title":"wxGridSizer.setRows/2","ref":"wxGridSizer.html#setRows/2"},{"type":"function","doc":"Sets the vertical gap (in pixels) between the cells in the sizer.","title":"wxGridSizer.setVGap/2","ref":"wxGridSizer.html#setVGap/2"},{"type":"type","doc":"","title":"wxGridSizer.wxGridSizer/0","ref":"wxGridSizer.html#t:wxGridSizer/0"},{"type":"module","doc":"A help event is sent when the user has requested context-sensitive help.\n\nThis can either be caused by the application requesting context-sensitive help mode via `wxContextHelp`\n(not implemented in wx), or (on MS Windows) by the system generating a WM_HELP message\nwhen the user pressed F1 or clicked on the query button in a dialog caption.\n\nA help event is sent to the window that the user clicked on, and is propagated up the\nwindow hierarchy until the event is processed or there are no more event handlers.\n\nThe application should call `wxEvent:getId/1` to check the identity of the clicked-on window, and then\neither show some suitable help or call `wxEvent:skip/2` if the identifier is unrecognised.\n\nCalling Skip is important because it allows wxWidgets to generate further events for\nancestors of the clicked-on window. Otherwise it would be impossible to show help for\ncontainer windows, since processing would stop after the first window found.\n\nSee:\n* `m:wxDialog`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxHelpEvent](https://docs.wxwidgets.org/3.2/classwx_help_event.html)","title":"wxHelpEvent","ref":"wxHelpEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxHelpEventType` to subscribe to events of this type.","title":"Events - wxHelpEvent","ref":"wxHelpEvent.html#module-events"},{"type":"function","doc":"Returns the origin of the help event which is one of the `wxHelpEvent::Origin` (not\nimplemented in wx) values.\n\nThe application may handle events generated using the keyboard or mouse differently, e.g.\nby using `wx_misc:getMousePosition/0` for the mouse events.\n\nSee: `setOrigin/2`","title":"wxHelpEvent.getOrigin/1","ref":"wxHelpEvent.html#getOrigin/1"},{"type":"function","doc":"Returns the left-click position of the mouse, in screen coordinates.\n\nThis allows the application to position the help appropriately.","title":"wxHelpEvent.getPosition/1","ref":"wxHelpEvent.html#getPosition/1"},{"type":"function","doc":"Set the help event origin, only used internally by wxWidgets normally.\n\nSee: `getOrigin/1`","title":"wxHelpEvent.setOrigin/2","ref":"wxHelpEvent.html#setOrigin/2"},{"type":"function","doc":"Sets the left-click position of the mouse, in screen coordinates.","title":"wxHelpEvent.setPosition/2","ref":"wxHelpEvent.html#setPosition/2"},{"type":"type","doc":"","title":"wxHelpEvent.wxHelp/0","ref":"wxHelpEvent.html#t:wxHelp/0"},{"type":"type","doc":"","title":"wxHelpEvent.wxHelpEvent/0","ref":"wxHelpEvent.html#t:wxHelpEvent/0"},{"type":"type","doc":"","title":"wxHelpEvent.wxHelpEventType/0","ref":"wxHelpEvent.html#t:wxHelpEventType/0"},{"type":"module","doc":"This class provides very simple interface to printing architecture.\n\nIt allows you to print HTML documents using only a few commands.\n\nNote: Do not create this class on the stack only. You should create an instance on app\nstartup and use this instance for all printing operations. The reason is that this class\nstores various settings in it.\n\nwxWidgets docs: [wxHtmlEasyPrinting](https://docs.wxwidgets.org/3.2/classwx_html_easy_printing.html)","title":"wxHtmlEasyPrinting","ref":"wxHtmlEasyPrinting.html"},{"type":"function","doc":"Destroys the object","title":"wxHtmlEasyPrinting.destroy/1","ref":"wxHtmlEasyPrinting.html#destroy/1"},{"type":"function","doc":"Returns a pointer to `m:wxPageSetupDialogData` instance used by this class.\n\nYou can set its parameters (via SetXXXX methods).","title":"wxHtmlEasyPrinting.getPageSetupData/1","ref":"wxHtmlEasyPrinting.html#getPageSetupData/1"},{"type":"function","doc":"Returns pointer to `m:wxPrintData` instance used by this class.\n\nYou can set its parameters (via SetXXXX methods).","title":"wxHtmlEasyPrinting.getPrintData/1","ref":"wxHtmlEasyPrinting.html#getPrintData/1"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.new/0","ref":"wxHtmlEasyPrinting.html#new/0"},{"type":"function","doc":"Constructor.","title":"wxHtmlEasyPrinting.new/1","ref":"wxHtmlEasyPrinting.html#new/1"},{"type":"function","doc":"Display page setup dialog and allows the user to modify settings.","title":"wxHtmlEasyPrinting.pageSetup/1","ref":"wxHtmlEasyPrinting.html#pageSetup/1"},{"type":"function","doc":"Preview HTML file.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","title":"wxHtmlEasyPrinting.previewFile/2","ref":"wxHtmlEasyPrinting.html#previewFile/2"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.previewText/2","ref":"wxHtmlEasyPrinting.html#previewText/2"},{"type":"function","doc":"Preview HTML text (not file!).\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the error.","title":"wxHtmlEasyPrinting.previewText/3","ref":"wxHtmlEasyPrinting.html#previewText/3"},{"type":"function","doc":"Print HTML file.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","title":"wxHtmlEasyPrinting.printFile/2","ref":"wxHtmlEasyPrinting.html#printFile/2"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.printText/2","ref":"wxHtmlEasyPrinting.html#printText/2"},{"type":"function","doc":"Print HTML text (not file!).\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the error.","title":"wxHtmlEasyPrinting.printText/3","ref":"wxHtmlEasyPrinting.html#printText/3"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.setFonts/3","ref":"wxHtmlEasyPrinting.html#setFonts/3"},{"type":"function","doc":"Sets fonts.\n\nSee `wxHtmlDCRenderer::SetFonts` (not implemented in wx) for detailed description.","title":"wxHtmlEasyPrinting.setFonts/4","ref":"wxHtmlEasyPrinting.html#setFonts/4"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.setFooter/2","ref":"wxHtmlEasyPrinting.html#setFooter/2"},{"type":"function","doc":"Set page footer.\n\nThe following macros can be used inside it: @DATE@ is replaced by the current date in\ndefault format @PAGENUM@ is replaced by page number @PAGESCNT@ is replaced by total number\nof pages @TIME@ is replaced by the current time in default format @TITLE@ is replaced with\nthe title of the document","title":"wxHtmlEasyPrinting.setFooter/3","ref":"wxHtmlEasyPrinting.html#setFooter/3"},{"type":"function","doc":"","title":"wxHtmlEasyPrinting.setHeader/2","ref":"wxHtmlEasyPrinting.html#setHeader/2"},{"type":"function","doc":"Set page header.\n\nThe following macros can be used inside it:\n\n* @DATE@ is replaced by the current date in default format\n\n* @PAGENUM@ is replaced by page number\n\n* @PAGESCNT@ is replaced by total number of pages\n\n* @TIME@ is replaced by the current time in default format\n\n* @TITLE@ is replaced with the title of the document","title":"wxHtmlEasyPrinting.setHeader/3","ref":"wxHtmlEasyPrinting.html#setHeader/3"},{"type":"type","doc":"","title":"wxHtmlEasyPrinting.wxHtmlEasyPrinting/0","ref":"wxHtmlEasyPrinting.html#t:wxHtmlEasyPrinting/0"},{"type":"module","doc":"This event class is used for the events generated by `m:wxHtmlWindow`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxHtmlLinkEvent](https://docs.wxwidgets.org/3.2/classwx_html_link_event.html)","title":"wxHtmlLinkEvent","ref":"wxHtmlLinkEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxHtmlLinkEventType` to subscribe to events of this type.","title":"Events - wxHtmlLinkEvent","ref":"wxHtmlLinkEvent.html#module-events"},{"type":"function","doc":"Returns the `wx_wxHtmlLinkInfo()` which contains info about the cell clicked and the\nhyperlink it contains.","title":"wxHtmlLinkEvent.getLinkInfo/1","ref":"wxHtmlLinkEvent.html#getLinkInfo/1"},{"type":"type","doc":"","title":"wxHtmlLinkEvent.wxHtmlLink/0","ref":"wxHtmlLinkEvent.html#t:wxHtmlLink/0"},{"type":"type","doc":"","title":"wxHtmlLinkEvent.wxHtmlLinkEvent/0","ref":"wxHtmlLinkEvent.html#t:wxHtmlLinkEvent/0"},{"type":"type","doc":"","title":"wxHtmlLinkEvent.wxHtmlLinkEventType/0","ref":"wxHtmlLinkEvent.html#t:wxHtmlLinkEventType/0"},{"type":"module","doc":"`m:wxHtmlWindow` is probably the only class you will directly use unless you want to do\nsomething special (like adding new tag handlers or MIME filters).\n\nThe purpose of this class is to display rich content pages (either local file or\ndownloaded via HTTP protocol) in a window based on a subset of the HTML standard. The\nwidth of the window is constant, given in the constructor and virtual height is changed\ndynamically depending on page size. Once the window is created you can set its content by\ncalling `setPage/2` with raw HTML, `loadPage/2` with a `wxFileSystem` (not implemented in wx) location or `loadFile/2` with a filename.\n\nNote: If you want complete HTML/CSS support as well as a Javascript engine, consider\nusing `m:wxWebView` instead.\n\n`m:wxHtmlWindow` uses the `m:wxImage` class for displaying images, so you need to\ninitialize the handlers for any image formats you use before loading a page. See\n?wxInitAllImageHandlers and `wxImage::AddHandler` (not implemented in wx).","title":"wxHtmlWindow","ref":"wxHtmlWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxHW_SCROLLBAR_NEVER: Never display scrollbars, not even when the page is larger than the\nwindow.\n\n* wxHW_SCROLLBAR_AUTO: Display scrollbars only if page's size exceeds window's size.\n\n* wxHW_NO_SELECTION: Don't allow the user to select text.\n\nSee: `m:wxHtmlLinkEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxHtmlWindow](https://docs.wxwidgets.org/3.2/classwx_html_window.html)","title":"Styles - wxHtmlWindow","ref":"wxHtmlWindow.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`html_cell_clicked`](`m:wxHtmlLinkEvent`)\n\n* [`html_cell_hover`](`m:wxHtmlLinkEvent`)\n\n* [`command_html_link_clicked`](`m:wxHtmlLinkEvent`)","title":"Events - wxHtmlWindow","ref":"wxHtmlWindow.html#module-events"},{"type":"function","doc":"Appends HTML fragment to currently displayed text and refreshes the window.\n\nReturn: false if an error occurred, true otherwise.","title":"wxHtmlWindow.appendToPage/2","ref":"wxHtmlWindow.html#appendToPage/2"},{"type":"function","doc":"Destroys the object","title":"wxHtmlWindow.destroy/1","ref":"wxHtmlWindow.html#destroy/1"},{"type":"function","doc":"Returns anchor within currently opened page (see `getOpenedPage/1`).\n\nIf no page is opened or if the displayed page wasn't produced by call to `loadPage/2`, empty string\nis returned.","title":"wxHtmlWindow.getOpenedAnchor/1","ref":"wxHtmlWindow.html#getOpenedAnchor/1"},{"type":"function","doc":"Returns full location of the opened page.\n\nIf no page is opened or if the displayed page wasn't produced by call to `loadPage/2`, empty string\nis returned.","title":"wxHtmlWindow.getOpenedPage/1","ref":"wxHtmlWindow.html#getOpenedPage/1"},{"type":"function","doc":"Returns title of the opened page or wxEmptyString if the current page does not contain\n* * tag.","title":"wxHtmlWindow.getOpenedPageTitle/1","ref":"wxHtmlWindow.html#getOpenedPageTitle/1"},{"type":"function","doc":"Returns the related frame.","title":"wxHtmlWindow.getRelatedFrame/1","ref":"wxHtmlWindow.html#getRelatedFrame/1"},{"type":"function","doc":"Moves back to the previous page.\n\nOnly pages displayed using `loadPage/2` are stored in history list.","title":"wxHtmlWindow.historyBack/1","ref":"wxHtmlWindow.html#historyBack/1"},{"type":"function","doc":"Returns true if it is possible to go back in the history i.e.\n\n`historyBack/1` won't fail.","title":"wxHtmlWindow.historyCanBack/1","ref":"wxHtmlWindow.html#historyCanBack/1"},{"type":"function","doc":"Returns true if it is possible to go forward in the history i.e.\n\n`historyForward/1` won't fail.","title":"wxHtmlWindow.historyCanForward/1","ref":"wxHtmlWindow.html#historyCanForward/1"},{"type":"function","doc":"Clears history.","title":"wxHtmlWindow.historyClear/1","ref":"wxHtmlWindow.html#historyClear/1"},{"type":"function","doc":"Moves to next page in history.\n\nOnly pages displayed using `loadPage/2` are stored in history list.","title":"wxHtmlWindow.historyForward/1","ref":"wxHtmlWindow.html#historyForward/1"},{"type":"function","doc":"Loads an HTML page from a file and displays it.\n\nReturn: false if an error occurred, true otherwise\n\nSee: `loadPage/2`","title":"wxHtmlWindow.loadFile/2","ref":"wxHtmlWindow.html#loadFile/2"},{"type":"function","doc":"Unlike `setPage/2` this function first loads the HTML page from `location` and then\ndisplays it.\n\nReturn: false if an error occurred, true otherwise\n\nSee: `loadFile/2`","title":"wxHtmlWindow.loadPage/2","ref":"wxHtmlWindow.html#loadPage/2"},{"type":"function","doc":"Default ctor.","title":"wxHtmlWindow.new/0","ref":"wxHtmlWindow.html#new/0"},{"type":"function","doc":"","title":"wxHtmlWindow.new/1","ref":"wxHtmlWindow.html#new/1"},{"type":"function","doc":"Constructor.\n\nThe parameters are the same as `wxScrolled::wxScrolled()` (not implemented in wx)\nconstructor.","title":"wxHtmlWindow.new/2","ref":"wxHtmlWindow.html#new/2"},{"type":"function","doc":"Selects all text in the window.\n\nSee:\n* `selectLine/2`\n\n* `selectWord/2`","title":"wxHtmlWindow.selectAll/1","ref":"wxHtmlWindow.html#selectAll/1"},{"type":"function","doc":"Returns the current selection as plain text.\n\nReturns an empty string if no text is currently selected.","title":"wxHtmlWindow.selectionToText/1","ref":"wxHtmlWindow.html#selectionToText/1"},{"type":"function","doc":"Selects the line of text that `pos` points at.\n\nNote that `pos` is relative to the top of displayed page, not to window's origin, use `wxScrolledWindow:calcUnscrolledPosition/3` to\nconvert physical coordinate.\n\nSee:\n* `selectAll/1`\n\n* `selectWord/2`","title":"wxHtmlWindow.selectLine/2","ref":"wxHtmlWindow.html#selectLine/2"},{"type":"function","doc":"Selects the word at position `pos`.\n\nNote that `pos` is relative to the top of displayed page, not to window's origin, use `wxScrolledWindow:calcUnscrolledPosition/3` to\nconvert physical coordinate.\n\nSee:\n* `selectAll/1`\n\n* `selectLine/2`","title":"wxHtmlWindow.selectWord/2","ref":"wxHtmlWindow.html#selectWord/2"},{"type":"function","doc":"This function sets the space between border of window and HTML contents.\n\nSee image:","title":"wxHtmlWindow.setBorders/2","ref":"wxHtmlWindow.html#setBorders/2"},{"type":"function","doc":"","title":"wxHtmlWindow.setFonts/3","ref":"wxHtmlWindow.html#setFonts/3"},{"type":"function","doc":"This function sets font sizes and faces.\n\nSee `wxHtmlDCRenderer::SetFonts` (not implemented in wx) for detailed description.","title":"wxHtmlWindow.setFonts/4","ref":"wxHtmlWindow.html#setFonts/4"},{"type":"function","doc":"Sets the source of a page and displays it, for example:\n\nIf you want to load a document from some location use `loadPage/2` instead.\n\nReturn: false if an error occurred, true otherwise.","title":"wxHtmlWindow.setPage/2","ref":"wxHtmlWindow.html#setPage/2"},{"type":"function","doc":"Sets the frame in which page title will be displayed.\n\n`format` is the format of the frame title, e.g. \"HtmlHelp : %s\". It must contain exactly\none s. This s is substituted with HTML page title.","title":"wxHtmlWindow.setRelatedFrame/3","ref":"wxHtmlWindow.html#setRelatedFrame/3"},{"type":"function","doc":"`After` calling `setRelatedFrame/3`, this sets statusbar slot where messages will be\ndisplayed.\n\n(Default is -1 = no messages.)","title":"wxHtmlWindow.setRelatedStatusBar/2","ref":"wxHtmlWindow.html#setRelatedStatusBar/2"},{"type":"function","doc":"`Sets` the associated statusbar where messages will be displayed.\n\nCall this instead of `setRelatedFrame/3` if you want statusbar updates only, no changing of the frame title.\n\nSince: 2.9.0","title":"wxHtmlWindow.setRelatedStatusBar/3","ref":"wxHtmlWindow.html#setRelatedStatusBar/3"},{"type":"function","doc":"Returns content of currently displayed page as plain text.","title":"wxHtmlWindow.toText/1","ref":"wxHtmlWindow.html#toText/1"},{"type":"type","doc":"","title":"wxHtmlWindow.wxHtmlWindow/0","ref":"wxHtmlWindow.html#t:wxHtmlWindow/0"},{"type":"module","doc":"An icon is a small rectangular bitmap usually used for denoting a minimized application.\n\nIt differs from a `m:wxBitmap` in always having a mask associated with it for transparent\ndrawing. On some platforms, icons and bitmaps are implemented identically, since there is\nno real distinction between a `m:wxBitmap` with a mask and an icon; and there is no\nspecific icon format on some platforms (X-based applications usually standardize on XPMs\nfor small bitmaps and icons). However, some platforms (such as Windows) make the\ndistinction, so a separate class is provided.\n\nRemark: It is usually desirable to associate a pertinent icon with a frame. Icons can\nalso be used for other purposes, for example with `m:wxTreeCtrl` and `m:wxListCtrl`. Icons\nhave different formats on different platforms therefore separate icons will usually be\ncreated for the different environments. Platform-specific methods for creating a `m:wxIcon`\nstructure are catered for, and this is an occasion where conditional compilation will\nprobably be required. Note that a new icon must be created for every time the icon is to\nbe used for a new window. In Windows, the icon will not be reloaded if it has already been\nused. An icon allocated to a frame will be deleted when the frame is deleted. For more\ninformation please see overview_bitmap.\n\nPredefined objects (include wx.hrl): ?wxNullIcon\n\nSee:\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap)\n\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap_supportedformats)\n\n* `m:wxIconBundle`\n\n* `wxDC:drawIcon/3`\n\n* `m:wxCursor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxIcon](https://docs.wxwidgets.org/3.2/classwx_icon.html)","title":"wxIcon","ref":"wxIcon.html"},{"type":"function","doc":"Copies `bmp` bitmap to this icon.\n\nUnder MS Windows the bitmap must have mask colour set.\n\nSee: `wxBitmap:loadFile/3`","title":"wxIcon.copyFromBitmap/2","ref":"wxIcon.html#copyFromBitmap/2"},{"type":"function","doc":"Destroys the object","title":"wxIcon.destroy/1","ref":"wxIcon.html#destroy/1"},{"type":"function","doc":"Default ctor.\n\nConstructs an icon object with no data; an assignment or another member function such as `wxBitmap:loadFile/3`\nmust be called subsequently.","title":"wxIcon.new/0","ref":"wxIcon.html#new/0"},{"type":"function","doc":"Copy ctor.","title":"wxIcon.new/1","ref":"wxIcon.html#new/1"},{"type":"function","doc":"Loads an icon from a file or resource.\n\nSee: `wxBitmap:loadFile/3`","title":"wxIcon.new/2","ref":"wxIcon.html#new/2"},{"type":"type","doc":"","title":"wxIcon.wxIcon/0","ref":"wxIcon.html#t:wxIcon/0"},{"type":"module","doc":"This class contains multiple copies of an icon in different sizes.\n\nIt is typically used in `wxDialog::SetIcons` (not implemented in wx) and `wxTopLevelWindow:setIcons/2`.\n\nPredefined objects (include wx.hrl): ?wxNullIconBundle\n\nwxWidgets docs: [wxIconBundle](https://docs.wxwidgets.org/3.2/classwx_icon_bundle.html)","title":"wxIconBundle","ref":"wxIconBundle.html"},{"type":"function","doc":"Adds the icon to the collection; if the collection already contains an icon with the same\nwidth and height, it is replaced by the new one.","title":"wxIconBundle.addIcon/2","ref":"wxIconBundle.html#addIcon/2"},{"type":"function","doc":"","title":"wxIconBundle.addIcon/3","ref":"wxIconBundle.html#addIcon/3"},{"type":"function","doc":"Destroys the object","title":"wxIconBundle.destroy/1","ref":"wxIconBundle.html#destroy/1"},{"type":"function","doc":"","title":"wxIconBundle.getIcon/1","ref":"wxIconBundle.html#getIcon/1"},{"type":"function","doc":"Same as.\n\n.","title":"wxIconBundle.getIcon/2","ref":"wxIconBundle.html#getIcon/2"},{"type":"function","doc":"Returns the icon with the given size.\n\nIf `size` is ?wxDefaultSize, it is interpreted as the standard system icon size, i.e. the\nsize returned by `wxSystemSettings:getMetric/2` for `wxSYS_ICON_X` and `wxSYS_ICON_Y`.\n\nIf the bundle contains an icon with exactly the requested size, it's always returned.\nOtherwise, the behaviour depends on the flags. If only `wxIconBundle::FALLBACK_NONE` (not\nimplemented in wx) is given, the function returns an invalid icon. If `wxIconBundle::FALLBACK_SYSTEM`\n(not implemented in wx) is given, it tries to find the icon of standard system size,\nregardless of the size passed as parameter. Otherwise, or if the icon system size is not\nfound neither, but `wxIconBundle::FALLBACK_NEAREST_LARGER` (not implemented in wx) flag is\nspecified, the function returns the smallest icon of the size larger than the requested\none or, if this fails too, just the icon closest to the specified size.\n\nThe `flags` parameter is available only since wxWidgets 2.9.4.","title":"wxIconBundle.getIcon/3","ref":"wxIconBundle.html#getIcon/3"},{"type":"function","doc":"Default ctor.","title":"wxIconBundle.new/0","ref":"wxIconBundle.html#new/0"},{"type":"function","doc":"Initializes the bundle with the icon(s) found in the file.","title":"wxIconBundle.new/1","ref":"wxIconBundle.html#new/1"},{"type":"function","doc":"","title":"wxIconBundle.new/2","ref":"wxIconBundle.html#new/2"},{"type":"type","doc":"","title":"wxIconBundle.wxIconBundle/0","ref":"wxIconBundle.html#t:wxIconBundle/0"},{"type":"module","doc":"An event being sent when the frame is iconized (minimized) or restored.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxTopLevelWindow:iconize/2`\n\n* `wxTopLevelWindow:isIconized/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxIconizeEvent](https://docs.wxwidgets.org/3.2/classwx_iconize_event.html)","title":"wxIconizeEvent","ref":"wxIconizeEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxIconizeEventType` to subscribe to events of this type.","title":"Events - wxIconizeEvent","ref":"wxIconizeEvent.html#module-events"},{"type":"function","doc":"Returns true if the frame has been iconized, false if it has been restored.","title":"wxIconizeEvent.isIconized/1","ref":"wxIconizeEvent.html#isIconized/1"},{"type":"type","doc":"","title":"wxIconizeEvent.wxIconize/0","ref":"wxIconizeEvent.html#t:wxIconize/0"},{"type":"type","doc":"","title":"wxIconizeEvent.wxIconizeEvent/0","ref":"wxIconizeEvent.html#t:wxIconizeEvent/0"},{"type":"type","doc":"","title":"wxIconizeEvent.wxIconizeEventType/0","ref":"wxIconizeEvent.html#t:wxIconizeEventType/0"},{"type":"module","doc":"This class is used for idle events, which are generated when the system becomes idle.\n\nNote that, unless you do something specifically, the idle events are not sent if the\nsystem remains idle once it has become it, e.g. only a single idle event will be generated\nuntil something else resulting in more normal events happens and only then is the next\nidle event sent again.\n\nIf you need to ensure a continuous stream of idle events, you can either use `requestMore/2` method in\nyour handler or call ?wxWakeUpIdle() periodically (for example from a timer event\nhandler), but note that both of these approaches (and especially the first one) increase\nthe system load and so should be avoided if possible.\n\nBy default, idle events are sent to all windows, including even the hidden ones because\nthey may be shown if some condition is met from their `wxEVT_IDLE` (or related `wxEVT_UPDATE_UI`)\nhandler. The children of hidden windows do not receive idle events however as they can't\nchange their state in any way noticeable by the user. Finally, the global `wxApp` (not\nimplemented in wx) object also receives these events, as usual, so it can be used for any\nglobal idle time processing.\n\nIf sending idle events to all windows is causing a significant overhead in your\napplication, you can call `setMode/1` with the value wxIDLE_PROCESS_SPECIFIED, and set the\nwxWS_EX_PROCESS_IDLE extra window style for every window which should receive idle events,\nall the other ones will not receive them in this case.\n\nDelayed Action Mechanism\n\n`m:wxIdleEvent` can be used to perform some action \"at slightly later time\". This can be\nnecessary in several circumstances when, for whatever reason, something can't be done in\nthe current event handler. For example, if a mouse event handler is called with the mouse\nbutton pressed, the mouse can be currently captured and some operations with it - notably\ncapturing it again - might be impossible or lead to undesirable results. If you still want\nto capture it, you can do it from `wxEVT_IDLE` handler when it is called the next time\ninstead of doing it immediately.\n\nThis can be achieved in two different ways: when using static event tables, you will need\na flag indicating to the (always connected) idle event handler whether the desired action\nshould be performed. The originally called handler would then set it to indicate that it\nshould indeed be done and the idle handler itself would reset it to prevent it from doing\nthe same action again.\n\nUsing dynamically connected event handlers things are even simpler as the original event\nhandler can simply `wxEvtHandler::Connect()` (not implemented in wx) or `wxEvtHandler::Bind()`\n(not implemented in wx) the idle event handler which would only be executed then and\ncould `wxEvtHandler::Disconnect()` (not implemented in wx) or `wxEvtHandler::Unbind()`\n(not implemented in wx) itself.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxUpdateUIEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxIdleEvent](https://docs.wxwidgets.org/3.2/classwx_idle_event.html)","title":"wxIdleEvent","ref":"wxIdleEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxIdleEventType` to subscribe to events of this type.","title":"Events - wxIdleEvent","ref":"wxIdleEvent.html#module-events"},{"type":"function","doc":"Static function returning a value specifying how wxWidgets will send idle events: to all\nwindows, or only to those which specify that they will process the events.\n\nSee: `setMode/1`","title":"wxIdleEvent.getMode/0","ref":"wxIdleEvent.html#getMode/0"},{"type":"function","doc":"Returns true if the OnIdle function processing this event requested more processing time.\n\nSee: `requestMore/2`","title":"wxIdleEvent.moreRequested/1","ref":"wxIdleEvent.html#moreRequested/1"},{"type":"function","doc":"","title":"wxIdleEvent.requestMore/1","ref":"wxIdleEvent.html#requestMore/1"},{"type":"function","doc":"Tells wxWidgets that more processing is required.\n\nThis function can be called by an OnIdle handler for a window or window event handler to\nindicate that wxApp::OnIdle should forward the OnIdle event once more to the application windows.\n\nIf no window calls this function during OnIdle, then the application will remain in a\npassive event loop (not calling OnIdle) until a new event is posted to the application by\nthe windowing system.\n\nSee: `moreRequested/1`","title":"wxIdleEvent.requestMore/2","ref":"wxIdleEvent.html#requestMore/2"},{"type":"function","doc":"Static function for specifying how wxWidgets will send idle events: to all windows, or\nonly to those which specify that they will process the events.","title":"wxIdleEvent.setMode/1","ref":"wxIdleEvent.html#setMode/1"},{"type":"type","doc":"","title":"wxIdleEvent.wxIdle/0","ref":"wxIdleEvent.html#t:wxIdle/0"},{"type":"type","doc":"","title":"wxIdleEvent.wxIdleEvent/0","ref":"wxIdleEvent.html#t:wxIdleEvent/0"},{"type":"type","doc":"","title":"wxIdleEvent.wxIdleEventType/0","ref":"wxIdleEvent.html#t:wxIdleEventType/0"},{"type":"module","doc":"This class encapsulates a platform-independent image.\n\nAn image can be created from data, or using `wxBitmap:convertToImage/1`. An image can be loaded from a file in a\nvariety of formats, and is extensible to new formats via image format handlers. Functions\nare available to set and get image bits, so it can be used for basic image manipulation.\n\nA `m:wxImage` cannot (currently) be drawn directly to a `m:wxDC`. Instead, a\nplatform-specific `m:wxBitmap` object must be created from it using the\nwxBitmap::wxBitmap(wxImage,int depth) constructor. This bitmap can then be drawn in a\ndevice context, using `wxDC:drawBitmap/4`.\n\nMore on the difference between `m:wxImage` and `m:wxBitmap`: `m:wxImage` is just a buffer\nof RGB bytes with an optional buffer for the alpha bytes. It is all generic, platform\nindependent and image file format independent code. It includes generic code for scaling,\nresizing, clipping, and other manipulations of the image data. OTOH, `m:wxBitmap` is\nintended to be a wrapper of whatever is the native image format that is quickest/easiest\nto draw to a DC or to be the target of the drawing operations performed on a `m:wxMemoryDC`.\nBy splitting the responsibilities between wxImage/wxBitmap like this then it's easier to\nuse generic code shared by all platforms and image types for generic operations and\nplatform specific code where performance or compatibility is needed.\n\nOne colour value of the image may be used as a mask colour which will lead to the\nautomatic creation of a `m:wxMask` object associated to the bitmap object.\n\nAlpha channel support\n\nStarting from wxWidgets 2.5.0 `m:wxImage` supports alpha channel data, that is in\naddition to a byte for the red, green and blue colour components for each pixel it also\nstores a byte representing the pixel opacity.\n\nAn alpha value of 0 corresponds to a transparent pixel (null opacity) while a value of\n255 means that the pixel is 100% opaque. The constants ?wxIMAGE\\_ALPHA\\_TRANSPARENT and\n?wxIMAGE\\_ALPHA\\_OPAQUE can be used to indicate those values in a more readable form.\n\nWhile all images have RGB data, not all images have an alpha channel. Before using `getAlpha/3` you\nshould check if this image contains an alpha channel with `hasAlpha/1`. Currently the BMP, PNG, TGA,\nand TIFF format handlers have full alpha channel support for loading so if you want to use\nalpha you have to use one of these formats. If you initialize the image alpha channel\nyourself using `setAlpha/4`, you should save it in either PNG, TGA, or TIFF format to avoid losing it\nas these are the only handlers that currently support saving with alpha.\n\nAvailable image handlers\n\nThe following image handlers are available. wxBMPHandler is always installed by default.\nTo use other image formats, install the appropriate handler with `wxImage::AddHandler`\n(not implemented in wx) or call ?wxInitAllImageHandlers().\n\n* wxBMPHandler: For loading (including alpha support) and saving, always installed.\n\n* `wxPNGHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxJPEGHandler` (not implemented in wx): For loading and saving.\n\n* `wxGIFHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxPCXHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxPNMHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxTIFFHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxTGAHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxIFFHandler` (not implemented in wx): For loading only.\n\n* `wxXPMHandler` (not implemented in wx): For loading and saving.\n\n* wxICOHandler: For loading and saving.\n\n* wxCURHandler: For loading and saving.\n\n* wxANIHandler: For loading only.\n\nWhen saving in PCX format, `wxPCXHandler` (not implemented in wx) will count the number\nof different colours in the image; if there are 256 or less colours, it will save as 8\nbit, else it will save as 24 bit.\n\nLoading PNMs only works for ASCII or raw RGB images. When saving in PNM format, `wxPNMHandler`\n(not implemented in wx) will always save as raw RGB.\n\nSaving GIFs requires images of maximum 8 bpp (see `wxQuantize` (not implemented in wx)),\nand the alpha channel converted to a mask (see `convertAlphaToMask/5`). Saving an animated GIF requires images of\nthe same size (see `wxGIFHandler::SaveAnimation` (not implemented in wx))\n\nPredefined objects (include wx.hrl): ?wxNullImage\n\nSee:\n* `m:wxBitmap`\n\n* ?wxInitAllImageHandlers()\n\nwxWidgets docs: [wxImage](https://docs.wxwidgets.org/3.2/classwx_image.html)","title":"wxImage","ref":"wxImage.html"},{"type":"function","doc":"Blurs the image in both horizontal and vertical directions by the specified pixel `blurRadius`.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blurHorizontal/2`\n\n* `blurVertical/2`","title":"wxImage.blur/2","ref":"wxImage.html#blur/2"},{"type":"function","doc":"Blurs the image in the horizontal direction only.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blur/2`\n\n* `blurVertical/2`","title":"wxImage.blurHorizontal/2","ref":"wxImage.html#blurHorizontal/2"},{"type":"function","doc":"Blurs the image in the vertical direction only.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blur/2`\n\n* `blurHorizontal/2`","title":"wxImage.blurVertical/2","ref":"wxImage.html#blurVertical/2"},{"type":"function","doc":"","title":"wxImage.convertAlphaToMask/1","ref":"wxImage.html#convertAlphaToMask/1"},{"type":"function","doc":"If the image has alpha channel, this method converts it to mask.\n\nIf the image has an alpha channel, all pixels with alpha value less than `threshold` are\nreplaced with the mask colour and the alpha channel is removed. Otherwise nothing is done.\n\nThe mask colour is chosen automatically using `findFirstUnusedColour/2`, see the overload below if this is not appropriate.\n\nReturn: Returns true on success, false on error.","title":"wxImage.convertAlphaToMask/2","ref":"wxImage.html#convertAlphaToMask/2"},{"type":"function","doc":"","title":"wxImage.convertAlphaToMask/4","ref":"wxImage.html#convertAlphaToMask/4"},{"type":"function","doc":"If the image has alpha channel, this method converts it to mask using the specified\ncolour as the mask colour.\n\nIf the image has an alpha channel, all pixels with alpha value less than `threshold` are\nreplaced with the mask colour and the alpha channel is removed. Otherwise nothing is done.\n\nSince: 2.9.0\n\nReturn: Returns true on success, false on error.","title":"wxImage.convertAlphaToMask/5","ref":"wxImage.html#convertAlphaToMask/5"},{"type":"function","doc":"Returns a greyscale version of the image.\n\nSince: 2.9.0","title":"wxImage.convertToGreyscale/1","ref":"wxImage.html#convertToGreyscale/1"},{"type":"function","doc":"Returns a greyscale version of the image.\n\nThe returned image uses the luminance component of the original to calculate the\ngreyscale. Defaults to using the standard ITU-T BT.601 when converting to YUV, where every\npixel equals (R * `weight_r`) + (G * `weight_g`) + (B * `weight_b`).","title":"wxImage.convertToGreyscale/4","ref":"wxImage.html#convertToGreyscale/4"},{"type":"function","doc":"Returns monochromatic version of the image.\n\nThe returned image has white colour where the original has (r,g,b) colour and black\ncolour everywhere else.","title":"wxImage.convertToMono/4","ref":"wxImage.html#convertToMono/4"},{"type":"function","doc":"Returns an identical copy of this image.","title":"wxImage.copy/1","ref":"wxImage.html#copy/1"},{"type":"function","doc":"","title":"wxImage.create/2","ref":"wxImage.html#create/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxImage.create/3","ref":"wxImage.html#create/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxImage.create/4","ref":"wxImage.html#create/4"},{"type":"function","doc":"Creates a fresh image.\n\nSee `new/4` for more info.\n\nReturn: true if the call succeeded, false otherwise.","title":"wxImage.create/5","ref":"wxImage.html#create/5"},{"type":"function","doc":"Destroys the image data.","title":"wxImage.Destroy/1","ref":"wxImage.html#Destroy/1"},{"type":"function","doc":"Destroys the object","title":"wxImage.destroy/1","ref":"wxImage.html#destroy/1"},{"type":"function","doc":"","title":"wxImage.findFirstUnusedColour/1","ref":"wxImage.html#findFirstUnusedColour/1"},{"type":"function","doc":"Finds the first colour that is never used in the image.\n\nThe search begins at given initial colour and continues by increasing R, G and B\ncomponents (in this order) by 1 until an unused colour is found or the colour space exhausted.\n\nThe parameters `r`, `g`, `b` are pointers to variables to save the colour.\n\nThe parameters `startR`, `startG`, `startB` define the initial values of the colour. The\nreturned colour will have RGB values equal to or greater than these.\n\nReturn: Returns false if there is no unused colour left, true on success.\n\nNote: This method involves computing the histogram, which is a computationally intensive\noperation.","title":"wxImage.findFirstUnusedColour/2","ref":"wxImage.html#findFirstUnusedColour/2"},{"type":"function","doc":"Returns pointer to the array storing the alpha values for this image.\n\nThis pointer is NULL for the images without the alpha channel. If the image does have it,\nthis pointer may be used to directly manipulate the alpha values which are stored as the\nRGB ones.","title":"wxImage.getAlpha/1","ref":"wxImage.html#getAlpha/1"},{"type":"function","doc":"Return alpha value at given pixel location.","title":"wxImage.getAlpha/3","ref":"wxImage.html#getAlpha/3"},{"type":"function","doc":"Returns the blue intensity at the given coordinate.","title":"wxImage.getBlue/3","ref":"wxImage.html#getBlue/3"},{"type":"function","doc":"Returns the image data as an array.\n\nThis is most often used when doing direct image manipulation. The return value points to\nan array of characters in RGBRGBRGB... format in the top-to-bottom, left-to-right order,\nthat is the first RGB triplet corresponds to the first pixel of the first row, the second\none - to the second pixel of the first row and so on until the end of the first row, with\nsecond row following after it and so on.\n\nYou should not delete the returned pointer nor pass it to `setData/4`.","title":"wxImage.getData/1","ref":"wxImage.html#getData/1"},{"type":"function","doc":"Returns the green intensity at the given coordinate.","title":"wxImage.getGreen/3","ref":"wxImage.html#getGreen/3"},{"type":"function","doc":"Gets the height of the image in pixels.\n\nSee: `getWidth/1`","title":"wxImage.getHeight/1","ref":"wxImage.html#getHeight/1"},{"type":"function","doc":"","title":"wxImage.getImageCount/1","ref":"wxImage.html#getImageCount/1"},{"type":"function","doc":"If the image file contains more than one image and the image handler is capable of\nretrieving these individually, this function will return the number of available images.\n\nFor the overload taking the parameter `filename`, that's the name of the file to query.\nFor the overload taking the parameter `stream`, that's the opened input stream with image data.\n\nSee `wxImageHandler::GetImageCount()` (not implemented in wx) for more info.\n\nThe parameter `type` may be one of the following values:\n\n* wxBITMAP_TYPE_BMP: Load a Windows bitmap file.\n\n* wxBITMAP_TYPE_GIF: Load a GIF bitmap file.\n\n* wxBITMAP_TYPE_JPEG: Load a JPEG bitmap file.\n\n* wxBITMAP_TYPE_PNG: Load a PNG bitmap file.\n\n* wxBITMAP_TYPE_PCX: Load a PCX bitmap file.\n\n* wxBITMAP_TYPE_PNM: Load a PNM bitmap file.\n\n* wxBITMAP_TYPE_TIFF: Load a TIFF bitmap file.\n\n* wxBITMAP_TYPE_TGA: Load a TGA bitmap file.\n\n* wxBITMAP_TYPE_XPM: Load a XPM bitmap file.\n\n* wxBITMAP_TYPE_ICO: Load a Windows icon file (ICO).\n\n* wxBITMAP_TYPE_CUR: Load a Windows cursor file (CUR).\n\n* wxBITMAP_TYPE_ANI: Load a Windows animated cursor file (ANI).\n\n* wxBITMAP_TYPE_ANY: Will try to autodetect the format.\n\nReturn: Number of available images. For most image handlers, this is 1 (exceptions are\nTIFF and ICO formats as well as animated GIFs for which this function returns the number\nof frames in the animation).","title":"wxImage.getImageCount/2","ref":"wxImage.html#getImageCount/2"},{"type":"function","doc":"Iterates all registered `wxImageHandler` (not implemented in wx) objects, and returns a\nstring containing file extension masks suitable for passing to file open/save dialog\nboxes.\n\nReturn: The format of the returned string is `\"(*.ext1;*.ext2)|*.ext1;*.ext2\"`. It is\nusually a good idea to prepend a description before passing the result to the dialog.\nExample:","title":"wxImage.getImageExtWildcard/0","ref":"wxImage.html#getImageExtWildcard/0"},{"type":"function","doc":"Gets the blue value of the mask colour.","title":"wxImage.getMaskBlue/1","ref":"wxImage.html#getMaskBlue/1"},{"type":"function","doc":"Gets the green value of the mask colour.","title":"wxImage.getMaskGreen/1","ref":"wxImage.html#getMaskGreen/1"},{"type":"function","doc":"Gets the red value of the mask colour.","title":"wxImage.getMaskRed/1","ref":"wxImage.html#getMaskRed/1"},{"type":"function","doc":"Gets a user-defined string-valued option.\n\nGeneric options:\n\n* `wxIMAGE_OPTION_FILENAME:` The name of the file from which the image was loaded.\n\nOptions specific to `wxGIFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_GIF_COMMENT:` The comment text that is read from or written to the GIF\nfile. In an animated GIF each frame can have its own comment. If there is only a comment\nin the first frame of a GIF it will not be repeated in other frames.\n\nReturn: The value of the option or an empty string if not found. Use `hasOption/2` if an empty string\ncan be a valid option value.\n\nSee:\n* `setOption/3`\n\n* `getOptionInt/2`\n\n* `hasOption/2`","title":"wxImage.getOption/2","ref":"wxImage.html#getOption/2"},{"type":"function","doc":"Gets a user-defined integer-valued option.\n\nThe function is case-insensitive to `name`. If the given option is not present, the\nfunction returns 0. Use `hasOption/2` if 0 is a possibly valid value for the option.\n\nGeneric options:\n\n* `wxIMAGE_OPTION_MAX_WIDTH` and `wxIMAGE_OPTION_MAX_HEIGHT:` If either of these options is\nspecified, the loaded image will be scaled down (preserving its aspect ratio) so that its\nwidth is less than the max width given if it is not 0 `and` its height is less than the\nmax height given if it is not 0. This is typically used for loading thumbnails and the\nadvantage of using these options compared to calling `rescale/4` after loading is that some handlers\n(only JPEG one right now) support rescaling the image during loading which is vastly more\nefficient than loading the entire huge image and rescaling it later (if these options are\nnot supported by the handler, this is still what happens however). These options must be\nset before calling `loadFile/4` to have any effect.\n\n* `wxIMAGE_OPTION_ORIGINAL_WIDTH` and `wxIMAGE_OPTION_ORIGINAL_HEIGHT:` These options will\nreturn the original size of the image if either `wxIMAGE_OPTION_MAX_WIDTH` or `wxIMAGE_OPTION_MAX_HEIGHT`\nis specified.\n\nSince: 2.9.3\n\n* `wxIMAGE_OPTION_QUALITY:` JPEG quality used when saving. This is an integer in 0..100\nrange with 0 meaning very poor and 100 excellent (but very badly compressed). This option\nis currently ignored for the other formats.\n\n* `wxIMAGE_OPTION_RESOLUTIONUNIT:` The value of this option determines whether the\nresolution of the image is specified in centimetres or inches, see wxImageResolution enum elements.\n\n* `wxIMAGE_OPTION_RESOLUTION`, `wxIMAGE_OPTION_RESOLUTIONX` and `wxIMAGE_OPTION_RESOLUTIONY:`\nThese options define the resolution of the image in the units corresponding to `wxIMAGE_OPTION_RESOLUTIONUNIT`\noptions value. The first option can be set before saving the image to set both horizontal\nand vertical resolution to the same value. The X and Y options are set by the image\nhandlers if they support the image resolution (currently BMP, JPEG and TIFF handlers do)\nand the image provides the resolution information and can be queried after loading the image.\n\nOptions specific to `wxPNGHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_PNG_FORMAT:` Format for saving a PNG file, see wxImagePNGType for the\nsupported values.\n\n* `wxIMAGE_OPTION_PNG_BITDEPTH:` Bit depth for every channel (R/G/B/A).\n\n* `wxIMAGE_OPTION_PNG_FILTER:` Filter for saving a PNG file, see libpng ([http://www.libpng.org/pub/png/libpng-1.2.5-manual.html](http://www.libpng.org/pub/png/libpng-1.2.5-manual.html))\nfor possible values (e.g. PNG_FILTER_NONE, PNG_FILTER_SUB, PNG_FILTER_UP, etc).\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL:` Compression level (0..9) for saving a PNG file.\nAn high value creates smaller-but-slower PNG file. Note that unlike other formats (e.g.\nJPEG) the PNG format is always lossless and thus this compression level doesn't tradeoff\nthe image quality.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_MEM_LEVEL:` Compression memory usage level (1..9) for\nsaving a PNG file. An high value means the saving process consumes more memory, but may\ncreate smaller PNG file.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY:` Possible values are 0 for default strategy, 1\nfor filter, and 2 for Huffman-only. You can use OptiPNG ([http://optipng.sourceforge.net/](http://optipng.sourceforge.net/))\nto get a suitable value for your application.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_BUFFER_SIZE:` Internal buffer size (in bytes) for saving\na PNG file. Ideally this should be as big as the resulting PNG file. Use this option if\nyour application produces images with small size variation.\n\nOptions specific to `wxTIFFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE:` Number of bits per sample (channel). Currently\nvalues of 1 and 8 are supported. A value of 1 results in a black and white image. A value\nof 8 (the default) can mean greyscale or RGB, depending on the value of `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL`.\n\n* `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL:` Number of samples (channels) per pixel. Currently\nvalues of 1 and 3 are supported. A value of 1 results in either a greyscale (by default)\nor black and white image, depending on the value of `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE`. A\nvalue of 3 (the default) will result in an RGB image.\n\n* `wxIMAGE_OPTION_TIFF_COMPRESSION:` Compression type. By default it is set to 1\n(COMPRESSION_NONE). Typical other values are 5 (COMPRESSION_LZW) and 7 (COMPRESSION_JPEG).\nSee tiff.h for more options.\n\n* `wxIMAGE_OPTION_TIFF_PHOTOMETRIC:` Specifies the photometric interpretation. By default\nit is set to 2 (PHOTOMETRIC_RGB) for RGB images and 0 (PHOTOMETRIC_MINISWHITE) for\ngreyscale or black and white images. It can also be set to 1 (PHOTOMETRIC_MINISBLACK) to\ntreat the lowest value as black and highest as white. If you want a greyscale image it is\nalso sufficient to only specify `wxIMAGE_OPTION_TIFF_PHOTOMETRIC` and set it to either\nPHOTOMETRIC_MINISWHITE or PHOTOMETRIC_MINISBLACK. The other values are taken care of.\n\nOptions specific to `wxGIFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_GIF_TRANSPARENCY:` How to deal with transparent pixels. By default, the\ncolor of transparent pixels is changed to bright pink, so that if the image is\naccidentally drawn without transparency, it will be obvious. Normally, this would not be\nnoticed, as these pixels will not be rendered. But in some cases it might be useful to\nload a GIF without making any modifications to its colours. Use `wxIMAGE_OPTION_GIF_TRANSPARENCY_UNCHANGED`\nto keep the colors correct. Use `wxIMAGE_OPTION_GIF_TRANSPARENCY_HIGHLIGHT` to convert\ntransparent pixels to pink (default). This option has been added in wxWidgets 3.1.1.\n\nNote: Be careful when combining the options `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL`, `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE`,\nand `wxIMAGE_OPTION_TIFF_PHOTOMETRIC`. While some measures are taken to prevent illegal\ncombinations and/or values, it is still easy to abuse them and come up with invalid\nresults in the form of either corrupted images or crashes.\n\nReturn: The value of the option or 0 if not found. Use `hasOption/2` if 0 can be a valid option value.\n\nSee:\n* `setOption/3`\n\n* `getOption/2`","title":"wxImage.getOptionInt/2","ref":"wxImage.html#getOptionInt/2"},{"type":"function","doc":"Get the current mask colour or find a suitable unused colour that could be used as a mask\ncolour.\n\nReturns true if the image currently has a mask.","title":"wxImage.getOrFindMaskColour/1","ref":"wxImage.html#getOrFindMaskColour/1"},{"type":"function","doc":"Returns the palette associated with the image.\n\nCurrently the palette is only used when converting to `m:wxBitmap` under Windows.\n\nSome of the `m:wxImage` handlers have been modified to set the palette if one exists in\nthe image file (usually 256 or less colour images in GIF or PNG format).","title":"wxImage.getPalette/1","ref":"wxImage.html#getPalette/1"},{"type":"function","doc":"Returns the red intensity at the given coordinate.","title":"wxImage.getRed/3","ref":"wxImage.html#getRed/3"},{"type":"function","doc":"Returns a sub image of the current one as long as the rect belongs entirely to the image.","title":"wxImage.getSubImage/2","ref":"wxImage.html#getSubImage/2"},{"type":"function","doc":"Gets the width of the image in pixels.\n\nSee: `getHeight/1`","title":"wxImage.getWidth/1","ref":"wxImage.html#getWidth/1"},{"type":"function","doc":"Returns true if this image has alpha channel, false otherwise.\n\nSee:\n* `getAlpha/3`\n\n* `setAlpha/4`","title":"wxImage.hasAlpha/1","ref":"wxImage.html#hasAlpha/1"},{"type":"function","doc":"Returns true if there is a mask active, false otherwise.","title":"wxImage.hasMask/1","ref":"wxImage.html#hasMask/1"},{"type":"function","doc":"Returns true if the given option is present.\n\nThe function is case-insensitive to `name`.\n\nThe lists of the currently supported options are in `getOption/2` and `getOptionInt/2` function docs.\n\nSee:\n* `setOption/3`\n\n* `getOption/2`\n\n* `getOptionInt/2`","title":"wxImage.hasOption/2","ref":"wxImage.html#hasOption/2"},{"type":"function","doc":"Initializes the image alpha channel data.\n\nIt is an error to call it if the image already has alpha data. If it doesn't, alpha data\nwill be by default initialized to all pixels being fully opaque. But if the image has a\nmask colour, all mask pixels will be completely transparent.","title":"wxImage.initAlpha/1","ref":"wxImage.html#initAlpha/1"},{"type":"function","doc":"Internal use only.\n\nAdds standard image format handlers. It only install wxBMPHandler for the time being,\nwhich is used by `m:wxBitmap`.\n\nThis function is called by wxWidgets on startup, and shouldn't be called by the user.\n\nSee: ?wxInitAllImageHandlers()","title":"wxImage.initStandardHandlers/0","ref":"wxImage.html#initStandardHandlers/0"},{"type":"function","doc":"Returns true if image data is present.","title":"wxImage.isOk/1","ref":"wxImage.html#isOk/1"},{"type":"function","doc":"","title":"wxImage.isTransparent/3","ref":"wxImage.html#isTransparent/3"},{"type":"function","doc":"Returns true if the given pixel is transparent, i.e. either has the mask colour if this\nimage has a mask or if this image has alpha channel and alpha value of this pixel is\nstrictly less than `threshold`.","title":"wxImage.isTransparent/4","ref":"wxImage.html#isTransparent/4"},{"type":"function","doc":"","title":"wxImage.loadFile/2","ref":"wxImage.html#loadFile/2"},{"type":"function","doc":"Loads an image from a file.\n\nIf no handler type is provided, the library will try to autodetect the format.","title":"wxImage.loadFile/3","ref":"wxImage.html#loadFile/3"},{"type":"function","doc":"Loads an image from a file.\n\nIf no handler type is provided, the library will try to autodetect the format.","title":"wxImage.loadFile/4","ref":"wxImage.html#loadFile/4"},{"type":"function","doc":"","title":"wxImage.mirror/1","ref":"wxImage.html#mirror/1"},{"type":"function","doc":"Returns a mirrored copy of the image.\n\nThe parameter `horizontally` indicates the orientation.","title":"wxImage.mirror/2","ref":"wxImage.html#mirror/2"},{"type":"function","doc":"Creates an empty `m:wxImage` object without an alpha channel.","title":"wxImage.new/0","ref":"wxImage.html#new/0"},{"type":"function","doc":"Equivalent to: `new/2`","title":"wxImage.new/1","ref":"wxImage.html#new/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxImage.new/2","ref":"wxImage.html#new/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxImage.new/3","ref":"wxImage.html#new/3"},{"type":"function","doc":"Creates an image from data in memory.\n\nIf `static_data` is false then the `m:wxImage` will take ownership of the data and free\nit afterwards. For this, it has to be allocated with `malloc`.","title":"wxImage.new/4","ref":"wxImage.html#new/4"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxImage.ok/1","ref":"wxImage.html#ok/1"},{"type":"function","doc":"Finds the handler with the given name, and removes it.\n\nThe handler is also deleted.\n\nReturn: true if the handler was found and removed, false otherwise.","title":"wxImage.removeHandler/1","ref":"wxImage.html#removeHandler/1"},{"type":"function","doc":"Replaces the colour specified by `r1`,g1,b1 by the colour `r2`,g2,b2.","title":"wxImage.replace/7","ref":"wxImage.html#replace/7"},{"type":"function","doc":"","title":"wxImage.rescale/3","ref":"wxImage.html#rescale/3"},{"type":"function","doc":"Changes the size of the image in-place by scaling it: after a call to this function,the\nimage will have the given width and height.\n\nFor a description of the `quality` parameter, see the `scale/4` function. Returns the (modified)\nimage itself.\n\nSee: `scale/4`","title":"wxImage.rescale/4","ref":"wxImage.html#rescale/4"},{"type":"function","doc":"","title":"wxImage.resize/3","ref":"wxImage.html#resize/3"},{"type":"function","doc":"Changes the size of the image in-place without scaling it by adding either a border with\nthe given colour or cropping as necessary.\n\nThe image is pasted into a new image with the given `size` and background colour at the\nposition `pos` relative to the upper left of the new image.\n\nIf `red` = green = blue = -1 then use either the current mask colour if set or find, use,\nand set a suitable mask colour for any newly exposed areas.\n\nReturn: The (modified) image itself.\n\nSee: `size/4`","title":"wxImage.resize/4","ref":"wxImage.html#resize/4"},{"type":"function","doc":"","title":"wxImage.rotate90/1","ref":"wxImage.html#rotate90/1"},{"type":"function","doc":"Returns a copy of the image rotated 90 degrees in the direction indicated by `clockwise`.","title":"wxImage.rotate90/2","ref":"wxImage.html#rotate90/2"},{"type":"function","doc":"","title":"wxImage.rotate/3","ref":"wxImage.html#rotate/3"},{"type":"function","doc":"Rotates the image about the given point, by `angle` radians.\n\nPassing true to `interpolating` results in better image quality, but is slower.\n\nIf the image has a mask, then the mask colour is used for the uncovered pixels in the\nrotated image background. Else, black (rgb 0, 0, 0) will be used.\n\nReturns the rotated image, leaving this image intact.","title":"wxImage.rotate/4","ref":"wxImage.html#rotate/4"},{"type":"function","doc":"Rotates the hue of each pixel in the image by `angle`, which is a double in the range of\n-1.0 to +1.0, where -1.0 corresponds to -360 degrees and +1.0 corresponds to +360 degrees.","title":"wxImage.rotateHue/2","ref":"wxImage.html#rotateHue/2"},{"type":"function","doc":"Saves an image in the named file.\n\nFile type is determined from the extension of the file name. Note that this function may\nfail if the extension is not recognized! You can use one of the forms above to save images\nto files with non-standard extensions.","title":"wxImage.saveFile/2","ref":"wxImage.html#saveFile/2"},{"type":"function","doc":"Saves an image in the named file.","title":"wxImage.saveFile/3","ref":"wxImage.html#saveFile/3"},{"type":"function","doc":"","title":"wxImage.scale/3","ref":"wxImage.html#scale/3"},{"type":"function","doc":"Returns a scaled version of the image.\n\nThis is also useful for scaling bitmaps in general as the only other way to scale bitmaps\nis to blit a `m:wxMemoryDC` into another `m:wxMemoryDC`.\n\nThe parameter `quality` determines what method to use for resampling the image, see\nwxImageResizeQuality documentation.\n\nIt should be noted that although using `wxIMAGE_QUALITY_HIGH` produces much nicer looking\nresults it is a slower method. Downsampling will use the box averaging method which seems\nto operate very fast. If you are upsampling larger images using this method you will most\nlikely notice that it is a bit slower and in extreme cases it will be quite substantially\nslower as the bicubic algorithm has to process a lot of data.\n\nIt should also be noted that the high quality scaling may not work as expected when using\na single mask colour for transparency, as the scaling will blur the image and will\ntherefore remove the mask partially. Using the alpha channel will work.\n\nExample:\n\nSee: `rescale/4`","title":"wxImage.scale/4","ref":"wxImage.html#scale/4"},{"type":"function","doc":"This function is similar to `setData/4` and has similar restrictions.\n\nThe pointer passed to it may however be NULL in which case the function will allocate the\nalpha array internally - this is useful to add alpha channel data to an image which\ndoesn't have any.\n\nIf the pointer is not NULL, it must have one byte for each image pixel and be allocated\nwith malloc(). `m:wxImage` takes ownership of the pointer and will free it unless `static_data`\nparameter is set to true - in this case the caller should do it.","title":"wxImage.setAlpha/2","ref":"wxImage.html#setAlpha/2"},{"type":"function","doc":"Sets the alpha value for the given pixel.\n\nThis function should only be called if the image has alpha channel data, use `hasAlpha/1` to check\nfor this.","title":"wxImage.setAlpha/4","ref":"wxImage.html#setAlpha/4"},{"type":"function","doc":"Sets the image data without performing checks.\n\nThe data given must have the size (width*height*3) or results will be unexpected. Don't\nuse this method if you aren't sure you know what you are doing.\n\nThe data must have been allocated with `malloc()`, `NOT` with `operator` new.\n\nIf `static_data` is false, after this call the pointer to the data is owned by the `m:wxImage`\nobject, that will be responsible for deleting it. Do not pass to this function a pointer\nobtained through `getData/1`.","title":"wxImage.setData/2","ref":"wxImage.html#setData/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxImage.setData/4","ref":"wxImage.html#setData/4"},{"type":"function","doc":"","title":"wxImage.setMask/1","ref":"wxImage.html#setMask/1"},{"type":"function","doc":"Specifies whether there is a mask or not.\n\nThe area of the mask is determined by the current mask colour.","title":"wxImage.setMask/2","ref":"wxImage.html#setMask/2"},{"type":"function","doc":"Sets the mask colour for this image (and tells the image to use the mask).","title":"wxImage.setMaskColour/4","ref":"wxImage.html#setMaskColour/4"},{"type":"function","doc":"Sets image's mask so that the pixels that have RGB value of mr,mg,mb in mask will be\nmasked in the image.\n\nThis is done by first finding an unused colour in the image, setting this colour as the\nmask colour and then using this colour to draw all pixels in the image who corresponding\npixel in mask has given RGB value.\n\nThe parameter `mask` is the mask image to extract mask shape from. It must have the same\ndimensions as the image.\n\nThe parameters `mr`, `mg`, `mb` are the RGB values of the pixels in mask that will be\nused to create the mask.\n\nReturn: Returns false if mask does not have same dimensions as the image or if there is\nno unused colour left. Returns true if the mask was successfully applied.\n\nNote: Note that this method involves computing the histogram, which is a computationally\nintensive operation.","title":"wxImage.setMaskFromImage/5","ref":"wxImage.html#setMaskFromImage/5"},{"type":"function","doc":"Sets a user-defined option.\n\nThe function is case-insensitive to `name`.\n\nFor example, when saving as a JPEG file, the option `quality` is used, which is a number\nbetween 0 and 100 (0 is terrible, 100 is very good).\n\nThe lists of the currently supported options are in `getOption/2` and `getOptionInt/2` function docs.\n\nSee:\n* `getOption/2`\n\n* `getOptionInt/2`\n\n* `hasOption/2`","title":"wxImage.setOption/3","ref":"wxImage.html#setOption/3"},{"type":"function","doc":"Associates a palette with the image.\n\nThe palette may be used when converting `m:wxImage` to `m:wxBitmap` (MSW only at present)\nor in file save operations (none as yet).","title":"wxImage.setPalette/2","ref":"wxImage.html#setPalette/2"},{"type":"function","doc":"Sets the colour of the pixels within the given rectangle.\n\nThis routine performs bounds-checks for the coordinate so it can be considered a safe way\nto manipulate the data.","title":"wxImage.setRGB/5","ref":"wxImage.html#setRGB/5"},{"type":"function","doc":"Set the color of the pixel at the given x and y coordinate.","title":"wxImage.setRGB/6","ref":"wxImage.html#setRGB/6"},{"type":"function","doc":"","title":"wxImage.size/3","ref":"wxImage.html#size/3"},{"type":"function","doc":"Returns a resized version of this image without scaling it by adding either a border with\nthe given colour or cropping as necessary.\n\nThe image is pasted into a new image with the given `size` and background colour at the\nposition `pos` relative to the upper left of the new image.\n\nIf `red` = green = blue = -1 then the areas of the larger image not covered by this image\nare made transparent by filling them with the image mask colour (which will be allocated\nautomatically if it isn't currently set).\n\nOtherwise, the areas will be filled with the colour with the specified RGB components.\n\nSee: `resize/4`","title":"wxImage.size/4","ref":"wxImage.html#size/4"},{"type":"type","doc":"","title":"wxImage.wxImage/0","ref":"wxImage.html#t:wxImage/0"},{"type":"module","doc":"A `m:wxImageList` contains a list of images, which are stored in an unspecified form.\n\nImages can have masks for transparent drawing, and can be made from a variety of sources\nincluding bitmaps and icons.\n\n`m:wxImageList` is used principally in conjunction with `m:wxTreeCtrl` and `m:wxListCtrl` classes.\n\nSee:\n* `m:wxTreeCtrl`\n\n* `m:wxListCtrl`\n\nwxWidgets docs: [wxImageList](https://docs.wxwidgets.org/3.2/classwx_image_list.html)","title":"wxImageList","ref":"wxImageList.html"},{"type":"function","doc":"Adds a new image using an icon.\n\nReturn: The new zero-based image index.\n\nRemark: The original bitmap or icon is not affected by the `add/3` operation, and can be deleted\nafterwards. If the bitmap is wider than the images in the list, then the bitmap will\nautomatically be split into smaller images, each matching the dimensions of the image\nlist. This does not apply when adding icons.\n\nOnly for:wxmsw,wxosx","title":"wxImageList.add/2","ref":"wxImageList.html#add/2"},{"type":"function","doc":"Adds a new image or images using a bitmap and mask colour.\n\nReturn: The new zero-based image index.\n\nRemark: The original bitmap or icon is not affected by the `add/3` operation, and can be deleted\nafterwards. If the bitmap is wider than the images in the list, then the bitmap will\nautomatically be split into smaller images, each matching the dimensions of the image\nlist. This does not apply when adding icons.","title":"wxImageList.add/3","ref":"wxImageList.html#add/3"},{"type":"function","doc":"","title":"wxImageList.create/3","ref":"wxImageList.html#create/3"},{"type":"function","doc":"Initializes the list.\n\nSee `new/3` for details.","title":"wxImageList.create/4","ref":"wxImageList.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxImageList.destroy/1","ref":"wxImageList.html#destroy/1"},{"type":"function","doc":"","title":"wxImageList.draw/5","ref":"wxImageList.html#draw/5"},{"type":"function","doc":"Draws a specified image onto a device context.","title":"wxImageList.draw/6","ref":"wxImageList.html#draw/6"},{"type":"function","doc":"Returns the bitmap corresponding to the given index.","title":"wxImageList.getBitmap/2","ref":"wxImageList.html#getBitmap/2"},{"type":"function","doc":"Returns the icon corresponding to the given index.","title":"wxImageList.getIcon/2","ref":"wxImageList.html#getIcon/2"},{"type":"function","doc":"Returns the number of images in the list.","title":"wxImageList.getImageCount/1","ref":"wxImageList.html#getImageCount/1"},{"type":"function","doc":"Retrieves the size of the images in the list.\n\nCurrently, the `index` parameter is ignored as all images in the list have the same size.\n\nReturn: true if the function succeeded, false if it failed (for example, if the image\nlist was not yet initialized).","title":"wxImageList.getSize/2","ref":"wxImageList.html#getSize/2"},{"type":"function","doc":"Default ctor.","title":"wxImageList.new/0","ref":"wxImageList.html#new/0"},{"type":"function","doc":"","title":"wxImageList.new/2","ref":"wxImageList.html#new/2"},{"type":"function","doc":"Constructor specifying the image size, whether image masks should be created, and the\ninitial size of the list.\n\nSee: `create/4`","title":"wxImageList.new/3","ref":"wxImageList.html#new/3"},{"type":"function","doc":"Removes the image at the given position.","title":"wxImageList.remove/2","ref":"wxImageList.html#remove/2"},{"type":"function","doc":"Removes all the images in the list.","title":"wxImageList.removeAll/1","ref":"wxImageList.html#removeAll/1"},{"type":"function","doc":"Replaces the existing image with the new image.\n\nReturn: true if the replacement was successful, false otherwise.\n\nRemark: The original bitmap or icon is not affected by the `replace/4` operation, and can be deleted afterwards.\n\nOnly for:wxmsw,wxosx","title":"wxImageList.replace/3","ref":"wxImageList.html#replace/3"},{"type":"function","doc":"Replaces the existing image with the new image.\n\nWindows only.\n\nReturn: true if the replacement was successful, false otherwise.\n\nRemark: The original bitmap or icon is not affected by the `replace/4` operation, and can be deleted\nafterwards.","title":"wxImageList.replace/4","ref":"wxImageList.html#replace/4"},{"type":"type","doc":"","title":"wxImageList.wxImageList/0","ref":"wxImageList.html#t:wxImageList/0"},{"type":"module","doc":"A `m:wxInitDialogEvent` is sent as a dialog or panel is being initialised.\n\nHandlers for this event can transfer data to the window.\n\nThe default handler calls `wxWindow:transferDataToWindow/1`.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxInitDialogEvent](https://docs.wxwidgets.org/3.2/classwx_init_dialog_event.html)","title":"wxInitDialogEvent","ref":"wxInitDialogEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxInitDialogEventType` to subscribe to events of this type.","title":"Events - wxInitDialogEvent","ref":"wxInitDialogEvent.html#module-events"},{"type":"type","doc":"","title":"wxInitDialogEvent.wxInitDialog/0","ref":"wxInitDialogEvent.html#t:wxInitDialog/0"},{"type":"type","doc":"","title":"wxInitDialogEvent.wxInitDialogEvent/0","ref":"wxInitDialogEvent.html#t:wxInitDialogEvent/0"},{"type":"type","doc":"","title":"wxInitDialogEvent.wxInitDialogEventType/0","ref":"wxInitDialogEvent.html#t:wxInitDialogEventType/0"},{"type":"module","doc":"This event class contains information about joystick events, particularly events received\nby windows.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxJoystickEvent](https://docs.wxwidgets.org/3.2/classwx_joystick_event.html)","title":"wxJoystickEvent","ref":"wxJoystickEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxJoystickEventType` to subscribe to events of this type.","title":"Events - wxJoystickEvent","ref":"wxJoystickEvent.html#module-events"},{"type":"function","doc":"","title":"wxJoystickEvent.buttonDown/1","ref":"wxJoystickEvent.html#buttonDown/1"},{"type":"function","doc":"Returns true if the event was a down event from the specified button (or any button).","title":"wxJoystickEvent.buttonDown/2","ref":"wxJoystickEvent.html#buttonDown/2"},{"type":"function","doc":"","title":"wxJoystickEvent.buttonIsDown/1","ref":"wxJoystickEvent.html#buttonIsDown/1"},{"type":"function","doc":"Returns true if the specified button (or any button) was in a down state.","title":"wxJoystickEvent.buttonIsDown/2","ref":"wxJoystickEvent.html#buttonIsDown/2"},{"type":"function","doc":"","title":"wxJoystickEvent.buttonUp/1","ref":"wxJoystickEvent.html#buttonUp/1"},{"type":"function","doc":"Returns true if the event was an up event from the specified button (or any button).","title":"wxJoystickEvent.buttonUp/2","ref":"wxJoystickEvent.html#buttonUp/2"},{"type":"function","doc":"Returns the identifier of the button changing state.\n\nThe return value is where `n` is the index of the button changing state, which can also\nbe retrieved using `GetButtonOrdinal()` (not implemented in wx).\n\nNote that for `n` equal to 1, 2, 3 or 4 there are predefined `wxJOY_BUTTONn` constants\nwhich can be used for more clarity, however these constants are not defined for the\nbuttons beyond the first four.","title":"wxJoystickEvent.getButtonChange/1","ref":"wxJoystickEvent.html#getButtonChange/1"},{"type":"function","doc":"Returns the down state of the buttons.\n\nThis is a `wxJOY_BUTTONn` identifier, where `n` is one of 1, 2, 3, 4.","title":"wxJoystickEvent.getButtonState/1","ref":"wxJoystickEvent.html#getButtonState/1"},{"type":"function","doc":"Returns the identifier of the joystick generating the event - one of wxJOYSTICK1 and\nwxJOYSTICK2.","title":"wxJoystickEvent.getJoystick/1","ref":"wxJoystickEvent.html#getJoystick/1"},{"type":"function","doc":"Returns the x, y position of the joystick event.\n\nThese coordinates are valid for all the events except wxEVT_JOY_ZMOVE.","title":"wxJoystickEvent.getPosition/1","ref":"wxJoystickEvent.html#getPosition/1"},{"type":"function","doc":"Returns the z position of the joystick event.\n\nThis method can only be used for wxEVT_JOY_ZMOVE events.","title":"wxJoystickEvent.getZPosition/1","ref":"wxJoystickEvent.html#getZPosition/1"},{"type":"function","doc":"Returns true if this was a button up or down event (`not` 'is any button down?').","title":"wxJoystickEvent.isButton/1","ref":"wxJoystickEvent.html#isButton/1"},{"type":"function","doc":"Returns true if this was an x, y move event.","title":"wxJoystickEvent.isMove/1","ref":"wxJoystickEvent.html#isMove/1"},{"type":"function","doc":"Returns true if this was a z move event.","title":"wxJoystickEvent.isZMove/1","ref":"wxJoystickEvent.html#isZMove/1"},{"type":"type","doc":"","title":"wxJoystickEvent.wxJoystick/0","ref":"wxJoystickEvent.html#t:wxJoystick/0"},{"type":"type","doc":"","title":"wxJoystickEvent.wxJoystickEvent/0","ref":"wxJoystickEvent.html#t:wxJoystickEvent/0"},{"type":"type","doc":"","title":"wxJoystickEvent.wxJoystickEventType/0","ref":"wxJoystickEvent.html#t:wxJoystickEventType/0"},{"type":"module","doc":"This event class contains information about key press and release events.\n\nThe main information carried by this event is the key being pressed or released. It can\nbe accessed using either `getKeyCode/1` function or `getUnicodeKey/1`. For the printable characters, the latter should be\nused as it works for any keys, including non-Latin-1 characters that can be entered when\nusing national keyboard layouts. `getKeyCode/1` should be used to handle special characters (such as\ncursor arrows keys or `HOME` or `INS` and so on) which correspond to ?wxKeyCode enum\nelements above the `WXK_START` constant. While `getKeyCode/1` also returns the character code for\nLatin-1 keys for compatibility, it doesn't work for Unicode characters in general and will\nreturn `WXK_NONE` for any non-Latin-1 ones. For this reason, it's recommended to always\nuse `getUnicodeKey/1` and only fall back to `getKeyCode/1` if `getUnicodeKey/1` returned `WXK_NONE` meaning that the event corresponds to\na non-printable special keys.\n\nWhile both of these functions can be used with the events of `wxEVT_KEY_DOWN`, `wxEVT_KEY_UP`\nand `wxEVT_CHAR` types, the values returned by them are different for the first two\nevents and the last one. For the latter, the key returned corresponds to the character\nthat would appear in e.g. a text zone if the user pressed the key in it. As such, its\nvalue depends on the current state of the Shift key and, for the letters, on the state of\nCaps Lock modifier. For example, if `A` key is pressed without Shift being held down, `m:wxKeyEvent`\nof type `wxEVT_CHAR` generated for this key press will return (from either `getKeyCode/1` or `getUnicodeKey/1` as their\nmeanings coincide for ASCII characters) key code of 97 corresponding the ASCII value of `a`.\nAnd if the same key is pressed but with Shift being held (or Caps Lock being active), then\nthe key could would be 65, i.e. ASCII value of capital `A`.\n\nHowever for the key down and up events the returned key code will instead be `A`\nindependently of the state of the modifier keys i.e. it depends only on physical key being\npressed and is not translated to its logical representation using the current keyboard\nstate. Such untranslated key codes are defined as follows:\n\n* For the letters they correspond to the `upper` case value of the letter.\n\n* For the other alphanumeric keys (e.g. `7` or `+`), the untranslated key code corresponds to\nthe character produced by the key when it is pressed without Shift. E.g. in standard US\nkeyboard layout the untranslated key code for the key `=/+` in the upper right corner of\nthe keyboard is 61 which is the ASCII value of `=`.\n\n* For the rest of the keys (i.e. special non-printable keys) it is the same as the normal\nkey code as no translation is used anyhow.\n\nNotice that the first rule applies to all Unicode letters, not just the usual Latin-1\nones. However for non-Latin-1 letters only `getUnicodeKey/1` can be used to retrieve the key code as `getKeyCode/1` just\nreturns `WXK_NONE` in this case.\n\nTo summarize: you should handle `wxEVT_CHAR` if you need the translated key and `wxEVT_KEY_DOWN`\nif you only need the value of the key itself, independent of the current keyboard state.\n\nNote: Not all key down events may be generated by the user. As an example, `wxEVT_KEY_DOWN`\nwith `=` key code can be generated using the standard US keyboard layout but not using\nthe German one because the `=` key corresponds to Shift-0 key combination in this layout\nand the key code for it is `0`, not `=`. Because of this you should avoid requiring your\nusers to type key events that might be impossible to enter on their keyboard.\n\nAnother difference between key and char events is that another kind of translation is\ndone for the latter ones when the Control key is pressed: char events for ASCII letters in\nthis case carry codes corresponding to the ASCII value of Ctrl-Latter, i.e. 1 for Ctrl-A,\n2 for Ctrl-B and so on until 26 for Ctrl-Z. This is convenient for terminal-like\napplications and can be completely ignored by all the other ones (if you need to handle\nCtrl-A it is probably a better idea to use the key event rather than the char one). Notice\nthat currently no translation is done for the presses of [, `\\`, ], `^` and `_` keys which\nmight be mapped to ASCII values from 27 to 31. Since version 2.9.2, the enum values `WXK_CONTROL_A`\n- `WXK_CONTROL_Z` can be used instead of the non-descriptive constant values 1-26.\n\nFinally, modifier keys only generate key events but no char events at all. The modifiers\nkeys are `WXK_SHIFT`, `WXK_CONTROL`, `WXK_ALT` and various `WXK_WINDOWS_XXX` from\n?wxKeyCode enum.\n\nModifier keys events are special in one additional aspect: usually the keyboard state\nassociated with a key press is well defined, e.g. `shiftDown/1` returns `true` only if the Shift key\nwas held pressed when the key that generated this event itself was pressed. There is an\nambiguity for the key press events for Shift key itself however. By convention, it is\nconsidered to be already pressed when it is pressed and already released when it is\nreleased. In other words, `wxEVT_KEY_DOWN` event for the Shift key itself will have `wxMOD_SHIFT`\nin `getModifiers/1` and `shiftDown/1` will return true while the `wxEVT_KEY_UP` event for Shift itself will not have `wxMOD_SHIFT`\nin its modifiers and `shiftDown/1` will return false.\n\n`Tip:` You may discover the key codes and modifiers generated by all the keys on your\nsystem interactively by running the page_samples_keyboard wxWidgets sample and pressing\nsome keys in it.\n\nNote: If a key down (`EVT_KEY_DOWN`) event is caught and the event handler does not call `event.Skip()`\nthen the corresponding char event (`EVT_CHAR`) will not happen. This is by design and\nenables the programs that handle both types of events to avoid processing the same key\ntwice. As a consequence, if you do not want to suppress the `wxEVT_CHAR` events for the\nkeys you handle, always call `event.Skip()` in your `wxEVT_KEY_DOWN` handler. Not doing\nmay also prevent accelerators defined using this key from working.\n\nNote: If a key is maintained in a pressed state, you will typically get a lot of\n(automatically generated) key down events but only one key up one at the end when the key\nis released so it is wrong to assume that there is one up event corresponding to each down one.\n\nNote: For Windows programmers: The key and char events in wxWidgets are similar to but\nslightly different from Windows `WM_KEYDOWN` and `WM_CHAR` events. In particular, Alt-x\ncombination will generate a char event in wxWidgets (unless it is used as an accelerator)\nand almost all keys, including ones without ASCII equivalents, generate char events too.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxKeyEvent](https://docs.wxwidgets.org/3.2/classwx_key_event.html)","title":"wxKeyEvent","ref":"wxKeyEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxKeyEventType` to subscribe to events of this type.","title":"Events - wxKeyEvent","ref":"wxKeyEvent.html#module-events"},{"type":"function","doc":"Returns true if the Alt key is pressed.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","title":"wxKeyEvent.altDown/1","ref":"wxKeyEvent.html#altDown/1"},{"type":"function","doc":"Returns true if the key used for command accelerators is pressed.\n\nSame as `controlDown/1`. Deprecated.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","title":"wxKeyEvent.cmdDown/1","ref":"wxKeyEvent.html#cmdDown/1"},{"type":"function","doc":"Returns true if the Control key or Apple/Command key under macOS is pressed.\n\nThis function doesn't distinguish between right and left control keys.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","title":"wxKeyEvent.controlDown/1","ref":"wxKeyEvent.html#controlDown/1"},{"type":"function","doc":"Returns the key code of the key that generated this event.\n\nASCII symbols return normal ASCII values, while events from special keys such as \"left\ncursor arrow\" (`WXK_LEFT`) return values outside of the ASCII range. See ?wxKeyCode for a\nfull list of the virtual key codes.\n\nNote that this method returns a meaningful value only for special non-alphanumeric keys\nor if the user entered a Latin-1 character (this includes ASCII and the accented letters\nfound in Western European languages but not letters of other alphabets such as e.g.\nCyrillic). Otherwise it simply method returns `WXK_NONE` and `getUnicodeKey/1` should be used to obtain the\ncorresponding Unicode character.\n\nUsing `getUnicodeKey/1` is in general the right thing to do if you are interested in the characters typed\nby the user, `getKeyCode/1` should be only used for special keys (for which `getUnicodeKey/1` returns `WXK_NONE`). To\nhandle both kinds of keys you might write:","title":"wxKeyEvent.getKeyCode/1","ref":"wxKeyEvent.html#getKeyCode/1"},{"type":"function","doc":"Return the bit mask of all pressed modifier keys.\n\nThe return value is a combination of `wxMOD_ALT`, `wxMOD_CONTROL`, `wxMOD_SHIFT` and `wxMOD_META`\nbit masks. Additionally, `wxMOD_NONE` is defined as 0, i.e. corresponds to no modifiers\n(see `HasAnyModifiers()` (not implemented in wx)) and `wxMOD_CMD` is either `wxMOD_CONTROL`\n(MSW and Unix) or `wxMOD_META` (Mac), see `cmdDown/1`. See ?wxKeyModifier for the full list of modifiers.\n\nNotice that this function is easier to use correctly than, for example, `controlDown/1` because when\nusing the latter you also have to remember to test that none of the other modifiers is pressed:\n\nand forgetting to do it can result in serious program bugs (e.g. program not working with\nEuropean keyboard layout where `AltGr` key which is seen by the program as combination of\nCTRL and ALT is used). On the other hand, you can simply write:\n\nwith this function.","title":"wxKeyEvent.getModifiers/1","ref":"wxKeyEvent.html#getModifiers/1"},{"type":"function","doc":"Obtains the position (in client coordinates) at which the key was pressed.\n\nNotice that under most platforms this position is simply the current mouse pointer\nposition and has no special relationship to the key event itself.\n\n`x` and `y` may be NULL if the corresponding coordinate is not needed.","title":"wxKeyEvent.getPosition/1","ref":"wxKeyEvent.html#getPosition/1"},{"type":"function","doc":"Returns the raw key code for this event.\n\nThe flags are platform-dependent and should only be used if the functionality provided by\nother `m:wxKeyEvent` methods is insufficient.\n\nUnder MSW, the raw key code is the value of `wParam` parameter of the corresponding message.\n\nUnder GTK, the raw key code is the `keyval` field of the corresponding GDK event.\n\nUnder macOS, the raw key code is the `keyCode` field of the corresponding NSEvent.\n\nNote: Currently the raw key codes are not supported by all ports, use #ifdef\nwxHAS_RAW_KEY_CODES to determine if this feature is available.","title":"wxKeyEvent.getRawKeyCode/1","ref":"wxKeyEvent.html#getRawKeyCode/1"},{"type":"function","doc":"Returns the low level key flags for this event.\n\nThe flags are platform-dependent and should only be used if the functionality provided by\nother `m:wxKeyEvent` methods is insufficient.\n\nUnder MSW, the raw flags are just the value of `lParam` parameter of the corresponding message.\n\nUnder GTK, the raw flags contain the `hardware_keycode` field of the corresponding GDK event.\n\nUnder macOS, the raw flags contain the modifiers state.\n\nNote: Currently the raw key flags are not supported by all ports, use #ifdef\nwxHAS_RAW_KEY_CODES to determine if this feature is available.","title":"wxKeyEvent.getRawKeyFlags/1","ref":"wxKeyEvent.html#getRawKeyFlags/1"},{"type":"function","doc":"Returns the Unicode character corresponding to this key event.\n\nIf the key pressed doesn't have any character value (e.g. a cursor key) this method will\nreturn `WXK_NONE`. In this case you should use `getKeyCode/1` to retrieve the value of the key.\n\nThis function is only available in Unicode build, i.e. when `wxUSE_UNICODE` is 1.","title":"wxKeyEvent.getUnicodeKey/1","ref":"wxKeyEvent.html#getUnicodeKey/1"},{"type":"function","doc":"Returns the X position (in client coordinates) of the event.\n\nSee: `getPosition/1`","title":"wxKeyEvent.getX/1","ref":"wxKeyEvent.html#getX/1"},{"type":"function","doc":"Returns the Y position (in client coordinates) of the event.\n\nSee: `getPosition/1`","title":"wxKeyEvent.getY/1","ref":"wxKeyEvent.html#getY/1"},{"type":"function","doc":"Returns true if Control or Alt are pressed.\n\nChecks if Control, Alt or, under macOS only, Command key are pressed (notice that the\nreal Control key is still taken into account under OS X too).\n\nThis method returns false if only Shift is pressed for compatibility reasons and also\nbecause pressing Shift usually doesn't change the interpretation of key events, see `HasAnyModifiers()`\n(not implemented in wx) if you want to take Shift into account as well.","title":"wxKeyEvent.hasModifiers/1","ref":"wxKeyEvent.html#hasModifiers/1"},{"type":"function","doc":"Returns true if the Meta/Windows/Apple key is pressed.\n\nThis function tests the state of the key traditionally called Meta under Unix systems,\nWindows keys under MSW Notice that `getModifiers/1` should usually be used instead of this one.\n\nSee: `cmdDown/1`","title":"wxKeyEvent.metaDown/1","ref":"wxKeyEvent.html#metaDown/1"},{"type":"function","doc":"Returns true if the Shift key is pressed.\n\nThis function doesn't distinguish between right and left shift keys.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","title":"wxKeyEvent.shiftDown/1","ref":"wxKeyEvent.html#shiftDown/1"},{"type":"type","doc":"","title":"wxKeyEvent.wxKey/0","ref":"wxKeyEvent.html#t:wxKey/0"},{"type":"type","doc":"","title":"wxKeyEvent.wxKeyEvent/0","ref":"wxKeyEvent.html#t:wxKeyEvent/0"},{"type":"type","doc":"","title":"wxKeyEvent.wxKeyEventType/0","ref":"wxKeyEvent.html#t:wxKeyEventType/0"},{"type":"module","doc":"`m:wxLayoutAlgorithm` implements layout of subwindows in MDI or SDI frames.\n\nIt sends a `wxCalculateLayoutEvent` (not implemented in wx) event to children of the\nframe, asking them for information about their size. For MDI parent frames, the algorithm\nallocates the remaining space to the MDI client window (which contains the MDI child frames).\n\nFor SDI (normal) frames, a 'main' window is specified as taking up the remaining space.\n\nBecause the event system is used, this technique can be applied to any windows, which are\nnot necessarily 'aware' of the layout classes (no virtual functions in `m:wxWindow` refer\nto `m:wxLayoutAlgorithm` or its events). However, you may wish to use `m:wxSashLayoutWindow`\nfor your subwindows since this class provides handlers for the required events, and\naccessors to specify the desired size of the window. The sash behaviour in the base class\ncan be used, optionally, to make the windows user-resizable.\n\n`m:wxLayoutAlgorithm` is typically used in IDE (integrated development environment)\napplications, where there are several resizable windows in addition to the MDI client\nwindow, or other primary editing window. Resizable windows might include toolbars, a\nproject window, and a window for displaying error and warning messages.\n\nWhen a window receives an OnCalculateLayout event, it should call SetRect in the given\nevent object, to be the old supplied rectangle minus whatever space the window takes up.\nIt should also set its own size accordingly. `wxSashLayoutWindow::OnCalculateLayout` (not\nimplemented in wx) generates an OnQueryLayoutInfo event which it sends to itself to\ndetermine the orientation, alignment and size of the window, which it gets from internal\nmember variables set by the application.\n\nThe algorithm works by starting off with a rectangle equal to the whole frame client\narea. It iterates through the frame children, generating\nwxLayoutAlgorithm::OnCalculateLayout events which subtract the window size and return the\nremaining rectangle for the next window to process. It is assumed (by `wxSashLayoutWindow::OnCalculateLayout`\n(not implemented in wx)) that a window stretches the full dimension of the frame client,\naccording to the orientation it specifies. For example, a horizontal window will stretch\nthe full width of the remaining portion of the frame client area. In the other\norientation, the window will be fixed to whatever size was specified by\nwxLayoutAlgorithm::OnQueryLayoutInfo. An alignment setting will make the window 'stick' to\nthe left, top, right or bottom of the remaining client area. This scheme implies that\norder of window creation is important. Say you wish to have an extra toolbar at the top of\nthe frame, a project window to the left of the MDI client window, and an output window\nabove the status bar. You should therefore create the windows in this order: toolbar,\noutput window, project window. This ensures that the toolbar and output window take up\nspace at the top and bottom, and then the remaining height in-between is used for the\nproject window.\n\n`m:wxLayoutAlgorithm` is quite independent of the way in which\nwxLayoutAlgorithm::OnCalculateLayout chooses to interpret a window's size and alignment.\nTherefore you could implement a different window class with a new\nwxLayoutAlgorithm::OnCalculateLayout event handler, that has a more sophisticated way of\nlaying out the windows. It might allow specification of whether stretching occurs in the\nspecified orientation, for example, rather than always assuming stretching. (This could,\nand probably should, be added to the existing implementation).\n\nNote: `m:wxLayoutAlgorithm` has nothing to do with `wxLayoutConstraints` (not implemented\nin wx). It is an alternative way of specifying layouts for which the normal constraint\nsystem is unsuitable.\n\nSee:\n* `m:wxSashEvent`\n\n* `m:wxSashLayoutWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nwxWidgets docs: [wxLayoutAlgorithm](https://docs.wxwidgets.org/3.2/classwx_layout_algorithm.html)","title":"wxLayoutAlgorithm","ref":"wxLayoutAlgorithm.html"},{"type":"function","doc":"Destroys the object","title":"wxLayoutAlgorithm.destroy/1","ref":"wxLayoutAlgorithm.html#destroy/1"},{"type":"function","doc":"","title":"wxLayoutAlgorithm.layoutFrame/2","ref":"wxLayoutAlgorithm.html#layoutFrame/2"},{"type":"function","doc":"Lays out the children of a normal frame.\n\n`mainWindow` is set to occupy the remaining space. This function simply calls `layoutWindow/3`.","title":"wxLayoutAlgorithm.layoutFrame/3","ref":"wxLayoutAlgorithm.html#layoutFrame/3"},{"type":"function","doc":"","title":"wxLayoutAlgorithm.layoutMDIFrame/2","ref":"wxLayoutAlgorithm.html#layoutMDIFrame/2"},{"type":"function","doc":"Lays out the children of an MDI parent frame.\n\nIf `rect` is non-NULL, the given rectangle will be used as a starting point instead of\nthe frame's client area. The MDI client window is set to occupy the remaining space.","title":"wxLayoutAlgorithm.layoutMDIFrame/3","ref":"wxLayoutAlgorithm.html#layoutMDIFrame/3"},{"type":"function","doc":"","title":"wxLayoutAlgorithm.layoutWindow/2","ref":"wxLayoutAlgorithm.html#layoutWindow/2"},{"type":"function","doc":"Lays out the children of a normal frame or other window.\n\n`mainWindow` is set to occupy the remaining space. If this is not specified, then the\nlast window that responds to a calculate layout event in query mode will get the remaining\nspace (that is, a non-query OnCalculateLayout event will not be sent to this window and\nthe window will be set to the remaining size).","title":"wxLayoutAlgorithm.layoutWindow/3","ref":"wxLayoutAlgorithm.html#layoutWindow/3"},{"type":"function","doc":"Default constructor.","title":"wxLayoutAlgorithm.new/0","ref":"wxLayoutAlgorithm.html#new/0"},{"type":"type","doc":"","title":"wxLayoutAlgorithm.wxLayoutAlgorithm/0","ref":"wxLayoutAlgorithm.html#t:wxLayoutAlgorithm/0"},{"type":"module","doc":"A listbox is used to select one or more of a list of strings.\n\nThe strings are displayed in a scrolling box, with the selected string(s) marked in\nreverse video. A listbox can be single selection (if an item is selected, the previous\nselection is removed) or multiple selection (clicking an item toggles the item on or off\nindependently of other selections).\n\nList box elements are numbered from zero and while the maximal number of elements is\nunlimited, it is usually better to use a virtual control, not requiring to add all the\nitems to it at once, such as `wxDataViewCtrl` (not implemented in wx) or `m:wxListCtrl`\nwith `wxLC_VIRTUAL` style, once more than a few hundreds items need to be displayed\nbecause this control is not optimized, neither from performance nor from user interface\npoint of view, for large number of items.\n\nNotice that the list box doesn't support control characters other than `TAB`.","title":"wxListBox","ref":"wxListBox.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxLB_SINGLE: Single-selection list.\n\n* wxLB_MULTIPLE: Multiple-selection list: the user can toggle multiple items on and off.\nThis is the same as wxLB_EXTENDED in wxGTK2 port.\n\n* wxLB_EXTENDED: Extended-selection list: the user can extend the selection by using `SHIFT`\nor `CTRL` keys together with the cursor movement keys or the mouse.\n\n* wxLB_HSCROLL: Create horizontal scrollbar if contents are too wide (Windows only).\n\n* wxLB_ALWAYS_SB: Always show a vertical scrollbar.\n\n* wxLB_NEEDED_SB: Only create a vertical scrollbar if needed.\n\n* wxLB_NO_SB: Don't create vertical scrollbar (wxMSW and wxGTK only).\n\n* wxLB_SORT: The listbox contents are sorted in alphabetical order. Note that `wxLB_SINGLE`, `wxLB_MULTIPLE`\nand `wxLB_EXTENDED` styles are mutually exclusive and you can specify at most one of them\n(single selection is the default). See also overview_windowstyles.\n\nSee:\n* `m:wxChoice`\n\n* `m:wxComboBox`\n\n* `m:wxListCtrl`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListBox](https://docs.wxwidgets.org/3.2/classwx_list_box.html)","title":"Styles - wxListBox","ref":"wxListBox.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_listbox_selected`](`m:wxCommandEvent`)\n\n* [`command_listbox_doubleclicked`](`m:wxCommandEvent`)","title":"Events - wxListBox","ref":"wxListBox.html#module-events"},{"type":"function","doc":"","title":"wxListBox.create/6","ref":"wxListBox.html#create/6"},{"type":"function","doc":"","title":"wxListBox.create/7","ref":"wxListBox.html#create/7"},{"type":"function","doc":"Deselects an item in the list box.\n\nRemark: This applies to multiple selection listboxes only.","title":"wxListBox.deselect/2","ref":"wxListBox.html#deselect/2"},{"type":"function","doc":"Destroys the object","title":"wxListBox.destroy/1","ref":"wxListBox.html#destroy/1"},{"type":"function","doc":"Fill an array of ints with the positions of the currently selected items.\n\nReturn: The number of selections.\n\nRemark: Use this with a multiple selection listbox.\n\nSee:\n* `wxControlWithItems:getSelection/1`\n\n* `wxControlWithItems:getStringSelection/1`\n\n* `wxControlWithItems:setSelection/2`","title":"wxListBox.getSelections/1","ref":"wxListBox.html#getSelections/1"},{"type":"function","doc":"Returns the item located at `point`, or `wxNOT\\_FOUND` if there is no item located at `point`.\n\nIt is currently implemented for wxMSW, wxMac and wxGTK2 ports.\n\nReturn: Item located at point, or wxNOT_FOUND if unimplemented or the item does not exist.\n\nSince: 2.7.0","title":"wxListBox.hitTest/2","ref":"wxListBox.html#hitTest/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxListBox.hitTest/3","ref":"wxListBox.html#hitTest/3"},{"type":"function","doc":"Insert the given number of strings before the specified position.","title":"wxListBox.insertItems/3","ref":"wxListBox.html#insertItems/3"},{"type":"function","doc":"Determines whether an item is selected.\n\nReturn: true if the given item is selected, false otherwise.","title":"wxListBox.isSelected/2","ref":"wxListBox.html#isSelected/2"},{"type":"function","doc":"Default constructor.","title":"wxListBox.new/0","ref":"wxListBox.html#new/0"},{"type":"function","doc":"","title":"wxListBox.new/2","ref":"wxListBox.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a list box.\n\nSee the other `new/3` constructor; the only difference is that this overload takes a `wxArrayString`\n(not implemented in wx) instead of a pointer to an array of `wxString` (not implemented\nin wx).","title":"wxListBox.new/3","ref":"wxListBox.html#new/3"},{"type":"function","doc":"Replaces the current control contents with the given items.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","title":"wxListBox.set/2","ref":"wxListBox.html#set/2"},{"type":"function","doc":"Set the specified item to be the first visible item.","title":"wxListBox.setFirstItem/2","ref":"wxListBox.html#setFirstItem/2"},{"type":"type","doc":"","title":"wxListBox.wxListBox/0","ref":"wxListBox.html#t:wxListBox/0"},{"type":"module","doc":"A list control presents lists in a number of formats: list view, report view, icon view\nand small icon view.\n\nIn any case, elements are numbered from zero. For all these modes, the items are stored\nin the control and must be added to it using `insertItem/4` method.\n\nA special case of report view quite different from the other modes of the list control is\na virtual control in which the items data (including text, images and attributes) is\nmanaged by the main program and is requested by the control itself only when needed which\nallows having controls with millions of items without consuming much memory. To use\nvirtual list control you must use `setItemCount/2` first and override at least `wxListCtrl::OnGetItemText`\n(not implemented in wx) (and optionally `wxListCtrl::OnGetItemImage` (not implemented in\nwx) or `wxListCtrl::OnGetItemColumnImage` (not implemented in wx) and `wxListCtrl::OnGetItemAttr`\n(not implemented in wx)) to return the information about the items when the control\nrequests it.\n\nVirtual list control can be used as a normal one except that no operations which can take\ntime proportional to the number of items in the control happen - this is required to allow\nhaving a practically infinite number of items. For example, in a multiple selection\nvirtual list control, the selections won't be sent when many items are selected at once\nbecause this could mean iterating over all the items.\n\nUsing many of `m:wxListCtrl` features is shown in the corresponding sample.\n\nTo intercept events from a list control, use the event table macros described in `m:wxListEvent`.\n\n`wxMac Note`: Starting with wxWidgets 2.8, `m:wxListCtrl` uses a native implementation\nfor report mode, and uses a generic implementation for other modes. You can use the\ngeneric implementation for report mode as well by setting the `mac.listctrl.always_use_generic`\nsystem option (see `m:wxSystemOptions`) to 1.","title":"wxListCtrl","ref":"wxListCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxLC_LIST: Multicolumn list view, with optional small icons. Columns are computed\nautomatically, i.e. you don't set columns as in `wxLC_REPORT`. In other words, the list\nwraps, unlike a `m:wxListBox`.\n\n* wxLC_REPORT: Single or multicolumn report view, with optional header.\n\n* wxLC_VIRTUAL: The application provides items text on demand. May only be used with `wxLC_REPORT`.\n\n* wxLC_ICON: Large icon view, with optional labels.\n\n* wxLC_SMALL_ICON: Small icon view, with optional labels.\n\n* wxLC_ALIGN_TOP: Icons align to the top. Win32 default, Win32 only.\n\n* wxLC_ALIGN_LEFT: Icons align to the left.\n\n* wxLC_AUTOARRANGE: Icons arrange themselves. Win32 only.\n\n* wxLC_EDIT_LABELS: Labels are editable: the application will be notified when editing\nstarts.\n\n* wxLC_NO_HEADER: No header in report mode.\n\n* wxLC_SINGLE_SEL: Single selection (default is multiple).\n\n* wxLC_SORT_ASCENDING: Sort in ascending order. (You must still supply a comparison\ncallback in `sortItems/2`.)\n\n* wxLC_SORT_DESCENDING: Sort in descending order. (You must still supply a comparison\ncallback in `sortItems/2`.)\n\n* wxLC_HRULES: Draws light horizontal rules between rows in report mode.\n\n* wxLC_VRULES: Draws light vertical rules between columns in report mode.\n\nSee:\n* [Overview listctrl](https://docs.wxwidgets.org/3.2/overview_listctrl.html#overview_listctrl)\n\n* `m:wxListView`\n\n* `m:wxListBox`\n\n* `m:wxTreeCtrl`\n\n* `m:wxImageList`\n\n* `m:wxListEvent`\n\n* `m:wxListItem`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListCtrl](https://docs.wxwidgets.org/3.2/classwx_list_ctrl.html)","title":"Styles - wxListCtrl","ref":"wxListCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_list_begin_drag`](`m:wxListEvent`)\n\n* [`command_list_begin_rdrag`](`m:wxListEvent`)\n\n* [`command_list_begin_label_edit`](`m:wxListEvent`)\n\n* [`command_list_end_label_edit`](`m:wxListEvent`)\n\n* [`command_list_delete_item`](`m:wxListEvent`)\n\n* [`command_list_delete_all_items`](`m:wxListEvent`)\n\n* [`command_list_item_selected`](`m:wxListEvent`)\n\n* [`command_list_item_deselected`](`m:wxListEvent`)\n\n* [`command_list_item_activated`](`m:wxListEvent`)\n\n* [`command_list_item_focused`](`m:wxListEvent`)\n\n* [`command_list_item_middle_click`](`m:wxListEvent`)\n\n* [`command_list_item_right_click`](`m:wxListEvent`)\n\n* [`command_list_key_down`](`m:wxListEvent`)\n\n* [`command_list_insert_item`](`m:wxListEvent`)\n\n* [`command_list_col_click`](`m:wxListEvent`)\n\n* [`command_list_col_right_click`](`m:wxListEvent`)\n\n* [`command_list_col_begin_drag`](`m:wxListEvent`)\n\n* [`command_list_col_dragging`](`m:wxListEvent`)\n\n* [`command_list_col_end_drag`](`m:wxListEvent`)\n\n* [`command_list_cache_hint`](`m:wxListEvent`)","title":"Events - wxListCtrl","ref":"wxListCtrl.html#module-events"},{"type":"function","doc":"","title":"wxListCtrl.arrange/1","ref":"wxListCtrl.html#arrange/1"},{"type":"function","doc":"Arranges the items in icon or small icon view.\n\nThis only has effect on Win32. `flag` is one of:\n\n* wxLIST_ALIGN_DEFAULT: Default alignment.\n\n* wxLIST_ALIGN_LEFT: Align to the left side of the control.\n\n* wxLIST_ALIGN_TOP: Align to the top side of the control.\n\n* wxLIST_ALIGN_SNAP_TO_GRID: Snap to grid.","title":"wxListCtrl.arrange/2","ref":"wxListCtrl.html#arrange/2"},{"type":"function","doc":"Sets the image list associated with the control and takes ownership of it (i.e.\n\nthe control will, unlike when using `setImageList/3`, delete the list when destroyed). `which` is one of `wxIMAGE_LIST_NORMAL`, `wxIMAGE_LIST_SMALL`, `wxIMAGE_LIST_STATE`\n(the last is unimplemented).\n\nSee: `setImageList/3`","title":"wxListCtrl.assignImageList/3","ref":"wxListCtrl.html#assignImageList/3"},{"type":"function","doc":"Deletes all items and all columns.\n\nNote: This sends an event of type `wxEVT_LIST_DELETE_ALL_ITEMS` under all platforms.","title":"wxListCtrl.clearAll/1","ref":"wxListCtrl.html#clearAll/1"},{"type":"function","doc":"","title":"wxListCtrl.create/2","ref":"wxListCtrl.html#create/2"},{"type":"function","doc":"","title":"wxListCtrl.create/3","ref":"wxListCtrl.html#create/3"},{"type":"function","doc":"Deletes all items in the list control.\n\nThis function does `not` send the `wxEVT_LIST_DELETE_ITEM` event because deleting many\nitems from the control would be too slow then (unlike `deleteItem/2`) but it does send the special `wxEVT_LIST_DELETE_ALL_ITEMS`\nevent if the control was not empty. If it was already empty, nothing is done and no event\nis sent.\n\nReturn: true if the items were successfully deleted or if the control was already empty,\nfalse if an error occurred while deleting the items.","title":"wxListCtrl.deleteAllItems/1","ref":"wxListCtrl.html#deleteAllItems/1"},{"type":"function","doc":"Deletes a column.","title":"wxListCtrl.deleteColumn/2","ref":"wxListCtrl.html#deleteColumn/2"},{"type":"function","doc":"Deletes the specified item.\n\nThis function sends the `wxEVT_LIST_DELETE_ITEM` event for the item being deleted.\n\nSee: `deleteAllItems/1`","title":"wxListCtrl.deleteItem/2","ref":"wxListCtrl.html#deleteItem/2"},{"type":"function","doc":"Destroys the object","title":"wxListCtrl.destroy/1","ref":"wxListCtrl.html#destroy/1"},{"type":"function","doc":"Starts editing the label of the given item.\n\nThis function generates a `EVT_LIST_BEGIN_LABEL_EDIT` event which can be vetoed so that\nno text control will appear for in-place editing.\n\nIf the user changed the label (i.e. s/he does not press ESC or leave the text control\nwithout changes, a `EVT_LIST_END_LABEL_EDIT` event will be sent which can be vetoed as\nwell.","title":"wxListCtrl.editLabel/2","ref":"wxListCtrl.html#editLabel/2"},{"type":"function","doc":"Ensures this item is visible.","title":"wxListCtrl.ensureVisible/2","ref":"wxListCtrl.html#ensureVisible/2"},{"type":"function","doc":"","title":"wxListCtrl.findItem/3","ref":"wxListCtrl.html#findItem/3"},{"type":"function","doc":"Find an item nearest this position in the specified direction, starting from `start` or\nthe beginning if `start` is -1.\n\nReturn: The next matching item if any or `-1` (wxNOT_FOUND) otherwise.","title":"wxListCtrl.findItem/4","ref":"wxListCtrl.html#findItem/4"},{"type":"function","doc":"Gets information about this column.\n\nSee `setItem/5` for more information.","title":"wxListCtrl.getColumn/3","ref":"wxListCtrl.html#getColumn/3"},{"type":"function","doc":"Returns the number of columns.","title":"wxListCtrl.getColumnCount/1","ref":"wxListCtrl.html#getColumnCount/1"},{"type":"function","doc":"Gets the column width (report view only).","title":"wxListCtrl.getColumnWidth/2","ref":"wxListCtrl.html#getColumnWidth/2"},{"type":"function","doc":"Gets the number of items that can fit vertically in the visible area of the list control\n(list or report view) or the total number of items in the list control (icon or small icon\nview).","title":"wxListCtrl.getCountPerPage/1","ref":"wxListCtrl.html#getCountPerPage/1"},{"type":"function","doc":"Returns the edit control being currently used to edit a label.\n\nReturns NULL if no label is being edited.\n\nNote: It is currently only implemented for wxMSW and the generic version, not for the\nnative macOS version.","title":"wxListCtrl.getEditControl/1","ref":"wxListCtrl.html#getEditControl/1"},{"type":"function","doc":"Returns the specified image list.\n\n`which` may be one of:\n\n* wxIMAGE_LIST_NORMAL: The normal (large icon) image list.\n\n* wxIMAGE_LIST_SMALL: The small icon image list.\n\n* wxIMAGE_LIST_STATE: The user-defined state image list (unimplemented).","title":"wxListCtrl.getImageList/2","ref":"wxListCtrl.html#getImageList/2"},{"type":"function","doc":"Gets information about the item.\n\nSee `setItem/5` for more information.\n\nYou must call `info.SetId()` to set the ID of item you're interested in before calling\nthis method, and `info.SetMask()` with the flags indicating what fields you need to\nretrieve from `info`.","title":"wxListCtrl.getItem/2","ref":"wxListCtrl.html#getItem/2"},{"type":"function","doc":"Returns the colour for this item.\n\nIf the item has no specific colour, returns an invalid colour (and not the default\nbackground control of the control itself).\n\nSee: `getItemTextColour/2`","title":"wxListCtrl.getItemBackgroundColour/2","ref":"wxListCtrl.html#getItemBackgroundColour/2"},{"type":"function","doc":"Returns the number of items in the list control.","title":"wxListCtrl.getItemCount/1","ref":"wxListCtrl.html#getItemCount/1"},{"type":"function","doc":"Gets the application-defined data associated with this item.","title":"wxListCtrl.getItemData/2","ref":"wxListCtrl.html#getItemData/2"},{"type":"function","doc":"Returns the item's font.","title":"wxListCtrl.getItemFont/2","ref":"wxListCtrl.html#getItemFont/2"},{"type":"function","doc":"Returns the position of the item, in icon or small icon view.","title":"wxListCtrl.getItemPosition/2","ref":"wxListCtrl.html#getItemPosition/2"},{"type":"function","doc":"","title":"wxListCtrl.getItemRect/2","ref":"wxListCtrl.html#getItemRect/2"},{"type":"function","doc":"Returns the rectangle representing the item's size and position, in physical coordinates.\n\n`code` is one of wxLIST_RECT_BOUNDS, wxLIST_RECT_ICON, wxLIST_RECT_LABEL.","title":"wxListCtrl.getItemRect/3","ref":"wxListCtrl.html#getItemRect/3"},{"type":"function","doc":"Retrieves the spacing between icons in pixels: horizontal spacing is returned as `x`\ncomponent of the {Width,Height} object and the vertical spacing as its `y` component.","title":"wxListCtrl.getItemSpacing/1","ref":"wxListCtrl.html#getItemSpacing/1"},{"type":"function","doc":"Gets the item state.\n\nFor a list of state flags, see `setItem/5`. The `stateMask` indicates which state flags are of\ninterest.","title":"wxListCtrl.getItemState/3","ref":"wxListCtrl.html#getItemState/3"},{"type":"function","doc":"","title":"wxListCtrl.getItemText/2","ref":"wxListCtrl.html#getItemText/2"},{"type":"function","doc":"Gets the item text for this item.","title":"wxListCtrl.getItemText/3","ref":"wxListCtrl.html#getItemText/3"},{"type":"function","doc":"Returns the colour for this item.\n\nIf the item has no specific colour, returns an invalid colour (and not the default\nforeground control of the control itself as this wouldn't allow distinguishing between\nitems having the same colour as the current control foreground and items with default\ncolour which, hence, have always the same colour as the control).","title":"wxListCtrl.getItemTextColour/2","ref":"wxListCtrl.html#getItemTextColour/2"},{"type":"function","doc":"","title":"wxListCtrl.getNextItem/2","ref":"wxListCtrl.html#getNextItem/2"},{"type":"function","doc":"Searches for an item with the given geometry or state, starting from `item` but excluding\nthe `item` itself.\n\nIf `item` is -1, the first item that matches the specified flags will be returned.\nReturns the first item with given state following `item` or -1 if no such item found. This\nfunction may be used to find all selected items in the control like this:\n\n`geometry` can be one of:\n\n* wxLIST_NEXT_ABOVE: Searches for an item above the specified item.\n\n* wxLIST_NEXT_ALL: Searches for subsequent item by index.\n\n* wxLIST_NEXT_BELOW: Searches for an item below the specified item.\n\n* wxLIST_NEXT_LEFT: Searches for an item to the left of the specified item.\n\n* wxLIST_NEXT_RIGHT: Searches for an item to the right of the specified item.\n\nNote: this parameter is only supported by wxMSW currently and ignored on other platforms.\n\n`state` can be a bitlist of the following:\n\n* wxLIST_STATE_DONTCARE: Don't care what the state is.\n\n* wxLIST_STATE_DROPHILITED: The item indicates it is a drop target.\n\n* wxLIST_STATE_FOCUSED: The item has the focus.\n\n* wxLIST_STATE_SELECTED: The item is selected.\n\n* wxLIST_STATE_CUT: The item is selected as part of a cut and paste operation.","title":"wxListCtrl.getNextItem/3","ref":"wxListCtrl.html#getNextItem/3"},{"type":"function","doc":"Returns the number of selected items in the list control.","title":"wxListCtrl.getSelectedItemCount/1","ref":"wxListCtrl.html#getSelectedItemCount/1"},{"type":"function","doc":"Gets the text colour of the list control.","title":"wxListCtrl.getTextColour/1","ref":"wxListCtrl.html#getTextColour/1"},{"type":"function","doc":"Gets the index of the topmost visible item when in list or report view.","title":"wxListCtrl.getTopItem/1","ref":"wxListCtrl.html#getTopItem/1"},{"type":"function","doc":"Returns the rectangle taken by all items in the control.\n\nIn other words, if the controls client size were equal to the size of this rectangle, no\nscrollbars would be needed and no free space would be left.\n\nNote that this function only works in the icon and small icon views, not in list or\nreport views (this is a limitation of the native Win32 control).","title":"wxListCtrl.getViewRect/1","ref":"wxListCtrl.html#getViewRect/1"},{"type":"function","doc":"Determines which item (if any) is at the specified point, giving details in `flags`.\n\nReturns index of the item or `wxNOT_FOUND` if no item is at the specified point.\n\n`flags` will be a combination of the following flags:\n\n* wxLIST_HITTEST_ABOVE: Above the control's client area.\n\n* wxLIST_HITTEST_BELOW: Below the control's client area.\n\n* wxLIST_HITTEST_TOLEFT: To the left of the control's client area.\n\n* wxLIST_HITTEST_TORIGHT: To the right of the control's client area.\n\n* wxLIST_HITTEST_NOWHERE: Inside the control's client area but not over an item.\n\n* wxLIST_HITTEST_ONITEMICON: Over an item's icon.\n\n* wxLIST_HITTEST_ONITEMLABEL: Over an item's text.\n\n* wxLIST_HITTEST_ONITEMSTATEICON: Over the checkbox of an item.\n\n* wxLIST_HITTEST_ONITEM: Combination of `wxLIST_HITTEST_ONITEMICON`, `wxLIST_HITTEST_ONITEMLABEL`, `wxLIST_HITTEST_ONITEMSTATEICON`.\n\nIf `ptrSubItem` is not NULL and the `m:wxListCtrl` is in the report mode the subitem (or\ncolumn) number will also be provided. This feature is only available in version 2.7.0 or\nhigher and is currently only implemented under wxMSW and requires at least comctl32.dll of\nversion 4.70 on the host system or the value stored in `ptrSubItem` will be always -1. To\ncompile this feature into wxWidgets library you need to have access to commctrl.h of\nversion 4.70 that is provided by Microsoft.","title":"wxListCtrl.hitTest/2","ref":"wxListCtrl.html#hitTest/2"},{"type":"function","doc":"For report view mode (only), inserts a column.\n\nFor more details, see `setItem/5`. Also see `insertColumn/4` overload for a usually more convenient alternative to\nthis method and the description of how the item width is interpreted by this method.","title":"wxListCtrl.insertColumn/3","ref":"wxListCtrl.html#insertColumn/3"},{"type":"function","doc":"For report view mode (only), inserts a column.\n\nInsert a new column in the list control in report view mode at the given position\nspecifying its most common attributes.\n\nNotice that to set the image for the column you need to use `insertColumn/4` overload and specify\n?wxLIST\\_MASK\\_IMAGE in the item mask.\n\nReturn: The index of the inserted column or -1 if adding it failed.","title":"wxListCtrl.insertColumn/4","ref":"wxListCtrl.html#insertColumn/4"},{"type":"function","doc":"Inserts an item, returning the index of the new item if successful, -1 otherwise.","title":"wxListCtrl.insertItem/2","ref":"wxListCtrl.html#insertItem/2"},{"type":"function","doc":"Insert a string item.","title":"wxListCtrl.insertItem/3","ref":"wxListCtrl.html#insertItem/3"},{"type":"function","doc":"Insert an image/string item.","title":"wxListCtrl.insertItem/4","ref":"wxListCtrl.html#insertItem/4"},{"type":"function","doc":"","title":"wxListCtrl.new/0","ref":"wxListCtrl.html#new/0"},{"type":"function","doc":"","title":"wxListCtrl.new/1","ref":"wxListCtrl.html#new/1"},{"type":"function","doc":"","title":"wxListCtrl.new/2","ref":"wxListCtrl.html#new/2"},{"type":"function","doc":"Redraws the given `item`.\n\nThis is only useful for the virtual list controls as without calling this function the\ndisplayed value of the item doesn't change even when the underlying data does change.\n\nSee: `refreshItems/3`","title":"wxListCtrl.refreshItem/2","ref":"wxListCtrl.html#refreshItem/2"},{"type":"function","doc":"Redraws the items between `itemFrom` and `itemTo`.\n\nThe starting item must be less than or equal to the ending one.\n\nJust as `refreshItem/2` this is only useful for virtual list controls.","title":"wxListCtrl.refreshItems/3","ref":"wxListCtrl.html#refreshItems/3"},{"type":"function","doc":"Scrolls the list control.\n\nIf in icon, small icon or report view mode, `dx` specifies the number of pixels to\nscroll. If in list view mode, `dx` specifies the number of columns to scroll. `dy` always\nspecifies the number of pixels to scroll vertically.\n\nNote: This method is currently only implemented in the Windows version.","title":"wxListCtrl.scrollList/3","ref":"wxListCtrl.html#scrollList/3"},{"type":"function","doc":"Sets the background colour.\n\nNote that the `wxWindow:getBackgroundColour/1` function of `m:wxWindow` base class can be used to retrieve the current\nbackground colour.","title":"wxListCtrl.setBackgroundColour/2","ref":"wxListCtrl.html#setBackgroundColour/2"},{"type":"function","doc":"Sets information about this column.\n\nSee `setItem/5` for more information.","title":"wxListCtrl.setColumn/3","ref":"wxListCtrl.html#setColumn/3"},{"type":"function","doc":"Sets the column width.\n\n`width` can be a width in pixels or `wxLIST_AUTOSIZE` (-1) or `wxLIST_AUTOSIZE_USEHEADER` (-2).\n\n`wxLIST_AUTOSIZE` will resize the column to the length of its longest item.\n\n`wxLIST_AUTOSIZE_USEHEADER` will resize the column to the length of the header (Win32) or\n80 pixels (other platforms).\n\nIn small or normal icon view, `col` must be -1, and the column width is set for all\ncolumns.","title":"wxListCtrl.setColumnWidth/3","ref":"wxListCtrl.html#setColumnWidth/3"},{"type":"function","doc":"Sets the image list associated with the control.\n\n`which` is one of `wxIMAGE_LIST_NORMAL`, `wxIMAGE_LIST_SMALL`, `wxIMAGE_LIST_STATE` (the\nlast is unimplemented).\n\nThis method does not take ownership of the image list, you have to delete it yourself.\n\nSee: `assignImageList/3`","title":"wxListCtrl.setImageList/3","ref":"wxListCtrl.html#setImageList/3"},{"type":"function","doc":"Sets the data of an item.\n\nUsing the `m:wxListItem`'s mask and state mask, you can change only selected attributes\nof a `m:wxListCtrl` item.\n\nReturn: true if the item was successfully updated or false if the update failed for some\nreason (e.g. an invalid item index).","title":"wxListCtrl.setItem/2","ref":"wxListCtrl.html#setItem/2"},{"type":"function","doc":"","title":"wxListCtrl.setItem/4","ref":"wxListCtrl.html#setItem/4"},{"type":"function","doc":"Sets an item string field at a particular column.\n\nReturn: true if the item was successfully updated or false if the update failed for some\nreason (e.g. an invalid item index).","title":"wxListCtrl.setItem/5","ref":"wxListCtrl.html#setItem/5"},{"type":"function","doc":"Sets the background colour for this item.\n\nThis function only works in report view mode. The colour can be retrieved using `getItemBackgroundColour/2`.","title":"wxListCtrl.setItemBackgroundColour/3","ref":"wxListCtrl.html#setItemBackgroundColour/3"},{"type":"function","doc":"Sets the image associated with the item.\n\nIn report view, you can specify the column. The image is an index into the image list\nassociated with the list control.","title":"wxListCtrl.setItemColumnImage/4","ref":"wxListCtrl.html#setItemColumnImage/4"},{"type":"function","doc":"This method can only be used with virtual list controls.\n\nIt is used to indicate to the control the number of items it contains. After calling it,\nthe main program should be ready to handle calls to various item callbacks (such as `wxListCtrl::OnGetItemText`\n(not implemented in wx)) for all items in the range from 0 to `count`.\n\nNotice that the control is not necessarily redrawn after this call as it may be\nundesirable if an item which is not visible on the screen anyhow was added to or removed\nfrom a control displaying many items, if you do need to refresh the display you can just\ncall `wxWindow:refresh/2` manually.","title":"wxListCtrl.setItemCount/2","ref":"wxListCtrl.html#setItemCount/2"},{"type":"function","doc":"Associates application-defined data with this item.\n\nNotice that this function cannot be used to associate pointers with the control items,\nuse `SetItemPtrData()` (not implemented in wx) instead.","title":"wxListCtrl.setItemData/3","ref":"wxListCtrl.html#setItemData/3"},{"type":"function","doc":"Sets the item's font.","title":"wxListCtrl.setItemFont/3","ref":"wxListCtrl.html#setItemFont/3"},{"type":"function","doc":"","title":"wxListCtrl.setItemImage/3","ref":"wxListCtrl.html#setItemImage/3"},{"type":"function","doc":"Sets the unselected and selected images associated with the item.\n\nThe images are indices into the image list associated with the list control.","title":"wxListCtrl.setItemImage/4","ref":"wxListCtrl.html#setItemImage/4"},{"type":"function","doc":"Sets the position of the item, in icon or small icon view.\n\nWindows only.","title":"wxListCtrl.setItemPosition/3","ref":"wxListCtrl.html#setItemPosition/3"},{"type":"function","doc":"Sets the item state.\n\nThe `stateMask` is a combination of `wxLIST_STATE_XXX` constants described in `m:wxListItem`\ndocumentation. For each of the bits specified in `stateMask`, the corresponding state is\nset or cleared depending on whether `state` argument contains the same bit or not.\n\nSo to select an item you can use while to deselect it you should use\n\nConsider using `m:wxListView` if possible to avoid dealing with this error-prone and\nconfusing method.\n\nAlso notice that contrary to the usual rule that only user actions generate events, this\nmethod does generate wxEVT_LIST_ITEM_SELECTED event when it is used to select an item.","title":"wxListCtrl.setItemState/4","ref":"wxListCtrl.html#setItemState/4"},{"type":"function","doc":"Sets the item text for this item.","title":"wxListCtrl.setItemText/3","ref":"wxListCtrl.html#setItemText/3"},{"type":"function","doc":"Sets the colour for this item.\n\nThis function only works in report view. The colour can be retrieved using `getItemTextColour/2`.","title":"wxListCtrl.setItemTextColour/3","ref":"wxListCtrl.html#setItemTextColour/3"},{"type":"function","doc":"","title":"wxListCtrl.setSingleStyle/2","ref":"wxListCtrl.html#setSingleStyle/2"},{"type":"function","doc":"Adds or removes a single window style.","title":"wxListCtrl.setSingleStyle/3","ref":"wxListCtrl.html#setSingleStyle/3"},{"type":"function","doc":"Sets the text colour of the list control.","title":"wxListCtrl.setTextColour/2","ref":"wxListCtrl.html#setTextColour/2"},{"type":"function","doc":"Sets the whole window style, deleting all items.","title":"wxListCtrl.setWindowStyleFlag/2","ref":"wxListCtrl.html#setWindowStyleFlag/2"},{"type":"function","doc":"","title":"wxListCtrl.sortItems/2","ref":"wxListCtrl.html#sortItems/2"},{"type":"type","doc":"","title":"wxListCtrl.wxListCtrl/0","ref":"wxListCtrl.html#t:wxListCtrl/0"},{"type":"module","doc":"A list event holds information about events associated with `m:wxListCtrl` objects.\n\nSee: `m:wxListCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxListEvent](https://docs.wxwidgets.org/3.2/classwx_list_event.html)","title":"wxListEvent","ref":"wxListEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxListEventType` to subscribe to events of this type.","title":"Events - wxListEvent","ref":"wxListEvent.html#module-events"},{"type":"function","doc":"For `EVT\\_LIST\\_CACHE\\_HINT` event only: return the first item which the list control\nadvises us to cache.","title":"wxListEvent.getCacheFrom/1","ref":"wxListEvent.html#getCacheFrom/1"},{"type":"function","doc":"For `EVT\\_LIST\\_CACHE\\_HINT` event only: return the last item (inclusive) which the list\ncontrol advises us to cache.","title":"wxListEvent.getCacheTo/1","ref":"wxListEvent.html#getCacheTo/1"},{"type":"function","doc":"The column position: it is only used with `COL` events.\n\nFor the column dragging events, it is the column to the left of the divider being\ndragged, for the column click events it may be -1 if the user clicked in the list control\nheader outside any column.","title":"wxListEvent.getColumn/1","ref":"wxListEvent.html#getColumn/1"},{"type":"function","doc":"The data.","title":"wxListEvent.getData/1","ref":"wxListEvent.html#getData/1"},{"type":"function","doc":"The image.","title":"wxListEvent.getImage/1","ref":"wxListEvent.html#getImage/1"},{"type":"function","doc":"The item index.","title":"wxListEvent.getIndex/1","ref":"wxListEvent.html#getIndex/1"},{"type":"function","doc":"An item object, used by some events.\n\nSee also `wxListCtrl:setItem/5`.","title":"wxListEvent.getItem/1","ref":"wxListEvent.html#getItem/1"},{"type":"function","doc":"Key code if the event is a keypress event.","title":"wxListEvent.getKeyCode/1","ref":"wxListEvent.html#getKeyCode/1"},{"type":"function","doc":"The (new) item label for `EVT_LIST_END_LABEL_EDIT` event.","title":"wxListEvent.getLabel/1","ref":"wxListEvent.html#getLabel/1"},{"type":"function","doc":"The mask.","title":"wxListEvent.getMask/1","ref":"wxListEvent.html#getMask/1"},{"type":"function","doc":"The position of the mouse pointer if the event is a drag event.","title":"wxListEvent.getPoint/1","ref":"wxListEvent.html#getPoint/1"},{"type":"function","doc":"The text.","title":"wxListEvent.getText/1","ref":"wxListEvent.html#getText/1"},{"type":"function","doc":"This method only makes sense for `EVT\\_LIST\\_END\\_LABEL\\_EDIT` message and returns true\nif it the label editing has been cancelled by the user (`getLabel/1` returns an empty\nstring in this case but it doesn't allow the application to distinguish between really\ncancelling the edit and the admittedly rare case when the user wants to rename it to an\nempty string).","title":"wxListEvent.isEditCancelled/1","ref":"wxListEvent.html#isEditCancelled/1"},{"type":"type","doc":"","title":"wxListEvent.wxList/0","ref":"wxListEvent.html#t:wxList/0"},{"type":"type","doc":"","title":"wxListEvent.wxListEvent/0","ref":"wxListEvent.html#t:wxListEvent/0"},{"type":"type","doc":"","title":"wxListEvent.wxListEventType/0","ref":"wxListEvent.html#t:wxListEventType/0"},{"type":"module","doc":"This class stores information about a `m:wxListCtrl` item or column.\n\n`m:wxListItem` is a class which contains information about:\n\n* Zero based item position; see `setId/2` and `getId/1`.\n\n* Zero based column index; see `setColumn/2` and `getColumn/1`.\n\n* The label (or header for columns); see `setText/2` and `getText/1`.\n\n* The zero based index into an image list; see `getImage/1` and `setImage/2`.\n\n* Application defined data; see `SetData()` (not implemented in wx) and `GetData()` (not\nimplemented in wx).\n\n* For columns only: the width of the column; see `setWidth/2` and `getWidth/1`.\n\n* For columns only: the format of the column; one of `wxLIST_FORMAT_LEFT`, `wxLIST_FORMAT_RIGHT`, `wxLIST_FORMAT_CENTRE`.\nSee `setAlign/2` and `getAlign/1`.\n\n* The state of the item; see `setState/2` and `getState/1`. This is a bitlist of the following flags:\n\n* `wxLIST_STATE_FOCUSED:` The item has the focus.\n\n* `wxLIST_STATE_SELECTED:` The item is selected.\n\n* `wxLIST_STATE_DONTCARE:` No special flags (the value of this constant is 0).\n\n* `wxLIST_STATE_DROPHILITED:` The item is highlighted to receive a drop event. Win32 only.\n\n* `wxLIST_STATE_CUT:` The item is in the cut state. Win32 only.\n\n* A mask indicating which state flags are valid; this is a bitlist of the flags reported\nabove for the item state. See `setStateMask/2` and GetStateMask().\n\n* A mask indicating which fields of this class are valid; see `setMask/2` and `getMask/1`. This is a bitlist of\nthe following flags:\n\n* `wxLIST_MASK_STATE:` The state field is valid.\n\n* `wxLIST_MASK_TEXT:` The label field is valid.\n\n* `wxLIST_MASK_IMAGE:` The image field is valid.\n\n* `wxLIST_MASK_DATA:` The application-defined data field is valid.\n\n* `wxLIST_MASK_WIDTH:` The column width field is valid.\n\n* `wxLIST_MASK_FORMAT:` The column format field is valid.\n\nThe `m:wxListItem` object can also contain item-specific colour and font information: for\nthis you need to call one of `setTextColour/2`, `setBackgroundColour/2` or `setFont/2` functions on it passing it the colour/font to use. If\nthe colour/font is not specified, the default list control colour/font is used.\n\nSee: `m:wxListCtrl`\n\nwxWidgets docs: [wxListItem](https://docs.wxwidgets.org/3.2/classwx_list_item.html)","title":"wxListItem","ref":"wxListItem.html"},{"type":"function","doc":"Resets the item state to the default.","title":"wxListItem.clear/1","ref":"wxListItem.html#clear/1"},{"type":"function","doc":"Destroys the object","title":"wxListItem.destroy/1","ref":"wxListItem.html#destroy/1"},{"type":"function","doc":"Returns the alignment for this item.\n\nCan be one of `wxLIST_FORMAT_LEFT`, `wxLIST_FORMAT_RIGHT` or `wxLIST_FORMAT_CENTRE`.","title":"wxListItem.getAlign/1","ref":"wxListItem.html#getAlign/1"},{"type":"function","doc":"Returns the background colour for this item.","title":"wxListItem.getBackgroundColour/1","ref":"wxListItem.html#getBackgroundColour/1"},{"type":"function","doc":"Returns the zero-based column; meaningful only in report mode.","title":"wxListItem.getColumn/1","ref":"wxListItem.html#getColumn/1"},{"type":"function","doc":"Returns the font used to display the item.","title":"wxListItem.getFont/1","ref":"wxListItem.html#getFont/1"},{"type":"function","doc":"Returns the zero-based item position.","title":"wxListItem.getId/1","ref":"wxListItem.html#getId/1"},{"type":"function","doc":"Returns the zero-based index of the image associated with the item into the image list.","title":"wxListItem.getImage/1","ref":"wxListItem.html#getImage/1"},{"type":"function","doc":"Returns a bit mask indicating which fields of the structure are valid.\n\nCan be any combination of the following values:\n\n* wxLIST_MASK_STATE: `GetState` is valid.\n\n* wxLIST_MASK_TEXT: `GetText` is valid.\n\n* wxLIST_MASK_IMAGE: `GetImage` is valid.\n\n* wxLIST_MASK_DATA: `GetData` is valid.\n\n* wxLIST_MASK_WIDTH: `GetWidth` is valid.\n\n* wxLIST_MASK_FORMAT: `GetFormat` is valid.","title":"wxListItem.getMask/1","ref":"wxListItem.html#getMask/1"},{"type":"function","doc":"Returns a bit field representing the state of the item.\n\nCan be any combination of:\n\n* wxLIST_STATE_DONTCARE: No special flags (the values of this constant is 0).\n\n* wxLIST_STATE_DROPHILITED: The item is highlighted to receive a drop event. Win32 only.\n\n* wxLIST_STATE_FOCUSED: The item has the focus.\n\n* wxLIST_STATE_SELECTED: The item is selected.\n\n* wxLIST_STATE_CUT: The item is in the cut state. Win32 only.","title":"wxListItem.getState/1","ref":"wxListItem.html#getState/1"},{"type":"function","doc":"Returns the label/header text.","title":"wxListItem.getText/1","ref":"wxListItem.html#getText/1"},{"type":"function","doc":"Returns the text colour.","title":"wxListItem.getTextColour/1","ref":"wxListItem.html#getTextColour/1"},{"type":"function","doc":"Meaningful only for column headers in report mode.\n\nReturns the column width.","title":"wxListItem.getWidth/1","ref":"wxListItem.html#getWidth/1"},{"type":"function","doc":"Constructor.","title":"wxListItem.new/0","ref":"wxListItem.html#new/0"},{"type":"function","doc":"","title":"wxListItem.new/1","ref":"wxListItem.html#new/1"},{"type":"function","doc":"Sets the alignment for the item.\n\nSee also `getAlign/1`","title":"wxListItem.setAlign/2","ref":"wxListItem.html#setAlign/2"},{"type":"function","doc":"Sets the background colour for the item.","title":"wxListItem.setBackgroundColour/2","ref":"wxListItem.html#setBackgroundColour/2"},{"type":"function","doc":"Sets the zero-based column.\n\nMeaningful only in report mode.","title":"wxListItem.setColumn/2","ref":"wxListItem.html#setColumn/2"},{"type":"function","doc":"Sets the font for the item.","title":"wxListItem.setFont/2","ref":"wxListItem.html#setFont/2"},{"type":"function","doc":"Sets the zero-based item position.","title":"wxListItem.setId/2","ref":"wxListItem.html#setId/2"},{"type":"function","doc":"Sets the zero-based index of the image associated with the item into the image list.","title":"wxListItem.setImage/2","ref":"wxListItem.html#setImage/2"},{"type":"function","doc":"Sets the mask of valid fields.\n\nSee `getMask/1`.","title":"wxListItem.setMask/2","ref":"wxListItem.html#setMask/2"},{"type":"function","doc":"Sets the item state flags (note that the valid state flags are influenced by the value of\nthe state mask, see `setStateMask/2`).\n\nSee `getState/1` for valid flag values.","title":"wxListItem.setState/2","ref":"wxListItem.html#setState/2"},{"type":"function","doc":"Sets the bitmask that is used to determine which of the state flags are to be set.\n\nSee also `setState/2`.","title":"wxListItem.setStateMask/2","ref":"wxListItem.html#setStateMask/2"},{"type":"function","doc":"Sets the text label for the item.","title":"wxListItem.setText/2","ref":"wxListItem.html#setText/2"},{"type":"function","doc":"Sets the text colour for the item.","title":"wxListItem.setTextColour/2","ref":"wxListItem.html#setTextColour/2"},{"type":"function","doc":"Meaningful only for column headers in report mode.\n\nSets the column width.","title":"wxListItem.setWidth/2","ref":"wxListItem.html#setWidth/2"},{"type":"type","doc":"","title":"wxListItem.wxListItem/0","ref":"wxListItem.html#t:wxListItem/0"},{"type":"module","doc":"Functions for wxListItemAttr class\n\nwxWidgets docs: [wxListItemAttr](https://docs.wxwidgets.org/3.2/classwx_list_item_attr.html)","title":"wxListItemAttr","ref":"wxListItemAttr.html"},{"type":"function","doc":"Destroys the object","title":"wxListItemAttr.destroy/1","ref":"wxListItemAttr.html#destroy/1"},{"type":"function","doc":"","title":"wxListItemAttr.getBackgroundColour/1","ref":"wxListItemAttr.html#getBackgroundColour/1"},{"type":"function","doc":"","title":"wxListItemAttr.getFont/1","ref":"wxListItemAttr.html#getFont/1"},{"type":"function","doc":"","title":"wxListItemAttr.getTextColour/1","ref":"wxListItemAttr.html#getTextColour/1"},{"type":"function","doc":"","title":"wxListItemAttr.hasBackgroundColour/1","ref":"wxListItemAttr.html#hasBackgroundColour/1"},{"type":"function","doc":"","title":"wxListItemAttr.hasFont/1","ref":"wxListItemAttr.html#hasFont/1"},{"type":"function","doc":"","title":"wxListItemAttr.hasTextColour/1","ref":"wxListItemAttr.html#hasTextColour/1"},{"type":"function","doc":"","title":"wxListItemAttr.new/0","ref":"wxListItemAttr.html#new/0"},{"type":"function","doc":"","title":"wxListItemAttr.new/3","ref":"wxListItemAttr.html#new/3"},{"type":"function","doc":"","title":"wxListItemAttr.setBackgroundColour/2","ref":"wxListItemAttr.html#setBackgroundColour/2"},{"type":"function","doc":"","title":"wxListItemAttr.setFont/2","ref":"wxListItemAttr.html#setFont/2"},{"type":"function","doc":"","title":"wxListItemAttr.setTextColour/2","ref":"wxListItemAttr.html#setTextColour/2"},{"type":"type","doc":"","title":"wxListItemAttr.wxListItemAttr/0","ref":"wxListItemAttr.html#t:wxListItemAttr/0"},{"type":"module","doc":"This class currently simply presents a simpler to use interface for the `m:wxListCtrl` --\nit can be thought of as a `façade` for that complicated class.\n\nUsing it is preferable to using `m:wxListCtrl` directly whenever possible because in the\nfuture some ports might implement `m:wxListView` but not the full set of `m:wxListCtrl` features.\n\nOther than different interface, this class is identical to `m:wxListCtrl`. In particular,\nit uses the same events, same window styles and so on.\n\nSee: `setColumnImage/3`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListView](https://docs.wxwidgets.org/3.2/classwx_list_view.html)","title":"wxListView","ref":"wxListView.html"},{"type":"function","doc":"Resets the column image -- after calling this function, no image will be shown.\n\nSee: `setColumnImage/3`","title":"wxListView.clearColumnImage/2","ref":"wxListView.html#clearColumnImage/2"},{"type":"function","doc":"Sets focus to the item with the given `index`.","title":"wxListView.focus/2","ref":"wxListView.html#focus/2"},{"type":"function","doc":"Returns the first selected item in a (presumably) multiple selection control.\n\nTogether with `getNextSelected/2` it can be used to iterate over all selected items in the control.\n\nReturn: The first selected item, if any, -1 otherwise.","title":"wxListView.getFirstSelected/1","ref":"wxListView.html#getFirstSelected/1"},{"type":"function","doc":"Returns the currently focused item or -1 if none.\n\nSee:\n* `isSelected/2`\n\n* `focus/2`","title":"wxListView.getFocusedItem/1","ref":"wxListView.html#getFocusedItem/1"},{"type":"function","doc":"Used together with `getFirstSelected/1` to iterate over all selected items in the\ncontrol.\n\nReturn: Returns the next selected item or -1 if there are no more of them.","title":"wxListView.getNextSelected/2","ref":"wxListView.html#getNextSelected/2"},{"type":"function","doc":"Returns true if the item with the given `index` is selected, false otherwise.\n\nSee:\n* `getFirstSelected/1`\n\n* `getNextSelected/2`","title":"wxListView.isSelected/2","ref":"wxListView.html#isSelected/2"},{"type":"function","doc":"","title":"wxListView.select/2","ref":"wxListView.html#select/2"},{"type":"function","doc":"Selects or unselects the given item.\n\nNotice that this method inherits the unusual behaviour of `wxListCtrl:setItemState/4` which sends a\nwxEVT_LIST_ITEM_SELECTED event when it is used to select an item, contrary to the usual\nrule that only the user actions result in selection.","title":"wxListView.select/3","ref":"wxListView.html#select/3"},{"type":"function","doc":"Sets the column image for the specified column.\n\nTo use the column images, the control must have a valid image list with at least one image.","title":"wxListView.setColumnImage/3","ref":"wxListView.html#setColumnImage/3"},{"type":"type","doc":"","title":"wxListView.wxListView/0","ref":"wxListView.html#t:wxListView/0"},{"type":"module","doc":"`m:wxListbook` is a class similar to `m:wxNotebook` but which uses a `m:wxListCtrl` to\nshow the labels instead of the tabs.\n\nThe underlying `m:wxListCtrl` displays page labels in a one-column report view by\ndefault. Calling wxBookCtrl::SetImageList will implicitly switch the control to use an\nicon view.\n\nFor usage documentation of this class, please refer to the base abstract class\nwxBookCtrl. You can also use the page_samples_notebook to see `m:wxListbook` in action.","title":"wxListbook","ref":"wxListbook.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxLB_DEFAULT: Choose the default location for the labels depending on the current\nplatform (left everywhere except Mac where it is top).\n\n* wxLB_TOP: Place labels above the page area.\n\n* wxLB_LEFT: Place labels on the left side.\n\n* wxLB_RIGHT: Place labels on the right side.\n\n* wxLB_BOTTOM: Place labels below the page area.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListbook](https://docs.wxwidgets.org/3.2/classwx_listbook.html)","title":"Styles - wxListbook","ref":"wxListbook.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`listbook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`listbook_page_changing`](`m:wxBookCtrlEvent`)","title":"Events - wxListbook","ref":"wxListbook.html#module-events"},{"type":"function","doc":"","title":"wxListbook.addPage/3","ref":"wxListbook.html#addPage/3"},{"type":"function","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","title":"wxListbook.addPage/4","ref":"wxListbook.html#addPage/4"},{"type":"function","doc":"","title":"wxListbook.advanceSelection/1","ref":"wxListbook.html#advanceSelection/1"},{"type":"function","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","title":"wxListbook.advanceSelection/2","ref":"wxListbook.html#advanceSelection/2"},{"type":"function","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxListbook.assignImageList/2","ref":"wxListbook.html#assignImageList/2"},{"type":"function","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","title":"wxListbook.changeSelection/2","ref":"wxListbook.html#changeSelection/2"},{"type":"function","doc":"","title":"wxListbook.create/3","ref":"wxListbook.html#create/3"},{"type":"function","doc":"Create the list book control that has already been constructed with the default\nconstructor.","title":"wxListbook.create/4","ref":"wxListbook.html#create/4"},{"type":"function","doc":"Deletes all pages.","title":"wxListbook.deleteAllPages/1","ref":"wxListbook.html#deleteAllPages/1"},{"type":"function","doc":"Destroys the object","title":"wxListbook.destroy/1","ref":"wxListbook.html#destroy/1"},{"type":"function","doc":"Returns the currently selected page or NULL.","title":"wxListbook.getCurrentPage/1","ref":"wxListbook.html#getCurrentPage/1"},{"type":"function","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxListbook.getImageList/1","ref":"wxListbook.html#getImageList/1"},{"type":"function","doc":"Returns the window at the given page position.","title":"wxListbook.getPage/2","ref":"wxListbook.html#getPage/2"},{"type":"function","doc":"Returns the number of pages in the control.","title":"wxListbook.getPageCount/1","ref":"wxListbook.html#getPageCount/1"},{"type":"function","doc":"Returns the image index for the given page.","title":"wxListbook.getPageImage/2","ref":"wxListbook.html#getPageImage/2"},{"type":"function","doc":"Returns the string for the given page.","title":"wxListbook.getPageText/2","ref":"wxListbook.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","title":"wxListbook.getSelection/1","ref":"wxListbook.html#getSelection/1"},{"type":"function","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","title":"wxListbook.hitTest/2","ref":"wxListbook.html#hitTest/2"},{"type":"function","doc":"","title":"wxListbook.insertPage/4","ref":"wxListbook.html#insertPage/4"},{"type":"function","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","title":"wxListbook.insertPage/5","ref":"wxListbook.html#insertPage/5"},{"type":"function","doc":"Default ctor.","title":"wxListbook.new/0","ref":"wxListbook.html#new/0"},{"type":"function","doc":"","title":"wxListbook.new/2","ref":"wxListbook.html#new/2"},{"type":"function","doc":"Constructs a listbook control.","title":"wxListbook.new/3","ref":"wxListbook.html#new/3"},{"type":"function","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","title":"wxListbook.setImageList/2","ref":"wxListbook.html#setImageList/2"},{"type":"function","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","title":"wxListbook.setPageImage/3","ref":"wxListbook.html#setPageImage/3"},{"type":"function","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","title":"wxListbook.setPageSize/2","ref":"wxListbook.html#setPageSize/2"},{"type":"function","doc":"Sets the text for the given page.","title":"wxListbook.setPageText/3","ref":"wxListbook.html#setPageText/3"},{"type":"function","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","title":"wxListbook.setSelection/2","ref":"wxListbook.html#setSelection/2"},{"type":"type","doc":"","title":"wxListbook.wxListbook/0","ref":"wxListbook.html#t:wxListbook/0"},{"type":"module","doc":"`m:wxLocale` class encapsulates all language-dependent settings and is a generalization\nof the C locale concept.\n\nIn wxWidgets this class manages current locale. It also initializes and activates `wxTranslations`\n(not implemented in wx) object that manages message catalogs.\n\nFor a list of the supported languages, please see ?wxLanguage enum values. These\nconstants may be used to specify the language in `init/3` and are returned by `getSystemLanguage/0`.\n\nSee:\n* [Overview i18n](https://docs.wxwidgets.org/3.2/overview_i18n.html#overview_i18n)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_internat)\n\nwxWidgets docs: [wxLocale](https://docs.wxwidgets.org/3.2/classwx_locale.html)","title":"wxLocale","ref":"wxLocale.html"},{"type":"function","doc":"Calls wxTranslations::AddCatalog(const wxString&).","title":"wxLocale.addCatalog/2","ref":"wxLocale.html#addCatalog/2"},{"type":"function","doc":"Calls `wxTranslations::AddCatalog(const wxString&, wxLanguage)` (not implemented in wx).","title":"wxLocale.addCatalog/3","ref":"wxLocale.html#addCatalog/3"},{"type":"function","doc":"Calls `wxTranslations::AddCatalog(const wxString&, wxLanguage, const wxString&)` (not\nimplemented in wx).","title":"wxLocale.addCatalog/4","ref":"wxLocale.html#addCatalog/4"},{"type":"function","doc":"Calls `wxFileTranslationsLoader::AddCatalogLookupPathPrefix()` (not implemented in wx).","title":"wxLocale.addCatalogLookupPathPrefix/1","ref":"wxLocale.html#addCatalogLookupPathPrefix/1"},{"type":"function","doc":"Destroys the object","title":"wxLocale.destroy/1","ref":"wxLocale.html#destroy/1"},{"type":"function","doc":"Returns the canonical form of current locale name.\n\nCanonical form is the one that is used on UNIX systems: it is a two- or five-letter\nstring in xx or xx_YY format, where xx is ISO 639 code of language and YY is ISO 3166 code\nof the country. Examples are \"en\", \"en_GB\", \"en_US\" or \"fr_FR\". This form is internally\nused when looking up message catalogs. Compare `getSysName/1`.","title":"wxLocale.getCanonicalName/1","ref":"wxLocale.html#getCanonicalName/1"},{"type":"function","doc":"","title":"wxLocale.getHeaderValue/2","ref":"wxLocale.html#getHeaderValue/2"},{"type":"function","doc":"Calls `wxTranslations::GetHeaderValue()` (not implemented in wx).","title":"wxLocale.getHeaderValue/3","ref":"wxLocale.html#getHeaderValue/3"},{"type":"function","doc":"Returns the ?wxLanguage constant of current language.\n\nNote that you can call this function only if you used the form of `init/3` that takes ?wxLanguage\nargument.","title":"wxLocale.getLanguage/1","ref":"wxLocale.html#getLanguage/1"},{"type":"function","doc":"Returns English name of the given language or empty string if this language is unknown.\n\nSee `GetLanguageInfo()` (not implemented in wx) for a remark about special meaning of `wxLANGUAGE_DEFAULT`.","title":"wxLocale.getLanguageName/1","ref":"wxLocale.html#getLanguageName/1"},{"type":"function","doc":"Returns the locale name as passed to the constructor or `init/3`.\n\nThis is a full, human-readable name, e.g. \"English\" or \"French\".","title":"wxLocale.getLocale/1","ref":"wxLocale.html#getLocale/1"},{"type":"function","doc":"Returns the current short name for the locale (as given to the constructor or the `init/3`\nfunction).","title":"wxLocale.getName/1","ref":"wxLocale.html#getName/1"},{"type":"function","doc":"","title":"wxLocale.getString/2","ref":"wxLocale.html#getString/2"},{"type":"function","doc":"Calls wxGetTranslation(const wxString&, const wxString&).","title":"wxLocale.getString/3","ref":"wxLocale.html#getString/3"},{"type":"function","doc":"","title":"wxLocale.getString/4","ref":"wxLocale.html#getString/4"},{"type":"function","doc":"Calls wxGetTranslation(const wxString&, const wxString&, unsigned, const wxString&).","title":"wxLocale.getString/5","ref":"wxLocale.html#getString/5"},{"type":"function","doc":"Returns current platform-specific locale name as passed to setlocale().\n\nCompare `getCanonicalName/1`.","title":"wxLocale.getSysName/1","ref":"wxLocale.html#getSysName/1"},{"type":"function","doc":"Tries to detect the user's default font encoding.\n\nReturns ?wxFontEncoding() value or `wxFONTENCODING_SYSTEM` if it couldn't be determined.","title":"wxLocale.getSystemEncoding/0","ref":"wxLocale.html#getSystemEncoding/0"},{"type":"function","doc":"Tries to detect the name of the user's default font encoding.\n\nThis string isn't particularly useful for the application as its form is\nplatform-dependent and so you should probably use `getSystemEncoding/0` instead.\n\nReturns a user-readable string value or an empty string if it couldn't be determined.","title":"wxLocale.getSystemEncodingName/0","ref":"wxLocale.html#getSystemEncodingName/0"},{"type":"function","doc":"Tries to detect the user's default locale setting.\n\nReturns the ?wxLanguage value or `wxLANGUAGE_UNKNOWN` if the language-guessing algorithm failed.\n\nNote: This function works with `locales` and returns the user's default locale. This may\nbe, and usually is, the same as their preferred UI language, but it's not the same thing.\nUse wxTranslation to obtain `language` information.","title":"wxLocale.getSystemLanguage/0","ref":"wxLocale.html#getSystemLanguage/0"},{"type":"function","doc":"","title":"wxLocale.init/1","ref":"wxLocale.html#init/1"},{"type":"function","doc":"Initializes the `m:wxLocale` instance.\n\nThe call of this function has several global side effects which you should understand:\nfirst of all, the application locale is changed - note that this will affect many of\nstandard C library functions such as printf() or strftime(). Second, this `m:wxLocale`\nobject becomes the new current global locale for the application and so all subsequent\ncalls to ?wxGetTranslation() will try to translate the messages using the message catalogs\nfor this locale.\n\nReturn: true on success or false if the given locale couldn't be set.","title":"wxLocale.init/2","ref":"wxLocale.html#init/2"},{"type":"function","doc":"Deprecated:\n\nThis form is deprecated, use the other one unless you know what you are doing.","title":"wxLocale.init/3","ref":"wxLocale.html#init/3"},{"type":"function","doc":"Calls `wxTranslations::IsLoaded()` (not implemented in wx).","title":"wxLocale.isLoaded/2","ref":"wxLocale.html#isLoaded/2"},{"type":"function","doc":"Returns true if the locale could be set successfully.","title":"wxLocale.isOk/1","ref":"wxLocale.html#isOk/1"},{"type":"function","doc":"This is the default constructor and it does nothing to initialize the object: `init/3`\nmust be used to do that.","title":"wxLocale.new/0","ref":"wxLocale.html#new/0"},{"type":"function","doc":"Equivalent to: `new/2`","title":"wxLocale.new/1","ref":"wxLocale.html#new/1"},{"type":"function","doc":"See `init/3` for parameters description.\n\nThe call of this function has several global side effects which you should understand:\nfirst of all, the application locale is changed - note that this will affect many of\nstandard C library functions such as printf() or strftime(). Second, this `m:wxLocale`\nobject becomes the new current global locale for the application and so all subsequent\ncalls to ?wxGetTranslation() will try to translate the messages using the message catalogs\nfor this locale.","title":"wxLocale.new/2","ref":"wxLocale.html#new/2"},{"type":"type","doc":"","title":"wxLocale.wxLocale/0","ref":"wxLocale.html#t:wxLocale/0"},{"type":"module","doc":"This class allows you to temporarily suspend logging.\n\nAll calls to the log functions during the life time of an object of this class are just ignored.\n\nIn particular, it can be used to suppress the log messages given by wxWidgets itself but\nit should be noted that it is rarely the best way to cope with this problem as `all` log\nmessages are suppressed, even if they indicate a completely different error than the one\nthe programmer wanted to suppress.\n\nFor instance, the example of the overview:\n\nwould be better written as:\n\nwxWidgets docs: [wxLogNull](https://docs.wxwidgets.org/3.2/classwx_log_null.html)","title":"wxLogNull","ref":"wxLogNull.html"},{"type":"function","doc":"Destroys the object","title":"wxLogNull.destroy/1","ref":"wxLogNull.html#destroy/1"},{"type":"function","doc":"Suspends logging.","title":"wxLogNull.new/0","ref":"wxLogNull.html#new/0"},{"type":"type","doc":"","title":"wxLogNull.wxLogNull/0","ref":"wxLogNull.html#t:wxLogNull/0"},{"type":"module","doc":"An MDI child frame is a frame that can only exist inside a `m:wxMDIClientWindow`, which\nis itself a child of `m:wxMDIParentFrame`.","title":"wxMDIChildFrame","ref":"wxMDIChildFrame.html"},{"type":"module","doc":"This class supports the following styles:\n\nAll of the standard `m:wxFrame` styles can be used but most of them are ignored by\nTDI-based MDI implementations.\n\nRemark: Although internally an MDI child frame is a child of the MDI client window, in\nwxWidgets you create it as a child of `m:wxMDIParentFrame`. In fact, you can usually\nforget that the client window exists. MDI child frames are clipped to the area of the MDI\nclient window, and may be iconized on the client window. You can associate a menubar with\na child frame as usual, although an MDI child doesn't display its menubar under its own\ntitle bar. The MDI parent frame's menubar will be changed to reflect the currently active\nchild frame. If there are currently no children, the parent frame's own menubar will be displayed.\n\nSee:\n* `m:wxMDIClientWindow`\n\n* `m:wxMDIParentFrame`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIChildFrame](https://docs.wxwidgets.org/3.2/classwx_m_d_i_child_frame.html)","title":"Styles - wxMDIChildFrame","ref":"wxMDIChildFrame.html#module-styles"},{"type":"function","doc":"Activates this MDI child frame.\n\nSee:\n* `maximize/2`\n\n* `restore/1`","title":"wxMDIChildFrame.activate/1","ref":"wxMDIChildFrame.html#activate/1"},{"type":"function","doc":"","title":"wxMDIChildFrame.create/4","ref":"wxMDIChildFrame.html#create/4"},{"type":"function","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","title":"wxMDIChildFrame.create/5","ref":"wxMDIChildFrame.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxMDIChildFrame.destroy/1","ref":"wxMDIChildFrame.html#destroy/1"},{"type":"function","doc":"","title":"wxMDIChildFrame.maximize/1","ref":"wxMDIChildFrame.html#maximize/1"},{"type":"function","doc":"Maximizes this MDI child frame.\n\nThis function doesn't do anything if `IsAlwaysMaximized()` (not implemented in wx)\nreturns true.\n\nSee:\n* `activate/1`\n\n* `restore/1`","title":"wxMDIChildFrame.maximize/2","ref":"wxMDIChildFrame.html#maximize/2"},{"type":"function","doc":"Default constructor.","title":"wxMDIChildFrame.new/0","ref":"wxMDIChildFrame.html#new/0"},{"type":"function","doc":"","title":"wxMDIChildFrame.new/3","ref":"wxMDIChildFrame.html#new/3"},{"type":"function","doc":"Constructor, creating the window.\n\nSee: `create/5`","title":"wxMDIChildFrame.new/4","ref":"wxMDIChildFrame.html#new/4"},{"type":"function","doc":"Restores this MDI child frame (unmaximizes).\n\nThis function doesn't do anything if `IsAlwaysMaximized()` (not implemented in wx)\nreturns true.\n\nSee:\n* `activate/1`\n\n* `maximize/2`","title":"wxMDIChildFrame.restore/1","ref":"wxMDIChildFrame.html#restore/1"},{"type":"type","doc":"","title":"wxMDIChildFrame.wxMDIChildFrame/0","ref":"wxMDIChildFrame.html#t:wxMDIChildFrame/0"},{"type":"module","doc":"An MDI client window is a child of `m:wxMDIParentFrame`, and manages zero or more `m:wxMDIChildFrame`\nobjects.\n\nThe client window is the area where MDI child windows exist. It doesn't have to cover\nthe whole parent frame; other windows such as toolbars and a help window might coexist\nwith it. There can be scrollbars on a client window, which are controlled by the parent\nwindow style.\n\nThe `m:wxMDIClientWindow` class is usually adequate without further derivation, and it is\ncreated automatically when the MDI parent frame is created. If the application needs to\nderive a new class, the function `wxMDIParentFrame::OnCreateClient()` (not implemented in\nwx) must be overridden in order to give an opportunity to use a different class of client window.\n\nUnder wxMSW, the client window will automatically have a sunken border style when the\nactive child is not maximized, and no border style when a child is maximized.\n\nSee:\n* `m:wxMDIChildFrame`\n\n* `m:wxMDIParentFrame`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIClientWindow](https://docs.wxwidgets.org/3.2/classwx_m_d_i_client_window.html)","title":"wxMDIClientWindow","ref":"wxMDIClientWindow.html"},{"type":"function","doc":"","title":"wxMDIClientWindow.createClient/2","ref":"wxMDIClientWindow.html#createClient/2"},{"type":"function","doc":"Called by `m:wxMDIParentFrame` immediately after creating the client window.\n\nThis function may be overridden in the derived class but the base class version must\nusually be called first to really create the window.","title":"wxMDIClientWindow.createClient/3","ref":"wxMDIClientWindow.html#createClient/3"},{"type":"function","doc":"Destroys the object","title":"wxMDIClientWindow.destroy/1","ref":"wxMDIClientWindow.html#destroy/1"},{"type":"function","doc":"Default constructor.\n\nObjects of this class are only created by `m:wxMDIParentFrame` which uses the default\nconstructor and calls `createClient/3` immediately afterwards.","title":"wxMDIClientWindow.new/0","ref":"wxMDIClientWindow.html#new/0"},{"type":"type","doc":"","title":"wxMDIClientWindow.wxMDIClientWindow/0","ref":"wxMDIClientWindow.html#t:wxMDIClientWindow/0"},{"type":"module","doc":"An MDI (Multiple Document Interface) parent frame is a window which can contain MDI child\nframes in its client area which emulates the full desktop.\n\nMDI is a user-interface model in which all the window reside inside the single parent\nwindow as opposed to being separate from each other. It remains popular despite dire\nwarnings from Microsoft itself (which popularized this model in the first model) that MDI\nis obsolete.\n\nAn MDI parent frame always has a `m:wxMDIClientWindow` associated with it, which is the\nparent for MDI child frames. In the simplest case, the client window takes up the entire\nparent frame area but it is also possible to resize it to be smaller in order to have\nother windows in the frame, a typical example is using a sidebar along one of the window edges.\n\nThe appearance of MDI applications differs between different ports. The classic MDI\nmodel, with child windows which can be independently moved, resized etc, is only available\nunder MSW, which provides native support for it. In Mac ports, multiple top level windows\nare used for the MDI children too and the MDI parent frame itself is invisible, to\naccommodate the native look and feel requirements. In all the other ports, a tab-based MDI\nimplementation (sometimes called TDI) is used and so at most one MDI child is visible at\nany moment (child frames are always maximized).\n\nAlthough it is possible to have multiple MDI parent frames, a typical MDI application\nhas a single MDI parent frame window inside which multiple MDI child frames, i.e. objects\nof class `m:wxMDIChildFrame`, can be created.","title":"wxMDIParentFrame","ref":"wxMDIParentFrame.html"},{"type":"module","doc":"This class supports the following styles:\n\nThere are no special styles for this class, all `m:wxFrame` styles apply to it in the\nusual way. The only exception is that wxHSCROLL and wxVSCROLL styles apply not to the\nframe itself but to the client window, so that using them enables horizontal and vertical\nscrollbars for this window and not the frame.\n\nSee:\n* `m:wxMDIChildFrame`\n\n* `m:wxMDIClientWindow`\n\n* `m:wxFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIParentFrame](https://docs.wxwidgets.org/3.2/classwx_m_d_i_parent_frame.html)","title":"Styles - wxMDIParentFrame","ref":"wxMDIParentFrame.html#module-styles"},{"type":"function","doc":"Activates the MDI child following the currently active one.\n\nThe MDI children are maintained in an ordered list and this function switches to the next\nelement in this list, wrapping around the end of it if the currently active child is the\nlast one.\n\nSee: `activatePrevious/1`","title":"wxMDIParentFrame.activateNext/1","ref":"wxMDIParentFrame.html#activateNext/1"},{"type":"function","doc":"Activates the MDI child preceding the currently active one.\n\nSee: `activateNext/1`","title":"wxMDIParentFrame.activatePrevious/1","ref":"wxMDIParentFrame.html#activatePrevious/1"},{"type":"function","doc":"Arranges any iconized (minimized) MDI child windows.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.\n\nSee:\n* `cascade/1`\n\n* `tile/2`","title":"wxMDIParentFrame.arrangeIcons/1","ref":"wxMDIParentFrame.html#arrangeIcons/1"},{"type":"function","doc":"Arranges the MDI child windows in a cascade.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.\n\nSee:\n* `tile/2`\n\n* `arrangeIcons/1`","title":"wxMDIParentFrame.cascade/1","ref":"wxMDIParentFrame.html#cascade/1"},{"type":"function","doc":"","title":"wxMDIParentFrame.create/4","ref":"wxMDIParentFrame.html#create/4"},{"type":"function","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","title":"wxMDIParentFrame.create/5","ref":"wxMDIParentFrame.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxMDIParentFrame.destroy/1","ref":"wxMDIParentFrame.html#destroy/1"},{"type":"function","doc":"Returns a pointer to the active MDI child, if there is one.\n\nIf there are any children at all this function returns a non-NULL pointer.","title":"wxMDIParentFrame.getActiveChild/1","ref":"wxMDIParentFrame.html#getActiveChild/1"},{"type":"function","doc":"Returns a pointer to the client window.","title":"wxMDIParentFrame.getClientWindow/1","ref":"wxMDIParentFrame.html#getClientWindow/1"},{"type":"function","doc":"Default constructor.\n\nUse `create/5` for the objects created using this constructor.","title":"wxMDIParentFrame.new/0","ref":"wxMDIParentFrame.html#new/0"},{"type":"function","doc":"","title":"wxMDIParentFrame.new/3","ref":"wxMDIParentFrame.html#new/3"},{"type":"function","doc":"Constructor, creating the window.\n\nNotice that if you override virtual `OnCreateClient()` (not implemented in wx) method you\nshouldn't be using this constructor but the default constructor and `create/5` as otherwise your\noverridden method is never going to be called because of the usual C++ virtual call\nresolution rules.\n\nUnder wxMSW, the client window will automatically have a sunken border style when the\nactive child is not maximized, and no border style when a child is maximized.\n\nSee: `create/5`","title":"wxMDIParentFrame.new/4","ref":"wxMDIParentFrame.html#new/4"},{"type":"function","doc":"","title":"wxMDIParentFrame.tile/1","ref":"wxMDIParentFrame.html#tile/1"},{"type":"function","doc":"Tiles the MDI child windows either horizontally or vertically depending on whether `orient`\nis `wxHORIZONTAL` or `wxVERTICAL`.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.","title":"wxMDIParentFrame.tile/2","ref":"wxMDIParentFrame.html#tile/2"},{"type":"type","doc":"","title":"wxMDIParentFrame.wxMDIParentFrame/0","ref":"wxMDIParentFrame.html#t:wxMDIParentFrame/0"},{"type":"module","doc":"This class encapsulates a monochrome mask bitmap, where the masked area is black and the\nunmasked area is white.\n\nWhen associated with a bitmap and drawn in a device context, the unmasked area of the\nbitmap will be drawn, and the masked area will not be drawn.\n\nNote: A mask can be associated also with a bitmap with an alpha channel but drawing such\nbitmaps under wxMSW may be slow so using them should be avoided if drawing performance is\nan important factor.\n\nSee:\n* `m:wxBitmap`\n\n* `wxDC:blit/6`\n\n* `m:wxMemoryDC`\n\nwxWidgets docs: [wxMask](https://docs.wxwidgets.org/3.2/classwx_mask.html)","title":"wxMask","ref":"wxMask.html"},{"type":"function","doc":"Constructs a mask from a monochrome bitmap.","title":"wxMask.create/2","ref":"wxMask.html#create/2"},{"type":"function","doc":"Constructs a mask from a bitmap and a colour that indicates the background.","title":"wxMask.create/3","ref":"wxMask.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxMask.destroy/1","ref":"wxMask.html#destroy/1"},{"type":"function","doc":"Default constructor.","title":"wxMask.new/0","ref":"wxMask.html#new/0"},{"type":"function","doc":"Constructs a mask from a monochrome bitmap.","title":"wxMask.new/1","ref":"wxMask.html#new/1"},{"type":"function","doc":"Constructs a mask from a bitmap and a colour that indicates the background.","title":"wxMask.new/2","ref":"wxMask.html#new/2"},{"type":"type","doc":"","title":"wxMask.wxMask/0","ref":"wxMask.html#t:wxMask/0"},{"type":"module","doc":"An event being sent when a top level window is maximized.\n\nNotice that it is not sent when the window is restored to its original size after it had\nbeen maximized, only a normal `m:wxSizeEvent` is generated in this case.\n\nCurrently this event is only generated in wxMSW, wxGTK and wxOSX/Cocoa ports so portable\nprograms should only rely on receiving `wxEVT_SIZE` and not necessarily this event when\nthe window is maximized.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxTopLevelWindow:maximize/2`\n\n* `wxTopLevelWindow:isMaximized/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMaximizeEvent](https://docs.wxwidgets.org/3.2/classwx_maximize_event.html)","title":"wxMaximizeEvent","ref":"wxMaximizeEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMaximizeEventType` to subscribe to events of this type.","title":"Events - wxMaximizeEvent","ref":"wxMaximizeEvent.html#module-events"},{"type":"type","doc":"","title":"wxMaximizeEvent.wxMaximize/0","ref":"wxMaximizeEvent.html#t:wxMaximize/0"},{"type":"type","doc":"","title":"wxMaximizeEvent.wxMaximizeEvent/0","ref":"wxMaximizeEvent.html#t:wxMaximizeEvent/0"},{"type":"type","doc":"","title":"wxMaximizeEvent.wxMaximizeEventType/0","ref":"wxMaximizeEvent.html#t:wxMaximizeEventType/0"},{"type":"module","doc":"A memory device context provides a means to draw graphics onto a bitmap.\n\nWhen drawing in to a mono-bitmap, using `wxWHITE`, `wxWHITE_PEN` and `wxWHITE_BRUSH` will\ndraw the background colour (i.e. 0) whereas all other colours will draw the foreground\ncolour (i.e. 1).\n\nA bitmap must be selected into the new memory DC before it may be used for anything.\nTypical usage is as follows:\n\nNote that the memory DC must be deleted (or the bitmap selected out of it) before a\nbitmap can be reselected into another memory DC.\n\nAnd, before performing any other operations on the bitmap data, the bitmap must be\nselected out of the memory DC:\n\nThis happens automatically when `m:wxMemoryDC` object goes out of scope.\n\nSee:\n* `m:wxBitmap`\n\n* `m:wxDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxMemoryDC](https://docs.wxwidgets.org/3.2/classwx_memory_d_c.html)","title":"wxMemoryDC","ref":"wxMemoryDC.html"},{"type":"function","doc":"Destroys the object","title":"wxMemoryDC.destroy/1","ref":"wxMemoryDC.html#destroy/1"},{"type":"function","doc":"Constructs a new memory device context.\n\nUse the `wxDC:isOk/1` member to test whether the constructor was successful in creating a usable\ndevice context. Don't forget to select a bitmap into the DC before drawing on it.","title":"wxMemoryDC.new/0","ref":"wxMemoryDC.html#new/0"},{"type":"function","doc":"Constructs a new memory device context having the same characteristics as the given\nexisting device context.\n\nThis constructor creates a memory device context `compatible` with `dc` in wxMSW, the\nargument is ignored in the other ports. If `dc` is NULL, a device context compatible with\nthe screen is created, just as with the default constructor.","title":"wxMemoryDC.new/1","ref":"wxMemoryDC.html#new/1"},{"type":"function","doc":"Works exactly like `selectObjectAsSource/2` but this is the function you should use when\nyou select a bitmap because you want to modify it, e.g.\n\ndrawing on this DC.\n\nUsing `selectObjectAsSource/2` when modifying the bitmap may incur some problems related to `m:wxBitmap` being a\nreference counted object (see overview_refcount).\n\nBefore using the updated bitmap data, make sure to select it out of context first either\nby selecting ?wxNullBitmap into the device context or destroying the device context entirely.\n\nIf the bitmap is already selected in this device context, nothing is done. If it is\nselected in another context, the function asserts and drawing on the bitmap won't work correctly.\n\nSee: `wxDC:drawBitmap/4`","title":"wxMemoryDC.selectObject/2","ref":"wxMemoryDC.html#selectObject/2"},{"type":"function","doc":"Selects the given bitmap into the device context, to use as the memory bitmap.\n\nSelecting the bitmap into a memory DC allows you to draw into the DC (and therefore the\nbitmap) and also to use `wxDC:blit/6` to copy the bitmap to a window. For this purpose, you may find `wxDC:drawIcon/3`\neasier to use instead.\n\nIf the argument is ?wxNullBitmap (or some other uninitialised `m:wxBitmap`) the current\nbitmap is selected out of the device context, and the original bitmap restored, allowing\nthe current bitmap to be destroyed safely.","title":"wxMemoryDC.selectObjectAsSource/2","ref":"wxMemoryDC.html#selectObjectAsSource/2"},{"type":"type","doc":"","title":"wxMemoryDC.wxMemoryDC/0","ref":"wxMemoryDC.html#t:wxMemoryDC/0"},{"type":"module","doc":"A menu is a popup (or pull down) list of items, one of which may be selected before the\nmenu goes away (clicking elsewhere dismisses the menu).\n\nMenus may be used to construct either menu bars or popup menus.\n\nA menu item has an integer ID associated with it which can be used to identify the\nselection, or to change the menu item in some way. A menu item with a special identifier `wxID_SEPARATOR`\nis a separator item and doesn't have an associated command but just makes a separator\nline appear in the menu.\n\nNote: Please note that `wxID_ABOUT` and `wxID_EXIT` are predefined by wxWidgets and have\na special meaning since entries using these IDs will be taken out of the normal menus\nunder macOS and will be inserted into the system menu (following the appropriate macOS\ninterface guideline).\n\nMenu items may be either `normal` items, `check` items or `radio` items. Normal items\ndon't have any special properties while the check items have a boolean flag associated to\nthem and they show a checkmark in the menu when the flag is set. wxWidgets automatically\ntoggles the flag value when the item is clicked and its value may be retrieved using\neither `isChecked/2` method of `m:wxMenu` or `m:wxMenuBar` itself or by using wxEvent::IsChecked when\nyou get the menu notification for the item in question.\n\nThe radio items are similar to the check items except that all the other items in the\nsame radio group are unchecked when a radio item is checked. The radio group is formed by\na contiguous range of radio items, i.e. it starts at the first item of this kind and ends\nwith the first item of a different kind (or the end of the menu). Notice that because the\nradio groups are defined in terms of the item positions inserting or removing the items in\nthe menu containing the radio items risks to not work correctly.\n\nAllocation strategy\n\nAll menus must be created on the `heap` because all menus attached to a menubar or to\nanother menu will be deleted by their parent when it is deleted. The only exception to\nthis rule are the popup menus (i.e. menus used with `wxWindow:popupMenu/4`) as wxWidgets does not destroy them\nto allow reusing the same menu more than once. But the exception applies only to the menus\nthemselves and not to any submenus of popup menus which are still destroyed by wxWidgets\nas usual and so must be heap-allocated.\n\nAs the frame menubar is deleted by the frame itself, it means that normally all menus\nused are deleted automatically.\n\nEvent handling\n\nEvent handlers for the commands generated by the menu items can be connected directly to\nthe menu object itself using `wxEvtHandler::Bind()` (not implemented in wx). If this menu\nis a submenu of another one, the events from its items can also be processed in the parent\nmenu and so on, recursively.\n\nIf the menu is part of a menu bar, then events can also be handled in `m:wxMenuBar` object.\n\nFinally, menu events can also be handled in the associated window, which is either the `m:wxFrame`\nassociated with the menu bar this menu belongs to or the window for which `wxWindow:popupMenu/4` was called for\nthe popup menus.\n\nSee overview_events_bind for how to bind event handlers to the various objects.\n\nSee:\n* `m:wxMenuBar`\n\n* `wxWindow:popupMenu/4`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMenu](https://docs.wxwidgets.org/3.2/classwx_menu.html)","title":"wxMenu","ref":"wxMenu.html"},{"type":"function","doc":"Adds a menu item object.\n\nThis is the most generic variant of `append/5` method because it may be used for both items\n(including separators) and submenus and because you can also specify various extra\nproperties of a menu item this way, such as bitmaps and fonts.\n\nRemark: See the remarks for the other `append/5` overloads.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","title":"wxMenu.append/2","ref":"wxMenu.html#append/2"},{"type":"function","doc":"","title":"wxMenu.append/3","ref":"wxMenu.html#append/3"},{"type":"function","doc":"Adds a menu item.\n\nExample: or even better for stock menu items (see `wxMenuItem:new/1`):\n\nRemark: This command can be used after the menu has been shown, as well as on initial\ncreation of a menu or menubar.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","title":"wxMenu.append/4","ref":"wxMenu.html#append/4"},{"type":"function","doc":"Adds a submenu.\n\nDeprecated:\n\nThis function is deprecated, use `AppendSubMenu()` (not implemented in wx) instead.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","title":"wxMenu.append/5","ref":"wxMenu.html#append/5"},{"type":"function","doc":"","title":"wxMenu.appendCheckItem/3","ref":"wxMenu.html#appendCheckItem/3"},{"type":"function","doc":"Adds a checkable item to the end of the menu.\n\nSee:\n* `append/5`\n\n* `insertCheckItem/5`","title":"wxMenu.appendCheckItem/4","ref":"wxMenu.html#appendCheckItem/4"},{"type":"function","doc":"","title":"wxMenu.appendRadioItem/3","ref":"wxMenu.html#appendRadioItem/3"},{"type":"function","doc":"Adds a radio item to the end of the menu.\n\nAll consequent radio items form a group and when an item in the group is checked, all the\nothers are automatically unchecked.\n\nNote: Radio items are not supported under wxMotif.\n\nSee:\n* `append/5`\n\n* `insertRadioItem/5`","title":"wxMenu.appendRadioItem/4","ref":"wxMenu.html#appendRadioItem/4"},{"type":"function","doc":"Adds a separator to the end of the menu.\n\nSee:\n* `append/5`\n\n* `insertSeparator/2`","title":"wxMenu.appendSeparator/1","ref":"wxMenu.html#appendSeparator/1"},{"type":"function","doc":"Inserts a break in a menu, causing the next appended item to appear in a new column.\n\nThis function only actually inserts a break in wxMSW and does nothing under the other\nplatforms.","title":"wxMenu.break/1","ref":"wxMenu.html#break/1"},{"type":"function","doc":"Checks or unchecks the menu item.\n\nSee: `isChecked/2`","title":"wxMenu.check/3","ref":"wxMenu.html#check/3"},{"type":"function","doc":"Deletes the menu item from the menu.\n\nIf the item is a submenu, it will be deleted. Use `remove/2` if you want to keep the submenu (for\nexample, to reuse it later).\n\nSee:\n* `findItem/2`\n\n* `delete/2`\n\n* `remove/2`","title":"wxMenu.Destroy/2","ref":"wxMenu.html#Destroy/2"},{"type":"function","doc":"Deletes the menu item from the menu.\n\nIf the item is a submenu, it will `not` be deleted. Use `'Destroy'/2` if you want to delete a submenu.\n\nSee:\n* `findItem/2`\n\n* `'Destroy'/2`\n\n* `remove/2`","title":"wxMenu.delete/2","ref":"wxMenu.html#delete/2"},{"type":"function","doc":"Destroys the object","title":"wxMenu.destroy/1","ref":"wxMenu.html#destroy/1"},{"type":"function","doc":"Enables or disables (greys out) a menu item.\n\nSee: `isEnabled/2`","title":"wxMenu.enable/3","ref":"wxMenu.html#enable/3"},{"type":"function","doc":"Finds the menu id for a menu item string.\n\nReturn: Menu item identifier, or wxNOT_FOUND if none is found.\n\nRemark: Any special menu codes are stripped out of source and target strings before\nmatching.","title":"wxMenu.findItem/2","ref":"wxMenu.html#findItem/2"},{"type":"function","doc":"Returns the `m:wxMenuItem` given a position in the menu.","title":"wxMenu.findItemByPosition/2","ref":"wxMenu.html#findItemByPosition/2"},{"type":"function","doc":"Returns the help string associated with a menu item.\n\nReturn: The help string, or the empty string if there is no help string or the item was\nnot found.\n\nSee:\n* `setHelpString/3`\n\n* `append/5`","title":"wxMenu.getHelpString/2","ref":"wxMenu.html#getHelpString/2"},{"type":"function","doc":"Returns a menu item label.\n\nReturn: The item label, or the empty string if the item was not found.\n\nSee: `setLabel/3`","title":"wxMenu.getLabel/2","ref":"wxMenu.html#getLabel/2"},{"type":"function","doc":"Returns the number of items in the menu.","title":"wxMenu.getMenuItemCount/1","ref":"wxMenu.html#getMenuItemCount/1"},{"type":"function","doc":"","title":"wxMenu.getMenuItems/1","ref":"wxMenu.html#getMenuItems/1"},{"type":"function","doc":"Returns the title of the menu.\n\nSee: `setTitle/2`","title":"wxMenu.getTitle/1","ref":"wxMenu.html#getTitle/1"},{"type":"function","doc":"Inserts the given `item` before the position `pos`.\n\nInserting the item at position `getMenuItemCount/1` is the same as appending it.\n\nSee:\n* `append/5`\n\n* `prepend/5`","title":"wxMenu.insert/3","ref":"wxMenu.html#insert/3"},{"type":"function","doc":"Inserts the given `item` before the position `pos`.\n\nInserting the item at position `getMenuItemCount/1` is the same as appending it.\n\nSee:\n* `append/5`\n\n* `prepend/5`","title":"wxMenu.insert/4","ref":"wxMenu.html#insert/4"},{"type":"function","doc":"","title":"wxMenu.insert/5","ref":"wxMenu.html#insert/5"},{"type":"function","doc":"Inserts the given `submenu` before the position `pos`.\n\n`text` is the text shown in the menu for it and `help` is the help string shown in the\nstatus bar when the submenu item is selected.\n\nSee: `prepend/5`","title":"wxMenu.insert/6","ref":"wxMenu.html#insert/6"},{"type":"function","doc":"","title":"wxMenu.insertCheckItem/4","ref":"wxMenu.html#insertCheckItem/4"},{"type":"function","doc":"Inserts a checkable item at the given position.\n\nSee:\n* `insert/6`\n\n* `appendCheckItem/4`","title":"wxMenu.insertCheckItem/5","ref":"wxMenu.html#insertCheckItem/5"},{"type":"function","doc":"","title":"wxMenu.insertRadioItem/4","ref":"wxMenu.html#insertRadioItem/4"},{"type":"function","doc":"Inserts a radio item at the given position.\n\nSee:\n* `insert/6`\n\n* `appendRadioItem/4`","title":"wxMenu.insertRadioItem/5","ref":"wxMenu.html#insertRadioItem/5"},{"type":"function","doc":"Inserts a separator at the given position.\n\nSee:\n* `insert/6`\n\n* `appendSeparator/1`","title":"wxMenu.insertSeparator/2","ref":"wxMenu.html#insertSeparator/2"},{"type":"function","doc":"Determines whether a menu item is checked.\n\nReturn: true if the menu item is checked, false otherwise.\n\nSee: `check/3`","title":"wxMenu.isChecked/2","ref":"wxMenu.html#isChecked/2"},{"type":"function","doc":"Determines whether a menu item is enabled.\n\nReturn: true if the menu item is enabled, false otherwise.\n\nSee: `enable/3`","title":"wxMenu.isEnabled/2","ref":"wxMenu.html#isEnabled/2"},{"type":"function","doc":"Constructs a `m:wxMenu` object.","title":"wxMenu.new/0","ref":"wxMenu.html#new/0"},{"type":"function","doc":"Constructs a `m:wxMenu` object.","title":"wxMenu.new/1","ref":"wxMenu.html#new/1"},{"type":"function","doc":"Constructs a `m:wxMenu` object with a title.","title":"wxMenu.new/2","ref":"wxMenu.html#new/2"},{"type":"function","doc":"Inserts the given `item` at position 0, i.e. before all the other existing items.\n\nSee:\n* `append/5`\n\n* `insert/6`","title":"wxMenu.prepend/2","ref":"wxMenu.html#prepend/2"},{"type":"function","doc":"Inserts the given `item` at position 0, i.e. before all the other existing items.\n\nSee:\n* `append/5`\n\n* `insert/6`","title":"wxMenu.prepend/3","ref":"wxMenu.html#prepend/3"},{"type":"function","doc":"","title":"wxMenu.prepend/4","ref":"wxMenu.html#prepend/4"},{"type":"function","doc":"Inserts the given `submenu` at position 0.\n\nSee: `insert/6`","title":"wxMenu.prepend/5","ref":"wxMenu.html#prepend/5"},{"type":"function","doc":"","title":"wxMenu.prependCheckItem/3","ref":"wxMenu.html#prependCheckItem/3"},{"type":"function","doc":"Inserts a checkable item at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendCheckItem/4`","title":"wxMenu.prependCheckItem/4","ref":"wxMenu.html#prependCheckItem/4"},{"type":"function","doc":"","title":"wxMenu.prependRadioItem/3","ref":"wxMenu.html#prependRadioItem/3"},{"type":"function","doc":"Inserts a radio item at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendRadioItem/4`","title":"wxMenu.prependRadioItem/4","ref":"wxMenu.html#prependRadioItem/4"},{"type":"function","doc":"Inserts a separator at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendSeparator/1`","title":"wxMenu.prependSeparator/1","ref":"wxMenu.html#prependSeparator/1"},{"type":"function","doc":"Removes the menu item from the menu but doesn't delete the associated C++ object.\n\nThis allows you to reuse the same item later by adding it back to the menu (especially\nuseful with submenus).\n\nReturn: A pointer to the item which was detached from the menu.","title":"wxMenu.remove/2","ref":"wxMenu.html#remove/2"},{"type":"function","doc":"Sets an item's help string.\n\nSee: `getHelpString/2`","title":"wxMenu.setHelpString/3","ref":"wxMenu.html#setHelpString/3"},{"type":"function","doc":"Sets the label of a menu item.\n\nSee:\n* `append/5`\n\n* `getLabel/2`","title":"wxMenu.setLabel/3","ref":"wxMenu.html#setLabel/3"},{"type":"function","doc":"Sets the title of the menu.\n\nRemark: Notice that you can only call this method directly for the popup menus, to change\nthe title of a menu that is part of a menu bar you need to use `wxMenuBar:setLabelTop/3`.\n\nSee: `getTitle/1`","title":"wxMenu.setTitle/2","ref":"wxMenu.html#setTitle/2"},{"type":"type","doc":"","title":"wxMenu.wxMenu/0","ref":"wxMenu.html#t:wxMenu/0"},{"type":"module","doc":"A menu bar is a series of menus accessible from the top of a frame.\n\nRemark: To respond to a menu selection, provide a handler for EVT_MENU, in the frame that\ncontains the menu bar.\n\nIf you have a toolbar which uses the same identifiers as your EVT_MENU entries, events\nfrom the toolbar will also be processed by your EVT_MENU event handlers.\n\nTip: under Windows, if you discover that menu shortcuts (for example, Alt-F to show the\nfile menu) are not working, check any EVT_CHAR events you are handling in child windows.\nIf you are not calling event.Skip() for events that you don't process in these event\nhandlers, menu shortcuts may cease to work.\n\nSee:\n* `m:wxMenu`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMenuBar](https://docs.wxwidgets.org/3.2/classwx_menu_bar.html)","title":"wxMenuBar","ref":"wxMenuBar.html"},{"type":"function","doc":"Adds the item to the end of the menu bar.\n\nReturn: true on success, false if an error occurred.\n\nSee: `insert/4`","title":"wxMenuBar.append/3","ref":"wxMenuBar.html#append/3"},{"type":"function","doc":"Checks or unchecks a menu item.\n\nRemark: Only use this when the menu bar has been associated with a frame; otherwise, use\nthe `m:wxMenu` equivalent call.","title":"wxMenuBar.check/3","ref":"wxMenuBar.html#check/3"},{"type":"function","doc":"Destroys the object","title":"wxMenuBar.destroy/1","ref":"wxMenuBar.html#destroy/1"},{"type":"function","doc":"Enables or disables (greys out) a menu item.\n\nRemark: Only use this when the menu bar has been associated with a frame; otherwise, use\nthe `m:wxMenu` equivalent call.","title":"wxMenuBar.enable/3","ref":"wxMenuBar.html#enable/3"},{"type":"function","doc":"Enables or disables a whole menu.\n\nRemark: Only use this when the menu bar has been associated with a frame.","title":"wxMenuBar.enableTop/3","ref":"wxMenuBar.html#enableTop/3"},{"type":"function","doc":"Finds the menu item object associated with the given menu item identifier.\n\nReturn: The found menu item object, or NULL if one was not found.","title":"wxMenuBar.findItem/2","ref":"wxMenuBar.html#findItem/2"},{"type":"function","doc":"Returns the index of the menu with the given `title` or `wxNOT\\_FOUND` if no such menu\nexists in this menubar.\n\nThe `title` parameter may specify either the menu title (with accelerator characters,\ni.e. `\"&File\"`) or just the menu label (`\"File\"`) indifferently.","title":"wxMenuBar.findMenu/2","ref":"wxMenuBar.html#findMenu/2"},{"type":"function","doc":"Finds the menu item id for a menu name/menu item string pair.\n\nReturn: The menu item identifier, or wxNOT_FOUND if none was found.\n\nRemark: Any special menu codes are stripped out of source and target strings before\nmatching.","title":"wxMenuBar.findMenuItem/3","ref":"wxMenuBar.html#findMenuItem/3"},{"type":"function","doc":"","title":"wxMenuBar.getAutoWindowMenu/0","ref":"wxMenuBar.html#getAutoWindowMenu/0"},{"type":"function","doc":"Gets the help string associated with the menu item identifier.\n\nReturn: The help string, or the empty string if there was no help string or the menu item\nwas not found.\n\nSee: `setHelpString/3`","title":"wxMenuBar.getHelpString/2","ref":"wxMenuBar.html#getHelpString/2"},{"type":"function","doc":"Gets the label associated with a menu item.\n\nReturn: The menu item label, or the empty string if the item was not found.\n\nRemark: Use only after the menubar has been associated with a frame.","title":"wxMenuBar.getLabel/2","ref":"wxMenuBar.html#getLabel/2"},{"type":"function","doc":"Equivalent to: `getMenuLabel/2`","title":"wxMenuBar.getLabelTop/2","ref":"wxMenuBar.html#getLabelTop/2"},{"type":"function","doc":"Returns the menu at `menuIndex` (zero-based).","title":"wxMenuBar.getMenu/2","ref":"wxMenuBar.html#getMenu/2"},{"type":"function","doc":"Returns the number of menus in this menubar.","title":"wxMenuBar.getMenuCount/1","ref":"wxMenuBar.html#getMenuCount/1"},{"type":"function","doc":"Returns the label of a top-level menu.\n\nNote that the returned string includes the accelerator characters that have been\nspecified in the menu title string during its construction.\n\nReturn: The menu label, or the empty string if the menu was not found.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee:\n* `getMenuLabelText/2`\n\n* `setMenuLabel/3`","title":"wxMenuBar.getMenuLabel/2","ref":"wxMenuBar.html#getMenuLabel/2"},{"type":"function","doc":"Returns the label of a top-level menu.\n\nNote that the returned string does not include any accelerator characters that may have\nbeen specified in the menu title string during its construction.\n\nReturn: The menu label, or the empty string if the menu was not found.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee:\n* `getMenuLabel/2`\n\n* `setMenuLabel/3`","title":"wxMenuBar.getMenuLabelText/2","ref":"wxMenuBar.html#getMenuLabelText/2"},{"type":"function","doc":"Inserts the menu at the given position into the menu bar.\n\nInserting menu at position 0 will insert it in the very beginning of it, inserting at\nposition `getMenuCount/1` is the same as calling `append/3`.\n\nReturn: true on success, false if an error occurred.\n\nSee: `append/3`","title":"wxMenuBar.insert/4","ref":"wxMenuBar.html#insert/4"},{"type":"function","doc":"Determines whether an item is checked.\n\nReturn: true if the item was found and is checked, false otherwise.","title":"wxMenuBar.isChecked/2","ref":"wxMenuBar.html#isChecked/2"},{"type":"function","doc":"Determines whether an item is enabled.\n\nReturn: true if the item was found and is enabled, false otherwise.","title":"wxMenuBar.isEnabled/2","ref":"wxMenuBar.html#isEnabled/2"},{"type":"function","doc":"Enables you to get the global menubar on Mac, that is, the menubar displayed when the app\nis running without any frames open.\n\nReturn: The global menubar.\n\nRemark: Only exists on Mac, other platforms do not have this method.\n\nOnly for:wxosx","title":"wxMenuBar.macGetCommonMenuBar/0","ref":"wxMenuBar.html#macGetCommonMenuBar/0"},{"type":"function","doc":"Enables you to set the global menubar on Mac, that is, the menubar displayed when the app\nis running without any frames open.\n\nRemark: Only exists on Mac, other platforms do not have this method.\n\nOnly for:wxosx","title":"wxMenuBar.macSetCommonMenuBar/1","ref":"wxMenuBar.html#macSetCommonMenuBar/1"},{"type":"function","doc":"Construct an empty menu bar.","title":"wxMenuBar.new/0","ref":"wxMenuBar.html#new/0"},{"type":"function","doc":"","title":"wxMenuBar.new/1","ref":"wxMenuBar.html#new/1"},{"type":"function","doc":"Returns the Apple menu.\n\nThis is the leftmost menu with application's name as its title. You shouldn't remove any\nitems from it, but it is safe to insert extra menu items or submenus into it.\n\nOnly for:wxosx\n\nSince: 3.0.1","title":"wxMenuBar.oSXGetAppleMenu/1","ref":"wxMenuBar.html#oSXGetAppleMenu/1"},{"type":"function","doc":"Removes the menu from the menu bar and returns the menu object - the caller is\nresponsible for deleting it.\n\nThis function may be used together with `insert/4` to change the menubar dynamically.\n\nSee: `replace/4`","title":"wxMenuBar.remove/2","ref":"wxMenuBar.html#remove/2"},{"type":"function","doc":"Replaces the menu at the given position with another one.\n\nReturn: The menu which was previously at position pos. The caller is responsible for\ndeleting it.\n\nSee:\n* `insert/4`\n\n* `remove/2`","title":"wxMenuBar.replace/4","ref":"wxMenuBar.html#replace/4"},{"type":"function","doc":"","title":"wxMenuBar.setAutoWindowMenu/1","ref":"wxMenuBar.html#setAutoWindowMenu/1"},{"type":"function","doc":"Sets the help string associated with a menu item.\n\nSee: `getHelpString/2`","title":"wxMenuBar.setHelpString/3","ref":"wxMenuBar.html#setHelpString/3"},{"type":"function","doc":"Sets the label of a menu item.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee: `getLabel/2`","title":"wxMenuBar.setLabel/3","ref":"wxMenuBar.html#setLabel/3"},{"type":"function","doc":"Equivalent to: `setMenuLabel/3`","title":"wxMenuBar.setLabelTop/3","ref":"wxMenuBar.html#setLabelTop/3"},{"type":"function","doc":"Sets the label of a top-level menu.\n\nRemark: Use only after the menubar has been associated with a frame.","title":"wxMenuBar.setMenuLabel/3","ref":"wxMenuBar.html#setMenuLabel/3"},{"type":"type","doc":"","title":"wxMenuBar.wxMenuBar/0","ref":"wxMenuBar.html#t:wxMenuBar/0"},{"type":"module","doc":"This class is used for a variety of menu-related events.\n\nNote that these do not include menu command events, which are handled using `m:wxCommandEvent`\nobjects.\n\nEvents of this class are generated by both menus that are part of a `m:wxMenuBar`,\nattached to `m:wxFrame`, and popup menus shown by `wxWindow:popupMenu/4`. They are sent to the following objects\nuntil one of them handles the event: `-# The menu object itself, as returned by GetMenu(), if any. -# The wxMenuBar to which\nthis menu is attached, if any. -# The window associated with the menu, e.g. the one\ncalling PopupMenu() for the popup menus. -# The top level parent of that window if it's\ndifferent from the window itself. `\nThis is similar to command events generated by the menu items, but, unlike them, `m:wxMenuEvent`\nare only sent to the window itself and its top level parent but not any intermediate\nwindows in the hierarchy.\n\nThe default handler for `wxEVT_MENU_HIGHLIGHT` in `m:wxFrame` displays help text in the\nstatus bar, see `wxFrame:setStatusBarPane/2`.\n\nSee:\n* `m:wxCommandEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMenuEvent](https://docs.wxwidgets.org/3.2/classwx_menu_event.html)","title":"wxMenuEvent","ref":"wxMenuEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMenuEventType` to subscribe to events of this type.","title":"Events - wxMenuEvent","ref":"wxMenuEvent.html#module-events"},{"type":"function","doc":"Returns the menu which is being opened or closed, or the menu containing the highlighted\nitem.\n\nNote that the returned value can be NULL if the menu being opened doesn't have a\ncorresponding `m:wxMenu`, e.g. this happens when opening the system menu in wxMSW port.\n\nRemark: Since 3.1.3 this function can be used with `OPEN`, `CLOSE` and `HIGHLIGHT`\nevents. Before 3.1.3, this method can only be used with the `OPEN` and `CLOSE` events.","title":"wxMenuEvent.getMenu/1","ref":"wxMenuEvent.html#getMenu/1"},{"type":"function","doc":"Returns the menu identifier associated with the event.\n\nThis method should be only used with the `HIGHLIGHT` events.","title":"wxMenuEvent.getMenuId/1","ref":"wxMenuEvent.html#getMenuId/1"},{"type":"function","doc":"Returns true if the menu which is being opened or closed is a popup menu, false if it is\na normal one.\n\nThis method should only be used with the `OPEN` and `CLOSE` events.","title":"wxMenuEvent.isPopup/1","ref":"wxMenuEvent.html#isPopup/1"},{"type":"type","doc":"","title":"wxMenuEvent.wxMenu/0","ref":"wxMenuEvent.html#t:wxMenu/0"},{"type":"type","doc":"","title":"wxMenuEvent.wxMenuEvent/0","ref":"wxMenuEvent.html#t:wxMenuEvent/0"},{"type":"type","doc":"","title":"wxMenuEvent.wxMenuEventType/0","ref":"wxMenuEvent.html#t:wxMenuEventType/0"},{"type":"module","doc":"A menu item represents an item in a menu.\n\nNote that you usually don't have to deal with it directly as `m:wxMenu` methods usually\nconstruct an object of this class for you.\n\nAlso please note that the methods related to fonts and bitmaps are currently only\nimplemented for Windows, Mac and GTK+.\n\nSee:\n* `m:wxMenuBar`\n\n* `m:wxMenu`\n\nwxWidgets docs: [wxMenuItem](https://docs.wxwidgets.org/3.2/classwx_menu_item.html)","title":"wxMenuItem","ref":"wxMenuItem.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`menu_open`](`m:wxMenuEvent`)\n\n* [`menu_close`](`m:wxMenuEvent`)\n\n* [`menu_highlight`](`m:wxMenuEvent`)","title":"Events - wxMenuItem","ref":"wxMenuItem.html#module-events"},{"type":"function","doc":"","title":"wxMenuItem.check/1","ref":"wxMenuItem.html#check/1"},{"type":"function","doc":"Checks or unchecks the menu item.\n\nNote that this only works when the item is already appended to a menu.","title":"wxMenuItem.check/2","ref":"wxMenuItem.html#check/2"},{"type":"function","doc":"Destroys the object","title":"wxMenuItem.destroy/1","ref":"wxMenuItem.html#destroy/1"},{"type":"function","doc":"","title":"wxMenuItem.enable/1","ref":"wxMenuItem.html#enable/1"},{"type":"function","doc":"Enables or disables the menu item.","title":"wxMenuItem.enable/2","ref":"wxMenuItem.html#enable/2"},{"type":"function","doc":"Returns the checked or unchecked bitmap.\n\nOnly for:wxmsw","title":"wxMenuItem.getBitmap/1","ref":"wxMenuItem.html#getBitmap/1"},{"type":"function","doc":"Returns the help string associated with the menu item.","title":"wxMenuItem.getHelp/1","ref":"wxMenuItem.html#getHelp/1"},{"type":"function","doc":"Returns the menu item identifier.","title":"wxMenuItem.getId/1","ref":"wxMenuItem.html#getId/1"},{"type":"function","doc":"Returns the text associated with the menu item including any accelerator characters that\nwere passed to the constructor or `setItemLabel/2`.\n\nSee:\n* `getItemLabelText/1`\n\n* `getLabelText/1`","title":"wxMenuItem.getItemLabel/1","ref":"wxMenuItem.html#getItemLabel/1"},{"type":"function","doc":"Returns the text associated with the menu item, without any accelerator characters.\n\nSee:\n* `getItemLabel/1`\n\n* `getLabelText/1`","title":"wxMenuItem.getItemLabelText/1","ref":"wxMenuItem.html#getItemLabelText/1"},{"type":"function","doc":"Returns the item kind, one of `wxITEM_SEPARATOR`, `wxITEM_NORMAL`, `wxITEM_CHECK` or `wxITEM_RADIO`.","title":"wxMenuItem.getKind/1","ref":"wxMenuItem.html#getKind/1"},{"type":"function","doc":"Equivalent to: `getItemLabelText/1`","title":"wxMenuItem.getLabel/1","ref":"wxMenuItem.html#getLabel/1"},{"type":"function","doc":"Equivalent to: `getLabelText/1`","title":"wxMenuItem.getLabelFromText/1","ref":"wxMenuItem.html#getLabelFromText/1"},{"type":"function","doc":"Strips all accelerator characters and mnemonics from the given `text`.\n\nFor example:\n\nwill return just `\"Hello\"`.\n\nSee:\n* `getItemLabelText/1`\n\n* `getItemLabel/1`","title":"wxMenuItem.getLabelText/1","ref":"wxMenuItem.html#getLabelText/1"},{"type":"function","doc":"Returns the menu this menu item is in, or NULL if this menu item is not attached.","title":"wxMenuItem.getMenu/1","ref":"wxMenuItem.html#getMenu/1"},{"type":"function","doc":"Returns the submenu associated with the menu item, or NULL if there isn't one.","title":"wxMenuItem.getSubMenu/1","ref":"wxMenuItem.html#getSubMenu/1"},{"type":"function","doc":"Equivalent to: `getItemLabel/1`","title":"wxMenuItem.getText/1","ref":"wxMenuItem.html#getText/1"},{"type":"function","doc":"Returns true if the item is checkable.\n\nNotice that the radio buttons are considered to be checkable as well, so this method\nreturns true for them too. Use `IsCheck()` (not implemented in wx) if you want to test for\nthe check items only.","title":"wxMenuItem.isCheckable/1","ref":"wxMenuItem.html#isCheckable/1"},{"type":"function","doc":"Returns true if the item is checked.","title":"wxMenuItem.isChecked/1","ref":"wxMenuItem.html#isChecked/1"},{"type":"function","doc":"Returns true if the item is enabled.","title":"wxMenuItem.isEnabled/1","ref":"wxMenuItem.html#isEnabled/1"},{"type":"function","doc":"Returns true if the item is a separator.","title":"wxMenuItem.isSeparator/1","ref":"wxMenuItem.html#isSeparator/1"},{"type":"function","doc":"Returns true if the item is a submenu.","title":"wxMenuItem.isSubMenu/1","ref":"wxMenuItem.html#isSubMenu/1"},{"type":"function","doc":"","title":"wxMenuItem.new/0","ref":"wxMenuItem.html#new/0"},{"type":"function","doc":"Constructs a `m:wxMenuItem` object.\n\nMenu items can be standard, or \"stock menu items\", or custom. For the standard menu items\n(such as commands to open a file, exit the program and so on, see page_stockitems for the\nfull list) it is enough to specify just the stock ID and leave `text` and `help` string\nempty. Some platforms (currently wxGTK only, and see the remark in `setBitmap/2` documentation) will\nalso show standard bitmaps for stock menu items.\n\nLeaving at least `text` empty for the stock menu items is actually strongly recommended\nas they will have appearance and keyboard interface (including standard accelerators)\nfamiliar to the user.\n\nFor the custom (non-stock) menu items, `text` must be specified and while `help` string\nmay be left empty, it's recommended to pass the item description (which is automatically\nshown by the library in the status bar when the menu item is selected) in this parameter.\n\nFinally note that you can e.g. use a stock menu label without using its stock help string:\n\nthat is, stock properties are set independently one from the other.","title":"wxMenuItem.new/1","ref":"wxMenuItem.html#new/1"},{"type":"function","doc":"Sets the bitmap for the menu item.\n\nIt is equivalent to wxMenuItem::SetBitmaps(bmp, wxNullBitmap) if `checked` is true\n(default value) or SetBitmaps(wxNullBitmap, bmp) otherwise.\n\n`setBitmap/2` must be called before the item is appended to the menu, i.e. appending the item without\na bitmap and setting one later is not guaranteed to work. But the bitmap can be changed or\nreset later if it had been set up initially.\n\nNotice that GTK+ uses a global setting called `gtk-menu-images` to determine if the\nimages should be shown in the menus at all. If it is off (which is the case in e.g. Gnome\n2.28 by default), no images will be shown, consistently with the native behaviour.\n\nOnly for:wxmsw,wxosx,wxgtk","title":"wxMenuItem.setBitmap/2","ref":"wxMenuItem.html#setBitmap/2"},{"type":"function","doc":"Sets the help string.","title":"wxMenuItem.setHelp/2","ref":"wxMenuItem.html#setHelp/2"},{"type":"function","doc":"Sets the label associated with the menu item.\n\nNote that if the ID of this menu item corresponds to a stock ID, then it is not necessary\nto specify a label: wxWidgets will automatically use the stock item label associated with\nthat ID. See the `new/1` for more info.\n\nThe label string for the normal menu items (not separators) may include the accelerator\nwhich can be used to activate the menu item from keyboard. An accelerator key can be\nspecified using the ampersand `&` character. In order to embed an ampersand character in\nthe menu item text, the ampersand must be doubled.\n\nOptionally you can specify also an accelerator string appending a tab character `\\t`\nfollowed by a valid key combination (e.g. `CTRL+V`). Its general syntax is any combination\nof `\"CTRL\"`, `\"RAWCTRL\"`, `\"ALT\"` and `\"SHIFT\"` strings (case doesn't matter) separated by\neither `'-'` or `'+'` characters and followed by the accelerator itself. Notice that `CTRL`\ncorresponds to the \"Ctrl\" key on most platforms but not under macOS where it is mapped to\n\"Cmd\" key on Mac keyboard. Usually this is exactly what you want in portable code but if\nyou really need to use the (rarely used for this purpose) \"Ctrl\" key even under Mac, you\nmay use `RAWCTRL` to prevent this mapping. Under the other platforms `RAWCTRL` is the same\nas plain `CTRL`.\n\nThe accelerator may be any alphanumeric character, any function key (from `F1` to `F12`),\nany numpad digit key using `KP_` prefix (i.e. from `KP_0` to `KP_9`) or one of the special\nstrings listed below (again, case doesn't matter) corresponding to the specified key code:\n\n* `Del` or `Delete:` WXK_DELETE\n\n* `Back:` WXK_BACK\n\n* `Ins` or `Insert:` WXK_INSERT\n\n* `Enter` or `Return:` WXK_RETURN\n\n* `PgUp` or `PageUp:` WXK_PAGEUP\n\n* `PgDn` or `PageDown:` WXK_PAGEDOWN\n\n* `Left:` WXK_LEFT\n\n* `Right:` WXK_RIGHT\n\n* `Up:` WXK_UP\n\n* `Down:` WXK_DOWN\n\n* `Home:` WXK_HOME\n\n* `End:` WXK_END\n\n* `Space:` WXK_SPACE\n\n* `Tab:` WXK_TAB\n\n* `Esc` or `Escape:` WXK_ESCAPE\n\n* `Cancel:` WXK_CANCEL\n\n* `Clear:` WXK_CLEAR\n\n* `Menu:` WXK_MENU\n\n* `Pause:` WXK_PAUSE\n\n* `Capital:` WXK_CAPITAL\n\n* `Select:` WXK_SELECT\n\n* `Print:` WXK_PRINT\n\n* `Execute:` WXK_EXECUTE\n\n* `Snapshot:` WXK_SNAPSHOT\n\n* `Help:` WXK_HELP\n\n* `Add:` WXK_ADD\n\n* `Separator:` WXK_SEPARATOR\n\n* `Subtract:` WXK_SUBTRACT\n\n* `Decimal:` WXK_DECIMAL\n\n* `Divide:` WXK_DIVIDE\n\n* `Num_lock:` WXK_NUMLOCK\n\n* `Scroll_lock:` WXK_SCROLL\n\n* `KP_Space:` WXK_NUMPAD_SPACE\n\n* `KP_Tab:` WXK_NUMPAD_TAB\n\n* `KP_Enter:` WXK_NUMPAD_ENTER\n\n* `KP_Home:` WXK_NUMPAD_HOME\n\n* `KP_Left:` WXK_NUMPAD_LEFT\n\n* `KP_Up:` WXK_NUMPAD_UP\n\n* `KP_Right:` WXK_NUMPAD_RIGHT\n\n* `KP_Down:` WXK_NUMPAD_DOWN\n\n* `KP_PageUp:` WXK_NUMPAD_PAGEUP\n\n* `KP_PageDown:` WXK_NUMPAD_PAGEDOWN\n\n* `KP_Prior:` WXK_NUMPAD_PAGEUP\n\n* `KP_Next:` WXK_NUMPAD_PAGEDOWN\n\n* `KP_End:` WXK_NUMPAD_END\n\n* `KP_Begin:` WXK_NUMPAD_BEGIN\n\n* `KP_Insert:` WXK_NUMPAD_INSERT\n\n* `KP_Delete:` WXK_NUMPAD_DELETE\n\n* `KP_Equal:` WXK_NUMPAD_EQUAL\n\n* `KP_Multiply:` WXK_NUMPAD_MULTIPLY\n\n* `KP_Add:` WXK_NUMPAD_ADD\n\n* `KP_Separator:` WXK_NUMPAD_SEPARATOR\n\n* `KP_Subtract:` WXK_NUMPAD_SUBTRACT\n\n* `KP_Decimal:` WXK_NUMPAD_DECIMAL\n\n* `KP_Divide:` WXK_NUMPAD_DIVIDE\n\n* `Windows_Left:` WXK_WINDOWS_LEFT\n\n* `Windows_Right:` WXK_WINDOWS_RIGHT\n\n* `Windows_Menu:` WXK_WINDOWS_MENU\n\n* `Command:` WXK_COMMAND\n\nExamples:\n\nNote: In wxGTK using `\"SHIFT\"` with non-alphabetic characters currently doesn't work,\neven in combination with other modifiers, due to GTK+ limitation. E.g. `Shift+Ctrl+A`\nworks but `Shift+Ctrl+1` or `Shift+/` do not, so avoid using accelerators of this form in\nportable code.\n\nNote: In wxGTk, the left/right/up/down arrow keys do not work as accelerator keys for a\nmenu item unless a modifier key is used. Additionally, the following keycodes are not\nsupported as menu accelerator keys:\n\n* WXK_COMMAND/WXK_CONTROL\n\n* WXK_SHIFT\n\n* WXK_ALT\n\n* WXK_SCROLL\n\n* WXK_CAPITAL\n\n* WXK_NUMLOCK\n\n* WXK_NUMPAD_TAB\n\n* WXK_TAB\n\n* WXK_WINDOWS_LEFT\n\n* WXK_WINDOWS_RIGHT\n\n* WXK_ADD\n\n* WXK_SEPARATOR\n\n* WXK_SUBTRACT\n\n* WXK_DECIMAL\n\n* WXK_DIVIDE\n\n* WXK_SNAPSHOT\n\nSee:\n* `getItemLabel/1`\n\n* `getItemLabelText/1`","title":"wxMenuItem.setItemLabel/2","ref":"wxMenuItem.html#setItemLabel/2"},{"type":"function","doc":"Sets the parent menu which will contain this menu item.","title":"wxMenuItem.setMenu/2","ref":"wxMenuItem.html#setMenu/2"},{"type":"function","doc":"Sets the submenu of this menu item.","title":"wxMenuItem.setSubMenu/2","ref":"wxMenuItem.html#setSubMenu/2"},{"type":"function","doc":"Equivalent to: `setItemLabel/2`","title":"wxMenuItem.setText/2","ref":"wxMenuItem.html#setText/2"},{"type":"type","doc":"","title":"wxMenuItem.wxMenuItem/0","ref":"wxMenuItem.html#t:wxMenuItem/0"},{"type":"module","doc":"This class represents a dialog that shows a single or multi-line message, with a choice\nof OK, Yes, No and Cancel buttons.","title":"wxMessageDialog","ref":"wxMessageDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxOK: Puts an Ok button in the message box. May be combined with `wxCANCEL`.\n\n* wxCANCEL: Puts a Cancel button in the message box. Must be combined with either `wxOK` or `wxYES_NO`.\n\n* wxYES_NO: Puts Yes and No buttons in the message box. It is recommended to always use `wxCANCEL`\nwith this style as otherwise the message box won't have a close button under wxMSW and\nthe user will be forced to answer it.\n\n* wxHELP: Puts a Help button to the message box. This button can have special appearance or\nbe specially positioned if its label is not changed from the default one. Notice that\nusing this button is not supported when showing a message box from non-main thread in\nwxOSX/Cocoa. Available since wxWidgets 2.9.3.\n\n* wxNO_DEFAULT: Makes the \"No\" button default, can only be used with `wxYES_NO`.\n\n* wxCANCEL_DEFAULT: Makes the \"Cancel\" button default, can only be used with `wxCANCEL`.\nThis style is currently not supported (and ignored) in wxOSX.\n\n* wxYES_DEFAULT: Makes the \"Yes\" button default, this is the default behaviour and this\nflag exists solely for symmetry with `wxNO_DEFAULT`.\n\n* wxOK_DEFAULT: Makes the \"OK\" button default, this is the default behaviour and this flag\nexists solely for symmetry with `wxCANCEL_DEFAULT`.\n\n* wxICON_NONE: Displays no icon in the dialog if possible (an icon might still be displayed\nif the current platform mandates its use). This style may be used to prevent the dialog\nfrom using the default icon based on `wxYES_NO` presence as explained in `wxICON_QUESTION`\nand `wxICON_INFORMATION` documentation below.\n\n* wxICON_ERROR: Displays an error icon in the dialog.\n\n* wxICON_WARNING: Displays a warning icon in the dialog. This style should be used for\ninformative warnings or, in combination with `wxYES_NO` or `wxCANCEL`, for questions that\nhave potentially serious consequences (caution icon is used on macOS in this case).\n\n* wxICON_QUESTION: Displays a question mark symbol. This icon is automatically used with `wxYES_NO`\nso it's usually unnecessary to specify it explicitly. This style is not supported for\nmessage dialogs under wxMSW when a task dialog is used to implement them (i.e. when\nrunning under Windows Vista or later) because [Microsoft guidelines](https://docs.microsoft.com/en-us/windows/desktop/uxguide/mess-confirm)\nindicate that no icon should be used for routine confirmations. If it is specified, no\nicon will be displayed.\n\n* wxICON_INFORMATION: Displays an information symbol. This icon is used by default if `wxYES_NO`\nis not given so it is usually unnecessary to specify it explicitly.\n\n* wxICON_EXCLAMATION: Alias for `wxICON_WARNING`.\n\n* wxICON_HAND: Alias for `wxICON_ERROR`.\n\n* wxICON_AUTH_NEEDED: Displays an authentication needed symbol. This style is only\nsupported for message dialogs under wxMSW when a task dialog is used to implement them\n(i.e. when running under Windows Vista or later). In other cases the default icon\nselection logic will be used. Note this can be combined with other styles to provide a\nfallback. For instance, using wxICON_AUTH_NEEDED | wxICON_QUESTION will show a shield\nsymbol on Windows Vista or above and a question symbol on other platforms. Available since\nwxWidgets 2.9.5\n\n* wxSTAY_ON_TOP: Makes the message box stay on top of all other windows and not only just\nits parent (currently implemented only under MSW and GTK).\n\n* wxCENTRE: Centre the message box on its parent or on the screen if parent is not\nspecified. Setting this style under MSW makes no differences as the dialog is always\ncentered on the parent.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_msg)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMessageDialog](https://docs.wxwidgets.org/3.2/classwx_message_dialog.html)","title":"Styles - wxMessageDialog","ref":"wxMessageDialog.html#module-styles"},{"type":"function","doc":"Destroys the object","title":"wxMessageDialog.destroy/1","ref":"wxMessageDialog.html#destroy/1"},{"type":"function","doc":"","title":"wxMessageDialog.new/2","ref":"wxMessageDialog.html#new/2"},{"type":"function","doc":"Constructor specifying the message box properties.\n\nUse `wxDialog:showModal/1` to show the dialog.\n\n`style` may be a bit list of the identifiers described above.\n\nNotice that not all styles are compatible: only one of `wxOK` and `wxYES_NO` may be\nspecified (and one of them must be specified) and at most one default button style can be\nused and it is only valid if the corresponding button is shown in the message box.","title":"wxMessageDialog.new/3","ref":"wxMessageDialog.html#new/3"},{"type":"type","doc":"","title":"wxMessageDialog.wxMessageDialog/0","ref":"wxMessageDialog.html#t:wxMessageDialog/0"},{"type":"module","doc":"A miniframe is a frame with a small title bar.\n\nIt is suitable for floating toolbars that must not take up too much screen area.\n\nAn example of mini frame can be seen in the page_samples_dialogs using the \"Mini frame\"\ncommand of the \"Generic dialogs\" submenu.","title":"wxMiniFrame","ref":"wxMiniFrame.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxICONIZE: Display the frame iconized (minimized) (Windows only).\n\n* wxCAPTION: Puts a caption on the frame.\n\n* wxMINIMIZE: Identical to wxICONIZE.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the frame (Windows and Motif only).\n\n* wxMAXIMIZE: Displays the frame maximized (Windows only).\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the frame (Windows and Motif only).\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxSTAY_ON_TOP: Stay on top of other windows (Windows only).\n\n* wxSYSTEM_MENU: Displays a system menu (Windows and Motif only).\n\n* wxRESIZE_BORDER: Displays a resizable border around the window.\n\nRemark: This class has miniframe functionality under Windows and GTK, i.e. the presence\nof mini frame will not be noted in the task bar and focus behaviour is different. On other\nplatforms, it behaves like a normal frame.\n\nSee:\n* `m:wxMDIParentFrame`\n\n* `m:wxMDIChildFrame`\n\n* `m:wxFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMiniFrame](https://docs.wxwidgets.org/3.2/classwx_mini_frame.html)","title":"Styles - wxMiniFrame","ref":"wxMiniFrame.html#module-styles"},{"type":"function","doc":"","title":"wxMiniFrame.create/4","ref":"wxMiniFrame.html#create/4"},{"type":"function","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","title":"wxMiniFrame.create/5","ref":"wxMiniFrame.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxMiniFrame.destroy/1","ref":"wxMiniFrame.html#destroy/1"},{"type":"function","doc":"Default ctor.","title":"wxMiniFrame.new/0","ref":"wxMiniFrame.html#new/0"},{"type":"function","doc":"","title":"wxMiniFrame.new/3","ref":"wxMiniFrame.html#new/3"},{"type":"function","doc":"Constructor, creating the window.\n\nRemark: The frame behaves like a normal frame on non-Windows platforms.\n\nSee: `create/5`","title":"wxMiniFrame.new/4","ref":"wxMiniFrame.html#new/4"},{"type":"type","doc":"","title":"wxMiniFrame.wxMiniFrame/0","ref":"wxMiniFrame.html#t:wxMiniFrame/0"},{"type":"module","doc":"`m:wxMirrorDC` is a simple wrapper class which is always associated with a real `m:wxDC`\nobject and either forwards all of its operations to it without changes (no mirroring takes\nplace) or exchanges `x` and `y` coordinates which makes it possible to reuse the same code\nto draw a figure and its mirror -- i.e.\n\nreflection related to the diagonal line x == y.\n\nSince: 2.5.0\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxMirrorDC](https://docs.wxwidgets.org/3.2/classwx_mirror_d_c.html)","title":"wxMirrorDC","ref":"wxMirrorDC.html"},{"type":"function","doc":"Destroys the object","title":"wxMirrorDC.destroy/1","ref":"wxMirrorDC.html#destroy/1"},{"type":"function","doc":"Creates a (maybe) mirrored DC associated with the real `dc`.\n\nEverything drawn on `m:wxMirrorDC` will appear (and maybe mirrored) on `dc`.\n\n`mirror` specifies if we do mirror (if it is true) or not (if it is false).","title":"wxMirrorDC.new/2","ref":"wxMirrorDC.html#new/2"},{"type":"type","doc":"","title":"wxMirrorDC.wxMirrorDC/0","ref":"wxMirrorDC.html#t:wxMirrorDC/0"},{"type":"module","doc":"An mouse capture changed event is sent to a window that loses its mouse capture.\n\nThis is called even if `wxWindow:releaseMouse/1` was called by the application code. Handling this event allows an\napplication to cater for unexpected capture releases which might otherwise confuse mouse\nhandling code.\n\nOnly for:wxmsw\n\nSee:\n* `m:wxMouseCaptureLostEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:captureMouse/1`\n\n* `wxWindow:releaseMouse/1`\n\n* `wxWindow:getCapture/0`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseCaptureChangedEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_capture_changed_event.html)","title":"wxMouseCaptureChangedEvent","ref":"wxMouseCaptureChangedEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMouseCaptureChangedEventType` to subscribe to events of this type.","title":"Events - wxMouseCaptureChangedEvent","ref":"wxMouseCaptureChangedEvent.html#module-events"},{"type":"function","doc":"Returns the window that gained the capture, or NULL if it was a non-wxWidgets window.","title":"wxMouseCaptureChangedEvent.getCapturedWindow/1","ref":"wxMouseCaptureChangedEvent.html#getCapturedWindow/1"},{"type":"type","doc":"","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChanged/0","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChanged/0"},{"type":"type","doc":"","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChangedEvent/0","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChangedEvent/0"},{"type":"type","doc":"","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChangedEventType/0","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChangedEventType/0"},{"type":"module","doc":"A mouse capture lost event is sent to a window that had obtained mouse capture, which was\nsubsequently lost due to an \"external\" event (for example, when a dialog box is shown or\nif another application captures the mouse).\n\nIf this happens, this event is sent to all windows that are on the capture stack (i.e.\ncalled CaptureMouse, but didn't call ReleaseMouse yet). The event is not sent if the\ncapture changes because of a call to CaptureMouse or ReleaseMouse.\n\nThis event is currently emitted under Windows only.\n\nSee:\n* `m:wxMouseCaptureChangedEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:captureMouse/1`\n\n* `wxWindow:releaseMouse/1`\n\n* `wxWindow:getCapture/0`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseCaptureLostEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_capture_lost_event.html)","title":"wxMouseCaptureLostEvent","ref":"wxMouseCaptureLostEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMouseCaptureLostEventType` to subscribe to events of this type.","title":"Events - wxMouseCaptureLostEvent","ref":"wxMouseCaptureLostEvent.html#module-events"},{"type":"type","doc":"","title":"wxMouseCaptureLostEvent.wxMouseCaptureLost/0","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLost/0"},{"type":"type","doc":"","title":"wxMouseCaptureLostEvent.wxMouseCaptureLostEvent/0","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLostEvent/0"},{"type":"type","doc":"","title":"wxMouseCaptureLostEvent.wxMouseCaptureLostEventType/0","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLostEventType/0"},{"type":"module","doc":"This event class contains information about the events generated by the mouse: they\ninclude mouse buttons press and release events and mouse move events.\n\nAll mouse events involving the buttons use `wxMOUSE_BTN_LEFT` for the left mouse button, `wxMOUSE_BTN_MIDDLE`\nfor the middle one and `wxMOUSE_BTN_RIGHT` for the right one. And if the system supports\nmore buttons, the `wxMOUSE_BTN_AUX1` and `wxMOUSE_BTN_AUX2` events can also be generated.\nNote that not all mice have even a middle button so a portable application should avoid\nrelying on the events from it (but the right button click can be emulated using the left\nmouse button with the control key under Mac platforms with a single button mouse).\n\nFor the `wxEVT_ENTER_WINDOW` and `wxEVT_LEAVE_WINDOW` events purposes, the mouse is\nconsidered to be inside the window if it is in the window client area and not inside one\nof its children. In other words, the parent window receives `wxEVT_LEAVE_WINDOW` event not\nonly when the mouse leaves the window entirely but also when it enters one of its children.\n\nThe position associated with a mouse event is expressed in the window coordinates of the\nwindow which generated the event, you can use `wxWindow:clientToScreen/3` to convert it to screen coordinates and\npossibly call `wxWindow:screenToClient/2` next to convert it to window coordinates of another window.\n\nNote: Note the difference between methods like `leftDown/1` and the inherited `leftIsDown/1`: the former returns\ntrue when the event corresponds to the left mouse button click while the latter returns\ntrue if the left mouse button is currently being pressed. For example, when the user is\ndragging the mouse you can use `leftIsDown/1` to test whether the left mouse button is (still)\ndepressed. Also, by convention, if `leftDown/1` returns true, `leftIsDown/1` will also return true in wxWidgets\nwhatever the underlying GUI behaviour is (which is platform-dependent). The same applies,\nof course, to other mouse buttons as well.\n\nSee: `m:wxKeyEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_event.html)","title":"wxMouseEvent","ref":"wxMouseEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMouseEventType` to subscribe to events of this type.","title":"Events - wxMouseEvent","ref":"wxMouseEvent.html#module-events"},{"type":"function","doc":"Returns true if the Alt key is pressed.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","title":"wxMouseEvent.altDown/1","ref":"wxMouseEvent.html#altDown/1"},{"type":"function","doc":"Returns true if the event was a first extra button double click.","title":"wxMouseEvent.aux1DClick/1","ref":"wxMouseEvent.html#aux1DClick/1"},{"type":"function","doc":"Returns true if the first extra button mouse button changed to down.","title":"wxMouseEvent.aux1Down/1","ref":"wxMouseEvent.html#aux1Down/1"},{"type":"function","doc":"Returns true if the first extra button mouse button changed to up.","title":"wxMouseEvent.aux1Up/1","ref":"wxMouseEvent.html#aux1Up/1"},{"type":"function","doc":"Returns true if the event was a second extra button double click.","title":"wxMouseEvent.aux2DClick/1","ref":"wxMouseEvent.html#aux2DClick/1"},{"type":"function","doc":"Returns true if the second extra button mouse button changed to down.","title":"wxMouseEvent.aux2Down/1","ref":"wxMouseEvent.html#aux2Down/1"},{"type":"function","doc":"Returns true if the second extra button mouse button changed to up.","title":"wxMouseEvent.aux2Up/1","ref":"wxMouseEvent.html#aux2Up/1"},{"type":"function","doc":"Returns true if the event was generated by the specified button.","title":"wxMouseEvent.button/2","ref":"wxMouseEvent.html#button/2"},{"type":"function","doc":"","title":"wxMouseEvent.buttonDClick/1","ref":"wxMouseEvent.html#buttonDClick/1"},{"type":"function","doc":"If the argument is omitted, this returns true if the event was a mouse double click\nevent.\n\nOtherwise the argument specifies which double click event was generated (see `button/2` for the\npossible values).","title":"wxMouseEvent.buttonDClick/2","ref":"wxMouseEvent.html#buttonDClick/2"},{"type":"function","doc":"","title":"wxMouseEvent.buttonDown/1","ref":"wxMouseEvent.html#buttonDown/1"},{"type":"function","doc":"If the argument is omitted, this returns true if the event was a mouse button down event.\n\nOtherwise the argument specifies which button-down event was generated (see `button/2` for the\npossible values).","title":"wxMouseEvent.buttonDown/2","ref":"wxMouseEvent.html#buttonDown/2"},{"type":"function","doc":"","title":"wxMouseEvent.buttonUp/1","ref":"wxMouseEvent.html#buttonUp/1"},{"type":"function","doc":"If the argument is omitted, this returns true if the event was a mouse button up event.\n\nOtherwise the argument specifies which button-up event was generated (see `button/2` for the\npossible values).","title":"wxMouseEvent.buttonUp/2","ref":"wxMouseEvent.html#buttonUp/2"},{"type":"function","doc":"Returns true if the key used for command accelerators is pressed.\n\nSame as `controlDown/1`. Deprecated.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","title":"wxMouseEvent.cmdDown/1","ref":"wxMouseEvent.html#cmdDown/1"},{"type":"function","doc":"Returns true if the Control key or Apple/Command key under macOS is pressed.\n\nThis function doesn't distinguish between right and left control keys.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","title":"wxMouseEvent.controlDown/1","ref":"wxMouseEvent.html#controlDown/1"},{"type":"function","doc":"Returns true if this was a dragging event (motion while a button is depressed).\n\nSee: `moving/1`","title":"wxMouseEvent.dragging/1","ref":"wxMouseEvent.html#dragging/1"},{"type":"function","doc":"Returns true if the mouse was entering the window.\n\nSee: `leaving/1`","title":"wxMouseEvent.entering/1","ref":"wxMouseEvent.html#entering/1"},{"type":"function","doc":"Returns the mouse button which generated this event or `wxMOUSE\\_BTN\\_NONE` if no button\nis involved (for mouse move, enter or leave event, for example).\n\nOtherwise `wxMOUSE_BTN_LEFT` is returned for the left button down, up and double click\nevents, `wxMOUSE_BTN_MIDDLE` and `wxMOUSE_BTN_RIGHT` for the same events for the middle\nand the right buttons respectively.","title":"wxMouseEvent.getButton/1","ref":"wxMouseEvent.html#getButton/1"},{"type":"function","doc":"Returns the configured number of lines (or whatever) to be scrolled per wheel action.\n\nDefault value under most platforms is three.","title":"wxMouseEvent.getLinesPerAction/1","ref":"wxMouseEvent.html#getLinesPerAction/1"},{"type":"function","doc":"Returns the logical mouse position in pixels (i.e. translated according to the\ntranslation set for the DC, which usually indicates that the window has been scrolled).","title":"wxMouseEvent.getLogicalPosition/2","ref":"wxMouseEvent.html#getLogicalPosition/2"},{"type":"function","doc":"Returns the physical mouse position.","title":"wxMouseEvent.getPosition/1","ref":"wxMouseEvent.html#getPosition/1"},{"type":"function","doc":"Gets the axis the wheel operation concerns.\n\nUsually the mouse wheel is used to scroll vertically so `wxMOUSE_WHEEL_VERTICAL` is\nreturned but some mice (and most trackpads) also allow to use the wheel to scroll\nhorizontally in which case `wxMOUSE_WHEEL_HORIZONTAL` is returned.\n\nNotice that before wxWidgets 2.9.4 this method returned `int`.","title":"wxMouseEvent.getWheelAxis/1","ref":"wxMouseEvent.html#getWheelAxis/1"},{"type":"function","doc":"Get wheel delta, normally 120.\n\nThis is the threshold for action to be taken, and one such action (for example, scrolling\none increment) should occur for each delta.","title":"wxMouseEvent.getWheelDelta/1","ref":"wxMouseEvent.html#getWheelDelta/1"},{"type":"function","doc":"Get wheel rotation, positive or negative indicates direction of rotation.\n\nCurrent devices all send an event when rotation is at least +/-WheelDelta, but finer\nresolution devices can be created in the future.\n\nBecause of this you shouldn't assume that one event is equal to 1 line, but you should be\nable to either do partial line scrolling or wait until several events accumulate before\nscrolling.","title":"wxMouseEvent.getWheelRotation/1","ref":"wxMouseEvent.html#getWheelRotation/1"},{"type":"function","doc":"Returns X coordinate of the physical mouse event position.","title":"wxMouseEvent.getX/1","ref":"wxMouseEvent.html#getX/1"},{"type":"function","doc":"Returns Y coordinate of the physical mouse event position.","title":"wxMouseEvent.getY/1","ref":"wxMouseEvent.html#getY/1"},{"type":"function","doc":"Returns true if the event was a mouse button event (not necessarily a button down event -\nthat may be tested using `buttonDown/2`).","title":"wxMouseEvent.isButton/1","ref":"wxMouseEvent.html#isButton/1"},{"type":"function","doc":"Returns true if the system has been setup to do page scrolling with the mouse wheel\ninstead of line scrolling.","title":"wxMouseEvent.isPageScroll/1","ref":"wxMouseEvent.html#isPageScroll/1"},{"type":"function","doc":"Returns true if the mouse was leaving the window.\n\nSee: `entering/1`","title":"wxMouseEvent.leaving/1","ref":"wxMouseEvent.html#leaving/1"},{"type":"function","doc":"Returns true if the event was a left double click.","title":"wxMouseEvent.leftDClick/1","ref":"wxMouseEvent.html#leftDClick/1"},{"type":"function","doc":"Returns true if the left mouse button changed to down.","title":"wxMouseEvent.leftDown/1","ref":"wxMouseEvent.html#leftDown/1"},{"type":"function","doc":"Returns true if the left mouse button is currently down.","title":"wxMouseEvent.leftIsDown/1","ref":"wxMouseEvent.html#leftIsDown/1"},{"type":"function","doc":"Returns true if the left mouse button changed to up.","title":"wxMouseEvent.leftUp/1","ref":"wxMouseEvent.html#leftUp/1"},{"type":"function","doc":"Returns true if the Meta key was down at the time of the event.","title":"wxMouseEvent.metaDown/1","ref":"wxMouseEvent.html#metaDown/1"},{"type":"function","doc":"Returns true if the event was a middle double click.","title":"wxMouseEvent.middleDClick/1","ref":"wxMouseEvent.html#middleDClick/1"},{"type":"function","doc":"Returns true if the middle mouse button changed to down.","title":"wxMouseEvent.middleDown/1","ref":"wxMouseEvent.html#middleDown/1"},{"type":"function","doc":"Returns true if the middle mouse button is currently down.","title":"wxMouseEvent.middleIsDown/1","ref":"wxMouseEvent.html#middleIsDown/1"},{"type":"function","doc":"Returns true if the middle mouse button changed to up.","title":"wxMouseEvent.middleUp/1","ref":"wxMouseEvent.html#middleUp/1"},{"type":"function","doc":"Returns true if this was a motion event and no mouse buttons were pressed.\n\nIf any mouse button is held pressed, then this method returns false and `dragging/1` returns true.","title":"wxMouseEvent.moving/1","ref":"wxMouseEvent.html#moving/1"},{"type":"function","doc":"Returns true if the event was a right double click.","title":"wxMouseEvent.rightDClick/1","ref":"wxMouseEvent.html#rightDClick/1"},{"type":"function","doc":"Returns true if the right mouse button changed to down.","title":"wxMouseEvent.rightDown/1","ref":"wxMouseEvent.html#rightDown/1"},{"type":"function","doc":"Returns true if the right mouse button is currently down.","title":"wxMouseEvent.rightIsDown/1","ref":"wxMouseEvent.html#rightIsDown/1"},{"type":"function","doc":"Returns true if the right mouse button changed to up.","title":"wxMouseEvent.rightUp/1","ref":"wxMouseEvent.html#rightUp/1"},{"type":"function","doc":"Returns true if the Shift key is pressed.\n\nThis function doesn't distinguish between right and left shift keys.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","title":"wxMouseEvent.shiftDown/1","ref":"wxMouseEvent.html#shiftDown/1"},{"type":"type","doc":"","title":"wxMouseEvent.wxMouse/0","ref":"wxMouseEvent.html#t:wxMouse/0"},{"type":"type","doc":"","title":"wxMouseEvent.wxMouseEvent/0","ref":"wxMouseEvent.html#t:wxMouseEvent/0"},{"type":"type","doc":"","title":"wxMouseEvent.wxMouseEventType/0","ref":"wxMouseEvent.html#t:wxMouseEventType/0"},{"type":"module","doc":"A move event holds information about window position change.\n\nThese events are currently generated for top level (see `m:wxTopLevelWindow`) windows in\nall ports, but are not generated for the child windows in wxGTK.\n\nSee:\n* {X,Y}\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMoveEvent](https://docs.wxwidgets.org/3.2/classwx_move_event.html)","title":"wxMoveEvent","ref":"wxMoveEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxMoveEventType` to subscribe to events of this type.","title":"Events - wxMoveEvent","ref":"wxMoveEvent.html#module-events"},{"type":"function","doc":"Returns the position of the window generating the move change event.","title":"wxMoveEvent.getPosition/1","ref":"wxMoveEvent.html#getPosition/1"},{"type":"function","doc":"","title":"wxMoveEvent.getRect/1","ref":"wxMoveEvent.html#getRect/1"},{"type":"type","doc":"","title":"wxMoveEvent.wxMove/0","ref":"wxMoveEvent.html#t:wxMove/0"},{"type":"type","doc":"","title":"wxMoveEvent.wxMoveEvent/0","ref":"wxMoveEvent.html#t:wxMoveEvent/0"},{"type":"type","doc":"","title":"wxMoveEvent.wxMoveEventType/0","ref":"wxMoveEvent.html#t:wxMoveEventType/0"},{"type":"module","doc":"This class represents a dialog that shows a list of strings, and allows the user to\nselect one or more.","title":"wxMultiChoiceDialog","ref":"wxMultiChoiceDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxOK: Show an OK button.\n\n* wxCANCEL: Show a Cancel button.\n\n* wxCENTRE: Centre the message.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_multichoice)\n\n* `m:wxSingleChoiceDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMultiChoiceDialog](https://docs.wxwidgets.org/3.2/classwx_multi_choice_dialog.html)","title":"Styles - wxMultiChoiceDialog","ref":"wxMultiChoiceDialog.html#module-styles"},{"type":"function","doc":"Destroys the object","title":"wxMultiChoiceDialog.destroy/1","ref":"wxMultiChoiceDialog.html#destroy/1"},{"type":"function","doc":"Returns array with indexes of selected items.","title":"wxMultiChoiceDialog.getSelections/1","ref":"wxMultiChoiceDialog.html#getSelections/1"},{"type":"function","doc":"","title":"wxMultiChoiceDialog.new/4","ref":"wxMultiChoiceDialog.html#new/4"},{"type":"function","doc":"Constructor taking an array of `wxString` (not implemented in wx) choices.\n\nRemark: Use `wxDialog:showModal/1` to show the dialog.","title":"wxMultiChoiceDialog.new/5","ref":"wxMultiChoiceDialog.html#new/5"},{"type":"function","doc":"Sets selected items from the array of selected items' indexes.","title":"wxMultiChoiceDialog.setSelections/2","ref":"wxMultiChoiceDialog.html#setSelections/2"},{"type":"type","doc":"","title":"wxMultiChoiceDialog.wxMultiChoiceDialog/0","ref":"wxMultiChoiceDialog.html#t:wxMultiChoiceDialog/0"},{"type":"module","doc":"This event class contains information about navigation events, generated by navigation\nkeys such as tab and page down.\n\nThis event is mainly used by wxWidgets implementations. A `m:wxNavigationKeyEvent`\nhandler is automatically provided by wxWidgets when you enable keyboard navigation inside\na window by inheriting it from wxNavigationEnabled<>.\n\nSee: `wxWindow:navigate/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxNavigationKeyEvent](https://docs.wxwidgets.org/3.2/classwx_navigation_key_event.html)","title":"wxNavigationKeyEvent","ref":"wxNavigationKeyEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxNavigationKeyEventType` to subscribe to events of this type.","title":"Events - wxNavigationKeyEvent","ref":"wxNavigationKeyEvent.html#module-events"},{"type":"function","doc":"Returns the child that has the focus, or NULL.","title":"wxNavigationKeyEvent.getCurrentFocus/1","ref":"wxNavigationKeyEvent.html#getCurrentFocus/1"},{"type":"function","doc":"Returns true if the navigation was in the forward direction.","title":"wxNavigationKeyEvent.getDirection/1","ref":"wxNavigationKeyEvent.html#getDirection/1"},{"type":"function","doc":"Returns true if the navigation event was from a tab key.\n\nThis is required for proper navigation over radio buttons.","title":"wxNavigationKeyEvent.isFromTab/1","ref":"wxNavigationKeyEvent.html#isFromTab/1"},{"type":"function","doc":"Returns true if the navigation event represents a window change (for example, from\nCtrl-Page Down in a notebook).","title":"wxNavigationKeyEvent.isWindowChange/1","ref":"wxNavigationKeyEvent.html#isWindowChange/1"},{"type":"function","doc":"Sets the current focus window member.","title":"wxNavigationKeyEvent.setCurrentFocus/2","ref":"wxNavigationKeyEvent.html#setCurrentFocus/2"},{"type":"function","doc":"Sets the direction to forward if `direction` is true, or backward if false.","title":"wxNavigationKeyEvent.setDirection/2","ref":"wxNavigationKeyEvent.html#setDirection/2"},{"type":"function","doc":"Marks the navigation event as from a tab key.","title":"wxNavigationKeyEvent.setFromTab/2","ref":"wxNavigationKeyEvent.html#setFromTab/2"},{"type":"function","doc":"Marks the event as a window change event.","title":"wxNavigationKeyEvent.setWindowChange/2","ref":"wxNavigationKeyEvent.html#setWindowChange/2"},{"type":"type","doc":"","title":"wxNavigationKeyEvent.wxNavigationKey/0","ref":"wxNavigationKeyEvent.html#t:wxNavigationKey/0"},{"type":"type","doc":"","title":"wxNavigationKeyEvent.wxNavigationKeyEvent/0","ref":"wxNavigationKeyEvent.html#t:wxNavigationKeyEvent/0"},{"type":"type","doc":"","title":"wxNavigationKeyEvent.wxNavigationKeyEventType/0","ref":"wxNavigationKeyEvent.html#t:wxNavigationKeyEventType/0"},{"type":"module","doc":"This class represents a notebook control, which manages multiple windows with associated\ntabs.\n\nTo use the class, create a `m:wxNotebook` object and call `wxBookCtrlBase:addPage/4` or `wxBookCtrlBase:insertPage/5`, passing a window to be\nused as the page. Do not explicitly delete the window for a page that is currently managed\nby `m:wxNotebook`.\n\n`wxNotebookPage` is a typedef for `m:wxWindow`.","title":"wxNotebook","ref":"wxNotebook.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxNB_TOP: Place tabs on the top side.\n\n* wxNB_LEFT: Place tabs on the left side.\n\n* wxNB_RIGHT: Place tabs on the right side.\n\n* wxNB_BOTTOM: Place tabs under instead of above the notebook pages.\n\n* wxNB_FIXEDWIDTH: (Windows only) All tabs will have same width.\n\n* wxNB_MULTILINE: (Windows only) There can be several rows of tabs.\n\n* wxNB_NOPAGETHEME: (Windows only) Display a solid colour on notebook pages, and not a\ngradient, which can reduce performance. The styles wxNB_LEFT, RIGHT and BOTTOM are not\nsupported under Microsoft Windows when using visual themes.\n\nPage backgrounds\n\nOn Windows, the default theme paints a background on the notebook's pages. If you wish to\nsuppress this theme, for aesthetic or performance reasons, there are three ways of doing\nit. You can use `wxNB_NOPAGETHEME` to disable themed drawing for a particular notebook,\nyou can call `wxSystemOptions:setOption/2` to disable it for the whole application, or you can disable it for\nindividual pages by using `wxWindow:setBackgroundColour/2`.\n\nTo disable themed pages globally:\n\nSet the value to 1 to enable it again. To give a single page a solid background that more\nor less fits in with the overall theme, use:\n\nOn platforms other than Windows, or if the application is not using Windows themes, `getThemeBackgroundColour/1` will\nreturn an uninitialised colour object, and the above code will therefore work on all platforms.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxImageList`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxNotebook](https://docs.wxwidgets.org/3.2/classwx_notebook.html)","title":"Styles - wxNotebook","ref":"wxNotebook.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_notebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`command_notebook_page_changing`](`m:wxBookCtrlEvent`)","title":"Events - wxNotebook","ref":"wxNotebook.html#module-events"},{"type":"function","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxNotebook.assignImageList/2","ref":"wxNotebook.html#assignImageList/2"},{"type":"function","doc":"","title":"wxNotebook.create/3","ref":"wxNotebook.html#create/3"},{"type":"function","doc":"Creates a notebook control.\n\nSee `new/3` for a description of the parameters.","title":"wxNotebook.create/4","ref":"wxNotebook.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxNotebook.destroy/1","ref":"wxNotebook.html#destroy/1"},{"type":"function","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxNotebook.getImageList/1","ref":"wxNotebook.html#getImageList/1"},{"type":"function","doc":"Returns the image index for the given page.","title":"wxNotebook.getPageImage/2","ref":"wxNotebook.html#getPageImage/2"},{"type":"function","doc":"Returns the number of rows in the notebook control.","title":"wxNotebook.getRowCount/1","ref":"wxNotebook.html#getRowCount/1"},{"type":"function","doc":"If running under Windows and themes are enabled for the application, this function\nreturns a suitable colour for painting the background of a notebook page, and can be\npassed to `wxWindow:setBackgroundColour/2`.\n\nOtherwise, an uninitialised colour will be returned.","title":"wxNotebook.getThemeBackgroundColour/1","ref":"wxNotebook.html#getThemeBackgroundColour/1"},{"type":"function","doc":"Constructs a notebook control.","title":"wxNotebook.new/0","ref":"wxNotebook.html#new/0"},{"type":"function","doc":"","title":"wxNotebook.new/2","ref":"wxNotebook.html#new/2"},{"type":"function","doc":"Constructs a notebook control.\n\nNote that sometimes you can reduce flicker by passing the wxCLIP_CHILDREN window style.","title":"wxNotebook.new/3","ref":"wxNotebook.html#new/3"},{"type":"function","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","title":"wxNotebook.setImageList/2","ref":"wxNotebook.html#setImageList/2"},{"type":"function","doc":"Sets the amount of space around each page's icon and label, in pixels.\n\nNote: The vertical padding cannot be changed in wxGTK.","title":"wxNotebook.setPadding/2","ref":"wxNotebook.html#setPadding/2"},{"type":"function","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","title":"wxNotebook.setPageImage/3","ref":"wxNotebook.html#setPageImage/3"},{"type":"function","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","title":"wxNotebook.setPageSize/2","ref":"wxNotebook.html#setPageSize/2"},{"type":"type","doc":"","title":"wxNotebook.wxNotebook/0","ref":"wxNotebook.html#t:wxNotebook/0"},{"type":"module","doc":"This class allows showing the user a message non intrusively.\n\nCurrently it is implemented natively for Windows, macOS, GTK and uses generic toast\nnotifications under the other platforms. It's not recommended but `wxGenericNotificationMessage`\ncan be used instead of the native ones. This might make sense if your application\nrequires features not available in the native implementation.\n\nNotice that this class is not a window and so doesn't derive from `m:wxWindow`.\n\nPlatform Notes\n\nPar:\n\nUp to Windows 8 balloon notifications are displayed from an icon in the notification area\nof the taskbar. If your application uses a `m:wxTaskBarIcon` you should call `useTaskBarIcon/1` to ensure\nthat only one icon is shown in the notification area. Windows 10 displays all\nnotifications as popup toasts. To suppress the additional icon in the notification area on\nWindows 10 and for toast notification support on Windows 8 it is recommended to call `mSWUseToasts/1`\nbefore showing the first notification message.\n\nPar:\n\nThe macOS implementation uses Notification Center to display native notifications. In\norder to use actions your notifications must use the alert style. This can be enabled by\nthe user in system settings or by setting the `NSUserNotificationAlertStyle` value in\nInfo.plist to `alert`. Please note that the user always has the option to change the\nnotification style.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxNotificationMessage](https://docs.wxwidgets.org/3.2/classwx_notification_message.html)","title":"wxNotificationMessage","ref":"wxNotificationMessage.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`notification_message_click`](`m:wxCommandEvent`)\n\n* [`notification_message_dismissed`](`m:wxCommandEvent`)\n\n* [`notification_message_action`](`m:wxCommandEvent`)","title":"Events - wxNotificationMessage","ref":"wxNotificationMessage.html#module-events"},{"type":"function","doc":"","title":"wxNotificationMessage.addAction/2","ref":"wxNotificationMessage.html#addAction/2"},{"type":"function","doc":"Add an action to the notification.\n\nIf supported by the implementation this are usually buttons in the notification\nselectable by the user.\n\nReturn: false if the current implementation or OS version does not support actions in notifications.\n\nSince: 3.1.0","title":"wxNotificationMessage.addAction/3","ref":"wxNotificationMessage.html#addAction/3"},{"type":"function","doc":"Hides the notification.\n\nReturns true if it was hidden or false if it couldn't be done (e.g. on some systems\nautomatically hidden notifications can't be hidden manually).","title":"wxNotificationMessage.close/1","ref":"wxNotificationMessage.html#close/1"},{"type":"function","doc":"Destroys the object","title":"wxNotificationMessage.destroy/1","ref":"wxNotificationMessage.html#destroy/1"},{"type":"function","doc":"","title":"wxNotificationMessage.mSWUseToasts/0","ref":"wxNotificationMessage.html#mSWUseToasts/0"},{"type":"function","doc":"Enables toast notifications available since Windows 8 and suppresses the additional icon\nin the notification area on Windows 10.\n\nToast notifications `require` a shortcut to the application in the start menu. The start\nmenu shortcut needs to contain an Application User Model ID. It is recommended that the\napplications setup creates the shortcut and the application specifies the setup created\nshortcut in `shortcutPath`. A call to this method will verify (and if necessary modify)\nthe shortcut before enabling toast notifications.\n\nReturn: false if toast notifications could not be enabled.\n\nOnly for:wxmsw\n\nSince: 3.1.0","title":"wxNotificationMessage.mSWUseToasts/1","ref":"wxNotificationMessage.html#mSWUseToasts/1"},{"type":"function","doc":"Default constructor, use `setParent/2`, `setTitle/2` and `setMessage/2` to initialize the\nobject before showing it.","title":"wxNotificationMessage.new/0","ref":"wxNotificationMessage.html#new/0"},{"type":"function","doc":"","title":"wxNotificationMessage.new/1","ref":"wxNotificationMessage.html#new/1"},{"type":"function","doc":"Create a notification object with the given attributes.\n\nSee `setTitle/2`, `setMessage/2`, `setParent/2` and `setFlags/2` for the description of the corresponding parameters.","title":"wxNotificationMessage.new/2","ref":"wxNotificationMessage.html#new/2"},{"type":"function","doc":"This parameter can be currently used to specify the icon to show in the notification.\n\nValid values are `wxICON_INFORMATION`, `wxICON_WARNING` and `wxICON_ERROR` (notice that `wxICON_QUESTION`\nis not allowed here). Some implementations of this class may not support the icons.\n\nSee: `setIcon/2`","title":"wxNotificationMessage.setFlags/2","ref":"wxNotificationMessage.html#setFlags/2"},{"type":"function","doc":"Specify a custom icon to be displayed in the notification.\n\nSome implementations of this class may not support custom icons.\n\nSee: `setFlags/2`\n\nSince: 3.1.0","title":"wxNotificationMessage.setIcon/2","ref":"wxNotificationMessage.html#setIcon/2"},{"type":"function","doc":"Set the main text of the notification.\n\nThis should be a more detailed description than the title but still limited to reasonable\nlength (not more than 256 characters).","title":"wxNotificationMessage.setMessage/2","ref":"wxNotificationMessage.html#setMessage/2"},{"type":"function","doc":"Set the parent for this notification: the notification will be associated with the top\nlevel parent of this window or, if this method is not called, with the main application\nwindow by default.","title":"wxNotificationMessage.setParent/2","ref":"wxNotificationMessage.html#setParent/2"},{"type":"function","doc":"Set the title, it must be a concise string (not more than 64 characters), use `setMessage/2`\nto give the user more details.","title":"wxNotificationMessage.setTitle/2","ref":"wxNotificationMessage.html#setTitle/2"},{"type":"function","doc":"","title":"wxNotificationMessage.show/1","ref":"wxNotificationMessage.html#show/1"},{"type":"function","doc":"Show the notification to the user and hides it after `timeout` seconds are elapsed.\n\nSpecial values `Timeout_Auto` and `Timeout_Never` can be used here, notice that you\nshouldn't rely on `timeout` being exactly respected because the current platform may only\nsupport default timeout value and also because the user may be able to close the notification.\n\nNote: When using native notifications in wxGTK, the timeout is ignored for the\nnotifications with `wxICON_WARNING` or `wxICON_ERROR` flags, they always remain shown\nunless they're explicitly hidden by the user, i.e. behave as if Timeout_Auto were given.\n\nReturn: false if an error occurred.","title":"wxNotificationMessage.show/2","ref":"wxNotificationMessage.html#show/2"},{"type":"function","doc":"If the application already uses a `m:wxTaskBarIcon`, it should be connected to\nnotifications by using this method.\n\nThis has no effect if toast notifications are used.\n\nReturn: the task bar icon which was used previously (may be `NULL`)\n\nOnly for:wxmsw","title":"wxNotificationMessage.useTaskBarIcon/1","ref":"wxNotificationMessage.html#useTaskBarIcon/1"},{"type":"type","doc":"","title":"wxNotificationMessage.wxNotificationMessage/0","ref":"wxNotificationMessage.html#t:wxNotificationMessage/0"},{"type":"module","doc":"This class is not used by the event handlers by itself, but is a base class for other\nevent classes (such as `m:wxBookCtrlEvent`).\n\nIt (or an object of a derived class) is sent when the controls state is being changed and\nallows the program to `veto/1` this change if it wants to prevent it from happening.\n\nSee: `m:wxBookCtrlEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxNotifyEvent](https://docs.wxwidgets.org/3.2/classwx_notify_event.html)","title":"wxNotifyEvent","ref":"wxNotifyEvent.html"},{"type":"function","doc":"This is the opposite of `veto/1`: it explicitly allows the event to be processed.\n\nFor most events it is not necessary to call this method as the events are allowed anyhow\nbut some are forbidden by default (this will be mentioned in the corresponding event\ndescription).","title":"wxNotifyEvent.allow/1","ref":"wxNotifyEvent.html#allow/1"},{"type":"function","doc":"Returns true if the change is allowed (`veto/1` hasn't been called) or false otherwise\n(if it was).","title":"wxNotifyEvent.isAllowed/1","ref":"wxNotifyEvent.html#isAllowed/1"},{"type":"function","doc":"Prevents the change announced by this event from happening.\n\nIt is in general a good idea to notify the user about the reasons for vetoing the change\nbecause otherwise the applications behaviour (which just refuses to do what the user\nwants) might be quite surprising.","title":"wxNotifyEvent.veto/1","ref":"wxNotifyEvent.html#veto/1"},{"type":"type","doc":"","title":"wxNotifyEvent.wxNotifyEvent/0","ref":"wxNotifyEvent.html#t:wxNotifyEvent/0"},{"type":"module","doc":"Creates an overlay over an existing window, allowing for manipulations like\nrubberbanding, etc.\n\nOn wxOSX the overlay is implemented with native platform APIs, on the other platforms it\nis simulated using `m:wxMemoryDC`.\n\nSee:\n* `m:wxDCOverlay`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxOverlay](https://docs.wxwidgets.org/3.2/classwx_overlay.html)","title":"wxOverlay","ref":"wxOverlay.html"},{"type":"function","doc":"Destroys the object","title":"wxOverlay.destroy/1","ref":"wxOverlay.html#destroy/1"},{"type":"function","doc":"","title":"wxOverlay.new/0","ref":"wxOverlay.html#new/0"},{"type":"function","doc":"Clears the overlay without restoring the former state.\n\nTo be done, for example, when the window content has been changed and repainted.","title":"wxOverlay.reset/1","ref":"wxOverlay.html#reset/1"},{"type":"type","doc":"","title":"wxOverlay.wxOverlay/0","ref":"wxOverlay.html#t:wxOverlay/0"},{"type":"module","doc":"This class represents the page setup common dialog.\n\nThe page setup dialog contains controls for paper size (letter, A4, A5 etc.), orientation\n(landscape or portrait), and, only under Windows currently, controls for setting left,\ntop, right and bottom margin sizes in millimetres.\n\nThe exact appearance of this dialog varies among the platforms as a native dialog is used\nwhen available (currently the case for all major platforms).\n\nWhen the dialog has been closed, you need to query the `m:wxPageSetupDialogData` object\nassociated with the dialog.\n\nNote that the OK and Cancel buttons do not destroy the dialog; this must be done by the application.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialogData`\n\nwxWidgets docs: [wxPageSetupDialog](https://docs.wxwidgets.org/3.2/classwx_page_setup_dialog.html)","title":"wxPageSetupDialog","ref":"wxPageSetupDialog.html"},{"type":"function","doc":"Destroys the object","title":"wxPageSetupDialog.destroy/1","ref":"wxPageSetupDialog.html#destroy/1"},{"type":"function","doc":"Returns the `m:wxPageSetupDialogData` object associated with the dialog.","title":"wxPageSetupDialog.getPageSetupData/1","ref":"wxPageSetupDialog.html#getPageSetupData/1"},{"type":"function","doc":"","title":"wxPageSetupDialog.new/1","ref":"wxPageSetupDialog.html#new/1"},{"type":"function","doc":"Constructor.\n\nPass a parent window, and optionally a pointer to a block of page setup data, which will\nbe copied to the print dialog's internal data.","title":"wxPageSetupDialog.new/2","ref":"wxPageSetupDialog.html#new/2"},{"type":"function","doc":"Shows the dialog, returning `wxID\\_OK` if the user pressed OK, and `wxID\\_CANCEL`\notherwise.","title":"wxPageSetupDialog.showModal/1","ref":"wxPageSetupDialog.html#showModal/1"},{"type":"type","doc":"","title":"wxPageSetupDialog.wxPageSetupDialog/0","ref":"wxPageSetupDialog.html#t:wxPageSetupDialog/0"},{"type":"module","doc":"This class holds a variety of information related to `m:wxPageSetupDialog`.\n\nIt contains a `m:wxPrintData` member which is used to hold basic printer configuration\ndata (as opposed to the user-interface configuration settings stored by `m:wxPageSetupDialogData`).\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPageSetupDialog`\n\nwxWidgets docs: [wxPageSetupDialogData](https://docs.wxwidgets.org/3.2/classwx_page_setup_dialog_data.html)","title":"wxPageSetupDialogData","ref":"wxPageSetupDialogData.html"},{"type":"function","doc":"Destroys the object","title":"wxPageSetupDialogData.destroy/1","ref":"wxPageSetupDialogData.html#destroy/1"},{"type":"function","doc":"Enables or disables the \"Help\" button (Windows only).","title":"wxPageSetupDialogData.enableHelp/2","ref":"wxPageSetupDialogData.html#enableHelp/2"},{"type":"function","doc":"Enables or disables the margin controls (Windows only).","title":"wxPageSetupDialogData.enableMargins/2","ref":"wxPageSetupDialogData.html#enableMargins/2"},{"type":"function","doc":"Enables or disables the orientation control (Windows only).","title":"wxPageSetupDialogData.enableOrientation/2","ref":"wxPageSetupDialogData.html#enableOrientation/2"},{"type":"function","doc":"Enables or disables the paper size control (Windows only).","title":"wxPageSetupDialogData.enablePaper/2","ref":"wxPageSetupDialogData.html#enablePaper/2"},{"type":"function","doc":"Enables or disables the \"Printer\" button, which invokes a printer setup dialog.","title":"wxPageSetupDialogData.enablePrinter/2","ref":"wxPageSetupDialogData.html#enablePrinter/2"},{"type":"function","doc":"Returns true if the dialog will simply return default printer information (such as\norientation) instead of showing a dialog (Windows only).","title":"wxPageSetupDialogData.getDefaultInfo/1","ref":"wxPageSetupDialogData.html#getDefaultInfo/1"},{"type":"function","doc":"Returns true if the page setup dialog will take its minimum margin values from the\ncurrently selected printer properties (Windows only).","title":"wxPageSetupDialogData.getDefaultMinMargins/1","ref":"wxPageSetupDialogData.html#getDefaultMinMargins/1"},{"type":"function","doc":"Returns true if the printer setup button is enabled.","title":"wxPageSetupDialogData.getEnableHelp/1","ref":"wxPageSetupDialogData.html#getEnableHelp/1"},{"type":"function","doc":"Returns true if the margin controls are enabled (Windows only).","title":"wxPageSetupDialogData.getEnableMargins/1","ref":"wxPageSetupDialogData.html#getEnableMargins/1"},{"type":"function","doc":"Returns true if the orientation control is enabled (Windows only).","title":"wxPageSetupDialogData.getEnableOrientation/1","ref":"wxPageSetupDialogData.html#getEnableOrientation/1"},{"type":"function","doc":"Returns true if the paper size control is enabled (Windows only).","title":"wxPageSetupDialogData.getEnablePaper/1","ref":"wxPageSetupDialogData.html#getEnablePaper/1"},{"type":"function","doc":"Returns true if the printer setup button is enabled.","title":"wxPageSetupDialogData.getEnablePrinter/1","ref":"wxPageSetupDialogData.html#getEnablePrinter/1"},{"type":"function","doc":"Returns the right (x) and bottom (y) margins in millimetres.","title":"wxPageSetupDialogData.getMarginBottomRight/1","ref":"wxPageSetupDialogData.html#getMarginBottomRight/1"},{"type":"function","doc":"Returns the left (x) and top (y) margins in millimetres.","title":"wxPageSetupDialogData.getMarginTopLeft/1","ref":"wxPageSetupDialogData.html#getMarginTopLeft/1"},{"type":"function","doc":"Returns the right (x) and bottom (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","title":"wxPageSetupDialogData.getMinMarginBottomRight/1","ref":"wxPageSetupDialogData.html#getMinMarginBottomRight/1"},{"type":"function","doc":"Returns the left (x) and top (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","title":"wxPageSetupDialogData.getMinMarginTopLeft/1","ref":"wxPageSetupDialogData.html#getMinMarginTopLeft/1"},{"type":"function","doc":"Returns the paper id (stored in the internal `m:wxPrintData` object).\n\nSee: `wxPrintData:setPaperId/2`","title":"wxPageSetupDialogData.getPaperId/1","ref":"wxPageSetupDialogData.html#getPaperId/1"},{"type":"function","doc":"Returns the paper size in millimetres.","title":"wxPageSetupDialogData.getPaperSize/1","ref":"wxPageSetupDialogData.html#getPaperSize/1"},{"type":"function","doc":"","title":"wxPageSetupDialogData.getPrintData/1","ref":"wxPageSetupDialogData.html#getPrintData/1"},{"type":"function","doc":"Returns true if the print data associated with the dialog data is valid.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","title":"wxPageSetupDialogData.isOk/1","ref":"wxPageSetupDialogData.html#isOk/1"},{"type":"function","doc":"Default constructor.","title":"wxPageSetupDialogData.new/0","ref":"wxPageSetupDialogData.html#new/0"},{"type":"function","doc":"Construct an object from a print data object.","title":"wxPageSetupDialogData.new/1","ref":"wxPageSetupDialogData.html#new/1"},{"type":"function","doc":"Pass true if the dialog will simply return default printer information (such as\norientation) instead of showing a dialog (Windows only).","title":"wxPageSetupDialogData.setDefaultInfo/2","ref":"wxPageSetupDialogData.html#setDefaultInfo/2"},{"type":"function","doc":"Pass true if the page setup dialog will take its minimum margin values from the currently\nselected printer properties (Windows only).\n\nUnits are in millimetres.","title":"wxPageSetupDialogData.setDefaultMinMargins/2","ref":"wxPageSetupDialogData.html#setDefaultMinMargins/2"},{"type":"function","doc":"Sets the right (x) and bottom (y) margins in millimetres.","title":"wxPageSetupDialogData.setMarginBottomRight/2","ref":"wxPageSetupDialogData.html#setMarginBottomRight/2"},{"type":"function","doc":"Sets the left (x) and top (y) margins in millimetres.","title":"wxPageSetupDialogData.setMarginTopLeft/2","ref":"wxPageSetupDialogData.html#setMarginTopLeft/2"},{"type":"function","doc":"Sets the right (x) and bottom (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","title":"wxPageSetupDialogData.setMinMarginBottomRight/2","ref":"wxPageSetupDialogData.html#setMinMarginBottomRight/2"},{"type":"function","doc":"Sets the left (x) and top (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","title":"wxPageSetupDialogData.setMinMarginTopLeft/2","ref":"wxPageSetupDialogData.html#setMinMarginTopLeft/2"},{"type":"function","doc":"Sets the paper size id.\n\nCalling this function overrides the explicit paper dimensions passed in `setPaperSize/2`.\n\nSee: `wxPrintData:setPaperId/2`","title":"wxPageSetupDialogData.setPaperId/2","ref":"wxPageSetupDialogData.html#setPaperId/2"},{"type":"function","doc":"Sets the paper size in millimetres.\n\nIf a corresponding paper id is found, it will be set in the internal `m:wxPrintData`\nobject, otherwise the paper size overrides the paper id.","title":"wxPageSetupDialogData.setPaperSize/2","ref":"wxPageSetupDialogData.html#setPaperSize/2"},{"type":"function","doc":"Sets the print data associated with this object.","title":"wxPageSetupDialogData.setPrintData/2","ref":"wxPageSetupDialogData.html#setPrintData/2"},{"type":"type","doc":"","title":"wxPageSetupDialogData.wxPageSetupDialogData/0","ref":"wxPageSetupDialogData.html#t:wxPageSetupDialogData/0"},{"type":"module","doc":"A `m:wxPaintDC` must be constructed if an application wishes to paint on the client area\nof a window from within an EVT\\_PAINT() event handler.\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxPaintDC`\nobject. If you have an EVT_PAINT() handler, you `must` create a `m:wxPaintDC` object\nwithin it even if you don't actually use it.\n\nUsing `m:wxPaintDC` within your EVT_PAINT() handler is important because it automatically\nsets the clipping area to the damaged area of the window. Attempts to draw outside this\narea do not appear.\n\nA `m:wxPaintDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxClientDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxWindowDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindowDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxPaintDC](https://docs.wxwidgets.org/3.2/classwx_paint_d_c.html)","title":"wxPaintDC","ref":"wxPaintDC.html"},{"type":"function","doc":"Destroys the object","title":"wxPaintDC.destroy/1","ref":"wxPaintDC.html#destroy/1"},{"type":"function","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","title":"wxPaintDC.new/1","ref":"wxPaintDC.html#new/1"},{"type":"type","doc":"","title":"wxPaintDC.wxPaintDC/0","ref":"wxPaintDC.html#t:wxPaintDC/0"},{"type":"module","doc":"A paint event is sent when a window's contents needs to be repainted.\n\nThe handler of this event must create a `m:wxPaintDC` object and use it for painting the\nwindow contents. For example:\n\nNotice that you must `not` create other kinds of `m:wxDC` (e.g. `m:wxClientDC` or `m:wxWindowDC`)\nin EVT_PAINT handlers and also don't create `m:wxPaintDC` outside of this event handlers.\n\nYou can optimize painting by retrieving the rectangles that have been damaged and only\nrepainting these. The rectangles are in terms of the client area, and are unscrolled, so\nyou will need to do some calculations using the current view position to obtain logical,\nscrolled units. Here is an example of using the `wxRegionIterator` (not implemented in wx)\nclass:\n\nRemark: Please notice that in general it is impossible to change the drawing of a\nstandard control (such as `m:wxButton`) and so you shouldn't attempt to handle paint\nevents for them as even if it might work on some platforms, this is inherently not\nportable and won't work everywhere.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxPaintEvent](https://docs.wxwidgets.org/3.2/classwx_paint_event.html)","title":"wxPaintEvent","ref":"wxPaintEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxPaintEventType` to subscribe to events of this type.","title":"Events - wxPaintEvent","ref":"wxPaintEvent.html#module-events"},{"type":"type","doc":"","title":"wxPaintEvent.wxPaint/0","ref":"wxPaintEvent.html#t:wxPaint/0"},{"type":"type","doc":"","title":"wxPaintEvent.wxPaintEvent/0","ref":"wxPaintEvent.html#t:wxPaintEvent/0"},{"type":"type","doc":"","title":"wxPaintEvent.wxPaintEventType/0","ref":"wxPaintEvent.html#t:wxPaintEventType/0"},{"type":"module","doc":"A palette is a table that maps pixel values to RGB colours.\n\nIt allows the colours of a low-depth bitmap, for example, to be mapped to the available\ncolours in a display. The notion of palettes is becoming more and more obsolete nowadays\nand only the MSW port is still using a native palette. All other ports use generic code\nwhich is basically just an array of colours.\n\nIt is likely that in the future the only use for palettes within wxWidgets will be for\nrepresenting colour indices from images (such as GIF or PNG). The image handlers for these\nformats have been modified to create a palette if there is such information in the\noriginal image file (usually 256 or less colour images). See `m:wxImage` for more information.\n\nPredefined objects (include wx.hrl): ?wxNullPalette\n\nSee:\n* `wxDC:setPalette/2`\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxPalette](https://docs.wxwidgets.org/3.2/classwx_palette.html)","title":"wxPalette","ref":"wxPalette.html"},{"type":"function","doc":"Creates a palette from arrays of size `n`, one for each red, blue or green component.\n\nReturn: true if the creation was successful, false otherwise.\n\nSee: `new/3`","title":"wxPalette.create/4","ref":"wxPalette.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxPalette.destroy/1","ref":"wxPalette.html#destroy/1"},{"type":"function","doc":"Returns number of entries in palette.","title":"wxPalette.getColoursCount/1","ref":"wxPalette.html#getColoursCount/1"},{"type":"function","doc":"Returns a pixel value (index into the palette) for the given RGB values.\n\nReturn: The nearest palette index or `wxNOT_FOUND` for unexpected errors.\n\nSee: `getRGB/2`","title":"wxPalette.getPixel/4","ref":"wxPalette.html#getPixel/4"},{"type":"function","doc":"Returns RGB values for a given palette index.\n\nReturn: true if the operation was successful.\n\nSee: `getPixel/4`","title":"wxPalette.getRGB/2","ref":"wxPalette.html#getRGB/2"},{"type":"function","doc":"Returns true if palette data is present.","title":"wxPalette.isOk/1","ref":"wxPalette.html#isOk/1"},{"type":"function","doc":"Default constructor.","title":"wxPalette.new/0","ref":"wxPalette.html#new/0"},{"type":"function","doc":"Copy constructor, uses overview_refcount.","title":"wxPalette.new/1","ref":"wxPalette.html#new/1"},{"type":"function","doc":"Creates a palette from arrays of size `n`, one for each red, blue or green component.\n\nSee: `create/4`","title":"wxPalette.new/3","ref":"wxPalette.html#new/3"},{"type":"function","doc":"Equivalent to: `isOk/1`","title":"wxPalette.ok/1","ref":"wxPalette.html#ok/1"},{"type":"type","doc":"","title":"wxPalette.wxPalette/0","ref":"wxPalette.html#t:wxPalette/0"},{"type":"module","doc":"Functions for wxPaletteChangedEvent class\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxPaletteChangedEvent](https://docs.wxwidgets.org/3.2/classwx_palette_changed_event.html)","title":"wxPaletteChangedEvent","ref":"wxPaletteChangedEvent.html"},{"type":"function","doc":"","title":"wxPaletteChangedEvent.getChangedWindow/1","ref":"wxPaletteChangedEvent.html#getChangedWindow/1"},{"type":"function","doc":"","title":"wxPaletteChangedEvent.setChangedWindow/2","ref":"wxPaletteChangedEvent.html#setChangedWindow/2"},{"type":"type","doc":"","title":"wxPaletteChangedEvent.wxPaletteChanged/0","ref":"wxPaletteChangedEvent.html#t:wxPaletteChanged/0"},{"type":"type","doc":"","title":"wxPaletteChangedEvent.wxPaletteChangedEvent/0","ref":"wxPaletteChangedEvent.html#t:wxPaletteChangedEvent/0"},{"type":"type","doc":"","title":"wxPaletteChangedEvent.wxPaletteChangedEventType/0","ref":"wxPaletteChangedEvent.html#t:wxPaletteChangedEventType/0"},{"type":"module","doc":"A panel is a window on which controls are placed.\n\nIt is usually placed within a frame. Its main feature over its parent class `m:wxWindow`\nis code for handling child windows and TAB traversal, which is implemented natively if\npossible (e.g. in wxGTK) or by wxWidgets itself otherwise.\n\nNote: Tab traversal is implemented through an otherwise undocumented intermediate\nwxControlContainer class from which any class can derive in addition to the normal `m:wxWindow`\nbase class. Please see and to find out how this is achieved.\n\nNote: if not all characters are being intercepted by your OnKeyDown or OnChar handler, it\nmay be because you are using the `wxTAB_TRAVERSAL` style, which grabs some keypresses for\nuse by child controls.\n\nRemark: By default, a panel has the same colouring as a dialog.\n\nSee: `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPanel](https://docs.wxwidgets.org/3.2/classwx_panel.html)","title":"wxPanel","ref":"wxPanel.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`navigation_key`](`m:wxNavigationKeyEvent`)","title":"Events - wxPanel","ref":"wxPanel.html#module-events"},{"type":"function","doc":"Destroys the object","title":"wxPanel.destroy/1","ref":"wxPanel.html#destroy/1"},{"type":"function","doc":"Sends a `m:wxInitDialogEvent`, which in turn transfers data to the dialog via validators.\n\nSee: `m:wxInitDialogEvent`","title":"wxPanel.initDialog/1","ref":"wxPanel.html#initDialog/1"},{"type":"function","doc":"Default constructor.","title":"wxPanel.new/0","ref":"wxPanel.html#new/0"},{"type":"function","doc":"","title":"wxPanel.new/1","ref":"wxPanel.html#new/1"},{"type":"function","doc":"Constructor.","title":"wxPanel.new/2","ref":"wxPanel.html#new/2"},{"type":"function","doc":"In contrast to `wxWindow:setFocus/1` (see above) this will set the focus to the panel\neven if there are child windows in the panel.\n\nThis is only rarely needed.","title":"wxPanel.setFocusIgnoringChildren/1","ref":"wxPanel.html#setFocusIgnoringChildren/1"},{"type":"type","doc":"","title":"wxPanel.wxPanel/0","ref":"wxPanel.html#t:wxPanel/0"},{"type":"module","doc":"This class represents a dialog that requests a one-line password string from the user.\n\nIt is implemented as a generic wxWidgets dialog.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_password)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTextEntryDialog`\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPasswordEntryDialog](https://docs.wxwidgets.org/3.2/classwx_password_entry_dialog.html)","title":"wxPasswordEntryDialog","ref":"wxPasswordEntryDialog.html"},{"type":"function","doc":"Destroys the object","title":"wxPasswordEntryDialog.destroy/1","ref":"wxPasswordEntryDialog.html#destroy/1"},{"type":"function","doc":"","title":"wxPasswordEntryDialog.new/2","ref":"wxPasswordEntryDialog.html#new/2"},{"type":"function","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","title":"wxPasswordEntryDialog.new/3","ref":"wxPasswordEntryDialog.html#new/3"},{"type":"type","doc":"","title":"wxPasswordEntryDialog.wxPasswordEntryDialog/0","ref":"wxPasswordEntryDialog.html#t:wxPasswordEntryDialog/0"},{"type":"module","doc":"A pen is a drawing tool for drawing outlines.\n\nIt is used for drawing lines and painting the outline of rectangles, ellipses, etc. It\nhas a colour, a width and a style.\n\nNote: On a monochrome display, wxWidgets shows all non-white pens as black.\n\nDo not initialize objects on the stack before the program commences, since other\nrequired structures may not have been set up yet. Instead, define global pointers to\nobjects and create them in `wxApp::OnInit()` (not implemented in wx) or when required.\n\nAn application may wish to dynamically create pens with different characteristics, and\nthere is the consequent danger that a large number of duplicate pens will be created.\nTherefore an application may wish to get a pointer to a pen by using the global list of\npens ?wxThePenList, and calling the member function `wxPenList::FindOrCreatePen()` (not\nimplemented in wx). See `wxPenList` (not implemented in wx) for more info.\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullPen\n\n* ?wxBLACK\\_DASHED\\_PEN\n\n* ?wxBLACK\\_PEN\n\n* ?wxBLUE\\_PEN\n\n* ?wxCYAN\\_PEN\n\n* ?wxGREEN\\_PEN\n\n* ?wxYELLOW\\_PEN\n\n* ?wxGREY\\_PEN\n\n* ?wxLIGHT\\_GREY\\_PEN\n\n* ?wxMEDIUM\\_GREY\\_PEN\n\n* ?wxRED\\_PEN\n\n* ?wxTRANSPARENT\\_PEN\n\n* ?wxWHITE\\_PEN\n\nSee:\n* `m:wxDC`\n\n* `wxDC:setPen/2`\n\nwxWidgets docs: [wxPen](https://docs.wxwidgets.org/3.2/classwx_pen.html)","title":"wxPen","ref":"wxPen.html"},{"type":"function","doc":"Destroys the object","title":"wxPen.destroy/1","ref":"wxPen.html#destroy/1"},{"type":"function","doc":"Returns the pen cap style, which may be one of `wxCAP\\_ROUND`, `wxCAP\\_PROJECTING` and `wxCAP\\_BUTT`.\n\nThe default is `wxCAP_ROUND`.\n\nSee: `setCap/2`","title":"wxPen.getCap/1","ref":"wxPen.html#getCap/1"},{"type":"function","doc":"Returns a reference to the pen colour.\n\nSee: `setColour/4`","title":"wxPen.getColour/1","ref":"wxPen.html#getColour/1"},{"type":"function","doc":"Returns the pen join style, which may be one of `wxJOIN\\_BEVEL`, `wxJOIN\\_ROUND` and `wxJOIN\\_MITER`.\n\nThe default is `wxJOIN_ROUND`.\n\nSee: `setJoin/2`","title":"wxPen.getJoin/1","ref":"wxPen.html#getJoin/1"},{"type":"function","doc":"Returns the pen style.\n\nSee:\n* `new/2`\n\n* `setStyle/2`","title":"wxPen.getStyle/1","ref":"wxPen.html#getStyle/1"},{"type":"function","doc":"Returns the pen width.\n\nSee: `setWidth/2`","title":"wxPen.getWidth/1","ref":"wxPen.html#getWidth/1"},{"type":"function","doc":"Returns true if the pen is initialised.\n\nNotice that an uninitialized pen object can't be queried for any pen properties and all\ncalls to the accessor methods on it will result in an assert failure.","title":"wxPen.isOk/1","ref":"wxPen.html#isOk/1"},{"type":"function","doc":"Default constructor.\n\nThe pen will be uninitialised, and `isOk/1` will return false.","title":"wxPen.new/0","ref":"wxPen.html#new/0"},{"type":"function","doc":"Copy constructor, uses overview_refcount.","title":"wxPen.new/1","ref":"wxPen.html#new/1"},{"type":"function","doc":"Constructs a pen from a colour object, pen width and style.\n\nRemark: Different versions of Windows and different versions of other platforms support\nvery different subsets of the styles above so handle with care.\n\nSee:\n* `setStyle/2`\n\n* `setColour/4`\n\n* `setWidth/2`","title":"wxPen.new/2","ref":"wxPen.html#new/2"},{"type":"function","doc":"Sets the pen cap style, which may be one of `wxCAP\\_ROUND`, `wxCAP\\_PROJECTING` and `wxCAP\\_BUTT`.\n\nThe default is `wxCAP_ROUND`.\n\nSee: `getCap/1`","title":"wxPen.setCap/2","ref":"wxPen.html#setCap/2"},{"type":"function","doc":"The pen's colour is changed to the given colour.\n\nSee: `getColour/1`","title":"wxPen.setColour/2","ref":"wxPen.html#setColour/2"},{"type":"function","doc":"","title":"wxPen.setColour/4","ref":"wxPen.html#setColour/4"},{"type":"function","doc":"Sets the pen join style, which may be one of `wxJOIN\\_BEVEL`, `wxJOIN\\_ROUND` and `wxJOIN\\_MITER`.\n\nThe default is `wxJOIN_ROUND`.\n\nSee: `getJoin/1`","title":"wxPen.setJoin/2","ref":"wxPen.html#setJoin/2"},{"type":"function","doc":"Set the pen style.\n\nSee: `new/2`","title":"wxPen.setStyle/2","ref":"wxPen.html#setStyle/2"},{"type":"function","doc":"Sets the pen width.\n\nSee: `getWidth/1`","title":"wxPen.setWidth/2","ref":"wxPen.html#setWidth/2"},{"type":"type","doc":"","title":"wxPen.wxPen/0","ref":"wxPen.html#t:wxPen/0"},{"type":"module","doc":"Base abstract class for all pickers which support an auxiliary text control.\n\nThis class handles all positioning and sizing of the text control like a an horizontal `m:wxBoxSizer`\nwould do, with the text control on the left of the picker button.\n\nThe proportion (see `m:wxSizer` documentation for more info about proportion values) of\nthe picker control defaults to 1 when there isn't a text control associated (see `wxPB_USE_TEXTCTRL`\nstyle) and to 0 otherwise.","title":"wxPickerBase","ref":"wxPickerBase.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxPB_USE_TEXTCTRL: Creates a text control to the left of the picker which is completely\nmanaged by this `m:wxPickerBase` class.\n\nSee: `m:wxColourPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPickerBase](https://docs.wxwidgets.org/3.2/classwx_picker_base.html)","title":"Styles - wxPickerBase","ref":"wxPickerBase.html#module-styles"},{"type":"function","doc":"Returns the margin (in pixel) between the picker and the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.getInternalMargin/1","ref":"wxPickerBase.html#getInternalMargin/1"},{"type":"function","doc":"Returns the proportion value of the picker.","title":"wxPickerBase.getPickerCtrlProportion/1","ref":"wxPickerBase.html#getPickerCtrlProportion/1"},{"type":"function","doc":"Returns a pointer to the text control handled by this window or NULL if the `wxPB\\_USE\\_TEXTCTRL`\nstyle was not specified when this control was created.\n\nRemark: The contents of the text control could be an invalid representation of the entity\nwhich can be chosen through the picker (e.g. when the user enters an invalid colour syntax\nbecause of a typo). Thus you should never parse the content of the textctrl to get the\nuser's input; rather use the derived-class getter (e.g. `wxColourPickerCtrl:getColour/1`, `wxFilePickerCtrl:getPath/1`, etc).","title":"wxPickerBase.getTextCtrl/1","ref":"wxPickerBase.html#getTextCtrl/1"},{"type":"function","doc":"Returns the proportion value of the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.getTextCtrlProportion/1","ref":"wxPickerBase.html#getTextCtrlProportion/1"},{"type":"function","doc":"Returns true if this window has a valid text control (i.e. if the `wxPB\\_USE\\_TEXTCTRL`\nstyle was given when creating this control).","title":"wxPickerBase.hasTextCtrl/1","ref":"wxPickerBase.html#hasTextCtrl/1"},{"type":"function","doc":"Returns true if the picker control is growable.","title":"wxPickerBase.isPickerCtrlGrowable/1","ref":"wxPickerBase.html#isPickerCtrlGrowable/1"},{"type":"function","doc":"Returns true if the text control is growable.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.isTextCtrlGrowable/1","ref":"wxPickerBase.html#isTextCtrlGrowable/1"},{"type":"function","doc":"Sets the margin (in pixel) between the picker and the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.setInternalMargin/2","ref":"wxPickerBase.html#setInternalMargin/2"},{"type":"function","doc":"","title":"wxPickerBase.setPickerCtrlGrowable/1","ref":"wxPickerBase.html#setPickerCtrlGrowable/1"},{"type":"function","doc":"Sets the picker control as growable when `grow` is true.","title":"wxPickerBase.setPickerCtrlGrowable/2","ref":"wxPickerBase.html#setPickerCtrlGrowable/2"},{"type":"function","doc":"Sets the proportion value of the picker.\n\nLook at the detailed description of `m:wxPickerBase` for more info.","title":"wxPickerBase.setPickerCtrlProportion/2","ref":"wxPickerBase.html#setPickerCtrlProportion/2"},{"type":"function","doc":"","title":"wxPickerBase.setTextCtrlGrowable/1","ref":"wxPickerBase.html#setTextCtrlGrowable/1"},{"type":"function","doc":"Sets the text control as growable when `grow` is true.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.setTextCtrlGrowable/2","ref":"wxPickerBase.html#setTextCtrlGrowable/2"},{"type":"function","doc":"Sets the proportion value of the text control.\n\nLook at the detailed description of `m:wxPickerBase` for more info.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","title":"wxPickerBase.setTextCtrlProportion/2","ref":"wxPickerBase.html#setTextCtrlProportion/2"},{"type":"type","doc":"","title":"wxPickerBase.wxPickerBase/0","ref":"wxPickerBase.html#t:wxPickerBase/0"},{"type":"module","doc":"A `m:wxPopupWindow` which disappears automatically when the user clicks mouse outside it\nor if it loses focus in any other way.\n\nThis window can be useful for implementing custom combobox-like controls for example.\n\nSee: `m:wxPopupWindow`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPopupWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPopupTransientWindow](https://docs.wxwidgets.org/3.2/classwx_popup_transient_window.html)","title":"wxPopupTransientWindow","ref":"wxPopupTransientWindow.html"},{"type":"function","doc":"Destroys the object","title":"wxPopupTransientWindow.destroy/1","ref":"wxPopupTransientWindow.html#destroy/1"},{"type":"function","doc":"Hide the window.","title":"wxPopupTransientWindow.dismiss/1","ref":"wxPopupTransientWindow.html#dismiss/1"},{"type":"function","doc":"Default constructor.","title":"wxPopupTransientWindow.new/0","ref":"wxPopupTransientWindow.html#new/0"},{"type":"function","doc":"","title":"wxPopupTransientWindow.new/1","ref":"wxPopupTransientWindow.html#new/1"},{"type":"function","doc":"Constructor.","title":"wxPopupTransientWindow.new/2","ref":"wxPopupTransientWindow.html#new/2"},{"type":"function","doc":"","title":"wxPopupTransientWindow.popup/1","ref":"wxPopupTransientWindow.html#popup/1"},{"type":"function","doc":"Popup the window (this will show it too).\n\nIf `focus` is non-NULL, it will be kept focused while this window is shown if supported\nby the current platform, otherwise the popup itself will receive focus. In any case, the\npopup will disappear automatically if it loses focus because of a user action.\n\nSee: `dismiss/1`","title":"wxPopupTransientWindow.popup/2","ref":"wxPopupTransientWindow.html#popup/2"},{"type":"type","doc":"","title":"wxPopupTransientWindow.wxPopupTransientWindow/0","ref":"wxPopupTransientWindow.html#t:wxPopupTransientWindow/0"},{"type":"module","doc":"A special kind of top level window used for popup menus, combobox popups and such.","title":"wxPopupWindow","ref":"wxPopupWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxPU_CONTAINS_CONTROLS: By default in wxMSW, a popup window will not take focus from its\nparent window. However many standard controls, including common ones such as `m:wxTextCtrl`,\nneed focus to function correctly and will not work when placed on a default popup. This\nflag can be used to make the popup take focus and let all controls work but at the price\nof not allowing the parent window to keep focus while the popup is shown, which can also\nbe sometimes desirable. This style is currently only implemented in MSW and simply does\nnothing under the other platforms (it's new since wxWidgets 3.1.3).\n\nSee:\n* `m:wxDialog`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPopupWindow](https://docs.wxwidgets.org/3.2/classwx_popup_window.html)","title":"Styles - wxPopupWindow","ref":"wxPopupWindow.html#module-styles"},{"type":"function","doc":"","title":"wxPopupWindow.create/2","ref":"wxPopupWindow.html#create/2"},{"type":"function","doc":"Create method for two-step creation.","title":"wxPopupWindow.create/3","ref":"wxPopupWindow.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxPopupWindow.destroy/1","ref":"wxPopupWindow.html#destroy/1"},{"type":"function","doc":"Default constructor.","title":"wxPopupWindow.new/0","ref":"wxPopupWindow.html#new/0"},{"type":"function","doc":"","title":"wxPopupWindow.new/1","ref":"wxPopupWindow.html#new/1"},{"type":"function","doc":"Constructor.","title":"wxPopupWindow.new/2","ref":"wxPopupWindow.html#new/2"},{"type":"function","doc":"Move the popup window to the right position, i.e. such that it is entirely visible.\n\nThe popup is positioned at ptOrigin + size if it opens below and to the right (default),\nat ptOrigin - sizePopup if it opens above and to the left etc.","title":"wxPopupWindow.position/3","ref":"wxPopupWindow.html#position/3"},{"type":"type","doc":"","title":"wxPopupWindow.wxPopupWindow/0","ref":"wxPopupWindow.html#t:wxPopupWindow/0"},{"type":"module","doc":"This defines the wxWidgets Encapsulated PostScript device context, which can write\nPostScript files on any platform.\n\nSee `m:wxDC` for descriptions of the member functions.\n\nStarting a document\n\nDocument should be started with call to `wxDC:startDoc/2` prior to calling any function to execute a\ndrawing operation. However, some functions, like `wxDC:setFont/2`, may be legitimately called even before `wxDC:startDoc/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxPostScriptDC](https://docs.wxwidgets.org/3.2/classwx_post_script_d_c.html)","title":"wxPostScriptDC","ref":"wxPostScriptDC.html"},{"type":"function","doc":"Destroys the object","title":"wxPostScriptDC.destroy/1","ref":"wxPostScriptDC.html#destroy/1"},{"type":"function","doc":"","title":"wxPostScriptDC.new/0","ref":"wxPostScriptDC.html#new/0"},{"type":"function","doc":"Constructs a PostScript printer device context from a `m:wxPrintData` object.","title":"wxPostScriptDC.new/1","ref":"wxPostScriptDC.html#new/1"},{"type":"type","doc":"","title":"wxPostScriptDC.wxPostScriptDC/0","ref":"wxPostScriptDC.html#t:wxPostScriptDC/0"},{"type":"module","doc":"A preview canvas is the default canvas used by the print preview system to display the\npreview.\n\nSee:\n* `m:wxPreviewFrame`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewCanvas](https://docs.wxwidgets.org/3.2/classwx_preview_canvas.html)","title":"wxPreviewCanvas","ref":"wxPreviewCanvas.html"},{"type":"type","doc":"","title":"wxPreviewCanvas.wxPreviewCanvas/0","ref":"wxPreviewCanvas.html#t:wxPreviewCanvas/0"},{"type":"module","doc":"This is the default implementation of the preview control bar, a panel with buttons and a\nzoom control.\n\nYou can derive a new class from this and override some or all member functions to change\nthe behaviour and appearance; or you can leave it as it is.\n\nSee:\n* `m:wxPreviewFrame`\n\n* `m:wxPreviewCanvas`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewControlBar](https://docs.wxwidgets.org/3.2/classwx_preview_control_bar.html)","title":"wxPreviewControlBar","ref":"wxPreviewControlBar.html"},{"type":"function","doc":"Creates buttons, according to value of the button style flags.","title":"wxPreviewControlBar.createButtons/1","ref":"wxPreviewControlBar.html#createButtons/1"},{"type":"function","doc":"Destroys the object","title":"wxPreviewControlBar.destroy/1","ref":"wxPreviewControlBar.html#destroy/1"},{"type":"function","doc":"Gets the print preview object associated with the control bar.","title":"wxPreviewControlBar.getPrintPreview/1","ref":"wxPreviewControlBar.html#getPrintPreview/1"},{"type":"function","doc":"Gets the current zoom setting in percent.","title":"wxPreviewControlBar.getZoomControl/1","ref":"wxPreviewControlBar.html#getZoomControl/1"},{"type":"function","doc":"","title":"wxPreviewControlBar.new/3","ref":"wxPreviewControlBar.html#new/3"},{"type":"function","doc":"Constructor.\n\nThe `buttons` parameter may be a combination of the following, using the bitwise 'or' operator:\n\n* wxPREVIEW_PRINT: Create a print button.\n\n* wxPREVIEW_NEXT: Create a next page button.\n\n* wxPREVIEW_PREVIOUS: Create a previous page button.\n\n* wxPREVIEW_ZOOM: Create a zoom control.\n\n* wxPREVIEW_DEFAULT: Equivalent to a combination of `wxPREVIEW_PREVIOUS`, `wxPREVIEW_NEXT`\nand `wxPREVIEW_ZOOM`.","title":"wxPreviewControlBar.new/4","ref":"wxPreviewControlBar.html#new/4"},{"type":"function","doc":"Sets the zoom control.","title":"wxPreviewControlBar.setZoomControl/2","ref":"wxPreviewControlBar.html#setZoomControl/2"},{"type":"type","doc":"","title":"wxPreviewControlBar.wxPreviewControlBar/0","ref":"wxPreviewControlBar.html#t:wxPreviewControlBar/0"},{"type":"module","doc":"This class provides the default method of managing the print preview interface.\n\nMember functions may be overridden to replace functionality, or the class may be used\nwithout derivation.\n\nSee:\n* `m:wxPreviewCanvas`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewFrame](https://docs.wxwidgets.org/3.2/classwx_preview_frame.html)","title":"wxPreviewFrame","ref":"wxPreviewFrame.html"},{"type":"function","doc":"Creates a `m:wxPreviewCanvas`.\n\nOverride this function to allow a user-defined preview canvas object to be created.","title":"wxPreviewFrame.createCanvas/1","ref":"wxPreviewFrame.html#createCanvas/1"},{"type":"function","doc":"Creates a `m:wxPreviewControlBar`.\n\nOverride this function to allow a user-defined preview control bar object to be created.","title":"wxPreviewFrame.createControlBar/1","ref":"wxPreviewFrame.html#createControlBar/1"},{"type":"function","doc":"Destroys the object","title":"wxPreviewFrame.destroy/1","ref":"wxPreviewFrame.html#destroy/1"},{"type":"function","doc":"Initializes the frame elements and prepares for showing it.\n\nCalling this method is equivalent to calling `InitializeWithModality()` (not implemented\nin wx) with wxPreviewFrame_AppModal argument, please see its documentation for more details.\n\nPlease notice that this function is virtual mostly for backwards compatibility only,\nthere is no real need to override it as it's never called by wxWidgets itself.","title":"wxPreviewFrame.initialize/1","ref":"wxPreviewFrame.html#initialize/1"},{"type":"function","doc":"","title":"wxPreviewFrame.new/2","ref":"wxPreviewFrame.html#new/2"},{"type":"function","doc":"Constructor.\n\nPass a print preview object plus other normal frame arguments. The print preview object\nwill be destroyed by the frame when it closes.","title":"wxPreviewFrame.new/3","ref":"wxPreviewFrame.html#new/3"},{"type":"function","doc":"Enables any disabled frames in the application, and deletes the print preview object,\nimplicitly deleting any printout objects associated with the print preview object.","title":"wxPreviewFrame.onCloseWindow/2","ref":"wxPreviewFrame.html#onCloseWindow/2"},{"type":"type","doc":"","title":"wxPreviewFrame.wxPreviewFrame/0","ref":"wxPreviewFrame.html#t:wxPreviewFrame/0"},{"type":"module","doc":"This class holds a variety of information related to printers and printer device\ncontexts.\n\nThis class is used to create a `wxPrinterDC` (not implemented in wx) and a `m:wxPostScriptDC`.\nIt is also used as a data member of `m:wxPrintDialogData` and `m:wxPageSetupDialogData`,\nas part of the mechanism for transferring data between the print dialogs and the application.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialog`\n\n* `m:wxPrintDialogData`\n\n* `m:wxPageSetupDialogData`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\n* `m:wxPostScriptDC`\n\nwxWidgets docs: [wxPrintData](https://docs.wxwidgets.org/3.2/classwx_print_data.html)","title":"wxPrintData","ref":"wxPrintData.html"},{"type":"function","doc":"Destroys the object","title":"wxPrintData.destroy/1","ref":"wxPrintData.html#destroy/1"},{"type":"function","doc":"Returns the current bin (papersource).\n\nBy default, the system is left to select the bin (`wxPRINTBIN_DEFAULT` is returned).\n\nSee `setBin/2` for the full list of bin values.","title":"wxPrintData.getBin/1","ref":"wxPrintData.html#getBin/1"},{"type":"function","doc":"Returns true if collation is on.","title":"wxPrintData.getCollate/1","ref":"wxPrintData.html#getCollate/1"},{"type":"function","doc":"Returns true if colour printing is on.","title":"wxPrintData.getColour/1","ref":"wxPrintData.html#getColour/1"},{"type":"function","doc":"Returns the duplex mode.\n\nOne of wxDUPLEX_SIMPLEX, wxDUPLEX_HORIZONTAL, wxDUPLEX_VERTICAL.","title":"wxPrintData.getDuplex/1","ref":"wxPrintData.html#getDuplex/1"},{"type":"function","doc":"Returns the number of copies requested by the user.","title":"wxPrintData.getNoCopies/1","ref":"wxPrintData.html#getNoCopies/1"},{"type":"function","doc":"Gets the orientation.\n\nThis can be wxLANDSCAPE or wxPORTRAIT.","title":"wxPrintData.getOrientation/1","ref":"wxPrintData.html#getOrientation/1"},{"type":"function","doc":"Returns the paper size id.\n\nSee: `setPaperId/2`","title":"wxPrintData.getPaperId/1","ref":"wxPrintData.html#getPaperId/1"},{"type":"function","doc":"Returns the printer name.\n\nIf the printer name is the empty string, it indicates that the default printer should be\nused.","title":"wxPrintData.getPrinterName/1","ref":"wxPrintData.html#getPrinterName/1"},{"type":"function","doc":"Returns the current print quality.\n\nThis can be a positive integer, denoting the number of dots per inch, or one of the\nfollowing identifiers:\n\n* wxPRINT_QUALITY_HIGH\n\n* wxPRINT_QUALITY_MEDIUM\n\n* wxPRINT_QUALITY_LOW\n\n* wxPRINT_QUALITY_DRAFT\n\nOn input you should pass one of these identifiers, but on return you may get back a\npositive integer indicating the current resolution setting.","title":"wxPrintData.getQuality/1","ref":"wxPrintData.html#getQuality/1"},{"type":"function","doc":"Returns true if the print data is valid for using in print dialogs.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","title":"wxPrintData.isOk/1","ref":"wxPrintData.html#isOk/1"},{"type":"function","doc":"Default constructor.","title":"wxPrintData.new/0","ref":"wxPrintData.html#new/0"},{"type":"function","doc":"Copy constructor.","title":"wxPrintData.new/1","ref":"wxPrintData.html#new/1"},{"type":"function","doc":"Sets the current bin.","title":"wxPrintData.setBin/2","ref":"wxPrintData.html#setBin/2"},{"type":"function","doc":"Sets collation to on or off.","title":"wxPrintData.setCollate/2","ref":"wxPrintData.html#setCollate/2"},{"type":"function","doc":"Sets colour printing on or off.","title":"wxPrintData.setColour/2","ref":"wxPrintData.html#setColour/2"},{"type":"function","doc":"Returns the duplex mode.\n\nOne of wxDUPLEX_SIMPLEX, wxDUPLEX_HORIZONTAL, wxDUPLEX_VERTICAL.","title":"wxPrintData.setDuplex/2","ref":"wxPrintData.html#setDuplex/2"},{"type":"function","doc":"Sets the default number of copies to be printed out.","title":"wxPrintData.setNoCopies/2","ref":"wxPrintData.html#setNoCopies/2"},{"type":"function","doc":"Sets the orientation.\n\nThis can be wxLANDSCAPE or wxPORTRAIT.","title":"wxPrintData.setOrientation/2","ref":"wxPrintData.html#setOrientation/2"},{"type":"function","doc":"Sets the paper id.\n\nThis indicates the type of paper to be used. For a mapping between paper id, paper size\nand string name, see wxPrintPaperDatabase in `\"paper.h\"` (not yet documented).","title":"wxPrintData.setPaperId/2","ref":"wxPrintData.html#setPaperId/2"},{"type":"function","doc":"Sets the printer name.\n\nThis can be the empty string to indicate that the default printer should be used.","title":"wxPrintData.setPrinterName/2","ref":"wxPrintData.html#setPrinterName/2"},{"type":"function","doc":"Sets the desired print quality.\n\nThis can be a positive integer, denoting the number of dots per inch, or one of the\nfollowing identifiers:\n\n* wxPRINT_QUALITY_HIGH\n\n* wxPRINT_QUALITY_MEDIUM\n\n* wxPRINT_QUALITY_LOW\n\n* wxPRINT_QUALITY_DRAFT\n\nOn input you should pass one of these identifiers, but on return you may get back a\npositive integer indicating the current resolution setting.","title":"wxPrintData.setQuality/2","ref":"wxPrintData.html#setQuality/2"},{"type":"type","doc":"","title":"wxPrintData.wxPrintData/0","ref":"wxPrintData.html#t:wxPrintData/0"},{"type":"module","doc":"This class represents the print and print setup common dialogs.\n\nYou may obtain a `wxPrinterDC` (not implemented in wx) device context from a successfully\ndismissed print dialog.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPrintDialog](https://docs.wxwidgets.org/3.2/classwx_print_dialog.html)","title":"wxPrintDialog","ref":"wxPrintDialog.html"},{"type":"function","doc":"Destroys the object","title":"wxPrintDialog.destroy/1","ref":"wxPrintDialog.html#destroy/1"},{"type":"function","doc":"Returns the device context created by the print dialog, if any.\n\nWhen this function has been called, the ownership of the device context is transferred to\nthe application, so it must then be deleted explicitly.","title":"wxPrintDialog.getPrintDC/1","ref":"wxPrintDialog.html#getPrintDC/1"},{"type":"function","doc":"Returns the print dialog data associated with the print dialog.","title":"wxPrintDialog.getPrintDialogData/1","ref":"wxPrintDialog.html#getPrintDialogData/1"},{"type":"function","doc":"","title":"wxPrintDialog.new/1","ref":"wxPrintDialog.html#new/1"},{"type":"function","doc":"","title":"wxPrintDialog.new/2","ref":"wxPrintDialog.html#new/2"},{"type":"type","doc":"","title":"wxPrintDialog.wxPrintDialog/0","ref":"wxPrintDialog.html#t:wxPrintDialog/0"},{"type":"module","doc":"This class holds information related to the visual characteristics of `m:wxPrintDialog`.\n\nIt contains a `m:wxPrintData` object with underlying printing settings.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\nwxWidgets docs: [wxPrintDialogData](https://docs.wxwidgets.org/3.2/classwx_print_dialog_data.html)","title":"wxPrintDialogData","ref":"wxPrintDialogData.html"},{"type":"function","doc":"Destroys the object","title":"wxPrintDialogData.destroy/1","ref":"wxPrintDialogData.html#destroy/1"},{"type":"function","doc":"Enables or disables the \"Help\" button.","title":"wxPrintDialogData.enableHelp/2","ref":"wxPrintDialogData.html#enableHelp/2"},{"type":"function","doc":"Enables or disables the \"Page numbers\" controls.","title":"wxPrintDialogData.enablePageNumbers/2","ref":"wxPrintDialogData.html#enablePageNumbers/2"},{"type":"function","doc":"Enables or disables the \"Print to file\" checkbox.","title":"wxPrintDialogData.enablePrintToFile/2","ref":"wxPrintDialogData.html#enablePrintToFile/2"},{"type":"function","doc":"Enables or disables the \"Selection\" radio button.","title":"wxPrintDialogData.enableSelection/2","ref":"wxPrintDialogData.html#enableSelection/2"},{"type":"function","doc":"Returns true if the user requested that all pages be printed.","title":"wxPrintDialogData.getAllPages/1","ref":"wxPrintDialogData.html#getAllPages/1"},{"type":"function","doc":"Returns true if the user requested that the document(s) be collated.","title":"wxPrintDialogData.getCollate/1","ref":"wxPrintDialogData.html#getCollate/1"},{"type":"function","doc":"Returns the `from` page number, as entered by the user.","title":"wxPrintDialogData.getFromPage/1","ref":"wxPrintDialogData.html#getFromPage/1"},{"type":"function","doc":"Returns the `maximum` page number.","title":"wxPrintDialogData.getMaxPage/1","ref":"wxPrintDialogData.html#getMaxPage/1"},{"type":"function","doc":"Returns the `minimum` page number.","title":"wxPrintDialogData.getMinPage/1","ref":"wxPrintDialogData.html#getMinPage/1"},{"type":"function","doc":"Returns the number of copies requested by the user.","title":"wxPrintDialogData.getNoCopies/1","ref":"wxPrintDialogData.html#getNoCopies/1"},{"type":"function","doc":"Returns a reference to the internal `m:wxPrintData` object.","title":"wxPrintDialogData.getPrintData/1","ref":"wxPrintDialogData.html#getPrintData/1"},{"type":"function","doc":"Returns true if the user has selected printing to a file.","title":"wxPrintDialogData.getPrintToFile/1","ref":"wxPrintDialogData.html#getPrintToFile/1"},{"type":"function","doc":"Returns true if the user requested that the selection be printed (where \"selection\" is a\nconcept specific to the application).","title":"wxPrintDialogData.getSelection/1","ref":"wxPrintDialogData.html#getSelection/1"},{"type":"function","doc":"Returns the `\"print to\"` page number, as entered by the user.","title":"wxPrintDialogData.getToPage/1","ref":"wxPrintDialogData.html#getToPage/1"},{"type":"function","doc":"Returns true if the print data is valid for using in print dialogs.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","title":"wxPrintDialogData.isOk/1","ref":"wxPrintDialogData.html#isOk/1"},{"type":"function","doc":"Default constructor.","title":"wxPrintDialogData.new/0","ref":"wxPrintDialogData.html#new/0"},{"type":"function","doc":"Copy constructor.","title":"wxPrintDialogData.new/1","ref":"wxPrintDialogData.html#new/1"},{"type":"function","doc":"Sets the \"Collate\" checkbox to true or false.","title":"wxPrintDialogData.setCollate/2","ref":"wxPrintDialogData.html#setCollate/2"},{"type":"function","doc":"Sets the `from` page number.","title":"wxPrintDialogData.setFromPage/2","ref":"wxPrintDialogData.html#setFromPage/2"},{"type":"function","doc":"Sets the `maximum` page number.","title":"wxPrintDialogData.setMaxPage/2","ref":"wxPrintDialogData.html#setMaxPage/2"},{"type":"function","doc":"Sets the `minimum` page number.","title":"wxPrintDialogData.setMinPage/2","ref":"wxPrintDialogData.html#setMinPage/2"},{"type":"function","doc":"Sets the default number of copies the user has requested to be printed out.","title":"wxPrintDialogData.setNoCopies/2","ref":"wxPrintDialogData.html#setNoCopies/2"},{"type":"function","doc":"Sets the internal `m:wxPrintData`.","title":"wxPrintDialogData.setPrintData/2","ref":"wxPrintDialogData.html#setPrintData/2"},{"type":"function","doc":"Sets the \"Print to file\" checkbox to true or false.","title":"wxPrintDialogData.setPrintToFile/2","ref":"wxPrintDialogData.html#setPrintToFile/2"},{"type":"function","doc":"Selects the \"Selection\" radio button.\n\nThe effect of printing the selection depends on how the application implements this\ncommand, if at all.","title":"wxPrintDialogData.setSelection/2","ref":"wxPrintDialogData.html#setSelection/2"},{"type":"function","doc":"Sets the `\"print to\"` page number.","title":"wxPrintDialogData.setToPage/2","ref":"wxPrintDialogData.html#setToPage/2"},{"type":"type","doc":"","title":"wxPrintDialogData.wxPrintDialogData/0","ref":"wxPrintDialogData.html#t:wxPrintDialogData/0"},{"type":"module","doc":"Objects of this class manage the print preview process.\n\nThe object is passed a `m:wxPrintout` object, and the `m:wxPrintPreview` object itself is\npassed to a `m:wxPreviewFrame` object. Previewing is started by initializing and showing\nthe preview frame. Unlike `wxPrinter:print/4`, flow of control returns to the application immediately after\nthe frame is shown.\n\nNote: The preview shown is only exact on Windows. On other platforms, the `m:wxDC` used\nfor preview is different from what is used for printing and the results may be\nsignificantly different, depending on how is the output created. In particular, printing\ncode relying on `wxDC:getTextExtent/3` heavily (for example, `m:wxHtmlEasyPrinting` and other wxHTML classes do)\nis affected. It is recommended to use native preview functionality on platforms that offer\nit (macOS, GTK+).\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPrintout`\n\n* `m:wxPrinter`\n\n* `m:wxPreviewCanvas`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPreviewFrame`\n\nwxWidgets docs: [wxPrintPreview](https://docs.wxwidgets.org/3.2/classwx_print_preview.html)","title":"wxPrintPreview","ref":"wxPrintPreview.html"},{"type":"function","doc":"Destroys the object","title":"wxPrintPreview.destroy/1","ref":"wxPrintPreview.html#destroy/1"},{"type":"function","doc":"Gets the preview window used for displaying the print preview image.","title":"wxPrintPreview.getCanvas/1","ref":"wxPrintPreview.html#getCanvas/1"},{"type":"function","doc":"Gets the page currently being previewed.","title":"wxPrintPreview.getCurrentPage/1","ref":"wxPrintPreview.html#getCurrentPage/1"},{"type":"function","doc":"Gets the frame used for displaying the print preview canvas and control bar.","title":"wxPrintPreview.getFrame/1","ref":"wxPrintPreview.html#getFrame/1"},{"type":"function","doc":"Returns the maximum page number.","title":"wxPrintPreview.getMaxPage/1","ref":"wxPrintPreview.html#getMaxPage/1"},{"type":"function","doc":"Returns the minimum page number.","title":"wxPrintPreview.getMinPage/1","ref":"wxPrintPreview.html#getMinPage/1"},{"type":"function","doc":"Gets the preview printout object associated with the `m:wxPrintPreview` object.","title":"wxPrintPreview.getPrintout/1","ref":"wxPrintPreview.html#getPrintout/1"},{"type":"function","doc":"Gets the printout object to be used for printing from within the preview interface, or\nNULL if none exists.","title":"wxPrintPreview.getPrintoutForPrinting/1","ref":"wxPrintPreview.html#getPrintoutForPrinting/1"},{"type":"function","doc":"Returns true if the `m:wxPrintPreview` is valid, false otherwise.\n\nIt could return false if there was a problem initializing the printer device context\n(current printer not set, for example).","title":"wxPrintPreview.isOk/1","ref":"wxPrintPreview.html#isOk/1"},{"type":"function","doc":"","title":"wxPrintPreview.new/1","ref":"wxPrintPreview.html#new/1"},{"type":"function","doc":"Constructor.\n\nPass a printout object, an optional printout object to be used for actual printing, and\nthe address of an optional block of printer data, which will be copied to the print\npreview object's print data.\n\nIf `printoutForPrinting` is non-NULL, a `\"Print...\"` button will be placed on the preview\nframe so that the user can print directly from the preview interface.\n\nRemark: Do not explicitly delete the printout objects once this constructor has been\ncalled, since they will be deleted in the `m:wxPrintPreview` destructor. The same does not\napply to the `data` argument.\n\nUse `isOk/1` to check whether the `m:wxPrintPreview` object was created correctly.","title":"wxPrintPreview.new/2","ref":"wxPrintPreview.html#new/2"},{"type":"function","doc":"","title":"wxPrintPreview.new/3","ref":"wxPrintPreview.html#new/3"},{"type":"function","doc":"This refreshes the preview window with the preview image.\n\nIt must be called from the preview window's OnPaint member.\n\nThe implementation simply blits the preview bitmap onto the canvas, creating a new\npreview bitmap if none exists.","title":"wxPrintPreview.paintPage/3","ref":"wxPrintPreview.html#paintPage/3"},{"type":"function","doc":"Invokes the print process using the second `m:wxPrintout` object supplied in the `m:wxPrintPreview`\nconstructor.\n\nWill normally be called by the `Print`... panel item on the preview frame's control bar.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","title":"wxPrintPreview.print/2","ref":"wxPrintPreview.html#print/2"},{"type":"function","doc":"Renders a page into a `m:wxMemoryDC`.\n\nUsed internally by `m:wxPrintPreview`.","title":"wxPrintPreview.renderPage/2","ref":"wxPrintPreview.html#renderPage/2"},{"type":"function","doc":"Sets the window to be used for displaying the print preview image.","title":"wxPrintPreview.setCanvas/2","ref":"wxPrintPreview.html#setCanvas/2"},{"type":"function","doc":"Sets the current page to be previewed.","title":"wxPrintPreview.setCurrentPage/2","ref":"wxPrintPreview.html#setCurrentPage/2"},{"type":"function","doc":"Sets the frame to be used for displaying the print preview canvas and control bar.","title":"wxPrintPreview.setFrame/2","ref":"wxPrintPreview.html#setFrame/2"},{"type":"function","doc":"Associates a printout object with the `m:wxPrintPreview` object.","title":"wxPrintPreview.setPrintout/2","ref":"wxPrintPreview.html#setPrintout/2"},{"type":"function","doc":"Sets the percentage preview zoom, and refreshes the preview canvas accordingly.","title":"wxPrintPreview.setZoom/2","ref":"wxPrintPreview.html#setZoom/2"},{"type":"type","doc":"","title":"wxPrintPreview.wxPrintPreview/0","ref":"wxPrintPreview.html#t:wxPrintPreview/0"},{"type":"module","doc":"This class represents the Windows or PostScript printer, and is the vehicle through which\nprinting may be launched by an application.\n\nPrinting can also be achieved through using of lower functions and classes, but this and\nassociated classes provide a more convenient and general method of printing.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPrintout`\n\n* `m:wxPrintPreview`\n\nwxWidgets docs: [wxPrinter](https://docs.wxwidgets.org/3.2/classwx_printer.html)","title":"wxPrinter","ref":"wxPrinter.html"},{"type":"function","doc":"Creates the default printing abort window, with a cancel button.","title":"wxPrinter.createAbortWindow/3","ref":"wxPrinter.html#createAbortWindow/3"},{"type":"function","doc":"Destroys the object","title":"wxPrinter.destroy/1","ref":"wxPrinter.html#destroy/1"},{"type":"function","doc":"Returns true if the user has aborted the print job.","title":"wxPrinter.getAbort/1","ref":"wxPrinter.html#getAbort/1"},{"type":"function","doc":"Return last error.\n\nValid after calling `print/4`, `printDialog/2` or `wxPrintPreview:print/2`.\n\nThese functions set last error to `wxPRINTER_NO_ERROR` if no error happened.\n\nReturned value is one of the following:","title":"wxPrinter.getLastError/0","ref":"wxPrinter.html#getLastError/0"},{"type":"function","doc":"Returns the print data associated with the printer object.","title":"wxPrinter.getPrintDialogData/1","ref":"wxPrinter.html#getPrintDialogData/1"},{"type":"function","doc":"","title":"wxPrinter.new/0","ref":"wxPrinter.html#new/0"},{"type":"function","doc":"Constructor.\n\nPass an optional pointer to a block of print dialog data, which will be copied to the\nprinter object's local data.\n\nSee:\n* `m:wxPrintDialogData`\n\n* `m:wxPrintData`","title":"wxPrinter.new/1","ref":"wxPrinter.html#new/1"},{"type":"function","doc":"","title":"wxPrinter.print/3","ref":"wxPrinter.html#print/3"},{"type":"function","doc":"Starts the printing process.\n\nProvide a parent window, a user-defined `m:wxPrintout` object which controls the printing\nof a document, and whether the print dialog should be invoked first.\n\n`print/4` could return false if there was a problem initializing the printer device context\n(current printer not set, for example) or the user cancelled printing. Call `getLastError/0` to get\ndetailed information about the kind of the error.","title":"wxPrinter.print/4","ref":"wxPrinter.html#print/4"},{"type":"function","doc":"Invokes the print dialog.\n\nIf successful (the user did not press Cancel and no error occurred), a suitable device\ncontext will be returned; otherwise NULL is returned; call `getLastError/0` to get detailed information\nabout the kind of the error.\n\nRemark: The application must delete this device context to avoid a memory leak.","title":"wxPrinter.printDialog/2","ref":"wxPrinter.html#printDialog/2"},{"type":"function","doc":"Default error-reporting function.","title":"wxPrinter.reportError/4","ref":"wxPrinter.html#reportError/4"},{"type":"function","doc":"Invokes the print setup dialog.\n\nDeprecated:\n\nThe setup dialog is obsolete, though retained for backward compatibility.","title":"wxPrinter.setup/2","ref":"wxPrinter.html#setup/2"},{"type":"type","doc":"","title":"wxPrinter.wxPrinter/0","ref":"wxPrinter.html#t:wxPrinter/0"},{"type":"module","doc":"This class encapsulates the functionality of printing out an application document.\n\nA new class must be derived and members overridden to respond to calls such as `OnPrintPage()`\n(not implemented in wx) and `HasPage()` (not implemented in wx) and to render the print\nimage onto an associated `m:wxDC`. Instances of this class are passed to `wxPrinter:print/4` or to a `m:wxPrintPreview`\nobject to initiate printing or previewing.\n\nYour derived `m:wxPrintout` is responsible for drawing both the preview image and the\nprinted page. If your windows' drawing routines accept an arbitrary DC as an argument, you\ncan re-use those routines within your `m:wxPrintout` subclass to draw the printout image.\nYou may also add additional drawing elements within your `m:wxPrintout` subclass, like\nheaders, footers, and/or page numbers. However, the image on the printed page will often\ndiffer from the image drawn on the screen, as will the print preview image - not just in\nthe presence of headers and footers, but typically in scale. A high-resolution printer\npresents a much larger drawing surface (i.e., a higher-resolution DC); a zoomed-out\npreview image presents a much smaller drawing surface (lower-resolution DC). By using the\nroutines FitThisSizeToXXX() and/or MapScreenSizeToXXX() within your `m:wxPrintout`\nsubclass to set the user scale and origin of the associated DC, you can easily use a\nsingle drawing routine to draw on your application's windows, to create the print preview\nimage, and to create the printed paper image, and achieve a common appearance to the\npreview image and the printed page.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialog`\n\n* `m:wxPrinter`\n\n* `m:wxPrintPreview`\n\nwxWidgets docs: [wxPrintout](https://docs.wxwidgets.org/3.2/classwx_printout.html)","title":"wxPrintout","ref":"wxPrintout.html"},{"type":"function","doc":"Destroys the object","title":"wxPrintout.destroy/1","ref":"wxPrintout.html#destroy/1"},{"type":"function","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the page rectangle and the origin is at\nthe top left corner of the page rectangle.\n\nOn MSW and Mac, the page rectangle is the printable area of the page. On other platforms\nand PostScript printing, the page rectangle is the entire paper.\n\nUse this if you want your printed image as large as possible, but with the caveat that on\nsome platforms, portions of the image might be cut off at the edges.","title":"wxPrintout.fitThisSizeToPage/2","ref":"wxPrintout.html#fitThisSizeToPage/2"},{"type":"function","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the page margins set in the given `m:wxPageSetupDialogData`\nobject.\n\nThis function provides the greatest consistency across all platforms because it does not\ndepend on having access to the printable area of the paper.\n\nRemark: On Mac, the native `m:wxPageSetupDialog` does not let you set the page margins;\nyou'll have to provide your own mechanism, or you can use the Mac-only class\nwxMacPageMarginsDialog.","title":"wxPrintout.fitThisSizeToPageMargins/3","ref":"wxPrintout.html#fitThisSizeToPageMargins/3"},{"type":"function","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the paper and the origin is at the top\nleft corner of the paper.\n\nUse this if you're managing your own page margins.\n\nNote: With most printers, the region around the edges of the paper are not printable so\nthat the edges of the image could be cut off.","title":"wxPrintout.fitThisSizeToPaper/2","ref":"wxPrintout.html#fitThisSizeToPaper/2"},{"type":"function","doc":"Returns the device context associated with the printout (given to the printout at start\nof printing or previewing).\n\nThe application can use `getDC/1` to obtain a device context to draw on.\n\nThis will be a `wxPrinterDC` (not implemented in wx) if printing under Windows or Mac, a `m:wxPostScriptDC`\nif printing on other platforms, and a `m:wxMemoryDC` if previewing.","title":"wxPrintout.getDC/1","ref":"wxPrintout.html#getDC/1"},{"type":"function","doc":"Return the rectangle corresponding to the page margins specified by the given `m:wxPageSetupDialogData`\nobject in the associated `m:wxDC`'s logical coordinates for the current user scale and\ndevice origin.\n\nThe page margins are specified with respect to the edges of the paper on all platforms.","title":"wxPrintout.getLogicalPageMarginsRect/2","ref":"wxPrintout.html#getLogicalPageMarginsRect/2"},{"type":"function","doc":"Return the rectangle corresponding to the page in the associated `m:wxDC` 's logical\ncoordinates for the current user scale and device origin.\n\nOn MSW and Mac, this will be the printable area of the paper. On other platforms and\nPostScript printing, this will be the full paper rectangle.","title":"wxPrintout.getLogicalPageRect/1","ref":"wxPrintout.html#getLogicalPageRect/1"},{"type":"function","doc":"Return the rectangle corresponding to the paper in the associated `m:wxDC` 's logical\ncoordinates for the current user scale and device origin.","title":"wxPrintout.getLogicalPaperRect/1","ref":"wxPrintout.html#getLogicalPaperRect/1"},{"type":"function","doc":"Returns the size of the printer page in millimetres.","title":"wxPrintout.getPageSizeMM/1","ref":"wxPrintout.html#getPageSizeMM/1"},{"type":"function","doc":"Returns the size of the printer page in pixels, called the page rectangle.\n\nThe page rectangle has a top left corner at (0,0) and a bottom right corner at (w,h).\nThese values may not be the same as the values returned from `wxDC:getSize/1`;if the printout is being\nused for previewing, a memory device context is used, which uses a bitmap size reflecting\nthe current preview zoom. The application must take this discrepancy into account if\npreviewing is to be supported.","title":"wxPrintout.getPageSizePixels/1","ref":"wxPrintout.html#getPageSizePixels/1"},{"type":"function","doc":"Returns the rectangle that corresponds to the entire paper in pixels, called the paper\nrectangle.\n\nThis distinction between paper rectangle and page rectangle reflects the fact that most\nprinters cannot print all the way to the edge of the paper. The page rectangle is a\nrectangle whose top left corner is at (0,0) and whose width and height are given by wxDC::GetPageSizePixels().\n\nOn MSW and Mac, the page rectangle gives the printable area of the paper, while the paper\nrectangle represents the entire paper, including non-printable borders. Thus, the\nrectangle returned by wxDC::GetPaperRectPixels() will have a top left corner whose\ncoordinates are small negative numbers and the bottom right corner will have values\nsomewhat larger than the width and height given by wxDC::GetPageSizePixels().\n\nOn other platforms and for PostScript printing, the paper is treated as if its entire\narea were printable, so this function will return the same rectangle as the page\nrectangle.","title":"wxPrintout.getPaperRectPixels/1","ref":"wxPrintout.html#getPaperRectPixels/1"},{"type":"function","doc":"Returns the number of pixels per logical inch of the printer device context.\n\nDividing the printer PPI by the screen PPI can give a suitable scaling factor for drawing\ntext onto the printer.\n\nRemember to multiply this by a scaling factor to take the preview DC size into account.\nOr you can just use the FitThisSizeToXXX() and MapScreenSizeToXXX routines below, which do\nmost of the scaling calculations for you.","title":"wxPrintout.getPPIPrinter/1","ref":"wxPrintout.html#getPPIPrinter/1"},{"type":"function","doc":"Returns the number of pixels per logical inch of the screen device context.\n\nDividing the printer PPI by the screen PPI can give a suitable scaling factor for drawing\ntext onto the printer.\n\nIf you are doing your own scaling, remember to multiply this by a scaling factor to take\nthe preview DC size into account.","title":"wxPrintout.getPPIScreen/1","ref":"wxPrintout.html#getPPIScreen/1"},{"type":"function","doc":"Returns the title of the printout.","title":"wxPrintout.getTitle/1","ref":"wxPrintout.html#getTitle/1"},{"type":"function","doc":"Returns true if the printout is currently being used for previewing.","title":"wxPrintout.isPreview/1","ref":"wxPrintout.html#isPreview/1"},{"type":"function","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that one screen pixel maps to one device pixel on the DC.\n\nThat is, the user scale is set to (1,1) and the device origin is set to (0,0).\n\nUse this if you want to do your own scaling prior to calling `m:wxDC` drawing calls, for\nexample, if your underlying model is floating-point and you want to achieve maximum\ndrawing precision on high-resolution printers.\n\nYou can use the GetLogicalXXXRect() routines below to obtain the paper rectangle, page\nrectangle, or page margins rectangle to perform your own scaling.\n\nNote: While the underlying drawing model of macOS is floating-point, wxWidgets's drawing\nmodel scales from integer coordinates.","title":"wxPrintout.mapScreenSizeToDevice/1","ref":"wxPrintout.html#mapScreenSizeToDevice/1"},{"type":"function","doc":"This sets the user scale of the `m:wxDC` associated with this `m:wxPrintout` to the same\nscale as `mapScreenSizeToPaper/1` but sets the logical origin to the top left corner of\nthe page rectangle.","title":"wxPrintout.mapScreenSizeToPage/1","ref":"wxPrintout.html#mapScreenSizeToPage/1"},{"type":"function","doc":"This sets the user scale of the `m:wxDC` associated with this `m:wxPrintout` to the same\nscale as `mapScreenSizeToPageMargins/2` but sets the logical origin to the top left corner\nof the page margins specified by the given `m:wxPageSetupDialogData` object.","title":"wxPrintout.mapScreenSizeToPageMargins/2","ref":"wxPrintout.html#mapScreenSizeToPageMargins/2"},{"type":"function","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the printed page matches the screen size as closely as possible and the logical\norigin is in the top left corner of the paper rectangle.\n\nThat is, a 100-pixel object on screen should appear at the same size on the printed page.\n(It will, of course, be larger or smaller in the preview image, depending on the zoom factor.)\n\nUse this if you want WYSIWYG behaviour, e.g., in a text editor.","title":"wxPrintout.mapScreenSizeToPaper/1","ref":"wxPrintout.html#mapScreenSizeToPaper/1"},{"type":"function","doc":"","title":"wxPrintout.new/2","ref":"wxPrintout.html#new/2"},{"type":"function","doc":"Constructor.\n\nCreates a `m:wxPrintout` object with a callback fun and optionally other\ncallback funs. The `This` argument is the `m:wxPrintout` object reference to\nthis object\n\nNotice: The callbacks may not call other processes.","title":"wxPrintout.new/3","ref":"wxPrintout.html#new/3"},{"type":"function","doc":"Shift the device origin by an amount specified in logical coordinates.","title":"wxPrintout.offsetLogicalOrigin/3","ref":"wxPrintout.html#offsetLogicalOrigin/3"},{"type":"function","doc":"Set the device origin of the associated `m:wxDC` so that the current logical point\nbecomes the new logical origin.","title":"wxPrintout.setLogicalOrigin/3","ref":"wxPrintout.html#setLogicalOrigin/3"},{"type":"type","doc":"","title":"wxPrintout.wxPrintout/0","ref":"wxPrintout.html#t:wxPrintout/0"},{"type":"module","doc":"If supported by the platform this class will provide the platform's native progress\ndialog, else it will simply be the `wxGenericProgressDialog` (not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxProgressDialog](https://docs.wxwidgets.org/3.2/classwx_progress_dialog.html)","title":"wxProgressDialog","ref":"wxProgressDialog.html"},{"type":"function","doc":"Destroys the object","title":"wxProgressDialog.destroy/1","ref":"wxProgressDialog.html#destroy/1"},{"type":"function","doc":"","title":"wxProgressDialog.new/2","ref":"wxProgressDialog.html#new/2"},{"type":"function","doc":"","title":"wxProgressDialog.new/3","ref":"wxProgressDialog.html#new/3"},{"type":"function","doc":"Can be used to continue with the dialog, after the user had clicked the \"Abort\" button.","title":"wxProgressDialog.resume/1","ref":"wxProgressDialog.html#resume/1"},{"type":"function","doc":"","title":"wxProgressDialog.update/2","ref":"wxProgressDialog.html#update/2"},{"type":"function","doc":"Updates the dialog, setting the progress bar to the new value and updating the message if\nnew one is specified.\n\nReturns true unless the \"Cancel\" button has been pressed.\n\nIf false is returned, the application can either immediately destroy the dialog or ask\nthe user for the confirmation and if the abort is not confirmed the dialog may be resumed\nwith `resume/1` function.\n\nIf `value` is the maximum value for the dialog, the behaviour of the function depends on\nwhether `wxPD_AUTO_HIDE` was used when the dialog was created. If it was, the dialog is\nhidden and the function returns immediately. If it was not, the dialog becomes a modal\ndialog and waits for the user to dismiss it, meaning that this function does not return\nuntil this happens.\n\nNotice that if `newmsg` is longer than the currently shown message, the dialog will be\nautomatically made wider to account for it. However if the new message is shorter than the\nprevious one, the dialog doesn't shrink back to avoid constant resizes if the message is\nchanged often. To do this and fit the dialog to its current contents you may call `wxWindow:fit/1`\nexplicitly. However the native MSW implementation of this class does make the dialog\nshorter if the new text has fewer lines of text than the old one, so it is recommended to\nkeep the number of lines of text constant in order to avoid jarring dialog size changes.\nYou may also want to make the initial message, specified when creating the dialog, wide\nenough to avoid having to resize the dialog later, e.g. by appending a long string of\nunbreakable spaces (`wxString` (not implemented in wx)(L'\\u00a0', 100)) to it.","title":"wxProgressDialog.update/3","ref":"wxProgressDialog.html#update/3"},{"type":"type","doc":"","title":"wxProgressDialog.wxProgressDialog/0","ref":"wxProgressDialog.html#t:wxProgressDialog/0"},{"type":"module","doc":"Functions for wxQueryNewPaletteEvent class\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxQueryNewPaletteEvent](https://docs.wxwidgets.org/3.2/classwx_query_new_palette_event.html)","title":"wxQueryNewPaletteEvent","ref":"wxQueryNewPaletteEvent.html"},{"type":"function","doc":"","title":"wxQueryNewPaletteEvent.getPaletteRealized/1","ref":"wxQueryNewPaletteEvent.html#getPaletteRealized/1"},{"type":"function","doc":"","title":"wxQueryNewPaletteEvent.setPaletteRealized/2","ref":"wxQueryNewPaletteEvent.html#setPaletteRealized/2"},{"type":"type","doc":"","title":"wxQueryNewPaletteEvent.wxQueryNewPalette/0","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPalette/0"},{"type":"type","doc":"","title":"wxQueryNewPaletteEvent.wxQueryNewPaletteEvent/0","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPaletteEvent/0"},{"type":"type","doc":"","title":"wxQueryNewPaletteEvent.wxQueryNewPaletteEventType/0","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPaletteEventType/0"},{"type":"module","doc":"A radio box item is used to select one of number of mutually exclusive choices.\n\nIt is displayed as a vertical column or horizontal row of labelled buttons.","title":"wxRadioBox","ref":"wxRadioBox.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxRA_SPECIFY_ROWS: The major dimension parameter refers to the maximum number of rows.\n\n* wxRA_SPECIFY_COLS: The major dimension parameter refers to the maximum number of columns.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxRadioButton`\n\n* `m:wxCheckBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxRadioBox](https://docs.wxwidgets.org/3.2/classwx_radio_box.html)","title":"Styles - wxRadioBox","ref":"wxRadioBox.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_radiobox_selected`](`m:wxCommandEvent`)","title":"Events - wxRadioBox","ref":"wxRadioBox.html#module-events"},{"type":"function","doc":"","title":"wxRadioBox.create/7","ref":"wxRadioBox.html#create/7"},{"type":"function","doc":"Creates the radiobox for two-step construction.\n\nSee `new/7` for further details.","title":"wxRadioBox.create/8","ref":"wxRadioBox.html#create/8"},{"type":"function","doc":"Destroys the object","title":"wxRadioBox.destroy/1","ref":"wxRadioBox.html#destroy/1"},{"type":"function","doc":"","title":"wxRadioBox.enable/1","ref":"wxRadioBox.html#enable/1"},{"type":"function","doc":"Enables or disables the radiobox.\n\nSee: `wxWindow:enable/2`","title":"wxRadioBox.enable/2","ref":"wxRadioBox.html#enable/2"},{"type":"function","doc":"Enables or disables an individual button in the radiobox.\n\nSee: `wxWindow:enable/2`","title":"wxRadioBox.enable/3","ref":"wxRadioBox.html#enable/3"},{"type":"function","doc":"Returns the number of columns in the radiobox.","title":"wxRadioBox.getColumnCount/1","ref":"wxRadioBox.html#getColumnCount/1"},{"type":"function","doc":"Returns a radio box item under the point, a zero-based item index, or `wxNOT\\_FOUND` if\nno item is under the point.","title":"wxRadioBox.getItemFromPoint/2","ref":"wxRadioBox.html#getItemFromPoint/2"},{"type":"function","doc":"Returns the helptext associated with the specified `item` if any or `wxEmptyString`.\n\nSee: `setItemHelpText/3`","title":"wxRadioBox.getItemHelpText/2","ref":"wxRadioBox.html#getItemHelpText/2"},{"type":"function","doc":"Returns the tooltip associated with the specified `item` if any or NULL.\n\nSee:\n* `setItemToolTip/3`\n\n* `wxWindow:getToolTip/1`","title":"wxRadioBox.getItemToolTip/2","ref":"wxRadioBox.html#getItemToolTip/2"},{"type":"function","doc":"Returns the number of rows in the radiobox.","title":"wxRadioBox.getRowCount/1","ref":"wxRadioBox.html#getRowCount/1"},{"type":"function","doc":"Returns the index of the selected item or `wxNOT\\_FOUND` if no item is selected.\n\nReturn: The position of the current selection.\n\nRemark: This method can be used with single selection list boxes only, you should use `wxListBox:getSelections/1`\nfor the list boxes with wxLB_MULTIPLE style.\n\nSee:\n* `setSelection/2`\n\n* `wxControlWithItems:getStringSelection/1`","title":"wxRadioBox.getSelection/1","ref":"wxRadioBox.html#getSelection/1"},{"type":"function","doc":"Returns the label of the item with the given index.\n\nReturn: The label of the item or an empty string if the position was invalid.","title":"wxRadioBox.getString/2","ref":"wxRadioBox.html#getString/2"},{"type":"function","doc":"Returns true if the item is enabled or false if it was disabled using `enable/3`.\n\nThis function is currently only implemented in wxMSW, wxGTK, wxQT and wxUniversal and\nalways returns true in the other ports.","title":"wxRadioBox.isItemEnabled/2","ref":"wxRadioBox.html#isItemEnabled/2"},{"type":"function","doc":"Returns true if the item is currently shown or false if it was hidden using `show/3`.\n\nNote that this function returns true for an item which hadn't been hidden even if the\nentire radiobox is not currently shown.\n\nThis function is currently only implemented in wxMSW, wxGTK, wxQT and wxUniversal and\nalways returns true in the other ports.","title":"wxRadioBox.isItemShown/2","ref":"wxRadioBox.html#isItemShown/2"},{"type":"function","doc":"","title":"wxRadioBox.new/6","ref":"wxRadioBox.html#new/6"},{"type":"function","doc":"Constructor, creating and showing a radiobox.\n\nSee: `create/8`","title":"wxRadioBox.new/7","ref":"wxRadioBox.html#new/7"},{"type":"function","doc":"Sets the helptext for an item.\n\nEmpty string erases any existing helptext.\n\nSee: `getItemHelpText/2`","title":"wxRadioBox.setItemHelpText/3","ref":"wxRadioBox.html#setItemHelpText/3"},{"type":"function","doc":"Sets the tooltip text for the specified item in the radio group.\n\nThis function is currently only implemented in wxMSW and wxGTK2 and does nothing in the\nother ports.\n\nSee:\n* `getItemToolTip/2`\n\n* `wxWindow:setToolTip/2`","title":"wxRadioBox.setItemToolTip/3","ref":"wxRadioBox.html#setItemToolTip/3"},{"type":"function","doc":"Sets the selection to the given item.\n\nNotice that a radio box always has selection, so `n` must be valid here and passing `wxNOT_FOUND`\nis not allowed.","title":"wxRadioBox.setSelection/2","ref":"wxRadioBox.html#setSelection/2"},{"type":"function","doc":"","title":"wxRadioBox.show/2","ref":"wxRadioBox.html#show/2"},{"type":"function","doc":"Shows or hides individual buttons.\n\nReturn: true if the item has been shown or hidden or false if nothing was done because it\nalready was in the requested state.\n\nSee: `show/3`","title":"wxRadioBox.show/3","ref":"wxRadioBox.html#show/3"},{"type":"type","doc":"","title":"wxRadioBox.wxRadioBox/0","ref":"wxRadioBox.html#t:wxRadioBox/0"},{"type":"module","doc":"A radio button item is a button which usually denotes one of several mutually exclusive\noptions.\n\nIt has a text label next to a (usually) round button.\n\nYou can create a group of mutually-exclusive radio buttons by specifying `wxRB_GROUP` for\nthe first in the group. The group ends when another radio button group is created, or\nthere are no more radio buttons.","title":"wxRadioButton","ref":"wxRadioButton.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxRB_GROUP: Marks the beginning of a new group of radio buttons.\n\n* wxRB_SINGLE: In some circumstances, radio buttons that are not consecutive siblings\ntrigger a hang bug in Windows (only). If this happens, add this style to mark the button\nas not belonging to a group, and implement the mutually-exclusive group behaviour\nyourself.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxRadioBox`\n\n* `m:wxCheckBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxRadioButton](https://docs.wxwidgets.org/3.2/classwx_radio_button.html)","title":"Styles - wxRadioButton","ref":"wxRadioButton.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_radiobutton_selected`](`m:wxCommandEvent`)","title":"Events - wxRadioButton","ref":"wxRadioButton.html#module-events"},{"type":"function","doc":"","title":"wxRadioButton.create/4","ref":"wxRadioButton.html#create/4"},{"type":"function","doc":"Creates the choice for two-step construction.\n\nSee `new/4` for further details.","title":"wxRadioButton.create/5","ref":"wxRadioButton.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxRadioButton.destroy/1","ref":"wxRadioButton.html#destroy/1"},{"type":"function","doc":"Returns true if the radio button is checked, false otherwise.","title":"wxRadioButton.getValue/1","ref":"wxRadioButton.html#getValue/1"},{"type":"function","doc":"Default constructor.\n\nSee: `create/5`","title":"wxRadioButton.new/0","ref":"wxRadioButton.html#new/0"},{"type":"function","doc":"","title":"wxRadioButton.new/3","ref":"wxRadioButton.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a radio button.\n\nSee: `create/5`","title":"wxRadioButton.new/4","ref":"wxRadioButton.html#new/4"},{"type":"function","doc":"Sets the radio button to checked or unchecked status.\n\nThis does not cause a `wxEVT_RADIOBUTTON` event to get emitted.\n\nIf the radio button belongs to a radio group exactly one button in the group may be\nchecked and so this method can be only called with `value` set to true. To uncheck a radio\nbutton in a group you must check another button in the same group.\n\nNote: Under MSW, the focused radio button is always selected, i.e. its value is true.\nAnd, conversely, calling `SetValue(true)` will also set focus to the radio button if the\nfocus had previously been on another radio button in the same group - as otherwise setting\nit on wouldn't work.","title":"wxRadioButton.setValue/2","ref":"wxRadioButton.html#setValue/2"},{"type":"type","doc":"","title":"wxRadioButton.wxRadioButton/0","ref":"wxRadioButton.html#t:wxRadioButton/0"},{"type":"module","doc":"A `m:wxRegion` represents a simple or complex region on a device context or window.\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullRegion\n\nwxWidgets docs: [wxRegion](https://docs.wxwidgets.org/3.2/classwx_region.html)","title":"wxRegion","ref":"wxRegion.html"},{"type":"function","doc":"Clears the current region.\n\nThe object becomes invalid, or null, after being cleared.","title":"wxRegion.clear/1","ref":"wxRegion.html#clear/1"},{"type":"function","doc":"Returns a value indicating whether the given rectangle is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: One of ?wxOutRegion, ?wxPartRegion or ?wxInRegion.\n\nNote: On Windows, only ?wxOutRegion and ?wxInRegion are returned; a value ?wxInRegion\nthen indicates that all or some part of the region is contained in this region.","title":"wxRegion.contains/2","ref":"wxRegion.html#contains/2"},{"type":"function","doc":"Returns a value indicating whether the given point is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: The return value is one of `wxOutRegion` and `wxInRegion`.","title":"wxRegion.contains/3","ref":"wxRegion.html#contains/3"},{"type":"function","doc":"Returns a value indicating whether the given rectangle is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: One of ?wxOutRegion, ?wxPartRegion or ?wxInRegion.\n\nNote: On Windows, only ?wxOutRegion and ?wxInRegion are returned; a value ?wxInRegion\nthen indicates that all or some part of the region is contained in this region.","title":"wxRegion.contains/5","ref":"wxRegion.html#contains/5"},{"type":"function","doc":"Convert the region to a black and white bitmap with the white pixels being inside the\nregion.\n\nThis method can't be used for invalid region.","title":"wxRegion.convertToBitmap/1","ref":"wxRegion.html#convertToBitmap/1"},{"type":"function","doc":"Destroys the object","title":"wxRegion.destroy/1","ref":"wxRegion.html#destroy/1"},{"type":"function","doc":"","title":"wxRegion.getBox/1","ref":"wxRegion.html#getBox/1"},{"type":"function","doc":"Finds the intersection of this region and another region.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: Creates the intersection of the two regions, that is, the parts which are in both\nregions. The result is stored in this region.","title":"wxRegion.intersect/2","ref":"wxRegion.html#intersect/2"},{"type":"function","doc":"Finds the intersection of this region and another, rectangular region, specified using\nposition and size.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: Creates the intersection of the two regions, that is, the parts which are in both\nregions. The result is stored in this region.","title":"wxRegion.intersect/5","ref":"wxRegion.html#intersect/5"},{"type":"function","doc":"Returns true if the region is empty, false otherwise.\n\nAlways returns true if the region is invalid.","title":"wxRegion.isEmpty/1","ref":"wxRegion.html#isEmpty/1"},{"type":"function","doc":"Default constructor.\n\nThis constructor creates an invalid, or null, object, i.e. calling IsOk() on it returns\nfalse and `isEmpty/1` returns true.","title":"wxRegion.new/0","ref":"wxRegion.html#new/0"},{"type":"function","doc":"Constructs a region using a bitmap.\n\nSee `union/5` for more details.","title":"wxRegion.new/1","ref":"wxRegion.html#new/1"},{"type":"function","doc":"Constructs a rectangular region from the top left point and the bottom right point.","title":"wxRegion.new/2","ref":"wxRegion.html#new/2"},{"type":"function","doc":"Constructs a rectangular region with the given position and size.","title":"wxRegion.new/4","ref":"wxRegion.html#new/4"},{"type":"function","doc":"","title":"wxRegion.offset/2","ref":"wxRegion.html#offset/2"},{"type":"function","doc":"Moves the region by the specified offsets in horizontal and vertical directions.\n\nThis method can't be called if the region is invalid as it doesn't make sense to offset\nit then. Attempts to do it will result in assert failure.\n\nReturn: true if successful, false otherwise (the region is unchanged then).","title":"wxRegion.offset/3","ref":"wxRegion.html#offset/3"},{"type":"function","doc":"Subtracts a region from this region.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation combines the parts of 'this' region that are not part of the\nsecond region. The result is stored in this region.","title":"wxRegion.subtract/2","ref":"wxRegion.html#subtract/2"},{"type":"function","doc":"Finds the union of this region and another, rectangular region.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","title":"wxRegion.union/2","ref":"wxRegion.html#union/2"},{"type":"function","doc":"","title":"wxRegion.union/3","ref":"wxRegion.html#union/3"},{"type":"function","doc":"Finds the union of this region and the non-transparent pixels of a bitmap.\n\nColour to be treated as transparent is specified in the `transColour` argument, along\nwith an optional colour tolerance value.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","title":"wxRegion.union/4","ref":"wxRegion.html#union/4"},{"type":"function","doc":"Finds the union of this region and another, rectangular region, specified using position\nand size.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","title":"wxRegion.union/5","ref":"wxRegion.html#union/5"},{"type":"function","doc":"Finds the Xor of this region and another region.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given `region`.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion, except for any overlapping areas. The result is stored in this region.","title":"wxRegion.Xor/2","ref":"wxRegion.html#Xor/2"},{"type":"function","doc":"Finds the Xor of this region and another, rectangular region, specified using position\nand size.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion, except for any overlapping areas. The result is stored in this region.","title":"wxRegion.Xor/5","ref":"wxRegion.html#Xor/5"},{"type":"type","doc":"","title":"wxRegion.wxRegion/0","ref":"wxRegion.html#t:wxRegion/0"},{"type":"module","doc":"A sash event is sent when the sash of a `m:wxSashWindow` has been dragged by the user.\n\nRemark: When a sash belonging to a sash window is dragged by the user, and then released,\nthis event is sent to the window, where it may be processed by an event table entry in a\nderived class, a plug-in event handler or an ancestor class. Note that the `m:wxSashWindow`\ndoesn't change the window's size itself. It relies on the application's event handler to\ndo that. This is because the application may have to handle other consequences of the\nresize, or it may wish to veto it altogether. The event handler should look at the drag\nrectangle: see `getDragRect/1` to see what the new size of the window would be if the resize were to be\napplied. It should also call `getDragStatus/1` to see whether the drag was OK or out of the current allowed range.\n\nSee:\n* `m:wxSashWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSashEvent](https://docs.wxwidgets.org/3.2/classwx_sash_event.html)","title":"wxSashEvent","ref":"wxSashEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSashEventType` to subscribe to events of this type.","title":"Events - wxSashEvent","ref":"wxSashEvent.html#module-events"},{"type":"function","doc":"Returns the rectangle representing the new size the window would be if the resize was\napplied.\n\nIt is up to the application to set the window size if required.","title":"wxSashEvent.getDragRect/1","ref":"wxSashEvent.html#getDragRect/1"},{"type":"function","doc":"Returns the status of the sash: one of wxSASH\\_STATUS\\_OK,\nwxSASH\\_STATUS\\_OUT\\_OF\\_RANGE.\n\nIf the drag caused the notional bounding box of the window to flip over, for example, the\ndrag will be out of rage.","title":"wxSashEvent.getDragStatus/1","ref":"wxSashEvent.html#getDragStatus/1"},{"type":"function","doc":"Returns the dragged edge.\n\nThe return value is one of wxSASH_TOP, wxSASH_RIGHT, wxSASH_BOTTOM, wxSASH_LEFT.","title":"wxSashEvent.getEdge/1","ref":"wxSashEvent.html#getEdge/1"},{"type":"type","doc":"","title":"wxSashEvent.wxSash/0","ref":"wxSashEvent.html#t:wxSash/0"},{"type":"type","doc":"","title":"wxSashEvent.wxSashEvent/0","ref":"wxSashEvent.html#t:wxSashEvent/0"},{"type":"type","doc":"","title":"wxSashEvent.wxSashEventType/0","ref":"wxSashEvent.html#t:wxSashEventType/0"},{"type":"module","doc":"`m:wxSashLayoutWindow` responds to OnCalculateLayout events generated by `m:wxLayoutAlgorithm`.\n\nIt allows the application to use simple accessors to specify how the window should be\nlaid out, rather than having to respond to events.\n\nThe fact that the class derives from `m:wxSashWindow` allows sashes to be used if\nrequired, to allow the windows to be user-resizable.\n\nThe documentation for `m:wxLayoutAlgorithm` explains the purpose of this class in more detail.\n\nFor the window styles see `m:wxSashWindow`.\n\nThis class handles the EVT_QUERY_LAYOUT_INFO and EVT_CALCULATE_LAYOUT events for you.\nHowever, if you use sashes, see `m:wxSashWindow` for relevant event information. See also `m:wxLayoutAlgorithm`\nfor information about the layout events.\n\nSee:\n* `m:wxLayoutAlgorithm`\n\n* `m:wxSashWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSashWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSashLayoutWindow](https://docs.wxwidgets.org/3.2/classwx_sash_layout_window.html)","title":"wxSashLayoutWindow","ref":"wxSashLayoutWindow.html"},{"type":"function","doc":"","title":"wxSashLayoutWindow.create/2","ref":"wxSashLayoutWindow.html#create/2"},{"type":"function","doc":"Initializes a sash layout window, which can be a child of a frame, dialog or any other\nnon-control window.","title":"wxSashLayoutWindow.create/3","ref":"wxSashLayoutWindow.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxSashLayoutWindow.destroy/1","ref":"wxSashLayoutWindow.html#destroy/1"},{"type":"function","doc":"Returns the alignment of the window: one of wxLAYOUT\\_TOP, wxLAYOUT\\_LEFT,\nwxLAYOUT\\_RIGHT, wxLAYOUT\\_BOTTOM.","title":"wxSashLayoutWindow.getAlignment/1","ref":"wxSashLayoutWindow.html#getAlignment/1"},{"type":"function","doc":"Returns the orientation of the window: one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL.","title":"wxSashLayoutWindow.getOrientation/1","ref":"wxSashLayoutWindow.html#getOrientation/1"},{"type":"function","doc":"Default ctor.","title":"wxSashLayoutWindow.new/0","ref":"wxSashLayoutWindow.html#new/0"},{"type":"function","doc":"","title":"wxSashLayoutWindow.new/1","ref":"wxSashLayoutWindow.html#new/1"},{"type":"function","doc":"Constructs a sash layout window, which can be a child of a frame, dialog or any other\nnon-control window.","title":"wxSashLayoutWindow.new/2","ref":"wxSashLayoutWindow.html#new/2"},{"type":"function","doc":"Sets the alignment of the window (which edge of the available parent client area the\nwindow is attached to).\n\n`alignment` is one of wxLAYOUT_TOP, wxLAYOUT_LEFT, wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM.","title":"wxSashLayoutWindow.setAlignment/2","ref":"wxSashLayoutWindow.html#setAlignment/2"},{"type":"function","doc":"Sets the default dimensions of the window.\n\nThe dimension other than the orientation will be fixed to this value, and the orientation\ndimension will be ignored and the window stretched to fit the available space.","title":"wxSashLayoutWindow.setDefaultSize/2","ref":"wxSashLayoutWindow.html#setDefaultSize/2"},{"type":"function","doc":"Sets the orientation of the window (the direction the window will stretch in, to fill the\navailable parent client area).\n\n`orientation` is one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL.","title":"wxSashLayoutWindow.setOrientation/2","ref":"wxSashLayoutWindow.html#setOrientation/2"},{"type":"type","doc":"","title":"wxSashLayoutWindow.wxSashLayoutWindow/0","ref":"wxSashLayoutWindow.html#t:wxSashLayoutWindow/0"},{"type":"module","doc":"`m:wxSashWindow` allows any of its edges to have a sash which can be dragged to resize\nthe window.\n\nThe actual content window will be created by the application as a child of `m:wxSashWindow`.\n\nThe window (or an ancestor) will be notified of a drag via a `m:wxSashEvent` notification.","title":"wxSashWindow","ref":"wxSashWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSW_3D: Draws a 3D effect sash and border.\n\n* wxSW_3DSASH: Draws a 3D effect sash.\n\n* wxSW_3DBORDER: Draws a 3D effect border.\n\n* wxSW_BORDER: Draws a thin black border.\n\nSee:\n* `m:wxSashEvent`\n\n* `m:wxSashLayoutWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSashWindow](https://docs.wxwidgets.org/3.2/classwx_sash_window.html)","title":"Styles - wxSashWindow","ref":"wxSashWindow.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`sash_dragged`](`m:wxSashEvent`)","title":"Events - wxSashWindow","ref":"wxSashWindow.html#module-events"},{"type":"function","doc":"Destroys the object","title":"wxSashWindow.destroy/1","ref":"wxSashWindow.html#destroy/1"},{"type":"function","doc":"Gets the maximum window size in the x direction.","title":"wxSashWindow.getMaximumSizeX/1","ref":"wxSashWindow.html#getMaximumSizeX/1"},{"type":"function","doc":"Gets the maximum window size in the y direction.","title":"wxSashWindow.getMaximumSizeY/1","ref":"wxSashWindow.html#getMaximumSizeY/1"},{"type":"function","doc":"Gets the minimum window size in the x direction.","title":"wxSashWindow.getMinimumSizeX/1","ref":"wxSashWindow.html#getMinimumSizeX/1"},{"type":"function","doc":"Gets the minimum window size in the y direction.","title":"wxSashWindow.getMinimumSizeY/1","ref":"wxSashWindow.html#getMinimumSizeY/1"},{"type":"function","doc":"Returns true if a sash is visible on the given edge, false otherwise.\n\nSee: `setSashVisible/3`","title":"wxSashWindow.getSashVisible/2","ref":"wxSashWindow.html#getSashVisible/2"},{"type":"function","doc":"Default ctor.","title":"wxSashWindow.new/0","ref":"wxSashWindow.html#new/0"},{"type":"function","doc":"","title":"wxSashWindow.new/1","ref":"wxSashWindow.html#new/1"},{"type":"function","doc":"Constructs a sash window, which can be a child of a frame, dialog or any other\nnon-control window.","title":"wxSashWindow.new/2","ref":"wxSashWindow.html#new/2"},{"type":"function","doc":"Sets the maximum window size in the x direction.","title":"wxSashWindow.setMaximumSizeX/2","ref":"wxSashWindow.html#setMaximumSizeX/2"},{"type":"function","doc":"Sets the maximum window size in the y direction.","title":"wxSashWindow.setMaximumSizeY/2","ref":"wxSashWindow.html#setMaximumSizeY/2"},{"type":"function","doc":"Sets the minimum window size in the x direction.","title":"wxSashWindow.setMinimumSizeX/2","ref":"wxSashWindow.html#setMinimumSizeX/2"},{"type":"function","doc":"Sets the minimum window size in the y direction.","title":"wxSashWindow.setMinimumSizeY/2","ref":"wxSashWindow.html#setMinimumSizeY/2"},{"type":"function","doc":"Call this function to make a sash visible or invisible on a particular edge.\n\nSee: `getSashVisible/2`","title":"wxSashWindow.setSashVisible/3","ref":"wxSashWindow.html#setSashVisible/3"},{"type":"type","doc":"","title":"wxSashWindow.wxSashWindow/0","ref":"wxSashWindow.html#t:wxSashWindow/0"},{"type":"module","doc":"A `m:wxScreenDC` can be used to paint on the screen.\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxScreenDC`\nobject.\n\nWhen using multiple monitors, `m:wxScreenDC` corresponds to the entire virtual screen\ncomposed of all of them. Notice that coordinates on `m:wxScreenDC` can be negative in this\ncase, see `wxDisplay:getGeometry/1` for more.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxClientDC`\n\n* `m:wxWindowDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxScreenDC](https://docs.wxwidgets.org/3.2/classwx_screen_d_c.html)","title":"wxScreenDC","ref":"wxScreenDC.html"},{"type":"function","doc":"Destroys the object","title":"wxScreenDC.destroy/1","ref":"wxScreenDC.html#destroy/1"},{"type":"function","doc":"Constructor.","title":"wxScreenDC.new/0","ref":"wxScreenDC.html#new/0"},{"type":"type","doc":"","title":"wxScreenDC.wxScreenDC/0","ref":"wxScreenDC.html#t:wxScreenDC/0"},{"type":"module","doc":"A `m:wxScrollBar` is a control that represents a horizontal or vertical scrollbar.\n\nIt is distinct from the two scrollbars that some windows provide automatically, but the\ntwo types of scrollbar share the way events are received.\n\nRemark: A scrollbar has the following main attributes: range, thumb size, page size, and\nposition. The range is the total number of units associated with the view represented by\nthe scrollbar. For a table with 15 columns, the range would be 15. The thumb size is the\nnumber of units that are currently visible. For the table example, the window might be\nsized so that only 5 columns are currently visible, in which case the application would\nset the thumb size to 5. When the thumb size becomes the same as or greater than the\nrange, the scrollbar will be automatically hidden on most platforms. The page size is the\nnumber of units that the scrollbar should scroll by, when 'paging' through the data. This\nvalue is normally the same as the thumb size length, because it is natural to assume that\nthe visible window size defines a page. The scrollbar position is the current thumb\nposition. Most applications will find it convenient to provide a function called\nAdjustScrollbars() which can be called initially, from an OnSize event handler, and\nwhenever the application data changes in size. It will adjust the view, object and page\nsize according to the size of the window and the size of the data.","title":"wxScrollBar","ref":"wxScrollBar.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSB_HORIZONTAL: Specifies a horizontal scrollbar.\n\n* wxSB_VERTICAL: Specifies a vertical scrollbar.\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen).\n\nIn short, the EVT_SCROLL_CHANGED event is triggered when scrolling/moving has finished\nindependently of the way it had started. Please see the page_samples_widgets (\"Slider\"\npage) to see the difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nSee:\n* [Overview scrolling](https://docs.wxwidgets.org/3.2/overview_scrolling.html#overview_scrolling)\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxScrollBar](https://docs.wxwidgets.org/3.2/classwx_scroll_bar.html)","title":"Styles - wxScrollBar","ref":"wxScrollBar.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)","title":"Events - wxScrollBar","ref":"wxScrollBar.html#module-events"},{"type":"function","doc":"","title":"wxScrollBar.create/3","ref":"wxScrollBar.html#create/3"},{"type":"function","doc":"Scrollbar creation function called by the scrollbar constructor.\n\nSee `new/3` for details.","title":"wxScrollBar.create/4","ref":"wxScrollBar.html#create/4"},{"type":"function","doc":"Destroys the object","title":"wxScrollBar.destroy/1","ref":"wxScrollBar.html#destroy/1"},{"type":"function","doc":"Returns the page size of the scrollbar.\n\nThis is the number of scroll units that will be scrolled when the user pages up or down.\nOften it is the same as the thumb size.\n\nSee: `setScrollbar/6`","title":"wxScrollBar.getPageSize/1","ref":"wxScrollBar.html#getPageSize/1"},{"type":"function","doc":"Returns the length of the scrollbar.\n\nSee: `setScrollbar/6`","title":"wxScrollBar.getRange/1","ref":"wxScrollBar.html#getRange/1"},{"type":"function","doc":"Returns the current position of the scrollbar thumb.\n\nSee: `setThumbPosition/2`","title":"wxScrollBar.getThumbPosition/1","ref":"wxScrollBar.html#getThumbPosition/1"},{"type":"function","doc":"Returns the thumb or 'view' size.\n\nSee: `setScrollbar/6`","title":"wxScrollBar.getThumbSize/1","ref":"wxScrollBar.html#getThumbSize/1"},{"type":"function","doc":"Default constructor.","title":"wxScrollBar.new/0","ref":"wxScrollBar.html#new/0"},{"type":"function","doc":"","title":"wxScrollBar.new/2","ref":"wxScrollBar.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a scrollbar.\n\nSee: `create/4`","title":"wxScrollBar.new/3","ref":"wxScrollBar.html#new/3"},{"type":"function","doc":"","title":"wxScrollBar.setScrollbar/5","ref":"wxScrollBar.html#setScrollbar/5"},{"type":"function","doc":"Sets the scrollbar properties.\n\nRemark: Let's say you wish to display 50 lines of text, using the same font. The window\nis sized so that you can only see 16 lines at a time. You would use: The page size is 1\nless than the thumb size so that the last line of the previous page will be visible on the\nnext page, to help orient the user. Note that with the window at this size, the thumb\nposition can never go above 50 minus 16, or 34. You can determine how many lines are\ncurrently visible by dividing the current view size by the character height in pixels.\nWhen defining your own scrollbar behaviour, you will always need to recalculate the\nscrollbar settings when the window size changes. You could therefore put your scrollbar\ncalculations and `setScrollbar/6` call into a function named AdjustScrollbars, which can be called\ninitially and also from a `m:wxSizeEvent` event handler function.","title":"wxScrollBar.setScrollbar/6","ref":"wxScrollBar.html#setScrollbar/6"},{"type":"function","doc":"Sets the position of the scrollbar.\n\nSee: `getThumbPosition/1`","title":"wxScrollBar.setThumbPosition/2","ref":"wxScrollBar.html#setThumbPosition/2"},{"type":"type","doc":"","title":"wxScrollBar.wxScrollBar/0","ref":"wxScrollBar.html#t:wxScrollBar/0"},{"type":"module","doc":"A scroll event holds information about events sent from stand-alone scrollbars (see `m:wxScrollBar`)\nand sliders (see `m:wxSlider`).\n\nNote that scrolled windows send the `m:wxScrollWinEvent` which does not derive from `m:wxCommandEvent`,\nbut from `m:wxEvent` directly - don't confuse these two kinds of events and use the event\ntable macros mentioned below only for the scrollbar-like controls.\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen).\n\nIn short, the EVT_SCROLL_CHANGED event is triggered when scrolling/ moving has finished\nindependently of the way it had started. Please see the page_samples_widgets (\"Slider\"\npage) to see the difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nRemark: Note that unless specifying a scroll control identifier, you will need to test\nfor scrollbar orientation with `getOrientation/1`, since horizontal and vertical scroll events are processed\nusing the same event handler.\n\nSee:\n* `m:wxScrollBar`\n\n* `m:wxSlider`\n\n* `m:wxSpinButton`\n\n* `m:wxScrollWinEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxScrollEvent](https://docs.wxwidgets.org/3.2/classwx_scroll_event.html)","title":"wxScrollEvent","ref":"wxScrollEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxScrollEventType` to subscribe to events of this type.","title":"Events - wxScrollEvent","ref":"wxScrollEvent.html#module-events"},{"type":"function","doc":"Returns wxHORIZONTAL or wxVERTICAL, depending on the orientation of the scrollbar.","title":"wxScrollEvent.getOrientation/1","ref":"wxScrollEvent.html#getOrientation/1"},{"type":"function","doc":"Returns the position of the scrollbar.","title":"wxScrollEvent.getPosition/1","ref":"wxScrollEvent.html#getPosition/1"},{"type":"type","doc":"","title":"wxScrollEvent.wxScroll/0","ref":"wxScrollEvent.html#t:wxScroll/0"},{"type":"type","doc":"","title":"wxScrollEvent.wxScrollEvent/0","ref":"wxScrollEvent.html#t:wxScrollEvent/0"},{"type":"type","doc":"","title":"wxScrollEvent.wxScrollEventType/0","ref":"wxScrollEvent.html#t:wxScrollEventType/0"},{"type":"module","doc":"A scroll event holds information about events sent from scrolling windows.\n\nNote that you can use the EVT_SCROLLWIN* macros for intercepting scroll window events\nfrom the receiving window.\n\nSee:\n* `m:wxScrollEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxScrollWinEvent](https://docs.wxwidgets.org/3.2/classwx_scroll_win_event.html)","title":"wxScrollWinEvent","ref":"wxScrollWinEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxScrollWinEventType` to subscribe to events of this type.","title":"Events - wxScrollWinEvent","ref":"wxScrollWinEvent.html#module-events"},{"type":"function","doc":"Returns wxHORIZONTAL or wxVERTICAL, depending on the orientation of the scrollbar.","title":"wxScrollWinEvent.getOrientation/1","ref":"wxScrollWinEvent.html#getOrientation/1"},{"type":"function","doc":"Returns the position of the scrollbar for the thumb track and release events.\n\nNote that this field can't be used for the other events, you need to query the window\nitself for the current position in that case.","title":"wxScrollWinEvent.getPosition/1","ref":"wxScrollWinEvent.html#getPosition/1"},{"type":"type","doc":"","title":"wxScrollWinEvent.wxScrollWin/0","ref":"wxScrollWinEvent.html#t:wxScrollWin/0"},{"type":"type","doc":"","title":"wxScrollWinEvent.wxScrollWinEvent/0","ref":"wxScrollWinEvent.html#t:wxScrollWinEvent/0"},{"type":"type","doc":"","title":"wxScrollWinEvent.wxScrollWinEventType/0","ref":"wxScrollWinEvent.html#t:wxScrollWinEventType/0"},{"type":"module","doc":"The `wxScrolled` (not implemented in wx) class manages scrolling for its client area,\ntransforming the coordinates according to the scrollbar positions, and setting the scroll\npositions, thumb sizes and ranges according to the area in view.\n\nThere are two commonly used (but not the only possible!) specializations of this class:\n\n* ?wxScrolledWindow, aka wxScrolled , is equivalent to ?wxScrolledWindow from\nearlier versions. Derived from `m:wxPanel`, it shares `m:wxPanel`'s behaviour with regard\nto TAB traversal and focus handling. Use this if the scrolled window will have child controls.\n\n* ?wxScrolledCanvas, aka wxScrolled , derives from `m:wxWindow` and so doesn't\nhandle children specially. This is suitable e.g. for implementing scrollable controls such\nas tree or list controls.\n\nNote: See `wxScrolled::Create()` (not implemented in wx) if you want to use `wxScrolled`\n(not implemented in wx) with a custom class.\n\nStarting from version 2.4 of wxWidgets, there are several ways to use a\n?wxScrolledWindow (and now `wxScrolled` (not implemented in wx)). In particular, there are\nthree ways to set the size of the scrolling area:\n\nOne way is to set the scrollbars directly using a call to `setScrollbars/6`. This is the way it used to be\nin any previous version of wxWidgets and it will be kept for backwards compatibility.\n\nAn additional method of manual control, which requires a little less computation of your\nown, is to set the total size of the scrolling area by calling either `wxWindow:setVirtualSize/3`, or `wxWindow:fitInside/1`, and setting\nthe scrolling increments for it by calling `setScrollRate/3`. Scrolling in some orientation is enabled by\nsetting a non-zero increment for it.\n\nThe most automatic and newest way is to simply let sizers determine the scrolling area.\nThis is now the default when you set an interior sizer into a `wxScrolled` (not\nimplemented in wx) with `wxWindow:setSizer/3`. The scrolling area will be set to the size requested by the\nsizer and the scrollbars will be assigned for each orientation according to the need for\nthem and the scrolling increment set by `setScrollRate/3`. As above, scrolling is only enabled in\norientations with a non-zero increment. You can influence the minimum size of the scrolled\narea controlled by a sizer by calling wxWindow::SetVirtualSizeHints(). (Calling `setScrollbars/6` has\nanalogous effects in wxWidgets 2.4 - in later versions it may not continue to override the sizer.)\n\nNote that if maximum size hints are still supported by wxWindow::SetVirtualSizeHints(),\nuse them at your own dire risk. They may or may not have been removed for 2.4, but it\nreally only makes sense to set minimum size hints here. We should probably replace\nwxWindow::SetVirtualSizeHints() with wxWindow::SetMinVirtualSize() or similar and remove\nit entirely in future.\n\nAs with all windows, an application can draw onto a `wxScrolled` (not implemented in wx)\nusing a device context.\n\nYou have the option of handling the OnPaint handler or overriding the `wxScrolled::OnDraw()`\n(not implemented in wx) function, which is passed a pre-scrolled device context (prepared\nby `doPrepareDC/2`).\n\nIf you don't wish to calculate your own scrolling, you must call `doPrepareDC/2` when not drawing from\nwithin `OnDraw()` (not implemented in wx), to set the device origin for the device context\naccording to the current scroll position.\n\nA `wxScrolled` (not implemented in wx) will normally scroll itself and therefore its\nchild windows as well. It might however be desired to scroll a different window than\nitself: e.g. when designing a spreadsheet, you will normally only have to scroll the\n(usually white) cell area, whereas the (usually grey) label area will scroll very\ndifferently. For this special purpose, you can call `setTargetWindow/2` which means that pressing the\nscrollbars will scroll a different window.\n\nNote that the underlying system knows nothing about scrolling coordinates, so that all\nsystem functions (mouse events, expose events, refresh calls etc) as well as the position\nof subwindows are relative to the \"physical\" origin of the scrolled window. If the user\ninsert a child window at position (10,10) and scrolls the window down 100 pixels (moving\nthe child window out of the visible area), the child window will report a position of (10,-90).","title":"wxScrolledWindow","ref":"wxScrolledWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxHSCROLL: If this style is specified and ?wxVSCROLL isn't, the window will be scrollable\nonly in horizontal direction (by default, i.e. if neither this style nor ?wxVSCROLL is\nspecified, it scrolls in both directions).\n\n* wxVSCROLL: If this style is specified and ?wxHSCROLL isn't, the window will be scrollable\nonly in vertical direction (by default, i.e. if neither this style nor ?wxHSCROLL is\nspecified, it scrolls in both directions).\n\n* wxALWAYS_SHOW_SB: Since wxWidgets 2.9.5, specifying this style makes the window always\nshow its scrollbars, even if they are not used. See `ShowScrollbars()` (not implemented in\nwx).\n\n* wxRETAINED: Uses a backing pixmap to speed refreshes. Motif only.\n\nSee:\n* `m:wxScrollBar`\n\n* `m:wxClientDC`\n\n* `m:wxPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxScrolledWindow](https://docs.wxwidgets.org/3.2/classwx_scrolled_window.html)","title":"Styles - wxScrolledWindow","ref":"wxScrolledWindow.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`scrollwin_top`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_bottom`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_lineup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_linedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pageup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pagedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbtrack`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbrelease`](`m:wxScrollWinEvent`)","title":"Events - wxScrolledWindow","ref":"wxScrolledWindow.html#module-events"},{"type":"function","doc":"","title":"wxScrolledWindow.calcScrolledPosition/2","ref":"wxScrolledWindow.html#calcScrolledPosition/2"},{"type":"function","doc":"Translates the logical coordinates to the device ones.\n\nFor example, if a window is scrolled 10 pixels to the bottom, the device coordinates of\nthe origin are (0, 0) (as always), but the logical coordinates are (0, 10) and so the call\nto CalcScrolledPosition(0, 10, xx, yy) will return 0 in yy.\n\nSee: `calcUnscrolledPosition/3`","title":"wxScrolledWindow.calcScrolledPosition/3","ref":"wxScrolledWindow.html#calcScrolledPosition/3"},{"type":"function","doc":"","title":"wxScrolledWindow.calcUnscrolledPosition/2","ref":"wxScrolledWindow.html#calcUnscrolledPosition/2"},{"type":"function","doc":"Translates the device coordinates to the logical ones.\n\nFor example, if a window is scrolled 10 pixels to the bottom, the device coordinates of\nthe origin are (0, 0) (as always), but the logical coordinates are (0, 10) and so the call\nto CalcUnscrolledPosition(0, 0, xx, yy) will return 10 in yy.\n\nSee: `calcScrolledPosition/3`","title":"wxScrolledWindow.calcUnscrolledPosition/3","ref":"wxScrolledWindow.html#calcUnscrolledPosition/3"},{"type":"function","doc":"Destroys the object","title":"wxScrolledWindow.destroy/1","ref":"wxScrolledWindow.html#destroy/1"},{"type":"function","doc":"Call this function to prepare the device context for drawing a scrolled image.\n\nIt sets the device origin according to the current scroll position. `doPrepareDC/2` is called\nautomatically within the default `wxEVT_PAINT` event handler, so your `OnDraw()` (not\nimplemented in wx) override will be passed an already 'pre-scrolled' device context.\nHowever, if you wish to draw from outside of `OnDraw()` (not implemented in wx) (e.g. from\nyour own `wxEVT_PAINT` handler), you must call this function yourself.\n\nFor example:\n\nNotice that the function sets the origin by moving it relatively to the current origin\nposition, so you shouldn't change the origin before calling `doPrepareDC/2` or, if you do, reset it to\n(0, 0) later. If you call `doPrepareDC/2` immediately after device context creation, as in the example\nabove, this problem doesn't arise, of course, so it is customary to do it like this.","title":"wxScrolledWindow.doPrepareDC/2","ref":"wxScrolledWindow.html#doPrepareDC/2"},{"type":"function","doc":"Enable or disable use of `wxWindow:scrollWindow/4` for scrolling.\n\nBy default, when a scrolled window is logically scrolled, `wxWindow:scrollWindow/4` is called on the underlying\nwindow which scrolls the window contents and only invalidates the part of the window newly\nbrought into view. If false is passed as an argument, then this \"physical scrolling\" is\ndisabled and the window is entirely invalidated whenever it is scrolled by calling `wxWindow:refresh/2`.\n\nIt should be rarely necessary to disable physical scrolling, so this method shouldn't be\ncalled in normal circumstances.","title":"wxScrolledWindow.enableScrolling/3","ref":"wxScrolledWindow.html#enableScrolling/3"},{"type":"function","doc":"Get the number of pixels per scroll unit (line), in each direction, as set by `setScrollbars/6`.\n\nA value of zero indicates no scrolling in that direction.\n\nSee:\n* `setScrollbars/6`\n\n* `wxWindow:getVirtualSize/1`","title":"wxScrolledWindow.getScrollPixelsPerUnit/1","ref":"wxScrolledWindow.html#getScrollPixelsPerUnit/1"},{"type":"function","doc":"This is a simple overload of GetViewStart(int*,int*); see that function for more info.","title":"wxScrolledWindow.getViewStart/1","ref":"wxScrolledWindow.html#getViewStart/1"},{"type":"function","doc":"Default constructor.","title":"wxScrolledWindow.new/0","ref":"wxScrolledWindow.html#new/0"},{"type":"function","doc":"","title":"wxScrolledWindow.new/1","ref":"wxScrolledWindow.html#new/1"},{"type":"function","doc":"Constructor.\n\nRemark: The window is initially created without visible scrollbars. Call `setScrollbars/6` to specify how\nbig the virtual window size should be.","title":"wxScrolledWindow.new/2","ref":"wxScrolledWindow.html#new/2"},{"type":"function","doc":"This function is for backwards compatibility only and simply calls `doPrepareDC/2` now.\n\nNotice that it is not called by the default paint event handle (`doPrepareDC/2` is), so overriding this\nmethod in your derived class is useless.","title":"wxScrolledWindow.prepareDC/2","ref":"wxScrolledWindow.html#prepareDC/2"},{"type":"function","doc":"This is an overload of `scroll/3`;see that function for more info.","title":"wxScrolledWindow.scroll/2","ref":"wxScrolledWindow.html#scroll/2"},{"type":"function","doc":"Scrolls a window so the view start is at the given point.\n\nRemark: The positions are in scroll units, not pixels, so to convert to pixels you will\nhave to multiply by the number of pixels per scroll increment. If either parameter is\n?wxDefaultCoord (-1), that position will be ignored (no change in that direction).\n\nSee:\n* `setScrollbars/6`\n\n* `getScrollPixelsPerUnit/1`","title":"wxScrolledWindow.scroll/3","ref":"wxScrolledWindow.html#scroll/3"},{"type":"function","doc":"","title":"wxScrolledWindow.setScrollbars/5","ref":"wxScrolledWindow.html#setScrollbars/5"},{"type":"function","doc":"Sets up vertical and/or horizontal scrollbars.\n\nThe first pair of parameters give the number of pixels per 'scroll step', i.e. amount\nmoved when the up or down scroll arrows are pressed. The second pair gives the length of\nscrollbar in scroll steps, which sets the size of the virtual window.\n\n`xPos` and `yPos` optionally specify a position to scroll to immediately.\n\nFor example, the following gives a window horizontal and vertical scrollbars with 20\npixels per scroll step, and a size of 50 steps (1000 pixels) in each direction:\n\n`wxScrolled` (not implemented in wx) manages the page size itself, using the current\nclient window size as the page size.\n\nNote that for more sophisticated scrolling applications, for example where scroll steps\nmay be variable according to the position in the document, it will be necessary to derive\na new class from `m:wxWindow`, overriding OnSize() and adjusting the scrollbars appropriately.\n\nSee: `wxWindow:setVirtualSize/3`","title":"wxScrolledWindow.setScrollbars/6","ref":"wxScrolledWindow.html#setScrollbars/6"},{"type":"function","doc":"Set the horizontal and vertical scrolling increment only.\n\nSee the pixelsPerUnit parameter in `setScrollbars/6`.","title":"wxScrolledWindow.setScrollRate/3","ref":"wxScrolledWindow.html#setScrollRate/3"},{"type":"function","doc":"Call this function to tell `wxScrolled` (not implemented in wx) to perform the actual\nscrolling on a different window (and not on itself).\n\nThis method is useful when only a part of the window should be scrolled. A typical\nexample is a control consisting of a fixed header and the scrollable contents window: the\nscrollbars are attached to the main window itself, hence it, and not the contents window\nmust be derived from `wxScrolled` (not implemented in wx), but only the contents window\nscrolls when the scrollbars are used. To implement such setup, you need to call this\nmethod with the contents window as argument.\n\nNotice that if this method is used, `GetSizeAvailableForScrollTarget()` (not implemented\nin wx) method must be overridden.","title":"wxScrolledWindow.setTargetWindow/2","ref":"wxScrolledWindow.html#setTargetWindow/2"},{"type":"type","doc":"","title":"wxScrolledWindow.wxScrolledWindow/0","ref":"wxScrolledWindow.html#t:wxScrolledWindow/0"},{"type":"module","doc":"A `m:wxSetCursorEvent` is generated from `m:wxWindow` when the mouse cursor is about to\nbe set as a result of mouse motion.\n\nThis event gives the application the chance to perform specific mouse cursor processing\nbased on the current position of the mouse within the window. Use `setCursor/2` to specify the cursor\nyou want to be displayed.\n\nSee:\n* `wx_misc:setCursor/1`\n\n* `wxWindow:setCursor/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSetCursorEvent](https://docs.wxwidgets.org/3.2/classwx_set_cursor_event.html)","title":"wxSetCursorEvent","ref":"wxSetCursorEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSetCursorEventType` to subscribe to events of this type.","title":"Events - wxSetCursorEvent","ref":"wxSetCursorEvent.html#module-events"},{"type":"function","doc":"Returns a reference to the cursor specified by this event.","title":"wxSetCursorEvent.getCursor/1","ref":"wxSetCursorEvent.html#getCursor/1"},{"type":"function","doc":"Returns the X coordinate of the mouse in client coordinates.","title":"wxSetCursorEvent.getX/1","ref":"wxSetCursorEvent.html#getX/1"},{"type":"function","doc":"Returns the Y coordinate of the mouse in client coordinates.","title":"wxSetCursorEvent.getY/1","ref":"wxSetCursorEvent.html#getY/1"},{"type":"function","doc":"Returns true if the cursor specified by this event is a valid cursor.\n\nRemark: You cannot specify wxNullCursor with this event, as it is not considered a valid\ncursor.","title":"wxSetCursorEvent.hasCursor/1","ref":"wxSetCursorEvent.html#hasCursor/1"},{"type":"function","doc":"Sets the cursor associated with this event.","title":"wxSetCursorEvent.setCursor/2","ref":"wxSetCursorEvent.html#setCursor/2"},{"type":"type","doc":"","title":"wxSetCursorEvent.wxSetCursor/0","ref":"wxSetCursorEvent.html#t:wxSetCursor/0"},{"type":"type","doc":"","title":"wxSetCursorEvent.wxSetCursorEvent/0","ref":"wxSetCursorEvent.html#t:wxSetCursorEvent/0"},{"type":"type","doc":"","title":"wxSetCursorEvent.wxSetCursorEventType/0","ref":"wxSetCursorEvent.html#t:wxSetCursorEventType/0"},{"type":"module","doc":"An event being sent when the window is shown or hidden.\n\nThe event is triggered by calls to `wxWindow:show/2`, and any user action showing a previously hidden\nwindow or vice versa (if allowed by the current platform and/or window manager). Notice\nthat the event is not triggered when the application is iconized (minimized) or restored\nunder wxMSW.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:show/2`\n\n* `wxWindow:isShown/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxShowEvent](https://docs.wxwidgets.org/3.2/classwx_show_event.html)","title":"wxShowEvent","ref":"wxShowEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxShowEventType` to subscribe to events of this type.","title":"Events - wxShowEvent","ref":"wxShowEvent.html#module-events"},{"type":"function","doc":"Return true if the window has been shown, false if it has been hidden.","title":"wxShowEvent.isShown/1","ref":"wxShowEvent.html#isShown/1"},{"type":"function","doc":"Set whether the windows was shown or hidden.","title":"wxShowEvent.setShow/2","ref":"wxShowEvent.html#setShow/2"},{"type":"type","doc":"","title":"wxShowEvent.wxShow/0","ref":"wxShowEvent.html#t:wxShow/0"},{"type":"type","doc":"","title":"wxShowEvent.wxShowEvent/0","ref":"wxShowEvent.html#t:wxShowEvent/0"},{"type":"type","doc":"","title":"wxShowEvent.wxShowEventType/0","ref":"wxShowEvent.html#t:wxShowEventType/0"},{"type":"module","doc":"This class represents a dialog that shows a list of strings, and allows the user to\nselect one.\n\nDouble-clicking on a list item is equivalent to single-clicking and then pressing OK.","title":"wxSingleChoiceDialog","ref":"wxSingleChoiceDialog.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxOK: Show an OK button.\n\n* wxCANCEL: Show a Cancel button.\n\n* wxCENTRE: Centre the message.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_singlechoice)\n\n* `m:wxMultiChoiceDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSingleChoiceDialog](https://docs.wxwidgets.org/3.2/classwx_single_choice_dialog.html)","title":"Styles - wxSingleChoiceDialog","ref":"wxSingleChoiceDialog.html#module-styles"},{"type":"function","doc":"Destroys the object","title":"wxSingleChoiceDialog.destroy/1","ref":"wxSingleChoiceDialog.html#destroy/1"},{"type":"function","doc":"Returns the index of selected item.","title":"wxSingleChoiceDialog.getSelection/1","ref":"wxSingleChoiceDialog.html#getSelection/1"},{"type":"function","doc":"Returns the selected string.","title":"wxSingleChoiceDialog.getStringSelection/1","ref":"wxSingleChoiceDialog.html#getStringSelection/1"},{"type":"function","doc":"","title":"wxSingleChoiceDialog.new/4","ref":"wxSingleChoiceDialog.html#new/4"},{"type":"function","doc":"Constructor, taking an array of `wxString` (not implemented in wx) choices and optional\nclient data.\n\nRemark: Use `wxDialog:showModal/1` to show the dialog.","title":"wxSingleChoiceDialog.new/5","ref":"wxSingleChoiceDialog.html#new/5"},{"type":"function","doc":"Sets the index of the initially selected item.","title":"wxSingleChoiceDialog.setSelection/2","ref":"wxSingleChoiceDialog.html#setSelection/2"},{"type":"type","doc":"","title":"wxSingleChoiceDialog.wxSingleChoiceDialog/0","ref":"wxSingleChoiceDialog.html#t:wxSingleChoiceDialog/0"},{"type":"module","doc":"A size event holds information about size change events of `m:wxWindow`.\n\nThe EVT_SIZE handler function will be called when the window has been resized.\n\nYou may wish to use this for frames to resize their child windows as appropriate.\n\nNote that the size passed is of the whole window: call `wxWindow:getClientSize/1` for the area which may be used by\nthe application.\n\nWhen a window is resized, usually only a small part of the window is damaged and you may\nonly need to repaint that area. However, if your drawing depends on the size of the\nwindow, you may need to clear the DC explicitly and repaint the whole window. In which\ncase, you may need to call `wxWindow:refresh/2` to invalidate the entire window.\n\n`Important` : Sizers (see overview_sizer ) rely on size events to function correctly.\nTherefore, in a sizer-based layout, do not forget to call Skip on all size events you\ncatch (and don't catch size events at all when you don't need to).\n\nSee:\n* {Width,Height}\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSizeEvent](https://docs.wxwidgets.org/3.2/classwx_size_event.html)","title":"wxSizeEvent","ref":"wxSizeEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSizeEventType` to subscribe to events of this type.","title":"Events - wxSizeEvent","ref":"wxSizeEvent.html#module-events"},{"type":"function","doc":"","title":"wxSizeEvent.getRect/1","ref":"wxSizeEvent.html#getRect/1"},{"type":"function","doc":"Returns the entire size of the window generating the size change event.\n\nThis is the new total size of the window, i.e. the same size as would be returned by `wxWindow:getSize/1` if\nit were called now. Use `wxWindow:getClientSize/1` if you catch this event in a top level window such as `m:wxFrame`\nto find the size available for the window contents.","title":"wxSizeEvent.getSize/1","ref":"wxSizeEvent.html#getSize/1"},{"type":"type","doc":"","title":"wxSizeEvent.wxSize/0","ref":"wxSizeEvent.html#t:wxSize/0"},{"type":"type","doc":"","title":"wxSizeEvent.wxSizeEvent/0","ref":"wxSizeEvent.html#t:wxSizeEvent/0"},{"type":"type","doc":"","title":"wxSizeEvent.wxSizeEventType/0","ref":"wxSizeEvent.html#t:wxSizeEventType/0"},{"type":"module","doc":"`m:wxSizer` is the abstract base class used for laying out subwindows in a window.\n\nYou cannot use `m:wxSizer` directly; instead, you will have to use one of the sizer\nclasses derived from it. Currently there are `m:wxBoxSizer`, `m:wxStaticBoxSizer`, `m:wxGridSizer`, `m:wxFlexGridSizer`, `wxWrapSizer`\n(not implemented in wx) and `m:wxGridBagSizer`.\n\nThe layout algorithm used by sizers in wxWidgets is closely related to layout in other\nGUI toolkits, such as Java's AWT, the GTK toolkit or the Qt toolkit. It is based upon the\nidea of the individual subwindows reporting their minimal required size and their ability\nto get stretched if the size of the parent window has changed.\n\nThis will most often mean that the programmer does not set the original size of a dialog\nin the beginning, rather the dialog will be assigned a sizer and this sizer will be\nqueried about the recommended size. The sizer in turn will query its children, which can\nbe normal windows, empty space or other sizers, so that a hierarchy of sizers can be\nconstructed. Note that `m:wxSizer` does not derive from `m:wxWindow` and thus does not\ninterfere with tab ordering and requires very little resources compared to a real window\non screen.\n\nWhat makes sizers so well fitted for use in wxWidgets is the fact that every control\nreports its own minimal size and the algorithm can handle differences in font sizes or\ndifferent window (dialog item) sizes on different platforms without problems. If e.g. the\nstandard font as well as the overall design of Motif widgets requires more space than on\nWindows, the initial dialog size will automatically be bigger on Motif than on Windows.\n\nSizers may also be used to control the layout of custom drawn items on the window. The `add/4`, `insert/5`,\nand `prepend/4` functions return a pointer to the newly added `m:wxSizerItem`. Just add empty space\nof the desired size and attributes, and then use the `wxSizerItem:getRect/1` method to determine where the\ndrawing operations should take place.\n\nPlease notice that sizers, like child windows, are owned by the library and will be\ndeleted by it which implies that they must be allocated on the heap. However if you create\na sizer and do not add it to another sizer or window, the library wouldn't be able to\ndelete such an orphan sizer and in this, and only this, case it should be deleted explicitly.\n\nwxSizer flags\n\nThe \"flag\" argument accepted by `m:wxSizerItem` constructors and other functions, e.g. `add/4`,\nis an OR-combination of the following flags. Two main behaviours are defined using these\nflags. One is the border around a window: the border parameter determines the border width\nwhereas the flags given here determine which side(s) of the item that the border will be\nadded. The other flags determine how the sizer item behaves when the space allotted to the\nsizer changes, and is somewhat dependent on the specific kind of sizer used.\n\nSee: [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nwxWidgets docs: [wxSizer](https://docs.wxwidgets.org/3.2/classwx_sizer.html)","title":"wxSizer","ref":"wxSizer.html"},{"type":"function","doc":"","title":"wxSizer.add/2","ref":"wxSizer.html#add/2"},{"type":"function","doc":"Appends a child to the sizer.\n\n`m:wxSizer` itself is an abstract class, but the parameters are equivalent in the derived\nclasses that you will instantiate to use it so they are described here:","title":"wxSizer.add/3","ref":"wxSizer.html#add/3"},{"type":"function","doc":"Appends a spacer child to the sizer.","title":"wxSizer.add/4","ref":"wxSizer.html#add/4"},{"type":"function","doc":"This base function adds non-stretchable space to both the horizontal and vertical\norientation of the sizer.\n\nMore readable way of calling:\n\nSee: `addSpacer/2`","title":"wxSizer.addSpacer/2","ref":"wxSizer.html#addSpacer/2"},{"type":"function","doc":"","title":"wxSizer.addStretchSpacer/1","ref":"wxSizer.html#addStretchSpacer/1"},{"type":"function","doc":"Adds stretchable space to the sizer.\n\nMore readable way of calling:","title":"wxSizer.addStretchSpacer/2","ref":"wxSizer.html#addStretchSpacer/2"},{"type":"function","doc":"This method is abstract and has to be overwritten by any derived class.\n\nHere, the sizer will do the actual calculation of its children's minimal sizes.","title":"wxSizer.calcMin/1","ref":"wxSizer.html#calcMin/1"},{"type":"function","doc":"","title":"wxSizer.clear/1","ref":"wxSizer.html#clear/1"},{"type":"function","doc":"Detaches all children from the sizer.\n\nIf `delete_windows` is true then child windows will also be deleted.\n\nNotice that child sizers are always deleted, as a general consequence of the principle\nthat sizers own their sizer children, but don't own their window children (because they\nare already owned by their parent windows).","title":"wxSizer.clear/2","ref":"wxSizer.html#clear/2"},{"type":"function","doc":"Detach a item at position `index` from the sizer without destroying it.\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after detaching a child from the sizer. Returns true if the child item\nwas found and detached, false otherwise.\n\nSee: `remove/2`","title":"wxSizer.detach/2","ref":"wxSizer.html#detach/2"},{"type":"function","doc":"Tell the sizer to resize the `window` so that its client area matches the sizer's minimal\nsize (`ComputeFittingClientSize()` (not implemented in wx) is called to determine it).\n\nThis is commonly done in the constructor of the window itself, see sample in the\ndescription of `m:wxBoxSizer`.\n\nReturn: The new window size.","title":"wxSizer.fit/2","ref":"wxSizer.html#fit/2"},{"type":"function","doc":"Tell the sizer to resize the virtual size of the `window` to match the sizer's minimal\nsize.\n\nThis will not alter the on screen size of the window, but may cause the\naddition/removal/alteration of scrollbars required to view the virtual area in windows\nwhich manage it.\n\nSee:\n* `wxScrolledWindow:setScrollbars/6`\n\n* `setVirtualSizeHints/2`","title":"wxSizer.fitInside/2","ref":"wxSizer.html#fitInside/2"},{"type":"function","doc":"","title":"wxSizer.getChildren/1","ref":"wxSizer.html#getChildren/1"},{"type":"function","doc":"Finds `m:wxSizerItem` which is located in the sizer at position `index`.\n\nUse parameter `recursive` to search in subsizers too. Returns pointer to item or NULL.","title":"wxSizer.getItem/2","ref":"wxSizer.html#getItem/2"},{"type":"function","doc":"Finds `m:wxSizerItem` which holds the given `window`.\n\nUse parameter `recursive` to search in subsizers too. Returns pointer to item or NULL.","title":"wxSizer.getItem/3","ref":"wxSizer.html#getItem/3"},{"type":"function","doc":"Returns the minimal size of the sizer.\n\nThis is either the combined minimal size of all the children and their borders or the\nminimal size set by `setMinSize/3`, depending on which is bigger. Note that the returned value is client\nsize, not window size. In particular, if you use the value to set toplevel window's\nminimal or actual size, use `wxWindow::SetMinClientSize()` (not implemented in wx) or `wxWindow:setClientSize/3`,\nnot `wxWindow:setMinSize/2` or `wxWindow:setSize/6`.","title":"wxSizer.getMinSize/1","ref":"wxSizer.html#getMinSize/1"},{"type":"function","doc":"Returns the current position of the sizer.","title":"wxSizer.getPosition/1","ref":"wxSizer.html#getPosition/1"},{"type":"function","doc":"Returns the current size of the sizer.","title":"wxSizer.getSize/1","ref":"wxSizer.html#getSize/1"},{"type":"function","doc":"Hides the item at position `index`.\n\nTo make a sizer item disappear, use `hide/3` followed by `layout/1`.\n\nUse parameter `recursive` to hide elements found in subsizers. Returns true if the child\nitem was found, false otherwise.\n\nSee:\n* `isShown/2`\n\n* `show/3`","title":"wxSizer.hide/2","ref":"wxSizer.html#hide/2"},{"type":"function","doc":"Hides the child `window`.\n\nTo make a sizer item disappear, use `hide/3` followed by `layout/1`.\n\nUse parameter `recursive` to hide elements found in subsizers. Returns true if the child\nitem was found, false otherwise.\n\nSee:\n* `isShown/2`\n\n* `show/3`","title":"wxSizer.hide/3","ref":"wxSizer.html#hide/3"},{"type":"function","doc":"","title":"wxSizer.insert/3","ref":"wxSizer.html#insert/3"},{"type":"function","doc":"Insert a child into the sizer before any existing item at `index`.\n\nSee `add/4` for the meaning of the other parameters.","title":"wxSizer.insert/4","ref":"wxSizer.html#insert/4"},{"type":"function","doc":"Insert a child into the sizer before any existing item at `index`.\n\nSee `add/4` for the meaning of the other parameters.","title":"wxSizer.insert/5","ref":"wxSizer.html#insert/5"},{"type":"function","doc":"Inserts non-stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Insert(index, size, size).","title":"wxSizer.insertSpacer/3","ref":"wxSizer.html#insertSpacer/3"},{"type":"function","doc":"","title":"wxSizer.insertStretchSpacer/2","ref":"wxSizer.html#insertStretchSpacer/2"},{"type":"function","doc":"Inserts stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Insert(0, 0, prop).","title":"wxSizer.insertStretchSpacer/3","ref":"wxSizer.html#insertStretchSpacer/3"},{"type":"function","doc":"Returns true if the item at `index` is shown.\n\nSee:\n* `hide/3`\n\n* `show/3`\n\n* `wxSizerItem:isShown/1`","title":"wxSizer.isShown/2","ref":"wxSizer.html#isShown/2"},{"type":"function","doc":"Call this to force layout of the children anew, e.g. after having added a child to or\nremoved a child (window, other sizer or space) from the sizer while keeping the current\ndimension.","title":"wxSizer.layout/1","ref":"wxSizer.html#layout/1"},{"type":"function","doc":"","title":"wxSizer.prepend/2","ref":"wxSizer.html#prepend/2"},{"type":"function","doc":"Same as `add/4`, but prepends the items to the beginning of the list of items (windows,\nsubsizers or spaces) owned by this sizer.","title":"wxSizer.prepend/3","ref":"wxSizer.html#prepend/3"},{"type":"function","doc":"Same as `add/4`, but prepends the items to the beginning of the list of items (windows,\nsubsizers or spaces) owned by this sizer.","title":"wxSizer.prepend/4","ref":"wxSizer.html#prepend/4"},{"type":"function","doc":"Prepends non-stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Prepend(size, size, 0).","title":"wxSizer.prependSpacer/2","ref":"wxSizer.html#prependSpacer/2"},{"type":"function","doc":"","title":"wxSizer.prependStretchSpacer/1","ref":"wxSizer.html#prependStretchSpacer/1"},{"type":"function","doc":"Prepends stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Prepend(0, 0, prop).","title":"wxSizer.prependStretchSpacer/2","ref":"wxSizer.html#prependStretchSpacer/2"},{"type":"function","doc":"Equivalent to: `layout/1`","title":"wxSizer.recalcSizes/1","ref":"wxSizer.html#recalcSizes/1"},{"type":"function","doc":"Removes a sizer child from the sizer and destroys it.\n\nNote: This method does not cause any layout or resizing to take place, call `layout/1` to update\nthe layout \"on screen\" after removing a child from the sizer.\n\nReturn: true if the child item was found and removed, false otherwise.","title":"wxSizer.remove/2","ref":"wxSizer.html#remove/2"},{"type":"function","doc":"Detaches the given item at position `index` from the sizer and replaces it with the given `m:wxSizerItem`\n`newitem`.\n\nThe detached child is deleted `only` if it is a sizer or a spacer (but not if it is a `m:wxWindow`\nbecause windows are owned by their parent window, not the sizer).\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after replacing a child from the sizer.\n\nReturns true if the child item was found and removed, false otherwise.","title":"wxSizer.replace/3","ref":"wxSizer.html#replace/3"},{"type":"function","doc":"Detaches the given `oldwin` from the sizer and replaces it with the given `newwin`.\n\nThe detached child window is `not` deleted (because windows are owned by their parent\nwindow, not the sizer).\n\nUse parameter `recursive` to search the given element recursively in subsizers.\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after replacing a child from the sizer.\n\nReturns true if the child item was found and removed, false otherwise.","title":"wxSizer.replace/4","ref":"wxSizer.html#replace/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxSizer.setDimension/3","ref":"wxSizer.html#setDimension/3"},{"type":"function","doc":"Call this to force the sizer to take the given dimension and thus force the items owned\nby the sizer to resize themselves according to the rules defined by the parameter in the `add/4`\nand `prepend/4` methods.","title":"wxSizer.setDimension/5","ref":"wxSizer.html#setDimension/5"},{"type":"function","doc":"","title":"wxSizer.setItemMinSize/3","ref":"wxSizer.html#setItemMinSize/3"},{"type":"function","doc":"","title":"wxSizer.setItemMinSize/4","ref":"wxSizer.html#setItemMinSize/4"},{"type":"function","doc":"Call this to give the sizer a minimal size.\n\nNormally, the sizer will calculate its minimal size based purely on how much space its\nchildren need. After calling this method `getMinSize/1` will return either the minimal size as requested\nby its children or the minimal size set here, depending on which is bigger.","title":"wxSizer.setMinSize/2","ref":"wxSizer.html#setMinSize/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxSizer.setMinSize/3","ref":"wxSizer.html#setMinSize/3"},{"type":"function","doc":"This method first calls `fit/2` and then `setSizeHints/2` on the `window` passed to it.\n\nThis only makes sense when `window` is actually a `m:wxTopLevelWindow` such as a `m:wxFrame`\nor a `m:wxDialog`, since SetSizeHints only has any effect in these classes. It does\nnothing in normal windows or controls.\n\nThis method is implicitly used by `wxWindow:setSizerAndFit/3` which is commonly invoked in the constructor of a\ntoplevel window itself (see the sample in the description of `m:wxBoxSizer`) if the\ntoplevel window is resizable.","title":"wxSizer.setSizeHints/2","ref":"wxSizer.html#setSizeHints/2"},{"type":"function","doc":"Equivalent to: `fitInside/2`","title":"wxSizer.setVirtualSizeHints/2","ref":"wxSizer.html#setVirtualSizeHints/2"},{"type":"function","doc":"","title":"wxSizer.show/2","ref":"wxSizer.html#show/2"},{"type":"function","doc":"Shows the item at `index`.\n\nTo make a sizer item disappear or reappear, use `show/3` followed by `layout/1`.\n\nReturns true if the child item was found, false otherwise.\n\nSee:\n* `hide/3`\n\n* `isShown/2`","title":"wxSizer.show/3","ref":"wxSizer.html#show/3"},{"type":"function","doc":"Show or hide all items managed by the sizer.","title":"wxSizer.showItems/2","ref":"wxSizer.html#showItems/2"},{"type":"type","doc":"","title":"wxSizer.wxSizer/0","ref":"wxSizer.html#t:wxSizer/0"},{"type":"module","doc":"Container for sizer items flags providing readable names for them.\n\nNormally, when you add an item to a sizer via `wxSizer:add/4`, you have to specify a lot of flags and\nparameters which can be unwieldy. This is where `m:wxSizerFlags` comes in: it allows you\nto specify all parameters using the named methods instead. For example, instead of\n\nyou can now write\n\nThis is more readable and also allows you to create `m:wxSizerFlags` objects which can be\nreused for several sizer items.\n\nNote that by specification, all methods of `m:wxSizerFlags` return the `m:wxSizerFlags`\nobject itself to allowing chaining multiple methods calls like in the examples above.\n\nSee: `m:wxSizer`\n\nwxWidgets docs: [wxSizerFlags](https://docs.wxwidgets.org/3.2/classwx_sizer_flags.html)","title":"wxSizerFlags","ref":"wxSizerFlags.html"},{"type":"function","doc":"Sets the alignment of this `m:wxSizerFlags` to `align`.\n\nThis method replaces the previously set alignment with the specified one.\n\nSee:\n* `left/1`\n\n* `right/1`\n\n* `centre/1`","title":"wxSizerFlags.align/2","ref":"wxSizerFlags.html#align/2"},{"type":"function","doc":"","title":"wxSizerFlags.border/1","ref":"wxSizerFlags.html#border/1"},{"type":"function","doc":"Sets the `m:wxSizerFlags` to have a border with size as returned by `GetDefaultBorder()`\n(not implemented in wx).","title":"wxSizerFlags.border/2","ref":"wxSizerFlags.html#border/2"},{"type":"function","doc":"Sets the `m:wxSizerFlags` to have a border of a number of pixels specified by `borderinpixels`\nwith the directions specified by `direction`.\n\nPrefer to use the overload below or `DoubleBorder()` (not implemented in wx) or `TripleBorder()`\n(not implemented in wx) versions instead of hard-coding the border value in pixels to\navoid too small borders on devices with high DPI displays.","title":"wxSizerFlags.border/3","ref":"wxSizerFlags.html#border/3"},{"type":"function","doc":"Sets the object of the `m:wxSizerFlags` to center itself in the area it is given.","title":"wxSizerFlags.center/1","ref":"wxSizerFlags.html#center/1"},{"type":"function","doc":"Equivalent to: `center/1`","title":"wxSizerFlags.centre/1","ref":"wxSizerFlags.html#centre/1"},{"type":"function","doc":"Destroys the object","title":"wxSizerFlags.destroy/1","ref":"wxSizerFlags.html#destroy/1"},{"type":"function","doc":"Sets the object of the `m:wxSizerFlags` to expand to fill as much area as it can.","title":"wxSizerFlags.expand/1","ref":"wxSizerFlags.html#expand/1"},{"type":"function","doc":"Aligns the object to the left, similar for `Align(wxALIGN\\_LEFT)`.\n\nUnlike `align/2`, this method doesn't change the vertical alignment of the item.","title":"wxSizerFlags.left/1","ref":"wxSizerFlags.html#left/1"},{"type":"function","doc":"","title":"wxSizerFlags.new/0","ref":"wxSizerFlags.html#new/0"},{"type":"function","doc":"Creates the `m:wxSizer` with the proportion specified by `proportion`.","title":"wxSizerFlags.new/1","ref":"wxSizerFlags.html#new/1"},{"type":"function","doc":"Sets the proportion of this `m:wxSizerFlags` to `proportion`.","title":"wxSizerFlags.proportion/2","ref":"wxSizerFlags.html#proportion/2"},{"type":"function","doc":"Aligns the object to the right, similar for `Align(wxALIGN\\_RIGHT)`.\n\nUnlike `align/2`, this method doesn't change the vertical alignment of the item.","title":"wxSizerFlags.right/1","ref":"wxSizerFlags.html#right/1"},{"type":"type","doc":"","title":"wxSizerFlags.wxSizerFlags/0","ref":"wxSizerFlags.html#t:wxSizerFlags/0"},{"type":"module","doc":"The `m:wxSizerItem` class is used to track the position, size and other attributes of\neach item managed by a `m:wxSizer`.\n\nIt is not usually necessary to use this class because the sizer elements can also be\nidentified by their positions or window or sizer pointers but sometimes it may be more\nconvenient to use it directly.\n\nwxWidgets docs: [wxSizerItem](https://docs.wxwidgets.org/3.2/classwx_sizer_item.html)","title":"wxSizerItem","ref":"wxSizerItem.html"},{"type":"function","doc":"Set the sizer tracked by this item.\n\nOld sizer, if any, is deleted.","title":"wxSizerItem.assignSizer/2","ref":"wxSizerItem.html#assignSizer/2"},{"type":"function","doc":"Set the size of the spacer tracked by this item.\n\nOld spacer, if any, is deleted.","title":"wxSizerItem.assignSpacer/2","ref":"wxSizerItem.html#assignSpacer/2"},{"type":"function","doc":"","title":"wxSizerItem.assignSpacer/3","ref":"wxSizerItem.html#assignSpacer/3"},{"type":"function","doc":"Set the window to be tracked by this item.\n\nNote: This is a low-level method which is dangerous if used incorrectly, avoid using it\nif possible, i.e. if higher level methods such as `wxSizer:replace/4` can be used instead.\n\nIf the sizer item previously contained a window, it is dissociated from the sizer\ncontaining this sizer item (if any), but this object doesn't have the pointer to the\ncontaining sizer and so it's the caller's responsibility to call `wxWindow:setContainingSizer/2` on `window`. Failure to\ndo this can result in memory corruption when the window is destroyed later, so it is\ncrucial to not forget to do it.\n\nAlso note that the previously contained window is `not` deleted, so it's also the callers\nresponsibility to do it, if necessary.","title":"wxSizerItem.assignWindow/2","ref":"wxSizerItem.html#assignWindow/2"},{"type":"function","doc":"Calculates the minimum desired size for the item, including any space needed by borders.","title":"wxSizerItem.calcMin/1","ref":"wxSizerItem.html#calcMin/1"},{"type":"function","doc":"Destroy the window or the windows in a subsizer, depending on the type of item.","title":"wxSizerItem.deleteWindows/1","ref":"wxSizerItem.html#deleteWindows/1"},{"type":"function","doc":"Destroys the object","title":"wxSizerItem.destroy/1","ref":"wxSizerItem.html#destroy/1"},{"type":"function","doc":"Enable deleting the SizerItem without destroying the contained sizer.","title":"wxSizerItem.detachSizer/1","ref":"wxSizerItem.html#detachSizer/1"},{"type":"function","doc":"Return the border attribute.","title":"wxSizerItem.getBorder/1","ref":"wxSizerItem.html#getBorder/1"},{"type":"function","doc":"Return the flags attribute.\n\nSee `wxSizer flags list` (not implemented in wx) for details.","title":"wxSizerItem.getFlag/1","ref":"wxSizerItem.html#getFlag/1"},{"type":"function","doc":"Get the minimum size needed for the item.","title":"wxSizerItem.getMinSize/1","ref":"wxSizerItem.html#getMinSize/1"},{"type":"function","doc":"What is the current position of the item, as set in the last Layout.","title":"wxSizerItem.getPosition/1","ref":"wxSizerItem.html#getPosition/1"},{"type":"function","doc":"Get the proportion item attribute.","title":"wxSizerItem.getProportion/1","ref":"wxSizerItem.html#getProportion/1"},{"type":"function","doc":"Get the ratio item attribute.","title":"wxSizerItem.getRatio/1","ref":"wxSizerItem.html#getRatio/1"},{"type":"function","doc":"Get the rectangle of the item on the parent window, excluding borders.","title":"wxSizerItem.getRect/1","ref":"wxSizerItem.html#getRect/1"},{"type":"function","doc":"Get the current size of the item, as set in the last Layout.","title":"wxSizerItem.getSize/1","ref":"wxSizerItem.html#getSize/1"},{"type":"function","doc":"If this item is tracking a sizer, return it.\n\nNULL otherwise.","title":"wxSizerItem.getSizer/1","ref":"wxSizerItem.html#getSizer/1"},{"type":"function","doc":"If this item is tracking a spacer, return its size.","title":"wxSizerItem.getSpacer/1","ref":"wxSizerItem.html#getSpacer/1"},{"type":"function","doc":"Get the userData item attribute.","title":"wxSizerItem.getUserData/1","ref":"wxSizerItem.html#getUserData/1"},{"type":"function","doc":"If this item is tracking a window then return it.\n\nNULL otherwise.","title":"wxSizerItem.getWindow/1","ref":"wxSizerItem.html#getWindow/1"},{"type":"function","doc":"Returns true if this item is a window or a spacer and it is shown or if this item is a\nsizer and not all of its elements are hidden.\n\nIn other words, for sizer items, all of the child elements must be hidden for the sizer\nitself to be considered hidden.\n\nAs an exception, if the `wxRESERVE_SPACE_EVEN_IF_HIDDEN` flag was used for this sizer\nitem, then `isShown/1` always returns true for it (see `wxSizerFlags::ReserveSpaceEvenIfHidden()`\n(not implemented in wx)).","title":"wxSizerItem.isShown/1","ref":"wxSizerItem.html#isShown/1"},{"type":"function","doc":"Is this item a sizer?","title":"wxSizerItem.isSizer/1","ref":"wxSizerItem.html#isSizer/1"},{"type":"function","doc":"Is this item a spacer?","title":"wxSizerItem.isSpacer/1","ref":"wxSizerItem.html#isSpacer/1"},{"type":"function","doc":"Is this item a window?","title":"wxSizerItem.isWindow/1","ref":"wxSizerItem.html#isWindow/1"},{"type":"function","doc":"","title":"wxSizerItem.new/1","ref":"wxSizerItem.html#new/1"},{"type":"function","doc":"","title":"wxSizerItem.new/2","ref":"wxSizerItem.html#new/2"},{"type":"function","doc":"Construct a sizer item for tracking a spacer.","title":"wxSizerItem.new/3","ref":"wxSizerItem.html#new/3"},{"type":"function","doc":"Set the border item attribute.","title":"wxSizerItem.setBorder/2","ref":"wxSizerItem.html#setBorder/2"},{"type":"function","doc":"Set the position and size of the space allocated to the sizer, and adjust the position\nand size of the item to be within that space taking alignment and borders into account.","title":"wxSizerItem.setDimension/3","ref":"wxSizerItem.html#setDimension/3"},{"type":"function","doc":"Set the flag item attribute.","title":"wxSizerItem.setFlag/2","ref":"wxSizerItem.html#setFlag/2"},{"type":"function","doc":"Sets the minimum size to be allocated for this item.\n\nThis is identical to `setMinSize/3`, prefer to use the other function, as its name is more clear.","title":"wxSizerItem.setInitSize/3","ref":"wxSizerItem.html#setInitSize/3"},{"type":"function","doc":"Sets the minimum size to be allocated for this item.\n\nIf this item is a window, the `size` is also passed to `wxWindow:setMinSize/2`.","title":"wxSizerItem.setMinSize/2","ref":"wxSizerItem.html#setMinSize/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxSizerItem.setMinSize/3","ref":"wxSizerItem.html#setMinSize/3"},{"type":"function","doc":"Set the proportion item attribute.","title":"wxSizerItem.setProportion/2","ref":"wxSizerItem.html#setProportion/2"},{"type":"function","doc":"","title":"wxSizerItem.setRatio/2","ref":"wxSizerItem.html#setRatio/2"},{"type":"function","doc":"Set the ratio item attribute.","title":"wxSizerItem.setRatio/3","ref":"wxSizerItem.html#setRatio/3"},{"type":"function","doc":"Set the show item attribute, which sizers use to determine if the item is to be made part\nof the layout or not.\n\nIf the item is tracking a window then it is shown or hidden as needed.","title":"wxSizerItem.show/2","ref":"wxSizerItem.html#show/2"},{"type":"type","doc":"","title":"wxSizerItem.wxSizerItem/0","ref":"wxSizerItem.html#t:wxSizerItem/0"},{"type":"module","doc":"A slider is a control with a handle which can be pulled back and forth to change the\nvalue.\n\nOn Windows, the track bar control is used.\n\nOn GTK+, tick marks are only available for version 2.16 and later.\n\nSlider generates the same events as `m:wxScrollBar` but in practice the most convenient\nway to process `m:wxSlider` updates is by handling the slider-specific `wxEVT_SLIDER`\nevent which carries `m:wxCommandEvent` containing just the latest slider position.","title":"wxSlider","ref":"wxSlider.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSL_HORIZONTAL: Displays the slider horizontally (this is the default).\n\n* wxSL_VERTICAL: Displays the slider vertically.\n\n* wxSL_AUTOTICKS: Displays tick marks (Windows, GTK+ 2.16 and later).\n\n* wxSL_MIN_MAX_LABELS: Displays minimum, maximum labels (new since wxWidgets 2.9.1).\n\n* wxSL_VALUE_LABEL: Displays value label (new since wxWidgets 2.9.1).\n\n* wxSL_LABELS: Displays minimum, maximum and value labels (same as wxSL_VALUE_LABEL and\nwxSL_MIN_MAX_LABELS together).\n\n* wxSL_LEFT: Displays ticks on the left and forces the slider to be vertical (Windows and\nGTK+ 3 only).\n\n* wxSL_RIGHT: Displays ticks on the right and forces the slider to be vertical.\n\n* wxSL_TOP: Displays ticks on the top (Windows and GTK+ 3 only).\n\n* wxSL_BOTTOM: Displays ticks on the bottom (this is the default).\n\n* wxSL_BOTH: Displays ticks on both sides of the slider. Windows only.\n\n* wxSL_SELRANGE: Displays a highlighted selection range. Windows only.\n\n* wxSL_INVERSE: Inverses the minimum and maximum endpoints on the slider. Not compatible\nwith wxSL_SELRANGE. Notice that `wxSL_LEFT`, `wxSL_TOP`, `wxSL_RIGHT` and `wxSL_BOTTOM`\nspecify the position of the slider ticks and that the slider labels, if any, are\npositioned on the opposite side. So, to have a label on the left side of a vertical\nslider, `wxSL_RIGHT` must be used (or none of these styles at all should be specified as\nleft and top are default positions for the vertical and horizontal sliders respectively).\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen). In short, the EVT_SCROLL_CHANGED event is\ntriggered when scrolling/ moving has finished independently of the way it had started.\nPlease see the page_samples_widgets (\"Slider\" page) to see the difference between\nEVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxScrollBar`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSlider](https://docs.wxwidgets.org/3.2/classwx_slider.html)","title":"Styles - wxSlider","ref":"wxSlider.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`command_slider_updated`](`m:wxCommandEvent`)","title":"Events - wxSlider","ref":"wxSlider.html#module-events"},{"type":"function","doc":"","title":"wxSlider.create/6","ref":"wxSlider.html#create/6"},{"type":"function","doc":"Used for two-step slider construction.\n\nSee `new/6` for further details.","title":"wxSlider.create/7","ref":"wxSlider.html#create/7"},{"type":"function","doc":"Destroys the object","title":"wxSlider.destroy/1","ref":"wxSlider.html#destroy/1"},{"type":"function","doc":"Returns the line size.\n\nSee: `setLineSize/2`","title":"wxSlider.getLineSize/1","ref":"wxSlider.html#getLineSize/1"},{"type":"function","doc":"Gets the maximum slider value.\n\nSee:\n* `getMin/1`\n\n* `setRange/3`","title":"wxSlider.getMax/1","ref":"wxSlider.html#getMax/1"},{"type":"function","doc":"Gets the minimum slider value.\n\nSee:\n* `getMin/1`\n\n* `setRange/3`","title":"wxSlider.getMin/1","ref":"wxSlider.html#getMin/1"},{"type":"function","doc":"Returns the page size.\n\nSee: `setPageSize/2`","title":"wxSlider.getPageSize/1","ref":"wxSlider.html#getPageSize/1"},{"type":"function","doc":"Returns the thumb length.\n\nOnly for:wxmsw\n\nSee: `setThumbLength/2`","title":"wxSlider.getThumbLength/1","ref":"wxSlider.html#getThumbLength/1"},{"type":"function","doc":"Gets the current slider value.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`\n\n* `setValue/2`","title":"wxSlider.getValue/1","ref":"wxSlider.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxSlider.new/0","ref":"wxSlider.html#new/0"},{"type":"function","doc":"","title":"wxSlider.new/5","ref":"wxSlider.html#new/5"},{"type":"function","doc":"Constructor, creating and showing a slider.\n\nSee: `create/7`","title":"wxSlider.new/6","ref":"wxSlider.html#new/6"},{"type":"function","doc":"Sets the line size for the slider.\n\nSee: `getLineSize/1`","title":"wxSlider.setLineSize/2","ref":"wxSlider.html#setLineSize/2"},{"type":"function","doc":"Sets the page size for the slider.\n\nSee: `getPageSize/1`","title":"wxSlider.setPageSize/2","ref":"wxSlider.html#setPageSize/2"},{"type":"function","doc":"Sets the minimum and maximum slider values.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`","title":"wxSlider.setRange/3","ref":"wxSlider.html#setRange/3"},{"type":"function","doc":"Sets the slider thumb length.\n\nOnly for:wxmsw\n\nSee: `getThumbLength/1`","title":"wxSlider.setThumbLength/2","ref":"wxSlider.html#setThumbLength/2"},{"type":"function","doc":"Sets the slider position.","title":"wxSlider.setValue/2","ref":"wxSlider.html#setValue/2"},{"type":"type","doc":"","title":"wxSlider.wxSlider/0","ref":"wxSlider.html#t:wxSlider/0"},{"type":"module","doc":"A `m:wxSpinButton` has two small up and down (or left and right) arrow buttons.\n\nIt is often used next to a text control for increment and decrementing a value. Portable\nprograms should try to use `m:wxSpinCtrl` instead as `m:wxSpinButton` is not implemented\nfor all platforms but `m:wxSpinCtrl` is as it degenerates to a simple `m:wxTextCtrl` on\nsuch platforms.\n\nNote: the range supported by this control (and `m:wxSpinCtrl`) depends on the platform\nbut is at least `-0x8000` to `0x7fff`. Under GTK and Win32 with sufficiently new version\nof `comctrl32.dll` (at least 4.71 is required, 5.80 is recommended) the full 32 bit range\nis supported.","title":"wxSpinButton","ref":"wxSpinButton.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSP_HORIZONTAL: Specifies a horizontal spin button (note that this style is not\nsupported in wxGTK).\n\n* wxSP_VERTICAL: Specifies a vertical spin button.\n\n* wxSP_ARROW_KEYS: The user can use arrow keys to change the value.\n\n* wxSP_WRAP: The value wraps at the minimum and maximum.\n\nSee: `m:wxSpinCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSpinButton](https://docs.wxwidgets.org/3.2/classwx_spin_button.html)","title":"Styles - wxSpinButton","ref":"wxSpinButton.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`spin`](`m:wxSpinEvent`)\n\n* [`spin_up`](`m:wxSpinEvent`)\n\n* [`spin_down`](`m:wxSpinEvent`)","title":"Events - wxSpinButton","ref":"wxSpinButton.html#module-events"},{"type":"function","doc":"","title":"wxSpinButton.create/2","ref":"wxSpinButton.html#create/2"},{"type":"function","doc":"Scrollbar creation function called by the spin button constructor.\n\nSee `new/2` for details.","title":"wxSpinButton.create/3","ref":"wxSpinButton.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxSpinButton.destroy/1","ref":"wxSpinButton.html#destroy/1"},{"type":"function","doc":"Returns the maximum permissible value.\n\nSee: `setRange/3`","title":"wxSpinButton.getMax/1","ref":"wxSpinButton.html#getMax/1"},{"type":"function","doc":"Returns the minimum permissible value.\n\nSee: `setRange/3`","title":"wxSpinButton.getMin/1","ref":"wxSpinButton.html#getMin/1"},{"type":"function","doc":"Returns the current spin button value.\n\nSee: `setValue/2`","title":"wxSpinButton.getValue/1","ref":"wxSpinButton.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxSpinButton.new/0","ref":"wxSpinButton.html#new/0"},{"type":"function","doc":"","title":"wxSpinButton.new/1","ref":"wxSpinButton.html#new/1"},{"type":"function","doc":"Constructor, creating and showing a spin button.\n\nSee: `create/3`","title":"wxSpinButton.new/2","ref":"wxSpinButton.html#new/2"},{"type":"function","doc":"Sets the range of the spin button.\n\nIn portable code, `min` should be less than or equal to `max`. In wxMSW it is possible to\nspecify minimum greater than maximum and the native control supports the same range as if\nthey were reversed, but swaps the meaning of up and down arrows, however this dubious\nfeature is not supported on other platforms.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`","title":"wxSpinButton.setRange/3","ref":"wxSpinButton.html#setRange/3"},{"type":"function","doc":"Sets the value of the spin button.","title":"wxSpinButton.setValue/2","ref":"wxSpinButton.html#setValue/2"},{"type":"type","doc":"","title":"wxSpinButton.wxSpinButton/0","ref":"wxSpinButton.html#t:wxSpinButton/0"},{"type":"module","doc":"`m:wxSpinCtrl` combines `m:wxTextCtrl` and `m:wxSpinButton` in one control.","title":"wxSpinCtrl","ref":"wxSpinCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSP_ARROW_KEYS: The user can use arrow keys to change the value.\n\n* wxSP_WRAP: The value wraps at the minimum and maximum.\n\n* wxTE_PROCESS_ENTER: Indicates that the control should generate `wxEVT_TEXT_ENTER` events.\nUsing this style will prevent the user from using the Enter key for dialog navigation\n(e.g. activating the default button in the dialog) under MSW.\n\n* wxALIGN_LEFT: Same as wxTE_LEFT for `m:wxTextCtrl`: the text is left aligned (this is the\ndefault).\n\n* wxALIGN_CENTRE_HORIZONTAL: Same as wxTE_CENTRE for `m:wxTextCtrl`: the text is centered.\n\n* wxALIGN_RIGHT: Same as wxTE_RIGHT for `m:wxTextCtrl`: the text is right aligned.\n\nSee:\n* `m:wxSpinButton`\n\n* `m:wxControl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSpinCtrl](https://docs.wxwidgets.org/3.2/classwx_spin_ctrl.html)","title":"Styles - wxSpinCtrl","ref":"wxSpinCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_spinctrl_updated`](`m:wxSpinEvent`)","title":"Events - wxSpinCtrl","ref":"wxSpinCtrl.html#module-events"},{"type":"function","doc":"","title":"wxSpinCtrl.create/2","ref":"wxSpinCtrl.html#create/2"},{"type":"function","doc":"Creation function called by the spin control constructor.\n\nSee `new/2` for details.","title":"wxSpinCtrl.create/3","ref":"wxSpinCtrl.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxSpinCtrl.destroy/1","ref":"wxSpinCtrl.html#destroy/1"},{"type":"function","doc":"Gets maximal allowable value.","title":"wxSpinCtrl.getMax/1","ref":"wxSpinCtrl.html#getMax/1"},{"type":"function","doc":"Gets minimal allowable value.","title":"wxSpinCtrl.getMin/1","ref":"wxSpinCtrl.html#getMin/1"},{"type":"function","doc":"Gets the value of the spin control.","title":"wxSpinCtrl.getValue/1","ref":"wxSpinCtrl.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxSpinCtrl.new/0","ref":"wxSpinCtrl.html#new/0"},{"type":"function","doc":"","title":"wxSpinCtrl.new/1","ref":"wxSpinCtrl.html#new/1"},{"type":"function","doc":"Constructor, creating and showing a spin control.\n\nIf `value` is non-empty, it will be shown in the text entry part of the control and if it\nhas numeric value, the initial numeric value of the control, as returned by `getValue/1` will also be\ndetermined by it instead of by `initial`. Hence, it only makes sense to specify `initial`\nif `value` is an empty string or is not convertible to a number, otherwise `initial` is\nsimply ignored and the number specified by `value` is used.\n\nSee: `create/3`","title":"wxSpinCtrl.new/2","ref":"wxSpinCtrl.html#new/2"},{"type":"function","doc":"Sets range of allowable values.\n\nNotice that calling this method may change the value of the control if it's not inside\nthe new valid range, e.g. it will become `minVal` if it is less than it now. However no `wxEVT_SPINCTRL`\nevent is generated, even if it the value does change.\n\nNote: Setting a range including negative values is silently ignored if current base is\nset to 16.","title":"wxSpinCtrl.setRange/3","ref":"wxSpinCtrl.html#setRange/3"},{"type":"function","doc":"Select the text in the text part of the control between positions `from` (inclusive) and `to`\n(exclusive).\n\nThis is similar to `wxTextCtrl:setSelection/3`.\n\nNote: this is currently only implemented for Windows and generic versions of the control.","title":"wxSpinCtrl.setSelection/3","ref":"wxSpinCtrl.html#setSelection/3"},{"type":"function","doc":"Sets the value of the spin control.\n\nIt is recommended to use the overload taking an integer value instead.\n\nNotice that, unlike `wxTextCtrl:setValue/2`, but like most of the other setter methods in wxWidgets, calling\nthis method does not generate any events as events are only generated for the user\nactions.","title":"wxSpinCtrl.setValue/2","ref":"wxSpinCtrl.html#setValue/2"},{"type":"type","doc":"","title":"wxSpinCtrl.wxSpinCtrl/0","ref":"wxSpinCtrl.html#t:wxSpinCtrl/0"},{"type":"module","doc":"This event class is used for the events generated by `m:wxSpinButton` and `m:wxSpinCtrl`.\n\nSee:\n* `m:wxSpinButton`\n\n* `m:wxSpinCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSpinEvent](https://docs.wxwidgets.org/3.2/classwx_spin_event.html)","title":"wxSpinEvent","ref":"wxSpinEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSpinEventType` to subscribe to events of this type.","title":"Events - wxSpinEvent","ref":"wxSpinEvent.html#module-events"},{"type":"function","doc":"Retrieve the current spin button or control value.","title":"wxSpinEvent.getPosition/1","ref":"wxSpinEvent.html#getPosition/1"},{"type":"function","doc":"Set the value associated with the event.","title":"wxSpinEvent.setPosition/2","ref":"wxSpinEvent.html#setPosition/2"},{"type":"type","doc":"","title":"wxSpinEvent.wxSpin/0","ref":"wxSpinEvent.html#t:wxSpin/0"},{"type":"type","doc":"","title":"wxSpinEvent.wxSpinEvent/0","ref":"wxSpinEvent.html#t:wxSpinEvent/0"},{"type":"type","doc":"","title":"wxSpinEvent.wxSpinEventType/0","ref":"wxSpinEvent.html#t:wxSpinEventType/0"},{"type":"module","doc":"`m:wxSplashScreen` shows a window with a thin border, displaying a bitmap describing your\napplication.\n\nShow it in application initialisation, and then either explicitly destroy it or let it time-out.\n\nExample usage:\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSplashScreen](https://docs.wxwidgets.org/3.2/classwx_splash_screen.html)","title":"wxSplashScreen","ref":"wxSplashScreen.html"},{"type":"function","doc":"Destroys the object","title":"wxSplashScreen.destroy/1","ref":"wxSplashScreen.html#destroy/1"},{"type":"function","doc":"Returns the splash style (see `new/6` for details).","title":"wxSplashScreen.getSplashStyle/1","ref":"wxSplashScreen.html#getSplashStyle/1"},{"type":"function","doc":"Returns the timeout in milliseconds.","title":"wxSplashScreen.getTimeout/1","ref":"wxSplashScreen.html#getTimeout/1"},{"type":"function","doc":"","title":"wxSplashScreen.new/5","ref":"wxSplashScreen.html#new/5"},{"type":"function","doc":"Construct the splash screen passing a bitmap, a style, a timeout, a window id, optional\nposition and size, and a window style.\n\n`splashStyle` is a bitlist of some of the following:\n\n* wxSPLASH_CENTRE_ON_PARENT\n\n* wxSPLASH_CENTRE_ON_SCREEN\n\n* wxSPLASH_NO_CENTRE\n\n* wxSPLASH_TIMEOUT\n\n* wxSPLASH_NO_TIMEOUT\n\n`milliseconds` is the timeout in milliseconds.","title":"wxSplashScreen.new/6","ref":"wxSplashScreen.html#new/6"},{"type":"type","doc":"","title":"wxSplashScreen.wxSplashScreen/0","ref":"wxSplashScreen.html#t:wxSplashScreen/0"},{"type":"module","doc":"This class represents the events generated by a splitter control.\n\nAlso there is only one event class, the data associated to the different events is not\nthe same and so not all accessor functions may be called for each event. The documentation\nmentions the kind of event(s) for which the given accessor function makes sense: calling\nit for other types of events will result in assert failure (in debug mode) and will return\nmeaningless results.\n\nSee:\n* `m:wxSplitterWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSplitterEvent](https://docs.wxwidgets.org/3.2/classwx_splitter_event.html)","title":"wxSplitterEvent","ref":"wxSplitterEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSplitterEventType` to subscribe to events of this type.","title":"Events - wxSplitterEvent","ref":"wxSplitterEvent.html#module-events"},{"type":"function","doc":"Returns the new sash position.\n\nMay only be called while processing `wxEVT_SPLITTER_SASH_POS_CHANGING` and `wxEVT_SPLITTER_SASH_POS_CHANGED`\nevents.","title":"wxSplitterEvent.getSashPosition/1","ref":"wxSplitterEvent.html#getSashPosition/1"},{"type":"function","doc":"Returns a pointer to the window being removed when a splitter window is unsplit.\n\nMay only be called while processing `wxEVT_SPLITTER_UNSPLIT` events.","title":"wxSplitterEvent.getWindowBeingRemoved/1","ref":"wxSplitterEvent.html#getWindowBeingRemoved/1"},{"type":"function","doc":"Returns the x coordinate of the double-click point.\n\nMay only be called while processing `wxEVT_SPLITTER_DOUBLECLICKED` events.","title":"wxSplitterEvent.getX/1","ref":"wxSplitterEvent.html#getX/1"},{"type":"function","doc":"Returns the y coordinate of the double-click point.\n\nMay only be called while processing `wxEVT_SPLITTER_DOUBLECLICKED` events.","title":"wxSplitterEvent.getY/1","ref":"wxSplitterEvent.html#getY/1"},{"type":"function","doc":"In the case of `wxEVT\\_SPLITTER\\_SASH\\_POS\\_CHANGED` events, sets the new sash position.\n\nIn the case of `wxEVT_SPLITTER_SASH_POS_CHANGING` events, sets the new tracking bar\nposition so visual feedback during dragging will represent that change that will actually\ntake place. Set to -1 from the event handler code to prevent repositioning.\n\nMay only be called while processing `wxEVT_SPLITTER_SASH_POS_CHANGING` and `wxEVT_SPLITTER_SASH_POS_CHANGED`\nevents.","title":"wxSplitterEvent.setSashPosition/2","ref":"wxSplitterEvent.html#setSashPosition/2"},{"type":"type","doc":"","title":"wxSplitterEvent.wxSplitter/0","ref":"wxSplitterEvent.html#t:wxSplitter/0"},{"type":"type","doc":"","title":"wxSplitterEvent.wxSplitterEvent/0","ref":"wxSplitterEvent.html#t:wxSplitterEvent/0"},{"type":"type","doc":"","title":"wxSplitterEvent.wxSplitterEventType/0","ref":"wxSplitterEvent.html#t:wxSplitterEventType/0"},{"type":"module","doc":"This class manages up to two subwindows.\n\nThe current view can be split into two programmatically (perhaps from a menu command),\nand unsplit either programmatically or via the `m:wxSplitterWindow` user interface.","title":"wxSplitterWindow","ref":"wxSplitterWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSP_3D: Draws a 3D effect border and sash.\n\n* wxSP_THIN_SASH: Draws a thin sash.\n\n* wxSP_3DSASH: Draws a 3D effect sash (part of default style).\n\n* wxSP_3DBORDER: Synonym for wxSP_BORDER.\n\n* wxSP_BORDER: Draws a standard border.\n\n* wxSP_NOBORDER: No border (default).\n\n* wxSP_NO_XP_THEME: Under Windows, switches off the attempt to draw the splitter using\nWindows theming, so the borders and sash will take on the pre-XP look.\n\n* wxSP_PERMIT_UNSPLIT: Always allow to unsplit, even with the minimum pane size other than\nzero.\n\n* wxSP_LIVE_UPDATE: Don't draw XOR line but resize the child windows immediately.\n\nSee:\n* `m:wxSplitterEvent`\n\n* [Overview splitterwindow](https://docs.wxwidgets.org/3.2/overview_splitterwindow.html#overview_splitterwindow)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSplitterWindow](https://docs.wxwidgets.org/3.2/classwx_splitter_window.html)","title":"Styles - wxSplitterWindow","ref":"wxSplitterWindow.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_splitter_sash_pos_changing`](`m:wxSplitterEvent`)\n\n* [`command_splitter_sash_pos_changed`](`m:wxSplitterEvent`)\n\n* [`command_splitter_unsplit`](`m:wxSplitterEvent`)","title":"Events - wxSplitterWindow","ref":"wxSplitterWindow.html#module-events"},{"type":"function","doc":"","title":"wxSplitterWindow.create/2","ref":"wxSplitterWindow.html#create/2"},{"type":"function","doc":"Creation function, for two-step construction.\n\nSee `new/2` for details.","title":"wxSplitterWindow.create/3","ref":"wxSplitterWindow.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxSplitterWindow.destroy/1","ref":"wxSplitterWindow.html#destroy/1"},{"type":"function","doc":"Returns the current minimum pane size (defaults to zero).\n\nSee: `setMinimumPaneSize/2`","title":"wxSplitterWindow.getMinimumPaneSize/1","ref":"wxSplitterWindow.html#getMinimumPaneSize/1"},{"type":"function","doc":"Returns the current sash gravity.\n\nSee: `setSashGravity/2`","title":"wxSplitterWindow.getSashGravity/1","ref":"wxSplitterWindow.html#getSashGravity/1"},{"type":"function","doc":"Returns the current sash position.\n\nSee: `setSashPosition/3`","title":"wxSplitterWindow.getSashPosition/1","ref":"wxSplitterWindow.html#getSashPosition/1"},{"type":"function","doc":"Gets the split mode.\n\nSee:\n* `setSplitMode/2`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`","title":"wxSplitterWindow.getSplitMode/1","ref":"wxSplitterWindow.html#getSplitMode/1"},{"type":"function","doc":"Returns the left/top or only pane.","title":"wxSplitterWindow.getWindow1/1","ref":"wxSplitterWindow.html#getWindow1/1"},{"type":"function","doc":"Returns the right/bottom pane.","title":"wxSplitterWindow.getWindow2/1","ref":"wxSplitterWindow.html#getWindow2/1"},{"type":"function","doc":"Initializes the splitter window to have one pane.\n\nThe child window is shown if it is currently hidden.\n\nRemark: This should be called if you wish to initially view only a single pane in the\nsplitter window.\n\nSee:\n* `splitVertically/4`\n\n* `splitHorizontally/4`","title":"wxSplitterWindow.initialize/2","ref":"wxSplitterWindow.html#initialize/2"},{"type":"function","doc":"Returns true if the window is split, false otherwise.","title":"wxSplitterWindow.isSplit/1","ref":"wxSplitterWindow.html#isSplit/1"},{"type":"function","doc":"Default constructor.","title":"wxSplitterWindow.new/0","ref":"wxSplitterWindow.html#new/0"},{"type":"function","doc":"","title":"wxSplitterWindow.new/1","ref":"wxSplitterWindow.html#new/1"},{"type":"function","doc":"Constructor for creating the window.\n\nRemark: After using this constructor, you must create either one or two subwindows with\nthe splitter window as parent, and then call one of `initialize/2`, `splitVertically/4` and `splitHorizontally/4` in order to set the pane(s).\nYou can create two windows, with one hidden when not being shown; or you can create and\ndelete the second pane on demand.\n\nSee:\n* `initialize/2`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`\n\n* `create/3`","title":"wxSplitterWindow.new/2","ref":"wxSplitterWindow.html#new/2"},{"type":"function","doc":"This function replaces one of the windows managed by the `m:wxSplitterWindow` with\nanother one.\n\nIt is in general better to use it instead of calling `unsplit/2` and then resplitting the window\nback because it will provoke much less flicker (if any). It is valid to call this function\nwhether the splitter has two windows or only one.\n\nBoth parameters should be non-NULL and `winOld` must specify one of the windows managed\nby the splitter. If the parameters are incorrect or the window couldn't be replaced, false\nis returned. Otherwise the function will return true, but please notice that it will not\ndelete the replaced window and you may wish to do it yourself.\n\nSee: `getMinimumPaneSize/1`","title":"wxSplitterWindow.replaceWindow/3","ref":"wxSplitterWindow.html#replaceWindow/3"},{"type":"function","doc":"Sets the minimum pane size.\n\nRemark: The default minimum pane size is zero, which means that either pane can be\nreduced to zero by dragging the sash, thus removing one of the panes. To prevent this\nbehaviour (and veto out-of-range sash dragging), set a minimum size, for example 20\npixels. If the wxSP_PERMIT_UNSPLIT style is used when a splitter window is created, the\nwindow may be unsplit even if minimum size is non-zero.\n\nSee: `getMinimumPaneSize/1`","title":"wxSplitterWindow.setMinimumPaneSize/2","ref":"wxSplitterWindow.html#setMinimumPaneSize/2"},{"type":"function","doc":"Sets the sash gravity.\n\nRemark: Gravity is real factor which controls position of sash while resizing `m:wxSplitterWindow`.\nGravity tells `m:wxSplitterWindow` how much will left/top window grow while resizing.\nExample values:\n\n* 0.0: only the bottom/right window is automatically resized\n\n* 0.5: both windows grow by equal size\n\n* 1.0: only left/top window grows Gravity should be a real value between 0.0 and 1.0.\nDefault value of sash gravity is 0.0. That value is compatible with previous (before\ngravity was introduced) behaviour of `m:wxSplitterWindow`.\n\nNotice that when sash gravity for a newly created splitter window, it is often necessary\nto explicitly set the splitter size using `wxWindow:setSize/6` to ensure that is big enough for its initial\nsash position. Otherwise, i.e. if the window is created with the default tiny size and\nonly resized to its correct size later, the initial sash position will be affected by the\ngravity and typically result in sash being at the rightmost position for the gravity of 1.\nSee the example code creating `m:wxSplitterWindow` in the splitter sample for more details.\n\nSee: `getSashGravity/1`","title":"wxSplitterWindow.setSashGravity/2","ref":"wxSplitterWindow.html#setSashGravity/2"},{"type":"function","doc":"","title":"wxSplitterWindow.setSashPosition/2","ref":"wxSplitterWindow.html#setSashPosition/2"},{"type":"function","doc":"Sets the sash position.\n\nRemark: Does not currently check for an out-of-range value.\n\nSee: `getSashPosition/1`","title":"wxSplitterWindow.setSashPosition/3","ref":"wxSplitterWindow.html#setSashPosition/3"},{"type":"function","doc":"Sets the split mode.\n\nRemark: Only sets the internal variable; does not update the display.\n\nSee:\n* `getSplitMode/1`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`","title":"wxSplitterWindow.setSplitMode/2","ref":"wxSplitterWindow.html#setSplitMode/2"},{"type":"function","doc":"","title":"wxSplitterWindow.splitHorizontally/3","ref":"wxSplitterWindow.html#splitHorizontally/3"},{"type":"function","doc":"Initializes the top and bottom panes of the splitter window.\n\nThe child windows are shown if they are currently hidden.\n\nReturn: true if successful, false otherwise (the window was already split).\n\nRemark: This should be called if you wish to initially view two panes. It can also be\ncalled at any subsequent time, but the application should check that the window is not\ncurrently split using `isSplit/1`.\n\nSee:\n* `splitVertically/4`\n\n* `isSplit/1`\n\n* `unsplit/2`","title":"wxSplitterWindow.splitHorizontally/4","ref":"wxSplitterWindow.html#splitHorizontally/4"},{"type":"function","doc":"","title":"wxSplitterWindow.splitVertically/3","ref":"wxSplitterWindow.html#splitVertically/3"},{"type":"function","doc":"Initializes the left and right panes of the splitter window.\n\nThe child windows are shown if they are currently hidden.\n\nReturn: true if successful, false otherwise (the window was already split).\n\nRemark: This should be called if you wish to initially view two panes. It can also be\ncalled at any subsequent time, but the application should check that the window is not\ncurrently split using `isSplit/1`.\n\nSee:\n* `splitHorizontally/4`\n\n* `isSplit/1`\n\n* `unsplit/2`","title":"wxSplitterWindow.splitVertically/4","ref":"wxSplitterWindow.html#splitVertically/4"},{"type":"function","doc":"","title":"wxSplitterWindow.unsplit/1","ref":"wxSplitterWindow.html#unsplit/1"},{"type":"function","doc":"Unsplits the window.\n\nReturn: true if successful, false otherwise (the window was not split).\n\nRemark: This call will not actually delete the pane being removed; it calls `OnUnsplit()`\n(not implemented in wx) which can be overridden for the desired behaviour. By default, the\npane being removed is hidden.\n\nSee:\n* `splitHorizontally/4`\n\n* `splitVertically/4`\n\n* `isSplit/1`","title":"wxSplitterWindow.unsplit/2","ref":"wxSplitterWindow.html#unsplit/2"},{"type":"function","doc":"Causes any pending sizing of the sash and child panes to take place immediately.\n\nSuch resizing normally takes place in idle time, in order to wait for layout to be\ncompleted. However, this can cause unacceptable flicker as the panes are resized after the\nwindow has been shown. To work around this, you can perform window layout (for example by\nsending a size event to the parent window), and then call this function, before showing\nthe top-level window.","title":"wxSplitterWindow.updateSize/1","ref":"wxSplitterWindow.html#updateSize/1"},{"type":"type","doc":"","title":"wxSplitterWindow.wxSplitterWindow/0","ref":"wxSplitterWindow.html#t:wxSplitterWindow/0"},{"type":"module","doc":"A static bitmap control displays a bitmap.\n\nNative implementations on some platforms are only meant for display of the small icons in\nthe dialog boxes.\n\nIf you want to display larger images portably, you may use generic implementation\nwxGenericStaticBitmap declared in .\n\nNotice that for the best results, the size of the control should be the same as the size\nof the image displayed in it, as happens by default if it's not resized explicitly.\nOtherwise, behaviour depends on the platform: under MSW, the bitmap is drawn centred\ninside the control, while elsewhere it is drawn at the origin of the control. You can use `SetScaleMode()`\n(not implemented in wx) to control how the image is scaled inside the control.\n\nSee: `m:wxBitmap`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticBitmap](https://docs.wxwidgets.org/3.2/classwx_static_bitmap.html)","title":"wxStaticBitmap","ref":"wxStaticBitmap.html"},{"type":"function","doc":"","title":"wxStaticBitmap.create/4","ref":"wxStaticBitmap.html#create/4"},{"type":"function","doc":"Creation function, for two-step construction.\n\nFor details see `new/4`.","title":"wxStaticBitmap.create/5","ref":"wxStaticBitmap.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxStaticBitmap.destroy/1","ref":"wxStaticBitmap.html#destroy/1"},{"type":"function","doc":"Returns the bitmap currently used in the control.\n\nNotice that this method can be called even if `SetIcon()` (not implemented in wx) had\nbeen used.\n\nSee: `setBitmap/2`","title":"wxStaticBitmap.getBitmap/1","ref":"wxStaticBitmap.html#getBitmap/1"},{"type":"function","doc":"Default constructor.","title":"wxStaticBitmap.new/0","ref":"wxStaticBitmap.html#new/0"},{"type":"function","doc":"","title":"wxStaticBitmap.new/3","ref":"wxStaticBitmap.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a static bitmap control.\n\nSee: `create/5`","title":"wxStaticBitmap.new/4","ref":"wxStaticBitmap.html#new/4"},{"type":"function","doc":"Sets the bitmap label.\n\nSee: `getBitmap/1`","title":"wxStaticBitmap.setBitmap/2","ref":"wxStaticBitmap.html#setBitmap/2"},{"type":"type","doc":"","title":"wxStaticBitmap.wxStaticBitmap/0","ref":"wxStaticBitmap.html#t:wxStaticBitmap/0"},{"type":"module","doc":"A static box is a rectangle drawn around other windows to denote a logical grouping of\nitems.\n\nNote that while the previous versions required that windows appearing inside a static box\nbe created as its siblings (i.e. use the same parent as the static box itself), since\nwxWidgets 2.9.1 it is also possible to create them as children of `m:wxStaticBox` itself\nand you are actually encouraged to do it like this if compatibility with the previous\nversions is not important.\n\nSo the new recommended way to create static box is:\n\nWhile the compatible - and now deprecated - way is\n\nAlso note that there is a specialized `m:wxSizer` class (`m:wxStaticBoxSizer`) which can\nbe used as an easier way to pack items into a static box.\n\nSee:\n* `m:wxStaticText`\n\n* `m:wxStaticBoxSizer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticBox](https://docs.wxwidgets.org/3.2/classwx_static_box.html)","title":"wxStaticBox","ref":"wxStaticBox.html"},{"type":"function","doc":"","title":"wxStaticBox.create/4","ref":"wxStaticBox.html#create/4"},{"type":"function","doc":"Creates the static box for two-step construction.\n\nSee `new/4` for further details.","title":"wxStaticBox.create/5","ref":"wxStaticBox.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxStaticBox.destroy/1","ref":"wxStaticBox.html#destroy/1"},{"type":"function","doc":"Default constructor.","title":"wxStaticBox.new/0","ref":"wxStaticBox.html#new/0"},{"type":"function","doc":"","title":"wxStaticBox.new/3","ref":"wxStaticBox.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a static box.\n\nSee: `create/5`","title":"wxStaticBox.new/4","ref":"wxStaticBox.html#new/4"},{"type":"type","doc":"","title":"wxStaticBox.wxStaticBox/0","ref":"wxStaticBox.html#t:wxStaticBox/0"},{"type":"module","doc":"`m:wxStaticBoxSizer` is a sizer derived from `m:wxBoxSizer` but adds a static box around\nthe sizer.\n\nThe static box may be either created independently or the sizer may create it itself as a\nconvenience. In any case, the sizer owns the `m:wxStaticBox` control and will delete it in\nthe `m:wxStaticBoxSizer` destructor.\n\nNote that since wxWidgets 2.9.1 you are encouraged to create the windows which are added\nto `m:wxStaticBoxSizer` as children of `m:wxStaticBox` itself, see this class\ndocumentation for more details.\n\nExample of use of this class:\n\nSee:\n* `m:wxSizer`\n\n* `m:wxStaticBox`\n\n* `m:wxBoxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBoxSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxStaticBoxSizer](https://docs.wxwidgets.org/3.2/classwx_static_box_sizer.html)","title":"wxStaticBoxSizer","ref":"wxStaticBoxSizer.html"},{"type":"function","doc":"Destroys the object","title":"wxStaticBoxSizer.destroy/1","ref":"wxStaticBoxSizer.html#destroy/1"},{"type":"function","doc":"Returns the static box associated with the sizer.","title":"wxStaticBoxSizer.getStaticBox/1","ref":"wxStaticBoxSizer.html#getStaticBox/1"},{"type":"function","doc":"This constructor uses an already existing static box.","title":"wxStaticBoxSizer.new/2","ref":"wxStaticBoxSizer.html#new/2"},{"type":"function","doc":"This constructor creates a new static box with the given label and parent window.","title":"wxStaticBoxSizer.new/3","ref":"wxStaticBoxSizer.html#new/3"},{"type":"type","doc":"","title":"wxStaticBoxSizer.wxStaticBoxSizer/0","ref":"wxStaticBoxSizer.html#t:wxStaticBoxSizer/0"},{"type":"module","doc":"A static line is just a line which may be used in a dialog to separate the groups of\ncontrols.\n\nThe line may be only vertical or horizontal. Moreover, not all ports (notably not wxGTK)\nsupport specifying the transversal direction of the line (e.g. height for a horizontal\nline) so for maximal portability you should specify it as wxDefaultCoord.","title":"wxStaticLine","ref":"wxStaticLine.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxLI_HORIZONTAL: Creates a horizontal line.\n\n* wxLI_VERTICAL: Creates a vertical line.\n\nSee: `m:wxStaticBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticLine](https://docs.wxwidgets.org/3.2/classwx_static_line.html)","title":"Styles - wxStaticLine","ref":"wxStaticLine.html#module-styles"},{"type":"function","doc":"","title":"wxStaticLine.create/2","ref":"wxStaticLine.html#create/2"},{"type":"function","doc":"Creates the static line for two-step construction.\n\nSee `new/2` for further details.","title":"wxStaticLine.create/3","ref":"wxStaticLine.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxStaticLine.destroy/1","ref":"wxStaticLine.html#destroy/1"},{"type":"function","doc":"This static function returns the size which will be given to the smaller dimension of the\nstatic line, i.e.\n\nits height for a horizontal line or its width for a vertical one.","title":"wxStaticLine.getDefaultSize/0","ref":"wxStaticLine.html#getDefaultSize/0"},{"type":"function","doc":"Returns true if the line is vertical, false if horizontal.","title":"wxStaticLine.isVertical/1","ref":"wxStaticLine.html#isVertical/1"},{"type":"function","doc":"Default constructor.","title":"wxStaticLine.new/0","ref":"wxStaticLine.html#new/0"},{"type":"function","doc":"","title":"wxStaticLine.new/1","ref":"wxStaticLine.html#new/1"},{"type":"function","doc":"Constructor, creating and showing a static line.\n\nSee: `create/3`","title":"wxStaticLine.new/2","ref":"wxStaticLine.html#new/2"},{"type":"type","doc":"","title":"wxStaticLine.wxStaticLine/0","ref":"wxStaticLine.html#t:wxStaticLine/0"},{"type":"module","doc":"A static text control displays one or more lines of read-only text.\n\n`m:wxStaticText` supports the three classic text alignments, label ellipsization i.e.\nreplacing parts of the text with the ellipsis (\"...\") if the label doesn't fit into the\nprovided space and also formatting markup with `wxControl::SetLabelMarkup()` (not\nimplemented in wx).","title":"wxStaticText","ref":"wxStaticText.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxALIGN_LEFT: Align the text to the left.\n\n* wxALIGN_RIGHT: Align the text to the right.\n\n* wxALIGN_CENTRE_HORIZONTAL: Center the text (horizontally).\n\n* wxST_NO_AUTORESIZE: By default, the control will adjust its size to exactly fit to the\nsize of the text when `setLabel/2` is called. If this style flag is given, the control will not change\nits size (this style is especially useful with controls which also have the `wxALIGN_RIGHT`\nor the `wxALIGN_CENTRE_HORIZONTAL` style because otherwise they won't make sense any\nlonger after a call to `setLabel/2`).\n\n* wxST_ELLIPSIZE_START: If the labeltext width exceeds the control width, replace the\nbeginning of the label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in\nwx).\n\n* wxST_ELLIPSIZE_MIDDLE: If the label text width exceeds the control width, replace the\nmiddle of the label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in wx).\n\n* wxST_ELLIPSIZE_END: If the label text width exceeds the control width, replace the end of\nthe label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in wx).\n\nSee:\n* `m:wxStaticBitmap`\n\n* `m:wxStaticBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticText](https://docs.wxwidgets.org/3.2/classwx_static_text.html)","title":"Styles - wxStaticText","ref":"wxStaticText.html#module-styles"},{"type":"function","doc":"","title":"wxStaticText.create/4","ref":"wxStaticText.html#create/4"},{"type":"function","doc":"Creation function, for two-step construction.\n\nFor details see `new/4`.","title":"wxStaticText.create/5","ref":"wxStaticText.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxStaticText.destroy/1","ref":"wxStaticText.html#destroy/1"},{"type":"function","doc":"Returns the control's label, as it was passed to `wxControl:setLabel/2`.\n\nNote that the returned string may contains mnemonics (\"&\" characters) if they were passed\nto the `wxControl:setLabel/2` function; use `GetLabelText()` (not implemented in wx) if they are undesired.\n\nAlso note that the returned string is always the string which was passed to `wxControl:setLabel/2` but may be\ndifferent from the string passed to `SetLabelText()` (not implemented in wx) (since this\nlast one escapes mnemonic characters).","title":"wxStaticText.getLabel/1","ref":"wxStaticText.html#getLabel/1"},{"type":"function","doc":"Default constructor.","title":"wxStaticText.new/0","ref":"wxStaticText.html#new/0"},{"type":"function","doc":"","title":"wxStaticText.new/3","ref":"wxStaticText.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a text control.\n\nSee: `create/5`","title":"wxStaticText.new/4","ref":"wxStaticText.html#new/4"},{"type":"function","doc":"Change the label shown in the control.\n\nNotice that since wxWidgets 3.1.1 this function is guaranteed not to do anything if the\nlabel didn't really change, so there is no benefit to checking if the new label is\ndifferent from the current one in the application code.\n\nSee: `wxControl:setLabel/2`","title":"wxStaticText.setLabel/2","ref":"wxStaticText.html#setLabel/2"},{"type":"function","doc":"This functions wraps the controls label so that each of its lines becomes at most `width`\npixels wide if possible (the lines are broken at words boundaries so it might not be the\ncase if words are too long).\n\nIf `width` is negative, no wrapping is done. Note that this width is not necessarily the\ntotal width of the control, since a few pixels for the border (depending on the controls\nborder style) may be added.\n\nSince: 2.6.2","title":"wxStaticText.wrap/2","ref":"wxStaticText.html#wrap/2"},{"type":"type","doc":"","title":"wxStaticText.wxStaticText/0","ref":"wxStaticText.html#t:wxStaticText/0"},{"type":"module","doc":"A status bar is a narrow window that can be placed along the bottom of a frame to give\nsmall amounts of status information.\n\nIt can contain one or more fields, one or more of which can be variable length according\nto the size of the window.\n\n`m:wxStatusBar` also maintains an independent stack of status texts for each field (see `pushStatusText/3`\nand `popStatusText/2`).\n\nNote that in `m:wxStatusBar` context, the terms `pane` and `field` are synonyms.","title":"wxStatusBar","ref":"wxStatusBar.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxSTB_SIZEGRIP: Displays a gripper at the right-hand side of the status bar which can be\nused to resize the parent window.\n\n* wxSTB_SHOW_TIPS: Displays tooltips for those panes whose status text has been\nellipsized/truncated because the status text doesn't fit the pane width. Note that this\nstyle has effect only on wxGTK (with GTK+ >= 2.12) currently.\n\n* wxSTB_ELLIPSIZE_START: Replace the beginning of the status texts with an ellipsis when\nthe status text widths exceed the status bar pane's widths (uses `wxControl::Ellipsize`\n(not implemented in wx)).\n\n* wxSTB_ELLIPSIZE_MIDDLE: Replace the middle of the status texts with an ellipsis when the\nstatus text widths exceed the status bar pane's widths (uses `wxControl::Ellipsize` (not\nimplemented in wx)).\n\n* wxSTB_ELLIPSIZE_END: Replace the end of the status texts with an ellipsis when the status\ntext widths exceed the status bar pane's widths (uses `wxControl::Ellipsize` (not\nimplemented in wx)).\n\n* wxSTB_DEFAULT_STYLE: The default style: includes `wxSTB_SIZEGRIP|wxSTB_SHOW_TIPS|wxSTB_ELLIPSIZE_END|wxFULL_REPAINT_ON_RESIZE`.\n\nRemark: It is possible to create controls and other windows on the status bar. Position\nthese windows from an OnSize() event handler.\n\nRemark: Notice that only the first 127 characters of a string will be shown in status bar\nfields under Windows if a proper manifest indicating that the program uses version 6 of\ncommon controls library is not used. This is a limitation of the native control on these platforms.\n\nSee:\n* `m:wxFrame`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_statbar)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStatusBar](https://docs.wxwidgets.org/3.2/classwx_status_bar.html)","title":"Styles - wxStatusBar","ref":"wxStatusBar.html#module-styles"},{"type":"function","doc":"","title":"wxStatusBar.create/2","ref":"wxStatusBar.html#create/2"},{"type":"function","doc":"Creates the window, for two-step construction.\n\nSee `new/2` for details.","title":"wxStatusBar.create/3","ref":"wxStatusBar.html#create/3"},{"type":"function","doc":"Destroys the object","title":"wxStatusBar.destroy/1","ref":"wxStatusBar.html#destroy/1"},{"type":"function","doc":"Returns the size and position of a field's internal bounding rectangle.\n\nReturn: true if the field index is valid, false otherwise.\n\nSee: {X,Y,W,H}","title":"wxStatusBar.getFieldRect/2","ref":"wxStatusBar.html#getFieldRect/2"},{"type":"function","doc":"Returns the number of fields in the status bar.","title":"wxStatusBar.getFieldsCount/1","ref":"wxStatusBar.html#getFieldsCount/1"},{"type":"function","doc":"","title":"wxStatusBar.getStatusText/1","ref":"wxStatusBar.html#getStatusText/1"},{"type":"function","doc":"Returns the string associated with a status bar field.\n\nReturn: The status field string if the field is valid, otherwise the empty string.\n\nSee: `setStatusText/3`","title":"wxStatusBar.getStatusText/2","ref":"wxStatusBar.html#getStatusText/2"},{"type":"function","doc":"Default ctor.","title":"wxStatusBar.new/0","ref":"wxStatusBar.html#new/0"},{"type":"function","doc":"","title":"wxStatusBar.new/1","ref":"wxStatusBar.html#new/1"},{"type":"function","doc":"Constructor, creating the window.\n\nSee: `create/3`","title":"wxStatusBar.new/2","ref":"wxStatusBar.html#new/2"},{"type":"function","doc":"","title":"wxStatusBar.popStatusText/1","ref":"wxStatusBar.html#popStatusText/1"},{"type":"function","doc":"Restores the text to the value it had before the last call to `pushStatusText/3`.\n\nNotice that if `setStatusText/3` had been called in the meanwhile, `popStatusText/2` will not change the text, i.e. it does\nnot override explicit changes to status text but only restores the saved text if it hadn't\nbeen changed since.\n\nSee: `pushStatusText/3`","title":"wxStatusBar.popStatusText/2","ref":"wxStatusBar.html#popStatusText/2"},{"type":"function","doc":"","title":"wxStatusBar.pushStatusText/2","ref":"wxStatusBar.html#pushStatusText/2"},{"type":"function","doc":"Saves the current field text in a per-field stack, and sets the field text to the string\npassed as argument.\n\nSee: `popStatusText/2`","title":"wxStatusBar.pushStatusText/3","ref":"wxStatusBar.html#pushStatusText/3"},{"type":"function","doc":"","title":"wxStatusBar.setFieldsCount/2","ref":"wxStatusBar.html#setFieldsCount/2"},{"type":"function","doc":"Sets the number of fields, and optionally the field widths.","title":"wxStatusBar.setFieldsCount/3","ref":"wxStatusBar.html#setFieldsCount/3"},{"type":"function","doc":"Sets the minimal possible height for the status bar.\n\nThe real height may be bigger than the height specified here depending on the size of the\nfont used by the status bar.","title":"wxStatusBar.setMinHeight/2","ref":"wxStatusBar.html#setMinHeight/2"},{"type":"function","doc":"Sets the styles of the fields in the status line which can make fields appear flat or\nraised instead of the standard sunken 3D border.","title":"wxStatusBar.setStatusStyles/2","ref":"wxStatusBar.html#setStatusStyles/2"},{"type":"function","doc":"","title":"wxStatusBar.setStatusText/2","ref":"wxStatusBar.html#setStatusText/2"},{"type":"function","doc":"Sets the status text for the `i-th` field.\n\nThe given text will replace the current text. The display of the status bar is updated\nimmediately, so there is no need to call `wxWindow:update/1` after calling this function.\n\nNote that if `pushStatusText/3` had been called before the new text will also replace the last saved value\nto make sure that the next call to `popStatusText/2` doesn't restore the old value, which was overwritten\nby the call to this function.\n\nSee:\n* `getStatusText/2`\n\n* `wxFrame:setStatusText/3`","title":"wxStatusBar.setStatusText/3","ref":"wxStatusBar.html#setStatusText/3"},{"type":"function","doc":"Sets the widths of the fields in the status line.\n\nThere are two types of fields: `fixed` widths and `variable` width fields. For the fixed\nwidth fields you should specify their (constant) width in pixels. For the variable width\nfields, specify a negative number which indicates how the field should expand: the space\nleft for all variable width fields is divided between them according to the absolute value\nof this number. A variable width field with width of -2 gets twice as much of it as a\nfield with width -1 and so on.\n\nFor example, to create one fixed width field of width 100 in the right part of the status\nbar and two more fields which get 66% and 33% of the remaining space correspondingly, you\nshould use an array containing -2, -1 and 100.\n\nRemark: The widths of the variable fields are calculated from the total width of all\nfields, minus the sum of widths of the non-variable fields, divided by the number of\nvariable fields.\n\nSee:\n* `setFieldsCount/3`\n\n* `wxFrame:setStatusWidths/2`","title":"wxStatusBar.setStatusWidths/2","ref":"wxStatusBar.html#setStatusWidths/2"},{"type":"type","doc":"","title":"wxStatusBar.wxStatusBar/0","ref":"wxStatusBar.html#t:wxStatusBar/0"},{"type":"module","doc":"This class creates button layouts which conform to the standard button spacing and\nordering defined by the platform or toolkit's user interface guidelines (if such things\nexist).\n\nBy using this class, you can ensure that all your standard dialogs look correct on all\nmajor platforms. Currently it conforms to the Windows, GTK+ and macOS human interface guidelines.\n\nWhen there aren't interface guidelines defined for a particular platform or toolkit, `m:wxStdDialogButtonSizer`\nreverts to the Windows implementation.\n\nTo use this class, first add buttons to the sizer by calling `addButton/2` (or `setAffirmativeButton/2`, `setNegativeButton/2` or `setCancelButton/2`) and then call\nRealize in order to create the actual button layout used. Other than these special\noperations, this sizer works like any other sizer.\n\nIf you add a button with wxID_SAVE, on macOS the button will be renamed to \"Save\" and the\nwxID_NO button will be renamed to \"Don't Save\" in accordance with the macOS Human\nInterface Guidelines.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\n* `wxDialog:createButtonSizer/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBoxSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxStdDialogButtonSizer](https://docs.wxwidgets.org/3.2/classwx_std_dialog_button_sizer.html)","title":"wxStdDialogButtonSizer","ref":"wxStdDialogButtonSizer.html"},{"type":"function","doc":"Adds a button to the `m:wxStdDialogButtonSizer`.\n\nThe `button` must have one of the following identifiers:\n\n* wxID_OK\n\n* wxID_YES\n\n* wxID_SAVE\n\n* wxID_APPLY\n\n* wxID_CLOSE\n\n* wxID_NO\n\n* wxID_CANCEL\n\n* wxID_HELP\n\n* wxID_CONTEXT_HELP","title":"wxStdDialogButtonSizer.addButton/2","ref":"wxStdDialogButtonSizer.html#addButton/2"},{"type":"function","doc":"Destroys the object","title":"wxStdDialogButtonSizer.destroy/1","ref":"wxStdDialogButtonSizer.html#destroy/1"},{"type":"function","doc":"Constructor for a `m:wxStdDialogButtonSizer`.","title":"wxStdDialogButtonSizer.new/0","ref":"wxStdDialogButtonSizer.html#new/0"},{"type":"function","doc":"Rearranges the buttons and applies proper spacing between buttons to make them match the\nplatform or toolkit's interface guidelines.","title":"wxStdDialogButtonSizer.realize/1","ref":"wxStdDialogButtonSizer.html#realize/1"},{"type":"function","doc":"Sets the affirmative button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","title":"wxStdDialogButtonSizer.setAffirmativeButton/2","ref":"wxStdDialogButtonSizer.html#setAffirmativeButton/2"},{"type":"function","doc":"Sets the cancel button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","title":"wxStdDialogButtonSizer.setCancelButton/2","ref":"wxStdDialogButtonSizer.html#setCancelButton/2"},{"type":"function","doc":"Sets the negative button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","title":"wxStdDialogButtonSizer.setNegativeButton/2","ref":"wxStdDialogButtonSizer.html#setNegativeButton/2"},{"type":"type","doc":"","title":"wxStdDialogButtonSizer.wxStdDialogButtonSizer/0","ref":"wxStdDialogButtonSizer.html#t:wxStdDialogButtonSizer/0"},{"type":"module","doc":"A wxWidgets implementation of the Scintilla source code editing component.\n\nAs well as features found in standard text editing components, Scintilla includes\nfeatures especially useful when editing and debugging source code. These include support\nfor syntax styling, error indicators, code completion and call tips.\n\nThe selection margin can contain markers like those used in debuggers to indicate\nbreakpoints and the current line. Styling choices are more open than with many editors,\nallowing the use of proportional fonts, bold and italics, multiple foreground and\nbackground colours and multiple fonts.\n\n`m:wxStyledTextCtrl` is a 1 to 1 mapping of \"raw\" scintilla interface, whose\ndocumentation can be found in the Scintilla website ([http://www.scintilla.org/](http://www.scintilla.org/)).\n\nPlease see `m:wxStyledTextEvent` for the documentation of all event types you can use\nwith `m:wxStyledTextCtrl`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStyledTextCtrl](https://docs.wxwidgets.org/3.2/classwx_styled_text_ctrl.html)","title":"wxStyledTextCtrl","ref":"wxStyledTextCtrl.html"},{"type":"function","doc":"Add text to the document at current position.","title":"wxStyledTextCtrl.addText/2","ref":"wxStyledTextCtrl.html#addText/2"},{"type":"function","doc":"","title":"wxStyledTextCtrl.addTextRaw/2","ref":"wxStyledTextCtrl.html#addTextRaw/2"},{"type":"function","doc":"Add text to the document at current position.","title":"wxStyledTextCtrl.addTextRaw/3","ref":"wxStyledTextCtrl.html#addTextRaw/3"},{"type":"function","doc":"Enlarge the document to a particular size of text bytes.","title":"wxStyledTextCtrl.allocate/2","ref":"wxStyledTextCtrl.html#allocate/2"},{"type":"function","doc":"Append a string to the end of the document without changing the selection.","title":"wxStyledTextCtrl.appendText/2","ref":"wxStyledTextCtrl.html#appendText/2"},{"type":"function","doc":"","title":"wxStyledTextCtrl.appendTextRaw/2","ref":"wxStyledTextCtrl.html#appendTextRaw/2"},{"type":"function","doc":"Append a string to the end of the document without changing the selection.","title":"wxStyledTextCtrl.appendTextRaw/3","ref":"wxStyledTextCtrl.html#appendTextRaw/3"},{"type":"function","doc":"Is there an auto-completion list visible?","title":"wxStyledTextCtrl.autoCompActive/1","ref":"wxStyledTextCtrl.html#autoCompActive/1"},{"type":"function","doc":"Remove the auto-completion list from the screen.","title":"wxStyledTextCtrl.autoCompCancel/1","ref":"wxStyledTextCtrl.html#autoCompCancel/1"},{"type":"function","doc":"User has selected an item so remove the list and insert the selection.","title":"wxStyledTextCtrl.autoCompComplete/1","ref":"wxStyledTextCtrl.html#autoCompComplete/1"},{"type":"function","doc":"Retrieve whether or not autocompletion is hidden automatically when nothing matches.","title":"wxStyledTextCtrl.autoCompGetAutoHide/1","ref":"wxStyledTextCtrl.html#autoCompGetAutoHide/1"},{"type":"function","doc":"Retrieve whether auto-completion cancelled by backspacing before start.","title":"wxStyledTextCtrl.autoCompGetCancelAtStart/1","ref":"wxStyledTextCtrl.html#autoCompGetCancelAtStart/1"},{"type":"function","doc":"Retrieve whether a single item auto-completion list automatically choose the item.","title":"wxStyledTextCtrl.autoCompGetChooseSingle/1","ref":"wxStyledTextCtrl.html#autoCompGetChooseSingle/1"},{"type":"function","doc":"Get currently selected item position in the auto-completion list.","title":"wxStyledTextCtrl.autoCompGetCurrent/1","ref":"wxStyledTextCtrl.html#autoCompGetCurrent/1"},{"type":"function","doc":"Retrieve whether or not autocompletion deletes any word characters after the inserted\ntext upon completion.","title":"wxStyledTextCtrl.autoCompGetDropRestOfWord/1","ref":"wxStyledTextCtrl.html#autoCompGetDropRestOfWord/1"},{"type":"function","doc":"Retrieve state of ignore case flag.","title":"wxStyledTextCtrl.autoCompGetIgnoreCase/1","ref":"wxStyledTextCtrl.html#autoCompGetIgnoreCase/1"},{"type":"function","doc":"Set the maximum height, in rows, of auto-completion and user lists.","title":"wxStyledTextCtrl.autoCompGetMaxHeight/1","ref":"wxStyledTextCtrl.html#autoCompGetMaxHeight/1"},{"type":"function","doc":"Get the maximum width, in characters, of auto-completion and user lists.","title":"wxStyledTextCtrl.autoCompGetMaxWidth/1","ref":"wxStyledTextCtrl.html#autoCompGetMaxWidth/1"},{"type":"function","doc":"Retrieve the auto-completion list separator character.","title":"wxStyledTextCtrl.autoCompGetSeparator/1","ref":"wxStyledTextCtrl.html#autoCompGetSeparator/1"},{"type":"function","doc":"Retrieve the auto-completion list type-separator character.","title":"wxStyledTextCtrl.autoCompGetTypeSeparator/1","ref":"wxStyledTextCtrl.html#autoCompGetTypeSeparator/1"},{"type":"function","doc":"Retrieve the position of the caret when the auto-completion list was displayed.","title":"wxStyledTextCtrl.autoCompPosStart/1","ref":"wxStyledTextCtrl.html#autoCompPosStart/1"},{"type":"function","doc":"Select the item in the auto-completion list that starts with a string.","title":"wxStyledTextCtrl.autoCompSelect/2","ref":"wxStyledTextCtrl.html#autoCompSelect/2"},{"type":"function","doc":"Set whether or not autocompletion is hidden automatically when nothing matches.","title":"wxStyledTextCtrl.autoCompSetAutoHide/2","ref":"wxStyledTextCtrl.html#autoCompSetAutoHide/2"},{"type":"function","doc":"Should the auto-completion list be cancelled if the user backspaces to a position before\nwhere the box was created.","title":"wxStyledTextCtrl.autoCompSetCancelAtStart/2","ref":"wxStyledTextCtrl.html#autoCompSetCancelAtStart/2"},{"type":"function","doc":"Should a single item auto-completion list automatically choose the item.","title":"wxStyledTextCtrl.autoCompSetChooseSingle/2","ref":"wxStyledTextCtrl.html#autoCompSetChooseSingle/2"},{"type":"function","doc":"Set whether or not autocompletion deletes any word characters after the inserted text\nupon completion.","title":"wxStyledTextCtrl.autoCompSetDropRestOfWord/2","ref":"wxStyledTextCtrl.html#autoCompSetDropRestOfWord/2"},{"type":"function","doc":"Define a set of characters that when typed will cause the autocompletion to choose the\nselected item.","title":"wxStyledTextCtrl.autoCompSetFillUps/2","ref":"wxStyledTextCtrl.html#autoCompSetFillUps/2"},{"type":"function","doc":"Set whether case is significant when performing auto-completion searches.","title":"wxStyledTextCtrl.autoCompSetIgnoreCase/2","ref":"wxStyledTextCtrl.html#autoCompSetIgnoreCase/2"},{"type":"function","doc":"Set the maximum height, in rows, of auto-completion and user lists.\n\nThe default is 5 rows.","title":"wxStyledTextCtrl.autoCompSetMaxHeight/2","ref":"wxStyledTextCtrl.html#autoCompSetMaxHeight/2"},{"type":"function","doc":"Set the maximum width, in characters, of auto-completion and user lists.\n\nSet to 0 to autosize to fit longest item, which is the default.","title":"wxStyledTextCtrl.autoCompSetMaxWidth/2","ref":"wxStyledTextCtrl.html#autoCompSetMaxWidth/2"},{"type":"function","doc":"Change the separator character in the string setting up an auto-completion list.\n\nDefault is space but can be changed if items contain space.","title":"wxStyledTextCtrl.autoCompSetSeparator/2","ref":"wxStyledTextCtrl.html#autoCompSetSeparator/2"},{"type":"function","doc":"Change the type-separator character in the string setting up an auto-completion list.\n\nDefault is '?' but can be changed if items contain '?'.","title":"wxStyledTextCtrl.autoCompSetTypeSeparator/2","ref":"wxStyledTextCtrl.html#autoCompSetTypeSeparator/2"},{"type":"function","doc":"Display a auto-completion list.\n\nThe lengthEntered parameter indicates how many characters before the caret should be used\nto provide context.","title":"wxStyledTextCtrl.autoCompShow/3","ref":"wxStyledTextCtrl.html#autoCompShow/3"},{"type":"function","doc":"Define a set of character that when typed cancel the auto-completion list.","title":"wxStyledTextCtrl.autoCompStops/2","ref":"wxStyledTextCtrl.html#autoCompStops/2"},{"type":"function","doc":"Dedent the selected lines.","title":"wxStyledTextCtrl.backTab/1","ref":"wxStyledTextCtrl.html#backTab/1"},{"type":"function","doc":"Start a sequence of actions that is undone and redone as a unit.\n\nMay be nested.","title":"wxStyledTextCtrl.beginUndoAction/1","ref":"wxStyledTextCtrl.html#beginUndoAction/1"},{"type":"function","doc":"Highlight the character at a position indicating there is no matching brace.","title":"wxStyledTextCtrl.braceBadLight/2","ref":"wxStyledTextCtrl.html#braceBadLight/2"},{"type":"function","doc":"Highlight the characters at two positions.","title":"wxStyledTextCtrl.braceHighlight/3","ref":"wxStyledTextCtrl.html#braceHighlight/3"},{"type":"function","doc":"Find the position of a matching brace or wxSTC_INVALID_POSITION if no match.","title":"wxStyledTextCtrl.braceMatch/2","ref":"wxStyledTextCtrl.html#braceMatch/2"},{"type":"function","doc":"Is there an active call tip?","title":"wxStyledTextCtrl.callTipActive/1","ref":"wxStyledTextCtrl.html#callTipActive/1"},{"type":"function","doc":"Remove the call tip from the screen.","title":"wxStyledTextCtrl.callTipCancel/1","ref":"wxStyledTextCtrl.html#callTipCancel/1"},{"type":"function","doc":"Retrieve the position where the caret was before displaying the call tip.\n\nSince: 3.1.0","title":"wxStyledTextCtrl.callTipPosAtStart/1","ref":"wxStyledTextCtrl.html#callTipPosAtStart/1"},{"type":"function","doc":"Set the background colour for the call tip.","title":"wxStyledTextCtrl.callTipSetBackground/2","ref":"wxStyledTextCtrl.html#callTipSetBackground/2"},{"type":"function","doc":"Set the foreground colour for the call tip.","title":"wxStyledTextCtrl.callTipSetForeground/2","ref":"wxStyledTextCtrl.html#callTipSetForeground/2"},{"type":"function","doc":"Set the foreground colour for the highlighted part of the call tip.","title":"wxStyledTextCtrl.callTipSetForegroundHighlight/2","ref":"wxStyledTextCtrl.html#callTipSetForegroundHighlight/2"},{"type":"function","doc":"Highlight a segment of the definition.","title":"wxStyledTextCtrl.callTipSetHighlight/3","ref":"wxStyledTextCtrl.html#callTipSetHighlight/3"},{"type":"function","doc":"Show a call tip containing a definition near position pos.","title":"wxStyledTextCtrl.callTipShow/3","ref":"wxStyledTextCtrl.html#callTipShow/3"},{"type":"function","doc":"Enable use of wxSTC_STYLE_CALLTIP and set call tip tab size in pixels.","title":"wxStyledTextCtrl.callTipUseStyle/2","ref":"wxStyledTextCtrl.html#callTipUseStyle/2"},{"type":"function","doc":"Cancel any modes such as call tip or auto-completion list display.","title":"wxStyledTextCtrl.cancel/1","ref":"wxStyledTextCtrl.html#cancel/1"},{"type":"function","doc":"Will a paste succeed?","title":"wxStyledTextCtrl.canPaste/1","ref":"wxStyledTextCtrl.html#canPaste/1"},{"type":"function","doc":"Are there any redoable actions in the undo history?","title":"wxStyledTextCtrl.canRedo/1","ref":"wxStyledTextCtrl.html#canRedo/1"},{"type":"function","doc":"Are there any undoable actions in the undo history?","title":"wxStyledTextCtrl.canUndo/1","ref":"wxStyledTextCtrl.html#canUndo/1"},{"type":"function","doc":"Move caret left one character.","title":"wxStyledTextCtrl.charLeft/1","ref":"wxStyledTextCtrl.html#charLeft/1"},{"type":"function","doc":"Move caret left one character extending selection to new caret position.","title":"wxStyledTextCtrl.charLeftExtend/1","ref":"wxStyledTextCtrl.html#charLeftExtend/1"},{"type":"function","doc":"Move caret left one character, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.charLeftRectExtend/1","ref":"wxStyledTextCtrl.html#charLeftRectExtend/1"},{"type":"function","doc":"Move caret right one character.","title":"wxStyledTextCtrl.charRight/1","ref":"wxStyledTextCtrl.html#charRight/1"},{"type":"function","doc":"Move caret right one character extending selection to new caret position.","title":"wxStyledTextCtrl.charRightExtend/1","ref":"wxStyledTextCtrl.html#charRightExtend/1"},{"type":"function","doc":"Move caret right one character, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.charRightRectExtend/1","ref":"wxStyledTextCtrl.html#charRightRectExtend/1"},{"type":"function","doc":"Set the last x chosen value to be the caret x position.","title":"wxStyledTextCtrl.chooseCaretX/1","ref":"wxStyledTextCtrl.html#chooseCaretX/1"},{"type":"function","doc":"Clear the selection.","title":"wxStyledTextCtrl.clear/1","ref":"wxStyledTextCtrl.html#clear/1"},{"type":"function","doc":"Delete all text in the document.","title":"wxStyledTextCtrl.clearAll/1","ref":"wxStyledTextCtrl.html#clearAll/1"},{"type":"function","doc":"Set all style bytes to 0, remove all folding information.","title":"wxStyledTextCtrl.clearDocumentStyle/1","ref":"wxStyledTextCtrl.html#clearDocumentStyle/1"},{"type":"function","doc":"Clear all the registered images.","title":"wxStyledTextCtrl.clearRegisteredImages/1","ref":"wxStyledTextCtrl.html#clearRegisteredImages/1"},{"type":"function","doc":"When key+modifier combination keyDefinition is pressed perform sciCommand.\n\nThe second argument should be a bit list containing one or more of the ?wxSTC\\_KEYMOD\\_\\*\nconstants and the third argument should be one of the ?wxSTC\\_CMD\\_\\* constants.","title":"wxStyledTextCtrl.cmdKeyAssign/4","ref":"wxStyledTextCtrl.html#cmdKeyAssign/4"},{"type":"function","doc":"When key+modifier combination keyDefinition is pressed do nothing.\n\nThe second argument should be a bit list containing one or more of the ?wxSTC\\_KEYMOD\\_\\*\nconstants.","title":"wxStyledTextCtrl.cmdKeyClear/3","ref":"wxStyledTextCtrl.html#cmdKeyClear/3"},{"type":"function","doc":"Drop all key mappings.","title":"wxStyledTextCtrl.cmdKeyClearAll/1","ref":"wxStyledTextCtrl.html#cmdKeyClearAll/1"},{"type":"function","doc":"Perform one of the operations defined by the wxSTC_CMD_* constants.","title":"wxStyledTextCtrl.cmdKeyExecute/2","ref":"wxStyledTextCtrl.html#cmdKeyExecute/2"},{"type":"function","doc":"Colourise a segment of the document using the current lexing language.","title":"wxStyledTextCtrl.colourise/3","ref":"wxStyledTextCtrl.html#colourise/3"},{"type":"function","doc":"Convert all line endings in the document to one mode.","title":"wxStyledTextCtrl.convertEOLs/2","ref":"wxStyledTextCtrl.html#convertEOLs/2"},{"type":"function","doc":"Copy the selection to the clipboard.","title":"wxStyledTextCtrl.copy/1","ref":"wxStyledTextCtrl.html#copy/1"},{"type":"function","doc":"Copy a range of text to the clipboard.\n\nPositions are clipped into the document.","title":"wxStyledTextCtrl.copyRange/3","ref":"wxStyledTextCtrl.html#copyRange/3"},{"type":"function","doc":"Copy argument text to the clipboard.","title":"wxStyledTextCtrl.copyText/3","ref":"wxStyledTextCtrl.html#copyText/3"},{"type":"function","doc":"","title":"wxStyledTextCtrl.create/2","ref":"wxStyledTextCtrl.html#create/2"},{"type":"function","doc":"Create the UI elements for a STC that was created with the default ctor.\n\n(For 2-phase create.)","title":"wxStyledTextCtrl.create/3","ref":"wxStyledTextCtrl.html#create/3"},{"type":"function","doc":"Cut the selection to the clipboard.","title":"wxStyledTextCtrl.cut/1","ref":"wxStyledTextCtrl.html#cut/1"},{"type":"function","doc":"Delete the selection or if no selection, the character before the caret.","title":"wxStyledTextCtrl.deleteBack/1","ref":"wxStyledTextCtrl.html#deleteBack/1"},{"type":"function","doc":"Delete the selection or if no selection, the character before the caret.\n\nWill not delete the character before at the start of a line.","title":"wxStyledTextCtrl.deleteBackNotLine/1","ref":"wxStyledTextCtrl.html#deleteBackNotLine/1"},{"type":"function","doc":"Delete back from the current position to the start of the line.","title":"wxStyledTextCtrl.delLineLeft/1","ref":"wxStyledTextCtrl.html#delLineLeft/1"},{"type":"function","doc":"Delete forwards from the current position to the end of the line.","title":"wxStyledTextCtrl.delLineRight/1","ref":"wxStyledTextCtrl.html#delLineRight/1"},{"type":"function","doc":"Delete the word to the left of the caret.","title":"wxStyledTextCtrl.delWordLeft/1","ref":"wxStyledTextCtrl.html#delWordLeft/1"},{"type":"function","doc":"Delete the word to the right of the caret.","title":"wxStyledTextCtrl.delWordRight/1","ref":"wxStyledTextCtrl.html#delWordRight/1"},{"type":"function","doc":"Destroys the object","title":"wxStyledTextCtrl.destroy/1","ref":"wxStyledTextCtrl.html#destroy/1"},{"type":"function","doc":"Find the document line of a display line taking hidden lines into account.","title":"wxStyledTextCtrl.docLineFromVisible/2","ref":"wxStyledTextCtrl.html#docLineFromVisible/2"},{"type":"function","doc":"Move caret to last position in document.","title":"wxStyledTextCtrl.documentEnd/1","ref":"wxStyledTextCtrl.html#documentEnd/1"},{"type":"function","doc":"Move caret to last position in document extending selection to new caret position.","title":"wxStyledTextCtrl.documentEndExtend/1","ref":"wxStyledTextCtrl.html#documentEndExtend/1"},{"type":"function","doc":"Move caret to first position in document.","title":"wxStyledTextCtrl.documentStart/1","ref":"wxStyledTextCtrl.html#documentStart/1"},{"type":"function","doc":"Move caret to first position in document extending selection to new caret position.","title":"wxStyledTextCtrl.documentStartExtend/1","ref":"wxStyledTextCtrl.html#documentStartExtend/1"},{"type":"function","doc":"Allow for simulating a DnD DragOver.","title":"wxStyledTextCtrl.doDragOver/4","ref":"wxStyledTextCtrl.html#doDragOver/4"},{"type":"function","doc":"Allow for simulating a DnD DropText.","title":"wxStyledTextCtrl.doDropText/4","ref":"wxStyledTextCtrl.html#doDropText/4"},{"type":"function","doc":"Switch from insert to overtype mode or the reverse.","title":"wxStyledTextCtrl.editToggleOvertype/1","ref":"wxStyledTextCtrl.html#editToggleOvertype/1"},{"type":"function","doc":"Delete the undo history.","title":"wxStyledTextCtrl.emptyUndoBuffer/1","ref":"wxStyledTextCtrl.html#emptyUndoBuffer/1"},{"type":"function","doc":"End a sequence of actions that is undone and redone as a unit.","title":"wxStyledTextCtrl.endUndoAction/1","ref":"wxStyledTextCtrl.html#endUndoAction/1"},{"type":"function","doc":"Ensure the caret is visible.","title":"wxStyledTextCtrl.ensureCaretVisible/1","ref":"wxStyledTextCtrl.html#ensureCaretVisible/1"},{"type":"function","doc":"Ensure a particular line is visible by expanding any header line hiding it.","title":"wxStyledTextCtrl.ensureVisible/2","ref":"wxStyledTextCtrl.html#ensureVisible/2"},{"type":"function","doc":"Ensure a particular line is visible by expanding any header line hiding it.\n\nUse the currently set visibility policy to determine which range to display.","title":"wxStyledTextCtrl.ensureVisibleEnforcePolicy/2","ref":"wxStyledTextCtrl.html#ensureVisibleEnforcePolicy/2"},{"type":"function","doc":"Find the position of a column on a line taking into account tabs and multi-byte\ncharacters.\n\nIf beyond end of line, return line end position.","title":"wxStyledTextCtrl.findColumn/3","ref":"wxStyledTextCtrl.html#findColumn/3"},{"type":"function","doc":"","title":"wxStyledTextCtrl.findText/4","ref":"wxStyledTextCtrl.html#findText/4"},{"type":"function","doc":"` Find some text in the document. @param minPos The position (starting from zero) in the\ndocument at which to begin the search @param maxPos The last position (starting from zero)\nin the document to which the search will be restricted. @param text The text to search\nfor. @param flags (Optional) The search flags. This should be a bit list containing one or\nmore of the @link wxStyledTextCtrl::wxSTC_FIND_WHOLEWORD wxSTC_FIND_* @endlink constants. `\n\nReturn: The position (starting from zero) in the document at which the text was found or\nwxSTC_INVALID_POSITION if the search fails.\n\nRemark: A backwards search can be performed by setting minPos to be greater than maxPos.","title":"wxStyledTextCtrl.findText/5","ref":"wxStyledTextCtrl.html#findText/5"},{"type":"function","doc":"On Windows, will draw the document into a display context such as a printer.","title":"wxStyledTextCtrl.formatRange/8","ref":"wxStyledTextCtrl.html#formatRange/8"},{"type":"function","doc":"Insert a Form Feed character.","title":"wxStyledTextCtrl.formFeed/1","ref":"wxStyledTextCtrl.html#formFeed/1"},{"type":"function","doc":"Returns the position of the opposite end of the selection to the caret.","title":"wxStyledTextCtrl.getAnchor/1","ref":"wxStyledTextCtrl.html#getAnchor/1"},{"type":"function","doc":"Does a backspace pressed when caret is within indentation unindent?","title":"wxStyledTextCtrl.getBackSpaceUnIndents/1","ref":"wxStyledTextCtrl.html#getBackSpaceUnIndents/1"},{"type":"function","doc":"Is drawing done first into a buffer or direct to the screen?","title":"wxStyledTextCtrl.getBufferedDraw/1","ref":"wxStyledTextCtrl.html#getBufferedDraw/1"},{"type":"function","doc":"Get the foreground colour of the caret.","title":"wxStyledTextCtrl.getCaretForeground/1","ref":"wxStyledTextCtrl.html#getCaretForeground/1"},{"type":"function","doc":"Get the background alpha of the caret line.","title":"wxStyledTextCtrl.getCaretLineBackAlpha/1","ref":"wxStyledTextCtrl.html#getCaretLineBackAlpha/1"},{"type":"function","doc":"Get the colour of the background of the line containing the caret.","title":"wxStyledTextCtrl.getCaretLineBackground/1","ref":"wxStyledTextCtrl.html#getCaretLineBackground/1"},{"type":"function","doc":"Is the background of the line containing the caret in a different colour?","title":"wxStyledTextCtrl.getCaretLineVisible/1","ref":"wxStyledTextCtrl.html#getCaretLineVisible/1"},{"type":"function","doc":"Get the time in milliseconds that the caret is on and off.","title":"wxStyledTextCtrl.getCaretPeriod/1","ref":"wxStyledTextCtrl.html#getCaretPeriod/1"},{"type":"function","doc":"Can the caret preferred x position only be changed by explicit movement commands?\n\nThe return value will be one of the ?wxSTC\\_CARETSTICKY\\_\\* constants.","title":"wxStyledTextCtrl.getCaretSticky/1","ref":"wxStyledTextCtrl.html#getCaretSticky/1"},{"type":"function","doc":"Returns the width of the insert mode caret.","title":"wxStyledTextCtrl.getCaretWidth/1","ref":"wxStyledTextCtrl.html#getCaretWidth/1"},{"type":"function","doc":"Returns the character byte at the position.","title":"wxStyledTextCtrl.getCharAt/2","ref":"wxStyledTextCtrl.html#getCharAt/2"},{"type":"function","doc":"Get the code page used to interpret the bytes of the document as characters.","title":"wxStyledTextCtrl.getCodePage/1","ref":"wxStyledTextCtrl.html#getCodePage/1"},{"type":"function","doc":"Retrieve the column number of a position, taking tab width into account.","title":"wxStyledTextCtrl.getColumn/2","ref":"wxStyledTextCtrl.html#getColumn/2"},{"type":"function","doc":"Get the way control characters are displayed.","title":"wxStyledTextCtrl.getControlCharSymbol/1","ref":"wxStyledTextCtrl.html#getControlCharSymbol/1"},{"type":"function","doc":"Retrieve the text of the line containing the caret.\n\nlinePos can optionally be passed in to receive the index of the caret on the line.","title":"wxStyledTextCtrl.getCurLine/1","ref":"wxStyledTextCtrl.html#getCurLine/1"},{"type":"function","doc":"Retrieve the text of the line containing the caret.\n\nReturns the index of the caret on the line.","title":"wxStyledTextCtrl.getCurLineRaw/1","ref":"wxStyledTextCtrl.html#getCurLineRaw/1"},{"type":"function","doc":"Returns the line number of the line with the caret.","title":"wxStyledTextCtrl.getCurrentLine/1","ref":"wxStyledTextCtrl.html#getCurrentLine/1"},{"type":"function","doc":"Returns the position of the caret.","title":"wxStyledTextCtrl.getCurrentPos/1","ref":"wxStyledTextCtrl.html#getCurrentPos/1"},{"type":"function","doc":"Retrieve the colour used in edge indication.","title":"wxStyledTextCtrl.getEdgeColour/1","ref":"wxStyledTextCtrl.html#getEdgeColour/1"},{"type":"function","doc":"Retrieve the column number which text should be kept within.","title":"wxStyledTextCtrl.getEdgeColumn/1","ref":"wxStyledTextCtrl.html#getEdgeColumn/1"},{"type":"function","doc":"Retrieve the edge highlight mode.\n\nThe return value will be one of the ?wxSTC\\_EDGE\\_\\* constants.","title":"wxStyledTextCtrl.getEdgeMode/1","ref":"wxStyledTextCtrl.html#getEdgeMode/1"},{"type":"function","doc":"Retrieve whether the maximum scroll position has the last line at the bottom of the view.","title":"wxStyledTextCtrl.getEndAtLastLine/1","ref":"wxStyledTextCtrl.html#getEndAtLastLine/1"},{"type":"function","doc":"Retrieve the position of the last correctly styled character.","title":"wxStyledTextCtrl.getEndStyled/1","ref":"wxStyledTextCtrl.html#getEndStyled/1"},{"type":"function","doc":"Retrieve the current end of line mode - one of wxSTC\\_EOL\\_CRLF, wxSTC\\_EOL\\_CR, or\nwxSTC\\_EOL\\_LF.","title":"wxStyledTextCtrl.getEOLMode/1","ref":"wxStyledTextCtrl.html#getEOLMode/1"},{"type":"function","doc":"Retrieve the display line at the top of the display.","title":"wxStyledTextCtrl.getFirstVisibleLine/1","ref":"wxStyledTextCtrl.html#getFirstVisibleLine/1"},{"type":"function","doc":"Is a header line expanded?","title":"wxStyledTextCtrl.getFoldExpanded/2","ref":"wxStyledTextCtrl.html#getFoldExpanded/2"},{"type":"function","doc":"Retrieve the fold level of a line.","title":"wxStyledTextCtrl.getFoldLevel/2","ref":"wxStyledTextCtrl.html#getFoldLevel/2"},{"type":"function","doc":"Find the parent line of a child line.","title":"wxStyledTextCtrl.getFoldParent/2","ref":"wxStyledTextCtrl.html#getFoldParent/2"},{"type":"function","doc":"Get the highlighted indentation guide column.","title":"wxStyledTextCtrl.getHighlightGuide/1","ref":"wxStyledTextCtrl.html#getHighlightGuide/1"},{"type":"function","doc":"Retrieve indentation size.","title":"wxStyledTextCtrl.getIndent/1","ref":"wxStyledTextCtrl.html#getIndent/1"},{"type":"function","doc":"Are the indentation guides visible?\n\nThe return value will be one of the ?wxSTC\\_IV\\_\\* constants.","title":"wxStyledTextCtrl.getIndentationGuides/1","ref":"wxStyledTextCtrl.html#getIndentationGuides/1"},{"type":"function","doc":"Find the last child line of a header line.","title":"wxStyledTextCtrl.getLastChild/3","ref":"wxStyledTextCtrl.html#getLastChild/3"},{"type":"function","doc":"Can be used to prevent the EVT_CHAR handler from adding the char.","title":"wxStyledTextCtrl.getLastKeydownProcessed/1","ref":"wxStyledTextCtrl.html#getLastKeydownProcessed/1"},{"type":"function","doc":"Retrieve the degree of caching of layout information.\n\nThe return value will be one of the ?wxSTC\\_CACHE\\_\\* constants.","title":"wxStyledTextCtrl.getLayoutCache/1","ref":"wxStyledTextCtrl.html#getLayoutCache/1"},{"type":"function","doc":"Returns the number of bytes in the document.","title":"wxStyledTextCtrl.getLength/1","ref":"wxStyledTextCtrl.html#getLength/1"},{"type":"function","doc":"Retrieve the lexing language of the document.\n\nThe return value will be one of the ?wxSTC\\_LEX\\_\\* constants.","title":"wxStyledTextCtrl.getLexer/1","ref":"wxStyledTextCtrl.html#getLexer/1"},{"type":"function","doc":"Retrieve the contents of a line.","title":"wxStyledTextCtrl.getLine/2","ref":"wxStyledTextCtrl.html#getLine/2"},{"type":"function","doc":"Returns the number of lines in the document.\n\nThere is always at least one.","title":"wxStyledTextCtrl.getLineCount/1","ref":"wxStyledTextCtrl.html#getLineCount/1"},{"type":"function","doc":"Get the position after the last visible characters on a line.","title":"wxStyledTextCtrl.getLineEndPosition/2","ref":"wxStyledTextCtrl.html#getLineEndPosition/2"},{"type":"function","doc":"Retrieve the number of columns that a line is indented.","title":"wxStyledTextCtrl.getLineIndentation/2","ref":"wxStyledTextCtrl.html#getLineIndentation/2"},{"type":"function","doc":"Retrieve the position before the first non indentation character on a line.","title":"wxStyledTextCtrl.getLineIndentPosition/2","ref":"wxStyledTextCtrl.html#getLineIndentPosition/2"},{"type":"function","doc":"Retrieve the contents of a line.","title":"wxStyledTextCtrl.getLineRaw/2","ref":"wxStyledTextCtrl.html#getLineRaw/2"},{"type":"function","doc":"Retrieve the extra styling information for a line.","title":"wxStyledTextCtrl.getLineState/2","ref":"wxStyledTextCtrl.html#getLineState/2"},{"type":"function","doc":"Is a line visible?","title":"wxStyledTextCtrl.getLineVisible/2","ref":"wxStyledTextCtrl.html#getLineVisible/2"},{"type":"function","doc":"Returns the size in pixels of the left margin.","title":"wxStyledTextCtrl.getMarginLeft/1","ref":"wxStyledTextCtrl.html#getMarginLeft/1"},{"type":"function","doc":"Retrieve the marker mask of a margin.","title":"wxStyledTextCtrl.getMarginMask/2","ref":"wxStyledTextCtrl.html#getMarginMask/2"},{"type":"function","doc":"Returns the size in pixels of the right margin.","title":"wxStyledTextCtrl.getMarginRight/1","ref":"wxStyledTextCtrl.html#getMarginRight/1"},{"type":"function","doc":"Retrieve the mouse click sensitivity of a margin.","title":"wxStyledTextCtrl.getMarginSensitive/2","ref":"wxStyledTextCtrl.html#getMarginSensitive/2"},{"type":"function","doc":"Retrieve the type of a margin.\n\nThe return value will be one of the ?wxSTC\\_MARGIN\\_\\* constants.","title":"wxStyledTextCtrl.getMarginType/2","ref":"wxStyledTextCtrl.html#getMarginType/2"},{"type":"function","doc":"Retrieve the width of a margin in pixels.","title":"wxStyledTextCtrl.getMarginWidth/2","ref":"wxStyledTextCtrl.html#getMarginWidth/2"},{"type":"function","doc":"Retrieve the last line number that has line state.","title":"wxStyledTextCtrl.getMaxLineState/1","ref":"wxStyledTextCtrl.html#getMaxLineState/1"},{"type":"function","doc":"Get which document modification events are sent to the container.\n\nThe return value will wxSTC_MODEVENTMASKALL if all changes generate events. Otherwise it\nwill be a bit list containing one or more of the ?wxSTC\\_MOD\\_\\* constants, the\n?wxSTC\\_PERFORMED\\_\\* constants, wxSTC_STARTACTION, wxSTC_MULTILINEUNDOREDO,\nwxSTC_MULTISTEPUNDOREDO, and wxSTC_LASTSTEPINUNDOREDO.","title":"wxStyledTextCtrl.getModEventMask/1","ref":"wxStyledTextCtrl.html#getModEventMask/1"},{"type":"function","doc":"Is the document different from when it was last saved?","title":"wxStyledTextCtrl.getModify/1","ref":"wxStyledTextCtrl.html#getModify/1"},{"type":"function","doc":"Get whether mouse gets captured.","title":"wxStyledTextCtrl.getMouseDownCaptures/1","ref":"wxStyledTextCtrl.html#getMouseDownCaptures/1"},{"type":"function","doc":"Retrieve the time the mouse must sit still to generate a mouse dwell event.\n\nThe return value will be a time in milliseconds or wxSTC_TIME_FOREVER.","title":"wxStyledTextCtrl.getMouseDwellTime/1","ref":"wxStyledTextCtrl.html#getMouseDwellTime/1"},{"type":"function","doc":"Returns true if overtype mode is active otherwise false is returned.","title":"wxStyledTextCtrl.getOvertype/1","ref":"wxStyledTextCtrl.html#getOvertype/1"},{"type":"function","doc":"Get convert-on-paste setting.","title":"wxStyledTextCtrl.getPasteConvertEndings/1","ref":"wxStyledTextCtrl.html#getPasteConvertEndings/1"},{"type":"function","doc":"Returns the print colour mode.\n\nThe return value will be one of the ?wxSTC\\_PRINT\\_\\* constants.","title":"wxStyledTextCtrl.getPrintColourMode/1","ref":"wxStyledTextCtrl.html#getPrintColourMode/1"},{"type":"function","doc":"Returns the print magnification.","title":"wxStyledTextCtrl.getPrintMagnification/1","ref":"wxStyledTextCtrl.html#getPrintMagnification/1"},{"type":"function","doc":"Is printing line wrapped?\n\nThe return value will be one of the ?wxSTC\\_WRAP\\_\\* constants.","title":"wxStyledTextCtrl.getPrintWrapMode/1","ref":"wxStyledTextCtrl.html#getPrintWrapMode/1"},{"type":"function","doc":"Retrieve a \"property\" value previously set with SetProperty.","title":"wxStyledTextCtrl.getProperty/2","ref":"wxStyledTextCtrl.html#getProperty/2"},{"type":"function","doc":"In read-only mode?","title":"wxStyledTextCtrl.getReadOnly/1","ref":"wxStyledTextCtrl.html#getReadOnly/1"},{"type":"function","doc":"Retrieve the document width assumed for scrolling.","title":"wxStyledTextCtrl.getScrollWidth/1","ref":"wxStyledTextCtrl.html#getScrollWidth/1"},{"type":"function","doc":"Get the search flags used by SearchInTarget.\n\nThe return value will be a bit list containing one or more of the ?wxSTC\\_FIND\\_\\*\nconstants.","title":"wxStyledTextCtrl.getSearchFlags/1","ref":"wxStyledTextCtrl.html#getSearchFlags/1"},{"type":"function","doc":"Get the alpha of the selection.","title":"wxStyledTextCtrl.getSelAlpha/1","ref":"wxStyledTextCtrl.html#getSelAlpha/1"},{"type":"function","doc":"Retrieve the selected text.","title":"wxStyledTextCtrl.getSelectedText/1","ref":"wxStyledTextCtrl.html#getSelectedText/1"},{"type":"function","doc":"Retrieve the selected text.","title":"wxStyledTextCtrl.getSelectedTextRaw/1","ref":"wxStyledTextCtrl.html#getSelectedTextRaw/1"},{"type":"function","doc":"Gets the current selection span.\n\nIf the returned values are equal, there was no selection. Please note that the indices\nreturned may be used with the other `m:wxTextCtrl` methods but don't necessarily represent\nthe correct indices into the string returned by `wxComboBox:getValue/1` for multiline controls under Windows (at\nleast,) you should use `wxTextCtrl:getStringSelection/1` to get the selected text.","title":"wxStyledTextCtrl.getSelection/1","ref":"wxStyledTextCtrl.html#getSelection/1"},{"type":"function","doc":"Returns the position at the end of the selection.","title":"wxStyledTextCtrl.getSelectionEnd/1","ref":"wxStyledTextCtrl.html#getSelectionEnd/1"},{"type":"function","doc":"Get the mode of the current selection.\n\nThe return value will be one of the ?wxSTC\\_SEL\\_\\* constants.","title":"wxStyledTextCtrl.getSelectionMode/1","ref":"wxStyledTextCtrl.html#getSelectionMode/1"},{"type":"function","doc":"Returns the position at the start of the selection.","title":"wxStyledTextCtrl.getSelectionStart/1","ref":"wxStyledTextCtrl.html#getSelectionStart/1"},{"type":"function","doc":"Get cursor type.\n\nThe return value will be one of the ?wxSTC\\_CURSOR\\* constants.","title":"wxStyledTextCtrl.getSTCCursor/1","ref":"wxStyledTextCtrl.html#getSTCCursor/1"},{"type":"function","doc":"Get internal focus flag.","title":"wxStyledTextCtrl.getSTCFocus/1","ref":"wxStyledTextCtrl.html#getSTCFocus/1"},{"type":"function","doc":"Get error status.\n\nThe return value will be one of the ?wxSTC\\_STATUS\\_\\* constants.","title":"wxStyledTextCtrl.getStatus/1","ref":"wxStyledTextCtrl.html#getStatus/1"},{"type":"function","doc":"Returns the style byte at the position.","title":"wxStyledTextCtrl.getStyleAt/2","ref":"wxStyledTextCtrl.html#getStyleAt/2"},{"type":"function","doc":"Retrieve number of bits in style bytes used to hold the lexical state.\n\nDeprecated:","title":"wxStyledTextCtrl.getStyleBits/1","ref":"wxStyledTextCtrl.html#getStyleBits/1"},{"type":"function","doc":"Retrieve the number of bits the current lexer needs for styling.\n\nDeprecated:","title":"wxStyledTextCtrl.getStyleBitsNeeded/1","ref":"wxStyledTextCtrl.html#getStyleBitsNeeded/1"},{"type":"function","doc":"Does a tab pressed when caret is within indentation indent?","title":"wxStyledTextCtrl.getTabIndents/1","ref":"wxStyledTextCtrl.html#getTabIndents/1"},{"type":"function","doc":"Retrieve the visible size of a tab.","title":"wxStyledTextCtrl.getTabWidth/1","ref":"wxStyledTextCtrl.html#getTabWidth/1"},{"type":"function","doc":"Get the position that ends the target.","title":"wxStyledTextCtrl.getTargetEnd/1","ref":"wxStyledTextCtrl.html#getTargetEnd/1"},{"type":"function","doc":"Get the position that starts the target.","title":"wxStyledTextCtrl.getTargetStart/1","ref":"wxStyledTextCtrl.html#getTargetStart/1"},{"type":"function","doc":"Retrieve all the text in the document.","title":"wxStyledTextCtrl.getText/1","ref":"wxStyledTextCtrl.html#getText/1"},{"type":"function","doc":"Retrieve the number of characters in the document.","title":"wxStyledTextCtrl.getTextLength/1","ref":"wxStyledTextCtrl.html#getTextLength/1"},{"type":"function","doc":"Retrieve a range of text.","title":"wxStyledTextCtrl.getTextRange/3","ref":"wxStyledTextCtrl.html#getTextRange/3"},{"type":"function","doc":"Retrieve a range of text.","title":"wxStyledTextCtrl.getTextRangeRaw/3","ref":"wxStyledTextCtrl.html#getTextRangeRaw/3"},{"type":"function","doc":"Retrieve all the text in the document.","title":"wxStyledTextCtrl.getTextRaw/1","ref":"wxStyledTextCtrl.html#getTextRaw/1"},{"type":"function","doc":"Is drawing done in two phases with backgrounds drawn before foregrounds?","title":"wxStyledTextCtrl.getTwoPhaseDraw/1","ref":"wxStyledTextCtrl.html#getTwoPhaseDraw/1"},{"type":"function","doc":"Is undo history being collected?","title":"wxStyledTextCtrl.getUndoCollection/1","ref":"wxStyledTextCtrl.html#getUndoCollection/1"},{"type":"function","doc":"Returns the current UseAntiAliasing setting.","title":"wxStyledTextCtrl.getUseAntiAliasing/1","ref":"wxStyledTextCtrl.html#getUseAntiAliasing/1"},{"type":"function","doc":"Is the horizontal scroll bar visible?","title":"wxStyledTextCtrl.getUseHorizontalScrollBar/1","ref":"wxStyledTextCtrl.html#getUseHorizontalScrollBar/1"},{"type":"function","doc":"Retrieve whether tabs will be used in indentation.","title":"wxStyledTextCtrl.getUseTabs/1","ref":"wxStyledTextCtrl.html#getUseTabs/1"},{"type":"function","doc":"Is the vertical scroll bar visible?","title":"wxStyledTextCtrl.getUseVerticalScrollBar/1","ref":"wxStyledTextCtrl.html#getUseVerticalScrollBar/1"},{"type":"function","doc":"Are the end of line characters visible?","title":"wxStyledTextCtrl.getViewEOL/1","ref":"wxStyledTextCtrl.html#getViewEOL/1"},{"type":"function","doc":"Are white space characters currently visible? Returns one of wxSTC_WS_* constants.","title":"wxStyledTextCtrl.getViewWhiteSpace/1","ref":"wxStyledTextCtrl.html#getViewWhiteSpace/1"},{"type":"function","doc":"Retrieve whether text is word wrapped.\n\nThe return value will be one of the ?wxSTC\\_WRAP\\_\\* constants.","title":"wxStyledTextCtrl.getWrapMode/1","ref":"wxStyledTextCtrl.html#getWrapMode/1"},{"type":"function","doc":"Retrieve the start indent for wrapped lines.","title":"wxStyledTextCtrl.getWrapStartIndent/1","ref":"wxStyledTextCtrl.html#getWrapStartIndent/1"},{"type":"function","doc":"Retrieve the display mode of visual flags for wrapped lines.\n\nThe return value will be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAG\\_\\* constants.","title":"wxStyledTextCtrl.getWrapVisualFlags/1","ref":"wxStyledTextCtrl.html#getWrapVisualFlags/1"},{"type":"function","doc":"Retrieve the location of visual flags for wrapped lines.\n\nThe return value will be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAGLOC\\_\\* constants.","title":"wxStyledTextCtrl.getWrapVisualFlagsLocation/1","ref":"wxStyledTextCtrl.html#getWrapVisualFlagsLocation/1"},{"type":"function","doc":"Get the xOffset (ie, horizontal scroll position).","title":"wxStyledTextCtrl.getXOffset/1","ref":"wxStyledTextCtrl.html#getXOffset/1"},{"type":"function","doc":"Retrieve the zoom level.","title":"wxStyledTextCtrl.getZoom/1","ref":"wxStyledTextCtrl.html#getZoom/1"},{"type":"function","doc":"Set caret to start of a line and ensure it is visible.","title":"wxStyledTextCtrl.gotoLine/2","ref":"wxStyledTextCtrl.html#gotoLine/2"},{"type":"function","doc":"Set caret to a position and ensure it is visible.","title":"wxStyledTextCtrl.gotoPos/2","ref":"wxStyledTextCtrl.html#gotoPos/2"},{"type":"function","doc":"Make a range of lines invisible.","title":"wxStyledTextCtrl.hideLines/3","ref":"wxStyledTextCtrl.html#hideLines/3"},{"type":"function","doc":"Draw the selection in normal style or with selection highlighted.","title":"wxStyledTextCtrl.hideSelection/2","ref":"wxStyledTextCtrl.html#hideSelection/2"},{"type":"function","doc":"Move caret to first position on line.","title":"wxStyledTextCtrl.home/1","ref":"wxStyledTextCtrl.html#home/1"},{"type":"function","doc":"Move caret to first position on display line.","title":"wxStyledTextCtrl.homeDisplay/1","ref":"wxStyledTextCtrl.html#homeDisplay/1"},{"type":"function","doc":"Move caret to first position on display line extending selection to new caret position.","title":"wxStyledTextCtrl.homeDisplayExtend/1","ref":"wxStyledTextCtrl.html#homeDisplayExtend/1"},{"type":"function","doc":"Move caret to first position on line extending selection to new caret position.","title":"wxStyledTextCtrl.homeExtend/1","ref":"wxStyledTextCtrl.html#homeExtend/1"},{"type":"function","doc":"Move caret to first position on line, extending rectangular selection to new caret\nposition.","title":"wxStyledTextCtrl.homeRectExtend/1","ref":"wxStyledTextCtrl.html#homeRectExtend/1"},{"type":"function","doc":"Like HomeExtend but when word-wrap is enabled extends first to start of display line\nHomeDisplayExtend, then to start of document line HomeExtend.","title":"wxStyledTextCtrl.homeWrapExtend/1","ref":"wxStyledTextCtrl.html#homeWrapExtend/1"},{"type":"function","doc":"Retrieve the foreground colour of an indicator.","title":"wxStyledTextCtrl.indicatorGetForeground/2","ref":"wxStyledTextCtrl.html#indicatorGetForeground/2"},{"type":"function","doc":"Retrieve the style of an indicator.\n\nThe return value will be one of the ?wxSTC\\_INDIC\\_\\* constants.","title":"wxStyledTextCtrl.indicatorGetStyle/2","ref":"wxStyledTextCtrl.html#indicatorGetStyle/2"},{"type":"function","doc":"Set the foreground colour of an indicator.","title":"wxStyledTextCtrl.indicatorSetForeground/3","ref":"wxStyledTextCtrl.html#indicatorSetForeground/3"},{"type":"function","doc":"Set an indicator to plain, squiggle or TT.\n\nThe second argument should be one of the ?wxSTC\\_INDIC\\_\\* constants.","title":"wxStyledTextCtrl.indicatorSetStyle/3","ref":"wxStyledTextCtrl.html#indicatorSetStyle/3"},{"type":"function","doc":"Insert string at a position.","title":"wxStyledTextCtrl.insertText/3","ref":"wxStyledTextCtrl.html#insertText/3"},{"type":"function","doc":"Insert string at a position.","title":"wxStyledTextCtrl.insertTextRaw/3","ref":"wxStyledTextCtrl.html#insertTextRaw/3"},{"type":"function","doc":"Copy the line containing the caret.","title":"wxStyledTextCtrl.lineCopy/1","ref":"wxStyledTextCtrl.html#lineCopy/1"},{"type":"function","doc":"Cut the line containing the caret.","title":"wxStyledTextCtrl.lineCut/1","ref":"wxStyledTextCtrl.html#lineCut/1"},{"type":"function","doc":"Delete the line containing the caret.","title":"wxStyledTextCtrl.lineDelete/1","ref":"wxStyledTextCtrl.html#lineDelete/1"},{"type":"function","doc":"Move caret down one line.","title":"wxStyledTextCtrl.lineDown/1","ref":"wxStyledTextCtrl.html#lineDown/1"},{"type":"function","doc":"Move caret down one line extending selection to new caret position.","title":"wxStyledTextCtrl.lineDownExtend/1","ref":"wxStyledTextCtrl.html#lineDownExtend/1"},{"type":"function","doc":"Move caret down one line, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.lineDownRectExtend/1","ref":"wxStyledTextCtrl.html#lineDownRectExtend/1"},{"type":"function","doc":"Duplicate the current line.","title":"wxStyledTextCtrl.lineDuplicate/1","ref":"wxStyledTextCtrl.html#lineDuplicate/1"},{"type":"function","doc":"Move caret to last position on line.","title":"wxStyledTextCtrl.lineEnd/1","ref":"wxStyledTextCtrl.html#lineEnd/1"},{"type":"function","doc":"Move caret to last position on display line.","title":"wxStyledTextCtrl.lineEndDisplay/1","ref":"wxStyledTextCtrl.html#lineEndDisplay/1"},{"type":"function","doc":"Move caret to last position on display line extending selection to new caret position.","title":"wxStyledTextCtrl.lineEndDisplayExtend/1","ref":"wxStyledTextCtrl.html#lineEndDisplayExtend/1"},{"type":"function","doc":"Move caret to last position on line extending selection to new caret position.","title":"wxStyledTextCtrl.lineEndExtend/1","ref":"wxStyledTextCtrl.html#lineEndExtend/1"},{"type":"function","doc":"Move caret to last position on line, extending rectangular selection to new caret\nposition.","title":"wxStyledTextCtrl.lineEndRectExtend/1","ref":"wxStyledTextCtrl.html#lineEndRectExtend/1"},{"type":"function","doc":"Like LineEnd but when word-wrap is enabled goes first to end of display line\nLineEndDisplay, then to start of document line LineEnd.","title":"wxStyledTextCtrl.lineEndWrap/1","ref":"wxStyledTextCtrl.html#lineEndWrap/1"},{"type":"function","doc":"Like LineEndExtend but when word-wrap is enabled extends first to end of display line\nLineEndDisplayExtend, then to start of document line LineEndExtend.","title":"wxStyledTextCtrl.lineEndWrapExtend/1","ref":"wxStyledTextCtrl.html#lineEndWrapExtend/1"},{"type":"function","doc":"Retrieve the line containing a position.","title":"wxStyledTextCtrl.lineFromPosition/2","ref":"wxStyledTextCtrl.html#lineFromPosition/2"},{"type":"function","doc":"How many characters are on a line, including end of line characters?","title":"wxStyledTextCtrl.lineLength/2","ref":"wxStyledTextCtrl.html#lineLength/2"},{"type":"function","doc":"Scroll horizontally and vertically.","title":"wxStyledTextCtrl.lineScroll/3","ref":"wxStyledTextCtrl.html#lineScroll/3"},{"type":"function","doc":"Scroll the document down, keeping the caret visible.","title":"wxStyledTextCtrl.lineScrollDown/1","ref":"wxStyledTextCtrl.html#lineScrollDown/1"},{"type":"function","doc":"Scroll the document up, keeping the caret visible.","title":"wxStyledTextCtrl.lineScrollUp/1","ref":"wxStyledTextCtrl.html#lineScrollUp/1"},{"type":"function","doc":"Join the lines in the target.","title":"wxStyledTextCtrl.linesJoin/1","ref":"wxStyledTextCtrl.html#linesJoin/1"},{"type":"function","doc":"Retrieves the number of lines completely visible.","title":"wxStyledTextCtrl.linesOnScreen/1","ref":"wxStyledTextCtrl.html#linesOnScreen/1"},{"type":"function","doc":"Split the lines in the target into lines that are less wide than pixelWidth where\npossible.","title":"wxStyledTextCtrl.linesSplit/2","ref":"wxStyledTextCtrl.html#linesSplit/2"},{"type":"function","doc":"Switch the current line with the previous.","title":"wxStyledTextCtrl.lineTranspose/1","ref":"wxStyledTextCtrl.html#lineTranspose/1"},{"type":"function","doc":"Move caret up one line.","title":"wxStyledTextCtrl.lineUp/1","ref":"wxStyledTextCtrl.html#lineUp/1"},{"type":"function","doc":"Move caret up one line extending selection to new caret position.","title":"wxStyledTextCtrl.lineUpExtend/1","ref":"wxStyledTextCtrl.html#lineUpExtend/1"},{"type":"function","doc":"Move caret up one line, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.lineUpRectExtend/1","ref":"wxStyledTextCtrl.html#lineUpRectExtend/1"},{"type":"function","doc":"Load the contents of filename into the editor.","title":"wxStyledTextCtrl.loadFile/2","ref":"wxStyledTextCtrl.html#loadFile/2"},{"type":"function","doc":"Transform the selection to lower case.","title":"wxStyledTextCtrl.lowerCase/1","ref":"wxStyledTextCtrl.html#lowerCase/1"},{"type":"function","doc":"Add a marker to a line, returning an ID which can be used to find or delete the marker.","title":"wxStyledTextCtrl.markerAdd/3","ref":"wxStyledTextCtrl.html#markerAdd/3"},{"type":"function","doc":"Add a set of markers to a line.","title":"wxStyledTextCtrl.markerAddSet/3","ref":"wxStyledTextCtrl.html#markerAddSet/3"},{"type":"function","doc":"","title":"wxStyledTextCtrl.markerDefine/3","ref":"wxStyledTextCtrl.html#markerDefine/3"},{"type":"function","doc":"Set the symbol used for a particular marker number, and optionally the fore and\nbackground colours.\n\nThe second argument should be one of the ?wxSTC\\_MARK\\_\\* constants.","title":"wxStyledTextCtrl.markerDefine/4","ref":"wxStyledTextCtrl.html#markerDefine/4"},{"type":"function","doc":"Define a marker with a `m:wxBitmap`.","title":"wxStyledTextCtrl.markerDefineBitmap/3","ref":"wxStyledTextCtrl.html#markerDefineBitmap/3"},{"type":"function","doc":"Delete a marker from a line.","title":"wxStyledTextCtrl.markerDelete/3","ref":"wxStyledTextCtrl.html#markerDelete/3"},{"type":"function","doc":"Delete all markers with a particular number from all lines.","title":"wxStyledTextCtrl.markerDeleteAll/2","ref":"wxStyledTextCtrl.html#markerDeleteAll/2"},{"type":"function","doc":"Delete a marker.","title":"wxStyledTextCtrl.markerDeleteHandle/2","ref":"wxStyledTextCtrl.html#markerDeleteHandle/2"},{"type":"function","doc":"Get a bit mask of all the markers set on a line.","title":"wxStyledTextCtrl.markerGet/2","ref":"wxStyledTextCtrl.html#markerGet/2"},{"type":"function","doc":"Retrieve the line number at which a particular marker is located.","title":"wxStyledTextCtrl.markerLineFromHandle/2","ref":"wxStyledTextCtrl.html#markerLineFromHandle/2"},{"type":"function","doc":"Find the next line at or after lineStart that includes a marker in mask.\n\nReturn -1 when no more lines.","title":"wxStyledTextCtrl.markerNext/3","ref":"wxStyledTextCtrl.html#markerNext/3"},{"type":"function","doc":"Find the previous line before lineStart that includes a marker in mask.","title":"wxStyledTextCtrl.markerPrevious/3","ref":"wxStyledTextCtrl.html#markerPrevious/3"},{"type":"function","doc":"Set the alpha used for a marker that is drawn in the text area, not the margin.","title":"wxStyledTextCtrl.markerSetAlpha/3","ref":"wxStyledTextCtrl.html#markerSetAlpha/3"},{"type":"function","doc":"Set the background colour used for a particular marker number.","title":"wxStyledTextCtrl.markerSetBackground/3","ref":"wxStyledTextCtrl.html#markerSetBackground/3"},{"type":"function","doc":"Set the foreground colour used for a particular marker number.","title":"wxStyledTextCtrl.markerSetForeground/3","ref":"wxStyledTextCtrl.html#markerSetForeground/3"},{"type":"function","doc":"Move the caret inside current view if it's not there already.","title":"wxStyledTextCtrl.moveCaretInsideView/1","ref":"wxStyledTextCtrl.html#moveCaretInsideView/1"},{"type":"function","doc":"Default ctor.","title":"wxStyledTextCtrl.new/0","ref":"wxStyledTextCtrl.html#new/0"},{"type":"function","doc":"","title":"wxStyledTextCtrl.new/1","ref":"wxStyledTextCtrl.html#new/1"},{"type":"function","doc":"Ctor.","title":"wxStyledTextCtrl.new/2","ref":"wxStyledTextCtrl.html#new/2"},{"type":"function","doc":"Insert a new line, may use a CRLF, CR or LF depending on EOL mode.","title":"wxStyledTextCtrl.newLine/1","ref":"wxStyledTextCtrl.html#newLine/1"},{"type":"function","doc":"Move caret one page down.","title":"wxStyledTextCtrl.pageDown/1","ref":"wxStyledTextCtrl.html#pageDown/1"},{"type":"function","doc":"Move caret one page down extending selection to new caret position.","title":"wxStyledTextCtrl.pageDownExtend/1","ref":"wxStyledTextCtrl.html#pageDownExtend/1"},{"type":"function","doc":"Move caret one page down, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.pageDownRectExtend/1","ref":"wxStyledTextCtrl.html#pageDownRectExtend/1"},{"type":"function","doc":"Move caret one page up.","title":"wxStyledTextCtrl.pageUp/1","ref":"wxStyledTextCtrl.html#pageUp/1"},{"type":"function","doc":"Move caret one page up extending selection to new caret position.","title":"wxStyledTextCtrl.pageUpExtend/1","ref":"wxStyledTextCtrl.html#pageUpExtend/1"},{"type":"function","doc":"Move caret one page up, extending rectangular selection to new caret position.","title":"wxStyledTextCtrl.pageUpRectExtend/1","ref":"wxStyledTextCtrl.html#pageUpRectExtend/1"},{"type":"function","doc":"Extend selection down one paragraph (delimited by empty lines).","title":"wxStyledTextCtrl.paraDownExtend/1","ref":"wxStyledTextCtrl.html#paraDownExtend/1"},{"type":"function","doc":"Move caret up one paragraph (delimited by empty lines).","title":"wxStyledTextCtrl.paraUp/1","ref":"wxStyledTextCtrl.html#paraUp/1"},{"type":"function","doc":"Extend selection up one paragraph (delimited by empty lines).","title":"wxStyledTextCtrl.paraUpExtend/1","ref":"wxStyledTextCtrl.html#paraUpExtend/1"},{"type":"function","doc":"Paste the contents of the clipboard into the document replacing the selection.","title":"wxStyledTextCtrl.paste/1","ref":"wxStyledTextCtrl.html#paste/1"},{"type":"function","doc":"Retrieve the point in the window where a position is displayed.","title":"wxStyledTextCtrl.pointFromPosition/2","ref":"wxStyledTextCtrl.html#pointFromPosition/2"},{"type":"function","doc":"Given a valid document position, return the next position taking code page into account.\n\nMaximum value returned is the last position in the document.","title":"wxStyledTextCtrl.positionAfter/2","ref":"wxStyledTextCtrl.html#positionAfter/2"},{"type":"function","doc":"Given a valid document position, return the previous position taking code page into\naccount.\n\nReturns 0 if passed 0.","title":"wxStyledTextCtrl.positionBefore/2","ref":"wxStyledTextCtrl.html#positionBefore/2"},{"type":"function","doc":"Retrieve the position at the start of a line.","title":"wxStyledTextCtrl.positionFromLine/2","ref":"wxStyledTextCtrl.html#positionFromLine/2"},{"type":"function","doc":"Find the position from a point within the window.","title":"wxStyledTextCtrl.positionFromPoint/2","ref":"wxStyledTextCtrl.html#positionFromPoint/2"},{"type":"function","doc":"Find the position from a point within the window but return wxSTC\\_INVALID\\_POSITION if\nnot close to text.","title":"wxStyledTextCtrl.positionFromPointClose/3","ref":"wxStyledTextCtrl.html#positionFromPointClose/3"},{"type":"function","doc":"Redoes the next action on the undo history.","title":"wxStyledTextCtrl.redo/1","ref":"wxStyledTextCtrl.html#redo/1"},{"type":"function","doc":"Register an image for use in autocompletion lists.","title":"wxStyledTextCtrl.registerImage/3","ref":"wxStyledTextCtrl.html#registerImage/3"},{"type":"function","doc":"Replace the selected text with the argument text.","title":"wxStyledTextCtrl.replaceSelection/2","ref":"wxStyledTextCtrl.html#replaceSelection/2"},{"type":"function","doc":"Replace the target text with the argument text.\n\nText is counted so it can contain NULs. Returns the length of the replacement text.","title":"wxStyledTextCtrl.replaceTarget/2","ref":"wxStyledTextCtrl.html#replaceTarget/2"},{"type":"function","doc":"Write the contents of the editor to filename.","title":"wxStyledTextCtrl.saveFile/2","ref":"wxStyledTextCtrl.html#saveFile/2"},{"type":"function","doc":"Scroll enough to make the given column visible.","title":"wxStyledTextCtrl.scrollToColumn/2","ref":"wxStyledTextCtrl.html#scrollToColumn/2"},{"type":"function","doc":"Scroll enough to make the given line visible.","title":"wxStyledTextCtrl.scrollToLine/2","ref":"wxStyledTextCtrl.html#scrollToLine/2"},{"type":"function","doc":"Sets the current caret position to be the search anchor.","title":"wxStyledTextCtrl.searchAnchor/1","ref":"wxStyledTextCtrl.html#searchAnchor/1"},{"type":"function","doc":"Search for a counted string in the target and set the target to the found range.\n\nText is counted so it can contain NULs. Returns length of range or -1 for failure in\nwhich case target is not moved.","title":"wxStyledTextCtrl.searchInTarget/2","ref":"wxStyledTextCtrl.html#searchInTarget/2"},{"type":"function","doc":"Find some text starting at the search anchor.\n\nDoes not ensure the selection is visible.","title":"wxStyledTextCtrl.searchNext/3","ref":"wxStyledTextCtrl.html#searchNext/3"},{"type":"function","doc":"Find some text starting at the search anchor and moving backwards.\n\nDoes not ensure the selection is visible.","title":"wxStyledTextCtrl.searchPrev/3","ref":"wxStyledTextCtrl.html#searchPrev/3"},{"type":"function","doc":"Select all the text in the document.","title":"wxStyledTextCtrl.selectAll/1","ref":"wxStyledTextCtrl.html#selectAll/1"},{"type":"function","doc":"Duplicate the selection.\n\nIf selection empty duplicate the line containing the caret.","title":"wxStyledTextCtrl.selectionDuplicate/1","ref":"wxStyledTextCtrl.html#selectionDuplicate/1"},{"type":"function","doc":"Is the selection rectangular? The alternative is the more common stream selection.","title":"wxStyledTextCtrl.selectionIsRectangle/1","ref":"wxStyledTextCtrl.html#selectionIsRectangle/1"},{"type":"function","doc":"Set the selection anchor to a position.\n\nThe anchor is the opposite end of the selection from the caret.","title":"wxStyledTextCtrl.setAnchor/2","ref":"wxStyledTextCtrl.html#setAnchor/2"},{"type":"function","doc":"Sets whether a backspace pressed when caret is within indentation unindents.","title":"wxStyledTextCtrl.setBackSpaceUnIndents/2","ref":"wxStyledTextCtrl.html#setBackSpaceUnIndents/2"},{"type":"function","doc":"If drawing is buffered then each line of text is drawn into a bitmap buffer before\ndrawing it to the screen to avoid flicker.","title":"wxStyledTextCtrl.setBufferedDraw/2","ref":"wxStyledTextCtrl.html#setBufferedDraw/2"},{"type":"function","doc":"Set the foreground colour of the caret.","title":"wxStyledTextCtrl.setCaretForeground/2","ref":"wxStyledTextCtrl.html#setCaretForeground/2"},{"type":"function","doc":"Set background alpha of the caret line.","title":"wxStyledTextCtrl.setCaretLineBackAlpha/2","ref":"wxStyledTextCtrl.html#setCaretLineBackAlpha/2"},{"type":"function","doc":"Set the colour of the background of the line containing the caret.","title":"wxStyledTextCtrl.setCaretLineBackground/2","ref":"wxStyledTextCtrl.html#setCaretLineBackground/2"},{"type":"function","doc":"Display the background of the line containing the caret in a different colour.","title":"wxStyledTextCtrl.setCaretLineVisible/2","ref":"wxStyledTextCtrl.html#setCaretLineVisible/2"},{"type":"function","doc":"Get the time in milliseconds that the caret is on and off.\n\n0 = steady on.","title":"wxStyledTextCtrl.setCaretPeriod/2","ref":"wxStyledTextCtrl.html#setCaretPeriod/2"},{"type":"function","doc":"Stop the caret preferred x position changing when the user types.\n\nThe input should be one of the ?wxSTC\\_CARETSTICKY\\_\\* constants.","title":"wxStyledTextCtrl.setCaretSticky/2","ref":"wxStyledTextCtrl.html#setCaretSticky/2"},{"type":"function","doc":"Set the width of the insert mode caret.","title":"wxStyledTextCtrl.setCaretWidth/2","ref":"wxStyledTextCtrl.html#setCaretWidth/2"},{"type":"function","doc":"Reset the set of characters for whitespace and word characters to the defaults.","title":"wxStyledTextCtrl.setCharsDefault/1","ref":"wxStyledTextCtrl.html#setCharsDefault/1"},{"type":"function","doc":"Set the code page used to interpret the bytes of the document as characters.","title":"wxStyledTextCtrl.setCodePage/2","ref":"wxStyledTextCtrl.html#setCodePage/2"},{"type":"function","doc":"Change the way control characters are displayed: If symbol is *< 32, keep the drawn way,\nelse, use the given character.","title":"wxStyledTextCtrl.setControlCharSymbol/2","ref":"wxStyledTextCtrl.html#setControlCharSymbol/2"},{"type":"function","doc":"Sets the position of the caret.","title":"wxStyledTextCtrl.setCurrentPos/2","ref":"wxStyledTextCtrl.html#setCurrentPos/2"},{"type":"function","doc":"Change the colour used in edge indication.","title":"wxStyledTextCtrl.setEdgeColour/2","ref":"wxStyledTextCtrl.html#setEdgeColour/2"},{"type":"function","doc":"Set the column number of the edge.\n\nIf text goes past the edge then it is highlighted.","title":"wxStyledTextCtrl.setEdgeColumn/2","ref":"wxStyledTextCtrl.html#setEdgeColumn/2"},{"type":"function","doc":"The edge may be displayed by a line (wxSTC\\_EDGE\\_LINE/wxSTC\\_EDGE\\_MULTILINE) or by\nhighlighting text that goes beyond it (wxSTC\\_EDGE\\_BACKGROUND) or not displayed at all\n(wxSTC\\_EDGE\\_NONE).\n\nThe input should be one of the ?wxSTC\\_EDGE\\_\\* constants.","title":"wxStyledTextCtrl.setEdgeMode/2","ref":"wxStyledTextCtrl.html#setEdgeMode/2"},{"type":"function","doc":"Set the current end of line mode.\n\nThe input should be one of the ?wxSTC\\_EOL\\_\\* constants.","title":"wxStyledTextCtrl.setEOLMode/2","ref":"wxStyledTextCtrl.html#setEOLMode/2"},{"type":"function","doc":"Show the children of a header line.","title":"wxStyledTextCtrl.setFoldExpanded/3","ref":"wxStyledTextCtrl.html#setFoldExpanded/3"},{"type":"function","doc":"Set some style options for folding.\n\nThe second argument should be a bit list containing one or more of the\n?wxSTC\\_FOLDFLAG\\_\\* constants.","title":"wxStyledTextCtrl.setFoldFlags/2","ref":"wxStyledTextCtrl.html#setFoldFlags/2"},{"type":"function","doc":"Set the fold level of a line.\n\nThis encodes an integer level along with flags indicating whether the line is a header\nand whether it is effectively white space.","title":"wxStyledTextCtrl.setFoldLevel/3","ref":"wxStyledTextCtrl.html#setFoldLevel/3"},{"type":"function","doc":"Set one of the colours used as a chequerboard pattern in the fold margin.","title":"wxStyledTextCtrl.setFoldMarginColour/3","ref":"wxStyledTextCtrl.html#setFoldMarginColour/3"},{"type":"function","doc":"Set the other colour used as a chequerboard pattern in the fold margin.","title":"wxStyledTextCtrl.setFoldMarginHiColour/3","ref":"wxStyledTextCtrl.html#setFoldMarginHiColour/3"},{"type":"function","doc":"Set the highlighted indentation guide column.\n\n0 = no highlighted guide.","title":"wxStyledTextCtrl.setHighlightGuide/2","ref":"wxStyledTextCtrl.html#setHighlightGuide/2"},{"type":"function","doc":"Set a back colour for active hotspots.","title":"wxStyledTextCtrl.setHotspotActiveBackground/3","ref":"wxStyledTextCtrl.html#setHotspotActiveBackground/3"},{"type":"function","doc":"Set a fore colour for active hotspots.","title":"wxStyledTextCtrl.setHotspotActiveForeground/3","ref":"wxStyledTextCtrl.html#setHotspotActiveForeground/3"},{"type":"function","doc":"Enable / Disable underlining active hotspots.","title":"wxStyledTextCtrl.setHotspotActiveUnderline/2","ref":"wxStyledTextCtrl.html#setHotspotActiveUnderline/2"},{"type":"function","doc":"Limit hotspots to single line so hotspots on two lines don't merge.","title":"wxStyledTextCtrl.setHotspotSingleLine/2","ref":"wxStyledTextCtrl.html#setHotspotSingleLine/2"},{"type":"function","doc":"Set the horizontal scrollbar to use instead of the one that's built-in.","title":"wxStyledTextCtrl.setHScrollBar/2","ref":"wxStyledTextCtrl.html#setHScrollBar/2"},{"type":"function","doc":"Set the number of spaces used for one level of indentation.","title":"wxStyledTextCtrl.setIndent/2","ref":"wxStyledTextCtrl.html#setIndent/2"},{"type":"function","doc":"Show or hide indentation guides.\n\nThe input should be one of the ?wxSTC\\_IV\\_\\* constants.","title":"wxStyledTextCtrl.setIndentationGuides/2","ref":"wxStyledTextCtrl.html#setIndentationGuides/2"},{"type":"function","doc":"Set up the key words used by the lexer.","title":"wxStyledTextCtrl.setKeyWords/3","ref":"wxStyledTextCtrl.html#setKeyWords/3"},{"type":"function","doc":"Returns the line number of the line with the caret.","title":"wxStyledTextCtrl.setLastKeydownProcessed/2","ref":"wxStyledTextCtrl.html#setLastKeydownProcessed/2"},{"type":"function","doc":"Sets the degree of caching of layout information.\n\nThe input should be one of the ?wxSTC\\_CACHE\\_\\* constants.","title":"wxStyledTextCtrl.setLayoutCache/2","ref":"wxStyledTextCtrl.html#setLayoutCache/2"},{"type":"function","doc":"Set the lexing language of the document.\n\nThe input should be one of the ?wxSTC\\_LEX\\_\\* constants.","title":"wxStyledTextCtrl.setLexer/2","ref":"wxStyledTextCtrl.html#setLexer/2"},{"type":"function","doc":"Set the lexing language of the document based on string name.","title":"wxStyledTextCtrl.setLexerLanguage/2","ref":"wxStyledTextCtrl.html#setLexerLanguage/2"},{"type":"function","doc":"Change the indentation of a line to a number of columns.","title":"wxStyledTextCtrl.setLineIndentation/3","ref":"wxStyledTextCtrl.html#setLineIndentation/3"},{"type":"function","doc":"Used to hold extra styling information for each line.","title":"wxStyledTextCtrl.setLineState/3","ref":"wxStyledTextCtrl.html#setLineState/3"},{"type":"function","doc":"Sets the size in pixels of the left margin.","title":"wxStyledTextCtrl.setMarginLeft/2","ref":"wxStyledTextCtrl.html#setMarginLeft/2"},{"type":"function","doc":"Set a mask that determines which markers are displayed in a margin.","title":"wxStyledTextCtrl.setMarginMask/3","ref":"wxStyledTextCtrl.html#setMarginMask/3"},{"type":"function","doc":"Sets the size in pixels of the right margin.","title":"wxStyledTextCtrl.setMarginRight/2","ref":"wxStyledTextCtrl.html#setMarginRight/2"},{"type":"function","doc":"Make a margin sensitive or insensitive to mouse clicks.","title":"wxStyledTextCtrl.setMarginSensitive/3","ref":"wxStyledTextCtrl.html#setMarginSensitive/3"},{"type":"function","doc":"Set the left and right margin in the edit area, measured in pixels.","title":"wxStyledTextCtrl.setMargins/3","ref":"wxStyledTextCtrl.html#setMargins/3"},{"type":"function","doc":"Set a margin to be either numeric or symbolic.\n\nThe second argument should be one of the ?wxSTC\\_MARGIN\\_\\* constants.","title":"wxStyledTextCtrl.setMarginType/3","ref":"wxStyledTextCtrl.html#setMarginType/3"},{"type":"function","doc":"Set the width of a margin to a width expressed in pixels.","title":"wxStyledTextCtrl.setMarginWidth/3","ref":"wxStyledTextCtrl.html#setMarginWidth/3"},{"type":"function","doc":"Set which document modification events are sent to the container.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_MOD\\_\\* constants,\nthe ?wxSTC\\_PERFORMED\\_\\* constants, wxSTC_STARTACTION, wxSTC_MULTILINEUNDOREDO,\nwxSTC_MULTISTEPUNDOREDO, and wxSTC_LASTSTEPINUNDOREDO. The input can also be\nwxSTC_MODEVENTMASKALL to indicate that all changes should generate events.","title":"wxStyledTextCtrl.setModEventMask/2","ref":"wxStyledTextCtrl.html#setModEventMask/2"},{"type":"function","doc":"Set whether the mouse is captured when its button is pressed.","title":"wxStyledTextCtrl.setMouseDownCaptures/2","ref":"wxStyledTextCtrl.html#setMouseDownCaptures/2"},{"type":"function","doc":"Sets the time the mouse must sit still to generate a mouse dwell event.\n\nThe input should be a time in milliseconds or wxSTC_TIME_FOREVER.","title":"wxStyledTextCtrl.setMouseDwellTime/2","ref":"wxStyledTextCtrl.html#setMouseDwellTime/2"},{"type":"function","doc":"Enable/Disable convert-on-paste for line endings.","title":"wxStyledTextCtrl.setPasteConvertEndings/2","ref":"wxStyledTextCtrl.html#setPasteConvertEndings/2"},{"type":"function","doc":"Modify colours when printing for clearer printed text.\n\nThe input should be one of the ?wxSTC\\_PRINT\\_\\* constants.","title":"wxStyledTextCtrl.setPrintColourMode/2","ref":"wxStyledTextCtrl.html#setPrintColourMode/2"},{"type":"function","doc":"Sets the print magnification added to the point size of each style for printing.","title":"wxStyledTextCtrl.setPrintMagnification/2","ref":"wxStyledTextCtrl.html#setPrintMagnification/2"},{"type":"function","doc":"Set up a value that may be used by a lexer for some optional feature.","title":"wxStyledTextCtrl.setProperty/3","ref":"wxStyledTextCtrl.html#setProperty/3"},{"type":"function","doc":"Set to read only or read write.","title":"wxStyledTextCtrl.setReadOnly/2","ref":"wxStyledTextCtrl.html#setReadOnly/2"},{"type":"function","doc":"Remember the current position in the undo history as the position at which the document\nwas saved.","title":"wxStyledTextCtrl.setSavePoint/1","ref":"wxStyledTextCtrl.html#setSavePoint/1"},{"type":"function","doc":"Sets the document width assumed for scrolling.","title":"wxStyledTextCtrl.setScrollWidth/2","ref":"wxStyledTextCtrl.html#setScrollWidth/2"},{"type":"function","doc":"Set the search flags used by SearchInTarget.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_FIND\\_\\* constants.","title":"wxStyledTextCtrl.setSearchFlags/2","ref":"wxStyledTextCtrl.html#setSearchFlags/2"},{"type":"function","doc":"Set the alpha of the selection.","title":"wxStyledTextCtrl.setSelAlpha/2","ref":"wxStyledTextCtrl.html#setSelAlpha/2"},{"type":"function","doc":"Set the background colour of the main and additional selections and whether to use this\nsetting.","title":"wxStyledTextCtrl.setSelBackground/3","ref":"wxStyledTextCtrl.html#setSelBackground/3"},{"type":"function","doc":"Selects the text starting at the first position up to (but not including) the character\nat the last position.\n\nIf both parameters are equal to -1 all text in the control is selected.\n\nNotice that the insertion point will be moved to `from` by this function.\n\nSee: `selectAll/1`","title":"wxStyledTextCtrl.setSelection/3","ref":"wxStyledTextCtrl.html#setSelection/3"},{"type":"function","doc":"Sets the position that ends the selection - this becomes the caret.","title":"wxStyledTextCtrl.setSelectionEnd/2","ref":"wxStyledTextCtrl.html#setSelectionEnd/2"},{"type":"function","doc":"Set the selection mode to stream (wxSTC\\_SEL\\_STREAM) or rectangular\n(wxSTC\\_SEL\\_RECTANGLE/wxSTC\\_SEL\\_THIN) or by lines (wxSTC\\_SEL\\_LINES).","title":"wxStyledTextCtrl.setSelectionMode/2","ref":"wxStyledTextCtrl.html#setSelectionMode/2"},{"type":"function","doc":"Sets the position that starts the selection - this becomes the anchor.","title":"wxStyledTextCtrl.setSelectionStart/2","ref":"wxStyledTextCtrl.html#setSelectionStart/2"},{"type":"function","doc":"Set the foreground colour of the main and additional selections and whether to use this\nsetting.","title":"wxStyledTextCtrl.setSelForeground/3","ref":"wxStyledTextCtrl.html#setSelForeground/3"},{"type":"function","doc":"Sets the cursor to one of the wxSTC_CURSOR* values.","title":"wxStyledTextCtrl.setSTCCursor/2","ref":"wxStyledTextCtrl.html#setSTCCursor/2"},{"type":"function","doc":"Change internal focus flag.","title":"wxStyledTextCtrl.setSTCFocus/2","ref":"wxStyledTextCtrl.html#setSTCFocus/2"},{"type":"function","doc":"Change error status - 0 = OK.\n\nThe input should be one of the ?wxSTC\\_STATUS\\_\\* constants.","title":"wxStyledTextCtrl.setStatus/2","ref":"wxStyledTextCtrl.html#setStatus/2"},{"type":"function","doc":"Set the styles for a segment of the document.","title":"wxStyledTextCtrl.setStyleBytes/2","ref":"wxStyledTextCtrl.html#setStyleBytes/2"},{"type":"function","doc":"Change style from current styling position for length characters to a style and move the\ncurrent styling position to after this newly styled segment.","title":"wxStyledTextCtrl.setStyling/3","ref":"wxStyledTextCtrl.html#setStyling/3"},{"type":"function","doc":"Sets whether a tab pressed when caret is within indentation indents.","title":"wxStyledTextCtrl.setTabIndents/2","ref":"wxStyledTextCtrl.html#setTabIndents/2"},{"type":"function","doc":"Change the visible size of a tab to be a multiple of the width of a space character.","title":"wxStyledTextCtrl.setTabWidth/2","ref":"wxStyledTextCtrl.html#setTabWidth/2"},{"type":"function","doc":"Sets the position that ends the target which is used for updating the document without\naffecting the scroll position.","title":"wxStyledTextCtrl.setTargetEnd/2","ref":"wxStyledTextCtrl.html#setTargetEnd/2"},{"type":"function","doc":"Sets the position that starts the target which is used for updating the document without\naffecting the scroll position.","title":"wxStyledTextCtrl.setTargetStart/2","ref":"wxStyledTextCtrl.html#setTargetStart/2"},{"type":"function","doc":"Replace the contents of the document with the argument text.","title":"wxStyledTextCtrl.setText/2","ref":"wxStyledTextCtrl.html#setText/2"},{"type":"function","doc":"Replace the contents of the document with the argument text.","title":"wxStyledTextCtrl.setTextRaw/2","ref":"wxStyledTextCtrl.html#setTextRaw/2"},{"type":"function","doc":"In twoPhaseDraw mode, drawing is performed in two phases, first the background and then\nthe foreground.\n\nThis avoids chopping off characters that overlap the next run.","title":"wxStyledTextCtrl.setTwoPhaseDraw/2","ref":"wxStyledTextCtrl.html#setTwoPhaseDraw/2"},{"type":"function","doc":"Choose between collecting actions into the undo history and discarding them.","title":"wxStyledTextCtrl.setUndoCollection/2","ref":"wxStyledTextCtrl.html#setUndoCollection/2"},{"type":"function","doc":"Show or hide the horizontal scroll bar.","title":"wxStyledTextCtrl.setUseHorizontalScrollBar/2","ref":"wxStyledTextCtrl.html#setUseHorizontalScrollBar/2"},{"type":"function","doc":"Indentation will only use space characters if useTabs is false, otherwise it will use a\ncombination of tabs and spaces.","title":"wxStyledTextCtrl.setUseTabs/2","ref":"wxStyledTextCtrl.html#setUseTabs/2"},{"type":"function","doc":"Show or hide the vertical scroll bar.","title":"wxStyledTextCtrl.setUseVerticalScrollBar/2","ref":"wxStyledTextCtrl.html#setUseVerticalScrollBar/2"},{"type":"function","doc":"Make the end of line characters visible or invisible.","title":"wxStyledTextCtrl.setViewEOL/2","ref":"wxStyledTextCtrl.html#setViewEOL/2"},{"type":"function","doc":"Make white space characters invisible, always visible or visible outside indentation.\n\nThe input should be one of the ?wxSTC\\_WS\\_\\* constants.","title":"wxStyledTextCtrl.setViewWhiteSpace/2","ref":"wxStyledTextCtrl.html#setViewWhiteSpace/2"},{"type":"function","doc":"Set the way the display area is determined when a particular line is to be moved to by\nFind, FindNext, GotoLine, etc.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_VISIBLE\\_\\*\nconstants.","title":"wxStyledTextCtrl.setVisiblePolicy/3","ref":"wxStyledTextCtrl.html#setVisiblePolicy/3"},{"type":"function","doc":"Set the vertical scrollbar to use instead of the one that's built-in.","title":"wxStyledTextCtrl.setVScrollBar/2","ref":"wxStyledTextCtrl.html#setVScrollBar/2"},{"type":"function","doc":"Set the background colour of all whitespace and whether to use this setting.","title":"wxStyledTextCtrl.setWhitespaceBackground/3","ref":"wxStyledTextCtrl.html#setWhitespaceBackground/3"},{"type":"function","doc":"Set the set of characters making up whitespace for when moving or selecting by word.\n\nShould be called after SetWordChars.","title":"wxStyledTextCtrl.setWhitespaceChars/2","ref":"wxStyledTextCtrl.html#setWhitespaceChars/2"},{"type":"function","doc":"Set the foreground colour of all whitespace and whether to use this setting.","title":"wxStyledTextCtrl.setWhitespaceForeground/3","ref":"wxStyledTextCtrl.html#setWhitespaceForeground/3"},{"type":"function","doc":"Set the set of characters making up words for when moving or selecting by word.\n\nFirst sets defaults like SetCharsDefault.","title":"wxStyledTextCtrl.setWordChars/2","ref":"wxStyledTextCtrl.html#setWordChars/2"},{"type":"function","doc":"Sets whether text is word wrapped.\n\nThe input should be one of the ?wxSTC\\_WRAP\\_\\* constants.","title":"wxStyledTextCtrl.setWrapMode/2","ref":"wxStyledTextCtrl.html#setWrapMode/2"},{"type":"function","doc":"Set the start indent for wrapped lines.","title":"wxStyledTextCtrl.setWrapStartIndent/2","ref":"wxStyledTextCtrl.html#setWrapStartIndent/2"},{"type":"function","doc":"Set the display mode of visual flags for wrapped lines.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_WRAPVISUALFLAG\\_\\*\nconstants.","title":"wxStyledTextCtrl.setWrapVisualFlags/2","ref":"wxStyledTextCtrl.html#setWrapVisualFlags/2"},{"type":"function","doc":"Set the location of visual flags for wrapped lines.\n\nThe input should be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAGLOC\\_\\* constants.","title":"wxStyledTextCtrl.setWrapVisualFlagsLocation/2","ref":"wxStyledTextCtrl.html#setWrapVisualFlagsLocation/2"},{"type":"function","doc":"Set the way the caret is kept visible when going sideways.\n\nThe exclusion zone is given in pixels.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_CARET\\_\\*\nconstants.","title":"wxStyledTextCtrl.setXCaretPolicy/3","ref":"wxStyledTextCtrl.html#setXCaretPolicy/3"},{"type":"function","doc":"Set the way the line the caret is on is kept visible.\n\nThe exclusion zone is given in lines.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_CARET\\_\\*\nconstants.","title":"wxStyledTextCtrl.setYCaretPolicy/3","ref":"wxStyledTextCtrl.html#setYCaretPolicy/3"},{"type":"function","doc":"Set the zoom level.\n\nThis number of points is added to the size of all fonts. It may be positive to magnify or\nnegative to reduce.","title":"wxStyledTextCtrl.setZoom/2","ref":"wxStyledTextCtrl.html#setZoom/2"},{"type":"function","doc":"Make a range of lines visible.","title":"wxStyledTextCtrl.showLines/3","ref":"wxStyledTextCtrl.html#showLines/3"},{"type":"function","doc":"Start notifying the container of all key presses and commands.","title":"wxStyledTextCtrl.startRecord/1","ref":"wxStyledTextCtrl.html#startRecord/1"},{"type":"function","doc":"Set the current styling position to start.","title":"wxStyledTextCtrl.startStyling/2","ref":"wxStyledTextCtrl.html#startStyling/2"},{"type":"function","doc":"Stop notifying the container of all key presses and commands.","title":"wxStyledTextCtrl.stopRecord/1","ref":"wxStyledTextCtrl.html#stopRecord/1"},{"type":"function","doc":"Move caret to bottom of page, or one page down if already at bottom of page.","title":"wxStyledTextCtrl.stutteredPageDown/1","ref":"wxStyledTextCtrl.html#stutteredPageDown/1"},{"type":"function","doc":"Move caret to bottom of page, or one page down if already at bottom of page, extending\nselection to new caret position.","title":"wxStyledTextCtrl.stutteredPageDownExtend/1","ref":"wxStyledTextCtrl.html#stutteredPageDownExtend/1"},{"type":"function","doc":"Move caret to top of page, or one page up if already at top of page.","title":"wxStyledTextCtrl.stutteredPageUp/1","ref":"wxStyledTextCtrl.html#stutteredPageUp/1"},{"type":"function","doc":"Move caret to top of page, or one page up if already at top of page, extending selection\nto new caret position.","title":"wxStyledTextCtrl.stutteredPageUpExtend/1","ref":"wxStyledTextCtrl.html#stutteredPageUpExtend/1"},{"type":"function","doc":"Clear all the styles and make equivalent to the global default style.","title":"wxStyledTextCtrl.styleClearAll/1","ref":"wxStyledTextCtrl.html#styleClearAll/1"},{"type":"function","doc":"Reset the default style to its state at startup.","title":"wxStyledTextCtrl.styleResetDefault/1","ref":"wxStyledTextCtrl.html#styleResetDefault/1"},{"type":"function","doc":"Set the background colour of a style.","title":"wxStyledTextCtrl.styleSetBackground/3","ref":"wxStyledTextCtrl.html#styleSetBackground/3"},{"type":"function","doc":"Set a style to be bold or not.","title":"wxStyledTextCtrl.styleSetBold/3","ref":"wxStyledTextCtrl.html#styleSetBold/3"},{"type":"function","doc":"Set a style to be mixed case, or to force upper or lower case.\n\nThe second argument should be one of the ?wxSTC\\_CASE\\_\\* constants.","title":"wxStyledTextCtrl.styleSetCase/3","ref":"wxStyledTextCtrl.html#styleSetCase/3"},{"type":"function","doc":"Set the character set of the font in a style.\n\nConverts the Scintilla character set values to a wxFontEncoding.","title":"wxStyledTextCtrl.styleSetCharacterSet/3","ref":"wxStyledTextCtrl.html#styleSetCharacterSet/3"},{"type":"function","doc":"Set a style to have its end of line filled or not.","title":"wxStyledTextCtrl.styleSetEOLFilled/3","ref":"wxStyledTextCtrl.html#styleSetEOLFilled/3"},{"type":"function","doc":"Set the font of a style.","title":"wxStyledTextCtrl.styleSetFaceName/3","ref":"wxStyledTextCtrl.html#styleSetFaceName/3"},{"type":"function","doc":"Set style size, face, bold, italic, and underline attributes from a `m:wxFont`'s\nattributes.","title":"wxStyledTextCtrl.styleSetFont/3","ref":"wxStyledTextCtrl.html#styleSetFont/3"},{"type":"function","doc":"","title":"wxStyledTextCtrl.styleSetFontAttr/7","ref":"wxStyledTextCtrl.html#styleSetFontAttr/7"},{"type":"function","doc":"Set all font style attributes at once.","title":"wxStyledTextCtrl.styleSetFontAttr/8","ref":"wxStyledTextCtrl.html#styleSetFontAttr/8"},{"type":"function","doc":"Set the font encoding to be used by a style.","title":"wxStyledTextCtrl.styleSetFontEncoding/3","ref":"wxStyledTextCtrl.html#styleSetFontEncoding/3"},{"type":"function","doc":"Set the foreground colour of a style.","title":"wxStyledTextCtrl.styleSetForeground/3","ref":"wxStyledTextCtrl.html#styleSetForeground/3"},{"type":"function","doc":"Set a style to be a hotspot or not.","title":"wxStyledTextCtrl.styleSetHotSpot/3","ref":"wxStyledTextCtrl.html#styleSetHotSpot/3"},{"type":"function","doc":"Set a style to be italic or not.","title":"wxStyledTextCtrl.styleSetItalic/3","ref":"wxStyledTextCtrl.html#styleSetItalic/3"},{"type":"function","doc":"Set the size of characters of a style.","title":"wxStyledTextCtrl.styleSetSize/3","ref":"wxStyledTextCtrl.html#styleSetSize/3"},{"type":"function","doc":"Extract style settings from a spec-string which is composed of one or more of the\nfollowing comma separated elements:\n\nbold turns on bold italic turns on italics fore:[name or #RRGGBB] sets the foreground\ncolour back:[name or #RRGGBB] sets the background colour face:[facename] sets the font\nface name to use size:[num] sets the font size in points eol turns on eol filling\nunderline turns on underlining","title":"wxStyledTextCtrl.styleSetSpec/3","ref":"wxStyledTextCtrl.html#styleSetSpec/3"},{"type":"function","doc":"Set a style to be underlined or not.","title":"wxStyledTextCtrl.styleSetUnderline/3","ref":"wxStyledTextCtrl.html#styleSetUnderline/3"},{"type":"function","doc":"Set a style to be visible or not.","title":"wxStyledTextCtrl.styleSetVisible/3","ref":"wxStyledTextCtrl.html#styleSetVisible/3"},{"type":"function","doc":"If selection is empty or all on one line replace the selection with a tab character.\n\nIf more than one line selected, indent the lines.","title":"wxStyledTextCtrl.tab/1","ref":"wxStyledTextCtrl.html#tab/1"},{"type":"function","doc":"Make the target range start and end be the same as the selection range start and end.","title":"wxStyledTextCtrl.targetFromSelection/1","ref":"wxStyledTextCtrl.html#targetFromSelection/1"},{"type":"function","doc":"Retrieve the height of a particular line of text in pixels.","title":"wxStyledTextCtrl.textHeight/2","ref":"wxStyledTextCtrl.html#textHeight/2"},{"type":"function","doc":"Measure the pixel width of some text in a particular style.\n\nDoes not handle tab or control characters.","title":"wxStyledTextCtrl.textWidth/3","ref":"wxStyledTextCtrl.html#textWidth/3"},{"type":"function","doc":"Switch between sticky and non-sticky: meant to be bound to a key.","title":"wxStyledTextCtrl.toggleCaretSticky/1","ref":"wxStyledTextCtrl.html#toggleCaretSticky/1"},{"type":"function","doc":"Switch a header line between expanded and contracted.","title":"wxStyledTextCtrl.toggleFold/2","ref":"wxStyledTextCtrl.html#toggleFold/2"},{"type":"function","doc":"Undo one action in the undo history.","title":"wxStyledTextCtrl.undo/1","ref":"wxStyledTextCtrl.html#undo/1"},{"type":"function","doc":"Transform the selection to upper case.","title":"wxStyledTextCtrl.upperCase/1","ref":"wxStyledTextCtrl.html#upperCase/1"},{"type":"function","doc":"Set whether a pop up menu is displayed automatically when the user presses the wrong\nmouse button on certain areas.\n\nThe input should be one of the ?wxSTC\\_POPUP\\_\\* constants.\n\nRemark: When `m:wxContextMenuEvent` is used to create a custom popup menu, this function\nshould be called with wxSTC_POPUP_NEVER. Otherwise the default menu will be shown instead\nof the custom one.","title":"wxStyledTextCtrl.usePopUp/2","ref":"wxStyledTextCtrl.html#usePopUp/2"},{"type":"function","doc":"Display a list of strings and send notification when user chooses one.","title":"wxStyledTextCtrl.userListShow/3","ref":"wxStyledTextCtrl.html#userListShow/3"},{"type":"function","doc":"Move caret to before first visible character on line.\n\nIf already there move to first character on line.","title":"wxStyledTextCtrl.vCHome/1","ref":"wxStyledTextCtrl.html#vCHome/1"},{"type":"function","doc":"Like VCHome but extending selection to new caret position.","title":"wxStyledTextCtrl.vCHomeExtend/1","ref":"wxStyledTextCtrl.html#vCHomeExtend/1"},{"type":"function","doc":"Move caret to before first visible character on line.\n\nIf already there move to first character on line. In either case, extend rectangular\nselection to new caret position.","title":"wxStyledTextCtrl.vCHomeRectExtend/1","ref":"wxStyledTextCtrl.html#vCHomeRectExtend/1"},{"type":"function","doc":"Like VCHome but when word-wrap is enabled goes first to start of display line\nVCHomeDisplay, then behaves like VCHome.","title":"wxStyledTextCtrl.vCHomeWrap/1","ref":"wxStyledTextCtrl.html#vCHomeWrap/1"},{"type":"function","doc":"Like VCHomeExtend but when word-wrap is enabled extends first to start of display line\nVCHomeDisplayExtend, then behaves like VCHomeExtend.","title":"wxStyledTextCtrl.vCHomeWrapExtend/1","ref":"wxStyledTextCtrl.html#vCHomeWrapExtend/1"},{"type":"function","doc":"Find the display line of a document line taking hidden lines into account.","title":"wxStyledTextCtrl.visibleFromDocLine/2","ref":"wxStyledTextCtrl.html#visibleFromDocLine/2"},{"type":"function","doc":"Get position of end of word.","title":"wxStyledTextCtrl.wordEndPosition/3","ref":"wxStyledTextCtrl.html#wordEndPosition/3"},{"type":"function","doc":"Move caret left one word.","title":"wxStyledTextCtrl.wordLeft/1","ref":"wxStyledTextCtrl.html#wordLeft/1"},{"type":"function","doc":"Move caret left one word, position cursor at end of word.","title":"wxStyledTextCtrl.wordLeftEnd/1","ref":"wxStyledTextCtrl.html#wordLeftEnd/1"},{"type":"function","doc":"Move caret left one word, position cursor at end of word, extending selection to new\ncaret position.","title":"wxStyledTextCtrl.wordLeftEndExtend/1","ref":"wxStyledTextCtrl.html#wordLeftEndExtend/1"},{"type":"function","doc":"Move caret left one word extending selection to new caret position.","title":"wxStyledTextCtrl.wordLeftExtend/1","ref":"wxStyledTextCtrl.html#wordLeftExtend/1"},{"type":"function","doc":"Move to the previous change in capitalisation.","title":"wxStyledTextCtrl.wordPartLeft/1","ref":"wxStyledTextCtrl.html#wordPartLeft/1"},{"type":"function","doc":"Move to the previous change in capitalisation extending selection to new caret position.","title":"wxStyledTextCtrl.wordPartLeftExtend/1","ref":"wxStyledTextCtrl.html#wordPartLeftExtend/1"},{"type":"function","doc":"Move to the change next in capitalisation.","title":"wxStyledTextCtrl.wordPartRight/1","ref":"wxStyledTextCtrl.html#wordPartRight/1"},{"type":"function","doc":"Move to the next change in capitalisation extending selection to new caret position.","title":"wxStyledTextCtrl.wordPartRightExtend/1","ref":"wxStyledTextCtrl.html#wordPartRightExtend/1"},{"type":"function","doc":"Move caret right one word.","title":"wxStyledTextCtrl.wordRight/1","ref":"wxStyledTextCtrl.html#wordRight/1"},{"type":"function","doc":"Move caret right one word, position cursor at end of word.","title":"wxStyledTextCtrl.wordRightEnd/1","ref":"wxStyledTextCtrl.html#wordRightEnd/1"},{"type":"function","doc":"Move caret right one word, position cursor at end of word, extending selection to new\ncaret position.","title":"wxStyledTextCtrl.wordRightEndExtend/1","ref":"wxStyledTextCtrl.html#wordRightEndExtend/1"},{"type":"function","doc":"Move caret right one word extending selection to new caret position.","title":"wxStyledTextCtrl.wordRightExtend/1","ref":"wxStyledTextCtrl.html#wordRightExtend/1"},{"type":"function","doc":"Get position of start of word.","title":"wxStyledTextCtrl.wordStartPosition/3","ref":"wxStyledTextCtrl.html#wordStartPosition/3"},{"type":"function","doc":"The number of display lines needed to wrap a document line.","title":"wxStyledTextCtrl.wrapCount/2","ref":"wxStyledTextCtrl.html#wrapCount/2"},{"type":"function","doc":"Magnify the displayed text by increasing the sizes by 1 point.","title":"wxStyledTextCtrl.zoomIn/1","ref":"wxStyledTextCtrl.html#zoomIn/1"},{"type":"function","doc":"Make the displayed text smaller by decreasing the sizes by 1 point.","title":"wxStyledTextCtrl.zoomOut/1","ref":"wxStyledTextCtrl.html#zoomOut/1"},{"type":"type","doc":"","title":"wxStyledTextCtrl.wxStyledTextCtrl/0","ref":"wxStyledTextCtrl.html#t:wxStyledTextCtrl/0"},{"type":"module","doc":"The type of events sent from `m:wxStyledTextCtrl`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxStyledTextEvent](https://docs.wxwidgets.org/3.2/classwx_styled_text_event.html)","title":"wxStyledTextEvent","ref":"wxStyledTextEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxStyledTextEventType` to subscribe to events of this type.","title":"Events - wxStyledTextEvent","ref":"wxStyledTextEvent.html#module-events"},{"type":"function","doc":"Returns true if the Alt key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","title":"wxStyledTextEvent.getAlt/1","ref":"wxStyledTextEvent.html#getAlt/1"},{"type":"function","doc":"Returns true if the Control key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","title":"wxStyledTextEvent.getControl/1","ref":"wxStyledTextEvent.html#getControl/1"},{"type":"function","doc":"","title":"wxStyledTextEvent.getDragAllowMove/1","ref":"wxStyledTextEvent.html#getDragAllowMove/1"},{"type":"function","doc":"Returns drag result for this event.\n\nThis method is valid for `wxEVT_STC_DRAG_OVER` and `wxEVT_STC_DO_DROP` events.","title":"wxStyledTextEvent.getDragResult/1","ref":"wxStyledTextEvent.html#getDragResult/1"},{"type":"function","doc":"Deprecated:\n\nUse `wxCommandEvent:getString/1` instead.","title":"wxStyledTextEvent.getDragText/1","ref":"wxStyledTextEvent.html#getDragText/1"},{"type":"function","doc":"Returns the current fold level for the line.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_CHANGEFOLD.","title":"wxStyledTextEvent.getFoldLevelNow/1","ref":"wxStyledTextEvent.html#getFoldLevelNow/1"},{"type":"function","doc":"Returns previous fold level for the line.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_CHANGEFOLD.","title":"wxStyledTextEvent.getFoldLevelPrev/1","ref":"wxStyledTextEvent.html#getFoldLevelPrev/1"},{"type":"function","doc":"Returns the key code of the key that generated this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_CHARADDED`\n\n* `wxEVT_STC_USERLISTSELECTION`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION`\n\n* `wxEVT_STC_AUTOCOMP_COMPLETED`","title":"wxStyledTextEvent.getKey/1","ref":"wxStyledTextEvent.html#getKey/1"},{"type":"function","doc":"Returns the length (number of characters) of this event.\n\nThis method is valid for `wxEVT_STC_MODIFIED` and `wxEVT_STC_NEEDSHOWN` events.","title":"wxStyledTextEvent.getLength/1","ref":"wxStyledTextEvent.html#getLength/1"},{"type":"function","doc":"Returns zero-based line number for this event.\n\nThis method is valid for `wxEVT_STC_DOUBLECLICK` and `wxEVT_STC_MODIFIED` events.","title":"wxStyledTextEvent.getLine/1","ref":"wxStyledTextEvent.html#getLine/1"},{"type":"function","doc":"Returns the number of lines added or deleted with this event.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_INSERTTEXT or ?wxSTC\\_MOD\\_DELETETEXT.","title":"wxStyledTextEvent.getLinesAdded/1","ref":"wxStyledTextEvent.html#getLinesAdded/1"},{"type":"function","doc":"Returns the list type for this event.\n\nThe list type is an integer passed to a list when it is created with the `wxStyledTextCtrl:userListShow/3` method and can\nbe used to distinguish lists if more than one is used.\n\nThis method is valid for `wxEVT_STC_AUTOCOMP_SELECTION_CHANGE` and `wxEVT_STC_USERLISTSELECTION`\nevents.","title":"wxStyledTextEvent.getListType/1","ref":"wxStyledTextEvent.html#getListType/1"},{"type":"function","doc":"Returns the value of the LParam field for this event.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","title":"wxStyledTextEvent.getLParam/1","ref":"wxStyledTextEvent.html#getLParam/1"},{"type":"function","doc":"Returns the zero-based index of the margin that generated this event.\n\nThis method is valid for `wxEVT_STC_MARGINCLICK` and `wxEVT_STC_MARGIN_RIGHT_CLICK`\nevents.","title":"wxStyledTextEvent.getMargin/1","ref":"wxStyledTextEvent.html#getMargin/1"},{"type":"function","doc":"Returns a message number while a macro is being recorded.\n\nMany of the `m:wxStyledTextCtrl` methods such as `wxStyledTextCtrl:insertText/3` and `wxStyledTextCtrl:paste/1` have an event number associated\nwith them. This method returns that number while a macro is being recorded so that the\nmacro can be played back later.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","title":"wxStyledTextEvent.getMessage/1","ref":"wxStyledTextEvent.html#getMessage/1"},{"type":"function","doc":"Returns the modification type for this event.\n\nThe modification type is a bit list that describes the change that generated this event.\nIt may contain one or more of the following values:\n\n* ?wxSTC\\_MOD\\_INSERTTEXT\n\n* ?wxSTC\\_MOD\\_DELETETEXT\n\n* ?wxSTC\\_MOD\\_CHANGESTYLE\n\n* ?wxSTC\\_MOD\\_CHANGEFOLD\n\n* ?wxSTC\\_PERFORMED\\_USER\n\n* ?wxSTC\\_PERFORMED\\_UNDO\n\n* ?wxSTC\\_PERFORMED\\_REDO\n\n* ?wxSTC\\_MULTISTEPUNDOREDO\n\n* ?wxSTC\\_LASTSTEPINUNDOREDO\n\n* ?wxSTC\\_MOD\\_CHANGEMARKER\n\n* ?wxSTC\\_MOD\\_BEFOREINSERT\n\n* ?wxSTC\\_MOD\\_BEFOREDELETE\n\n* ?wxSTC\\_MULTILINEUNDOREDO\n\n* ?wxSTC\\_STARTACTION\n\n* ?wxSTC\\_MOD\\_CHANGEINDICATOR\n\n* ?wxSTC\\_MOD\\_CHANGELINESTATE\n\n* ?wxSTC\\_MOD\\_CHANGEMARGIN\n\n* ?wxSTC\\_MOD\\_CHANGEANNOTATION\n\n* ?wxSTC\\_MOD\\_CONTAINER\n\n* ?wxSTC\\_MOD\\_LEXERSTATE\n\n* ?wxSTC\\_MOD\\_INSERTCHECK\n\n* ?wxSTC\\_MOD\\_CHANGETABSTOPS\n\nThis method is valid for `wxEVT_STC_MODIFIED` events.","title":"wxStyledTextEvent.getModificationType/1","ref":"wxStyledTextEvent.html#getModificationType/1"},{"type":"function","doc":"Returns the modifiers of the key press or mouse click for this event.\n\nThe returned value is a bit list that may contain one or more of the following values:\n\n* ?wxSTC\\_KEYMOD\\_SHIFT\n\n* ?wxSTC\\_KEYMOD\\_CTRL\n\n* ?wxSTC\\_KEYMOD\\_ALT\n\n* ?wxSTC\\_KEYMOD\\_SUPER\n\n* ?wxSTC\\_KEYMOD\\_META\n\nIn addition, the value can be checked for equality with ?wxSTC\\_KEYMOD\\_NORM to test if\nno modifiers are present.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","title":"wxStyledTextEvent.getModifiers/1","ref":"wxStyledTextEvent.html#getModifiers/1"},{"type":"function","doc":"Returns the zero-based text position associated this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_STYLENEEDED`\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MODIFIED`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_NEEDSHOWN`\n\n* `wxEVT_STC_USERLISTSELECTION`\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_CALLTIP_CLICK`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION_CHANGE`\n\n* `wxEVT_STC_AUTOCOMP_COMPLETED`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","title":"wxStyledTextEvent.getPosition/1","ref":"wxStyledTextEvent.html#getPosition/1"},{"type":"function","doc":"Returns true if the Shift key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","title":"wxStyledTextEvent.getShift/1","ref":"wxStyledTextEvent.html#getShift/1"},{"type":"function","doc":"Deprecated:\n\nUse `wxCommandEvent:getString/1` instead.","title":"wxStyledTextEvent.getText/1","ref":"wxStyledTextEvent.html#getText/1"},{"type":"function","doc":"Returns value of the WParam field for this event.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","title":"wxStyledTextEvent.getWParam/1","ref":"wxStyledTextEvent.html#getWParam/1"},{"type":"function","doc":"Returns the X coordinate of the mouse for this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_START_DRAG`\n\n* `wxEVT_STC_DRAG_OVER`\n\n* `wxEVT_STC_DO_DROP`","title":"wxStyledTextEvent.getX/1","ref":"wxStyledTextEvent.html#getX/1"},{"type":"function","doc":"Returns the Y coordinate of the mouse for this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_START_DRAG`\n\n* `wxEVT_STC_DRAG_OVER`\n\n* `wxEVT_STC_DO_DROP`","title":"wxStyledTextEvent.getY/1","ref":"wxStyledTextEvent.html#getY/1"},{"type":"type","doc":"","title":"wxStyledTextEvent.wxStyledText/0","ref":"wxStyledTextEvent.html#t:wxStyledText/0"},{"type":"type","doc":"","title":"wxStyledTextEvent.wxStyledTextEvent/0","ref":"wxStyledTextEvent.html#t:wxStyledTextEvent/0"},{"type":"type","doc":"","title":"wxStyledTextEvent.wxStyledTextEventType/0","ref":"wxStyledTextEvent.html#t:wxStyledTextEventType/0"},{"type":"module","doc":"This class is used for system colour change events, which are generated when the user\nchanges the colour settings using the control panel.\n\nThis is only appropriate under Windows.\n\nRemark: The default event handler for this event propagates the event to child windows,\nsince Windows only sends the events to top-level windows. If intercepting this event for a\ntop-level window, remember to call the base class handler, or to pass the event on to the\nwindow's children explicitly.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSysColourChangedEvent](https://docs.wxwidgets.org/3.2/classwx_sys_colour_changed_event.html)","title":"wxSysColourChangedEvent","ref":"wxSysColourChangedEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxSysColourChangedEventType` to subscribe to events of this type.","title":"Events - wxSysColourChangedEvent","ref":"wxSysColourChangedEvent.html#module-events"},{"type":"type","doc":"","title":"wxSysColourChangedEvent.wxSysColourChanged/0","ref":"wxSysColourChangedEvent.html#t:wxSysColourChanged/0"},{"type":"type","doc":"","title":"wxSysColourChangedEvent.wxSysColourChangedEvent/0","ref":"wxSysColourChangedEvent.html#t:wxSysColourChangedEvent/0"},{"type":"type","doc":"","title":"wxSysColourChangedEvent.wxSysColourChangedEventType/0","ref":"wxSysColourChangedEvent.html#t:wxSysColourChangedEventType/0"},{"type":"module","doc":"`m:wxSystemOptions` stores option/value pairs that wxWidgets itself or applications can\nuse to alter behaviour at run-time.\n\nIt can be used to optimize behaviour that doesn't deserve a distinct API, but is still\nimportant to be able to configure.\n\nSystem options can be set by the program itself using `setOption/2` method and they also can be set\nfrom the program environment by defining an environment variable `wx_option` to set the\ngiven option for all wxWidgets applications or `wx_appname_option` to set it just for the\napplication with the given name (as returned by `wxApp::GetAppName()` (not implemented in\nwx)). Notice that any characters not allowed in the environment variables names, such as\nperiods and dashes, should be replaced with underscores. E.g. to define a system option\n\"foo-bar\" you need to define the environment variable \"wx_foo_bar\".\n\nThe program may use system options for its own needs but they are mostly used to control\nthe behaviour of wxWidgets library itself.\n\nThese options are currently recognised by wxWidgets:\n\nAll platforms\n\n* exit-on-assert: If set to non-zero value, abort the program if an assertion fails. The\ndefault behaviour in case of assertion failure depends on the build mode and can be\nchanged by overriding `wxApp::OnAssertFailure()` (not implemented in wx) but setting this\noption allows changing it without modifying the program code and also applies to asserts\nwhich may happen before the `wxApp` (not implemented in wx) object creation or after its\ndestruction.\n\nWindows\n\n* no-maskblt: 1 to never use WIN32's MaskBlt function, 0 to allow it to be used where\npossible. Default: 0. In some circumstances the MaskBlt function can be slower than using\nthe fallback code, especially if using DC caching. By default, MaskBlt will be used where\nit is implemented by the operating system and driver.\n\n* msw.remap: If 1 (the default), `m:wxToolBar` bitmap colours will be remapped to the\ncurrent theme's values. Set this to 0 to disable this functionality, for example if you're\nusing more than 16 colours in your tool bitmaps.\n\n* msw.window.no-clip-children: If 1, windows will not automatically get the WS_CLIPCHILDREN\nstyle. This restores the way windows are refreshed back to the method used in versions of\nwxWidgets earlier than 2.5.4, and for some complex window hierarchies it can reduce\napparent refresh delays. You may still specify wxCLIP_CHILDREN for individual windows.\n\n* msw.notebook.themed-background: If set to 0, globally disables themed backgrounds on\nnotebook pages. Note that this won't disable the theme on the actual notebook background\n(noticeable only if there are no pages).\n\n* msw.staticbox.optimized-paint: If set to 0, switches off optimized `m:wxStaticBox`\npainting. Setting this to 0 causes more flicker, but allows applications to paint graphics\non the parent of a static box (the optimized refresh causes any such drawing to\ndisappear).\n\n* msw.font.no-proof-quality: If set to 1, use default fonts quality instead of proof\nquality when creating fonts. With proof quality the fonts have slightly better appearance\nbut not all fonts are available in this quality, e.g. the Terminal font in small sizes is\nnot and this option may be used if wider fonts selection is more important than higher\nquality.\n\nGTK+\n\n* gtk.tlw.can-set-transparent: `wxTopLevelWindow::CanSetTransparent()` (not implemented in\nwx) method normally tries to detect automatically whether transparency for top level\nwindows is currently supported, however this may sometimes fail and this option allows\noverriding the automatic detection. Setting it to 1 makes the transparency be always\navailable (setting it can still fail, of course) and setting it to 0 makes it always\nunavailable.\n\n* gtk.desktop: This option can be set to override the default desktop environment\ndetermination. Supported values are GNOME and KDE.\n\n* gtk.window.force-background-colour: If 1, the backgrounds of windows with the\nwxBG_STYLE_COLOUR background style are cleared forcibly instead of relying on the\nunderlying GTK+ window colour. This works around a display problem when running\napplications under KDE with the gtk-qt theme installed (0.6 and below).\n\nMac\n\n* mac.window-plain-transition: If 1, uses a plainer transition when showing a window. You\ncan also use the symbol wxMAC_WINDOW_PLAIN_TRANSITION.\n\n* window-default-variant: The default variant used by windows (cast to integer from the\nwxWindowVariant enum). Also known as wxWINDOW_DEFAULT_VARIANT.\n\n* mac.listctrl.always_use_generic: Tells `m:wxListCtrl` to use the generic control even\nwhen it is capable of using the native control instead. Also known as\nwxMAC_ALWAYS_USE_GENERIC_LISTCTRL.\n\n* mac.textcontrol-use-spell-checker: If 1 activates the spell checking in `m:wxTextCtrl`.\n\n* osx.openfiledialog.always-show-types: Per default a `m:wxFileDialog` with wxFD_OPEN does\nnot show a types-popup on macOS but allows the selection of files from any of the\nsupported types. Setting this to 1 shows a `m:wxChoice` for selection (if there is more\nthan one supported filetype).\n\nMotif\n\n* motif.largebuttons: If 1, uses a bigger default size for wxButtons.\n\nThe compile-time option to include or exclude this functionality is wxUSE_SYSTEM_OPTIONS.\n\nSee: `m:wxSystemSettings`\n\nwxWidgets docs: [wxSystemOptions](https://docs.wxwidgets.org/3.2/classwx_system_options.html)","title":"wxSystemOptions","ref":"wxSystemOptions.html"},{"type":"function","doc":"Gets an option.\n\nThe function is case-insensitive to `name`. Returns empty string if the option hasn't\nbeen set.\n\nSee:\n* `setOption/2`\n\n* `getOptionInt/1`\n\n* `hasOption/1`","title":"wxSystemOptions.getOption/1","ref":"wxSystemOptions.html#getOption/1"},{"type":"function","doc":"Gets an option as an integer.\n\nThe function is case-insensitive to `name`. If the option hasn't been set, this function\nreturns 0.\n\nSee:\n* `setOption/2`\n\n* `getOption/1`\n\n* `hasOption/1`","title":"wxSystemOptions.getOptionInt/1","ref":"wxSystemOptions.html#getOptionInt/1"},{"type":"function","doc":"Returns true if the given option is present.\n\nThe function is case-insensitive to `name`.\n\nSee:\n* `setOption/2`\n\n* `getOption/1`\n\n* `getOptionInt/1`","title":"wxSystemOptions.hasOption/1","ref":"wxSystemOptions.html#hasOption/1"},{"type":"function","doc":"Returns true if the option with the given `name` had been set to 0 value.\n\nThis is mostly useful for boolean options for which you can't use `GetOptionInt(name)` ==\n0 as this would also be true if the option hadn't been set at all.","title":"wxSystemOptions.isFalse/1","ref":"wxSystemOptions.html#isFalse/1"},{"type":"function","doc":"Sets an option.\n\nThe function is case-insensitive to `name`.","title":"wxSystemOptions.setOption/2","ref":"wxSystemOptions.html#setOption/2"},{"type":"type","doc":"","title":"wxSystemOptions.wxSystemOptions/0","ref":"wxSystemOptions.html#t:wxSystemOptions/0"},{"type":"module","doc":"`m:wxSystemSettings` allows the application to ask for details about the system.\n\nThis can include settings such as standard colours, fonts, and user interface element sizes.\n\nSee:\n* `m:wxFont`\n\n* `wx_color()`\n\n* `m:wxSystemOptions`\n\nwxWidgets docs: [wxSystemSettings](https://docs.wxwidgets.org/3.2/classwx_system_settings.html)","title":"wxSystemSettings","ref":"wxSystemSettings.html"},{"type":"function","doc":"Returns a system colour.\n\nReturn: The returned colour is always valid.","title":"wxSystemSettings.getColour/1","ref":"wxSystemSettings.html#getColour/1"},{"type":"function","doc":"Returns a system font.\n\nReturn: The returned font is always valid.","title":"wxSystemSettings.getFont/1","ref":"wxSystemSettings.html#getFont/1"},{"type":"function","doc":"","title":"wxSystemSettings.getMetric/1","ref":"wxSystemSettings.html#getMetric/1"},{"type":"function","doc":"Returns the value of a system metric, or -1 if the metric is not supported on the current\nsystem.\n\nThe value of `win` determines if the metric returned is a global value or a `m:wxWindow`\nbased value, in which case it might determine the widget, the display the window is on, or\nsomething similar. The window given should be as close to the metric as possible (e.g. a `m:wxTopLevelWindow`\nin case of the wxSYS_CAPTION_Y metric).\n\n`index` can be one of the ?wxSystemMetric enum values.\n\n`win` is a pointer to the window for which the metric is requested. Specifying the `win`\nparameter is encouraged, because some metrics on some ports are not supported without\none,or they might be capable of reporting better values if given one. If a window does not\nmake sense for a metric, one should still be given, as for example it might determine\nwhich displays cursor width is requested with wxSYS_CURSOR_X.","title":"wxSystemSettings.getMetric/2","ref":"wxSystemSettings.html#getMetric/2"},{"type":"function","doc":"Returns the screen type.\n\nThe return value is one of the ?wxSystemScreenType enum values.","title":"wxSystemSettings.getScreenType/0","ref":"wxSystemSettings.html#getScreenType/0"},{"type":"type","doc":"","title":"wxSystemSettings.wxSystemSettings/0","ref":"wxSystemSettings.html#t:wxSystemSettings/0"},{"type":"module","doc":"This class represents a taskbar icon.\n\nA taskbar icon is an icon that appears in the 'system tray' and responds to mouse clicks,\noptionally with a tooltip above it to help provide information.\n\nX Window System Note\n\nUnder X Window System, the window manager must support either the \"System Tray Protocol\"\n(see [http://freedesktop.org/wiki/Specifications/systemtray-spec](http://freedesktop.org/wiki/Specifications/systemtray-spec))\nby freedesktop.org (WMs used by modern desktop environments such as GNOME >= 2, KDE >= 3\nand XFCE >= 4 all do) or the older methods used in GNOME 1.2 and KDE 1 and 2.\n\nIf it doesn't, the icon will appear as a toplevel window on user's desktop. Because not\nall window managers have system tray, there's no guarantee that `m:wxTaskBarIcon` will\nwork correctly under X Window System and so the applications should use it only as an\noptional component of their user interface. The user should be required to explicitly\nenable the taskbar icon on Unix, it shouldn't be on by default.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTaskBarIcon](https://docs.wxwidgets.org/3.2/classwx_task_bar_icon.html)","title":"wxTaskBarIcon","ref":"wxTaskBarIcon.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`taskbar_move`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_down`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_up`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_down`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_up`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_dclick`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_dclick`](`m:wxTaskBarIconEvent`)","title":"Events - wxTaskBarIcon","ref":"wxTaskBarIcon.html#module-events"},{"type":"function","doc":"Destroys the object","title":"wxTaskBarIcon.destroy/1","ref":"wxTaskBarIcon.html#destroy/1"},{"type":"function","doc":"","title":"wxTaskBarIcon.new/0","ref":"wxTaskBarIcon.html#new/0"},{"type":"function","doc":"","title":"wxTaskBarIcon.new/1","ref":"wxTaskBarIcon.html#new/1"},{"type":"function","doc":"Pops up a menu at the current mouse position.\n\nThe events can be handled by a class derived from `m:wxTaskBarIcon`.\n\nNote: It is recommended to override `CreatePopupMenu()` (not implemented in wx) callback\ninstead of calling this method from event handler, because some ports (e.g. wxCocoa) may\nnot implement `popupMenu/2` and mouse click events at all.","title":"wxTaskBarIcon.popupMenu/2","ref":"wxTaskBarIcon.html#popupMenu/2"},{"type":"function","doc":"Removes the icon previously set with `setIcon/3`.","title":"wxTaskBarIcon.removeIcon/1","ref":"wxTaskBarIcon.html#removeIcon/1"},{"type":"function","doc":"","title":"wxTaskBarIcon.setIcon/2","ref":"wxTaskBarIcon.html#setIcon/2"},{"type":"function","doc":"Sets the icon, and optional tooltip text.","title":"wxTaskBarIcon.setIcon/3","ref":"wxTaskBarIcon.html#setIcon/3"},{"type":"type","doc":"","title":"wxTaskBarIcon.wxTaskBarIcon/0","ref":"wxTaskBarIcon.html#t:wxTaskBarIcon/0"},{"type":"module","doc":"The event class used by `m:wxTaskBarIcon`.\n\nFor a list of the event macros meant to be used with `m:wxTaskBarIconEvent`, please look\nat `m:wxTaskBarIcon` description.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxTaskBarIconEvent](https://docs.wxwidgets.org/3.2/classwx_task_bar_icon_event.html)","title":"wxTaskBarIconEvent","ref":"wxTaskBarIconEvent.html"},{"type":"type","doc":"","title":"wxTaskBarIconEvent.wxTaskBarIcon/0","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIcon/0"},{"type":"type","doc":"","title":"wxTaskBarIconEvent.wxTaskBarIconEvent/0","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIconEvent/0"},{"type":"type","doc":"","title":"wxTaskBarIconEvent.wxTaskBarIconEventType/0","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIconEventType/0"},{"type":"module","doc":"`m:wxTextAttr` represents the character and paragraph attributes, or style, for a range\nof text in a `m:wxTextCtrl` or `wxRichTextCtrl` (not implemented in wx).\n\nWhen setting up a `m:wxTextAttr` object, pass a bitlist mask to `setFlags/2` to indicate which style\nelements should be changed. As a convenience, when you call a setter such as SetFont, the\nrelevant bit will be set.\n\nSee: `m:wxTextCtrl`\n\nwxWidgets docs: [wxTextAttr](https://docs.wxwidgets.org/3.2/classwx_text_attr.html)","title":"wxTextAttr","ref":"wxTextAttr.html"},{"type":"function","doc":"Destroys the object","title":"wxTextAttr.destroy/1","ref":"wxTextAttr.html#destroy/1"},{"type":"function","doc":"Returns the alignment flags.\n\nSee ?wxTextAttrAlignment for a list of available styles.","title":"wxTextAttr.getAlignment/1","ref":"wxTextAttr.html#getAlignment/1"},{"type":"function","doc":"Returns the background colour.","title":"wxTextAttr.getBackgroundColour/1","ref":"wxTextAttr.html#getBackgroundColour/1"},{"type":"function","doc":"Returns flags indicating which attributes are applicable.\n\nSee `setFlags/2` for a list of available flags.","title":"wxTextAttr.getFlags/1","ref":"wxTextAttr.html#getFlags/1"},{"type":"function","doc":"Creates and returns a font specified by the font attributes in the `m:wxTextAttr` object.\n\nNote that `m:wxTextAttr` does not store a `m:wxFont` object, so this is only a temporary font.\n\nFor greater efficiency, access the font attributes directly.","title":"wxTextAttr.getFont/1","ref":"wxTextAttr.html#getFont/1"},{"type":"function","doc":"Returns the font encoding.","title":"wxTextAttr.getFontEncoding/1","ref":"wxTextAttr.html#getFontEncoding/1"},{"type":"function","doc":"Returns the font face name.","title":"wxTextAttr.getFontFaceName/1","ref":"wxTextAttr.html#getFontFaceName/1"},{"type":"function","doc":"Returns the font size in points.","title":"wxTextAttr.getFontSize/1","ref":"wxTextAttr.html#getFontSize/1"},{"type":"function","doc":"Returns the font style.","title":"wxTextAttr.getFontStyle/1","ref":"wxTextAttr.html#getFontStyle/1"},{"type":"function","doc":"Returns true if the font is underlined.","title":"wxTextAttr.getFontUnderlined/1","ref":"wxTextAttr.html#getFontUnderlined/1"},{"type":"function","doc":"Returns the font weight.","title":"wxTextAttr.getFontWeight/1","ref":"wxTextAttr.html#getFontWeight/1"},{"type":"function","doc":"Returns the left indent in tenths of a millimetre.","title":"wxTextAttr.getLeftIndent/1","ref":"wxTextAttr.html#getLeftIndent/1"},{"type":"function","doc":"Returns the left sub-indent in tenths of a millimetre.","title":"wxTextAttr.getLeftSubIndent/1","ref":"wxTextAttr.html#getLeftSubIndent/1"},{"type":"function","doc":"Returns the right indent in tenths of a millimeter.","title":"wxTextAttr.getRightIndent/1","ref":"wxTextAttr.html#getRightIndent/1"},{"type":"function","doc":"Returns an array of tab stops, each expressed in tenths of a millimeter.\n\nEach stop is measured from the left margin and therefore each value must be larger than\nthe last.","title":"wxTextAttr.getTabs/1","ref":"wxTextAttr.html#getTabs/1"},{"type":"function","doc":"Returns the text foreground colour.","title":"wxTextAttr.getTextColour/1","ref":"wxTextAttr.html#getTextColour/1"},{"type":"function","doc":"Returns true if the attribute object specifies a background colour.","title":"wxTextAttr.hasBackgroundColour/1","ref":"wxTextAttr.html#hasBackgroundColour/1"},{"type":"function","doc":"Returns true if the attribute object specifies any font attributes.","title":"wxTextAttr.hasFont/1","ref":"wxTextAttr.html#hasFont/1"},{"type":"function","doc":"Returns true if the attribute object specifies a text foreground colour.","title":"wxTextAttr.hasTextColour/1","ref":"wxTextAttr.html#hasTextColour/1"},{"type":"function","doc":"Returns false if we have any attributes set, true otherwise.","title":"wxTextAttr.isDefault/1","ref":"wxTextAttr.html#isDefault/1"},{"type":"function","doc":"Constructors.","title":"wxTextAttr.new/0","ref":"wxTextAttr.html#new/0"},{"type":"function","doc":"","title":"wxTextAttr.new/1","ref":"wxTextAttr.html#new/1"},{"type":"function","doc":"","title":"wxTextAttr.new/2","ref":"wxTextAttr.html#new/2"},{"type":"function","doc":"Sets the paragraph alignment.\n\nSee ?wxTextAttrAlignment enumeration values.\n\nOf these, wxTEXT_ALIGNMENT_JUSTIFIED is unimplemented. In future justification may be\nsupported when printing or previewing, only.","title":"wxTextAttr.setAlignment/2","ref":"wxTextAttr.html#setAlignment/2"},{"type":"function","doc":"Sets the background colour.","title":"wxTextAttr.setBackgroundColour/2","ref":"wxTextAttr.html#setBackgroundColour/2"},{"type":"function","doc":"Sets the flags determining which styles are being specified.\n\nThe ?wxTextAttrFlags values can be passed in a bitlist.","title":"wxTextAttr.setFlags/2","ref":"wxTextAttr.html#setFlags/2"},{"type":"function","doc":"","title":"wxTextAttr.setFont/2","ref":"wxTextAttr.html#setFont/2"},{"type":"function","doc":"Sets the attributes for the given font.\n\nNote that `m:wxTextAttr` does not store an actual `m:wxFont` object.","title":"wxTextAttr.setFont/3","ref":"wxTextAttr.html#setFont/3"},{"type":"function","doc":"Sets the font encoding.","title":"wxTextAttr.setFontEncoding/2","ref":"wxTextAttr.html#setFontEncoding/2"},{"type":"function","doc":"Sets the font face name.","title":"wxTextAttr.setFontFaceName/2","ref":"wxTextAttr.html#setFontFaceName/2"},{"type":"function","doc":"Sets the font family.","title":"wxTextAttr.setFontFamily/2","ref":"wxTextAttr.html#setFontFamily/2"},{"type":"function","doc":"Sets the font size in pixels.","title":"wxTextAttr.setFontPixelSize/2","ref":"wxTextAttr.html#setFontPixelSize/2"},{"type":"function","doc":"Sets the font size in points.","title":"wxTextAttr.setFontPointSize/2","ref":"wxTextAttr.html#setFontPointSize/2"},{"type":"function","doc":"Sets the font size in points.","title":"wxTextAttr.setFontSize/2","ref":"wxTextAttr.html#setFontSize/2"},{"type":"function","doc":"Sets the font style (normal, italic or slanted).","title":"wxTextAttr.setFontStyle/2","ref":"wxTextAttr.html#setFontStyle/2"},{"type":"function","doc":"Sets the font underlining (solid line, text colour).","title":"wxTextAttr.setFontUnderlined/2","ref":"wxTextAttr.html#setFontUnderlined/2"},{"type":"function","doc":"Sets the font weight.","title":"wxTextAttr.setFontWeight/2","ref":"wxTextAttr.html#setFontWeight/2"},{"type":"function","doc":"","title":"wxTextAttr.setLeftIndent/2","ref":"wxTextAttr.html#setLeftIndent/2"},{"type":"function","doc":"Sets the left indent and left subindent in tenths of a millimetre.\n\nThe sub-indent is an offset from the left of the paragraph, and is used for all but the\nfirst line in a paragraph.\n\nA positive value will cause the first line to appear to the left of the subsequent lines,\nand a negative value will cause the first line to be indented relative to the subsequent lines.\n\n`wxRichTextBuffer` (not implemented in wx) uses indentation to render a bulleted item.\nThe left indent is the distance between the margin and the bullet. The content of the\nparagraph, including the first line, starts at leftMargin + leftSubIndent. So the distance\nbetween the left edge of the bullet and the left of the actual paragraph is leftSubIndent.","title":"wxTextAttr.setLeftIndent/3","ref":"wxTextAttr.html#setLeftIndent/3"},{"type":"function","doc":"Sets the right indent in tenths of a millimetre.","title":"wxTextAttr.setRightIndent/2","ref":"wxTextAttr.html#setRightIndent/2"},{"type":"function","doc":"Sets the tab stops, expressed in tenths of a millimetre.\n\nEach stop is measured from the left margin and therefore each value must be larger than\nthe last.","title":"wxTextAttr.setTabs/2","ref":"wxTextAttr.html#setTabs/2"},{"type":"function","doc":"Sets the text foreground colour.","title":"wxTextAttr.setTextColour/2","ref":"wxTextAttr.html#setTextColour/2"},{"type":"type","doc":"","title":"wxTextAttr.wxTextAttr/0","ref":"wxTextAttr.html#t:wxTextAttr/0"},{"type":"module","doc":"A text control allows text to be displayed and edited.\n\nIt may be single line or multi-line. Notice that a lot of methods of the text controls\nare found in the base `wxTextEntry` (not implemented in wx) class which is a common base\nclass for `m:wxTextCtrl` and other controls using a single line text entry field (e.g. `m:wxComboBox`).","title":"wxTextCtrl","ref":"wxTextCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxTE_PROCESS_ENTER: The control will generate the event `wxEVT_TEXT_ENTER` that can be\nhandled by the program. Otherwise, i.e. either if this style not specified at all, or it\nis used, but there is no event handler for this event or the event handler called `wxEvent:skip/2` to\navoid overriding the default handling, pressing Enter key is either processed internally\nby the control or used to activate the default button of the dialog, if any.\n\n* wxTE_PROCESS_TAB: Normally, TAB key is used for keyboard navigation and pressing it in a\ncontrol switches focus to the next one. With this style, this won't happen and if the TAB\nis not otherwise processed (e.g. by `wxEVT_CHAR` event handler), a literal TAB character\nis inserted into the control. Notice that this style has no effect for single-line text\ncontrols when using wxGTK.\n\n* wxTE_MULTILINE: The text control allows multiple lines. If this style is not specified,\nline break characters should not be used in the controls value.\n\n* wxTE_PASSWORD: The text will be echoed as asterisks.\n\n* wxTE_READONLY: The text will not be user-editable.\n\n* wxTE_RICH: Use rich text control under MSW, this allows having more than 64KB of text in\nthe control. This style is ignored under other platforms.\n\n* wxTE_RICH2: Use rich text control version 2.0 or higher under MSW, this style is ignored\nunder other platforms\n\n* wxTE_AUTO_URL: Highlight the URLs and generate the wxTextUrlEvents when mouse events\noccur over them.\n\n* wxTE_NOHIDESEL: By default, the Windows text control doesn't show the selection when it\ndoesn't have focus - use this style to force it to always show it. It doesn't do anything\nunder other platforms.\n\n* wxHSCROLL: A horizontal scrollbar will be created and used, so that text won't be\nwrapped. No effect under wxGTK1.\n\n* wxTE_NO_VSCROLL: For multiline controls only: vertical scrollbar will never be created.\nThis limits the amount of text which can be entered into the control to what can be\ndisplayed in it under wxMSW but not under wxGTK or wxOSX. Currently not implemented for\nthe other platforms.\n\n* wxTE_LEFT: The text in the control will be left-justified (default).\n\n* wxTE_CENTRE: The text in the control will be centered (wxMSW, wxGTK, wxOSX).\n\n* wxTE_RIGHT: The text in the control will be right-justified (wxMSW, wxGTK, wxOSX).\n\n* wxTE_DONTWRAP: Same as wxHSCROLL style: don't wrap at all, show horizontal scrollbar\ninstead.\n\n* wxTE_CHARWRAP: For multiline controls only: wrap the lines too long to be shown entirely\nat any position (wxUniv, wxGTK, wxOSX).\n\n* wxTE_WORDWRAP: For multiline controls only: wrap the lines too long to be shown entirely\nat word boundaries (wxUniv, wxMSW, wxGTK, wxOSX).\n\n* wxTE_BESTWRAP: For multiline controls only: wrap the lines at word boundaries or at any\nother character if there are words longer than the window width (this is the default).\n\n* wxTE_CAPITALIZE: On PocketPC and Smartphone, causes the first letter to be capitalized.\nNote that alignment styles (wxTE_LEFT, wxTE_CENTRE and wxTE_RIGHT) can be changed\ndynamically after control creation on wxMSW, wxGTK and wxOSX. wxTE_READONLY, wxTE_PASSWORD\nand wrapping styles can be dynamically changed under wxGTK but not wxMSW. The other styles\ncan be only set during control creation.\n\nwxTextCtrl Text Format\n\nThe multiline text controls always store the text as a sequence of lines separated by `'\\n'`\ncharacters, i.e. in the Unix text format even on non-Unix platforms. This allows the user\ncode to ignore the differences between the platforms but at a price: the indices in the\ncontrol such as those returned by `getInsertionPoint/1` or `getSelection/1` can `not` be used as indices into the string\nreturned by `getValue/1` as they're going to be slightly off for platforms using `\"\\\\r\\\\n\"` as\nseparator (as Windows does).\n\nInstead, if you need to obtain a substring between the 2 indices obtained from the\ncontrol with the help of the functions mentioned above, you should use `getRange/3`. And the indices\nthemselves can only be passed to other methods, for example `setInsertionPoint/2` or `setSelection/3`.\n\nTo summarize: never use the indices returned by (multiline) `m:wxTextCtrl` as indices\ninto the string it contains, but only as arguments to be passed back to the other `m:wxTextCtrl`\nmethods. This problem doesn't arise for single-line platforms however where the indices\nin the control do correspond to the positions in the value string.\n\nwxTextCtrl Positions and Coordinates\n\nIt is possible to use either linear positions, i.e. roughly (but `not` always exactly, as\nexplained in the previous section) the index of the character in the text contained in the\ncontrol or X-Y coordinates, i.e. column and line of the character when working with this\nclass and it provides the functions `positionToXY/2` and `xYToPosition/3` to convert between the two.\n\nAdditionally, a position in the control can be converted to its coordinates in pixels\nusing `PositionToCoords()` (not implemented in wx) which can be useful to e.g. show a\npopup menu near the given character. And, in the other direction, `HitTest()` (not\nimplemented in wx) can be used to find the character under, or near, the given pixel coordinates.\n\nTo be more precise, positions actually refer to the gaps between characters and not the\ncharacters themselves. Thus, position 0 is the one before the very first character in the\ncontrol and so is a valid position even when the control is empty. And if the control\ncontains a single character, it has two valid positions: 0 before this character and 1 -\nafter it. This, when the documentation of various functions mentions \"invalid position\",\nit doesn't consider the position just after the last character of the line to be invalid,\nonly the positions beyond that one (e.g. 2 and greater in the single character example)\nare actually invalid.\n\nwxTextCtrl Styles.\n\nMulti-line text controls support styling, i.e. provide a possibility to set colours and\nfont for individual characters in it (note that under Windows `wxTE_RICH` style is\nrequired for style support). To use the styles you can either call `setDefaultStyle/2` before inserting the\ntext or call `setStyle/4` later to change the style of the text already in the control (the first\nsolution is much more efficient).\n\nIn either case, if the style doesn't specify some of the attributes (for example you only\nwant to set the text colour but without changing the font nor the text background), the\nvalues of the default style will be used for them. If there is no default style, the\nattributes of the text control itself are used.\n\nSo the following code correctly describes what it does: the second call to `setDefaultStyle/2` doesn't\nchange the text foreground colour (which stays red) while the last one doesn't change the\nbackground colour (which stays grey):\n\nwxTextCtrl and C++ Streams\n\nThis class multiply-inherits from `std::streambuf` (except for some really old compilers\nusing non-standard iostream library), allowing code such as the following:\n\nNote that even if your build of wxWidgets doesn't support this (the symbol `wxHAS_TEXT_WINDOW_STREAM`\nhas value of 0 then) you can still use `m:wxTextCtrl` itself in a stream-like manner:\n\nHowever the possibility to create a `std::ostream` associated with `m:wxTextCtrl` may be\nuseful if you need to redirect the output of a function taking a `std::ostream` as\nparameter to a text control.\n\nAnother commonly requested need is to redirect `std::cout` to the text control. This may\nbe done in the following way:\n\nBut wxWidgets provides a convenient class to make it even simpler so instead you may just do\n\nSee `wxStreamToTextRedirector` (not implemented in wx) for more details.\n\nEvent Handling.\n\nThe following commands are processed by default event handlers in `m:wxTextCtrl`: `wxID_CUT`, `wxID_COPY`, `wxID_PASTE`, `wxID_UNDO`, `wxID_REDO`.\nThe associated UI update events are also processed automatically, when the control has the focus.\n\nSee: `create/4`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTextCtrl](https://docs.wxwidgets.org/3.2/classwx_text_ctrl.html)","title":"Styles - wxTextCtrl","ref":"wxTextCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_text_updated`](`m:wxCommandEvent`)\n\n* [`command_text_enter`](`m:wxCommandEvent`)\n\n* [`text_maxlen`](`m:wxCommandEvent`)","title":"Events - wxTextCtrl","ref":"wxTextCtrl.html#module-events"},{"type":"function","doc":"Appends the text to the end of the text control.\n\nRemark: After the text is appended, the insertion point will be at the end of the text\ncontrol. If this behaviour is not desired, the programmer should use `getInsertionPoint/1` and `setInsertionPoint/2`.\n\nSee: `writeText/2`","title":"wxTextCtrl.appendText/2","ref":"wxTextCtrl.html#appendText/2"},{"type":"function","doc":"Returns true if the selection can be copied to the clipboard.","title":"wxTextCtrl.canCopy/1","ref":"wxTextCtrl.html#canCopy/1"},{"type":"function","doc":"Returns true if the selection can be cut to the clipboard.","title":"wxTextCtrl.canCut/1","ref":"wxTextCtrl.html#canCut/1"},{"type":"function","doc":"Returns true if the contents of the clipboard can be pasted into the text control.\n\nOn some platforms (Motif, GTK) this is an approximation and returns true if the control\nis editable, false otherwise.","title":"wxTextCtrl.canPaste/1","ref":"wxTextCtrl.html#canPaste/1"},{"type":"function","doc":"Returns true if there is a redo facility available and the last operation can be redone.","title":"wxTextCtrl.canRedo/1","ref":"wxTextCtrl.html#canRedo/1"},{"type":"function","doc":"Returns true if there is an undo facility available and the last operation can be undone.","title":"wxTextCtrl.canUndo/1","ref":"wxTextCtrl.html#canUndo/1"},{"type":"function","doc":"Sets the new text control value.\n\nIt also marks the control as not-modified which means that IsModified() would return\nfalse immediately after the call to `changeValue/2`.\n\nThe insertion point is set to the start of the control (i.e. position 0) by this function.\n\nThis functions does not generate the `wxEVT_TEXT` event but otherwise is identical to `setValue/2`.\n\nSee overview_events_prog for more information.\n\nSince: 2.7.1","title":"wxTextCtrl.changeValue/2","ref":"wxTextCtrl.html#changeValue/2"},{"type":"function","doc":"Clears the text in the control.\n\nNote that this function will generate a `wxEVT_TEXT` event, i.e. its effect is identical\nto calling `SetValue`(\"\").","title":"wxTextCtrl.clear/1","ref":"wxTextCtrl.html#clear/1"},{"type":"function","doc":"Copies the selected text to the clipboard.","title":"wxTextCtrl.copy/1","ref":"wxTextCtrl.html#copy/1"},{"type":"function","doc":"","title":"wxTextCtrl.create/3","ref":"wxTextCtrl.html#create/3"},{"type":"function","doc":"Creates the text control for two-step construction.\n\nThis method should be called if the default constructor was used for the control\ncreation. Its parameters have the same meaning as for the non-default constructor.","title":"wxTextCtrl.create/4","ref":"wxTextCtrl.html#create/4"},{"type":"function","doc":"Copies the selected text to the clipboard and removes it from the control.","title":"wxTextCtrl.cut/1","ref":"wxTextCtrl.html#cut/1"},{"type":"function","doc":"Destroys the object","title":"wxTextCtrl.destroy/1","ref":"wxTextCtrl.html#destroy/1"},{"type":"function","doc":"Resets the internal modified flag as if the current changes had been saved.","title":"wxTextCtrl.discardEdits/1","ref":"wxTextCtrl.html#discardEdits/1"},{"type":"function","doc":"This function inserts into the control the character which would have been inserted if\nthe given key event had occurred in the text control.\n\nThe `event` object should be the same as the one passed to `EVT_KEY_DOWN` handler\npreviously by wxWidgets. Please note that this function doesn't currently work correctly\nfor all keys under any platform but MSW.\n\nReturn: true if the event resulted in a change to the control, false otherwise.","title":"wxTextCtrl.emulateKeyPress/2","ref":"wxTextCtrl.html#emulateKeyPress/2"},{"type":"function","doc":"Returns the style currently used for the new text.\n\nSee: `setDefaultStyle/2`","title":"wxTextCtrl.getDefaultStyle/1","ref":"wxTextCtrl.html#getDefaultStyle/1"},{"type":"function","doc":"Returns the insertion point, or cursor, position.\n\nThis is defined as the zero based index of the character position to the right of the\ninsertion point. For example, if the insertion point is at the end of the single-line text\ncontrol, it is equal to `getLastPosition/1`.\n\nNotice that insertion position is, in general, different from the index of the character\nthe cursor position at in the string returned by `getValue/1`. While this is always the case for the\nsingle line controls, multi-line controls can use two characters `\"\\\\r\\\\n\"` as line\nseparator (this is notably the case under MSW) meaning that indices in the control and its\nstring value are offset by 1 for every line.\n\nHence to correctly get the character at the current cursor position, taking into account\nthat there can be none if the cursor is at the end of the string, you could do the following:","title":"wxTextCtrl.getInsertionPoint/1","ref":"wxTextCtrl.html#getInsertionPoint/1"},{"type":"function","doc":"Returns the zero based index of the last position in the text control, which is equal to\nthe number of characters in the control.","title":"wxTextCtrl.getLastPosition/1","ref":"wxTextCtrl.html#getLastPosition/1"},{"type":"function","doc":"Gets the length of the specified line, not including any trailing newline character(s).\n\nReturn: The length of the line, or -1 if `lineNo` was invalid.","title":"wxTextCtrl.getLineLength/2","ref":"wxTextCtrl.html#getLineLength/2"},{"type":"function","doc":"Returns the contents of a given line in the text control, not including any trailing\nnewline character(s).\n\nReturn: The contents of the line.","title":"wxTextCtrl.getLineText/2","ref":"wxTextCtrl.html#getLineText/2"},{"type":"function","doc":"Returns the number of lines in the text control buffer.\n\nThe returned number is the number of logical lines, i.e. just the count of the number of\nnewline characters in the control + 1, for wxGTK and wxOSX/Cocoa ports while it is the\nnumber of physical lines, i.e. the count of lines actually shown in the control, in wxMSW.\nBecause of this discrepancy, it is not recommended to use this function.\n\nRemark: Note that even empty text controls have one line (where the insertion point is),\nso `getNumberOfLines/1` never returns 0.","title":"wxTextCtrl.getNumberOfLines/1","ref":"wxTextCtrl.html#getNumberOfLines/1"},{"type":"function","doc":"Returns the string containing the text starting in the positions `from` and up to `to` in\nthe control.\n\nThe positions must have been returned by another `m:wxTextCtrl` method. Please note that\nthe positions in a multiline `m:wxTextCtrl` do `not` correspond to the indices in the\nstring returned by `getValue/1` because of the different new line representations (`CR` or `CR` LF)\nand so this method should be used to obtain the correct results instead of extracting\nparts of the entire value. It may also be more efficient, especially if the control\ncontains a lot of data.","title":"wxTextCtrl.getRange/3","ref":"wxTextCtrl.html#getRange/3"},{"type":"function","doc":"Gets the current selection span.\n\nIf the returned values are equal, there was no selection. Please note that the indices\nreturned may be used with the other `m:wxTextCtrl` methods but don't necessarily represent\nthe correct indices into the string returned by `getValue/1` for multiline controls under Windows (at\nleast,) you should use `getStringSelection/1` to get the selected text.","title":"wxTextCtrl.getSelection/1","ref":"wxTextCtrl.html#getSelection/1"},{"type":"function","doc":"Gets the text currently selected in the control.\n\nIf there is no selection, the returned string is empty.","title":"wxTextCtrl.getStringSelection/1","ref":"wxTextCtrl.html#getStringSelection/1"},{"type":"function","doc":"Returns the style at this position in the text control.\n\nNot all platforms support this function.\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee:\n* `setStyle/4`\n\n* `m:wxTextAttr`","title":"wxTextCtrl.getStyle/3","ref":"wxTextCtrl.html#getStyle/3"},{"type":"function","doc":"Gets the contents of the control.\n\nNotice that for a multiline text control, the lines will be separated by (Unix-style) `\\n`\ncharacters, even under Windows where they are separated by a `\\r\\n` sequence in the\nnative control.","title":"wxTextCtrl.getValue/1","ref":"wxTextCtrl.html#getValue/1"},{"type":"function","doc":"Returns true if the controls contents may be edited by user (note that it always can be\nchanged by the program).\n\nIn other words, this functions returns true if the control hasn't been put in read-only\nmode by a previous call to `setEditable/2`.","title":"wxTextCtrl.isEditable/1","ref":"wxTextCtrl.html#isEditable/1"},{"type":"function","doc":"Returns true if the text has been modified by user.\n\nNote that calling `setValue/2` doesn't make the control modified.\n\nSee: `markDirty/1`","title":"wxTextCtrl.isModified/1","ref":"wxTextCtrl.html#isModified/1"},{"type":"function","doc":"Returns true if this is a multi line edit control and false otherwise.\n\nSee: `isSingleLine/1`","title":"wxTextCtrl.isMultiLine/1","ref":"wxTextCtrl.html#isMultiLine/1"},{"type":"function","doc":"Returns true if this is a single line edit control and false otherwise.\n\nSee:\n* `isSingleLine/1`\n\n* `isMultiLine/1`","title":"wxTextCtrl.isSingleLine/1","ref":"wxTextCtrl.html#isSingleLine/1"},{"type":"function","doc":"","title":"wxTextCtrl.loadFile/2","ref":"wxTextCtrl.html#loadFile/2"},{"type":"function","doc":"Loads and displays the named file, if it exists.\n\nReturn: true if successful, false otherwise.","title":"wxTextCtrl.loadFile/3","ref":"wxTextCtrl.html#loadFile/3"},{"type":"function","doc":"Mark text as modified (dirty).\n\nSee: `isModified/1`","title":"wxTextCtrl.markDirty/1","ref":"wxTextCtrl.html#markDirty/1"},{"type":"function","doc":"Default ctor.","title":"wxTextCtrl.new/0","ref":"wxTextCtrl.html#new/0"},{"type":"function","doc":"","title":"wxTextCtrl.new/2","ref":"wxTextCtrl.html#new/2"},{"type":"function","doc":"Constructor, creating and showing a text control.\n\nRemark: The horizontal scrollbar (wxHSCROLL style flag) will only be created for\nmulti-line text controls. Without a horizontal scrollbar, text lines that don't fit in the\ncontrol's size will be wrapped (but no newline character is inserted). Single line\ncontrols don't have a horizontal scrollbar, the text is automatically scrolled so that the\ninsertion point is always visible.\n\nSee: `create/4`","title":"wxTextCtrl.new/3","ref":"wxTextCtrl.html#new/3"},{"type":"function","doc":"Pastes text from the clipboard to the text item.","title":"wxTextCtrl.paste/1","ref":"wxTextCtrl.html#paste/1"},{"type":"function","doc":"Converts given position to a zero-based column, line number pair.\n\nReturn: true on success, false on failure (most likely due to a too large position parameter).\n\nSee: `xYToPosition/3`","title":"wxTextCtrl.positionToXY/2","ref":"wxTextCtrl.html#positionToXY/2"},{"type":"function","doc":"If there is a redo facility and the last operation can be redone, redoes the last\noperation.\n\nDoes nothing if there is no redo facility.","title":"wxTextCtrl.redo/1","ref":"wxTextCtrl.html#redo/1"},{"type":"function","doc":"Removes the text starting at the first given position up to (but not including) the\ncharacter at the last position.\n\nThis function puts the current insertion point position at `to` as a side effect.","title":"wxTextCtrl.remove/3","ref":"wxTextCtrl.html#remove/3"},{"type":"function","doc":"Replaces the text starting at the first position up to (but not including) the character\nat the last position with the given text.\n\nThis function puts the current insertion point position at `to` as a side effect.","title":"wxTextCtrl.replace/4","ref":"wxTextCtrl.html#replace/4"},{"type":"function","doc":"","title":"wxTextCtrl.saveFile/1","ref":"wxTextCtrl.html#saveFile/1"},{"type":"function","doc":"Saves the contents of the control in a text file.\n\nReturn: true if the operation was successful, false otherwise.","title":"wxTextCtrl.saveFile/2","ref":"wxTextCtrl.html#saveFile/2"},{"type":"function","doc":"Changes the default style to use for the new text which is going to be added to the\ncontrol.\n\nThis applies both to the text added programmatically using `writeText/2` or `appendText/2` and to the text entered\nby the user interactively.\n\nIf either of the font, foreground, or background colour is not set in `style`, the values\nof the previous default style are used for them. If the previous default style didn't set\nthem neither, the global font or colours of the text control itself are used as fall back.\n\nHowever if the `style` parameter is the default `m:wxTextAttr`, then the default style is\njust reset (instead of being combined with the new style which wouldn't change it at all).\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee: `getDefaultStyle/1`","title":"wxTextCtrl.setDefaultStyle/2","ref":"wxTextCtrl.html#setDefaultStyle/2"},{"type":"function","doc":"Makes the text item editable or read-only, overriding the `wxTE\\_READONLY` flag.\n\nSee: `isEditable/1`","title":"wxTextCtrl.setEditable/2","ref":"wxTextCtrl.html#setEditable/2"},{"type":"function","doc":"Sets the insertion point at the given position.","title":"wxTextCtrl.setInsertionPoint/2","ref":"wxTextCtrl.html#setInsertionPoint/2"},{"type":"function","doc":"Sets the insertion point at the end of the text control.\n\nThis is equivalent to calling `setInsertionPoint/2` with `getLastPosition/1` argument.","title":"wxTextCtrl.setInsertionPointEnd/1","ref":"wxTextCtrl.html#setInsertionPointEnd/1"},{"type":"function","doc":"This function sets the maximum number of characters the user can enter into the control.\n\nIn other words, it allows limiting the text value length to `len` not counting the\nterminating `NUL` character.\n\nIf `len` is 0, the previously set max length limit, if any, is discarded and the user may\nenter as much text as the underlying native text control widget supports (typically at\nleast 32Kb). If the user tries to enter more characters into the text control when it\nalready is filled up to the maximal length, a `wxEVT_TEXT_MAXLEN` event is sent to notify\nthe program about it (giving it the possibility to show an explanatory message, for\nexample) and the extra input is discarded.\n\nNote that in wxGTK this function may only be used with single line text controls.","title":"wxTextCtrl.setMaxLength/2","ref":"wxTextCtrl.html#setMaxLength/2"},{"type":"function","doc":"Selects the text starting at the first position up to (but not including) the character\nat the last position.\n\nIf both parameters are equal to -1 all text in the control is selected.\n\nNotice that the insertion point will be moved to `from` by this function.","title":"wxTextCtrl.setSelection/3","ref":"wxTextCtrl.html#setSelection/3"},{"type":"function","doc":"Changes the style of the given range.\n\nIf any attribute within `style` is not set, the corresponding attribute from `getDefaultStyle/1` is used.\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee:\n* `getStyle/3`\n\n* `m:wxTextAttr`","title":"wxTextCtrl.setStyle/4","ref":"wxTextCtrl.html#setStyle/4"},{"type":"function","doc":"Sets the new text control value.\n\nIt also marks the control as not-modified which means that IsModified() would return\nfalse immediately after the call to `setValue/2`.\n\nThe insertion point is set to the start of the control (i.e. position 0) by this function\nunless the control value doesn't change at all, in which case the insertion point is left\nat its original position.\n\nNote that, unlike most other functions changing the controls values, this function\ngenerates a `wxEVT_TEXT` event. To avoid this you can use `changeValue/2` instead.","title":"wxTextCtrl.setValue/2","ref":"wxTextCtrl.html#setValue/2"},{"type":"function","doc":"Makes the line containing the given position visible.","title":"wxTextCtrl.showPosition/2","ref":"wxTextCtrl.html#showPosition/2"},{"type":"function","doc":"If there is an undo facility and the last operation can be undone, undoes the last\noperation.\n\nDoes nothing if there is no undo facility.","title":"wxTextCtrl.undo/1","ref":"wxTextCtrl.html#undo/1"},{"type":"function","doc":"Writes the text into the text control at the current insertion position.\n\nRemark: Newlines in the text string are the only control characters allowed, and they\nwill cause appropriate line breaks. See operator<<() and `appendText/2` for more convenient ways of\nwriting to the window. After the write operation, the insertion point will be at the end\nof the inserted text, so subsequent write operations will be appended. To append text\nafter the user may have interacted with the control, call `setInsertionPointEnd/1` before writing.","title":"wxTextCtrl.writeText/2","ref":"wxTextCtrl.html#writeText/2"},{"type":"function","doc":"Converts the given zero based column and line number to a position.\n\nReturn: The position value, or -1 if x or y was invalid.","title":"wxTextCtrl.xYToPosition/3","ref":"wxTextCtrl.html#xYToPosition/3"},{"type":"type","doc":"","title":"wxTextCtrl.wxTextCtrl/0","ref":"wxTextCtrl.html#t:wxTextCtrl/0"},{"type":"module","doc":"`m:wxTextDataObject` is a specialization of `wxDataObjectSimple` (not implemented in wx)\nfor text data.\n\nIt can be used without change to paste data into the `m:wxClipboard` or a `wxDropSource`\n(not implemented in wx). A user may wish to derive a new class from this class for\nproviding text on-demand in order to minimize memory consumption when offering data in\nseveral formats, such as plain text and RTF because by default the text is stored in a\nstring in this class, but it might as well be generated when requested. For this, `getTextLength/1` and `getText/1`\nwill have to be overridden.\n\nNote that if you already have the text inside a string, you will not achieve any\nefficiency gain by overriding these functions because copying wxStrings is already a very\nefficient operation (data is not actually copied because wxStrings are reference counted).\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* `m:wxDataObject`\n\n* `m:wxFileDataObject`\n\n* `m:wxBitmapDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxTextDataObject](https://docs.wxwidgets.org/3.2/classwx_text_data_object.html)","title":"wxTextDataObject","ref":"wxTextDataObject.html"},{"type":"function","doc":"Destroys the object","title":"wxTextDataObject.destroy/1","ref":"wxTextDataObject.html#destroy/1"},{"type":"function","doc":"Returns the text associated with the data object.\n\nYou may wish to override this method when offering data on-demand, but this is not\nrequired by wxWidgets' internals. Use this method to get data in text form from the `m:wxClipboard`.","title":"wxTextDataObject.getText/1","ref":"wxTextDataObject.html#getText/1"},{"type":"function","doc":"Returns the data size.\n\nBy default, returns the size of the text data set in the constructor or using `setText/2`. This can\nbe overridden to provide text size data on-demand. It is recommended to return the text\nlength plus 1 for a trailing zero, but this is not strictly required.","title":"wxTextDataObject.getTextLength/1","ref":"wxTextDataObject.html#getTextLength/1"},{"type":"function","doc":"","title":"wxTextDataObject.new/0","ref":"wxTextDataObject.html#new/0"},{"type":"function","doc":"Constructor, may be used to initialise the text (otherwise `setText/2` should be used\nlater).","title":"wxTextDataObject.new/1","ref":"wxTextDataObject.html#new/1"},{"type":"function","doc":"Sets the text associated with the data object.\n\nThis method is called when the data object receives the data and, by default, copies the\ntext into the member variable. If you want to process the text on the fly you may wish to\noverride this function.","title":"wxTextDataObject.setText/2","ref":"wxTextDataObject.html#setText/2"},{"type":"type","doc":"","title":"wxTextDataObject.wxTextDataObject/0","ref":"wxTextDataObject.html#t:wxTextDataObject/0"},{"type":"module","doc":"This class represents a dialog that requests a one-line text string from the user.\n\nIt is implemented as a generic wxWidgets dialog.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_textentry)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTextEntryDialog](https://docs.wxwidgets.org/3.2/classwx_text_entry_dialog.html)","title":"wxTextEntryDialog","ref":"wxTextEntryDialog.html"},{"type":"function","doc":"Destroys the object","title":"wxTextEntryDialog.destroy/1","ref":"wxTextEntryDialog.html#destroy/1"},{"type":"function","doc":"Returns the text that the user has entered if the user has pressed OK, or the original\nvalue if the user has pressed Cancel.","title":"wxTextEntryDialog.getValue/1","ref":"wxTextEntryDialog.html#getValue/1"},{"type":"function","doc":"Default constructor.\n\nCall `Create()` (not implemented in wx) to really create the dialog later.\n\nSince: 2.9.5","title":"wxTextEntryDialog.new/0","ref":"wxTextEntryDialog.html#new/0"},{"type":"function","doc":"","title":"wxTextEntryDialog.new/2","ref":"wxTextEntryDialog.html#new/2"},{"type":"function","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.\n\nSee `Create()` (not implemented in wx) method for parameter description.","title":"wxTextEntryDialog.new/3","ref":"wxTextEntryDialog.html#new/3"},{"type":"function","doc":"Sets the default text value.","title":"wxTextEntryDialog.setValue/2","ref":"wxTextEntryDialog.html#setValue/2"},{"type":"type","doc":"","title":"wxTextEntryDialog.wxTextEntryDialog/0","ref":"wxTextEntryDialog.html#t:wxTextEntryDialog/0"},{"type":"module","doc":"`m:wxToggleButton` is a button that stays pressed when clicked by the user.\n\nIn other words, it is similar to `m:wxCheckBox` in functionality but looks like a `m:wxButton`.\n\nSince wxWidgets version 2.9.0 this control emits an update UI event.\n\nYou can see `m:wxToggleButton` in action in page_samples_widgets.\n\nSee:\n* `m:wxCheckBox`\n\n* `m:wxButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToggleButton](https://docs.wxwidgets.org/3.2/classwx_toggle_button.html)","title":"wxToggleButton","ref":"wxToggleButton.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_togglebutton_clicked`](`m:wxCommandEvent`)","title":"Events - wxToggleButton","ref":"wxToggleButton.html#module-events"},{"type":"function","doc":"","title":"wxToggleButton.create/4","ref":"wxToggleButton.html#create/4"},{"type":"function","doc":"Creates the toggle button for two-step construction.\n\nSee `new/4` for details.","title":"wxToggleButton.create/5","ref":"wxToggleButton.html#create/5"},{"type":"function","doc":"Destroys the object","title":"wxToggleButton.destroy/1","ref":"wxToggleButton.html#destroy/1"},{"type":"function","doc":"Gets the state of the toggle button.\n\nReturn: Returns true if it is pressed, false otherwise.","title":"wxToggleButton.getValue/1","ref":"wxToggleButton.html#getValue/1"},{"type":"function","doc":"Default constructor.","title":"wxToggleButton.new/0","ref":"wxToggleButton.html#new/0"},{"type":"function","doc":"","title":"wxToggleButton.new/3","ref":"wxToggleButton.html#new/3"},{"type":"function","doc":"Constructor, creating and showing a toggle button.\n\nSee: `create/5`","title":"wxToggleButton.new/4","ref":"wxToggleButton.html#new/4"},{"type":"function","doc":"Sets the toggle button to the given state.\n\nThis does not cause a `EVT_TOGGLEBUTTON` event to be emitted.","title":"wxToggleButton.setValue/2","ref":"wxToggleButton.html#setValue/2"},{"type":"type","doc":"","title":"wxToggleButton.wxToggleButton/0","ref":"wxToggleButton.html#t:wxToggleButton/0"},{"type":"module","doc":"A toolbar is a bar of buttons and/or other controls usually placed below the menu bar in\na `m:wxFrame`.\n\nYou may create a toolbar that is managed by a frame calling `wxFrame:createToolBar/2`. Under Pocket PC, you should\nalways use this function for creating the toolbar to be managed by the frame, so that\nwxWidgets can use a combined menubar and toolbar. Where you manage your own toolbars,\ncreate `m:wxToolBar` as usual.\n\nThere are several different types of tools you can add to a toolbar. These types are\ncontrolled by the ?wxItemKind enumeration.\n\nNote that many methods in `m:wxToolBar` such as `addTool/6` return a `wxToolBarToolBase*` object.\nThis should be regarded as an opaque handle representing the newly added toolbar item,\nproviding access to its id and position within the toolbar. Changes to the item's state\nshould be made through calls to `m:wxToolBar` methods, for example `enableTool/3`. Calls to `wxToolBarToolBase`\n(not implemented in wx) methods (undocumented by purpose) will not change the visible\nstate of the item within the tool bar.\n\nAfter you have added all the tools you need, you must call `realize/1` to effectively construct and\ndisplay the toolbar.\n\n`wxMSW note`: Note that under wxMSW toolbar paints tools to reflect system-wide colours.\nIf you use more than 16 colours in your tool bitmaps, you may wish to suppress this\nbehaviour, otherwise system colours in your bitmaps will inadvertently be mapped to system\ncolours. To do this, set the msw.remap system option before creating the toolbar: If you\nwish to use 32-bit images (which include an alpha channel for transparency) use: Then\ncolour remapping is switched off, and a transparent background used. But only use this\noption under Windows XP with true colour:","title":"wxToolBar","ref":"wxToolBar.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxTB_FLAT: Gives the toolbar a flat look (Windows and GTK only).\n\n* wxTB_DOCKABLE: Makes the toolbar floatable and dockable (GTK only).\n\n* wxTB_HORIZONTAL: Specifies horizontal layout (default).\n\n* wxTB_VERTICAL: Specifies vertical layout.\n\n* wxTB_TEXT: Shows the text in the toolbar buttons; by default only icons are shown.\n\n* wxTB_NOICONS: Specifies no icons in the toolbar buttons; by default they are shown.\n\n* wxTB_NODIVIDER: Specifies no divider (border) above the toolbar (Windows only)\n\n* wxTB_NOALIGN: Specifies no alignment with the parent window (Windows only, not very\nuseful).\n\n* wxTB_HORZ_LAYOUT: Shows the text and the icons alongside, not vertically stacked (Windows\nand GTK 2 only). This style must be used with `wxTB_TEXT`.\n\n* wxTB_HORZ_TEXT: Combination of `wxTB_HORZ_LAYOUT` and `wxTB_TEXT`.\n\n* wxTB_NO_TOOLTIPS: Don't show the short help tooltips for the tools when the mouse hovers\nover them.\n\n* wxTB_BOTTOM: Align the toolbar at the bottom of parent window.\n\n* wxTB_RIGHT: Align the toolbar at the right side of parent window.\n\n* wxTB_DEFAULT_STYLE: Combination of `wxTB_HORIZONTAL` and `wxTB_FLAT`. This style is new\nsince wxWidgets 2.9.5. See also overview_windowstyles. Note that the wxMSW native toolbar\nignores `wxTB_NOICONS` style. Also, toggling the `wxTB_TEXT` works only if the style was\ninitially on.\n\nSee: [Overview toolbar](https://docs.wxwidgets.org/3.2/overview_toolbar.html#overview_toolbar)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToolBar](https://docs.wxwidgets.org/3.2/classwx_tool_bar.html)","title":"Styles - wxToolBar","ref":"wxToolBar.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_tool_rclicked`](`m:wxCommandEvent`)\n\n* [`command_tool_enter`](`m:wxCommandEvent`)\n\n* [`tool_dropdown`](`m:wxCommandEvent`)","title":"Events - wxToolBar","ref":"wxToolBar.html#module-events"},{"type":"function","doc":"","title":"wxToolBar.addCheckTool/4","ref":"wxToolBar.html#addCheckTool/4"},{"type":"function","doc":"Adds a new check (or toggle) tool to the toolbar.\n\nThe parameters are the same as in `addTool/6`.\n\nSee: `addTool/6`","title":"wxToolBar.addCheckTool/5","ref":"wxToolBar.html#addCheckTool/5"},{"type":"function","doc":"","title":"wxToolBar.addControl/2","ref":"wxToolBar.html#addControl/2"},{"type":"function","doc":"Adds any control to the toolbar, typically e.g. a `m:wxComboBox`.\n\nRemark: wxMac: labels are only displayed if wxWidgets is built with `wxMAC_USE_NATIVE_TOOLBAR`\nset to 1","title":"wxToolBar.addControl/3","ref":"wxToolBar.html#addControl/3"},{"type":"function","doc":"","title":"wxToolBar.addRadioTool/4","ref":"wxToolBar.html#addRadioTool/4"},{"type":"function","doc":"Adds a new radio tool to the toolbar.\n\nConsecutive radio tools form a radio group such that exactly one button in the group is\npressed at any moment, in other words whenever a button in the group is pressed the\npreviously pressed button is automatically released. You should avoid having the radio\ngroups of only one element as it would be impossible for the user to use such button.\n\nBy default, the first button in the radio group is initially pressed, the others are not.\n\nSee: `addTool/6`","title":"wxToolBar.addRadioTool/5","ref":"wxToolBar.html#addRadioTool/5"},{"type":"function","doc":"Adds a separator for spacing groups of tools.\n\nNotice that the separator uses the look appropriate for the current platform so it can be\na vertical line (MSW, some versions of GTK) or just an empty space or something else.\n\nSee:\n* `addTool/6`\n\n* `setToolSeparation/2`\n\n* `addStretchableSpace/1`","title":"wxToolBar.addSeparator/1","ref":"wxToolBar.html#addSeparator/1"},{"type":"function","doc":"Adds a stretchable space to the toolbar.\n\nAny space not taken up by the fixed items (all items except for stretchable spaces) is\ndistributed in equal measure between the stretchable spaces in the toolbar. The most\ncommon use for this method is to add a single stretchable space before the items which\nshould be right-aligned in the toolbar, but more exotic possibilities are possible, e.g. a\nstretchable space may be added in the beginning and the end of the toolbar to centre all\ntoolbar items.\n\nSee:\n* `addTool/6`\n\n* `addSeparator/1`\n\n* `insertStretchableSpace/2`\n\nSince: 2.9.1","title":"wxToolBar.addStretchableSpace/1","ref":"wxToolBar.html#addStretchableSpace/1"},{"type":"function","doc":"Adds a tool to the toolbar.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","title":"wxToolBar.addTool/2","ref":"wxToolBar.html#addTool/2"},{"type":"function","doc":"","title":"wxToolBar.addTool/4","ref":"wxToolBar.html#addTool/4"},{"type":"function","doc":"Adds a tool to the toolbar.\n\nThis most commonly used version has fewer parameters than the full version below which\nspecifies the more rarely used button features.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","title":"wxToolBar.addTool/5","ref":"wxToolBar.html#addTool/5"},{"type":"function","doc":"Adds a tool to the toolbar.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","title":"wxToolBar.addTool/6","ref":"wxToolBar.html#addTool/6"},{"type":"function","doc":"Removes the specified tool from the toolbar and deletes it.\n\nIf you don't want to delete the tool, but just to remove it from the toolbar (to possibly\nadd it back later), you may use `removeTool/2` instead.\n\nNote: It is unnecessary to call `realize/1` for the change to take place, it will happen immediately.\n\nReturn: true if the tool was deleted, false otherwise.\n\nSee: `deleteToolByPos/2`","title":"wxToolBar.deleteTool/2","ref":"wxToolBar.html#deleteTool/2"},{"type":"function","doc":"This function behaves like `deleteTool/2` but it deletes the tool at the specified\nposition and not the one with the given id.","title":"wxToolBar.deleteToolByPos/2","ref":"wxToolBar.html#deleteToolByPos/2"},{"type":"function","doc":"Enables or disables the tool.\n\nRemark: Some implementations will change the visible state of the tool to indicate that\nit is disabled.\n\nSee:\n* `getToolEnabled/2`\n\n* `toggleTool/3`","title":"wxToolBar.enableTool/3","ref":"wxToolBar.html#enableTool/3"},{"type":"function","doc":"Returns a pointer to the tool identified by `id` or NULL if no corresponding tool is\nfound.","title":"wxToolBar.findById/2","ref":"wxToolBar.html#findById/2"},{"type":"function","doc":"Returns a pointer to the control identified by `id` or NULL if no corresponding control\nis found.","title":"wxToolBar.findControl/2","ref":"wxToolBar.html#findControl/2"},{"type":"function","doc":"Finds a tool for the given mouse position.\n\nReturn: A pointer to a tool if a tool is found, or NULL otherwise.\n\nRemark: Currently not implemented in wxGTK (always returns NULL there).","title":"wxToolBar.findToolForPosition/3","ref":"wxToolBar.html#findToolForPosition/3"},{"type":"function","doc":"Returns the left/right and top/bottom margins, which are also used for inter-toolspacing.\n\nSee: `setMargins/3`","title":"wxToolBar.getMargins/1","ref":"wxToolBar.html#getMargins/1"},{"type":"function","doc":"Returns the size of bitmap that the toolbar expects to have.\n\nThe default bitmap size is platform-dependent: for example, it is 16*15 for MSW and 24*24\nfor GTK. This size does `not` necessarily indicate the best size to use for the toolbars\non the given platform, for this you should use `wxArtProvider::GetNativeSizeHint(wxART_TOOLBAR)`\nbut in any case, as the bitmap size is deduced automatically from the size of the bitmaps\nassociated with the tools added to the toolbar, it is usually unnecessary to call `setToolBitmapSize/2` explicitly.\n\nRemark: Note that this is the size of the bitmap you pass to `addTool/6`, and not the eventual size\nof the tool button.\n\nSee:\n* `setToolBitmapSize/2`\n\n* `getToolSize/1`","title":"wxToolBar.getToolBitmapSize/1","ref":"wxToolBar.html#getToolBitmapSize/1"},{"type":"function","doc":"Called to determine whether a tool is enabled (responds to user input).\n\nReturn: true if the tool is enabled, false otherwise.\n\nSee: `enableTool/3`","title":"wxToolBar.getToolEnabled/2","ref":"wxToolBar.html#getToolEnabled/2"},{"type":"function","doc":"Returns the long help for the given tool.\n\nSee:\n* `setToolLongHelp/3`\n\n* `setToolShortHelp/3`","title":"wxToolBar.getToolLongHelp/2","ref":"wxToolBar.html#getToolLongHelp/2"},{"type":"function","doc":"Returns the value used for packing tools.\n\nSee: `setToolPacking/2`","title":"wxToolBar.getToolPacking/1","ref":"wxToolBar.html#getToolPacking/1"},{"type":"function","doc":"Returns the tool position in the toolbar, or `wxNOT_FOUND` if the tool is not found.","title":"wxToolBar.getToolPos/2","ref":"wxToolBar.html#getToolPos/2"},{"type":"function","doc":"Returns the default separator size.\n\nSee: `setToolSeparation/2`","title":"wxToolBar.getToolSeparation/1","ref":"wxToolBar.html#getToolSeparation/1"},{"type":"function","doc":"Returns the short help for the given tool.\n\nSee:\n* `getToolLongHelp/2`\n\n* `setToolShortHelp/3`","title":"wxToolBar.getToolShortHelp/2","ref":"wxToolBar.html#getToolShortHelp/2"},{"type":"function","doc":"Returns the size of a whole button, which is usually larger than a tool bitmap because of\nadded 3D effects.\n\nSee:\n* `setToolBitmapSize/2`\n\n* `getToolBitmapSize/1`","title":"wxToolBar.getToolSize/1","ref":"wxToolBar.html#getToolSize/1"},{"type":"function","doc":"Gets the on/off state of a toggle tool.\n\nReturn: true if the tool is toggled on, false otherwise.\n\nSee: `toggleTool/3`","title":"wxToolBar.getToolState/2","ref":"wxToolBar.html#getToolState/2"},{"type":"function","doc":"","title":"wxToolBar.insertControl/3","ref":"wxToolBar.html#insertControl/3"},{"type":"function","doc":"Inserts the control into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addControl/3`\n\n* `insertTool/6`","title":"wxToolBar.insertControl/4","ref":"wxToolBar.html#insertControl/4"},{"type":"function","doc":"Inserts the separator into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addSeparator/1`\n\n* `insertTool/6`","title":"wxToolBar.insertSeparator/2","ref":"wxToolBar.html#insertSeparator/2"},{"type":"function","doc":"Inserts a stretchable space at the given position.\n\nSee `addStretchableSpace/1` for details about stretchable spaces.\n\nSee:\n* `insertTool/6`\n\n* `insertSeparator/2`\n\nSince: 2.9.1","title":"wxToolBar.insertStretchableSpace/2","ref":"wxToolBar.html#insertStretchableSpace/2"},{"type":"function","doc":"","title":"wxToolBar.insertTool/3","ref":"wxToolBar.html#insertTool/3"},{"type":"function","doc":"","title":"wxToolBar.insertTool/5","ref":"wxToolBar.html#insertTool/5"},{"type":"function","doc":"Inserts the tool with the specified attributes into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addTool/6`\n\n* `insertControl/4`\n\n* `insertSeparator/2`\n\nReturn: The newly inserted tool or NULL on failure. Notice that with the overload taking `tool`\nparameter the caller is responsible for deleting the tool in the latter case.","title":"wxToolBar.insertTool/6","ref":"wxToolBar.html#insertTool/6"},{"type":"function","doc":"This function should be called after you have added tools.","title":"wxToolBar.realize/1","ref":"wxToolBar.html#realize/1"},{"type":"function","doc":"Removes the given tool from the toolbar but doesn't delete it.\n\nThis allows inserting/adding this tool back to this (or another) toolbar later.\n\nNote: It is unnecessary to call `realize/1` for the change to take place, it will happen immediately.\n\nSee: `deleteTool/2`","title":"wxToolBar.removeTool/2","ref":"wxToolBar.html#removeTool/2"},{"type":"function","doc":"Set the values to be used as margins for the toolbar.\n\nRemark: This must be called before the tools are added if absolute positioning is to be\nused, and the default (zero-size) margins are to be overridden.\n\nSee: `getMargins/1`","title":"wxToolBar.setMargins/3","ref":"wxToolBar.html#setMargins/3"},{"type":"function","doc":"Sets the default size of each tool bitmap.\n\nThe default bitmap size is 16 by 15 pixels.\n\nRemark: This should be called to tell the toolbar what the tool bitmap size is. Call it\nbefore you add tools.\n\nSee:\n* `getToolBitmapSize/1`\n\n* `getToolSize/1`","title":"wxToolBar.setToolBitmapSize/2","ref":"wxToolBar.html#setToolBitmapSize/2"},{"type":"function","doc":"Sets the long help for the given tool.\n\nRemark: You might use the long help for displaying the tool purpose on the status line.\n\nSee:\n* `getToolLongHelp/2`\n\n* `setToolShortHelp/3`","title":"wxToolBar.setToolLongHelp/3","ref":"wxToolBar.html#setToolLongHelp/3"},{"type":"function","doc":"Sets the value used for spacing tools.\n\nThe default value is 1.\n\nRemark: The packing is used for spacing in the vertical direction if the toolbar is\nhorizontal, and for spacing in the horizontal direction if the toolbar is vertical.\n\nSee: `getToolPacking/1`","title":"wxToolBar.setToolPacking/2","ref":"wxToolBar.html#setToolPacking/2"},{"type":"function","doc":"Sets the default separator size.\n\nThe default value is 5.\n\nSee: `addSeparator/1`","title":"wxToolBar.setToolSeparation/2","ref":"wxToolBar.html#setToolSeparation/2"},{"type":"function","doc":"Sets the short help for the given tool.\n\nRemark: An application might use short help for identifying the tool purpose in a tooltip.\n\nSee:\n* `getToolShortHelp/2`\n\n* `setToolLongHelp/3`","title":"wxToolBar.setToolShortHelp/3","ref":"wxToolBar.html#setToolShortHelp/3"},{"type":"function","doc":"Toggles a tool on or off.\n\nThis does not cause any event to get emitted.\n\nRemark: Only applies to a tool that has been specified as a toggle tool.","title":"wxToolBar.toggleTool/3","ref":"wxToolBar.html#toggleTool/3"},{"type":"type","doc":"","title":"wxToolBar.wxToolBar/0","ref":"wxToolBar.html#t:wxToolBar/0"},{"type":"module","doc":"This class holds information about a tooltip associated with a window (see `wxWindow:setToolTip/2`).\n\nThe four static methods, `enable/1`, `setDelay/1` `wxToolTip::SetAutoPop()` (not implemented in wx) and `wxToolTip::SetReshow()`\n(not implemented in wx) can be used to globally alter tooltips behaviour.\n\nwxWidgets docs: [wxToolTip](https://docs.wxwidgets.org/3.2/classwx_tool_tip.html)","title":"wxToolTip","ref":"wxToolTip.html"},{"type":"function","doc":"Destroys the object","title":"wxToolTip.destroy/1","ref":"wxToolTip.html#destroy/1"},{"type":"function","doc":"Enable or disable tooltips globally.\n\nNote: May not be supported on all platforms (eg. wxCocoa).","title":"wxToolTip.enable/1","ref":"wxToolTip.html#enable/1"},{"type":"function","doc":"Get the tooltip text.","title":"wxToolTip.getTip/1","ref":"wxToolTip.html#getTip/1"},{"type":"function","doc":"Get the associated window.","title":"wxToolTip.getWindow/1","ref":"wxToolTip.html#getWindow/1"},{"type":"function","doc":"Constructor.","title":"wxToolTip.new/1","ref":"wxToolTip.html#new/1"},{"type":"function","doc":"Set the delay after which the tooltip appears.\n\nNote: May not be supported on all platforms.","title":"wxToolTip.setDelay/1","ref":"wxToolTip.html#setDelay/1"},{"type":"function","doc":"Set the tooltip text.","title":"wxToolTip.setTip/2","ref":"wxToolTip.html#setTip/2"},{"type":"type","doc":"","title":"wxToolTip.wxToolTip/0","ref":"wxToolTip.html#t:wxToolTip/0"},{"type":"module","doc":"`m:wxToolbook` is a class similar to `m:wxNotebook` but which uses a `m:wxToolBar` to\nshow the labels instead of the tabs.\n\nThere is no documentation for this class yet but its usage is identical to `m:wxNotebook`\n(except for the features clearly related to tabs only), so please refer to that class\ndocumentation for now. You can also use the page_samples_notebook to see `m:wxToolbook` in action.\n\nOne feature of this class not supported by `m:wxBookCtrlBase` is the support for\ndisabling some of the pages, see `EnablePage()` (not implemented in wx).","title":"wxToolbook","ref":"wxToolbook.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxTBK_BUTTONBAR: Use wxButtonToolBar-based implementation under macOS (ignored under\nother platforms).\n\n* wxTBK_HORZ_LAYOUT: Shows the text and the icons alongside, not vertically stacked (only\nimplement under Windows and GTK 2 platforms as it relies on `wxTB_HORZ_LAYOUT` flag\nsupport). The common wxBookCtrl styles described in the overview_bookctrl are also supported.\n\nSee:\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* `m:wxBookCtrlBase`\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToolbook](https://docs.wxwidgets.org/3.2/classwx_toolbook.html)","title":"Styles - wxToolbook","ref":"wxToolbook.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`toolbook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`toolbook_page_changing`](`m:wxBookCtrlEvent`)","title":"Events - wxToolbook","ref":"wxToolbook.html#module-events"},{"type":"function","doc":"","title":"wxToolbook.addPage/3","ref":"wxToolbook.html#addPage/3"},{"type":"function","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","title":"wxToolbook.addPage/4","ref":"wxToolbook.html#addPage/4"},{"type":"function","doc":"","title":"wxToolbook.advanceSelection/1","ref":"wxToolbook.html#advanceSelection/1"},{"type":"function","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","title":"wxToolbook.advanceSelection/2","ref":"wxToolbook.html#advanceSelection/2"},{"type":"function","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxToolbook.assignImageList/2","ref":"wxToolbook.html#assignImageList/2"},{"type":"function","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","title":"wxToolbook.changeSelection/2","ref":"wxToolbook.html#changeSelection/2"},{"type":"function","doc":"","title":"wxToolbook.create/3","ref":"wxToolbook.html#create/3"},{"type":"function","doc":"Create the tool book control that has already been constructed with the default\nconstructor.","title":"wxToolbook.create/4","ref":"wxToolbook.html#create/4"},{"type":"function","doc":"Deletes all pages.","title":"wxToolbook.deleteAllPages/1","ref":"wxToolbook.html#deleteAllPages/1"},{"type":"function","doc":"Destroys the object","title":"wxToolbook.destroy/1","ref":"wxToolbook.html#destroy/1"},{"type":"function","doc":"Returns the currently selected page or NULL.","title":"wxToolbook.getCurrentPage/1","ref":"wxToolbook.html#getCurrentPage/1"},{"type":"function","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxToolbook.getImageList/1","ref":"wxToolbook.html#getImageList/1"},{"type":"function","doc":"Returns the window at the given page position.","title":"wxToolbook.getPage/2","ref":"wxToolbook.html#getPage/2"},{"type":"function","doc":"Returns the number of pages in the control.","title":"wxToolbook.getPageCount/1","ref":"wxToolbook.html#getPageCount/1"},{"type":"function","doc":"Returns the image index for the given page.","title":"wxToolbook.getPageImage/2","ref":"wxToolbook.html#getPageImage/2"},{"type":"function","doc":"Returns the string for the given page.","title":"wxToolbook.getPageText/2","ref":"wxToolbook.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","title":"wxToolbook.getSelection/1","ref":"wxToolbook.html#getSelection/1"},{"type":"function","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","title":"wxToolbook.hitTest/2","ref":"wxToolbook.html#hitTest/2"},{"type":"function","doc":"","title":"wxToolbook.insertPage/4","ref":"wxToolbook.html#insertPage/4"},{"type":"function","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","title":"wxToolbook.insertPage/5","ref":"wxToolbook.html#insertPage/5"},{"type":"function","doc":"Constructs a choicebook control.","title":"wxToolbook.new/0","ref":"wxToolbook.html#new/0"},{"type":"function","doc":"","title":"wxToolbook.new/2","ref":"wxToolbook.html#new/2"},{"type":"function","doc":"","title":"wxToolbook.new/3","ref":"wxToolbook.html#new/3"},{"type":"function","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","title":"wxToolbook.setImageList/2","ref":"wxToolbook.html#setImageList/2"},{"type":"function","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","title":"wxToolbook.setPageImage/3","ref":"wxToolbook.html#setPageImage/3"},{"type":"function","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","title":"wxToolbook.setPageSize/2","ref":"wxToolbook.html#setPageSize/2"},{"type":"function","doc":"Sets the text for the given page.","title":"wxToolbook.setPageText/3","ref":"wxToolbook.html#setPageText/3"},{"type":"function","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","title":"wxToolbook.setSelection/2","ref":"wxToolbook.html#setSelection/2"},{"type":"type","doc":"","title":"wxToolbook.wxToolbook/0","ref":"wxToolbook.html#t:wxToolbook/0"},{"type":"module","doc":"`m:wxTopLevelWindow` is a common base class for `m:wxDialog` and `m:wxFrame`.\n\nIt is an abstract base class meaning that you never work with objects of this class\ndirectly, but all of its methods are also applicable for the two classes above.\n\nNote that the instances of `m:wxTopLevelWindow` are managed by wxWidgets in the internal\ntop level window list.\n\nSee:\n* `m:wxDialog`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTopLevelWindow](https://docs.wxwidgets.org/3.2/classwx_top_level_window.html)","title":"wxTopLevelWindow","ref":"wxTopLevelWindow.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`maximize`](`m:wxMaximizeEvent`)\n\n* [`move`](`m:wxMoveEvent`)\n\n* [`show`](`m:wxShowEvent`)","title":"Events - wxTopLevelWindow","ref":"wxTopLevelWindow.html#module-events"},{"type":"function","doc":"","title":"wxTopLevelWindow.centerOnScreen/1","ref":"wxTopLevelWindow.html#centerOnScreen/1"},{"type":"function","doc":"Equivalent to: `centreOnScreen/2`","title":"wxTopLevelWindow.centerOnScreen/2","ref":"wxTopLevelWindow.html#centerOnScreen/2"},{"type":"function","doc":"","title":"wxTopLevelWindow.centreOnScreen/1","ref":"wxTopLevelWindow.html#centreOnScreen/1"},{"type":"function","doc":"Centres the window on screen.\n\nSee: `wxWindow:centreOnParent/2`","title":"wxTopLevelWindow.centreOnScreen/2","ref":"wxTopLevelWindow.html#centreOnScreen/2"},{"type":"function","doc":"Returns the standard icon of the window.\n\nThe icon will be invalid if it hadn't been previously set by `setIcon/2`.\n\nSee: `getIcons/1`","title":"wxTopLevelWindow.getIcon/1","ref":"wxTopLevelWindow.html#getIcon/1"},{"type":"function","doc":"Returns all icons associated with the window, there will be none of them if neither `setIcon/2`\nnor `setIcons/2` had been called before.\n\nUse `getIcon/1` to get the main icon of the window.\n\nSee: `m:wxIconBundle`","title":"wxTopLevelWindow.getIcons/1","ref":"wxTopLevelWindow.html#getIcons/1"},{"type":"function","doc":"Gets a string containing the window title.\n\nSee: `setTitle/2`","title":"wxTopLevelWindow.getTitle/1","ref":"wxTopLevelWindow.html#getTitle/1"},{"type":"function","doc":"","title":"wxTopLevelWindow.iconize/1","ref":"wxTopLevelWindow.html#iconize/1"},{"type":"function","doc":"Iconizes or restores the window.\n\nNote that in wxGTK the change to the window state is not immediate, i.e. `isIconized/1` will typically\nreturn false right after a call to `iconize/2` and its return value will only change after the\ncontrol flow returns to the event loop and the notification about the window being really\niconized is received.\n\nSee:\n* `isIconized/1`\n\n* `m:wxIconizeEvent`","title":"wxTopLevelWindow.iconize/2","ref":"wxTopLevelWindow.html#iconize/2"},{"type":"function","doc":"Returns true if this window is currently active, i.e. if the user is currently working\nwith it.","title":"wxTopLevelWindow.isActive/1","ref":"wxTopLevelWindow.html#isActive/1"},{"type":"function","doc":"Returns true if the window is in fullscreen mode.\n\nSee: `showFullScreen/3`","title":"wxTopLevelWindow.isFullScreen/1","ref":"wxTopLevelWindow.html#isFullScreen/1"},{"type":"function","doc":"Returns true if the window is iconized.","title":"wxTopLevelWindow.isIconized/1","ref":"wxTopLevelWindow.html#isIconized/1"},{"type":"function","doc":"Returns true if the window is maximized.","title":"wxTopLevelWindow.isMaximized/1","ref":"wxTopLevelWindow.html#isMaximized/1"},{"type":"function","doc":"","title":"wxTopLevelWindow.maximize/1","ref":"wxTopLevelWindow.html#maximize/1"},{"type":"function","doc":"Maximizes or restores the window.\n\nNote that, just as with `iconize/2`, the change to the window state is not immediate in at least\nwxGTK port.\n\nSee: `iconize/2`","title":"wxTopLevelWindow.maximize/2","ref":"wxTopLevelWindow.html#maximize/2"},{"type":"function","doc":"","title":"wxTopLevelWindow.requestUserAttention/1","ref":"wxTopLevelWindow.html#requestUserAttention/1"},{"type":"function","doc":"Use a system-dependent way to attract users attention to the window when it is in\nbackground.\n\n`flags` may have the value of either `?wxUSER\\_ATTENTION\\_INFO` (default) or `?wxUSER\\_ATTENTION\\_ERROR`\nwhich results in a more drastic action. When in doubt, use the default value.\n\nNote: This function should normally be only used when the application is not already in foreground.\n\nThis function is currently implemented for Win32 where it flashes the window icon in the\ntaskbar, and for wxGTK with task bars supporting it.","title":"wxTopLevelWindow.requestUserAttention/2","ref":"wxTopLevelWindow.html#requestUserAttention/2"},{"type":"function","doc":"Sets the icon for this window.\n\nRemark: The window takes a 'copy' of `icon`, but since it uses reference counting, the\ncopy is very quick. It is safe to delete `icon` after calling this function.\n\nNote: In wxMSW, `icon` must be either 16x16 or 32x32 icon.\n\nSee:\n* `m:wxIcon`\n\n* `setIcons/2`","title":"wxTopLevelWindow.setIcon/2","ref":"wxTopLevelWindow.html#setIcon/2"},{"type":"function","doc":"Sets several icons of different sizes for this window: this allows using different icons\nfor different situations (e.g.\n\ntask switching bar, taskbar, window title bar) instead of scaling, with possibly bad\nlooking results, the only icon set by `setIcon/2`.\n\nNote: In wxMSW, `icons` must contain a 16x16 or 32x32 icon, preferably both.\n\nSee: `m:wxIconBundle`","title":"wxTopLevelWindow.setIcons/2","ref":"wxTopLevelWindow.html#setIcons/2"},{"type":"function","doc":"If the platform supports it, sets the shape of the window to that depicted by `region`.\n\nThe system will not display or respond to any mouse event for the pixels that lie outside\nof the region. To reset the window to the normal rectangular shape simply call `setShape/2` again with\nan empty `m:wxRegion`. Returns true if the operation is successful.\n\nThis method is available in this class only since wxWidgets 2.9.3, previous versions only\nprovided it in `m:wxTopLevelWindow`.\n\nNote that windows with non default shape have a fixed size and can't be resized using `wxWindow:setSize/6`.","title":"wxTopLevelWindow.setShape/2","ref":"wxTopLevelWindow.html#setShape/2"},{"type":"function","doc":"Sets the window title.\n\nSee: `getTitle/1`","title":"wxTopLevelWindow.setTitle/2","ref":"wxTopLevelWindow.html#setTitle/2"},{"type":"function","doc":"","title":"wxTopLevelWindow.showFullScreen/2","ref":"wxTopLevelWindow.html#showFullScreen/2"},{"type":"function","doc":"Depending on the value of `show` parameter the window is either shown full screen or\nrestored to its normal state.\n\n`style` is a bit list containing some or all of the following values, which indicate what\nelements of the window to hide in full-screen mode:\n\n* `?wxFULLSCREEN\\_NOMENUBAR`\n\n* `?wxFULLSCREEN\\_NOTOOLBAR`\n\n* `?wxFULLSCREEN\\_NOSTATUSBAR`\n\n* `?wxFULLSCREEN\\_NOBORDER`\n\n* `?wxFULLSCREEN\\_NOCAPTION`\n\n* `?wxFULLSCREEN\\_ALL` (all of the above)\n\nThis function has not been tested with MDI frames.\n\nNote: Showing a window full screen also actually `wxWindow:show/2`s the window if it isn't shown.\n\nSee: `isFullScreen/1`","title":"wxTopLevelWindow.showFullScreen/3","ref":"wxTopLevelWindow.html#showFullScreen/3"},{"type":"type","doc":"","title":"wxTopLevelWindow.wxTopLevelWindow/0","ref":"wxTopLevelWindow.html#t:wxTopLevelWindow/0"},{"type":"module","doc":"A tree control presents information as a hierarchy, with items that may be expanded to\nshow further items.\n\nItems in a tree control are referenced by `wxTreeItemId` (not implemented in wx) handles,\nwhich may be tested for validity by calling `wxTreeItemId::IsOk()` (not implemented in wx).\n\nA similar control with a fully native implementation for GTK+ and macOS as well is `wxDataViewTreeCtrl`\n(not implemented in wx).\n\nTo intercept events from a tree control, use the event table macros described in `m:wxTreeEvent`.","title":"wxTreeCtrl","ref":"wxTreeCtrl.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxTR_EDIT_LABELS: Use this style if you wish the user to be able to edit labels in the\ntree control.\n\n* wxTR_NO_BUTTONS: For convenience to document that no buttons are to be drawn.\n\n* wxTR_HAS_BUTTONS: Use this style to show + and - buttons to the left of parent items.\n\n* wxTR_TWIST_BUTTONS: Selects alternative style of +/`-` buttons and shows rotating\n(\"twisting\") arrows instead. Currently this style is only implemented under Microsoft\nWindows Vista and later Windows versions and is ignored under the other platforms as\nenabling it is equivalent to using `wxSystemThemedControl::EnableSystemTheme()` (not\nimplemented in wx).\n\n* wxTR_NO_LINES: Use this style to hide vertical level connectors.\n\n* wxTR_FULL_ROW_HIGHLIGHT: Use this style to have the background colour and the selection\nhighlight extend over the entire horizontal row of the tree control window. (This flag is\nignored under Windows unless you specify `wxTR_NO_LINES` as well.)\n\n* wxTR_LINES_AT_ROOT: Use this style to show lines leading to the root nodes (unless no `wxTR_NO_LINES`\nis also used, in which case no lines are shown). Note that in the MSW version, if this\nstyle is omitted, not only the lines, but also the button used for expanding the root item\nis not shown, which can be unexpected, so it is recommended to always use it.\n\n* wxTR_HIDE_ROOT: Use this style to suppress the display of the root node, effectively\ncausing the first-level nodes to appear as a series of root nodes.\n\n* wxTR_ROW_LINES: Use this style to draw a contrasting border between displayed rows.\n\n* wxTR_HAS_VARIABLE_ROW_HEIGHT: Use this style to cause row heights to be just big enough\nto fit the content. If not set, all rows use the largest row height. The default is that\nthis flag is unset. Generic only.\n\n* wxTR_SINGLE: For convenience to document that only one item may be selected at a time.\nSelecting another item causes the current selection, if any, to be deselected. This is the\ndefault.\n\n* wxTR_MULTIPLE: Use this style to allow a range of items to be selected. If a second range\nis selected, the current range, if any, is deselected.\n\n* wxTR_DEFAULT_STYLE: The set of flags that are closest to the defaults for the native\ncontrol for a particular toolkit.\n\nSee also overview_windowstyles.\n\n`Win32` `notes:`\n\n`m:wxTreeCtrl` class uses the standard common treeview control under Win32 implemented in\nthe system library comctl32.dll. Some versions of this library are known to have bugs with\nhandling the tree control colours: the usual symptom is that the expanded items leave\nblack (or otherwise incorrectly coloured) background behind them, especially for the\ncontrols using non-default background colour. The recommended solution is to upgrade the\ncomctl32.dll to a newer version: see [http://www.microsoft.com/downloads/details.aspx?familyid=cb2cf3a2-8025-4e8f-8511-9b476a8d35d2](http://www.microsoft.com/downloads/details.aspx?familyid=cb2cf3a2-8025-4e8f-8511-9b476a8d35d2)\n\nSee:\n* `m:wxTreeEvent`\n\n* [Overview treectrl](https://docs.wxwidgets.org/3.2/overview_treectrl.html#overview_treectrl)\n\n* `m:wxListBox`\n\n* `m:wxListCtrl`\n\n* `m:wxImageList`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTreeCtrl](https://docs.wxwidgets.org/3.2/classwx_tree_ctrl.html)","title":"Styles - wxTreeCtrl","ref":"wxTreeCtrl.html#module-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`command_tree_begin_drag`](`m:wxTreeEvent`)\n\n* [`command_tree_begin_rdrag`](`m:wxTreeEvent`)\n\n* [`command_tree_end_drag`](`m:wxTreeEvent`)\n\n* [`command_tree_begin_label_edit`](`m:wxTreeEvent`)\n\n* [`command_tree_end_label_edit`](`m:wxTreeEvent`)\n\n* [`command_tree_delete_item`](`m:wxTreeEvent`)\n\n* [`command_tree_get_info`](`m:wxTreeEvent`)\n\n* [`command_tree_set_info`](`m:wxTreeEvent`)\n\n* [`command_tree_item_activated`](`m:wxTreeEvent`)\n\n* [`command_tree_item_collapsed`](`m:wxTreeEvent`)\n\n* [`command_tree_item_collapsing`](`m:wxTreeEvent`)\n\n* [`command_tree_item_expanded`](`m:wxTreeEvent`)\n\n* [`command_tree_item_expanding`](`m:wxTreeEvent`)\n\n* [`command_tree_item_right_click`](`m:wxTreeEvent`)\n\n* [`command_tree_item_middle_click`](`m:wxTreeEvent`)\n\n* [`command_tree_sel_changed`](`m:wxTreeEvent`)\n\n* [`command_tree_sel_changing`](`m:wxTreeEvent`)\n\n* [`command_tree_key_down`](`m:wxTreeEvent`)\n\n* [`command_tree_item_gettooltip`](`m:wxTreeEvent`)\n\n* [`command_tree_item_menu`](`m:wxTreeEvent`)\n\n* [`command_tree_state_image_click`](`m:wxTreeEvent`)","title":"Events - wxTreeCtrl","ref":"wxTreeCtrl.html#module-events"},{"type":"function","doc":"","title":"wxTreeCtrl.addRoot/2","ref":"wxTreeCtrl.html#addRoot/2"},{"type":"function","doc":"Adds the root node to the tree, returning the new item.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","title":"wxTreeCtrl.addRoot/3","ref":"wxTreeCtrl.html#addRoot/3"},{"type":"function","doc":"","title":"wxTreeCtrl.appendItem/3","ref":"wxTreeCtrl.html#appendItem/3"},{"type":"function","doc":"Appends an item to the end of the branch identified by `parent`, return a new item id.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","title":"wxTreeCtrl.appendItem/4","ref":"wxTreeCtrl.html#appendItem/4"},{"type":"function","doc":"Sets the normal image list.\n\nThe image list assigned with this method will be automatically deleted by `m:wxTreeCtrl`\nas appropriate (i.e. it takes ownership of the list).\n\nSee: `setImageList/2`","title":"wxTreeCtrl.assignImageList/2","ref":"wxTreeCtrl.html#assignImageList/2"},{"type":"function","doc":"Sets the state image list.\n\nImage list assigned with this method will be automatically deleted by `m:wxTreeCtrl` as\nappropriate (i.e. it takes ownership of the list).\n\nSee: `setStateImageList/2`","title":"wxTreeCtrl.assignStateImageList/2","ref":"wxTreeCtrl.html#assignStateImageList/2"},{"type":"function","doc":"Collapses the given item.","title":"wxTreeCtrl.collapse/2","ref":"wxTreeCtrl.html#collapse/2"},{"type":"function","doc":"Collapses the given item and removes all children.","title":"wxTreeCtrl.collapseAndReset/2","ref":"wxTreeCtrl.html#collapseAndReset/2"},{"type":"function","doc":"","title":"wxTreeCtrl.create/2","ref":"wxTreeCtrl.html#create/2"},{"type":"function","doc":"Creates the tree control.\n\nSee `new/2` for further details.","title":"wxTreeCtrl.create/3","ref":"wxTreeCtrl.html#create/3"},{"type":"function","doc":"Deletes the specified item.\n\nA `EVT_TREE_DELETE_ITEM` event will be generated.\n\nThis function may cause a subsequent call to `getNextChild/3` to fail.","title":"wxTreeCtrl.delete/2","ref":"wxTreeCtrl.html#delete/2"},{"type":"function","doc":"Deletes all items in the control.\n\nThis function generates `wxEVT_TREE_DELETE_ITEM` events for each item being deleted,\nincluding the root one if it is shown, i.e. unless wxTR_HIDE_ROOT style is used.","title":"wxTreeCtrl.deleteAllItems/1","ref":"wxTreeCtrl.html#deleteAllItems/1"},{"type":"function","doc":"Deletes all children of the given item (but not the item itself).\n\nA `wxEVT_TREE_DELETE_ITEM` event will be generated for every item being deleted.\n\nIf you have called `setItemHasChildren/3`, you may need to call it again since `deleteChildren/2` does not automatically clear\nthe setting.","title":"wxTreeCtrl.deleteChildren/2","ref":"wxTreeCtrl.html#deleteChildren/2"},{"type":"function","doc":"Destroys the object","title":"wxTreeCtrl.destroy/1","ref":"wxTreeCtrl.html#destroy/1"},{"type":"function","doc":"Starts editing the label of the given `item`.\n\nThis function generates a `EVT_TREE_BEGIN_LABEL_EDIT` event which can be vetoed so that\nno text control will appear for in-place editing.\n\nIf the user changed the label (i.e. s/he does not press ESC or leave the text control\nwithout changes, a `EVT_TREE_END_LABEL_EDIT` event will be sent which can be vetoed as well.\n\nSee: `m:wxTreeEvent`","title":"wxTreeCtrl.editLabel/2","ref":"wxTreeCtrl.html#editLabel/2"},{"type":"function","doc":"Scrolls and/or expands items to ensure that the given item is visible.\n\nThis method can be used, and will work, even while the window is frozen (see `wxWindow:freeze/1`).","title":"wxTreeCtrl.ensureVisible/2","ref":"wxTreeCtrl.html#ensureVisible/2"},{"type":"function","doc":"Expands the given item.","title":"wxTreeCtrl.expand/2","ref":"wxTreeCtrl.html#expand/2"},{"type":"function","doc":"","title":"wxTreeCtrl.getBoundingRect/2","ref":"wxTreeCtrl.html#getBoundingRect/2"},{"type":"function","doc":"Retrieves the rectangle bounding the `item`.\n\nIf `textOnly` is true, only the rectangle around the item's label will be returned,\notherwise the item's image is also taken into account.\n\nThe return value is true if the rectangle was successfully retrieved or false if it was\nnot (in this case `rect` is not changed) - for example, if the item is currently invisible.\n\nNotice that the rectangle coordinates are logical, not physical ones. So, for example,\nthe x coordinate may be negative if the tree has a horizontal scrollbar and its position\nis not 0.","title":"wxTreeCtrl.getBoundingRect/3","ref":"wxTreeCtrl.html#getBoundingRect/3"},{"type":"function","doc":"","title":"wxTreeCtrl.getChildrenCount/2","ref":"wxTreeCtrl.html#getChildrenCount/2"},{"type":"function","doc":"Returns the number of items in the branch.\n\nIf `recursively` is true, returns the total number of descendants, otherwise only one\nlevel of children is counted.","title":"wxTreeCtrl.getChildrenCount/3","ref":"wxTreeCtrl.html#getChildrenCount/3"},{"type":"function","doc":"Returns the number of items in the control.","title":"wxTreeCtrl.getCount/1","ref":"wxTreeCtrl.html#getCount/1"},{"type":"function","doc":"Returns the edit control being currently used to edit a label.\n\nReturns NULL if no label is being edited.\n\nNote: This is currently only implemented for wxMSW.","title":"wxTreeCtrl.getEditControl/1","ref":"wxTreeCtrl.html#getEditControl/1"},{"type":"function","doc":"Returns the first child; call `getNextChild/3` for the next child.\n\nFor this enumeration function you must pass in a 'cookie' parameter which is opaque for\nthe application but is necessary for the library to make these functions reentrant (i.e.\nallow more than one enumeration on one and the same object simultaneously). The cookie\npassed to `getFirstChild/2` and `getNextChild/3` should be the same variable.\n\nReturns an invalid tree item (i.e. `wxTreeItemId::IsOk()` (not implemented in wx) returns\nfalse) if there are no further children.\n\nSee:\n* `getNextChild/3`\n\n* `getNextSibling/2`","title":"wxTreeCtrl.getFirstChild/2","ref":"wxTreeCtrl.html#getFirstChild/2"},{"type":"function","doc":"Returns the first visible item.","title":"wxTreeCtrl.getFirstVisibleItem/1","ref":"wxTreeCtrl.html#getFirstVisibleItem/1"},{"type":"function","doc":"Returns the normal image list.","title":"wxTreeCtrl.getImageList/1","ref":"wxTreeCtrl.html#getImageList/1"},{"type":"function","doc":"Returns the current tree control indentation.","title":"wxTreeCtrl.getIndent/1","ref":"wxTreeCtrl.html#getIndent/1"},{"type":"function","doc":"Returns the background colour of the item.","title":"wxTreeCtrl.getItemBackgroundColour/2","ref":"wxTreeCtrl.html#getItemBackgroundColour/2"},{"type":"function","doc":"Returns the tree item data associated with the item.","title":"wxTreeCtrl.getItemData/2","ref":"wxTreeCtrl.html#getItemData/2"},{"type":"function","doc":"Returns the font of the item label.\n\nIf the font hadn't been explicitly set for the specified `item` with `setItemFont/3`, returns an invalid\n?wxNullFont font. `wxWindow:getFont/1` can be used to retrieve the global tree control font used for the items\nwithout any specific font.","title":"wxTreeCtrl.getItemFont/2","ref":"wxTreeCtrl.html#getItemFont/2"},{"type":"function","doc":"","title":"wxTreeCtrl.getItemImage/2","ref":"wxTreeCtrl.html#getItemImage/2"},{"type":"function","doc":"Gets the specified item image.\n\nThe value of `which` may be:\n\n* ?wxTreeItemIcon\\_Normal: to get the normal item image.\n\n* ?wxTreeItemIcon\\_Selected: to get the selected item image (i.e. the image which is shown\nwhen the item is currently selected).\n\n* ?wxTreeItemIcon\\_Expanded: to get the expanded image (this only makes sense for items\nwhich have children - then this image is shown when the item is expanded and the normal\nimage is shown when it is collapsed).\n\n* ?wxTreeItemIcon\\_SelectedExpanded: to get the selected expanded image (which is shown\nwhen an expanded item is currently selected).","title":"wxTreeCtrl.getItemImage/3","ref":"wxTreeCtrl.html#getItemImage/3"},{"type":"function","doc":"Returns the item's parent.","title":"wxTreeCtrl.getItemParent/2","ref":"wxTreeCtrl.html#getItemParent/2"},{"type":"function","doc":"Returns the item label.","title":"wxTreeCtrl.getItemText/2","ref":"wxTreeCtrl.html#getItemText/2"},{"type":"function","doc":"Returns the colour of the item label.","title":"wxTreeCtrl.getItemTextColour/2","ref":"wxTreeCtrl.html#getItemTextColour/2"},{"type":"function","doc":"Returns the last child of the item (or an invalid tree item if this item has no\nchildren).\n\nSee:\n* `getFirstChild/2`\n\n* `getNextSibling/2`\n\n* `getLastChild/2`","title":"wxTreeCtrl.getLastChild/2","ref":"wxTreeCtrl.html#getLastChild/2"},{"type":"function","doc":"Returns the next child; call `getFirstChild/2` for the first child.\n\nFor this enumeration function you must pass in a 'cookie' parameter which is opaque for\nthe application but is necessary for the library to make these functions reentrant (i.e.\nallow more than one enumeration on one and the same object simultaneously). The cookie\npassed to `getFirstChild/2` and `getNextChild/3` should be the same.\n\nReturns an invalid tree item if there are no further children.\n\nSee: `getFirstChild/2`","title":"wxTreeCtrl.getNextChild/3","ref":"wxTreeCtrl.html#getNextChild/3"},{"type":"function","doc":"Returns the next sibling of the specified item; call `getPrevSibling/2` for the previous\nsibling.\n\nReturns an invalid tree item if there are no further siblings.\n\nSee: `getPrevSibling/2`","title":"wxTreeCtrl.getNextSibling/2","ref":"wxTreeCtrl.html#getNextSibling/2"},{"type":"function","doc":"Returns the next visible item or an invalid item if this item is the last visible one.\n\nNote: The `item` itself must be visible.","title":"wxTreeCtrl.getNextVisible/2","ref":"wxTreeCtrl.html#getNextVisible/2"},{"type":"function","doc":"Returns the previous sibling of the specified item; call `getNextSibling/2` for the next\nsibling.\n\nReturns an invalid tree item if there are no further children.\n\nSee: `getNextSibling/2`","title":"wxTreeCtrl.getPrevSibling/2","ref":"wxTreeCtrl.html#getPrevSibling/2"},{"type":"function","doc":"Returns the previous visible item or an invalid item if this item is the first visible\none.\n\nNote: The `item` itself must be visible.","title":"wxTreeCtrl.getPrevVisible/2","ref":"wxTreeCtrl.html#getPrevVisible/2"},{"type":"function","doc":"Returns the root item for the tree control.","title":"wxTreeCtrl.getRootItem/1","ref":"wxTreeCtrl.html#getRootItem/1"},{"type":"function","doc":"Returns the selection, or an invalid item if there is no selection.\n\nThis function only works with the controls without `wxTR_MULTIPLE` style, use `getSelections/1` for the\ncontrols which do have this style or, if a single item is wanted, use `GetFocusedItem()`\n(not implemented in wx).","title":"wxTreeCtrl.getSelection/1","ref":"wxTreeCtrl.html#getSelection/1"},{"type":"function","doc":"Fills the array of tree items passed in with the currently selected items.\n\nThis function can be called only if the control has the `wxTR_MULTIPLE` style.\n\nReturns the number of selected items.","title":"wxTreeCtrl.getSelections/1","ref":"wxTreeCtrl.html#getSelections/1"},{"type":"function","doc":"Returns the state image list (from which application-defined state images are taken).","title":"wxTreeCtrl.getStateImageList/1","ref":"wxTreeCtrl.html#getStateImageList/1"},{"type":"function","doc":"Calculates which (if any) item is under the given `point`, returning the tree item id at\nthis point plus extra information `flags`.\n\n`flags` is a bitlist of the following:\n\n* `wxTREE_HITTEST_ABOVE:` Above the client area.\n\n* `wxTREE_HITTEST_BELOW:` Below the client area.\n\n* `wxTREE_HITTEST_NOWHERE:` In the client area but below the last item.\n\n* `wxTREE_HITTEST_ONITEMBUTTON:` On the button associated with an item.\n\n* `wxTREE_HITTEST_ONITEMICON:` On the bitmap associated with an item.\n\n* `wxTREE_HITTEST_ONITEMINDENT:` In the indentation associated with an item.\n\n* `wxTREE_HITTEST_ONITEMLABEL:` On the label (string) associated with an item.\n\n* `wxTREE_HITTEST_ONITEMRIGHT:` In the area to the right of an item.\n\n* `wxTREE_HITTEST_ONITEMSTATEICON:` On the state icon for a tree view item that is in a\nuser-defined state.\n\n* `wxTREE_HITTEST_TOLEFT:` To the right of the client area.\n\n* `wxTREE_HITTEST_TORIGHT:` To the left of the client area.","title":"wxTreeCtrl.hitTest/2","ref":"wxTreeCtrl.html#hitTest/2"},{"type":"function","doc":"","title":"wxTreeCtrl.insertItem/4","ref":"wxTreeCtrl.html#insertItem/4"},{"type":"function","doc":"Inserts an item after a given one (`previous`).\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","title":"wxTreeCtrl.insertItem/5","ref":"wxTreeCtrl.html#insertItem/5"},{"type":"function","doc":"Returns true if the given item is in bold state.\n\nSee: `setItemBold/3`","title":"wxTreeCtrl.isBold/2","ref":"wxTreeCtrl.html#isBold/2"},{"type":"function","doc":"Returns true if the item is expanded (only makes sense if it has children).","title":"wxTreeCtrl.isExpanded/2","ref":"wxTreeCtrl.html#isExpanded/2"},{"type":"function","doc":"Returns true if the item is selected.","title":"wxTreeCtrl.isSelected/2","ref":"wxTreeCtrl.html#isSelected/2"},{"type":"function","doc":"Returns true if the item is valid.","title":"wxTreeCtrl.isTreeItemIdOk/1","ref":"wxTreeCtrl.html#isTreeItemIdOk/1"},{"type":"function","doc":"Returns true if the item is visible on the screen.","title":"wxTreeCtrl.isVisible/2","ref":"wxTreeCtrl.html#isVisible/2"},{"type":"function","doc":"Returns true if the item has children.","title":"wxTreeCtrl.itemHasChildren/2","ref":"wxTreeCtrl.html#itemHasChildren/2"},{"type":"function","doc":"Default Constructor.","title":"wxTreeCtrl.new/0","ref":"wxTreeCtrl.html#new/0"},{"type":"function","doc":"","title":"wxTreeCtrl.new/1","ref":"wxTreeCtrl.html#new/1"},{"type":"function","doc":"Constructor, creating and showing a tree control.\n\nSee: `create/3`","title":"wxTreeCtrl.new/2","ref":"wxTreeCtrl.html#new/2"},{"type":"function","doc":"","title":"wxTreeCtrl.prependItem/3","ref":"wxTreeCtrl.html#prependItem/3"},{"type":"function","doc":"Appends an item as the first child of `parent`, return a new item id.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","title":"wxTreeCtrl.prependItem/4","ref":"wxTreeCtrl.html#prependItem/4"},{"type":"function","doc":"Scrolls the specified item into view.\n\nNote that this method doesn't work while the window is frozen (See `wxWindow:freeze/1`), at least under MSW.\n\nSee: `ensureVisible/2`","title":"wxTreeCtrl.scrollTo/2","ref":"wxTreeCtrl.html#scrollTo/2"},{"type":"function","doc":"","title":"wxTreeCtrl.selectItem/2","ref":"wxTreeCtrl.html#selectItem/2"},{"type":"function","doc":"Selects the given item.\n\nIn multiple selection controls, can be also used to deselect a currently selected item if\nthe value of `select` is false.\n\nNotice that calling this method will generate `wxEVT_TREE_SEL_CHANGING` and `wxEVT_TREE_SEL_CHANGED`\nevents and that the change could be vetoed by the former event handler.","title":"wxTreeCtrl.selectItem/3","ref":"wxTreeCtrl.html#selectItem/3"},{"type":"function","doc":"Sets the normal image list.\n\nThe image list assigned with this method will `not` be deleted by `m:wxTreeCtrl`'s\ndestructor, you must delete it yourself.\n\nSee: `assignImageList/2`","title":"wxTreeCtrl.setImageList/2","ref":"wxTreeCtrl.html#setImageList/2"},{"type":"function","doc":"Sets the indentation for the tree control.","title":"wxTreeCtrl.setIndent/2","ref":"wxTreeCtrl.html#setIndent/2"},{"type":"function","doc":"Sets the colour of the item's background.","title":"wxTreeCtrl.setItemBackgroundColour/3","ref":"wxTreeCtrl.html#setItemBackgroundColour/3"},{"type":"function","doc":"","title":"wxTreeCtrl.setItemBold/2","ref":"wxTreeCtrl.html#setItemBold/2"},{"type":"function","doc":"Makes item appear in bold font if `bold` parameter is true or resets it to the normal\nstate.\n\nSee: `isBold/2`","title":"wxTreeCtrl.setItemBold/3","ref":"wxTreeCtrl.html#setItemBold/3"},{"type":"function","doc":"Sets the item client data.\n\nNotice that the client data previously associated with the `item` (if any) is `not` freed\nby this function and so calling this function multiple times for the same item will result\nin memory leaks unless you delete the old item data pointer yourself.","title":"wxTreeCtrl.setItemData/3","ref":"wxTreeCtrl.html#setItemData/3"},{"type":"function","doc":"","title":"wxTreeCtrl.setItemDropHighlight/2","ref":"wxTreeCtrl.html#setItemDropHighlight/2"},{"type":"function","doc":"Gives the item the visual feedback for Drag'n'Drop actions, which is useful if something\nis dragged from the outside onto the tree control (as opposed to a DnD operation within\nthe tree control, which already is implemented internally).","title":"wxTreeCtrl.setItemDropHighlight/3","ref":"wxTreeCtrl.html#setItemDropHighlight/3"},{"type":"function","doc":"Sets the item's font.\n\nAll items in the tree should have the same height to avoid text clipping, so the fonts\nheight should be the same for all of them, although font attributes may vary.\n\nSee: `setItemBold/3`","title":"wxTreeCtrl.setItemFont/3","ref":"wxTreeCtrl.html#setItemFont/3"},{"type":"function","doc":"","title":"wxTreeCtrl.setItemHasChildren/2","ref":"wxTreeCtrl.html#setItemHasChildren/2"},{"type":"function","doc":"Force appearance of the button next to the item.\n\nThis is useful to allow the user to expand the items which don't have any children now,\nbut instead adding them only when needed, thus minimizing memory usage and loading time.","title":"wxTreeCtrl.setItemHasChildren/3","ref":"wxTreeCtrl.html#setItemHasChildren/3"},{"type":"function","doc":"","title":"wxTreeCtrl.setItemImage/3","ref":"wxTreeCtrl.html#setItemImage/3"},{"type":"function","doc":"Sets the specified item's image.\n\nSee `getItemImage/3` for the description of the `which` parameter.","title":"wxTreeCtrl.setItemImage/4","ref":"wxTreeCtrl.html#setItemImage/4"},{"type":"function","doc":"Sets the item label.","title":"wxTreeCtrl.setItemText/3","ref":"wxTreeCtrl.html#setItemText/3"},{"type":"function","doc":"Sets the colour of the item's text.","title":"wxTreeCtrl.setItemTextColour/3","ref":"wxTreeCtrl.html#setItemTextColour/3"},{"type":"function","doc":"Sets the state image list (from which application-defined state images are taken).\n\nImage list assigned with this method will `not` be deleted by `m:wxTreeCtrl`'s\ndestructor, you must delete it yourself.\n\nSee: `assignStateImageList/2`","title":"wxTreeCtrl.setStateImageList/2","ref":"wxTreeCtrl.html#setStateImageList/2"},{"type":"function","doc":"Sets the mode flags associated with the display of the tree control.\n\nThe new mode takes effect immediately.\n\nNote: Generic only; MSW ignores changes.","title":"wxTreeCtrl.setWindowStyle/2","ref":"wxTreeCtrl.html#setWindowStyle/2"},{"type":"function","doc":"Sorts the children of the given item using `OnCompareItems()` (not implemented in wx).\n\nYou should override that method to change the sort order (the default is ascending\ncase-sensitive alphabetical order).","title":"wxTreeCtrl.sortChildren/2","ref":"wxTreeCtrl.html#sortChildren/2"},{"type":"function","doc":"Toggles the given item between collapsed and expanded states.","title":"wxTreeCtrl.toggle/2","ref":"wxTreeCtrl.html#toggle/2"},{"type":"function","doc":"Toggles the given item between selected and unselected states.\n\nFor multiselection controls only.","title":"wxTreeCtrl.toggleItemSelection/2","ref":"wxTreeCtrl.html#toggleItemSelection/2"},{"type":"function","doc":"Removes the selection from the currently selected item (if any).","title":"wxTreeCtrl.unselect/1","ref":"wxTreeCtrl.html#unselect/1"},{"type":"function","doc":"This function either behaves the same as `unselect/1` if the control doesn't have `wxTR\\_MULTIPLE`\nstyle, or removes the selection from all items if it does have this style.","title":"wxTreeCtrl.unselectAll/1","ref":"wxTreeCtrl.html#unselectAll/1"},{"type":"function","doc":"Unselects the given item.\n\nThis works in multiselection controls only.","title":"wxTreeCtrl.unselectItem/2","ref":"wxTreeCtrl.html#unselectItem/2"},{"type":"type","doc":"","title":"wxTreeCtrl.wxTreeCtrl/0","ref":"wxTreeCtrl.html#t:wxTreeCtrl/0"},{"type":"module","doc":"A tree event holds information about events associated with `m:wxTreeCtrl` objects.\n\nTo process input from a tree control, use these event handler macros to direct input to\nmember functions that take a `m:wxTreeEvent` argument.\n\nSee: `m:wxTreeCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxTreeEvent](https://docs.wxwidgets.org/3.2/classwx_tree_event.html)","title":"wxTreeEvent","ref":"wxTreeEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxTreeEventType` to subscribe to events of this type.","title":"Events - wxTreeEvent","ref":"wxTreeEvent.html#module-events"},{"type":"function","doc":"Returns the item (valid for all events).","title":"wxTreeEvent.getItem/1","ref":"wxTreeEvent.html#getItem/1"},{"type":"function","doc":"Returns the key code if the event is a key event.\n\nUse `getKeyEvent/1` to get the values of the modifier keys for this event (i.e. Shift or Ctrl).","title":"wxTreeEvent.getKeyCode/1","ref":"wxTreeEvent.html#getKeyCode/1"},{"type":"function","doc":"Returns the key event for `EVT_TREE_KEY_DOWN` events.","title":"wxTreeEvent.getKeyEvent/1","ref":"wxTreeEvent.html#getKeyEvent/1"},{"type":"function","doc":"Returns the label if the event is a begin or end edit label event.","title":"wxTreeEvent.getLabel/1","ref":"wxTreeEvent.html#getLabel/1"},{"type":"function","doc":"Returns the old item index (valid for `EVT\\_TREE\\_SEL\\_CHANGING` and `EVT\\_TREE\\_SEL\\_CHANGED`\nevents).","title":"wxTreeEvent.getOldItem/1","ref":"wxTreeEvent.html#getOldItem/1"},{"type":"function","doc":"Returns the position of the mouse pointer if the event is a drag or menu-context event.\n\nIn both cases the position is in client coordinates - i.e. relative to the `m:wxTreeCtrl`\nwindow (so that you can pass it directly to e.g. `wxWindow:popupMenu/4`).","title":"wxTreeEvent.getPoint/1","ref":"wxTreeEvent.html#getPoint/1"},{"type":"function","doc":"Returns true if the label edit was cancelled.\n\nThis should be called from within an `EVT_TREE_END_LABEL_EDIT` handler.","title":"wxTreeEvent.isEditCancelled/1","ref":"wxTreeEvent.html#isEditCancelled/1"},{"type":"function","doc":"Set the tooltip for the item (valid for `EVT\\_TREE\\_ITEM\\_GETTOOLTIP` events).\n\nWindows only.","title":"wxTreeEvent.setToolTip/2","ref":"wxTreeEvent.html#setToolTip/2"},{"type":"type","doc":"","title":"wxTreeEvent.wxTree/0","ref":"wxTreeEvent.html#t:wxTree/0"},{"type":"type","doc":"","title":"wxTreeEvent.wxTreeEvent/0","ref":"wxTreeEvent.html#t:wxTreeEvent/0"},{"type":"type","doc":"","title":"wxTreeEvent.wxTreeEventType/0","ref":"wxTreeEvent.html#t:wxTreeEventType/0"},{"type":"module","doc":"This class is an extension of the `m:wxNotebook` class that allows a tree structured set\nof pages to be shown in a control.\n\nA classic example is a netscape preferences dialog that shows a tree of preference\nsections on the left and select section page on the right.\n\nTo use the class simply create it and populate with pages using `insertPage/5`, `insertSubPage/5`, `addPage/4`, `AddSubPage()` (not\nimplemented in wx).\n\nIf your tree is no more than 1 level in depth then you could simply use `addPage/4` and `AddSubPage()`\n(not implemented in wx) to sequentially populate your tree by adding at every step a page\nor a subpage to the end of the tree.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxNotebook`\n\n* `m:wxTreeCtrl`\n\n* `m:wxImageList`\n\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTreebook](https://docs.wxwidgets.org/3.2/classwx_treebook.html)","title":"wxTreebook","ref":"wxTreebook.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`treebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`treebook_page_changing`](`m:wxBookCtrlEvent`)","title":"Events - wxTreebook","ref":"wxTreebook.html#module-events"},{"type":"function","doc":"","title":"wxTreebook.addPage/3","ref":"wxTreebook.html#addPage/3"},{"type":"function","doc":"Adds a new page.\n\nThe page is placed at the topmost level after all other pages. NULL could be specified\nfor page to create an empty page.","title":"wxTreebook.addPage/4","ref":"wxTreebook.html#addPage/4"},{"type":"function","doc":"","title":"wxTreebook.advanceSelection/1","ref":"wxTreebook.html#advanceSelection/1"},{"type":"function","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","title":"wxTreebook.advanceSelection/2","ref":"wxTreebook.html#advanceSelection/2"},{"type":"function","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxTreebook.assignImageList/2","ref":"wxTreebook.html#assignImageList/2"},{"type":"function","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","title":"wxTreebook.changeSelection/2","ref":"wxTreebook.html#changeSelection/2"},{"type":"function","doc":"","title":"wxTreebook.create/3","ref":"wxTreebook.html#create/3"},{"type":"function","doc":"Creates a treebook control.\n\nSee `new/3` for the description of the parameters.","title":"wxTreebook.create/4","ref":"wxTreebook.html#create/4"},{"type":"function","doc":"Deletes all pages.","title":"wxTreebook.deleteAllPages/1","ref":"wxTreebook.html#deleteAllPages/1"},{"type":"function","doc":"Destroys the object","title":"wxTreebook.destroy/1","ref":"wxTreebook.html#destroy/1"},{"type":"function","doc":"","title":"wxTreebook.expandNode/2","ref":"wxTreebook.html#expandNode/2"},{"type":"function","doc":"Expands (collapses) the `pageId` node.\n\nReturns the previous state. May generate page changing events (if selected page is under\nthe collapsed branch, then its parent is autoselected).","title":"wxTreebook.expandNode/3","ref":"wxTreebook.html#expandNode/3"},{"type":"function","doc":"Returns the currently selected page or NULL.","title":"wxTreebook.getCurrentPage/1","ref":"wxTreebook.html#getCurrentPage/1"},{"type":"function","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","title":"wxTreebook.getImageList/1","ref":"wxTreebook.html#getImageList/1"},{"type":"function","doc":"Returns the window at the given page position.","title":"wxTreebook.getPage/2","ref":"wxTreebook.html#getPage/2"},{"type":"function","doc":"Returns the number of pages in the control.","title":"wxTreebook.getPageCount/1","ref":"wxTreebook.html#getPageCount/1"},{"type":"function","doc":"Returns the image index for the given page.","title":"wxTreebook.getPageImage/2","ref":"wxTreebook.html#getPageImage/2"},{"type":"function","doc":"Returns the string for the given page.","title":"wxTreebook.getPageText/2","ref":"wxTreebook.html#getPageText/2"},{"type":"function","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: This method may return either the previously or newly selected page when called\nfrom the EVT_TREEBOOK_PAGE_CHANGED() handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","title":"wxTreebook.getSelection/1","ref":"wxTreebook.html#getSelection/1"},{"type":"function","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","title":"wxTreebook.hitTest/2","ref":"wxTreebook.html#hitTest/2"},{"type":"function","doc":"","title":"wxTreebook.insertPage/4","ref":"wxTreebook.html#insertPage/4"},{"type":"function","doc":"Inserts a new page just before the page indicated by `pagePos`.\n\nThe new page is placed before `pagePos` page and on the same level. NULL could be\nspecified for page to create an empty page.","title":"wxTreebook.insertPage/5","ref":"wxTreebook.html#insertPage/5"},{"type":"function","doc":"","title":"wxTreebook.insertSubPage/4","ref":"wxTreebook.html#insertSubPage/4"},{"type":"function","doc":"Inserts a sub page under the specified page.\n\nNULL could be specified for page to create an empty page.","title":"wxTreebook.insertSubPage/5","ref":"wxTreebook.html#insertSubPage/5"},{"type":"function","doc":"Returns true if the page represented by `pageId` is expanded.","title":"wxTreebook.isNodeExpanded/2","ref":"wxTreebook.html#isNodeExpanded/2"},{"type":"function","doc":"Default constructor.","title":"wxTreebook.new/0","ref":"wxTreebook.html#new/0"},{"type":"function","doc":"","title":"wxTreebook.new/2","ref":"wxTreebook.html#new/2"},{"type":"function","doc":"Creates an empty `m:wxTreebook`.","title":"wxTreebook.new/3","ref":"wxTreebook.html#new/3"},{"type":"function","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","title":"wxTreebook.setImageList/2","ref":"wxTreebook.html#setImageList/2"},{"type":"function","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","title":"wxTreebook.setPageImage/3","ref":"wxTreebook.html#setPageImage/3"},{"type":"function","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","title":"wxTreebook.setPageSize/2","ref":"wxTreebook.html#setPageSize/2"},{"type":"function","doc":"Sets the text for the given page.","title":"wxTreebook.setPageText/3","ref":"wxTreebook.html#setPageText/3"},{"type":"function","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `wxBookCtrlBase:getSelection/1`","title":"wxTreebook.setSelection/2","ref":"wxTreebook.html#setSelection/2"},{"type":"type","doc":"","title":"wxTreebook.wxTreebook/0","ref":"wxTreebook.html#t:wxTreebook/0"},{"type":"module","doc":"This class is used for pseudo-events which are called by wxWidgets to give an application\nthe chance to update various user interface elements.\n\nWithout update UI events, an application has to work hard to check/uncheck,\nenable/disable, show/hide, and set the text for elements such as menu items and toolbar\nbuttons. The code for doing this has to be mixed up with the code that is invoked when an\naction is invoked for a menu item or button.\n\nWith update UI events, you define an event handler to look at the state of the\napplication and change UI elements accordingly. wxWidgets will call your member functions\nin idle time, so you don't have to worry where to call this code.\n\nIn addition to being a clearer and more declarative method, it also means you don't have\nto worry whether you're updating a toolbar or menubar identifier. The same handler can\nupdate a menu item and toolbar button, if the identifier is the same. Instead of directly\nmanipulating the menu or button, you call functions in the event object, such as `check/2`.\nwxWidgets will determine whether such a call has been made, and which UI element to update.\n\nThese events will work for popup menus as well as menubars. Just before a menu is popped\nup, `wxMenu::UpdateUI` (not implemented in wx) is called to process any UI events for the\nwindow that owns the menu.\n\nIf you find that the overhead of UI update processing is affecting your application, you\ncan do one or both of the following:\n\n* Call `setMode/1` with a value of wxUPDATE_UI_PROCESS_SPECIFIED, and set the extra style\nwxWS_EX_PROCESS_UI_UPDATES for every window that should receive update events. No other\nwindows will receive update events.\n\n* Call `setUpdateInterval/1` with a millisecond value to set the delay between updates. You may need to call `wxWindow:updateWindowUI/2` at\ncritical points, for example when a dialog is about to be shown, in case the user sees a\nslight delay before windows are updated.\n\nNote that although events are sent in idle time, defining a `m:wxIdleEvent` handler for\na window does not affect this because the events are sent from `wxWindow::OnInternalIdle`\n(not implemented in wx) which is always called in idle time.\n\nwxWidgets tries to optimize update events on some platforms. On Windows and GTK+, events\nfor menubar items are only sent when the menu is about to be shown, and not in idle time.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxUpdateUIEvent](https://docs.wxwidgets.org/3.2/classwx_update_u_i_event.html)","title":"wxUpdateUIEvent","ref":"wxUpdateUIEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxUpdateUIEventType` to subscribe to events of this type.","title":"Events - wxUpdateUIEvent","ref":"wxUpdateUIEvent.html#module-events"},{"type":"function","doc":"Returns true if it is appropriate to update (send UI update events to) this window.\n\nThis function looks at the mode used (see `setMode/1`), the wxWS_EX_PROCESS_UI_UPDATES flag in `window`,\nthe time update events were last sent in idle time, and the update interval, to determine\nwhether events should be sent to this window now. By default this will always return true\nbecause the update mode is initially wxUPDATE_UI_PROCESS_ALL and the interval is set to 0;\nso update events will be sent as often as possible. You can reduce the frequency that\nevents are sent by changing the mode and/or setting an update interval.\n\nSee:\n* `resetUpdateTime/0`\n\n* `setUpdateInterval/1`\n\n* `setMode/1`","title":"wxUpdateUIEvent.canUpdate/1","ref":"wxUpdateUIEvent.html#canUpdate/1"},{"type":"function","doc":"Check or uncheck the UI element.","title":"wxUpdateUIEvent.check/2","ref":"wxUpdateUIEvent.html#check/2"},{"type":"function","doc":"Enable or disable the UI element.","title":"wxUpdateUIEvent.enable/2","ref":"wxUpdateUIEvent.html#enable/2"},{"type":"function","doc":"Returns true if the UI element should be checked.","title":"wxUpdateUIEvent.getChecked/1","ref":"wxUpdateUIEvent.html#getChecked/1"},{"type":"function","doc":"Returns true if the UI element should be enabled.","title":"wxUpdateUIEvent.getEnabled/1","ref":"wxUpdateUIEvent.html#getEnabled/1"},{"type":"function","doc":"Static function returning a value specifying how wxWidgets will send update events: to\nall windows, or only to those which specify that they will process the events.\n\nSee: `setMode/1`","title":"wxUpdateUIEvent.getMode/0","ref":"wxUpdateUIEvent.html#getMode/0"},{"type":"function","doc":"Returns true if the application has called `check/2`.\n\nFor wxWidgets internal use only.","title":"wxUpdateUIEvent.getSetChecked/1","ref":"wxUpdateUIEvent.html#getSetChecked/1"},{"type":"function","doc":"Returns true if the application has called `enable/2`.\n\nFor wxWidgets internal use only.","title":"wxUpdateUIEvent.getSetEnabled/1","ref":"wxUpdateUIEvent.html#getSetEnabled/1"},{"type":"function","doc":"Returns true if the application has called `show/2`.\n\nFor wxWidgets internal use only.","title":"wxUpdateUIEvent.getSetShown/1","ref":"wxUpdateUIEvent.html#getSetShown/1"},{"type":"function","doc":"Returns true if the application has called `setText/2`.\n\nFor wxWidgets internal use only.","title":"wxUpdateUIEvent.getSetText/1","ref":"wxUpdateUIEvent.html#getSetText/1"},{"type":"function","doc":"Returns true if the UI element should be shown.","title":"wxUpdateUIEvent.getShown/1","ref":"wxUpdateUIEvent.html#getShown/1"},{"type":"function","doc":"Returns the text that should be set for the UI element.","title":"wxUpdateUIEvent.getText/1","ref":"wxUpdateUIEvent.html#getText/1"},{"type":"function","doc":"Returns the current interval between updates in milliseconds.\n\nThe value -1 disables updates, 0 updates as frequently as possible.\n\nSee: `setUpdateInterval/1`","title":"wxUpdateUIEvent.getUpdateInterval/0","ref":"wxUpdateUIEvent.html#getUpdateInterval/0"},{"type":"function","doc":"Used internally to reset the last-updated time to the current time.\n\nIt is assumed that update events are normally sent in idle time, so this is called at the\nend of idle processing.\n\nSee:\n* `canUpdate/1`\n\n* `setUpdateInterval/1`\n\n* `setMode/1`","title":"wxUpdateUIEvent.resetUpdateTime/0","ref":"wxUpdateUIEvent.html#resetUpdateTime/0"},{"type":"function","doc":"Specify how wxWidgets will send update events: to all windows, or only to those which\nspecify that they will process the events.","title":"wxUpdateUIEvent.setMode/1","ref":"wxUpdateUIEvent.html#setMode/1"},{"type":"function","doc":"Sets the text for this UI element.","title":"wxUpdateUIEvent.setText/2","ref":"wxUpdateUIEvent.html#setText/2"},{"type":"function","doc":"Sets the interval between updates in milliseconds.\n\nSet to -1 to disable updates, or to 0 to update as frequently as possible. The default is 0.\n\nUse this to reduce the overhead of UI update events if your application has a lot of\nwindows. If you set the value to -1 or greater than 0, you may also need to call `wxWindow:updateWindowUI/2` at\nappropriate points in your application, such as when a dialog is about to be shown.","title":"wxUpdateUIEvent.setUpdateInterval/1","ref":"wxUpdateUIEvent.html#setUpdateInterval/1"},{"type":"function","doc":"Show or hide the UI element.","title":"wxUpdateUIEvent.show/2","ref":"wxUpdateUIEvent.html#show/2"},{"type":"type","doc":"","title":"wxUpdateUIEvent.wxUpdateUI/0","ref":"wxUpdateUIEvent.html#t:wxUpdateUI/0"},{"type":"type","doc":"","title":"wxUpdateUIEvent.wxUpdateUIEvent/0","ref":"wxUpdateUIEvent.html#t:wxUpdateUIEvent/0"},{"type":"type","doc":"","title":"wxUpdateUIEvent.wxUpdateUIEventType/0","ref":"wxUpdateUIEvent.html#t:wxUpdateUIEventType/0"},{"type":"module","doc":"This control may be used to render web (HTML / CSS / javascript) documents.\n\nIt is designed to allow the creation of multiple backends for each port, although\ncurrently just one is available. It differs from `m:wxHtmlWindow` in that each backend is\nactually a full rendering engine, Trident on MSW and Webkit on macOS and GTK. This allows\nthe correct viewing of complex pages with javascript and css.\n\nBackend Descriptions\n\nPar:\n\nThe IE backend uses Microsoft's Trident rendering engine, specifically the version used\nby the locally installed copy of Internet Explorer. As such it is only available for the\nMSW port. By default recent versions of the [WebBrowser](http://msdn.microsoft.com/en-us/library/aa752085%28v=VS.85%29.aspx)\ncontrol, which this backend uses, emulate Internet Explorer 7. This can be changed with a\nregistry setting by wxWebView::MSWSetEmulationLevel() see [this](http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx#browser_emulation)\narticle for more information. This backend has full support for custom schemes and\nvirtual file systems.\n\nPar:\n\nThe Edge (Chromium) backend uses Microsoft's [Edge WebView2](https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2).\nIt is available for Windows 7 and newer. The following features are currently unsupported\nwith this backend: virtual filesystems, custom urls, find.\n\nThis backend is not enabled by default, to build it follow these steps:\n\n* Visual Studio 2015, or newer, is required\n\n* Download the [WebView2 SDK](https://aka.ms/webviewnuget) nuget package (Version 0.9.488\nor newer)\n\n* Extract the package (it's a zip archive) to `wxWidgets/3rdparty/webview2` (you should\nhave `3rdparty/webview2/build/native/include/WebView2.h` file after unpacking it)\n\n* Enable `wxUSE_WEBVIEW_EDGE` in CMake or `setup.h`\n\n* Build wxWidgets webview library\n\n* Copy `WebView2Loader.dll` from the subdirectory corresponding to the architecture used\n(x86 or x64) of `wxWidgets/3rdparty/webview2/build/` to your applications executable\n\n* At runtime you can use `isBackendAvailable/1` to check if the backend can be used (it will be available if `WebView2Loader.dll`\ncan be loaded and Edge (Chromium) is installed)\n\n* Make sure to add a note about using the WebView2 SDK to your application documentation,\nas required by its licence\n\nPar:\n\nUnder GTK the WebKit backend uses [WebKitGTK+](http://webkitgtk.org/). The current\nminimum version required is 1.3.1 which ships by default with Ubuntu Natty and Debian\nWheezy and has the package name libwebkitgtk-dev. Custom schemes and virtual files systems\nare supported under this backend, however embedded resources such as images and\nstylesheets are currently loaded using the data:// scheme.\n\nPar:\n\nUnder GTK3 the WebKit2 version of [WebKitGTK+](http://webkitgtk.org/) is used. In Ubuntu\nthe required package name is libwebkit2gtk-4.0-dev and under Fedora it is\nwebkitgtk4-devel. All wxWEBVIEW_WEBKIT features are supported except for clearing and\nenabling / disabling the history.\n\nPar:\n\nThe macOS WebKit backend uses Apple's [WebView](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/doc/uid/20001903)\nclass. This backend has full support for custom schemes and virtual file systems.\n\nAsynchronous Notifications\n\nMany of the methods in `m:wxWebView` are asynchronous, i.e. they return immediately and\nperform their work in the background. This includes functions such as `loadURL/2` and `reload/2`. To receive\nnotification of the progress and completion of these functions you need to handle the\nevents that are provided. Specifically `wxEVT_WEBVIEW_LOADED` notifies when the page or a\nsub-frame has finished loading and `wxEVT_WEBVIEW_ERROR` notifies that an error has occurred.\n\nVirtual File Systems and Custom Schemes\n\n`m:wxWebView` supports the registering of custom scheme handlers, for example `file` or `http`.\nTo do this create a new class which inherits from `wxWebViewHandler` (not implemented in\nwx), where wxWebHandler::GetFile() returns a pointer to a `wxFSFile` (not implemented in\nwx) which represents the given url. You can then register your handler with `RegisterHandler()`\n(not implemented in wx) it will be called for all pages and resources.\n\n`wxWebViewFSHandler` (not implemented in wx) is provided to access the virtual file\nsystem encapsulated by `wxFileSystem` (not implemented in wx). The `wxMemoryFSHandler`\n(not implemented in wx) documentation gives an example of how this may be used.\n\n`wxWebViewArchiveHandler` (not implemented in wx) is provided to allow the navigation of\npages inside a zip archive. It supports paths of the form: `scheme:///C`:/example/docs.zip;protocol=zip/main.htm\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxWebView](https://docs.wxwidgets.org/3.2/classwx_web_view.html)","title":"wxWebView","ref":"wxWebView.html"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`webview_navigating`](`m:wxWebViewEvent`)\n\n* [`webview_navigated`](`m:wxWebViewEvent`)\n\n* [`webview_loaded`](`m:wxWebViewEvent`)\n\n* [`webview_error`](`m:wxWebViewEvent`)\n\n* [`webview_newwindow`](`m:wxWebViewEvent`)\n\n* [`webview_title_changed`](`m:wxWebViewEvent`)","title":"Events - wxWebView","ref":"wxWebView.html#module-events"},{"type":"function","doc":"Returns true if the current selection can be copied.\n\nNote: This always returns `true` on the macOS WebKit backend.","title":"wxWebView.canCopy/1","ref":"wxWebView.html#canCopy/1"},{"type":"function","doc":"Returns true if the current selection can be cut.\n\nNote: This always returns `true` on the macOS WebKit backend.","title":"wxWebView.canCut/1","ref":"wxWebView.html#canCut/1"},{"type":"function","doc":"Returns true if it is possible to navigate backward in the history of visited pages.","title":"wxWebView.canGoBack/1","ref":"wxWebView.html#canGoBack/1"},{"type":"function","doc":"Returns true if it is possible to navigate forward in the history of visited pages.","title":"wxWebView.canGoForward/1","ref":"wxWebView.html#canGoForward/1"},{"type":"function","doc":"Returns true if data can be pasted.\n\nNote: This always returns `true` on the macOS WebKit backend.","title":"wxWebView.canPaste/1","ref":"wxWebView.html#canPaste/1"},{"type":"function","doc":"Returns true if there is an action to redo.","title":"wxWebView.canRedo/1","ref":"wxWebView.html#canRedo/1"},{"type":"function","doc":"Retrieve whether the current HTML engine supports a zoom type.\n\nReturn: Whether this type of zoom is supported by this HTML engine (and thus can be set\nthrough `setZoomType/2`).","title":"wxWebView.canSetZoomType/2","ref":"wxWebView.html#canSetZoomType/2"},{"type":"function","doc":"Returns true if there is an action to undo.","title":"wxWebView.canUndo/1","ref":"wxWebView.html#canUndo/1"},{"type":"function","doc":"Clear the history, this will also remove the visible page.\n\nNote: This is not implemented on the WebKit2GTK+ backend.","title":"wxWebView.clearHistory/1","ref":"wxWebView.html#clearHistory/1"},{"type":"function","doc":"Clears the current selection.","title":"wxWebView.clearSelection/1","ref":"wxWebView.html#clearSelection/1"},{"type":"function","doc":"Copies the current selection.","title":"wxWebView.copy/1","ref":"wxWebView.html#copy/1"},{"type":"function","doc":"Cuts the current selection.","title":"wxWebView.cut/1","ref":"wxWebView.html#cut/1"},{"type":"function","doc":"Deletes the current selection.\n\nNote that for `wxWEBVIEW_BACKEND_WEBKIT` the selection must be editable, either through\nSetEditable or the correct HTML attribute.","title":"wxWebView.deleteSelection/1","ref":"wxWebView.html#deleteSelection/1"},{"type":"function","doc":"","title":"wxWebView.enableContextMenu/1","ref":"wxWebView.html#enableContextMenu/1"},{"type":"function","doc":"Enable or disable the right click context menu.\n\nBy default the standard context menu is enabled, this method can be used to disable it or\nre-enable it later.\n\nSince: 2.9.5","title":"wxWebView.enableContextMenu/2","ref":"wxWebView.html#enableContextMenu/2"},{"type":"function","doc":"","title":"wxWebView.enableHistory/1","ref":"wxWebView.html#enableHistory/1"},{"type":"function","doc":"Enable or disable the history.\n\nThis will also clear the history.\n\nNote: This is not implemented on the WebKit2GTK+ backend.","title":"wxWebView.enableHistory/2","ref":"wxWebView.html#enableHistory/2"},{"type":"function","doc":"","title":"wxWebView.find/2","ref":"wxWebView.html#find/2"},{"type":"function","doc":"Finds a phrase on the current page and if found, the control will scroll the phrase into\nview and select it.\n\nReturn: If search phrase was not found in combination with the flags then `wxNOT_FOUND`\nis returned. If called for the first time with search phrase then the total number of\nresults will be returned. Then for every time its called with the same search phrase it\nwill return the number of the current match.\n\nNote: This function will restart the search if the flags `wxWEBVIEW_FIND_ENTIRE_WORD` or `wxWEBVIEW_FIND_MATCH_CASE`\nare changed, since this will require a new search. To reset the search, for example\nresetting the highlights call the function with an empty search phrase. This always\nreturns `wxNOT_FOUND` on the macOS WebKit backend.\n\nSince: 2.9.5","title":"wxWebView.find/3","ref":"wxWebView.html#find/3"},{"type":"function","doc":"Get the title of the current web page, or its URL/path if title is not available.","title":"wxWebView.getCurrentTitle/1","ref":"wxWebView.html#getCurrentTitle/1"},{"type":"function","doc":"Get the URL of the currently displayed document.","title":"wxWebView.getCurrentURL/1","ref":"wxWebView.html#getCurrentURL/1"},{"type":"function","doc":"Get the HTML source code of the currently displayed document.\n\nReturn: The HTML source code, or an empty string if no page is currently shown.","title":"wxWebView.getPageSource/1","ref":"wxWebView.html#getPageSource/1"},{"type":"function","doc":"Get the text of the current page.","title":"wxWebView.getPageText/1","ref":"wxWebView.html#getPageText/1"},{"type":"function","doc":"Returns the currently selected source, if any.","title":"wxWebView.getSelectedSource/1","ref":"wxWebView.html#getSelectedSource/1"},{"type":"function","doc":"Returns the currently selected text, if any.","title":"wxWebView.getSelectedText/1","ref":"wxWebView.html#getSelectedText/1"},{"type":"function","doc":"Get the zoom level of the page.\n\nSee `getZoomFactor/1` to get more precise zoom scale value other than as provided by `wxWebViewZoom`.\n\nReturn: The current level of zoom.","title":"wxWebView.getZoom/1","ref":"wxWebView.html#getZoom/1"},{"type":"function","doc":"Get the zoom factor of the page.\n\nReturn: The current factor of zoom.\n\nSince: 3.1.4","title":"wxWebView.getZoomFactor/1","ref":"wxWebView.html#getZoomFactor/1"},{"type":"function","doc":"Get how the zoom factor is currently interpreted.\n\nReturn: How the zoom factor is currently interpreted by the HTML engine.","title":"wxWebView.getZoomType/1","ref":"wxWebView.html#getZoomType/1"},{"type":"function","doc":"Navigate back in the history of visited pages.\n\nOnly valid if `canGoBack/1` returns true.","title":"wxWebView.goBack/1","ref":"wxWebView.html#goBack/1"},{"type":"function","doc":"Navigate forward in the history of visited pages.\n\nOnly valid if `canGoForward/1` returns true.","title":"wxWebView.goForward/1","ref":"wxWebView.html#goForward/1"},{"type":"function","doc":"Returns true if there is a current selection.","title":"wxWebView.hasSelection/1","ref":"wxWebView.html#hasSelection/1"},{"type":"function","doc":"Allows to check if a specific backend is currently available.\n\nSince: 3.1.4","title":"wxWebView.isBackendAvailable/1","ref":"wxWebView.html#isBackendAvailable/1"},{"type":"function","doc":"Returns whether the web control is currently busy (e.g. loading a page).","title":"wxWebView.isBusy/1","ref":"wxWebView.html#isBusy/1"},{"type":"function","doc":"Returns true if a context menu will be shown on right click.\n\nSince: 2.9.5","title":"wxWebView.isContextMenuEnabled/1","ref":"wxWebView.html#isContextMenuEnabled/1"},{"type":"function","doc":"Returns whether the web control is currently editable.","title":"wxWebView.isEditable/1","ref":"wxWebView.html#isEditable/1"},{"type":"function","doc":"Load a web page from a URL.\n\nNote: Web engines generally report errors asynchronously, so if you wish to know whether\nloading the URL was successful, register to receive navigation error events.","title":"wxWebView.loadURL/2","ref":"wxWebView.html#loadURL/2"},{"type":"function","doc":"","title":"wxWebView.new/2","ref":"wxWebView.html#new/2"},{"type":"function","doc":"Factory function to create a new `m:wxWebView` using a `wxWebViewFactory` (not\nimplemented in wx).\n\nReturn: The created `m:wxWebView`, or `NULL` if the requested backend is not available\n\nSince: 2.9.5","title":"wxWebView.new/3","ref":"wxWebView.html#new/3"},{"type":"function","doc":"Pastes the current data.","title":"wxWebView.paste/1","ref":"wxWebView.html#paste/1"},{"type":"function","doc":"Opens a print dialog so that the user may print the currently displayed page.","title":"wxWebView.print/1","ref":"wxWebView.html#print/1"},{"type":"function","doc":"Redos the last action.","title":"wxWebView.redo/1","ref":"wxWebView.html#redo/1"},{"type":"function","doc":"","title":"wxWebView.reload/1","ref":"wxWebView.html#reload/1"},{"type":"function","doc":"Reload the currently displayed URL.\n\nNote: The flags are ignored by the edge backend.","title":"wxWebView.reload/2","ref":"wxWebView.html#reload/2"},{"type":"function","doc":"Runs the given JavaScript code.\n\nJavaScript code is executed inside the browser control and has full access to DOM and\nother browser-provided functionality. For example, this code will replace the current\npage contents with the provided string.\n\nIf `output` is non-null, it is filled with the result of executing this code on success,\ne.g. a JavaScript value such as a string, a number (integer or floating point), a boolean\nor JSON representation for non-primitive types such as arrays and objects. For example:\n\nThis function has a few platform-specific limitations:\n\n* When using WebKit v1 in wxGTK2, retrieving the result of JavaScript execution is\nunsupported and this function will always return false if `output` is non-null to indicate\nthis. This functionality is fully supported when using WebKit v2 or later in wxGTK3.\n\n* When using WebKit under macOS, code execution is limited to at most 10MiB of memory and\n10 seconds of execution time.\n\n* When using IE backend under MSW, scripts can only be executed when the current page is\nfully loaded (i.e. `wxEVT_WEBVIEW_LOADED` event was received). A script tag inside the\npage HTML is required in order to run JavaScript.\n\nAlso notice that under MSW converting JavaScript objects to JSON is not supported in the\ndefault emulation mode. `m:wxWebView` implements its own object-to-JSON conversion as a\nfallback for this case, however it is not as full-featured, well-tested or performing as\nthe implementation of this functionality in the browser control itself, so it is\nrecommended to use MSWSetEmulationLevel() to change emulation level to a more modern one\nin which JSON conversion is done by the control itself.\n\nReturn: true if there is a result, false if there is an error.","title":"wxWebView.runScript/2","ref":"wxWebView.html#runScript/2"},{"type":"function","doc":"Selects the entire page.","title":"wxWebView.selectAll/1","ref":"wxWebView.html#selectAll/1"},{"type":"function","doc":"","title":"wxWebView.setEditable/1","ref":"wxWebView.html#setEditable/1"},{"type":"function","doc":"Set the editable property of the web control.\n\nEnabling allows the user to edit the page even if the `contenteditable` attribute is not\nset. The exact capabilities vary with the backend being used.","title":"wxWebView.setEditable/2","ref":"wxWebView.html#setEditable/2"},{"type":"function","doc":"Set the displayed page source to the contents of the given string.\n\nNote: When using `wxWEBVIEW_BACKEND_IE` you must wait for the current page to finish\nloading before calling `setPage/3`. The baseURL parameter is not used in this backend and the edge\nbackend.","title":"wxWebView.setPage/3","ref":"wxWebView.html#setPage/3"},{"type":"function","doc":"Set the zoom level of the page.\n\nSee `setZoomFactor/2` for more precise scaling other than the measured steps provided by `wxWebViewZoom`.","title":"wxWebView.setZoom/2","ref":"wxWebView.html#setZoom/2"},{"type":"function","doc":"Set the zoom factor of the page.\n\nNote: zoom scale in IE will be converted into `wxWebViewZoom` levels for `wxWebViewZoomType`\nof `wxWEBVIEW_ZOOM_TYPE_TEXT`.\n\nSince: 3.1.4","title":"wxWebView.setZoomFactor/2","ref":"wxWebView.html#setZoomFactor/2"},{"type":"function","doc":"Set how to interpret the zoom factor.\n\nNote: invoke `canSetZoomType/2` first, some HTML renderers may not support all zoom types.","title":"wxWebView.setZoomType/2","ref":"wxWebView.html#setZoomType/2"},{"type":"function","doc":"Stop the current page loading process, if any.\n\nMay trigger an error event of type `wxWEBVIEW_NAV_ERR_USER_CANCELLED`. TODO: make `wxWEBVIEW_NAV_ERR_USER_CANCELLED`\nerrors uniform across ports.","title":"wxWebView.stop/1","ref":"wxWebView.html#stop/1"},{"type":"function","doc":"Undos the last action.","title":"wxWebView.undo/1","ref":"wxWebView.html#undo/1"},{"type":"type","doc":"","title":"wxWebView.wxWebView/0","ref":"wxWebView.html#t:wxWebView/0"},{"type":"module","doc":"A navigation event holds information about events associated with `m:wxWebView` objects.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWebViewEvent](https://docs.wxwidgets.org/3.2/classwx_web_view_event.html)","title":"wxWebViewEvent","ref":"wxWebViewEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxWebViewEventType` to subscribe to events of this type.","title":"Events - wxWebViewEvent","ref":"wxWebViewEvent.html#module-events"},{"type":"function","doc":"Returns the integer identifier corresponding to a listbox, choice or radiobox selection\n(only if the event was a selection, not a deselection), or a boolean value representing\nthe value of a checkbox.\n\nFor a menu item, this method returns -1 if the item is not checkable or a boolean value\n(true or false) for checkable items indicating the new state of the item.","title":"wxWebViewEvent.getInt/1","ref":"wxWebViewEvent.html#getInt/1"},{"type":"function","doc":"Returns item string for a listbox or choice selection event.\n\nIf one or several items have been deselected, returns the index of the first deselected\nitem. If some items have been selected and others deselected at the same time, it will\nreturn the index of the first selected item.","title":"wxWebViewEvent.getString/1","ref":"wxWebViewEvent.html#getString/1"},{"type":"function","doc":"Get the name of the target frame which the url of this event has been or will be loaded\ninto.\n\nThis may return an empty string if the frame is not available.","title":"wxWebViewEvent.getTarget/1","ref":"wxWebViewEvent.html#getTarget/1"},{"type":"function","doc":"Get the URL being visited.","title":"wxWebViewEvent.getURL/1","ref":"wxWebViewEvent.html#getURL/1"},{"type":"type","doc":"","title":"wxWebViewEvent.wxWebView/0","ref":"wxWebViewEvent.html#t:wxWebView/0"},{"type":"type","doc":"","title":"wxWebViewEvent.wxWebViewEvent/0","ref":"wxWebViewEvent.html#t:wxWebViewEvent/0"},{"type":"type","doc":"","title":"wxWebViewEvent.wxWebViewEventType/0","ref":"wxWebViewEvent.html#t:wxWebViewEventType/0"},{"type":"module","doc":"`m:wxWindow` is the base class for all windows and represents any visible object on\nscreen.\n\nAll controls, top level windows and so on are windows. Sizers and device contexts are\nnot, however, as they don't appear on screen themselves.\n\nPlease note that all children of the window will be deleted automatically by the\ndestructor before the window itself is deleted which means that you don't have to worry\nabout deleting them manually. Please see the window deletion overview for more information.\n\nAlso note that in this, and many others, wxWidgets classes some `GetXXX()` methods may be\noverloaded (as, for example, `getSize/1` or `getClientSize/1`). In this case, the overloads are non-virtual because\nhaving multiple virtual functions with the same name results in a virtual function name\nhiding at the derived class level (in English, this means that the derived class has to\noverride all overloaded variants if it overrides any of them). To allow overriding them in\nthe derived class, wxWidgets uses a unique protected virtual `DoGetXXX()` method and all `GetXXX()`\nones are forwarded to it, so overriding the former changes the behaviour of the latter.","title":"wxWindow","ref":"wxWindow.html"},{"type":"module","doc":"This class supports the following styles:\n\n* wxBORDER_DEFAULT: The window class will decide the kind of border to show, if any.\n\n* wxBORDER_SIMPLE: Displays a thin border around the window. wxSIMPLE_BORDER is the old\nname for this style.\n\n* wxBORDER_SUNKEN: Displays a sunken border. wxSUNKEN_BORDER is the old name for this\nstyle.\n\n* wxBORDER_RAISED: Displays a raised border. wxRAISED_BORDER is the old name for this\nstyle.\n\n* wxBORDER_STATIC: Displays a border suitable for a static control. wxSTATIC_BORDER is the\nold name for this style. Windows only.\n\n* wxBORDER_THEME: Displays a native border suitable for a control, on the current platform.\nOn Windows, this will be a themed border; on most other platforms a sunken border will be\nused. For more information for themed borders on Windows, please see Themed borders on\nWindows.\n\n* wxBORDER_NONE: Displays no border, overriding the default border style for the window.\nwxNO_BORDER is the old name for this style.\n\n* wxBORDER_DOUBLE: This style is obsolete and should not be used.\n\n* wxTRANSPARENT_WINDOW: The window is transparent, that is, it will not receive paint\nevents. Windows only.\n\n* wxTAB_TRAVERSAL: This style is used by wxWidgets for the windows supporting TAB\nnavigation among their children, such as `m:wxDialog` and `m:wxPanel`. It should almost\nnever be used in the application code.\n\n* wxWANTS_CHARS: Use this to indicate that the window wants to get all char/key events for\nall keys - even for keys like TAB or ENTER which are usually used for dialog navigation\nand which wouldn't be generated without this style. If you need to use this style in order\nto get the arrows or etc., but would still like to have normal keyboard navigation take\nplace, you should call Navigate in response to the key events for Tab and Shift-Tab.\n\n* wxNO_FULL_REPAINT_ON_RESIZE: On Windows, this style used to disable repainting the window\ncompletely when its size is changed. Since this behaviour is now the default, the style is\nnow obsolete and no longer has an effect.\n\n* wxVSCROLL: Use this style to enable a vertical scrollbar. Notice that this style cannot\nbe used with native controls which don't support scrollbars nor with top-level windows in\nmost ports.\n\n* wxHSCROLL: Use this style to enable a horizontal scrollbar. The same limitations as for\nwxVSCROLL apply to this style.\n\n* wxALWAYS_SHOW_SB: If a window has scrollbars, disable them instead of hiding them when\nthey are not needed (i.e. when the size of the window is big enough to not require the\nscrollbars to navigate it). This style is currently implemented for wxMSW, wxGTK and\nwxUniversal and does nothing on the other platforms.\n\n* wxCLIP_CHILDREN: Use this style to eliminate flicker caused by the background being\nrepainted, then children being painted over them. Windows only.\n\n* wxFULL_REPAINT_ON_RESIZE: Use this style to force a complete redraw of the window\nwhenever it is resized instead of redrawing just the part of the window affected by\nresizing. Note that this was the behaviour by default before 2.5.1 release and that if you\nexperience redraw problems with code which previously used to work you may want to try\nthis. Currently this style applies on GTK+ 2 and Windows only, and full repainting is\nalways done on other platforms.","title":"Styles - wxWindow","ref":"wxWindow.html#module-styles"},{"type":"module","doc":"This class supports the following extra styles:\n\n* wxWS_EX_BLOCK_EVENTS: wxCommandEvents and the objects of the derived classes are\nforwarded to the parent window and so on recursively by default. Using this flag for the\ngiven window allows blocking this propagation at this window, i.e. prevent the events from\nbeing propagated further upwards. Dialogs have this flag on by default for the reasons\nexplained in the overview_events.\n\n* wxWS_EX_TRANSIENT: Don't use this window as an implicit parent for the other windows:\nthis must be used with transient windows as otherwise there is the risk of creating a\ndialog/frame with this window as a parent, which would lead to a crash if the parent were\ndestroyed before the child.\n\n* wxWS_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. This style cannot be used (because of\nthe underlying native behaviour) together with `wxMAXIMIZE_BOX` or `wxMINIMIZE_BOX`, so\nthese two styles are automatically turned off if this one is used.\n\n* wxWS_EX_PROCESS_IDLE: This window should always process idle events, even if the mode set\nby `wxIdleEvent:setMode/1` is `wxIDLE_PROCESS_SPECIFIED`.\n\n* wxWS_EX_PROCESS_UI_UPDATES: This window should always process UI update events, even if\nthe mode set by `wxUpdateUIEvent:setMode/1` is `wxUPDATE_UI_PROCESS_SPECIFIED`.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxWindow](https://docs.wxwidgets.org/3.2/classwx_window.html)","title":"Extra Styles - wxWindow","ref":"wxWindow.html#module-extra-styles"},{"type":"module","doc":"Event types emitted from this class:\n\n* [`activate`](`m:wxActivateEvent`)\n\n* [`child_focus`](`m:wxChildFocusEvent`)\n\n* [`context_menu`](`m:wxContextMenuEvent`)\n\n* [`help`](`m:wxHelpEvent`)\n\n* [`drop_files`](`m:wxDropFilesEvent`)\n\n* [`erase_background`](`m:wxEraseEvent`)\n\n* [`set_focus`](`m:wxFocusEvent`)\n\n* [`kill_focus`](`m:wxFocusEvent`)\n\n* [`idle`](`m:wxIdleEvent`)\n\n* [`joy_button_down`](`m:wxJoystickEvent`)\n\n* [`joy_button_up`](`m:wxJoystickEvent`)\n\n* [`joy_move`](`m:wxJoystickEvent`)\n\n* [`joy_zmove`](`m:wxJoystickEvent`)\n\n* [`key_down`](`m:wxKeyEvent`)\n\n* [`key_up`](`m:wxKeyEvent`)\n\n* [`char`](`m:wxKeyEvent`)\n\n* [`char_hook`](`m:wxKeyEvent`)\n\n* [`mouse_capture_lost`](`m:wxMouseCaptureLostEvent`)\n\n* [`mouse_capture_changed`](`m:wxMouseCaptureChangedEvent`)\n\n* [`left_down`](`m:wxMouseEvent`)\n\n* [`left_up`](`m:wxMouseEvent`)\n\n* [`middle_down`](`m:wxMouseEvent`)\n\n* [`middle_up`](`m:wxMouseEvent`)\n\n* [`right_down`](`m:wxMouseEvent`)\n\n* [`right_up`](`m:wxMouseEvent`)\n\n* [`motion`](`m:wxMouseEvent`)\n\n* [`enter_window`](`m:wxMouseEvent`)\n\n* [`leave_window`](`m:wxMouseEvent`)\n\n* [`left_dclick`](`m:wxMouseEvent`)\n\n* [`middle_dclick`](`m:wxMouseEvent`)\n\n* [`right_dclick`](`m:wxMouseEvent`)\n\n* [`mousewheel`](`m:wxMouseEvent`)\n\n* [`aux1_down`](`m:wxMouseEvent`)\n\n* [`aux1_up`](`m:wxMouseEvent`)\n\n* [`aux1_dclick`](`m:wxMouseEvent`)\n\n* [`aux2_down`](`m:wxMouseEvent`)\n\n* [`aux2_up`](`m:wxMouseEvent`)\n\n* [`aux2_dclick`](`m:wxMouseEvent`)\n\n* [`paint`](`m:wxPaintEvent`)\n\n* [`scrollwin_top`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_bottom`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_lineup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_linedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pageup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pagedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbtrack`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbrelease`](`m:wxScrollWinEvent`)\n\n* [`set_cursor`](`m:wxSetCursorEvent`)\n\n* [`size`](`m:wxSizeEvent`)\n\n* [`sys_colour_changed`](`m:wxSysColourChangedEvent`)","title":"Events - wxWindow","ref":"wxWindow.html#module-events"},{"type":"function","doc":"Sets the cached best size value.\n\nSee: `getBestSize/1`","title":"wxWindow.cacheBestSize/2","ref":"wxWindow.html#cacheBestSize/2"},{"type":"function","doc":"Returns true if the system supports transparent windows and calling `setTransparent/2`\nmay succeed.\n\nIf this function returns false, transparent windows are definitely not supported by the\ncurrent system.","title":"wxWindow.canSetTransparent/1","ref":"wxWindow.html#canSetTransparent/1"},{"type":"function","doc":"Directs all mouse input to this window.\n\nCall `releaseMouse/1` to release the capture.\n\nNote that wxWidgets maintains the stack of windows having captured the mouse and when the\nmouse is released the capture returns to the window which had had captured it previously\nand it is only really released if there were no previous window. In particular, this means\nthat you must release the mouse as many times as you capture it, unless the window\nreceives the `m:wxMouseCaptureLostEvent` event.\n\nAny application which captures the mouse in the beginning of some operation must handle `m:wxMouseCaptureLostEvent`\nand cancel this operation when it receives the event. The event handler must not\nrecapture mouse.\n\nSee:\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`","title":"wxWindow.captureMouse/1","ref":"wxWindow.html#captureMouse/1"},{"type":"function","doc":"","title":"wxWindow.center/1","ref":"wxWindow.html#center/1"},{"type":"function","doc":"Equivalent to: `centre/2`","title":"wxWindow.center/2","ref":"wxWindow.html#center/2"},{"type":"function","doc":"","title":"wxWindow.centerOnParent/1","ref":"wxWindow.html#centerOnParent/1"},{"type":"function","doc":"Equivalent to: `centreOnParent/2`","title":"wxWindow.centerOnParent/2","ref":"wxWindow.html#centerOnParent/2"},{"type":"function","doc":"","title":"wxWindow.centre/1","ref":"wxWindow.html#centre/1"},{"type":"function","doc":"Centres the window.\n\nRemark: If the window is a top level one (i.e. doesn't have a parent), it will be centred\nrelative to the screen anyhow.\n\nSee: `center/2`","title":"wxWindow.centre/2","ref":"wxWindow.html#centre/2"},{"type":"function","doc":"","title":"wxWindow.centreOnParent/1","ref":"wxWindow.html#centreOnParent/1"},{"type":"function","doc":"Centres the window on its parent.\n\nThis is a more readable synonym for `centre/2`.\n\nRemark: This methods provides for a way to centre top level windows over their parents\ninstead of the entire screen. If there is no parent or if the window is not a top level\nwindow, then behaviour is the same as `centre/2`.\n\nSee: `wxTopLevelWindow:centreOnScreen/2`","title":"wxWindow.centreOnParent/2","ref":"wxWindow.html#centreOnParent/2"},{"type":"function","doc":"Clears the window by filling it with the current background colour.\n\nDoes not cause an erase background event to be generated.\n\nNotice that this uses `m:wxClientDC` to draw on the window and the results of doing it\nwhile also drawing on `m:wxPaintDC` for this window are undefined. Hence this method\nshouldn't be used from EVT_PAINT handlers, just use `wxDC:clear/1` on the `m:wxPaintDC` you already use\nthere instead.","title":"wxWindow.clearBackground/1","ref":"wxWindow.html#clearBackground/1"},{"type":"function","doc":"Converts to screen coordinates from coordinates relative to this window.","title":"wxWindow.clientToScreen/2","ref":"wxWindow.html#clientToScreen/2"},{"type":"function","doc":"Converts to screen coordinates from coordinates relative to this window.","title":"wxWindow.clientToScreen/3","ref":"wxWindow.html#clientToScreen/3"},{"type":"function","doc":"","title":"wxWindow.close/1","ref":"wxWindow.html#close/1"},{"type":"function","doc":"This function simply generates a `m:wxCloseEvent` whose handler usually tries to close\nthe window.\n\nIt doesn't close the window itself, however.\n\nReturn: true if the event was handled and not vetoed, false otherwise.\n\nRemark: Close calls the close handler for the window, providing an opportunity for the\nwindow to choose whether to destroy the window. Usually it is only used with the top level\nwindows (`m:wxFrame` and `m:wxDialog` classes) as the others are not supposed to have any\nspecial OnClose() logic. The close handler should check whether the window is being\ndeleted forcibly, using `wxCloseEvent:canVeto/1`, in which case it should destroy the window using `'Destroy'/1`. Note that\ncalling Close does not guarantee that the window will be destroyed; but it provides a way\nto simulate a manual close of a window, which may or may not be implemented by destroying\nthe window. The default implementation of wxDialog::OnCloseWindow does not necessarily\ndelete the dialog, since it will simply simulate an wxID_CANCEL event which is handled by\nthe appropriate button event handler and may do anything at all. To guarantee that the\nwindow will be destroyed, call `'Destroy'/1` instead\n\nSee:\n* `'Destroy'/1`\n\n* `m:wxCloseEvent`","title":"wxWindow.close/2","ref":"wxWindow.html#close/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.convertDialogToPixels/2","ref":"wxWindow.html#convertDialogToPixels/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.convertPixelsToDialog/2","ref":"wxWindow.html#convertPixelsToDialog/2"},{"type":"function","doc":"","title":"wxWindow.create/3","ref":"wxWindow.html#create/3"},{"type":"function","doc":"Construct the actual window object after creating the C++ object.\n\nThe non-default constructor of `m:wxWindow` class does two things: it initializes the C++\nobject and it also creates the window object in the underlying graphical toolkit. The `create/4`\nmethod can be used to perform the second part later, while the default constructor can be\nused to perform the first part only.\n\nPlease note that the underlying window must be created exactly once, i.e. if you use the\ndefault constructor, which doesn't do this, you `must` call `create/4` before using the window and\nif you use the non-default constructor, you can `not` call `create/4`, as the underlying window is\nalready created.\n\nNote that it is possible and, in fact, useful, to call some methods on the object between\ncreating the C++ object itself and calling `create/4` on it, e.g. a common pattern to avoid showing\nthe contents of a window before it is fully initialized is:\n\nAlso note that it is possible to create an object of a derived type and then call `create/4` on it:\nThis is notably used by overview_xrc.\n\nThe parameters of this method have exactly the same meaning as the non-default\nconstructor parameters, please refer to them for their description.\n\nReturn: true if window creation succeeded or false if it failed","title":"wxWindow.create/4","ref":"wxWindow.html#create/4"},{"type":"function","doc":"Destroys the window safely.\n\nUse this function instead of the delete operator, since different window classes can be\ndestroyed differently. Frames and dialogs are not destroyed immediately when this function\nis called - they are added to a list of windows to be deleted on idle time, when all the\nwindow's events have been processed. This prevents problems with events being sent to\nnon-existent windows.\n\nReturn: true if the window has either been successfully deleted, or it has been added to\nthe list of windows pending real deletion.","title":"wxWindow.Destroy/1","ref":"wxWindow.html#Destroy/1"},{"type":"function","doc":"Destroys the object","title":"wxWindow.destroy/1","ref":"wxWindow.html#destroy/1"},{"type":"function","doc":"Destroys all children of a window.\n\nCalled automatically by the destructor.","title":"wxWindow.destroyChildren/1","ref":"wxWindow.html#destroyChildren/1"},{"type":"function","doc":"Disables the window.\n\nSame as `enable/2` Enable(false).\n\nReturn: Returns true if the window has been disabled, false if it had been already\ndisabled before the call to this function.","title":"wxWindow.disable/1","ref":"wxWindow.html#disable/1"},{"type":"function","doc":"Enables or disables eligibility for drop file events (OnDropFiles).\n\nRemark: Windows only until version 2.8.9, available on all platforms since 2.8.10. Cannot\nbe used together with `setDropTarget/2` on non-Windows platforms.\n\nSee: `setDropTarget/2`","title":"wxWindow.dragAcceptFiles/2","ref":"wxWindow.html#dragAcceptFiles/2"},{"type":"function","doc":"","title":"wxWindow.enable/1","ref":"wxWindow.html#enable/1"},{"type":"function","doc":"Enable or disable the window for user input.\n\nNote that when a parent window is disabled, all of its children are disabled as well and\nthey are re-enabled again when the parent is.\n\nA window can be created initially disabled by calling this method on it `before` calling `create/4`\nto create the actual underlying window, e.g.\n\nReturn: Returns true if the window has been enabled or disabled, false if nothing was\ndone, i.e. if the window had already been in the specified state.\n\nSee:\n* `isEnabled/1`\n\n* `disable/1`\n\n* `wxRadioBox:enable/3`","title":"wxWindow.enable/2","ref":"wxWindow.html#enable/2"},{"type":"function","doc":"Finds the window or control which currently has the keyboard focus.\n\nRemark: Note that this is a static function, so it can be called without needing a `m:wxWindow`\npointer.\n\nSee: `setFocus/1`","title":"wxWindow.findFocus/0","ref":"wxWindow.html#findFocus/0"},{"type":"function","doc":"Find a child of this window, by name.\n\nMay return `this` if it matches itself.\n\nNotice that only real children, not top level windows using this window as parent, are\nsearched by this function.","title":"wxWindow.findWindow/2","ref":"wxWindow.html#findWindow/2"},{"type":"function","doc":"","title":"wxWindow.findWindowById/1","ref":"wxWindow.html#findWindowById/1"},{"type":"function","doc":"Find the first window with the given `id`.\n\nIf `parent` is NULL, the search will start from all top-level frames and dialog boxes; if\nnon-NULL, the search will be limited to the given window hierarchy. The search is\nrecursive in both cases.\n\nSee: `findWindow/2`\n\nReturn: Window with the given `id` or NULL if not found.","title":"wxWindow.findWindowById/2","ref":"wxWindow.html#findWindowById/2"},{"type":"function","doc":"","title":"wxWindow.findWindowByLabel/1","ref":"wxWindow.html#findWindowByLabel/1"},{"type":"function","doc":"Find a window by its label.\n\nDepending on the type of window, the label may be a window title or panel item label. If `parent`\nis NULL, the search will start from all top-level frames and dialog boxes; if non-NULL,\nthe search will be limited to the given window hierarchy.\n\nThe search is recursive in both cases and, unlike with `findWindow/2`, recurses into top level child\nwindows too.\n\nSee: `findWindow/2`\n\nReturn: Window with the given `label` or NULL if not found.","title":"wxWindow.findWindowByLabel/2","ref":"wxWindow.html#findWindowByLabel/2"},{"type":"function","doc":"","title":"wxWindow.findWindowByName/1","ref":"wxWindow.html#findWindowByName/1"},{"type":"function","doc":"Find a window by its name (as given in a window constructor or `create/4` function call).\n\nIf `parent` is NULL, the search will start from all top-level frames and dialog boxes; if\nnon-NULL, the search will be limited to the given window hierarchy.\n\nThe search is recursive in both cases and, unlike `findWindow/2`, recurses into top level child windows too.\n\nIf no window with such name is found, `findWindowByLabel/2` is called, i.e. the name is interpreted as\n(internal) name first but if this fails, it's internal as (user-visible) label. As this\nbehaviour may be confusing, it is usually better to use either the `findWindow/2` overload taking the\nname or `findWindowByLabel/2` directly.\n\nReturn: Window with the given `name` or NULL if not found.","title":"wxWindow.findWindowByName/2","ref":"wxWindow.html#findWindowByName/2"},{"type":"function","doc":"Sizes the window to fit its best size.\n\nUsing this function is equivalent to setting window size to the return value of `getBestSize/1`.\n\nNote that, unlike `setSizerAndFit/3`, this function only changes the current window size and doesn't change\nits minimal size.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.fit/1","ref":"wxWindow.html#fit/1"},{"type":"function","doc":"Similar to `fit/1`, but sizes the interior (virtual) size of a window.\n\nMainly useful with scrolled windows to reset scrollbars after sizing changes that do not\ntrigger a size event, and/or scrolled windows without an interior sizer. This function\nsimilarly won't do anything if there are no subwindows.","title":"wxWindow.fitInside/1","ref":"wxWindow.html#fitInside/1"},{"type":"function","doc":"Freezes the window or, in other words, prevents any updates from taking place on screen,\nthe window is not redrawn at all.\n\n`thaw/1` must be called to re-enable window redrawing. Calls to these two functions may be nested\nbut to ensure that the window is properly repainted again, you must thaw it exactly as\nmany times as you froze it.\n\nIf the window has any children, they are recursively frozen too.\n\nThis method is useful for visual appearance optimization (for example, it is a good idea\nto use it before doing many large text insertions in a row into a `m:wxTextCtrl` under\nwxGTK) but is not implemented on all platforms nor for all controls so it is mostly just a\nhint to wxWidgets and not a mandatory directive.\n\nSee:\n* `thaw/1`\n\n* `isFrozen/1`","title":"wxWindow.freeze/1","ref":"wxWindow.html#freeze/1"},{"type":"function","doc":"Convert DPI-independent pixel values to the value in pixels appropriate for the current\ntoolkit.\n\nA DPI-independent pixel is just a pixel at the standard 96 DPI resolution. To keep the\nsame physical size at higher resolution, the physical pixel value must be scaled by `getDPIScaleFactor/1` but\nthis scaling may be already done by the underlying toolkit (GTK+, Cocoa, ...)\nautomatically. This method performs the conversion only if it is not already done by the\nlower level toolkit and so by using it with pixel values you can guarantee that the\nphysical size of the corresponding elements will remain the same in all resolutions under\nall platforms. For example, instead of creating a bitmap of the hard coded size of 32\npixels you should use to avoid using tiny bitmaps on high DPI screens.\n\nNotice that this function is only needed when using hard coded pixel values. It is not\nnecessary if the sizes are already based on the DPI-independent units such as dialog units\nor if you are relying on the controls automatic best size determination and using sizers\nto lay out them.\n\nAlso note that if either component of `sz` has the special value of -1, it is returned\nunchanged independently of the current DPI, to preserve the special value of -1 in\nwxWidgets API (it is often used to mean \"unspecified\").\n\nSince: 3.1.0","title":"wxWindow.fromDIP/2","ref":"wxWindow.html#fromDIP/2"},{"type":"function","doc":"Gets the accelerator table for this window.\n\nSee `m:wxAcceleratorTable`.","title":"wxWindow.getAcceleratorTable/1","ref":"wxWindow.html#getAcceleratorTable/1"},{"type":"function","doc":"Returns the background colour of the window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `setForegroundColour/2`\n\n* `getForegroundColour/1`","title":"wxWindow.getBackgroundColour/1","ref":"wxWindow.html#getBackgroundColour/1"},{"type":"function","doc":"Returns the background style of the window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `getForegroundColour/1`\n\n* `setBackgroundStyle/2`\n\n* `setTransparent/2`","title":"wxWindow.getBackgroundStyle/1","ref":"wxWindow.html#getBackgroundStyle/1"},{"type":"function","doc":"This functions returns the best acceptable minimal size for the window.\n\nFor example, for a static control, it will be the minimal size such that the control\nlabel is not truncated. For windows containing subwindows (typically `m:wxPanel`), the size\nreturned by this function will be the same as the size the window would have had after\ncalling `fit/1`.\n\nOverride virtual `DoGetBestSize()` (not implemented in wx) or, better, because it's\nusually more convenient, `DoGetBestClientSize()` (not implemented in wx) when writing your\nown custom window class to change the value returned by this public non-virtual method.\n\nNotice that the best size respects the minimal and maximal size explicitly set for the\nwindow, if any. So even if some window believes that it needs 200 pixels horizontally,\ncalling `setMaxSize/2` with a width of 100 would ensure that `getBestSize/1` returns the width of at most 100 pixels.\n\nSee:\n* `cacheBestSize/2`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.getBestSize/1","ref":"wxWindow.html#getBestSize/1"},{"type":"function","doc":"Returns the currently captured window.\n\nSee:\n* `hasCapture/1`\n\n* `captureMouse/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","title":"wxWindow.getCapture/0","ref":"wxWindow.html#getCapture/0"},{"type":"function","doc":"Returns the caret() associated with the window.","title":"wxWindow.getCaret/1","ref":"wxWindow.html#getCaret/1"},{"type":"function","doc":"Returns the character height for this window.","title":"wxWindow.getCharHeight/1","ref":"wxWindow.html#getCharHeight/1"},{"type":"function","doc":"Returns the average character width for this window.","title":"wxWindow.getCharWidth/1","ref":"wxWindow.html#getCharWidth/1"},{"type":"function","doc":"Returns a const reference to the list of the window's children.\n\n`wxWindowList` is a type-safe wxList-like class whose elements are of type `wxWindow*`.","title":"wxWindow.getChildren/1","ref":"wxWindow.html#getChildren/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.getClientSize/1","ref":"wxWindow.html#getClientSize/1"},{"type":"function","doc":"Returns the sizer of which this window is a member, if any, otherwise NULL.","title":"wxWindow.getContainingSizer/1","ref":"wxWindow.html#getContainingSizer/1"},{"type":"function","doc":"Returns the factor mapping logical pixels of this window to physical pixels.\n\nThis function can be used to portably determine the number of physical pixels in a window\nof the given size, by multiplying the window size by the value returned from it. I.e. it\nreturns the factor converting window coordinates to \"content view\" coordinates, where the\nview can be just a simple window displaying a `m:wxBitmap` or `m:wxGLCanvas` or any other\nkind of window rendering arbitrary \"content\" on screen.\n\nFor the platforms not doing any pixel mapping, i.e. where logical and physical pixels are\none and the same, this function always returns 1.0 and so using it is, in principle,\nunnecessary and could be avoided by using preprocessor check for `wxHAVE_DPI_INDEPENDENT_PIXELS`\n`not` being defined, however using this function unconditionally under all platforms is\nusually simpler and so preferable.\n\nNote: Current behaviour of this function is compatible with wxWidgets 3.0, but different\nfrom its behaviour in versions 3.1.0 to 3.1.3, where it returned the same value as `getDPIScaleFactor/1`.\nPlease use the other function if you need to use a scaling factor greater than 1.0 even\nfor the platforms without `wxHAVE_DPI_INDEPENDENT_PIXELS`, such as wxMSW.\n\nSince: 2.9.5","title":"wxWindow.getContentScaleFactor/1","ref":"wxWindow.html#getContentScaleFactor/1"},{"type":"function","doc":"Return the cursor associated with this window.\n\nSee: `setCursor/2`","title":"wxWindow.getCursor/1","ref":"wxWindow.html#getCursor/1"},{"type":"function","doc":"Return the DPI of the display used by this window.\n\nThe returned value can be different for different windows on systems with support for\nper-monitor DPI values, such as Microsoft Windows 10.\n\nIf the DPI is not available, returns `{Width,Height}` object.\n\nSee: `wxDisplay:getPPI/1`\n\nSince: 3.1.3","title":"wxWindow.getDPI/1","ref":"wxWindow.html#getDPI/1"},{"type":"function","doc":"Returns the ratio of the DPI used by this window to the standard DPI.\n\nThe returned value is 1 for standard DPI screens or 2 for \"200% scaling\" and, unlike for `getContentScaleFactor/1`,\nis the same under all platforms.\n\nThis factor should be used to increase the size of icons and similar windows whose best\nsize is not based on text metrics when using DPI scaling.\n\nE.g. the program may load a 32px bitmap if the content scale factor is 1.0 or 64px\nversion of the same bitmap if it is 2.0 or bigger.\n\nNotice that this method should `not` be used for window sizes expressed in pixels, as\nthey are already scaled by this factor by the underlying toolkit under some platforms. Use `fromDIP/2`\nfor anything window-related instead.\n\nSince: 3.1.4","title":"wxWindow.getDPIScaleFactor/1","ref":"wxWindow.html#getDPIScaleFactor/1"},{"type":"function","doc":"Returns the associated drop target, which may be NULL.\n\nSee:\n* `setDropTarget/2`\n\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)","title":"wxWindow.getDropTarget/1","ref":"wxWindow.html#getDropTarget/1"},{"type":"function","doc":"Returns the extra style bits for the window.","title":"wxWindow.getExtraStyle/1","ref":"wxWindow.html#getExtraStyle/1"},{"type":"function","doc":"Returns the font for this window.\n\nSee: `setFont/2`","title":"wxWindow.getFont/1","ref":"wxWindow.html#getFont/1"},{"type":"function","doc":"Returns the foreground colour of the window.\n\nRemark: The meaning of foreground colour varies according to the window class; it may be\nthe text colour or other colour, or it may not be used at all.\n\nSee:\n* `setForegroundColour/2`\n\n* `setBackgroundColour/2`\n\n* `getBackgroundColour/1`","title":"wxWindow.getForegroundColour/1","ref":"wxWindow.html#getForegroundColour/1"},{"type":"function","doc":"Returns the grandparent of a window, or NULL if there isn't one.","title":"wxWindow.getGrandParent/1","ref":"wxWindow.html#getGrandParent/1"},{"type":"function","doc":"Returns the platform-specific handle of the physical window.\n\nCast it to an appropriate handle, such as `HWND` for Windows, `Widget` for Motif or `GtkWidget`\nfor GTK.","title":"wxWindow.getHandle/1","ref":"wxWindow.html#getHandle/1"},{"type":"function","doc":"Gets the help text to be used as context-sensitive help for this window.\n\nNote that the text is actually stored by the current `wxHelpProvider` (not implemented in\nwx) implementation, and not in the window object itself.\n\nSee: `setHelpText/2`","title":"wxWindow.getHelpText/1","ref":"wxWindow.html#getHelpText/1"},{"type":"function","doc":"Returns the identifier of the window.\n\nRemark: Each window has an integer identifier. If the application has not provided one\n(or the default wxID_ANY) a unique identifier with a negative value will be generated.\n\nSee:\n* `setId/2`\n\n* [Overview windowids](https://docs.wxwidgets.org/3.2/overview_windowids.html#overview_windowids)","title":"wxWindow.getId/1","ref":"wxWindow.html#getId/1"},{"type":"function","doc":"Generic way of getting a label from any window, for identification purposes.\n\nRemark: The interpretation of this function differs from class to class. For frames and\ndialogs, the value returned is the title. For buttons or static text controls, it is the\nbutton text. This function can be useful for meta-programs (such as testing tools or\nspecial-needs access programs) which need to identify windows by name.","title":"wxWindow.getLabel/1","ref":"wxWindow.html#getLabel/1"},{"type":"function","doc":"Returns the maximum size of the window.\n\nThis is an indication to the sizer layout mechanism that this is the maximum possible\nsize as well as the upper bound on window's size settable using `setSize/6`.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.getMaxSize/1","ref":"wxWindow.html#getMaxSize/1"},{"type":"function","doc":"Returns the minimum size of the window, an indication to the sizer layout mechanism that\nthis is the minimum required size.\n\nThis method normally just returns the value set by `setMinSize/2`, but it can be overridden to do the\ncalculation on demand.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.getMinSize/1","ref":"wxWindow.html#getMinSize/1"},{"type":"function","doc":"Returns the window's name.\n\nRemark: This name is not guaranteed to be unique; it is up to the programmer to supply an\nappropriate name in the window constructor or via `setName/2`.\n\nSee: `setName/2`","title":"wxWindow.getName/1","ref":"wxWindow.html#getName/1"},{"type":"function","doc":"Returns the parent of the window, or NULL if there is no parent.","title":"wxWindow.getParent/1","ref":"wxWindow.html#getParent/1"},{"type":"function","doc":"This gets the position of the window in pixels, relative to the parent window for the\nchild windows or relative to the display origin for the top level windows.\n\nSee: `getScreenPosition/1`","title":"wxWindow.getPosition/1","ref":"wxWindow.html#getPosition/1"},{"type":"function","doc":"Returns the position and size of the window as a {X,Y,W,H} object.\n\nSee: `getScreenRect/1`","title":"wxWindow.getRect/1","ref":"wxWindow.html#getRect/1"},{"type":"function","doc":"Returns the window position in screen coordinates, whether the window is a child window\nor a top level one.\n\nSee: `getPosition/1`","title":"wxWindow.getScreenPosition/1","ref":"wxWindow.html#getScreenPosition/1"},{"type":"function","doc":"Returns the position and size of the window on the screen as a {X,Y,W,H} object.\n\nSee: `getRect/1`","title":"wxWindow.getScreenRect/1","ref":"wxWindow.html#getScreenRect/1"},{"type":"function","doc":"Returns the built-in scrollbar position.\n\nSee: `setScrollbar/6`","title":"wxWindow.getScrollPos/2","ref":"wxWindow.html#getScrollPos/2"},{"type":"function","doc":"Returns the built-in scrollbar range.\n\nSee: `setScrollbar/6`","title":"wxWindow.getScrollRange/2","ref":"wxWindow.html#getScrollRange/2"},{"type":"function","doc":"Returns the built-in scrollbar thumb size.\n\nSee: `setScrollbar/6`","title":"wxWindow.getScrollThumb/2","ref":"wxWindow.html#getScrollThumb/2"},{"type":"function","doc":"See the GetSize(int*,int*) overload for more info.","title":"wxWindow.getSize/1","ref":"wxWindow.html#getSize/1"},{"type":"function","doc":"Returns the sizer associated with the window by a previous call to `setSizer/3`, or NULL.","title":"wxWindow.getSizer/1","ref":"wxWindow.html#getSizer/1"},{"type":"function","doc":"","title":"wxWindow.getTextExtent/2","ref":"wxWindow.html#getTextExtent/2"},{"type":"function","doc":"Gets the dimensions of the string as it would be drawn on the window with the currently\nselected font.\n\nThe text extent is returned in the `w` and `h` pointers.","title":"wxWindow.getTextExtent/3","ref":"wxWindow.html#getTextExtent/3"},{"type":"function","doc":"Returns true if the window uses the system theme for drawing its background.\n\nSee: `setThemeEnabled/2`","title":"wxWindow.getThemeEnabled/1","ref":"wxWindow.html#getThemeEnabled/1"},{"type":"function","doc":"Get the associated tooltip or NULL if none.","title":"wxWindow.getToolTip/1","ref":"wxWindow.html#getToolTip/1"},{"type":"function","doc":"Gets the dimensions of the string as it would be drawn on the window with the currently\nselected font.\n\nReturns the region specifying which parts of the window have been damaged. Should only be\ncalled within an `m:wxPaintEvent` handler.\n\nSee: `m:wxRegion`","title":"wxWindow.getUpdateRegion/1","ref":"wxWindow.html#getUpdateRegion/1"},{"type":"function","doc":"This gets the virtual size of the window in pixels.\n\nBy default it returns the client size of the window, but after a call to `setVirtualSize/3` it will return\nthe size set with that method.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.getVirtualSize/1","ref":"wxWindow.html#getVirtualSize/1"},{"type":"function","doc":"Gets the window style that was passed to the constructor or `create/4` method.\n\n`GetWindowStyle()` (not implemented in wx) is another name for the same function.","title":"wxWindow.getWindowStyleFlag/1","ref":"wxWindow.html#getWindowStyleFlag/1"},{"type":"function","doc":"Returns the value previously passed to `setWindowVariant/2`.","title":"wxWindow.getWindowVariant/1","ref":"wxWindow.html#getWindowVariant/1"},{"type":"function","doc":"Returns true if this window has the current mouse capture.\n\nSee:\n* `captureMouse/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","title":"wxWindow.hasCapture/1","ref":"wxWindow.html#hasCapture/1"},{"type":"function","doc":"Returns true if this window currently has a scroll bar for this orientation.\n\nThis method may return false even when `CanScroll()` (not implemented in wx) for the same\norientation returns true, but if `CanScroll()` (not implemented in wx) returns false, i.e.\nscrolling in this direction is not enabled at all, `hasScrollbar/2` always returns false as well.","title":"wxWindow.hasScrollbar/2","ref":"wxWindow.html#hasScrollbar/2"},{"type":"function","doc":"Returns true if this window background is transparent (as, for example, for `m:wxStaticText`)\nand should show the parent window background.\n\nThis method is mostly used internally by the library itself and you normally shouldn't\nhave to call it. You may, however, have to override it in your wxWindow-derived class to\nensure that background is painted correctly.","title":"wxWindow.hasTransparentBackground/1","ref":"wxWindow.html#hasTransparentBackground/1"},{"type":"function","doc":"Equivalent to calling `show/2`(false).","title":"wxWindow.hide/1","ref":"wxWindow.html#hide/1"},{"type":"function","doc":"This function is (or should be, in case of custom controls) called during window creation\nto intelligently set up the window visual attributes, that is the font and the foreground\nand background colours.\n\nBy \"intelligently\" the following is meant: by default, all windows use their own `GetClassDefaultAttributes()`\n(not implemented in wx) default attributes. However if some of the parents attributes are\nexplicitly (that is, using `setFont/2` and not `setOwnFont/2`) changed and if the corresponding attribute hadn't\nbeen explicitly set for this window itself, then this window takes the same value as used\nby the parent. In addition, if the window overrides `shouldInheritColours/1` to return false, the colours will not\nbe changed no matter what and only the font might.\n\nThis rather complicated logic is necessary in order to accommodate the different usage\nscenarios. The most common one is when all default attributes are used and in this case,\nnothing should be inherited as in modern GUIs different controls use different fonts (and\ncolours) than their siblings so they can't inherit the same value from the parent. However\nit was also deemed desirable to allow to simply change the attributes of all children at\nonce by just changing the font or colour of their common parent, hence in this case we do\ninherit the parents attributes.","title":"wxWindow.inheritAttributes/1","ref":"wxWindow.html#inheritAttributes/1"},{"type":"function","doc":"Sends an `wxEVT\\_INIT\\_DIALOG` event, whose handler usually transfers data to the dialog\nvia validators.","title":"wxWindow.initDialog/1","ref":"wxWindow.html#initDialog/1"},{"type":"function","doc":"Resets the cached best size value so it will be recalculated the next time it is needed.\n\nSee: `cacheBestSize/2`","title":"wxWindow.invalidateBestSize/1","ref":"wxWindow.html#invalidateBestSize/1"},{"type":"function","doc":"Returns true if the window contents is double-buffered by the system, i.e. if any drawing\ndone on the window is really done on a temporary backing surface and transferred to the\nscreen all at once later.\n\nSee: `m:wxBufferedDC`","title":"wxWindow.isDoubleBuffered/1","ref":"wxWindow.html#isDoubleBuffered/1"},{"type":"function","doc":"Returns true if the window is enabled, i.e. if it accepts user input, false otherwise.\n\nNotice that this method can return false even if this window itself hadn't been\nexplicitly disabled when one of its parent windows is disabled. To get the intrinsic\nstatus of this window, use `IsThisEnabled()` (not implemented in wx)\n\nSee: `enable/2`","title":"wxWindow.isEnabled/1","ref":"wxWindow.html#isEnabled/1"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.isExposed/2","ref":"wxWindow.html#isExposed/2"},{"type":"function","doc":"Returns true if the given point or rectangle area has been exposed since the last\nrepaint.\n\nCall this in an paint event handler to optimize redrawing by only redrawing those areas,\nwhich have been exposed.","title":"wxWindow.isExposed/3","ref":"wxWindow.html#isExposed/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.isExposed/5","ref":"wxWindow.html#isExposed/5"},{"type":"function","doc":"Returns true if the window is currently frozen by a call to `freeze/1`.\n\nSee:\n* `freeze/1`\n\n* `thaw/1`","title":"wxWindow.isFrozen/1","ref":"wxWindow.html#isFrozen/1"},{"type":"function","doc":"Returns true if the window is retained, false otherwise.\n\nRemark: Retained windows are only available on X platforms.","title":"wxWindow.isRetained/1","ref":"wxWindow.html#isRetained/1"},{"type":"function","doc":"Returns true if the window is shown, false if it has been hidden.\n\nSee: `isShownOnScreen/1`","title":"wxWindow.isShown/1","ref":"wxWindow.html#isShown/1"},{"type":"function","doc":"Returns true if the window is physically visible on the screen, i.e. it is shown and all\nits parents up to the toplevel window are shown as well.\n\nSee: `isShown/1`","title":"wxWindow.isShownOnScreen/1","ref":"wxWindow.html#isShownOnScreen/1"},{"type":"function","doc":"Returns true if the given window is a top-level one.\n\nCurrently all frames and dialogs are considered to be top-level windows (even if they\nhave a parent window).","title":"wxWindow.isTopLevel/1","ref":"wxWindow.html#isTopLevel/1"},{"type":"function","doc":"Lays out the children of this window using the associated sizer.\n\nIf a sizer hadn't been associated with this window (see `setSizer/3`), this function doesn't do\nanything, unless this is a top level window (see `layout/1`).\n\nNote that this method is called automatically when the window size changes if it has the\nassociated sizer (or if `setAutoLayout/2` with true argument had been explicitly called), ensuring that it\nis always laid out correctly.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)\n\nReturn: Always returns true, the return value is not useful.","title":"wxWindow.layout/1","ref":"wxWindow.html#layout/1"},{"type":"function","doc":"Same as `scrollLines/2` (1).","title":"wxWindow.lineDown/1","ref":"wxWindow.html#lineDown/1"},{"type":"function","doc":"Same as `scrollLines/2` (-1).","title":"wxWindow.lineUp/1","ref":"wxWindow.html#lineUp/1"},{"type":"function","doc":"Lowers the window to the bottom of the window hierarchy (Z-order).\n\nRemark: This function only works for wxTopLevelWindow-derived classes.\n\nSee: `raise/1`","title":"wxWindow.lower/1","ref":"wxWindow.html#lower/1"},{"type":"function","doc":"","title":"wxWindow.move/2","ref":"wxWindow.html#move/2"},{"type":"function","doc":"Moves the window to the given position.\n\nRemark: Implementations of `setSize/6` can also implicitly implement the `move/4` function, which is defined\nin the base `m:wxWindow` class as the call:\n\nSee: `setSize/6`","title":"wxWindow.move/3","ref":"wxWindow.html#move/3"},{"type":"function","doc":"Moves the window to the given position.\n\nRemark: Implementations of SetSize can also implicitly implement the `move/4` function, which is\ndefined in the base `m:wxWindow` class as the call:\n\nSee: `setSize/6`","title":"wxWindow.move/4","ref":"wxWindow.html#move/4"},{"type":"function","doc":"Moves this window in the tab navigation order after the specified `win`.\n\nThis means that when the user presses `TAB` key on that other window, the focus switches\nto this window.\n\nDefault tab order is the same as creation order, this function and `moveBeforeInTabOrder/2` allow to change it\nafter creating all the windows.","title":"wxWindow.moveAfterInTabOrder/2","ref":"wxWindow.html#moveAfterInTabOrder/2"},{"type":"function","doc":"Same as `moveAfterInTabOrder/2` except that it inserts this window just before `win`\ninstead of putting it right after it.","title":"wxWindow.moveBeforeInTabOrder/2","ref":"wxWindow.html#moveBeforeInTabOrder/2"},{"type":"function","doc":"","title":"wxWindow.navigate/1","ref":"wxWindow.html#navigate/1"},{"type":"function","doc":"Performs a keyboard navigation action starting from this window.\n\nThis method is equivalent to calling `NavigateIn()` (not implemented in wx) method on the\nparent window.\n\nReturn: Returns true if the focus was moved to another window or false if nothing changed.\n\nRemark: You may wish to call this from a text control custom keypress handler to do the\ndefault navigation behaviour for the tab key, since the standard default behaviour for a\nmultiline text control with the wxTE_PROCESS_TAB style is to insert a tab and not navigate\nto the next control. See also `m:wxNavigationKeyEvent` and HandleAsNavigationKey.","title":"wxWindow.navigate/2","ref":"wxWindow.html#navigate/2"},{"type":"function","doc":"Default constructor.","title":"wxWindow.new/0","ref":"wxWindow.html#new/0"},{"type":"function","doc":"","title":"wxWindow.new/2","ref":"wxWindow.html#new/2"},{"type":"function","doc":"Constructs a window, which can be a child of a frame, dialog or any other non-control\nwindow.","title":"wxWindow.new/3","ref":"wxWindow.html#new/3"},{"type":"function","doc":"Same as `scrollPages/2` (1).","title":"wxWindow.pageDown/1","ref":"wxWindow.html#pageDown/1"},{"type":"function","doc":"Same as `scrollPages/2` (-1).","title":"wxWindow.pageUp/1","ref":"wxWindow.html#pageUp/1"},{"type":"function","doc":"","title":"wxWindow.popupMenu/2","ref":"wxWindow.html#popupMenu/2"},{"type":"function","doc":"Pops up the given menu at the specified coordinates, relative to this window, and returns\ncontrol when the user has dismissed the menu.\n\nIf a menu item is selected, the corresponding menu event is generated and will be\nprocessed as usual. If coordinates are not specified, the current mouse cursor position is used.\n\n`menu` is the menu to pop up.\n\nThe position where the menu will appear can be specified either as a {X,Y} `pos` or by\ntwo integers (`x` and `y`).\n\nNote that this function switches focus to this window before showing the menu.\n\nRemark: Just before the menu is popped up, `wxMenu::UpdateUI` (not implemented in wx) is\ncalled to ensure that the menu items are in the correct state. The menu does not get\ndeleted by the window. It is recommended to not explicitly specify coordinates when\ncalling PopupMenu in response to mouse click, because some of the ports (namely, wxGTK)\ncan do a better job of positioning the menu in that case.\n\nSee: `m:wxMenu`","title":"wxWindow.popupMenu/3","ref":"wxWindow.html#popupMenu/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.popupMenu/4","ref":"wxWindow.html#popupMenu/4"},{"type":"function","doc":"Raises the window to the top of the window hierarchy (Z-order).\n\nNotice that this function only requests the window manager to raise this window to the\ntop of Z-order. Depending on its configuration, the window manager may raise the window,\nnot do it at all or indicate that a window requested to be raised in some other way, e.g.\nby flashing its icon if it is minimized.\n\nRemark: This function only works for wxTopLevelWindow-derived classes.\n\nSee: `lower/1`","title":"wxWindow.raise/1","ref":"wxWindow.html#raise/1"},{"type":"function","doc":"","title":"wxWindow.refresh/1","ref":"wxWindow.html#refresh/1"},{"type":"function","doc":"Causes this window, and all of its children recursively (except under wxGTK1 where this\nis not implemented), to be repainted.\n\nNote that repainting doesn't happen immediately but only during the next event loop\niteration, if you need to update the window immediately you should use `update/1` instead.\n\nSee: `refreshRect/3`","title":"wxWindow.refresh/2","ref":"wxWindow.html#refresh/2"},{"type":"function","doc":"","title":"wxWindow.refreshRect/2","ref":"wxWindow.html#refreshRect/2"},{"type":"function","doc":"Redraws the contents of the given rectangle: only the area inside it will be repainted.\n\nThis is the same as `refresh/2` but has a nicer syntax as it can be called with a temporary\n{X,Y,W,H} object as argument like this `RefreshRect(wxRect(x, y, w, h))`.","title":"wxWindow.refreshRect/3","ref":"wxWindow.html#refreshRect/3"},{"type":"function","doc":"Releases mouse input captured with `captureMouse/1`.\n\nSee:\n* `captureMouse/1`\n\n* `hasCapture/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","title":"wxWindow.releaseMouse/1","ref":"wxWindow.html#releaseMouse/1"},{"type":"function","doc":"Removes a child window.\n\nThis is called automatically by window deletion functions so should not be required by\nthe application programmer. Notice that this function is mostly internal to wxWidgets and\nshouldn't be called by the user code.","title":"wxWindow.removeChild/2","ref":"wxWindow.html#removeChild/2"},{"type":"function","doc":"Reparents the window, i.e. the window will be removed from its current parent window\n(e.g.\n\na non-standard toolbar in a `m:wxFrame`) and then re-inserted into another.\n\nNotice that currently you need to explicitly call `wxBookCtrlBase:removePage/2` before reparenting a notebook page.","title":"wxWindow.reparent/2","ref":"wxWindow.html#reparent/2"},{"type":"function","doc":"Converts from screen to client window coordinates.","title":"wxWindow.screenToClient/1","ref":"wxWindow.html#screenToClient/1"},{"type":"function","doc":"Converts from screen to client window coordinates.","title":"wxWindow.screenToClient/2","ref":"wxWindow.html#screenToClient/2"},{"type":"function","doc":"Scrolls the window by the given number of lines down (if `lines` is positive) or up.\n\nReturn: Returns true if the window was scrolled, false if it was already on top/bottom\nand nothing was done.\n\nRemark: This function is currently only implemented under MSW and `m:wxTextCtrl` under\nwxGTK (it also works for `wxScrolled` (not implemented in wx) classes under all platforms).\n\nSee: `scrollPages/2`","title":"wxWindow.scrollLines/2","ref":"wxWindow.html#scrollLines/2"},{"type":"function","doc":"Scrolls the window by the given number of pages down (if `pages` is positive) or up.\n\nReturn: Returns true if the window was scrolled, false if it was already on top/bottom\nand nothing was done.\n\nRemark: This function is currently only implemented under MSW and wxGTK.\n\nSee: `scrollLines/2`","title":"wxWindow.scrollPages/2","ref":"wxWindow.html#scrollPages/2"},{"type":"function","doc":"","title":"wxWindow.scrollWindow/3","ref":"wxWindow.html#scrollWindow/3"},{"type":"function","doc":"Physically scrolls the pixels in the window and move child windows accordingly.\n\nRemark: Note that you can often use `wxScrolled` (not implemented in wx) instead of using\nthis function directly.","title":"wxWindow.scrollWindow/4","ref":"wxWindow.html#scrollWindow/4"},{"type":"function","doc":"Sets the accelerator table for this window.\n\nSee `m:wxAcceleratorTable`.","title":"wxWindow.setAcceleratorTable/2","ref":"wxWindow.html#setAcceleratorTable/2"},{"type":"function","doc":"Determines whether the `layout/1` function will be called automatically when the window\nis resized.\n\nThis method is called implicitly by `setSizer/3` but if you use `SetConstraints()` (not implemented\nin wx) you should call it manually or otherwise the window layout won't be correctly\nupdated when its size changes.\n\nSee: `setSizer/3`","title":"wxWindow.setAutoLayout/2","ref":"wxWindow.html#setAutoLayout/2"},{"type":"function","doc":"Sets the background colour of the window.\n\nNotice that as with `setForegroundColour/2`, setting the background colour of a native control may not affect\nthe entire control and could be not supported at all depending on the control and platform.\n\nPlease see `inheritAttributes/1` for explanation of the difference between this method and `setOwnBackgroundColour/2`.\n\nRemark: The background colour is usually painted by the default `m:wxEraseEvent` event\nhandler function under Windows and automatically under GTK. Note that setting the\nbackground colour does not cause an immediate refresh, so you may wish to call `clearBackground/1` or `refresh/2` after\ncalling this function. Using this function will disable attempts to use themes for this\nwindow, if the system supports them. Use with care since usually the themes represent the\nappearance chosen by the user to be used for all applications on the system.\n\nReturn: true if the colour was really changed, false if it was already set to this colour\nand nothing was done.\n\nSee:\n* `getBackgroundColour/1`\n\n* `setForegroundColour/2`\n\n* `getForegroundColour/1`\n\n* `clearBackground/1`\n\n* `refresh/2`\n\n* `m:wxEraseEvent`\n\n* `m:wxSystemSettings`","title":"wxWindow.setBackgroundColour/2","ref":"wxWindow.html#setBackgroundColour/2"},{"type":"function","doc":"Sets the background style of the window.\n\nThe default background style is `wxBG_STYLE_ERASE` which indicates that the window\nbackground may be erased in `EVT_ERASE_BACKGROUND` handler. This is a safe, compatibility\ndefault; however you may want to change it to `wxBG_STYLE_SYSTEM` if you don't define any\nerase background event handlers at all, to avoid unnecessary generation of erase\nbackground events and always let system erase the background. And you should change the\nbackground style to `wxBG_STYLE_PAINT` if you define an `EVT_PAINT` handler which\ncompletely overwrites the window background as in this case erasing it previously, either\nin `EVT_ERASE_BACKGROUND` handler or in the system default handler, would result in\nflicker as the background pixels will be repainted twice every time the window is redrawn.\nDo ensure that the background is entirely erased by your `EVT_PAINT` handler in this case\nhowever as otherwise garbage may be left on screen.\n\nNotice that in previous versions of wxWidgets a common way to work around the above\nmentioned flickering problem was to define an empty `EVT_ERASE_BACKGROUND` handler.\nSetting background style to `wxBG_STYLE_PAINT` is a simpler and more efficient solution to\nthe same problem.\n\nUnder wxGTK and wxOSX, you can use ?wxBG\\_STYLE\\_TRANSPARENT to obtain full transparency\nof the window background. Note that wxGTK supports this only since GTK 2.12 with a\ncompositing manager enabled, call `IsTransparentBackgroundSupported()` (not implemented in\nwx) to check whether this is the case.\n\nAlso, in order for `SetBackgroundStyle(wxBG_STYLE_TRANSPARENT)` to work, it must be\ncalled before `create/4`. If you're using your own wxWindow-derived class you should write your code\nin the following way:\n\nSee:\n* `setBackgroundColour/2`\n\n* `getForegroundColour/1`\n\n* `setTransparent/2`","title":"wxWindow.setBackgroundStyle/2","ref":"wxWindow.html#setBackgroundStyle/2"},{"type":"function","doc":"Sets the caret() associated with the window.","title":"wxWindow.setCaret/2","ref":"wxWindow.html#setCaret/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.setClientSize/2","ref":"wxWindow.html#setClientSize/2"},{"type":"function","doc":"This sets the size of the window client area in pixels.\n\nUsing this function to size a window tends to be more device-independent than `setSize/6`, since the\napplication need not worry about what dimensions the border or title bar have when trying\nto fit the window around panel items, for example.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setClientSize/3","ref":"wxWindow.html#setClientSize/3"},{"type":"function","doc":"Used by `m:wxSizer` internally to notify the window about being managed by the given\nsizer.\n\nThis method should not be called from outside the library, unless you're implementing a\ncustom sizer class - and in the latter case you must call this method with the pointer to\nthe sizer itself whenever a window is added to it and with NULL argument when the window\nis removed from it.","title":"wxWindow.setContainingSizer/2","ref":"wxWindow.html#setContainingSizer/2"},{"type":"function","doc":"Sets the window's cursor.\n\nNotice that the window cursor also sets it for the children of the window implicitly.\n\nThe `cursor` may be `wxNullCursor` in which case the window cursor will be reset back to default.\n\nSee:\n* `wx_misc:setCursor/1`\n\n* `m:wxCursor`","title":"wxWindow.setCursor/2","ref":"wxWindow.html#setCursor/2"},{"type":"function","doc":"Turn on or off double buffering of the window if the system supports it.","title":"wxWindow.setDoubleBuffered/2","ref":"wxWindow.html#setDoubleBuffered/2"},{"type":"function","doc":"Associates a drop target with this window.\n\nIf the window already has a drop target, it is deleted.\n\nSee:\n* `getDropTarget/1`\n\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)","title":"wxWindow.setDropTarget/2","ref":"wxWindow.html#setDropTarget/2"},{"type":"function","doc":"Sets the extra style bits for the window.\n\nThe currently defined extra style bits are reported in the class description.","title":"wxWindow.setExtraStyle/2","ref":"wxWindow.html#setExtraStyle/2"},{"type":"function","doc":"This sets the window to receive keyboard input.\n\nSee:\n* `m:wxFocusEvent`\n\n* `setFocus/1`\n\n* `wxPanel:setFocusIgnoringChildren/1`","title":"wxWindow.setFocus/1","ref":"wxWindow.html#setFocus/1"},{"type":"function","doc":"This function is called by wxWidgets keyboard navigation code when the user gives the\nfocus to this window from keyboard (e.g. using `TAB` key).\n\nBy default this method simply calls `setFocus/1` but can be overridden to do something in addition to\nthis in the derived classes.","title":"wxWindow.setFocusFromKbd/1","ref":"wxWindow.html#setFocusFromKbd/1"},{"type":"function","doc":"Sets the font for this window.\n\nThis function should not be called for the parent window if you don't want its font to be\ninherited by its children, use `setOwnFont/2` instead in this case and see `inheritAttributes/1` for more explanations.\n\nPlease notice that the given font is not automatically used for `m:wxPaintDC` objects\nassociated with this window, you need to call `wxDC:setFont/2` too. However this font is used by any\nstandard controls for drawing their text as well as by `getTextExtent/3`.\n\nReturn: true if the font was really changed, false if it was already set to this font and\nnothing was done.\n\nSee:\n* `getFont/1`\n\n* `inheritAttributes/1`","title":"wxWindow.setFont/2","ref":"wxWindow.html#setFont/2"},{"type":"function","doc":"Sets the foreground colour of the window.\n\nThe meaning of foreground colour varies according to the window class; it may be the text\ncolour or other colour, or it may not be used at all. Additionally, not all native\ncontrols support changing their foreground colour so this method may change their colour\nonly partially or even not at all.\n\nPlease see `inheritAttributes/1` for explanation of the difference between this method and `setOwnForegroundColour/2`.\n\nReturn: true if the colour was really changed, false if it was already set to this colour\nand nothing was done.\n\nSee:\n* `getForegroundColour/1`\n\n* `setBackgroundColour/2`\n\n* `getBackgroundColour/1`\n\n* `shouldInheritColours/1`","title":"wxWindow.setForegroundColour/2","ref":"wxWindow.html#setForegroundColour/2"},{"type":"function","doc":"Sets the help text to be used as context-sensitive help for this window.\n\nNote that the text is actually stored by the current `wxHelpProvider` (not implemented in\nwx) implementation, and not in the window object itself.\n\nSee: `getHelpText/1`","title":"wxWindow.setHelpText/2","ref":"wxWindow.html#setHelpText/2"},{"type":"function","doc":"Sets the identifier of the window.\n\nRemark: Each window has an integer identifier. If the application has not provided one,\nan identifier will be generated. Normally, the identifier should be provided on creation\nand should not be modified subsequently.\n\nSee:\n* `getId/1`\n\n* [Overview windowids](https://docs.wxwidgets.org/3.2/overview_windowids.html#overview_windowids)","title":"wxWindow.setId/2","ref":"wxWindow.html#setId/2"},{"type":"function","doc":"Sets the window's label.\n\nSee: `getLabel/1`","title":"wxWindow.setLabel/2","ref":"wxWindow.html#setLabel/2"},{"type":"function","doc":"Sets the maximum size of the window, to indicate to the sizer layout mechanism that this\nis the maximum possible size.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setMaxSize/2","ref":"wxWindow.html#setMaxSize/2"},{"type":"function","doc":"Sets the minimum size of the window, to indicate to the sizer layout mechanism that this\nis the minimum required size.\n\nYou may need to call this if you change the window size after construction and before\nadding to its parent sizer.\n\nNotice that calling this method doesn't prevent the program from making the window\nexplicitly smaller than the specified size by calling `setSize/6`, it just ensures that it won't\nbecome smaller than this size during the automatic layout.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setMinSize/2","ref":"wxWindow.html#setMinSize/2"},{"type":"function","doc":"Sets the window's name.\n\nSee: `getName/1`","title":"wxWindow.setName/2","ref":"wxWindow.html#setName/2"},{"type":"function","doc":"Sets the background colour of the window but prevents it from being inherited by the\nchildren of this window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `inheritAttributes/1`","title":"wxWindow.setOwnBackgroundColour/2","ref":"wxWindow.html#setOwnBackgroundColour/2"},{"type":"function","doc":"Sets the font of the window but prevents it from being inherited by the children of this\nwindow.\n\nSee:\n* `setFont/2`\n\n* `inheritAttributes/1`","title":"wxWindow.setOwnFont/2","ref":"wxWindow.html#setOwnFont/2"},{"type":"function","doc":"Sets the foreground colour of the window but prevents it from being inherited by the\nchildren of this window.\n\nSee:\n* `setForegroundColour/2`\n\n* `inheritAttributes/1`","title":"wxWindow.setOwnForegroundColour/2","ref":"wxWindow.html#setOwnForegroundColour/2"},{"type":"function","doc":"Deprecated:\n\nuse `wxDC:setPalette/2` instead.","title":"wxWindow.setPalette/2","ref":"wxWindow.html#setPalette/2"},{"type":"function","doc":"","title":"wxWindow.setScrollbar/5","ref":"wxWindow.html#setScrollbar/5"},{"type":"function","doc":"Sets the scrollbar properties of a built-in scrollbar.\n\nRemark: Let's say you wish to display 50 lines of text, using the same font. The window\nis sized so that you can only see 16 lines at a time. You would use: Note that with the\nwindow at this size, the thumb position can never go above 50 minus 16, or 34. You can\ndetermine how many lines are currently visible by dividing the current view size by the\ncharacter height in pixels. When defining your own scrollbar behaviour, you will always\nneed to recalculate the scrollbar settings when the window size changes. You could\ntherefore put your scrollbar calculations and SetScrollbar call into a function named\nAdjustScrollbars, which can be called initially and also from your `m:wxSizeEvent` handler function.\n\nSee:\n* [Overview scrolling](https://docs.wxwidgets.org/3.2/overview_scrolling.html#overview_scrolling)\n\n* `m:wxScrollBar`\n\n* `m:wxScrollWinEvent`","title":"wxWindow.setScrollbar/6","ref":"wxWindow.html#setScrollbar/6"},{"type":"function","doc":"","title":"wxWindow.setScrollPos/3","ref":"wxWindow.html#setScrollPos/3"},{"type":"function","doc":"Sets the position of one of the built-in scrollbars.\n\nRemark: This function does not directly affect the contents of the window: it is up to\nthe application to take note of scrollbar attributes and redraw contents accordingly.\n\nSee:\n* `setScrollbar/6`\n\n* `getScrollPos/2`\n\n* `getScrollThumb/2`\n\n* `m:wxScrollBar`","title":"wxWindow.setScrollPos/4","ref":"wxWindow.html#setScrollPos/4"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.setSize/2","ref":"wxWindow.html#setSize/2"},{"type":"function","doc":"Sets the size of the window in pixels.\n\nThe size is specified using a {X,Y,W,H}, {Width,Height} or by a couple of `int` objects.\n\nRemark: This form must be used with non-default width and height values.\n\nSee:\n* `move/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setSize/3","ref":"wxWindow.html#setSize/3"},{"type":"function","doc":"","title":"wxWindow.setSize/5","ref":"wxWindow.html#setSize/5"},{"type":"function","doc":"Sets the size of the window in pixels.\n\nRemark: This overload sets the position and optionally size, of the window. Parameters\nmay be wxDefaultCoord to indicate either that a default should be supplied by wxWidgets,\nor that the current value of the dimension should be used.\n\nSee:\n* `move/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setSize/6","ref":"wxWindow.html#setSize/6"},{"type":"function","doc":"","title":"wxWindow.setSizeHints/2","ref":"wxWindow.html#setSizeHints/2"},{"type":"function","doc":"Use of this function for windows which are not toplevel windows (such as `m:wxDialog` or `m:wxFrame`)\nis discouraged.\n\nPlease use `setMinSize/2` and `setMaxSize/2` instead.\n\nSee:\n* `setSizeHints/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setSizeHints/3","ref":"wxWindow.html#setSizeHints/3"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.setSizeHints/4","ref":"wxWindow.html#setSizeHints/4"},{"type":"function","doc":"","title":"wxWindow.setSizer/2","ref":"wxWindow.html#setSizer/2"},{"type":"function","doc":"Sets the window to have the given layout sizer.\n\nThe window will then own the object, and will take care of its deletion. If an existing\nlayout constraints object is already owned by the window, it will be deleted if the `deleteOld`\nparameter is true.\n\nNote that this function will also call `setAutoLayout/2` implicitly with true parameter if the `sizer` is\nnon-NULL and false otherwise so that the sizer will be effectively used to layout the\nwindow children whenever it is resized.\n\nRemark: SetSizer enables and disables Layout automatically.","title":"wxWindow.setSizer/3","ref":"wxWindow.html#setSizer/3"},{"type":"function","doc":"","title":"wxWindow.setSizerAndFit/2","ref":"wxWindow.html#setSizerAndFit/2"},{"type":"function","doc":"Associate the sizer with the window and set the window size and minimal size accordingly.\n\nThis method calls `setSizer/3` and then `wxSizer:setSizeHints/2` which sets the initial window size to the size needed to\naccommodate all sizer elements and sets the minimal size to the same size, this preventing\nthe user from resizing this window to be less than this minimal size (if it's a top-level\nwindow which can be directly resized by the user).","title":"wxWindow.setSizerAndFit/3","ref":"wxWindow.html#setSizerAndFit/3"},{"type":"function","doc":"This function tells a window if it should use the system's \"theme\" code to draw the\nwindows' background instead of its own background drawing code.\n\nThis does not always have any effect since the underlying platform obviously needs to\nsupport the notion of themes in user defined windows. One such platform is GTK+ where\nwindows can have (very colourful) backgrounds defined by a user's selected theme.\n\nDialogs, notebook pages and the status bar have this flag set to true by default so that\nthe default look and feel is simulated best.\n\nSee: `getThemeEnabled/1`","title":"wxWindow.setThemeEnabled/2","ref":"wxWindow.html#setThemeEnabled/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.setToolTip/2","ref":"wxWindow.html#setToolTip/2"},{"type":"function","doc":"Set the transparency of the window.\n\nIf the system supports transparent windows, returns true, otherwise returns false and the\nwindow remains fully opaque. See also `canSetTransparent/1`.\n\nThe parameter `alpha` is in the range 0..255 where 0 corresponds to a fully transparent\nwindow and 255 to the fully opaque one. The constants `wxIMAGE_ALPHA_TRANSPARENT` and `wxIMAGE_ALPHA_OPAQUE`\ncan be used.","title":"wxWindow.setTransparent/2","ref":"wxWindow.html#setTransparent/2"},{"type":"function","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","title":"wxWindow.setVirtualSize/2","ref":"wxWindow.html#setVirtualSize/2"},{"type":"function","doc":"Sets the virtual size of the window in pixels.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","title":"wxWindow.setVirtualSize/3","ref":"wxWindow.html#setVirtualSize/3"},{"type":"function","doc":"See `setWindowStyleFlag/2` for more info.","title":"wxWindow.setWindowStyle/2","ref":"wxWindow.html#setWindowStyle/2"},{"type":"function","doc":"Sets the style of the window.\n\nPlease note that some styles cannot be changed after the window creation and that `refresh/2` might\nneed to be called after changing the others for the change to take place immediately.\n\nSee Window styles for more information about flags.\n\nSee: `getWindowStyleFlag/1`","title":"wxWindow.setWindowStyleFlag/2","ref":"wxWindow.html#setWindowStyleFlag/2"},{"type":"function","doc":"Chooses a different variant of the window display to use.\n\nWindow variants currently just differ in size, as can be seen from ?wxWindowVariant\ndocumentation. Under all platforms but macOS, this function does nothing more than change\nthe font used by the window. However under macOS it is implemented natively and selects\nthe appropriate variant of the native widget, which has better appearance than just scaled\ndown or up version of the normal variant, so it should be preferred to directly tweaking\nthe font size.\n\nBy default the controls naturally use the normal variant.","title":"wxWindow.setWindowVariant/2","ref":"wxWindow.html#setWindowVariant/2"},{"type":"function","doc":"Return true from here to allow the colours of this window to be changed by `inheritAttributes/1`.\n\nReturning false forbids inheriting them from the parent window.\n\nThe base class version returns false, but this method is overridden in `m:wxControl`\nwhere it returns true.","title":"wxWindow.shouldInheritColours/1","ref":"wxWindow.html#shouldInheritColours/1"},{"type":"function","doc":"","title":"wxWindow.show/1","ref":"wxWindow.html#show/1"},{"type":"function","doc":"Shows or hides the window.\n\nYou may need to call `raise/1` for a top level window if you want to bring it to top, although\nthis is not needed if `show/2` is called immediately after the frame creation.\n\nNotice that the default state of newly created top level windows is hidden (to allow you\nto create their contents without flicker) unlike for all the other, not derived from `m:wxTopLevelWindow`,\nwindows that are by default created in the shown state.\n\nReturn: true if the window has been shown or hidden or false if nothing was done because\nit already was in the requested state.\n\nSee:\n* `isShown/1`\n\n* `hide/1`\n\n* `wxRadioBox:show/3`\n\n* `m:wxShowEvent`","title":"wxWindow.show/2","ref":"wxWindow.html#show/2"},{"type":"function","doc":"Re-enables window updating after a previous call to `freeze/1`.\n\nTo really thaw the control, it must be called exactly the same number of times as `freeze/1`.\n\nIf the window has any children, they are recursively thawed too.\n\nSee:\n* `freeze/1`\n\n* `isFrozen/1`","title":"wxWindow.thaw/1","ref":"wxWindow.html#thaw/1"},{"type":"function","doc":"Convert pixel values of the current toolkit to DPI-independent pixel values.\n\nA DPI-independent pixel is just a pixel at the standard 96 DPI resolution. To keep the\nsame physical size at higher resolution, the physical pixel value must be scaled by `getDPIScaleFactor/1` but\nthis scaling may be already done by the underlying toolkit (GTK+, Cocoa, ...)\nautomatically. This method performs the conversion only if it is not already done by the\nlower level toolkit, For example, you may want to use this to store window sizes and\npositions so that they can be re-used regardless of the display DPI:\n\nAlso note that if either component of `sz` has the special value of -1, it is returned\nunchanged independently of the current DPI, to preserve the special value of -1 in\nwxWidgets API (it is often used to mean \"unspecified\").\n\nSince: 3.1.0","title":"wxWindow.toDIP/2","ref":"wxWindow.html#toDIP/2"},{"type":"function","doc":"Transfers values from child controls to data areas specified by their validators.\n\nReturns false if a transfer failed.\n\nNotice that this also calls `transferDataFromWindow/1` for all children recursively.\n\nSee:\n* `transferDataToWindow/1`\n\n* `validate/1`","title":"wxWindow.transferDataFromWindow/1","ref":"wxWindow.html#transferDataFromWindow/1"},{"type":"function","doc":"Transfers values to child controls from data areas specified by their validators.\n\nNotice that this also calls `transferDataToWindow/1` for all children recursively.\n\nReturn: Returns false if a transfer failed.\n\nSee:\n* `transferDataFromWindow/1`\n\n* `validate/1`","title":"wxWindow.transferDataToWindow/1","ref":"wxWindow.html#transferDataToWindow/1"},{"type":"function","doc":"Calling this method immediately repaints the invalidated area of the window and all of\nits children recursively (this normally only happens when the flow of control returns to\nthe event loop).\n\nNotice that this function doesn't invalidate any area of the window so nothing happens if\nnothing has been invalidated (i.e. marked as requiring a redraw). Use `refresh/2` first if you want\nto immediately redraw the window unconditionally.","title":"wxWindow.update/1","ref":"wxWindow.html#update/1"},{"type":"function","doc":"","title":"wxWindow.updateWindowUI/1","ref":"wxWindow.html#updateWindowUI/1"},{"type":"function","doc":"This function sends one or more `m:wxUpdateUIEvent` to the window.\n\nThe particular implementation depends on the window; for example a `m:wxToolBar` will\nsend an update UI event for each toolbar button, and a `m:wxFrame` will send an update UI\nevent for each menubar menu item.\n\nYou can call this function from your application to ensure that your UI is up-to-date at\nthis point (as far as your `m:wxUpdateUIEvent` handlers are concerned). This may be\nnecessary if you have called `wxUpdateUIEvent:setMode/1` or `wxUpdateUIEvent:setUpdateInterval/1` to limit the overhead that wxWidgets incurs by sending\nupdate UI events in idle time. `flags` should be a bitlist of one or more of the\n?wxUpdateUI enumeration.\n\nIf you are calling this function from an OnInternalIdle or OnIdle function, make sure you\npass the wxUPDATE_UI_FROMIDLE flag, since this tells the window to only update the UI\nelements that need to be updated in idle time. Some windows update their elements only\nwhen necessary, for example when a menu is about to be shown. The following is an example\nof how to call UpdateWindowUI from an idle function.\n\nSee: `m:wxUpdateUIEvent`","title":"wxWindow.updateWindowUI/2","ref":"wxWindow.html#updateWindowUI/2"},{"type":"function","doc":"Validates the current values of the child controls using their validators.\n\nNotice that this also calls `validate/1` for all children recursively.\n\nReturn: Returns false if any of the validations failed.\n\nSee:\n* `transferDataFromWindow/1`\n\n* `transferDataToWindow/1`","title":"wxWindow.validate/1","ref":"wxWindow.html#validate/1"},{"type":"function","doc":"Moves the pointer to the given position on the window.\n\nNote: Apple Human Interface Guidelines forbid moving the mouse cursor programmatically so\nyou should avoid using this function in Mac applications (and probably avoid using it\nunder the other platforms without good reason as well).","title":"wxWindow.warpPointer/3","ref":"wxWindow.html#warpPointer/3"},{"type":"type","doc":"","title":"wxWindow.wxWindow/0","ref":"wxWindow.html#t:wxWindow/0"},{"type":"module","doc":"This event is sent just after the actual window associated with a `m:wxWindow` object has\nbeen created.\n\nSince it is derived from `m:wxCommandEvent`, the event propagates up the window hierarchy.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxWindowDestroyEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWindowCreateEvent](https://docs.wxwidgets.org/3.2/classwx_window_create_event.html)","title":"wxWindowCreateEvent","ref":"wxWindowCreateEvent.html"},{"type":"module","doc":"Use `wxEvtHandler:connect/3` with `wxWindowCreateEventType` to subscribe to events of this type.","title":"Events - wxWindowCreateEvent","ref":"wxWindowCreateEvent.html#module-events"},{"type":"type","doc":"","title":"wxWindowCreateEvent.wxWindowCreate/0","ref":"wxWindowCreateEvent.html#t:wxWindowCreate/0"},{"type":"type","doc":"","title":"wxWindowCreateEvent.wxWindowCreateEvent/0","ref":"wxWindowCreateEvent.html#t:wxWindowCreateEvent/0"},{"type":"type","doc":"","title":"wxWindowCreateEvent.wxWindowCreateEventType/0","ref":"wxWindowCreateEvent.html#t:wxWindowCreateEventType/0"},{"type":"module","doc":"A `m:wxWindowDC` must be constructed if an application wishes to paint on the whole area\nof a window (client and decorations).\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxWindowDC`\nobject.\n\nTo draw on a window from inside an EVT_PAINT() handler, construct a `m:wxPaintDC` object instead.\n\nTo draw on the client area of a window from outside an EVT_PAINT() handler, construct a `m:wxClientDC`\nobject.\n\nA `m:wxWindowDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxClientDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxWindowDC](https://docs.wxwidgets.org/3.2/classwx_window_d_c.html)","title":"wxWindowDC","ref":"wxWindowDC.html"},{"type":"function","doc":"Destroys the object","title":"wxWindowDC.destroy/1","ref":"wxWindowDC.html#destroy/1"},{"type":"function","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","title":"wxWindowDC.new/1","ref":"wxWindowDC.html#new/1"},{"type":"type","doc":"","title":"wxWindowDC.wxWindowDC/0","ref":"wxWindowDC.html#t:wxWindowDC/0"},{"type":"module","doc":"This event is sent as early as possible during the window destruction process.\n\nFor the top level windows, as early as possible means that this is done by `m:wxFrame` or `m:wxDialog`\ndestructor, i.e. after the destructor of the derived class was executed and so any\nmethods specific to the derived class can't be called any more from this event handler. If\nyou need to do this, you must call `wxWindow::SendDestroyEvent()` (not implemented in wx)\nfrom your derived class destructor.\n\nFor the child windows, this event is generated just before deleting the window from `wxWindow:'Destroy'/1`\n(which is also called when the parent window is deleted) or from the window destructor if\noperator `delete` was used directly (which is not recommended for this very reason).\n\nIt is usually pointless to handle this event in the window itself but it ca be very\nuseful to receive notifications about the window destruction in the parent window or in\nany other object interested in this window.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxWindowCreateEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWindowDestroyEvent](https://docs.wxwidgets.org/3.2/classwx_window_destroy_event.html)","title":"wxWindowDestroyEvent","ref":"wxWindowDestroyEvent.html"},{"type":"type","doc":"","title":"wxWindowDestroyEvent.wxWindowDestroy/0","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroy/0"},{"type":"type","doc":"","title":"wxWindowDestroyEvent.wxWindowDestroyEvent/0","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroyEvent/0"},{"type":"type","doc":"","title":"wxWindowDestroyEvent.wxWindowDestroyEventType/0","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroyEventType/0"},{"type":"module","doc":"This is the main class for interacting with the XML-based resource system.\n\nThe class holds XML resources from one or more .xml files, binary files or zip archive files.\n\nNote that this is a singleton class and you'll never allocate/deallocate it. Just use the\nstatic `get/0` getter.\n\nSee:\n* [Overview xrc](https://docs.wxwidgets.org/3.2/overview_xrc.html#overview_xrc)\n\n* [Overview xrcformat](https://docs.wxwidgets.org/3.2/overview_xrcformat.html#overview_xrcformat)\n\nwxWidgets docs: [wxXmlResource](https://docs.wxwidgets.org/3.2/classwxXml_resource.html)","title":"wxXmlResource","ref":"wxXmlResource.html"},{"type":"function","doc":"","title":"wxXmlResource.attachUnknownControl/3","ref":"wxXmlResource.html#attachUnknownControl/3"},{"type":"function","doc":"Attaches an unknown control to the given panel/window/dialog.\n\nUnknown controls are used in conjunction with .","title":"wxXmlResource.attachUnknownControl/4","ref":"wxXmlResource.html#attachUnknownControl/4"},{"type":"function","doc":"Removes all handlers and deletes them (this means that any handlers added using `AddHandler()`\n(not implemented in wx) must be allocated on the heap).","title":"wxXmlResource.clearHandlers/1","ref":"wxXmlResource.html#clearHandlers/1"},{"type":"function","doc":"Compares the XRC version to the argument.\n\nReturns -1 if the XRC version is less than the argument, +1 if greater, and 0 if they are\nequal.","title":"wxXmlResource.compareVersion/5","ref":"wxXmlResource.html#compareVersion/5"},{"type":"function","doc":"Destroys the object","title":"wxXmlResource.destroy/1","ref":"wxXmlResource.html#destroy/1"},{"type":"function","doc":"Gets the global resources object or creates one if none exists.","title":"wxXmlResource.get/0","ref":"wxXmlResource.html#get/0"},{"type":"function","doc":"Returns flags, which may be a bitlist of ?wxXmlResourceFlags enumeration values.","title":"wxXmlResource.getFlags/1","ref":"wxXmlResource.html#getFlags/1"},{"type":"function","doc":"Returns version information (a.b.c.d = d + 256*c + 2562*b + 2563*a).","title":"wxXmlResource.getVersion/1","ref":"wxXmlResource.html#getVersion/1"},{"type":"function","doc":"","title":"wxXmlResource.getXRCID/1","ref":"wxXmlResource.html#getXRCID/1"},{"type":"function","doc":"Returns a numeric ID that is equivalent to the string ID used in an XML resource.\n\nIf an unknown `str_id` is requested (i.e. other than wxID_XXX or integer), a new record\nis created which associates the given string with a number.\n\nIf `value_if_not_found` is `wxID_NONE`, the number is obtained via `wx_misc:newId/0`. Otherwise `value_if_not_found`\nis used.\n\nMacro `XRCID(name)` is provided for convenient use in event tables.\n\nNote: IDs returned by XRCID() cannot be used with the `EVT_*_RANGE` macros, because the\norder in which they are assigned to symbolic `name` values is not guaranteed.","title":"wxXmlResource.getXRCID/2","ref":"wxXmlResource.html#getXRCID/2"},{"type":"function","doc":"Initializes handlers for all supported controls/windows.\n\nThis will make the executable quite big because it forces linking against most of the\nwxWidgets library.","title":"wxXmlResource.initAllHandlers/1","ref":"wxXmlResource.html#initAllHandlers/1"},{"type":"function","doc":"Loads resources from XML files that match given filemask.\n\nExample:\n\nNote: If wxUSE_FILESYS is enabled, this method understands `wxFileSystem` (not\nimplemented in wx) URLs (see `wxFileSystem::FindFirst()` (not implemented in wx)).\n\nNote: If you are sure that the argument is name of single XRC file (rather than an URL or\na wildcard), use `LoadFile()` (not implemented in wx) instead.","title":"wxXmlResource.load/2","ref":"wxXmlResource.html#load/2"},{"type":"function","doc":"Loads a bitmap resource from a file.","title":"wxXmlResource.loadBitmap/2","ref":"wxXmlResource.html#loadBitmap/2"},{"type":"function","doc":"Loads a dialog.\n\n`parent` points to parent window (if any).","title":"wxXmlResource.loadDialog/3","ref":"wxXmlResource.html#loadDialog/3"},{"type":"function","doc":"Loads a dialog.\n\n`parent` points to parent window (if any).\n\nThis form is used to finish creation of an already existing instance (the main reason for\nthis is that you may want to use derived class with a new event table). Example:","title":"wxXmlResource.loadDialog/4","ref":"wxXmlResource.html#loadDialog/4"},{"type":"function","doc":"Loads a frame from the resource.\n\n`parent` points to parent window (if any).","title":"wxXmlResource.loadFrame/3","ref":"wxXmlResource.html#loadFrame/3"},{"type":"function","doc":"Loads the contents of a frame onto an existing `m:wxFrame`.\n\nThis form is used to finish creation of an already existing instance (the main reason for\nthis is that you may want to use derived class with a new event table).","title":"wxXmlResource.loadFrame/4","ref":"wxXmlResource.html#loadFrame/4"},{"type":"function","doc":"Loads an icon resource from a file.","title":"wxXmlResource.loadIcon/2","ref":"wxXmlResource.html#loadIcon/2"},{"type":"function","doc":"Loads menu from resource.\n\nReturns NULL on failure.","title":"wxXmlResource.loadMenu/2","ref":"wxXmlResource.html#loadMenu/2"},{"type":"function","doc":"","title":"wxXmlResource.loadMenuBar/2","ref":"wxXmlResource.html#loadMenuBar/2"},{"type":"function","doc":"Loads a menubar from resource.\n\nReturns NULL on failure.","title":"wxXmlResource.loadMenuBar/3","ref":"wxXmlResource.html#loadMenuBar/3"},{"type":"function","doc":"Loads a panel.\n\n`parent` points to the parent window.","title":"wxXmlResource.loadPanel/3","ref":"wxXmlResource.html#loadPanel/3"},{"type":"function","doc":"Loads a panel.\n\n`parent` points to the parent window. This form is used to finish creation of an already\nexisting instance.","title":"wxXmlResource.loadPanel/4","ref":"wxXmlResource.html#loadPanel/4"},{"type":"function","doc":"Loads a toolbar.","title":"wxXmlResource.loadToolBar/3","ref":"wxXmlResource.html#loadToolBar/3"},{"type":"function","doc":"","title":"wxXmlResource.new/0","ref":"wxXmlResource.html#new/0"},{"type":"function","doc":"Constructor.","title":"wxXmlResource.new/1","ref":"wxXmlResource.html#new/1"},{"type":"function","doc":"Constructor.","title":"wxXmlResource.new/2","ref":"wxXmlResource.html#new/2"},{"type":"function","doc":"Sets the global resources object and returns a pointer to the previous one (may be NULL).","title":"wxXmlResource.set/1","ref":"wxXmlResource.html#set/1"},{"type":"function","doc":"Sets flags (bitlist of ?wxXmlResourceFlags enumeration values).","title":"wxXmlResource.setFlags/2","ref":"wxXmlResource.html#setFlags/2"},{"type":"function","doc":"This function unloads a resource previously loaded by `load/2`.\n\nReturns true if the resource was successfully unloaded and false if it hasn't been found\nin the list of loaded resources.","title":"wxXmlResource.unload/2","ref":"wxXmlResource.html#unload/2"},{"type":"function","doc":"","title":"wxXmlResource.xrcctrl/3","ref":"wxXmlResource.html#xrcctrl/3"},{"type":"type","doc":"","title":"wxXmlResource.wxXmlResource/0","ref":"wxXmlResource.html#t:wxXmlResource/0"},{"type":"module","doc":"Miscellaneous functions.","title":"wx_misc","ref":"wx_misc.html"},{"type":"function","doc":"","title":"wx_misc.beginBusyCursor/0","ref":"wx_misc.html#beginBusyCursor/0"},{"type":"function","doc":"Changes the cursor to the given cursor for all windows in the application.\n\nUse `wx_misc:endBusyCursor/0` to revert the cursor back to its previous state. These two calls can be nested, and\na counter ensures that only the outer calls take effect.\n\nSee: `wx_misc:isBusy/0`","title":"wx_misc.beginBusyCursor/1","ref":"wx_misc.html#beginBusyCursor/1"},{"type":"function","doc":"Ring the system bell.\n\nNote: This function is categorized as a GUI one and so is not thread-safe.","title":"wx_misc.bell/0","ref":"wx_misc.html#bell/0"},{"type":"function","doc":"Returns the display size in pixels.\n\nNote: Use of this function is not recommended in the new code as it only works for the\nprimary display. Use `wxDisplay:getGeometry/1` to retrieve the size of the appropriate display instead.\n\nEither of output pointers can be NULL if the caller is not interested in the\ncorresponding value.\n\nSee: `m:wxDisplay`","title":"wx_misc.displaySize/0","ref":"wx_misc.html#displaySize/0"},{"type":"function","doc":"Changes the cursor back to the original cursor, for all windows in the application.\n\nUse with `wx_misc:beginBusyCursor/1`.\n\nSee: `wx_misc:isBusy/0`","title":"wx_misc.endBusyCursor/0","ref":"wx_misc.html#endBusyCursor/0"},{"type":"function","doc":"Find a menu item identifier associated with the given frame's menu bar.","title":"wx_misc.findMenuItemId/3","ref":"wx_misc.html#findMenuItemId/3"},{"type":"function","doc":"Find the deepest window at the given mouse position in screen coordinates, returning the\nwindow if found, or NULL if not.\n\nThis function takes child windows at the given position into account even if they are\ndisabled. The hidden children are however skipped by it.","title":"wx_misc.findWindowAtPoint/1","ref":"wx_misc.html#findWindowAtPoint/1"},{"type":"function","doc":"Returns the current id.","title":"wx_misc.getCurrentId/0","ref":"wx_misc.html#getCurrentId/0"},{"type":"function","doc":"Copies the user's email address into the supplied buffer, by concatenating the values\nreturned by `wxGetFullHostName()` (not implemented in wx) and `wx_misc:getUserId/0`.\n\nReturn: true if successful, false otherwise.","title":"wx_misc.getEmailAddress/0","ref":"wx_misc.html#getEmailAddress/0"},{"type":"function","doc":"Return the (current) user's home directory.","title":"wx_misc.getHomeDir/0","ref":"wx_misc.html#getHomeDir/0"},{"type":"function","doc":"For normal keys, returns true if the specified key is currently down.\n\nFor togglable keys (Caps Lock, Num Lock and Scroll Lock), returns true if the key is\ntoggled such that its LED indicator is lit. There is currently no way to test whether\ntogglable keys are up or down.\n\nEven though there are virtual key codes defined for mouse buttons, they cannot be used\nwith this function currently.\n\nIn wxGTK, this function can be only used with modifier keys (`WXK_ALT`, `WXK_CONTROL` and `WXK_SHIFT`)\nwhen not using X11 backend currently.","title":"wx_misc.getKeyState/1","ref":"wx_misc.html#getKeyState/1"},{"type":"function","doc":"Returns the mouse position in screen coordinates.","title":"wx_misc.getMousePosition/0","ref":"wx_misc.html#getMousePosition/0"},{"type":"function","doc":"Returns the current state of the mouse.\n\nReturns a `wx_wxMouseState()` instance that contains the current position of the mouse pointer in screen\ncoordinates, as well as boolean values indicating the up/down status of the mouse buttons\nand the modifier keys.","title":"wx_misc.getMouseState/0","ref":"wx_misc.html#getMouseState/0"},{"type":"function","doc":"Returns the string containing the description of the current platform in a user-readable\nform.\n\nFor example, this function may return strings like \"Windows 10 (build 10240), 64-bit\nedition\" or \"Linux 4.1.4 i386\".","title":"wx_misc.getOsDescription/0","ref":"wx_misc.html#getOsDescription/0"},{"type":"function","doc":"This function returns the \"user id\" also known as \"login name\" under Unix (i.e.\n\nsomething like \"jsmith\"). It uniquely identifies the current user (on this system). Under\nWindows or NT, this function first looks in the environment variables USER and LOGNAME; if\nneither of these is found, the entry `UserId` in the `wxWidgets` section of the WIN.INI\nfile is tried.\n\nReturn: The login name if successful or an empty string otherwise.","title":"wx_misc.getUserId/0","ref":"wx_misc.html#getUserId/0"},{"type":"function","doc":"Returns true if between two `wx_misc:beginBusyCursor/1` and `wx_misc:endBusyCursor/0`\ncalls.","title":"wx_misc.isBusy/0","ref":"wx_misc.html#isBusy/0"},{"type":"function","doc":"Returns true if the operating system the program is running under is 64 bit.\n\nThe check is performed at run-time and may differ from the value available at\ncompile-time (at compile-time you can just check if `sizeof(void*) == 8`) since the\nprogram could be running in emulation mode or in a mixed 32/64 bit system (bi-architecture\noperating system).\n\nNote: This function is not 100% reliable on some systems given the fact that there isn't\nalways a standard way to do a reliable check on the OS architecture.","title":"wx_misc.isPlatform64Bit/0","ref":"wx_misc.html#isPlatform64Bit/0"},{"type":"function","doc":"Returns true if the current platform is little endian (instead of big endian).\n\nThe check is performed at run-time.","title":"wx_misc.isPlatformLittleEndian/0","ref":"wx_misc.html#isPlatformLittleEndian/0"},{"type":"function","doc":"","title":"wx_misc.launchDefaultBrowser/1","ref":"wx_misc.html#launchDefaultBrowser/1"},{"type":"function","doc":"Opens the `url` in user's default browser.\n\nIf the `flags` parameter contains `wxBROWSER_NEW_WINDOW` flag, a new window is opened for\nthe URL (currently this is only supported under Windows).\n\nAnd unless the `flags` parameter contains `wxBROWSER_NOBUSYCURSOR` flag, a busy cursor is\nshown while the browser is being launched (using `wxBusyCursor` (not implemented in wx)).\n\nThe parameter `url` is interpreted as follows:\n\n* if it has a valid scheme (e.g. `\"file:\"`, `\"http:\"` or `\"mailto:\"`) it is passed to the\nappropriate browser configured in the user system.\n\n* if it has no valid scheme (e.g. it's a local file path without the `\"file:\"` prefix),\nthen ?wxFileExists and ?wxDirExists are used to test if it's a local file/directory; if it\nis, then the browser is called with the `url` parameter eventually prefixed by `\"file:\"`.\n\n* if it has no valid scheme and it's not a local file/directory, then `\"http:\"` is\nprepended and the browser is called.\n\nReturns true if the application was successfully launched.\n\nNote: For some configurations of the running user, the application which is launched to\nopen the given URL may be URL-dependent (e.g. a browser may be used for local URLs while\nanother one may be used for remote URLs).","title":"wx_misc.launchDefaultBrowser/2","ref":"wx_misc.html#launchDefaultBrowser/2"},{"type":"function","doc":"","title":"wx_misc.mSWSetEmulationLevel/1","ref":"wx_misc.html#mSWSetEmulationLevel/1"},{"type":"function","doc":"","title":"wx_misc.mSWSetEmulationLevel/2","ref":"wx_misc.html#mSWSetEmulationLevel/2"},{"type":"function","doc":"Deprecated:\n\nIds generated by it can conflict with the Ids defined by the user code, use `wxID_ANY` to\nassign ids which are guaranteed to not conflict with the user-defined ids for the controls\nand menu items you create instead of using this function.\n\nGenerates an integer identifier unique to this run of the program.","title":"wx_misc.newId/0","ref":"wx_misc.html#newId/0"},{"type":"function","doc":"Ensures that Ids subsequently generated by `wx_misc:newId/0` do not clash with the given `id`.","title":"wx_misc.registerId/1","ref":"wx_misc.html#registerId/1"},{"type":"function","doc":"Globally sets the cursor; only has an effect on Windows, Mac and GTK+.\n\nYou should call this function with wxNullCursor to restore the system cursor.\n\nSee:\n* `m:wxCursor`\n\n* `wxWindow:setCursor/2`","title":"wx_misc.setCursor/1","ref":"wx_misc.html#setCursor/1"},{"type":"function","doc":"Don't synthesize KeyUp events holding down a key and producing KeyDown events with\nautorepeat.\n\nOn by default and always on in wxMSW.","title":"wx_misc.setDetectableAutoRepeat/1","ref":"wx_misc.html#setDetectableAutoRepeat/1"},{"type":"function","doc":"","title":"wx_misc.shell/0","ref":"wx_misc.html#shell/0"},{"type":"function","doc":"Executes a command in an interactive shell window.\n\nIf no command is specified, then just the shell is spawned.\n\nSee: [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_exec)","title":"wx_misc.shell/1","ref":"wx_misc.html#shell/1"},{"type":"function","doc":"","title":"wx_misc.shutdown/0","ref":"wx_misc.html#shutdown/0"},{"type":"function","doc":"This function shuts down or reboots the computer depending on the value of the `flags`.\n\nNote: Note that performing the shutdown requires the corresponding access rights\n(superuser under Unix, SE_SHUTDOWN privilege under Windows) and that this function is only\nimplemented under Unix and MSW.\n\nReturn: true on success, false if an error occurred.","title":"wx_misc.shutdown/1","ref":"wx_misc.html#shutdown/1"},{"type":"behaviour","doc":"wx_object - Generic wx object behaviour.\n\nwx_object - Generic wx object behaviour\n\nThis is a behaviour module that can be used for \"sub classing\" wx objects. It\nworks like a regular gen_server module and creates a server per object.\n\nNOTE: Currently no form of inheritance is implemented.\n\nThe user module should export:\n\ninit(Args) should return \n\\{wxWindow, State\\} | \\{wxWindow, State, Timeout\\} | ignore | \\{stop, Reason\\}\n\nAsynchronous window event handling: \nhandle_event(#wx\\{\\}, State) should return \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nThe user module can export the following callback functions:\n\nhandle_call(Msg, \\{From, Tag\\}, State) should return \n\\{reply, Reply, State\\} | \\{reply, Reply, State, Timeout\\} | \\{noreply, State\\}\n| \\{noreply, State, Timeout\\} | \\{stop, Reason, Reply, State\\}\n\nhandle_cast(Msg, State) should return \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nIf the above are not exported but called, the wx_object process will crash. The\nuser module can also export:\n\nInfo is message e.g. \\{'EXIT', P, R\\}, \\{nodedown, N\\}, ... \nhandle_info(Info, State) should return , ... \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nIf a message is sent to the wx_object process when handle_info is not exported,\nthe message will be dropped and ignored.\n\nWhen stop is returned in one of the functions above with Reason = normal |\nshutdown | Term, terminate(State) is called. It lets the user module clean up,\nit is always called when server terminates or when wx_object() in the driver is\ndeleted. If the Parent process terminates the Module:terminate/2 function is\ncalled. \nterminate(Reason, State)\n\nExample:\n\n```erlang\n -module(myDialog).\n -export([new/2, show/1, destroy/1]). %% API\n -export([init/1, handle_call/3, handle_event/2,\n handle_info/2, code_change/3, terminate/2]).\n new/2, showModal/1, destroy/1]). %% Callbacks\n\n %% Client API\n new(Parent, Msg) ->\n wx_object:start(?MODULE, [Parent,Id], []).\n\n show(Dialog) ->\n wx_object:call(Dialog, show_modal).\n\n destroy(Dialog) ->\n wx_object:call(Dialog, destroy).\n\n %% Server Implementation ala gen_server\n init([Parent, Str]) ->\n Dialog = wxDialog:new(Parent, 42, \"Testing\", []),\n ...\n wxDialog:connect(Dialog, command_button_clicked),\n {Dialog, MyState}.\n\n handle_call(show, _From, State) ->\n wxDialog:show(State#state.win),\n {reply, ok, State};\n ...\n handle_event(#wx{}, State) ->\n io:format(\"Users clicked button~n\",[]),\n {noreply, State};\n ...\n```","title":"wx_object","ref":"wx_object.html"},{"type":"behaviour","doc":"- **[](){: #type-request_id } request_id() = term()**\n\n- **[](){: #type-server_ref } server_ref() =\n [wx:wx_object()](`m:wx#type-wx_object`) | atom() | pid()**","title":"DATA TYPES - wx_object","ref":"wx_object.html#module-data-types"},{"type":"function","doc":"call(Obj, Request) -> term()\n\nMake a call to a wx_object server. The call waits until it gets a result.\nInvokes handle_call(Request, From, State) in the server","title":"wx_object.call/2","ref":"wx_object.html#call/2"},{"type":"function","doc":"call(Obj, Request, Timeout) -> term()\n\nMake a call to a wx_object server with a timeout. Invokes handle_call(Request,\nFrom, State) in server","title":"wx_object.call/3","ref":"wx_object.html#call/3"},{"type":"function","doc":"cast(Obj, Request) -> ok\n\nMake a cast to a wx_object server. Invokes handle_cast(Request, State) in the\nserver","title":"wx_object.cast/2","ref":"wx_object.html#cast/2"},{"type":"function","doc":"check_response(Msg::term(), Key::request_id()) -> {reply, Reply::term()} | false\n| {error, {term(), server_ref()}}\n\nCheck if a received message was a reply to a RequestId","title":"wx_object.check_response/2","ref":"wx_object.html#check_response/2"},{"type":"callback","doc":"","title":"wx_object.code_change/3","ref":"wx_object.html#c:code_change/3"},{"type":"function","doc":"get_pid(Obj) -> pid()\n\nGet the pid of the object handle.","title":"wx_object.get_pid/1","ref":"wx_object.html#get_pid/1"},{"type":"callback","doc":"","title":"wx_object.handle_call/3","ref":"wx_object.html#c:handle_call/3"},{"type":"callback","doc":"","title":"wx_object.handle_cast/2","ref":"wx_object.html#c:handle_cast/2"},{"type":"callback","doc":"","title":"wx_object.handle_event/2","ref":"wx_object.html#c:handle_event/2"},{"type":"callback","doc":"","title":"wx_object.handle_info/2","ref":"wx_object.html#c:handle_info/2"},{"type":"callback","doc":"","title":"wx_object.handle_sync_event/3","ref":"wx_object.html#c:handle_sync_event/3"},{"type":"callback","doc":"","title":"wx_object.init/1","ref":"wx_object.html#c:init/1"},{"type":"function","doc":"reply(X1::{pid(), Tag::term()}, Reply::term()) -> pid()\n\nGet the pid of the object handle.","title":"wx_object.reply/2","ref":"wx_object.html#reply/2"},{"type":"function","doc":"send_request(Obj, Request::term()) -> request_id()\n\nMake an send_request to a generic server. and return a RequestId which\ncan/should be used with wait_response/\\[1|2]. Invokes handle_call(Request, From,\nState) in server.","title":"wx_object.send_request/2","ref":"wx_object.html#send_request/2"},{"type":"function","doc":"set_pid(Obj, Pid::pid()) -> wx:wx_object()\n\nSets the controlling process of the object handle.","title":"wx_object.set_pid/2","ref":"wx_object.html#set_pid/2"},{"type":"function","doc":"start(Name, Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","title":"wx_object.start/4","ref":"wx_object.html#start/4"},{"type":"function","doc":"start_link(Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","title":"wx_object.start_link/3","ref":"wx_object.html#start_link/3"},{"type":"function","doc":"start_link(Name, Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","title":"wx_object.start_link/4","ref":"wx_object.html#start_link/4"},{"type":"function","doc":"stop(Obj) -> ok\n\nStops a generic wx_object server with reason 'normal'. Invokes\nterminate(Reason,State) in the server. The call waits until the process is\nterminated. If the process does not exist, an exception is raised.","title":"wx_object.stop/1","ref":"wx_object.html#stop/1"},{"type":"function","doc":"stop(Obj, Reason, Timeout) -> ok\n\nStops a generic wx_object server with the given Reason. Invokes\nterminate(Reason,State) in the server. The call waits until the process is\nterminated. If the call times out, or if the process does not exist, an\nexception is raised.","title":"wx_object.stop/3","ref":"wx_object.html#stop/3"},{"type":"callback","doc":"","title":"wx_object.terminate/2","ref":"wx_object.html#c:terminate/2"},{"type":"function","doc":"wait_response(RequestId::request_id()) -> {reply, Reply::term()} | {error,\n{term(), server_ref()}}\n\nWait infinitely for a reply from a generic server.","title":"wx_object.wait_response/1","ref":"wx_object.html#wait_response/1"},{"type":"function","doc":"wait_response(Key::request_id(), Timeout::timeout()) -> {reply, Reply::term()} |\ntimeout | {error, {term(), server_ref()}}\n\nWait 'timeout' for a reply from a generic server.","title":"wx_object.wait_response/2","ref":"wx_object.html#wait_response/2"},{"type":"type","doc":"","title":"wx_object.event/0","ref":"wx_object.html#t:event/0"},{"type":"type","doc":"","title":"wx_object.request_id/0","ref":"wx_object.html#t:request_id/0"},{"type":"type","doc":"","title":"wx_object.server_ref/0","ref":"wx_object.html#t:server_ref/0"},{"type":"extras","doc":"\n# Wx Release Notes\n\nThis document describes the changes made to the Wx application.","title":"Wx Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Wx 2.4.2 - Wx Release Notes","ref":"notes.html#wx-2-4-2"},{"type":"extras","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.4.1 - Wx Release Notes","ref":"notes.html#wx-2-4-1"},{"type":"extras","doc":"* Add option to silence wx depracation macros.\n\n Own Id: OTP-18988 Aux Id: PR-7750","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.4 - Wx Release Notes","ref":"notes.html#wx-2-4"},{"type":"extras","doc":"- Guards have been added to `gen_*:start*` API functions to catch bad arguments\n earlier. Before this change, in some cases, a bad argument could tag along and\n cause the server to fail later, right after start.\n\n Own Id: OTP-18857 Aux Id: GH-7685","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.3.1 - Wx Release Notes","ref":"notes.html#wx-2-3-1"},{"type":"extras","doc":"- The `wx` application would fail to build on macOS with Xcode 15.\n\n Own Id: OTP-18768 Aux Id: PR-7670","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.3 - Wx Release Notes","ref":"notes.html#wx-2-3"},{"type":"extras","doc":"- Runtime dependencies have been updated.\n\n Own Id: OTP-18350\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.2.2.1 - Wx Release Notes","ref":"notes.html#wx-2-2-2-1"},{"type":"extras","doc":"- The `wx` application would fail to build on macOS with Xcode 15.\n\n Own Id: OTP-18768 Aux Id: PR-7670","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.2.2 - Wx Release Notes","ref":"notes.html#wx-2-2-2"},{"type":"extras","doc":"- Improve debug prints from the nifs. Some minor fixes for wxWidgets-3.2. Fixed\n OpenGL debug functions.\n\n Own Id: OTP-18512","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.2.1 - Wx Release Notes","ref":"notes.html#wx-2-2-1"},{"type":"extras","doc":"- Added environment variable `WX_MACOS_NON_GUI_APP` to allow user to override\n `OSXIsGUIApplication` behavior.\n\n Own Id: OTP-18213 Aux Id: PR-6113","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.2 - Wx Release Notes","ref":"notes.html#wx-2-2"},{"type":"extras","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Added `aux1Down` and `aux2Down` fields to the `wxMouseState` record. Since one\n record have been changed a recompilation of user code might be required.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17950\n\n- Add mac specific menubar functions.\n\n Own Id: OTP-18008 Aux Id: PR-5816","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.1.4 - Wx Release Notes","ref":"notes.html#wx-2-1-4"},{"type":"extras","doc":"- Fix build failure with wxWidgets-3.1.6.\n\n Own Id: OTP-18064 Aux Id: GH-5893","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Enable the possibility to build wx on windows with wxWidgets-3.1.6.\n\n Own Id: OTP-18061 Aux Id: GH-5883","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.1.3 - Wx Release Notes","ref":"notes.html#wx-2-1-3"},{"type":"extras","doc":"- Fixed a bug in callback handling which could lead to a unresponsive gui.\n\n Own Id: OTP-17982 Aux Id: GH-5758","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.1.2 - Wx Release Notes","ref":"notes.html#wx-2-1-2"},{"type":"extras","doc":"- Removed the `static_data` option from `wxImage` creation functions, as it was\n broken and could lead to crashes. Now image data is always copied to wxWidgets\n as was the default behavior.\n\n Removed some non working `wxGridEvent` event types, which have there own\n events in newer `wxWidgets` versions, and added a couple of event types that\n where missing in `wx`.\n\n Own Id: OTP-17947","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.1.1 - Wx Release Notes","ref":"notes.html#wx-2-1-1"},{"type":"extras","doc":"- Fix crash in cleanup code when a gui application is exiting.\n\n Fix errors in the OpenGL wrapper that could cause crashes and improve the\n documentation.\n\n Own Id: OTP-17745","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.1 - Wx Release Notes","ref":"notes.html#wx-2-1"},{"type":"extras","doc":"- Fix crash when closing an application.\n\n Own Id: OTP-17507\n\n- Some functions with overloaded color arguments could not be used. For example\n the copy constructor `wxTextAttr:new(TextAttr)` did not work.\n\n Own Id: OTP-17577 Aux Id: GH-4999","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added the Microsoft Edge WebView loader dll to the installer on windows.\n\n Own Id: OTP-17325\n\n- Handle specific Mac gui application events.\n\n Own Id: OTP-17438 Aux Id: PR-4780","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 2.0.1 - Wx Release Notes","ref":"notes.html#wx-2-0-1"},{"type":"extras","doc":"- Fix build problems when wxWidgets are built with -enable-std.\n\n Own Id: OTP-17407 Aux Id: GH-4834\n\n- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 2.0 - Wx Release Notes","ref":"notes.html#wx-2-0"},{"type":"extras","doc":"- Fix compiler warnings produced by the clang compiler.\n\n Own Id: OTP-17105 Aux Id: PR-2872","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The application has been completely rewritten in order to use wxWidgets\n version 3 as its base.\n\n Add basic documentation generated from the wxWidgets project.\n\n Own Id: OTP-16800\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- Added support for wxWebView.\n\n Own Id: OTP-17213 Aux Id: PR-3027\n\n- Due to the support of the new backend versions some API incompatibilities have\n been introduced. Examples of changes are: \n wxWindowDC default creators have been removed \n wxClientDC default creators have been removed \n wxPaintDC default creators have been removed \n wxWindow:setVirtualSizeHints() has been deprecated in wxWidgets and removed \n wxWindow:makeModal() has been deprecated in wxWidgets and removed \n wxToolBar:add/insertTool without label have been deprecated in wxWidgets and\n removed \n wxStyledTextCtrl some functions have changed arguments from boolean to int \n wxSizerItem:new() Some arguments have become options \n Removed deprecated wxSizerItem:setWindow() use assignWindow() \n Removed deprecated wxSizerItem:setSpacer() use assignSpacer() \n Removed deprecated wxSizerItem:setSpacer() use assignSpacer() \n Removed deprecated wxSizerItem:setSizer() use assignSizer() \n wxMenu append/insert/prepend have changed return value and lost IsCheckable\n argument \n wxListCtrl:setItem/4 changed return value \n wxImage:convertToGreyscale() options have changed \n wxGridSizer:wxGridSizer() options have changed \n wxGrid API have many changes \n wxGraphicsRenderer:create*GradientBrush() uses GradientStops now \n wxGraphicsRenderer:createPen() have been removed \n wxGraphicsRenderer:create*GradientBrush() uses GradientStops now \n wxGLCanvas API is incompatible \n wxFlexGridSizer:wxFlexGridSizer() options have changed \n wxDisplay:new() options have changed \n wxCalendarDateAttr:new(ColText \\[,OptList]) have been removed \n wxBitmapButton:set/getBitmapSelected() have been removed\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17219 Aux Id: OTP-16800","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.9.3.1 - Wx Release Notes","ref":"notes.html#wx-1-9-3-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.9.3 - Wx Release Notes","ref":"notes.html#wx-1-9-3"},{"type":"extras","doc":"- Fixed wx initialization on mac, top level menus did not always work on newer\n MacOS versions. The menus will not work until wxWidgets-3.1.5 is released and\n used on these MacOS versions.\n\n Own Id: OTP-17187","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.9.2 - Wx Release Notes","ref":"notes.html#wx-1-9-2"},{"type":"extras","doc":"- Add popup menu callback to `wxTaskBarIcon:new/1`.\n\n Own Id: OTP-16983 Aux Id: PR-2743","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.9.1 - Wx Release Notes","ref":"notes.html#wx-1-9-1"},{"type":"extras","doc":"- Fix various compiler warnings on 64-bit Windows.\n\n Own Id: OTP-15800","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.9.0.1 - Wx Release Notes","ref":"notes.html#wx-1-9-0-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.9 - Wx Release Notes","ref":"notes.html#wx-1-9"},{"type":"extras","doc":"- Added `wxWindow:isShownOnScreen/1`, `wxMouseEvent:getWheelAxis` and mac\n specific menubar functions. Fixed defines that have changed in newer wxWidgets\n versions, that caused some literals to become run-time dependent on wxWidgets\n version.\n\n Own Id: OTP-16285","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.8.9 - Wx Release Notes","ref":"notes.html#wx-1-8-9"},{"type":"extras","doc":"- Fix a driver bug that could crashes when allocating memory.\n\n Own Id: OTP-15883 Aux Id: PR-2261","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.8 - Wx Release Notes","ref":"notes.html#wx-1-8-8"},{"type":"extras","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.7 - Wx Release Notes","ref":"notes.html#wx-1-8-7"},{"type":"extras","doc":"- Improved support for wxWidgets 3.1.3 which have changed `wxFONTWEIGTH`, also\n added `wxGCDC` and `wxDisplay` modules.\n\n Fixed a crash on Mojave and check for events more often.\n\n Own Id: OTP-15587","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.6 - Wx Release Notes","ref":"notes.html#wx-1-8-6"},{"type":"extras","doc":"- Fixed delayed delete bug which caused wx applications to crash on Mojave.\n\n Own Id: OTP-15426 Aux Id: ERL-755","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.5 - Wx Release Notes","ref":"notes.html#wx-1-8-5"},{"type":"extras","doc":"- Fixed compilation warning on Darwin.\n\n Own Id: OTP-15230 Aux Id: PR-1860","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.4 - Wx Release Notes","ref":"notes.html#wx-1-8-4"},{"type":"extras","doc":"- Changed implementation so wx can now be built towards wxWidgets-3.1.1.\n\n Own Id: OTP-15027","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.8.3 - Wx Release Notes","ref":"notes.html#wx-1-8-3"},{"type":"extras","doc":"- wx crashes in otp 20.1 if empty binaries was sent down as arguments.\n\n Own Id: OTP-14688","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8.2 - Wx Release Notes","ref":"notes.html#wx-1-8-2"},{"type":"extras","doc":"- Do not deprecate `wxGraphicsContext:createLinearGradientBrush/7` and\n `wxGraphicsContext:createRadialGradientBrush/8` which are still available in\n wxWidgets-3.0.\n\n Own Id: OTP-14539","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- General Unicode improvements.\n\n Own Id: OTP-14462","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.8.1 - Wx Release Notes","ref":"notes.html#wx-1-8-1"},{"type":"extras","doc":"- Fix a livelock that could be caused by `wx:batch/1`.\n\n Own Id: OTP-14289","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.8 - Wx Release Notes","ref":"notes.html#wx-1-8"},{"type":"extras","doc":"- Allow string arguments to be binaries as specified, i.e. unicode:chardata().\n\n Own Id: OTP-13934 Aux Id: ERL-270","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add wxWindow:dragAcceptFiles/2 and wxDropFilesEvent to support simple drag and\n drop from file browser.\n\n Own Id: OTP-13933","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.7.1 - Wx Release Notes","ref":"notes.html#wx-1-7-1"},{"type":"extras","doc":"- Increased the stacksize for the wx thread. The default stacksize on Windows is\n 1MB which is not enough if the user created many nested dialogs.\n\n Own Id: OTP-13816","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.7 - Wx Release Notes","ref":"notes.html#wx-1-7"},{"type":"extras","doc":"- Fixed bugs which could cause called functions to be invoked twice or not at\n all when callbacks where invoked at the same time.\n\n Own Id: OTP-13491","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Changed atom 'boolean' fields in #wxMouseState\\{\\} to 'boolean()'.\n\n Moved out arguments in wxListCtrl:hitTest to result.\n\n Removed no-op functions in wxGauge that have been removed from wxWidgets-3.1.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13553","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.6.1 - Wx Release Notes","ref":"notes.html#wx-1-6-1"},{"type":"extras","doc":"- Fixed commands with multiple binaries, such as `wxImage:new/4`. Added\n `wxWindow:SetDoubleBuffered/1`, `wxWindow:isDoubleBuffered/1`,\n `wxWindow:setTransparent/2` and `wxWindow:canSetTransparent/1`. Fixed timing\n issues.\n\n Own Id: OTP-13404","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.6 - Wx Release Notes","ref":"notes.html#wx-1-6"},{"type":"extras","doc":"- Add wxOverlay and make wxPostScripDC optional to make it easier to build on\n windows.\n\n Correct some function specifications.\n\n The driver implementation have been optimized and now invokes commands after\n events have been sent to erlang.\n\n Own Id: OTP-13160","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.5 - Wx Release Notes","ref":"notes.html#wx-1-5"},{"type":"extras","doc":"- Extend AUI functionality.\n\n Own Id: OTP-12961","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.4 - Wx Release Notes","ref":"notes.html#wx-1-4"},{"type":"extras","doc":"- The undocumented option `generic_debug` for `gen_server` has been removed.\n\n Own Id: OTP-12183\n\n- Remove raise condition where `wx` could crash during emulator stoppage.\n\n Own Id: OTP-12734","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Use wxWidgets-3.0, if found, as default backend on windows.\n\n Own Id: OTP-12632\n\n- Add missing fields in some events records. May require a recompilation of user\n applications.\n\n Own Id: OTP-12660","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.3.3 - Wx Release Notes","ref":"notes.html#wx-1-3-3"},{"type":"extras","doc":"- Fix timing related crash during wx application stop.\n\n Own Id: OTP-12374","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.3.2 - Wx Release Notes","ref":"notes.html#wx-1-3-2"},{"type":"extras","doc":"- Fixed a minor typo in the graphicsContext example.\n\n Own Id: OTP-12259","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.3.1 - Wx Release Notes","ref":"notes.html#wx-1-3-1"},{"type":"extras","doc":"- Implement --enable-sanitizers\\[=sanitizers]. Similar to debugging with\n Valgrind, it's very useful to enable -fsanitize= switches to catch bugs at\n runtime.\n\n Own Id: OTP-12153","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.3 - Wx Release Notes","ref":"notes.html#wx-1-3"},{"type":"extras","doc":"- Fix delayed destroy for wxPaintDC objects which could cause an eternal loop\n for modal dialogs.\n\n Fix wxSL_LABELS compatibility between wxWidgets-2.8 and wxWidgets-3.0 versions\n\n Own Id: OTP-11985","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add missing classes wxPopup\\[Transient]Window, wxActivateEvent and\n wxTextCtrl:cahngeValue/2 function.\n\n Own Id: OTP-11986","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.2 - Wx Release Notes","ref":"notes.html#wx-1-2"},{"type":"extras","doc":"- Refactored C++ code, fixed crashes and a deadlock on linux.\n\n Own Id: OTP-11586\n\n- Some local implementations of removing the last element from a list are\n replaced by `lists:droplast/1`. Note that this requires at least `stdlib-2.0`,\n which is the stdlib version delivered in OTP 17.0. (Thanks to Hans Svensson)\n\n Own Id: OTP-11678\n\n- Reworked the internal event handling to avoid crashes in destroy objects.\n Thanks Tom for the bug report.\n\n Own Id: OTP-11699\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.1.2 - Wx Release Notes","ref":"notes.html#wx-1-1-2"},{"type":"extras","doc":"- Fixed a problem which caused the debugger to crash when closing a window.\n Fixed static linking on mac.\n\n Own Id: OTP-11444","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 1.1.1 - Wx Release Notes","ref":"notes.html#wx-1-1-1"},{"type":"extras","doc":"- wx initialization hanged with wxWidgets-3.0 on mac. Fixed a crash with\n wxListBox on wxWidgets-3.0 (thanks Sergei Golovan) Fixed documentation links.\n Fixed event callbacks cleanup.\n\n Own Id: OTP-11393\n\n- Improve documentation (Thanks to Boris Mühmer)\n\n Own Id: OTP-11505","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Fix silent make rules (Thanks to Anthony Ramine)\n\n Own Id: OTP-11515","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 1.0 - Wx Release Notes","ref":"notes.html#wx-1-0"},{"type":"extras","doc":"- Add \\{silent_start, boolean()\\} option to wx:new/1 in order to be able to\n suppress error messages during startup of wx. (Thanks to Håkan Mattsson)\n\n Own Id: OTP-10585\n\n- Fix wxTreeCtrl:getBoundingRect/2 and wxTreeCtrl:hitTest/1. wxTreeCtrl:hitTest\n now returns a tuple not bug compatible with previous releases but needed.\n\n Own Id: OTP-10743","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The wx application now compiles and is usable with the unstable development\n branch of wxWidgets-2.9. Some functions are currently not available in\n wxWidgets-2.9 and their erlang counterparts are marked as deprecated. They\n will generate an error if called when linked against wxWidgets-2.9 libraries.\n This means that wx can now be built on 64bit MacOsX, but keep in mind that\n wxWidgets-2.9 is still a development branch and needs (a lot) more work before\n it becomes stable.\n\n Own Id: OTP-10407 Aux Id: kunagi-262 \\[173]","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.99.2 - Wx Release Notes","ref":"notes.html#wx-0-99-2"},{"type":"extras","doc":"- Fix errors in wxDC and wxGraphicsContext api.\n\n Add wxTaskBarIcon.\n\n Add wxStyledTextControl:setEdgeMode/2.\n\n Add type and specs for all functions and records.\n\n Own Id: OTP-9947","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.99.1 - Wx Release Notes","ref":"notes.html#wx-0-99-1"},{"type":"extras","doc":"- Fixed a deadlock in the driver, which could happen if a callback caused\n another callback to be invoked.\n\n Own Id: OTP-9725","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Implemented wxSystemOptions.\n\n Load Opengl from libGL.so.1 instead libGL.so to work around linux problems.\n\n Own Id: OTP-9702","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.99 - Wx Release Notes","ref":"notes.html#wx-0-99"},{"type":"extras","doc":"- wx: fix obsolete guard warning (list/1) (Thanks to Tuncer Ayaz)\n\n Own Id: OTP-9513\n\n- XML files have been corrected.\n\n Own Id: OTP-9550 Aux Id: OTP-9541","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Support virtual tables in wxListCtrl.\n\n Own Id: OTP-9415","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.10 - Wx Release Notes","ref":"notes.html#wx-0-98-10"},{"type":"extras","doc":"- Fixed wx app files on mac and solaris. Thanks Jachym Holecek and Joe Williams.\n\n Own Id: OTP-9324","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 0.98.9 - Wx Release Notes","ref":"notes.html#wx-0-98-9"},{"type":"extras","doc":"- Wx crashed if graphics could not be initiated, for instance if DISPLAY was not\n available.\n\n Wx could crash during startup, thanks Boris Muhmer for extra ordinary testing.\n\n Own Id: OTP-9080\n\n- Wx on MacOS X generated complains on stderr about certain cocoa functions not\n being called from the \"Main thread\". This is now corrected.\n\n Own Id: OTP-9081","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Wx 0.98.8 - Wx Release Notes","ref":"notes.html#wx-0-98-8"},{"type":"extras","doc":"- Add wxSystemSettings which was missing in the previous release, despite\n previous comments.\n\n Fix an external loop when stopping erlang nicely.\n\n Separate OpenGL to it's own dynamic loaded library, so other graphic libraries\n can reuse the gl module and it will not waste memory if not used.\n\n Own Id: OTP-8951","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.7 - Wx Release Notes","ref":"notes.html#wx-0-98-7"},{"type":"extras","doc":"- Fix crash (segmentation fault) in callback handling.\n\n Own Id: OTP-8766","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add wxSystemSettings module.\n\n Add wxTreeCtrl:editLabel/2.\n\n Own Id: OTP-8767","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.6 - Wx Release Notes","ref":"notes.html#wx-0-98-6"},{"type":"extras","doc":"- Calling `sys:get_status()` for processes that have globally registered names\n that were not atoms would cause a crash. Corrected. (Thanks to Steve Vinoski.)\n\n Own Id: OTP-8656","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.5 - Wx Release Notes","ref":"notes.html#wx-0-98-5"},{"type":"extras","doc":"- Corrected incorrectly generated wxFileDialog:getPaths/1. Reported by\n Jason/hornja.\n\n Own Id: OTP-8330\n\n- Fixed a memory reference bug which caused unexplained \\{badarg, Int\\} exits\n when running multiple wx applications.\n\n Own Id: OTP-8461","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added `wxListCtrl:getEditCtrl/1` (not available on Mac).\n\n Own Id: OTP-8408\n\n- Cleanups suggested by tidier and modernization of types and specs.\n\n Own Id: OTP-8455\n\n- Changed representation of wxTreeItem to be an integer. This saves memory,\n where the driver do not need to keep a object reference to each tree item.\n\n Added getFirstChild and getNextChild to wxTreeCtrl.\n\n Own Id: OTP-8462","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.4 - Wx Release Notes","ref":"notes.html#wx-0-98-4"},{"type":"extras","doc":"- Added wx_object improvements from Mazen.\n\n Fixed pid issues, reported by Mazen.\n\n Added wxLogNull class, reported by Amit Murthy.\n\n Various configure fixes.\n\n Own Id: OTP-8243 Aux Id: seq11418\n\n- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8250\n\n- wx now builds with wxWidgets 2.8.4 or a later 2.8 release, thanks Nico Kruber.\n\n Own Id: OTP-8292","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.3 - Wx Release Notes","ref":"notes.html#wx-0-98-3"},{"type":"extras","doc":"- Added wxListCtrl sorting and build fixes supplied by Paul Hampson. Thanks.\n\n Own Id: OTP-8126","title":"Fixed Bugs and Malfunctions - Wx Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- wxHtmlWindow class implemented.\n\n All exceptions from callbacks are now caught and written to the log.\n\n Some defines where wrong in 'wx.hrl'.\n\n `wx:batch/1` and friends could hang forever if for instance a breakpoint was\n set inside the fun. That caused all wx applications to hang.\n\n Added missing wxAuiPaneInfo constructor and destructor.\n\n Added wxAuiNotebookEvent and wxAuiManagerEvent.\n\n Calling non supported wxWidgets functions hanged instead of crashed.\n\n Update OpenGL to version 3.1 and added some of the missing glu functions.\n\n Fixed wxRadioBox which inherited the wrong class, thanks Atilla Erdodi.\n\n Own Id: OTP-8083\n\n- Removed some of the automatic garbage collecting after application exit, user\n will get a warning instead so he can correct the code.\n\n Own Id: OTP-8138","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.2 - Wx Release Notes","ref":"notes.html#wx-0-98-2"},{"type":"extras","doc":"- Olle Mattson have made a large demo, see `examples/demo/`, that triggered the\n following bugs and new features:\n\n New book controls.\n\n Added wxToolbar:addTool/6.\n\n Empty binaries will be used to indicate NULL where applicable.\n\n Own Id: OTP-7943\n\n- Applied patch from Nico Kruber, which fixes building on some wxwidgets\n installations.\n\n Open source","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98.1 - Wx Release Notes","ref":"notes.html#wx-0-98-1"},{"type":"extras","doc":"- Added `xrcctrl/3` to wxXmlResource and added a resource example.\n\n Added several event types and events records and fixed a couple of event\n related bugs.\n\n Event callbacks can now use `wxEvtHandler:connect/2`.\n\n Error handling and debugging aid have been improved.\n\n Added wxSplitterWindow and wxGauge:pulse and a couple of missing macros in\n `wx.hrl`.\n\n Thanks to Steve Davis for feedback and bug reports.\n\n Own Id: OTP-7875","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Wx 0.98 - Wx Release Notes","ref":"notes.html#wx-0-98"},{"type":"extras","doc":"- A first beta release of wxErlang.\n\n Own Id: OTP-7859","title":"Improvements and New Features - Wx Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"\n# wx the erlang binding of wxWidgets\n\nThe _wx_ application is an erlang binding of _wxWidgets_. This document\ndescribes the erlang mapping to wxWidgets and it's implementation. It is not a\ncomplete users guide to wxWidgets. If you need that, you will have to read the\nwxWidgets documentation instead. _wx_ tries to keep a one-to-one mapping with\nthe original API so that the original documentation and examples shall be as\neasy as possible to use.\n\nWx examples and test suite can be found in the erlang src release. They\ncan also provide some help on how to use the API.\n\nThis is currently a very brief introduction to _wx_. The application is still\nunder development, which means the interface may change, and the test suite\ncurrently have a poor coverage ratio.","title":"wx the erlang binding of wxWidgets","ref":"chapter.html"},{"type":"extras","doc":"- [Introduction](chapter.md#introduction)\n- [Multiple processes and memory handling](chapter.md#Multiple_processes_and_memory_handling)\n- [Event Handling](chapter.md#Event_Handling)\n- [Acknowledgments](chapter.md#acknowledgments)","title":"Contents - wx the erlang binding of wxWidgets","ref":"chapter.html#contents"},{"type":"extras","doc":"The original _wxWidgets_ is an object-oriented (C++) API and that is reflected\nin the erlang mapping. In most cases each class in wxWidgets is represented as a\nmodule in erlang. This gives the _wx_ application a huge interface, spread over\nseveral modules, and it all starts with the _wx_ module. The _wx_ module\ncontains functions to create and destroy the GUI, i.e. `wx:new/0`,\n`wx:destroy/0`, and some other useful functions.\n\nObjects or object references in _wx_ should be seen as erlang processes rather\nthan erlang terms. When you operate on them they can change state, e.g. they are\nnot functional objects as erlang terms are. Each object has a type or rather a\nclass, which is manipulated with the corresponding module or by sub-classes of\nthat object. Type checking is done so that a module only operates on it's\nobjects or inherited classes.\n\nAn object is created with _new_ and destroyed with _destroy_. Most functions in\nthe classes are named the same as their C++ counterpart, except that for\nconvenience, in erlang they start with a lowercase letter and the first argument\nis the object reference. Optional arguments are last and expressed as tagged\ntuples in any order.\n\nFor example the _wxWindow_ C++ class is implemented in the _wxWindow_ erlang\nmodule and the member _wxWindow::CenterOnParent_ is thus\n_wxWindow:centerOnParent_. The following C++ code:\n\n```erlang\n wxWindow MyWin = new wxWindow();\n MyWin.CenterOnParent(wxVERTICAL);\n ...\n delete MyWin;\n```\n\nwould in erlang look like:\n\n```erlang\n MyWin = wxWindow:new(),\n wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),\n ...\n wxWindow:destroy(MyWin),\n```\n\nWhen you are reading wxWidgets documentation or the examples, you will notice\nthat some of the most basic classes are missing in _wx_, they are directly\nmapped to corresponding erlang terms:\n\n- **_wxPoint_ is represented by \\{Xcoord,Ycoord\\}**\n\n- **_wxSize_ is represented by \\{Width,Height\\}**\n\n- **_wxRect_ is represented by \\{Xcoord,Ycoord,Width,Height\\}**\n\n- **_wxColour_ is represented by \\{Red,Green,Blue\\[,Alpha]\\}**\n\n- **_wxString_ is represented by\n [unicode:charlist()](`t:unicode:charlist/0`)**\n\n- **_wxGBPosition_ is represented by \\{Row,Column\\}**\n\n- **_wxGBSpan_ is represented by \\{RowSpan,ColumnSPan\\}**\n\n- **_wxGridCellCoords_ is represented by \\{Row,Column\\}**\n\nIn the places where the erlang API differs from the original one it should be\nobvious from the erlang documentation which representation has been used. E.g.\nthe C++ arrays and/or lists are sometimes represented as erlang lists and\nsometimes as tuples.\n\nColours are represented with \\{Red,Green,Blue\\[,Alpha]\\}, the Alpha value is\noptional when used as an argument to functions, but it will always be returned\nfrom _wx_ functions.\n\nDefines, enumerations and global variables exists in `wx.hrl` as defines. Most\nof these defines are constants but not all. Some are platform dependent and\ntherefore the global variables must be instantiated during runtime. These will\nbe acquired from the driver with a call, so not all defines can be used in\nmatching statements. Class local enumerations will be prefixed with the class\nname and a underscore as in `ClassName_Enum`.\n\nAdditionally some global functions, i.e. non-class functions, exist in the\n`wx_misc` module.\n\n_Wx_ is implemented as a (threaded) driver and a rather direct interface\nto the C++ API, with the drawback that if the erlang programmer does an error,\nit might crash the emulator.\n\nSince the driver is threaded it requires a _smp_ enabled emulator, that provides\na thread safe interface to the driver.\n\n[](){: #Multiple_processes_and_memory_handling }","title":"Introduction - wx the erlang binding of wxWidgets","ref":"chapter.html#introduction"},{"type":"extras","doc":"The intention is that each erlang application calls wx:new() once to setup it's\nGUI which creates an environment and a memory mapping. To be able to use _wx_\nfrom several processes in your application, you must share the environment. You\ncan get the active environment with `wx:get_env/0` and set it in the new\nprocesses with `wx:set_env/1`. Two processes or applications which have both\ncalled wx:new() will not be able use each others objects.\n\n```erlang\n wx:new(),\n MyWin = wxFrame:new(wx:null(), 42, \"Example\", []),\n Env = wx:get_env(),\n spawn(fun() ->\n wx:set_env(Env),\n %% Here you can do wx calls from your helper process.\n ...\n end),\n ...\n```\n\nWhen `wx:destroy/0` is invoked or when all processes in the application have\ndied, the memory is deleted and all windows created by that application are\nclosed.\n\nThe _wx_ application never cleans or garbage collects memory as long as the user\napplication is alive. Most of the objects are deleted when a window is closed,\nor at least all the objects which have a parent argument that is non null. By\nusing `wxCLASS:destroy/1` when possible you can avoid an increasing memory\nusage. This is especially important when _wxWidgets_ assumes or recommends that\nyou (or rather the C++ programmer) have allocated the object on the stack since\nthat will never be done in the erlang binding. For example `wxDC` class or its\nsub-classes or `wxSizerFlags`.\n\nCurrently the dialogs show modal function freezes wxWidgets until the dialog is\nclosed. That is intended but in erlang where you can have several GUI\napplications running at the same time it causes trouble. This will hopefully be\nfixed in future _wxWidgets_ releases.\n\n[](){: #Event_Handling }","title":"Multiple processes and memory handling - wx the erlang binding of wxWidgets","ref":"chapter.html#multiple-processes-and-memory-handling"},{"type":"extras","doc":"Event handling in _wx_ differs most from the original API. You must specify\nevery event you want to handle in _wxWidgets_, that is the same in the erlang\nbinding but you can choose to receive the events as messages or handle them with\ncallback _funs_.\n\nOtherwise the event subscription is handled as _wxWidgets_ dynamic event-handler\nconnection. You subscribe to events of a certain type from objects with an _ID_\nor within a range of *ID*s. The callback _fun_ is optional, if not supplied the\nevent will be sent to the process that called _connect/2_. Thus, a handler is a\ncallback _fun_ or a process which will receive an event message.\n\nEvents are handled in order from bottom to top, in the widgets hierarchy, by the\nlast subscribed handler first. Depending on if `wxEvent:skip()` is called the\nevent will be handled by the other handler(s) afterwards. Most of the events\nhave default event handler(s) installed.\n\nMessage events looks like\n[\\#wx\\{id=integer(), obj=wx:wxObject(), userData=term(), event=Rec](`t:wxEvtHandler:wx/0`)\n\\}. The _id_ is the identifier of the object that received the event. The _obj_\nfield contains the object that you used _connect_ on. The _userData_ field\ncontains a user supplied term, this is an option to _connect_. And the _event_\nfield contains a record with event type dependent information. The first element\nin the event record is always the type you subscribed to. For example if you\nsubscribed to _key_up_ events you will receive the `#wx{event=Event}` where\n_Event_ will be a _wxKey_ event record where `Event#wxKey.type = key_up`.\n\nIn _wxWidgets_ the developer has to call `wxEvent:skip()` if he wants the event\nto be processed by other handlers. You can do the same in _wx_ if you use\ncallbacks. If you want the event as messages you just don't supply a callback\nand you can set the _skip_ option in _connect_ call to true or false, the\ndefault it is false. True means that you get the message but let the subsequent\nhandlers also handle the event. If you want to change this behavior dynamically\nyou must use callbacks and call `wxEvent:skip()`.\n\nCallback event handling is done by using the optional callback _fun/2_ when\nattaching the handler. The _fun(#wx\\{\\},wxObject()_ must take two arguments\nwhere the first is the same as with message events described above and the\nsecond is an object reference to the actual event object. With the event object\nyou can call `wxEvent:skip()` and access all the data. When using callbacks you\nmust call `wxEvent:skip()` by yourself if you want any of the events to be\nforwarded to the following handlers. The actual event objects are deleted after\nthe _fun_ returns.\n\nThe callbacks are always invoked by another process and have exclusive usage of\nthe GUI when invoked. This means that a callback _fun_ cannot use the process\ndictionary and should not make calls to other processes. Calls to another\nprocess inside a callback _fun_ may cause a deadlock if the other process is\nwaiting on completion of his call to the GUI.","title":"Event Handling - wx the erlang binding of wxWidgets","ref":"chapter.html#event-handling"},{"type":"extras","doc":"Mats-Ola Persson wrote the initial _wxWidgets_ binding as part of his master\nthesis. The current version is a total re-write but many ideas have been reused.\nThe reason for the re-write was mostly due to the limited requirements he had\nbeen given by us.\n\nAlso thanks to the _wxWidgets_ team that develops and supports it so we have\nsomething to use.","title":"Acknowledgments - wx the erlang binding of wxWidgets","ref":"chapter.html#acknowledgments"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-DBD265E3.js b/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-DBD265E3.js new file mode 100644 index 0000000000000..61718fde86991 --- /dev/null +++ b/prs/8803/lib/wx-2.4.2/doc/html/dist/search_data-DBD265E3.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","title":"gl","doc":"Erlang wrapper functions for OpenGL\n\nStandard OpenGL API\n\nThis documents the functions as a brief version of the complete\n[OpenGL reference pages.](https://www.khronos.org/registry/OpenGL-Refpages/)","ref":"gl.html"},{"type":"function","title":"gl.accum/2","doc":"The accumulation buffer is an extended-range color buffer. Images are not\nrendered into it. Rather, images rendered into one of the color buffers are\nadded to the contents of the accumulation buffer after rendering. Effects such\nas antialiasing (of points, lines, and polygons), motion blur, and depth of\nfield can be created by accumulating images generated with different\ntransformation matrices.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAccum.xml)","ref":"gl.html#accum/2"},{"type":"function","title":"gl.activeShaderProgram/2","doc":"[`gl:activeShaderProgram/2`](`activeShaderProgram/2`) sets the linked program\nnamed by `Program` to be the active program for the program pipeline object\n`Pipeline`. The active program in the active program pipeline object is the\ntarget of calls to [`gl:uniform()`](`uniform1f/2`) when no program has been made\ncurrent through a call to [`gl:useProgram/1`](`useProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glActiveShaderProgram.xhtml)","ref":"gl.html#activeShaderProgram/2"},{"type":"function","title":"gl.activeTexture/1","doc":"[`gl:activeTexture/1`](`activeTexture/1`) selects which texture unit subsequent\ntexture state calls will affect. The number of texture units an implementation\nsupports is implementation dependent, but must be at least 80.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glActiveTexture.xhtml)","ref":"gl.html#activeTexture/1"},{"type":"function","title":"gl.alphaFunc/2","doc":"The alpha test discards fragments depending on the outcome of a comparison\nbetween an incoming fragment's alpha value and a constant reference value.\n[`gl:alphaFunc/2`](`alphaFunc/2`) specifies the reference value and the\ncomparison function. The comparison is performed only if alpha testing is\nenabled. By default, it is not enabled. (See [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) of `?GL_ALPHA_TEST`.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAlphaFunc.xml)","ref":"gl.html#alphaFunc/2"},{"type":"function","title":"gl.areTexturesResident/1","doc":"GL establishes a \\`\\`working set'' of textures that are resident in texture\nmemory. These textures can be bound to a texture target much more efficiently\nthan textures that are not resident.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glAreTexturesResident.xml)","ref":"gl.html#areTexturesResident/1"},{"type":"function","title":"gl.arrayElement/1","doc":"[`gl:arrayElement/1`](`arrayElement/1`) commands are used within\n[`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pairs to specify\nvertex and attribute data for point, line, and polygon primitives. If\n`?GL_VERTEX_ARRAY` is enabled when [`gl:arrayElement/1`](`arrayElement/1`) is\ncalled, a single vertex is drawn, using vertex and attribute data taken from\nlocation `I` of the enabled arrays. If `?GL_VERTEX_ARRAY` is not enabled, no\ndrawing occurs but the attributes corresponding to the enabled arrays are\nmodified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glArrayElement.xml)","ref":"gl.html#arrayElement/1"},{"type":"function","title":"gl.attachShader/2","doc":"In order to create a complete shader program, there must be a way to specify the\nlist of things that will be linked together. Program objects provide this\nmechanism. Shaders that are to be linked together in a program object must first\nbe attached to that program object. [`gl:attachShader/2`](`attachShader/2`)\nattaches the shader object specified by `Shader` to the program object specified\nby `Program`. This indicates that `Shader` will be included in link operations\nthat will be performed on `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glAttachShader.xhtml)","ref":"gl.html#attachShader/2"},{"type":"function","title":"gl.begin/1","doc":"","ref":"gl.html#begin/1"},{"type":"function","title":"gl.beginConditionalRender/2","doc":"","ref":"gl.html#beginConditionalRender/2"},{"type":"function","title":"gl.beginQuery/2","doc":"","ref":"gl.html#beginQuery/2"},{"type":"function","title":"gl.beginQueryIndexed/3","doc":"","ref":"gl.html#beginQueryIndexed/3"},{"type":"function","title":"gl.beginTransformFeedback/1","doc":"","ref":"gl.html#beginTransformFeedback/1"},{"type":"function","title":"gl.bindAttribLocation/3","doc":"[`gl:bindAttribLocation/3`](`bindAttribLocation/3`) is used to associate a\nuser-defined attribute variable in the program object specified by `Program`\nwith a generic vertex attribute index. The name of the user-defined attribute\nvariable is passed as a null terminated string in `Name`. The generic vertex\nattribute index to be bound to this variable is specified by `Index`. When\n`Program` is made part of current state, values provided via the generic vertex\nattribute `Index` will modify the value of the user-defined attribute variable\nspecified by `Name`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindAttribLocation.xhtml)","ref":"gl.html#bindAttribLocation/3"},{"type":"function","title":"gl.bindBuffer/2","doc":"[`gl:bindBuffer/2`](`bindBuffer/2`) binds a buffer object to the specified\nbuffer binding point. Calling [`gl:bindBuffer/2`](`bindBuffer/2`) with `Target`\nset to one of the accepted symbolic constants and `Buffer` set to the name of a\nbuffer object binds that buffer object name to the target. If no buffer object\nwith name `Buffer` exists, one is created with that name. When a buffer object\nis bound to a target, the previous binding for that target is automatically\nbroken.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffer.xhtml)","ref":"gl.html#bindBuffer/2"},{"type":"function","title":"gl.bindBufferBase/3","doc":"[`gl:bindBufferBase/3`](`bindBufferBase/3`) binds the buffer object `Buffer` to\nthe binding point at index `Index` of the array of targets specified by\n`Target`. Each `Target` represents an indexed array of buffer binding points, as\nwell as a single general binding point that can be used by other buffer\nmanipulation functions such as [`gl:bindBuffer/2`](`bindBuffer/2`) or\n`glMapBuffer`. In addition to binding `Buffer` to the indexed buffer binding\ntarget, [`gl:bindBufferBase/3`](`bindBufferBase/3`) also binds `Buffer` to the\ngeneric buffer binding point specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBufferBase.xhtml)","ref":"gl.html#bindBufferBase/3"},{"type":"function","title":"gl.bindBufferRange/5","doc":"[`gl:bindBufferRange/5`](`bindBufferRange/5`) binds a range the buffer object\n`Buffer` represented by `Offset` and `Size` to the binding point at index\n`Index` of the array of targets specified by `Target`. Each `Target` represents\nan indexed array of buffer binding points, as well as a single general binding\npoint that can be used by other buffer manipulation functions such as\n[`gl:bindBuffer/2`](`bindBuffer/2`) or `glMapBuffer`. In addition to binding a\nrange of `Buffer` to the indexed buffer binding target,\n[`gl:bindBufferRange/5`](`bindBufferRange/5`) also binds the range to the\ngeneric buffer binding point specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBufferRange.xhtml)","ref":"gl.html#bindBufferRange/5"},{"type":"function","title":"gl.bindBuffersBase/3","doc":"[`gl:bindBuffersBase/3`](`bindBuffersBase/3`) binds a set of `Count` buffer\nobjects whose names are given in the array `Buffers` to the `Count` consecutive\nbinding points starting from index `First` of the array of targets specified by\n`Target`. If `Buffers` is `?NULL` then\n[`gl:bindBuffersBase/3`](`bindBuffersBase/3`) unbinds any buffers that are\ncurrently bound to the referenced binding points. Assuming no errors are\ngenerated, it is equivalent to the following pseudo-code, which calls\n[`gl:bindBufferBase/3`](`bindBufferBase/3`), with the exception that the\nnon-indexed `Target` is not changed by\n[`gl:bindBuffersBase/3`](`bindBuffersBase/3`):\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffersBase.xhtml)","ref":"gl.html#bindBuffersBase/3"},{"type":"function","title":"gl.bindBuffersRange/5","doc":"[`gl:bindBuffersRange/5`](`bindBuffersRange/5`) binds a set of `Count` ranges\nfrom buffer objects whose names are given in the array `Buffers` to the `Count`\nconsecutive binding points starting from index `First` of the array of targets\nspecified by `Target`. `Offsets` specifies the address of an array containing\n`Count` starting offsets within the buffers, and `Sizes` specifies the address\nof an array of `Count` sizes of the ranges. If `Buffers` is `?NULL` then\n`Offsets` and `Sizes` are ignored and\n[`gl:bindBuffersRange/5`](`bindBuffersRange/5`) unbinds any buffers that are\ncurrently bound to the referenced binding points. Assuming no errors are\ngenerated, it is equivalent to the following pseudo-code, which calls\n[`gl:bindBufferRange/5`](`bindBufferRange/5`), with the exception that the\nnon-indexed `Target` is not changed by\n[`gl:bindBuffersRange/5`](`bindBuffersRange/5`):\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindBuffersRange.xhtml)","ref":"gl.html#bindBuffersRange/5"},{"type":"function","title":"gl.bindFragDataLocation/3","doc":"[`gl:bindFragDataLocation/3`](`bindFragDataLocation/3`) explicitly specifies the\nbinding of the user-defined varying out variable `Name` to fragment shader color\nnumber `ColorNumber` for program `Program`. If `Name` was bound previously, its\nassigned binding is replaced with `ColorNumber`. `Name` must be a\nnull-terminated string. `ColorNumber` must be less than `?GL_MAX_DRAW_BUFFERS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFragDataLocation.xhtml)","ref":"gl.html#bindFragDataLocation/3"},{"type":"function","title":"gl.bindFragDataLocationIndexed/4","doc":"[`gl:bindFragDataLocationIndexed/4`](`bindFragDataLocationIndexed/4`) specifies\nthat the varying out variable `Name` in `Program` should be bound to fragment\ncolor `ColorNumber` when the program is next linked. `Index` may be zero or one\nto specify that the color be used as either the first or second color input to\nthe blend equation, respectively.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFragDataLocationIndexed.xhtml)","ref":"gl.html#bindFragDataLocationIndexed/4"},{"type":"function","title":"gl.bindFramebuffer/2","doc":"[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) binds the framebuffer object with\nname `Framebuffer` to the framebuffer target specified by `Target`. `Target`\nmust be either `?GL_DRAW_FRAMEBUFFER`, `?GL_READ_FRAMEBUFFER` or\n`?GL_FRAMEBUFFER`. If a framebuffer object is bound to `?GL_DRAW_FRAMEBUFFER` or\n`?GL_READ_FRAMEBUFFER`, it becomes the target for rendering or readback\noperations, respectively, until it is deleted or another framebuffer is bound to\nthe corresponding bind point. Calling\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) with `Target` set to\n`?GL_FRAMEBUFFER` binds `Framebuffer` to both the read and draw framebuffer\ntargets. `Framebuffer` is the name of a framebuffer object previously returned\nfrom a call to [`gl:genFramebuffers/1`](`genFramebuffers/1`), or zero to break\nthe existing binding of a framebuffer object to `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindFramebuffer.xhtml)","ref":"gl.html#bindFramebuffer/2"},{"type":"function","title":"gl.bindImageTexture/7","doc":"[`gl:bindImageTexture/7`](`bindImageTexture/7`) binds a single level of a\ntexture to an image unit for the purpose of reading and writing it from shaders.\n`Unit` specifies the zero-based index of the image unit to which to bind the\ntexture level. `Texture` specifies the name of an existing texture object to\nbind to the image unit. If `Texture` is zero, then any existing binding to the\nimage unit is broken. `Level` specifies the level of the texture to bind to the\nimage unit.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTexture.xhtml)","ref":"gl.html#bindImageTexture/7"},{"type":"function","title":"gl.bindImageTextures/2","doc":"[`gl:bindImageTextures/2`](`bindImageTextures/2`) binds images from an array of\nexisting texture objects to a specified number of consecutive image units.\n`Count` specifies the number of texture objects whose names are stored in the\narray `Textures`. That number of texture names are read from the array and bound\nto the `Count` consecutive texture units starting from `First`. If the name zero\nappears in the `Textures` array, any existing binding to the image unit is\nreset. Any non-zero entry in `Textures` must be the name of an existing texture\nobject. When a non-zero entry in `Textures` is present, the image at level zero\nis bound, the binding is considered layered, with the first layer set to zero,\nand the image is bound for read-write access. The image unit format parameter is\ntaken from the internal format of the image at level zero of the texture object.\nFor cube map textures, the internal format of the positive X image of level zero\nis used. If `Textures` is `?NULL` then it is as if an appropriately sized array\ncontaining only zeros had been specified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTextures.xhtml)","ref":"gl.html#bindImageTextures/2"},{"type":"function","title":"gl.bindProgramPipeline/1","doc":"[`gl:bindProgramPipeline/1`](`bindProgramPipeline/1`) binds a program pipeline\nobject to the current context. `Pipeline` must be a name previously returned\nfrom a call to [`gl:genProgramPipelines/1`](`genProgramPipelines/1`). If no\nprogram pipeline exists with name `Pipeline` then a new pipeline object is\ncreated with that name and initialized to the default state vector.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindProgramPipeline.xhtml)","ref":"gl.html#bindProgramPipeline/1"},{"type":"function","title":"gl.bindRenderbuffer/2","doc":"[`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) binds the renderbuffer object\nwith name `Renderbuffer` to the renderbuffer target specified by `Target`.\n`Target` must be `?GL_RENDERBUFFER`. `Renderbuffer` is the name of a\nrenderbuffer object previously returned from a call to\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`), or zero to break the existing\nbinding of a renderbuffer object to `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindRenderbuffer.xhtml)","ref":"gl.html#bindRenderbuffer/2"},{"type":"function","title":"gl.bindSampler/2","doc":"[`gl:bindSampler/2`](`bindSampler/2`) binds `Sampler` to the texture unit at\nindex `Unit`. `Sampler` must be zero or the name of a sampler object previously\nreturned from a call to [`gl:genSamplers/1`](`genSamplers/1`). `Unit` must be\nless than the value of `?GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindSampler.xhtml)","ref":"gl.html#bindSampler/2"},{"type":"function","title":"gl.bindSamplers/2","doc":"[`gl:bindSamplers/2`](`bindSamplers/2`) binds samplers from an array of existing\nsampler objects to a specified number of consecutive sampler units. `Count`\nspecifies the number of sampler objects whose names are stored in the array\n`Samplers`. That number of sampler names is read from the array and bound to the\n`Count` consecutive sampler units starting from `First`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindSamplers.xhtml)","ref":"gl.html#bindSamplers/2"},{"type":"function","title":"gl.bindTexture/2","doc":"[`gl:bindTexture/2`](`bindTexture/2`) lets you create or use a named texture.\nCalling [`gl:bindTexture/2`](`bindTexture/2`) with `Target` set to\n`?GL_TEXTURE_1D`, `?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, `?GL_TEXTURE_BUFFER`, `?GL_TEXTURE_2D_MULTISAMPLE`\nor `?GL_TEXTURE_2D_MULTISAMPLE_ARRAY` and `Texture` set to the name of the new\ntexture binds the texture name to the target. When a texture is bound to a\ntarget, the previous binding for that target is automatically broken.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTexture.xhtml)","ref":"gl.html#bindTexture/2"},{"type":"function","title":"gl.bindTextures/2","doc":"[`gl:bindTextures/2`](`bindTextures/2`) binds an array of existing texture\nobjects to a specified number of consecutive texture units. `Count` specifies\nthe number of texture objects whose names are stored in the array `Textures`.\nThat number of texture names are read from the array and bound to the `Count`\nconsecutive texture units starting from `First`. The target, or type of texture\nis deduced from the texture object and each texture is bound to the\ncorresponding target of the texture unit. If the name zero appears in the\n`Textures` array, any existing binding to any target of the texture unit is\nreset and the default texture for that target is bound in its place. Any\nnon-zero entry in `Textures` must be the name of an existing texture object. If\n`Textures` is `?NULL` then it is as if an appropriately sized array containing\nonly zeros had been specified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTextures.xhtml)","ref":"gl.html#bindTextures/2"},{"type":"function","title":"gl.bindTextureUnit/2","doc":"[`gl:bindTextureUnit/2`](`bindTextureUnit/2`) binds an existing texture object\nto the texture unit numbered `Unit`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTextureUnit.xhtml)","ref":"gl.html#bindTextureUnit/2"},{"type":"function","title":"gl.bindTransformFeedback/2","doc":"[`gl:bindTransformFeedback/2`](`bindTransformFeedback/2`) binds the transform\nfeedback object with name `Id` to the current GL state. `Id` must be a name\npreviously returned from a call to\n[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`). If `Id` has not\npreviously been bound, a new transform feedback object with name `Id` and\ninitialized with the default transform state vector is created.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTransformFeedback.xhtml)","ref":"gl.html#bindTransformFeedback/2"},{"type":"function","title":"gl.bindVertexArray/1","doc":"[`gl:bindVertexArray/1`](`bindVertexArray/1`) binds the vertex array object with\nname `Array`. `Array` is the name of a vertex array object previously returned\nfrom a call to [`gl:genVertexArrays/1`](`genVertexArrays/1`), or zero to break\nthe existing vertex array object binding.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexArray.xhtml)","ref":"gl.html#bindVertexArray/1"},{"type":"function","title":"gl.bindVertexBuffer/4","doc":"","ref":"gl.html#bindVertexBuffer/4"},{"type":"function","title":"gl.bindVertexBuffers/4","doc":"","ref":"gl.html#bindVertexBuffers/4"},{"type":"function","title":"gl.bitmap/7","doc":"A bitmap is a binary image. When drawn, the bitmap is positioned relative to the\ncurrent raster position, and frame buffer pixels corresponding to 1's in the\nbitmap are written using the current raster color or index. Frame buffer pixels\ncorresponding to 0's in the bitmap are not modified.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBitmap.xml)","ref":"gl.html#bitmap/7"},{"type":"function","title":"gl.blendColor/4","doc":"The `?GL_BLEND_COLOR` may be used to calculate the source and destination\nblending factors. The color components are clamped to the range \\[0 1] before\nbeing stored. See [`gl:blendFunc/2`](`blendFunc/2`) for a complete description\nof the blending operations. Initially the `?GL_BLEND_COLOR` is set to (0, 0, 0,\n0).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendColor.xhtml)","ref":"gl.html#blendColor/4"},{"type":"function","title":"gl.blendEquation/1","doc":"","ref":"gl.html#blendEquation/1"},{"type":"function","title":"gl.blendEquationi/2","doc":"The blend equations determine how a new pixel (the ''source'' color) is combined\nwith a pixel already in the framebuffer (the ''destination'' color). This\nfunction sets both the RGB blend equation and the alpha blend equation to a\nsingle equation. [`gl:blendEquationi/2`](`blendEquation/1`) specifies the blend\nequation for a single draw buffer whereas\n[`gl:blendEquation/1`](`blendEquation/1`) sets the blend equation for all draw\nbuffers.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendEquation.xhtml)","ref":"gl.html#blendEquationi/2"},{"type":"function","title":"gl.blendEquationSeparate/2","doc":"","ref":"gl.html#blendEquationSeparate/2"},{"type":"function","title":"gl.blendEquationSeparatei/3","doc":"The blend equations determines how a new pixel (the ''source'' color) is\ncombined with a pixel already in the framebuffer (the ''destination'' color).\nThese functions specify one blend equation for the RGB-color components and one\nblend equation for the alpha component.\n[`gl:blendEquationSeparatei/3`](`blendEquationSeparate/2`) specifies the blend\nequations for a single draw buffer whereas\n[`gl:blendEquationSeparate/2`](`blendEquationSeparate/2`) sets the blend\nequations for all draw buffers.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendEquationSeparate.xhtml)","ref":"gl.html#blendEquationSeparatei/3"},{"type":"function","title":"gl.blendFunc/2","doc":"","ref":"gl.html#blendFunc/2"},{"type":"function","title":"gl.blendFunci/3","doc":"Pixels can be drawn using a function that blends the incoming (source) RGBA\nvalues with the RGBA values that are already in the frame buffer (the\ndestination values). Blending is initially disabled. Use\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) with argument\n`?GL_BLEND` to enable and disable blending.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendFunc.xhtml)","ref":"gl.html#blendFunci/3"},{"type":"function","title":"gl.blendFuncSeparate/4","doc":"","ref":"gl.html#blendFuncSeparate/4"},{"type":"function","title":"gl.blendFuncSeparatei/5","doc":"Pixels can be drawn using a function that blends the incoming (source) RGBA\nvalues with the RGBA values that are already in the frame buffer (the\ndestination values). Blending is initially disabled. Use\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) with argument\n`?GL_BLEND` to enable and disable blending.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendFuncSeparate.xhtml)","ref":"gl.html#blendFuncSeparatei/5"},{"type":"function","title":"gl.blitFramebuffer/10","doc":"[`gl:blitFramebuffer/10`](`blitFramebuffer/10`) and `glBlitNamedFramebuffer`\ntransfer a rectangle of pixel values from one region of a read framebuffer to\nanother region of a draw framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlitFramebuffer.xhtml)","ref":"gl.html#blitFramebuffer/10"},{"type":"function","title":"gl.bufferData/4","doc":"[`gl:bufferData/4`](`bufferData/4`) and `glNamedBufferData` create a new data\nstore for a buffer object. In case of [`gl:bufferData/4`](`bufferData/4`), the\nbuffer object currently bound to `Target` is used. For `glNamedBufferData`, a\nbuffer object associated with ID specified by the caller in `Buffer` will be\nused instead.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferData.xhtml)","ref":"gl.html#bufferData/4"},{"type":"function","title":"gl.bufferStorage/4","doc":"[`gl:bufferStorage/4`](`bufferStorage/4`) and `glNamedBufferStorage` create a\nnew immutable data store. For [`gl:bufferStorage/4`](`bufferStorage/4`), the\nbuffer object currently bound to `Target` will be initialized. For\n`glNamedBufferStorage`, `Buffer` is the name of the buffer object that will be\nconfigured. The size of the data store is specified by `Size`. If an initial\ndata is available, its address may be supplied in `Data`. Otherwise, to create\nan uninitialized data store, `Data` should be `?NULL`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferStorage.xhtml)","ref":"gl.html#bufferStorage/4"},{"type":"function","title":"gl.bufferSubData/4","doc":"[`gl:bufferSubData/4`](`bufferSubData/4`) and `glNamedBufferSubData` redefine\nsome or all of the data store for the specified buffer object. Data starting at\nbyte offset `Offset` and extending for `Size` bytes is copied to the data store\nfrom the memory pointed to by `Data`. `Offset` and `Size` must define a range\nlying entirely within the buffer object's data store.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml)","ref":"gl.html#bufferSubData/4"},{"type":"function","title":"gl.callList/1","doc":"[`gl:callList/1`](`callList/1`) causes the named display list to be executed.\nThe commands saved in the display list are executed in order, just as if they\nwere called without using a display list. If `List` has not been defined as a\ndisplay list, [`gl:callList/1`](`callList/1`) is ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCallList.xml)","ref":"gl.html#callList/1"},{"type":"function","title":"gl.callLists/1","doc":"[`gl:callLists/1`](`callLists/1`) causes each display list in the list of names\npassed as `Lists` to be executed. As a result, the commands saved in each\ndisplay list are executed in order, just as if they were called without using a\ndisplay list. Names of display lists that have not been defined are ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCallLists.xml)","ref":"gl.html#callLists/1"},{"type":"function","title":"gl.checkFramebufferStatus/1","doc":"[`gl:checkFramebufferStatus/1`](`checkFramebufferStatus/1`) and\n`glCheckNamedFramebufferStatus` return the completeness status of a framebuffer\nobject when treated as a read or draw framebuffer, depending on the value of\n`Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCheckFramebufferStatus.xhtml)","ref":"gl.html#checkFramebufferStatus/1"},{"type":"function","title":"gl.clampColor/2","doc":"[`gl:clampColor/2`](`clampColor/2`) controls color clamping that is performed\nduring [`gl:readPixels/7`](`readPixels/7`). `Target` must be\n`?GL_CLAMP_READ_COLOR`. If `Clamp` is `?GL_TRUE`, read color clamping is\nenabled; if `Clamp` is `?GL_FALSE`, read color clamping is disabled. If `Clamp`\nis `?GL_FIXED_ONLY`, read color clamping is enabled only if the selected read\nbuffer has fixed point components and disabled otherwise.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClampColor.xhtml)","ref":"gl.html#clampColor/2"},{"type":"function","title":"gl.clear/1","doc":"[`gl:clear/1`](`clear/1`) sets the bitplane area of the window to values\npreviously selected by [`gl:clearColor/4`](`clearColor/4`),\n[`gl:clearDepth/1`](`clearDepth/1`), and\n[`gl:clearStencil/1`](`clearStencil/1`). Multiple color buffers can be cleared\nsimultaneously by selecting more than one buffer at a time using\n[`gl:drawBuffer/1`](`drawBuffer/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClear.xhtml)","ref":"gl.html#clear/1"},{"type":"function","title":"gl.clearAccum/4","doc":"[`gl:clearAccum/4`](`clearAccum/4`) specifies the red, green, blue, and alpha\nvalues used by [`gl:clear/1`](`clear/1`) to clear the accumulation buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClearAccum.xml)","ref":"gl.html#clearAccum/4"},{"type":"function","title":"gl.clearBufferData/5","doc":"","ref":"gl.html#clearBufferData/5"},{"type":"function","title":"gl.clearBufferfi/4","doc":"","ref":"gl.html#clearBufferfi/4"},{"type":"function","title":"gl.clearBufferfv/3","doc":"","ref":"gl.html#clearBufferfv/3"},{"type":"function","title":"gl.clearBufferiv/3","doc":"","ref":"gl.html#clearBufferiv/3"},{"type":"function","title":"gl.clearBufferSubData/7","doc":"","ref":"gl.html#clearBufferSubData/7"},{"type":"function","title":"gl.clearBufferuiv/3","doc":"These commands clear a specified buffer of a framebuffer to specified value(s).\nFor [`gl:clearBuffer*()`](`clearBufferiv/3`), the framebuffer is the currently\nbound draw framebuffer object. For `glClearNamedFramebuffer*`, `Framebuffer` is\nzero, indicating the default draw framebuffer, or the name of a framebuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearBuffer.xhtml)","ref":"gl.html#clearBufferuiv/3"},{"type":"function","title":"gl.clearColor/4","doc":"[`gl:clearColor/4`](`clearColor/4`) specifies the red, green, blue, and alpha\nvalues used by [`gl:clear/1`](`clear/1`) to clear the color buffers. Values\nspecified by [`gl:clearColor/4`](`clearColor/4`) are clamped to the range \\[0\n1].\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearColor.xhtml)","ref":"gl.html#clearColor/4"},{"type":"function","title":"gl.clearDepth/1","doc":"","ref":"gl.html#clearDepth/1"},{"type":"function","title":"gl.clearDepthf/1","doc":"[`gl:clearDepth/1`](`clearDepth/1`) specifies the depth value used by\n[`gl:clear/1`](`clear/1`) to clear the depth buffer. Values specified by\n[`gl:clearDepth/1`](`clearDepth/1`) are clamped to the range \\[0 1].\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearDepth.xhtml)","ref":"gl.html#clearDepthf/1"},{"type":"function","title":"gl.clearIndex/1","doc":"[`gl:clearIndex/1`](`clearIndex/1`) specifies the index used by\n[`gl:clear/1`](`clear/1`) to clear the color index buffers. `C` is not clamped.\nRather, `C` is converted to a fixed-point value with unspecified precision to\nthe right of the binary point. The integer part of this value is then masked\nwith 2 m-1, where m is the number of bits in a color index stored in the frame\nbuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClearIndex.xml)","ref":"gl.html#clearIndex/1"},{"type":"function","title":"gl.clearStencil/1","doc":"[`gl:clearStencil/1`](`clearStencil/1`) specifies the index used by\n[`gl:clear/1`](`clear/1`) to clear the stencil buffer. `S` is masked with 2 m-1,\nwhere m is the number of bits in the stencil buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearStencil.xhtml)","ref":"gl.html#clearStencil/1"},{"type":"function","title":"gl.clearTexImage/5","doc":"[`gl:clearTexImage/5`](`clearTexImage/5`) fills all an image contained in a\ntexture with an application supplied value. `Texture` must be the name of an\nexisting texture. Further, `Texture` may not be the name of a buffer texture,\nnor may its internal format be compressed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearTexImage.xhtml)","ref":"gl.html#clearTexImage/5"},{"type":"function","title":"gl.clearTexSubImage/11","doc":"[`gl:clearTexSubImage/11`](`clearTexSubImage/11`) fills all or part of an image\ncontained in a texture with an application supplied value. `Texture` must be the\nname of an existing texture. Further, `Texture` may not be the name of a buffer\ntexture, nor may its internal format be compressed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClearTexSubImage.xhtml)","ref":"gl.html#clearTexSubImage/11"},{"type":"function","title":"gl.clientActiveTexture/1","doc":"[`gl:clientActiveTexture/1`](`clientActiveTexture/1`) selects the vertex array\nclient state parameters to be modified by\n[`gl:texCoordPointer/4`](`texCoordPointer/4`), and enabled or disabled with\n[`gl:enableClientState/1`](`enableClientState/1`) or\n[`gl:disableClientState/1`](`enableClientState/1`), respectively, when called\nwith a parameter of `?GL_TEXTURE_COORD_ARRAY`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClientActiveTexture.xml)","ref":"gl.html#clientActiveTexture/1"},{"type":"function","title":"gl.clientWaitSync/3","doc":"[`gl:clientWaitSync/3`](`clientWaitSync/3`) causes the client to block and wait\nfor the sync object specified by `Sync` to become signaled. If `Sync` is\nsignaled when [`gl:clientWaitSync/3`](`clientWaitSync/3`) is called,\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) returns immediately, otherwise it\nwill block and wait for up to `Timeout` nanoseconds for `Sync` to become\nsignaled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClientWaitSync.xhtml)","ref":"gl.html#clientWaitSync/3"},{"type":"function","title":"gl.clipControl/2","doc":"[`gl:clipControl/2`](`clipControl/2`) controls the clipping volume behavior and\nthe clip coordinate to window coordinate transformation behavior.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glClipControl.xhtml)","ref":"gl.html#clipControl/2"},{"type":"function","title":"gl.clipPlane/2","doc":"Geometry is always clipped against the boundaries of a six-plane frustum in `x`,\n`y`, and `z`. [`gl:clipPlane/2`](`clipPlane/2`) allows the specification of\nadditional planes, not necessarily perpendicular to the `x`, `y`, or `z` axis,\nagainst which all geometry is clipped. To determine the maximum number of\nadditional clipping planes, call [`gl:getIntegerv/1`](`getBooleanv/1`) with\nargument `?GL_MAX_CLIP_PLANES`. All implementations support at least six such\nclipping planes. Because the resulting clipping region is the intersection of\nthe defined half-spaces, it is always convex.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClipPlane.xml)","ref":"gl.html#clipPlane/2"},{"type":"function","title":"gl.color3b/3","doc":"","ref":"gl.html#color3b/3"},{"type":"function","title":"gl.color3bv/1","doc":"","ref":"gl.html#color3bv/1"},{"type":"function","title":"gl.color3d/3","doc":"","ref":"gl.html#color3d/3"},{"type":"function","title":"gl.color3dv/1","doc":"","ref":"gl.html#color3dv/1"},{"type":"function","title":"gl.color3f/3","doc":"","ref":"gl.html#color3f/3"},{"type":"function","title":"gl.color3fv/1","doc":"","ref":"gl.html#color3fv/1"},{"type":"function","title":"gl.color3i/3","doc":"","ref":"gl.html#color3i/3"},{"type":"function","title":"gl.color3iv/1","doc":"","ref":"gl.html#color3iv/1"},{"type":"function","title":"gl.color3s/3","doc":"","ref":"gl.html#color3s/3"},{"type":"function","title":"gl.color3sv/1","doc":"","ref":"gl.html#color3sv/1"},{"type":"function","title":"gl.color3ub/3","doc":"","ref":"gl.html#color3ub/3"},{"type":"function","title":"gl.color3ubv/1","doc":"","ref":"gl.html#color3ubv/1"},{"type":"function","title":"gl.color3ui/3","doc":"","ref":"gl.html#color3ui/3"},{"type":"function","title":"gl.color3uiv/1","doc":"","ref":"gl.html#color3uiv/1"},{"type":"function","title":"gl.color3us/3","doc":"","ref":"gl.html#color3us/3"},{"type":"function","title":"gl.color3usv/1","doc":"","ref":"gl.html#color3usv/1"},{"type":"function","title":"gl.color4b/4","doc":"","ref":"gl.html#color4b/4"},{"type":"function","title":"gl.color4bv/1","doc":"","ref":"gl.html#color4bv/1"},{"type":"function","title":"gl.color4d/4","doc":"","ref":"gl.html#color4d/4"},{"type":"function","title":"gl.color4dv/1","doc":"","ref":"gl.html#color4dv/1"},{"type":"function","title":"gl.color4f/4","doc":"","ref":"gl.html#color4f/4"},{"type":"function","title":"gl.color4fv/1","doc":"","ref":"gl.html#color4fv/1"},{"type":"function","title":"gl.color4i/4","doc":"","ref":"gl.html#color4i/4"},{"type":"function","title":"gl.color4iv/1","doc":"","ref":"gl.html#color4iv/1"},{"type":"function","title":"gl.color4s/4","doc":"","ref":"gl.html#color4s/4"},{"type":"function","title":"gl.color4sv/1","doc":"","ref":"gl.html#color4sv/1"},{"type":"function","title":"gl.color4ub/4","doc":"","ref":"gl.html#color4ub/4"},{"type":"function","title":"gl.color4ubv/1","doc":"","ref":"gl.html#color4ubv/1"},{"type":"function","title":"gl.color4ui/4","doc":"","ref":"gl.html#color4ui/4"},{"type":"function","title":"gl.color4uiv/1","doc":"","ref":"gl.html#color4uiv/1"},{"type":"function","title":"gl.color4us/4","doc":"","ref":"gl.html#color4us/4"},{"type":"function","title":"gl.color4usv/1","doc":"The GL stores both a current single-valued color index and a current four-valued\nRGBA color. [`gl:color()`](`color3b/3`) sets a new four-valued RGBA color.\n[`gl:color()`](`color3b/3`) has two major variants: [`gl:color3()`](`color3b/3`)\nand [`gl:color4()`](`color3b/3`). [`gl:color3()`](`color3b/3`) variants specify\nnew red, green, and blue values explicitly and set the current alpha value to\n1.0 (full intensity) implicitly. [`gl:color4()`](`color3b/3`) variants specify\nall four color components explicitly.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColor.xml)","ref":"gl.html#color4usv/1"},{"type":"function","title":"gl.colorMask/4","doc":"","ref":"gl.html#colorMask/4"},{"type":"function","title":"gl.colorMaski/5","doc":"[`gl:colorMask/4`](`colorMask/4`) and [`gl:colorMaski/5`](`colorMask/4`) specify\nwhether the individual color components in the frame buffer can or cannot be\nwritten. [`gl:colorMaski/5`](`colorMask/4`) sets the mask for a specific draw\nbuffer, whereas [`gl:colorMask/4`](`colorMask/4`) sets the mask for all draw\nbuffers. If `Red` is `?GL_FALSE`, for example, no change is made to the red\ncomponent of any pixel in any of the color buffers, regardless of the drawing\noperation attempted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glColorMask.xhtml)","ref":"gl.html#colorMaski/5"},{"type":"function","title":"gl.colorMaterial/2","doc":"[`gl:colorMaterial/2`](`colorMaterial/2`) specifies which material parameters\ntrack the current color. When `?GL_COLOR_MATERIAL` is enabled, the material\nparameter or parameters specified by `Mode`, of the material or materials\nspecified by `Face`, track the current color at all times.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorMaterial.xml)","ref":"gl.html#colorMaterial/2"},{"type":"function","title":"gl.colorPointer/4","doc":"[`gl:colorPointer/4`](`colorPointer/4`) specifies the location and data format\nof an array of color components to use when rendering. `Size` specifies the\nnumber of components per color, and must be 3 or 4. `Type` specifies the data\ntype of each color component, and `Stride` specifies the byte stride from one\ncolor to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays. (Single-array storage may be more efficient\non some implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorPointer.xml)","ref":"gl.html#colorPointer/4"},{"type":"function","title":"gl.colorSubTable/6","doc":"[`gl:colorSubTable/6`](`colorSubTable/6`) is used to respecify a contiguous\nportion of a color table previously defined using\n[`gl:colorTable/6`](`colorTable/6`). The pixels referenced by `Data` replace the\nportion of the existing table from indices `Start` to start+count-1, inclusive.\nThis region may not include any entries outside the range of the color table as\nit was originally specified. It is not an error to specify a subtexture with\nwidth of 0, but such a specification has no effect.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorSubTable.xml)","ref":"gl.html#colorSubTable/6"},{"type":"function","title":"gl.colorTable/6","doc":"[`gl:colorTable/6`](`colorTable/6`) may be used in two ways: to test the actual\nsize and color resolution of a lookup table given a particular set of\nparameters, or to load the contents of a color lookup table. Use the targets\n`?GL_PROXY_*` for the first case and the other targets for the second case.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorTable.xml)","ref":"gl.html#colorTable/6"},{"type":"function","title":"gl.colorTableParameterfv/3","doc":"","ref":"gl.html#colorTableParameterfv/3"},{"type":"function","title":"gl.colorTableParameteriv/3","doc":"[`gl:colorTableParameter()`](`colorTableParameterfv/3`) is used to specify the\nscale factors and bias terms applied to color components when they are loaded\ninto a color table. `Target` indicates which color table the scale and bias\nterms apply to; it must be set to `?GL_COLOR_TABLE`,\n`?GL_POST_CONVOLUTION_COLOR_TABLE`, or `?GL_POST_COLOR_MATRIX_COLOR_TABLE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glColorTableParameter.xml)","ref":"gl.html#colorTableParameteriv/3"},{"type":"function","title":"gl.compileShader/1","doc":"[`gl:compileShader/1`](`compileShader/1`) compiles the source code strings that\nhave been stored in the shader object specified by `Shader`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompileShader.xhtml)","ref":"gl.html#compileShader/1"},{"type":"function","title":"gl.compressedTexImage1D/7","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage1D.xhtml)","ref":"gl.html#compressedTexImage1D/7"},{"type":"function","title":"gl.compressedTexImage2D/8","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage2D.xhtml)","ref":"gl.html#compressedTexImage2D/8"},{"type":"function","title":"gl.compressedTexImage3D/9","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage3D.xhtml)","ref":"gl.html#compressedTexImage3D/9"},{"type":"function","title":"gl.compressedTexSubImage1D/7","doc":"","ref":"gl.html#compressedTexSubImage1D/7"},{"type":"function","title":"gl.compressedTexSubImage2D/9","doc":"","ref":"gl.html#compressedTexSubImage2D/9"},{"type":"function","title":"gl.compressedTexSubImage3D/11","doc":"","ref":"gl.html#compressedTexSubImage3D/11"},{"type":"function","title":"gl.compressedTextureSubImage1D/7","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage1D.xhtml)","ref":"gl.html#compressedTextureSubImage1D/7"},{"type":"function","title":"gl.compressedTextureSubImage2D/9","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage2D.xhtml)","ref":"gl.html#compressedTextureSubImage2D/9"},{"type":"function","title":"gl.compressedTextureSubImage3D/11","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexSubImage3D.xhtml)","ref":"gl.html#compressedTextureSubImage3D/11"},{"type":"function","title":"gl.convolutionFilter1D/6","doc":"[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`) builds a one-dimensional\nconvolution filter kernel from an array of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionFilter1D.xml)","ref":"gl.html#convolutionFilter1D/6"},{"type":"function","title":"gl.convolutionFilter2D/7","doc":"[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`) builds a two-dimensional\nconvolution filter kernel from an array of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionFilter2D.xml)","ref":"gl.html#convolutionFilter2D/7"},{"type":"function","title":"gl.convolutionParameterf/3","doc":"","ref":"gl.html#convolutionParameterf/3"},{"type":"function","title":"gl.convolutionParameterfv/3","doc":"","ref":"gl.html#convolutionParameterfv/3"},{"type":"function","title":"gl.convolutionParameteri/3","doc":"","ref":"gl.html#convolutionParameteri/3"},{"type":"function","title":"gl.convolutionParameteriv/3","doc":"[`gl:convolutionParameter()`](`convolutionParameterf/3`) sets the value of a\nconvolution parameter.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glConvolutionParameter.xml)","ref":"gl.html#convolutionParameteriv/3"},{"type":"function","title":"gl.copyBufferSubData/5","doc":"[`gl:copyBufferSubData/5`](`copyBufferSubData/5`) and `glCopyNamedBufferSubData`\ncopy part of the data store attached to a source buffer object to the data store\nattached to a destination buffer object. The number of basic machine units\nindicated by `Size` is copied from the source at offset `ReadOffset` to the\ndestination at `WriteOffset`. `ReadOffset`, `WriteOffset` and `Size` are in\nterms of basic machine units.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyBufferSubData.xhtml)","ref":"gl.html#copyBufferSubData/5"},{"type":"function","title":"gl.copyColorSubTable/5","doc":"[`gl:copyColorSubTable/5`](`copyColorSubTable/5`) is used to respecify a\ncontiguous portion of a color table previously defined using\n[`gl:colorTable/6`](`colorTable/6`). The pixels copied from the framebuffer\nreplace the portion of the existing table from indices `Start` to start+x-1,\ninclusive. This region may not include any entries outside the range of the\ncolor table, as was originally specified. It is not an error to specify a\nsubtexture with width of 0, but such a specification has no effect.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyColorSubTable.xml)","ref":"gl.html#copyColorSubTable/5"},{"type":"function","title":"gl.copyColorTable/5","doc":"[`gl:copyColorTable/5`](`copyColorTable/5`) loads a color table with pixels from\nthe current `?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:colorTable/6`](`colorTable/6`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyColorTable.xml)","ref":"gl.html#copyColorTable/5"},{"type":"function","title":"gl.copyConvolutionFilter1D/5","doc":"[`gl:copyConvolutionFilter1D/5`](`copyConvolutionFilter1D/5`) defines a\none-dimensional convolution filter kernel with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyConvolutionFilter1D.xml)","ref":"gl.html#copyConvolutionFilter1D/5"},{"type":"function","title":"gl.copyConvolutionFilter2D/6","doc":"[`gl:copyConvolutionFilter2D/6`](`copyConvolutionFilter2D/6`) defines a\ntwo-dimensional convolution filter kernel with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyConvolutionFilter2D.xml)","ref":"gl.html#copyConvolutionFilter2D/6"},{"type":"function","title":"gl.copyImageSubData/15","doc":"[`gl:copyImageSubData/15`](`copyImageSubData/15`) may be used to copy data from\none image (i.e. texture or renderbuffer) to another.\n[`gl:copyImageSubData/15`](`copyImageSubData/15`) does not perform\ngeneral-purpose conversions such as scaling, resizing, blending, color-space, or\nformat conversions. It should be considered to operate in a manner similar to a\nCPU memcpy. CopyImageSubData can copy between images with different internal\nformats, provided the formats are compatible.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyImageSubData.xhtml)","ref":"gl.html#copyImageSubData/15"},{"type":"function","title":"gl.copyPixels/5","doc":"[`gl:copyPixels/5`](`copyPixels/5`) copies a screen-aligned rectangle of pixels\nfrom the specified frame buffer location to a region relative to the current\nraster position. Its operation is well defined only if the entire pixel source\nregion is within the exposed portion of the window. Results of copies from\noutside the window, or from regions of the window that are not exposed, are\nhardware dependent and undefined.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glCopyPixels.xml)","ref":"gl.html#copyPixels/5"},{"type":"function","title":"gl.copyTexImage1D/7","doc":"[`gl:copyTexImage1D/7`](`copyTexImage1D/7`) defines a one-dimensional texture\nimage with pixels from the current `?GL_READ_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexImage1D.xhtml)","ref":"gl.html#copyTexImage1D/7"},{"type":"function","title":"gl.copyTexImage2D/8","doc":"[`gl:copyTexImage2D/8`](`copyTexImage2D/8`) defines a two-dimensional texture\nimage, or cube-map texture image with pixels from the current `?GL_READ_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexImage2D.xhtml)","ref":"gl.html#copyTexImage2D/8"},{"type":"function","title":"gl.copyTexSubImage1D/6","doc":"[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`) and `glCopyTextureSubImage1D`\nreplace a portion of a one-dimensional texture image with pixels from the\ncurrent `?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:texSubImage1D/7`](`texSubImage1D/7`)). For\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`), the texture object that is\nbound to `Target` will be used for the process. For `glCopyTextureSubImage1D`,\n`Texture` tells which texture object should be used for the purpose of the call.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage1D.xhtml)","ref":"gl.html#copyTexSubImage1D/6"},{"type":"function","title":"gl.copyTexSubImage2D/8","doc":"[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`) and `glCopyTextureSubImage2D`\nreplace a rectangular portion of a two-dimensional texture image, cube-map\ntexture image, rectangular image, or a linear portion of a number of slices of a\none-dimensional array texture with pixels from the current `?GL_READ_BUFFER`\n(rather than from main memory, as is the case for\n[`gl:texSubImage2D/9`](`texSubImage2D/9`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage2D.xhtml)","ref":"gl.html#copyTexSubImage2D/8"},{"type":"function","title":"gl.copyTexSubImage3D/9","doc":"[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`) and `glCopyTextureSubImage3D`\nfunctions replace a rectangular portion of a three-dimensional or\ntwo-dimensional array texture image with pixels from the current\n`?GL_READ_BUFFER` (rather than from main memory, as is the case for\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCopyTexSubImage3D.xhtml)","ref":"gl.html#copyTexSubImage3D/9"},{"type":"function","title":"gl.createBuffers/1","doc":"[`gl:createBuffers/1`](`createBuffers/1`) returns `N` previously unused buffer\nnames in `Buffers`, each representing a new buffer object initialized as if it\nhad been bound to an unspecified target.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateBuffers.xhtml)","ref":"gl.html#createBuffers/1"},{"type":"function","title":"gl.createFramebuffers/1","doc":"[`gl:createFramebuffers/1`](`createFramebuffers/1`) returns `N` previously\nunused framebuffer names in `Framebuffers`, each representing a new framebuffer\nobject initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateFramebuffers.xhtml)","ref":"gl.html#createFramebuffers/1"},{"type":"function","title":"gl.createProgram/0","doc":"[`gl:createProgram/0`](`createProgram/0`) creates an empty program object and\nreturns a non-zero value by which it can be referenced. A program object is an\nobject to which shader objects can be attached. This provides a mechanism to\nspecify the shader objects that will be linked to create a program. It also\nprovides a means for checking the compatibility of the shaders that will be used\nto create a program (for instance, checking the compatibility between a vertex\nshader and a fragment shader). When no longer needed as part of a program\nobject, shader objects can be detached.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateProgram.xhtml)","ref":"gl.html#createProgram/0"},{"type":"function","title":"gl.createProgramPipelines/1","doc":"[`gl:createProgramPipelines/1`](`createProgramPipelines/1`) returns `N`\npreviously unused program pipeline names in `Pipelines`, each representing a new\nprogram pipeline object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateProgramPipelines.xhtml)","ref":"gl.html#createProgramPipelines/1"},{"type":"function","title":"gl.createQueries/2","doc":"[`gl:createQueries/2`](`createQueries/2`) returns `N` previously unused query\nobject names in `Ids`, each representing a new query object with the specified\n`Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateQueries.xhtml)","ref":"gl.html#createQueries/2"},{"type":"function","title":"gl.createRenderbuffers/1","doc":"[`gl:createRenderbuffers/1`](`createRenderbuffers/1`) returns `N` previously\nunused renderbuffer object names in `Renderbuffers`, each representing a new\nrenderbuffer object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateRenderbuffers.xhtml)","ref":"gl.html#createRenderbuffers/1"},{"type":"function","title":"gl.createSamplers/1","doc":"[`gl:createSamplers/1`](`createSamplers/1`) returns `N` previously unused\nsampler names in `Samplers`, each representing a new sampler object initialized\nto the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateSamplers.xhtml)","ref":"gl.html#createSamplers/1"},{"type":"function","title":"gl.createShader/1","doc":"[`gl:createShader/1`](`createShader/1`) creates an empty shader object and\nreturns a non-zero value by which it can be referenced. A shader object is used\nto maintain the source code strings that define a shader. `ShaderType` indicates\nthe type of shader to be created. Five types of shader are supported. A shader\nof type `?GL_COMPUTE_SHADER` is a shader that is intended to run on the\nprogrammable compute processor. A shader of type `?GL_VERTEX_SHADER` is a shader\nthat is intended to run on the programmable vertex processor. A shader of type\n`?GL_TESS_CONTROL_SHADER` is a shader that is intended to run on the\nprogrammable tessellation processor in the control stage. A shader of type\n`?GL_TESS_EVALUATION_SHADER` is a shader that is intended to run on the\nprogrammable tessellation processor in the evaluation stage. A shader of type\n`?GL_GEOMETRY_SHADER` is a shader that is intended to run on the programmable\ngeometry processor. A shader of type `?GL_FRAGMENT_SHADER` is a shader that is\nintended to run on the programmable fragment processor.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateShader.xhtml)","ref":"gl.html#createShader/1"},{"type":"function","title":"gl.createShaderProgramv/2","doc":"[`gl:createShaderProgram()`](`createShaderProgramv/2`) creates a program object\ncontaining compiled and linked shaders for a single stage specified by `Type`.\n`Strings` refers to an array of `Count` strings from which to create the shader\nexecutables.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateShaderProgram.xhtml)","ref":"gl.html#createShaderProgramv/2"},{"type":"function","title":"gl.createTextures/2","doc":"[`gl:createTextures/2`](`createTextures/2`) returns `N` previously unused\ntexture names in `Textures`, each representing a new texture object of the\ndimensionality and type specified by `Target` and initialized to the default\nvalues for that texture type.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateTextures.xhtml)","ref":"gl.html#createTextures/2"},{"type":"function","title":"gl.createTransformFeedbacks/1","doc":"[`gl:createTransformFeedbacks/1`](`createTransformFeedbacks/1`) returns `N`\npreviously unused transform feedback object names in `Ids`, each representing a\nnew transform feedback object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateTransformFeedbacks.xhtml)","ref":"gl.html#createTransformFeedbacks/1"},{"type":"function","title":"gl.createVertexArrays/1","doc":"[`gl:createVertexArrays/1`](`createVertexArrays/1`) returns `N` previously\nunused vertex array object names in `Arrays`, each representing a new vertex\narray object initialized to the default state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCreateVertexArrays.xhtml)","ref":"gl.html#createVertexArrays/1"},{"type":"function","title":"gl.cullFace/1","doc":"[`gl:cullFace/1`](`cullFace/1`) specifies whether front- or back-facing facets\nare culled (as specified by `mode`) when facet culling is enabled. Facet culling\nis initially disabled. To enable and disable facet culling, call the\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) commands with the\nargument `?GL_CULL_FACE`. Facets include triangles, quadrilaterals, polygons,\nand rectangles.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCullFace.xhtml)","ref":"gl.html#cullFace/1"},{"type":"function","title":"gl.debugMessageControl/5","doc":"[`gl:debugMessageControl/5`](`debugMessageControl/5`) controls the reporting of\ndebug messages generated by a debug context. The parameters `Source`, `Type` and\n`Severity` form a filter to select messages from the pool of potential messages\ngenerated by the GL.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDebugMessageControl.xhtml)","ref":"gl.html#debugMessageControl/5"},{"type":"function","title":"gl.debugMessageInsert/5","doc":"[`gl:debugMessageInsert/5`](`debugMessageInsert/5`) inserts a user-supplied\nmessage into the debug output queue. `Source` specifies the source that will be\nused to classify the message and must be `?GL_DEBUG_SOURCE_APPLICATION` or\n`?GL_DEBUG_SOURCE_THIRD_PARTY`. All other sources are reserved for use by the GL\nimplementation. `Type` indicates the type of the message to be inserted and may\nbe one of `?GL_DEBUG_TYPE_ERROR`, `?GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR`,\n`?GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR`, `?GL_DEBUG_TYPE_PORTABILITY`,\n`?GL_DEBUG_TYPE_PERFORMANCE`, `?GL_DEBUG_TYPE_MARKER`,\n`?GL_DEBUG_TYPE_PUSH_GROUP`, `?GL_DEBUG_TYPE_POP_GROUP`, or\n`?GL_DEBUG_TYPE_OTHER`. `Severity` indicates the severity of the message and may\nbe `?GL_DEBUG_SEVERITY_LOW`, `?GL_DEBUG_SEVERITY_MEDIUM`,\n`?GL_DEBUG_SEVERITY_HIGH` or `?GL_DEBUG_SEVERITY_NOTIFICATION`. `Id` is\navailable for application defined use and may be any value. This value will be\nrecorded and used to identify the message.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDebugMessageInsert.xhtml)","ref":"gl.html#debugMessageInsert/5"},{"type":"function","title":"gl.deleteBuffers/1","doc":"[`gl:deleteBuffers/1`](`deleteBuffers/1`) deletes `N` buffer objects named by\nthe elements of the array `Buffers`. After a buffer object is deleted, it has no\ncontents, and its name is free for reuse (for example by\n[`gl:genBuffers/1`](`genBuffers/1`)). If a buffer object that is currently bound\nis deleted, the binding reverts to 0 (the absence of any buffer object).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteBuffers.xhtml)","ref":"gl.html#deleteBuffers/1"},{"type":"function","title":"gl.deleteFramebuffers/1","doc":"[`gl:deleteFramebuffers/1`](`deleteFramebuffers/1`) deletes the `N` framebuffer\nobjects whose names are stored in the array addressed by `Framebuffers`. The\nname zero is reserved by the GL and is silently ignored, should it occur in\n`Framebuffers`, as are other unused names. Once a framebuffer object is deleted,\nits name is again unused and it has no attachments. If a framebuffer that is\ncurrently bound to one or more of the targets `?GL_DRAW_FRAMEBUFFER` or\n`?GL_READ_FRAMEBUFFER` is deleted, it is as though\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`) had been executed with the\ncorresponding `Target` and `Framebuffer` zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteFramebuffers.xhtml)","ref":"gl.html#deleteFramebuffers/1"},{"type":"function","title":"gl.deleteLists/2","doc":"[`gl:deleteLists/2`](`deleteLists/2`) causes a contiguous group of display lists\nto be deleted. `List` is the name of the first display list to be deleted, and\n`Range` is the number of display lists to delete. All display lists d with\nlist<= d<= list+range-1 are deleted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glDeleteLists.xml)","ref":"gl.html#deleteLists/2"},{"type":"function","title":"gl.deleteProgram/1","doc":"[`gl:deleteProgram/1`](`deleteProgram/1`) frees the memory and invalidates the\nname associated with the program object specified by `Program.` This command\neffectively undoes the effects of a call to\n[`gl:createProgram/0`](`createProgram/0`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteProgram.xhtml)","ref":"gl.html#deleteProgram/1"},{"type":"function","title":"gl.deleteProgramPipelines/1","doc":"[`gl:deleteProgramPipelines/1`](`deleteProgramPipelines/1`) deletes the `N`\nprogram pipeline objects whose names are stored in the array `Pipelines`. Unused\nnames in `Pipelines` are ignored, as is the name zero. After a program pipeline\nobject is deleted, its name is again unused and it has no contents. If program\npipeline object that is currently bound is deleted, the binding for that object\nreverts to zero and no program pipeline object becomes current.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteProgramPipelines.xhtml)","ref":"gl.html#deleteProgramPipelines/1"},{"type":"function","title":"gl.deleteQueries/1","doc":"[`gl:deleteQueries/1`](`deleteQueries/1`) deletes `N` query objects named by the\nelements of the array `Ids`. After a query object is deleted, it has no\ncontents, and its name is free for reuse (for example by\n[`gl:genQueries/1`](`genQueries/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteQueries.xhtml)","ref":"gl.html#deleteQueries/1"},{"type":"function","title":"gl.deleteRenderbuffers/1","doc":"[`gl:deleteRenderbuffers/1`](`deleteRenderbuffers/1`) deletes the `N`\nrenderbuffer objects whose names are stored in the array addressed by\n`Renderbuffers`. The name zero is reserved by the GL and is silently ignored,\nshould it occur in `Renderbuffers`, as are other unused names. Once a\nrenderbuffer object is deleted, its name is again unused and it has no contents.\nIf a renderbuffer that is currently bound to the target `?GL_RENDERBUFFER` is\ndeleted, it is as though [`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) had\nbeen executed with a `Target` of `?GL_RENDERBUFFER` and a `Name` of zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteRenderbuffers.xhtml)","ref":"gl.html#deleteRenderbuffers/1"},{"type":"function","title":"gl.deleteSamplers/1","doc":"[`gl:deleteSamplers/1`](`deleteSamplers/1`) deletes `N` sampler objects named by\nthe elements of the array `Samplers`. After a sampler object is deleted, its\nname is again unused. If a sampler object that is currently bound to a sampler\nunit is deleted, it is as though [`gl:bindSampler/2`](`bindSampler/2`) is called\nwith unit set to the unit the sampler is bound to and sampler zero. Unused names\nin samplers are silently ignored, as is the reserved name zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteSamplers.xhtml)","ref":"gl.html#deleteSamplers/1"},{"type":"function","title":"gl.deleteShader/1","doc":"[`gl:deleteShader/1`](`deleteShader/1`) frees the memory and invalidates the\nname associated with the shader object specified by `Shader`. This command\neffectively undoes the effects of a call to\n[`gl:createShader/1`](`createShader/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteShader.xhtml)","ref":"gl.html#deleteShader/1"},{"type":"function","title":"gl.deleteSync/1","doc":"[`gl:deleteSync/1`](`deleteSync/1`) deletes the sync object specified by `Sync`.\nIf the fence command corresponding to the specified sync object has completed,\nor if no [`gl:waitSync/3`](`waitSync/3`) or\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) commands are blocking on `Sync`, the\nobject is deleted immediately. Otherwise, `Sync` is flagged for deletion and\nwill be deleted when it is no longer associated with any fence command and is no\nlonger blocking any [`gl:waitSync/3`](`waitSync/3`) or\n[`gl:clientWaitSync/3`](`clientWaitSync/3`) command. In either case, after\n[`gl:deleteSync/1`](`deleteSync/1`) returns, the name `Sync` is invalid and can\nno longer be used to refer to the sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteSync.xhtml)","ref":"gl.html#deleteSync/1"},{"type":"function","title":"gl.deleteTextures/1","doc":"[`gl:deleteTextures/1`](`deleteTextures/1`) deletes `N` textures named by the\nelements of the array `Textures`. After a texture is deleted, it has no contents\nor dimensionality, and its name is free for reuse (for example by\n[`gl:genTextures/1`](`genTextures/1`)). If a texture that is currently bound is\ndeleted, the binding reverts to 0 (the default texture).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteTextures.xhtml)","ref":"gl.html#deleteTextures/1"},{"type":"function","title":"gl.deleteTransformFeedbacks/1","doc":"[`gl:deleteTransformFeedbacks/1`](`deleteTransformFeedbacks/1`) deletes the `N`\ntransform feedback objects whose names are stored in the array `Ids`. Unused\nnames in `Ids` are ignored, as is the name zero. After a transform feedback\nobject is deleted, its name is again unused and it has no contents. If an active\ntransform feedback object is deleted, its name immediately becomes unused, but\nthe underlying object is not deleted until it is no longer active.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteTransformFeedbacks.xhtml)","ref":"gl.html#deleteTransformFeedbacks/1"},{"type":"function","title":"gl.deleteVertexArrays/1","doc":"[`gl:deleteVertexArrays/1`](`deleteVertexArrays/1`) deletes `N` vertex array\nobjects whose names are stored in the array addressed by `Arrays`. Once a vertex\narray object is deleted it has no contents and its name is again unused. If a\nvertex array object that is currently bound is deleted, the binding for that\nobject reverts to zero and the default vertex array becomes current. Unused\nnames in `Arrays` are silently ignored, as is the value zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteVertexArrays.xhtml)","ref":"gl.html#deleteVertexArrays/1"},{"type":"function","title":"gl.depthFunc/1","doc":"[`gl:depthFunc/1`](`depthFunc/1`) specifies the function used to compare each\nincoming pixel depth value with the depth value present in the depth buffer. The\ncomparison is performed only if depth testing is enabled. (See\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) of\n`?GL_DEPTH_TEST`.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthFunc.xhtml)","ref":"gl.html#depthFunc/1"},{"type":"function","title":"gl.depthMask/1","doc":"[`gl:depthMask/1`](`depthMask/1`) specifies whether the depth buffer is enabled\nfor writing. If `Flag` is `?GL_FALSE`, depth buffer writing is disabled.\nOtherwise, it is enabled. Initially, depth buffer writing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthMask.xhtml)","ref":"gl.html#depthMask/1"},{"type":"function","title":"gl.depthRange/2","doc":"","ref":"gl.html#depthRange/2"},{"type":"function","title":"gl.depthRangeArrayv/2","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes. Each viewport has an\nindependent depth range specified as a linear mapping of the normalized depth\ncoordinates in this range to window depth coordinates. Regardless of the actual\ndepth buffer implementation, window coordinate depth values are treated as\nthough they range from 0 through 1 (like color components).\n[`gl:depthRangeArray()`](`depthRangeArrayv/2`) specifies a linear mapping of the\nnormalized depth coordinates in this range to window depth coordinates for each\nviewport in the range [`First`, `First` \\+ `Count`). Thus, the values accepted\nby [`gl:depthRangeArray()`](`depthRangeArrayv/2`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRangeArray.xhtml)","ref":"gl.html#depthRangeArrayv/2"},{"type":"function","title":"gl.depthRangef/2","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes.\n[`gl:depthRange/2`](`depthRange/2`) specifies a linear mapping of the normalized\ndepth coordinates in this range to window depth coordinates. Regardless of the\nactual depth buffer implementation, window coordinate depth values are treated\nas though they range from 0 through 1 (like color components). Thus, the values\naccepted by [`gl:depthRange/2`](`depthRange/2`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRange.xhtml)","ref":"gl.html#depthRangef/2"},{"type":"function","title":"gl.depthRangeIndexed/3","doc":"After clipping and division by `w`, depth coordinates range from -1 to 1,\ncorresponding to the near and far clipping planes. Each viewport has an\nindependent depth range specified as a linear mapping of the normalized depth\ncoordinates in this range to window depth coordinates. Regardless of the actual\ndepth buffer implementation, window coordinate depth values are treated as\nthough they range from 0 through 1 (like color components).\n[`gl:depthRangeIndexed/3`](`depthRangeIndexed/3`) specifies a linear mapping of\nthe normalized depth coordinates in this range to window depth coordinates for a\nspecified viewport. Thus, the values accepted by\n[`gl:depthRangeIndexed/3`](`depthRangeIndexed/3`) are both clamped to this range\nbefore they are accepted.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDepthRangeIndexed.xhtml)","ref":"gl.html#depthRangeIndexed/3"},{"type":"function","title":"gl.detachShader/2","doc":"[`gl:detachShader/2`](`detachShader/2`) detaches the shader object specified by\n`Shader` from the program object specified by `Program`. This command can be\nused to undo the effect of the command [`gl:attachShader/2`](`attachShader/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDetachShader.xhtml)","ref":"gl.html#detachShader/2"},{"type":"function","title":"gl.disable/1","doc":"","ref":"gl.html#disable/1"},{"type":"function","title":"gl.disableClientState/1","doc":"","ref":"gl.html#disableClientState/1"},{"type":"function","title":"gl.disablei/2","doc":"","ref":"gl.html#disablei/2"},{"type":"function","title":"gl.disableVertexArrayAttrib/2","doc":"","ref":"gl.html#disableVertexArrayAttrib/2"},{"type":"function","title":"gl.disableVertexAttribArray/1","doc":"","ref":"gl.html#disableVertexAttribArray/1"},{"type":"function","title":"gl.dispatchCompute/3","doc":"[`gl:dispatchCompute/3`](`dispatchCompute/3`) launches one or more compute work\ngroups. Each work group is processed by the active program object for the\ncompute shader stage. While the individual shader invocations within a work\ngroup are executed as a unit, work groups are executed completely independently\nand in unspecified order. `Num_groups_x`, `Num_groups_y` and `Num_groups_z`\nspecify the number of local work groups that will be dispatched in the X, Y and\nZ dimensions, respectively.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDispatchCompute.xhtml)","ref":"gl.html#dispatchCompute/3"},{"type":"function","title":"gl.dispatchComputeIndirect/1","doc":"[`gl:dispatchComputeIndirect/1`](`dispatchComputeIndirect/1`) launches one or\nmore compute work groups using parameters stored in the buffer object currently\nbound to the `?GL_DISPATCH_INDIRECT_BUFFER` target. Each work group is processed\nby the active program object for the compute shader stage. While the individual\nshader invocations within a work group are executed as a unit, work groups are\nexecuted completely independently and in unspecified order. `Indirect` contains\nthe offset into the data store of the buffer object bound to the\n`?GL_DISPATCH_INDIRECT_BUFFER` target at which the parameters are stored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDispatchComputeIndirect.xhtml)","ref":"gl.html#dispatchComputeIndirect/1"},{"type":"function","title":"gl.drawArrays/3","doc":"[`gl:drawArrays/3`](`drawArrays/3`) specifies multiple geometric primitives with\nvery few subroutine calls. Instead of calling a GL procedure to pass each\nindividual vertex, normal, texture coordinate, edge flag, or color, you can\nprespecify separate arrays of vertices, normals, and colors and use them to\nconstruct a sequence of primitives with a single call to\n[`gl:drawArrays/3`](`drawArrays/3`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArrays.xhtml)","ref":"gl.html#drawArrays/3"},{"type":"function","title":"gl.drawArraysIndirect/2","doc":"[`gl:drawArraysIndirect/2`](`drawArraysIndirect/2`) specifies multiple geometric\nprimitives with very few subroutine calls.\n[`gl:drawArraysIndirect/2`](`drawArraysIndirect/2`) behaves similarly to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`),\nexecept that the parameters to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nare stored in memory at the address given by `Indirect`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysIndirect.xhtml)","ref":"gl.html#drawArraysIndirect/2"},{"type":"function","title":"gl.drawArraysInstanced/4","doc":"[`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`) behaves identically to\n[`gl:drawArrays/3`](`drawArrays/3`) except that `Instancecount` instances of the\nrange of elements are executed and the value of the internal counter\n`InstanceID` advances for each iteration. `InstanceID` is an internal 32-bit\ninteger counter that may be read by a vertex shader as `?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysInstanced.xhtml)","ref":"gl.html#drawArraysInstanced/4"},{"type":"function","title":"gl.drawArraysInstancedBaseInstance/5","doc":"[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nbehaves identically to [`gl:drawArrays/3`](`drawArrays/3`) except that\n`Instancecount` instances of the range of elements are executed and the value of\nthe internal counter `InstanceID` advances for each iteration. `InstanceID` is\nan internal 32-bit integer counter that may be read by a vertex shader as\n`?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArraysInstancedBaseInstance.xhtml)","ref":"gl.html#drawArraysInstancedBaseInstance/5"},{"type":"function","title":"gl.drawBuffer/1","doc":"When colors are written to the frame buffer, they are written into the color\nbuffers specified by [`gl:drawBuffer/1`](`drawBuffer/1`). One of the following\nvalues can be used for default framebuffer:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawBuffer.xhtml)","ref":"gl.html#drawBuffer/1"},{"type":"function","title":"gl.drawBuffers/1","doc":"[`gl:drawBuffers/1`](`drawBuffers/1`) and `glNamedFramebufferDrawBuffers` define\nan array of buffers into which outputs from the fragment shader data will be\nwritten. If a fragment shader writes a value to one or more user defined output\nvariables, then the value of each variable will be written into the buffer\nspecified at a location within `Bufs` corresponding to the location assigned to\nthat user defined output. The draw buffer used for user defined outputs assigned\nto locations greater than or equal to `N` is implicitly set to `?GL_NONE` and\nany data written to such an output is discarded.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawBuffers.xhtml)","ref":"gl.html#drawBuffers/1"},{"type":"function","title":"gl.drawElements/4","doc":"[`gl:drawElements/4`](`drawElements/4`) specifies multiple geometric primitives\nwith very few subroutine calls. Instead of calling a GL function to pass each\nindividual vertex, normal, texture coordinate, edge flag, or color, you can\nprespecify separate arrays of vertices, normals, and so on, and use them to\nconstruct a sequence of primitives with a single call to\n[`gl:drawElements/4`](`drawElements/4`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElements.xhtml)","ref":"gl.html#drawElements/4"},{"type":"function","title":"gl.drawElementsBaseVertex/5","doc":"[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`) behaves identically\nto [`gl:drawElements/4`](`drawElements/4`) except that the `i`th element\ntransferred by the corresponding draw call will be taken from element\n`Indices`\\[i] + `Basevertex` of each enabled array. If the resulting value is\nlarger than the maximum value representable by `Type`, it is as if the\ncalculation were upconverted to 32-bit unsigned integers (with wrapping on\noverflow conditions). The operation is undefined if the sum would be negative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsBaseVertex.xhtml)","ref":"gl.html#drawElementsBaseVertex/5"},{"type":"function","title":"gl.drawElementsIndirect/3","doc":"[`gl:drawElementsIndirect/3`](`drawElementsIndirect/3`) specifies multiple\nindexed geometric primitives with very few subroutine calls.\n[`gl:drawElementsIndirect/3`](`drawElementsIndirect/3`) behaves similarly to\n[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`),\nexecpt that the parameters to\n[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`)\nare stored in memory at the address given by `Indirect`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsIndirect.xhtml)","ref":"gl.html#drawElementsIndirect/3"},{"type":"function","title":"gl.drawElementsInstanced/5","doc":"[`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`) behaves identically to\n[`gl:drawElements/4`](`drawElements/4`) except that `Instancecount` instances of\nthe set of elements are executed and the value of the internal counter\n`InstanceID` advances for each iteration. `InstanceID` is an internal 32-bit\ninteger counter that may be read by a vertex shader as `?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstanced.xhtml)","ref":"gl.html#drawElementsInstanced/5"},{"type":"function","title":"gl.drawElementsInstancedBaseInstance/6","doc":"[`gl:drawElementsInstancedBaseInstance/6`](`drawElementsInstancedBaseInstance/6`)\nbehaves identically to [`gl:drawElements/4`](`drawElements/4`) except that\n`Instancecount` instances of the set of elements are executed and the value of\nthe internal counter `InstanceID` advances for each iteration. `InstanceID` is\nan internal 32-bit integer counter that may be read by a vertex shader as\n`?gl_InstanceID`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseInstance.xhtml)","ref":"gl.html#drawElementsInstancedBaseInstance/6"},{"type":"function","title":"gl.drawElementsInstancedBaseVertex/6","doc":"[`gl:drawElementsInstancedBaseVertex/6`](`drawElementsInstancedBaseVertex/6`)\nbehaves identically to [`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`)\nexcept that the `i`th element transferred by the corresponding draw call will be\ntaken from element `Indices`\\[i] + `Basevertex` of each enabled array. If the\nresulting value is larger than the maximum value representable by `Type`, it is\nas if the calculation were upconverted to 32-bit unsigned integers (with\nwrapping on overflow conditions). The operation is undefined if the sum would be\nnegative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseVertex.xhtml)","ref":"gl.html#drawElementsInstancedBaseVertex/6"},{"type":"function","title":"gl.drawElementsInstancedBaseVertexBaseInstance/7","doc":"[`gl:drawElementsInstancedBaseVertexBaseInstance/7`](`drawElementsInstancedBaseVertexBaseInstance/7`)\nbehaves identically to [`gl:drawElementsInstanced/5`](`drawElementsInstanced/5`)\nexcept that the `i`th element transferred by the corresponding draw call will be\ntaken from element `Indices`\\[i] + `Basevertex` of each enabled array. If the\nresulting value is larger than the maximum value representable by `Type`, it is\nas if the calculation were upconverted to 32-bit unsigned integers (with\nwrapping on overflow conditions). The operation is undefined if the sum would be\nnegative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsInstancedBaseVertexBaseInstance.xhtml)","ref":"gl.html#drawElementsInstancedBaseVertexBaseInstance/7"},{"type":"function","title":"gl.drawPixels/5","doc":"[`gl:drawPixels/5`](`drawPixels/5`) reads pixel data from memory and writes it\ninto the frame buffer relative to the current raster position, provided that the\nraster position is valid. Use [`gl:rasterPos()`](`rasterPos2d/2`) or\n[`gl:windowPos()`](`windowPos2d/2`) to set the current raster position; use\n[`gl:get()`](`getBooleanv/1`) with argument `?GL_CURRENT_RASTER_POSITION_VALID`\nto determine if the specified raster position is valid, and\n[`gl:get()`](`getBooleanv/1`) with argument `?GL_CURRENT_RASTER_POSITION` to\nquery the raster position.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glDrawPixels.xml)","ref":"gl.html#drawPixels/5"},{"type":"function","title":"gl.drawRangeElements/6","doc":"[`gl:drawRangeElements/6`](`drawRangeElements/6`) is a restricted form of\n[`gl:drawElements/4`](`drawElements/4`). `Mode`, and `Count` match the\ncorresponding arguments to [`gl:drawElements/4`](`drawElements/4`), with the\nadditional constraint that all values in the arrays `Count` must lie between\n`Start` and `End`, inclusive.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawRangeElements.xhtml)","ref":"gl.html#drawRangeElements/6"},{"type":"function","title":"gl.drawRangeElementsBaseVertex/7","doc":"[`gl:drawRangeElementsBaseVertex/7`](`drawRangeElementsBaseVertex/7`) is a\nrestricted form of [`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`).\n`Mode`, `Count` and `Basevertex` match the corresponding arguments to\n[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`), with the additional\nconstraint that all values in the array `Indices` must lie between `Start` and\n`End`, inclusive, prior to adding `Basevertex`. Index values lying outside the\nrange [`Start`, `End`] are treated in the same way as\n[`gl:drawElementsBaseVertex/5`](`drawElementsBaseVertex/5`). The `i`th element\ntransferred by the corresponding draw call will be taken from element\n`Indices`\\[i] + `Basevertex` of each enabled array. If the resulting value is\nlarger than the maximum value representable by `Type`, it is as if the\ncalculation were upconverted to 32-bit unsigned integers (with wrapping on\noverflow conditions). The operation is undefined if the sum would be negative.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawRangeElementsBaseVertex.xhtml)","ref":"gl.html#drawRangeElementsBaseVertex/7"},{"type":"function","title":"gl.drawTransformFeedback/2","doc":"[`gl:drawTransformFeedback/2`](`drawTransformFeedback/2`) draws primitives of a\ntype specified by `Mode` using a count retrieved from the transform feedback\nspecified by `Id`. Calling\n[`gl:drawTransformFeedback/2`](`drawTransformFeedback/2`) is equivalent to\ncalling [`gl:drawArrays/3`](`drawArrays/3`) with `Mode` as specified, `First`\nset to zero, and `Count` set to the number of vertices captured on vertex stream\nzero the last time transform feedback was active on the transform feedback\nobject named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedback.xhtml)","ref":"gl.html#drawTransformFeedback/2"},{"type":"function","title":"gl.drawTransformFeedbackInstanced/3","doc":"[`gl:drawTransformFeedbackInstanced/3`](`drawTransformFeedbackInstanced/3`)\ndraws multiple copies of a range of primitives of a type specified by `Mode`\nusing a count retrieved from the transform feedback stream specified by `Stream`\nof the transform feedback object specified by `Id`. Calling\n[`gl:drawTransformFeedbackInstanced/3`](`drawTransformFeedbackInstanced/3`) is\nequivalent to calling [`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`) with\n`Mode` and `Instancecount` as specified, `First` set to zero, and `Count` set to\nthe number of vertices captured on vertex stream zero the last time transform\nfeedback was active on the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackInstanced.xhtml)","ref":"gl.html#drawTransformFeedbackInstanced/3"},{"type":"function","title":"gl.drawTransformFeedbackStream/3","doc":"[`gl:drawTransformFeedbackStream/3`](`drawTransformFeedbackStream/3`) draws\nprimitives of a type specified by `Mode` using a count retrieved from the\ntransform feedback stream specified by `Stream` of the transform feedback object\nspecified by `Id`. Calling\n[`gl:drawTransformFeedbackStream/3`](`drawTransformFeedbackStream/3`) is\nequivalent to calling [`gl:drawArrays/3`](`drawArrays/3`) with `Mode` as\nspecified, `First` set to zero, and `Count` set to the number of vertices\ncaptured on vertex stream `Stream` the last time transform feedback was active\non the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackStream.xhtml)","ref":"gl.html#drawTransformFeedbackStream/3"},{"type":"function","title":"gl.drawTransformFeedbackStreamInstanced/4","doc":"[`gl:drawTransformFeedbackStreamInstanced/4`](`drawTransformFeedbackStreamInstanced/4`)\ndraws multiple copies of a range of primitives of a type specified by `Mode`\nusing a count retrieved from the transform feedback stream specified by `Stream`\nof the transform feedback object specified by `Id`. Calling\n[`gl:drawTransformFeedbackStreamInstanced/4`](`drawTransformFeedbackStreamInstanced/4`)\nis equivalent to calling [`gl:drawArraysInstanced/4`](`drawArraysInstanced/4`)\nwith `Mode` and `Instancecount` as specified, `First` set to zero, and `Count`\nset to the number of vertices captured on vertex stream `Stream` the last time\ntransform feedback was active on the transform feedback object named by `Id`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawTransformFeedbackStreamInstanced.xhtml)","ref":"gl.html#drawTransformFeedbackStreamInstanced/4"},{"type":"function","title":"gl.edgeFlag/1","doc":"","ref":"gl.html#edgeFlag/1"},{"type":"function","title":"gl.edgeFlagPointer/2","doc":"[`gl:edgeFlagPointer/2`](`edgeFlagPointer/2`) specifies the location and data\nformat of an array of boolean edge flags to use when rendering. `Stride`\nspecifies the byte stride from one edge flag to the next, allowing vertices and\nattributes to be packed into a single array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEdgeFlagPointer.xml)","ref":"gl.html#edgeFlagPointer/2"},{"type":"function","title":"gl.edgeFlagv/1","doc":"Each vertex of a polygon, separate triangle, or separate quadrilateral specified\nbetween a [`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pair is\nmarked as the start of either a boundary or nonboundary edge. If the current\nedge flag is true when the vertex is specified, the vertex is marked as the\nstart of a boundary edge. Otherwise, the vertex is marked as the start of a\nnonboundary edge. [`gl:edgeFlag/1`](`edgeFlag/1`) sets the edge flag bit to\n`?GL_TRUE` if `Flag` is `?GL_TRUE` and to `?GL_FALSE` otherwise.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEdgeFlag.xml)","ref":"gl.html#edgeFlagv/1"},{"type":"function","title":"gl.enable/1","doc":"","ref":"gl.html#enable/1"},{"type":"function","title":"gl.enableClientState/1","doc":"[`gl:enableClientState/1`](`enableClientState/1`) and\n[`gl:disableClientState/1`](`enableClientState/1`) enable or disable individual\nclient-side capabilities. By default, all client-side capabilities are disabled.\nBoth [`gl:enableClientState/1`](`enableClientState/1`) and\n[`gl:disableClientState/1`](`enableClientState/1`) take a single argument,\n`Cap`, which can assume one of the following values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEnableClientState.xml)","ref":"gl.html#enableClientState/1"},{"type":"function","title":"gl.enablei/2","doc":"[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`) enable and disable\nvarious capabilities. Use [`gl:isEnabled/1`](`isEnabled/1`) or\n[`gl:get()`](`getBooleanv/1`) to determine the current setting of any\ncapability. The initial value for each capability with the exception of\n`?GL_DITHER` and `?GL_MULTISAMPLE` is `?GL_FALSE`. The initial value for\n`?GL_DITHER` and `?GL_MULTISAMPLE` is `?GL_TRUE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnable.xhtml)","ref":"gl.html#enablei/2"},{"type":"function","title":"gl.enableVertexArrayAttrib/2","doc":"","ref":"gl.html#enableVertexArrayAttrib/2"},{"type":"function","title":"gl.enableVertexAttribArray/1","doc":"[`gl:enableVertexAttribArray/1`](`enableVertexAttribArray/1`) and\n[`gl:enableVertexArrayAttrib/2`](`disableVertexAttribArray/1`) enable the\ngeneric vertex attribute array specified by `Index`.\n[`gl:enableVertexAttribArray/1`](`enableVertexAttribArray/1`) uses currently\nbound vertex array object for the operation, whereas\n[`gl:enableVertexArrayAttrib/2`](`disableVertexAttribArray/1`) updates state of\nthe vertex array object with ID `Vaobj`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnableVertexAttribArray.xhtml)","ref":"gl.html#enableVertexAttribArray/1"},{"type":"function","title":"gl.end/0","doc":"[`gl:'begin'/1`](`'begin'/1`) and [`gl:'end'/0`](`'begin'/1`) delimit the\nvertices that define a primitive or a group of like primitives.\n[`gl:'begin'/1`](`'begin'/1`) accepts a single argument that specifies in which\nof ten ways the vertices are interpreted. Taking n as an integer count starting\nat one, and N as the total number of vertices specified, the interpretations are\nas follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBegin.xml)","ref":"gl.html#end/0"},{"type":"function","title":"gl.endConditionalRender/0","doc":"Conditional rendering is started using\n[`gl:beginConditionalRender/2`](`beginConditionalRender/2`) and ended using\n[`gl:endConditionalRender/0`](`beginConditionalRender/2`). During conditional\nrendering, all vertex array commands, as well as [`gl:clear/1`](`clear/1`) and\n[`gl:clearBuffer()`](`clearBufferiv/3`) have no effect if the\n(`?GL_SAMPLES_PASSED`) result of the query object `Id` is zero, or if the\n(`?GL_ANY_SAMPLES_PASSED`) result is `?GL_FALSE`. The results of commands\nsetting the current vertex state, such as\n[`gl:vertexAttrib()`](`vertexAttrib1d/2`) are undefined. If the\n(`?GL_SAMPLES_PASSED`) result is non-zero or if the (`?GL_ANY_SAMPLES_PASSED`)\nresult is `?GL_TRUE`, such commands are not discarded. The `Id` parameter to\n[`gl:beginConditionalRender/2`](`beginConditionalRender/2`) must be the name of\na query object previously returned from a call to\n[`gl:genQueries/1`](`genQueries/1`). `Mode` specifies how the results of the\nquery object are to be interpreted. If `Mode` is `?GL_QUERY_WAIT`, the GL waits\nfor the results of the query to be available and then uses the results to\ndetermine if subsequent rendering commands are discarded. If `Mode` is\n`?GL_QUERY_NO_WAIT`, the GL may choose to unconditionally execute the subsequent\nrendering commands without waiting for the query to complete.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginConditionalRender.xhtml)","ref":"gl.html#endConditionalRender/0"},{"type":"function","title":"gl.endList/0","doc":"","ref":"gl.html#endList/0"},{"type":"function","title":"gl.endQuery/1","doc":"[`gl:beginQuery/2`](`beginQuery/2`) and [`gl:endQuery/1`](`beginQuery/2`)\ndelimit the boundaries of a query object. `Query` must be a name previously\nreturned from a call to [`gl:genQueries/1`](`genQueries/1`). If a query object\nwith name `Id` does not yet exist it is created with the type determined by\n`Target`. `Target` must be one of `?GL_SAMPLES_PASSED`,\n`?GL_ANY_SAMPLES_PASSED`, `?GL_PRIMITIVES_GENERATED`,\n`?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN`, or `?GL_TIME_ELAPSED`. The behavior\nof the query object depends on its type and is as follows.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginQuery.xhtml)","ref":"gl.html#endQuery/1"},{"type":"function","title":"gl.endQueryIndexed/2","doc":"[`gl:beginQueryIndexed/3`](`beginQueryIndexed/3`) and\n[`gl:endQueryIndexed/2`](`beginQueryIndexed/3`) delimit the boundaries of a\nquery object. `Query` must be a name previously returned from a call to\n[`gl:genQueries/1`](`genQueries/1`). If a query object with name `Id` does not\nyet exist it is created with the type determined by `Target`. `Target` must be\none of `?GL_SAMPLES_PASSED`, `?GL_ANY_SAMPLES_PASSED`,\n`?GL_PRIMITIVES_GENERATED`, `?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN`, or\n`?GL_TIME_ELAPSED`. The behavior of the query object depends on its type and is\nas follows.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginQueryIndexed.xhtml)","ref":"gl.html#endQueryIndexed/2"},{"type":"function","title":"gl.endTransformFeedback/0","doc":"Transform feedback mode captures the values of varying variables written by the\nvertex shader (or, if active, the geometry shader). Transform feedback is said\nto be active after a call to\n[`gl:beginTransformFeedback/1`](`beginTransformFeedback/1`) until a subsequent\ncall to [`gl:endTransformFeedback/0`](`beginTransformFeedback/1`). Transform\nfeedback commands must be paired.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginTransformFeedback.xhtml)","ref":"gl.html#endTransformFeedback/0"},{"type":"function","title":"gl.evalCoord1d/1","doc":"","ref":"gl.html#evalCoord1d/1"},{"type":"function","title":"gl.evalCoord1dv/1","doc":"","ref":"gl.html#evalCoord1dv/1"},{"type":"function","title":"gl.evalCoord1f/1","doc":"","ref":"gl.html#evalCoord1f/1"},{"type":"function","title":"gl.evalCoord1fv/1","doc":"","ref":"gl.html#evalCoord1fv/1"},{"type":"function","title":"gl.evalCoord2d/2","doc":"","ref":"gl.html#evalCoord2d/2"},{"type":"function","title":"gl.evalCoord2dv/1","doc":"","ref":"gl.html#evalCoord2dv/1"},{"type":"function","title":"gl.evalCoord2f/2","doc":"","ref":"gl.html#evalCoord2f/2"},{"type":"function","title":"gl.evalCoord2fv/1","doc":"[`gl:evalCoord1()`](`evalCoord1d/1`) evaluates enabled one-dimensional maps at\nargument `U`. [`gl:evalCoord2()`](`evalCoord1d/1`) does the same for\ntwo-dimensional maps using two domain values, `U` and `V`. To define a map, call\n`glMap1` and `glMap2`; to enable and disable it, call\n[`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalCoord.xml)","ref":"gl.html#evalCoord2fv/1"},{"type":"function","title":"gl.evalMesh1/3","doc":"","ref":"gl.html#evalMesh1/3"},{"type":"function","title":"gl.evalMesh2/5","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used in\ntandem to efficiently generate and evaluate a series of evenly-spaced map domain\nvalues. [`gl:evalMesh()`](`evalMesh1/3`) steps through the integer domain of a\none- or two-dimensional grid, whose range is the domain of the evaluation maps\nspecified by `glMap1` and `glMap2`. `Mode` determines whether the resulting\nvertices are connected as points, lines, or filled polygons.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalMesh.xml)","ref":"gl.html#evalMesh2/5"},{"type":"function","title":"gl.evalPoint1/1","doc":"","ref":"gl.html#evalPoint1/1"},{"type":"function","title":"gl.evalPoint2/2","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used in\ntandem to efficiently generate and evaluate a series of evenly spaced map domain\nvalues. [`gl:evalPoint()`](`evalPoint1/1`) can be used to evaluate a single grid\npoint in the same gridspace that is traversed by\n[`gl:evalMesh()`](`evalMesh1/3`). Calling [`gl:evalPoint1/1`](`evalPoint1/1`) is\nequivalent to calling glEvalCoord1( i.ð u+u 1 ); where ð u=(u 2-u 1)/n\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEvalPoint.xml)","ref":"gl.html#evalPoint2/2"},{"type":"function","title":"gl.feedbackBuffer/3","doc":"The [`gl:feedbackBuffer/3`](`feedbackBuffer/3`) function controls feedback.\nFeedback, like selection, is a GL mode. The mode is selected by calling\n[`gl:renderMode/1`](`renderMode/1`) with `?GL_FEEDBACK`. When the GL is in\nfeedback mode, no pixels are produced by rasterization. Instead, information\nabout primitives that would have been rasterized is fed back to the application\nusing the GL.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFeedbackBuffer.xml)","ref":"gl.html#feedbackBuffer/3"},{"type":"function","title":"gl.fenceSync/2","doc":"[`gl:fenceSync/2`](`fenceSync/2`) creates a new fence sync object, inserts a\nfence command into the GL command stream and associates it with that sync\nobject, and returns a non-zero name corresponding to the sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFenceSync.xhtml)","ref":"gl.html#fenceSync/2"},{"type":"function","title":"gl.finish/0","doc":"[`gl:finish/0`](`finish/0`) does not return until the effects of all previously\ncalled GL commands are complete. Such effects include all changes to GL state,\nall changes to connection state, and all changes to the frame buffer contents.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFinish.xhtml)","ref":"gl.html#finish/0"},{"type":"function","title":"gl.flush/0","doc":"Different GL implementations buffer commands in several different locations,\nincluding network buffers and the graphics accelerator itself.\n[`gl:flush/0`](`flush/0`) empties all of these buffers, causing all issued\ncommands to be executed as quickly as they are accepted by the actual rendering\nengine. Though this execution may not be completed in any particular time\nperiod, it does complete in finite time.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFlush.xhtml)","ref":"gl.html#flush/0"},{"type":"function","title":"gl.flushMappedBufferRange/3","doc":"","ref":"gl.html#flushMappedBufferRange/3"},{"type":"function","title":"gl.flushMappedNamedBufferRange/3","doc":"[`gl:flushMappedBufferRange/3`](`flushMappedBufferRange/3`) indicates that\nmodifications have been made to a range of a mapped buffer object. The buffer\nobject must previously have been mapped with the `?GL_MAP_FLUSH_EXPLICIT_BIT`\nflag.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFlushMappedBufferRange.xhtml)","ref":"gl.html#flushMappedNamedBufferRange/3"},{"type":"function","title":"gl.fogCoordd/1","doc":"","ref":"gl.html#fogCoordd/1"},{"type":"function","title":"gl.fogCoorddv/1","doc":"","ref":"gl.html#fogCoorddv/1"},{"type":"function","title":"gl.fogCoordf/1","doc":"","ref":"gl.html#fogCoordf/1"},{"type":"function","title":"gl.fogCoordfv/1","doc":"[`gl:fogCoord()`](`fogCoordf/1`) specifies the fog coordinate that is associated\nwith each vertex and the current raster position. The value specified is\ninterpolated and used in computing the fog color (see [`gl:fog()`](`fogf/2`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFogCoord.xml)","ref":"gl.html#fogCoordfv/1"},{"type":"function","title":"gl.fogCoordPointer/3","doc":"[`gl:fogCoordPointer/3`](`fogCoordPointer/3`) specifies the location and data\nformat of an array of fog coordinates to use when rendering. `Type` specifies\nthe data type of each fog coordinate, and `Stride` specifies the byte stride\nfrom one fog coordinate to the next, allowing vertices and attributes to be\npacked into a single array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFogCoordPointer.xml)","ref":"gl.html#fogCoordPointer/3"},{"type":"function","title":"gl.fogf/2","doc":"","ref":"gl.html#fogf/2"},{"type":"function","title":"gl.fogfv/2","doc":"","ref":"gl.html#fogfv/2"},{"type":"function","title":"gl.fogi/2","doc":"","ref":"gl.html#fogi/2"},{"type":"function","title":"gl.fogiv/2","doc":"Fog is initially disabled. While enabled, fog affects rasterized geometry,\nbitmaps, and pixel blocks, but not buffer clear operations. To enable and\ndisable fog, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_FOG`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFog.xml)","ref":"gl.html#fogiv/2"},{"type":"function","title":"gl.framebufferParameteri/3","doc":"[`gl:framebufferParameteri/3`](`framebufferParameteri/3`) and\n`glNamedFramebufferParameteri` modify the value of the parameter named `Pname`\nin the specified framebuffer object. There are no modifiable parameters of the\ndefault draw and read framebuffer, so they are not valid targets of these\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferParameteri.xhtml)","ref":"gl.html#framebufferParameteri/3"},{"type":"function","title":"gl.framebufferRenderbuffer/4","doc":"[`gl:framebufferRenderbuffer/4`](`framebufferRenderbuffer/4`) and\n`glNamedFramebufferRenderbuffer` attaches a renderbuffer as one of the logical\nbuffers of the specified framebuffer object. Renderbuffers cannot be attached to\nthe default draw and read framebuffer, so they are not valid targets of these\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferRenderbuffer.xhtml)","ref":"gl.html#framebufferRenderbuffer/4"},{"type":"function","title":"gl.framebufferTexture1D/5","doc":"","ref":"gl.html#framebufferTexture1D/5"},{"type":"function","title":"gl.framebufferTexture2D/5","doc":"","ref":"gl.html#framebufferTexture2D/5"},{"type":"function","title":"gl.framebufferTexture3D/6","doc":"","ref":"gl.html#framebufferTexture3D/6"},{"type":"function","title":"gl.framebufferTexture/4","doc":"","ref":"gl.html#framebufferTexture/4"},{"type":"function","title":"gl.framebufferTextureFaceARB/5","doc":"","ref":"gl.html#framebufferTextureFaceARB/5"},{"type":"function","title":"gl.framebufferTextureLayer/5","doc":"These commands attach a selected mipmap level or image of a texture object as\none of the logical buffers of the specified framebuffer object. Textures cannot\nbe attached to the default draw and read framebuffer, so they are not valid\ntargets of these commands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferTexture.xhtml)","ref":"gl.html#framebufferTextureLayer/5"},{"type":"function","title":"gl.frontFace/1","doc":"In a scene composed entirely of opaque closed surfaces, back-facing polygons are\nnever visible. Eliminating these invisible polygons has the obvious benefit of\nspeeding up the rendering of the image. To enable and disable elimination of\nback-facing polygons, call [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) with argument `?GL_CULL_FACE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFrontFace.xhtml)","ref":"gl.html#frontFace/1"},{"type":"function","title":"gl.frustum/6","doc":"[`gl:frustum/6`](`frustum/6`) describes a perspective matrix that produces a\nperspective projection. The current matrix (see\n[`gl:matrixMode/1`](`matrixMode/1`)) is multiplied by this matrix and the result\nreplaces the current matrix, as if [`gl:multMatrix()`](`multMatrixd/1`) were\ncalled with the following matrix as its argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml)","ref":"gl.html#frustum/6"},{"type":"function","title":"gl.genBuffers/1","doc":"[`gl:genBuffers/1`](`genBuffers/1`) returns `N` buffer object names in\n`Buffers`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genBuffers/1`](`genBuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenBuffers.xhtml)","ref":"gl.html#genBuffers/1"},{"type":"function","title":"gl.generateMipmap/1","doc":"","ref":"gl.html#generateMipmap/1"},{"type":"function","title":"gl.generateTextureMipmap/1","doc":"[`gl:generateMipmap/1`](`generateMipmap/1`) and\n[`gl:generateTextureMipmap/1`](`generateMipmap/1`) generates mipmaps for the\nspecified texture object. For [`gl:generateMipmap/1`](`generateMipmap/1`), the\ntexture object that is bound to `Target`. For\n[`gl:generateTextureMipmap/1`](`generateMipmap/1`), `Texture` is the name of the\ntexture object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenerateMipmap.xhtml)","ref":"gl.html#generateTextureMipmap/1"},{"type":"function","title":"gl.genFramebuffers/1","doc":"[`gl:genFramebuffers/1`](`genFramebuffers/1`) returns `N` framebuffer object\nnames in `Ids`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genFramebuffers/1`](`genFramebuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenFramebuffers.xhtml)","ref":"gl.html#genFramebuffers/1"},{"type":"function","title":"gl.genLists/1","doc":"[`gl:genLists/1`](`genLists/1`) has one argument, `Range`. It returns an integer\n`n` such that `Range` contiguous empty display lists, named n, n+1, ...,\nn+range-1, are created. If `Range` is 0, if there is no group of `Range`\ncontiguous names available, or if any error is generated, no display lists are\ngenerated, and 0 is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGenLists.xml)","ref":"gl.html#genLists/1"},{"type":"function","title":"gl.genProgramPipelines/1","doc":"[`gl:genProgramPipelines/1`](`genProgramPipelines/1`) returns `N` previously\nunused program pipeline object names in `Pipelines`. These names are marked as\nused, for the purposes of [`gl:genProgramPipelines/1`](`genProgramPipelines/1`)\nonly, but they acquire program pipeline state only when they are first bound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenProgramPipelines.xhtml)","ref":"gl.html#genProgramPipelines/1"},{"type":"function","title":"gl.genQueries/1","doc":"[`gl:genQueries/1`](`genQueries/1`) returns `N` query object names in `Ids`.\nThere is no guarantee that the names form a contiguous set of integers; however,\nit is guaranteed that none of the returned names was in use immediately before\nthe call to [`gl:genQueries/1`](`genQueries/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenQueries.xhtml)","ref":"gl.html#genQueries/1"},{"type":"function","title":"gl.genRenderbuffers/1","doc":"[`gl:genRenderbuffers/1`](`genRenderbuffers/1`) returns `N` renderbuffer object\nnames in `Renderbuffers`. There is no guarantee that the names form a contiguous\nset of integers; however, it is guaranteed that none of the returned names was\nin use immediately before the call to\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenRenderbuffers.xhtml)","ref":"gl.html#genRenderbuffers/1"},{"type":"function","title":"gl.genSamplers/1","doc":"[`gl:genSamplers/1`](`genSamplers/1`) returns `N` sampler object names in\n`Samplers`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genSamplers/1`](`genSamplers/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenSamplers.xhtml)","ref":"gl.html#genSamplers/1"},{"type":"function","title":"gl.genTextures/1","doc":"[`gl:genTextures/1`](`genTextures/1`) returns `N` texture names in `Textures`.\nThere is no guarantee that the names form a contiguous set of integers; however,\nit is guaranteed that none of the returned names was in use immediately before\nthe call to [`gl:genTextures/1`](`genTextures/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenTextures.xhtml)","ref":"gl.html#genTextures/1"},{"type":"function","title":"gl.genTransformFeedbacks/1","doc":"[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`) returns `N` previously\nunused transform feedback object names in `Ids`. These names are marked as used,\nfor the purposes of [`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`)\nonly, but they acquire transform feedback state only when they are first bound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenTransformFeedbacks.xhtml)","ref":"gl.html#genTransformFeedbacks/1"},{"type":"function","title":"gl.genVertexArrays/1","doc":"[`gl:genVertexArrays/1`](`genVertexArrays/1`) returns `N` vertex array object\nnames in `Arrays`. There is no guarantee that the names form a contiguous set of\nintegers; however, it is guaranteed that none of the returned names was in use\nimmediately before the call to [`gl:genVertexArrays/1`](`genVertexArrays/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenVertexArrays.xhtml)","ref":"gl.html#genVertexArrays/1"},{"type":"function","title":"gl.getActiveAttrib/3","doc":"[`gl:getActiveAttrib/3`](`getActiveAttrib/3`) returns information about an\nactive attribute variable in the program object specified by `Program`. The\nnumber of active attributes can be obtained by calling\n[`gl:getProgram()`](`getProgramiv/2`) with the value `?GL_ACTIVE_ATTRIBUTES`. A\nvalue of 0 for `Index` selects the first active attribute variable. Permissible\nvalues for `Index` range from zero to the number of active attribute variables\nminus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveAttrib.xhtml)","ref":"gl.html#getActiveAttrib/3"},{"type":"function","title":"gl.getActiveSubroutineName/4","doc":"[`gl:getActiveSubroutineName/4`](`getActiveSubroutineName/4`) queries the name\nof an active shader subroutine uniform from the program object given in\n`Program`. `Index` specifies the index of the shader subroutine uniform within\nthe shader stage given by `Stage`, and must between zero and the value of\n`?GL_ACTIVE_SUBROUTINES` minus one for the shader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveSubroutineName.xhtml)","ref":"gl.html#getActiveSubroutineName/4"},{"type":"function","title":"gl.getActiveSubroutineUniformName/4","doc":"[`gl:getActiveSubroutineUniformName/4`](`getActiveSubroutineUniformName/4`)\nretrieves the name of an active shader subroutine uniform. `Program` contains\nthe name of the program containing the uniform. `Shadertype` specifies the stage\nfor which the uniform location, given by `Index`, is valid. `Index` must be\nbetween zero and the value of `?GL_ACTIVE_SUBROUTINE_UNIFORMS` minus one for the\nshader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveSubroutineUniformName.xhtml)","ref":"gl.html#getActiveSubroutineUniformName/4"},{"type":"function","title":"gl.getActiveUniform/3","doc":"[`gl:getActiveUniform/3`](`getActiveUniform/3`) returns information about an\nactive uniform variable in the program object specified by `Program`. The number\nof active uniform variables can be obtained by calling\n[`gl:getProgram()`](`getProgramiv/2`) with the value `?GL_ACTIVE_UNIFORMS`. A\nvalue of 0 for `Index` selects the first active uniform variable. Permissible\nvalues for `Index` range from zero to the number of active uniform variables\nminus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniform.xhtml)","ref":"gl.html#getActiveUniform/3"},{"type":"function","title":"gl.getActiveUniformBlockiv/4","doc":"[`gl:getActiveUniformBlockiv/4`](`getActiveUniformBlockiv/4`) retrieves\ninformation about an active uniform block within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformBlock.xhtml)","ref":"gl.html#getActiveUniformBlockiv/4"},{"type":"function","title":"gl.getActiveUniformBlockName/3","doc":"[`gl:getActiveUniformBlockName/3`](`getActiveUniformBlockName/3`) retrieves the\nname of the active uniform block at `UniformBlockIndex` within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformBlockName.xhtml)","ref":"gl.html#getActiveUniformBlockName/3"},{"type":"function","title":"gl.getActiveUniformName/3","doc":"[`gl:getActiveUniformName/3`](`getActiveUniformName/3`) returns the name of the\nactive uniform at `UniformIndex` within `Program`. If `UniformName` is not NULL,\nup to `BufSize` characters (including a nul-terminator) will be written into the\narray whose address is specified by `UniformName`. If `Length` is not NULL, the\nnumber of characters that were (or would have been) written into `UniformName`\n(not including the nul-terminator) will be placed in the variable whose address\nis specified in `Length`. If `Length` is NULL, no length is returned. The length\nof the longest uniform name in `Program` is given by the value of\n`?GL_ACTIVE_UNIFORM_MAX_LENGTH`, which can be queried with\n[`gl:getProgram()`](`getProgramiv/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformName.xhtml)","ref":"gl.html#getActiveUniformName/3"},{"type":"function","title":"gl.getActiveUniformsiv/3","doc":"[`gl:getActiveUniformsiv/3`](`getActiveUniformsiv/3`) queries the value of the\nparameter named `Pname` for each of the uniforms within `Program` whose indices\nare specified in the array of `UniformCount` unsigned integers `UniformIndices`.\nUpon success, the value of the parameter for each uniform is written into the\ncorresponding entry in the array whose address is given in `Params`. If an error\nis generated, nothing is written into `Params`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetActiveUniformsiv.xhtml)","ref":"gl.html#getActiveUniformsiv/3"},{"type":"function","title":"gl.getAttachedShaders/2","doc":"[`gl:getAttachedShaders/2`](`getAttachedShaders/2`) returns the names of the\nshader objects attached to `Program`. The names of shader objects that are\nattached to `Program` will be returned in `Shaders.` The actual number of shader\nnames written into `Shaders` is returned in `Count.` If no shader objects are\nattached to `Program`, `Count` is set to 0. The maximum number of shader names\nthat may be returned in `Shaders` is specified by `MaxCount`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetAttachedShaders.xhtml)","ref":"gl.html#getAttachedShaders/2"},{"type":"function","title":"gl.getAttribLocation/2","doc":"[`gl:getAttribLocation/2`](`getAttribLocation/2`) queries the previously linked\nprogram object specified by `Program` for the attribute variable specified by\n`Name` and returns the index of the generic vertex attribute that is bound to\nthat attribute variable. If `Name` is a matrix attribute variable, the index of\nthe first column of the matrix is returned. If the named attribute variable is\nnot an active attribute in the specified program object or if `Name` starts with\nthe reserved prefix \"gl\\_\", a value of -1 is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetAttribLocation.xhtml)","ref":"gl.html#getAttribLocation/2"},{"type":"function","title":"gl.getBooleani_v/2","doc":"","ref":"gl.html#getBooleani_v/2"},{"type":"function","title":"gl.getBooleanv/1","doc":"","ref":"gl.html#getBooleanv/1"},{"type":"function","title":"gl.getBufferParameteri64v/2","doc":"","ref":"gl.html#getBufferParameteri64v/2"},{"type":"function","title":"gl.getBufferParameteriv/2","doc":"[`gl:getBufferParameteriv/2`](`getBufferParameteriv/2`) returns in `Data` a\nselected parameter of the buffer object specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetBufferParameteriv.xml)","ref":"gl.html#getBufferParameteriv/2"},{"type":"function","title":"gl.getBufferParameterivARB/2","doc":"These functions return in `Data` a selected parameter of the specified buffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetBufferParameter.xhtml)","ref":"gl.html#getBufferParameterivARB/2"},{"type":"function","title":"gl.getBufferSubData/4","doc":"[`gl:getBufferSubData/4`](`getBufferSubData/4`) and `glGetNamedBufferSubData`\nreturn some or all of the data contents of the data store of the specified\nbuffer object. Data starting at byte offset `Offset` and extending for `Size`\nbytes is copied from the buffer object's data store to the memory pointed to by\n`Data`. An error is thrown if the buffer object is currently mapped, or if\n`Offset` and `Size` together define a range beyond the bounds of the buffer\nobject's data store.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetBufferSubData.xhtml)","ref":"gl.html#getBufferSubData/4"},{"type":"function","title":"gl.getClipPlane/1","doc":"[`gl:getClipPlane/1`](`getClipPlane/1`) returns in `Equation` the four\ncoefficients of the plane equation for `Plane`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetClipPlane.xml)","ref":"gl.html#getClipPlane/1"},{"type":"function","title":"gl.getColorTable/4","doc":"[`gl:getColorTable/4`](`getColorTable/4`) returns in `Table` the contents of the\ncolor table specified by `Target`. No pixel transfer operations are performed,\nbut pixel storage modes that are applicable to\n[`gl:readPixels/7`](`readPixels/7`) are performed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetColorTable.xml)","ref":"gl.html#getColorTable/4"},{"type":"function","title":"gl.getColorTableParameterfv/2","doc":"","ref":"gl.html#getColorTableParameterfv/2"},{"type":"function","title":"gl.getColorTableParameteriv/2","doc":"Returns parameters specific to color table `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetColorTableParameter.xml)","ref":"gl.html#getColorTableParameteriv/2"},{"type":"function","title":"gl.getCompressedTexImage/3","doc":"[`gl:getCompressedTexImage/3`](`getCompressedTexImage/3`) and\n`glGetnCompressedTexImage` return the compressed texture image associated with\n`Target` and `Lod` into `Pixels`. `glGetCompressedTextureImage` serves the same\npurpose, but instead of taking a texture target, it takes the ID of the texture\nobject. `Pixels` should be an array of `BufSize` bytes for\n`glGetnCompresedTexImage` and `glGetCompressedTextureImage` functions, and of\n`?GL_TEXTURE_COMPRESSED_IMAGE_SIZE` bytes in case of\n[`gl:getCompressedTexImage/3`](`getCompressedTexImage/3`). If the actual data\ntakes less space than `BufSize`, the remaining bytes will not be touched.\n`Target` specifies the texture target, to which the texture the data the\nfunction should extract the data from is bound to. `Lod` specifies the\nlevel-of-detail number of the desired image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetCompressedTexImage.xhtml)","ref":"gl.html#getCompressedTexImage/3"},{"type":"function","title":"gl.getConvolutionFilter/4","doc":"[`gl:getConvolutionFilter/4`](`getConvolutionFilter/4`) returns the current 1D\nor 2D convolution filter kernel as an image. The one- or two-dimensional image\nis placed in `Image` according to the specifications in `Format` and `Type`. No\npixel transfer operations are performed on this image, but the relevant pixel\nstorage modes are applied.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetConvolutionFilter.xml)","ref":"gl.html#getConvolutionFilter/4"},{"type":"function","title":"gl.getConvolutionParameterfv/2","doc":"","ref":"gl.html#getConvolutionParameterfv/2"},{"type":"function","title":"gl.getConvolutionParameteriv/2","doc":"[`gl:getConvolutionParameter()`](`getConvolutionParameterfv/2`) retrieves\nconvolution parameters. `Target` determines which convolution filter is queried.\n`Pname` determines which parameter is returned:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetConvolutionParameter.xml)","ref":"gl.html#getConvolutionParameteriv/2"},{"type":"function","title":"gl.getDebugMessageLog/2","doc":"[`gl:getDebugMessageLog/2`](`getDebugMessageLog/2`) retrieves messages from the\ndebug message log. A maximum of `Count` messages are retrieved from the log. If\n`Sources` is not NULL then the source of each message is written into up to\n`Count` elements of the array. If `Types` is not NULL then the type of each\nmessage is written into up to `Count` elements of the array. If `Id` is not NULL\nthen the identifier of each message is written into up to `Count` elements of\nthe array. If `Severities` is not NULL then the severity of each message is\nwritten into up to `Count` elements of the array. If `Lengths` is not NULL then\nthe length of each message is written into up to `Count` elements of the array.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetDebugMessageLog.xhtml)","ref":"gl.html#getDebugMessageLog/2"},{"type":"function","title":"gl.getDoublei_v/2","doc":"","ref":"gl.html#getDoublei_v/2"},{"type":"function","title":"gl.getDoublev/1","doc":"","ref":"gl.html#getDoublev/1"},{"type":"function","title":"gl.getError/0","doc":"[`gl:getError/0`](`getError/0`) returns the value of the error flag. Each\ndetectable error is assigned a numeric code and symbolic name. When an error\noccurs, the error flag is set to the appropriate error code value. No other\nerrors are recorded until [`gl:getError/0`](`getError/0`) is called, the error\ncode is returned, and the flag is reset to `?GL_NO_ERROR`. If a call to\n[`gl:getError/0`](`getError/0`) returns `?GL_NO_ERROR`, there has been no\ndetectable error since the last call to [`gl:getError/0`](`getError/0`), or\nsince the GL was initialized.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml)","ref":"gl.html#getError/0"},{"type":"function","title":"gl.getFloati_v/2","doc":"","ref":"gl.html#getFloati_v/2"},{"type":"function","title":"gl.getFloatv/1","doc":"","ref":"gl.html#getFloatv/1"},{"type":"function","title":"gl.getFragDataIndex/2","doc":"[`gl:getFragDataIndex/2`](`getFragDataIndex/2`) returns the index of the\nfragment color to which the variable `Name` was bound when the program object\n`Program` was last linked. If `Name` is not a varying out variable of `Program`,\nor if an error occurs, -1 will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFragDataIndex.xhtml)","ref":"gl.html#getFragDataIndex/2"},{"type":"function","title":"gl.getFragDataLocation/2","doc":"[`gl:getFragDataLocation/2`](`getFragDataLocation/2`) retrieves the assigned\ncolor number binding for the user-defined varying out variable `Name` for\nprogram `Program`. `Program` must have previously been linked. `Name` must be a\nnull-terminated string. If `Name` is not the name of an active user-defined\nvarying out fragment shader variable within `Program`, -1 will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFragDataLocation.xhtml)","ref":"gl.html#getFragDataLocation/2"},{"type":"function","title":"gl.getFramebufferAttachmentParameteriv/3","doc":"[`gl:getFramebufferAttachmentParameteriv/3`](`getFramebufferAttachmentParameteriv/3`)\nand `glGetNamedFramebufferAttachmentParameteriv` return parameters of\nattachments of a specified framebuffer object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFramebufferAttachmentParameter.xhtml)","ref":"gl.html#getFramebufferAttachmentParameteriv/3"},{"type":"function","title":"gl.getFramebufferParameteriv/2","doc":"[`gl:getFramebufferParameteriv/2`](`getFramebufferParameteriv/2`) and\n`glGetNamedFramebufferParameteriv` query parameters of a specified framebuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetFramebufferParameter.xhtml)","ref":"gl.html#getFramebufferParameteriv/2"},{"type":"function","title":"gl.getGraphicsResetStatus/0","doc":"Certain events can result in a reset of the GL context. Such a reset causes all\ncontext state to be lost and requires the application to recreate all objects in\nthe affected context.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetGraphicsResetStatus.xhtml)","ref":"gl.html#getGraphicsResetStatus/0"},{"type":"function","title":"gl.getHistogram/5","doc":"[`gl:getHistogram/5`](`getHistogram/5`) returns the current histogram table as a\none-dimensional image with the same width as the histogram. No pixel transfer\noperations are performed on this image, but pixel storage modes that are\napplicable to 1D images are honored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetHistogram.xml)","ref":"gl.html#getHistogram/5"},{"type":"function","title":"gl.getHistogramParameterfv/2","doc":"","ref":"gl.html#getHistogramParameterfv/2"},{"type":"function","title":"gl.getHistogramParameteriv/2","doc":"[`gl:getHistogramParameter()`](`getHistogramParameterfv/2`) is used to query\nparameter values for the current histogram or for a proxy. The histogram state\ninformation may be queried by calling\n[`gl:getHistogramParameter()`](`getHistogramParameterfv/2`) with a `Target` of\n`?GL_HISTOGRAM` (to obtain information for the current histogram table) or\n`?GL_PROXY_HISTOGRAM` (to obtain information from the most recent proxy request)\nand one of the following values for the `Pname` argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetHistogramParameter.xml)","ref":"gl.html#getHistogramParameteriv/2"},{"type":"function","title":"gl.getInteger64i_v/2","doc":"","ref":"gl.html#getInteger64i_v/2"},{"type":"function","title":"gl.getInteger64v/1","doc":"","ref":"gl.html#getInteger64v/1"},{"type":"function","title":"gl.getIntegeri_v/2","doc":"","ref":"gl.html#getIntegeri_v/2"},{"type":"function","title":"gl.getIntegerv/1","doc":"These commands return values for simple state variables in GL. `Pname` is a\nsymbolic constant indicating the state variable to be returned, and `Data` is a\npointer to an array of the indicated type in which to place the returned data.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGet.xhtml)","ref":"gl.html#getIntegerv/1"},{"type":"function","title":"gl.getInternalformati64v/4","doc":"","ref":"gl.html#getInternalformati64v/4"},{"type":"function","title":"gl.getInternalformativ/4","doc":"No documentation available.","ref":"gl.html#getInternalformativ/4"},{"type":"function","title":"gl.getLightfv/2","doc":"","ref":"gl.html#getLightfv/2"},{"type":"function","title":"gl.getLightiv/2","doc":"[`gl:getLight()`](`getLightfv/2`) returns in `Params` the value or values of a\nlight source parameter. `Light` names the light and is a symbolic name of the\nform `?GL_LIGHT` i where i ranges from 0 to the value of `?GL_MAX_LIGHTS` \\- 1.\n`?GL_MAX_LIGHTS` is an implementation dependent constant that is greater than or\nequal to eight. `Pname` specifies one of ten light source parameters, again by\nsymbolic name.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetLight.xml)","ref":"gl.html#getLightiv/2"},{"type":"function","title":"gl.getMapdv/3","doc":"","ref":"gl.html#getMapdv/3"},{"type":"function","title":"gl.getMapfv/3","doc":"","ref":"gl.html#getMapfv/3"},{"type":"function","title":"gl.getMapiv/3","doc":"`glMap1` and `glMap2` define evaluators. [`gl:getMap()`](`getMapdv/3`) returns\nevaluator parameters. `Target` chooses a map, `Query` selects a specific\nparameter, and `V` points to storage where the values will be returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMap.xml)","ref":"gl.html#getMapiv/3"},{"type":"function","title":"gl.getMaterialfv/2","doc":"","ref":"gl.html#getMaterialfv/2"},{"type":"function","title":"gl.getMaterialiv/2","doc":"[`gl:getMaterial()`](`getMaterialfv/2`) returns in `Params` the value or values\nof parameter `Pname` of material `Face`. Six parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMaterial.xml)","ref":"gl.html#getMaterialiv/2"},{"type":"function","title":"gl.getMinmax/5","doc":"[`gl:getMinmax/5`](`getMinmax/5`) returns the accumulated minimum and maximum\npixel values (computed on a per-component basis) in a one-dimensional image of\nwidth 2. The first set of return values are the minima, and the second set of\nreturn values are the maxima. The format of the return values is determined by\n`Format`, and their type is determined by `Types`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMinmax.xml)","ref":"gl.html#getMinmax/5"},{"type":"function","title":"gl.getMinmaxParameterfv/2","doc":"","ref":"gl.html#getMinmaxParameterfv/2"},{"type":"function","title":"gl.getMinmaxParameteriv/2","doc":"[`gl:getMinmaxParameter()`](`getMinmaxParameterfv/2`) retrieves parameters for\nthe current minmax table by setting `Pname` to one of the following values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetMinmaxParameter.xml)","ref":"gl.html#getMinmaxParameteriv/2"},{"type":"function","title":"gl.getMultisamplefv/2","doc":"[`gl:getMultisamplefv/2`](`getMultisamplefv/2`) queries the location of a given\nsample. `Pname` specifies the sample parameter to retrieve and must be\n`?GL_SAMPLE_POSITION`. `Index` corresponds to the sample for which the location\nshould be returned. The sample location is returned as two floating-point values\nin `Val[0]` and `Val[1]`, each between 0 and 1, corresponding to the `X` and `Y`\nlocations respectively in the GL pixel space of that sample. (0.5, 0.5) this\ncorresponds to the pixel center. `Index` must be between zero and the value of\n`?GL_SAMPLES` minus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetMultisample.xhtml)","ref":"gl.html#getMultisamplefv/2"},{"type":"function","title":"gl.getPixelMapfv/2","doc":"","ref":"gl.html#getPixelMapfv/2"},{"type":"function","title":"gl.getPixelMapuiv/2","doc":"","ref":"gl.html#getPixelMapuiv/2"},{"type":"function","title":"gl.getPixelMapusv/2","doc":"See the [`gl:pixelMap()`](`pixelMapfv/3`) reference page for a description of\nthe acceptable values for the `Map` parameter.\n[`gl:getPixelMap()`](`getPixelMapfv/2`) returns in `Data` the contents of the\npixel map specified in `Map`. Pixel maps are used during the execution of\n[`gl:readPixels/7`](`readPixels/7`), [`gl:drawPixels/5`](`drawPixels/5`),\n[`gl:copyPixels/5`](`copyPixels/5`), [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`),\n[`gl:texSubImage3D/11`](`texSubImage3D/11`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`), and\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`). to map color indices, stencil\nindices, color components, and depth components to other values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetPixelMap.xml)","ref":"gl.html#getPixelMapusv/2"},{"type":"function","title":"gl.getPolygonStipple/0","doc":"[`gl:getPolygonStipple/0`](`getPolygonStipple/0`) returns to `Pattern` a 32×32\npolygon stipple pattern. The pattern is packed into memory as if\n[`gl:readPixels/7`](`readPixels/7`) with both `height` and `width` of 32, `type`\nof `?GL_BITMAP`, and `format` of `?GL_COLOR_INDEX` were called, and the stipple\npattern were stored in an internal 32×32 color index buffer. Unlike\n[`gl:readPixels/7`](`readPixels/7`), however, pixel transfer operations (shift,\noffset, pixel map) are not applied to the returned stipple image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetPolygonStipple.xml)","ref":"gl.html#getPolygonStipple/0"},{"type":"function","title":"gl.getProgramBinary/2","doc":"[`gl:getProgramBinary/2`](`getProgramBinary/2`) returns a binary representation\nof the compiled and linked executable for `Program` into the array of bytes\nwhose address is specified in `Binary`. The maximum number of bytes that may be\nwritten into `Binary` is specified by `BufSize`. If the program binary is\ngreater in size than `BufSize` bytes, then an error is generated, otherwise the\nactual number of bytes written into `Binary` is returned in the variable whose\naddress is given by `Length`. If `Length` is `?NULL`, then no length is\nreturned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramBinary.xhtml)","ref":"gl.html#getProgramBinary/2"},{"type":"function","title":"gl.getProgramInfoLog/2","doc":"[`gl:getProgramInfoLog/2`](`getProgramInfoLog/2`) returns the information log\nfor the specified program object. The information log for a program object is\nmodified when the program object is linked or validated. The string that is\nreturned will be null terminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramInfoLog.xhtml)","ref":"gl.html#getProgramInfoLog/2"},{"type":"function","title":"gl.getProgramInterfaceiv/3","doc":"[`gl:getProgramInterfaceiv/3`](`getProgramInterfaceiv/3`) queries the property\nof the interface identifed by `ProgramInterface` in `Program`, the property name\nof which is given by `Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramInterface.xhtml)","ref":"gl.html#getProgramInterfaceiv/3"},{"type":"function","title":"gl.getProgramiv/2","doc":"[`gl:getProgram()`](`getProgramiv/2`) returns in `Params` the value of a\nparameter for a specific program object. The following parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgram.xhtml)","ref":"gl.html#getProgramiv/2"},{"type":"function","title":"gl.getProgramPipelineInfoLog/2","doc":"[`gl:getProgramPipelineInfoLog/2`](`getProgramPipelineInfoLog/2`) retrieves the\ninfo log for the program pipeline object `Pipeline`. The info log, including its\nnull terminator, is written into the array of characters whose address is given\nby `InfoLog`. The maximum number of characters that may be written into\n`InfoLog` is given by `BufSize`, and the actual number of characters written\ninto `InfoLog` is returned in the integer whose address is given by `Length`. If\n`Length` is `?NULL`, no length is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramPipelineInfoLog.xhtml)","ref":"gl.html#getProgramPipelineInfoLog/2"},{"type":"function","title":"gl.getProgramPipelineiv/2","doc":"[`gl:getProgramPipelineiv/2`](`getProgramPipelineiv/2`) retrieves the value of a\nproperty of the program pipeline object `Pipeline`. `Pname` specifies the name\nof the parameter whose value to retrieve. The value of the parameter is written\nto the variable whose address is given by `Params`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramPipeline.xhtml)","ref":"gl.html#getProgramPipelineiv/2"},{"type":"function","title":"gl.getProgramResourceIndex/3","doc":"[`gl:getProgramResourceIndex/3`](`getProgramResourceIndex/3`) returns the\nunsigned integer index assigned to a resource named `Name` in the interface type\n`ProgramInterface` of program object `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceIndex.xhtml)","ref":"gl.html#getProgramResourceIndex/3"},{"type":"function","title":"gl.getProgramResourceLocation/3","doc":"[`gl:getProgramResourceLocation/3`](`getProgramResourceLocation/3`) returns the\nlocation assigned to the variable named `Name` in interface `ProgramInterface`\nof program object `Program`. `Program` must be the name of a program that has\nbeen linked successfully. `ProgramInterface` must be one of `?GL_UNIFORM`,\n`?GL_PROGRAM_INPUT`, `?GL_PROGRAM_OUTPUT`, `?GL_VERTEX_SUBROUTINE_UNIFORM`,\n`?GL_TESS_CONTROL_SUBROUTINE_UNIFORM`, `?GL_TESS_EVALUATION_SUBROUTINE_UNIFORM`,\n`?GL_GEOMETRY_SUBROUTINE_UNIFORM`, `?GL_FRAGMENT_SUBROUTINE_UNIFORM`,\n`?GL_COMPUTE_SUBROUTINE_UNIFORM`, or `?GL_TRANSFORM_FEEDBACK_BUFFER`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceLocation.xhtml)","ref":"gl.html#getProgramResourceLocation/3"},{"type":"function","title":"gl.getProgramResourceLocationIndex/3","doc":"[`gl:getProgramResourceLocationIndex/3`](`getProgramResourceLocationIndex/3`)\nreturns the fragment color index assigned to the variable named `Name` in\ninterface `ProgramInterface` of program object `Program`. `Program` must be the\nname of a program that has been linked successfully. `ProgramInterface` must be\n`?GL_PROGRAM_OUTPUT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceLocationIndex.xhtml)","ref":"gl.html#getProgramResourceLocationIndex/3"},{"type":"function","title":"gl.getProgramResourceName/4","doc":"[`gl:getProgramResourceName/4`](`getProgramResourceName/4`) retrieves the name\nstring assigned to the single active resource with an index of `Index` in the\ninterface `ProgramInterface` of program object `Program`. `Index` must be less\nthan the number of entries in the active resource list for `ProgramInterface`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramResourceName.xhtml)","ref":"gl.html#getProgramResourceName/4"},{"type":"function","title":"gl.getProgramStageiv/3","doc":"[`gl:getProgramStage()`](`getProgramStageiv/3`) queries a parameter of a shader\nstage attached to a program object. `Program` contains the name of the program\nto which the shader is attached. `Shadertype` specifies the stage from which to\nquery the parameter. `Pname` specifies which parameter should be queried. The\nvalue or values of the parameter to be queried is returned in the variable whose\naddress is given in `Values`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetProgramStage.xhtml)","ref":"gl.html#getProgramStageiv/3"},{"type":"function","title":"gl.getQueryBufferObjecti64v/4","doc":"","ref":"gl.html#getQueryBufferObjecti64v/4"},{"type":"function","title":"gl.getQueryBufferObjectiv/4","doc":"","ref":"gl.html#getQueryBufferObjectiv/4"},{"type":"function","title":"gl.getQueryBufferObjectui64v/4","doc":"","ref":"gl.html#getQueryBufferObjectui64v/4"},{"type":"function","title":"gl.getQueryBufferObjectuiv/4","doc":"","ref":"gl.html#getQueryBufferObjectuiv/4"},{"type":"function","title":"gl.getQueryIndexediv/3","doc":"[`gl:getQueryIndexediv/3`](`getQueryIndexediv/3`) returns in `Params` a selected\nparameter of the indexed query object target specified by `Target` and `Index`.\n`Index` specifies the index of the query object target and must be between zero\nand a target-specific maxiumum.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryIndexed.xhtml)","ref":"gl.html#getQueryIndexediv/3"},{"type":"function","title":"gl.getQueryiv/2","doc":"[`gl:getQueryiv/2`](`getQueryiv/2`) returns in `Params` a selected parameter of\nthe query object target specified by `Target`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryiv.xhtml)","ref":"gl.html#getQueryiv/2"},{"type":"function","title":"gl.getQueryObjecti64v/2","doc":"","ref":"gl.html#getQueryObjecti64v/2"},{"type":"function","title":"gl.getQueryObjectiv/2","doc":"","ref":"gl.html#getQueryObjectiv/2"},{"type":"function","title":"gl.getQueryObjectui64v/2","doc":"","ref":"gl.html#getQueryObjectui64v/2"},{"type":"function","title":"gl.getQueryObjectuiv/2","doc":"These commands return a selected parameter of the query object specified by\n`Id`. [`gl:getQueryObject()`](`getQueryObjectiv/2`) returns in `Params` a\nselected parameter of the query object specified by `Id`.\n[`gl:getQueryBufferObject()`](`getQueryObjectiv/2`) returns in `Buffer` a\nselected parameter of the query object specified by `Id`, by writing it to\n`Buffer`'s data store at the byte offset specified by `Offset`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetQueryObject.xhtml)","ref":"gl.html#getQueryObjectuiv/2"},{"type":"function","title":"gl.getRenderbufferParameteriv/2","doc":"[`gl:getRenderbufferParameteriv/2`](`getRenderbufferParameteriv/2`) and\n`glGetNamedRenderbufferParameteriv` query parameters of a specified renderbuffer\nobject.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetRenderbufferParameter.xhtml)","ref":"gl.html#getRenderbufferParameteriv/2"},{"type":"function","title":"gl.getSamplerParameterfv/2","doc":"","ref":"gl.html#getSamplerParameterfv/2"},{"type":"function","title":"gl.getSamplerParameterIiv/2","doc":"","ref":"gl.html#getSamplerParameterIiv/2"},{"type":"function","title":"gl.getSamplerParameterIuiv/2","doc":"","ref":"gl.html#getSamplerParameterIuiv/2"},{"type":"function","title":"gl.getSamplerParameteriv/2","doc":"[`gl:getSamplerParameter()`](`getSamplerParameteriv/2`) returns in `Params` the\nvalue or values of the sampler parameter specified as `Pname`. `Sampler` defines\nthe target sampler, and must be the name of an existing sampler object, returned\nfrom a previous call to [`gl:genSamplers/1`](`genSamplers/1`). `Pname` accepts\nthe same symbols as [`gl:samplerParameter()`](`samplerParameteri/3`), with the\nsame interpretations:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSamplerParameter.xhtml)","ref":"gl.html#getSamplerParameteriv/2"},{"type":"function","title":"gl.getShaderInfoLog/2","doc":"[`gl:getShaderInfoLog/2`](`getShaderInfoLog/2`) returns the information log for\nthe specified shader object. The information log for a shader object is modified\nwhen the shader is compiled. The string that is returned will be null\nterminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderInfoLog.xhtml)","ref":"gl.html#getShaderInfoLog/2"},{"type":"function","title":"gl.getShaderiv/2","doc":"[`gl:getShader()`](`getShaderiv/2`) returns in `Params` the value of a parameter\nfor a specific shader object. The following parameters are defined:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShader.xhtml)","ref":"gl.html#getShaderiv/2"},{"type":"function","title":"gl.getShaderPrecisionFormat/2","doc":"[`gl:getShaderPrecisionFormat/2`](`getShaderPrecisionFormat/2`) retrieves the\nnumeric range and precision for the implementation's representation of\nquantities in different numeric formats in specified shader type. `ShaderType`\nspecifies the type of shader for which the numeric precision and range is to be\nretrieved and must be one of `?GL_VERTEX_SHADER` or `?GL_FRAGMENT_SHADER`.\n`PrecisionType` specifies the numeric format to query and must be one of\n`?GL_LOW_FLOAT`, `?GL_MEDIUM_FLOAT``?GL_HIGH_FLOAT`, `?GL_LOW_INT`,\n`?GL_MEDIUM_INT`, or `?GL_HIGH_INT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderPrecisionFormat.xhtml)","ref":"gl.html#getShaderPrecisionFormat/2"},{"type":"function","title":"gl.getShaderSource/2","doc":"[`gl:getShaderSource/2`](`getShaderSource/2`) returns the concatenation of the\nsource code strings from the shader object specified by `Shader`. The source\ncode strings for a shader object are the result of a previous call to\n[`gl:shaderSource/2`](`shaderSource/2`). The string returned by the function\nwill be null terminated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetShaderSource.xhtml)","ref":"gl.html#getShaderSource/2"},{"type":"function","title":"gl.getString/1","doc":"","ref":"gl.html#getString/1"},{"type":"function","title":"gl.getStringi/2","doc":"[`gl:getString/1`](`getString/1`) returns a pointer to a static string\ndescribing some aspect of the current GL connection. `Name` can be one of the\nfollowing:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetString.xhtml)","ref":"gl.html#getStringi/2"},{"type":"function","title":"gl.getSubroutineIndex/3","doc":"[`gl:getSubroutineIndex/3`](`getSubroutineIndex/3`) returns the index of a\nsubroutine uniform within a shader stage attached to a program object. `Program`\ncontains the name of the program to which the shader is attached. `Shadertype`\nspecifies the stage from which to query shader subroutine index. `Name` contains\nthe null-terminated name of the subroutine uniform whose name to query.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSubroutineIndex.xhtml)","ref":"gl.html#getSubroutineIndex/3"},{"type":"function","title":"gl.getSubroutineUniformLocation/3","doc":"[`gl:getSubroutineUniformLocation/3`](`getSubroutineUniformLocation/3`) returns\nthe location of the subroutine uniform variable `Name` in the shader stage of\ntype `Shadertype` attached to `Program`, with behavior otherwise identical to\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSubroutineUniformLocation.xhtml)","ref":"gl.html#getSubroutineUniformLocation/3"},{"type":"function","title":"gl.getSynciv/3","doc":"[`gl:getSynciv/3`](`getSynciv/3`) retrieves properties of a sync object. `Sync`\nspecifies the name of the sync object whose properties to retrieve.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetSync.xhtml)","ref":"gl.html#getSynciv/3"},{"type":"function","title":"gl.getTexEnvfv/2","doc":"","ref":"gl.html#getTexEnvfv/2"},{"type":"function","title":"gl.getTexEnviv/2","doc":"[`gl:getTexEnv()`](`getTexEnvfv/2`) returns in `Params` selected values of a\ntexture environment that was specified with [`gl:texEnv()`](`texEnvf/3`).\n`Target` specifies a texture environment.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetTexEnv.xml)","ref":"gl.html#getTexEnviv/2"},{"type":"function","title":"gl.getTexGendv/2","doc":"","ref":"gl.html#getTexGendv/2"},{"type":"function","title":"gl.getTexGenfv/2","doc":"","ref":"gl.html#getTexGenfv/2"},{"type":"function","title":"gl.getTexGeniv/2","doc":"[`gl:getTexGen()`](`getTexGendv/2`) returns in `Params` selected parameters of a\ntexture coordinate generation function that was specified using\n[`gl:texGen()`](`texGend/3`). `Coord` names one of the (`s`, `t`, `r`, `q`)\ntexture coordinates, using the symbolic constant `?GL_S`, `?GL_T`, `?GL_R`, or\n`?GL_Q`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glGetTexGen.xml)","ref":"gl.html#getTexGeniv/2"},{"type":"function","title":"gl.getTexImage/5","doc":"[`gl:getTexImage/5`](`getTexImage/5`), `glGetnTexImage` and `glGetTextureImage`\nfunctions return a texture image into `Pixels`. For\n[`gl:getTexImage/5`](`getTexImage/5`) and `glGetnTexImage`, `Target` specifies\nwhether the desired texture image is one specified by\n[`gl:texImage1D/8`](`texImage1D/8`) (`?GL_TEXTURE_1D`),\n[`gl:texImage2D/9`](`texImage2D/9`) (`?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_2D` or any of `?GL_TEXTURE_CUBE_MAP_*`),\nor [`gl:texImage3D/10`](`texImage3D/10`) (`?GL_TEXTURE_2D_ARRAY`,\n`?GL_TEXTURE_3D`, `?GL_TEXTURE_CUBE_MAP_ARRAY`). For `glGetTextureImage`,\n`Texture` specifies the texture object name. In addition to types of textures\naccepted by [`gl:getTexImage/5`](`getTexImage/5`) and `glGetnTexImage`, the\nfunction also accepts cube map texture objects (with effective target\n`?GL_TEXTURE_CUBE_MAP`). `Level` specifies the level-of-detail number of the\ndesired image. `Format` and `Type` specify the format and type of the desired\nimage array. See the reference page for [`gl:texImage1D/8`](`texImage1D/8`) for\na description of the acceptable values for the `Format` and `Type` parameters,\nrespectively. For glGetnTexImage and glGetTextureImage functions, bufSize tells\nthe size of the buffer to receive the retrieved pixel data. `glGetnTexImage` and\n`glGetTextureImage` do not write more than `BufSize` bytes into `Pixels`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexImage.xhtml)","ref":"gl.html#getTexImage/5"},{"type":"function","title":"gl.getTexLevelParameterfv/3","doc":"","ref":"gl.html#getTexLevelParameterfv/3"},{"type":"function","title":"gl.getTexLevelParameteriv/3","doc":"[`gl:getTexLevelParameterfv/3`](`getTexLevelParameterfv/3`),\n[`gl:getTexLevelParameteriv/3`](`getTexLevelParameterfv/3`),\n`glGetTextureLevelParameterfv` and `glGetTextureLevelParameteriv` return in\n`Params` texture parameter values for a specific level-of-detail value,\nspecified as `Level`. For the first two functions, `Target` defines the target\ntexture, either `?GL_TEXTURE_1D`, `?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`,\n`?GL_PROXY_TEXTURE_1D`, `?GL_PROXY_TEXTURE_2D`, `?GL_PROXY_TEXTURE_3D`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_X`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_X`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_Y`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_Y`,\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_Z`, `?GL_TEXTURE_CUBE_MAP_NEGATIVE_Z`, or\n`?GL_PROXY_TEXTURE_CUBE_MAP`. The remaining two take a `Texture` argument which\nspecifies the name of the texture object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexLevelParameter.xhtml)","ref":"gl.html#getTexLevelParameteriv/3"},{"type":"function","title":"gl.getTexParameterfv/2","doc":"","ref":"gl.html#getTexParameterfv/2"},{"type":"function","title":"gl.getTexParameterIiv/2","doc":"","ref":"gl.html#getTexParameterIiv/2"},{"type":"function","title":"gl.getTexParameterIuiv/2","doc":"","ref":"gl.html#getTexParameterIuiv/2"},{"type":"function","title":"gl.getTexParameteriv/2","doc":"[`gl:getTexParameter()`](`getTexParameterfv/2`) and `glGetTextureParameter`\nreturn in `Params` the value or values of the texture parameter specified as\n`Pname`. `Target` defines the target texture. `?GL_TEXTURE_1D`,\n`?GL_TEXTURE_2D`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_1D_ARRAY`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_RECTANGLE`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, `?GL_TEXTURE_2D_MULTISAMPLE`, or\n`?GL_TEXTURE_2D_MULTISAMPLE_ARRAY` specify one-, two-, or three-dimensional,\none-dimensional array, two-dimensional array, rectangle, cube-mapped or\ncube-mapped array, two-dimensional multisample, or two-dimensional multisample\narray texturing, respectively. `Pname` accepts the same symbols as\n[`gl:texParameter()`](`texParameterf/3`), with the same interpretations:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexParameter.xhtml)","ref":"gl.html#getTexParameteriv/2"},{"type":"function","title":"gl.getTransformFeedbackVarying/3","doc":"Information about the set of varying variables in a linked program that will be\ncaptured during transform feedback may be retrieved by calling\n[`gl:getTransformFeedbackVarying/3`](`getTransformFeedbackVarying/3`).\n[`gl:getTransformFeedbackVarying/3`](`getTransformFeedbackVarying/3`) provides\ninformation about the varying variable selected by `Index`. An `Index` of 0\nselects the first varying variable specified in the `Varyings` array passed to\n[`gl:transformFeedbackVaryings/3`](`transformFeedbackVaryings/3`), and an\n`Index` of the value of `?GL_TRANSFORM_FEEDBACK_VARYINGS` minus one selects the\nlast such variable.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTransformFeedbackVarying.xhtml)","ref":"gl.html#getTransformFeedbackVarying/3"},{"type":"function","title":"gl.getUniformBlockIndex/2","doc":"[`gl:getUniformBlockIndex/2`](`getUniformBlockIndex/2`) retrieves the index of a\nuniform block within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformBlockIndex.xhtml)","ref":"gl.html#getUniformBlockIndex/2"},{"type":"function","title":"gl.getUniformdv/2","doc":"","ref":"gl.html#getUniformdv/2"},{"type":"function","title":"gl.getUniformfv/2","doc":"","ref":"gl.html#getUniformfv/2"},{"type":"function","title":"gl.getUniformIndices/2","doc":"[`gl:getUniformIndices/2`](`getUniformIndices/2`) retrieves the indices of a\nnumber of uniforms within `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformIndices.xhtml)","ref":"gl.html#getUniformIndices/2"},{"type":"function","title":"gl.getUniformiv/2","doc":"","ref":"gl.html#getUniformiv/2"},{"type":"function","title":"gl.getUniformLocation/2","doc":"`glGetUniformLocation `returns an integer that represents the location of a\nspecific uniform variable within a program object. `Name` must be a null\nterminated string that contains no white space. `Name` must be an active uniform\nvariable name in `Program` that is not a structure, an array of structures, or a\nsubcomponent of a vector or a matrix. This function returns -1 if `Name` does\nnot correspond to an active uniform variable in `Program`, if `Name` starts with\nthe reserved prefix \"gl\\_\", or if `Name` is associated with an atomic counter or\na named uniform block.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformLocation.xhtml)","ref":"gl.html#getUniformLocation/2"},{"type":"function","title":"gl.getUniformSubroutineuiv/2","doc":"[`gl:getUniformSubroutine()`](`getUniformSubroutineuiv/2`) retrieves the value\nof the subroutine uniform at location `Location` for shader stage `Shadertype`\nof the current program. `Location` must be less than the value of\n`?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS` for the shader currently in use at\nshader stage `Shadertype`. The value of the subroutine uniform is returned in\n`Values`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformSubroutine.xhtml)","ref":"gl.html#getUniformSubroutineuiv/2"},{"type":"function","title":"gl.getUniformuiv/2","doc":"[`gl:getUniform()`](`getUniformfv/2`) and `glGetnUniform` return in `Params` the\nvalue(s) of the specified uniform variable. The type of the uniform variable\nspecified by `Location` determines the number of values returned. If the uniform\nvariable is defined in the shader as a boolean, int, or float, a single value\nwill be returned. If it is defined as a vec2, ivec2, or bvec2, two values will\nbe returned. If it is defined as a vec3, ivec3, or bvec3, three values will be\nreturned, and so on. To query values stored in uniform variables declared as\narrays, call [`gl:getUniform()`](`getUniformfv/2`) for each element of the\narray. To query values stored in uniform variables declared as structures, call\n[`gl:getUniform()`](`getUniformfv/2`) for each field in the structure. The\nvalues for uniform variables declared as a matrix will be returned in column\nmajor order.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniform.xhtml)","ref":"gl.html#getUniformuiv/2"},{"type":"function","title":"gl.getVertexAttribdv/2","doc":"","ref":"gl.html#getVertexAttribdv/2"},{"type":"function","title":"gl.getVertexAttribfv/2","doc":"","ref":"gl.html#getVertexAttribfv/2"},{"type":"function","title":"gl.getVertexAttribIiv/2","doc":"","ref":"gl.html#getVertexAttribIiv/2"},{"type":"function","title":"gl.getVertexAttribIuiv/2","doc":"","ref":"gl.html#getVertexAttribIuiv/2"},{"type":"function","title":"gl.getVertexAttribiv/2","doc":"[`gl:getVertexAttrib()`](`getVertexAttribdv/2`) returns in `Params` the value of\na generic vertex attribute parameter. The generic vertex attribute to be queried\nis specified by `Index`, and the parameter to be queried is specified by\n`Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetVertexAttrib.xhtml)","ref":"gl.html#getVertexAttribiv/2"},{"type":"function","title":"gl.getVertexAttribLdv/2","doc":"","ref":"gl.html#getVertexAttribLdv/2"},{"type":"function","title":"gl.hint/2","doc":"Certain aspects of GL behavior, when there is room for interpretation, can be\ncontrolled with hints. A hint is specified with two arguments. `Target` is a\nsymbolic constant indicating the behavior to be controlled, and `Mode` is\nanother symbolic constant indicating the desired behavior. The initial value for\neach `Target` is `?GL_DONT_CARE`. `Mode` can be one of the following:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glHint.xhtml)","ref":"gl.html#hint/2"},{"type":"function","title":"gl.histogram/4","doc":"When `?GL_HISTOGRAM` is enabled, RGBA color components are converted to\nhistogram table indices by clamping to the range \\[0,1], multiplying by the\nwidth of the histogram table, and rounding to the nearest integer. The table\nentries selected by the RGBA indices are then incremented. (If the internal\nformat of the histogram table includes luminance, then the index derived from\nthe R color component determines the luminance table entry to be incremented.)\nIf a histogram table entry is incremented beyond its maximum value, then its\nvalue becomes undefined. (This is not an error.)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glHistogram.xml)","ref":"gl.html#histogram/4"},{"type":"function","title":"gl.indexd/1","doc":"","ref":"gl.html#indexd/1"},{"type":"function","title":"gl.indexdv/1","doc":"","ref":"gl.html#indexdv/1"},{"type":"function","title":"gl.indexf/1","doc":"","ref":"gl.html#indexf/1"},{"type":"function","title":"gl.indexfv/1","doc":"","ref":"gl.html#indexfv/1"},{"type":"function","title":"gl.indexi/1","doc":"","ref":"gl.html#indexi/1"},{"type":"function","title":"gl.indexiv/1","doc":"","ref":"gl.html#indexiv/1"},{"type":"function","title":"gl.indexMask/1","doc":"[`gl:indexMask/1`](`indexMask/1`) controls the writing of individual bits in the\ncolor index buffers. The least significant n bits of `Mask`, where n is the\nnumber of bits in a color index buffer, specify a mask. Where a 1 (one) appears\nin the mask, it's possible to write to the corresponding bit in the color index\nbuffer (or buffers). Where a 0 (zero) appears, the corresponding bit is\nwrite-protected.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndexMask.xml)","ref":"gl.html#indexMask/1"},{"type":"function","title":"gl.indexPointer/3","doc":"[`gl:indexPointer/3`](`indexPointer/3`) specifies the location and data format\nof an array of color indexes to use when rendering. `Type` specifies the data\ntype of each color index and `Stride` specifies the byte stride from one color\nindex to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndexPointer.xml)","ref":"gl.html#indexPointer/3"},{"type":"function","title":"gl.indexs/1","doc":"","ref":"gl.html#indexs/1"},{"type":"function","title":"gl.indexsv/1","doc":"","ref":"gl.html#indexsv/1"},{"type":"function","title":"gl.indexub/1","doc":"","ref":"gl.html#indexub/1"},{"type":"function","title":"gl.indexubv/1","doc":"[`gl:index()`](`indexd/1`) updates the current (single-valued) color index. It\ntakes one argument, the new value for the current color index.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIndex.xml)","ref":"gl.html#indexubv/1"},{"type":"function","title":"gl.initNames/0","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers.\n[`gl:initNames/0`](`initNames/0`) causes the name stack to be initialized to its\ndefault empty state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glInitNames.xml)","ref":"gl.html#initNames/0"},{"type":"function","title":"gl.interleavedArrays/3","doc":"[`gl:interleavedArrays/3`](`interleavedArrays/3`) lets you specify and enable\nindividual color, normal, texture and vertex arrays whose elements are part of a\nlarger aggregate array element. For some implementations, this is more efficient\nthan specifying the arrays separately.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glInterleavedArrays.xml)","ref":"gl.html#interleavedArrays/3"},{"type":"function","title":"gl.invalidateBufferData/1","doc":"[`gl:invalidateBufferData/1`](`invalidateBufferData/1`) invalidates all of the\ncontent of the data store of a buffer object. After invalidation, the content of\nthe buffer's data store becomes undefined.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateBufferData.xhtml)","ref":"gl.html#invalidateBufferData/1"},{"type":"function","title":"gl.invalidateBufferSubData/3","doc":"[`gl:invalidateBufferSubData/3`](`invalidateBufferSubData/3`) invalidates all or\npart of the content of the data store of a buffer object. After invalidation,\nthe content of the specified range of the buffer's data store becomes undefined.\nThe start of the range is given by `Offset` and its size is given by `Length`,\nboth measured in basic machine units.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateBufferSubData.xhtml)","ref":"gl.html#invalidateBufferSubData/3"},{"type":"function","title":"gl.invalidateFramebuffer/2","doc":"[`gl:invalidateFramebuffer/2`](`invalidateFramebuffer/2`) and\n`glInvalidateNamedFramebufferData` invalidate the entire contents of a specified\nset of attachments of a framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateFramebuffer.xhtml)","ref":"gl.html#invalidateFramebuffer/2"},{"type":"function","title":"gl.invalidateSubFramebuffer/6","doc":"[`gl:invalidateSubFramebuffer/6`](`invalidateSubFramebuffer/6`) and\n`glInvalidateNamedFramebufferSubData` invalidate the contents of a specified\nregion of a specified set of attachments of a framebuffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateSubFramebuffer.xhtml)","ref":"gl.html#invalidateSubFramebuffer/6"},{"type":"function","title":"gl.invalidateTexImage/2","doc":"[`gl:invalidateTexSubImage/8`](`invalidateTexSubImage/8`) invalidates all of a\ntexture image. `Texture` and `Level` indicated which texture image is being\ninvalidated. After this command, data in the texture image has undefined values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateTexImage.xhtml)","ref":"gl.html#invalidateTexImage/2"},{"type":"function","title":"gl.invalidateTexSubImage/8","doc":"[`gl:invalidateTexSubImage/8`](`invalidateTexSubImage/8`) invalidates all or\npart of a texture image. `Texture` and `Level` indicated which texture image is\nbeing invalidated. After this command, data in that subregion have undefined\nvalues. `Xoffset`, `Yoffset`, `Zoffset`, `Width`, `Height`, and `Depth` are\ninterpreted as they are in [`gl:texSubImage3D/11`](`texSubImage3D/11`). For\ntexture targets that don't have certain dimensions, this command treats those\ndimensions as having a size of 1. For example, to invalidate a portion of a two-\ndimensional texture, the application would use `Zoffset` equal to zero and\n`Depth` equal to one. Cube map textures are treated as an array of six slices in\nthe z-dimension, where a value of `Zoffset` is interpreted as specifying face\n`?GL_TEXTURE_CUBE_MAP_POSITIVE_X` \\+ `Zoffset`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glInvalidateTexSubImage.xhtml)","ref":"gl.html#invalidateTexSubImage/8"},{"type":"function","title":"gl.isBuffer/1","doc":"[`gl:isBuffer/1`](`isBuffer/1`) returns `?GL_TRUE` if `Buffer` is currently the\nname of a buffer object. If `Buffer` is zero, or is a non-zero value that is not\ncurrently the name of a buffer object, or if an error occurs,\n[`gl:isBuffer/1`](`isBuffer/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsBuffer.xhtml)","ref":"gl.html#isBuffer/1"},{"type":"function","title":"gl.isEnabled/1","doc":"","ref":"gl.html#isEnabled/1"},{"type":"function","title":"gl.isEnabledi/2","doc":"[`gl:isEnabled/1`](`isEnabled/1`) returns `?GL_TRUE` if `Cap` is an enabled\ncapability and returns `?GL_FALSE` otherwise. Boolean states that are indexed\nmay be tested with [`gl:isEnabledi/2`](`isEnabled/1`). For\n[`gl:isEnabledi/2`](`isEnabled/1`), `Index` specifies the index of the\ncapability to test. `Index` must be between zero and the count of indexed\ncapabilities for `Cap`. Initially all capabilities except `?GL_DITHER` are\ndisabled; `?GL_DITHER` is initially enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsEnabled.xhtml)","ref":"gl.html#isEnabledi/2"},{"type":"function","title":"gl.isFramebuffer/1","doc":"[`gl:isFramebuffer/1`](`isFramebuffer/1`) returns `?GL_TRUE` if `Framebuffer` is\ncurrently the name of a framebuffer object. If `Framebuffer` is zero, or if\n`?framebuffer` is not the name of a framebuffer object, or if an error occurs,\n[`gl:isFramebuffer/1`](`isFramebuffer/1`) returns `?GL_FALSE`. If `Framebuffer`\nis a name returned by [`gl:genFramebuffers/1`](`genFramebuffers/1`), by that has\nnot yet been bound through a call to\n[`gl:bindFramebuffer/2`](`bindFramebuffer/2`), then the name is not a\nframebuffer object and [`gl:isFramebuffer/1`](`isFramebuffer/1`) returns\n`?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsFramebuffer.xhtml)","ref":"gl.html#isFramebuffer/1"},{"type":"function","title":"gl.isList/1","doc":"[`gl:isList/1`](`isList/1`) returns `?GL_TRUE` if `List` is the name of a\ndisplay list and returns `?GL_FALSE` if it is not, or if an error occurs.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glIsList.xml)","ref":"gl.html#isList/1"},{"type":"function","title":"gl.isProgram/1","doc":"[`gl:isProgram/1`](`isProgram/1`) returns `?GL_TRUE` if `Program` is the name of\na program object previously created with\n[`gl:createProgram/0`](`createProgram/0`) and not yet deleted with\n[`gl:deleteProgram/1`](`deleteProgram/1`). If `Program` is zero or a non-zero\nvalue that is not the name of a program object, or if an error occurs,\n[`gl:isProgram/1`](`isProgram/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsProgram.xhtml)","ref":"gl.html#isProgram/1"},{"type":"function","title":"gl.isProgramPipeline/1","doc":"[`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns `?GL_TRUE` if\n`Pipeline` is currently the name of a program pipeline object. If `Pipeline` is\nzero, or if `?pipeline` is not the name of a program pipeline object, or if an\nerror occurs, [`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns\n`?GL_FALSE`. If `Pipeline` is a name returned by\n[`gl:genProgramPipelines/1`](`genProgramPipelines/1`), but that has not yet been\nbound through a call to [`gl:bindProgramPipeline/1`](`bindProgramPipeline/1`),\nthen the name is not a program pipeline object and\n[`gl:isProgramPipeline/1`](`isProgramPipeline/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsProgramPipeline.xhtml)","ref":"gl.html#isProgramPipeline/1"},{"type":"function","title":"gl.isQuery/1","doc":"[`gl:isQuery/1`](`isQuery/1`) returns `?GL_TRUE` if `Id` is currently the name\nof a query object. If `Id` is zero, or is a non-zero value that is not currently\nthe name of a query object, or if an error occurs, [`gl:isQuery/1`](`isQuery/1`)\nreturns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsQuery.xhtml)","ref":"gl.html#isQuery/1"},{"type":"function","title":"gl.isRenderbuffer/1","doc":"[`gl:isRenderbuffer/1`](`isRenderbuffer/1`) returns `?GL_TRUE` if `Renderbuffer`\nis currently the name of a renderbuffer object. If `Renderbuffer` is zero, or if\n`Renderbuffer` is not the name of a renderbuffer object, or if an error occurs,\n[`gl:isRenderbuffer/1`](`isRenderbuffer/1`) returns `?GL_FALSE`. If\n`Renderbuffer` is a name returned by\n[`gl:genRenderbuffers/1`](`genRenderbuffers/1`), by that has not yet been bound\nthrough a call to [`gl:bindRenderbuffer/2`](`bindRenderbuffer/2`) or\n[`gl:framebufferRenderbuffer/4`](`framebufferRenderbuffer/4`), then the name is\nnot a renderbuffer object and [`gl:isRenderbuffer/1`](`isRenderbuffer/1`)\nreturns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsRenderbuffer.xhtml)","ref":"gl.html#isRenderbuffer/1"},{"type":"function","title":"gl.isSampler/1","doc":"[`gl:isSampler/1`](`isSampler/1`) returns `?GL_TRUE` if `Id` is currently the\nname of a sampler object. If `Id` is zero, or is a non-zero value that is not\ncurrently the name of a sampler object, or if an error occurs,\n[`gl:isSampler/1`](`isSampler/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsSampler.xhtml)","ref":"gl.html#isSampler/1"},{"type":"function","title":"gl.isShader/1","doc":"[`gl:isShader/1`](`isShader/1`) returns `?GL_TRUE` if `Shader` is the name of a\nshader object previously created with [`gl:createShader/1`](`createShader/1`)\nand not yet deleted with [`gl:deleteShader/1`](`deleteShader/1`). If `Shader` is\nzero or a non-zero value that is not the name of a shader object, or if an error\noccurs, `glIsShader `returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsShader.xhtml)","ref":"gl.html#isShader/1"},{"type":"function","title":"gl.isSync/1","doc":"[`gl:isSync/1`](`isSync/1`) returns `?GL_TRUE` if `Sync` is currently the name\nof a sync object. If `Sync` is not the name of a sync object, or if an error\noccurs, [`gl:isSync/1`](`isSync/1`) returns `?GL_FALSE`. Note that zero is not\nthe name of a sync object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsSync.xhtml)","ref":"gl.html#isSync/1"},{"type":"function","title":"gl.isTexture/1","doc":"[`gl:isTexture/1`](`isTexture/1`) returns `?GL_TRUE` if `Texture` is currently\nthe name of a texture. If `Texture` is zero, or is a non-zero value that is not\ncurrently the name of a texture, or if an error occurs,\n[`gl:isTexture/1`](`isTexture/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsTexture.xhtml)","ref":"gl.html#isTexture/1"},{"type":"function","title":"gl.isTransformFeedback/1","doc":"[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_TRUE` if `Id`\nis currently the name of a transform feedback object. If `Id` is zero, or if\n`?id` is not the name of a transform feedback object, or if an error occurs,\n[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_FALSE`. If\n`Id` is a name returned by\n[`gl:genTransformFeedbacks/1`](`genTransformFeedbacks/1`), but that has not yet\nbeen bound through a call to\n[`gl:bindTransformFeedback/2`](`bindTransformFeedback/2`), then the name is not\na transform feedback object and\n[`gl:isTransformFeedback/1`](`isTransformFeedback/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsTransformFeedback.xhtml)","ref":"gl.html#isTransformFeedback/1"},{"type":"function","title":"gl.isVertexArray/1","doc":"[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_TRUE` if `Array` is\ncurrently the name of a vertex array object. If `Array` is zero, or if `Array`\nis not the name of a vertex array object, or if an error occurs,\n[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_FALSE`. If `Array` is a\nname returned by [`gl:genVertexArrays/1`](`genVertexArrays/1`), by that has not\nyet been bound through a call to [`gl:bindVertexArray/1`](`bindVertexArray/1`),\nthen the name is not a vertex array object and\n[`gl:isVertexArray/1`](`isVertexArray/1`) returns `?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glIsVertexArray.xhtml)","ref":"gl.html#isVertexArray/1"},{"type":"function","title":"gl.lightf/3","doc":"","ref":"gl.html#lightf/3"},{"type":"function","title":"gl.lightfv/3","doc":"","ref":"gl.html#lightfv/3"},{"type":"function","title":"gl.lighti/3","doc":"","ref":"gl.html#lighti/3"},{"type":"function","title":"gl.lightiv/3","doc":"[`gl:light()`](`lightf/3`) sets the values of individual light source\nparameters. `Light` names the light and is a symbolic name of the form\n`?GL_LIGHT` i, where i ranges from 0 to the value of `?GL_MAX_LIGHTS` \\- 1.\n`Pname` specifies one of ten light source parameters, again by symbolic name.\n`Params` is either a single value or a pointer to an array that contains the new\nvalues.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLight.xml)","ref":"gl.html#lightiv/3"},{"type":"function","title":"gl.lightModelf/2","doc":"","ref":"gl.html#lightModelf/2"},{"type":"function","title":"gl.lightModelfv/2","doc":"","ref":"gl.html#lightModelfv/2"},{"type":"function","title":"gl.lightModeli/2","doc":"","ref":"gl.html#lightModeli/2"},{"type":"function","title":"gl.lightModeliv/2","doc":"[`gl:lightModel()`](`lightModelf/2`) sets the lighting model parameter. `Pname`\nnames a parameter and `Params` gives the new value. There are three lighting\nmodel parameters:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLightModel.xml)","ref":"gl.html#lightModeliv/2"},{"type":"function","title":"gl.lineStipple/2","doc":"Line stippling masks out certain fragments produced by rasterization; those\nfragments will not be drawn. The masking is achieved by using three parameters:\nthe 16-bit line stipple pattern `Pattern`, the repeat count `Factor`, and an\ninteger stipple counter s.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLineStipple.xml)","ref":"gl.html#lineStipple/2"},{"type":"function","title":"gl.lineWidth/1","doc":"[`gl:lineWidth/1`](`lineWidth/1`) specifies the rasterized width of both aliased\nand antialiased lines. Using a line width other than 1 has different effects,\ndepending on whether line antialiasing is enabled. To enable and disable line\nantialiasing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_LINE_SMOOTH`. Line antialiasing is initially disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLineWidth.xhtml)","ref":"gl.html#lineWidth/1"},{"type":"function","title":"gl.linkProgram/1","doc":"[`gl:linkProgram/1`](`linkProgram/1`) links the program object specified by\n`Program`. If any shader objects of type `?GL_VERTEX_SHADER` are attached to\n`Program`, they will be used to create an executable that will run on the\nprogrammable vertex processor. If any shader objects of type\n`?GL_GEOMETRY_SHADER` are attached to `Program`, they will be used to create an\nexecutable that will run on the programmable geometry processor. If any shader\nobjects of type `?GL_FRAGMENT_SHADER` are attached to `Program`, they will be\nused to create an executable that will run on the programmable fragment\nprocessor.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLinkProgram.xhtml)","ref":"gl.html#linkProgram/1"},{"type":"function","title":"gl.listBase/1","doc":"[`gl:callLists/1`](`callLists/1`) specifies an array of offsets. Display-list\nnames are generated by adding `Base` to each offset. Names that reference valid\ndisplay lists are executed; the others are ignored.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glListBase.xml)","ref":"gl.html#listBase/1"},{"type":"function","title":"gl.loadIdentity/0","doc":"[`gl:loadIdentity/0`](`loadIdentity/0`) replaces the current matrix with the\nidentity matrix. It is semantically equivalent to calling\n[`gl:loadMatrix()`](`loadMatrixd/1`) with the identity matrix\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadIdentity.xml)","ref":"gl.html#loadIdentity/0"},{"type":"function","title":"gl.loadMatrixd/1","doc":"","ref":"gl.html#loadMatrixd/1"},{"type":"function","title":"gl.loadMatrixf/1","doc":"[`gl:loadMatrix()`](`loadMatrixd/1`) replaces the current matrix with the one\nwhose elements are specified by `M`. The current matrix is the projection\nmatrix, modelview matrix, or texture matrix, depending on the current matrix\nmode (see [`gl:matrixMode/1`](`matrixMode/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadMatrix.xml)","ref":"gl.html#loadMatrixf/1"},{"type":"function","title":"gl.loadName/1","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers\nand is initially empty.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadName.xml)","ref":"gl.html#loadName/1"},{"type":"function","title":"gl.loadTransposeMatrixd/1","doc":"","ref":"gl.html#loadTransposeMatrixd/1"},{"type":"function","title":"gl.loadTransposeMatrixf/1","doc":"[`gl:loadTransposeMatrix()`](`loadTransposeMatrixf/1`) replaces the current\nmatrix with the one whose elements are specified by `M`. The current matrix is\nthe projection matrix, modelview matrix, or texture matrix, depending on the\ncurrent matrix mode (see [`gl:matrixMode/1`](`matrixMode/1`)).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadTransposeMatrix.xml)","ref":"gl.html#loadTransposeMatrixf/1"},{"type":"function","title":"gl.logicOp/1","doc":"[`gl:logicOp/1`](`logicOp/1`) specifies a logical operation that, when enabled,\nis applied between the incoming RGBA color and the RGBA color at the\ncorresponding location in the frame buffer. To enable or disable the logical\noperation, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nusing the symbolic constant `?GL_COLOR_LOGIC_OP`. The initial value is disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glLogicOp.xhtml)","ref":"gl.html#logicOp/1"},{"type":"function","title":"gl.map1d/6","doc":"","ref":"gl.html#map1d/6"},{"type":"function","title":"gl.map1f/6","doc":"Evaluators provide a way to use polynomial or rational polynomial mapping to\nproduce vertices, normals, texture coordinates, and colors. The values produced\nby an evaluator are sent to further stages of GL processing just as if they had\nbeen presented using [`gl:vertex()`](`vertex2d/2`),\n[`gl:normal()`](`normal3b/3`), [`gl:texCoord()`](`texCoord1d/1`), and\n[`gl:color()`](`color3b/3`) commands, except that the generated values do not\nupdate the current normal, texture coordinates, or color.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMap1.xml)","ref":"gl.html#map1f/6"},{"type":"function","title":"gl.map2d/10","doc":"","ref":"gl.html#map2d/10"},{"type":"function","title":"gl.map2f/10","doc":"Evaluators provide a way to use polynomial or rational polynomial mapping to\nproduce vertices, normals, texture coordinates, and colors. The values produced\nby an evaluator are sent on to further stages of GL processing just as if they\nhad been presented using [`gl:vertex()`](`vertex2d/2`),\n[`gl:normal()`](`normal3b/3`), [`gl:texCoord()`](`texCoord1d/1`), and\n[`gl:color()`](`color3b/3`) commands, except that the generated values do not\nupdate the current normal, texture coordinates, or color.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMap2.xml)","ref":"gl.html#map2f/10"},{"type":"function","title":"gl.mapGrid1d/3","doc":"","ref":"gl.html#mapGrid1d/3"},{"type":"function","title":"gl.mapGrid1f/3","doc":"","ref":"gl.html#mapGrid1f/3"},{"type":"function","title":"gl.mapGrid2d/6","doc":"","ref":"gl.html#mapGrid2d/6"},{"type":"function","title":"gl.mapGrid2f/6","doc":"[`gl:mapGrid()`](`mapGrid1d/3`) and [`gl:evalMesh()`](`evalMesh1/3`) are used\ntogether to efficiently generate and evaluate a series of evenly-spaced map\ndomain values. [`gl:evalMesh()`](`evalMesh1/3`) steps through the integer domain\nof a one- or two-dimensional grid, whose range is the domain of the evaluation\nmaps specified by `glMap1` and `glMap2`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMapGrid.xml)","ref":"gl.html#mapGrid2f/6"},{"type":"function","title":"gl.materialf/3","doc":"","ref":"gl.html#materialf/3"},{"type":"function","title":"gl.materialfv/3","doc":"","ref":"gl.html#materialfv/3"},{"type":"function","title":"gl.materiali/3","doc":"","ref":"gl.html#materiali/3"},{"type":"function","title":"gl.materialiv/3","doc":"[`gl:material()`](`materialf/3`) assigns values to material parameters. There\nare two matched sets of material parameters. One, the `front-facing` set, is\nused to shade points, lines, bitmaps, and all polygons (when two-sided lighting\nis disabled), or just front-facing polygons (when two-sided lighting is\nenabled). The other set, `back-facing`, is used to shade back-facing polygons\nonly when two-sided lighting is enabled. Refer to the\n[`gl:lightModel()`](`lightModelf/2`) reference page for details concerning one-\nand two-sided lighting calculations.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMaterial.xml)","ref":"gl.html#materialiv/3"},{"type":"function","title":"gl.matrixMode/1","doc":"[`gl:matrixMode/1`](`matrixMode/1`) sets the current matrix mode. `Mode` can\nassume one of four values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMatrixMode.xml)","ref":"gl.html#matrixMode/1"},{"type":"function","title":"gl.memoryBarrier/1","doc":"","ref":"gl.html#memoryBarrier/1"},{"type":"function","title":"gl.memoryBarrierByRegion/1","doc":"[`gl:memoryBarrier/1`](`memoryBarrier/1`) defines a barrier ordering the memory\ntransactions issued prior to the command relative to those issued after the\nbarrier. For the purposes of this ordering, memory transactions performed by\nshaders are considered to be issued by the rendering command that triggered the\nexecution of the shader. `Barriers` is a bitfield indicating the set of\noperations that are synchronized with shader stores; the bits used in `Barriers`\nare as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml)","ref":"gl.html#memoryBarrierByRegion/1"},{"type":"function","title":"gl.minmax/3","doc":"When `?GL_MINMAX` is enabled, the RGBA components of incoming pixels are\ncompared to the minimum and maximum values for each component, which are stored\nin the two-element minmax table. (The first element stores the minima, and the\nsecond element stores the maxima.) If a pixel component is greater than the\ncorresponding component in the maximum element, then the maximum element is\nupdated with the pixel component value. If a pixel component is less than the\ncorresponding component in the minimum element, then the minimum element is\nupdated with the pixel component value. (In both cases, if the internal format\nof the minmax table includes luminance, then the R color component of incoming\npixels is used for comparison.) The contents of the minmax table may be\nretrieved at a later time by calling [`gl:getMinmax/5`](`getMinmax/5`). The\nminmax operation is enabled or disabled by calling [`gl:enable/1`](`enable/1`)\nor [`gl:disable/1`](`enable/1`), respectively, with an argument of `?GL_MINMAX`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMinmax.xml)","ref":"gl.html#minmax/3"},{"type":"function","title":"gl.minSampleShading/1","doc":"[`gl:minSampleShading/1`](`minSampleShading/1`) specifies the rate at which\nsamples are shaded within a covered pixel. Sample-rate shading is enabled by\ncalling [`gl:enable/1`](`enable/1`) with the parameter `?GL_SAMPLE_SHADING`. If\n`?GL_MULTISAMPLE` or `?GL_SAMPLE_SHADING` is disabled, sample shading has no\neffect. Otherwise, an implementation must provide at least as many unique color\nvalues for each covered fragment as specified by `Value` times `Samples` where\n`Samples` is the value of `?GL_SAMPLES` for the current framebuffer. At least 1\nsample for each covered fragment is generated.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMinSampleShading.xhtml)","ref":"gl.html#minSampleShading/1"},{"type":"function","title":"gl.multiDrawArrays/3","doc":"[`gl:multiDrawArrays/3`](`multiDrawArrays/3`) specifies multiple sets of\ngeometric primitives with very few subroutine calls. Instead of calling a GL\nprocedure to pass each individual vertex, normal, texture coordinate, edge flag,\nor color, you can prespecify separate arrays of vertices, normals, and colors\nand use them to construct a sequence of primitives with a single call to\n[`gl:multiDrawArrays/3`](`multiDrawArrays/3`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawArrays.xhtml)","ref":"gl.html#multiDrawArrays/3"},{"type":"function","title":"gl.multiDrawArraysIndirect/4","doc":"[`gl:multiDrawArraysIndirect/4`](`multiDrawArraysIndirect/4`) specifies multiple\ngeometric primitives with very few subroutine calls.\n[`gl:multiDrawArraysIndirect/4`](`multiDrawArraysIndirect/4`) behaves similarly\nto a multitude of calls to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`),\nexecept that the parameters to each call to\n[`gl:drawArraysInstancedBaseInstance/5`](`drawArraysInstancedBaseInstance/5`)\nare stored in an array in memory at the address given by `Indirect`, separated\nby the stride, in basic machine units, specified by `Stride`. If `Stride` is\nzero, then the array is assumed to be tightly packed in memory.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawArraysIndirect.xhtml)","ref":"gl.html#multiDrawArraysIndirect/4"},{"type":"function","title":"gl.multiDrawArraysIndirectCount/5","doc":"No documentation available.","ref":"gl.html#multiDrawArraysIndirectCount/5"},{"type":"function","title":"gl.multiTexCoord1d/2","doc":"","ref":"gl.html#multiTexCoord1d/2"},{"type":"function","title":"gl.multiTexCoord1dv/2","doc":"","ref":"gl.html#multiTexCoord1dv/2"},{"type":"function","title":"gl.multiTexCoord1f/2","doc":"","ref":"gl.html#multiTexCoord1f/2"},{"type":"function","title":"gl.multiTexCoord1fv/2","doc":"","ref":"gl.html#multiTexCoord1fv/2"},{"type":"function","title":"gl.multiTexCoord1i/2","doc":"","ref":"gl.html#multiTexCoord1i/2"},{"type":"function","title":"gl.multiTexCoord1iv/2","doc":"","ref":"gl.html#multiTexCoord1iv/2"},{"type":"function","title":"gl.multiTexCoord1s/2","doc":"","ref":"gl.html#multiTexCoord1s/2"},{"type":"function","title":"gl.multiTexCoord1sv/2","doc":"","ref":"gl.html#multiTexCoord1sv/2"},{"type":"function","title":"gl.multiTexCoord2d/3","doc":"","ref":"gl.html#multiTexCoord2d/3"},{"type":"function","title":"gl.multiTexCoord2dv/2","doc":"","ref":"gl.html#multiTexCoord2dv/2"},{"type":"function","title":"gl.multiTexCoord2f/3","doc":"","ref":"gl.html#multiTexCoord2f/3"},{"type":"function","title":"gl.multiTexCoord2fv/2","doc":"","ref":"gl.html#multiTexCoord2fv/2"},{"type":"function","title":"gl.multiTexCoord2i/3","doc":"","ref":"gl.html#multiTexCoord2i/3"},{"type":"function","title":"gl.multiTexCoord2iv/2","doc":"","ref":"gl.html#multiTexCoord2iv/2"},{"type":"function","title":"gl.multiTexCoord2s/3","doc":"","ref":"gl.html#multiTexCoord2s/3"},{"type":"function","title":"gl.multiTexCoord2sv/2","doc":"","ref":"gl.html#multiTexCoord2sv/2"},{"type":"function","title":"gl.multiTexCoord3d/4","doc":"","ref":"gl.html#multiTexCoord3d/4"},{"type":"function","title":"gl.multiTexCoord3dv/2","doc":"","ref":"gl.html#multiTexCoord3dv/2"},{"type":"function","title":"gl.multiTexCoord3f/4","doc":"","ref":"gl.html#multiTexCoord3f/4"},{"type":"function","title":"gl.multiTexCoord3fv/2","doc":"","ref":"gl.html#multiTexCoord3fv/2"},{"type":"function","title":"gl.multiTexCoord3i/4","doc":"","ref":"gl.html#multiTexCoord3i/4"},{"type":"function","title":"gl.multiTexCoord3iv/2","doc":"","ref":"gl.html#multiTexCoord3iv/2"},{"type":"function","title":"gl.multiTexCoord3s/4","doc":"","ref":"gl.html#multiTexCoord3s/4"},{"type":"function","title":"gl.multiTexCoord3sv/2","doc":"","ref":"gl.html#multiTexCoord3sv/2"},{"type":"function","title":"gl.multiTexCoord4d/5","doc":"","ref":"gl.html#multiTexCoord4d/5"},{"type":"function","title":"gl.multiTexCoord4dv/2","doc":"","ref":"gl.html#multiTexCoord4dv/2"},{"type":"function","title":"gl.multiTexCoord4f/5","doc":"","ref":"gl.html#multiTexCoord4f/5"},{"type":"function","title":"gl.multiTexCoord4fv/2","doc":"","ref":"gl.html#multiTexCoord4fv/2"},{"type":"function","title":"gl.multiTexCoord4i/5","doc":"","ref":"gl.html#multiTexCoord4i/5"},{"type":"function","title":"gl.multiTexCoord4iv/2","doc":"","ref":"gl.html#multiTexCoord4iv/2"},{"type":"function","title":"gl.multiTexCoord4s/5","doc":"","ref":"gl.html#multiTexCoord4s/5"},{"type":"function","title":"gl.multiTexCoord4sv/2","doc":"[`gl:multiTexCoord()`](`multiTexCoord1d/2`) specifies texture coordinates in\none, two, three, or four dimensions.\n[`gl:multiTexCoord1()`](`multiTexCoord1d/2`) sets the current texture\ncoordinates to (s 0 0 1); a call to [`gl:multiTexCoord2()`](`multiTexCoord1d/2`)\nsets them to (s t 0 1). Similarly, [`gl:multiTexCoord3()`](`multiTexCoord1d/2`)\nspecifies the texture coordinates as (s t r 1), and\n[`gl:multiTexCoord4()`](`multiTexCoord1d/2`) defines all four components\nexplicitly as (s t r q).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultiTexCoord.xml)","ref":"gl.html#multiTexCoord4sv/2"},{"type":"function","title":"gl.multMatrixd/1","doc":"","ref":"gl.html#multMatrixd/1"},{"type":"function","title":"gl.multMatrixf/1","doc":"[`gl:multMatrix()`](`multMatrixd/1`) multiplies the current matrix with the one\nspecified using `M`, and replaces the current matrix with the product.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultMatrix.xml)","ref":"gl.html#multMatrixf/1"},{"type":"function","title":"gl.multTransposeMatrixd/1","doc":"","ref":"gl.html#multTransposeMatrixd/1"},{"type":"function","title":"gl.multTransposeMatrixf/1","doc":"[`gl:multTransposeMatrix()`](`multTransposeMatrixf/1`) multiplies the current\nmatrix with the one specified using `M`, and replaces the current matrix with\nthe product.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultTransposeMatrix.xml)","ref":"gl.html#multTransposeMatrixf/1"},{"type":"function","title":"gl.newList/2","doc":"Display lists are groups of GL commands that have been stored for subsequent\nexecution. Display lists are created with [`gl:newList/2`](`newList/2`). All\nsubsequent commands are placed in the display list, in the order issued, until\n[`gl:endList/0`](`newList/2`) is called.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNewList.xml)","ref":"gl.html#newList/2"},{"type":"function","title":"gl.normal3b/3","doc":"","ref":"gl.html#normal3b/3"},{"type":"function","title":"gl.normal3bv/1","doc":"","ref":"gl.html#normal3bv/1"},{"type":"function","title":"gl.normal3d/3","doc":"","ref":"gl.html#normal3d/3"},{"type":"function","title":"gl.normal3dv/1","doc":"","ref":"gl.html#normal3dv/1"},{"type":"function","title":"gl.normal3f/3","doc":"","ref":"gl.html#normal3f/3"},{"type":"function","title":"gl.normal3fv/1","doc":"","ref":"gl.html#normal3fv/1"},{"type":"function","title":"gl.normal3i/3","doc":"","ref":"gl.html#normal3i/3"},{"type":"function","title":"gl.normal3iv/1","doc":"","ref":"gl.html#normal3iv/1"},{"type":"function","title":"gl.normal3s/3","doc":"","ref":"gl.html#normal3s/3"},{"type":"function","title":"gl.normal3sv/1","doc":"The current normal is set to the given coordinates whenever\n[`gl:normal()`](`normal3b/3`) is issued. Byte, short, or integer arguments are\nconverted to floating-point format with a linear mapping that maps the most\npositive representable integer value to 1.0 and the most negative representable\ninteger value to -1.0.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNormal.xml)","ref":"gl.html#normal3sv/1"},{"type":"function","title":"gl.normalPointer/3","doc":"[`gl:normalPointer/3`](`normalPointer/3`) specifies the location and data format\nof an array of normals to use when rendering. `Type` specifies the data type of\neach normal coordinate, and `Stride` specifies the byte stride from one normal\nto the next, allowing vertices and attributes to be packed into a single array\nor stored in separate arrays. (Single-array storage may be more efficient on\nsome implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glNormalPointer.xml)","ref":"gl.html#normalPointer/3"},{"type":"function","title":"gl.objectPtrLabel/3","doc":"[`gl:objectPtrLabel/3`](`objectPtrLabel/3`) labels the sync object identified by\n`Ptr`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glObjectPtrLabel.xhtml)","ref":"gl.html#objectPtrLabel/3"},{"type":"function","title":"gl.ortho/6","doc":"[`gl:ortho/6`](`ortho/6`) describes a transformation that produces a parallel\nprojection. The current matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is\nmultiplied by this matrix and the result replaces the current matrix, as if\n[`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix as\nits argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml)","ref":"gl.html#ortho/6"},{"type":"function","title":"gl.passThrough/1","doc":"[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPassThrough.xml)","ref":"gl.html#passThrough/1"},{"type":"function","title":"gl.patchParameterfv/2","doc":"","ref":"gl.html#patchParameterfv/2"},{"type":"function","title":"gl.patchParameteri/2","doc":"[`gl:patchParameter()`](`patchParameteri/2`) specifies the parameters that will\nbe used for patch primitives. `Pname` specifies the parameter to modify and must\nbe either `?GL_PATCH_VERTICES`, `?GL_PATCH_DEFAULT_OUTER_LEVEL` or\n`?GL_PATCH_DEFAULT_INNER_LEVEL`. For\n[`gl:patchParameteri/2`](`patchParameteri/2`), `Value` specifies the new value\nfor the parameter specified by `Pname`. For\n[`gl:patchParameterfv/2`](`patchParameteri/2`), `Values` specifies the address\nof an array containing the new values for the parameter specified by `Pname`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPatchParameter.xhtml)","ref":"gl.html#patchParameteri/2"},{"type":"function","title":"gl.pauseTransformFeedback/0","doc":"[`gl:pauseTransformFeedback/0`](`pauseTransformFeedback/0`) pauses transform\nfeedback operations on the currently active transform feedback object. When\ntransform feedback operations are paused, transform feedback is still considered\nactive and changing most transform feedback state related to the object results\nin an error. However, a new transform feedback object may be bound while\ntransform feedback is paused.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPauseTransformFeedback.xhtml)","ref":"gl.html#pauseTransformFeedback/0"},{"type":"function","title":"gl.pixelMapfv/3","doc":"","ref":"gl.html#pixelMapfv/3"},{"type":"function","title":"gl.pixelMapuiv/3","doc":"","ref":"gl.html#pixelMapuiv/3"},{"type":"function","title":"gl.pixelMapusv/3","doc":"[`gl:pixelMap()`](`pixelMapfv/3`) sets up translation tables, or `maps`, used by\n[`gl:copyPixels/5`](`copyPixels/5`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`),\n[`gl:drawPixels/5`](`drawPixels/5`), [`gl:readPixels/7`](`readPixels/7`),\n[`gl:texImage1D/8`](`texImage1D/8`), [`gl:texImage2D/9`](`texImage2D/9`),\n[`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`). Additionally, if the ARB_imaging\nsubset is supported, the routines [`gl:colorTable/6`](`colorTable/6`),\n[`gl:colorSubTable/6`](`colorSubTable/6`),\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`),\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`),\n[`gl:histogram/4`](`histogram/4`), [`gl:minmax/3`](`minmax/3`), and\n[`gl:separableFilter2D/8`](`separableFilter2D/8`). Use of these maps is\ndescribed completely in the [`gl:pixelTransfer()`](`pixelTransferf/2`) reference\npage, and partly in the reference pages for the pixel and texture image\ncommands. Only the specification of the maps is described in this reference\npage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelMap.xml)","ref":"gl.html#pixelMapusv/3"},{"type":"function","title":"gl.pixelStoref/2","doc":"","ref":"gl.html#pixelStoref/2"},{"type":"function","title":"gl.pixelStorei/2","doc":"[`gl:pixelStore()`](`pixelStoref/2`) sets pixel storage modes that affect the\noperation of subsequent [`gl:readPixels/7`](`readPixels/7`) as well as the\nunpacking of texture patterns (see [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`),\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)),\n[`gl:compressedTexImage1D/7`](`compressedTexImage1D/7`),\n[`gl:compressedTexImage2D/8`](`compressedTexImage2D/8`),\n[`gl:compressedTexImage3D/9`](`compressedTexImage3D/9`),\n[`gl:compressedTexSubImage1D/7`](`compressedTexSubImage1D/7`),\n[`gl:compressedTexSubImage2D/9`](`compressedTexSubImage2D/9`) or\n[`gl:compressedTexSubImage1D/7`](`compressedTexSubImage1D/7`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPixelStore.xhtml)","ref":"gl.html#pixelStorei/2"},{"type":"function","title":"gl.pixelTransferf/2","doc":"","ref":"gl.html#pixelTransferf/2"},{"type":"function","title":"gl.pixelTransferi/2","doc":"[`gl:pixelTransfer()`](`pixelTransferf/2`) sets pixel transfer modes that affect\nthe operation of subsequent [`gl:copyPixels/5`](`copyPixels/5`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`),\n[`gl:drawPixels/5`](`drawPixels/5`), [`gl:readPixels/7`](`readPixels/7`),\n[`gl:texImage1D/8`](`texImage1D/8`), [`gl:texImage2D/9`](`texImage2D/9`),\n[`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`) commands. Additionally, if the\nARB_imaging subset is supported, the routines\n[`gl:colorTable/6`](`colorTable/6`), [`gl:colorSubTable/6`](`colorSubTable/6`),\n[`gl:convolutionFilter1D/6`](`convolutionFilter1D/6`),\n[`gl:convolutionFilter2D/7`](`convolutionFilter2D/7`),\n[`gl:histogram/4`](`histogram/4`), [`gl:minmax/3`](`minmax/3`), and\n[`gl:separableFilter2D/8`](`separableFilter2D/8`) are also affected. The\nalgorithms that are specified by pixel transfer modes operate on pixels after\nthey are read from the frame buffer\n([`gl:copyPixels/5`](`copyPixels/5`)[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`),\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`), and\n[`gl:readPixels/7`](`readPixels/7`)), or unpacked from client memory\n([`gl:drawPixels/5`](`drawPixels/5`), [`gl:texImage1D/8`](`texImage1D/8`),\n[`gl:texImage2D/9`](`texImage2D/9`), [`gl:texImage3D/10`](`texImage3D/10`),\n[`gl:texSubImage1D/7`](`texSubImage1D/7`),\n[`gl:texSubImage2D/9`](`texSubImage2D/9`), and\n[`gl:texSubImage3D/11`](`texSubImage3D/11`)). Pixel transfer operations happen\nin the same order, and in the same manner, regardless of the command that\nresulted in the pixel operation. Pixel storage modes (see\n[`gl:pixelStore()`](`pixelStoref/2`)) control the unpacking of pixels being read\nfrom client memory and the packing of pixels being written back into client\nmemory.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelTransfer.xml)","ref":"gl.html#pixelTransferi/2"},{"type":"function","title":"gl.pixelZoom/2","doc":"[`gl:pixelZoom/2`](`pixelZoom/2`) specifies values for the x and y zoom factors.\nDuring the execution of [`gl:drawPixels/5`](`drawPixels/5`) or\n[`gl:copyPixels/5`](`copyPixels/5`), if ( xr, yr) is the current raster\nposition, and a given element is in the mth row and nth column of the pixel\nrectangle, then pixels whose centers are in the rectangle with corners at\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPixelZoom.xml)","ref":"gl.html#pixelZoom/2"},{"type":"function","title":"gl.pointParameterf/2","doc":"","ref":"gl.html#pointParameterf/2"},{"type":"function","title":"gl.pointParameterfv/2","doc":"","ref":"gl.html#pointParameterfv/2"},{"type":"function","title":"gl.pointParameteri/2","doc":"","ref":"gl.html#pointParameteri/2"},{"type":"function","title":"gl.pointParameteriv/2","doc":"The following values are accepted for `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPointParameter.xhtml)","ref":"gl.html#pointParameteriv/2"},{"type":"function","title":"gl.pointSize/1","doc":"[`gl:pointSize/1`](`pointSize/1`) specifies the rasterized diameter of points.\nIf point size mode is disabled (see [`gl:enable/1`](`enable/1`) with parameter\n`?GL_PROGRAM_POINT_SIZE`), this value will be used to rasterize points.\nOtherwise, the value written to the shading language built-in variable\ngl_PointSize will be used.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPointSize.xhtml)","ref":"gl.html#pointSize/1"},{"type":"function","title":"gl.polygonMode/2","doc":"[`gl:polygonMode/2`](`polygonMode/2`) controls the interpretation of polygons\nfor rasterization. `Face` describes which polygons `Mode` applies to: both front\nand back-facing polygons (`?GL_FRONT_AND_BACK`). The polygon mode affects only\nthe final rasterization of polygons. In particular, a polygon's vertices are lit\nand the polygon is clipped and possibly culled before these modes are applied.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPolygonMode.xhtml)","ref":"gl.html#polygonMode/2"},{"type":"function","title":"gl.polygonOffset/2","doc":"When `?GL_POLYGON_OFFSET_FILL`, `?GL_POLYGON_OFFSET_LINE`, or\n`?GL_POLYGON_OFFSET_POINT` is enabled, each fragment's `depth` value will be\noffset after it is interpolated from the `depth` values of the appropriate\nvertices. The value of the offset is factor×DZ+r×units, where DZ is a\nmeasurement of the change in depth relative to the screen area of the polygon,\nand r is the smallest value that is guaranteed to produce a resolvable offset\nfor a given implementation. The offset is added before the depth test is\nperformed and before the value is written into the depth buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPolygonOffset.xhtml)","ref":"gl.html#polygonOffset/2"},{"type":"function","title":"gl.polygonOffsetClamp/3","doc":"No documentation available.","ref":"gl.html#polygonOffsetClamp/3"},{"type":"function","title":"gl.polygonStipple/1","doc":"Polygon stippling, like line stippling (see\n[`gl:lineStipple/2`](`lineStipple/2`)), masks out certain fragments produced by\nrasterization, creating a pattern. Stippling is independent of polygon\nantialiasing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPolygonStipple.xml)","ref":"gl.html#polygonStipple/1"},{"type":"function","title":"gl.popAttrib/0","doc":"","ref":"gl.html#popAttrib/0"},{"type":"function","title":"gl.popClientAttrib/0","doc":"","ref":"gl.html#popClientAttrib/0"},{"type":"function","title":"gl.popDebugGroup/0","doc":"","ref":"gl.html#popDebugGroup/0"},{"type":"function","title":"gl.popMatrix/0","doc":"","ref":"gl.html#popMatrix/0"},{"type":"function","title":"gl.popName/0","doc":"","ref":"gl.html#popName/0"},{"type":"function","title":"gl.primitiveRestartIndex/1","doc":"[`gl:primitiveRestartIndex/1`](`primitiveRestartIndex/1`) specifies a vertex\narray element that is treated specially when primitive restarting is enabled.\nThis is known as the primitive restart index.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPrimitiveRestartIndex.xhtml)","ref":"gl.html#primitiveRestartIndex/1"},{"type":"function","title":"gl.prioritizeTextures/2","doc":"[`gl:prioritizeTextures/2`](`prioritizeTextures/2`) assigns the `N` texture\npriorities given in `Priorities` to the `N` textures named in `Textures`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPrioritizeTextures.xml)","ref":"gl.html#prioritizeTextures/2"},{"type":"function","title":"gl.programBinary/3","doc":"[`gl:programBinary/3`](`programBinary/3`) loads a program object with a program\nbinary previously returned from [`gl:getProgramBinary/2`](`getProgramBinary/2`).\n`BinaryFormat` and `Binary` must be those returned by a previous call to\n[`gl:getProgramBinary/2`](`getProgramBinary/2`), and `Length` must be the length\nreturned by [`gl:getProgramBinary/2`](`getProgramBinary/2`), or by\n[`gl:getProgram()`](`getProgramiv/2`) when called with `Pname` set to\n`?GL_PROGRAM_BINARY_LENGTH`. If these conditions are not met, loading the\nprogram binary will fail and `Program`'s `?GL_LINK_STATUS` will be set to\n`?GL_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramBinary.xhtml)","ref":"gl.html#programBinary/3"},{"type":"function","title":"gl.programParameteri/3","doc":"[`gl:programParameter()`](`programParameteri/3`) specifies a new value for the\nparameter nameed by `Pname` for the program object `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramParameter.xhtml)","ref":"gl.html#programParameteri/3"},{"type":"function","title":"gl.programUniform1d/3","doc":"","ref":"gl.html#programUniform1d/3"},{"type":"function","title":"gl.programUniform1dv/3","doc":"","ref":"gl.html#programUniform1dv/3"},{"type":"function","title":"gl.programUniform1f/3","doc":"","ref":"gl.html#programUniform1f/3"},{"type":"function","title":"gl.programUniform1fv/3","doc":"","ref":"gl.html#programUniform1fv/3"},{"type":"function","title":"gl.programUniform1i/3","doc":"","ref":"gl.html#programUniform1i/3"},{"type":"function","title":"gl.programUniform1iv/3","doc":"","ref":"gl.html#programUniform1iv/3"},{"type":"function","title":"gl.programUniform1ui/3","doc":"","ref":"gl.html#programUniform1ui/3"},{"type":"function","title":"gl.programUniform1uiv/3","doc":"","ref":"gl.html#programUniform1uiv/3"},{"type":"function","title":"gl.programUniform2d/4","doc":"","ref":"gl.html#programUniform2d/4"},{"type":"function","title":"gl.programUniform2dv/3","doc":"","ref":"gl.html#programUniform2dv/3"},{"type":"function","title":"gl.programUniform2f/4","doc":"","ref":"gl.html#programUniform2f/4"},{"type":"function","title":"gl.programUniform2fv/3","doc":"","ref":"gl.html#programUniform2fv/3"},{"type":"function","title":"gl.programUniform2i/4","doc":"","ref":"gl.html#programUniform2i/4"},{"type":"function","title":"gl.programUniform2iv/3","doc":"","ref":"gl.html#programUniform2iv/3"},{"type":"function","title":"gl.programUniform2ui/4","doc":"","ref":"gl.html#programUniform2ui/4"},{"type":"function","title":"gl.programUniform2uiv/3","doc":"","ref":"gl.html#programUniform2uiv/3"},{"type":"function","title":"gl.programUniform3d/5","doc":"","ref":"gl.html#programUniform3d/5"},{"type":"function","title":"gl.programUniform3dv/3","doc":"","ref":"gl.html#programUniform3dv/3"},{"type":"function","title":"gl.programUniform3f/5","doc":"","ref":"gl.html#programUniform3f/5"},{"type":"function","title":"gl.programUniform3fv/3","doc":"","ref":"gl.html#programUniform3fv/3"},{"type":"function","title":"gl.programUniform3i/5","doc":"","ref":"gl.html#programUniform3i/5"},{"type":"function","title":"gl.programUniform3iv/3","doc":"","ref":"gl.html#programUniform3iv/3"},{"type":"function","title":"gl.programUniform3ui/5","doc":"","ref":"gl.html#programUniform3ui/5"},{"type":"function","title":"gl.programUniform3uiv/3","doc":"","ref":"gl.html#programUniform3uiv/3"},{"type":"function","title":"gl.programUniform4d/6","doc":"","ref":"gl.html#programUniform4d/6"},{"type":"function","title":"gl.programUniform4dv/3","doc":"","ref":"gl.html#programUniform4dv/3"},{"type":"function","title":"gl.programUniform4f/6","doc":"","ref":"gl.html#programUniform4f/6"},{"type":"function","title":"gl.programUniform4fv/3","doc":"","ref":"gl.html#programUniform4fv/3"},{"type":"function","title":"gl.programUniform4i/6","doc":"","ref":"gl.html#programUniform4i/6"},{"type":"function","title":"gl.programUniform4iv/3","doc":"","ref":"gl.html#programUniform4iv/3"},{"type":"function","title":"gl.programUniform4ui/6","doc":"","ref":"gl.html#programUniform4ui/6"},{"type":"function","title":"gl.programUniform4uiv/3","doc":"","ref":"gl.html#programUniform4uiv/3"},{"type":"function","title":"gl.programUniformMatrix2dv/4","doc":"","ref":"gl.html#programUniformMatrix2dv/4"},{"type":"function","title":"gl.programUniformMatrix2fv/4","doc":"","ref":"gl.html#programUniformMatrix2fv/4"},{"type":"function","title":"gl.programUniformMatrix2x3dv/4","doc":"","ref":"gl.html#programUniformMatrix2x3dv/4"},{"type":"function","title":"gl.programUniformMatrix2x3fv/4","doc":"","ref":"gl.html#programUniformMatrix2x3fv/4"},{"type":"function","title":"gl.programUniformMatrix2x4dv/4","doc":"","ref":"gl.html#programUniformMatrix2x4dv/4"},{"type":"function","title":"gl.programUniformMatrix2x4fv/4","doc":"","ref":"gl.html#programUniformMatrix2x4fv/4"},{"type":"function","title":"gl.programUniformMatrix3dv/4","doc":"","ref":"gl.html#programUniformMatrix3dv/4"},{"type":"function","title":"gl.programUniformMatrix3fv/4","doc":"","ref":"gl.html#programUniformMatrix3fv/4"},{"type":"function","title":"gl.programUniformMatrix3x2dv/4","doc":"","ref":"gl.html#programUniformMatrix3x2dv/4"},{"type":"function","title":"gl.programUniformMatrix3x2fv/4","doc":"","ref":"gl.html#programUniformMatrix3x2fv/4"},{"type":"function","title":"gl.programUniformMatrix3x4dv/4","doc":"","ref":"gl.html#programUniformMatrix3x4dv/4"},{"type":"function","title":"gl.programUniformMatrix3x4fv/4","doc":"","ref":"gl.html#programUniformMatrix3x4fv/4"},{"type":"function","title":"gl.programUniformMatrix4dv/4","doc":"","ref":"gl.html#programUniformMatrix4dv/4"},{"type":"function","title":"gl.programUniformMatrix4fv/4","doc":"","ref":"gl.html#programUniformMatrix4fv/4"},{"type":"function","title":"gl.programUniformMatrix4x2dv/4","doc":"","ref":"gl.html#programUniformMatrix4x2dv/4"},{"type":"function","title":"gl.programUniformMatrix4x2fv/4","doc":"","ref":"gl.html#programUniformMatrix4x2fv/4"},{"type":"function","title":"gl.programUniformMatrix4x3dv/4","doc":"","ref":"gl.html#programUniformMatrix4x3dv/4"},{"type":"function","title":"gl.programUniformMatrix4x3fv/4","doc":"[`gl:programUniform()`](`programUniform1i/3`) modifies the value of a uniform\nvariable or a uniform variable array. The location of the uniform variable to be\nmodified is specified by `Location`, which should be a value returned by\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n[`gl:programUniform()`](`programUniform1i/3`) operates on the program object\nspecified by `Program`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProgramUniform.xhtml)","ref":"gl.html#programUniformMatrix4x3fv/4"},{"type":"function","title":"gl.provokingVertex/1","doc":"`Flatshading` a vertex shader varying output means to assign all vetices of the\nprimitive the same value for that output. The vertex from which these values is\nderived is known as the `provoking vertex` and\n[`gl:provokingVertex/1`](`provokingVertex/1`) specifies which vertex is to be\nused as the source of data for flat shaded varyings.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glProvokingVertex.xhtml)","ref":"gl.html#provokingVertex/1"},{"type":"function","title":"gl.pushAttrib/1","doc":"[`gl:pushAttrib/1`](`pushAttrib/1`) takes one argument, a mask that indicates\nwhich groups of state variables to save on the attribute stack. Symbolic\nconstants are used to set bits in the mask. `Mask` is typically constructed by\nspecifying the bitwise-or of several of these constants together. The special\nmask `?GL_ALL_ATTRIB_BITS` can be used to save all stackable states.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushAttrib.xml)","ref":"gl.html#pushAttrib/1"},{"type":"function","title":"gl.pushClientAttrib/1","doc":"[`gl:pushClientAttrib/1`](`pushClientAttrib/1`) takes one argument, a mask that\nindicates which groups of client-state variables to save on the client attribute\nstack. Symbolic constants are used to set bits in the mask. `Mask` is typically\nconstructed by specifying the bitwise-or of several of these constants together.\nThe special mask `?GL_CLIENT_ALL_ATTRIB_BITS` can be used to save all stackable\nclient state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushClientAttrib.xml)","ref":"gl.html#pushClientAttrib/1"},{"type":"function","title":"gl.pushDebugGroup/4","doc":"[`gl:pushDebugGroup/4`](`pushDebugGroup/4`) pushes a debug group described by\nthe string `Message` into the command stream. The value of `Id` specifies the ID\nof messages generated. The parameter `Length` contains the number of characters\nin `Message`. If `Length` is negative, it is implied that `Message` contains a\nnull terminated string. The message has the specified `Source` and `Id`, the\n`Type``?GL_DEBUG_TYPE_PUSH_GROUP`, and\n`Severity``?GL_DEBUG_SEVERITY_NOTIFICATION`. The GL will put a new debug group\non top of the debug group stack which inherits the control of the volume of\ndebug output of the debug group previously residing on the top of the debug\ngroup stack. Because debug groups are strictly hierarchical, any additional\ncontrol of the debug output volume will only apply within the active debug group\nand the debug groups pushed on top of the active debug group.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPushDebugGroup.xhtml)","ref":"gl.html#pushDebugGroup/4"},{"type":"function","title":"gl.pushMatrix/0","doc":"There is a stack of matrices for each of the matrix modes. In `?GL_MODELVIEW`\nmode, the stack depth is at least 32. In the other modes, `?GL_COLOR`,\n`?GL_PROJECTION`, and `?GL_TEXTURE`, the depth is at least 2. The current matrix\nin any mode is the matrix on the top of the stack for that mode.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushMatrix.xml)","ref":"gl.html#pushMatrix/0"},{"type":"function","title":"gl.pushName/1","doc":"The name stack is used during selection mode to allow sets of rendering commands\nto be uniquely identified. It consists of an ordered set of unsigned integers\nand is initially empty.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushName.xml)","ref":"gl.html#pushName/1"},{"type":"function","title":"gl.queryCounter/2","doc":"[`gl:queryCounter/2`](`queryCounter/2`) causes the GL to record the current time\ninto the query object named `Id`. `Target` must be `?GL_TIMESTAMP`. The time is\nrecorded after all previous commands on the GL client and server state and the\nframebuffer have been fully realized. When the time is recorded, the query\nresult for that object is marked available.\n[`gl:queryCounter/2`](`queryCounter/2`) timer queries can be used within a\n[`gl:beginQuery/2`](`beginQuery/2`) / [`gl:endQuery/1`](`beginQuery/2`) block\nwhere the target is `?GL_TIME_ELAPSED` and it does not affect the result of that\nquery object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glQueryCounter.xhtml)","ref":"gl.html#queryCounter/2"},{"type":"function","title":"gl.rasterPos2d/2","doc":"","ref":"gl.html#rasterPos2d/2"},{"type":"function","title":"gl.rasterPos2dv/1","doc":"","ref":"gl.html#rasterPos2dv/1"},{"type":"function","title":"gl.rasterPos2f/2","doc":"","ref":"gl.html#rasterPos2f/2"},{"type":"function","title":"gl.rasterPos2fv/1","doc":"","ref":"gl.html#rasterPos2fv/1"},{"type":"function","title":"gl.rasterPos2i/2","doc":"","ref":"gl.html#rasterPos2i/2"},{"type":"function","title":"gl.rasterPos2iv/1","doc":"","ref":"gl.html#rasterPos2iv/1"},{"type":"function","title":"gl.rasterPos2s/2","doc":"","ref":"gl.html#rasterPos2s/2"},{"type":"function","title":"gl.rasterPos2sv/1","doc":"","ref":"gl.html#rasterPos2sv/1"},{"type":"function","title":"gl.rasterPos3d/3","doc":"","ref":"gl.html#rasterPos3d/3"},{"type":"function","title":"gl.rasterPos3dv/1","doc":"","ref":"gl.html#rasterPos3dv/1"},{"type":"function","title":"gl.rasterPos3f/3","doc":"","ref":"gl.html#rasterPos3f/3"},{"type":"function","title":"gl.rasterPos3fv/1","doc":"","ref":"gl.html#rasterPos3fv/1"},{"type":"function","title":"gl.rasterPos3i/3","doc":"","ref":"gl.html#rasterPos3i/3"},{"type":"function","title":"gl.rasterPos3iv/1","doc":"","ref":"gl.html#rasterPos3iv/1"},{"type":"function","title":"gl.rasterPos3s/3","doc":"","ref":"gl.html#rasterPos3s/3"},{"type":"function","title":"gl.rasterPos3sv/1","doc":"","ref":"gl.html#rasterPos3sv/1"},{"type":"function","title":"gl.rasterPos4d/4","doc":"","ref":"gl.html#rasterPos4d/4"},{"type":"function","title":"gl.rasterPos4dv/1","doc":"","ref":"gl.html#rasterPos4dv/1"},{"type":"function","title":"gl.rasterPos4f/4","doc":"","ref":"gl.html#rasterPos4f/4"},{"type":"function","title":"gl.rasterPos4fv/1","doc":"","ref":"gl.html#rasterPos4fv/1"},{"type":"function","title":"gl.rasterPos4i/4","doc":"","ref":"gl.html#rasterPos4i/4"},{"type":"function","title":"gl.rasterPos4iv/1","doc":"","ref":"gl.html#rasterPos4iv/1"},{"type":"function","title":"gl.rasterPos4s/4","doc":"","ref":"gl.html#rasterPos4s/4"},{"type":"function","title":"gl.rasterPos4sv/1","doc":"The GL maintains a 3D position in window coordinates. This position, called the\nraster position, is used to position pixel and bitmap write operations. It is\nmaintained with subpixel accuracy. See [`gl:bitmap/7`](`bitmap/7`),\n[`gl:drawPixels/5`](`drawPixels/5`), and [`gl:copyPixels/5`](`copyPixels/5`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRasterPos.xml)","ref":"gl.html#rasterPos4sv/1"},{"type":"function","title":"gl.readBuffer/1","doc":"[`gl:readBuffer/1`](`readBuffer/1`) specifies a color buffer as the source for\nsubsequent [`gl:readPixels/7`](`readPixels/7`),\n[`gl:copyTexImage1D/7`](`copyTexImage1D/7`),\n[`gl:copyTexImage2D/8`](`copyTexImage2D/8`),\n[`gl:copyTexSubImage1D/6`](`copyTexSubImage1D/6`),\n[`gl:copyTexSubImage2D/8`](`copyTexSubImage2D/8`), and\n[`gl:copyTexSubImage3D/9`](`copyTexSubImage3D/9`) commands. `Mode` accepts one\nof twelve or more predefined values. In a fully configured system, `?GL_FRONT`,\n`?GL_LEFT`, and `?GL_FRONT_LEFT` all name the front left buffer,\n`?GL_FRONT_RIGHT` and `?GL_RIGHT` name the front right buffer, and\n`?GL_BACK_LEFT` and `?GL_BACK` name the back left buffer. Further more, the\nconstants `?GL_COLOR_ATTACHMENT``i` may be used to indicate the `i`th color\nattachment where `i` ranges from zero to the value of\n`?GL_MAX_COLOR_ATTACHMENTS` minus one.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReadBuffer.xhtml)","ref":"gl.html#readBuffer/1"},{"type":"function","title":"gl.readPixels/7","doc":"[`gl:readPixels/7`](`readPixels/7`) and `glReadnPixels` return pixel data from\nthe frame buffer, starting with the pixel whose lower left corner is at location\n(`X`, `Y`), into client memory starting at location `Data`. Several parameters\ncontrol the processing of the pixel data before it is placed into client memory.\nThese parameters are set with [`gl:pixelStore()`](`pixelStoref/2`). This\nreference page describes the effects on [`gl:readPixels/7`](`readPixels/7`) and\n`glReadnPixels` of most, but not all of the parameters specified by these three\ncommands.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReadPixels.xhtml)","ref":"gl.html#readPixels/7"},{"type":"function","title":"gl.rectd/4","doc":"","ref":"gl.html#rectd/4"},{"type":"function","title":"gl.rectdv/2","doc":"","ref":"gl.html#rectdv/2"},{"type":"function","title":"gl.rectf/4","doc":"","ref":"gl.html#rectf/4"},{"type":"function","title":"gl.rectfv/2","doc":"","ref":"gl.html#rectfv/2"},{"type":"function","title":"gl.recti/4","doc":"","ref":"gl.html#recti/4"},{"type":"function","title":"gl.rectiv/2","doc":"","ref":"gl.html#rectiv/2"},{"type":"function","title":"gl.rects/4","doc":"","ref":"gl.html#rects/4"},{"type":"function","title":"gl.rectsv/2","doc":"[`gl:rect()`](`rectd/4`) supports efficient specification of rectangles as two\ncorner points. Each rectangle command takes four arguments, organized either as\ntwo consecutive pairs of (x y) coordinates or as two pointers to arrays, each\ncontaining an (x y) pair. The resulting rectangle is defined in the z=0 plane.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRect.xml)","ref":"gl.html#rectsv/2"},{"type":"function","title":"gl.releaseShaderCompiler/0","doc":"[`gl:releaseShaderCompiler/0`](`releaseShaderCompiler/0`) provides a hint to the\nimplementation that it may free internal resources associated with its shader\ncompiler. [`gl:compileShader/1`](`compileShader/1`) may subsequently be called\nand the implementation may at that time reallocate resources previously freed by\nthe call to [`gl:releaseShaderCompiler/0`](`releaseShaderCompiler/0`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReleaseShaderCompiler.xhtml)","ref":"gl.html#releaseShaderCompiler/0"},{"type":"function","title":"gl.renderbufferStorage/4","doc":"[`gl:renderbufferStorage/4`](`renderbufferStorage/4`) is equivalent to calling\n[`gl:renderbufferStorageMultisample/5`](`renderbufferStorageMultisample/5`) with\nthe `Samples` set to zero, and `glNamedRenderbufferStorage` is equivalent to\ncalling `glNamedRenderbufferStorageMultisample` with the samples set to zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glRenderbufferStorage.xhtml)","ref":"gl.html#renderbufferStorage/4"},{"type":"function","title":"gl.renderbufferStorageMultisample/5","doc":"[`gl:renderbufferStorageMultisample/5`](`renderbufferStorageMultisample/5`) and\n`glNamedRenderbufferStorageMultisample` establish the data storage, format,\ndimensions and number of samples of a renderbuffer object's image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glRenderbufferStorageMultisample.xhtml)","ref":"gl.html#renderbufferStorageMultisample/5"},{"type":"function","title":"gl.renderMode/1","doc":"[`gl:renderMode/1`](`renderMode/1`) sets the rasterization mode. It takes one\nargument, `Mode`, which can assume one of three predefined values:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRenderMode.xml)","ref":"gl.html#renderMode/1"},{"type":"function","title":"gl.resetHistogram/1","doc":"[`gl:resetHistogram/1`](`resetHistogram/1`) resets all the elements of the\ncurrent histogram table to zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glResetHistogram.xml)","ref":"gl.html#resetHistogram/1"},{"type":"function","title":"gl.resetMinmax/1","doc":"[`gl:resetMinmax/1`](`resetMinmax/1`) resets the elements of the current minmax\ntable to their initial values: the \\`\\`maximum'' element receives the minimum\npossible component values, and the \\`\\`minimum'' element receives the maximum\npossible component values.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glResetMinmax.xml)","ref":"gl.html#resetMinmax/1"},{"type":"function","title":"gl.resumeTransformFeedback/0","doc":"[`gl:resumeTransformFeedback/0`](`resumeTransformFeedback/0`) resumes transform\nfeedback operations on the currently active transform feedback object. When\ntransform feedback operations are paused, transform feedback is still considered\nactive and changing most transform feedback state related to the object results\nin an error. However, a new transform feedback object may be bound while\ntransform feedback is paused.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glResumeTransformFeedback.xhtml)","ref":"gl.html#resumeTransformFeedback/0"},{"type":"function","title":"gl.rotated/4","doc":"","ref":"gl.html#rotated/4"},{"type":"function","title":"gl.rotatef/4","doc":"[`gl:rotate()`](`rotated/4`) produces a rotation of `Angle` degrees around the\nvector (x y z). The current matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is\nmultiplied by a rotation matrix with the product replacing the current matrix,\nas if [`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix\nas its argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml)","ref":"gl.html#rotatef/4"},{"type":"function","title":"gl.sampleCoverage/2","doc":"Multisampling samples a pixel multiple times at various implementation-dependent\nsubpixel locations to generate antialiasing effects. Multisampling transparently\nantialiases points, lines, polygons, and images if it is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSampleCoverage.xhtml)","ref":"gl.html#sampleCoverage/2"},{"type":"function","title":"gl.sampleMaski/2","doc":"[`gl:sampleMaski/2`](`sampleMaski/2`) sets one 32-bit sub-word of the multi-word\nsample mask, `?GL_SAMPLE_MASK_VALUE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSampleMaski.xhtml)","ref":"gl.html#sampleMaski/2"},{"type":"function","title":"gl.samplerParameterf/3","doc":"","ref":"gl.html#samplerParameterf/3"},{"type":"function","title":"gl.samplerParameterfv/3","doc":"","ref":"gl.html#samplerParameterfv/3"},{"type":"function","title":"gl.samplerParameterIiv/3","doc":"","ref":"gl.html#samplerParameterIiv/3"},{"type":"function","title":"gl.samplerParameterIuiv/3","doc":"","ref":"gl.html#samplerParameterIuiv/3"},{"type":"function","title":"gl.samplerParameteri/3","doc":"","ref":"gl.html#samplerParameteri/3"},{"type":"function","title":"gl.samplerParameteriv/3","doc":"[`gl:samplerParameter()`](`samplerParameteri/3`) assigns the value or values in\n`Params` to the sampler parameter specified as `Pname`. `Sampler` specifies the\nsampler object to be modified, and must be the name of a sampler object\npreviously returned from a call to [`gl:genSamplers/1`](`genSamplers/1`). The\nfollowing symbols are accepted in `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glSamplerParameter.xhtml)","ref":"gl.html#samplerParameteriv/3"},{"type":"function","title":"gl.scaled/3","doc":"","ref":"gl.html#scaled/3"},{"type":"function","title":"gl.scalef/3","doc":"[`gl:scale()`](`scaled/3`) produces a nonuniform scaling along the `x`, `y`, and\n`z` axes. The three parameters indicate the desired scale factor along each of\nthe three axes.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glScale.xml)","ref":"gl.html#scalef/3"},{"type":"function","title":"gl.scissor/4","doc":"[`gl:scissor/4`](`scissor/4`) defines a rectangle, called the scissor box, in\nwindow coordinates. The first two arguments, `X` and `Y`, specify the lower left\ncorner of the box. `Width` and `Height` specify the width and height of the box.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissor.xhtml)","ref":"gl.html#scissor/4"},{"type":"function","title":"gl.scissorArrayv/2","doc":"[`gl:scissorArrayv/2`](`scissorArrayv/2`) defines rectangles, called scissor\nboxes, in window coordinates for each viewport. `First` specifies the index of\nthe first scissor box to modify and `Count` specifies the number of scissor\nboxes to modify. `First` must be less than the value of `?GL_MAX_VIEWPORTS`, and\n`First` \\+ `Count` must be less than or equal to the value of\n`?GL_MAX_VIEWPORTS`. `V` specifies the address of an array containing integers\nspecifying the lower left corner of the scissor boxes, and the width and height\nof the scissor boxes, in that order.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissorArray.xhtml)","ref":"gl.html#scissorArrayv/2"},{"type":"function","title":"gl.scissorIndexed/5","doc":"","ref":"gl.html#scissorIndexed/5"},{"type":"function","title":"gl.scissorIndexedv/2","doc":"[`gl:scissorIndexed/5`](`scissorIndexed/5`) defines the scissor box for a\nspecified viewport. `Index` specifies the index of scissor box to modify.\n`Index` must be less than the value of `?GL_MAX_VIEWPORTS`. For\n[`gl:scissorIndexed/5`](`scissorIndexed/5`), `Left`, `Bottom`, `Width` and\n`Height` specify the left, bottom, width and height of the scissor box, in\npixels, respectively. For [`gl:scissorIndexedv/2`](`scissorIndexed/5`), `V`\nspecifies the address of an array containing integers specifying the lower left\ncorner of the scissor box, and the width and height of the scissor box, in that\norder.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glScissorIndexed.xhtml)","ref":"gl.html#scissorIndexedv/2"},{"type":"function","title":"gl.secondaryColor3b/3","doc":"","ref":"gl.html#secondaryColor3b/3"},{"type":"function","title":"gl.secondaryColor3bv/1","doc":"","ref":"gl.html#secondaryColor3bv/1"},{"type":"function","title":"gl.secondaryColor3d/3","doc":"","ref":"gl.html#secondaryColor3d/3"},{"type":"function","title":"gl.secondaryColor3dv/1","doc":"","ref":"gl.html#secondaryColor3dv/1"},{"type":"function","title":"gl.secondaryColor3f/3","doc":"","ref":"gl.html#secondaryColor3f/3"},{"type":"function","title":"gl.secondaryColor3fv/1","doc":"","ref":"gl.html#secondaryColor3fv/1"},{"type":"function","title":"gl.secondaryColor3i/3","doc":"","ref":"gl.html#secondaryColor3i/3"},{"type":"function","title":"gl.secondaryColor3iv/1","doc":"","ref":"gl.html#secondaryColor3iv/1"},{"type":"function","title":"gl.secondaryColor3s/3","doc":"","ref":"gl.html#secondaryColor3s/3"},{"type":"function","title":"gl.secondaryColor3sv/1","doc":"","ref":"gl.html#secondaryColor3sv/1"},{"type":"function","title":"gl.secondaryColor3ub/3","doc":"","ref":"gl.html#secondaryColor3ub/3"},{"type":"function","title":"gl.secondaryColor3ubv/1","doc":"","ref":"gl.html#secondaryColor3ubv/1"},{"type":"function","title":"gl.secondaryColor3ui/3","doc":"","ref":"gl.html#secondaryColor3ui/3"},{"type":"function","title":"gl.secondaryColor3uiv/1","doc":"","ref":"gl.html#secondaryColor3uiv/1"},{"type":"function","title":"gl.secondaryColor3us/3","doc":"","ref":"gl.html#secondaryColor3us/3"},{"type":"function","title":"gl.secondaryColor3usv/1","doc":"The GL stores both a primary four-valued RGBA color and a secondary four-valued\nRGBA color (where alpha is always set to 0.0) that is associated with every\nvertex.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSecondaryColor.xml)","ref":"gl.html#secondaryColor3usv/1"},{"type":"function","title":"gl.secondaryColorPointer/4","doc":"[`gl:secondaryColorPointer/4`](`secondaryColorPointer/4`) specifies the location\nand data format of an array of color components to use when rendering. `Size`\nspecifies the number of components per color, and must be 3. `Type` specifies\nthe data type of each color component, and `Stride` specifies the byte stride\nfrom one color to the next, allowing vertices and attributes to be packed into a\nsingle array or stored in separate arrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSecondaryColorPointer.xml)","ref":"gl.html#secondaryColorPointer/4"},{"type":"function","title":"gl.selectBuffer/2","doc":"[`gl:selectBuffer/2`](`selectBuffer/2`) has two arguments: `Buffer` is a pointer\nto an array of unsigned integers, and `Size` indicates the size of the array.\n`Buffer` returns values from the name stack (see\n[`gl:initNames/0`](`initNames/0`), [`gl:loadName/1`](`loadName/1`),\n[`gl:pushName/1`](`pushName/1`)) when the rendering mode is `?GL_SELECT` (see\n[`gl:renderMode/1`](`renderMode/1`)). [`gl:selectBuffer/2`](`selectBuffer/2`)\nmust be issued before selection mode is enabled, and it must not be issued while\nthe rendering mode is `?GL_SELECT`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSelectBuffer.xml)","ref":"gl.html#selectBuffer/2"},{"type":"function","title":"gl.separableFilter2D/8","doc":"[`gl:separableFilter2D/8`](`separableFilter2D/8`) builds a two-dimensional\nseparable convolution filter kernel from two arrays of pixels.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glSeparableFilter2D.xml)","ref":"gl.html#separableFilter2D/8"},{"type":"function","title":"gl.shadeModel/1","doc":"GL primitives can have either flat or smooth shading. Smooth shading, the\ndefault, causes the computed colors of vertices to be interpolated as the\nprimitive is rasterized, typically assigning different colors to each resulting\npixel fragment. Flat shading selects the computed color of just one vertex and\nassigns it to all the pixel fragments generated by rasterizing a single\nprimitive. In either case, the computed color of a vertex is the result of\nlighting if lighting is enabled, or it is the current color at the time the\nvertex was specified if lighting is disabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glShadeModel.xml)","ref":"gl.html#shadeModel/1"},{"type":"function","title":"gl.shaderBinary/3","doc":"[`gl:shaderBinary/3`](`shaderBinary/3`) loads pre-compiled shader binary code\ninto the `Count` shader objects whose handles are given in `Shaders`. `Binary`\npoints to `Length` bytes of binary shader code stored in client memory.\n`BinaryFormat` specifies the format of the pre-compiled code.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderBinary.xhtml)","ref":"gl.html#shaderBinary/3"},{"type":"function","title":"gl.shaderSource/2","doc":"[`gl:shaderSource/2`](`shaderSource/2`) sets the source code in `Shader` to the\nsource code in the array of strings specified by `String`. Any source code\npreviously stored in the shader object is completely replaced. The number of\nstrings in the array is specified by `Count`. If `Length` is `?NULL`, each\nstring is assumed to be null terminated. If `Length` is a value other than\n`?NULL`, it points to an array containing a string length for each of the\ncorresponding elements of `String`. Each element in the `Length` array may\ncontain the length of the corresponding string (the null character is not\ncounted as part of the string length) or a value less than 0 to indicate that\nthe string is null terminated. The source code strings are not scanned or parsed\nat this time; they are simply copied into the specified shader object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderSource.xhtml)","ref":"gl.html#shaderSource/2"},{"type":"function","title":"gl.shaderStorageBlockBinding/3","doc":"[`gl:shaderStorageBlockBinding/3`](`shaderStorageBlockBinding/3`), changes the\nactive shader storage block with an assigned index of `StorageBlockIndex` in\nprogram object `Program`. `StorageBlockIndex` must be an active shader storage\nblock index in `Program`. `StorageBlockBinding` must be less than the value of\n`?GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS`. If successful,\n[`gl:shaderStorageBlockBinding/3`](`shaderStorageBlockBinding/3`) specifies that\n`Program` will use the data store of the buffer object bound to the binding\npoint `StorageBlockBinding` to read and write the values of the buffer variables\nin the shader storage block identified by `StorageBlockIndex`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderStorageBlockBinding.xhtml)","ref":"gl.html#shaderStorageBlockBinding/3"},{"type":"function","title":"gl.stencilFunc/3","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. Stencil planes are first drawn into using GL drawing primitives, then\ngeometry and images are rendered using the stencil planes to mask out portions\nof the screen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilFunc.xhtml)","ref":"gl.html#stencilFunc/3"},{"type":"function","title":"gl.stencilFuncSeparate/4","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilFuncSeparate.xhtml)","ref":"gl.html#stencilFuncSeparate/4"},{"type":"function","title":"gl.stencilMask/1","doc":"[`gl:stencilMask/1`](`stencilMask/1`) controls the writing of individual bits in\nthe stencil planes. The least significant n bits of `Mask`, where n is the\nnumber of bits in the stencil buffer, specify a mask. Where a 1 appears in the\nmask, it's possible to write to the corresponding bit in the stencil buffer.\nWhere a 0 appears, the corresponding bit is write-protected. Initially, all bits\nare enabled for writing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilMask.xhtml)","ref":"gl.html#stencilMask/1"},{"type":"function","title":"gl.stencilMaskSeparate/2","doc":"[`gl:stencilMaskSeparate/2`](`stencilMaskSeparate/2`) controls the writing of\nindividual bits in the stencil planes. The least significant n bits of `Mask`,\nwhere n is the number of bits in the stencil buffer, specify a mask. Where a 1\nappears in the mask, it's possible to write to the corresponding bit in the\nstencil buffer. Where a 0 appears, the corresponding bit is write-protected.\nInitially, all bits are enabled for writing.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilMaskSeparate.xhtml)","ref":"gl.html#stencilMaskSeparate/2"},{"type":"function","title":"gl.stencilOp/3","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilOp.xhtml)","ref":"gl.html#stencilOp/3"},{"type":"function","title":"gl.stencilOpSeparate/4","doc":"Stenciling, like depth-buffering, enables and disables drawing on a per-pixel\nbasis. You draw into the stencil planes using GL drawing primitives, then render\ngeometry and images, using the stencil planes to mask out portions of the\nscreen. Stenciling is typically used in multipass rendering algorithms to\nachieve special effects, such as decals, outlining, and constructive solid\ngeometry rendering.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilOpSeparate.xhtml)","ref":"gl.html#stencilOpSeparate/4"},{"type":"function","title":"gl.texBuffer/3","doc":"","ref":"gl.html#texBuffer/3"},{"type":"function","title":"gl.texBufferRange/5","doc":"","ref":"gl.html#texBufferRange/5"},{"type":"function","title":"gl.texCoord1d/1","doc":"","ref":"gl.html#texCoord1d/1"},{"type":"function","title":"gl.texCoord1dv/1","doc":"","ref":"gl.html#texCoord1dv/1"},{"type":"function","title":"gl.texCoord1f/1","doc":"","ref":"gl.html#texCoord1f/1"},{"type":"function","title":"gl.texCoord1fv/1","doc":"","ref":"gl.html#texCoord1fv/1"},{"type":"function","title":"gl.texCoord1i/1","doc":"","ref":"gl.html#texCoord1i/1"},{"type":"function","title":"gl.texCoord1iv/1","doc":"","ref":"gl.html#texCoord1iv/1"},{"type":"function","title":"gl.texCoord1s/1","doc":"","ref":"gl.html#texCoord1s/1"},{"type":"function","title":"gl.texCoord1sv/1","doc":"","ref":"gl.html#texCoord1sv/1"},{"type":"function","title":"gl.texCoord2d/2","doc":"","ref":"gl.html#texCoord2d/2"},{"type":"function","title":"gl.texCoord2dv/1","doc":"","ref":"gl.html#texCoord2dv/1"},{"type":"function","title":"gl.texCoord2f/2","doc":"","ref":"gl.html#texCoord2f/2"},{"type":"function","title":"gl.texCoord2fv/1","doc":"","ref":"gl.html#texCoord2fv/1"},{"type":"function","title":"gl.texCoord2i/2","doc":"","ref":"gl.html#texCoord2i/2"},{"type":"function","title":"gl.texCoord2iv/1","doc":"","ref":"gl.html#texCoord2iv/1"},{"type":"function","title":"gl.texCoord2s/2","doc":"","ref":"gl.html#texCoord2s/2"},{"type":"function","title":"gl.texCoord2sv/1","doc":"","ref":"gl.html#texCoord2sv/1"},{"type":"function","title":"gl.texCoord3d/3","doc":"","ref":"gl.html#texCoord3d/3"},{"type":"function","title":"gl.texCoord3dv/1","doc":"","ref":"gl.html#texCoord3dv/1"},{"type":"function","title":"gl.texCoord3f/3","doc":"","ref":"gl.html#texCoord3f/3"},{"type":"function","title":"gl.texCoord3fv/1","doc":"","ref":"gl.html#texCoord3fv/1"},{"type":"function","title":"gl.texCoord3i/3","doc":"","ref":"gl.html#texCoord3i/3"},{"type":"function","title":"gl.texCoord3iv/1","doc":"","ref":"gl.html#texCoord3iv/1"},{"type":"function","title":"gl.texCoord3s/3","doc":"","ref":"gl.html#texCoord3s/3"},{"type":"function","title":"gl.texCoord3sv/1","doc":"","ref":"gl.html#texCoord3sv/1"},{"type":"function","title":"gl.texCoord4d/4","doc":"","ref":"gl.html#texCoord4d/4"},{"type":"function","title":"gl.texCoord4dv/1","doc":"","ref":"gl.html#texCoord4dv/1"},{"type":"function","title":"gl.texCoord4f/4","doc":"","ref":"gl.html#texCoord4f/4"},{"type":"function","title":"gl.texCoord4fv/1","doc":"","ref":"gl.html#texCoord4fv/1"},{"type":"function","title":"gl.texCoord4i/4","doc":"","ref":"gl.html#texCoord4i/4"},{"type":"function","title":"gl.texCoord4iv/1","doc":"","ref":"gl.html#texCoord4iv/1"},{"type":"function","title":"gl.texCoord4s/4","doc":"","ref":"gl.html#texCoord4s/4"},{"type":"function","title":"gl.texCoord4sv/1","doc":"[`gl:texCoord()`](`texCoord1d/1`) specifies texture coordinates in one, two,\nthree, or four dimensions. [`gl:texCoord1()`](`texCoord1d/1`) sets the current\ntexture coordinates to (s 0 0 1); a call to [`gl:texCoord2()`](`texCoord1d/1`)\nsets them to (s t 0 1). Similarly, [`gl:texCoord3()`](`texCoord1d/1`) specifies\nthe texture coordinates as (s t r 1), and [`gl:texCoord4()`](`texCoord1d/1`)\ndefines all four components explicitly as (s t r q).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexCoord.xml)","ref":"gl.html#texCoord4sv/1"},{"type":"function","title":"gl.texCoordPointer/4","doc":"[`gl:texCoordPointer/4`](`texCoordPointer/4`) specifies the location and data\nformat of an array of texture coordinates to use when rendering. `Size`\nspecifies the number of coordinates per texture coordinate set, and must be 1,\n2, 3, or 4. `Type` specifies the data type of each texture coordinate, and\n`Stride` specifies the byte stride from one texture coordinate set to the next,\nallowing vertices and attributes to be packed into a single array or stored in\nseparate arrays. (Single-array storage may be more efficient on some\nimplementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexCoordPointer.xml)","ref":"gl.html#texCoordPointer/4"},{"type":"function","title":"gl.texEnvf/3","doc":"","ref":"gl.html#texEnvf/3"},{"type":"function","title":"gl.texEnvfv/3","doc":"","ref":"gl.html#texEnvfv/3"},{"type":"function","title":"gl.texEnvi/3","doc":"","ref":"gl.html#texEnvi/3"},{"type":"function","title":"gl.texEnviv/3","doc":"A texture environment specifies how texture values are interpreted when a\nfragment is textured. When `Target` is `?GL_TEXTURE_FILTER_CONTROL`, `Pname`\nmust be `?GL_TEXTURE_LOD_BIAS`. When `Target` is `?GL_TEXTURE_ENV`, `Pname` can\nbe `?GL_TEXTURE_ENV_MODE`, `?GL_TEXTURE_ENV_COLOR`, `?GL_COMBINE_RGB`,\n`?GL_COMBINE_ALPHA`, `?GL_RGB_SCALE`, `?GL_ALPHA_SCALE`, `?GL_SRC0_RGB`,\n`?GL_SRC1_RGB`, `?GL_SRC2_RGB`, `?GL_SRC0_ALPHA`, `?GL_SRC1_ALPHA`, or\n`?GL_SRC2_ALPHA`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml)","ref":"gl.html#texEnviv/3"},{"type":"function","title":"gl.texGend/3","doc":"","ref":"gl.html#texGend/3"},{"type":"function","title":"gl.texGendv/3","doc":"","ref":"gl.html#texGendv/3"},{"type":"function","title":"gl.texGenf/3","doc":"","ref":"gl.html#texGenf/3"},{"type":"function","title":"gl.texGenfv/3","doc":"","ref":"gl.html#texGenfv/3"},{"type":"function","title":"gl.texGeni/3","doc":"","ref":"gl.html#texGeni/3"},{"type":"function","title":"gl.texGeniv/3","doc":"[`gl:texGen()`](`texGend/3`) selects a texture-coordinate generation function or\nsupplies coefficients for one of the functions. `Coord` names one of the (`s`,\n`t`, `r`, `q`) texture coordinates; it must be one of the symbols `?GL_S`,\n`?GL_T`, `?GL_R`, or `?GL_Q`. `Pname` must be one of three symbolic constants:\n`?GL_TEXTURE_GEN_MODE`, `?GL_OBJECT_PLANE`, or `?GL_EYE_PLANE`. If `Pname` is\n`?GL_TEXTURE_GEN_MODE`, then `Params` chooses a mode, one of\n`?GL_OBJECT_LINEAR`, `?GL_EYE_LINEAR`, `?GL_SPHERE_MAP`, `?GL_NORMAL_MAP`, or\n`?GL_REFLECTION_MAP`. If `Pname` is either `?GL_OBJECT_PLANE` or\n`?GL_EYE_PLANE`, `Params` contains coefficients for the corresponding texture\ngeneration function.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexGen.xml)","ref":"gl.html#texGeniv/3"},{"type":"function","title":"gl.texImage1D/8","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable and disable one-dimensional\ntexturing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_TEXTURE_1D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage1D.xhtml)","ref":"gl.html#texImage1D/8"},{"type":"function","title":"gl.texImage2D/9","doc":"Texturing allows elements of an image array to be read by shaders.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml)","ref":"gl.html#texImage2D/9"},{"type":"function","title":"gl.texImage2DMultisample/6","doc":"[`gl:texImage2DMultisample/6`](`texImage2DMultisample/6`) establishes the data\nstorage, format, dimensions and number of samples of a multisample texture's\nimage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2DMultisample.xhtml)","ref":"gl.html#texImage2DMultisample/6"},{"type":"function","title":"gl.texImage3D/10","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable and disable\nthree-dimensional texturing, call [`gl:enable/1`](`enable/1`) and\n[`gl:disable/1`](`enable/1`) with argument `?GL_TEXTURE_3D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage3D.xhtml)","ref":"gl.html#texImage3D/10"},{"type":"function","title":"gl.texImage3DMultisample/7","doc":"[`gl:texImage3DMultisample/7`](`texImage3DMultisample/7`) establishes the data\nstorage, format, dimensions and number of samples of a multisample texture's\nimage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage3DMultisample.xhtml)","ref":"gl.html#texImage3DMultisample/7"},{"type":"function","title":"gl.texParameterf/3","doc":"","ref":"gl.html#texParameterf/3"},{"type":"function","title":"gl.texParameterfv/3","doc":"","ref":"gl.html#texParameterfv/3"},{"type":"function","title":"gl.texParameterIiv/3","doc":"","ref":"gl.html#texParameterIiv/3"},{"type":"function","title":"gl.texParameterIuiv/3","doc":"","ref":"gl.html#texParameterIuiv/3"},{"type":"function","title":"gl.texParameteri/3","doc":"","ref":"gl.html#texParameteri/3"},{"type":"function","title":"gl.texParameteriv/3","doc":"[`gl:texParameter()`](`texParameterf/3`) and\n[`gl:textureParameter()`](`texParameterf/3`) assign the value or values in\n`Params` to the texture parameter specified as `Pname`. For\n[`gl:texParameter()`](`texParameterf/3`), `Target` defines the target texture,\neither `?GL_TEXTURE_1D`, `?GL_TEXTURE_1D_ARRAY`, `?GL_TEXTURE_2D`,\n`?GL_TEXTURE_2D_ARRAY`, `?GL_TEXTURE_2D_MULTISAMPLE`,\n`?GL_TEXTURE_2D_MULTISAMPLE_ARRAY`, `?GL_TEXTURE_3D`, `?GL_TEXTURE_CUBE_MAP`,\n`?GL_TEXTURE_CUBE_MAP_ARRAY`, or `?GL_TEXTURE_RECTANGLE`. The following symbols\nare accepted in `Pname`:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexParameter.xhtml)","ref":"gl.html#texParameteriv/3"},{"type":"function","title":"gl.texStorage1D/4","doc":"[`gl:texStorage1D/4`](`texStorage1D/4`) and\n[`gl:textureStorage1D()`](`texStorage1D/4`) specify the storage requirements for\nall levels of a one-dimensional texture simultaneously. Once a texture is\nspecified with this command, the format and dimensions of all levels become\nimmutable unless it is a proxy texture. The contents of the image may still be\nmodified, however, its storage requirements may not change. Such a texture is\nreferred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage1D.xhtml)","ref":"gl.html#texStorage1D/4"},{"type":"function","title":"gl.texStorage2D/5","doc":"[`gl:texStorage2D/5`](`texStorage2D/5`) and\n[`gl:textureStorage2D()`](`texStorage2D/5`) specify the storage requirements for\nall levels of a two-dimensional texture or one-dimensional texture array\nsimultaneously. Once a texture is specified with this command, the format and\ndimensions of all levels become immutable unless it is a proxy texture. The\ncontents of the image may still be modified, however, its storage requirements\nmay not change. Such a texture is referred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage2D.xhtml)","ref":"gl.html#texStorage2D/5"},{"type":"function","title":"gl.texStorage2DMultisample/6","doc":"[`gl:texStorage2DMultisample/6`](`texStorage2DMultisample/6`) and\n[`gl:textureStorage2DMultisample()`](`texStorage2DMultisample/6`) specify the\nstorage requirements for a two-dimensional multisample texture. Once a texture\nis specified with this command, its format and dimensions become immutable\nunless it is a proxy texture. The contents of the image may still be modified,\nhowever, its storage requirements may not change. Such a texture is referred to\nas an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage2DMultisample.xhtml)","ref":"gl.html#texStorage2DMultisample/6"},{"type":"function","title":"gl.texStorage3D/6","doc":"[`gl:texStorage3D/6`](`texStorage3D/6`) and\n[`gl:textureStorage3D()`](`texStorage3D/6`) specify the storage requirements for\nall levels of a three-dimensional, two-dimensional array or cube-map array\ntexture simultaneously. Once a texture is specified with this command, the\nformat and dimensions of all levels become immutable unless it is a proxy\ntexture. The contents of the image may still be modified, however, its storage\nrequirements may not change. Such a texture is referred to as an\n`immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage3D.xhtml)","ref":"gl.html#texStorage3D/6"},{"type":"function","title":"gl.texStorage3DMultisample/7","doc":"[`gl:texStorage3DMultisample/7`](`texStorage3DMultisample/7`) and\n[`gl:textureStorage3DMultisample()`](`texStorage3DMultisample/7`) specify the\nstorage requirements for a two-dimensional multisample array texture. Once a\ntexture is specified with this command, its format and dimensions become\nimmutable unless it is a proxy texture. The contents of the image may still be\nmodified, however, its storage requirements may not change. Such a texture is\nreferred to as an `immutable-format` texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexStorage3DMultisample.xhtml)","ref":"gl.html#texStorage3DMultisample/7"},{"type":"function","title":"gl.texSubImage1D/7","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled. To enable or disable one-dimensional\ntexturing, call [`gl:enable/1`](`enable/1`) and [`gl:disable/1`](`enable/1`)\nwith argument `?GL_TEXTURE_1D`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage1D.xhtml)","ref":"gl.html#texSubImage1D/7"},{"type":"function","title":"gl.texSubImage2D/9","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage2D.xhtml)","ref":"gl.html#texSubImage2D/9"},{"type":"function","title":"gl.texSubImage3D/11","doc":"Texturing maps a portion of a specified texture image onto each graphical\nprimitive for which texturing is enabled.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexSubImage3D.xhtml)","ref":"gl.html#texSubImage3D/11"},{"type":"function","title":"gl.textureBarrier/0","doc":"The values of rendered fragments are undefined when a shader stage fetches\ntexels and the same texels are written via fragment shader outputs, even if the\nreads and writes are not in the same drawing command. To safely read the result\nof a written texel via a texel fetch in a subsequent drawing command, call\n[`gl:textureBarrier/0`](`textureBarrier/0`) between the two drawing commands to\nguarantee that writes have completed and caches have been invalidated before\nsubsequent drawing commands are executed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTextureBarrier.xhtml)","ref":"gl.html#textureBarrier/0"},{"type":"function","title":"gl.textureBuffer/3","doc":"[`gl:texBuffer/3`](`texBuffer/3`) and [`gl:textureBuffer/3`](`texBuffer/3`)\nattaches the data store of a specified buffer object to a specified texture\nobject, and specify the storage format for the texture image found in the buffer\nobject. The texture object must be a buffer texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexBuffer.xhtml)","ref":"gl.html#textureBuffer/3"},{"type":"function","title":"gl.textureBufferRange/5","doc":"[`gl:texBufferRange/5`](`texBufferRange/5`) and\n[`gl:textureBufferRange/5`](`texBufferRange/5`) attach a range of the data store\nof a specified buffer object to a specified texture object, and specify the\nstorage format for the texture image found in the buffer object. The texture\nobject must be a buffer texture.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexBufferRange.xhtml)","ref":"gl.html#textureBufferRange/5"},{"type":"function","title":"gl.textureView/8","doc":"[`gl:textureView/8`](`textureView/8`) initializes a texture object as an alias,\nor view of another texture object, sharing some or all of the parent texture's\ndata store with the initialized texture. `Texture` specifies a name previously\nreserved by a successful call to [`gl:genTextures/1`](`genTextures/1`) but that\nhas not yet been bound or given a target. `Target` specifies the target for the\nnewly initialized texture and must be compatible with the target of the parent\ntexture, given in `Origtexture` as specified in the following table:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTextureView.xhtml)","ref":"gl.html#textureView/8"},{"type":"function","title":"gl.transformFeedbackBufferBase/3","doc":"[`gl:transformFeedbackBufferBase/3`](`transformFeedbackBufferBase/3`) binds the\nbuffer object `Buffer` to the binding point at index `Index` of the transform\nfeedback object `Xfb`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackBufferBase.xhtml)","ref":"gl.html#transformFeedbackBufferBase/3"},{"type":"function","title":"gl.transformFeedbackBufferRange/5","doc":"[`gl:transformFeedbackBufferRange/5`](`transformFeedbackBufferRange/5`) binds a\nrange of the buffer object `Buffer` represented by `Offset` and `Size` to the\nbinding point at index `Index` of the transform feedback object `Xfb`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackBufferRange.xhtml)","ref":"gl.html#transformFeedbackBufferRange/5"},{"type":"function","title":"gl.transformFeedbackVaryings/3","doc":"The names of the vertex or geometry shader outputs to be recorded in transform\nfeedback mode are specified using\n[`gl:transformFeedbackVaryings/3`](`transformFeedbackVaryings/3`). When a\ngeometry shader is active, transform feedback records the values of selected\ngeometry shader output variables from the emitted vertices. Otherwise, the\nvalues of the selected vertex shader outputs are recorded.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackVaryings.xhtml)","ref":"gl.html#transformFeedbackVaryings/3"},{"type":"function","title":"gl.translated/3","doc":"","ref":"gl.html#translated/3"},{"type":"function","title":"gl.translatef/3","doc":"[`gl:translate()`](`translated/3`) produces a translation by (x y z). The\ncurrent matrix (see [`gl:matrixMode/1`](`matrixMode/1`)) is multiplied by this\ntranslation matrix, with the product replacing the current matrix, as if\n[`gl:multMatrix()`](`multMatrixd/1`) were called with the following matrix for\nits argument:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml)","ref":"gl.html#translatef/3"},{"type":"function","title":"gl.uniform1d/2","doc":"","ref":"gl.html#uniform1d/2"},{"type":"function","title":"gl.uniform1dv/2","doc":"","ref":"gl.html#uniform1dv/2"},{"type":"function","title":"gl.uniform1f/2","doc":"","ref":"gl.html#uniform1f/2"},{"type":"function","title":"gl.uniform1fv/2","doc":"","ref":"gl.html#uniform1fv/2"},{"type":"function","title":"gl.uniform1i/2","doc":"","ref":"gl.html#uniform1i/2"},{"type":"function","title":"gl.uniform1iv/2","doc":"","ref":"gl.html#uniform1iv/2"},{"type":"function","title":"gl.uniform1ui/2","doc":"","ref":"gl.html#uniform1ui/2"},{"type":"function","title":"gl.uniform1uiv/2","doc":"","ref":"gl.html#uniform1uiv/2"},{"type":"function","title":"gl.uniform2d/3","doc":"","ref":"gl.html#uniform2d/3"},{"type":"function","title":"gl.uniform2dv/2","doc":"","ref":"gl.html#uniform2dv/2"},{"type":"function","title":"gl.uniform2f/3","doc":"","ref":"gl.html#uniform2f/3"},{"type":"function","title":"gl.uniform2fv/2","doc":"","ref":"gl.html#uniform2fv/2"},{"type":"function","title":"gl.uniform2i/3","doc":"","ref":"gl.html#uniform2i/3"},{"type":"function","title":"gl.uniform2iv/2","doc":"","ref":"gl.html#uniform2iv/2"},{"type":"function","title":"gl.uniform2ui/3","doc":"","ref":"gl.html#uniform2ui/3"},{"type":"function","title":"gl.uniform2uiv/2","doc":"","ref":"gl.html#uniform2uiv/2"},{"type":"function","title":"gl.uniform3d/4","doc":"","ref":"gl.html#uniform3d/4"},{"type":"function","title":"gl.uniform3dv/2","doc":"","ref":"gl.html#uniform3dv/2"},{"type":"function","title":"gl.uniform3f/4","doc":"","ref":"gl.html#uniform3f/4"},{"type":"function","title":"gl.uniform3fv/2","doc":"","ref":"gl.html#uniform3fv/2"},{"type":"function","title":"gl.uniform3i/4","doc":"","ref":"gl.html#uniform3i/4"},{"type":"function","title":"gl.uniform3iv/2","doc":"","ref":"gl.html#uniform3iv/2"},{"type":"function","title":"gl.uniform3ui/4","doc":"","ref":"gl.html#uniform3ui/4"},{"type":"function","title":"gl.uniform3uiv/2","doc":"","ref":"gl.html#uniform3uiv/2"},{"type":"function","title":"gl.uniform4d/5","doc":"","ref":"gl.html#uniform4d/5"},{"type":"function","title":"gl.uniform4dv/2","doc":"","ref":"gl.html#uniform4dv/2"},{"type":"function","title":"gl.uniform4f/5","doc":"","ref":"gl.html#uniform4f/5"},{"type":"function","title":"gl.uniform4fv/2","doc":"","ref":"gl.html#uniform4fv/2"},{"type":"function","title":"gl.uniform4i/5","doc":"","ref":"gl.html#uniform4i/5"},{"type":"function","title":"gl.uniform4iv/2","doc":"","ref":"gl.html#uniform4iv/2"},{"type":"function","title":"gl.uniform4ui/5","doc":"","ref":"gl.html#uniform4ui/5"},{"type":"function","title":"gl.uniform4uiv/2","doc":"","ref":"gl.html#uniform4uiv/2"},{"type":"function","title":"gl.uniformBlockBinding/3","doc":"Binding points for active uniform blocks are assigned using\n[`gl:uniformBlockBinding/3`](`uniformBlockBinding/3`). Each of a program's\nactive uniform blocks has a corresponding uniform buffer binding point.\n`Program` is the name of a program object for which the command\n[`gl:linkProgram/1`](`linkProgram/1`) has been issued in the past.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniformBlockBinding.xhtml)","ref":"gl.html#uniformBlockBinding/3"},{"type":"function","title":"gl.uniformMatrix2dv/3","doc":"","ref":"gl.html#uniformMatrix2dv/3"},{"type":"function","title":"gl.uniformMatrix2fv/3","doc":"","ref":"gl.html#uniformMatrix2fv/3"},{"type":"function","title":"gl.uniformMatrix2x3dv/3","doc":"","ref":"gl.html#uniformMatrix2x3dv/3"},{"type":"function","title":"gl.uniformMatrix2x3fv/3","doc":"","ref":"gl.html#uniformMatrix2x3fv/3"},{"type":"function","title":"gl.uniformMatrix2x4dv/3","doc":"","ref":"gl.html#uniformMatrix2x4dv/3"},{"type":"function","title":"gl.uniformMatrix2x4fv/3","doc":"","ref":"gl.html#uniformMatrix2x4fv/3"},{"type":"function","title":"gl.uniformMatrix3dv/3","doc":"","ref":"gl.html#uniformMatrix3dv/3"},{"type":"function","title":"gl.uniformMatrix3fv/3","doc":"","ref":"gl.html#uniformMatrix3fv/3"},{"type":"function","title":"gl.uniformMatrix3x2dv/3","doc":"","ref":"gl.html#uniformMatrix3x2dv/3"},{"type":"function","title":"gl.uniformMatrix3x2fv/3","doc":"","ref":"gl.html#uniformMatrix3x2fv/3"},{"type":"function","title":"gl.uniformMatrix3x4dv/3","doc":"","ref":"gl.html#uniformMatrix3x4dv/3"},{"type":"function","title":"gl.uniformMatrix3x4fv/3","doc":"","ref":"gl.html#uniformMatrix3x4fv/3"},{"type":"function","title":"gl.uniformMatrix4dv/3","doc":"","ref":"gl.html#uniformMatrix4dv/3"},{"type":"function","title":"gl.uniformMatrix4fv/3","doc":"","ref":"gl.html#uniformMatrix4fv/3"},{"type":"function","title":"gl.uniformMatrix4x2dv/3","doc":"","ref":"gl.html#uniformMatrix4x2dv/3"},{"type":"function","title":"gl.uniformMatrix4x2fv/3","doc":"","ref":"gl.html#uniformMatrix4x2fv/3"},{"type":"function","title":"gl.uniformMatrix4x3dv/3","doc":"","ref":"gl.html#uniformMatrix4x3dv/3"},{"type":"function","title":"gl.uniformMatrix4x3fv/3","doc":"[`gl:uniform()`](`uniform1f/2`) modifies the value of a uniform variable or a\nuniform variable array. The location of the uniform variable to be modified is\nspecified by `Location`, which should be a value returned by\n[`gl:getUniformLocation/2`](`getUniformLocation/2`).\n[`gl:uniform()`](`uniform1f/2`) operates on the program object that was made\npart of current state by calling [`gl:useProgram/1`](`useProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniform.xhtml)","ref":"gl.html#uniformMatrix4x3fv/3"},{"type":"function","title":"gl.uniformSubroutinesuiv/2","doc":"[`gl:uniformSubroutines()`](`uniformSubroutinesuiv/2`) loads all active\nsubroutine uniforms for shader stage `Shadertype` of the current program with\nsubroutine indices from `Indices`, storing `Indices[i]` into the uniform at\nlocation `I`. `Count` must be equal to the value of\n`?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS` for the program currently in use at\nshader stage `Shadertype`. Furthermore, all values in `Indices` must be less\nthan the value of `?GL_ACTIVE_SUBROUTINES` for the shader stage.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniformSubroutines.xhtml)","ref":"gl.html#uniformSubroutinesuiv/2"},{"type":"function","title":"gl.useProgram/1","doc":"[`gl:useProgram/1`](`useProgram/1`) installs the program object specified by\n`Program` as part of current rendering state. One or more executables are\ncreated in a program object by successfully attaching shader objects to it with\n[`gl:attachShader/2`](`attachShader/2`), successfully compiling the shader\nobjects with [`gl:compileShader/1`](`compileShader/1`), and successfully linking\nthe program object with [`gl:linkProgram/1`](`linkProgram/1`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUseProgram.xhtml)","ref":"gl.html#useProgram/1"},{"type":"function","title":"gl.useProgramStages/3","doc":"[`gl:useProgramStages/3`](`useProgramStages/3`) binds executables from a program\nobject associated with a specified set of shader stages to the program pipeline\nobject given by `Pipeline`. `Pipeline` specifies the program pipeline object to\nwhich to bind the executables. `Stages` contains a logical combination of bits\nindicating the shader stages to use within `Program` with the program pipeline\nobject `Pipeline`. `Stages` must be a logical combination of\n`?GL_VERTEX_SHADER_BIT`, `?GL_TESS_CONTROL_SHADER_BIT`,\n`?GL_TESS_EVALUATION_SHADER_BIT`, `?GL_GEOMETRY_SHADER_BIT`,\n`?GL_FRAGMENT_SHADER_BIT` and `?GL_COMPUTE_SHADER_BIT`. Additionally, the\nspecial value `?GL_ALL_SHADER_BITS` may be specified to indicate that all\nexecutables contained in `Program` should be installed in `Pipeline`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUseProgramStages.xhtml)","ref":"gl.html#useProgramStages/3"},{"type":"function","title":"gl.validateProgram/1","doc":"[`gl:validateProgram/1`](`validateProgram/1`) checks to see whether the\nexecutables contained in `Program` can execute given the current OpenGL state.\nThe information generated by the validation process will be stored in\n`Program`'s information log. The validation information may consist of an empty\nstring, or it may be a string containing information about how the current\nprogram object interacts with the rest of current OpenGL state. This provides a\nway for OpenGL implementers to convey more information about why the current\nprogram is inefficient, suboptimal, failing to execute, and so on.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glValidateProgram.xhtml)","ref":"gl.html#validateProgram/1"},{"type":"function","title":"gl.validateProgramPipeline/1","doc":"[`gl:validateProgramPipeline/1`](`validateProgramPipeline/1`) instructs the\nimplementation to validate the shader executables contained in `Pipeline`\nagainst the current GL state. The implementation may use this as an opportunity\nto perform any internal shader modifications that may be required to ensure\ncorrect operation of the installed shaders given the current GL state.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glValidateProgramPipeline.xhtml)","ref":"gl.html#validateProgramPipeline/1"},{"type":"function","title":"gl.vertex2d/2","doc":"","ref":"gl.html#vertex2d/2"},{"type":"function","title":"gl.vertex2dv/1","doc":"","ref":"gl.html#vertex2dv/1"},{"type":"function","title":"gl.vertex2f/2","doc":"","ref":"gl.html#vertex2f/2"},{"type":"function","title":"gl.vertex2fv/1","doc":"","ref":"gl.html#vertex2fv/1"},{"type":"function","title":"gl.vertex2i/2","doc":"","ref":"gl.html#vertex2i/2"},{"type":"function","title":"gl.vertex2iv/1","doc":"","ref":"gl.html#vertex2iv/1"},{"type":"function","title":"gl.vertex2s/2","doc":"","ref":"gl.html#vertex2s/2"},{"type":"function","title":"gl.vertex2sv/1","doc":"","ref":"gl.html#vertex2sv/1"},{"type":"function","title":"gl.vertex3d/3","doc":"","ref":"gl.html#vertex3d/3"},{"type":"function","title":"gl.vertex3dv/1","doc":"","ref":"gl.html#vertex3dv/1"},{"type":"function","title":"gl.vertex3f/3","doc":"","ref":"gl.html#vertex3f/3"},{"type":"function","title":"gl.vertex3fv/1","doc":"","ref":"gl.html#vertex3fv/1"},{"type":"function","title":"gl.vertex3i/3","doc":"","ref":"gl.html#vertex3i/3"},{"type":"function","title":"gl.vertex3iv/1","doc":"","ref":"gl.html#vertex3iv/1"},{"type":"function","title":"gl.vertex3s/3","doc":"","ref":"gl.html#vertex3s/3"},{"type":"function","title":"gl.vertex3sv/1","doc":"","ref":"gl.html#vertex3sv/1"},{"type":"function","title":"gl.vertex4d/4","doc":"","ref":"gl.html#vertex4d/4"},{"type":"function","title":"gl.vertex4dv/1","doc":"","ref":"gl.html#vertex4dv/1"},{"type":"function","title":"gl.vertex4f/4","doc":"","ref":"gl.html#vertex4f/4"},{"type":"function","title":"gl.vertex4fv/1","doc":"","ref":"gl.html#vertex4fv/1"},{"type":"function","title":"gl.vertex4i/4","doc":"","ref":"gl.html#vertex4i/4"},{"type":"function","title":"gl.vertex4iv/1","doc":"","ref":"gl.html#vertex4iv/1"},{"type":"function","title":"gl.vertex4s/4","doc":"","ref":"gl.html#vertex4s/4"},{"type":"function","title":"gl.vertex4sv/1","doc":"[`gl:vertex()`](`vertex2d/2`) commands are used within\n[`gl:'begin'/1`](`'begin'/1`)/[`gl:'end'/0`](`'begin'/1`) pairs to specify\npoint, line, and polygon vertices. The current color, normal, texture\ncoordinates, and fog coordinate are associated with the vertex when\n[`gl:vertex()`](`vertex2d/2`) is called.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glVertex.xml)","ref":"gl.html#vertex4sv/1"},{"type":"function","title":"gl.vertexArrayAttribBinding/3","doc":"","ref":"gl.html#vertexArrayAttribBinding/3"},{"type":"function","title":"gl.vertexArrayAttribFormat/6","doc":"","ref":"gl.html#vertexArrayAttribFormat/6"},{"type":"function","title":"gl.vertexArrayAttribIFormat/5","doc":"","ref":"gl.html#vertexArrayAttribIFormat/5"},{"type":"function","title":"gl.vertexArrayAttribLFormat/5","doc":"","ref":"gl.html#vertexArrayAttribLFormat/5"},{"type":"function","title":"gl.vertexArrayBindingDivisor/3","doc":"","ref":"gl.html#vertexArrayBindingDivisor/3"},{"type":"function","title":"gl.vertexArrayElementBuffer/2","doc":"[`gl:vertexArrayElementBuffer/2`](`vertexArrayElementBuffer/2`) binds a buffer\nobject with id `Buffer` to the element array buffer bind point of a vertex array\nobject with id `Vaobj`. If `Buffer` is zero, any existing element array buffer\nbinding to `Vaobj` is removed.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexArrayElementBuffer.xhtml)","ref":"gl.html#vertexArrayElementBuffer/2"},{"type":"function","title":"gl.vertexArrayVertexBuffer/5","doc":"[`gl:bindVertexBuffer/4`](`bindVertexBuffer/4`) and\n[`gl:vertexArrayVertexBuffer/5`](`bindVertexBuffer/4`) bind the buffer named\n`Buffer` to the vertex buffer binding point whose index is given by\n`Bindingindex`. [`gl:bindVertexBuffer/4`](`bindVertexBuffer/4`) modifies the\nbinding of the currently bound vertex array object, whereas\n[`gl:vertexArrayVertexBuffer/5`](`bindVertexBuffer/4`) allows the caller to\nspecify ID of the vertex array object with an argument named `Vaobj`, for which\nthe binding should be modified. `Offset` and `Stride` specify the offset of the\nfirst element within the buffer and the distance between elements within the\nbuffer, respectively, and are both measured in basic machine units.\n`Bindingindex` must be less than the value of `?GL_MAX_VERTEX_ATTRIB_BINDINGS`.\n`Offset` and `Stride` must be greater than or equal to zero. If `Buffer` is\nzero, then any buffer currently bound to the specified binding point is unbound.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexBuffer.xhtml)","ref":"gl.html#vertexArrayVertexBuffer/5"},{"type":"function","title":"gl.vertexArrayVertexBuffers/5","doc":"[`gl:bindVertexBuffers/4`](`bindVertexBuffers/4`) and\n[`gl:vertexArrayVertexBuffers/5`](`bindVertexBuffers/4`) bind storage from an\narray of existing buffer objects to a specified number of consecutive vertex\nbuffer binding points units in a vertex array object. For\n[`gl:bindVertexBuffers/4`](`bindVertexBuffers/4`), the vertex array object is\nthe currently bound vertex array object. For\n[`gl:vertexArrayVertexBuffers/5`](`bindVertexBuffers/4`), `Vaobj` is the name of\nthe vertex array object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindVertexBuffers.xhtml)","ref":"gl.html#vertexArrayVertexBuffers/5"},{"type":"function","title":"gl.vertexAttrib1d/2","doc":"","ref":"gl.html#vertexAttrib1d/2"},{"type":"function","title":"gl.vertexAttrib1dv/2","doc":"","ref":"gl.html#vertexAttrib1dv/2"},{"type":"function","title":"gl.vertexAttrib1f/2","doc":"","ref":"gl.html#vertexAttrib1f/2"},{"type":"function","title":"gl.vertexAttrib1fv/2","doc":"","ref":"gl.html#vertexAttrib1fv/2"},{"type":"function","title":"gl.vertexAttrib1s/2","doc":"","ref":"gl.html#vertexAttrib1s/2"},{"type":"function","title":"gl.vertexAttrib1sv/2","doc":"","ref":"gl.html#vertexAttrib1sv/2"},{"type":"function","title":"gl.vertexAttrib2d/3","doc":"","ref":"gl.html#vertexAttrib2d/3"},{"type":"function","title":"gl.vertexAttrib2dv/2","doc":"","ref":"gl.html#vertexAttrib2dv/2"},{"type":"function","title":"gl.vertexAttrib2f/3","doc":"","ref":"gl.html#vertexAttrib2f/3"},{"type":"function","title":"gl.vertexAttrib2fv/2","doc":"","ref":"gl.html#vertexAttrib2fv/2"},{"type":"function","title":"gl.vertexAttrib2s/3","doc":"","ref":"gl.html#vertexAttrib2s/3"},{"type":"function","title":"gl.vertexAttrib2sv/2","doc":"","ref":"gl.html#vertexAttrib2sv/2"},{"type":"function","title":"gl.vertexAttrib3d/4","doc":"","ref":"gl.html#vertexAttrib3d/4"},{"type":"function","title":"gl.vertexAttrib3dv/2","doc":"","ref":"gl.html#vertexAttrib3dv/2"},{"type":"function","title":"gl.vertexAttrib3f/4","doc":"","ref":"gl.html#vertexAttrib3f/4"},{"type":"function","title":"gl.vertexAttrib3fv/2","doc":"","ref":"gl.html#vertexAttrib3fv/2"},{"type":"function","title":"gl.vertexAttrib3s/4","doc":"","ref":"gl.html#vertexAttrib3s/4"},{"type":"function","title":"gl.vertexAttrib3sv/2","doc":"","ref":"gl.html#vertexAttrib3sv/2"},{"type":"function","title":"gl.vertexAttrib4bv/2","doc":"","ref":"gl.html#vertexAttrib4bv/2"},{"type":"function","title":"gl.vertexAttrib4d/5","doc":"","ref":"gl.html#vertexAttrib4d/5"},{"type":"function","title":"gl.vertexAttrib4dv/2","doc":"","ref":"gl.html#vertexAttrib4dv/2"},{"type":"function","title":"gl.vertexAttrib4f/5","doc":"","ref":"gl.html#vertexAttrib4f/5"},{"type":"function","title":"gl.vertexAttrib4fv/2","doc":"","ref":"gl.html#vertexAttrib4fv/2"},{"type":"function","title":"gl.vertexAttrib4iv/2","doc":"","ref":"gl.html#vertexAttrib4iv/2"},{"type":"function","title":"gl.vertexAttrib4Nbv/2","doc":"","ref":"gl.html#vertexAttrib4Nbv/2"},{"type":"function","title":"gl.vertexAttrib4Niv/2","doc":"","ref":"gl.html#vertexAttrib4Niv/2"},{"type":"function","title":"gl.vertexAttrib4Nsv/2","doc":"","ref":"gl.html#vertexAttrib4Nsv/2"},{"type":"function","title":"gl.vertexAttrib4Nub/5","doc":"","ref":"gl.html#vertexAttrib4Nub/5"},{"type":"function","title":"gl.vertexAttrib4Nubv/2","doc":"","ref":"gl.html#vertexAttrib4Nubv/2"},{"type":"function","title":"gl.vertexAttrib4Nuiv/2","doc":"","ref":"gl.html#vertexAttrib4Nuiv/2"},{"type":"function","title":"gl.vertexAttrib4Nusv/2","doc":"","ref":"gl.html#vertexAttrib4Nusv/2"},{"type":"function","title":"gl.vertexAttrib4s/5","doc":"","ref":"gl.html#vertexAttrib4s/5"},{"type":"function","title":"gl.vertexAttrib4sv/2","doc":"","ref":"gl.html#vertexAttrib4sv/2"},{"type":"function","title":"gl.vertexAttrib4ubv/2","doc":"","ref":"gl.html#vertexAttrib4ubv/2"},{"type":"function","title":"gl.vertexAttrib4uiv/2","doc":"","ref":"gl.html#vertexAttrib4uiv/2"},{"type":"function","title":"gl.vertexAttrib4usv/2","doc":"","ref":"gl.html#vertexAttrib4usv/2"},{"type":"function","title":"gl.vertexAttribBinding/2","doc":"[`gl:vertexAttribBinding/2`](`vertexAttribBinding/2`) and\n[`gl:vertexArrayAttribBinding/3`](`vertexAttribBinding/2`) establishes an\nassociation between the generic vertex attribute of a vertex array object whose\nindex is given by `Attribindex`, and a vertex buffer binding whose index is\ngiven by `Bindingindex`. For\n[`gl:vertexAttribBinding/2`](`vertexAttribBinding/2`), the vertex array object\naffected is that currently bound. For\n[`gl:vertexArrayAttribBinding/3`](`vertexAttribBinding/2`), `Vaobj` is the name\nof the vertex array object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribBinding.xhtml)","ref":"gl.html#vertexAttribBinding/2"},{"type":"function","title":"gl.vertexAttribDivisor/2","doc":"[`gl:vertexAttribDivisor/2`](`vertexAttribDivisor/2`) modifies the rate at which\ngeneric vertex attributes advance when rendering multiple instances of\nprimitives in a single draw call. If `Divisor` is zero, the attribute at slot\n`Index` advances once per vertex. If `Divisor` is non-zero, the attribute\nadvances once per `Divisor` instances of the set(s) of vertices being rendered.\nAn attribute is referred to as instanced if its\n`?GL_VERTEX_ATTRIB_ARRAY_DIVISOR` value is non-zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribDivisor.xhtml)","ref":"gl.html#vertexAttribDivisor/2"},{"type":"function","title":"gl.vertexAttribFormat/5","doc":"","ref":"gl.html#vertexAttribFormat/5"},{"type":"function","title":"gl.vertexAttribI1i/2","doc":"","ref":"gl.html#vertexAttribI1i/2"},{"type":"function","title":"gl.vertexAttribI1iv/2","doc":"","ref":"gl.html#vertexAttribI1iv/2"},{"type":"function","title":"gl.vertexAttribI1ui/2","doc":"","ref":"gl.html#vertexAttribI1ui/2"},{"type":"function","title":"gl.vertexAttribI1uiv/2","doc":"","ref":"gl.html#vertexAttribI1uiv/2"},{"type":"function","title":"gl.vertexAttribI2i/3","doc":"","ref":"gl.html#vertexAttribI2i/3"},{"type":"function","title":"gl.vertexAttribI2iv/2","doc":"","ref":"gl.html#vertexAttribI2iv/2"},{"type":"function","title":"gl.vertexAttribI2ui/3","doc":"","ref":"gl.html#vertexAttribI2ui/3"},{"type":"function","title":"gl.vertexAttribI2uiv/2","doc":"","ref":"gl.html#vertexAttribI2uiv/2"},{"type":"function","title":"gl.vertexAttribI3i/4","doc":"","ref":"gl.html#vertexAttribI3i/4"},{"type":"function","title":"gl.vertexAttribI3iv/2","doc":"","ref":"gl.html#vertexAttribI3iv/2"},{"type":"function","title":"gl.vertexAttribI3ui/4","doc":"","ref":"gl.html#vertexAttribI3ui/4"},{"type":"function","title":"gl.vertexAttribI3uiv/2","doc":"","ref":"gl.html#vertexAttribI3uiv/2"},{"type":"function","title":"gl.vertexAttribI4bv/2","doc":"","ref":"gl.html#vertexAttribI4bv/2"},{"type":"function","title":"gl.vertexAttribI4i/5","doc":"","ref":"gl.html#vertexAttribI4i/5"},{"type":"function","title":"gl.vertexAttribI4iv/2","doc":"","ref":"gl.html#vertexAttribI4iv/2"},{"type":"function","title":"gl.vertexAttribI4sv/2","doc":"","ref":"gl.html#vertexAttribI4sv/2"},{"type":"function","title":"gl.vertexAttribI4ubv/2","doc":"","ref":"gl.html#vertexAttribI4ubv/2"},{"type":"function","title":"gl.vertexAttribI4ui/5","doc":"","ref":"gl.html#vertexAttribI4ui/5"},{"type":"function","title":"gl.vertexAttribI4uiv/2","doc":"","ref":"gl.html#vertexAttribI4uiv/2"},{"type":"function","title":"gl.vertexAttribI4usv/2","doc":"","ref":"gl.html#vertexAttribI4usv/2"},{"type":"function","title":"gl.vertexAttribIFormat/4","doc":"","ref":"gl.html#vertexAttribIFormat/4"},{"type":"function","title":"gl.vertexAttribIPointer/5","doc":"","ref":"gl.html#vertexAttribIPointer/5"},{"type":"function","title":"gl.vertexAttribL1d/2","doc":"","ref":"gl.html#vertexAttribL1d/2"},{"type":"function","title":"gl.vertexAttribL1dv/2","doc":"","ref":"gl.html#vertexAttribL1dv/2"},{"type":"function","title":"gl.vertexAttribL2d/3","doc":"","ref":"gl.html#vertexAttribL2d/3"},{"type":"function","title":"gl.vertexAttribL2dv/2","doc":"","ref":"gl.html#vertexAttribL2dv/2"},{"type":"function","title":"gl.vertexAttribL3d/4","doc":"","ref":"gl.html#vertexAttribL3d/4"},{"type":"function","title":"gl.vertexAttribL3dv/2","doc":"","ref":"gl.html#vertexAttribL3dv/2"},{"type":"function","title":"gl.vertexAttribL4d/5","doc":"","ref":"gl.html#vertexAttribL4d/5"},{"type":"function","title":"gl.vertexAttribL4dv/2","doc":"The [`gl:vertexAttrib()`](`vertexAttrib1d/2`) family of entry points allows an\napplication to pass generic vertex attributes in numbered locations.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttrib.xhtml)","ref":"gl.html#vertexAttribL4dv/2"},{"type":"function","title":"gl.vertexAttribLFormat/4","doc":"","ref":"gl.html#vertexAttribLFormat/4"},{"type":"function","title":"gl.vertexAttribLPointer/5","doc":"[`gl:vertexAttribFormat/5`](`vertexAttribFormat/5`),\n[`gl:vertexAttribIFormat/4`](`vertexAttribIPointer/5`) and\n[`gl:vertexAttribLFormat/4`](`vertexAttribIPointer/5`), as well as\n[`gl:vertexArrayAttribFormat/6`](`vertexAttribIPointer/5`),\n[`gl:vertexArrayAttribIFormat/5`](`vertexAttribIPointer/5`) and\n[`gl:vertexArrayAttribLFormat/5`](`vertexAttribIPointer/5`) specify the\norganization of data in vertex arrays. The first three calls operate on the\nbound vertex array object, whereas the last three ones modify the state of a\nvertex array object with ID `Vaobj`. `Attribindex` specifies the index of the\ngeneric vertex attribute array whose data layout is being described, and must be\nless than the value of `?GL_MAX_VERTEX_ATTRIBS`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribFormat.xhtml)","ref":"gl.html#vertexAttribLPointer/5"},{"type":"function","title":"gl.vertexAttribPointer/6","doc":"[`gl:vertexAttribPointer/6`](`vertexAttribPointer/6`),\n[`gl:vertexAttribIPointer/5`](`vertexAttribIPointer/5`) and\n[`gl:vertexAttribLPointer/5`](`vertexAttribIPointer/5`) specify the location and\ndata format of the array of generic vertex attributes at index `Index` to use\nwhen rendering. `Size` specifies the number of components per attribute and must\nbe 1, 2, 3, 4, or `?GL_BGRA`. `Type` specifies the data type of each component,\nand `Stride` specifies the byte stride from one attribute to the next, allowing\nvertices and attributes to be packed into a single array or stored in separate\narrays.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml)","ref":"gl.html#vertexAttribPointer/6"},{"type":"function","title":"gl.vertexBindingDivisor/2","doc":"[`gl:vertexBindingDivisor/2`](`vertexBindingDivisor/2`) and\n[`gl:vertexArrayBindingDivisor/3`](`vertexBindingDivisor/2`) modify the rate at\nwhich generic vertex attributes advance when rendering multiple instances of\nprimitives in a single draw command. If `Divisor` is zero, the attributes using\nthe buffer bound to `Bindingindex` advance once per vertex. If `Divisor` is\nnon-zero, the attributes advance once per `Divisor` instances of the set(s) of\nvertices being rendered. An attribute is referred to as `instanced` if the\ncorresponding `Divisor` value is non-zero.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexBindingDivisor.xhtml)","ref":"gl.html#vertexBindingDivisor/2"},{"type":"function","title":"gl.vertexPointer/4","doc":"[`gl:vertexPointer/4`](`vertexPointer/4`) specifies the location and data format\nof an array of vertex coordinates to use when rendering. `Size` specifies the\nnumber of coordinates per vertex, and must be 2, 3, or 4. `Type` specifies the\ndata type of each coordinate, and `Stride` specifies the byte stride from one\nvertex to the next, allowing vertices and attributes to be packed into a single\narray or stored in separate arrays. (Single-array storage may be more efficient\non some implementations; see [`gl:interleavedArrays/3`](`interleavedArrays/3`).)\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glVertexPointer.xml)","ref":"gl.html#vertexPointer/4"},{"type":"function","title":"gl.viewport/4","doc":"[`gl:viewport/4`](`viewport/4`) specifies the affine transformation of x and y\nfrom normalized device coordinates to window coordinates. Let (x nd y nd) be\nnormalized device coordinates. Then the window coordinates (x w y w) are\ncomputed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewport.xhtml)","ref":"gl.html#viewport/4"},{"type":"function","title":"gl.viewportArrayv/2","doc":"[`gl:viewportArrayv/2`](`viewportArrayv/2`) specifies the parameters for\nmultiple viewports simulataneously. `First` specifies the index of the first\nviewport to modify and `Count` specifies the number of viewports to modify.\n`First` must be less than the value of `?GL_MAX_VIEWPORTS`, and `First` \\+\n`Count` must be less than or equal to the value of `?GL_MAX_VIEWPORTS`.\nViewports whose indices lie outside the range [`First`, `First` \\+ `Count`) are\nnot modified. `V` contains the address of an array of floating point values\nspecifying the left ( x), bottom ( y), width ( w), and height ( h) of each\nviewport, in that order. x and y give the location of the viewport's lower left\ncorner, and w and h give the width and height of the viewport, respectively. The\nviewport specifies the affine transformation of x and y from normalized device\ncoordinates to window coordinates. Let (x nd y nd) be normalized device\ncoordinates. Then the window coordinates (x w y w) are computed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewportArray.xhtml)","ref":"gl.html#viewportArrayv/2"},{"type":"function","title":"gl.viewportIndexedf/5","doc":"","ref":"gl.html#viewportIndexedf/5"},{"type":"function","title":"gl.viewportIndexedfv/2","doc":"[`gl:viewportIndexedf/5`](`viewportIndexedf/5`) and\n[`gl:viewportIndexedfv/2`](`viewportIndexedf/5`) specify the parameters for a\nsingle viewport. `Index` specifies the index of the viewport to modify. `Index`\nmust be less than the value of `?GL_MAX_VIEWPORTS`. For\n[`gl:viewportIndexedf/5`](`viewportIndexedf/5`), `X`, `Y`, `W`, and `H` specify\nthe left, bottom, width and height of the viewport in pixels, respectively. For\n[`gl:viewportIndexedfv/2`](`viewportIndexedf/5`), `V` contains the address of an\narray of floating point values specifying the left ( x), bottom ( y), width (\nw), and height ( h) of each viewport, in that order. x and y give the location\nof the viewport's lower left corner, and w and h give the width and height of\nthe viewport, respectively. The viewport specifies the affine transformation of\nx and y from normalized device coordinates to window coordinates. Let (x nd y\nnd) be normalized device coordinates. Then the window coordinates (x w y w) are\ncomputed as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewportIndexed.xhtml)","ref":"gl.html#viewportIndexedfv/2"},{"type":"function","title":"gl.waitSync/3","doc":"[`gl:waitSync/3`](`waitSync/3`) causes the GL server to block and wait until\n`Sync` becomes signaled. `Sync` is the name of an existing sync object upon\nwhich to wait. `Flags` and `Timeout` are currently not used and must be set to\nzero and the special value `?GL_TIMEOUT_IGNORED`, respectively\n\n`Flags` and `Timeout` are placeholders for anticipated future extensions of sync\nobject capabilities. They must have these reserved values in order that existing\ncode calling [`gl:waitSync/3`](`waitSync/3`) operate properly in the presence of\nsuch extensions.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glWaitSync.xhtml)","ref":"gl.html#waitSync/3"},{"type":"function","title":"gl.windowPos2d/2","doc":"","ref":"gl.html#windowPos2d/2"},{"type":"function","title":"gl.windowPos2dv/1","doc":"","ref":"gl.html#windowPos2dv/1"},{"type":"function","title":"gl.windowPos2f/2","doc":"","ref":"gl.html#windowPos2f/2"},{"type":"function","title":"gl.windowPos2fv/1","doc":"","ref":"gl.html#windowPos2fv/1"},{"type":"function","title":"gl.windowPos2i/2","doc":"","ref":"gl.html#windowPos2i/2"},{"type":"function","title":"gl.windowPos2iv/1","doc":"","ref":"gl.html#windowPos2iv/1"},{"type":"function","title":"gl.windowPos2s/2","doc":"","ref":"gl.html#windowPos2s/2"},{"type":"function","title":"gl.windowPos2sv/1","doc":"","ref":"gl.html#windowPos2sv/1"},{"type":"function","title":"gl.windowPos3d/3","doc":"","ref":"gl.html#windowPos3d/3"},{"type":"function","title":"gl.windowPos3dv/1","doc":"","ref":"gl.html#windowPos3dv/1"},{"type":"function","title":"gl.windowPos3f/3","doc":"","ref":"gl.html#windowPos3f/3"},{"type":"function","title":"gl.windowPos3fv/1","doc":"","ref":"gl.html#windowPos3fv/1"},{"type":"function","title":"gl.windowPos3i/3","doc":"","ref":"gl.html#windowPos3i/3"},{"type":"function","title":"gl.windowPos3iv/1","doc":"","ref":"gl.html#windowPos3iv/1"},{"type":"function","title":"gl.windowPos3s/3","doc":"","ref":"gl.html#windowPos3s/3"},{"type":"function","title":"gl.windowPos3sv/1","doc":"The GL maintains a 3D position in window coordinates. This position, called the\nraster position, is used to position pixel and bitmap write operations. It is\nmaintained with subpixel accuracy. See [`gl:bitmap/7`](`bitmap/7`),\n[`gl:drawPixels/5`](`drawPixels/5`), and [`gl:copyPixels/5`](`copyPixels/5`).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glWindowPos.xml)","ref":"gl.html#windowPos3sv/1"},{"type":"type","title":"gl.clamp/0","doc":"","ref":"gl.html#t:clamp/0"},{"type":"type","title":"gl.enum/0","doc":"","ref":"gl.html#t:enum/0"},{"type":"type","title":"gl.f/0","doc":"","ref":"gl.html#t:f/0"},{"type":"type","title":"gl.i/0","doc":"","ref":"gl.html#t:i/0"},{"type":"type","title":"gl.m12/0","doc":"","ref":"gl.html#t:m12/0"},{"type":"type","title":"gl.m16/0","doc":"","ref":"gl.html#t:m16/0"},{"type":"type","title":"gl.matrix/0","doc":"","ref":"gl.html#t:matrix/0"},{"type":"type","title":"gl.mem/0","doc":"","ref":"gl.html#t:mem/0"},{"type":"type","title":"gl.offset/0","doc":"","ref":"gl.html#t:offset/0"},{"type":"module","title":"glu","doc":"Erlang wrapper functions for OpenGL\n\nStandard OpenGL API\n\nThis documents the functions as a brief version of the complete\n[OpenGL reference pages.](https://www.khronos.org/registry/OpenGL-Refpages/)","ref":"glu.html"},{"type":"function","title":"glu.build1DMipmapLevels/9","doc":"[`glu:build1DMipmapLevels/9`](`build1DMipmapLevels/9`) builds a subset of\nprefiltered one-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild1DMipmapLevels.xml)","ref":"glu.html#build1DMipmapLevels/9"},{"type":"function","title":"glu.build1DMipmaps/6","doc":"[`glu:build1DMipmaps/6`](`build1DMipmaps/6`) builds a series of prefiltered\none-dimensional texture maps of decreasing resolutions called a mipmap. This is\nused for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild1DMipmaps.xml)","ref":"glu.html#build1DMipmaps/6"},{"type":"function","title":"glu.build2DMipmapLevels/10","doc":"[`glu:build2DMipmapLevels/10`](`build2DMipmapLevels/10`) builds a subset of\nprefiltered two-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild2DMipmapLevels.xml)","ref":"glu.html#build2DMipmapLevels/10"},{"type":"function","title":"glu.build2DMipmaps/7","doc":"[`glu:build2DMipmaps/7`](`build2DMipmaps/7`) builds a series of prefiltered\ntwo-dimensional texture maps of decreasing resolutions called a mipmap. This is\nused for the antialiasing of texture-mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild2DMipmaps.xml)","ref":"glu.html#build2DMipmaps/7"},{"type":"function","title":"glu.build3DMipmapLevels/11","doc":"[`glu:build3DMipmapLevels/11`](`build3DMipmapLevels/11`) builds a subset of\nprefiltered three-dimensional texture maps of decreasing resolutions called a\nmipmap. This is used for the antialiasing of texture mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild3DMipmapLevels.xml)","ref":"glu.html#build3DMipmapLevels/11"},{"type":"function","title":"glu.build3DMipmaps/8","doc":"[`glu:build3DMipmaps/8`](`build3DMipmaps/8`) builds a series of prefiltered\nthree-dimensional texture maps of decreasing resolutions called a mipmap. This\nis used for the antialiasing of texture-mapped primitives.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluBuild3DMipmaps.xml)","ref":"glu.html#build3DMipmaps/8"},{"type":"function","title":"glu.checkExtension/2","doc":"[`glu:checkExtension/2`](`checkExtension/2`) returns `?GLU_TRUE` if `ExtName` is\nsupported otherwise `?GLU_FALSE` is returned.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluCheckExtension.xml)","ref":"glu.html#checkExtension/2"},{"type":"function","title":"glu.cylinder/6","doc":"[`glu:cylinder/6`](`cylinder/6`) draws a cylinder oriented along the `z` axis.\nThe base of the cylinder is placed at `z` = 0 and the top at z=height. Like a\nsphere, a cylinder is subdivided around the `z` axis into slices and along the\n`z` axis into stacks.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluCylinder.xml)","ref":"glu.html#cylinder/6"},{"type":"function","title":"glu.deleteQuadric/1","doc":"[`glu:deleteQuadric/1`](`deleteQuadric/1`) destroys the quadrics object (created\nwith [`glu:newQuadric/0`](`newQuadric/0`)) and frees any memory it uses. Once\n[`glu:deleteQuadric/1`](`deleteQuadric/1`) has been called, `Quad` cannot be\nused again.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluDeleteQuadric.xml)","ref":"glu.html#deleteQuadric/1"},{"type":"function","title":"glu.disk/5","doc":"[`glu:disk/5`](`disk/5`) renders a disk on the `z` = 0 plane. The disk has a\nradius of `Outer` and contains a concentric circular hole with a radius of\n`Inner`. If `Inner` is 0, then no hole is generated. The disk is subdivided\naround the `z` axis into slices (like pizza slices) and also about the `z` axis\ninto rings (as specified by `Slices` and `Loops`, respectively).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluDisk.xml)","ref":"glu.html#disk/5"},{"type":"function","title":"glu.errorString/1","doc":"[`glu:errorString/1`](`errorString/1`) produces an error string from a GL or GLU\nerror code. The string is in ISO Latin 1 format. For example,\n[`glu:errorString/1`](`errorString/1`)(`?GLU_OUT_OF_MEMORY`) returns the string\n`out of memory`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluErrorString.xml)","ref":"glu.html#errorString/1"},{"type":"function","title":"glu.getString/1","doc":"[`glu:getString/1`](`getString/1`) returns a pointer to a static string\ndescribing the GLU version or the GLU extensions that are supported.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluGetString.xml)","ref":"glu.html#getString/1"},{"type":"function","title":"glu.lookAt/9","doc":"[`glu:lookAt/9`](`lookAt/9`) creates a viewing matrix derived from an eye point,\na reference point indicating the center of the scene, and an `UP` vector.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml)","ref":"glu.html#lookAt/9"},{"type":"function","title":"glu.newQuadric/0","doc":"[`glu:newQuadric/0`](`newQuadric/0`) creates and returns a pointer to a new\nquadrics object. This object must be referred to when calling quadrics rendering\nand control functions. A return value of 0 means that there is not enough memory\nto allocate the object.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluNewQuadric.xml)","ref":"glu.html#newQuadric/0"},{"type":"function","title":"glu.ortho2D/4","doc":"[`glu:ortho2D/4`](`ortho2D/4`) sets up a two-dimensional orthographic viewing\nregion. This is equivalent to calling `gl:ortho/6` with near=-1 and far=1.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluOrtho2D.xml)","ref":"glu.html#ortho2D/4"},{"type":"function","title":"glu.partialDisk/7","doc":"[`glu:partialDisk/7`](`partialDisk/7`) renders a partial disk on the z=0 plane.\nA partial disk is similar to a full disk, except that only the subset of the\ndisk from `Start` through `Start` \\+ `Sweep` is included (where 0 degrees is\nalong the +f2yf axis, 90 degrees along the +`x` axis, 180 degrees along the -`y`\naxis, and 270 degrees along the -`x` axis).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPartialDisk.xml)","ref":"glu.html#partialDisk/7"},{"type":"function","title":"glu.perspective/4","doc":"[`glu:perspective/4`](`perspective/4`) specifies a viewing frustum into the\nworld coordinate system. In general, the aspect ratio in\n[`glu:perspective/4`](`perspective/4`) should match the aspect ratio of the\nassociated viewport. For example, aspect=2.0 means the viewer's angle of view is\ntwice as wide in `x` as it is in `y`. If the viewport is twice as wide as it is\ntall, it displays the image without distortion.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml)","ref":"glu.html#perspective/4"},{"type":"function","title":"glu.pickMatrix/5","doc":"[`glu:pickMatrix/5`](`pickMatrix/5`) creates a projection matrix that can be\nused to restrict drawing to a small region of the viewport. This is typically\nuseful to determine what objects are being drawn near the cursor. Use\n[`glu:pickMatrix/5`](`pickMatrix/5`) to restrict drawing to a small region\naround the cursor. Then, enter selection mode (with `gl:renderMode/1`) and\nrerender the scene. All primitives that would have been drawn near the cursor\nare identified and stored in the selection buffer.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPickMatrix.xml)","ref":"glu.html#pickMatrix/5"},{"type":"function","title":"glu.project/6","doc":"[`glu:project/6`](`project/6`) transforms the specified object coordinates into\nwindow coordinates using `Model`, `Proj`, and `View`. The result is stored in\n`WinX`, `WinY`, and `WinZ`. A return value of `?GLU_TRUE` indicates success, a\nreturn value of `?GLU_FALSE` indicates failure.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml)","ref":"glu.html#project/6"},{"type":"function","title":"glu.quadricDrawStyle/2","doc":"[`glu:quadricDrawStyle/2`](`quadricDrawStyle/2`) specifies the draw style for\nquadrics rendered with `Quad`. The legal values are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricDrawStyle.xml)","ref":"glu.html#quadricDrawStyle/2"},{"type":"function","title":"glu.quadricNormals/2","doc":"[`glu:quadricNormals/2`](`quadricNormals/2`) specifies what kind of normals are\ndesired for quadrics rendered with `Quad`. The legal values are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricNormals.xml)","ref":"glu.html#quadricNormals/2"},{"type":"function","title":"glu.quadricOrientation/2","doc":"[`glu:quadricOrientation/2`](`quadricOrientation/2`) specifies what kind of\norientation is desired for quadrics rendered with `Quad`. The `Orientation`\nvalues are as follows:\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricOrientation.xml)","ref":"glu.html#quadricOrientation/2"},{"type":"function","title":"glu.quadricTexture/2","doc":"[`glu:quadricTexture/2`](`quadricTexture/2`) specifies if texture coordinates\nshould be generated for quadrics rendered with `Quad`. If the value of `Texture`\nis `?GLU_TRUE`, then texture coordinates are generated, and if `Texture` is\n`?GLU_FALSE`, they are not. The initial value is `?GLU_FALSE`.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluQuadricTexture.xml)","ref":"glu.html#quadricTexture/2"},{"type":"function","title":"glu.scaleImage/9","doc":"[`glu:scaleImage/9`](`scaleImage/9`) scales a pixel image using the appropriate\npixel store modes to unpack data from the source image and pack data into the\ndestination image.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluScaleImage.xml)","ref":"glu.html#scaleImage/9"},{"type":"function","title":"glu.sphere/4","doc":"[`glu:sphere/4`](`sphere/4`) draws a sphere of the given radius centered around\nthe origin. The sphere is subdivided around the `z` axis into slices and along\nthe `z` axis into stacks (similar to lines of longitude and latitude).\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluSphere.xml)","ref":"glu.html#sphere/4"},{"type":"function","title":"glu.tesselate/2","doc":"Triangulates a polygon, the polygon is specified by a `Normal` and `Vs` a list\nof vertex positions.\n\nThe function returns a list of indices of the vertices and a binary (64bit\nnative float) containing an array of vertex positions, it starts with the\nvertices in `Vs` and may contain newly created vertices in the end.","ref":"glu.html#tesselate/2"},{"type":"function","title":"glu.unProject4/9","doc":"[`glu:unProject/6`](`unProject/6`) maps the specified window coordinates into\nobject coordinates using `Model`, `Proj`, and `View`. The result is stored in\n`ObjX`, `ObjY`, and `ObjZ`. A return value of `?GLU_TRUE` indicates success; a\nreturn value of `?GLU_FALSE` indicates failure.\n\n[External documentation.](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml)","ref":"glu.html#unProject4/9"},{"type":"function","title":"glu.unProject/6","doc":"","ref":"glu.html#unProject/6"},{"type":"type","title":"glu.enum/0","doc":"","ref":"glu.html#t:enum/0"},{"type":"type","title":"glu.f/0","doc":"","ref":"glu.html#t:f/0"},{"type":"type","title":"glu.i/0","doc":"","ref":"glu.html#t:i/0"},{"type":"type","title":"glu.m12/0","doc":"","ref":"glu.html#t:m12/0"},{"type":"type","title":"glu.m16/0","doc":"","ref":"glu.html#t:m16/0"},{"type":"type","title":"glu.matrix/0","doc":"","ref":"glu.html#t:matrix/0"},{"type":"type","title":"glu.mem/0","doc":"","ref":"glu.html#t:mem/0"},{"type":"type","title":"glu.vertex/0","doc":"","ref":"glu.html#t:vertex/0"},{"type":"module","title":"wx","doc":"A port of wxWidgets.\n\nA port of [wxWidgets](http://www.wxwidgets.org/).\n\nThis is the base api of [wxWidgets](http://www.wxwidgets.org/). This module\ncontains functions for starting and stopping the wx-server, as well as other\nutility functions.\n\nwxWidgets is object oriented, and not functional. Thus, in Wx a module\nrepresents a class, and the object created by this class has an own type,\nwxCLASS(). This module represents the base class, and all other wxMODULE's are\nsub-classes of this class.\n\nObjects of a class are created with wxCLASS:new(...) and destroyed with\nwxCLASS:destroy(). Member functions are called with wxCLASS:member(Object, ...)\ninstead of as in C++ Object.member(...).\n\nSub class modules inherit (non static) functions from their parents. The\ninherited functions are not documented in the sub-classes.\n\nThis erlang port of wxWidgets tries to be a one-to-one mapping with the original\nwxWidgets library. Some things are different though, as the optional arguments\nuse property lists and can be in any order. The main difference is the event\nhandling which is different from the original library. See `m:wxEvtHandler`.\n\nThe following classes are implemented directly as erlang types: \nwxPoint=\\{x,y\\},wxSize=\\{w,h\\},wxRect=\\{x,y,w,h\\},wxColour=\\{r,g,b \\[,a]\\},\nwxString=[unicode:chardata()](`t:unicode:chardata/0`),\nwxGBPosition=\\{r,c\\},wxGBSpan=\\{rs,cs\\},wxGridCellCoords=\\{r,c\\}.\n\nwxWidgets uses a process specific environment, which is created by\n[wx:new/0](`new/0`). To be able to use the environment from other processes,\ncall `get_env/0` to retrieve the environment and `set_env/1` to assign the\nenvironment in the other process.\n\nGlobal (classless) functions are located in the wx_misc module.","ref":"wx.html"},{"type":"module","title":"DATA TYPES - wx","doc":"- **[](){: #type-wx_colour } wx_colour() = \\{R::byte(), G::byte(), B::byte()\\} |\n [wx_colour4()](`m:wx#type-wx_colour4`)**\n\n- **[](){: #type-wx_colour4 } wx_colour4() = \\{R::byte(), G::byte(), B::byte(),\n A::byte()\\}**\n\n- **[](){: #type-wx_datetime } wx_datetime() = \\{\\{Year::integer(),\n Month::integer(), Day::integer()\\}, \\{Hour::integer(), Minute::integer(),\n Second::integer()\\}\\}**\n\n In Local Timezone\n\n- **[](){: #type-wx_enum } wx_enum() = integer()**\n\n Constant defined in wx.hrl\n\n- **[](){: #type-wx_env } wx_env() = #wx_env\\{\\}**\n\n Opaque process environment\n\n- **[](){: #type-wx_memory } wx_memory() = binary() | #wx_mem\\{\\}**\n\n Opaque memory reference\n\n- **[](){: #type-wx_object } wx_object() = #wx_ref\\{\\}**\n\n Opaque object reference\n\n- **[](){: #type-wx_wxHtmlLinkInfo } wx_wxHtmlLinkInfo() =\n #wxHtmlLinkInfo\\{href=[unicode:chardata()](`t:unicode:chardata/0`),\n target=[unicode:chardata()](`t:unicode:chardata/0`)\\}**\n\n- **[](){: #type-wx_wxMouseState } wx_wxMouseState() =\n #wxMouseState\\{x=integer(), y=integer(), leftDown=boolean(),\n middleDown=boolean(), rightDown=boolean(), controlDown=boolean(),\n shiftDown=boolean(), altDown=boolean(), metaDown=boolean(),\n cmdDown=boolean()\\}**\n\n See #wxMouseState\\{\\} defined in wx.hrl","ref":"wx.html#module-data-types"},{"type":"function","title":"wx.batch/1","doc":"batch(Fun::function()) -> term()\n\nBatches all `wx` commands used in the fun. Improves performance of the command\nprocessing by grabbing the wxWidgets thread so that no event processing will be\ndone before the complete batch of commands is invoked.\n\n_See also:_ `foldl/3`, `foldr/3`, `foreach/2`, `map/2`.","ref":"wx.html#batch/1"},{"type":"function","title":"wx.create_memory/1","doc":"create_memory(Size::integer()) -> wx_memory()\n\nCreates a memory area (of Size in bytes) which can be used by an external\nlibrary (i.e. opengl). It is up to the client to keep a reference to this object\nso it does not get garbage collected by erlang while still in use by the\nexternal library.\n\nThis is far from erlang's intentional usage and can crash the erlang emulator.\nUse it carefully.","ref":"wx.html#create_memory/1"},{"type":"function","title":"wx.debug/1","doc":"debug(Debug::Level | [Level]) -> ok\n\nSets debug level. If debug level is 'verbose' or 'trace' each call is printed on\nconsole. If Level is 'driver' each allocated object and deletion is printed on\nthe console.","ref":"wx.html#debug/1"},{"type":"function","title":"wx.demo/0","doc":"demo() -> ok | {error, atom()}\n\nStarts a Wx demo if examples directory exists and is compiled","ref":"wx.html#demo/0"},{"type":"function","title":"wx.destroy/0","doc":"destroy() -> ok\n\nStops a wx server.","ref":"wx.html#destroy/0"},{"type":"function","title":"wx.equal/2","doc":"equal(Wx_ref::wx_object(), X2::wx_object()) -> boolean()\n\nReturns true if both arguments references the same object, false otherwise","ref":"wx.html#equal/2"},{"type":"function","title":"wx.foldl/3","doc":"foldl(Fun::function(), Acc::term(), List::list()) -> term()\n\nBehaves like `lists:foldl/3` but batches wx commands. See `batch/1`.","ref":"wx.html#foldl/3"},{"type":"function","title":"wx.foldr/3","doc":"foldr(Fun::function(), Acc::term(), List::list()) -> term()\n\nBehaves like `lists:foldr/3` but batches wx commands. See `batch/1`.","ref":"wx.html#foldr/3"},{"type":"function","title":"wx.foreach/2","doc":"foreach(Fun::function(), List::list()) -> ok\n\nBehaves like `lists:foreach/2` but batches wx commands. See `batch/1`.","ref":"wx.html#foreach/2"},{"type":"function","title":"wx.get_env/0","doc":"get_env() -> wx_env()\n\nGets this process's current wx environment. Can be sent to other processes to\nallow them use this process wx environment.\n\n_See also:_ `set_env/1`.","ref":"wx.html#get_env/0"},{"type":"function","title":"wx.get_memory_bin/1","doc":"get_memory_bin(Wx_mem::wx_memory()) -> binary()\n\nReturns the memory area as a binary.","ref":"wx.html#get_memory_bin/1"},{"type":"function","title":"wx.getObjectType/1","doc":"getObjectType(Wx_ref::wx_object()) -> atom()\n\nReturns the object type","ref":"wx.html#getObjectType/1"},{"type":"function","title":"wx.is_null/1","doc":"is_null(Wx_ref::wx_object()) -> boolean()\n\nReturns true if object is null, false otherwise","ref":"wx.html#is_null/1"},{"type":"function","title":"wx.map/2","doc":"map(Fun::function(), List::list()) -> list()\n\nBehaves like `lists:map/2` but batches wx commands. See `batch/1`.","ref":"wx.html#map/2"},{"type":"function","title":"wx.new/0","doc":"new() -> wx_object()\n\nStarts a wx server.","ref":"wx.html#new/0"},{"type":"function","title":"wx.new/1","doc":"new(Options::[Option]) -> wx_object()\n\nStarts a wx server. Option may be \\{debug, Level\\}, see debug/1. Or\n\\{silent_start, Bool\\}, which causes error messages at startup to be suppressed.\nThe latter can be used as a silent test of whether wx is properly installed or\nnot.","ref":"wx.html#new/1"},{"type":"function","title":"wx.null/0","doc":"null() -> wx_object()\n\nReturns the null object","ref":"wx.html#null/0"},{"type":"function","title":"wx.parent_class/1","doc":"parent_class(X1) -> term()","ref":"wx.html#parent_class/1"},{"type":"function","title":"wx.release_memory/1","doc":"release_memory(Wx_mem::wx_memory()) -> ok","ref":"wx.html#release_memory/1"},{"type":"function","title":"wx.retain_memory/1","doc":"retain_memory(Wx_mem::wx_memory()) -> ok\n\nSaves the memory from deletion until release_memory/1 is called. If\nrelease_memory/1 is not called the memory will not be garbage collected.","ref":"wx.html#retain_memory/1"},{"type":"function","title":"wx.set_env/1","doc":"set_env(Wx_env::wx_env()) -> ok\n\nSets the process wx environment, allows this process to use another process wx\nenvironment.","ref":"wx.html#set_env/1"},{"type":"function","title":"wx.subscribe_events/0","doc":"subscribe_events() -> ok\n\nAdds the calling process to the list of of processes that are listening to wx\napplication events.\n\nAt the moment these are all MacOSX specific events corresponding to\n`MacNewFile()` and friends from wxWidgets\n[wxApp](https://docs.wxwidgets.org/trunk/classwx_app.html):\n\n- `{new_file, \"\"}`\n- `{open_file, Filename}`\n- `{print_file, Filename}`\n- `{open_url, Url}`\n- `{reopen_app, \"\"}`\n\nThe call always returns ok but will have sent any already received events to the\ncalling process.","ref":"wx.html#subscribe_events/0"},{"type":"function","title":"wx.typeCast/2","doc":"typeCast(Old::wx_object(), NewType::atom()) -> wx_object()\n\nCasts the object to class NewType. It is needed when using functions like\nwxWindow:findWindow/2, which returns a generic wxObject type.","ref":"wx.html#typeCast/2"},{"type":"type","title":"wx.wx_colour4/0","doc":"","ref":"wx.html#t:wx_colour4/0"},{"type":"type","title":"wx.wx_colour/0","doc":"","ref":"wx.html#t:wx_colour/0"},{"type":"type","title":"wx.wx_datetime/0","doc":"","ref":"wx.html#t:wx_datetime/0"},{"type":"type","title":"wx.wx_enum/0","doc":"","ref":"wx.html#t:wx_enum/0"},{"type":"type","title":"wx.wx_env/0","doc":"","ref":"wx.html#t:wx_env/0"},{"type":"type","title":"wx.wx_memory/0","doc":"","ref":"wx.html#t:wx_memory/0"},{"type":"type","title":"wx.wx_object/0","doc":"","ref":"wx.html#t:wx_object/0"},{"type":"type","title":"wx.wx_wxHtmlLinkInfo/0","doc":"","ref":"wx.html#t:wx_wxHtmlLinkInfo/0"},{"type":"type","title":"wx.wx_wxMouseState/0","doc":"","ref":"wx.html#t:wx_wxMouseState/0"},{"type":"module","title":"wxAcceleratorEntry","doc":"An object used by an application wishing to create an accelerator table (see `m:wxAcceleratorTable`).\n\nSee:\n* `m:wxAcceleratorTable`\n\n* `wxWindow:setAcceleratorTable/2`\n\nwxWidgets docs: [wxAcceleratorEntry](https://docs.wxwidgets.org/3.2/classwx_accelerator_entry.html)","ref":"wxAcceleratorEntry.html"},{"type":"function","title":"wxAcceleratorEntry.destroy/1","doc":"Destroys the object","ref":"wxAcceleratorEntry.html#destroy/1"},{"type":"function","title":"wxAcceleratorEntry.getCommand/1","doc":"Returns the command identifier for the accelerator table entry.","ref":"wxAcceleratorEntry.html#getCommand/1"},{"type":"function","title":"wxAcceleratorEntry.getFlags/1","doc":"Returns the flags for the accelerator table entry.","ref":"wxAcceleratorEntry.html#getFlags/1"},{"type":"function","title":"wxAcceleratorEntry.getKeyCode/1","doc":"Returns the keycode for the accelerator table entry.","ref":"wxAcceleratorEntry.html#getKeyCode/1"},{"type":"function","title":"wxAcceleratorEntry.new/0","doc":"","ref":"wxAcceleratorEntry.html#new/0"},{"type":"function","title":"wxAcceleratorEntry.new/1","doc":"Copy ctor.","ref":"wxAcceleratorEntry.html#new/1"},{"type":"function","title":"wxAcceleratorEntry.set/4","doc":"","ref":"wxAcceleratorEntry.html#set/4"},{"type":"function","title":"wxAcceleratorEntry.set/5","doc":"Sets the accelerator entry parameters.","ref":"wxAcceleratorEntry.html#set/5"},{"type":"type","title":"wxAcceleratorEntry.wxAcceleratorEntry/0","doc":"","ref":"wxAcceleratorEntry.html#t:wxAcceleratorEntry/0"},{"type":"module","title":"wxAcceleratorTable","doc":"An accelerator table allows the application to specify a table of keyboard shortcuts for\nmenu or button commands.\n\nThe object ?wxNullAcceleratorTable is defined to be a table with no data, and is the\ninitial accelerator table for a window.\n\nExample:\n\nRemark: An accelerator takes precedence over normal processing and can be a convenient\nway to program some event handling. For example, you can use an accelerator table to\nenable a dialog with a multi-line text control to accept CTRL-Enter as meaning 'OK'.\n\nPredefined objects (include wx.hrl): ?wxNullAcceleratorTable\n\nSee:\n* `m:wxAcceleratorEntry`\n\n* `wxWindow:setAcceleratorTable/2`\n\nwxWidgets docs: [wxAcceleratorTable](https://docs.wxwidgets.org/3.2/classwx_accelerator_table.html)","ref":"wxAcceleratorTable.html"},{"type":"function","title":"wxAcceleratorTable.destroy/1","doc":"Destroys the object","ref":"wxAcceleratorTable.html#destroy/1"},{"type":"function","title":"wxAcceleratorTable.isOk/1","doc":"Returns true if the accelerator table is valid.","ref":"wxAcceleratorTable.html#isOk/1"},{"type":"function","title":"wxAcceleratorTable.new/0","doc":"Default ctor.","ref":"wxAcceleratorTable.html#new/0"},{"type":"function","title":"wxAcceleratorTable.new/2","doc":"Initializes the accelerator table from an array of `m:wxAcceleratorEntry`.","ref":"wxAcceleratorTable.html#new/2"},{"type":"function","title":"wxAcceleratorTable.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxAcceleratorTable.html#ok/1"},{"type":"type","title":"wxAcceleratorTable.wxAcceleratorTable/0","doc":"","ref":"wxAcceleratorTable.html#t:wxAcceleratorTable/0"},{"type":"module","title":"wxActivateEvent","doc":"An activate event is sent when a window or application is being activated or deactivated.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxActivateEvent](https://docs.wxwidgets.org/3.2/classwx_activate_event.html)","ref":"wxActivateEvent.html"},{"type":"module","title":"Events - wxActivateEvent","doc":"Use `wxEvtHandler:connect/3` with `wxActivateEventType` to subscribe to events of this type.","ref":"wxActivateEvent.html#module-events"},{"type":"function","title":"wxActivateEvent.getActive/1","doc":"Returns true if the application or window is being activated, false otherwise.","ref":"wxActivateEvent.html#getActive/1"},{"type":"type","title":"wxActivateEvent.wxActivate/0","doc":"","ref":"wxActivateEvent.html#t:wxActivate/0"},{"type":"type","title":"wxActivateEvent.wxActivateEvent/0","doc":"","ref":"wxActivateEvent.html#t:wxActivateEvent/0"},{"type":"type","title":"wxActivateEvent.wxActivateEventType/0","doc":"","ref":"wxActivateEvent.html#t:wxActivateEventType/0"},{"type":"module","title":"wxArtProvider","doc":"`m:wxArtProvider` class is used to customize the look of wxWidgets application.\n\nWhen wxWidgets needs to display an icon or a bitmap (e.g. in the standard file dialog),\nit does not use a hard-coded resource but asks `m:wxArtProvider` for it instead. This way\nusers can plug in their own `m:wxArtProvider` class and easily replace standard art with\ntheir own version.\n\nAll that is needed is to derive a class from `m:wxArtProvider`, override either its `wxArtProvider::CreateBitmap()`\n(not implemented in wx) and/or its `wxArtProvider::CreateIconBundle()` (not implemented\nin wx) methods and register the provider with `wxArtProvider::Push()` (not implemented in wx):\n\nIf you need bitmap images (of the same artwork) that should be displayed at different\nsizes you should probably consider overriding `wxArtProvider::CreateIconBundle` (not\nimplemented in wx) and supplying icon bundles that contain different bitmap sizes.\n\nThere's another way of taking advantage of this class: you can use it in your code and\nuse platform native icons as provided by `getBitmap/2` or `getIcon/2`.\n\nIdentifying art resources\n\nEvery bitmap and icon bundle are known to `m:wxArtProvider` under an unique ID that is\nused when requesting a resource from it. The ID is represented by the ?wxArtID type and\ncan have one of these predefined values (you can see bitmaps represented by these\nconstants in the page_samples_artprov):\n\nAdditionally, any string recognized by custom art providers registered using `wxArtProvider::Push`\n(not implemented in wx) may be used.\n\nNote: When running under GTK+ 2, GTK+ stock item IDs (e.g. `\"gtk-cdrom\"`) may be used as\nwell: For a list of the GTK+ stock items please refer to the [GTK+ documentation page](http://library.gnome.org/devel/gtk/stable/gtk-Stock-Items.html).\nIt is also possible to load icons from the current icon theme by specifying their name\n(without extension and directory components). Icon themes recognized by GTK+ follow the\nfreedesktop.org [Icon Themes specification](http://freedesktop.org/Standards/icon-theme-spec).\nNote that themes are not guaranteed to contain all icons, so `m:wxArtProvider` may return\n?wxNullBitmap or ?wxNullIcon. The default theme is typically installed in `/usr/share/icons/hicolor`.\n\nClients\n\nThe `client` is the entity that calls `m:wxArtProvider`'s `getBitmap/2` or `getIcon/2` function. It is\nrepresented by wxClientID type and can have one of these values:\n\n* `wxART_TOOLBAR`\n\n* `wxART_MENU`\n\n* `wxART_BUTTON`\n\n* `wxART_FRAME_ICON`\n\n* `wxART_CMN_DIALOG`\n\n* `wxART_HELP_BROWSER`\n\n* `wxART_MESSAGE_BOX`\n\n* `wxART_OTHER` (used for all requests that don't fit into any of the categories above)\n\nClient ID serve as a hint to `m:wxArtProvider` that is supposed to help it to choose the\nbest looking bitmap. For example it is often desirable to use slightly different icons in\nmenus and toolbars even though they represent the same action (e.g. wxART_FILE_OPEN).\nRemember that this is really only a hint for `m:wxArtProvider` - it is common that `getBitmap/2`\nreturns identical bitmap for different client values!\n\nSee:\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_artprov)\n\n* `m:wxArtProvider`\n\nwxWidgets docs: [wxArtProvider](https://docs.wxwidgets.org/3.2/classwx_art_provider.html)","ref":"wxArtProvider.html"},{"type":"function","title":"wxArtProvider.getBitmap/1","doc":"","ref":"wxArtProvider.html#getBitmap/1"},{"type":"function","title":"wxArtProvider.getBitmap/2","doc":"Query registered providers for bitmap with given ID.\n\nReturn: The bitmap if one of registered providers recognizes the ID or wxNullBitmap\notherwise.","ref":"wxArtProvider.html#getBitmap/2"},{"type":"function","title":"wxArtProvider.getIcon/1","doc":"","ref":"wxArtProvider.html#getIcon/1"},{"type":"function","title":"wxArtProvider.getIcon/2","doc":"Same as `getBitmap/2`, but return a `m:wxIcon` object (or ?wxNullIcon on failure).","ref":"wxArtProvider.html#getIcon/2"},{"type":"type","title":"wxArtProvider.wxArtProvider/0","doc":"","ref":"wxArtProvider.html#t:wxArtProvider/0"},{"type":"module","title":"wxAuiDockArt","doc":"`m:wxAuiDockArt` is part of the wxAUI class framework.\n\nSee also overview_aui.\n\n`m:wxAuiDockArt` is the art provider: provides all drawing functionality to the wxAui\ndock manager. This allows the dock manager to have a pluggable look-and-feel.\n\nBy default, a `m:wxAuiManager` uses an instance of this class called `wxAuiDefaultDockArt`\n(not implemented in wx) which provides bitmap art and a colour scheme that is adapted to\nthe major platforms' look. You can either derive from that class to alter its behaviour or\nwrite a completely new dock art class. Call `wxAuiManager:setArtProvider/2` to force wxAUI to use your new dock art provider.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiPaneInfo`\n\nwxWidgets docs: [wxAuiDockArt](https://docs.wxwidgets.org/3.2/classwx_aui_dock_art.html)","ref":"wxAuiDockArt.html"},{"type":"function","title":"wxAuiDockArt.getColour/2","doc":"Get the colour of a certain setting.\n\n`id` can be one of the colour values of `wxAuiPaneDockArtSetting`.","ref":"wxAuiDockArt.html#getColour/2"},{"type":"function","title":"wxAuiDockArt.getFont/2","doc":"Get a font setting.","ref":"wxAuiDockArt.html#getFont/2"},{"type":"function","title":"wxAuiDockArt.getMetric/2","doc":"Get the value of a certain setting.\n\n`id` can be one of the size values of `wxAuiPaneDockArtSetting`.","ref":"wxAuiDockArt.html#getMetric/2"},{"type":"function","title":"wxAuiDockArt.setColour/3","doc":"Set a certain setting with the value `colour`.\n\n`id` can be one of the colour values of `wxAuiPaneDockArtSetting`.","ref":"wxAuiDockArt.html#setColour/3"},{"type":"function","title":"wxAuiDockArt.setFont/3","doc":"Set a font setting.","ref":"wxAuiDockArt.html#setFont/3"},{"type":"function","title":"wxAuiDockArt.setMetric/3","doc":"Set a certain setting with the value `new\\_val`.\n\n`id` can be one of the size values of `wxAuiPaneDockArtSetting`.","ref":"wxAuiDockArt.html#setMetric/3"},{"type":"type","title":"wxAuiDockArt.wxAuiDockArt/0","doc":"","ref":"wxAuiDockArt.html#t:wxAuiDockArt/0"},{"type":"module","title":"wxAuiManager","doc":"`m:wxAuiManager` is the central class of the wxAUI class framework.\n\n`m:wxAuiManager` manages the panes associated with it for a particular `m:wxFrame`, using\na pane's `m:wxAuiPaneInfo` information to determine each pane's docking and floating behaviour.\n\n`m:wxAuiManager` uses wxWidgets' sizer mechanism to plan the layout of each frame. It\nuses a replaceable dock art class to do all drawing, so all drawing is localized in one\narea, and may be customized depending on an application's specific needs.\n\n`m:wxAuiManager` works as follows: the programmer adds panes to the class, or makes\nchanges to existing pane properties (dock position, floating state, show state, etc.). To\napply these changes, `m:wxAuiManager`'s `update/1` function is called. This batch processing can be\nused to avoid flicker, by modifying more than one pane at a time, and then \"committing\"\nall of the changes at once by calling `update/1`.\n\nPanes can be added quite easily:\n\nLater on, the positions can be modified easily. The following will float an existing pane\nin a tool window:\n\nLayers, Rows and Directions, Positions\n\nInside wxAUI, the docking layout is figured out by checking several pane parameters. Four\nof these are important for determining where a pane will end up:\n\n* Direction: Each docked pane has a direction, Top, Bottom, Left, Right, or Center. This is\nfairly self-explanatory. The pane will be placed in the location specified by this\nvariable.\n\n* Position: More than one pane can be placed inside of a dock. Imagine two panes being\ndocked on the left side of a window. One pane can be placed over another. In\nproportionally managed docks, the pane position indicates its sequential position,\nstarting with zero. So, in our scenario with two panes docked on the left side, the top\npane in the dock would have position 0, and the second one would occupy position 1.\n\n* Row: A row can allow for two docks to be placed next to each other. One of the most\ncommon places for this to happen is in the toolbar. Multiple toolbar rows are allowed, the\nfirst row being row 0, and the second row 1. Rows can also be used on vertically docked\npanes.\n\n* Layer: A layer is akin to an onion. Layer 0 is the very center of the managed pane. Thus,\nif a pane is in layer 0, it will be closest to the center window (also sometimes known as\nthe \"content window\"). Increasing layers \"swallow up\" all layers of a lower value. This\ncan look very similar to multiple rows, but is different because all panes in a lower\nlevel yield to panes in higher levels. The best way to understand layers is by running the\nwxAUI sample.","ref":"wxAuiManager.html"},{"type":"module","title":"Styles - wxAuiManager","doc":"This class supports the following styles:\n\n* wxAUI_MGR_ALLOW_FLOATING: Allow a pane to be undocked to take the form of a `m:wxMiniFrame`.\n\n* wxAUI_MGR_ALLOW_ACTIVE_PANE: Change the color of the title bar of the pane when it is\nactivated.\n\n* wxAUI_MGR_TRANSPARENT_DRAG: Make the pane transparent during its movement.\n\n* wxAUI_MGR_TRANSPARENT_HINT: The possible location for docking is indicated by a\ntranslucent area.\n\n* wxAUI_MGR_VENETIAN_BLINDS_HINT: The possible location for docking is indicated by\ngradually appearing partially transparent hint.\n\n* wxAUI_MGR_RECTANGLE_HINT: The possible location for docking is indicated by a rectangular\noutline.\n\n* wxAUI_MGR_HINT_FADE: The translucent area where the pane could be docked appears\ngradually.\n\n* wxAUI_MGR_NO_VENETIAN_BLINDS_FADE: Used in complement of wxAUI_MGR_VENETIAN_BLINDS_HINT\nto show the docking hint immediately.\n\n* wxAUI_MGR_LIVE_RESIZE: When a docked pane is resized, its content is refreshed in live\n(instead of moving the border alone and refreshing the content at the end).\n\n* wxAUI_MGR_DEFAULT: Default behaviour, combines: wxAUI_MGR_ALLOW_FLOATING |\nwxAUI_MGR_TRANSPARENT_HINT | wxAUI_MGR_HINT_FADE | wxAUI_MGR_NO_VENETIAN_BLINDS_FADE.\n\nSee:\n* [Overview aui](https://docs.wxwidgets.org/3.2/overview_aui.html#overview_aui)\n\n* `m:wxAuiNotebook`\n\n* `m:wxAuiDockArt`\n\n* `m:wxAuiPaneInfo`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxAuiManager](https://docs.wxwidgets.org/3.2/classwx_aui_manager.html)","ref":"wxAuiManager.html#module-styles"},{"type":"module","title":"Events - wxAuiManager","doc":"Event types emitted from this class:\n\n* [`aui_pane_button`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_close`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_maximize`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_restore`](`m:wxAuiManagerEvent`)\n\n* [`aui_pane_activated`](`m:wxAuiManagerEvent`)\n\n* [`aui_render`](`m:wxAuiManagerEvent`)","ref":"wxAuiManager.html#module-events"},{"type":"function","title":"wxAuiManager.addPane/2","doc":"","ref":"wxAuiManager.html#addPane/2"},{"type":"function","title":"wxAuiManager.addPane/3","doc":"`addPane/4` tells the frame manager to start managing a child window.\n\nThere are several versions of this function. The first version allows the full spectrum\nof pane parameter possibilities. The second version is used for simpler user interfaces\nwhich do not require as much configuration. The last version allows a drop position to be\nspecified, which will determine where the pane will be added.","ref":"wxAuiManager.html#addPane/3"},{"type":"function","title":"wxAuiManager.addPane/4","doc":"","ref":"wxAuiManager.html#addPane/4"},{"type":"function","title":"wxAuiManager.destroy/1","doc":"Destroys the object","ref":"wxAuiManager.html#destroy/1"},{"type":"function","title":"wxAuiManager.detachPane/2","doc":"Tells the `m:wxAuiManager` to stop managing the pane specified by window.\n\nThe window, if in a floated frame, is reparented to the frame managed by `m:wxAuiManager`.","ref":"wxAuiManager.html#detachPane/2"},{"type":"function","title":"wxAuiManager.getAllPanes/1","doc":"Returns an array of all panes managed by the frame manager.","ref":"wxAuiManager.html#getAllPanes/1"},{"type":"function","title":"wxAuiManager.getArtProvider/1","doc":"Returns the current art provider being used.\n\nSee: `m:wxAuiDockArt`","ref":"wxAuiManager.html#getArtProvider/1"},{"type":"function","title":"wxAuiManager.getDockSizeConstraint/1","doc":"Returns the current dock constraint values.\n\nSee `setDockSizeConstraint/3` for more information.","ref":"wxAuiManager.html#getDockSizeConstraint/1"},{"type":"function","title":"wxAuiManager.getFlags/1","doc":"Returns the current ?wxAuiManagerOption's flags.","ref":"wxAuiManager.html#getFlags/1"},{"type":"function","title":"wxAuiManager.getManagedWindow/1","doc":"Returns the frame currently being managed by `m:wxAuiManager`.","ref":"wxAuiManager.html#getManagedWindow/1"},{"type":"function","title":"wxAuiManager.getManager/1","doc":"Calling this method will return the `m:wxAuiManager` for a given window.\n\nThe `window` parameter should specify any child window or sub-child window of the frame\nor window managed by `m:wxAuiManager`.\n\nThe `window` parameter need not be managed by the manager itself, nor does it even need\nto be a child or sub-child of a managed window. It must however be inside the window\nhierarchy underneath the managed window.","ref":"wxAuiManager.html#getManager/1"},{"type":"function","title":"wxAuiManager.getPane/2","doc":"`getPane/2` is used to lookup a `m:wxAuiPaneInfo` object either by window pointer or by\npane name, which acts as a unique id for a window pane.\n\nThe returned `m:wxAuiPaneInfo` object may then be modified to change a pane's look, state\nor position. After one or more modifications to `m:wxAuiPaneInfo`, `update/1` should be called to\ncommit the changes to the user interface. If the lookup failed (meaning the pane could not\nbe found in the manager), a call to the returned `m:wxAuiPaneInfo`'s IsOk() method will\nreturn false.","ref":"wxAuiManager.html#getPane/2"},{"type":"function","title":"wxAuiManager.hideHint/1","doc":"`hideHint/1` hides any docking hint that may be visible.","ref":"wxAuiManager.html#hideHint/1"},{"type":"function","title":"wxAuiManager.insertPane/3","doc":"","ref":"wxAuiManager.html#insertPane/3"},{"type":"function","title":"wxAuiManager.insertPane/4","doc":"This method is used to insert either a previously unmanaged pane window into the frame\nmanager, or to insert a currently managed pane somewhere else.\n\n`insertPane/4` will push all panes, rows, or docks aside and insert the window into the position\nspecified by `insert_location`.\n\nBecause `insert_location` can specify either a pane, dock row, or dock layer, the `insert_level`\nparameter is used to disambiguate this. The parameter `insert_level` can take a value of\nwxAUI_INSERT_PANE, wxAUI_INSERT_ROW or wxAUI_INSERT_DOCK.","ref":"wxAuiManager.html#insertPane/4"},{"type":"function","title":"wxAuiManager.loadPaneInfo/3","doc":"`loadPaneInfo/3` is similar to LoadPerspective, with the exception that it only loads\ninformation about a single pane.\n\nThis method writes the serialized data into the passed pane. Pointers to UI elements are\nnot modified.\n\nNote: This operation also changes the name in the pane information!\n\nSee: `loadPerspective/3`\n\nSee: `savePaneInfo/2`\n\nSee: `savePerspective/1`","ref":"wxAuiManager.html#loadPaneInfo/3"},{"type":"function","title":"wxAuiManager.loadPerspective/2","doc":"","ref":"wxAuiManager.html#loadPerspective/2"},{"type":"function","title":"wxAuiManager.loadPerspective/3","doc":"Loads a saved perspective.\n\nA perspective is the layout state of an AUI managed window.\n\nAll currently existing panes that have an object in \"perspective\" with the same name\n(\"equivalent\") will receive the layout parameters of the object in \"perspective\". Existing\npanes that do not have an equivalent in \"perspective\" remain unchanged, objects in\n\"perspective\" having no equivalent in the manager are ignored.\n\nSee: `loadPaneInfo/3`\n\nSee: `loadPerspective/3`\n\nSee: `savePerspective/1`","ref":"wxAuiManager.html#loadPerspective/3"},{"type":"function","title":"wxAuiManager.new/0","doc":"","ref":"wxAuiManager.html#new/0"},{"type":"function","title":"wxAuiManager.new/1","doc":"Constructor.","ref":"wxAuiManager.html#new/1"},{"type":"function","title":"wxAuiManager.savePaneInfo/2","doc":"`savePaneInfo/2` is similar to SavePerspective, with the exception that it only saves\ninformation about a single pane.\n\nReturn: The serialized layout parameters of the pane are returned within the string.\nInformation about the pointers to UI elements stored in the pane are not serialized.\n\nSee: `loadPaneInfo/3`\n\nSee: `loadPerspective/3`\n\nSee: `savePerspective/1`","ref":"wxAuiManager.html#savePaneInfo/2"},{"type":"function","title":"wxAuiManager.savePerspective/1","doc":"Saves the entire user interface layout into an encoded `wxString` (not implemented in\nwx), which can then be stored by the application (probably using wxConfig).\n\nSee: `loadPerspective/3`\n\nSee: `loadPaneInfo/3`\n\nSee: `savePaneInfo/2`","ref":"wxAuiManager.html#savePerspective/1"},{"type":"function","title":"wxAuiManager.setArtProvider/2","doc":"Instructs `m:wxAuiManager` to use art provider specified by parameter `art\\_provider` for\nall drawing calls.\n\nThis allows pluggable look-and-feel features. The previous art provider object, if any,\nwill be deleted by `m:wxAuiManager`.\n\nSee: `m:wxAuiDockArt`","ref":"wxAuiManager.html#setArtProvider/2"},{"type":"function","title":"wxAuiManager.setDockSizeConstraint/3","doc":"When a user creates a new dock by dragging a window into a docked position, often times\nthe large size of the window will create a dock that is unwieldy large.\n\n`m:wxAuiManager` by default limits the size of any new dock to 1/3 of the window size.\nFor horizontal docks, this would be 1/3 of the window height. For vertical docks, 1/3 of\nthe width.\n\nCalling this function will adjust this constraint value. The numbers must be between 0.0\nand 1.0. For instance, calling SetDockSizeContraint with 0.5, 0.5 will cause new docks to\nbe limited to half of the size of the entire managed window.","ref":"wxAuiManager.html#setDockSizeConstraint/3"},{"type":"function","title":"wxAuiManager.setFlags/2","doc":"This method is used to specify ?wxAuiManagerOption's flags.\n\n`flags` specifies options which allow the frame management behaviour to be modified.","ref":"wxAuiManager.html#setFlags/2"},{"type":"function","title":"wxAuiManager.setManagedWindow/2","doc":"Called to specify the frame or window which is to be managed by `m:wxAuiManager`.\n\nFrame management is not restricted to just frames. Child windows or custom controls are\nalso allowed.","ref":"wxAuiManager.html#setManagedWindow/2"},{"type":"function","title":"wxAuiManager.showHint/2","doc":"This function is used by controls to explicitly show a hint window at the specified\nrectangle.\n\nIt is rarely called, and is mostly used by controls implementing custom pane drag/drop\nbehaviour. The specified rectangle should be in screen coordinates.","ref":"wxAuiManager.html#showHint/2"},{"type":"function","title":"wxAuiManager.unInit/1","doc":"Dissociate the managed window from the manager.\n\nThis function may be called before the managed frame or window is destroyed, but, since\nwxWidgets 3.1.4, it's unnecessary to call it explicitly, as it will be called\nautomatically when this window is destroyed, as well as when the manager itself is.","ref":"wxAuiManager.html#unInit/1"},{"type":"function","title":"wxAuiManager.update/1","doc":"This method is called after any number of changes are made to any of the managed panes.\n\n`update/1` must be invoked after `addPane/4` or `insertPane/4` are called in order to \"realize\" or \"commit\" the changes. In\naddition, any number of changes may be made to `m:wxAuiPaneInfo` structures (retrieved\nwith `getPane/2`), but to realize the changes, `update/1` must be called. This construction allows pane flicker\nto be avoided by updating the whole layout at one time.","ref":"wxAuiManager.html#update/1"},{"type":"type","title":"wxAuiManager.wxAuiManager/0","doc":"","ref":"wxAuiManager.html#t:wxAuiManager/0"},{"type":"module","title":"wxAuiManagerEvent","doc":"Event used to indicate various actions taken with `m:wxAuiManager`.\n\nSee `m:wxAuiManager` for available event types.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiPaneInfo`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxAuiManagerEvent](https://docs.wxwidgets.org/3.2/classwx_aui_manager_event.html)","ref":"wxAuiManagerEvent.html"},{"type":"module","title":"Events - wxAuiManagerEvent","doc":"Use `wxEvtHandler:connect/3` with `wxAuiManagerEventType` to subscribe to events of this type.","ref":"wxAuiManagerEvent.html#module-events"},{"type":"function","title":"wxAuiManagerEvent.canVeto/1","doc":"Return: true if this event can be vetoed.\n\nSee: `veto/2`","ref":"wxAuiManagerEvent.html#canVeto/1"},{"type":"function","title":"wxAuiManagerEvent.getButton/1","doc":"Return: The ID of the button that was clicked.","ref":"wxAuiManagerEvent.html#getButton/1"},{"type":"function","title":"wxAuiManagerEvent.getDC/1","doc":"","ref":"wxAuiManagerEvent.html#getDC/1"},{"type":"function","title":"wxAuiManagerEvent.getManager/1","doc":"Return: The `m:wxAuiManager` this event is associated with.","ref":"wxAuiManagerEvent.html#getManager/1"},{"type":"function","title":"wxAuiManagerEvent.getPane/1","doc":"Return: The pane this event is associated with.","ref":"wxAuiManagerEvent.html#getPane/1"},{"type":"function","title":"wxAuiManagerEvent.getVeto/1","doc":"Return: true if this event was vetoed.\n\nSee: `veto/2`","ref":"wxAuiManagerEvent.html#getVeto/1"},{"type":"function","title":"wxAuiManagerEvent.setButton/2","doc":"Sets the ID of the button clicked that triggered this event.","ref":"wxAuiManagerEvent.html#setButton/2"},{"type":"function","title":"wxAuiManagerEvent.setCanVeto/2","doc":"Sets whether or not this event can be vetoed.","ref":"wxAuiManagerEvent.html#setCanVeto/2"},{"type":"function","title":"wxAuiManagerEvent.setDC/2","doc":"","ref":"wxAuiManagerEvent.html#setDC/2"},{"type":"function","title":"wxAuiManagerEvent.setManager/2","doc":"Sets the `m:wxAuiManager` this event is associated with.","ref":"wxAuiManagerEvent.html#setManager/2"},{"type":"function","title":"wxAuiManagerEvent.setPane/2","doc":"Sets the pane this event is associated with.","ref":"wxAuiManagerEvent.html#setPane/2"},{"type":"function","title":"wxAuiManagerEvent.veto/1","doc":"","ref":"wxAuiManagerEvent.html#veto/1"},{"type":"function","title":"wxAuiManagerEvent.veto/2","doc":"Cancels the action indicated by this event if `canVeto/1` is true.","ref":"wxAuiManagerEvent.html#veto/2"},{"type":"type","title":"wxAuiManagerEvent.wxAuiManager/0","doc":"","ref":"wxAuiManagerEvent.html#t:wxAuiManager/0"},{"type":"type","title":"wxAuiManagerEvent.wxAuiManagerEvent/0","doc":"","ref":"wxAuiManagerEvent.html#t:wxAuiManagerEvent/0"},{"type":"type","title":"wxAuiManagerEvent.wxAuiManagerEventType/0","doc":"","ref":"wxAuiManagerEvent.html#t:wxAuiManagerEventType/0"},{"type":"module","title":"wxAuiNotebook","doc":"`m:wxAuiNotebook` is part of the wxAUI class framework, which represents a notebook\ncontrol, managing multiple windows with associated tabs.\n\nSee also overview_aui.\n\n`m:wxAuiNotebook` is a notebook control which implements many features common in\napplications with dockable panes. Specifically, `m:wxAuiNotebook` implements functionality\nwhich allows the user to rearrange tab order via drag-and-drop, split the tab window into\nmany different splitter configurations, and toggle through different themes to customize\nthe control's look and feel.\n\nThe default theme that is used is `wxAuiDefaultTabArt` (not implemented in wx), which\nprovides a modern, glossy look and feel. The theme can be changed by calling `setArtProvider/2`.","ref":"wxAuiNotebook.html"},{"type":"module","title":"Styles - wxAuiNotebook","doc":"This class supports the following styles:\n\n* wxAUI_NB_DEFAULT_STYLE: Defined as wxAUI_NB_TOP | wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_MOVE\n| wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_CLOSE_ON_ACTIVE_TAB | wxAUI_NB_MIDDLE_CLICK_CLOSE.\n\n* wxAUI_NB_TAB_SPLIT: Allows the tab control to be split by dragging a tab.\n\n* wxAUI_NB_TAB_MOVE: Allows a tab to be moved horizontally by dragging.\n\n* wxAUI_NB_TAB_EXTERNAL_MOVE: Allows a tab to be moved to another tab control.\n\n* wxAUI_NB_TAB_FIXED_WIDTH: With this style, all tabs have the same width.\n\n* wxAUI_NB_SCROLL_BUTTONS: With this style, left and right scroll buttons are displayed.\n\n* wxAUI_NB_WINDOWLIST_BUTTON: With this style, a drop-down list of windows is available.\n\n* wxAUI_NB_CLOSE_BUTTON: With this style, a close button is available on the tab bar.\n\n* wxAUI_NB_CLOSE_ON_ACTIVE_TAB: With this style, the close button is visible on the active\ntab.\n\n* wxAUI_NB_CLOSE_ON_ALL_TABS: With this style, the close button is visible on all tabs.\n\n* wxAUI_NB_MIDDLE_CLICK_CLOSE: With this style, middle click on a tab closes the tab.\n\n* wxAUI_NB_TOP: With this style, tabs are drawn along the top of the notebook.\n\n* wxAUI_NB_BOTTOM: With this style, tabs are drawn along the bottom of the notebook.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxAuiNotebook](https://docs.wxwidgets.org/3.2/classwx_aui_notebook.html)","ref":"wxAuiNotebook.html#module-styles"},{"type":"module","title":"Events - wxAuiNotebook","doc":"Event types emitted from this class:\n\n* [`command_auinotebook_page_close`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_closed`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_changed`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_page_changing`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_button`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_begin_drag`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_end_drag`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_drag_motion`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_allow_dnd`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_drag_done`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_middle_down`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_middle_up`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_right_down`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_tab_right_up`](`m:wxAuiNotebookEvent`)\n\n* [`command_auinotebook_bg_dclick`](`m:wxAuiNotebookEvent`)","ref":"wxAuiNotebook.html#module-events"},{"type":"function","title":"wxAuiNotebook.addPage/3","doc":"","ref":"wxAuiNotebook.html#addPage/3"},{"type":"function","title":"wxAuiNotebook.addPage/4","doc":"Adds a page.\n\nIf the `select` parameter is true, calling this will generate a page change event.","ref":"wxAuiNotebook.html#addPage/4"},{"type":"function","title":"wxAuiNotebook.addPage/5","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function may generate the page changing events.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/6`\n\nSince: 2.9.3","ref":"wxAuiNotebook.html#addPage/5"},{"type":"function","title":"wxAuiNotebook.create/2","doc":"","ref":"wxAuiNotebook.html#create/2"},{"type":"function","title":"wxAuiNotebook.create/3","doc":"Creates the notebook window.","ref":"wxAuiNotebook.html#create/3"},{"type":"function","title":"wxAuiNotebook.create/4","doc":"Constructs the book control with the given parameters.","ref":"wxAuiNotebook.html#create/4"},{"type":"function","title":"wxAuiNotebook.deletePage/2","doc":"Deletes a page at the given index.\n\nCalling this method will generate a page change event.","ref":"wxAuiNotebook.html#deletePage/2"},{"type":"function","title":"wxAuiNotebook.destroy/1","doc":"Destroys the object","ref":"wxAuiNotebook.html#destroy/1"},{"type":"function","title":"wxAuiNotebook.getArtProvider/1","doc":"Returns the associated art provider.","ref":"wxAuiNotebook.html#getArtProvider/1"},{"type":"function","title":"wxAuiNotebook.getPage/2","doc":"Returns the page specified by the given index.","ref":"wxAuiNotebook.html#getPage/2"},{"type":"function","title":"wxAuiNotebook.getPageBitmap/2","doc":"Returns the tab bitmap for the page.","ref":"wxAuiNotebook.html#getPageBitmap/2"},{"type":"function","title":"wxAuiNotebook.getPageCount/1","doc":"Returns the number of pages in the notebook.","ref":"wxAuiNotebook.html#getPageCount/1"},{"type":"function","title":"wxAuiNotebook.getPageIndex/2","doc":"Returns the page index for the specified window.\n\nIf the window is not found in the notebook, wxNOT_FOUND is returned.","ref":"wxAuiNotebook.html#getPageIndex/2"},{"type":"function","title":"wxAuiNotebook.getPageText/2","doc":"Returns the tab label for the page.","ref":"wxAuiNotebook.html#getPageText/2"},{"type":"function","title":"wxAuiNotebook.getSelection/1","doc":"Returns the currently selected page.","ref":"wxAuiNotebook.html#getSelection/1"},{"type":"function","title":"wxAuiNotebook.insertPage/4","doc":"","ref":"wxAuiNotebook.html#insertPage/4"},{"type":"function","title":"wxAuiNotebook.insertPage/5","doc":"`insertPage/6` is similar to AddPage, but allows the ability to specify the insert\nlocation.\n\nIf the `select` parameter is true, calling this will generate a page change event.","ref":"wxAuiNotebook.html#insertPage/5"},{"type":"function","title":"wxAuiNotebook.insertPage/6","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/5`\n\nSince: 2.9.3","ref":"wxAuiNotebook.html#insertPage/6"},{"type":"function","title":"wxAuiNotebook.new/0","doc":"Default ctor.","ref":"wxAuiNotebook.html#new/0"},{"type":"function","title":"wxAuiNotebook.new/1","doc":"","ref":"wxAuiNotebook.html#new/1"},{"type":"function","title":"wxAuiNotebook.new/2","doc":"Constructor.\n\nCreates a wxAuiNotebok control.","ref":"wxAuiNotebook.html#new/2"},{"type":"function","title":"wxAuiNotebook.removePage/2","doc":"Removes a page, without deleting the window pointer.","ref":"wxAuiNotebook.html#removePage/2"},{"type":"function","title":"wxAuiNotebook.setArtProvider/2","doc":"Sets the art provider to be used by the notebook.","ref":"wxAuiNotebook.html#setArtProvider/2"},{"type":"function","title":"wxAuiNotebook.setFont/2","doc":"Sets the font for drawing the tab labels, using a bold version of the font for selected\ntab labels.","ref":"wxAuiNotebook.html#setFont/2"},{"type":"function","title":"wxAuiNotebook.setPageBitmap/3","doc":"Sets the bitmap for the page.\n\nTo remove a bitmap from the tab caption, pass wxNullBitmap.","ref":"wxAuiNotebook.html#setPageBitmap/3"},{"type":"function","title":"wxAuiNotebook.setPageText/3","doc":"Sets the tab label for the page.","ref":"wxAuiNotebook.html#setPageText/3"},{"type":"function","title":"wxAuiNotebook.setSelection/2","doc":"Sets the page selection.\n\nCalling this method will generate a page change event.","ref":"wxAuiNotebook.html#setSelection/2"},{"type":"function","title":"wxAuiNotebook.setTabCtrlHeight/2","doc":"Sets the tab height.\n\nBy default, the tab control height is calculated by measuring the text height and bitmap\nsizes on the tab captions. Calling this method will override that calculation and set the\ntab control to the specified height parameter. A call to this method will override any\ncall to `setUniformBitmapSize/2`.\n\nSpecifying -1 as the height will return the control to its default auto-sizing behaviour.","ref":"wxAuiNotebook.html#setTabCtrlHeight/2"},{"type":"function","title":"wxAuiNotebook.setUniformBitmapSize/2","doc":"Ensure that all tabs have the same height, even if some of them don't have bitmaps.\n\nPassing ?wxDefaultSize as `size` undoes the effect of a previous call to this function\nand instructs the control to use dynamic tab height.","ref":"wxAuiNotebook.html#setUniformBitmapSize/2"},{"type":"type","title":"wxAuiNotebook.wxAuiNotebook/0","doc":"","ref":"wxAuiNotebook.html#t:wxAuiNotebook/0"},{"type":"module","title":"wxAuiNotebookEvent","doc":"This class is used by the events generated by `m:wxAuiNotebook`.\n\nSee:\n* `m:wxAuiNotebook`\n\n* `m:wxBookCtrlEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxAuiNotebookEvent](https://docs.wxwidgets.org/3.2/classwx_aui_notebook_event.html)","ref":"wxAuiNotebookEvent.html"},{"type":"module","title":"Events - wxAuiNotebookEvent","doc":"Use `wxEvtHandler:connect/3` with `wxAuiNotebookEventType` to subscribe to events of this type.","ref":"wxAuiNotebookEvent.html#module-events"},{"type":"function","title":"wxAuiNotebookEvent.getDragSource/1","doc":"","ref":"wxAuiNotebookEvent.html#getDragSource/1"},{"type":"function","title":"wxAuiNotebookEvent.getOldSelection/1","doc":"Returns the page that was selected before the change, `wxNOT\\_FOUND` if none was\nselected.","ref":"wxAuiNotebookEvent.html#getOldSelection/1"},{"type":"function","title":"wxAuiNotebookEvent.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: under Windows, `getSelection/1` will return the same value as `getOldSelection/1` when called from the `EVT_BOOKCTRL_PAGE_CHANGING`\nhandler and not the page which is going to be selected.","ref":"wxAuiNotebookEvent.html#getSelection/1"},{"type":"function","title":"wxAuiNotebookEvent.setDragSource/2","doc":"","ref":"wxAuiNotebookEvent.html#setDragSource/2"},{"type":"function","title":"wxAuiNotebookEvent.setOldSelection/2","doc":"Sets the id of the page selected before the change.","ref":"wxAuiNotebookEvent.html#setOldSelection/2"},{"type":"function","title":"wxAuiNotebookEvent.setSelection/2","doc":"Sets the selection member variable.","ref":"wxAuiNotebookEvent.html#setSelection/2"},{"type":"type","title":"wxAuiNotebookEvent.wxAuiNotebook/0","doc":"","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebook/0"},{"type":"type","title":"wxAuiNotebookEvent.wxAuiNotebookEvent/0","doc":"","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebookEvent/0"},{"type":"type","title":"wxAuiNotebookEvent.wxAuiNotebookEventType/0","doc":"","ref":"wxAuiNotebookEvent.html#t:wxAuiNotebookEventType/0"},{"type":"module","title":"wxAuiPaneInfo","doc":"`m:wxAuiPaneInfo` is part of the wxAUI class framework.\n\nSee also overview_aui.\n\n`m:wxAuiPaneInfo` specifies all the parameters for a pane. These parameters specify where\nthe pane is on the screen, whether it is docked or floating, or hidden. In addition, these\nparameters specify the pane's docked position, floating position, preferred size, minimum\nsize, caption text among many other parameters.\n\nSee:\n* `m:wxAuiManager`\n\n* `m:wxAuiDockArt`\n\nwxWidgets docs: [wxAuiPaneInfo](https://docs.wxwidgets.org/3.2/classwx_aui_pane_info.html)","ref":"wxAuiPaneInfo.html"},{"type":"function","title":"wxAuiPaneInfo.bestSize/2","doc":"`bestSize/3` sets the ideal size for the pane.\n\nThe docking manager will attempt to use this size as much as possible when docking or\nfloating the pane.","ref":"wxAuiPaneInfo.html#bestSize/2"},{"type":"function","title":"wxAuiPaneInfo.bestSize/3","doc":"","ref":"wxAuiPaneInfo.html#bestSize/3"},{"type":"function","title":"wxAuiPaneInfo.bottom/1","doc":"`bottom/1` sets the pane dock position to the bottom side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_BOTTOM).","ref":"wxAuiPaneInfo.html#bottom/1"},{"type":"function","title":"wxAuiPaneInfo.bottomDockable/1","doc":"","ref":"wxAuiPaneInfo.html#bottomDockable/1"},{"type":"function","title":"wxAuiPaneInfo.bottomDockable/2","doc":"`bottomDockable/2` indicates whether a pane can be docked at the bottom of the frame.","ref":"wxAuiPaneInfo.html#bottomDockable/2"},{"type":"function","title":"wxAuiPaneInfo.caption/2","doc":"`caption/2` sets the caption of the pane.","ref":"wxAuiPaneInfo.html#caption/2"},{"type":"function","title":"wxAuiPaneInfo.captionVisible/1","doc":"","ref":"wxAuiPaneInfo.html#captionVisible/1"},{"type":"function","title":"wxAuiPaneInfo.captionVisible/2","doc":"CaptionVisible indicates that a pane caption should be visible.\n\nIf false, no pane caption is drawn.","ref":"wxAuiPaneInfo.html#captionVisible/2"},{"type":"function","title":"wxAuiPaneInfo.centre/1","doc":"`Center()` (not implemented in wx) sets the pane dock position to the left side of the\nframe.\n\nThe centre pane is the space in the middle after all border panes (left, top, right,\nbottom) are subtracted from the layout. This is the same thing as calling\nDirection(wxAUI_DOCK_CENTRE).","ref":"wxAuiPaneInfo.html#centre/1"},{"type":"function","title":"wxAuiPaneInfo.centrePane/1","doc":"`centrePane/1` specifies that the pane should adopt the default center pane settings.\n\nCentre panes usually do not have caption bars. This function provides an easy way of\npreparing a pane to be displayed in the center dock position.","ref":"wxAuiPaneInfo.html#centrePane/1"},{"type":"function","title":"wxAuiPaneInfo.closeButton/1","doc":"","ref":"wxAuiPaneInfo.html#closeButton/1"},{"type":"function","title":"wxAuiPaneInfo.closeButton/2","doc":"`closeButton/2` indicates that a close button should be drawn for the pane.","ref":"wxAuiPaneInfo.html#closeButton/2"},{"type":"function","title":"wxAuiPaneInfo.defaultPane/1","doc":"`defaultPane/1` specifies that the pane should adopt the default pane settings.","ref":"wxAuiPaneInfo.html#defaultPane/1"},{"type":"function","title":"wxAuiPaneInfo.destroy/1","doc":"Destroys the object","ref":"wxAuiPaneInfo.html#destroy/1"},{"type":"function","title":"wxAuiPaneInfo.destroyOnClose/1","doc":"","ref":"wxAuiPaneInfo.html#destroyOnClose/1"},{"type":"function","title":"wxAuiPaneInfo.destroyOnClose/2","doc":"`destroyOnClose/2` indicates whether a pane should be destroyed when it is closed.\n\nNormally a pane is simply hidden when the close button is clicked. Setting DestroyOnClose\nto true will cause the window to be destroyed when the user clicks the pane's close\nbutton.","ref":"wxAuiPaneInfo.html#destroyOnClose/2"},{"type":"function","title":"wxAuiPaneInfo.direction/2","doc":"`direction/2` determines the direction of the docked pane.\n\nIt is functionally the same as calling `left/1`, `right/1`, `top/1` or `bottom/1`, except that docking direction may be\nspecified programmatically via the parameter.","ref":"wxAuiPaneInfo.html#direction/2"},{"type":"function","title":"wxAuiPaneInfo.dock/1","doc":"`dock/1` indicates that a pane should be docked.\n\nIt is the opposite of `float/1`.","ref":"wxAuiPaneInfo.html#dock/1"},{"type":"function","title":"wxAuiPaneInfo.dockable/1","doc":"","ref":"wxAuiPaneInfo.html#dockable/1"},{"type":"function","title":"wxAuiPaneInfo.dockable/2","doc":"`dockable/2` specifies whether a frame can be docked or not.\n\nIt is the same as specifying\nTopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b).","ref":"wxAuiPaneInfo.html#dockable/2"},{"type":"function","title":"wxAuiPaneInfo.fixed/1","doc":"`fixed/1` forces a pane to be fixed size so that it cannot be resized.\n\nAfter calling `fixed/1`, `isFixed/1` will return true.","ref":"wxAuiPaneInfo.html#fixed/1"},{"type":"function","title":"wxAuiPaneInfo.float/1","doc":"`float/1` indicates that a pane should be floated.\n\nIt is the opposite of `dock/1`.","ref":"wxAuiPaneInfo.html#float/1"},{"type":"function","title":"wxAuiPaneInfo.floatable/1","doc":"","ref":"wxAuiPaneInfo.html#floatable/1"},{"type":"function","title":"wxAuiPaneInfo.floatable/2","doc":"`floatable/2` sets whether the user will be able to undock a pane and turn it into a\nfloating window.","ref":"wxAuiPaneInfo.html#floatable/2"},{"type":"function","title":"wxAuiPaneInfo.floatingPosition/2","doc":"`floatingPosition/3` sets the position of the floating pane.","ref":"wxAuiPaneInfo.html#floatingPosition/2"},{"type":"function","title":"wxAuiPaneInfo.floatingPosition/3","doc":"","ref":"wxAuiPaneInfo.html#floatingPosition/3"},{"type":"function","title":"wxAuiPaneInfo.floatingSize/2","doc":"`floatingSize/3` sets the size of the floating pane.","ref":"wxAuiPaneInfo.html#floatingSize/2"},{"type":"function","title":"wxAuiPaneInfo.floatingSize/3","doc":"","ref":"wxAuiPaneInfo.html#floatingSize/3"},{"type":"function","title":"wxAuiPaneInfo.getDirection/1","doc":"","ref":"wxAuiPaneInfo.html#getDirection/1"},{"type":"function","title":"wxAuiPaneInfo.getFloatingPosition/1","doc":"","ref":"wxAuiPaneInfo.html#getFloatingPosition/1"},{"type":"function","title":"wxAuiPaneInfo.getFloatingSize/1","doc":"","ref":"wxAuiPaneInfo.html#getFloatingSize/1"},{"type":"function","title":"wxAuiPaneInfo.getFrame/1","doc":"","ref":"wxAuiPaneInfo.html#getFrame/1"},{"type":"function","title":"wxAuiPaneInfo.getLayer/1","doc":"","ref":"wxAuiPaneInfo.html#getLayer/1"},{"type":"function","title":"wxAuiPaneInfo.getPosition/1","doc":"","ref":"wxAuiPaneInfo.html#getPosition/1"},{"type":"function","title":"wxAuiPaneInfo.getRow/1","doc":"","ref":"wxAuiPaneInfo.html#getRow/1"},{"type":"function","title":"wxAuiPaneInfo.getWindow/1","doc":"","ref":"wxAuiPaneInfo.html#getWindow/1"},{"type":"function","title":"wxAuiPaneInfo.gripper/1","doc":"","ref":"wxAuiPaneInfo.html#gripper/1"},{"type":"function","title":"wxAuiPaneInfo.gripper/2","doc":"`gripper/2` indicates that a gripper should be drawn for the pane.","ref":"wxAuiPaneInfo.html#gripper/2"},{"type":"function","title":"wxAuiPaneInfo.gripperTop/1","doc":"","ref":"wxAuiPaneInfo.html#gripperTop/1"},{"type":"function","title":"wxAuiPaneInfo.gripperTop/2","doc":"`gripperTop/2` indicates that a gripper should be drawn at the top of the pane.","ref":"wxAuiPaneInfo.html#gripperTop/2"},{"type":"function","title":"wxAuiPaneInfo.hasBorder/1","doc":"`hasBorder/1` returns true if the pane displays a border.","ref":"wxAuiPaneInfo.html#hasBorder/1"},{"type":"function","title":"wxAuiPaneInfo.hasCaption/1","doc":"`hasCaption/1` returns true if the pane displays a caption.","ref":"wxAuiPaneInfo.html#hasCaption/1"},{"type":"function","title":"wxAuiPaneInfo.hasCloseButton/1","doc":"`hasCloseButton/1` returns true if the pane displays a button to close the pane.","ref":"wxAuiPaneInfo.html#hasCloseButton/1"},{"type":"function","title":"wxAuiPaneInfo.hasFlag/2","doc":"`hasFlag/2` returns true if the property specified by flag is active for the pane.","ref":"wxAuiPaneInfo.html#hasFlag/2"},{"type":"function","title":"wxAuiPaneInfo.hasGripper/1","doc":"`hasGripper/1` returns true if the pane displays a gripper.","ref":"wxAuiPaneInfo.html#hasGripper/1"},{"type":"function","title":"wxAuiPaneInfo.hasGripperTop/1","doc":"`hasGripper/1` returns true if the pane displays a gripper at the top.","ref":"wxAuiPaneInfo.html#hasGripperTop/1"},{"type":"function","title":"wxAuiPaneInfo.hasMaximizeButton/1","doc":"`hasMaximizeButton/1` returns true if the pane displays a button to maximize the pane.","ref":"wxAuiPaneInfo.html#hasMaximizeButton/1"},{"type":"function","title":"wxAuiPaneInfo.hasMinimizeButton/1","doc":"`hasMinimizeButton/1` returns true if the pane displays a button to minimize the pane.","ref":"wxAuiPaneInfo.html#hasMinimizeButton/1"},{"type":"function","title":"wxAuiPaneInfo.hasPinButton/1","doc":"`hasPinButton/1` returns true if the pane displays a button to float the pane.","ref":"wxAuiPaneInfo.html#hasPinButton/1"},{"type":"function","title":"wxAuiPaneInfo.hide/1","doc":"`hide/1` indicates that a pane should be hidden.","ref":"wxAuiPaneInfo.html#hide/1"},{"type":"function","title":"wxAuiPaneInfo.isBottomDockable/1","doc":"`isBottomDockable/1` returns true if the pane can be docked at the bottom of the managed\nframe.","ref":"wxAuiPaneInfo.html#isBottomDockable/1"},{"type":"function","title":"wxAuiPaneInfo.isDocked/1","doc":"`isDocked/1` returns true if the pane is currently docked.","ref":"wxAuiPaneInfo.html#isDocked/1"},{"type":"function","title":"wxAuiPaneInfo.isFixed/1","doc":"`isFixed/1` returns true if the pane cannot be resized.","ref":"wxAuiPaneInfo.html#isFixed/1"},{"type":"function","title":"wxAuiPaneInfo.isFloatable/1","doc":"`isFloatable/1` returns true if the pane can be undocked and displayed as a floating\nwindow.","ref":"wxAuiPaneInfo.html#isFloatable/1"},{"type":"function","title":"wxAuiPaneInfo.isFloating/1","doc":"`isFloating/1` returns true if the pane is floating.","ref":"wxAuiPaneInfo.html#isFloating/1"},{"type":"function","title":"wxAuiPaneInfo.isLeftDockable/1","doc":"`isLeftDockable/1` returns true if the pane can be docked on the left of the managed\nframe.","ref":"wxAuiPaneInfo.html#isLeftDockable/1"},{"type":"function","title":"wxAuiPaneInfo.isMovable/1","doc":"IsMoveable() returns true if the docked frame can be undocked or moved to another dock\nposition.","ref":"wxAuiPaneInfo.html#isMovable/1"},{"type":"function","title":"wxAuiPaneInfo.isOk/1","doc":"`isOk/1` returns true if the `m:wxAuiPaneInfo` structure is valid.\n\nA pane structure is valid if it has an associated window.","ref":"wxAuiPaneInfo.html#isOk/1"},{"type":"function","title":"wxAuiPaneInfo.isResizable/1","doc":"`isResizable/1` returns true if the pane can be resized.","ref":"wxAuiPaneInfo.html#isResizable/1"},{"type":"function","title":"wxAuiPaneInfo.isRightDockable/1","doc":"`isRightDockable/1` returns true if the pane can be docked on the right of the managed\nframe.","ref":"wxAuiPaneInfo.html#isRightDockable/1"},{"type":"function","title":"wxAuiPaneInfo.isShown/1","doc":"`isShown/1` returns true if the pane is currently shown.","ref":"wxAuiPaneInfo.html#isShown/1"},{"type":"function","title":"wxAuiPaneInfo.isToolbar/1","doc":"`isToolbar/1` returns true if the pane contains a toolbar.","ref":"wxAuiPaneInfo.html#isToolbar/1"},{"type":"function","title":"wxAuiPaneInfo.isTopDockable/1","doc":"`isTopDockable/1` returns true if the pane can be docked at the top of the managed frame.","ref":"wxAuiPaneInfo.html#isTopDockable/1"},{"type":"function","title":"wxAuiPaneInfo.layer/2","doc":"`layer/2` determines the layer of the docked pane.\n\nThe dock layer is similar to an onion, the inner-most layer being layer 0. Each shell\nmoving in the outward direction has a higher layer number. This allows for more complex\ndocking layout formation.","ref":"wxAuiPaneInfo.html#layer/2"},{"type":"function","title":"wxAuiPaneInfo.left/1","doc":"`left/1` sets the pane dock position to the left side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_LEFT).","ref":"wxAuiPaneInfo.html#left/1"},{"type":"function","title":"wxAuiPaneInfo.leftDockable/1","doc":"","ref":"wxAuiPaneInfo.html#leftDockable/1"},{"type":"function","title":"wxAuiPaneInfo.leftDockable/2","doc":"`leftDockable/2` indicates whether a pane can be docked on the left of the frame.","ref":"wxAuiPaneInfo.html#leftDockable/2"},{"type":"function","title":"wxAuiPaneInfo.maximizeButton/1","doc":"","ref":"wxAuiPaneInfo.html#maximizeButton/1"},{"type":"function","title":"wxAuiPaneInfo.maximizeButton/2","doc":"`maximizeButton/2` indicates that a maximize button should be drawn for the pane.","ref":"wxAuiPaneInfo.html#maximizeButton/2"},{"type":"function","title":"wxAuiPaneInfo.maxSize/2","doc":"`maxSize/3` sets the maximum size of the pane.","ref":"wxAuiPaneInfo.html#maxSize/2"},{"type":"function","title":"wxAuiPaneInfo.maxSize/3","doc":"","ref":"wxAuiPaneInfo.html#maxSize/3"},{"type":"function","title":"wxAuiPaneInfo.minimizeButton/1","doc":"","ref":"wxAuiPaneInfo.html#minimizeButton/1"},{"type":"function","title":"wxAuiPaneInfo.minimizeButton/2","doc":"`minimizeButton/2` indicates that a minimize button should be drawn for the pane.","ref":"wxAuiPaneInfo.html#minimizeButton/2"},{"type":"function","title":"wxAuiPaneInfo.minSize/2","doc":"`minSize/3` sets the minimum size of the pane.\n\nPlease note that this is only partially supported as of this writing.","ref":"wxAuiPaneInfo.html#minSize/2"},{"type":"function","title":"wxAuiPaneInfo.minSize/3","doc":"","ref":"wxAuiPaneInfo.html#minSize/3"},{"type":"function","title":"wxAuiPaneInfo.movable/1","doc":"","ref":"wxAuiPaneInfo.html#movable/1"},{"type":"function","title":"wxAuiPaneInfo.movable/2","doc":"Movable indicates whether a frame can be moved.","ref":"wxAuiPaneInfo.html#movable/2"},{"type":"function","title":"wxAuiPaneInfo.name/2","doc":"`name/2` sets the name of the pane so it can be referenced in lookup functions.\n\nIf a name is not specified by the user, a random name is assigned to the pane when it is\nadded to the manager.","ref":"wxAuiPaneInfo.html#name/2"},{"type":"function","title":"wxAuiPaneInfo.new/0","doc":"","ref":"wxAuiPaneInfo.html#new/0"},{"type":"function","title":"wxAuiPaneInfo.new/1","doc":"Copy constructor.","ref":"wxAuiPaneInfo.html#new/1"},{"type":"function","title":"wxAuiPaneInfo.paneBorder/1","doc":"","ref":"wxAuiPaneInfo.html#paneBorder/1"},{"type":"function","title":"wxAuiPaneInfo.paneBorder/2","doc":"PaneBorder indicates that a border should be drawn for the pane.","ref":"wxAuiPaneInfo.html#paneBorder/2"},{"type":"function","title":"wxAuiPaneInfo.pinButton/1","doc":"","ref":"wxAuiPaneInfo.html#pinButton/1"},{"type":"function","title":"wxAuiPaneInfo.pinButton/2","doc":"`pinButton/2` indicates that a pin button should be drawn for the pane.","ref":"wxAuiPaneInfo.html#pinButton/2"},{"type":"function","title":"wxAuiPaneInfo.position/2","doc":"`position/2` determines the position of the docked pane.","ref":"wxAuiPaneInfo.html#position/2"},{"type":"function","title":"wxAuiPaneInfo.resizable/1","doc":"","ref":"wxAuiPaneInfo.html#resizable/1"},{"type":"function","title":"wxAuiPaneInfo.resizable/2","doc":"`resizable/2` allows a pane to be resized if the parameter is true, and forces it to be a\nfixed size if the parameter is false.\n\nThis is simply an antonym for `fixed/1`.","ref":"wxAuiPaneInfo.html#resizable/2"},{"type":"function","title":"wxAuiPaneInfo.right/1","doc":"`right/1` sets the pane dock position to the right side of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_RIGHT).","ref":"wxAuiPaneInfo.html#right/1"},{"type":"function","title":"wxAuiPaneInfo.rightDockable/1","doc":"","ref":"wxAuiPaneInfo.html#rightDockable/1"},{"type":"function","title":"wxAuiPaneInfo.rightDockable/2","doc":"`rightDockable/2` indicates whether a pane can be docked on the right of the frame.","ref":"wxAuiPaneInfo.html#rightDockable/2"},{"type":"function","title":"wxAuiPaneInfo.row/2","doc":"`row/2` determines the row of the docked pane.","ref":"wxAuiPaneInfo.html#row/2"},{"type":"function","title":"wxAuiPaneInfo.safeSet/2","doc":"Write the safe parts of a PaneInfo object \"source\" into \"this\".\n\n\"Safe parts\" are all non-UI elements (e.g. all layout determining parameters like the\nsize, position etc.). \"Unsafe parts\" (pointers to button, frame and window) are not\nmodified by this write operation.\n\nRemark: This method is used when loading perspectives.","ref":"wxAuiPaneInfo.html#safeSet/2"},{"type":"function","title":"wxAuiPaneInfo.setFlag/3","doc":"`setFlag/3` turns the property given by flag on or off with the option_state parameter.","ref":"wxAuiPaneInfo.html#setFlag/3"},{"type":"function","title":"wxAuiPaneInfo.show/1","doc":"","ref":"wxAuiPaneInfo.html#show/1"},{"type":"function","title":"wxAuiPaneInfo.show/2","doc":"`show/2` indicates that a pane should be shown.","ref":"wxAuiPaneInfo.html#show/2"},{"type":"function","title":"wxAuiPaneInfo.toolbarPane/1","doc":"`toolbarPane/1` specifies that the pane should adopt the default toolbar pane settings.","ref":"wxAuiPaneInfo.html#toolbarPane/1"},{"type":"function","title":"wxAuiPaneInfo.top/1","doc":"`top/1` sets the pane dock position to the top of the frame.\n\nThis is the same thing as calling Direction(wxAUI_DOCK_TOP).","ref":"wxAuiPaneInfo.html#top/1"},{"type":"function","title":"wxAuiPaneInfo.topDockable/1","doc":"","ref":"wxAuiPaneInfo.html#topDockable/1"},{"type":"function","title":"wxAuiPaneInfo.topDockable/2","doc":"`topDockable/2` indicates whether a pane can be docked at the top of the frame.","ref":"wxAuiPaneInfo.html#topDockable/2"},{"type":"function","title":"wxAuiPaneInfo.window/2","doc":"`window/2` assigns the window pointer that the `m:wxAuiPaneInfo` should use.\n\nThis normally does not need to be specified, as the window pointer is automatically\nassigned to the `m:wxAuiPaneInfo` structure as soon as it is added to the manager.","ref":"wxAuiPaneInfo.html#window/2"},{"type":"type","title":"wxAuiPaneInfo.wxAuiPaneInfo/0","doc":"","ref":"wxAuiPaneInfo.html#t:wxAuiPaneInfo/0"},{"type":"module","title":"wxAuiSimpleTabArt","doc":"Another standard tab art provider for `m:wxAuiNotebook`.\n\n`m:wxAuiSimpleTabArt` is derived from `m:wxAuiTabArt` demonstrating how to write a\ncompletely new tab art class. It can also be used as alternative to `wxAuiDefaultTabArt`\n(not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxAuiTabArt`\n\nwxWidgets docs: [wxAuiSimpleTabArt](https://docs.wxwidgets.org/3.2/classwx_aui_simple_tab_art.html)","ref":"wxAuiSimpleTabArt.html"},{"type":"function","title":"wxAuiSimpleTabArt.destroy/1","doc":"Destroys the object","ref":"wxAuiSimpleTabArt.html#destroy/1"},{"type":"function","title":"wxAuiSimpleTabArt.new/0","doc":"","ref":"wxAuiSimpleTabArt.html#new/0"},{"type":"type","title":"wxAuiSimpleTabArt.wxAuiSimpleTabArt/0","doc":"","ref":"wxAuiSimpleTabArt.html#t:wxAuiSimpleTabArt/0"},{"type":"module","title":"wxAuiTabArt","doc":"Tab art provider defines all the drawing functions used by `m:wxAuiNotebook`.\n\nThis allows the `m:wxAuiNotebook` to have a pluggable look-and-feel.\n\nBy default, a `m:wxAuiNotebook` uses an instance of this class called `wxAuiDefaultTabArt`\n(not implemented in wx) which provides bitmap art and a colour scheme that is adapted to\nthe major platforms' look. You can either derive from that class to alter its behaviour or\nwrite a completely new tab art class.\n\nAnother example of creating a new `m:wxAuiNotebook` tab bar is `m:wxAuiSimpleTabArt`.\n\nCall `wxAuiNotebook:setArtProvider/2` to make use of this new tab art.\n\nwxWidgets docs: [wxAuiTabArt](https://docs.wxwidgets.org/3.2/classwx_aui_tab_art.html)","ref":"wxAuiTabArt.html"},{"type":"function","title":"wxAuiTabArt.setActiveColour/2","doc":"Sets the colour of the selected tab.\n\nSince: 2.9.2","ref":"wxAuiTabArt.html#setActiveColour/2"},{"type":"function","title":"wxAuiTabArt.setColour/2","doc":"Sets the colour of the inactive tabs.\n\nSince: 2.9.2","ref":"wxAuiTabArt.html#setColour/2"},{"type":"function","title":"wxAuiTabArt.setFlags/2","doc":"Sets flags.","ref":"wxAuiTabArt.html#setFlags/2"},{"type":"function","title":"wxAuiTabArt.setMeasuringFont/2","doc":"Sets the font used for calculating measurements.","ref":"wxAuiTabArt.html#setMeasuringFont/2"},{"type":"function","title":"wxAuiTabArt.setNormalFont/2","doc":"Sets the normal font for drawing labels.","ref":"wxAuiTabArt.html#setNormalFont/2"},{"type":"function","title":"wxAuiTabArt.setSelectedFont/2","doc":"Sets the font for drawing text for selected UI elements.","ref":"wxAuiTabArt.html#setSelectedFont/2"},{"type":"type","title":"wxAuiTabArt.wxAuiTabArt/0","doc":"","ref":"wxAuiTabArt.html#t:wxAuiTabArt/0"},{"type":"module","title":"wxBitmap","doc":"This class encapsulates the concept of a platform-dependent bitmap, either monochrome or\ncolour or colour with alpha channel support.\n\nIf you need direct access the bitmap data instead going through drawing to it using `m:wxMemoryDC`\nyou need to use the `wxPixelData` (not implemented in wx) class (either wxNativePixelData\nfor RGB bitmaps or wxAlphaPixelData for bitmaps with an additionally alpha channel).\n\nNote that many `m:wxBitmap` functions take a `type` parameter, which is a value of the\n?wxBitmapType enumeration. The validity of those values depends however on the platform\nwhere your program is running and from the wxWidgets configuration. If all possible\nwxWidgets settings are used:\n\n* wxMSW supports BMP and ICO files, BMP and ICO resources;\n\n* wxGTK supports any file supported by gdk-pixbuf;\n\n* wxMac supports PICT resources;\n\n* wxX11 supports XPM files, XPM data, XBM data;\n\nIn addition, `m:wxBitmap` can load and save all formats that `m:wxImage` can; see `m:wxImage`\nfor more info. Of course, you must have loaded the `m:wxImage` handlers (see\n?wxInitAllImageHandlers() and `wxImage::AddHandler` (not implemented in wx)). Note that\nall available wxBitmapHandlers for a given wxWidgets port are automatically loaded at\nstartup so you won't need to use `wxBitmap::AddHandler` (not implemented in wx).\n\nMore on the difference between `m:wxImage` and `m:wxBitmap`: `m:wxImage` is just a buffer\nof RGB bytes with an optional buffer for the alpha bytes. It is all generic, platform\nindependent and image file format independent code. It includes generic code for scaling,\nresizing, clipping, and other manipulations of the image data. OTOH, `m:wxBitmap` is\nintended to be a wrapper of whatever is the native image format that is quickest/easiest\nto draw to a DC or to be the target of the drawing operations performed on a `m:wxMemoryDC`.\nBy splitting the responsibilities between wxImage/wxBitmap like this then it's easier to\nuse generic code shared by all platforms and image types for generic operations and\nplatform specific code where performance or compatibility is needed.\n\nPredefined objects (include wx.hrl): ?wxNullBitmap\n\nSee:\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap)\n\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap_supportedformats)\n\n* `wxDC:blit/6`\n\n* `m:wxIcon`\n\n* `m:wxCursor`\n\n* `m:wxMemoryDC`\n\n* `m:wxImage`\n\nwxWidgets docs: [wxBitmap](https://docs.wxwidgets.org/3.2/classwx_bitmap.html)","ref":"wxBitmap.html"},{"type":"function","title":"wxBitmap.convertToImage/1","doc":"Creates an image from a platform-dependent bitmap.\n\nThis preserves mask information so that bitmaps and images can be converted back and\nforth without loss in that respect.","ref":"wxBitmap.html#convertToImage/1"},{"type":"function","title":"wxBitmap.copyFromIcon/2","doc":"Creates the bitmap from an icon.","ref":"wxBitmap.html#copyFromIcon/2"},{"type":"function","title":"wxBitmap.create/2","doc":"","ref":"wxBitmap.html#create/2"},{"type":"function","title":"wxBitmap.create/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxBitmap.html#create/3"},{"type":"function","title":"wxBitmap.create/4","doc":"Create a bitmap compatible with the given DC, inheriting its magnification factor.\n\nReturn: true if the creation was successful.\n\nSince: 3.1.0","ref":"wxBitmap.html#create/4"},{"type":"function","title":"wxBitmap.destroy/1","doc":"Destroys the object","ref":"wxBitmap.html#destroy/1"},{"type":"function","title":"wxBitmap.getDepth/1","doc":"Gets the colour depth of the bitmap.\n\nA value of 1 indicates a monochrome bitmap.","ref":"wxBitmap.html#getDepth/1"},{"type":"function","title":"wxBitmap.getHeight/1","doc":"Gets the height of the bitmap in pixels.\n\nSee: `getWidth/1`","ref":"wxBitmap.html#getHeight/1"},{"type":"function","title":"wxBitmap.getMask/1","doc":"Gets the associated mask (if any) which may have been loaded from a file or set for the\nbitmap.\n\nSee:\n* `setMask/2`\n\n* `m:wxMask`","ref":"wxBitmap.html#getMask/1"},{"type":"function","title":"wxBitmap.getPalette/1","doc":"Gets the associated palette (if any) which may have been loaded from a file or set for\nthe bitmap.\n\nSee: `m:wxPalette`","ref":"wxBitmap.html#getPalette/1"},{"type":"function","title":"wxBitmap.getSubBitmap/2","doc":"Returns a sub bitmap of the current one as long as the rect belongs entirely to the\nbitmap.\n\nThis function preserves bit depth and mask information.","ref":"wxBitmap.html#getSubBitmap/2"},{"type":"function","title":"wxBitmap.getWidth/1","doc":"Gets the width of the bitmap in pixels.\n\nSee: `getHeight/1`","ref":"wxBitmap.html#getWidth/1"},{"type":"function","title":"wxBitmap.isOk/1","doc":"Returns true if bitmap data is present.","ref":"wxBitmap.html#isOk/1"},{"type":"function","title":"wxBitmap.loadFile/2","doc":"","ref":"wxBitmap.html#loadFile/2"},{"type":"function","title":"wxBitmap.loadFile/3","doc":"Loads a bitmap from a file or resource.\n\nReturn: true if the operation succeeded, false otherwise.\n\nRemark: A palette may be associated with the bitmap if one exists (especially for colour\nWindows bitmaps), and if the code supports it. You can check if one has been created by\nusing the `getPalette/1` member.\n\nSee: `saveFile/4`","ref":"wxBitmap.html#loadFile/3"},{"type":"function","title":"wxBitmap.new/0","doc":"Default constructor.\n\nConstructs a bitmap object with no data; an assignment or another member function such as `create/4`\nor `loadFile/3` must be called subsequently.","ref":"wxBitmap.html#new/0"},{"type":"function","title":"wxBitmap.new/1","doc":"","ref":"wxBitmap.html#new/1"},{"type":"function","title":"wxBitmap.new/2","doc":"Creates this bitmap object from the given image.\n\nThis has to be done to actually display an image as you cannot draw an image directly on\na window.\n\nThe resulting bitmap will use the provided colour depth (or that of the current system if\ndepth is ?wxBITMAP\\_SCREEN\\_DEPTH) which entails that a colour reduction may take place.\n\nOn Windows, if there is a palette present (set with SetPalette), it will be used when\ncreating the `m:wxBitmap` (most useful in 8-bit display mode). On other platforms, the\npalette is currently ignored.","ref":"wxBitmap.html#new/2"},{"type":"function","title":"wxBitmap.new/3","doc":"Creates a new bitmap.\n\nA depth of ?wxBITMAP\\_SCREEN\\_DEPTH indicates the depth of the current screen or visual.\n\nSome platforms only support 1 for monochrome and ?wxBITMAP\\_SCREEN\\_DEPTH for the current\ncolour setting.\n\nA depth of 32 including an alpha channel is supported under MSW, Mac and GTK+.","ref":"wxBitmap.html#new/3"},{"type":"function","title":"wxBitmap.new/4","doc":"Creates a bitmap from the given array `bits`.\n\nYou should only use this function for monochrome bitmaps (depth 1) in portable programs:\nin this case the bits parameter should contain an XBM image.\n\nFor other bit depths, the behaviour is platform dependent: under Windows, the data is\npassed without any changes to the underlying CreateBitmap() API. Under other platforms,\nonly monochrome bitmaps may be created using this constructor and `m:wxImage` should be\nused for creating colour bitmaps from static data.","ref":"wxBitmap.html#new/4"},{"type":"function","title":"wxBitmap.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxBitmap.html#ok/1"},{"type":"function","title":"wxBitmap.saveFile/3","doc":"","ref":"wxBitmap.html#saveFile/3"},{"type":"function","title":"wxBitmap.saveFile/4","doc":"Saves a bitmap in the named file.\n\nReturn: true if the operation succeeded, false otherwise.\n\nRemark: Depending on how wxWidgets has been configured, not all formats may be available.\n\nSee: `loadFile/3`","ref":"wxBitmap.html#saveFile/4"},{"type":"function","title":"wxBitmap.setDepth/2","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the depth member (does not affect the bitmap data).","ref":"wxBitmap.html#setDepth/2"},{"type":"function","title":"wxBitmap.setHeight/2","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the height member (does not affect the bitmap data).","ref":"wxBitmap.html#setHeight/2"},{"type":"function","title":"wxBitmap.setMask/2","doc":"Sets the mask for this bitmap.\n\nRemark: The bitmap object owns the mask once this has been called.\n\nNote: A mask can be set also for bitmap with an alpha channel but doing so under wxMSW is\nnot recommended because performance of drawing such bitmap is not very good.\n\nSee:\n* `getMask/1`\n\n* `m:wxMask`","ref":"wxBitmap.html#setMask/2"},{"type":"function","title":"wxBitmap.setPalette/2","doc":"Sets the associated palette.\n\n(Not implemented under GTK+).\n\nSee: `m:wxPalette`","ref":"wxBitmap.html#setPalette/2"},{"type":"function","title":"wxBitmap.setWidth/2","doc":"Deprecated:\n\nThis function is deprecated since version 3.1.2, dimensions and depth can only be set at\nconstruction time.\n\nSets the width member (does not affect the bitmap data).","ref":"wxBitmap.html#setWidth/2"},{"type":"type","title":"wxBitmap.wxBitmap/0","doc":"","ref":"wxBitmap.html#t:wxBitmap/0"},{"type":"module","title":"wxBitmapButton","doc":"A bitmap button is a control that contains a bitmap.\n\nNotice that since wxWidgets 2.9.1 bitmap display is supported by the base `m:wxButton`\nclass itself and the only tiny advantage of using this class is that it allows specifying\nthe bitmap in its constructor, unlike `m:wxButton`. Please see the base class\ndocumentation for more information about images support in `m:wxButton`.","ref":"wxBitmapButton.html"},{"type":"module","title":"Styles - wxBitmapButton","doc":"This class supports the following styles:\n\n* wxBU_LEFT: Left-justifies the bitmap label.\n\n* wxBU_TOP: Aligns the bitmap label to the top of the button.\n\n* wxBU_RIGHT: Right-justifies the bitmap label.\n\n* wxBU_BOTTOM: Aligns the bitmap label to the bottom of the button. Note that the\nwxBU_EXACTFIT style supported by `m:wxButton` is not used by this class as bitmap buttons\ndon't have any minimal standard size by default.\n\nSee: `m:wxButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxButton`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxBitmapButton](https://docs.wxwidgets.org/3.2/classwx_bitmap_button.html)","ref":"wxBitmapButton.html#module-styles"},{"type":"module","title":"Events - wxBitmapButton","doc":"Event types emitted from this class:\n\n* [`command_button_clicked`](`m:wxCommandEvent`)","ref":"wxBitmapButton.html#module-events"},{"type":"function","title":"wxBitmapButton.create/4","doc":"","ref":"wxBitmapButton.html#create/4"},{"type":"function","title":"wxBitmapButton.create/5","doc":"Button creation function for two-step creation.\n\nFor more details, see `new/4`.","ref":"wxBitmapButton.html#create/5"},{"type":"function","title":"wxBitmapButton.destroy/1","doc":"Destroys the object","ref":"wxBitmapButton.html#destroy/1"},{"type":"function","title":"wxBitmapButton.new/0","doc":"Default ctor.","ref":"wxBitmapButton.html#new/0"},{"type":"function","title":"wxBitmapButton.new/3","doc":"","ref":"wxBitmapButton.html#new/3"},{"type":"function","title":"wxBitmapButton.new/4","doc":"Constructor, creating and showing a button.\n\nRemark: The bitmap parameter is normally the only bitmap you need to provide, and\nwxWidgets will draw the button correctly in its different states. If you want more\ncontrol, call any of the functions `SetBitmapPressed()` (not implemented in wx), `wxButton:setBitmapFocus/2`, `wxButton:setBitmapDisabled/2`.\n\nSee: `create/5`","ref":"wxBitmapButton.html#new/4"},{"type":"function","title":"wxBitmapButton.newCloseButton/2","doc":"Helper function creating a standard-looking \"Close\" button.\n\nTo get the best results, platform-specific code may need to be used to create a small,\ntitle bar-like \"Close\" button. This function is provided to avoid the need to test for the\ncurrent platform and creates the button with as native look as possible.\n\nReturn: The new button.\n\nSince: 2.9.5","ref":"wxBitmapButton.html#newCloseButton/2"},{"type":"type","title":"wxBitmapButton.wxBitmapButton/0","doc":"","ref":"wxBitmapButton.html#t:wxBitmapButton/0"},{"type":"module","title":"wxBitmapDataObject","doc":"`m:wxBitmapDataObject` is a specialization of `m:wxDataObject` for bitmap data.\n\nIt can be used without change to paste data into the `m:wxClipboard` or a `wxDropSource`\n(not implemented in wx). A user may wish to derive a new class from this class for\nproviding a bitmap on-demand in order to minimize memory consumption when offering data in\nseveral formats, such as a bitmap and GIF.\n\nThis class may be used as is, but `getBitmap/1` may be overridden to increase efficiency.\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* `m:wxDataObject`\n\n* `m:wxFileDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxBitmapDataObject](https://docs.wxwidgets.org/3.2/classwx_bitmap_data_object.html)","ref":"wxBitmapDataObject.html"},{"type":"function","title":"wxBitmapDataObject.destroy/1","doc":"Destroys the object","ref":"wxBitmapDataObject.html#destroy/1"},{"type":"function","title":"wxBitmapDataObject.getBitmap/1","doc":"Returns the bitmap associated with the data object.\n\nYou may wish to override this method when offering data on-demand, but this is not\nrequired by wxWidgets' internals. Use this method to get data in bitmap form from the `m:wxClipboard`.","ref":"wxBitmapDataObject.html#getBitmap/1"},{"type":"function","title":"wxBitmapDataObject.new/0","doc":"","ref":"wxBitmapDataObject.html#new/0"},{"type":"function","title":"wxBitmapDataObject.new/1","doc":"Constructor, optionally passing a bitmap (otherwise use `setBitmap/2` later).","ref":"wxBitmapDataObject.html#new/1"},{"type":"function","title":"wxBitmapDataObject.setBitmap/2","doc":"Sets the bitmap associated with the data object.\n\nThis method is called when the data object receives data. Usually there will be no reason\nto override this function.","ref":"wxBitmapDataObject.html#setBitmap/2"},{"type":"type","title":"wxBitmapDataObject.wxBitmapDataObject/0","doc":"","ref":"wxBitmapDataObject.html#t:wxBitmapDataObject/0"},{"type":"module","title":"wxBookCtrlBase","doc":"A book control is a convenient way of displaying multiple pages of information, displayed\none page at a time.\n\nwxWidgets has five variants of this control:\n\n* `m:wxChoicebook`: controlled by a `m:wxChoice`\n\n* `m:wxListbook`: controlled by a `m:wxListCtrl`\n\n* `m:wxNotebook`: uses a row of tabs\n\n* `m:wxTreebook`: controlled by a `m:wxTreeCtrl`\n\n* `m:wxToolbook`: controlled by a `m:wxToolBar`\n\nThis abstract class is the parent of all these book controls, and provides their basic\ninterface. This is a pure virtual class so you cannot allocate it directly.\n\nSee: [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxBookCtrlBase](https://docs.wxwidgets.org/3.2/classwx_book_ctrl_base.html)","ref":"wxBookCtrlBase.html"},{"type":"function","title":"wxBookCtrlBase.addPage/3","doc":"","ref":"wxBookCtrlBase.html#addPage/3"},{"type":"function","title":"wxBookCtrlBase.addPage/4","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","ref":"wxBookCtrlBase.html#addPage/4"},{"type":"function","title":"wxBookCtrlBase.advanceSelection/1","doc":"","ref":"wxBookCtrlBase.html#advanceSelection/1"},{"type":"function","title":"wxBookCtrlBase.advanceSelection/2","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","ref":"wxBookCtrlBase.html#advanceSelection/2"},{"type":"function","title":"wxBookCtrlBase.changeSelection/2","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","ref":"wxBookCtrlBase.html#changeSelection/2"},{"type":"function","title":"wxBookCtrlBase.deleteAllPages/1","doc":"Deletes all pages.","ref":"wxBookCtrlBase.html#deleteAllPages/1"},{"type":"function","title":"wxBookCtrlBase.deletePage/2","doc":"Deletes the specified page, and the associated window.\n\nThe call to this function generates the page changing events when deleting the currently\nselected page or a page preceding it in the index order, but it does `not` send any events\nwhen deleting the last page: while in this case the selection also changes, it becomes\ninvalid and for compatibility reasons the control never generates events with the invalid\nselection index.","ref":"wxBookCtrlBase.html#deletePage/2"},{"type":"function","title":"wxBookCtrlBase.getCurrentPage/1","doc":"Returns the currently selected page or NULL.","ref":"wxBookCtrlBase.html#getCurrentPage/1"},{"type":"function","title":"wxBookCtrlBase.getPage/2","doc":"Returns the window at the given page position.","ref":"wxBookCtrlBase.html#getPage/2"},{"type":"function","title":"wxBookCtrlBase.getPageCount/1","doc":"Returns the number of pages in the control.","ref":"wxBookCtrlBase.html#getPageCount/1"},{"type":"function","title":"wxBookCtrlBase.getPageText/2","doc":"Returns the string for the given page.","ref":"wxBookCtrlBase.html#getPageText/2"},{"type":"function","title":"wxBookCtrlBase.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","ref":"wxBookCtrlBase.html#getSelection/1"},{"type":"function","title":"wxBookCtrlBase.hitTest/2","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","ref":"wxBookCtrlBase.html#hitTest/2"},{"type":"function","title":"wxBookCtrlBase.insertPage/4","doc":"","ref":"wxBookCtrlBase.html#insertPage/4"},{"type":"function","title":"wxBookCtrlBase.insertPage/5","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","ref":"wxBookCtrlBase.html#insertPage/5"},{"type":"function","title":"wxBookCtrlBase.removePage/2","doc":"Deletes the specified page, without deleting the associated window.\n\nSee `deletePage/2` for a note about the events generated by this function.","ref":"wxBookCtrlBase.html#removePage/2"},{"type":"function","title":"wxBookCtrlBase.setPageText/3","doc":"Sets the text for the given page.","ref":"wxBookCtrlBase.html#setPageText/3"},{"type":"function","title":"wxBookCtrlBase.setSelection/2","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","ref":"wxBookCtrlBase.html#setSelection/2"},{"type":"type","title":"wxBookCtrlBase.wxBookCtrlBase/0","doc":"","ref":"wxBookCtrlBase.html#t:wxBookCtrlBase/0"},{"type":"module","title":"wxBookCtrlEvent","doc":"This class represents the events generated by book controls (`m:wxNotebook`, `m:wxListbook`, `m:wxChoicebook`, `m:wxTreebook`, `m:wxAuiNotebook`).\n\nThe PAGE_CHANGING events are sent before the current page is changed. It allows the\nprogram to examine the current page (which can be retrieved with `getOldSelection/1`) and to veto the page\nchange by calling `wxNotifyEvent:veto/1` if, for example, the current values in the controls of the old page are invalid.\n\nThe PAGE_CHANGED events are sent after the page has been changed and the program cannot\nveto it any more, it just informs it about the page change.\n\nTo summarize, if the program is interested in validating the page values before allowing\nthe user to change it, it should process the PAGE_CHANGING event, otherwise PAGE_CHANGED\nis probably enough. In any case, it is probably unnecessary to process both events at once.\n\nSee:\n* `m:wxNotebook`\n\n* `m:wxListbook`\n\n* `m:wxChoicebook`\n\n* `m:wxTreebook`\n\n* `m:wxToolbook`\n\n* `m:wxAuiNotebook`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxBookCtrlEvent](https://docs.wxwidgets.org/3.2/classwx_book_ctrl_event.html)","ref":"wxBookCtrlEvent.html"},{"type":"function","title":"wxBookCtrlEvent.getOldSelection/1","doc":"Returns the page that was selected before the change, `wxNOT\\_FOUND` if none was\nselected.","ref":"wxBookCtrlEvent.html#getOldSelection/1"},{"type":"function","title":"wxBookCtrlEvent.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: under Windows, `getSelection/1` will return the same value as `getOldSelection/1` when called from the `EVT_BOOKCTRL_PAGE_CHANGING`\nhandler and not the page which is going to be selected.","ref":"wxBookCtrlEvent.html#getSelection/1"},{"type":"function","title":"wxBookCtrlEvent.setOldSelection/2","doc":"Sets the id of the page selected before the change.","ref":"wxBookCtrlEvent.html#setOldSelection/2"},{"type":"function","title":"wxBookCtrlEvent.setSelection/2","doc":"Sets the selection member variable.","ref":"wxBookCtrlEvent.html#setSelection/2"},{"type":"type","title":"wxBookCtrlEvent.wxBookCtrl/0","doc":"","ref":"wxBookCtrlEvent.html#t:wxBookCtrl/0"},{"type":"type","title":"wxBookCtrlEvent.wxBookCtrlEvent/0","doc":"","ref":"wxBookCtrlEvent.html#t:wxBookCtrlEvent/0"},{"type":"type","title":"wxBookCtrlEvent.wxBookCtrlEventType/0","doc":"","ref":"wxBookCtrlEvent.html#t:wxBookCtrlEventType/0"},{"type":"module","title":"wxBoxSizer","doc":"The basic idea behind a box sizer is that windows will most often be laid out in rather\nsimple basic geometry, typically in a row or a column or several hierarchies of either.\n\nFor more information, please see overview_sizer_box.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxBoxSizer](https://docs.wxwidgets.org/3.2/classwx_box_sizer.html)","ref":"wxBoxSizer.html"},{"type":"function","title":"wxBoxSizer.destroy/1","doc":"Destroys the object","ref":"wxBoxSizer.html#destroy/1"},{"type":"function","title":"wxBoxSizer.getOrientation/1","doc":"Returns the orientation of the box sizer, either wxVERTICAL or wxHORIZONTAL.","ref":"wxBoxSizer.html#getOrientation/1"},{"type":"function","title":"wxBoxSizer.new/1","doc":"Constructor for a `m:wxBoxSizer`.\n\n`orient` may be either of wxVERTICAL or wxHORIZONTAL for creating either a column sizer\nor a row sizer.","ref":"wxBoxSizer.html#new/1"},{"type":"type","title":"wxBoxSizer.wxBoxSizer/0","doc":"","ref":"wxBoxSizer.html#t:wxBoxSizer/0"},{"type":"module","title":"wxBrush","doc":"A brush is a drawing tool for filling in areas.\n\nIt is used for painting the background of rectangles, ellipses, etc. It has a colour and\na style.\n\nOn a monochrome display, wxWidgets shows all brushes as white unless the colour is really black.\n\nDo not initialize objects on the stack before the program commences, since other required\nstructures may not have been set up yet. Instead, define global pointers to objects and\ncreate them in `wxApp::OnInit` (not implemented in wx) or when required.\n\nAn application may wish to create brushes with different characteristics dynamically, and\nthere is the consequent danger that a large number of duplicate brushes will be created.\nTherefore an application may wish to get a pointer to a brush by using the global list of\nbrushes ?wxTheBrushList, and calling the member function `wxBrushList::FindOrCreateBrush()`\n(not implemented in wx).\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullBrush\n\n* ?wxBLACK\\_BRUSH\n\n* ?wxBLUE\\_BRUSH\n\n* ?wxCYAN\\_BRUSH\n\n* ?wxGREEN\\_BRUSH\n\n* ?wxYELLOW\\_BRUSH\n\n* ?wxGREY\\_BRUSH\n\n* ?wxLIGHT\\_GREY\\_BRUSH\n\n* ?wxMEDIUM\\_GREY\\_BRUSH\n\n* ?wxRED\\_BRUSH\n\n* ?wxTRANSPARENT\\_BRUSH\n\n* ?wxWHITE\\_BRUSH\n\nSee:\n* `m:wxDC`\n\n* `wxDC:setBrush/2`\n\nwxWidgets docs: [wxBrush](https://docs.wxwidgets.org/3.2/classwx_brush.html)","ref":"wxBrush.html"},{"type":"function","title":"wxBrush.destroy/1","doc":"Destroys the object","ref":"wxBrush.html#destroy/1"},{"type":"function","title":"wxBrush.getColour/1","doc":"Returns a reference to the brush colour.\n\nSee: `setColour/4`","ref":"wxBrush.html#getColour/1"},{"type":"function","title":"wxBrush.getStipple/1","doc":"Gets a pointer to the stipple bitmap.\n\nIf the brush does not have a `wxBRUSHSTYLE_STIPPLE` style, this bitmap may be non-NULL\nbut uninitialised (i.e. `m:wxBitmap`:`isOk/1` returns false).\n\nSee: `setStipple/2`","ref":"wxBrush.html#getStipple/1"},{"type":"function","title":"wxBrush.getStyle/1","doc":"Returns the brush style, one of the ?wxBrushStyle values.\n\nSee:\n* `setStyle/2`\n\n* `setColour/4`\n\n* `setStipple/2`","ref":"wxBrush.html#getStyle/1"},{"type":"function","title":"wxBrush.isHatch/1","doc":"Returns true if the style of the brush is any of hatched fills.\n\nSee: `getStyle/1`","ref":"wxBrush.html#isHatch/1"},{"type":"function","title":"wxBrush.isOk/1","doc":"Returns true if the brush is initialised.\n\nNotice that an uninitialized brush object can't be queried for any brush properties and\nall calls to the accessor methods on it will result in an assert failure.","ref":"wxBrush.html#isOk/1"},{"type":"function","title":"wxBrush.new/0","doc":"Default constructor.\n\nThe brush will be uninitialised, and `m:wxBrush`:`isOk/1` will return false.","ref":"wxBrush.html#new/0"},{"type":"function","title":"wxBrush.new/1","doc":"Copy constructor, uses reference counting.","ref":"wxBrush.html#new/1"},{"type":"function","title":"wxBrush.new/2","doc":"Constructs a brush from a colour object and `style`.","ref":"wxBrush.html#new/2"},{"type":"function","title":"wxBrush.setColour/2","doc":"Sets the brush colour using red, green and blue values.\n\nSee: `getColour/1`","ref":"wxBrush.html#setColour/2"},{"type":"function","title":"wxBrush.setColour/4","doc":"","ref":"wxBrush.html#setColour/4"},{"type":"function","title":"wxBrush.setStipple/2","doc":"Sets the stipple bitmap.\n\nRemark: The style will be set to `wxBRUSHSTYLE_STIPPLE`, unless the bitmap has a mask\nassociated to it, in which case the style will be set to `wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE`.\n\nSee: `m:wxBitmap`","ref":"wxBrush.html#setStipple/2"},{"type":"function","title":"wxBrush.setStyle/2","doc":"Sets the brush style.\n\nSee: `getStyle/1`","ref":"wxBrush.html#setStyle/2"},{"type":"type","title":"wxBrush.wxBrush/0","doc":"","ref":"wxBrush.html#t:wxBrush/0"},{"type":"module","title":"wxBufferedDC","doc":"This class provides a simple way to avoid flicker: when drawing on it, everything is in\nfact first drawn on an in-memory buffer (a `m:wxBitmap`) and then copied to the screen,\nusing the associated `m:wxDC`, only once, when this object is destroyed.\n\n`m:wxBufferedDC` itself is typically associated with `m:wxClientDC`, if you want to use\nit in your `EVT_PAINT` handler, you should look at `m:wxBufferedPaintDC` instead.\n\nWhen used like this, a valid `DC` must be specified in the constructor while the `buffer`\nbitmap doesn't have to be explicitly provided, by default this class will allocate the\nbitmap of required size itself. However using a dedicated bitmap can speed up the\nredrawing process by eliminating the repeated creation and destruction of a possibly big\nbitmap. Otherwise, `m:wxBufferedDC` can be used in the same way as any other device context.\n\nAnother possible use for `m:wxBufferedDC` is to use it to maintain a backing store for\nthe window contents. In this case, the associated `DC` may be NULL but a valid backing\nstore bitmap should be specified.\n\nFinally, please note that GTK+ 2.0 as well as macOS provide double buffering themselves\nnatively. You can either use `wxWindow:isDoubleBuffered/1` to determine whether you need to use buffering or not, or\nuse `wxAutoBufferedPaintDC` (not implemented in wx) to avoid needless double buffering on\nthe systems which already do it automatically.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxBufferedPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxMemoryDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxBufferedDC](https://docs.wxwidgets.org/3.2/classwx_buffered_d_c.html)","ref":"wxBufferedDC.html"},{"type":"function","title":"wxBufferedDC.destroy/1","doc":"Destroys the object","ref":"wxBufferedDC.html#destroy/1"},{"type":"function","title":"wxBufferedDC.init/2","doc":"","ref":"wxBufferedDC.html#init/2"},{"type":"function","title":"wxBufferedDC.init/3","doc":"","ref":"wxBufferedDC.html#init/3"},{"type":"function","title":"wxBufferedDC.init/4","doc":"Initializes the object created using the default constructor.\n\nPlease see the constructors for parameter details.","ref":"wxBufferedDC.html#init/4"},{"type":"function","title":"wxBufferedDC.new/0","doc":"Default constructor.\n\nYou must call one of the `init/4` methods later in order to use the device context.","ref":"wxBufferedDC.html#new/0"},{"type":"function","title":"wxBufferedDC.new/1","doc":"","ref":"wxBufferedDC.html#new/1"},{"type":"function","title":"wxBufferedDC.new/2","doc":"Creates a buffer for the provided dc.\n\n`init/4` must not be called when using this constructor.","ref":"wxBufferedDC.html#new/2"},{"type":"function","title":"wxBufferedDC.new/3","doc":"Creates a buffer for the provided `dc`.\n\n`init/4` must not be called when using this constructor.","ref":"wxBufferedDC.html#new/3"},{"type":"type","title":"wxBufferedDC.wxBufferedDC/0","doc":"","ref":"wxBufferedDC.html#t:wxBufferedDC/0"},{"type":"module","title":"wxBufferedPaintDC","doc":"This is a subclass of `m:wxBufferedDC` which can be used inside of an `EVT\\_PAINT()`\nevent handler to achieve double-buffered drawing.\n\nJust use this class instead of `m:wxPaintDC` and make sure `wxWindow:setBackgroundStyle/2` is called with\nwxBG_STYLE_PAINT somewhere in the class initialization code, and that's all you have to do\nto (mostly) avoid flicker. The only thing to watch out for is that if you are using this\nclass together with `wxScrolled` (not implemented in wx), you probably do `not` want to\ncall `wxScrolledWindow:prepareDC/2` on it as it already does this internally for the real underlying `m:wxPaintDC`.\n\nSee:\n* `m:wxDC`\n\n* `m:wxBufferedDC`\n\n* `m:wxPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBufferedDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxBufferedPaintDC](https://docs.wxwidgets.org/3.2/classwx_buffered_paint_d_c.html)","ref":"wxBufferedPaintDC.html"},{"type":"function","title":"wxBufferedPaintDC.destroy/1","doc":"Destroys the object","ref":"wxBufferedPaintDC.html#destroy/1"},{"type":"function","title":"wxBufferedPaintDC.new/1","doc":"","ref":"wxBufferedPaintDC.html#new/1"},{"type":"function","title":"wxBufferedPaintDC.new/2","doc":"","ref":"wxBufferedPaintDC.html#new/2"},{"type":"function","title":"wxBufferedPaintDC.new/3","doc":"As with `m:wxBufferedDC`, you may either provide the bitmap to be used for buffering or\nlet this object create one internally (in the latter case, the size of the client part of\nthe window is used).\n\nPass wxBUFFER_CLIENT_AREA for the `style` parameter to indicate that just the client area\nof the window is buffered, or wxBUFFER_VIRTUAL_AREA to indicate that the buffer bitmap\ncovers the virtual area.","ref":"wxBufferedPaintDC.html#new/3"},{"type":"type","title":"wxBufferedPaintDC.wxBufferedPaintDC/0","doc":"","ref":"wxBufferedPaintDC.html#t:wxBufferedPaintDC/0"},{"type":"module","title":"wxButton","doc":"A button is a control that contains a text string, and is one of the most common elements\nof a GUI.\n\nIt may be placed on a `m:wxDialog` or on a `m:wxPanel` panel, or indeed on almost any\nother window.\n\nBy default, i.e. if none of the alignment styles are specified, the label is centered\nboth horizontally and vertically. If the button has both a label and a bitmap, the\nalignment styles above specify the location of the rectangle combining both the label and\nthe bitmap and the bitmap position set with `wxButton::SetBitmapPosition()` (not\nimplemented in wx) defines the relative position of the bitmap with respect to the label\n(however currently non-default alignment combinations are not implemented on all platforms).\n\nSince version 2.9.1 `m:wxButton` supports showing both text and an image (currently only\nwhen using wxMSW, wxGTK or wxOSX/Cocoa ports), see `SetBitmap()` (not implemented in wx)\nand `setBitmapLabel/2`, `setBitmapDisabled/2` &c methods. In the previous wxWidgets versions this functionality was only\navailable in (the now trivial) `m:wxBitmapButton` class which was only capable of showing\nan image without text.\n\nA button may have either a single image for all states or different images for the\nfollowing states (different images are not currently supported under macOS where the\nnormal image is used for all states):\n\n* `normal:` the default state\n\n* `disabled:` bitmap shown when the button is disabled.\n\n* `pressed:` bitmap shown when the button is pushed (e.g. while the user keeps the mouse\nbutton pressed on it)\n\n* `focus:` bitmap shown when the button has keyboard focus (but is not pressed as in this\ncase the button is in the pressed state)\n\n* `current:` bitmap shown when the mouse is over the button (but it is not pressed although\nit may have focus). Notice that if current bitmap is not specified but the current\nplatform UI uses hover images for the buttons (such as Windows or GTK+), then the focus\nbitmap is used for hover state as well. This makes it possible to set focus bitmap only to\nget reasonably good behaviour on all platforms.\n\nAll of the bitmaps must be of the same size and the normal bitmap must be set first (to\na valid bitmap), before setting any other ones. Also, if the size of the bitmaps is\nchanged later, you need to change the size of the normal bitmap before setting any other\nbitmaps with the new size (and you do need to reset all of them as their original values\ncan be lost when the normal bitmap size changes).\n\nThe position of the image inside the button be configured using `SetBitmapPosition()`\n(not implemented in wx). By default the image is on the left of the text.\n\nPlease also notice that GTK+ uses a global setting called `gtk-button-images` to\ndetermine if the images should be shown in the buttons at all. If it is off (which is the\ncase in e.g. Gnome 2.28 by default), no images will be shown, consistently with the native behaviour.","ref":"wxButton.html"},{"type":"module","title":"Styles - wxButton","doc":"This class supports the following styles:\n\n* wxBU_LEFT: Left-justifies the label. Windows and GTK+ only.\n\n* wxBU_TOP: Aligns the label to the top of the button. Windows and GTK+ only.\n\n* wxBU_RIGHT: Right-justifies the bitmap label. Windows and GTK+ only.\n\n* wxBU_BOTTOM: Aligns the label to the bottom of the button. Windows and GTK+ only.\n\n* wxBU_EXACTFIT: By default, all buttons are made of at least the standard button size,\neven if their contents is small enough to fit into a smaller size. This is done for\nconsistency as most platforms use buttons of the same size in the native dialogs, but can\nbe overridden by specifying this flag. If it is given, the button will be made just big\nenough for its contents. Notice that under MSW the button will still have at least the\nstandard height, even with this style, if it has a non-empty label.\n\n* wxBU_NOTEXT: Disables the display of the text label in the button even if it has one or\nits id is one of the standard stock ids with an associated label: without using this style\na button which is only supposed to show a bitmap but uses a standard id would display a\nlabel too.\n\n* wxBORDER_NONE: Creates a button without border. This is currently implemented in MSW,\nGTK2 and OSX/Cocoa.\n\nSee: `m:wxBitmapButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxButton](https://docs.wxwidgets.org/3.2/classwx_button.html)","ref":"wxButton.html#module-styles"},{"type":"module","title":"Events - wxButton","doc":"Event types emitted from this class:\n\n* [`command_button_clicked`](`m:wxCommandEvent`)","ref":"wxButton.html#module-events"},{"type":"function","title":"wxButton.create/3","doc":"","ref":"wxButton.html#create/3"},{"type":"function","title":"wxButton.create/4","doc":"Button creation function for two-step creation.\n\nFor more details, see `new/3`.","ref":"wxButton.html#create/4"},{"type":"function","title":"wxButton.destroy/1","doc":"Destroys the object","ref":"wxButton.html#destroy/1"},{"type":"function","title":"wxButton.getBitmapDisabled/1","doc":"Returns the bitmap for the disabled state, which may be invalid.\n\nSee: `setBitmapDisabled/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#getBitmapDisabled/1"},{"type":"function","title":"wxButton.getBitmapFocus/1","doc":"Returns the bitmap for the focused state, which may be invalid.\n\nSee: `setBitmapFocus/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#getBitmapFocus/1"},{"type":"function","title":"wxButton.getBitmapLabel/1","doc":"Returns the bitmap for the normal state.\n\nThis is exactly the same as `GetBitmap()` (not implemented in wx) but uses a name\nbackwards-compatible with `m:wxBitmapButton`.\n\nSee: `setBitmapLabel/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#getBitmapLabel/1"},{"type":"function","title":"wxButton.getDefaultSize/0","doc":"Returns the default size for the buttons.\n\nIt is advised to make all the dialog buttons of the same size and this function allows\nretrieving the (platform, and current font dependent) size which should be the best suited\nfor this.\n\nThe optional `win` argument is new since wxWidgets 3.1.3 and allows to get a per-monitor\nDPI specific size.","ref":"wxButton.html#getDefaultSize/0"},{"type":"function","title":"wxButton.getDefaultSize/1","doc":"","ref":"wxButton.html#getDefaultSize/1"},{"type":"function","title":"wxButton.new/0","doc":"Default ctor.","ref":"wxButton.html#new/0"},{"type":"function","title":"wxButton.new/2","doc":"","ref":"wxButton.html#new/2"},{"type":"function","title":"wxButton.new/3","doc":"Constructor, creating and showing a button.\n\nThe preferred way to create standard buttons is to use default value of `label`. If no\nlabel is supplied and `id` is one of standard IDs from this list, a standard label will be\nused. In other words, if you use a predefined `wxID_XXX` constant, just omit the label\ncompletely rather than specifying it. In particular, help buttons (the ones with `id` of `wxID_HELP`)\nunder macOS can't display any label at all and while `m:wxButton` will detect if the\nstandard \"Help\" label is used and ignore it, using any other label will prevent the button\nfrom correctly appearing as a help button and so should be avoided.\n\nIn addition to that, the button will be decorated with stock icons under GTK+ 2.\n\nSee: `create/4`","ref":"wxButton.html#new/3"},{"type":"function","title":"wxButton.setBitmapDisabled/2","doc":"Sets the bitmap for the disabled button appearance.\n\nIf `bitmap` is invalid, the disabled bitmap is set to the automatically generated greyed\nout version of the normal bitmap, i.e. the same bitmap as is used by default if this\nmethod is not called at all. Use `SetBitmap()` (not implemented in wx) with an invalid\nbitmap to remove the bitmap completely (for all states).\n\nSee:\n* `getBitmapDisabled/1`\n\n* `setBitmapLabel/2`\n\n* `setBitmapFocus/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#setBitmapDisabled/2"},{"type":"function","title":"wxButton.setBitmapFocus/2","doc":"Sets the bitmap for the button appearance when it has the keyboard focus.\n\nIf `bitmap` is invalid, the normal bitmap will be used in the focused state.\n\nSee:\n* `getBitmapFocus/1`\n\n* `setBitmapLabel/2`\n\n* `setBitmapDisabled/2`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#setBitmapFocus/2"},{"type":"function","title":"wxButton.setBitmapLabel/2","doc":"Sets the bitmap label for the button.\n\nRemark: This is the bitmap used for the unselected state, and for all other states if no\nother bitmaps are provided.\n\nSee: `getBitmapLabel/1`\n\nSince: 2.9.1 (available in `m:wxBitmapButton` only in previous versions)","ref":"wxButton.html#setBitmapLabel/2"},{"type":"function","title":"wxButton.setDefault/1","doc":"This sets the button to be the default item in its top-level window (e.g.\n\nthe panel or the dialog box containing it).\n\nAs normal, pressing return causes the default button to be depressed when the return key\nis pressed.\n\nSee also `wxWindow:setFocus/1` which sets the keyboard focus for windows and text panel items, and `wxTopLevelWindow::SetDefaultItem()`\n(not implemented in wx).\n\nRemark: Under Windows, only dialog box buttons respond to this function.\n\nReturn: the old default item (possibly NULL)","ref":"wxButton.html#setDefault/1"},{"type":"function","title":"wxButton.setLabel/2","doc":"Sets the string label for the button.","ref":"wxButton.html#setLabel/2"},{"type":"type","title":"wxButton.wxButton/0","doc":"","ref":"wxButton.html#t:wxButton/0"},{"type":"module","title":"wxCalendarCtrl","doc":"The calendar control allows the user to pick a date.\n\nThe user can move the current selection using the keyboard and select the date\n(generating `EVT_CALENDAR` event) by pressing ` ` or double clicking it.\n\nGeneric calendar has advanced possibilities for the customization of its display,\ndescribed below. If you want to use these possibilities on every platform, use\nwxGenericCalendarCtrl instead of `m:wxCalendarCtrl`.\n\nAll global settings (such as colours and fonts used) can, of course, be changed. But\nalso, the display style for each day in the month can be set independently using `m:wxCalendarDateAttr`\nclass.\n\nAn item without custom attributes is drawn with the default colours and font and without\nborder, but setting custom attributes with `setAttr/3` allows modifying its appearance. Just create a\ncustom attribute object and set it for the day you want to be displayed specially (note\nthat the control will take ownership of the pointer, i.e. it will delete it itself). A day\nmay be marked as being a holiday, even if it is not recognized as one by `wx_datetime()` using the `wxCalendarDateAttr:setHoliday/2` method.\n\nAs the attributes are specified for each day, they may change when the month is changed,\nso you will often want to update them in `EVT_CALENDAR_PAGE_CHANGED` event handler.\n\nIf neither the `wxCAL_SUNDAY_FIRST` or `wxCAL_MONDAY_FIRST` style is given, the first day\nof the week is determined from operating system's settings, if possible. The native wxGTK\ncalendar chooses the first weekday based on locale, and these styles have no effect on it.","ref":"wxCalendarCtrl.html"},{"type":"module","title":"Styles - wxCalendarCtrl","doc":"This class supports the following styles:\n\n* wxCAL_SUNDAY_FIRST: Show Sunday as the first day in the week (not in wxGTK)\n\n* wxCAL_MONDAY_FIRST: Show Monday as the first day in the week (not in wxGTK)\n\n* wxCAL_SHOW_HOLIDAYS: Highlight holidays in the calendar (only generic)\n\n* wxCAL_NO_YEAR_CHANGE: Disable the year changing (deprecated, only generic)\n\n* wxCAL_NO_MONTH_CHANGE: Disable the month (and, implicitly, the year) changing\n\n* wxCAL_SHOW_SURROUNDING_WEEKS: Show the neighbouring weeks in the previous and next months\n(only generic, always on for the native controls)\n\n* wxCAL_SEQUENTIAL_MONTH_SELECTION: Use alternative, more compact, style for the month and\nyear selection controls. (only generic)\n\n* wxCAL_SHOW_WEEK_NUMBERS: Show week numbers on the left side of the calendar. (not in\ngeneric)\n\nSee:\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_calendar)\n\n* `m:wxCalendarDateAttr`\n\n* `m:wxCalendarEvent`\n\n* `m:wxDatePickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCalendarCtrl](https://docs.wxwidgets.org/3.2/classwx_calendar_ctrl.html)","ref":"wxCalendarCtrl.html#module-styles"},{"type":"module","title":"Events - wxCalendarCtrl","doc":"Event types emitted from this class:\n\n* [`calendar_sel_changed`](`m:wxCalendarEvent`)\n\n* [`calendar_weekday_clicked`](`m:wxCalendarEvent`)","ref":"wxCalendarCtrl.html#module-events"},{"type":"function","title":"wxCalendarCtrl.create/3","doc":"","ref":"wxCalendarCtrl.html#create/3"},{"type":"function","title":"wxCalendarCtrl.create/4","doc":"Creates the control.\n\nSee `wxWindow:new/3` for the meaning of the parameters and the control overview for the possible styles.","ref":"wxCalendarCtrl.html#create/4"},{"type":"function","title":"wxCalendarCtrl.destroy/1","doc":"Destroys the object","ref":"wxCalendarCtrl.html#destroy/1"},{"type":"function","title":"wxCalendarCtrl.enableHolidayDisplay/1","doc":"","ref":"wxCalendarCtrl.html#enableHolidayDisplay/1"},{"type":"function","title":"wxCalendarCtrl.enableHolidayDisplay/2","doc":"This function should be used instead of changing `wxCAL\\_SHOW\\_HOLIDAYS` style bit\ndirectly.\n\nIt enables or disables the special highlighting of the holidays.","ref":"wxCalendarCtrl.html#enableHolidayDisplay/2"},{"type":"function","title":"wxCalendarCtrl.enableMonthChange/1","doc":"","ref":"wxCalendarCtrl.html#enableMonthChange/1"},{"type":"function","title":"wxCalendarCtrl.enableMonthChange/2","doc":"This function should be used instead of changing `wxCAL\\_NO\\_MONTH\\_CHANGE` style bit.\n\nIt allows or disallows the user to change the month interactively. Note that if the month\ncannot be changed, the year cannot be changed neither.\n\nReturn: true if the value of this option really changed or false if it was already set to\nthe requested value.","ref":"wxCalendarCtrl.html#enableMonthChange/2"},{"type":"function","title":"wxCalendarCtrl.enableYearChange/1","doc":"","ref":"wxCalendarCtrl.html#enableYearChange/1"},{"type":"function","title":"wxCalendarCtrl.enableYearChange/2","doc":"Deprecated:\n\nThis function should be used instead of changing `wxCAL_NO_YEAR_CHANGE` style bit\ndirectly. It allows or disallows the user to change the year interactively. Only in\ngeneric `m:wxCalendarCtrl`.","ref":"wxCalendarCtrl.html#enableYearChange/2"},{"type":"function","title":"wxCalendarCtrl.getAttr/2","doc":"Returns the attribute for the given date (should be in the range 1...31).\n\nThe returned pointer may be NULL. Only in generic `m:wxCalendarCtrl`.","ref":"wxCalendarCtrl.html#getAttr/2"},{"type":"function","title":"wxCalendarCtrl.getDate/1","doc":"Gets the currently selected date.","ref":"wxCalendarCtrl.html#getDate/1"},{"type":"function","title":"wxCalendarCtrl.getHeaderColourBg/1","doc":"Gets the background colour of the header part of the calendar window.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHeaderColours/3`","ref":"wxCalendarCtrl.html#getHeaderColourBg/1"},{"type":"function","title":"wxCalendarCtrl.getHeaderColourFg/1","doc":"Gets the foreground colour of the header part of the calendar window.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHeaderColours/3`","ref":"wxCalendarCtrl.html#getHeaderColourFg/1"},{"type":"function","title":"wxCalendarCtrl.getHighlightColourBg/1","doc":"Gets the background highlight colour.\n\nOnly in generic `m:wxCalendarCtrl`.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHighlightColours/3`","ref":"wxCalendarCtrl.html#getHighlightColourBg/1"},{"type":"function","title":"wxCalendarCtrl.getHighlightColourFg/1","doc":"Gets the foreground highlight colour.\n\nOnly in generic `m:wxCalendarCtrl`.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and always\nreturns `wxNullColour` in the native versions.\n\nSee: `setHighlightColours/3`","ref":"wxCalendarCtrl.html#getHighlightColourFg/1"},{"type":"function","title":"wxCalendarCtrl.getHolidayColourBg/1","doc":"Return the background colour currently used for holiday highlighting.\n\nOnly useful with generic `m:wxCalendarCtrl` as native versions currently don't support\nholidays display at all and always return `wxNullColour`.\n\nSee: `setHolidayColours/3`","ref":"wxCalendarCtrl.html#getHolidayColourBg/1"},{"type":"function","title":"wxCalendarCtrl.getHolidayColourFg/1","doc":"Return the foreground colour currently used for holiday highlighting.\n\nOnly useful with generic `m:wxCalendarCtrl` as native versions currently don't support\nholidays display at all and always return `wxNullColour`.\n\nSee: `setHolidayColours/3`","ref":"wxCalendarCtrl.html#getHolidayColourFg/1"},{"type":"function","title":"wxCalendarCtrl.hitTest/2","doc":"Returns one of wxCalendarHitTestResult constants and fills either `date` or `wd` pointer\nwith the corresponding value depending on the hit test code.\n\nNot implemented in wxGTK currently.","ref":"wxCalendarCtrl.html#hitTest/2"},{"type":"function","title":"wxCalendarCtrl.new/0","doc":"Default constructor.","ref":"wxCalendarCtrl.html#new/0"},{"type":"function","title":"wxCalendarCtrl.new/2","doc":"","ref":"wxCalendarCtrl.html#new/2"},{"type":"function","title":"wxCalendarCtrl.new/3","doc":"Does the same as `create/4` method.","ref":"wxCalendarCtrl.html#new/3"},{"type":"function","title":"wxCalendarCtrl.resetAttr/2","doc":"Clears any attributes associated with the given day (in the range 1...31).\n\nOnly in generic `m:wxCalendarCtrl`.","ref":"wxCalendarCtrl.html#resetAttr/2"},{"type":"function","title":"wxCalendarCtrl.setAttr/3","doc":"Associates the attribute with the specified date (in the range 1...31).\n\nIf the pointer is NULL, the items attribute is cleared. Only in generic `m:wxCalendarCtrl`.","ref":"wxCalendarCtrl.html#setAttr/3"},{"type":"function","title":"wxCalendarCtrl.setDate/2","doc":"Sets the current date.\n\nThe `date` parameter must be valid and in the currently valid range as set by `SetDateRange()`\n(not implemented in wx), otherwise the current date is not changed and the function\nreturns false and, additionally, triggers an assertion failure if the date is invalid.","ref":"wxCalendarCtrl.html#setDate/2"},{"type":"function","title":"wxCalendarCtrl.setHeaderColours/3","doc":"Set the colours used for painting the weekdays at the top of the control.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and does nothing\nin the native versions.","ref":"wxCalendarCtrl.html#setHeaderColours/3"},{"type":"function","title":"wxCalendarCtrl.setHighlightColours/3","doc":"Set the colours to be used for highlighting the currently selected date.\n\nThis method is currently only implemented in generic `m:wxCalendarCtrl` and does nothing\nin the native versions.","ref":"wxCalendarCtrl.html#setHighlightColours/3"},{"type":"function","title":"wxCalendarCtrl.setHoliday/2","doc":"Marks the specified day as being a holiday in the current month.\n\nThis method is only implemented in the generic version of the control and does nothing in\nthe native ones.","ref":"wxCalendarCtrl.html#setHoliday/2"},{"type":"function","title":"wxCalendarCtrl.setHolidayColours/3","doc":"Sets the colours to be used for the holidays highlighting.\n\nThis method is only implemented in the generic version of the control and does nothing in\nthe native ones. It should also only be called if the window style includes `wxCAL_SHOW_HOLIDAYS`\nflag or `enableHolidayDisplay/2` had been called.","ref":"wxCalendarCtrl.html#setHolidayColours/3"},{"type":"type","title":"wxCalendarCtrl.wxCalendarCtrl/0","doc":"","ref":"wxCalendarCtrl.html#t:wxCalendarCtrl/0"},{"type":"module","title":"wxCalendarDateAttr","doc":"`m:wxCalendarDateAttr` is a custom attributes for a calendar date.\n\nThe objects of this class are used with `m:wxCalendarCtrl`.\n\nSee: `m:wxCalendarCtrl`\n\nwxWidgets docs: [wxCalendarDateAttr](https://docs.wxwidgets.org/3.2/classwx_calendar_date_attr.html)","ref":"wxCalendarDateAttr.html"},{"type":"function","title":"wxCalendarDateAttr.destroy/1","doc":"Destroys the object","ref":"wxCalendarDateAttr.html#destroy/1"},{"type":"function","title":"wxCalendarDateAttr.getBackgroundColour/1","doc":"Returns the background colour set for the calendar date.","ref":"wxCalendarDateAttr.html#getBackgroundColour/1"},{"type":"function","title":"wxCalendarDateAttr.getBorder/1","doc":"Returns the border set for the calendar date.","ref":"wxCalendarDateAttr.html#getBorder/1"},{"type":"function","title":"wxCalendarDateAttr.getBorderColour/1","doc":"Returns the border colour set for the calendar date.","ref":"wxCalendarDateAttr.html#getBorderColour/1"},{"type":"function","title":"wxCalendarDateAttr.getFont/1","doc":"Returns the font set for the calendar date.","ref":"wxCalendarDateAttr.html#getFont/1"},{"type":"function","title":"wxCalendarDateAttr.getTextColour/1","doc":"Returns the text colour set for the calendar date.","ref":"wxCalendarDateAttr.html#getTextColour/1"},{"type":"function","title":"wxCalendarDateAttr.hasBackgroundColour/1","doc":"Returns true if a non-default text background colour is set.","ref":"wxCalendarDateAttr.html#hasBackgroundColour/1"},{"type":"function","title":"wxCalendarDateAttr.hasBorder/1","doc":"Returns true if a non-default (i.e. any) border is set.","ref":"wxCalendarDateAttr.html#hasBorder/1"},{"type":"function","title":"wxCalendarDateAttr.hasBorderColour/1","doc":"Returns true if a non-default border colour is set.","ref":"wxCalendarDateAttr.html#hasBorderColour/1"},{"type":"function","title":"wxCalendarDateAttr.hasFont/1","doc":"Returns true if a non-default font is set.","ref":"wxCalendarDateAttr.html#hasFont/1"},{"type":"function","title":"wxCalendarDateAttr.hasTextColour/1","doc":"Returns true if a non-default text foreground colour is set.","ref":"wxCalendarDateAttr.html#hasTextColour/1"},{"type":"function","title":"wxCalendarDateAttr.isHoliday/1","doc":"Returns true if this calendar day is displayed as a holiday.","ref":"wxCalendarDateAttr.html#isHoliday/1"},{"type":"function","title":"wxCalendarDateAttr.new/0","doc":"","ref":"wxCalendarDateAttr.html#new/0"},{"type":"function","title":"wxCalendarDateAttr.new/1","doc":"Constructor for specifying all `m:wxCalendarDateAttr` properties.","ref":"wxCalendarDateAttr.html#new/1"},{"type":"function","title":"wxCalendarDateAttr.new/2","doc":"Constructor using default properties except the given border.","ref":"wxCalendarDateAttr.html#new/2"},{"type":"function","title":"wxCalendarDateAttr.setBackgroundColour/2","doc":"Sets the text background colour to use.","ref":"wxCalendarDateAttr.html#setBackgroundColour/2"},{"type":"function","title":"wxCalendarDateAttr.setBorder/2","doc":"Sets the border to use.","ref":"wxCalendarDateAttr.html#setBorder/2"},{"type":"function","title":"wxCalendarDateAttr.setBorderColour/2","doc":"Sets the border colour to use.","ref":"wxCalendarDateAttr.html#setBorderColour/2"},{"type":"function","title":"wxCalendarDateAttr.setFont/2","doc":"Sets the font to use.","ref":"wxCalendarDateAttr.html#setFont/2"},{"type":"function","title":"wxCalendarDateAttr.setHoliday/2","doc":"If `holiday` is true, this calendar day will be displayed as a holiday.","ref":"wxCalendarDateAttr.html#setHoliday/2"},{"type":"function","title":"wxCalendarDateAttr.setTextColour/2","doc":"Sets the text (foreground) colour to use.","ref":"wxCalendarDateAttr.html#setTextColour/2"},{"type":"type","title":"wxCalendarDateAttr.wxCalendarDateAttr/0","doc":"","ref":"wxCalendarDateAttr.html#t:wxCalendarDateAttr/0"},{"type":"module","title":"wxCalendarEvent","doc":"The `m:wxCalendarEvent` class is used together with `m:wxCalendarCtrl`.\n\nSee: `m:wxCalendarCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDateEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCalendarEvent](https://docs.wxwidgets.org/3.2/classwx_calendar_event.html)","ref":"wxCalendarEvent.html"},{"type":"function","title":"wxCalendarEvent.getDate/1","doc":"Returns the date.","ref":"wxCalendarEvent.html#getDate/1"},{"type":"function","title":"wxCalendarEvent.getWeekDay/1","doc":"Returns the week day on which the user clicked in `EVT\\_CALENDAR\\_WEEKDAY\\_CLICKED`\nhandler.\n\nIt doesn't make sense to call this function in other handlers.","ref":"wxCalendarEvent.html#getWeekDay/1"},{"type":"type","title":"wxCalendarEvent.wxCalendar/0","doc":"","ref":"wxCalendarEvent.html#t:wxCalendar/0"},{"type":"type","title":"wxCalendarEvent.wxCalendarEvent/0","doc":"","ref":"wxCalendarEvent.html#t:wxCalendarEvent/0"},{"type":"type","title":"wxCalendarEvent.wxCalendarEventType/0","doc":"","ref":"wxCalendarEvent.html#t:wxCalendarEventType/0"},{"type":"module","title":"wxCaret","doc":"A caret is a blinking cursor showing the position where the typed text will appear.\n\nText controls usually have their own caret but `m:wxCaret` provides a way to use a caret\nin other windows.\n\nCurrently, the caret appears as a rectangle of the given size. In the future, it will be\npossible to specify a bitmap to be used for the caret shape.\n\nA caret is always associated with a window and the current caret can be retrieved using `wxWindow:getCaret/1`.\nThe same caret can't be reused in two different windows.\n\nwxWidgets docs: [wxCaret](https://docs.wxwidgets.org/3.2/classwx_caret.html)","ref":"wxCaret.html"},{"type":"function","title":"wxCaret.create/3","doc":"","ref":"wxCaret.html#create/3"},{"type":"function","title":"wxCaret.create/4","doc":"Creates a caret with the given size (in pixels) and associates it with the `window` (same\nas the equivalent constructors).","ref":"wxCaret.html#create/4"},{"type":"function","title":"wxCaret.destroy/1","doc":"Destroys the object","ref":"wxCaret.html#destroy/1"},{"type":"function","title":"wxCaret.getBlinkTime/0","doc":"Returns the blink time which is measured in milliseconds and is the time elapsed between\n2 inversions of the caret (blink time of the caret is the same for all carets, so this\nfunctions is static).","ref":"wxCaret.html#getBlinkTime/0"},{"type":"function","title":"wxCaret.getPosition/1","doc":"","ref":"wxCaret.html#getPosition/1"},{"type":"function","title":"wxCaret.getSize/1","doc":"","ref":"wxCaret.html#getSize/1"},{"type":"function","title":"wxCaret.getWindow/1","doc":"Get the window the caret is associated with.","ref":"wxCaret.html#getWindow/1"},{"type":"function","title":"wxCaret.hide/1","doc":"Hides the caret, same as Show(false).","ref":"wxCaret.html#hide/1"},{"type":"function","title":"wxCaret.isOk/1","doc":"Returns true if the caret was created successfully.","ref":"wxCaret.html#isOk/1"},{"type":"function","title":"wxCaret.isVisible/1","doc":"Returns true if the caret is visible and false if it is permanently hidden (if it is\nblinking and not shown currently but will be after the next blink, this method still\nreturns true).","ref":"wxCaret.html#isVisible/1"},{"type":"function","title":"wxCaret.move/2","doc":"","ref":"wxCaret.html#move/2"},{"type":"function","title":"wxCaret.move/3","doc":"Move the caret to given position (in logical coordinates).","ref":"wxCaret.html#move/3"},{"type":"function","title":"wxCaret.new/2","doc":"","ref":"wxCaret.html#new/2"},{"type":"function","title":"wxCaret.new/3","doc":"Creates a caret with the given size (in pixels) and associates it with the `window`.","ref":"wxCaret.html#new/3"},{"type":"function","title":"wxCaret.setBlinkTime/1","doc":"Sets the blink time for all the carets.\n\nWarning:\n\nUnder Windows, this function will change the blink time for all carets permanently (until\nthe next time it is called), even for carets in other applications.\n\nSee: `getBlinkTime/0`","ref":"wxCaret.html#setBlinkTime/1"},{"type":"function","title":"wxCaret.setSize/2","doc":"","ref":"wxCaret.html#setSize/2"},{"type":"function","title":"wxCaret.setSize/3","doc":"Changes the size of the caret.","ref":"wxCaret.html#setSize/3"},{"type":"function","title":"wxCaret.show/1","doc":"","ref":"wxCaret.html#show/1"},{"type":"function","title":"wxCaret.show/2","doc":"Shows or hides the caret.\n\nNotice that if the caret was hidden N times, it must be shown N times as well to reappear\non the screen.","ref":"wxCaret.html#show/2"},{"type":"type","title":"wxCaret.wxCaret/0","doc":"","ref":"wxCaret.html#t:wxCaret/0"},{"type":"module","title":"wxCheckBox","doc":"A checkbox is a labelled box which by default is either on (checkmark is visible) or off\n(no checkmark).\n\nOptionally (when the wxCHK_3STATE style flag is set) it can have a third state, called\nthe mixed or undetermined state. Often this is used as a \"Does Not Apply\" state.","ref":"wxCheckBox.html"},{"type":"module","title":"Styles - wxCheckBox","doc":"This class supports the following styles:\n\n* wxCHK_2STATE: Create a 2-state checkbox. This is the default.\n\n* wxCHK_3STATE: Create a 3-state checkbox. Not implemented in wxGTK1.\n\n* wxCHK_ALLOW_3RD_STATE_FOR_USER: By default a user can't set a 3-state checkbox to the\nthird state. It can only be done from code. Using this flags allows the user to set the\ncheckbox to the third state by clicking.\n\n* wxALIGN_RIGHT: Makes the text appear on the left of the checkbox.\n\nSee:\n* `m:wxRadioButton`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCheckBox](https://docs.wxwidgets.org/3.2/classwx_check_box.html)","ref":"wxCheckBox.html#module-styles"},{"type":"module","title":"Events - wxCheckBox","doc":"Event types emitted from this class:\n\n* [`command_checkbox_clicked`](`m:wxCommandEvent`)","ref":"wxCheckBox.html#module-events"},{"type":"function","title":"wxCheckBox.create/4","doc":"","ref":"wxCheckBox.html#create/4"},{"type":"function","title":"wxCheckBox.create/5","doc":"Creates the checkbox for two-step construction.\n\nSee `new/4` for details.","ref":"wxCheckBox.html#create/5"},{"type":"function","title":"wxCheckBox.destroy/1","doc":"Destroys the object","ref":"wxCheckBox.html#destroy/1"},{"type":"function","title":"wxCheckBox.get3StateValue/1","doc":"Gets the state of a 3-state checkbox.\n\nAsserts when the function is used with a 2-state checkbox.","ref":"wxCheckBox.html#get3StateValue/1"},{"type":"function","title":"wxCheckBox.getValue/1","doc":"Gets the state of a 2-state checkbox.\n\nReturn: Returns true if it is checked, false otherwise.","ref":"wxCheckBox.html#getValue/1"},{"type":"function","title":"wxCheckBox.is3rdStateAllowedForUser/1","doc":"Returns whether or not the user can set the checkbox to the third state.\n\nReturn: true if the user can set the third state of this checkbox, false if it can only\nbe set programmatically or if it's a 2-state checkbox.","ref":"wxCheckBox.html#is3rdStateAllowedForUser/1"},{"type":"function","title":"wxCheckBox.is3State/1","doc":"Returns whether or not the checkbox is a 3-state checkbox.\n\nReturn: true if this checkbox is a 3-state checkbox, false if it's a 2-state checkbox.","ref":"wxCheckBox.html#is3State/1"},{"type":"function","title":"wxCheckBox.isChecked/1","doc":"This is just a maybe more readable synonym for `getValue/1`: just as the latter, it\nreturns true if the checkbox is checked and false otherwise.","ref":"wxCheckBox.html#isChecked/1"},{"type":"function","title":"wxCheckBox.new/0","doc":"Default constructor.\n\nSee: `create/5`","ref":"wxCheckBox.html#new/0"},{"type":"function","title":"wxCheckBox.new/3","doc":"","ref":"wxCheckBox.html#new/3"},{"type":"function","title":"wxCheckBox.new/4","doc":"Constructor, creating and showing a checkbox.\n\nSee: `create/5`","ref":"wxCheckBox.html#new/4"},{"type":"function","title":"wxCheckBox.set3StateValue/2","doc":"Sets the checkbox to the given state.\n\nThis does not cause a `wxEVT_CHECKBOX` event to get emitted.\n\nAsserts when the checkbox is a 2-state checkbox and setting the state to\nwxCHK_UNDETERMINED.","ref":"wxCheckBox.html#set3StateValue/2"},{"type":"function","title":"wxCheckBox.setValue/2","doc":"Sets the checkbox to the given state.\n\nThis does not cause a `wxEVT_CHECKBOX` event to get emitted.","ref":"wxCheckBox.html#setValue/2"},{"type":"type","title":"wxCheckBox.wxCheckBox/0","doc":"","ref":"wxCheckBox.html#t:wxCheckBox/0"},{"type":"module","title":"wxCheckListBox","doc":"A `m:wxCheckListBox` is like a `m:wxListBox`, but allows items to be checked or\nunchecked.\n\nWhen using this class under Windows wxWidgets must be compiled with wxUSE_OWNER_DRAWN set\nto 1.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxChoice`\n\n* `m:wxComboBox`\n\n* `m:wxListCtrl`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxListBox`\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxCheckListBox](https://docs.wxwidgets.org/3.2/classwx_check_list_box.html)","ref":"wxCheckListBox.html"},{"type":"module","title":"Events - wxCheckListBox","doc":"Event types emitted from this class:\n\n* [`command_checklistbox_toggled`](`m:wxCommandEvent`)","ref":"wxCheckListBox.html#module-events"},{"type":"function","title":"wxCheckListBox.check/2","doc":"","ref":"wxCheckListBox.html#check/2"},{"type":"function","title":"wxCheckListBox.check/3","doc":"Checks the given item.\n\nNote that calling this method does not result in a `wxEVT_CHECKLISTBOX` event being emitted.","ref":"wxCheckListBox.html#check/3"},{"type":"function","title":"wxCheckListBox.destroy/1","doc":"Destroys the object","ref":"wxCheckListBox.html#destroy/1"},{"type":"function","title":"wxCheckListBox.isChecked/2","doc":"Returns true if the given item is checked, false otherwise.","ref":"wxCheckListBox.html#isChecked/2"},{"type":"function","title":"wxCheckListBox.new/0","doc":"Default constructor.","ref":"wxCheckListBox.html#new/0"},{"type":"function","title":"wxCheckListBox.new/2","doc":"","ref":"wxCheckListBox.html#new/2"},{"type":"function","title":"wxCheckListBox.new/3","doc":"Constructor, creating and showing a list box.","ref":"wxCheckListBox.html#new/3"},{"type":"type","title":"wxCheckListBox.wxCheckListBox/0","doc":"","ref":"wxCheckListBox.html#t:wxCheckListBox/0"},{"type":"module","title":"wxChildFocusEvent","doc":"A child focus event is sent to a (parent-)window when one of its child windows gains\nfocus, so that the window could restore the focus back to its corresponding child if it\nloses it now and regains later.\n\nNotice that child window is the direct child of the window receiving event. Use `wxWindow:findFocus/0` to\nretrieve the window which is actually getting focus.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxChildFocusEvent](https://docs.wxwidgets.org/3.2/classwx_child_focus_event.html)","ref":"wxChildFocusEvent.html"},{"type":"module","title":"Events - wxChildFocusEvent","doc":"Use `wxEvtHandler:connect/3` with `wxChildFocusEventType` to subscribe to events of this type.","ref":"wxChildFocusEvent.html#module-events"},{"type":"function","title":"wxChildFocusEvent.getWindow/1","doc":"Returns the direct child which receives the focus, or a (grand-)parent of the control\nreceiving the focus.\n\nTo get the actually focused control use `wxWindow:findFocus/0`.","ref":"wxChildFocusEvent.html#getWindow/1"},{"type":"type","title":"wxChildFocusEvent.wxChildFocus/0","doc":"","ref":"wxChildFocusEvent.html#t:wxChildFocus/0"},{"type":"type","title":"wxChildFocusEvent.wxChildFocusEvent/0","doc":"","ref":"wxChildFocusEvent.html#t:wxChildFocusEvent/0"},{"type":"type","title":"wxChildFocusEvent.wxChildFocusEventType/0","doc":"","ref":"wxChildFocusEvent.html#t:wxChildFocusEventType/0"},{"type":"module","title":"wxChoice","doc":"A choice item is used to select one of a list of strings.\n\nUnlike a `m:wxListBox`, only the selection is visible until the user pulls down the menu\nof choices.","ref":"wxChoice.html"},{"type":"module","title":"Styles - wxChoice","doc":"This class supports the following styles:\n\n* wxCB_SORT: Sorts the entries alphabetically.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxComboBox`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxChoice](https://docs.wxwidgets.org/3.2/classwx_choice.html)","ref":"wxChoice.html#module-styles"},{"type":"module","title":"Events - wxChoice","doc":"Event types emitted from this class:\n\n* [`command_choice_selected`](`m:wxCommandEvent`)","ref":"wxChoice.html#module-events"},{"type":"function","title":"wxChoice.create/6","doc":"","ref":"wxChoice.html#create/6"},{"type":"function","title":"wxChoice.create/7","doc":"","ref":"wxChoice.html#create/7"},{"type":"function","title":"wxChoice.delete/2","doc":"Deletes an item from the control.\n\nThe client data associated with the item will be also deleted if it is owned by the\ncontrol. Note that it is an error (signalled by an assert failure in debug builds) to\nremove an item with the index negative or greater or equal than the number of items in the control.\n\nIf there is a currently selected item below the item being deleted, i.e. if `wxControlWithItems:getSelection/1` returns a\nvalid index greater than or equal to `n`, the selection is invalidated when this function\nis called. However if the selected item appears before the item being deleted, the\nselection is preserved unchanged.\n\nSee: `wxControlWithItems:clear/1`","ref":"wxChoice.html#delete/2"},{"type":"function","title":"wxChoice.destroy/1","doc":"Destroys the object","ref":"wxChoice.html#destroy/1"},{"type":"function","title":"wxChoice.getColumns/1","doc":"Gets the number of columns in this choice item.\n\nRemark: This is implemented for GTK and Motif only and always returns 1 for the other\nplatforms.","ref":"wxChoice.html#getColumns/1"},{"type":"function","title":"wxChoice.new/0","doc":"Default constructor.\n\nSee: `create/7`","ref":"wxChoice.html#new/0"},{"type":"function","title":"wxChoice.new/2","doc":"","ref":"wxChoice.html#new/2"},{"type":"function","title":"wxChoice.new/3","doc":"Constructor, creating and showing a choice.\n\nSee: `create/7`","ref":"wxChoice.html#new/3"},{"type":"function","title":"wxChoice.setColumns/1","doc":"","ref":"wxChoice.html#setColumns/1"},{"type":"function","title":"wxChoice.setColumns/2","doc":"Sets the number of columns in this choice item.\n\nRemark: This is implemented for GTK and Motif only and doesn’t do anything under other\nplatforms.","ref":"wxChoice.html#setColumns/2"},{"type":"type","title":"wxChoice.wxChoice/0","doc":"","ref":"wxChoice.html#t:wxChoice/0"},{"type":"module","title":"wxChoicebook","doc":"`m:wxChoicebook` is a class similar to `m:wxNotebook`, but uses a `m:wxChoice` control to\nshow the labels instead of the tabs.\n\nFor usage documentation of this class, please refer to the base abstract class\nwxBookCtrl. You can also use the page_samples_notebook to see `m:wxChoicebook` in action.\n\n`m:wxChoicebook` allows the use of wxBookCtrlBase::GetControlSizer(), allowing a program\nto add other controls next to the choice control. This is particularly useful when screen\nspace is restricted, as it often is when `m:wxChoicebook` is being employed.","ref":"wxChoicebook.html"},{"type":"module","title":"Styles - wxChoicebook","doc":"This class supports the following styles:\n\n* wxCHB_DEFAULT: Choose the default location for the labels depending on the current\nplatform (but currently it's the same everywhere, namely wxCHB_TOP).\n\n* wxCHB_TOP: Place labels above the page area.\n\n* wxCHB_LEFT: Place labels on the left side.\n\n* wxCHB_RIGHT: Place labels on the right side.\n\n* wxCHB_BOTTOM: Place labels below the page area.\n\nSee:\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxChoicebook](https://docs.wxwidgets.org/3.2/classwx_choicebook.html)","ref":"wxChoicebook.html#module-styles"},{"type":"module","title":"Events - wxChoicebook","doc":"Event types emitted from this class:\n\n* [`choicebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`choicebook_page_changing`](`m:wxBookCtrlEvent`)","ref":"wxChoicebook.html#module-events"},{"type":"function","title":"wxChoicebook.addPage/3","doc":"","ref":"wxChoicebook.html#addPage/3"},{"type":"function","title":"wxChoicebook.addPage/4","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","ref":"wxChoicebook.html#addPage/4"},{"type":"function","title":"wxChoicebook.advanceSelection/1","doc":"","ref":"wxChoicebook.html#advanceSelection/1"},{"type":"function","title":"wxChoicebook.advanceSelection/2","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","ref":"wxChoicebook.html#advanceSelection/2"},{"type":"function","title":"wxChoicebook.assignImageList/2","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxChoicebook.html#assignImageList/2"},{"type":"function","title":"wxChoicebook.changeSelection/2","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","ref":"wxChoicebook.html#changeSelection/2"},{"type":"function","title":"wxChoicebook.create/3","doc":"","ref":"wxChoicebook.html#create/3"},{"type":"function","title":"wxChoicebook.create/4","doc":"Create the choicebook control that has already been constructed with the default\nconstructor.","ref":"wxChoicebook.html#create/4"},{"type":"function","title":"wxChoicebook.deleteAllPages/1","doc":"Deletes all pages.","ref":"wxChoicebook.html#deleteAllPages/1"},{"type":"function","title":"wxChoicebook.destroy/1","doc":"Destroys the object","ref":"wxChoicebook.html#destroy/1"},{"type":"function","title":"wxChoicebook.getCurrentPage/1","doc":"Returns the currently selected page or NULL.","ref":"wxChoicebook.html#getCurrentPage/1"},{"type":"function","title":"wxChoicebook.getImageList/1","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxChoicebook.html#getImageList/1"},{"type":"function","title":"wxChoicebook.getPage/2","doc":"Returns the window at the given page position.","ref":"wxChoicebook.html#getPage/2"},{"type":"function","title":"wxChoicebook.getPageCount/1","doc":"Returns the number of pages in the control.","ref":"wxChoicebook.html#getPageCount/1"},{"type":"function","title":"wxChoicebook.getPageImage/2","doc":"Returns the image index for the given page.","ref":"wxChoicebook.html#getPageImage/2"},{"type":"function","title":"wxChoicebook.getPageText/2","doc":"Returns the string for the given page.","ref":"wxChoicebook.html#getPageText/2"},{"type":"function","title":"wxChoicebook.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","ref":"wxChoicebook.html#getSelection/1"},{"type":"function","title":"wxChoicebook.hitTest/2","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","ref":"wxChoicebook.html#hitTest/2"},{"type":"function","title":"wxChoicebook.insertPage/4","doc":"","ref":"wxChoicebook.html#insertPage/4"},{"type":"function","title":"wxChoicebook.insertPage/5","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","ref":"wxChoicebook.html#insertPage/5"},{"type":"function","title":"wxChoicebook.new/0","doc":"Constructs a choicebook control.","ref":"wxChoicebook.html#new/0"},{"type":"function","title":"wxChoicebook.new/2","doc":"","ref":"wxChoicebook.html#new/2"},{"type":"function","title":"wxChoicebook.new/3","doc":"","ref":"wxChoicebook.html#new/3"},{"type":"function","title":"wxChoicebook.setImageList/2","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","ref":"wxChoicebook.html#setImageList/2"},{"type":"function","title":"wxChoicebook.setPageImage/3","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","ref":"wxChoicebook.html#setPageImage/3"},{"type":"function","title":"wxChoicebook.setPageSize/2","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","ref":"wxChoicebook.html#setPageSize/2"},{"type":"function","title":"wxChoicebook.setPageText/3","doc":"Sets the text for the given page.","ref":"wxChoicebook.html#setPageText/3"},{"type":"function","title":"wxChoicebook.setSelection/2","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","ref":"wxChoicebook.html#setSelection/2"},{"type":"type","title":"wxChoicebook.wxChoicebook/0","doc":"","ref":"wxChoicebook.html#t:wxChoicebook/0"},{"type":"module","title":"wxClientDC","doc":"`m:wxClientDC` is primarily useful for obtaining information about the window from\noutside EVT\\_PAINT() handler.\n\nTypical use of this class is to obtain the extent of some text string in order to\nallocate enough size for a window, e.g.\n\nNote: While `m:wxClientDC` may also be used for drawing on the client area of a window\nfrom outside an EVT_PAINT() handler in some ports, this does `not` work on all platforms\n(neither wxOSX nor wxGTK with GTK 3 Wayland backend support this, so drawing using `m:wxClientDC`\nsimply doesn't have any effect there) and the only portable way of drawing is via `m:wxPaintDC`.\nTo redraw a small part of the window, use `wxWindow:refreshRect/3` to invalidate just this part and check `wxWindow:getUpdateRegion/1` in the\npaint event handler to redraw this part only.\n\n`m:wxClientDC` objects should normally be constructed as temporary stack objects, i.e.\ndon't store a `m:wxClientDC` object.\n\nA `m:wxClientDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxWindowDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindowDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxClientDC](https://docs.wxwidgets.org/3.2/classwx_client_d_c.html)","ref":"wxClientDC.html"},{"type":"function","title":"wxClientDC.destroy/1","doc":"Destroys the object","ref":"wxClientDC.html#destroy/1"},{"type":"function","title":"wxClientDC.new/1","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","ref":"wxClientDC.html#new/1"},{"type":"type","title":"wxClientDC.wxClientDC/0","doc":"","ref":"wxClientDC.html#t:wxClientDC/0"},{"type":"module","title":"wxClipboard","doc":"A class for manipulating the clipboard.\n\nTo use the clipboard, you call member functions of the global ?wxTheClipboard object.\n\nSee the overview_dataobject for further information.\n\nCall `open/1` to get ownership of the clipboard. If this operation returns true, you now own the\nclipboard. Call `setData/2` to put data on the clipboard, or `getData/2` to retrieve data from the clipboard.\nCall `close/1` to close the clipboard and relinquish ownership. You should keep the clipboard open\nonly momentarily.\n\nFor example:\n\nNote: On GTK, the clipboard behavior can vary depending on the configuration of the\nend-user's machine. In order for the clipboard data to persist after the window closes, a\nclipboard manager must be installed. Some clipboard managers will automatically flush the\nclipboard after each new piece of data is added, while others will not. The @Flush()\nfunction will force the clipboard manager to flush the data.\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* [Overview dataobject](https://docs.wxwidgets.org/3.2/overview_dataobject.html#overview_dataobject)\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxClipboard](https://docs.wxwidgets.org/3.2/classwx_clipboard.html)","ref":"wxClipboard.html"},{"type":"function","title":"wxClipboard.addData/2","doc":"Call this function to add the data object to the clipboard.\n\nThis is an obsolete synonym for `setData/2`.","ref":"wxClipboard.html#addData/2"},{"type":"function","title":"wxClipboard.clear/1","doc":"Clears the global clipboard object and the system's clipboard if possible.","ref":"wxClipboard.html#clear/1"},{"type":"function","title":"wxClipboard.close/1","doc":"Call this function to close the clipboard, having opened it with `open/1`.","ref":"wxClipboard.html#close/1"},{"type":"function","title":"wxClipboard.destroy/1","doc":"Destroys the object","ref":"wxClipboard.html#destroy/1"},{"type":"function","title":"wxClipboard.flush/1","doc":"Flushes the clipboard: this means that the data which is currently on clipboard will stay\navailable even after the application exits (possibly eating memory), otherwise the\nclipboard will be emptied on exit.\n\nCurrently this method is implemented in MSW and GTK and always returns false otherwise.\n\nNote: On GTK, only the non-primary selection can be flushed. Calling this function when\nthe clipboard is using the primary selection will return false and not make any data\navailable after the program exits.\n\nReturn: false if the operation is unsuccessful for any reason.","ref":"wxClipboard.html#flush/1"},{"type":"function","title":"wxClipboard.get/0","doc":"Returns the global instance (wxTheClipboard) of the clipboard object.","ref":"wxClipboard.html#get/0"},{"type":"function","title":"wxClipboard.getData/2","doc":"Call this function to fill `data` with data on the clipboard, if available in the\nrequired format.\n\nReturns true on success.","ref":"wxClipboard.html#getData/2"},{"type":"function","title":"wxClipboard.isOpened/1","doc":"Returns true if the clipboard has been opened.","ref":"wxClipboard.html#isOpened/1"},{"type":"function","title":"wxClipboard.isSupported/2","doc":"Returns true if there is data which matches the data format of the given data object\ncurrently `available` on the clipboard.","ref":"wxClipboard.html#isSupported/2"},{"type":"function","title":"wxClipboard.new/0","doc":"Default constructor.","ref":"wxClipboard.html#new/0"},{"type":"function","title":"wxClipboard.open/1","doc":"Call this function to open the clipboard before calling `setData/2` and `getData/2`.\n\nCall `close/1` when you have finished with the clipboard. You should keep the clipboard open for\nonly a very short time.\n\nReturn: true on success. This should be tested (as in the sample shown above).","ref":"wxClipboard.html#open/1"},{"type":"function","title":"wxClipboard.setData/2","doc":"Call this function to set the data object to the clipboard.\n\nThe new data object replaces any previously set one, so if the application wants to\nprovide clipboard data in several different formats, it must use a composite data object\nsupporting all of the formats instead of calling this function several times with\ndifferent data objects as this would only leave data from the last one in the clipboard.\n\nAfter this function has been called, the clipboard owns the data, so do not delete the\ndata explicitly.","ref":"wxClipboard.html#setData/2"},{"type":"function","title":"wxClipboard.usePrimarySelection/1","doc":"","ref":"wxClipboard.html#usePrimarySelection/1"},{"type":"function","title":"wxClipboard.usePrimarySelection/2","doc":"On platforms supporting it (all X11-based ports), `m:wxClipboard` uses the CLIPBOARD X11\nselection by default.\n\nWhen this function is called with true, all subsequent clipboard operations will use\nPRIMARY selection until this function is called again with false.\n\nOn the other platforms, there is no PRIMARY selection and so all clipboard operations\nwill fail. This allows implementing the standard X11 handling of the clipboard which\nconsists in copying data to the CLIPBOARD selection only when the user explicitly requests\nit (i.e. by selecting the \"Copy\" menu command) but putting the currently selected text\ninto the PRIMARY selection automatically, without overwriting the normal clipboard\ncontents with the currently selected text on the other platforms.","ref":"wxClipboard.html#usePrimarySelection/2"},{"type":"type","title":"wxClipboard.wxClipboard/0","doc":"","ref":"wxClipboard.html#t:wxClipboard/0"},{"type":"module","title":"wxClipboardTextEvent","doc":"This class represents the events generated by a control (typically a `m:wxTextCtrl` but\nother windows can generate these events as well) when its content gets copied or cut to,\nor pasted from the clipboard.\n\nThere are three types of corresponding events `wxEVT_TEXT_COPY`, `wxEVT_TEXT_CUT` and `wxEVT_TEXT_PASTE`.\n\nIf any of these events is processed (without being skipped) by an event handler, the\ncorresponding operation doesn't take place which allows preventing the text from being\ncopied from or pasted to a control. It is also possible to examine the clipboard contents\nin the PASTE event handler and transform it in some way before inserting in a control -\nfor example, changing its case or removing invalid characters.\n\nFinally notice that a CUT event is always preceded by the COPY event which makes it\npossible to only process the latter if it doesn't matter if the text was copied or cut.\n\nNote: These events are currently only generated by `m:wxTextCtrl` in wxGTK and wxOSX but\nare also generated by `m:wxComboBox` without wxCB_READONLY style in wxMSW.\n\nSee: `m:wxClipboard`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxClipboardTextEvent](https://docs.wxwidgets.org/3.2/classwx_clipboard_text_event.html)","ref":"wxClipboardTextEvent.html"},{"type":"module","title":"Events - wxClipboardTextEvent","doc":"Use `wxEvtHandler:connect/3` with `wxClipboardTextEventType` to subscribe to events of this type.","ref":"wxClipboardTextEvent.html#module-events"},{"type":"type","title":"wxClipboardTextEvent.wxClipboardText/0","doc":"","ref":"wxClipboardTextEvent.html#t:wxClipboardText/0"},{"type":"type","title":"wxClipboardTextEvent.wxClipboardTextEvent/0","doc":"","ref":"wxClipboardTextEvent.html#t:wxClipboardTextEvent/0"},{"type":"type","title":"wxClipboardTextEvent.wxClipboardTextEventType/0","doc":"","ref":"wxClipboardTextEvent.html#t:wxClipboardTextEventType/0"},{"type":"module","title":"wxCloseEvent","doc":"This event class contains information about window and session close events.\n\nThe handler function for EVT_CLOSE is called when the user has tried to close a a frame\nor dialog box using the window manager (X) or system menu (Windows). It can also be\ninvoked by the application itself programmatically, for example by calling the `wxWindow:close/2` function.\n\nYou should check whether the application is forcing the deletion of the window using `canVeto/1`. If\nthis is false, you `must` destroy the window using `wxWindow:'Destroy'/1`.\n\nIf the return value is true, it is up to you whether you respond by destroying the window.\n\nIf you don't destroy the window, you should call `veto/2` to let the calling code know that you\ndid not destroy the window. This allows the `wxWindow:close/2` function to return true or false depending on\nwhether the close instruction was honoured or not.\n\nExample of a `m:wxCloseEvent` handler:\n\nThe EVT_END_SESSION event is slightly different as it is sent by the system when the user\nsession is ending (e.g. because of log out or shutdown) and so all windows are being\nforcefully closed. At least under MSW, after the handler for this event is executed the\nprogram is simply killed by the system. Because of this, the default handler for this\nevent provided by wxWidgets calls all the usual cleanup code (including `wxApp::OnExit()`\n(not implemented in wx)) so that it could still be executed and exit()s the process\nitself, without waiting for being killed. If this behaviour is for some reason\nundesirable, make sure that you define a handler for this event in your wxApp-derived\nclass and do not call `event.Skip()` in it (but be aware that the system will still kill\nyour application).\n\nSee:\n* `wxWindow:close/2`\n\n* [Overview windowdeletion](https://docs.wxwidgets.org/3.2/overview_windowdeletion.html#overview_windowdeletion)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCloseEvent](https://docs.wxwidgets.org/3.2/classwx_close_event.html)","ref":"wxCloseEvent.html"},{"type":"module","title":"Events - wxCloseEvent","doc":"Use `wxEvtHandler:connect/3` with `wxCloseEventType` to subscribe to events of this type.","ref":"wxCloseEvent.html#module-events"},{"type":"function","title":"wxCloseEvent.canVeto/1","doc":"Returns true if you can veto a system shutdown or a window close event.\n\nVetoing a window close event is not possible if the calling code wishes to force the\napplication to exit, and so this function must be called to check this.","ref":"wxCloseEvent.html#canVeto/1"},{"type":"function","title":"wxCloseEvent.getLoggingOff/1","doc":"Returns true if the user is just logging off or false if the system is shutting down.\n\nThis method can only be called for end session and query end session events, it doesn't\nmake sense for close window event.","ref":"wxCloseEvent.html#getLoggingOff/1"},{"type":"function","title":"wxCloseEvent.setCanVeto/2","doc":"Sets the 'can veto' flag.","ref":"wxCloseEvent.html#setCanVeto/2"},{"type":"function","title":"wxCloseEvent.setLoggingOff/2","doc":"Sets the 'logging off' flag.","ref":"wxCloseEvent.html#setLoggingOff/2"},{"type":"function","title":"wxCloseEvent.veto/1","doc":"","ref":"wxCloseEvent.html#veto/1"},{"type":"function","title":"wxCloseEvent.veto/2","doc":"Call this from your event handler to veto a system shutdown or to signal to the calling\napplication that a window close did not happen.\n\nYou can only veto a shutdown if `canVeto/1` returns true.","ref":"wxCloseEvent.html#veto/2"},{"type":"type","title":"wxCloseEvent.wxClose/0","doc":"","ref":"wxCloseEvent.html#t:wxClose/0"},{"type":"type","title":"wxCloseEvent.wxCloseEvent/0","doc":"","ref":"wxCloseEvent.html#t:wxCloseEvent/0"},{"type":"type","title":"wxCloseEvent.wxCloseEventType/0","doc":"","ref":"wxCloseEvent.html#t:wxCloseEventType/0"},{"type":"module","title":"wxColourData","doc":"This class holds a variety of information related to colour dialogs.\n\nSee:\n* `wx_color()`\n\n* `m:wxColourDialog`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_colour)\n\nwxWidgets docs: [wxColourData](https://docs.wxwidgets.org/3.2/classwx_colour_data.html)","ref":"wxColourData.html"},{"type":"function","title":"wxColourData.destroy/1","doc":"Destroys the object","ref":"wxColourData.html#destroy/1"},{"type":"function","title":"wxColourData.getChooseFull/1","doc":"Under Windows, determines whether the Windows colour dialog will display the full dialog\nwith custom colour selection controls.\n\nHas no meaning under other platforms.\n\nThe default value is true.","ref":"wxColourData.html#getChooseFull/1"},{"type":"function","title":"wxColourData.getColour/1","doc":"Gets the current colour associated with the colour dialog.\n\nThe default colour is black.","ref":"wxColourData.html#getColour/1"},{"type":"function","title":"wxColourData.getCustomColour/2","doc":"Returns custom colours associated with the colour dialog.","ref":"wxColourData.html#getCustomColour/2"},{"type":"function","title":"wxColourData.new/0","doc":"Constructor.\n\nInitializes the custom colours to `wxNullColour`, the `data` colour setting to black, and\nthe `choose` full setting to true.","ref":"wxColourData.html#new/0"},{"type":"function","title":"wxColourData.setChooseFull/2","doc":"Under Windows, tells the Windows colour dialog to display the full dialog with custom\ncolour selection controls.\n\nUnder other platforms, has no effect.\n\nThe default value is true.","ref":"wxColourData.html#setChooseFull/2"},{"type":"function","title":"wxColourData.setColour/2","doc":"Sets the default colour for the colour dialog.\n\nThe default colour is black.","ref":"wxColourData.html#setColour/2"},{"type":"function","title":"wxColourData.setCustomColour/3","doc":"Sets custom colours for the colour dialog.","ref":"wxColourData.html#setCustomColour/3"},{"type":"type","title":"wxColourData.wxColourData/0","doc":"","ref":"wxColourData.html#t:wxColourData/0"},{"type":"module","title":"wxColourDialog","doc":"This class represents the colour chooser dialog.\n\nStarting from wxWidgets 3.1.3 and currently in the MSW port only, this dialog generates\nwxEVT_COLOUR_CHANGED events while it is being shown, i.e. from inside its `wxDialog:showModal/1` method, that\nnotify the program about the change of the currently selected colour and allow it to e.g.\npreview the effect of selecting this colour. Note that if you react to this event, you\nshould also correctly revert to the previously selected colour if the dialog is cancelled\nby the user.\n\nExample of using this class with dynamic feedback for the selected colour:\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_colour)\n\n* `wx_color()`\n\n* `m:wxColourData`\n\n* ?wxGetColourFromUser()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxColourDialog](https://docs.wxwidgets.org/3.2/classwx_colour_dialog.html)","ref":"wxColourDialog.html"},{"type":"function","title":"wxColourDialog.create/2","doc":"","ref":"wxColourDialog.html#create/2"},{"type":"function","title":"wxColourDialog.create/3","doc":"Same as `new/2`.","ref":"wxColourDialog.html#create/3"},{"type":"function","title":"wxColourDialog.destroy/1","doc":"Destroys the object","ref":"wxColourDialog.html#destroy/1"},{"type":"function","title":"wxColourDialog.getColourData/1","doc":"Returns the colour data associated with the colour dialog.","ref":"wxColourDialog.html#getColourData/1"},{"type":"function","title":"wxColourDialog.new/0","doc":"","ref":"wxColourDialog.html#new/0"},{"type":"function","title":"wxColourDialog.new/1","doc":"","ref":"wxColourDialog.html#new/1"},{"type":"function","title":"wxColourDialog.new/2","doc":"Constructor.\n\nPass a parent window, and optionally a pointer to a block of colour data, which will be\ncopied to the colour dialog's colour data.\n\nCustom colours from colour data object will be used in the dialog's colour palette.\nInvalid entries in custom colours list will be ignored on some platforms(GTK) or replaced\nwith white colour on platforms where custom colours palette has fixed size (MSW).\n\nSee: `m:wxColourData`","ref":"wxColourDialog.html#new/2"},{"type":"type","title":"wxColourDialog.wxColourDialog/0","doc":"","ref":"wxColourDialog.html#t:wxColourDialog/0"},{"type":"module","title":"wxColourPickerCtrl","doc":"This control allows the user to select a colour.\n\nThe generic implementation is a button which brings up a `m:wxColourDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe colour-chooser dialog. It is only available if `wxUSE_COLOURPICKERCTRL` is set to 1\n(the default).","ref":"wxColourPickerCtrl.html"},{"type":"module","title":"Styles - wxColourPickerCtrl","doc":"This class supports the following styles:\n\n* wxCLRP_DEFAULT_STYLE: The default style: 0.\n\n* wxCLRP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxColourPickerCtrl` and which can be used by the user to\nspecify a colour (see SetColour). The text control is automatically synchronized with\nbutton's value. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxCLRP_SHOW_LABEL: Shows the colour in HTML form (AABBCC) as colour button label (instead\nof no label at all).\n\n* wxCLRP_SHOW_ALPHA: Allows selecting opacity in the colour-chooser (effective under wxGTK\nand wxOSX).\n\nSee:\n* `m:wxColourDialog`\n\n* `m:wxColourPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxColourPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_colour_picker_ctrl.html)","ref":"wxColourPickerCtrl.html#module-styles"},{"type":"module","title":"Events - wxColourPickerCtrl","doc":"Event types emitted from this class:\n\n* [`command_colourpicker_changed`](`m:wxColourPickerEvent`)","ref":"wxColourPickerCtrl.html#module-events"},{"type":"function","title":"wxColourPickerCtrl.create/3","doc":"","ref":"wxColourPickerCtrl.html#create/3"},{"type":"function","title":"wxColourPickerCtrl.create/4","doc":"Creates a colour picker with the given arguments.\n\nReturn: true if the control was successfully created or false if creation failed.","ref":"wxColourPickerCtrl.html#create/4"},{"type":"function","title":"wxColourPickerCtrl.destroy/1","doc":"Destroys the object","ref":"wxColourPickerCtrl.html#destroy/1"},{"type":"function","title":"wxColourPickerCtrl.getColour/1","doc":"Returns the currently selected colour.","ref":"wxColourPickerCtrl.html#getColour/1"},{"type":"function","title":"wxColourPickerCtrl.new/0","doc":"","ref":"wxColourPickerCtrl.html#new/0"},{"type":"function","title":"wxColourPickerCtrl.new/2","doc":"","ref":"wxColourPickerCtrl.html#new/2"},{"type":"function","title":"wxColourPickerCtrl.new/3","doc":"Initializes the object and calls `create/4` with all the parameters.","ref":"wxColourPickerCtrl.html#new/3"},{"type":"function","title":"wxColourPickerCtrl.setColour/2","doc":"Sets the currently selected colour.\n\nSee `wxColour::Set()` (not implemented in wx).","ref":"wxColourPickerCtrl.html#setColour/2"},{"type":"type","title":"wxColourPickerCtrl.wxColourPickerCtrl/0","doc":"","ref":"wxColourPickerCtrl.html#t:wxColourPickerCtrl/0"},{"type":"module","title":"wxColourPickerEvent","doc":"This event class is used for the events generated by `m:wxColourPickerCtrl`.\n\nSee: `m:wxColourPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxColourPickerEvent](https://docs.wxwidgets.org/3.2/classwx_colour_picker_event.html)","ref":"wxColourPickerEvent.html"},{"type":"module","title":"Events - wxColourPickerEvent","doc":"Use `wxEvtHandler:connect/3` with `wxColourPickerEventType` to subscribe to events of this type.","ref":"wxColourPickerEvent.html#module-events"},{"type":"function","title":"wxColourPickerEvent.getColour/1","doc":"Retrieve the colour the user has just selected.","ref":"wxColourPickerEvent.html#getColour/1"},{"type":"type","title":"wxColourPickerEvent.wxColourPicker/0","doc":"","ref":"wxColourPickerEvent.html#t:wxColourPicker/0"},{"type":"type","title":"wxColourPickerEvent.wxColourPickerEvent/0","doc":"","ref":"wxColourPickerEvent.html#t:wxColourPickerEvent/0"},{"type":"type","title":"wxColourPickerEvent.wxColourPickerEventType/0","doc":"","ref":"wxColourPickerEvent.html#t:wxColourPickerEventType/0"},{"type":"module","title":"wxComboBox","doc":"A combobox is like a combination of an edit control and a listbox.\n\nIt can be displayed as static list with editable or read-only text field; or a drop-down\nlist with text field; or a drop-down list without a text field depending on the platform\nand presence of wxCB_READONLY style.\n\nA combobox permits a single selection only. Combobox items are numbered from zero.\n\nIf you need a customized combobox, have a look at `wxComboCtrl` (not implemented in wx), `wxOwnerDrawnComboBox`\n(not implemented in wx), `wxComboPopup` (not implemented in wx) and the ready-to-use `wxBitmapComboBox`\n(not implemented in wx).\n\nPlease refer to `wxTextEntry` (not implemented in wx) documentation for the description\nof methods operating with the text entry part of the combobox and to `wxItemContainer`\n(not implemented in wx) for the methods operating with the list of strings. Notice that at\nleast under MSW `m:wxComboBox` doesn't behave correctly if it contains strings differing\nin case only so portable programs should avoid adding such strings to this control.","ref":"wxComboBox.html"},{"type":"module","title":"Styles - wxComboBox","doc":"This class supports the following styles:\n\n* wxCB_SIMPLE: Creates a combobox with a permanently displayed list. Windows only.\n\n* wxCB_DROPDOWN: Creates a combobox with a drop-down list. MSW and Motif only.\n\n* wxCB_READONLY: A combobox with this style behaves like a `m:wxChoice` (and may look in\nthe same way as well, although this is platform-dependent), i.e. it allows the user to\nchoose from the list of options but doesn't allow to enter a value not present in the\nlist.\n\n* wxCB_SORT: Sorts the entries in the list alphabetically.\n\n* wxTE_PROCESS_ENTER: The control will generate the event `wxEVT_TEXT_ENTER` that can be\nhandled by the program. Otherwise, i.e. either if this style not specified at all, or it\nis used, but there is no event handler for this event or the event handler called `wxEvent:skip/2` to\navoid overriding the default handling, pressing Enter key is either processed internally\nby the control or used to activate the default button of the dialog, if any.\n\nSee:\n* `m:wxListBox`\n\n* `m:wxTextCtrl`\n\n* `m:wxChoice`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxComboBox](https://docs.wxwidgets.org/3.2/classwx_combo_box.html)","ref":"wxComboBox.html#module-styles"},{"type":"module","title":"Events - wxComboBox","doc":"Event types emitted from this class:\n\n* [`command_combobox_selected`](`m:wxCommandEvent`)\n\n* [`command_text_updated`](`m:wxCommandEvent`)\n\n* [`command_text_enter`](`m:wxCommandEvent`)\n\n* [`combobox_dropdown`](`m:wxCommandEvent`)\n\n* [`combobox_closeup`](`m:wxCommandEvent`)","ref":"wxComboBox.html#module-events"},{"type":"function","title":"wxComboBox.canCopy/1","doc":"Returns true if the selection can be copied to the clipboard.","ref":"wxComboBox.html#canCopy/1"},{"type":"function","title":"wxComboBox.canCut/1","doc":"Returns true if the selection can be cut to the clipboard.","ref":"wxComboBox.html#canCut/1"},{"type":"function","title":"wxComboBox.canPaste/1","doc":"Returns true if the contents of the clipboard can be pasted into the text control.\n\nOn some platforms (Motif, GTK) this is an approximation and returns true if the control\nis editable, false otherwise.","ref":"wxComboBox.html#canPaste/1"},{"type":"function","title":"wxComboBox.canRedo/1","doc":"Returns true if there is a redo facility available and the last operation can be redone.","ref":"wxComboBox.html#canRedo/1"},{"type":"function","title":"wxComboBox.canUndo/1","doc":"Returns true if there is an undo facility available and the last operation can be undone.","ref":"wxComboBox.html#canUndo/1"},{"type":"function","title":"wxComboBox.copy/1","doc":"Copies the selected text to the clipboard.","ref":"wxComboBox.html#copy/1"},{"type":"function","title":"wxComboBox.create/7","doc":"","ref":"wxComboBox.html#create/7"},{"type":"function","title":"wxComboBox.create/8","doc":"","ref":"wxComboBox.html#create/8"},{"type":"function","title":"wxComboBox.cut/1","doc":"Copies the selected text to the clipboard and removes it from the control.","ref":"wxComboBox.html#cut/1"},{"type":"function","title":"wxComboBox.destroy/1","doc":"Destroys the object","ref":"wxComboBox.html#destroy/1"},{"type":"function","title":"wxComboBox.getInsertionPoint/1","doc":"Same as `wxTextCtrl:getInsertionPoint/1`.\n\nNote: Under wxMSW, this function always returns 0 if the combobox doesn't have the focus.","ref":"wxComboBox.html#getInsertionPoint/1"},{"type":"function","title":"wxComboBox.getLastPosition/1","doc":"Returns the zero based index of the last position in the text control, which is equal to\nthe number of characters in the control.","ref":"wxComboBox.html#getLastPosition/1"},{"type":"function","title":"wxComboBox.getValue/1","doc":"Gets the contents of the control.\n\nNotice that for a multiline text control, the lines will be separated by (Unix-style) `\\n`\ncharacters, even under Windows where they are separated by a `\\r\\n` sequence in the\nnative control.","ref":"wxComboBox.html#getValue/1"},{"type":"function","title":"wxComboBox.new/0","doc":"Default constructor.","ref":"wxComboBox.html#new/0"},{"type":"function","title":"wxComboBox.new/2","doc":"","ref":"wxComboBox.html#new/2"},{"type":"function","title":"wxComboBox.new/3","doc":"Constructor, creating and showing a combobox.\n\nSee: `create/8`","ref":"wxComboBox.html#new/3"},{"type":"function","title":"wxComboBox.paste/1","doc":"Pastes text from the clipboard to the text item.","ref":"wxComboBox.html#paste/1"},{"type":"function","title":"wxComboBox.redo/1","doc":"If there is a redo facility and the last operation can be redone, redoes the last\noperation.\n\nDoes nothing if there is no redo facility.","ref":"wxComboBox.html#redo/1"},{"type":"function","title":"wxComboBox.remove/3","doc":"Removes the text starting at the first given position up to (but not including) the\ncharacter at the last position.\n\nThis function puts the current insertion point position at `to` as a side effect.","ref":"wxComboBox.html#remove/3"},{"type":"function","title":"wxComboBox.replace/4","doc":"Replaces the text starting at the first position up to (but not including) the character\nat the last position with the given text.\n\nThis function puts the current insertion point position at `to` as a side effect.","ref":"wxComboBox.html#replace/4"},{"type":"function","title":"wxComboBox.setInsertionPoint/2","doc":"Sets the insertion point at the given position.","ref":"wxComboBox.html#setInsertionPoint/2"},{"type":"function","title":"wxComboBox.setInsertionPointEnd/1","doc":"Sets the insertion point at the end of the text control.\n\nThis is equivalent to calling `setInsertionPoint/2` with `getLastPosition/1` argument.","ref":"wxComboBox.html#setInsertionPointEnd/1"},{"type":"function","title":"wxComboBox.setSelection/2","doc":"Sets the selection to the given item `n` or removes the selection entirely if `n` == `wxNOT\\_FOUND`.\n\nNote that this does not cause any command events to be emitted nor does it deselect any\nother items in the controls which support multiple selections.\n\nSee:\n* `wxControlWithItems:setString/3`\n\n* `wxControlWithItems:setStringSelection/2`","ref":"wxComboBox.html#setSelection/2"},{"type":"function","title":"wxComboBox.setSelection/3","doc":"Same as `wxTextCtrl:setSelection/3`.","ref":"wxComboBox.html#setSelection/3"},{"type":"function","title":"wxComboBox.setValue/2","doc":"Sets the text for the combobox text field.\n\nFor normal, editable comboboxes with a text entry field calling this method will generate\na `wxEVT_TEXT` event, consistently with `wxTextCtrl:setValue/2` behaviour, use `wxTextCtrl:changeValue/2` if this is undesirable.\n\nFor controls with `wxCB_READONLY` style the method behaves somewhat differently: the\nstring must be in the combobox choices list (the check for this is case-insensitive) and `wxEVT_TEXT`\nis `not` generated in this case.","ref":"wxComboBox.html#setValue/2"},{"type":"function","title":"wxComboBox.undo/1","doc":"If there is an undo facility and the last operation can be undone, undoes the last\noperation.\n\nDoes nothing if there is no undo facility.","ref":"wxComboBox.html#undo/1"},{"type":"type","title":"wxComboBox.wxComboBox/0","doc":"","ref":"wxComboBox.html#t:wxComboBox/0"},{"type":"module","title":"wxCommandEvent","doc":"This event class contains information about command events, which originate from a\nvariety of simple controls.\n\nNote that wxCommandEvents and wxCommandEvent-derived event classes by default and unlike\nother wxEvent-derived classes propagate upward from the source window (the window which\nemits the event) up to the first parent which processes the event. Be sure to read overview_events_propagation.\n\nMore complex controls, such as `m:wxTreeCtrl`, have separate command event classes.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxCommandEvent](https://docs.wxwidgets.org/3.2/classwx_command_event.html)","ref":"wxCommandEvent.html"},{"type":"module","title":"Events - wxCommandEvent","doc":"Use `wxEvtHandler:connect/3` with `wxCommandEventType` to subscribe to events of this type.","ref":"wxCommandEvent.html#module-events"},{"type":"function","title":"wxCommandEvent.getClientData/1","doc":"Returns client object pointer for a listbox or choice selection event (not valid for a\ndeselection).","ref":"wxCommandEvent.html#getClientData/1"},{"type":"function","title":"wxCommandEvent.getExtraLong/1","doc":"Returns extra information dependent on the event objects type.\n\nIf the event comes from a listbox selection, it is a boolean determining whether the\nevent was a selection (true) or a deselection (false). A listbox deselection only occurs\nfor multiple-selection boxes, and in this case the index and string values are\nindeterminate and the listbox must be examined by the application.","ref":"wxCommandEvent.html#getExtraLong/1"},{"type":"function","title":"wxCommandEvent.getInt/1","doc":"Returns the integer identifier corresponding to a listbox, choice or radiobox selection\n(only if the event was a selection, not a deselection), or a boolean value representing\nthe value of a checkbox.\n\nFor a menu item, this method returns -1 if the item is not checkable or a boolean value\n(true or false) for checkable items indicating the new state of the item.","ref":"wxCommandEvent.html#getInt/1"},{"type":"function","title":"wxCommandEvent.getSelection/1","doc":"Returns item index for a listbox or choice selection event (not valid for a deselection).","ref":"wxCommandEvent.html#getSelection/1"},{"type":"function","title":"wxCommandEvent.getString/1","doc":"Returns item string for a listbox or choice selection event.\n\nIf one or several items have been deselected, returns the index of the first deselected\nitem. If some items have been selected and others deselected at the same time, it will\nreturn the index of the first selected item.","ref":"wxCommandEvent.html#getString/1"},{"type":"function","title":"wxCommandEvent.isChecked/1","doc":"This method can be used with checkbox and menu events: for the checkboxes, the method\nreturns true for a selection event and false for a deselection one.\n\nFor the menu events, this method indicates if the menu item just has become checked or\nunchecked (and thus only makes sense for checkable menu items).\n\nNotice that this method cannot be used with `m:wxCheckListBox` currently.","ref":"wxCommandEvent.html#isChecked/1"},{"type":"function","title":"wxCommandEvent.isSelection/1","doc":"For a listbox or similar event, returns true if it is a selection, false if it is a\ndeselection.\n\nIf some items have been selected and others deselected at the same time, it will return\ntrue.","ref":"wxCommandEvent.html#isSelection/1"},{"type":"function","title":"wxCommandEvent.setInt/2","doc":"Sets the `m_commandInt` member.","ref":"wxCommandEvent.html#setInt/2"},{"type":"function","title":"wxCommandEvent.setString/2","doc":"Sets the `m_commandString` member.","ref":"wxCommandEvent.html#setString/2"},{"type":"type","title":"wxCommandEvent.wxCommand/0","doc":"","ref":"wxCommandEvent.html#t:wxCommand/0"},{"type":"type","title":"wxCommandEvent.wxCommandEvent/0","doc":"","ref":"wxCommandEvent.html#t:wxCommandEvent/0"},{"type":"type","title":"wxCommandEvent.wxCommandEventType/0","doc":"","ref":"wxCommandEvent.html#t:wxCommandEventType/0"},{"type":"module","title":"wxContextMenuEvent","doc":"This class is used for context menu events, sent to give the application a chance to show\na context (popup) menu for a `m:wxWindow`.\n\nNote that if `getPosition/1` returns wxDefaultPosition, this means that the event originated from a\nkeyboard context button event, and you should compute a suitable position yourself, for\nexample by calling `wx_misc:getMousePosition/0`.\n\nNotice that the exact sequence of mouse events is different across the platforms. For\nexample, under MSW the context menu event is generated after `EVT_RIGHT_UP` event and only\nif it was not handled but under GTK the context menu event is generated after `EVT_RIGHT_DOWN`\nevent. This is correct in the sense that it ensures that the context menu is shown\naccording to the current platform UI conventions and also means that you must not handle\n(or call `wxEvent:skip/2` in your handler if you do have one) neither right mouse down nor right mouse up\nevent if you plan on handling `EVT_CONTEXT_MENU` event.\n\nSee:\n* `m:wxCommandEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxContextMenuEvent](https://docs.wxwidgets.org/3.2/classwx_context_menu_event.html)","ref":"wxContextMenuEvent.html"},{"type":"module","title":"Events - wxContextMenuEvent","doc":"Use `wxEvtHandler:connect/3` with `wxContextMenuEventType` to subscribe to events of this type.","ref":"wxContextMenuEvent.html#module-events"},{"type":"function","title":"wxContextMenuEvent.getPosition/1","doc":"Returns the position in screen coordinates at which the menu should be shown.\n\nUse `wxWindow:screenToClient/2` to convert to client coordinates.\n\nYou can also omit a position from `wxWindow:popupMenu/4` in order to use the current mouse pointer position.\n\nIf the event originated from a keyboard event, the value returned from this function will\nbe wxDefaultPosition.","ref":"wxContextMenuEvent.html#getPosition/1"},{"type":"function","title":"wxContextMenuEvent.setPosition/2","doc":"Sets the position at which the menu should be shown.","ref":"wxContextMenuEvent.html#setPosition/2"},{"type":"type","title":"wxContextMenuEvent.wxContextMenu/0","doc":"","ref":"wxContextMenuEvent.html#t:wxContextMenu/0"},{"type":"type","title":"wxContextMenuEvent.wxContextMenuEvent/0","doc":"","ref":"wxContextMenuEvent.html#t:wxContextMenuEvent/0"},{"type":"type","title":"wxContextMenuEvent.wxContextMenuEventType/0","doc":"","ref":"wxContextMenuEvent.html#t:wxContextMenuEventType/0"},{"type":"module","title":"wxControl","doc":"This is the base class for a control or \"widget\".\n\nA control is generally a small window which processes user input and/or displays one or\nmore item of data.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxControl](https://docs.wxwidgets.org/3.2/classwx_control.html)","ref":"wxControl.html"},{"type":"module","title":"Events - wxControl","doc":"Event types emitted from this class:\n\n* [`command_text_copy`](`m:wxClipboardTextEvent`)\n\n* [`command_text_cut`](`m:wxClipboardTextEvent`)\n\n* [`command_text_paste`](`m:wxClipboardTextEvent`)","ref":"wxControl.html#module-events"},{"type":"function","title":"wxControl.getLabel/1","doc":"Returns the control's label, as it was passed to `setLabel/2`.\n\nNote that the returned string may contains mnemonics (\"&\" characters) if they were passed\nto the `setLabel/2` function; use `GetLabelText()` (not implemented in wx) if they are undesired.\n\nAlso note that the returned string is always the string which was passed to `setLabel/2` but may be\ndifferent from the string passed to `SetLabelText()` (not implemented in wx) (since this\nlast one escapes mnemonic characters).","ref":"wxControl.html#getLabel/1"},{"type":"function","title":"wxControl.setLabel/2","doc":"Sets the control's label.\n\nAll \"&\" characters in the `label` are special and indicate that the following character\nis a `mnemonic` for this control and can be used to activate it from the keyboard\n(typically by using `Alt` key in combination with it). To insert a literal ampersand\ncharacter, you need to double it, i.e. use \"&&\". If this behaviour is undesirable, use `SetLabelText()`\n(not implemented in wx) instead.","ref":"wxControl.html#setLabel/2"},{"type":"type","title":"wxControl.wxControl/0","doc":"","ref":"wxControl.html#t:wxControl/0"},{"type":"module","title":"wxControlWithItems","doc":"This is convenience class that derives from both `m:wxControl` and `wxItemContainer` (not\nimplemented in wx).\n\nIt is used as basis for some wxWidgets controls (`m:wxChoice` and `m:wxListBox`).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxControlWithItems](https://docs.wxwidgets.org/3.2/classwx_control_with_items.html)","ref":"wxControlWithItems.html"},{"type":"function","title":"wxControlWithItems.append/2","doc":"Appends item into the control.\n\nReturn: The return value is the index of the newly inserted item. Note that this may be\ndifferent from the last one if the control is sorted (e.g. has `wxLB_SORT` or `wxCB_SORT`\nstyle).","ref":"wxControlWithItems.html#append/2"},{"type":"function","title":"wxControlWithItems.append/3","doc":"Appends item into the control.\n\nReturn: The return value is the index of the newly inserted item. Note that this may be\ndifferent from the last one if the control is sorted (e.g. has `wxLB_SORT` or `wxCB_SORT`\nstyle).","ref":"wxControlWithItems.html#append/3"},{"type":"function","title":"wxControlWithItems.appendStrings/2","doc":"Appends several items at once into the control.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","ref":"wxControlWithItems.html#appendStrings/2"},{"type":"function","title":"wxControlWithItems.appendStrings/3","doc":"Appends several items at once into the control.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","ref":"wxControlWithItems.html#appendStrings/3"},{"type":"function","title":"wxControlWithItems.clear/1","doc":"Removes all items from the control.\n\n`clear/1` also deletes the client data of the existing items if it is owned by the control.","ref":"wxControlWithItems.html#clear/1"},{"type":"function","title":"wxControlWithItems.delete/2","doc":"Deletes an item from the control.\n\nThe client data associated with the item will be also deleted if it is owned by the\ncontrol. Note that it is an error (signalled by an assert failure in debug builds) to\nremove an item with the index negative or greater or equal than the number of items in the control.\n\nIf there is a currently selected item below the item being deleted, i.e. if `getSelection/1` returns a\nvalid index greater than or equal to `n`, the selection is invalidated when this function\nis called. However if the selected item appears before the item being deleted, the\nselection is preserved unchanged.\n\nSee: `clear/1`","ref":"wxControlWithItems.html#delete/2"},{"type":"function","title":"wxControlWithItems.findString/2","doc":"","ref":"wxControlWithItems.html#findString/2"},{"type":"function","title":"wxControlWithItems.findString/3","doc":"Finds an item whose label matches the given string.\n\nReturn: The zero-based position of the item, or wxNOT_FOUND if the string was not found.","ref":"wxControlWithItems.html#findString/3"},{"type":"function","title":"wxControlWithItems.getClientData/2","doc":"Returns a pointer to the client data associated with the given item (if any).\n\nIt is an error to call this function for a control which doesn't have typed client data\nat all although it is OK to call it even if the given item doesn't have any client data\nassociated with it (but other items do).\n\nNotice that the returned pointer is still owned by the control and will be deleted by it,\nuse `DetachClientObject()` (not implemented in wx) if you want to remove the pointer from\nthe control.\n\nReturn: A pointer to the client data, or NULL if not present.","ref":"wxControlWithItems.html#getClientData/2"},{"type":"function","title":"wxControlWithItems.getCount/1","doc":"Returns the number of items in the control.\n\nSee: `isEmpty/1`","ref":"wxControlWithItems.html#getCount/1"},{"type":"function","title":"wxControlWithItems.getSelection/1","doc":"Returns the index of the selected item or `wxNOT\\_FOUND` if no item is selected.\n\nReturn: The position of the current selection.\n\nRemark: This method can be used with single selection list boxes only, you should use `wxListBox:getSelections/1`\nfor the list boxes with wxLB_MULTIPLE style.\n\nSee:\n* `setSelection/2`\n\n* `getStringSelection/1`","ref":"wxControlWithItems.html#getSelection/1"},{"type":"function","title":"wxControlWithItems.getString/2","doc":"Returns the label of the item with the given index.\n\nReturn: The label of the item or an empty string if the position was invalid.","ref":"wxControlWithItems.html#getString/2"},{"type":"function","title":"wxControlWithItems.getStringSelection/1","doc":"Returns the label of the selected item or an empty string if no item is selected.\n\nSee: `getSelection/1`","ref":"wxControlWithItems.html#getStringSelection/1"},{"type":"function","title":"wxControlWithItems.insert/3","doc":"Inserts item into the control.\n\nReturn: The return value is the index of the newly inserted item. If the insertion failed\nfor some reason, -1 is returned.","ref":"wxControlWithItems.html#insert/3"},{"type":"function","title":"wxControlWithItems.insert/4","doc":"Inserts item into the control.\n\nReturn: The return value is the index of the newly inserted item. If the insertion failed\nfor some reason, -1 is returned.","ref":"wxControlWithItems.html#insert/4"},{"type":"function","title":"wxControlWithItems.insertStrings/3","doc":"Inserts several items at once into the control.\n\nNotice that calling this method is usually much faster than inserting them one by one if\nyou need to insert a lot of items.\n\nReturn: The return value is the index of the last inserted item. If the insertion failed\nfor some reason, -1 is returned.","ref":"wxControlWithItems.html#insertStrings/3"},{"type":"function","title":"wxControlWithItems.insertStrings/4","doc":"Inserts several items at once into the control.\n\nNotice that calling this method is usually much faster than inserting them one by one if\nyou need to insert a lot of items.\n\nReturn: The return value is the index of the last inserted item. If the insertion failed\nfor some reason, -1 is returned.","ref":"wxControlWithItems.html#insertStrings/4"},{"type":"function","title":"wxControlWithItems.isEmpty/1","doc":"Returns true if the control is empty or false if it has some items.\n\nSee: `getCount/1`","ref":"wxControlWithItems.html#isEmpty/1"},{"type":"function","title":"wxControlWithItems.select/2","doc":"This is the same as `setSelection/2` and exists only because it is slightly more natural\nfor controls which support multiple selection.","ref":"wxControlWithItems.html#select/2"},{"type":"function","title":"wxControlWithItems.setClientData/3","doc":"Associates the given typed client data pointer with the given item: the `data` object\nwill be deleted when the item is deleted (either explicitly by using `delete/2` or\nimplicitly when the control itself is destroyed).\n\nNote that it is an error to call this function if any untyped client data pointers had\nbeen associated with the control items before.","ref":"wxControlWithItems.html#setClientData/3"},{"type":"function","title":"wxControlWithItems.setSelection/2","doc":"Sets the selection to the given item `n` or removes the selection entirely if `n` == `wxNOT\\_FOUND`.\n\nNote that this does not cause any command events to be emitted nor does it deselect any\nother items in the controls which support multiple selections.\n\nSee:\n* `setString/3`\n\n* `setStringSelection/2`","ref":"wxControlWithItems.html#setSelection/2"},{"type":"function","title":"wxControlWithItems.setString/3","doc":"Sets the label for the given item.","ref":"wxControlWithItems.html#setString/3"},{"type":"function","title":"wxControlWithItems.setStringSelection/2","doc":"Selects the item with the specified string in the control.\n\nThis method doesn't cause any command events to be emitted.\n\nNotice that this method is case-insensitive, i.e. the string is compared with all the\nelements of the control case-insensitively and the first matching entry is selected, even\nif it doesn't have exactly the same case as this string and there is an exact match afterwards.\n\nReturn: true if the specified string has been selected, false if it wasn't found in the\ncontrol.","ref":"wxControlWithItems.html#setStringSelection/2"},{"type":"type","title":"wxControlWithItems.wxControlWithItems/0","doc":"","ref":"wxControlWithItems.html#t:wxControlWithItems/0"},{"type":"module","title":"wxCursor","doc":"A cursor is a small bitmap usually used for denoting where the mouse pointer is, with a\npicture that might indicate the interpretation of a mouse click.\n\nAs with icons, cursors in X and MS Windows are created in a different manner. Therefore,\nseparate cursors will be created for the different environments. Platform-specific methods\nfor creating a `m:wxCursor` object are catered for, and this is an occasion where\nconditional compilation will probably be required (see `m:wxIcon` for an example).\n\nA single cursor object may be used in many windows (any subwindow type). The wxWidgets\nconvention is to set the cursor for a window, as in X, rather than to set it globally as\nin MS Windows, although a global `wx_misc:setCursor/1` function is also available for MS Windows use.\n\nCreating a Custom Cursor\n\nThe following is an example of creating a cursor from 32x32 bitmap data (down_bits) and a\nmask (down_mask) where 1 is black and 0 is white for the bits, and 1 is opaque and 0 is\ntransparent for the mask. It works on Windows and GTK+.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullCursor\n\n* ?wxSTANDARD\\_CURSOR\n\n* ?wxHOURGLASS\\_CURSOR\n\n* ?wxCROSS\\_CURSOR\n\nSee:\n* `m:wxBitmap`\n\n* `m:wxIcon`\n\n* `wxWindow:setCursor/2`\n\n* `wx_misc:setCursor/1`\n\n* ?wxStockCursor\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxCursor](https://docs.wxwidgets.org/3.2/classwx_cursor.html)","ref":"wxCursor.html"},{"type":"function","title":"wxCursor.destroy/1","doc":"Destroys the object","ref":"wxCursor.html#destroy/1"},{"type":"function","title":"wxCursor.isOk/1","doc":"Returns true if cursor data is present.","ref":"wxCursor.html#isOk/1"},{"type":"function","title":"wxCursor.new/0","doc":"Default constructor.","ref":"wxCursor.html#new/0"},{"type":"function","title":"wxCursor.new/1","doc":"Constructs a cursor using a cursor identifier.","ref":"wxCursor.html#new/1"},{"type":"function","title":"wxCursor.new/2","doc":"Constructs a cursor by passing a string resource name or filename.\n\nThe arguments `hotSpotX` and `hotSpotY` are only used when there's no hotspot info in the\nresource/image-file to load (e.g. when using `wxBITMAP_TYPE_ICO` under wxMSW or `wxBITMAP_TYPE_XPM`\nunder wxGTK).","ref":"wxCursor.html#new/2"},{"type":"function","title":"wxCursor.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxCursor.html#ok/1"},{"type":"type","title":"wxCursor.wxCursor/0","doc":"","ref":"wxCursor.html#t:wxCursor/0"},{"type":"module","title":"wxDC","doc":"A `m:wxDC` is a `\"device context\"` onto which graphics and text can be drawn.\n\nIt is intended to represent different output devices and offers a common abstract API for\ndrawing on any of them.\n\nwxWidgets offers an alternative drawing API based on the modern drawing backends GDI+,\nCoreGraphics, Cairo and Direct2D. See `m:wxGraphicsContext`, `m:wxGraphicsRenderer` and\nrelated classes. There is also a `m:wxGCDC` linking the APIs by offering the `m:wxDC` API\non top of a `m:wxGraphicsContext`.\n\n`m:wxDC` is an abstract base class and cannot be created directly. Use `m:wxPaintDC`, `m:wxClientDC`, `m:wxWindowDC`, `m:wxScreenDC`, `m:wxMemoryDC`\nor `wxPrinterDC` (not implemented in wx). Notice that device contexts which are\nassociated with windows (i.e. `m:wxClientDC`, `m:wxWindowDC` and `m:wxPaintDC`) use the\nwindow font and colours by default (starting with wxWidgets 2.9.0) but the other device\ncontext classes use system-default values so you always must set the appropriate fonts and\ncolours before using them.\n\nIn addition to the versions of the methods documented below, there are also versions\nwhich accept single {X,Y} parameter instead of the two wxCoord ones or {X,Y} and\n{Width,Height} instead of the four wxCoord parameters.\n\nBeginning with wxWidgets 2.9.0 the entire `m:wxDC` code has been reorganized. All\nplatform dependent code (actually all drawing code) has been moved into backend classes\nwhich derive from a common wxDCImpl class. The user-visible classes such as `m:wxClientDC`\nand `m:wxPaintDC` merely forward all calls to the backend implementation.\n\nDevice and logical units\n\nIn the `m:wxDC` context there is a distinction between `logical` units and `device` units.\n\n`Device` units are the units native to the particular device; e.g. for a screen, a device\nunit is a `pixel`. For a printer, the device unit is defined by the resolution of the\nprinter (usually given in `DPI:` dot-per-inch).\n\nAll `m:wxDC` functions use instead `logical` units, unless where explicitly stated.\nLogical units are arbitrary units mapped to device units using the current mapping mode\n(see `setMapMode/2`).\n\nThis mechanism allows reusing the same code which prints on e.g. a window on the screen\nto print on e.g. a paper.\n\nSupport for Transparency / Alpha Channel\n\nIn general `m:wxDC` methods don't support alpha transparency and the alpha component of `wx_color()`\nis simply ignored and you need to use `m:wxGraphicsContext` for full transparency support.\nThere are, however, a few exceptions: first, under macOS and GTK+ 3 colours with alpha\nchannel are supported in all the normal wxDC-derived classes as they use `m:wxGraphicsContext`\ninternally. Second, under all platforms `wxSVGFileDC` (not implemented in wx) also fully\nsupports alpha channel. In both of these cases the instances of `m:wxPen` or `m:wxBrush`\nthat are built from `wx_color()` use the colour's alpha values when stroking or filling.\n\nSupport for Transformation Matrix\n\nOn some platforms (currently under MSW, GTK+ 3, macOS) `m:wxDC` has support for applying\nan arbitrary affine transformation matrix to its coordinate system (since 3.1.1 this\nfeature is also supported by `m:wxGCDC` in all ports). Call `CanUseTransformMatrix()` (not\nimplemented in wx) to check if this support is available and then call `SetTransformMatrix()`\n(not implemented in wx) if it is. If the transformation matrix is not supported, `SetTransformMatrix()`\n(not implemented in wx) always simply returns `false` and doesn't do anything.\n\nThis feature is only available when `wxUSE_DC_TRANSFORM_MATRIX` build option is enabled.\n\nSee:\n* [Overview dc](https://docs.wxwidgets.org/3.2/overview_dc.html#overview_dc)\n\n* `m:wxGraphicsContext`\n\nwxWidgets docs: [wxDC](https://docs.wxwidgets.org/3.2/classwx_d_c.html)","ref":"wxDC.html"},{"type":"function","title":"wxDC.blit/5","doc":"","ref":"wxDC.html#blit/5"},{"type":"function","title":"wxDC.blit/6","doc":"Copy from a source DC to this DC.\n\nWith this method you can specify the destination coordinates and the size of area to copy\nwhich will be the same for both the source and target DCs. If you need to apply scaling\nwhile copying, use `StretchBlit()` (not implemented in wx).\n\nNotice that source DC coordinates `xsrc` and `ysrc` are interpreted using the current\nsource DC coordinate system, i.e. the scale, origin position and axis directions are taken\ninto account when transforming them to physical (pixel) coordinates.\n\nRemark: There is partial support for `blit/6` in `m:wxPostScriptDC`, under X.\n\nSee:\n* `m:wxMemoryDC`\n\n* `m:wxBitmap`\n\n* `m:wxMask`","ref":"wxDC.html#blit/6"},{"type":"function","title":"wxDC.calcBoundingBox/3","doc":"Adds the specified point to the bounding box which can be retrieved with `minX/1`, `maxX/1`\nand `minY/1`, `maxY/1` functions.\n\nSee: `resetBoundingBox/1`","ref":"wxDC.html#calcBoundingBox/3"},{"type":"function","title":"wxDC.clear/1","doc":"Clears the device context using the current background brush.\n\nNote that `setBackground/2` method must be used to set the brush used by `clear/1`, the brush used for filling the\nshapes set by `setBrush/2` is ignored by it.\n\nIf no background brush was set, solid white brush is used to clear the device context.","ref":"wxDC.html#clear/1"},{"type":"function","title":"wxDC.crossHair/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#crossHair/2"},{"type":"function","title":"wxDC.destroyClippingRegion/1","doc":"Destroys the current clipping region so that none of the DC is clipped.\n\nSee: `setClippingRegion/3`","ref":"wxDC.html#destroyClippingRegion/1"},{"type":"function","title":"wxDC.deviceToLogicalX/2","doc":"Convert `device` X coordinate to logical coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","ref":"wxDC.html#deviceToLogicalX/2"},{"type":"function","title":"wxDC.deviceToLogicalXRel/2","doc":"Convert `device` X coordinate to relative logical coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a width, for example.","ref":"wxDC.html#deviceToLogicalXRel/2"},{"type":"function","title":"wxDC.deviceToLogicalY/2","doc":"Converts `device` Y coordinate to logical coordinate, using the current mapping mode,\nuser scale factor, device origin and axis orientation.","ref":"wxDC.html#deviceToLogicalY/2"},{"type":"function","title":"wxDC.deviceToLogicalYRel/2","doc":"Convert `device` Y coordinate to relative logical coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a height, for example.","ref":"wxDC.html#deviceToLogicalYRel/2"},{"type":"function","title":"wxDC.drawArc/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawArc/4"},{"type":"function","title":"wxDC.drawBitmap/3","doc":"","ref":"wxDC.html#drawBitmap/3"},{"type":"function","title":"wxDC.drawBitmap/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawBitmap/4"},{"type":"function","title":"wxDC.drawCheckMark/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawCheckMark/2"},{"type":"function","title":"wxDC.drawCircle/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawCircle/3"},{"type":"function","title":"wxDC.drawEllipse/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawEllipse/2"},{"type":"function","title":"wxDC.drawEllipse/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawEllipse/3"},{"type":"function","title":"wxDC.drawEllipticArc/5","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawEllipticArc/5"},{"type":"function","title":"wxDC.drawIcon/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawIcon/3"},{"type":"function","title":"wxDC.drawLabel/3","doc":"","ref":"wxDC.html#drawLabel/3"},{"type":"function","title":"wxDC.drawLabel/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawLabel/4"},{"type":"function","title":"wxDC.drawLine/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawLine/3"},{"type":"function","title":"wxDC.drawLines/2","doc":"","ref":"wxDC.html#drawLines/2"},{"type":"function","title":"wxDC.drawLines/3","doc":"Draws lines using an array of points of size `n` adding the optional offset coordinate.\n\nThe current pen is used for drawing the lines.","ref":"wxDC.html#drawLines/3"},{"type":"function","title":"wxDC.drawPoint/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawPoint/2"},{"type":"function","title":"wxDC.drawPolygon/2","doc":"","ref":"wxDC.html#drawPolygon/2"},{"type":"function","title":"wxDC.drawPolygon/3","doc":"Draws a filled polygon using an array of points of size `n`, adding the optional offset\ncoordinate.\n\nThe first and last points are automatically closed.\n\nThe last argument specifies the fill rule: `wxODDEVEN_RULE` (the default) or `wxWINDING_RULE`.\n\nThe current pen is used for drawing the outline, and the current brush for filling the\nshape. Using a transparent brush suppresses filling.","ref":"wxDC.html#drawPolygon/3"},{"type":"function","title":"wxDC.drawRectangle/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawRectangle/2"},{"type":"function","title":"wxDC.drawRectangle/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawRectangle/3"},{"type":"function","title":"wxDC.drawRotatedText/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawRotatedText/4"},{"type":"function","title":"wxDC.drawRoundedRectangle/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawRoundedRectangle/3"},{"type":"function","title":"wxDC.drawRoundedRectangle/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawRoundedRectangle/4"},{"type":"function","title":"wxDC.drawText/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#drawText/3"},{"type":"function","title":"wxDC.endDoc/1","doc":"Ends a document (only relevant when outputting to a printer).","ref":"wxDC.html#endDoc/1"},{"type":"function","title":"wxDC.endPage/1","doc":"Ends a document page (only relevant when outputting to a printer).","ref":"wxDC.html#endPage/1"},{"type":"function","title":"wxDC.floodFill/3","doc":"","ref":"wxDC.html#floodFill/3"},{"type":"function","title":"wxDC.floodFill/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#floodFill/4"},{"type":"function","title":"wxDC.getBackground/1","doc":"Gets the brush used for painting the background.\n\nSee: `setBackground/2`","ref":"wxDC.html#getBackground/1"},{"type":"function","title":"wxDC.getBackgroundMode/1","doc":"Returns the current background mode: `wxPENSTYLE\\_SOLID` or `wxPENSTYLE\\_TRANSPARENT`.\n\nSee: `setBackgroundMode/2`","ref":"wxDC.html#getBackgroundMode/1"},{"type":"function","title":"wxDC.getBrush/1","doc":"Gets the current brush.\n\nSee: `setBrush/2`","ref":"wxDC.html#getBrush/1"},{"type":"function","title":"wxDC.getCharHeight/1","doc":"Gets the character height of the currently set font.","ref":"wxDC.html#getCharHeight/1"},{"type":"function","title":"wxDC.getCharWidth/1","doc":"Gets the average character width of the currently set font.","ref":"wxDC.html#getCharWidth/1"},{"type":"function","title":"wxDC.getClippingBox/1","doc":"` Gets the rectangle surrounding the current clipping region. If no clipping region is set\nthis function returns the extent of the device context. @remarks Clipping region is given\nin logical coordinates. @param x If non- NULL , filled in with\nthe logical horizontal coordinate of the top left corner of the clipping region if the\nfunction returns true or 0 otherwise. @param y If non- NULL ,\nfilled in with the logical vertical coordinate of the top left corner of the clipping\nregion if the function returns true or 0 otherwise. @param width If non- NULL , filled in with the width of the clipping region if the\nfunction returns true or the device context width otherwise. @param height If non- NULL , filled in with the height of the clipping region if the\nfunction returns true or the device context height otherwise. `\n\nReturn: true if there is a clipping region or false if there is no active clipping region\n(note that this return value is available only since wxWidgets 3.1.2, this function didn't\nreturn anything in the previous versions).","ref":"wxDC.html#getClippingBox/1"},{"type":"function","title":"wxDC.getFont/1","doc":"Gets the current font.\n\nNotice that even although each device context object has some default font after\ncreation, this method would return a ?wxNullFont initially and only after calling `setFont/2` a valid\nfont is returned.","ref":"wxDC.html#getFont/1"},{"type":"function","title":"wxDC.getLayoutDirection/1","doc":"Gets the current layout direction of the device context.\n\nOn platforms where RTL layout is supported, the return value will either be `wxLayout_LeftToRight`\nor `wxLayout_RightToLeft`. If RTL layout is not supported, the return value will be `wxLayout_Default`.\n\nSee: `setLayoutDirection/2`","ref":"wxDC.html#getLayoutDirection/1"},{"type":"function","title":"wxDC.getLogicalFunction/1","doc":"Gets the current logical function.\n\nSee: `setLogicalFunction/2`","ref":"wxDC.html#getLogicalFunction/1"},{"type":"function","title":"wxDC.getMapMode/1","doc":"Gets the current mapping mode for the device context.\n\nSee: `setMapMode/2`","ref":"wxDC.html#getMapMode/1"},{"type":"function","title":"wxDC.getMultiLineTextExtent/2","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure.\n\nReturn: The text extent as a {Width,Height} object.\n\nNote: This function works with both single-line and multi-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getTextExtent/3`","ref":"wxDC.html#getMultiLineTextExtent/2"},{"type":"function","title":"wxDC.getMultiLineTextExtent/3","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure, `heightLine`, if non NULL, is where to store the\nheight of a single line.\n\nThe text extent is set in the given `w` and `h` pointers.\n\nIf the optional parameter `font` is specified and valid, then it is used for the text\nextent calculation, otherwise the currently selected font is used.\n\nIf `string` is empty, its horizontal extent is 0 but, for convenience when using this\nfunction for allocating enough space for a possibly multi-line string, its vertical extent\nis the same as the height of an empty line of text. Please note that this behaviour\ndiffers from that of `getTextExtent/3`.\n\nNote: This function works with both single-line and multi-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getTextExtent/3`","ref":"wxDC.html#getMultiLineTextExtent/3"},{"type":"function","title":"wxDC.getPartialTextExtents/2","doc":"Fills the `widths` array with the widths from the beginning of `text` to the\ncorresponding character of `text`.\n\nThe generic version simply builds a running total of the widths of each character using `getTextExtent/3`,\nhowever if the various platforms have a native API function that is faster or more\naccurate than the generic implementation then it should be used instead.\n\nSee:\n* `getMultiLineTextExtent/3`\n\n* `getTextExtent/3`","ref":"wxDC.html#getPartialTextExtents/2"},{"type":"function","title":"wxDC.getPen/1","doc":"Gets the current pen.\n\nSee: `setPen/2`","ref":"wxDC.html#getPen/1"},{"type":"function","title":"wxDC.getPixel/2","doc":"Gets in `colour` the colour at the specified location.\n\nThis method isn't available for `m:wxPostScriptDC` or `wxMetafileDC` (not implemented in\nwx) nor for any DC in wxOSX port and simply returns false there.\n\nNote: Setting a pixel can be done using `drawPoint/2`.\n\nNote: This method shouldn't be used with `m:wxPaintDC` as accessing the DC while drawing\ncan result in unexpected results, notably in wxGTK.","ref":"wxDC.html#getPixel/2"},{"type":"function","title":"wxDC.getPPI/1","doc":"Returns the resolution of the device in pixels per inch.","ref":"wxDC.html#getPPI/1"},{"type":"function","title":"wxDC.getSize/1","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#getSize/1"},{"type":"function","title":"wxDC.getSizeMM/1","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#getSizeMM/1"},{"type":"function","title":"wxDC.getTextBackground/1","doc":"Gets the current text background colour.\n\nSee: `setTextBackground/2`","ref":"wxDC.html#getTextBackground/1"},{"type":"function","title":"wxDC.getTextExtent/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#getTextExtent/2"},{"type":"function","title":"wxDC.getTextExtent/3","doc":"Gets the dimensions of the string using the currently selected font.\n\n`string` is the text string to measure, `descent` is the dimension from the baseline of\nthe font to the bottom of the descender, and `externalLeading` is any extra vertical space\nadded to the font by the font designer (usually is zero).\n\nThe text extent is returned in `w` and `h` pointers or as a {Width,Height} object\ndepending on which version of this function is used.\n\nIf the optional parameter `font` is specified and valid, then it is used for the text\nextent calculation. Otherwise the currently selected font is.\n\nIf `string` is empty, its extent is 0 in both directions, as expected.\n\nNote: This function only works with single-line strings.\n\nSee:\n* `m:wxFont`\n\n* `setFont/2`\n\n* `getPartialTextExtents/2`\n\n* `getMultiLineTextExtent/3`","ref":"wxDC.html#getTextExtent/3"},{"type":"function","title":"wxDC.getTextForeground/1","doc":"Gets the current text foreground colour.\n\nSee: `setTextForeground/2`","ref":"wxDC.html#getTextForeground/1"},{"type":"function","title":"wxDC.getUserScale/1","doc":"Gets the current user scale factor.\n\nSee: `setUserScale/3`","ref":"wxDC.html#getUserScale/1"},{"type":"function","title":"wxDC.gradientFillConcentric/4","doc":"Fill the area specified by rect with a radial gradient, starting from `initialColour` at\nthe centre of the circle and fading to `destColour` on the circle outside.\n\nThe circle is placed at the centre of `rect`.\n\nNote: Currently this function is very slow, don't use it for real-time drawing.","ref":"wxDC.html#gradientFillConcentric/4"},{"type":"function","title":"wxDC.gradientFillConcentric/5","doc":"Fill the area specified by rect with a radial gradient, starting from `initialColour` at\nthe centre of the circle and fading to `destColour` on the circle outside.\n\n`circleCenter` are the relative coordinates of centre of the circle in the specified `rect`.\n\nNote: Currently this function is very slow, don't use it for real-time drawing.","ref":"wxDC.html#gradientFillConcentric/5"},{"type":"function","title":"wxDC.gradientFillLinear/4","doc":"","ref":"wxDC.html#gradientFillLinear/4"},{"type":"function","title":"wxDC.gradientFillLinear/5","doc":"Fill the area specified by `rect` with a linear gradient, starting from `initialColour`\nand eventually fading to `destColour`.\n\nThe `nDirection` specifies the direction of the colour change, default is to use `initialColour`\non the left part of the rectangle and `destColour` on the right one.","ref":"wxDC.html#gradientFillLinear/5"},{"type":"function","title":"wxDC.isOk/1","doc":"Returns true if the DC is ok to use.","ref":"wxDC.html#isOk/1"},{"type":"function","title":"wxDC.logicalToDeviceX/2","doc":"Converts logical X coordinate to device coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","ref":"wxDC.html#logicalToDeviceX/2"},{"type":"function","title":"wxDC.logicalToDeviceXRel/2","doc":"Converts logical X coordinate to relative device coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a width, for example.","ref":"wxDC.html#logicalToDeviceXRel/2"},{"type":"function","title":"wxDC.logicalToDeviceY/2","doc":"Converts logical Y coordinate to device coordinate, using the current mapping mode, user\nscale factor, device origin and axis orientation.","ref":"wxDC.html#logicalToDeviceY/2"},{"type":"function","title":"wxDC.logicalToDeviceYRel/2","doc":"Converts logical Y coordinate to relative device coordinate, using the current mapping\nmode and user scale factor but ignoring the axis orientation.\n\nUse this for converting a height, for example.","ref":"wxDC.html#logicalToDeviceYRel/2"},{"type":"function","title":"wxDC.maxX/1","doc":"Gets the maximum horizontal extent used in drawing commands so far.","ref":"wxDC.html#maxX/1"},{"type":"function","title":"wxDC.maxY/1","doc":"Gets the maximum vertical extent used in drawing commands so far.","ref":"wxDC.html#maxY/1"},{"type":"function","title":"wxDC.minX/1","doc":"Gets the minimum horizontal extent used in drawing commands so far.","ref":"wxDC.html#minX/1"},{"type":"function","title":"wxDC.minY/1","doc":"Gets the minimum vertical extent used in drawing commands so far.","ref":"wxDC.html#minY/1"},{"type":"function","title":"wxDC.resetBoundingBox/1","doc":"Resets the bounding box: after a call to this function, the bounding box doesn't contain\nanything.\n\nSee: `calcBoundingBox/3`","ref":"wxDC.html#resetBoundingBox/1"},{"type":"function","title":"wxDC.setAxisOrientation/3","doc":"Sets the x and y axis orientation (i.e. the direction from lowest to highest values on\nthe axis).\n\nThe default orientation is x axis from left to right and y axis from top down.","ref":"wxDC.html#setAxisOrientation/3"},{"type":"function","title":"wxDC.setBackground/2","doc":"Sets the current background brush for the DC.","ref":"wxDC.html#setBackground/2"},{"type":"function","title":"wxDC.setBackgroundMode/2","doc":"`mode` may be one of `wxPENSTYLE\\_SOLID` and `wxPENSTYLE\\_TRANSPARENT`.\n\nThis setting determines whether text will be drawn with a background colour or not.","ref":"wxDC.html#setBackgroundMode/2"},{"type":"function","title":"wxDC.setBrush/2","doc":"Sets the current brush for the DC.\n\nIf the argument is ?wxNullBrush (or another invalid brush; see `wxBrush:isOk/1`), the current brush is\nselected out of the device context (leaving `m:wxDC` without any valid brush), allowing\nthe current brush to be destroyed safely.\n\nSee:\n* `m:wxBrush`\n\n* `m:wxMemoryDC`","ref":"wxDC.html#setBrush/2"},{"type":"function","title":"wxDC.setClippingRegion/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#setClippingRegion/2"},{"type":"function","title":"wxDC.setClippingRegion/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxDC.html#setClippingRegion/3"},{"type":"function","title":"wxDC.setDeviceOrigin/3","doc":"Sets the device origin (i.e. the origin in pixels after scaling has been applied).\n\nThis function may be useful in Windows printing operations for placing a graphic on a\npage.","ref":"wxDC.html#setDeviceOrigin/3"},{"type":"function","title":"wxDC.setFont/2","doc":"Sets the current font for the DC.\n\nIf the argument is ?wxNullFont (or another invalid font; see `wxFont:isOk/1`), the current font is\nselected out of the device context (leaving `m:wxDC` without any valid font), allowing the\ncurrent font to be destroyed safely.\n\nSee: `m:wxFont`","ref":"wxDC.html#setFont/2"},{"type":"function","title":"wxDC.setLayoutDirection/2","doc":"Sets the current layout direction for the device context.\n\nSee: `getLayoutDirection/1`","ref":"wxDC.html#setLayoutDirection/2"},{"type":"function","title":"wxDC.setLogicalFunction/2","doc":"Sets the current logical function for the device context.\n\nNote: This function is not fully supported in all ports, due to the limitations of the\nunderlying drawing model. Notably, `wxINVERT` which was commonly used for drawing rubber\nbands or other moving outlines in the past, is not, and will not, be supported by wxGTK3\nand wxMac. The suggested alternative is to draw temporarily objects normally and refresh\nthe (affected part of the) window to remove them later.\n\nIt determines how a `source` pixel (from a pen or brush colour, or source device context\nif using `blit/6`) combines with a `destination` pixel in the current device context. Text drawing\nis not affected by this function.\n\nSee ?wxRasterOperationMode enumeration values for more info.\n\nThe default is `wxCOPY`, which simply draws with the current colour. The others combine\nthe current colour and the background using a logical operation.","ref":"wxDC.html#setLogicalFunction/2"},{"type":"function","title":"wxDC.setMapMode/2","doc":"The mapping mode of the device context defines the unit of measurement used to convert `logical`\nunits to `device` units.\n\nNote that in X, text drawing isn't handled consistently with the mapping mode; a font is\nalways specified in point size. However, setting the user scale (see `setUserScale/3`) scales the text\nappropriately. In Windows, scalable TrueType fonts are always used; in X, results depend\non availability of fonts, but usually a reasonable match is found.\n\nThe coordinate origin is always at the top left of the screen/printer.\n\nDrawing to a Windows printer device context uses the current mapping mode, but mapping\nmode is currently ignored for PostScript output.","ref":"wxDC.html#setMapMode/2"},{"type":"function","title":"wxDC.setPalette/2","doc":"If this is a window DC or memory DC, assigns the given palette to the window or bitmap\nassociated with the DC.\n\nIf the argument is ?wxNullPalette, the current palette is selected out of the device\ncontext, and the original palette restored.\n\nSee: `m:wxPalette`","ref":"wxDC.html#setPalette/2"},{"type":"function","title":"wxDC.setPen/2","doc":"Sets the current pen for the DC.\n\nIf the argument is ?wxNullPen (or another invalid pen; see `wxPen:isOk/1`), the current pen is selected\nout of the device context (leaving `m:wxDC` without any valid pen), allowing the current\npen to be destroyed safely.\n\nSee: `m:wxMemoryDC`","ref":"wxDC.html#setPen/2"},{"type":"function","title":"wxDC.setTextBackground/2","doc":"Sets the current text background colour for the DC.","ref":"wxDC.html#setTextBackground/2"},{"type":"function","title":"wxDC.setTextForeground/2","doc":"Sets the current text foreground colour for the DC.\n\nSee: `m:wxMemoryDC`","ref":"wxDC.html#setTextForeground/2"},{"type":"function","title":"wxDC.setUserScale/3","doc":"Sets the user scaling factor, useful for applications which require 'zooming'.","ref":"wxDC.html#setUserScale/3"},{"type":"function","title":"wxDC.startDoc/2","doc":"Starts a document (only relevant when outputting to a printer).\n\n`message` is a message to show while printing.","ref":"wxDC.html#startDoc/2"},{"type":"function","title":"wxDC.startPage/1","doc":"Starts a document page (only relevant when outputting to a printer).","ref":"wxDC.html#startPage/1"},{"type":"type","title":"wxDC.wxDC/0","doc":"","ref":"wxDC.html#t:wxDC/0"},{"type":"module","title":"wxDCOverlay","doc":"Connects an overlay with a drawing DC.\n\nSee:\n* `m:wxOverlay`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxDCOverlay](https://docs.wxwidgets.org/3.2/classwx_d_c_overlay.html)","ref":"wxDCOverlay.html"},{"type":"function","title":"wxDCOverlay.clear/1","doc":"Clears the layer, restoring the state at the last init.","ref":"wxDCOverlay.html#clear/1"},{"type":"function","title":"wxDCOverlay.destroy/1","doc":"Destroys the object","ref":"wxDCOverlay.html#destroy/1"},{"type":"function","title":"wxDCOverlay.new/2","doc":"Convenience wrapper that behaves the same using the entire area of the dc.","ref":"wxDCOverlay.html#new/2"},{"type":"function","title":"wxDCOverlay.new/6","doc":"Connects this overlay to the corresponding drawing dc, if the overlay is not initialized\nyet this call will do so.","ref":"wxDCOverlay.html#new/6"},{"type":"type","title":"wxDCOverlay.wxDCOverlay/0","doc":"","ref":"wxDCOverlay.html#t:wxDCOverlay/0"},{"type":"module","title":"wxDataObject","doc":"A `m:wxDataObject` represents data that can be copied to or from the clipboard, or\ndragged and dropped.\n\nThe important thing about `m:wxDataObject` is that this is a 'smart' piece of data unlike\n'dumb' data containers such as memory buffers or files. Being 'smart' here means that the\ndata object itself should know what data formats it supports and how to render itself in\neach of its supported formats.\n\nA supported format, incidentally, is exactly the format in which the data can be\nrequested from a data object or from which the data object may be set. In the general\ncase, an object may support different formats on 'input' and 'output', i.e. it may be able\nto render itself in a given format but not be created from data on this format or vice\nversa. `m:wxDataObject` defines the `wxDataObject::Direction` (not implemented in wx)\nenumeration type which distinguishes between them.\n\nSee `wxDataFormat` (not implemented in wx) documentation for more about formats.\n\nNot surprisingly, being 'smart' comes at a price of added complexity. This is reasonable\nfor the situations when you really need to support multiple formats, but may be annoying\nif you only want to do something simple like cut and paste text.\n\nTo provide a solution for both cases, wxWidgets has two predefined classes which derive\nfrom `m:wxDataObject`: `wxDataObjectSimple` (not implemented in wx) and `wxDataObjectComposite`\n(not implemented in wx). `wxDataObjectSimple` (not implemented in wx) is the simplest `m:wxDataObject`\npossible and only holds data in a single format (such as HTML or text) and `wxDataObjectComposite`\n(not implemented in wx) is the simplest way to implement a `m:wxDataObject` that does\nsupport multiple formats because it achieves this by simply holding several `wxDataObjectSimple`\n(not implemented in wx) objects.\n\nSo, you have several solutions when you need a `m:wxDataObject` class (and you need one\nas soon as you want to transfer data via the clipboard or drag and drop):\n\nPlease note that the easiest way to use drag and drop and the clipboard with multiple\nformats is by using `wxDataObjectComposite` (not implemented in wx), but it is not the\nmost efficient one as each `wxDataObjectSimple` (not implemented in wx) would contain the\nwhole data in its respective formats. Now imagine that you want to paste 200 pages of text\nin your proprietary format, as well as Word, RTF, HTML, Unicode and plain text to the\nclipboard and even today's computers are in trouble. For this case, you will have to\nderive from `m:wxDataObject` directly and make it enumerate its formats and provide the\ndata in the requested format on demand.\n\nNote that neither the GTK+ data transfer mechanisms for clipboard and drag and drop, nor\nOLE data transfer, `copies` any data until another application actually requests the data.\nThis is in contrast to the 'feel' offered to the user of a program who would normally\nthink that the data resides in the clipboard after having pressed 'Copy' - in reality it\nis only declared to be `available`.\n\nYou may also derive your own data object classes from `wxCustomDataObject` (not\nimplemented in wx) for user-defined types. The format of user-defined data is given as a\nmime-type string literal, such as \"application/word\" or \"image/png\". These strings are\nused as they are under Unix (so far only GTK+) to identify a format and are translated\ninto their Windows equivalent under Win32 (using the OLE IDataObject for data exchange to\nand from the clipboard and for drag and drop). Note that the format string translation\nunder Windows is not yet finished.\n\nEach class derived directly from `m:wxDataObject` must override and implement all of its\nfunctions which are pure virtual in the base class. The data objects which only render\ntheir data or only set it (i.e. work in only one direction), should return 0 from `GetFormatCount()`\n(not implemented in wx).\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_dnd)\n\n* `m:wxFileDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxBitmapDataObject`\n\nwxWidgets docs: [wxDataObject](https://docs.wxwidgets.org/3.2/classwx_data_object.html)","ref":"wxDataObject.html"},{"type":"type","title":"wxDataObject.wxDataObject/0","doc":"","ref":"wxDataObject.html#t:wxDataObject/0"},{"type":"module","title":"wxDateEvent","doc":"This event class holds information about a date change and is used together with `m:wxDatePickerCtrl`.\n\nIt also serves as a base class for `m:wxCalendarEvent`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDateEvent](https://docs.wxwidgets.org/3.2/classwx_date_event.html)","ref":"wxDateEvent.html"},{"type":"function","title":"wxDateEvent.getDate/1","doc":"Returns the date.","ref":"wxDateEvent.html#getDate/1"},{"type":"type","title":"wxDateEvent.wxDate/0","doc":"","ref":"wxDateEvent.html#t:wxDate/0"},{"type":"type","title":"wxDateEvent.wxDateEvent/0","doc":"","ref":"wxDateEvent.html#t:wxDateEvent/0"},{"type":"type","title":"wxDateEvent.wxDateEventType/0","doc":"","ref":"wxDateEvent.html#t:wxDateEventType/0"},{"type":"module","title":"wxDatePickerCtrl","doc":"This control allows the user to select a date.\n\nUnlike `m:wxCalendarCtrl`, which is a relatively big control, `m:wxDatePickerCtrl` is\nimplemented as a small window showing the currently selected date. The control can be\nedited using the keyboard, and can also display a popup window for more user-friendly date\nselection, depending on the styles used and the platform.\n\nIt is only available if `wxUSE_DATEPICKCTRL` is set to 1.","ref":"wxDatePickerCtrl.html"},{"type":"module","title":"Styles - wxDatePickerCtrl","doc":"This class supports the following styles:\n\n* wxDP_SPIN: Creates a control without a month calendar drop down but with\nspin-control-like arrows to change individual date components. This style is not supported\nby the generic version.\n\n* wxDP_DROPDOWN: Creates a control with a month calendar drop-down part from which the user\ncan select a date. This style is not supported in OSX/Cocoa native version.\n\n* wxDP_DEFAULT: Creates a control with the style that is best supported for the current\nplatform (currently wxDP_SPIN under Windows and OSX/Cocoa and wxDP_DROPDOWN elsewhere).\n\n* wxDP_ALLOWNONE: With this style, the control allows the user to not enter any valid date\nat all. Without it - the default - the control always has some valid date. This style is\nnot supported in OSX/Cocoa native version.\n\n* wxDP_SHOWCENTURY: Forces display of the century in the default date format. Without this\nstyle the century could be displayed, or not, depending on the default date representation\nin the system. This style is not supported in OSX/Cocoa native version currently. As can\nbe seen from the remarks above, most of the control style are only supported in the native\nMSW implementation. In portable code it's recommended to use `wxDP_DEFAULT` style only,\npossibly combined with `wxDP_SHOWCENTURY` (this is also the style used by default if none\nis specified).\n\nSee:\n* `m:wxCalendarCtrl`\n\n* `m:wxDateEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDatePickerCtrl](https://docs.wxwidgets.org/3.2/classwx_date_picker_ctrl.html)","ref":"wxDatePickerCtrl.html#module-styles"},{"type":"module","title":"Events - wxDatePickerCtrl","doc":"Event types emitted from this class:\n\n* [`date_changed`](`m:wxDateEvent`)","ref":"wxDatePickerCtrl.html#module-events"},{"type":"function","title":"wxDatePickerCtrl.destroy/1","doc":"Destroys the object","ref":"wxDatePickerCtrl.html#destroy/1"},{"type":"function","title":"wxDatePickerCtrl.getRange/3","doc":"If the control had been previously limited to a range of dates using `setRange/3`,\nreturns the lower and upper bounds of this range.\n\nIf no range is set (or only one of the bounds is set), `dt1` and/or `dt2` are set to be invalid.\n\nNotice that when using a native MSW implementation of this control the lower range is\nalways set, even if `setRange/3` hadn't been called explicitly, as the native control only supports\ndates later than year 1601.\n\nReturn: false if no range limits are currently set, true if at least one bound is set.","ref":"wxDatePickerCtrl.html#getRange/3"},{"type":"function","title":"wxDatePickerCtrl.getValue/1","doc":"Returns the currently entered date.\n\nFor a control with `wxDP_ALLOWNONE` style the returned value may be invalid if no date is\nentered, otherwise it is always valid.","ref":"wxDatePickerCtrl.html#getValue/1"},{"type":"function","title":"wxDatePickerCtrl.new/0","doc":"Default constructor.","ref":"wxDatePickerCtrl.html#new/0"},{"type":"function","title":"wxDatePickerCtrl.new/2","doc":"","ref":"wxDatePickerCtrl.html#new/2"},{"type":"function","title":"wxDatePickerCtrl.new/3","doc":"Initializes the object and calls `Create()` (not implemented in wx) with all the\nparameters.","ref":"wxDatePickerCtrl.html#new/3"},{"type":"function","title":"wxDatePickerCtrl.setRange/3","doc":"Sets the valid range for the date selection.\n\nIf `dt1` is valid, it becomes the earliest date (inclusive) accepted by the control. If `dt2`\nis valid, it becomes the latest possible date.\n\nNotice that if the current value is not inside the new range, it will be adjusted to lie\ninside it, i.e. calling this method can change the control value, however no events are\ngenerated by it.\n\nRemark: If the current value of the control is outside of the newly set range bounds, the\nbehaviour is undefined.","ref":"wxDatePickerCtrl.html#setRange/3"},{"type":"function","title":"wxDatePickerCtrl.setValue/2","doc":"Changes the current value of the control.\n\nThe date should be valid unless the control was created with `wxDP_ALLOWNONE` style and\nincluded in the currently selected range, if any.\n\nCalling this method does not result in a date change event.","ref":"wxDatePickerCtrl.html#setValue/2"},{"type":"type","title":"wxDatePickerCtrl.wxDatePickerCtrl/0","doc":"","ref":"wxDatePickerCtrl.html#t:wxDatePickerCtrl/0"},{"type":"module","title":"wxDialog","doc":"A dialog box is a window with a title bar and sometimes a system menu, which can be moved\naround the screen.\n\nIt can contain controls and other windows and is often used to allow the user to make\nsome choice or to answer a question.\n\nDialogs can be made scrollable, automatically, for computers with low resolution screens:\nplease see overview_dialog_autoscrolling for further details.\n\nDialogs usually contain either a single button allowing to close the dialog or two\nbuttons, one accepting the changes and the other one discarding them (such button, if\npresent, is automatically activated if the user presses the \"Esc\" key). By default,\nbuttons with the standard wxID_OK and wxID_CANCEL identifiers behave as expected. Starting\nwith wxWidgets 2.7 it is also possible to use a button with a different identifier\ninstead, see `setAffirmativeId/2` and `SetEscapeId()` (not implemented in wx).\n\nAlso notice that the `createButtonSizer/2` should be used to create the buttons appropriate for the current\nplatform and positioned correctly (including their order which is platform-dependent).\n\nModal and Modeless\n\nThere are two kinds of dialog, modal and modeless. A modal dialog blocks program flow and\nuser input on other windows until it is dismissed, whereas a modeless dialog behaves more\nlike a frame in that program flow continues, and input in other windows is still possible.\nTo show a modal dialog you should use the `showModal/1` method while to show a dialog modelessly you\nsimply use `show/2`, just as with frames.\n\nNote that the modal dialog is one of the very few examples of wxWindow-derived objects\nwhich may be created on the stack and not on the heap. In other words, while most windows\nwould be created like this:\n\nYou can achieve the same result with dialogs by using simpler code:\n\nAn application can define a `m:wxCloseEvent` handler for the dialog to respond to system\nclose events.","ref":"wxDialog.html"},{"type":"module","title":"Styles - wxDialog","doc":"This class supports the following styles:\n\n* wxCAPTION: Puts a caption on the dialog box.\n\n* wxDEFAULT_DIALOG_STYLE: Equivalent to a combination of wxCAPTION, wxCLOSE_BOX and\nwxSYSTEM_MENU (the last one is not used under Unix).\n\n* wxRESIZE_BORDER: Display a resizable frame around the window.\n\n* wxSYSTEM_MENU: Display a system menu.\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the dialog.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the dialog.\n\n* wxTHICK_FRAME: Display a thick frame around the window.\n\n* wxSTAY_ON_TOP: The dialog stays on top of all other windows.\n\n* wxNO_3D: This style is obsolete and doesn't do anything any more, don't use it in any new\ncode.\n\n* wxDIALOG_NO_PARENT: By default, a dialog created with a NULL parent window will be given\nthe `application's top level window` (not implemented in wx) as parent. Use this style to\nprevent this from happening and create an orphan dialog. This is not recommended for modal\ndialogs.\n\n* wxDIALOG_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. Note that this is an extended style\nand must be set by calling `wxWindow:setExtraStyle/2` before Create is called (two-step construction).\n\n* wxDIALOG_EX_METAL: On macOS, frames with this style will be shown with a metallic look.\nThis is an extra style. Under Unix or Linux, MWM (the Motif Window Manager) or other\nwindow managers recognizing the MHM hints should be running for any of these styles to\nhave an effect.\n\nSee:\n* [Overview dialog](https://docs.wxwidgets.org/3.2/overview_dialog.html#overview_dialog)\n\n* `m:wxFrame`\n\n* [Overview validator](https://docs.wxwidgets.org/3.2/overview_validator.html#overview_validator)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDialog](https://docs.wxwidgets.org/3.2/classwx_dialog.html)","ref":"wxDialog.html#module-styles"},{"type":"module","title":"Events - wxDialog","doc":"Event types emitted from this class:\n\n* [`close_window`](`m:wxCloseEvent`)\n\n* [`init_dialog`](`m:wxInitDialogEvent`)","ref":"wxDialog.html#module-events"},{"type":"function","title":"wxDialog.create/4","doc":"","ref":"wxDialog.html#create/4"},{"type":"function","title":"wxDialog.create/5","doc":"Used for two-step dialog box construction.\n\nSee: `new/4`","ref":"wxDialog.html#create/5"},{"type":"function","title":"wxDialog.createButtonSizer/2","doc":"Creates a sizer with standard buttons.\n\n`flags` is a bit list of the following flags: wxOK, wxCANCEL, wxYES, wxNO, wxAPPLY,\nwxCLOSE, wxHELP, wxNO_DEFAULT.\n\nThe sizer lays out the buttons in a manner appropriate to the platform.\n\nThis function uses `createStdDialogButtonSizer/2` internally for most platforms but doesn't create the sizer at all for\nthe platforms with hardware buttons (such as smartphones) for which it sets up the\nhardware buttons appropriately and returns NULL, so don't forget to test that the return\nvalue is valid before using it.","ref":"wxDialog.html#createButtonSizer/2"},{"type":"function","title":"wxDialog.createStdDialogButtonSizer/2","doc":"Creates a `m:wxStdDialogButtonSizer` with standard buttons.\n\n`flags` is a bit list of the following flags: wxOK, wxCANCEL, wxYES, wxNO, wxAPPLY,\nwxCLOSE, wxHELP, wxNO_DEFAULT.\n\nThe sizer lays out the buttons in a manner appropriate to the platform.","ref":"wxDialog.html#createStdDialogButtonSizer/2"},{"type":"function","title":"wxDialog.destroy/1","doc":"Destroys the object","ref":"wxDialog.html#destroy/1"},{"type":"function","title":"wxDialog.endModal/2","doc":"Ends a modal dialog, passing a value to be returned from the `showModal/1` invocation.\n\nSee:\n* `showModal/1`\n\n* `getReturnCode/1`\n\n* `setReturnCode/2`","ref":"wxDialog.html#endModal/2"},{"type":"function","title":"wxDialog.getAffirmativeId/1","doc":"Gets the identifier of the button which works like standard OK button in this dialog.\n\nSee: `setAffirmativeId/2`","ref":"wxDialog.html#getAffirmativeId/1"},{"type":"function","title":"wxDialog.getReturnCode/1","doc":"Gets the return code for this window.\n\nRemark: A return code is normally associated with a modal dialog, where `showModal/1` returns a code\nto the application.\n\nSee:\n* `setReturnCode/2`\n\n* `showModal/1`\n\n* `endModal/2`","ref":"wxDialog.html#getReturnCode/1"},{"type":"function","title":"wxDialog.isModal/1","doc":"Returns true if the dialog box is modal, false otherwise.","ref":"wxDialog.html#isModal/1"},{"type":"function","title":"wxDialog.new/0","doc":"Default constructor.","ref":"wxDialog.html#new/0"},{"type":"function","title":"wxDialog.new/3","doc":"","ref":"wxDialog.html#new/3"},{"type":"function","title":"wxDialog.new/4","doc":"Constructor.\n\nSee: `create/5`","ref":"wxDialog.html#new/4"},{"type":"function","title":"wxDialog.setAffirmativeId/2","doc":"Sets the identifier to be used as OK button.\n\nWhen the button with this identifier is pressed, the dialog calls `wxWindow:validate/1` and `wxWindow:transferDataFromWindow/1` and, if they both\nreturn true, closes the dialog with the affirmative id return code.\n\nAlso, when the user presses a hardware OK button on the devices having one or the special\nOK button in the PocketPC title bar, an event with this id is generated.\n\nBy default, the affirmative id is wxID_OK.\n\nSee: `getAffirmativeId/1`","ref":"wxDialog.html#setAffirmativeId/2"},{"type":"function","title":"wxDialog.setReturnCode/2","doc":"Sets the return code for this window.\n\nA return code is normally associated with a modal dialog, where `showModal/1` returns a code to the\napplication. The function `endModal/2` calls `setReturnCode/2`.\n\nSee:\n* `getReturnCode/1`\n\n* `showModal/1`\n\n* `endModal/2`","ref":"wxDialog.html#setReturnCode/2"},{"type":"function","title":"wxDialog.show/1","doc":"","ref":"wxDialog.html#show/1"},{"type":"function","title":"wxDialog.show/2","doc":"Hides or shows the dialog.\n\nThe preferred way of dismissing a modal dialog is to use `endModal/2`.","ref":"wxDialog.html#show/2"},{"type":"function","title":"wxDialog.showModal/1","doc":"Shows an application-modal dialog.\n\nProgram flow does not return until the dialog has been dismissed with `endModal/2`.\n\nNotice that it is possible to call `showModal/1` for a dialog which had been previously shown with `show/2`,\nthis allows making an existing modeless dialog modal. However `showModal/1` can't be called twice\nwithout intervening `endModal/2` calls.\n\nNote that this function creates a temporary event loop which takes precedence over the\napplication's main event loop (see `wxEventLoopBase` (not implemented in wx)) and which is\ndestroyed when the dialog is dismissed. This also results in a call to `wxApp::ProcessPendingEvents()`\n(not implemented in wx).\n\nReturn: The value set with `setReturnCode/2`.\n\nSee:\n* `endModal/2`\n\n* `getReturnCode/1`\n\n* `setReturnCode/2`","ref":"wxDialog.html#showModal/1"},{"type":"type","title":"wxDialog.wxDialog/0","doc":"","ref":"wxDialog.html#t:wxDialog/0"},{"type":"module","title":"wxDirDialog","doc":"This class represents the directory chooser dialog.","ref":"wxDirDialog.html"},{"type":"module","title":"Styles - wxDirDialog","doc":"This class supports the following styles:\n\n* wxDD_DEFAULT_STYLE: Equivalent to a combination of wxDEFAULT_DIALOG_STYLE and\nwxRESIZE_BORDER.\n\n* wxDD_DIR_MUST_EXIST: The dialog will allow the user to choose only an existing folder.\nWhen this style is not given, a \"Create new directory\" button is added to the dialog (on\nWindows) or some other way is provided to the user to type the name of a new folder.\n\n* wxDD_CHANGE_DIR: Change the current working directory to the directory chosen by the\nuser.\n\nNote: This flag cannot be used with the `wxDD_MULTIPLE` style.\n\n* wxDD_MULTIPLE: Allow the user to select multiple directories. This flag is only\navailable since wxWidgets 3.1.4\n\n* wxDD_SHOW_HIDDEN: Show hidden and system folders. This flag is only available since\nwxWidgets 3.1.4 Notice that `wxRESIZE_BORDER` has special side effect under Windows where\ntwo different directory selection dialogs are available and this style also implicitly\nselects the new version as the old one always has fixed size. As the new version is almost\nalways preferable, it is recommended that `wxRESIZE_BORDER` style be always used. This is\nthe case if the dialog is created with the default style value but if you need to use any\nadditional styles you should still specify `wxDD_DEFAULT_STYLE` unless you explicitly need\nto use the old dialog version under Windows. E.g. do instead of just using `wxDD_DIR_MUST_EXIST`\nstyle alone.\n\nRemark: MacOS 10.11+ does not display a title bar on the dialog. Use `setMessage/2` to change the\nstring displayed to the user at the top of the dialog after creation. The `wxTopLevelWindow:setTitle/2` method is\nprovided for compatibility with pre-10.11 MacOS versions that do still support displaying\nthe title bar.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_dir)\n\n* `m:wxFileDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDirDialog](https://docs.wxwidgets.org/3.2/classwx_dir_dialog.html)","ref":"wxDirDialog.html#module-styles"},{"type":"function","title":"wxDirDialog.destroy/1","doc":"Destroys the object","ref":"wxDirDialog.html#destroy/1"},{"type":"function","title":"wxDirDialog.getMessage/1","doc":"Returns the message that will be displayed on the dialog.","ref":"wxDirDialog.html#getMessage/1"},{"type":"function","title":"wxDirDialog.getPath/1","doc":"Returns the default or user-selected path.\n\nNote: This function can't be used with dialogs which have the `wxDD_MULTIPLE` style, use `GetPaths()`\n(not implemented in wx) instead.","ref":"wxDirDialog.html#getPath/1"},{"type":"function","title":"wxDirDialog.new/1","doc":"","ref":"wxDirDialog.html#new/1"},{"type":"function","title":"wxDirDialog.new/2","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","ref":"wxDirDialog.html#new/2"},{"type":"function","title":"wxDirDialog.setMessage/2","doc":"Sets the message that will be displayed on the dialog.","ref":"wxDirDialog.html#setMessage/2"},{"type":"function","title":"wxDirDialog.setPath/2","doc":"Sets the default path.","ref":"wxDirDialog.html#setPath/2"},{"type":"type","title":"wxDirDialog.wxDirDialog/0","doc":"","ref":"wxDirDialog.html#t:wxDirDialog/0"},{"type":"module","title":"wxDirPickerCtrl","doc":"This control allows the user to select a directory.\n\nThe generic implementation is a button which brings up a `m:wxDirDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe dir-chooser dialog. It is only available if `wxUSE_DIRPICKERCTRL` is set to 1 (the default).","ref":"wxDirPickerCtrl.html"},{"type":"module","title":"Styles - wxDirPickerCtrl","doc":"This class supports the following styles:\n\n* wxDIRP_DEFAULT_STYLE: The default style: includes wxDIRP_DIR_MUST_EXIST and, under wxMSW\nonly, wxDIRP_USE_TEXTCTRL.\n\n* wxDIRP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxDirPickerCtrl` and which can be used by the user to specify\na path (see SetPath). The text control is automatically synchronized with button's value.\nUse functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxDIRP_DIR_MUST_EXIST: Creates a picker which allows selecting only existing directories\nin the popup `m:wxDirDialog`. Notice that, as with `wxFLP_FILE_MUST_EXIST`, it is still\npossible to enter a non-existent directory even when this file is specified if `wxDIRP_USE_TEXTCTRL`\nstyle is also used. Also note that if `wxDIRP_USE_TEXTCTRL` is not used, the native wxGTK\nimplementation always uses this style as it doesn't support selecting non-existent\ndirectories.\n\n* wxDIRP_CHANGE_DIR: Change current working directory on each user directory selection\nchange.\n\n* wxDIRP_SMALL: Use smaller version of the control with a small \"...\" button instead of the\nnormal \"Browse\" one. This flag is new since wxWidgets 2.9.3.\n\nSee:\n* `m:wxDirDialog`\n\n* `m:wxFileDirPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxDirPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_dir_picker_ctrl.html)","ref":"wxDirPickerCtrl.html#module-styles"},{"type":"module","title":"Events - wxDirPickerCtrl","doc":"Event types emitted from this class:\n\n* [`command_dirpicker_changed`](`m:wxFileDirPickerEvent`)","ref":"wxDirPickerCtrl.html#module-events"},{"type":"function","title":"wxDirPickerCtrl.create/3","doc":"","ref":"wxDirPickerCtrl.html#create/3"},{"type":"function","title":"wxDirPickerCtrl.create/4","doc":"Creates the widgets with the given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","ref":"wxDirPickerCtrl.html#create/4"},{"type":"function","title":"wxDirPickerCtrl.destroy/1","doc":"Destroys the object","ref":"wxDirPickerCtrl.html#destroy/1"},{"type":"function","title":"wxDirPickerCtrl.getPath/1","doc":"Returns the absolute path of the currently selected directory.","ref":"wxDirPickerCtrl.html#getPath/1"},{"type":"function","title":"wxDirPickerCtrl.new/0","doc":"","ref":"wxDirPickerCtrl.html#new/0"},{"type":"function","title":"wxDirPickerCtrl.new/2","doc":"","ref":"wxDirPickerCtrl.html#new/2"},{"type":"function","title":"wxDirPickerCtrl.new/3","doc":"Initializes the object and calls `create/4` with all the parameters.","ref":"wxDirPickerCtrl.html#new/3"},{"type":"function","title":"wxDirPickerCtrl.setPath/2","doc":"Sets the absolute path of the currently selected directory.\n\nIf the control uses `wxDIRP_DIR_MUST_EXIST` and does not use `wxDIRP_USE_TEXTCTRL` style,\nthe `dirname` must be a name of an existing directory and will be simply ignored by the\nnative wxGTK implementation if this is not the case.","ref":"wxDirPickerCtrl.html#setPath/2"},{"type":"type","title":"wxDirPickerCtrl.wxDirPickerCtrl/0","doc":"","ref":"wxDirPickerCtrl.html#t:wxDirPickerCtrl/0"},{"type":"module","title":"wxDisplay","doc":"Determines the sizes and locations of displays connected to the system.\n\nwxWidgets docs: [wxDisplay](https://docs.wxwidgets.org/3.2/classwx_display.html)","ref":"wxDisplay.html"},{"type":"function","title":"wxDisplay.destroy/1","doc":"Destroys the object","ref":"wxDisplay.html#destroy/1"},{"type":"function","title":"wxDisplay.getClientArea/1","doc":"Returns the client area of the display.\n\nThe client area is the part of the display available for the normal (non full screen)\nwindows, usually it is the same as `getGeometry/1` but it could be less if there is a taskbar (or\nequivalent) on this display.","ref":"wxDisplay.html#getClientArea/1"},{"type":"function","title":"wxDisplay.getCount/0","doc":"Returns the number of connected displays.","ref":"wxDisplay.html#getCount/0"},{"type":"function","title":"wxDisplay.getFromPoint/1","doc":"Returns the index of the display on which the given point lies, or `wxNOT\\_FOUND` if the\npoint is not on any connected display.","ref":"wxDisplay.html#getFromPoint/1"},{"type":"function","title":"wxDisplay.getFromWindow/1","doc":"Returns the index of the display on which the given window lies.\n\nIf the window is on more than one display it gets the display that overlaps the window\nthe most.\n\nReturns `wxNOT_FOUND` if the window is not on any connected display.","ref":"wxDisplay.html#getFromWindow/1"},{"type":"function","title":"wxDisplay.getGeometry/1","doc":"Returns the bounding rectangle of the display whose index was passed to the constructor.\n\nSee:\n* `getClientArea/1`\n\n* `wx_misc:displaySize/0`","ref":"wxDisplay.html#getGeometry/1"},{"type":"function","title":"wxDisplay.getName/1","doc":"Returns the display's name.\n\nThe returned value is currently an empty string under all platforms except MSW.","ref":"wxDisplay.html#getName/1"},{"type":"function","title":"wxDisplay.getPPI/1","doc":"Returns display resolution in pixels per inch.\n\nHorizontal and vertical resolution are returned in `x` and `y` components of the\n{Width,Height} object respectively.\n\nIf the resolution information is not available, returns.\n\nSince: 3.1.2","ref":"wxDisplay.html#getPPI/1"},{"type":"function","title":"wxDisplay.isOk/1","doc":"Returns true if the object was initialized successfully.","ref":"wxDisplay.html#isOk/1"},{"type":"function","title":"wxDisplay.isPrimary/1","doc":"Returns true if the display is the primary display.\n\nThe primary display is the one whose index is 0.","ref":"wxDisplay.html#isPrimary/1"},{"type":"function","title":"wxDisplay.new/0","doc":"Default constructor creating `m:wxDisplay` object representing the primary display.","ref":"wxDisplay.html#new/0"},{"type":"function","title":"wxDisplay.new/1","doc":"Constructor creating the display object associated with the given window.\n\nThis is the most convenient way of finding the display on which the given window is shown\nwhile falling back to the default display if it is not shown at all or positioned outside\nof any display.\n\nSee: `getFromWindow/1`\n\nSince: 3.1.2","ref":"wxDisplay.html#new/1"},{"type":"type","title":"wxDisplay.wxDisplay/0","doc":"","ref":"wxDisplay.html#t:wxDisplay/0"},{"type":"module","title":"wxDisplayChangedEvent","doc":"A display changed event is sent to top-level windows when the display resolution has\nchanged.\n\nThis event is currently emitted under Windows only.\n\nSee: `m:wxDisplay`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDisplayChangedEvent](https://docs.wxwidgets.org/3.2/classwx_display_changed_event.html)","ref":"wxDisplayChangedEvent.html"},{"type":"module","title":"Events - wxDisplayChangedEvent","doc":"Use `wxEvtHandler:connect/3` with `wxDisplayChangedEventType` to subscribe to events of this type.","ref":"wxDisplayChangedEvent.html#module-events"},{"type":"type","title":"wxDisplayChangedEvent.wxDisplayChanged/0","doc":"","ref":"wxDisplayChangedEvent.html#t:wxDisplayChanged/0"},{"type":"type","title":"wxDisplayChangedEvent.wxDisplayChangedEvent/0","doc":"","ref":"wxDisplayChangedEvent.html#t:wxDisplayChangedEvent/0"},{"type":"type","title":"wxDisplayChangedEvent.wxDisplayChangedEventType/0","doc":"","ref":"wxDisplayChangedEvent.html#t:wxDisplayChangedEventType/0"},{"type":"module","title":"wxDropFilesEvent","doc":"This class is used for drop files events, that is, when files have been dropped onto the\nwindow.\n\nThe window must have previously been enabled for dropping by calling `wxWindow:dragAcceptFiles/2`.\n\nImportant note: this is a separate implementation to the more general drag and drop\nimplementation documented in the overview_dnd. It uses the older, Windows message-based\napproach of dropping files.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:dragAcceptFiles/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxDropFilesEvent](https://docs.wxwidgets.org/3.2/classwx_drop_files_event.html)","ref":"wxDropFilesEvent.html"},{"type":"module","title":"Events - wxDropFilesEvent","doc":"Use `wxEvtHandler:connect/3` with `wxDropFilesEventType` to subscribe to events of this type.","ref":"wxDropFilesEvent.html#module-events"},{"type":"function","title":"wxDropFilesEvent.getFiles/1","doc":"Returns an array of filenames.","ref":"wxDropFilesEvent.html#getFiles/1"},{"type":"function","title":"wxDropFilesEvent.getNumberOfFiles/1","doc":"Returns the number of files dropped.","ref":"wxDropFilesEvent.html#getNumberOfFiles/1"},{"type":"function","title":"wxDropFilesEvent.getPosition/1","doc":"Returns the position at which the files were dropped.\n\nReturns an array of filenames.","ref":"wxDropFilesEvent.html#getPosition/1"},{"type":"type","title":"wxDropFilesEvent.wxDropFiles/0","doc":"","ref":"wxDropFilesEvent.html#t:wxDropFiles/0"},{"type":"type","title":"wxDropFilesEvent.wxDropFilesEvent/0","doc":"","ref":"wxDropFilesEvent.html#t:wxDropFilesEvent/0"},{"type":"type","title":"wxDropFilesEvent.wxDropFilesEventType/0","doc":"","ref":"wxDropFilesEvent.html#t:wxDropFilesEventType/0"},{"type":"module","title":"wxEraseEvent","doc":"An erase event is sent when a window's background needs to be repainted.\n\nOn some platforms, such as GTK+, this event is simulated (simply generated just before\nthe paint event) and may cause flicker. It is therefore recommended that you set the text\nbackground colour explicitly in order to prevent flicker. The default background colour\nunder GTK+ is grey.\n\nTo intercept this event, use the EVT_ERASE_BACKGROUND macro in an event table definition.\n\nYou must use the device context returned by `getDC/1` to draw on, don't create a `m:wxPaintDC` in\nthe event handler.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxEraseEvent](https://docs.wxwidgets.org/3.2/classwx_erase_event.html)","ref":"wxEraseEvent.html"},{"type":"module","title":"Events - wxEraseEvent","doc":"Use `wxEvtHandler:connect/3` with `wxEraseEventType` to subscribe to events of this type.","ref":"wxEraseEvent.html#module-events"},{"type":"function","title":"wxEraseEvent.getDC/1","doc":"Returns the device context associated with the erase event to draw on.\n\nThe returned pointer is never NULL.","ref":"wxEraseEvent.html#getDC/1"},{"type":"type","title":"wxEraseEvent.wxErase/0","doc":"","ref":"wxEraseEvent.html#t:wxErase/0"},{"type":"type","title":"wxEraseEvent.wxEraseEvent/0","doc":"","ref":"wxEraseEvent.html#t:wxEraseEvent/0"},{"type":"type","title":"wxEraseEvent.wxEraseEventType/0","doc":"","ref":"wxEraseEvent.html#t:wxEraseEventType/0"},{"type":"module","title":"wxEvent","doc":"An event is a structure holding information about an event passed to a callback or member\nfunction.\n\n`m:wxEvent` used to be a multipurpose event object, and is an abstract base class for\nother event classes (see below).\n\nFor more information about events, see the overview_events overview.\n\nSee:\n* `m:wxCommandEvent`\n\n* `m:wxMouseEvent`\n\nwxWidgets docs: [wxEvent](https://docs.wxwidgets.org/3.2/classwx_event.html)","ref":"wxEvent.html"},{"type":"function","title":"wxEvent.getId/1","doc":"Returns the identifier associated with this event, such as a button command id.","ref":"wxEvent.html#getId/1"},{"type":"function","title":"wxEvent.getSkipped/1","doc":"Returns true if the event handler should be skipped, false otherwise.","ref":"wxEvent.html#getSkipped/1"},{"type":"function","title":"wxEvent.getTimestamp/1","doc":"Gets the timestamp for the event.\n\nThe timestamp is the time in milliseconds since some fixed moment (not necessarily the\nstandard Unix Epoch, so only differences between the timestamps and not their absolute\nvalues usually make sense).\n\nWarning:\n\nwxWidgets returns a non-NULL timestamp only for mouse and key events (see `m:wxMouseEvent`\nand `m:wxKeyEvent`).","ref":"wxEvent.html#getTimestamp/1"},{"type":"function","title":"wxEvent.isCommandEvent/1","doc":"Returns true if the event is or is derived from `m:wxCommandEvent` else it returns false.\n\nNote: exists only for optimization purposes.","ref":"wxEvent.html#isCommandEvent/1"},{"type":"function","title":"wxEvent.resumePropagation/2","doc":"Sets the propagation level to the given value (for example returned from an earlier call\nto `stopPropagation/1`).","ref":"wxEvent.html#resumePropagation/2"},{"type":"function","title":"wxEvent.shouldPropagate/1","doc":"Test if this event should be propagated or not, i.e. if the propagation level is\ncurrently greater than 0.","ref":"wxEvent.html#shouldPropagate/1"},{"type":"function","title":"wxEvent.skip/1","doc":"","ref":"wxEvent.html#skip/1"},{"type":"function","title":"wxEvent.skip/2","doc":"This method can be used inside an event handler to control whether further event handlers\nbound to this event will be called after the current one returns.\n\nWithout `skip/2` (or equivalently if Skip(false) is used), the event will not be processed any\nmore. If Skip(true) is called, the event processing system continues searching for a\nfurther handler function for this event, even though it has been processed already in the\ncurrent handler.\n\nIn general, it is recommended to skip all non-command events to allow the default\nhandling to take place. The command events are, however, normally not skipped as usually a\nsingle command such as a button click or menu item selection must only be processed by one\nhandler.","ref":"wxEvent.html#skip/2"},{"type":"function","title":"wxEvent.stopPropagation/1","doc":"Stop the event from propagating to its parent window.\n\nReturns the old propagation level value which may be later passed to `resumePropagation/2` to allow\npropagating the event again.","ref":"wxEvent.html#stopPropagation/1"},{"type":"type","title":"wxEvent.wxEvent/0","doc":"","ref":"wxEvent.html#t:wxEvent/0"},{"type":"module","title":"wxEvtHandler","doc":"The Event handler\n\nA class that can handle events from the windowing system. `m:wxWindow` is (and\ntherefore all window classes are) derived from this class.\n\nTo get events from wxwidgets objects you subscribe to them by calling `connect/3`.\n\nIf the `callback` option is not supplied events are sent as messages.\n\nThese messages will be `#wx{}` where `EventRecord` is a record that depends on\nthe `wxEventType`. The records are defined in: `wx/include/wx.hrl`.\n\nIf a callback was supplied to connect, the callback will be invoked (in another\nprocess) to handle the event. The callback should be of arity 2.\n\n`fun Callback (EventRecord::wx(), EventObject::wxObject()).`\n\nNote: The callback will be in executed in new process each time.\n\nSee:\n[Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events_processing)\n\nwxWidgets docs:\n[wxEvtHandler](https://docs.wxwidgets.org/3.2/classwx_evt_handler.html)","ref":"wxEvtHandler.html"},{"type":"function","title":"wxEvtHandler.connect/2","doc":"","ref":"wxEvtHandler.html#connect/2"},{"type":"function","title":"wxEvtHandler.connect/3","doc":"This function subscribes to events.\n\nSubscribes to events of type `EventType`, in the range `id`, `lastId`.\n\nThe events will be received as messages if no callback is supplied.\n\nOptions\n\nid:`{id, integer()} `The identifier (or first of the identifier range) to be\nassociated with this event handler. Default is ?wxID_ANY\n\nlastid:`{lastId,integer()} `The second part of the identifier range. If used\n'id' must be set as the starting identifier range. Default is ?wxID_ANY\n\nskip:`{skip,boolean()} `If skip is true further event_handlers will be called.\nThis is not used if the 'callback' option is used. Default is `false`.\n\ncallback:`{callback,function()} `Use a\ncallback`fun(EventRecord::wx(),EventObject::wxObject()) `to process the event.\nDefault not specified i.e. a message will be delivered to the process calling\nthis function.\n\nuserData:`{userData,term()} `An erlang term that will be sent with the event.\nDefault: [].","ref":"wxEvtHandler.html#connect/3"},{"type":"function","title":"wxEvtHandler.disconnect/1","doc":"","ref":"wxEvtHandler.html#disconnect/1"},{"type":"function","title":"wxEvtHandler.disconnect/2","doc":"","ref":"wxEvtHandler.html#disconnect/2"},{"type":"function","title":"wxEvtHandler.disconnect/3","doc":"This function unsubscribes the process or callback fun from the event handler.\n\nEventType may be the atom 'null' to match any eventtype. Notice that the options\nskip and userdata is not used to match the eventhandler.","ref":"wxEvtHandler.html#disconnect/3"},{"type":"type","title":"wxEvtHandler.event/0","doc":"","ref":"wxEvtHandler.html#t:event/0"},{"type":"type","title":"wxEvtHandler.wx/0","doc":"","ref":"wxEvtHandler.html#t:wx/0"},{"type":"type","title":"wxEvtHandler.wxEventType/0","doc":"","ref":"wxEvtHandler.html#t:wxEventType/0"},{"type":"type","title":"wxEvtHandler.wxEvtHandler/0","doc":"","ref":"wxEvtHandler.html#t:wxEvtHandler/0"},{"type":"module","title":"wxFileDataObject","doc":"`m:wxFileDataObject` is a specialization of `m:wxDataObject` for file names.\n\nThe program works with it just as if it were a list of absolute file names, but\ninternally it uses the same format as Explorer and other compatible programs under Windows\nor GNOME/KDE file manager under Unix which makes it possible to receive files from them\nusing this class.\n\nSee:\n* `m:wxDataObject`\n\n* `m:wxTextDataObject`\n\n* `m:wxBitmapDataObject`\n\n* `m:wxDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxFileDataObject](https://docs.wxwidgets.org/3.2/classwx_file_data_object.html)","ref":"wxFileDataObject.html"},{"type":"function","title":"wxFileDataObject.addFile/2","doc":"Adds a file to the file list represented by this data object (Windows only).","ref":"wxFileDataObject.html#addFile/2"},{"type":"function","title":"wxFileDataObject.destroy/1","doc":"Destroys the object","ref":"wxFileDataObject.html#destroy/1"},{"type":"function","title":"wxFileDataObject.getFilenames/1","doc":"Returns the array of file names.","ref":"wxFileDataObject.html#getFilenames/1"},{"type":"function","title":"wxFileDataObject.new/0","doc":"Constructor.","ref":"wxFileDataObject.html#new/0"},{"type":"type","title":"wxFileDataObject.wxFileDataObject/0","doc":"","ref":"wxFileDataObject.html#t:wxFileDataObject/0"},{"type":"module","title":"wxFileDialog","doc":"This class represents the file chooser dialog.\n\nThe path and filename are distinct elements of a full file pathname. If path is\n?wxEmptyString, the current directory will be used. If filename is ?wxEmptyString, no\ndefault filename will be supplied. The wildcard determines what files are displayed in the\nfile selector, and file extension supplies a type extension for the required filename.\n\nThe typical usage for the open file dialog is:\n\nThe typical usage for the save file dialog is instead somewhat simpler:\n\nRemark: All implementations of the `m:wxFileDialog` provide a wildcard filter. Typing a\nfilename containing wildcards (*, ?) in the filename text item, and clicking on Ok, will\nresult in only those files matching the pattern being displayed. The wildcard may be a\nspecification for multiple types of file with a description for each, such as: It must be\nnoted that wildcard support in the native Motif file dialog is quite limited: only one\nfile type is supported, and it is displayed without the descriptive test; \"BMP files\n(*.bmp)|*.bmp\" is displayed as \"*.bmp\", and both \"BMP files (*.bmp)|*.bmp|GIF files\n(*.gif)|*.gif\" and \"Image files|*.bmp;*.gif\" are errors. On Mac macOS in the open file\ndialog the filter choice box is not shown by default. Instead all given wildcards are\nappplied at the same time: So in the above example all bmp, gif and png files are\ndisplayed. To enforce the display of the filter choice set the corresponding `m:wxSystemOptions`\nbefore calling the file open dialog: But in contrast to Windows and Unix, where the file\ntype choice filters only the selected files, on Mac macOS even in this case the dialog\nshows all files matching all file types. The files which does not match the currently\nselected file type are greyed out and are not selectable.","ref":"wxFileDialog.html"},{"type":"module","title":"Styles - wxFileDialog","doc":"This class supports the following styles:\n\n* wxFD_DEFAULT_STYLE: Equivalent to `wxFD_OPEN`.\n\n* wxFD_OPEN: This is an open dialog; usually this means that the default button's label of\nthe dialog is \"Open\". Cannot be combined with `wxFD_SAVE`.\n\n* wxFD_SAVE: This is a save dialog; usually this means that the default button's label of\nthe dialog is \"Save\". Cannot be combined with `wxFD_OPEN`.\n\n* wxFD_OVERWRITE_PROMPT: For save dialog only: prompt for a confirmation if a file will be\noverwritten.\n\n* wxFD_NO_FOLLOW: Directs the dialog to return the path and file name of the selected\nshortcut file, not its target as it does by default. Currently this flag is only\nimplemented in wxMSW and wxOSX (where it prevents aliases from being resolved). The\nnon-dereferenced link path is always returned, even without this flag, under Unix and so\nusing it there doesn't do anything. This flag was added in wxWidgets 3.1.0.\n\n* wxFD_FILE_MUST_EXIST: For open dialog only: the user may only select files that actually\nexist. Notice that under macOS the file dialog with `wxFD_OPEN` style always behaves as if\nthis style was specified, because it is impossible to choose a file that doesn't exist\nfrom a standard macOS file dialog.\n\n* wxFD_MULTIPLE: For open dialog only: allows selecting multiple files.\n\n* wxFD_CHANGE_DIR: Change the current working directory (when the dialog is dismissed) to\nthe directory where the file(s) chosen by the user are.\n\n* wxFD_PREVIEW: Show the preview of the selected files (currently only supported by wxGTK).\n\n* wxFD_SHOW_HIDDEN: Show hidden files. This flag was added in wxWidgets 3.1.3\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_file)\n\n* ?wxFileSelector()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFileDialog](https://docs.wxwidgets.org/3.2/classwx_file_dialog.html)","ref":"wxFileDialog.html#module-styles"},{"type":"function","title":"wxFileDialog.destroy/1","doc":"Destroys the object","ref":"wxFileDialog.html#destroy/1"},{"type":"function","title":"wxFileDialog.getDirectory/1","doc":"Returns the default directory.","ref":"wxFileDialog.html#getDirectory/1"},{"type":"function","title":"wxFileDialog.getFilename/1","doc":"Returns the default filename.\n\nNote: This function can't be used with dialogs which have the `wxFD_MULTIPLE` style, use `getFilenames/1`\ninstead.","ref":"wxFileDialog.html#getFilename/1"},{"type":"function","title":"wxFileDialog.getFilenames/1","doc":"Fills the array `filenames` with the names of the files chosen.\n\nThis function should only be used with the dialogs which have `wxFD_MULTIPLE` style, use `getFilename/1`\nfor the others.\n\nNote that under Windows, if the user selects shortcuts, the filenames include paths,\nsince the application cannot determine the full path of each referenced file by appending\nthe directory containing the shortcuts to the filename.","ref":"wxFileDialog.html#getFilenames/1"},{"type":"function","title":"wxFileDialog.getFilterIndex/1","doc":"Returns the index into the list of filters supplied, optionally, in the wildcard\nparameter.\n\nBefore the dialog is shown, this is the index which will be used when the dialog is first displayed.\n\nAfter the dialog is shown, this is the index selected by the user.","ref":"wxFileDialog.html#getFilterIndex/1"},{"type":"function","title":"wxFileDialog.getMessage/1","doc":"Returns the message that will be displayed on the dialog.","ref":"wxFileDialog.html#getMessage/1"},{"type":"function","title":"wxFileDialog.getPath/1","doc":"Returns the full path (directory and filename) of the selected file.\n\nNote: This function can't be used with dialogs which have the `wxFD_MULTIPLE` style, use `getPaths/1`\ninstead.","ref":"wxFileDialog.html#getPath/1"},{"type":"function","title":"wxFileDialog.getPaths/1","doc":"Fills the array `paths` with the full paths of the files chosen.\n\nThis function should only be used with the dialogs which have `wxFD_MULTIPLE` style, use `getPath/1`\nfor the others.","ref":"wxFileDialog.html#getPaths/1"},{"type":"function","title":"wxFileDialog.getWildcard/1","doc":"Returns the file dialog wildcard.","ref":"wxFileDialog.html#getWildcard/1"},{"type":"function","title":"wxFileDialog.new/1","doc":"","ref":"wxFileDialog.html#new/1"},{"type":"function","title":"wxFileDialog.new/2","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","ref":"wxFileDialog.html#new/2"},{"type":"function","title":"wxFileDialog.setDirectory/2","doc":"Sets the default directory.","ref":"wxFileDialog.html#setDirectory/2"},{"type":"function","title":"wxFileDialog.setFilename/2","doc":"Sets the default filename.\n\nIn wxGTK this will have little effect unless a default directory has previously been set.","ref":"wxFileDialog.html#setFilename/2"},{"type":"function","title":"wxFileDialog.setFilterIndex/2","doc":"Sets the default filter index, starting from zero.","ref":"wxFileDialog.html#setFilterIndex/2"},{"type":"function","title":"wxFileDialog.setMessage/2","doc":"Sets the message that will be displayed on the dialog.","ref":"wxFileDialog.html#setMessage/2"},{"type":"function","title":"wxFileDialog.setPath/2","doc":"Sets the path (the combined directory and filename that will be returned when the dialog\nis dismissed).","ref":"wxFileDialog.html#setPath/2"},{"type":"function","title":"wxFileDialog.setWildcard/2","doc":"Sets the wildcard, which can contain multiple file types, for example: \"BMP files\n(\\*.bmp)|\\*.bmp|GIF files (\\*.gif)|\\*.gif\".\n\nNote that the native Motif dialog has some limitations with respect to wildcards; see the\nRemarks section above.","ref":"wxFileDialog.html#setWildcard/2"},{"type":"type","title":"wxFileDialog.wxFileDialog/0","doc":"","ref":"wxFileDialog.html#t:wxFileDialog/0"},{"type":"module","title":"wxFileDirPickerEvent","doc":"This event class is used for the events generated by `m:wxFilePickerCtrl` and by `m:wxDirPickerCtrl`.\n\nSee:\n* `m:wxFilePickerCtrl`\n\n* `m:wxDirPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFileDirPickerEvent](https://docs.wxwidgets.org/3.2/classwx_file_dir_picker_event.html)","ref":"wxFileDirPickerEvent.html"},{"type":"module","title":"Events - wxFileDirPickerEvent","doc":"Use `wxEvtHandler:connect/3` with `wxFileDirPickerEventType` to subscribe to events of this type.","ref":"wxFileDirPickerEvent.html#module-events"},{"type":"function","title":"wxFileDirPickerEvent.getPath/1","doc":"Retrieve the absolute path of the file/directory the user has just selected.","ref":"wxFileDirPickerEvent.html#getPath/1"},{"type":"type","title":"wxFileDirPickerEvent.wxFileDirPicker/0","doc":"","ref":"wxFileDirPickerEvent.html#t:wxFileDirPicker/0"},{"type":"type","title":"wxFileDirPickerEvent.wxFileDirPickerEvent/0","doc":"","ref":"wxFileDirPickerEvent.html#t:wxFileDirPickerEvent/0"},{"type":"type","title":"wxFileDirPickerEvent.wxFileDirPickerEventType/0","doc":"","ref":"wxFileDirPickerEvent.html#t:wxFileDirPickerEventType/0"},{"type":"module","title":"wxFilePickerCtrl","doc":"This control allows the user to select a file.\n\nThe generic implementation is a button which brings up a `m:wxFileDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe file-chooser dialog. It is only available if `wxUSE_FILEPICKERCTRL` is set to 1 (the default).","ref":"wxFilePickerCtrl.html"},{"type":"module","title":"Styles - wxFilePickerCtrl","doc":"This class supports the following styles:\n\n* wxFLP_DEFAULT_STYLE: The default style: includes wxFLP_OPEN | wxFLP_FILE_MUST_EXIST and,\nunder wxMSW and wxOSX, wxFLP_USE_TEXTCTRL.\n\n* wxFLP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxFilePickerCtrl` and which can be used by the user to\nspecify a path (see SetPath). The text control is automatically synchronized with button's\nvalue. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxFLP_OPEN: Creates a picker which allows the user to select a file to open.\n\n* wxFLP_SAVE: Creates a picker which allows the user to select a file to save.\n\n* wxFLP_OVERWRITE_PROMPT: Can be combined with wxFLP_SAVE only: ask confirmation to the\nuser before selecting a file.\n\n* wxFLP_FILE_MUST_EXIST: Can be combined with wxFLP_OPEN only: the file selected in the\npopup `m:wxFileDialog` must be an existing file. Notice that it still remains possible for\nthe user to enter a non-existent file name in the text control if `wxFLP_USE_TEXTCTRL` is\nalso used, this flag is a hint for the user rather than a guarantee that the selected file\ndoes exist for the program.\n\n* wxFLP_CHANGE_DIR: Change current working directory on each user file selection change.\n\n* wxFLP_SMALL: Use smaller version of the control with a small \"...\" button instead of the\nnormal \"Browse\" one. This flag is new since wxWidgets 2.9.3.\n\nSee:\n* `m:wxFileDialog`\n\n* `m:wxFileDirPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFilePickerCtrl](https://docs.wxwidgets.org/3.2/classwx_file_picker_ctrl.html)","ref":"wxFilePickerCtrl.html#module-styles"},{"type":"module","title":"Events - wxFilePickerCtrl","doc":"Event types emitted from this class:\n\n* [`command_filepicker_changed`](`m:wxFileDirPickerEvent`)","ref":"wxFilePickerCtrl.html#module-events"},{"type":"function","title":"wxFilePickerCtrl.create/3","doc":"","ref":"wxFilePickerCtrl.html#create/3"},{"type":"function","title":"wxFilePickerCtrl.create/4","doc":"Creates this widget with the given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","ref":"wxFilePickerCtrl.html#create/4"},{"type":"function","title":"wxFilePickerCtrl.destroy/1","doc":"Destroys the object","ref":"wxFilePickerCtrl.html#destroy/1"},{"type":"function","title":"wxFilePickerCtrl.getPath/1","doc":"Returns the absolute path of the currently selected file.","ref":"wxFilePickerCtrl.html#getPath/1"},{"type":"function","title":"wxFilePickerCtrl.new/0","doc":"","ref":"wxFilePickerCtrl.html#new/0"},{"type":"function","title":"wxFilePickerCtrl.new/2","doc":"","ref":"wxFilePickerCtrl.html#new/2"},{"type":"function","title":"wxFilePickerCtrl.new/3","doc":"Initializes the object and calls `create/4` with all the parameters.","ref":"wxFilePickerCtrl.html#new/3"},{"type":"function","title":"wxFilePickerCtrl.setPath/2","doc":"Sets the absolute path of the currently selected file.\n\nIf the control uses `wxFLP_FILE_MUST_EXIST` and does not use `wxFLP_USE_TEXTCTRL` style,\nthe `filename` must be a name of an existing file and will be simply ignored by the native\nwxGTK implementation if this is not the case (the generic implementation used under the\nother platforms accepts even invalid file names currently, but this is subject to change\nin the future, don't rely on being able to use non-existent paths with it).","ref":"wxFilePickerCtrl.html#setPath/2"},{"type":"type","title":"wxFilePickerCtrl.wxFilePickerCtrl/0","doc":"","ref":"wxFilePickerCtrl.html#t:wxFilePickerCtrl/0"},{"type":"module","title":"wxFindReplaceData","doc":"`m:wxFindReplaceData` holds the data for `m:wxFindReplaceDialog`.\n\nIt is used to initialize the dialog with the default values and will keep the last values\nfrom the dialog when it is closed. It is also updated each time a `wxFindDialogEvent` (not\nimplemented in wx) is generated so instead of using the `wxFindDialogEvent` (not\nimplemented in wx) methods you can also directly query this object.\n\nNote that all `SetXXX()` methods may only be called before showing the dialog and calling\nthem has no effect later.\n\nwxWidgets docs: [wxFindReplaceData](https://docs.wxwidgets.org/3.2/classwx_find_replace_data.html)","ref":"wxFindReplaceData.html"},{"type":"function","title":"wxFindReplaceData.destroy/1","doc":"Destroys the object","ref":"wxFindReplaceData.html#destroy/1"},{"type":"function","title":"wxFindReplaceData.getFindString/1","doc":"Get the string to find.","ref":"wxFindReplaceData.html#getFindString/1"},{"type":"function","title":"wxFindReplaceData.getFlags/1","doc":"Get the combination of `wxFindReplaceFlags` values.","ref":"wxFindReplaceData.html#getFlags/1"},{"type":"function","title":"wxFindReplaceData.getReplaceString/1","doc":"Get the replacement string.","ref":"wxFindReplaceData.html#getReplaceString/1"},{"type":"function","title":"wxFindReplaceData.new/0","doc":"","ref":"wxFindReplaceData.html#new/0"},{"type":"function","title":"wxFindReplaceData.new/1","doc":"Constructor initializes the flags to default value (0).","ref":"wxFindReplaceData.html#new/1"},{"type":"function","title":"wxFindReplaceData.setFindString/2","doc":"Set the string to find (used as initial value by the dialog).","ref":"wxFindReplaceData.html#setFindString/2"},{"type":"function","title":"wxFindReplaceData.setFlags/2","doc":"Set the flags to use to initialize the controls of the dialog.","ref":"wxFindReplaceData.html#setFlags/2"},{"type":"function","title":"wxFindReplaceData.setReplaceString/2","doc":"Set the replacement string (used as initial value by the dialog).","ref":"wxFindReplaceData.html#setReplaceString/2"},{"type":"type","title":"wxFindReplaceData.wxFindReplaceData/0","doc":"","ref":"wxFindReplaceData.html#t:wxFindReplaceData/0"},{"type":"module","title":"wxFindReplaceDialog","doc":"`m:wxFindReplaceDialog` is a standard modeless dialog which is used to allow the user to\nsearch for some text (and possibly replace it with something else).\n\nThe actual searching is supposed to be done in the owner window which is the parent of\nthis dialog. Note that it means that unlike for the other standard dialogs this one `must`\nhave a parent window. Also note that there is no way to use this dialog in a modal way; it\nis always, by design and implementation, modeless.\n\nPlease see the page_samples_dialogs sample for an example of using it.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFindReplaceDialog](https://docs.wxwidgets.org/3.2/classwx_find_replace_dialog.html)","ref":"wxFindReplaceDialog.html"},{"type":"function","title":"wxFindReplaceDialog.create/4","doc":"","ref":"wxFindReplaceDialog.html#create/4"},{"type":"function","title":"wxFindReplaceDialog.create/5","doc":"Creates the dialog; use `wxWindow:show/2` to show it on screen.\n\nThe `parent` and `data` parameters must be non-NULL.","ref":"wxFindReplaceDialog.html#create/5"},{"type":"function","title":"wxFindReplaceDialog.destroy/1","doc":"Destroys the object","ref":"wxFindReplaceDialog.html#destroy/1"},{"type":"function","title":"wxFindReplaceDialog.getData/1","doc":"Get the `m:wxFindReplaceData` object used by this dialog.","ref":"wxFindReplaceDialog.html#getData/1"},{"type":"function","title":"wxFindReplaceDialog.new/0","doc":"","ref":"wxFindReplaceDialog.html#new/0"},{"type":"function","title":"wxFindReplaceDialog.new/3","doc":"","ref":"wxFindReplaceDialog.html#new/3"},{"type":"function","title":"wxFindReplaceDialog.new/4","doc":"After using default constructor `create/5` must be called.\n\nThe `parent` and `data` parameters must be non-NULL.","ref":"wxFindReplaceDialog.html#new/4"},{"type":"type","title":"wxFindReplaceDialog.wxFindReplaceDialog/0","doc":"","ref":"wxFindReplaceDialog.html#t:wxFindReplaceDialog/0"},{"type":"module","title":"wxFlexGridSizer","doc":"A flex grid sizer is a sizer which lays out its children in a two-dimensional table with\nall table fields in one row having the same height and all fields in one column having the\nsame width, but all rows or all columns are not necessarily the same height or width as in\nthe `m:wxGridSizer`.\n\nSince wxWidgets 2.5.0, `m:wxFlexGridSizer` can also size items equally in one direction\nbut unequally (\"flexibly\") in the other. If the sizer is only flexible in one direction\n(this can be changed using `setFlexibleDirection/2`), it needs to be decided how the sizer should grow in the other\n(\"non-flexible\") direction in order to fill the available space. The `setNonFlexibleGrowMode/2` method serves this purpose.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxFlexGridSizer](https://docs.wxwidgets.org/3.2/classwx_flex_grid_sizer.html)","ref":"wxFlexGridSizer.html"},{"type":"function","title":"wxFlexGridSizer.addGrowableCol/2","doc":"","ref":"wxFlexGridSizer.html#addGrowableCol/2"},{"type":"function","title":"wxFlexGridSizer.addGrowableCol/3","doc":"Specifies that column `idx` (starting from zero) should be grown if there is extra space\navailable to the sizer.\n\nThe `proportion` parameter has the same meaning as the stretch factor for the sizers (see `m:wxBoxSizer`)\nexcept that if all proportions are 0, then all columns are resized equally (instead of not\nbeing resized at all).\n\nNotice that the column must not be already growable, if you need to change the proportion\nyou must call `removeGrowableCol/2` first and then make it growable (with a different proportion) again. You\ncan use `IsColGrowable()` (not implemented in wx) to check whether a column is already\ngrowable.","ref":"wxFlexGridSizer.html#addGrowableCol/3"},{"type":"function","title":"wxFlexGridSizer.addGrowableRow/2","doc":"","ref":"wxFlexGridSizer.html#addGrowableRow/2"},{"type":"function","title":"wxFlexGridSizer.addGrowableRow/3","doc":"Specifies that row idx (starting from zero) should be grown if there is extra space\navailable to the sizer.\n\nThis is identical to `addGrowableCol/3` except that it works with rows and not columns.","ref":"wxFlexGridSizer.html#addGrowableRow/3"},{"type":"function","title":"wxFlexGridSizer.destroy/1","doc":"Destroys the object","ref":"wxFlexGridSizer.html#destroy/1"},{"type":"function","title":"wxFlexGridSizer.getFlexibleDirection/1","doc":"Returns a ?wxOrientation value that specifies whether the sizer flexibly resizes its\ncolumns, rows, or both (default).\n\nReturn: One of the following values:\n\n* wxVERTICAL: Rows are flexibly sized.\n\n* wxHORIZONTAL: Columns are flexibly sized.\n\n* wxBOTH: Both rows and columns are flexibly sized (this is the default value).\n\nSee: `setFlexibleDirection/2`","ref":"wxFlexGridSizer.html#getFlexibleDirection/1"},{"type":"function","title":"wxFlexGridSizer.getNonFlexibleGrowMode/1","doc":"Returns the value that specifies how the sizer grows in the \"non-flexible\" direction if\nthere is one.\n\nThe behaviour of the elements in the flexible direction (i.e. both rows and columns by\ndefault, or rows only if `getFlexibleDirection/1` is `wxVERTICAL` or columns only if it is `wxHORIZONTAL`) is\nalways governed by their proportion as specified in the call to `addGrowableRow/3` or `addGrowableCol/3`. What happens in the\nother direction depends on the value of returned by this function as described below.\n\nReturn: One of the following values:\n\n* wxFLEX_GROWMODE_NONE: Sizer doesn't grow its elements at all in the non-flexible direction.\n\n* wxFLEX_GROWMODE_SPECIFIED: Sizer honors growable columns/rows set with `addGrowableCol/3` and `addGrowableRow/3` in the\nnon-flexible direction as well. In this case equal sizing applies to minimum sizes of\ncolumns or rows (this is the default value).\n\n* wxFLEX_GROWMODE_ALL: Sizer equally stretches all columns or rows in the non-flexible\ndirection, independently of the proportions applied in the flexible direction.\n\nSee:\n* `setFlexibleDirection/2`\n\n* `setNonFlexibleGrowMode/2`","ref":"wxFlexGridSizer.html#getNonFlexibleGrowMode/1"},{"type":"function","title":"wxFlexGridSizer.new/1","doc":"","ref":"wxFlexGridSizer.html#new/1"},{"type":"function","title":"wxFlexGridSizer.new/2","doc":"","ref":"wxFlexGridSizer.html#new/2"},{"type":"function","title":"wxFlexGridSizer.new/3","doc":"","ref":"wxFlexGridSizer.html#new/3"},{"type":"function","title":"wxFlexGridSizer.new/4","doc":"","ref":"wxFlexGridSizer.html#new/4"},{"type":"function","title":"wxFlexGridSizer.removeGrowableCol/2","doc":"Specifies that the `idx` column index is no longer growable.","ref":"wxFlexGridSizer.html#removeGrowableCol/2"},{"type":"function","title":"wxFlexGridSizer.removeGrowableRow/2","doc":"Specifies that the `idx` row index is no longer growable.","ref":"wxFlexGridSizer.html#removeGrowableRow/2"},{"type":"function","title":"wxFlexGridSizer.setFlexibleDirection/2","doc":"Specifies whether the sizer should flexibly resize its columns, rows, or both.\n\nArgument `direction` can be `wxVERTICAL`, `wxHORIZONTAL` or `wxBOTH` (which is the\ndefault value). Any other value is ignored.\n\nSee `getFlexibleDirection/1` for the explanation of these values. Note that this method does not trigger\nrelayout.","ref":"wxFlexGridSizer.html#setFlexibleDirection/2"},{"type":"function","title":"wxFlexGridSizer.setNonFlexibleGrowMode/2","doc":"Specifies how the sizer should grow in the non-flexible direction if there is one (so `setFlexibleDirection/2`\nmust have been called previously).\n\nArgument `mode` can be one of those documented in `getNonFlexibleGrowMode/1`, please see there for their\nexplanation. Note that this method does not trigger relayout.","ref":"wxFlexGridSizer.html#setNonFlexibleGrowMode/2"},{"type":"type","title":"wxFlexGridSizer.wxFlexGridSizer/0","doc":"","ref":"wxFlexGridSizer.html#t:wxFlexGridSizer/0"},{"type":"module","title":"wxFocusEvent","doc":"A focus event is sent when a window's focus changes.\n\nThe window losing focus receives a \"kill focus\" event while the window gaining it gets a\n\"set focus\" one.\n\nNotice that the set focus event happens both when the user gives focus to the window\n(whether using the mouse or keyboard) and when it is done from the program itself using `wxWindow:setFocus/1`.\n\nThe focus event handlers should almost invariably call `wxEvent:skip/2` on their event argument to allow\nthe default handling to take place. Failure to do this may result in incorrect behaviour\nof the native controls. Also note that wxEVT_KILL_FOCUS handler must not call `wxWindow:setFocus/1` as this,\nagain, is not supported by all native controls. If you need to do this, consider using the `Delayed Action Mechanism`\n(not implemented in wx) described in `m:wxIdleEvent` documentation.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFocusEvent](https://docs.wxwidgets.org/3.2/classwx_focus_event.html)","ref":"wxFocusEvent.html"},{"type":"module","title":"Events - wxFocusEvent","doc":"Use `wxEvtHandler:connect/3` with `wxFocusEventType` to subscribe to events of this type.","ref":"wxFocusEvent.html#module-events"},{"type":"function","title":"wxFocusEvent.getWindow/1","doc":"Returns the window associated with this event, that is the window which had the focus\nbefore for the `wxEVT\\_SET\\_FOCUS` event and the window which is going to receive focus\nfor the `wxEVT\\_KILL\\_FOCUS` one.\n\nWarning: the window pointer may be NULL!","ref":"wxFocusEvent.html#getWindow/1"},{"type":"type","title":"wxFocusEvent.wxFocus/0","doc":"","ref":"wxFocusEvent.html#t:wxFocus/0"},{"type":"type","title":"wxFocusEvent.wxFocusEvent/0","doc":"","ref":"wxFocusEvent.html#t:wxFocusEvent/0"},{"type":"type","title":"wxFocusEvent.wxFocusEventType/0","doc":"","ref":"wxFocusEvent.html#t:wxFocusEventType/0"},{"type":"module","title":"wxFont","doc":"A font is an object which determines the appearance of text.\n\nFonts are used for drawing text to a device context, and setting the appearance of a\nwindow's text, see `wxDC:setFont/2` and `wxWindow:setFont/2`.\n\nThe easiest way to create a custom font is to use `wxFontInfo` (not implemented in wx)\nobject to specify the font attributes and then use `new/5` constructor. Alternatively, you could\nstart with one of the pre-defined fonts or use `wxWindow:getFont/1` and modify the font, e.g. by increasing\nits size using `MakeLarger()` (not implemented in wx) or changing its weight using `MakeBold()`\n(not implemented in wx).\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nYou can retrieve the current system font settings with `m:wxSystemSettings`.\n\nPredefined objects (include wx.hrl): ?wxNullFont, ?wxNORMAL\\_FONT, ?wxSMALL\\_FONT,\n?wxITALIC\\_FONT, ?wxSWISS\\_FONT\n\nSee:\n* [Overview font](https://docs.wxwidgets.org/3.2/overview_font.html#overview_font)\n\n* `wxDC:setFont/2`\n\n* `wxDC:drawText/3`\n\n* `wxDC:getTextExtent/3`\n\n* `m:wxFontDialog`\n\n* `m:wxSystemSettings`\n\nwxWidgets docs: [wxFont](https://docs.wxwidgets.org/3.2/classwx_font.html)","ref":"wxFont.html"},{"type":"function","title":"wxFont.destroy/1","doc":"Destroys the object","ref":"wxFont.html#destroy/1"},{"type":"function","title":"wxFont.getDefaultEncoding/0","doc":"Returns the current application's default encoding.\n\nSee:\n* [Overview fontencoding](https://docs.wxwidgets.org/3.2/overview_fontencoding.html#overview_fontencoding)\n\n* `setDefaultEncoding/1`","ref":"wxFont.html#getDefaultEncoding/0"},{"type":"function","title":"wxFont.getFaceName/1","doc":"Returns the face name associated with the font, or the empty string if there is no face\ninformation.\n\nSee: `setFaceName/2`","ref":"wxFont.html#getFaceName/1"},{"type":"function","title":"wxFont.getFamily/1","doc":"Gets the font family if possible.\n\nAs described in ?wxFontFamily docs the returned value acts as a rough, basic\nclassification of the main font properties (look, spacing).\n\nIf the current font face name is not recognized by `m:wxFont` or by the underlying\nsystem, `wxFONTFAMILY_DEFAULT` is returned.\n\nNote that currently this function is not very precise and so not particularly useful.\nFont families mostly make sense only for font creation, see `setFamily/2`.\n\nSee: `setFamily/2`","ref":"wxFont.html#getFamily/1"},{"type":"function","title":"wxFont.getNativeFontInfoDesc/1","doc":"Returns the platform-dependent string completely describing this font.\n\nReturned string is always non-empty unless the font is invalid (in which case an assert\nis triggered).\n\nNote that the returned string is not meant to be shown or edited by the user: a typical\nuse of this function is for serializing in string-form a `m:wxFont` object.\n\nSee: `getNativeFontInfoUserDesc/1`","ref":"wxFont.html#getNativeFontInfoDesc/1"},{"type":"function","title":"wxFont.getNativeFontInfoUserDesc/1","doc":"Returns a user-friendly string for this font object.\n\nReturned string is always non-empty unless the font is invalid (in which case an assert\nis triggered).\n\nThe string does not encode all `m:wxFont` infos under all platforms; e.g. under wxMSW the\nfont family is not present in the returned string.\n\nSome examples of the formats of returned strings (which are platform-dependent) are in `SetNativeFontInfoUserDesc()`\n(not implemented in wx).\n\nSee: `getNativeFontInfoDesc/1`","ref":"wxFont.html#getNativeFontInfoUserDesc/1"},{"type":"function","title":"wxFont.getPointSize/1","doc":"Gets the point size as an integer number.\n\nThis function is kept for compatibility reasons. New code should use `GetFractionalPointSize()`\n(not implemented in wx) and support fractional point sizes.\n\nSee: `setPointSize/2`","ref":"wxFont.html#getPointSize/1"},{"type":"function","title":"wxFont.getStyle/1","doc":"Gets the font style.\n\nSee ?wxFontStyle for a list of valid styles.\n\nSee: `setStyle/2`","ref":"wxFont.html#getStyle/1"},{"type":"function","title":"wxFont.getUnderlined/1","doc":"Returns true if the font is underlined, false otherwise.\n\nSee: `setUnderlined/2`","ref":"wxFont.html#getUnderlined/1"},{"type":"function","title":"wxFont.getWeight/1","doc":"Gets the font weight.\n\nSee ?wxFontWeight for a list of valid weight identifiers.\n\nSee: `setWeight/2`","ref":"wxFont.html#getWeight/1"},{"type":"function","title":"wxFont.isFixedWidth/1","doc":"Returns true if the font is a fixed width (or monospaced) font, false if it is a\nproportional one or font is invalid.\n\nNote that this function under some platforms is different from just testing for the font\nfamily being equal to `wxFONTFAMILY_TELETYPE` because native platform-specific functions\nare used for the check (resulting in a more accurate return value).","ref":"wxFont.html#isFixedWidth/1"},{"type":"function","title":"wxFont.isOk/1","doc":"Returns true if this object is a valid font, false otherwise.","ref":"wxFont.html#isOk/1"},{"type":"function","title":"wxFont.new/0","doc":"Default ctor.","ref":"wxFont.html#new/0"},{"type":"function","title":"wxFont.new/1","doc":"Copy constructor, uses reference counting.","ref":"wxFont.html#new/1"},{"type":"function","title":"wxFont.new/4","doc":"Equivalent to: `new/5`","ref":"wxFont.html#new/4"},{"type":"function","title":"wxFont.new/5","doc":"Creates a font object with the specified attributes and size in pixels.\n\nNotice that the use of this constructor is often more verbose and less readable than the\nuse of constructor from `wxFontInfo` (not implemented in wx), consider using that\nconstructor instead.\n\nRemark: If the desired font does not exist, the closest match will be chosen. Under\nWindows, only scalable TrueType fonts are used.","ref":"wxFont.html#new/5"},{"type":"function","title":"wxFont.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxFont.html#ok/1"},{"type":"function","title":"wxFont.setDefaultEncoding/1","doc":"Sets the default font encoding.\n\nSee:\n* [Overview fontencoding](https://docs.wxwidgets.org/3.2/overview_fontencoding.html#overview_fontencoding)\n\n* `getDefaultEncoding/0`","ref":"wxFont.html#setDefaultEncoding/1"},{"type":"function","title":"wxFont.setFaceName/2","doc":"Sets the facename for the font.\n\nRemark: To avoid portability problems, don't rely on a specific face, but specify the\nfont family instead (see ?wxFontFamily and `setFamily/2`).\n\nReturn: true if the given face name exists; if the face name doesn't exist in the user's\nsystem then the font is invalidated (so that `isOk/1` will return false) and false is returned.\n\nSee:\n* `getFaceName/1`\n\n* `setFamily/2`","ref":"wxFont.html#setFaceName/2"},{"type":"function","title":"wxFont.setFamily/2","doc":"Sets the font family.\n\nAs described in ?wxFontFamily docs the given `family` value acts as a rough, basic\nindication of the main font properties (look, spacing).\n\nNote that changing the font family results in changing the font face name.\n\nSee:\n* `getFamily/1`\n\n* `setFaceName/2`","ref":"wxFont.html#setFamily/2"},{"type":"function","title":"wxFont.setPointSize/2","doc":"Sets the font size in points to an integer value.\n\nThis is a legacy version of the function only supporting integer point sizes. It can\nstill be used, but to avoid unnecessarily restricting the font size in points to integer\nvalues, consider using the new (added in wxWidgets 3.1.2) `SetFractionalPointSize()` (not\nimplemented in wx) function instead.","ref":"wxFont.html#setPointSize/2"},{"type":"function","title":"wxFont.setStyle/2","doc":"Sets the font style.\n\nSee: `getStyle/1`","ref":"wxFont.html#setStyle/2"},{"type":"function","title":"wxFont.setUnderlined/2","doc":"Sets underlining.\n\nSee: `getUnderlined/1`","ref":"wxFont.html#setUnderlined/2"},{"type":"function","title":"wxFont.setWeight/2","doc":"Sets the font weight.\n\nSee: `getWeight/1`","ref":"wxFont.html#setWeight/2"},{"type":"type","title":"wxFont.wxFont/0","doc":"","ref":"wxFont.html#t:wxFont/0"},{"type":"module","title":"wxFontData","doc":"This class holds a variety of information related to font dialogs.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_font)\n\n* `m:wxFont`\n\n* `m:wxFontDialog`\n\nwxWidgets docs: [wxFontData](https://docs.wxwidgets.org/3.2/classwx_font_data.html)","ref":"wxFontData.html"},{"type":"function","title":"wxFontData.destroy/1","doc":"Destroys the object","ref":"wxFontData.html#destroy/1"},{"type":"function","title":"wxFontData.enableEffects/2","doc":"Enables or disables \"effects\" under Windows or generic only.\n\nThis refers to the controls for manipulating colour, strikeout and underline properties.\n\nThe default value is true.","ref":"wxFontData.html#enableEffects/2"},{"type":"function","title":"wxFontData.getAllowSymbols/1","doc":"Under Windows, returns a flag determining whether symbol fonts can be selected.\n\nHas no effect on other platforms.\n\nThe default value is true.","ref":"wxFontData.html#getAllowSymbols/1"},{"type":"function","title":"wxFontData.getChosenFont/1","doc":"Gets the font chosen by the user if the user pressed OK (`wxFontDialog::ShowModal()` (not\nimplemented in wx) returned wxID\\_OK).","ref":"wxFontData.html#getChosenFont/1"},{"type":"function","title":"wxFontData.getColour/1","doc":"Gets the colour associated with the font dialog.\n\nThe default value is black.","ref":"wxFontData.html#getColour/1"},{"type":"function","title":"wxFontData.getEnableEffects/1","doc":"Determines whether \"effects\" are enabled under Windows.\n\nThis refers to the controls for manipulating colour, strikeout and underline properties.\n\nThe default value is true.","ref":"wxFontData.html#getEnableEffects/1"},{"type":"function","title":"wxFontData.getInitialFont/1","doc":"Gets the font that will be initially used by the font dialog.\n\nThis should have previously been set by the application.","ref":"wxFontData.html#getInitialFont/1"},{"type":"function","title":"wxFontData.getShowHelp/1","doc":"Returns true if the Help button will be shown (Windows only).\n\nThe default value is false.","ref":"wxFontData.html#getShowHelp/1"},{"type":"function","title":"wxFontData.new/0","doc":"Constructor.\n\nInitializes `fontColour` to black, `showHelp` to false, `allowSymbols` to true, `enableEffects`\nto true, `minSize` to 0 and `maxSize` to 0.","ref":"wxFontData.html#new/0"},{"type":"function","title":"wxFontData.new/1","doc":"Copy Constructor.","ref":"wxFontData.html#new/1"},{"type":"function","title":"wxFontData.setAllowSymbols/2","doc":"Under Windows, determines whether symbol fonts can be selected.\n\nHas no effect on other platforms.\n\nThe default value is true.","ref":"wxFontData.html#setAllowSymbols/2"},{"type":"function","title":"wxFontData.setChosenFont/2","doc":"Sets the font that will be returned to the user (for internal use only).","ref":"wxFontData.html#setChosenFont/2"},{"type":"function","title":"wxFontData.setColour/2","doc":"Sets the colour that will be used for the font foreground colour.\n\nThe default colour is black.","ref":"wxFontData.html#setColour/2"},{"type":"function","title":"wxFontData.setInitialFont/2","doc":"Sets the font that will be initially used by the font dialog.","ref":"wxFontData.html#setInitialFont/2"},{"type":"function","title":"wxFontData.setRange/3","doc":"Sets the valid range for the font point size (Windows only).\n\nThe default is 0, 0 (unrestricted range).","ref":"wxFontData.html#setRange/3"},{"type":"function","title":"wxFontData.setShowHelp/2","doc":"Determines whether the Help button will be displayed in the font dialog (Windows only).\n\nThe default value is false.","ref":"wxFontData.html#setShowHelp/2"},{"type":"type","title":"wxFontData.wxFontData/0","doc":"","ref":"wxFontData.html#t:wxFontData/0"},{"type":"module","title":"wxFontDialog","doc":"This class represents the font chooser dialog.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_font)\n\n* `m:wxFontData`\n\n* ?wxGetFontFromUser()\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFontDialog](https://docs.wxwidgets.org/3.2/classwx_font_dialog.html)","ref":"wxFontDialog.html"},{"type":"function","title":"wxFontDialog.create/3","doc":"Creates the dialog if the `m:wxFontDialog` object had been initialized using the default\nconstructor.\n\nReturn: true on success and false if an error occurred.","ref":"wxFontDialog.html#create/3"},{"type":"function","title":"wxFontDialog.destroy/1","doc":"Destroys the object","ref":"wxFontDialog.html#destroy/1"},{"type":"function","title":"wxFontDialog.getFontData/1","doc":"Returns the `m:wxFontData` associated with the font dialog.","ref":"wxFontDialog.html#getFontData/1"},{"type":"function","title":"wxFontDialog.new/0","doc":"Default ctor.\n\n`create/3` must be called before the dialog can be shown.","ref":"wxFontDialog.html#new/0"},{"type":"function","title":"wxFontDialog.new/2","doc":"Constructor.\n\nPass a parent window, and the `m:wxFontData` object to be used to initialize the dialog\ncontrols.","ref":"wxFontDialog.html#new/2"},{"type":"type","title":"wxFontDialog.wxFontDialog/0","doc":"","ref":"wxFontDialog.html#t:wxFontDialog/0"},{"type":"module","title":"wxFontPickerCtrl","doc":"This control allows the user to select a font.\n\nThe generic implementation is a button which brings up a `m:wxFontDialog` when clicked.\nNative implementation may differ but this is usually a (small) widget which give access to\nthe font-chooser dialog. It is only available if `wxUSE_FONTPICKERCTRL` is set to 1 (the default).","ref":"wxFontPickerCtrl.html"},{"type":"module","title":"Styles - wxFontPickerCtrl","doc":"This class supports the following styles:\n\n* wxFNTP_DEFAULT_STYLE: The default style: wxFNTP_FONTDESC_AS_LABEL |\nwxFNTP_USEFONT_FOR_LABEL.\n\n* wxFNTP_USE_TEXTCTRL: Creates a text control to the left of the picker button which is\ncompletely managed by the `m:wxFontPickerCtrl` and which can be used by the user to\nspecify a font (see SetSelectedFont). The text control is automatically synchronized with\nbutton's value. Use functions defined in `m:wxPickerBase` to modify the text control.\n\n* wxFNTP_FONTDESC_AS_LABEL: Keeps the label of the button updated with the fontface name\nand the font size. E.g. choosing \"Times New Roman bold, italic with size 10\" from the\nfontdialog, will update the label (overwriting any previous label) with the \"Times New\nRoman, 10\" text.\n\n* wxFNTP_USEFONT_FOR_LABEL: Uses the currently selected font to draw the label of the\nbutton.\n\nSee:\n* `m:wxFontDialog`\n\n* `m:wxFontPickerEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPickerBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFontPickerCtrl](https://docs.wxwidgets.org/3.2/classwx_font_picker_ctrl.html)","ref":"wxFontPickerCtrl.html#module-styles"},{"type":"module","title":"Events - wxFontPickerCtrl","doc":"Event types emitted from this class:\n\n* [`command_fontpicker_changed`](`m:wxFontPickerEvent`)","ref":"wxFontPickerCtrl.html#module-events"},{"type":"function","title":"wxFontPickerCtrl.create/3","doc":"","ref":"wxFontPickerCtrl.html#create/3"},{"type":"function","title":"wxFontPickerCtrl.create/4","doc":"Creates this widget with given parameters.\n\nReturn: true if the control was successfully created or false if creation failed.","ref":"wxFontPickerCtrl.html#create/4"},{"type":"function","title":"wxFontPickerCtrl.destroy/1","doc":"Destroys the object","ref":"wxFontPickerCtrl.html#destroy/1"},{"type":"function","title":"wxFontPickerCtrl.getMaxPointSize/1","doc":"Returns the maximum point size value allowed for the user-chosen font.","ref":"wxFontPickerCtrl.html#getMaxPointSize/1"},{"type":"function","title":"wxFontPickerCtrl.getSelectedFont/1","doc":"Returns the currently selected font.\n\nNote that this function is completely different from `wxWindow:getFont/1`.","ref":"wxFontPickerCtrl.html#getSelectedFont/1"},{"type":"function","title":"wxFontPickerCtrl.new/0","doc":"","ref":"wxFontPickerCtrl.html#new/0"},{"type":"function","title":"wxFontPickerCtrl.new/2","doc":"","ref":"wxFontPickerCtrl.html#new/2"},{"type":"function","title":"wxFontPickerCtrl.new/3","doc":"Initializes the object and calls `create/4` with all the parameters.","ref":"wxFontPickerCtrl.html#new/3"},{"type":"function","title":"wxFontPickerCtrl.setMaxPointSize/2","doc":"Sets the maximum point size value allowed for the user-chosen font.\n\nThe default value is 100. Note that big fonts can require a lot of memory and CPU time\nboth for creation and for rendering; thus, specially because the user has the option to\nspecify the fontsize through a text control (see wxFNTP_USE_TEXTCTRL), it's a good idea to\nput a limit to the maximum font size when huge fonts do not make much sense.","ref":"wxFontPickerCtrl.html#setMaxPointSize/2"},{"type":"function","title":"wxFontPickerCtrl.setSelectedFont/2","doc":"Sets the currently selected font.\n\nNote that this function is completely different from `wxWindow:setFont/2`.","ref":"wxFontPickerCtrl.html#setSelectedFont/2"},{"type":"type","title":"wxFontPickerCtrl.wxFontPickerCtrl/0","doc":"","ref":"wxFontPickerCtrl.html#t:wxFontPickerCtrl/0"},{"type":"module","title":"wxFontPickerEvent","doc":"This event class is used for the events generated by `m:wxFontPickerCtrl`.\n\nSee: `m:wxFontPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxFontPickerEvent](https://docs.wxwidgets.org/3.2/classwx_font_picker_event.html)","ref":"wxFontPickerEvent.html"},{"type":"module","title":"Events - wxFontPickerEvent","doc":"Use `wxEvtHandler:connect/3` with `wxFontPickerEventType` to subscribe to events of this type.","ref":"wxFontPickerEvent.html#module-events"},{"type":"function","title":"wxFontPickerEvent.getFont/1","doc":"Retrieve the font the user has just selected.","ref":"wxFontPickerEvent.html#getFont/1"},{"type":"type","title":"wxFontPickerEvent.wxFontPicker/0","doc":"","ref":"wxFontPickerEvent.html#t:wxFontPicker/0"},{"type":"type","title":"wxFontPickerEvent.wxFontPickerEvent/0","doc":"","ref":"wxFontPickerEvent.html#t:wxFontPickerEvent/0"},{"type":"type","title":"wxFontPickerEvent.wxFontPickerEventType/0","doc":"","ref":"wxFontPickerEvent.html#t:wxFontPickerEventType/0"},{"type":"module","title":"wxFrame","doc":"A frame is a window whose size and position can (usually) be changed by the user.\n\nIt usually has thick borders and a title bar, and can optionally contain a menu bar,\ntoolbar and status bar. A frame can contain any window that is not a frame or dialog.\n\nA frame that has a status bar and toolbar, created via the `createStatusBar/2` and `createToolBar/2` functions, manages these\nwindows and adjusts the value returned by `wxWindow:getClientSize/1` to reflect the remaining size available to\napplication windows.\n\nRemark: An application should normally define an `m:wxCloseEvent` handler for the frame\nto respond to system close events, for example so that related data and subwindows can be\ncleaned up.\n\nDefault event processing\n\n`m:wxFrame` processes the following events:\n\n* `wxEVT_SIZE:` if the frame has exactly one child window, not counting the status and\ntoolbar, this child is resized to take the entire frame client area. If two or more\nwindows are present, they should be laid out explicitly either by manually handling `wxEVT_SIZE`\nor using sizers;\n\n* `wxEVT_MENU_HIGHLIGHT:` the default implementation displays the help string associated\nwith the selected item in the first pane of the status bar, if there is one.","ref":"wxFrame.html"},{"type":"module","title":"Styles - wxFrame","doc":"This class supports the following styles:\n\n* wxDEFAULT_FRAME_STYLE: Defined as wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER |\nwxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN.\n\n* wxICONIZE: Display the frame iconized (minimized). Windows only.\n\n* wxCAPTION: Puts a caption on the frame. Notice that this flag is required by\nwxMINIMIZE_BOX, wxMAXIMIZE_BOX and wxCLOSE_BOX on most systems as the corresponding\nbuttons cannot be shown if the window has no title bar at all. I.e. if wxCAPTION is not\nspecified those styles would be simply ignored.\n\n* wxMINIMIZE: Identical to wxICONIZE. Windows only.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the frame.\n\n* wxMAXIMIZE: Displays the frame maximized. Windows and GTK+ only.\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the frame. Notice that under wxGTK\nwxRESIZE_BORDER must be used as well or this style is ignored.\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxSTAY_ON_TOP: Stay on top of all other windows, see also wxFRAME_FLOAT_ON_PARENT.\n\n* wxSYSTEM_MENU: Displays a system menu containing the list of various windows commands in\nthe window title bar. Unlike wxMINIMIZE_BOX, wxMAXIMIZE_BOX and wxCLOSE_BOX styles this\nstyle can be used without wxCAPTION, at least under Windows, and makes the system menu\navailable without showing it on screen in this case. However it is recommended to only use\nit together with wxCAPTION for consistent behaviour under all platforms.\n\n* wxRESIZE_BORDER: Displays a resizable border around the window.\n\n* wxFRAME_TOOL_WINDOW: Causes a frame with a small title bar to be created; the frame does\nnot appear in the taskbar under Windows or GTK+.\n\n* wxFRAME_NO_TASKBAR: Creates an otherwise normal frame but it does not appear in the\ntaskbar under Windows or GTK+ (note that it will minimize to the desktop window under\nWindows which may seem strange to the users and thus it might be better to use this style\nonly without wxMINIMIZE_BOX style). In wxGTK, the flag is respected only if the window\nmanager supports _NET_WM_STATE_SKIP_TASKBAR hint.\n\n* wxFRAME_FLOAT_ON_PARENT: The frame will always be on top of its parent (unlike\nwxSTAY_ON_TOP). A frame created with this style must have a non-NULL parent.\n\n* wxFRAME_SHAPED: Windows with this style are allowed to have their shape changed with the `wxTopLevelWindow:setShape/2`\nmethod. The default frame style is for normal, resizable frames. To create a frame which\ncannot be resized by user, you may use the following combination of styles:\n\nSee also the overview_windowstyles.","ref":"wxFrame.html#module-styles"},{"type":"module","title":"Extra Styles - wxFrame","doc":"This class supports the following extra styles:\n\n* wxFRAME_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. Note that this is an extended style\nand must be set by calling SetExtraStyle before Create is called (two-step construction).\nYou cannot use this style together with wxMAXIMIZE_BOX or wxMINIMIZE_BOX, so you should\nuse wxDEFAULT_FRAME_STYLE ~ (wxMINIMIZE_BOX | wxMAXIMIZE_BOX) for the frames having this\nstyle (the dialogs don't have a minimize or a maximize box by default)\n\n* wxFRAME_EX_METAL: On macOS, frames with this style will be shown with a metallic look.\nThis is an extra style.\n\nSee:\n* `m:wxMDIParentFrame`\n\n* `m:wxMDIChildFrame`\n\n* `m:wxMiniFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxFrame](https://docs.wxwidgets.org/3.2/classwx_frame.html)","ref":"wxFrame.html#module-extra-styles"},{"type":"module","title":"Events - wxFrame","doc":"Event types emitted from this class:\n\n* [`close_window`](`m:wxCloseEvent`)\n\n* [`iconize`](`m:wxIconizeEvent`)\n\n* [`menu_open`](`m:wxMenuEvent`)\n\n* [`menu_close`](`m:wxMenuEvent`)\n\n* [`menu_highlight`](`m:wxMenuEvent`)","ref":"wxFrame.html#module-events"},{"type":"function","title":"wxFrame.create/4","doc":"","ref":"wxFrame.html#create/4"},{"type":"function","title":"wxFrame.create/5","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","ref":"wxFrame.html#create/5"},{"type":"function","title":"wxFrame.createStatusBar/1","doc":"","ref":"wxFrame.html#createStatusBar/1"},{"type":"function","title":"wxFrame.createStatusBar/2","doc":"Creates a status bar at the bottom of the frame.\n\nReturn: A pointer to the status bar if it was created successfully, NULL otherwise.\n\nRemark: The width of the status bar is the whole width of the frame (adjusted\nautomatically when resizing), and the height and text size are chosen by the host\nwindowing system.\n\nSee:\n* `setStatusText/3`\n\n* `getStatusBar/1`","ref":"wxFrame.html#createStatusBar/2"},{"type":"function","title":"wxFrame.createToolBar/1","doc":"","ref":"wxFrame.html#createToolBar/1"},{"type":"function","title":"wxFrame.createToolBar/2","doc":"Creates a toolbar at the top or left of the frame.\n\nReturn: A pointer to the toolbar if it was created successfully, NULL otherwise.\n\nRemark: By default, the toolbar is an instance of `m:wxToolBar`. To use a different\nclass, override `OnCreateToolBar()` (not implemented in wx). When a toolbar has been\ncreated with this function, or made known to the frame with `setToolBar/2`, the frame will manage the\ntoolbar position and adjust the return value from `wxWindow:getClientSize/1` to reflect the available space for\napplication windows. Under Pocket PC, you should always use this function for creating the\ntoolbar to be managed by the frame, so that wxWidgets can use a combined menubar and\ntoolbar. Where you manage your own toolbars, create a `m:wxToolBar` as usual.\n\nSee:\n* `createStatusBar/2`\n\n* `setToolBar/2`\n\n* `getToolBar/1`","ref":"wxFrame.html#createToolBar/2"},{"type":"function","title":"wxFrame.destroy/1","doc":"Destroys the object","ref":"wxFrame.html#destroy/1"},{"type":"function","title":"wxFrame.getClientAreaOrigin/1","doc":"Returns the origin of the frame client area (in client coordinates).\n\nIt may be different from (0, 0) if the frame has a toolbar.","ref":"wxFrame.html#getClientAreaOrigin/1"},{"type":"function","title":"wxFrame.getMenuBar/1","doc":"Returns a pointer to the menubar currently associated with the frame (if any).\n\nSee:\n* `setMenuBar/2`\n\n* `m:wxMenuBar`\n\n* `m:wxMenu`","ref":"wxFrame.html#getMenuBar/1"},{"type":"function","title":"wxFrame.getStatusBar/1","doc":"Returns a pointer to the status bar currently associated with the frame (if any).\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`","ref":"wxFrame.html#getStatusBar/1"},{"type":"function","title":"wxFrame.getStatusBarPane/1","doc":"Returns the status bar pane used to display menu and toolbar help.\n\nSee: `setStatusBarPane/2`","ref":"wxFrame.html#getStatusBarPane/1"},{"type":"function","title":"wxFrame.getToolBar/1","doc":"Returns a pointer to the toolbar currently associated with the frame (if any).\n\nSee:\n* `createToolBar/2`\n\n* `m:wxToolBar`\n\n* `setToolBar/2`","ref":"wxFrame.html#getToolBar/1"},{"type":"function","title":"wxFrame.new/0","doc":"Default constructor.","ref":"wxFrame.html#new/0"},{"type":"function","title":"wxFrame.new/3","doc":"","ref":"wxFrame.html#new/3"},{"type":"function","title":"wxFrame.new/4","doc":"Constructor, creating the window.\n\nRemark: For Motif, MWM (the Motif Window Manager) should be running for any window styles\nto work (otherwise all styles take effect).\n\nSee: `create/5`","ref":"wxFrame.html#new/4"},{"type":"function","title":"wxFrame.processCommand/2","doc":"Simulate a menu command.","ref":"wxFrame.html#processCommand/2"},{"type":"function","title":"wxFrame.sendSizeEvent/1","doc":"","ref":"wxFrame.html#sendSizeEvent/1"},{"type":"function","title":"wxFrame.sendSizeEvent/2","doc":"This function sends a dummy `m:wxSizeEvent` to the window allowing it to re-layout its\nchildren positions.\n\nIt is sometimes useful to call this function after adding or deleting a children after\nthe frame creation or if a child size changes. Note that if the frame is using either\nsizers or constraints for the children layout, it is enough to call `wxWindow:layout/1` directly and this\nfunction should not be used in this case.\n\nIf `flags` includes `wxSEND_EVENT_POST` value, this function posts the event, i.e.\nschedules it for later processing, instead of dispatching it directly. You can also use `PostSizeEvent()`\n(not implemented in wx) as a more readable equivalent of calling this function with this flag.","ref":"wxFrame.html#sendSizeEvent/2"},{"type":"function","title":"wxFrame.setMenuBar/2","doc":"Tells the frame to show the given menu bar.\n\nRemark: If the frame is destroyed, the menu bar and its menus will be destroyed also, so\ndo not delete the menu bar explicitly (except by resetting the frame's menu bar to another\nframe or NULL). Under Windows, a size event is generated, so be sure to initialize data\nmembers properly before calling `setMenuBar/2`. Note that on some platforms, it is not possible to call\nthis function twice for the same frame object.\n\nSee:\n* `getMenuBar/1`\n\n* `m:wxMenuBar`\n\n* `m:wxMenu`","ref":"wxFrame.html#setMenuBar/2"},{"type":"function","title":"wxFrame.setStatusBar/2","doc":"Associates a status bar with the frame.\n\nIf `statusBar` is NULL, then the status bar, if present, is detached from the frame, but `not`\ndeleted.\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`\n\n* `getStatusBar/1`","ref":"wxFrame.html#setStatusBar/2"},{"type":"function","title":"wxFrame.setStatusBarPane/2","doc":"Set the status bar pane used to display menu and toolbar help.\n\nUsing -1 disables help display.","ref":"wxFrame.html#setStatusBarPane/2"},{"type":"function","title":"wxFrame.setStatusText/2","doc":"","ref":"wxFrame.html#setStatusText/2"},{"type":"function","title":"wxFrame.setStatusText/3","doc":"Sets the status bar text and updates the status bar display.\n\nThis is a simple wrapper for `wxStatusBar:setStatusText/3` which doesn't do anything if the frame has no status bar,\ni.e. `getStatusBar/1` returns NULL.\n\nRemark: Use an empty string to clear the status bar.\n\nSee:\n* `createStatusBar/2`\n\n* `m:wxStatusBar`","ref":"wxFrame.html#setStatusText/3"},{"type":"function","title":"wxFrame.setStatusWidths/2","doc":"Sets the widths of the fields in the status bar.\n\nRemark: The widths of the variable fields are calculated from the total width of all\nfields, minus the sum of widths of the non-variable fields, divided by the number of\nvariable fields.","ref":"wxFrame.html#setStatusWidths/2"},{"type":"function","title":"wxFrame.setToolBar/2","doc":"Associates a toolbar with the frame.","ref":"wxFrame.html#setToolBar/2"},{"type":"type","title":"wxFrame.wxFrame/0","doc":"","ref":"wxFrame.html#t:wxFrame/0"},{"type":"module","title":"wxGBSizerItem","doc":"The `m:wxGBSizerItem` class is used by the `m:wxGridBagSizer` for tracking the items in\nthe sizer.\n\nIt adds grid position and spanning information to the normal `m:wxSizerItem` by adding `wxGBPosition`\n(not implemented in wx) and `wxGBSpan` (not implemented in wx) attributes. Most of the\ntime you will not need to use a `m:wxGBSizerItem` directly in your code, but there are a\ncouple of cases where it is handy.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizerItem`\n\nwxWidgets docs: [wxGBSizerItem](https://docs.wxwidgets.org/3.2/classwx_g_b_sizer_item.html)","ref":"wxGBSizerItem.html"},{"type":"type","title":"wxGBSizerItem.wxGBSizerItem/0","doc":"","ref":"wxGBSizerItem.html#t:wxGBSizerItem/0"},{"type":"module","title":"wxGCDC","doc":"`m:wxGCDC` is a device context that draws on a `m:wxGraphicsContext`.\n\n`m:wxGCDC` does its best to implement `m:wxDC` API, but the following features are not\n(fully) implemented because `m:wxGraphicsContext` doesn't support them:\n\n* `wxDC:getPixel/2` method is not implemented and always returns false because modern graphics layers don't\nsupport retrieving the contents of the drawn pixels.\n\n* `wxDC:floodFill/4` method is not, and can't be, implemented, as its functionality relies on reading the\npixels from `m:wxGraphicsContext` too.\n\n* `wxDC:setLogicalFunction/2` method only works with `wxCOPY`, `wxOR`, `wxNO_OP`, `wxCLEAR` and `wxXOR` functions,\nattempts to use any other function (including `wxINVERT`) don't do anything.\n\n* Similarly, ?wxRasterOperationMode parameter of `wxDC:blit/6` and `StretchBlit()` (not implemented in\nwx) can only be one of the supported logical functions listed above, using any other\nfunction will result in an assertion failure and not drawing anything.\n\n* For Direct2D-based `m:wxGraphicsContext`, only true-type fonts can be used in the\nfont-related functions.\n\nSee:\n* `m:wxDC`\n\n* `m:wxGraphicsContext`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxGCDC](https://docs.wxwidgets.org/3.2/classwx_g_c_d_c.html)","ref":"wxGCDC.html"},{"type":"function","title":"wxGCDC.destroy/1","doc":"Destroys the object","ref":"wxGCDC.html#destroy/1"},{"type":"function","title":"wxGCDC.getGraphicsContext/1","doc":"Retrieves associated `m:wxGraphicsContext`.","ref":"wxGCDC.html#getGraphicsContext/1"},{"type":"function","title":"wxGCDC.new/0","doc":"","ref":"wxGCDC.html#new/0"},{"type":"function","title":"wxGCDC.new/1","doc":"Constructs a `m:wxGCDC` from a `m:wxWindowDC`.","ref":"wxGCDC.html#new/1"},{"type":"function","title":"wxGCDC.setGraphicsContext/2","doc":"Set the graphics context to be used for this `m:wxGCDC`.\n\nNote that this object takes ownership of `context` and will delete it when it is\ndestroyed or when `setGraphicsContext/2` is called again.\n\nAlso, unlike the constructor taking `m:wxGraphicsContext`, this method will reapply the\ncurrent font, pen and brush, so that this object continues to use them, if they had been\nchanged before (which is never the case when constructing `m:wxGCDC` directly from `m:wxGraphicsContext`).","ref":"wxGCDC.html#setGraphicsContext/2"},{"type":"type","title":"wxGCDC.wxGCDC/0","doc":"","ref":"wxGCDC.html#t:wxGCDC/0"},{"type":"module","title":"wxGLCanvas","doc":"`m:wxGLCanvas` is a class for displaying OpenGL graphics.\n\nIt is always used in conjunction with `m:wxGLContext` as the context can only be made\ncurrent (i.e. active for the OpenGL commands) when it is associated to a `m:wxGLCanvas`.\n\nMore precisely, you first need to create a `m:wxGLCanvas` window and then create an\ninstance of a `m:wxGLContext` that is initialized with this `m:wxGLCanvas` and then later\nuse either `setCurrent/2` with the instance of the `m:wxGLContext` or `wxGLContext:setCurrent/2` with the instance of the `m:wxGLCanvas`\n(which might be not the same as was used for the creation of the context) to bind the\nOpenGL state that is represented by the rendering context to the canvas, and then finally\ncall `swapBuffers/1` to swap the buffers of the OpenGL canvas and thus show your current output.\n\nPlease note that `m:wxGLContext` always uses physical pixels, even on the platforms where `m:wxWindow`\nuses logical pixels, affected by the coordinate scaling, on high DPI displays. Thus, if\nyou want to set the OpenGL view port to the size of entire window, you must multiply the\nresult returned by `wxWindow:getClientSize/1` by `wxWindow:getContentScaleFactor/1` before passing it to `glViewport()`. Same considerations apply to\nother OpenGL functions and other coordinates, notably those retrieved from `m:wxMouseEvent`\nin the event handlers.\n\nNotice that versions of wxWidgets previous to 2.9 used to implicitly create a `m:wxGLContext`\ninside `m:wxGLCanvas` itself. This is still supported in the current version but is\ndeprecated now and will be removed in the future, please update your code to create the\nrendering contexts explicitly.\n\nTo set up the attributes for the canvas (number of bits for the depth buffer, number of\nbits for the stencil buffer and so on) you pass them in the constructor using a `wxGLAttributes`\n(not implemented in wx) instance. You can still use the way before 3.1.0 (setting up the\ncorrect values of the `attribList` parameter) but it's discouraged.\n\nNote: On those platforms which use a configure script (e.g. Linux and macOS) OpenGL\nsupport is automatically enabled if the relative headers and libraries are found. To\nswitch it on under the other platforms (e.g. Windows), you need to edit the `setup.h` file\nand set `wxUSE_GLCANVAS` to `1` and then also pass `USE_OPENGL=1` to the make utility. You\nmay also need to add `opengl32.lib` (and `glu32.lib` for old OpenGL versions) to the list\nof the libraries your program is linked with.\n\nSee: `m:wxGLContext`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGLCanvas](https://docs.wxwidgets.org/3.2/classwx_g_l_canvas.html)","ref":"wxGLCanvas.html"},{"type":"function","title":"wxGLCanvas.createSurface/1","doc":"","ref":"wxGLCanvas.html#createSurface/1"},{"type":"function","title":"wxGLCanvas.destroy/1","doc":"Destroys the object","ref":"wxGLCanvas.html#destroy/1"},{"type":"function","title":"wxGLCanvas.isDisplaySupported/1","doc":"Determines if a canvas having the specified attributes is available.\n\nThis only applies for visual attributes, not rendering context attributes. Please, use\nthe new form of this method, using `wxGLAttributes` (not implemented in wx).\n\nReturn: true if attributes are supported.","ref":"wxGLCanvas.html#isDisplaySupported/1"},{"type":"function","title":"wxGLCanvas.new/1","doc":"","ref":"wxGLCanvas.html#new/1"},{"type":"function","title":"wxGLCanvas.new/2","doc":"This constructor is still available only for compatibility reasons.\n\nPlease use the constructor with `wxGLAttributes` (not implemented in wx) instead.\n\nIf `attribList` is not specified, `wxGLAttributes::PlatformDefaults()` (not implemented\nin wx) is used, plus some other attributes (see below).","ref":"wxGLCanvas.html#new/2"},{"type":"function","title":"wxGLCanvas.setCurrent/2","doc":"Makes the OpenGL state that is represented by the OpenGL rendering context `context`\ncurrent, i.e.\n\nit will be used by all subsequent OpenGL calls.\n\nThis is equivalent to `wxGLContext:setCurrent/2` called with this window as parameter.\n\nNote: This function may only be called when the window is shown on screen, in particular\nit can't usually be called from the constructor as the window isn't yet shown at this moment.\n\nReturn: false if an error occurred.","ref":"wxGLCanvas.html#setCurrent/2"},{"type":"function","title":"wxGLCanvas.swapBuffers/1","doc":"Swaps the double-buffer of this window, making the back-buffer the front-buffer and vice\nversa, so that the output of the previous OpenGL commands is displayed on the window.\n\nReturn: false if an error occurred.","ref":"wxGLCanvas.html#swapBuffers/1"},{"type":"type","title":"wxGLCanvas.wxGLCanvas/0","doc":"","ref":"wxGLCanvas.html#t:wxGLCanvas/0"},{"type":"module","title":"wxGLContext","doc":"An instance of a `m:wxGLContext` represents the state of an OpenGL state machine and the\nconnection between OpenGL and the system.\n\nThe OpenGL state includes everything that can be set with the OpenGL API: colors,\nrendering variables, buffer data ids, texture objects, etc. It is possible to have\nmultiple rendering contexts share buffer data and textures. This feature is specially\nuseful when the application use multiple threads for updating data into the memory of the\ngraphics card.\n\nWhether one only rendering context is used with or bound to multiple output windows or if\neach window has its own bound context is a developer decision. It is important to take\ninto account that GPU makers may set different pointers to the same OGL function for\ndifferent contexts. The way these pointers are retrieved from the OGL driver should be\nused again for each new context.\n\nBinding (making current) a rendering context with another instance of a `m:wxGLCanvas`\nhowever works only if the both `m:wxGLCanvas` instances were created with the same attributes.\n\nOpenGL version 3 introduced a new type of specification profile, the modern core profile.\nThe old compatibility profile maintains all legacy features. Since wxWidgets 3.1.0 you can\nchoose the type of context and even ask for a specified OGL version number. However, its\nadvised to use only core profile as the compatibility profile may run a bit slower.\n\nOpenGL core profile specification defines several flags at context creation that\ndetermine not only the type of context but also some features. Some of these flags can be\nset in the list of attributes used at `m:wxGLCanvas` ctor. But since wxWidgets 3.1.0 it is\nstrongly encouraged to use the new mechanism: setting the context attributes with a `wxGLContextAttrs`\n(not implemented in wx) object and the canvas attributes with a `wxGLAttributes` (not\nimplemented in wx) object.\n\nThe best way of knowing if your OpenGL environment supports a specific type of context is\ncreating a `m:wxGLContext` instance and checking `isOK/1`. If it returns false, then simply delete\nthat instance and create a new one with other attributes.\n\nwxHAS_OPENGL_ES is defined on platforms that only have this implementation available\n(e.g. the iPhone) and don't support the full specification.\n\nSee: `m:wxGLCanvas`\n\nwxWidgets docs: [wxGLContext](https://docs.wxwidgets.org/3.2/classwx_g_l_context.html)","ref":"wxGLContext.html"},{"type":"function","title":"wxGLContext.destroy/1","doc":"Destroys the object","ref":"wxGLContext.html#destroy/1"},{"type":"function","title":"wxGLContext.isOK/1","doc":"Checks if the underlying OpenGL rendering context was correctly created by the system\nwith the requested attributes.\n\nIf this function returns false then the `m:wxGLContext` object is useless and should be\ndeleted and recreated with different attributes.\n\nSince: 3.1.0","ref":"wxGLContext.html#isOK/1"},{"type":"function","title":"wxGLContext.new/1","doc":"","ref":"wxGLContext.html#new/1"},{"type":"function","title":"wxGLContext.new/2","doc":"Constructor.","ref":"wxGLContext.html#new/2"},{"type":"function","title":"wxGLContext.setCurrent/2","doc":"Makes the OpenGL state that is represented by this rendering context current with the `m:wxGLCanvas`\n`win`.\n\nNote: `win` can be a different `m:wxGLCanvas` window than the one that was passed to the\nconstructor of this rendering context. If `RC` is an object of type `m:wxGLContext`, the\nstatements `\"RC.SetCurrent(win);\"` and `\"win.SetCurrent(RC);\"` are equivalent, see `wxGLCanvas:setCurrent/2`.","ref":"wxGLContext.html#setCurrent/2"},{"type":"type","title":"wxGLContext.wxGLContext/0","doc":"","ref":"wxGLContext.html#t:wxGLContext/0"},{"type":"module","title":"wxGauge","doc":"A gauge is a horizontal or vertical bar which shows a quantity (often time).\n\n`m:wxGauge` supports two working modes: determinate and indeterminate progress.\n\nThe first is the usual working mode (see `setValue/2` and `setRange/2`) while the second can be used when the\nprogram is doing some processing but you don't know how much progress is being done. In\nthis case, you can periodically call the `pulse/1` function to make the progress bar switch to\nindeterminate mode (graphically it's usually a set of blocks which move or bounce in the\nbar control).\n\n`m:wxGauge` supports dynamic switch between these two work modes.\n\nThere are no user commands for the gauge.","ref":"wxGauge.html"},{"type":"module","title":"Styles - wxGauge","doc":"This class supports the following styles:\n\n* wxGA_HORIZONTAL: Creates a horizontal gauge.\n\n* wxGA_VERTICAL: Creates a vertical gauge.\n\n* wxGA_SMOOTH: Creates smooth progress bar with one pixel wide update step (not supported\nby all platforms).\n\n* wxGA_TEXT: Display the current value in percents in the gauge itself. This style is only\nsupported in wxQt and ignored under the other platforms. This flag is only available in\nwxWidgets 3.1.0 and later.\n\n* wxGA_PROGRESS: Reflect the value of gauge in the application taskbar button under Windows\n7 and later and the dock icon under macOS, ignored under the other platforms. This flag is\nonly available in wxWidgets 3.1.0 and later.\n\nSee:\n* `m:wxSlider`\n\n* `m:wxScrollBar`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGauge](https://docs.wxwidgets.org/3.2/classwx_gauge.html)","ref":"wxGauge.html#module-styles"},{"type":"function","title":"wxGauge.create/4","doc":"","ref":"wxGauge.html#create/4"},{"type":"function","title":"wxGauge.create/5","doc":"Creates the gauge for two-step construction.\n\nSee `new/4` for further details.","ref":"wxGauge.html#create/5"},{"type":"function","title":"wxGauge.destroy/1","doc":"Destroys the object","ref":"wxGauge.html#destroy/1"},{"type":"function","title":"wxGauge.getRange/1","doc":"Returns the maximum position of the gauge.\n\nSee: `setRange/2`","ref":"wxGauge.html#getRange/1"},{"type":"function","title":"wxGauge.getValue/1","doc":"Returns the current position of the gauge.\n\nSee: `setValue/2`","ref":"wxGauge.html#getValue/1"},{"type":"function","title":"wxGauge.isVertical/1","doc":"Returns true if the gauge is vertical (has `wxGA_VERTICAL` style) and false otherwise.","ref":"wxGauge.html#isVertical/1"},{"type":"function","title":"wxGauge.new/0","doc":"Default constructor.","ref":"wxGauge.html#new/0"},{"type":"function","title":"wxGauge.new/3","doc":"","ref":"wxGauge.html#new/3"},{"type":"function","title":"wxGauge.new/4","doc":"Constructor, creating and showing a gauge.\n\nSee: `create/5`","ref":"wxGauge.html#new/4"},{"type":"function","title":"wxGauge.pulse/1","doc":"Switch the gauge to indeterminate mode (if required) and makes the gauge move a bit to\nindicate the user that some progress has been made.\n\nNote: After calling this function the value returned by `getValue/1` is undefined and thus you need\nto explicitly call `setValue/2` if you want to restore the determinate mode.","ref":"wxGauge.html#pulse/1"},{"type":"function","title":"wxGauge.setRange/2","doc":"Sets the range (maximum value) of the gauge.\n\nThis function makes the gauge switch to determinate mode, if it's not already.\n\nWhen the gauge is in indeterminate mode, under wxMSW the gauge repeatedly goes from zero\nto `range` and back; under other ports when in indeterminate mode, the `range` setting is ignored.\n\nSee: `getRange/1`","ref":"wxGauge.html#setRange/2"},{"type":"function","title":"wxGauge.setValue/2","doc":"Sets the position of the gauge.\n\nThe `pos` must be between 0 and the gauge range as returned by `getRange/1`, inclusive.\n\nThis function makes the gauge switch to determinate mode, if it was in indeterminate mode before.\n\nSee: `getValue/1`","ref":"wxGauge.html#setValue/2"},{"type":"type","title":"wxGauge.wxGauge/0","doc":"","ref":"wxGauge.html#t:wxGauge/0"},{"type":"module","title":"wxGenericDirCtrl","doc":"This control can be used to place a directory listing (with optional files) on an\narbitrary window.\n\nThe control contains a `m:wxTreeCtrl` window representing the directory hierarchy, and\noptionally, a `m:wxChoice` window containing a list of filters.","ref":"wxGenericDirCtrl.html"},{"type":"module","title":"Styles - wxGenericDirCtrl","doc":"This class supports the following styles:\n\n* wxDIRCTRL_DIR_ONLY: Only show directories, and not files.\n\n* wxDIRCTRL_3D_INTERNAL: Use 3D borders for internal controls. This is the default.\n\n* wxDIRCTRL_SELECT_FIRST: When setting the default path, select the first file in the\ndirectory.\n\n* wxDIRCTRL_SHOW_FILTERS: Show the drop-down filter list.\n\n* wxDIRCTRL_EDIT_LABELS: Allow the folder and file labels to be editable.\n\n* wxDIRCTRL_MULTIPLE: Allows multiple files and folders to be selected.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGenericDirCtrl](https://docs.wxwidgets.org/3.2/classwx_generic_dir_ctrl.html)","ref":"wxGenericDirCtrl.html#module-styles"},{"type":"module","title":"Events - wxGenericDirCtrl","doc":"Event types emitted from this class:\n\n* [`dirctrl_selectionchanged`](`m:wxTreeEvent`)\n\n* [`dirctrl_fileactivated`](`m:wxTreeEvent`)","ref":"wxGenericDirCtrl.html#module-events"},{"type":"function","title":"wxGenericDirCtrl.collapseTree/1","doc":"Collapses the entire tree.","ref":"wxGenericDirCtrl.html#collapseTree/1"},{"type":"function","title":"wxGenericDirCtrl.create/2","doc":"","ref":"wxGenericDirCtrl.html#create/2"},{"type":"function","title":"wxGenericDirCtrl.create/3","doc":"Create function for two-step construction.\n\nSee `new/2` for details.","ref":"wxGenericDirCtrl.html#create/3"},{"type":"function","title":"wxGenericDirCtrl.destroy/1","doc":"Destroys the object","ref":"wxGenericDirCtrl.html#destroy/1"},{"type":"function","title":"wxGenericDirCtrl.expandPath/2","doc":"Tries to expand as much of the given `path` as possible, so that the filename or\ndirectory is visible in the tree control.","ref":"wxGenericDirCtrl.html#expandPath/2"},{"type":"function","title":"wxGenericDirCtrl.getDefaultPath/1","doc":"Gets the default path.","ref":"wxGenericDirCtrl.html#getDefaultPath/1"},{"type":"function","title":"wxGenericDirCtrl.getFilePath/1","doc":"Gets selected filename path only (else empty string).\n\nThis function doesn't count a directory as a selection.","ref":"wxGenericDirCtrl.html#getFilePath/1"},{"type":"function","title":"wxGenericDirCtrl.getFilter/1","doc":"Returns the filter string.","ref":"wxGenericDirCtrl.html#getFilter/1"},{"type":"function","title":"wxGenericDirCtrl.getFilterIndex/1","doc":"Returns the current filter index (zero-based).","ref":"wxGenericDirCtrl.html#getFilterIndex/1"},{"type":"function","title":"wxGenericDirCtrl.getPath/1","doc":"Gets the currently-selected directory or filename.","ref":"wxGenericDirCtrl.html#getPath/1"},{"type":"function","title":"wxGenericDirCtrl.getPath/2","doc":"Gets the path corresponding to the given tree control item.\n\nSince: 2.9.5","ref":"wxGenericDirCtrl.html#getPath/2"},{"type":"function","title":"wxGenericDirCtrl.getRootId/1","doc":"Returns the root id for the tree control.","ref":"wxGenericDirCtrl.html#getRootId/1"},{"type":"function","title":"wxGenericDirCtrl.getTreeCtrl/1","doc":"Returns a pointer to the tree control.","ref":"wxGenericDirCtrl.html#getTreeCtrl/1"},{"type":"function","title":"wxGenericDirCtrl.init/1","doc":"Initializes variables.","ref":"wxGenericDirCtrl.html#init/1"},{"type":"function","title":"wxGenericDirCtrl.new/0","doc":"Default constructor.","ref":"wxGenericDirCtrl.html#new/0"},{"type":"function","title":"wxGenericDirCtrl.new/1","doc":"","ref":"wxGenericDirCtrl.html#new/1"},{"type":"function","title":"wxGenericDirCtrl.new/2","doc":"Main constructor.","ref":"wxGenericDirCtrl.html#new/2"},{"type":"function","title":"wxGenericDirCtrl.reCreateTree/1","doc":"Collapse and expand the tree, thus re-creating it from scratch.\n\nMay be used to update the displayed directory content.","ref":"wxGenericDirCtrl.html#reCreateTree/1"},{"type":"function","title":"wxGenericDirCtrl.setDefaultPath/2","doc":"Sets the default path.","ref":"wxGenericDirCtrl.html#setDefaultPath/2"},{"type":"function","title":"wxGenericDirCtrl.setFilter/2","doc":"Sets the filter string.","ref":"wxGenericDirCtrl.html#setFilter/2"},{"type":"function","title":"wxGenericDirCtrl.setFilterIndex/2","doc":"Sets the current filter index (zero-based).","ref":"wxGenericDirCtrl.html#setFilterIndex/2"},{"type":"function","title":"wxGenericDirCtrl.setPath/2","doc":"Sets the current path.","ref":"wxGenericDirCtrl.html#setPath/2"},{"type":"type","title":"wxGenericDirCtrl.wxGenericDirCtrl/0","doc":"","ref":"wxGenericDirCtrl.html#t:wxGenericDirCtrl/0"},{"type":"module","title":"wxGraphicsBrush","doc":"A `m:wxGraphicsBrush` is a native representation of a brush.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createBrush/2` or `wxGraphicsRenderer:createBrush/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsBrush](https://docs.wxwidgets.org/3.2/classwx_graphics_brush.html)","ref":"wxGraphicsBrush.html"},{"type":"type","title":"wxGraphicsBrush.wxGraphicsBrush/0","doc":"","ref":"wxGraphicsBrush.html#t:wxGraphicsBrush/0"},{"type":"module","title":"wxGraphicsContext","doc":"A `m:wxGraphicsContext` instance is the object that is drawn upon.\n\nIt is created by a renderer using `wxGraphicsRenderer:createContext/2`. This can be either directly using a renderer\ninstance, or indirectly using the static convenience `create/1` functions of `m:wxGraphicsContext`\nthat always delegate the task to the default renderer.\n\nRemark: For some renderers (like Direct2D or Cairo) processing of drawing operations may\nbe deferred (Direct2D render target normally builds up a batch of rendering commands but\ndefers processing of these commands, Cairo operates on a separate surface) so to make\ndrawing results visible you need to update the content of the context by calling `wxGraphicsContext::Flush()`\n(not implemented in wx) or by destroying the context.\n\nSee:\n* `wxGraphicsRenderer:createContext/2`\n\n* `m:wxGCDC`\n\n* `m:wxDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsContext](https://docs.wxwidgets.org/3.2/classwx_graphics_context.html)","ref":"wxGraphicsContext.html"},{"type":"function","title":"wxGraphicsContext.clip/2","doc":"Sets the clipping region to the intersection of the given region and the previously set\nclipping region.\n\nThe clipping region is an area to which drawing is restricted.\n\nRemark:\n\n* Clipping region should be given in logical coordinates.\n\n* Calling this function can only make the clipping region smaller, never larger.\n\n* You need to call `resetClip/1` first if you want to set the clipping region exactly to the region specified.\n\n* If resulting clipping region is empty, then all drawing upon the context is clipped out\n(all changes made by drawing operations are masked out).","ref":"wxGraphicsContext.html#clip/2"},{"type":"function","title":"wxGraphicsContext.clip/5","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxGraphicsContext.html#clip/5"},{"type":"function","title":"wxGraphicsContext.concatTransform/2","doc":"Concatenates the passed in transform with the current transform of this context.","ref":"wxGraphicsContext.html#concatTransform/2"},{"type":"function","title":"wxGraphicsContext.create/0","doc":"Create a lightweight context that can be used only for measuring text.","ref":"wxGraphicsContext.html#create/0"},{"type":"function","title":"wxGraphicsContext.create/1","doc":"Creates a `m:wxGraphicsContext` from a `m:wxWindowDC`.\n\nSee: `wxGraphicsRenderer:createContext/2`","ref":"wxGraphicsContext.html#create/1"},{"type":"function","title":"wxGraphicsContext.createBrush/2","doc":"Creates a native brush from a `m:wxBrush`.","ref":"wxGraphicsContext.html#createBrush/2"},{"type":"function","title":"wxGraphicsContext.createFont/2","doc":"","ref":"wxGraphicsContext.html#createFont/2"},{"type":"function","title":"wxGraphicsContext.createFont/3","doc":"Creates a native graphics font from a `m:wxFont` and a text colour.\n\nRemark: For Direct2D graphics fonts can be created from TrueType fonts only.","ref":"wxGraphicsContext.html#createFont/3"},{"type":"function","title":"wxGraphicsContext.createFont/4","doc":"Creates a font object with the specified attributes.\n\nThe use of overload taking `m:wxFont` is preferred, see `wxGraphicsRenderer:createFont/4` for more details.\n\nRemark: For Direct2D graphics fonts can be created from TrueType fonts only.\n\nSince: 2.9.3","ref":"wxGraphicsContext.html#createFont/4"},{"type":"function","title":"wxGraphicsContext.createLinearGradientBrush/6","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxGraphicsContext.html#createLinearGradientBrush/6"},{"type":"function","title":"wxGraphicsContext.createLinearGradientBrush/7","doc":"` Creates a native brush with a linear gradient. The brush starts at (@a x1, @a y1) and\nends at (@a x2, @a y2). Either just the start and end gradient colours (@a c1 and @a c2)\nor full set of gradient @a stops can be specified. The version taking\nwxGraphicsGradientStops is new in wxWidgets 2.9.1. `\nThe `matrix` parameter was added in wxWidgets 3.1.3","ref":"wxGraphicsContext.html#createLinearGradientBrush/7"},{"type":"function","title":"wxGraphicsContext.createMatrix/1","doc":"","ref":"wxGraphicsContext.html#createMatrix/1"},{"type":"function","title":"wxGraphicsContext.createMatrix/2","doc":"Creates a native affine transformation matrix from the passed in values.\n\nThe default parameters result in an identity matrix.","ref":"wxGraphicsContext.html#createMatrix/2"},{"type":"function","title":"wxGraphicsContext.createPath/1","doc":"Creates a native graphics path which is initially empty.","ref":"wxGraphicsContext.html#createPath/1"},{"type":"function","title":"wxGraphicsContext.createPen/2","doc":"Creates a native pen from a `m:wxPen`.\n\nPrefer to use the overload taking `wxGraphicsPenInfo` (not implemented in wx) unless you\nalready have a `m:wxPen` as constructing one only to pass it to this method is wasteful.","ref":"wxGraphicsContext.html#createPen/2"},{"type":"function","title":"wxGraphicsContext.createRadialGradientBrush/7","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxGraphicsContext.html#createRadialGradientBrush/7"},{"type":"function","title":"wxGraphicsContext.createRadialGradientBrush/8","doc":"` Creates a native brush with a radial gradient. The brush originates at (@a startX, @a\nstartY) and ends on a circle around (@a endX, @a endY) with the given @a radius. The\ngradient may be specified either by its start and end colours @a oColor and @a cColor or\nby a full set of gradient @a stops. The version taking wxGraphicsGradientStops is new in\nwxWidgets 2.9.1. `\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","ref":"wxGraphicsContext.html#createRadialGradientBrush/8"},{"type":"function","title":"wxGraphicsContext.destroy/1","doc":"Destroys the object","ref":"wxGraphicsContext.html#destroy/1"},{"type":"function","title":"wxGraphicsContext.drawBitmap/6","doc":"Draws the bitmap.\n\nIn case of a mono bitmap, this is treated as a mask and the current brushed is used for\nfilling.","ref":"wxGraphicsContext.html#drawBitmap/6"},{"type":"function","title":"wxGraphicsContext.drawEllipse/5","doc":"Draws an ellipse.","ref":"wxGraphicsContext.html#drawEllipse/5"},{"type":"function","title":"wxGraphicsContext.drawIcon/6","doc":"Draws the icon.","ref":"wxGraphicsContext.html#drawIcon/6"},{"type":"function","title":"wxGraphicsContext.drawLines/2","doc":"","ref":"wxGraphicsContext.html#drawLines/2"},{"type":"function","title":"wxGraphicsContext.drawLines/3","doc":"Draws a polygon.","ref":"wxGraphicsContext.html#drawLines/3"},{"type":"function","title":"wxGraphicsContext.drawPath/2","doc":"","ref":"wxGraphicsContext.html#drawPath/2"},{"type":"function","title":"wxGraphicsContext.drawPath/3","doc":"Draws the path by first filling and then stroking.","ref":"wxGraphicsContext.html#drawPath/3"},{"type":"function","title":"wxGraphicsContext.drawRectangle/5","doc":"Draws a rectangle.","ref":"wxGraphicsContext.html#drawRectangle/5"},{"type":"function","title":"wxGraphicsContext.drawRoundedRectangle/6","doc":"Draws a rounded rectangle.","ref":"wxGraphicsContext.html#drawRoundedRectangle/6"},{"type":"function","title":"wxGraphicsContext.drawText/4","doc":"Draws text at the defined position.","ref":"wxGraphicsContext.html#drawText/4"},{"type":"function","title":"wxGraphicsContext.drawText/5","doc":"Draws text at the defined position.","ref":"wxGraphicsContext.html#drawText/5"},{"type":"function","title":"wxGraphicsContext.drawText/6","doc":"Draws text at the defined position.","ref":"wxGraphicsContext.html#drawText/6"},{"type":"function","title":"wxGraphicsContext.fillPath/2","doc":"","ref":"wxGraphicsContext.html#fillPath/2"},{"type":"function","title":"wxGraphicsContext.fillPath/3","doc":"Fills the path with the current brush.","ref":"wxGraphicsContext.html#fillPath/3"},{"type":"function","title":"wxGraphicsContext.getPartialTextExtents/2","doc":"Fills the `widths` array with the widths from the beginning of `text` to the\ncorresponding character of `text`.","ref":"wxGraphicsContext.html#getPartialTextExtents/2"},{"type":"function","title":"wxGraphicsContext.getTextExtent/2","doc":"Gets the dimensions of the string using the currently selected font.","ref":"wxGraphicsContext.html#getTextExtent/2"},{"type":"function","title":"wxGraphicsContext.getTransform/1","doc":"Gets the current transformation matrix of this context.","ref":"wxGraphicsContext.html#getTransform/1"},{"type":"function","title":"wxGraphicsContext.resetClip/1","doc":"Resets the clipping to original shape.","ref":"wxGraphicsContext.html#resetClip/1"},{"type":"function","title":"wxGraphicsContext.rotate/2","doc":"Rotates the current transformation matrix (in radians).","ref":"wxGraphicsContext.html#rotate/2"},{"type":"function","title":"wxGraphicsContext.scale/3","doc":"Scales the current transformation matrix.","ref":"wxGraphicsContext.html#scale/3"},{"type":"function","title":"wxGraphicsContext.setBrush/2","doc":"Sets the brush for filling paths.","ref":"wxGraphicsContext.html#setBrush/2"},{"type":"function","title":"wxGraphicsContext.setFont/2","doc":"Sets the font for drawing text.","ref":"wxGraphicsContext.html#setFont/2"},{"type":"function","title":"wxGraphicsContext.setFont/3","doc":"Sets the font for drawing text.\n\nRemark: For Direct2D only TrueType fonts can be used.","ref":"wxGraphicsContext.html#setFont/3"},{"type":"function","title":"wxGraphicsContext.setPen/2","doc":"Sets the pen used for stroking.","ref":"wxGraphicsContext.html#setPen/2"},{"type":"function","title":"wxGraphicsContext.setTransform/2","doc":"Sets the current transformation matrix of this context.","ref":"wxGraphicsContext.html#setTransform/2"},{"type":"function","title":"wxGraphicsContext.strokeLine/5","doc":"Strokes a single line.","ref":"wxGraphicsContext.html#strokeLine/5"},{"type":"function","title":"wxGraphicsContext.strokeLines/2","doc":"Stroke lines connecting all the points.\n\nUnlike the other overload of this function, this method draws a single polyline and not a\nnumber of disconnected lines.","ref":"wxGraphicsContext.html#strokeLines/2"},{"type":"function","title":"wxGraphicsContext.strokePath/2","doc":"Strokes along a path with the current pen.","ref":"wxGraphicsContext.html#strokePath/2"},{"type":"function","title":"wxGraphicsContext.translate/3","doc":"Translates the current transformation matrix.","ref":"wxGraphicsContext.html#translate/3"},{"type":"type","title":"wxGraphicsContext.wxGraphicsContext/0","doc":"","ref":"wxGraphicsContext.html#t:wxGraphicsContext/0"},{"type":"module","title":"wxGraphicsFont","doc":"A `m:wxGraphicsFont` is a native representation of a font.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createFont/4` or `wxGraphicsRenderer:createFont/4`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsFont](https://docs.wxwidgets.org/3.2/classwx_graphics_font.html)","ref":"wxGraphicsFont.html"},{"type":"type","title":"wxGraphicsFont.wxGraphicsFont/0","doc":"","ref":"wxGraphicsFont.html#t:wxGraphicsFont/0"},{"type":"module","title":"wxGraphicsGradientStops","doc":"Represents a collection of wxGraphicGradientStop values for use with\nCreateLinearGradientBrush and CreateRadialGradientBrush.\n\nThe stops are maintained in order of position. If two or more stops are added with the\nsame position then the one(s) added later come later. This can be useful for producing\ndiscontinuities in the colour gradient.\n\nNotice that this class is write-once, you can't modify the stops once they had been added.\n\nSince: 2.9.1\n\nwxWidgets docs: [wxGraphicsGradientStops](https://docs.wxwidgets.org/3.2/classwx_graphics_gradient_stops.html)","ref":"wxGraphicsGradientStops.html"},{"type":"function","title":"wxGraphicsGradientStops.add/3","doc":"Add a new stop.","ref":"wxGraphicsGradientStops.html#add/3"},{"type":"function","title":"wxGraphicsGradientStops.destroy/1","doc":"Destroys the object","ref":"wxGraphicsGradientStops.html#destroy/1"},{"type":"function","title":"wxGraphicsGradientStops.getCount/1","doc":"Returns the number of stops.","ref":"wxGraphicsGradientStops.html#getCount/1"},{"type":"function","title":"wxGraphicsGradientStops.getEndColour/1","doc":"Returns the end colour.","ref":"wxGraphicsGradientStops.html#getEndColour/1"},{"type":"function","title":"wxGraphicsGradientStops.getStartColour/1","doc":"Returns the start colour.","ref":"wxGraphicsGradientStops.html#getStartColour/1"},{"type":"function","title":"wxGraphicsGradientStops.item/2","doc":"Returns the stop at the given index.","ref":"wxGraphicsGradientStops.html#item/2"},{"type":"function","title":"wxGraphicsGradientStops.new/0","doc":"","ref":"wxGraphicsGradientStops.html#new/0"},{"type":"function","title":"wxGraphicsGradientStops.new/1","doc":"Initializes the gradient stops with the given boundary colours.\n\nCreates a `m:wxGraphicsGradientStops` instance with start colour given by `startCol` and\nend colour given by `endCol`.","ref":"wxGraphicsGradientStops.html#new/1"},{"type":"function","title":"wxGraphicsGradientStops.setEndColour/2","doc":"Set the end colour to `col`.","ref":"wxGraphicsGradientStops.html#setEndColour/2"},{"type":"function","title":"wxGraphicsGradientStops.setStartColour/2","doc":"Set the start colour to `col`.","ref":"wxGraphicsGradientStops.html#setStartColour/2"},{"type":"type","title":"wxGraphicsGradientStops.wxGraphicsGradientStops/0","doc":"","ref":"wxGraphicsGradientStops.html#t:wxGraphicsGradientStops/0"},{"type":"module","title":"wxGraphicsMatrix","doc":"A `m:wxGraphicsMatrix` is a native representation of an affine matrix.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createMatrix/2` or `wxGraphicsRenderer:createMatrix/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsMatrix](https://docs.wxwidgets.org/3.2/classwx_graphics_matrix.html)","ref":"wxGraphicsMatrix.html"},{"type":"function","title":"wxGraphicsMatrix.concat/2","doc":"Concatenates the matrix passed with the current matrix.\n\nThe effect of the resulting transformation is to first apply the transformation in `t` to\nthe coordinates and then apply the transformation in the current matrix to the coordinates.","ref":"wxGraphicsMatrix.html#concat/2"},{"type":"function","title":"wxGraphicsMatrix.get/1","doc":"Returns the component values of the matrix via the argument pointers.","ref":"wxGraphicsMatrix.html#get/1"},{"type":"function","title":"wxGraphicsMatrix.invert/1","doc":"Inverts the matrix.","ref":"wxGraphicsMatrix.html#invert/1"},{"type":"function","title":"wxGraphicsMatrix.isEqual/2","doc":"Returns true if the elements of the transformation matrix are equal.","ref":"wxGraphicsMatrix.html#isEqual/2"},{"type":"function","title":"wxGraphicsMatrix.isIdentity/1","doc":"Return true if this is the identity matrix.","ref":"wxGraphicsMatrix.html#isIdentity/1"},{"type":"function","title":"wxGraphicsMatrix.rotate/2","doc":"Rotates this matrix clockwise (in radians).","ref":"wxGraphicsMatrix.html#rotate/2"},{"type":"function","title":"wxGraphicsMatrix.scale/3","doc":"Scales this matrix.","ref":"wxGraphicsMatrix.html#scale/3"},{"type":"function","title":"wxGraphicsMatrix.set/1","doc":"","ref":"wxGraphicsMatrix.html#set/1"},{"type":"function","title":"wxGraphicsMatrix.set/2","doc":"Sets the matrix to the respective values (default values are the identity matrix).","ref":"wxGraphicsMatrix.html#set/2"},{"type":"function","title":"wxGraphicsMatrix.transformDistance/1","doc":"Applies this matrix to a distance (ie.\n\nperforms all transforms except translations).","ref":"wxGraphicsMatrix.html#transformDistance/1"},{"type":"function","title":"wxGraphicsMatrix.transformPoint/1","doc":"Applies this matrix to a point.","ref":"wxGraphicsMatrix.html#transformPoint/1"},{"type":"function","title":"wxGraphicsMatrix.translate/3","doc":"Translates this matrix.","ref":"wxGraphicsMatrix.html#translate/3"},{"type":"type","title":"wxGraphicsMatrix.wxGraphicsMatrix/0","doc":"","ref":"wxGraphicsMatrix.html#t:wxGraphicsMatrix/0"},{"type":"module","title":"wxGraphicsObject","doc":"This class is the superclass of native graphics objects like pens etc.\n\nIt allows reference counting. Not instantiated by user code.\n\nSee:\n* `m:wxGraphicsBrush`\n\n* `m:wxGraphicsPen`\n\n* `m:wxGraphicsMatrix`\n\n* `m:wxGraphicsPath`\n\nwxWidgets docs: [wxGraphicsObject](https://docs.wxwidgets.org/3.2/classwx_graphics_object.html)","ref":"wxGraphicsObject.html"},{"type":"function","title":"wxGraphicsObject.destroy/1","doc":"Destroys the object","ref":"wxGraphicsObject.html#destroy/1"},{"type":"function","title":"wxGraphicsObject.getRenderer/1","doc":"Returns the renderer that was used to create this instance, or NULL if it has not been\ninitialized yet.","ref":"wxGraphicsObject.html#getRenderer/1"},{"type":"function","title":"wxGraphicsObject.isNull/1","doc":"Return: false if this object is valid, otherwise returns true.","ref":"wxGraphicsObject.html#isNull/1"},{"type":"type","title":"wxGraphicsObject.wxGraphicsObject/0","doc":"","ref":"wxGraphicsObject.html#t:wxGraphicsObject/0"},{"type":"module","title":"wxGraphicsPath","doc":"A `m:wxGraphicsPath` is a native representation of a geometric path.\n\nThe contents are specific and private to the respective renderer. Instances are reference\ncounted and can therefore be assigned as usual. The only way to get a valid instance is by\nusing `wxGraphicsContext:createPath/1` or `wxGraphicsRenderer:createPath/1`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsPath](https://docs.wxwidgets.org/3.2/classwx_graphics_path.html)","ref":"wxGraphicsPath.html"},{"type":"function","title":"wxGraphicsPath.addArc/6","doc":"","ref":"wxGraphicsPath.html#addArc/6"},{"type":"function","title":"wxGraphicsPath.addArc/7","doc":"Adds an arc of a circle.\n\nThe circle is defined by the coordinates of its centre (`x`, `y`) or `c` and its radius `r`.\nThe arc goes from the starting angle `startAngle` to `endAngle` either clockwise or\ncounter-clockwise depending on the value of `clockwise` argument.\n\nThe angles are measured in radians but, contrary to the usual mathematical convention,\nare always `clockwise` from the horizontal axis.\n\nIf for clockwise arc `endAngle` is less than `startAngle` it will be progressively\nincreased by 2*pi until it is greater than `startAngle`. If for counter-clockwise arc `endAngle`\nis greater than `startAngle` it will be progressively decreased by 2*pi until it is less\nthan `startAngle`.\n\nIf there is a current point set, an initial line segment will be added to the path to\nconnect the current point to the beginning of the arc.","ref":"wxGraphicsPath.html#addArc/7"},{"type":"function","title":"wxGraphicsPath.addArcToPoint/6","doc":"Adds an arc (of a circle with radius `r`) that is tangent to the line connecting current\npoint and (`x1`, `y1`) and to the line connecting (`x1`, `y1`) and (`x2`, `y2`).\n\nIf the current point and the starting point of the arc are different, a straight line\nconnecting these points is also appended. If there is no current point before the call to `addArcToPoint/6`\nthis function will behave as if preceded by a call to MoveToPoint(0, 0). After this call\nthe current point will be at the ending point of the arc.","ref":"wxGraphicsPath.html#addArcToPoint/6"},{"type":"function","title":"wxGraphicsPath.addCircle/4","doc":"Appends a circle around (`x`,`y`) with radius `r` as a new closed subpath.\n\nAfter this call the current point will be at (x+`r`, `y`).","ref":"wxGraphicsPath.html#addCircle/4"},{"type":"function","title":"wxGraphicsPath.addCurveToPoint/4","doc":"Adds a cubic bezier curve from the current point, using two control points and an end\npoint.\n\nIf there is no current point before the call to `addCurveToPoint/7` this function will behave as if preceded\nby a call to MoveToPoint(`c1`).","ref":"wxGraphicsPath.html#addCurveToPoint/4"},{"type":"function","title":"wxGraphicsPath.addCurveToPoint/7","doc":"Adds a cubic bezier curve from the current point, using two control points and an end\npoint.\n\nIf there is no current point before the call to `addCurveToPoint/7` this function will behave as if preceded\nby a call to MoveToPoint(`cx1`, `cy1`).","ref":"wxGraphicsPath.html#addCurveToPoint/7"},{"type":"function","title":"wxGraphicsPath.addEllipse/5","doc":"Appends an ellipse fitting into the passed in rectangle as a new closed subpath.\n\nAfter this call the current point will be at (x+`w`, y+`h/2`).","ref":"wxGraphicsPath.html#addEllipse/5"},{"type":"function","title":"wxGraphicsPath.addLineToPoint/2","doc":"Adds a straight line from the current point to `p`.\n\nIf current point is not yet set before the call to `addLineToPoint/3` this function will behave as `moveToPoint/3`.","ref":"wxGraphicsPath.html#addLineToPoint/2"},{"type":"function","title":"wxGraphicsPath.addLineToPoint/3","doc":"Adds a straight line from the current point to (`x`,`y`).\n\nIf current point is not yet set before the call to `addLineToPoint/3` this function will behave as `moveToPoint/3`.","ref":"wxGraphicsPath.html#addLineToPoint/3"},{"type":"function","title":"wxGraphicsPath.addPath/2","doc":"Adds another path onto the current path.\n\nAfter this call the current point will be at the added path's current point. For Direct2D\nthe path being appended shouldn't contain a started non-empty subpath when this function\nis called.","ref":"wxGraphicsPath.html#addPath/2"},{"type":"function","title":"wxGraphicsPath.addQuadCurveToPoint/5","doc":"Adds a quadratic bezier curve from the current point, using a control point and an end\npoint.\n\nIf there is no current point before the call to `addQuadCurveToPoint/5` this function will behave as if preceded\nby a call to MoveToPoint(`cx`, `cy`).","ref":"wxGraphicsPath.html#addQuadCurveToPoint/5"},{"type":"function","title":"wxGraphicsPath.addRectangle/5","doc":"Appends a rectangle as a new closed subpath.\n\nAfter this call the current point will be at (`x`, `y`).","ref":"wxGraphicsPath.html#addRectangle/5"},{"type":"function","title":"wxGraphicsPath.addRoundedRectangle/6","doc":"Appends a rounded rectangle as a new closed subpath.\n\nIf `radius` equals 0 this function will behave as `addRectangle/5`, otherwise after this call the current\npoint will be at (x+`w`, y+`h/2`).","ref":"wxGraphicsPath.html#addRoundedRectangle/6"},{"type":"function","title":"wxGraphicsPath.closeSubpath/1","doc":"Closes the current sub-path.\n\nAfter this call the current point will be at the joined endpoint of the sub-path.","ref":"wxGraphicsPath.html#closeSubpath/1"},{"type":"function","title":"wxGraphicsPath.contains/2","doc":"","ref":"wxGraphicsPath.html#contains/2"},{"type":"function","title":"wxGraphicsPath.contains/3","doc":"Return: true if the point is within the path.","ref":"wxGraphicsPath.html#contains/3"},{"type":"function","title":"wxGraphicsPath.contains/4","doc":"Return: true if the point is within the path.","ref":"wxGraphicsPath.html#contains/4"},{"type":"function","title":"wxGraphicsPath.getBox/1","doc":"Gets the bounding box enclosing all points (possibly including control points).","ref":"wxGraphicsPath.html#getBox/1"},{"type":"function","title":"wxGraphicsPath.getCurrentPoint/1","doc":"Gets the last point of the current path, (0,0) if not yet set.","ref":"wxGraphicsPath.html#getCurrentPoint/1"},{"type":"function","title":"wxGraphicsPath.moveToPoint/2","doc":"Begins a new subpath at `p`.","ref":"wxGraphicsPath.html#moveToPoint/2"},{"type":"function","title":"wxGraphicsPath.moveToPoint/3","doc":"Begins a new subpath at (`x`,`y`).","ref":"wxGraphicsPath.html#moveToPoint/3"},{"type":"function","title":"wxGraphicsPath.transform/2","doc":"Transforms each point of this path by the matrix.\n\nFor Direct2D the current path shouldn't contain a started non-empty subpath when this\nfunction is called.","ref":"wxGraphicsPath.html#transform/2"},{"type":"type","title":"wxGraphicsPath.wxGraphicsPath/0","doc":"","ref":"wxGraphicsPath.html#t:wxGraphicsPath/0"},{"type":"module","title":"wxGraphicsPen","doc":"A `m:wxGraphicsPen` is a native representation of a pen.\n\nThe contents are specific and private to the respective renderer. Instances are ref\ncounted and can therefore be assigned as usual. The only way to get a valid instance is\nvia `wxGraphicsContext:createPen/2` or `wxGraphicsRenderer::CreatePen()` (not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGraphicsObject`\n\nwxWidgets docs: [wxGraphicsPen](https://docs.wxwidgets.org/3.2/classwx_graphics_pen.html)","ref":"wxGraphicsPen.html"},{"type":"type","title":"wxGraphicsPen.wxGraphicsPen/0","doc":"","ref":"wxGraphicsPen.html#t:wxGraphicsPen/0"},{"type":"module","title":"wxGraphicsRenderer","doc":"A `m:wxGraphicsRenderer` is the instance corresponding to the rendering engine used.\n\nThere may be multiple instances on a system, if there are different rendering engines\npresent, but there is always only one instance per engine. This instance is pointed back\nto by all objects created by it (`m:wxGraphicsContext`, `m:wxGraphicsPath` etc.) and can\nbe retrieved through their `wxGraphicsObject:getRenderer/1` method. Therefore you can create an additional instance of a\npath etc. by calling `wxGraphicsObject:getRenderer/1` and then using the appropriate CreateXXX() function of that renderer.\n\nwxWidgets docs: [wxGraphicsRenderer](https://docs.wxwidgets.org/3.2/classwx_graphics_renderer.html)","ref":"wxGraphicsRenderer.html"},{"type":"function","title":"wxGraphicsRenderer.createBrush/2","doc":"Creates a native brush from a `m:wxBrush`.","ref":"wxGraphicsRenderer.html#createBrush/2"},{"type":"function","title":"wxGraphicsRenderer.createContext/2","doc":"Creates a `m:wxGraphicsContext` from a `m:wxWindowDC`.","ref":"wxGraphicsRenderer.html#createContext/2"},{"type":"function","title":"wxGraphicsRenderer.createFont/2","doc":"","ref":"wxGraphicsRenderer.html#createFont/2"},{"type":"function","title":"wxGraphicsRenderer.createFont/3","doc":"Creates a native graphics font from a `m:wxFont` and a text colour.","ref":"wxGraphicsRenderer.html#createFont/3"},{"type":"function","title":"wxGraphicsRenderer.createFont/4","doc":"Creates a graphics font with the given characteristics.\n\nIf possible, the `createFont/4` overload taking `m:wxFont` should be used instead. The main advantage\nof this overload is that it can be used without X server connection under Unix when using Cairo.\n\nSince: 2.9.3","ref":"wxGraphicsRenderer.html#createFont/4"},{"type":"function","title":"wxGraphicsRenderer.createLinearGradientBrush/6","doc":"Creates a native brush with a linear gradient.\n\nStops support is new since wxWidgets 2.9.1, previously only the start and end colours\ncould be specified.\n\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","ref":"wxGraphicsRenderer.html#createLinearGradientBrush/6"},{"type":"function","title":"wxGraphicsRenderer.createMatrix/1","doc":"","ref":"wxGraphicsRenderer.html#createMatrix/1"},{"type":"function","title":"wxGraphicsRenderer.createMatrix/2","doc":"Creates a native affine transformation matrix from the passed in values.\n\nThe defaults result in an identity matrix.","ref":"wxGraphicsRenderer.html#createMatrix/2"},{"type":"function","title":"wxGraphicsRenderer.createPath/1","doc":"Creates a native graphics path which is initially empty.","ref":"wxGraphicsRenderer.html#createPath/1"},{"type":"function","title":"wxGraphicsRenderer.createRadialGradientBrush/7","doc":"Creates a native brush with a radial gradient.\n\nStops support is new since wxWidgets 2.9.1, previously only the start and end colours\ncould be specified.\n\nThe ability to apply a transformation matrix to the gradient was added in 3.1.3","ref":"wxGraphicsRenderer.html#createRadialGradientBrush/7"},{"type":"function","title":"wxGraphicsRenderer.getDefaultRenderer/0","doc":"Returns the default renderer on this platform.\n\nOn macOS this is the Core Graphics (a.k.a. Quartz 2D) renderer, on MSW the GDIPlus\nrenderer, and on GTK we currently default to the Cairo renderer.","ref":"wxGraphicsRenderer.html#getDefaultRenderer/0"},{"type":"type","title":"wxGraphicsRenderer.wxGraphicsRenderer/0","doc":"","ref":"wxGraphicsRenderer.html#t:wxGraphicsRenderer/0"},{"type":"module","title":"wxGrid","doc":"`m:wxGrid` and its related classes are used for displaying and editing tabular data.\n\nThey provide a rich set of features for display, editing, and interacting with a variety\nof data sources. For simple applications, and to help you get started, `m:wxGrid` is the\nonly class you need to refer to directly. It will set up default instances of the other\nclasses and manage them for you. For more complex applications you can derive your own\nclasses for custom grid views, grid data tables, cell editors and renderers. The\noverview_grid has examples of simple and more complex applications, explains the\nrelationship between the various grid classes and has a summary of the keyboard shortcuts\nand mouse functions provided by `m:wxGrid`.\n\nA `wxGridTableBase` (not implemented in wx) class holds the actual data to be displayed\nby a `m:wxGrid` class. One or more `m:wxGrid` classes may act as a view for one table\nclass. The default table class is called `wxGridStringTable` (not implemented in wx) and\nholds an array of strings. An instance of such a class is created by `createGrid/4`.\n\n`m:wxGridCellRenderer` is the abstract base class for rendering contents in a cell. The\nfollowing renderers are predefined:\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\n* `wxGridCellDateRenderer` (not implemented in wx)\n\n* `wxGridCellDateTimeRenderer` (not implemented in wx)\n\nThe look of a cell can be further defined using `m:wxGridCellAttr`. An object of this\ntype may be returned by `wxGridTableBase::GetAttr()` (not implemented in wx).\n\n`m:wxGridCellEditor` is the abstract base class for editing the value of a cell. The\nfollowing editors are predefined:\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\n* `wxGridCellDateEditor` (not implemented in wx)\n\nPlease see `m:wxGridEvent`, `wxGridSizeEvent` (not implemented in wx), `wxGridRangeSelectEvent`\n(not implemented in wx), and `wxGridEditorCreatedEvent` (not implemented in wx) for the\ndocumentation of all event types you can use with `m:wxGrid`.\n\nSee: [Overview grid](https://docs.wxwidgets.org/3.2/overview_grid.html#overview_grid)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxGrid](https://docs.wxwidgets.org/3.2/classwx_grid.html)","ref":"wxGrid.html"},{"type":"function","title":"wxGrid.appendCols/1","doc":"","ref":"wxGrid.html#appendCols/1"},{"type":"function","title":"wxGrid.appendCols/2","doc":"Appends one or more new columns to the right of the grid.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::AppendCols()` (not implemented in wx).\nSee `insertCols/2` for further information.\n\nReturn: true on success or false if appending columns failed.","ref":"wxGrid.html#appendCols/2"},{"type":"function","title":"wxGrid.appendRows/1","doc":"","ref":"wxGrid.html#appendRows/1"},{"type":"function","title":"wxGrid.appendRows/2","doc":"Appends one or more new rows to the bottom of the grid.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::AppendRows()` (not implemented in wx).\nSee `insertRows/2` for further information.\n\nReturn: true on success or false if appending rows failed.","ref":"wxGrid.html#appendRows/2"},{"type":"function","title":"wxGrid.autoSize/1","doc":"Automatically sets the height and width of all rows and columns to fit their contents.","ref":"wxGrid.html#autoSize/1"},{"type":"function","title":"wxGrid.autoSizeColumn/2","doc":"","ref":"wxGrid.html#autoSizeColumn/2"},{"type":"function","title":"wxGrid.autoSizeColumn/3","doc":"Automatically sizes the column to fit its contents.\n\nIf `setAsMin` is true the calculated width will also be set as the minimal width for the\ncolumn.","ref":"wxGrid.html#autoSizeColumn/3"},{"type":"function","title":"wxGrid.autoSizeColumns/1","doc":"","ref":"wxGrid.html#autoSizeColumns/1"},{"type":"function","title":"wxGrid.autoSizeColumns/2","doc":"Automatically sizes all columns to fit their contents.\n\nIf `setAsMin` is true the calculated widths will also be set as the minimal widths for\nthe columns.","ref":"wxGrid.html#autoSizeColumns/2"},{"type":"function","title":"wxGrid.autoSizeRow/2","doc":"","ref":"wxGrid.html#autoSizeRow/2"},{"type":"function","title":"wxGrid.autoSizeRow/3","doc":"Automatically sizes the row to fit its contents.\n\nIf `setAsMin` is true the calculated height will also be set as the minimal height for\nthe row.","ref":"wxGrid.html#autoSizeRow/3"},{"type":"function","title":"wxGrid.autoSizeRows/1","doc":"","ref":"wxGrid.html#autoSizeRows/1"},{"type":"function","title":"wxGrid.autoSizeRows/2","doc":"Automatically sizes all rows to fit their contents.\n\nIf `setAsMin` is true the calculated heights will also be set as the minimal heights for\nthe rows.","ref":"wxGrid.html#autoSizeRows/2"},{"type":"function","title":"wxGrid.beginBatch/1","doc":"Increments the grid's batch count.\n\nWhen the count is greater than zero repainting of the grid is suppressed. Each call to\nBeginBatch must be matched by a later call to `endBatch/1`. Code that does a lot of grid modification\ncan be enclosed between `beginBatch/1` and `endBatch/1` calls to avoid screen flicker. The final `endBatch/1` call will cause\nthe grid to be repainted.\n\nNotice that you should use `wxGridUpdateLocker` (not implemented in wx) which ensures\nthat there is always a matching `endBatch/1` call for this `beginBatch/1` if possible instead of calling this method\ndirectly.","ref":"wxGrid.html#beginBatch/1"},{"type":"function","title":"wxGrid.blockToDeviceRect/3","doc":"Convert grid cell coordinates to grid window pixel coordinates.\n\nThis function returns the rectangle that encloses the block of cells limited by `topLeft`\nand `bottomRight` cell in device coords and clipped to the client size of the grid window.\n\nSince: 3.1.3 Parameter `gridWindow` has been added.\n\nSee: `cellToRect/3`","ref":"wxGrid.html#blockToDeviceRect/3"},{"type":"function","title":"wxGrid.canDragCell/1","doc":"Return true if the dragging of cells is enabled or false otherwise.","ref":"wxGrid.html#canDragCell/1"},{"type":"function","title":"wxGrid.canDragColMove/1","doc":"Returns true if columns can be moved by dragging with the mouse.\n\nColumns can be moved by dragging on their labels.","ref":"wxGrid.html#canDragColMove/1"},{"type":"function","title":"wxGrid.canDragColSize/2","doc":"Returns true if the given column can be resized by dragging with the mouse.\n\nThis function returns true if resizing the columns interactively is globally enabled,\ni.e. if `disableDragColSize/1` hadn't been called, and if this column wasn't explicitly marked as non-resizable\nwith `DisableColResize()` (not implemented in wx).","ref":"wxGrid.html#canDragColSize/2"},{"type":"function","title":"wxGrid.canDragGridRowEdges/1","doc":"Return true if row edges inside the grid can be dragged to resize the rows.\n\nSee:\n* `canDragGridSize/1`\n\n* `canDragRowSize/2`\n\nSince: 3.1.4","ref":"wxGrid.html#canDragGridRowEdges/1"},{"type":"function","title":"wxGrid.canDragGridSize/1","doc":"Return true if the dragging of grid lines to resize rows and columns is enabled or false\notherwise.","ref":"wxGrid.html#canDragGridSize/1"},{"type":"function","title":"wxGrid.canDragRowSize/2","doc":"Returns true if the given row can be resized by dragging with the mouse.\n\nThis is the same as `canDragColSize/2` but for rows.","ref":"wxGrid.html#canDragRowSize/2"},{"type":"function","title":"wxGrid.canEnableCellControl/1","doc":"Returns true if the in-place edit control for the current grid cell can be used and false\notherwise.\n\nThis function always returns false for the read-only cells.","ref":"wxGrid.html#canEnableCellControl/1"},{"type":"function","title":"wxGrid.cellToRect/2","doc":"Return the rectangle corresponding to the grid cell's size and position in logical\ncoordinates.\n\nSee: `blockToDeviceRect/3`","ref":"wxGrid.html#cellToRect/2"},{"type":"function","title":"wxGrid.cellToRect/3","doc":"Return the rectangle corresponding to the grid cell's size and position in logical\ncoordinates.\n\nSee: `blockToDeviceRect/3`","ref":"wxGrid.html#cellToRect/3"},{"type":"function","title":"wxGrid.clearGrid/1","doc":"Clears all data in the underlying grid table and repaints the grid.\n\nThe table is not deleted by this function. If you are using a derived table class then\nyou need to override `wxGridTableBase::Clear()` (not implemented in wx) for this function\nto have any effect.","ref":"wxGrid.html#clearGrid/1"},{"type":"function","title":"wxGrid.clearSelection/1","doc":"Deselects all cells that are currently selected.","ref":"wxGrid.html#clearSelection/1"},{"type":"function","title":"wxGrid.createGrid/3","doc":"","ref":"wxGrid.html#createGrid/3"},{"type":"function","title":"wxGrid.createGrid/4","doc":"Creates a grid with the specified initial number of rows and columns.\n\nCall this directly after the grid constructor. When you use this function `m:wxGrid` will\ncreate and manage a simple table of string values for you. All of the grid data will be\nstored in memory.\n\nFor applications with more complex data types or relationships, or for dealing with very\nlarge datasets, you should derive your own grid table class and pass a table object to the\ngrid with `SetTable()` (not implemented in wx) or `AssignTable()` (not implemented in wx).","ref":"wxGrid.html#createGrid/4"},{"type":"function","title":"wxGrid.deleteCols/1","doc":"","ref":"wxGrid.html#deleteCols/1"},{"type":"function","title":"wxGrid.deleteCols/2","doc":"Deletes one or more columns from a grid starting at the specified position.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::DeleteCols()` (not implemented in wx).\nSee `insertCols/2` for further information.\n\nReturn: true on success or false if deleting columns failed.","ref":"wxGrid.html#deleteCols/2"},{"type":"function","title":"wxGrid.deleteRows/1","doc":"","ref":"wxGrid.html#deleteRows/1"},{"type":"function","title":"wxGrid.deleteRows/2","doc":"Deletes one or more rows from a grid starting at the specified position.\n\nThe `updateLabels` argument is not used at present. If you are using a derived grid table\nclass you will need to override `wxGridTableBase::DeleteRows()` (not implemented in wx).\nSee `insertRows/2` for further information.\n\nReturn: true on success or false if deleting rows failed.","ref":"wxGrid.html#deleteRows/2"},{"type":"function","title":"wxGrid.destroy/1","doc":"Destroys the object","ref":"wxGrid.html#destroy/1"},{"type":"function","title":"wxGrid.disableCellEditControl/1","doc":"Disables in-place editing of grid cells.\n\nEquivalent to calling EnableCellEditControl(false).","ref":"wxGrid.html#disableCellEditControl/1"},{"type":"function","title":"wxGrid.disableDragColSize/1","doc":"Disables column sizing by dragging with the mouse.\n\nEquivalent to passing false to `enableDragColSize/2`.","ref":"wxGrid.html#disableDragColSize/1"},{"type":"function","title":"wxGrid.disableDragGridSize/1","doc":"Disable mouse dragging of grid lines to resize rows and columns.\n\nEquivalent to passing false to `enableDragGridSize/2`","ref":"wxGrid.html#disableDragGridSize/1"},{"type":"function","title":"wxGrid.disableDragRowSize/1","doc":"Disables row sizing by dragging with the mouse.\n\nEquivalent to passing false to `enableDragRowSize/2`.","ref":"wxGrid.html#disableDragRowSize/1"},{"type":"function","title":"wxGrid.enableCellEditControl/1","doc":"","ref":"wxGrid.html#enableCellEditControl/1"},{"type":"function","title":"wxGrid.enableCellEditControl/2","doc":"Enables or disables in-place editing of grid cell data.\n\nEnabling in-place editing generates `wxEVT_GRID_EDITOR_SHOWN` and, if it isn't vetoed by\nthe application, shows the in-place editor which allows the user to change the cell value.\n\nDisabling in-place editing does nothing if the in-place editor isn't currently shown,\notherwise the `wxEVT_GRID_EDITOR_HIDDEN` event is generated but, unlike the \"shown\" event,\nit can't be vetoed and the in-place editor is dismissed unconditionally.\n\nNote that it is an error to call this function if the current cell is read-only, use `canEnableCellControl/1` to\ncheck for this precondition.","ref":"wxGrid.html#enableCellEditControl/2"},{"type":"function","title":"wxGrid.enableDragColSize/1","doc":"","ref":"wxGrid.html#enableDragColSize/1"},{"type":"function","title":"wxGrid.enableDragColSize/2","doc":"Enables or disables column sizing by dragging with the mouse.","ref":"wxGrid.html#enableDragColSize/2"},{"type":"function","title":"wxGrid.enableDragGridSize/1","doc":"","ref":"wxGrid.html#enableDragGridSize/1"},{"type":"function","title":"wxGrid.enableDragGridSize/2","doc":"Enables or disables row and column resizing by dragging gridlines with the mouse.","ref":"wxGrid.html#enableDragGridSize/2"},{"type":"function","title":"wxGrid.enableDragRowSize/1","doc":"","ref":"wxGrid.html#enableDragRowSize/1"},{"type":"function","title":"wxGrid.enableDragRowSize/2","doc":"Enables or disables row sizing by dragging with the mouse.","ref":"wxGrid.html#enableDragRowSize/2"},{"type":"function","title":"wxGrid.enableEditing/2","doc":"Makes the grid globally editable or read-only.\n\nIf the edit argument is false this function sets the whole grid as read-only. If the\nargument is true the grid is set to the default state where cells may be editable. In the\ndefault state you can set single grid cells and whole rows and columns to be editable or\nread-only via `wxGridCellAttr:setReadOnly/2`. For single cells you can also use the shortcut function `setReadOnly/4`.\n\nFor more information about controlling grid cell attributes see the `m:wxGridCellAttr`\nclass and the overview_grid.","ref":"wxGrid.html#enableEditing/2"},{"type":"function","title":"wxGrid.enableGridLines/1","doc":"","ref":"wxGrid.html#enableGridLines/1"},{"type":"function","title":"wxGrid.enableGridLines/2","doc":"Turns the drawing of grid lines on or off.","ref":"wxGrid.html#enableGridLines/2"},{"type":"function","title":"wxGrid.endBatch/1","doc":"Decrements the grid's batch count.\n\nWhen the count is greater than zero repainting of the grid is suppressed. Each previous\ncall to `beginBatch/1` must be matched by a later call to `endBatch/1`. Code that does a lot of grid modification\ncan be enclosed between `beginBatch/1` and `endBatch/1` calls to avoid screen flicker. The final `endBatch/1` will cause the\ngrid to be repainted.","ref":"wxGrid.html#endBatch/1"},{"type":"function","title":"wxGrid.fit/1","doc":"Overridden `m:wxWindow` method.","ref":"wxGrid.html#fit/1"},{"type":"function","title":"wxGrid.forceRefresh/1","doc":"Causes immediate repainting of the grid.\n\nUse this instead of the usual `wxWindow:refresh/2`.","ref":"wxGrid.html#forceRefresh/1"},{"type":"function","title":"wxGrid.getBatchCount/1","doc":"Returns the number of times that `beginBatch/1` has been called without (yet) matching\ncalls to `endBatch/1`.\n\nWhile the grid's batch count is greater than zero the display will not be updated.","ref":"wxGrid.html#getBatchCount/1"},{"type":"function","title":"wxGrid.getCellAlignment/3","doc":"Sets the arguments to the horizontal and vertical text alignment values for the grid cell\nat the specified location.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#getCellAlignment/3"},{"type":"function","title":"wxGrid.getCellBackgroundColour/3","doc":"Returns the background colour of the cell at the specified location.","ref":"wxGrid.html#getCellBackgroundColour/3"},{"type":"function","title":"wxGrid.getCellEditor/3","doc":"Returns a pointer to the editor for the cell at the specified location.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getCellEditor/3"},{"type":"function","title":"wxGrid.getCellFont/3","doc":"Returns the font for text in the grid cell at the specified location.","ref":"wxGrid.html#getCellFont/3"},{"type":"function","title":"wxGrid.getCellRenderer/3","doc":"Returns a pointer to the renderer for the grid cell at the specified location.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getCellRenderer/3"},{"type":"function","title":"wxGrid.getCellTextColour/3","doc":"Returns the text colour for the grid cell at the specified location.","ref":"wxGrid.html#getCellTextColour/3"},{"type":"function","title":"wxGrid.getCellValue/2","doc":"Returns the string contained in the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `setCellValue/4` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanGetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","ref":"wxGrid.html#getCellValue/2"},{"type":"function","title":"wxGrid.getCellValue/3","doc":"Returns the string contained in the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `setCellValue/4` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanGetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","ref":"wxGrid.html#getCellValue/3"},{"type":"function","title":"wxGrid.getColLabelAlignment/1","doc":"Sets the arguments to the current column label alignment values.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#getColLabelAlignment/1"},{"type":"function","title":"wxGrid.getColLabelSize/1","doc":"Returns the current height of the column labels.","ref":"wxGrid.html#getColLabelSize/1"},{"type":"function","title":"wxGrid.getColLabelValue/2","doc":"Returns the specified column label.\n\nThe default grid table class provides column labels of the form A,B...Z,AA,AB...ZZ,AAA...\nIf you are using a custom grid table you can override `wxGridTableBase::GetColLabelValue()`\n(not implemented in wx) to provide your own labels.","ref":"wxGrid.html#getColLabelValue/2"},{"type":"function","title":"wxGrid.getColMinimalAcceptableWidth/1","doc":"Returns the minimal width to which a column may be resized.\n\nUse `setColMinimalAcceptableWidth/2` to change this value globally or `setColMinimalWidth/3` to do it for individual columns.\n\nSee: `getRowMinimalAcceptableHeight/1`","ref":"wxGrid.html#getColMinimalAcceptableWidth/1"},{"type":"function","title":"wxGrid.getDefaultCellAlignment/1","doc":"Returns the default cell alignment.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.\n\nSee: `setDefaultCellAlignment/3`","ref":"wxGrid.html#getDefaultCellAlignment/1"},{"type":"function","title":"wxGrid.getDefaultCellBackgroundColour/1","doc":"Returns the current default background colour for grid cells.","ref":"wxGrid.html#getDefaultCellBackgroundColour/1"},{"type":"function","title":"wxGrid.getDefaultCellFont/1","doc":"Returns the current default font for grid cell text.","ref":"wxGrid.html#getDefaultCellFont/1"},{"type":"function","title":"wxGrid.getDefaultCellTextColour/1","doc":"Returns the current default colour for grid cell text.","ref":"wxGrid.html#getDefaultCellTextColour/1"},{"type":"function","title":"wxGrid.getDefaultColLabelSize/1","doc":"Returns the default height for column labels.","ref":"wxGrid.html#getDefaultColLabelSize/1"},{"type":"function","title":"wxGrid.getDefaultColSize/1","doc":"Returns the current default width for grid columns.","ref":"wxGrid.html#getDefaultColSize/1"},{"type":"function","title":"wxGrid.getDefaultEditor/1","doc":"Returns a pointer to the current default grid cell editor.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","ref":"wxGrid.html#getDefaultEditor/1"},{"type":"function","title":"wxGrid.getDefaultEditorForCell/2","doc":"Returns the default editor for the specified cell.\n\nThe base class version returns the editor appropriate for the current cell type but this\nmethod may be overridden in the derived classes to use custom editors for some cells by default.\n\nNotice that the same may be achieved in a usually simpler way by associating a custom\neditor with the given cell or cells.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getDefaultEditorForCell/2"},{"type":"function","title":"wxGrid.getDefaultEditorForCell/3","doc":"Returns the default editor for the specified cell.\n\nThe base class version returns the editor appropriate for the current cell type but this\nmethod may be overridden in the derived classes to use custom editors for some cells by default.\n\nNotice that the same may be achieved in a usually simpler way by associating a custom\neditor with the given cell or cells.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getDefaultEditorForCell/3"},{"type":"function","title":"wxGrid.getDefaultEditorForType/2","doc":"Returns the default editor for the cells containing values of the given type.\n\nThe base class version returns the editor which was associated with the specified `typeName`\nwhen it was registered `registerDataType/4` but this function may be overridden to return something\ndifferent. This allows overriding an editor used for one of the standard types.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getDefaultEditorForType/2"},{"type":"function","title":"wxGrid.getDefaultRenderer/1","doc":"Returns a pointer to the current default grid cell renderer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getDefaultRenderer/1"},{"type":"function","title":"wxGrid.getDefaultRendererForCell/3","doc":"Returns the default renderer for the given cell.\n\nThe base class version returns the renderer appropriate for the current cell type but\nthis method may be overridden in the derived classes to use custom renderers for some\ncells by default.\n\nThe caller must call DecRef() on the returned pointer.","ref":"wxGrid.html#getDefaultRendererForCell/3"},{"type":"function","title":"wxGrid.getDefaultRendererForType/2","doc":"Returns the default renderer for the cell containing values of the given type.\n\nSee: `getDefaultEditorForType/2`","ref":"wxGrid.html#getDefaultRendererForType/2"},{"type":"function","title":"wxGrid.getDefaultRowLabelSize/1","doc":"Returns the default width for the row labels.","ref":"wxGrid.html#getDefaultRowLabelSize/1"},{"type":"function","title":"wxGrid.getDefaultRowSize/1","doc":"Returns the current default height for grid rows.","ref":"wxGrid.html#getDefaultRowSize/1"},{"type":"function","title":"wxGrid.getGridColLabelWindow/1","doc":"Return the column labels window.\n\nThis window is not shown if the columns labels were hidden using `HideColLabels()` (not\nimplemented in wx).\n\nDepending on whether `UseNativeColHeader()` (not implemented in wx) was called or not\nthis can be either a `wxHeaderCtrl` (not implemented in wx) or a plain `m:wxWindow`. This\nfunction returns a valid window pointer in either case but in the former case you can also\nuse `GetGridColHeader()` (not implemented in wx) to access it if you need\nwxHeaderCtrl-specific functionality.","ref":"wxGrid.html#getGridColLabelWindow/1"},{"type":"function","title":"wxGrid.getGridCornerLabelWindow/1","doc":"Return the window in the top left grid corner.\n\nThis window is shown only of both columns and row labels are shown and normally doesn't\ncontain anything. Clicking on it is handled by `m:wxGrid` however and can be used to\nselect the entire grid.","ref":"wxGrid.html#getGridCornerLabelWindow/1"},{"type":"function","title":"wxGrid.getGridCursorCol/1","doc":"Returns the current grid cell column position.","ref":"wxGrid.html#getGridCursorCol/1"},{"type":"function","title":"wxGrid.getGridCursorRow/1","doc":"Returns the current grid cell row position.","ref":"wxGrid.html#getGridCursorRow/1"},{"type":"function","title":"wxGrid.getGridLineColour/1","doc":"Returns the colour used for grid lines.","ref":"wxGrid.html#getGridLineColour/1"},{"type":"function","title":"wxGrid.getGridRowLabelWindow/1","doc":"Return the row labels window.\n\nThis window is not shown if the row labels were hidden using `HideRowLabels()` (not\nimplemented in wx).","ref":"wxGrid.html#getGridRowLabelWindow/1"},{"type":"function","title":"wxGrid.getGridWindow/1","doc":"Return the main grid window containing the grid cells.\n\nThis window is always shown.","ref":"wxGrid.html#getGridWindow/1"},{"type":"function","title":"wxGrid.getLabelBackgroundColour/1","doc":"Returns the colour used for the background of row and column labels.","ref":"wxGrid.html#getLabelBackgroundColour/1"},{"type":"function","title":"wxGrid.getLabelFont/1","doc":"Returns the font used for row and column labels.","ref":"wxGrid.html#getLabelFont/1"},{"type":"function","title":"wxGrid.getLabelTextColour/1","doc":"Returns the colour used for row and column label text.","ref":"wxGrid.html#getLabelTextColour/1"},{"type":"function","title":"wxGrid.getNumberCols/1","doc":"Returns the total number of grid columns.\n\nThis is the same as the number of columns in the underlying grid table.","ref":"wxGrid.html#getNumberCols/1"},{"type":"function","title":"wxGrid.getNumberRows/1","doc":"Returns the total number of grid rows.\n\nThis is the same as the number of rows in the underlying grid table.","ref":"wxGrid.html#getNumberRows/1"},{"type":"function","title":"wxGrid.getOrCreateCellAttr/3","doc":"Returns the attribute for the given cell creating one if necessary.\n\nIf the cell already has an attribute, it is returned. Otherwise a new attribute is\ncreated, associated with the cell and returned. In any case the caller must call DecRef()\non the returned pointer.\n\nPrefer to use `GetOrCreateCellAttrPtr()` (not implemented in wx) to avoid the need to\ncall DecRef() on the returned pointer.\n\nThis function may only be called if `CanHaveAttributes()` (not implemented in wx) returns\ntrue.","ref":"wxGrid.html#getOrCreateCellAttr/3"},{"type":"function","title":"wxGrid.getRowLabelAlignment/1","doc":"Returns the alignment used for row labels.\n\nHorizontal alignment will be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment will be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#getRowLabelAlignment/1"},{"type":"function","title":"wxGrid.getRowLabelSize/1","doc":"Returns the current width of the row labels.","ref":"wxGrid.html#getRowLabelSize/1"},{"type":"function","title":"wxGrid.getRowLabelValue/2","doc":"Returns the specified row label.\n\nThe default grid table class provides numeric row labels. If you are using a custom grid\ntable you can override `wxGridTableBase::GetRowLabelValue()` (not implemented in wx) to\nprovide your own labels.","ref":"wxGrid.html#getRowLabelValue/2"},{"type":"function","title":"wxGrid.getRowMinimalAcceptableHeight/1","doc":"Returns the minimal size to which rows can be resized.\n\nUse `setRowMinimalAcceptableHeight/2` to change this value globally or `setRowMinimalHeight/3` to do it for individual cells.\n\nSee: `getColMinimalAcceptableWidth/1`","ref":"wxGrid.html#getRowMinimalAcceptableHeight/1"},{"type":"function","title":"wxGrid.getRowSize/2","doc":"Returns the height of the specified row.","ref":"wxGrid.html#getRowSize/2"},{"type":"function","title":"wxGrid.getScrollLineX/1","doc":"Returns the number of pixels per horizontal scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineY/1`\n\n* `setScrollLineX/2`\n\n* `setScrollLineY/2`","ref":"wxGrid.html#getScrollLineX/1"},{"type":"function","title":"wxGrid.getScrollLineY/1","doc":"Returns the number of pixels per vertical scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `setScrollLineX/2`\n\n* `setScrollLineY/2`","ref":"wxGrid.html#getScrollLineY/1"},{"type":"function","title":"wxGrid.getSelectedCells/1","doc":"Returns an array of individually selected cells.\n\nNotice that this array does `not` contain all the selected cells in general as it doesn't\ninclude the cells selected as part of column, row or block selection. You must use this\nmethod, `getSelectedCols/1`, `getSelectedRows/1` and `getSelectionBlockTopLeft/1` and `getSelectionBlockBottomRight/1` methods to obtain the entire selection in general.\n\nPlease notice this behaviour is by design and is needed in order to support grids of\narbitrary size (when an entire column is selected in a grid with a million of columns, we\ndon't want to create an array with a million of entries in this function, instead it\nreturns an empty array and `getSelectedCols/1` returns an array containing one element).\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","ref":"wxGrid.html#getSelectedCells/1"},{"type":"function","title":"wxGrid.getSelectedCols/1","doc":"Returns an array of selected columns.\n\nPlease notice that this method alone is not sufficient to find all the selected columns\nas it contains only the columns which were individually selected but not those being part\nof the block selection or being selected in virtue of all of their cells being selected\nindividually, please see `getSelectedCells/1` for more details.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","ref":"wxGrid.html#getSelectedCols/1"},{"type":"function","title":"wxGrid.getSelectedRows/1","doc":"Returns an array of selected rows.\n\nPlease notice that this method alone is not sufficient to find all the selected rows as\nit contains only the rows which were individually selected but not those being part of the\nblock selection or being selected in virtue of all of their cells being selected\nindividually, please see `getSelectedCells/1` for more details.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.","ref":"wxGrid.html#getSelectedRows/1"},{"type":"function","title":"wxGrid.getSelectionBackground/1","doc":"Returns the colour used for drawing the selection background.","ref":"wxGrid.html#getSelectionBackground/1"},{"type":"function","title":"wxGrid.getSelectionBlockBottomRight/1","doc":"Returns an array of the bottom right corners of blocks of selected cells.\n\nPlease see `getSelectedCells/1` for more information about the selection representation in `m:wxGrid`.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.\n\nSee: `getSelectionBlockTopLeft/1`","ref":"wxGrid.html#getSelectionBlockBottomRight/1"},{"type":"function","title":"wxGrid.getSelectionBlockTopLeft/1","doc":"Returns an array of the top left corners of blocks of selected cells.\n\nPlease see `getSelectedCells/1` for more information about the selection representation in `m:wxGrid`.\n\nThe function can be slow for the big grids, use `GetSelectedBlocks()` (not implemented in\nwx) in the new code.\n\nSee: `getSelectionBlockBottomRight/1`","ref":"wxGrid.html#getSelectionBlockTopLeft/1"},{"type":"function","title":"wxGrid.getSelectionForeground/1","doc":"Returns the colour used for drawing the selection foreground.","ref":"wxGrid.html#getSelectionForeground/1"},{"type":"function","title":"wxGrid.gridLinesEnabled/1","doc":"Returns true if drawing of grid lines is turned on, false otherwise.","ref":"wxGrid.html#gridLinesEnabled/1"},{"type":"function","title":"wxGrid.hideCellEditControl/1","doc":"Hides the in-place cell edit control.","ref":"wxGrid.html#hideCellEditControl/1"},{"type":"function","title":"wxGrid.insertCols/1","doc":"","ref":"wxGrid.html#insertCols/1"},{"type":"function","title":"wxGrid.insertCols/2","doc":"Inserts one or more new columns into a grid with the first new column at the specified\nposition.\n\nNotice that inserting the columns in the grid requires grid table cooperation: when this\nmethod is called, grid object begins by requesting the underlying grid table to insert new\ncolumns. If this is successful the table notifies the grid and the grid updates the\ndisplay. For a default grid (one where you have called `createGrid/4`) this process is automatic. If you\nare using a custom grid table (specified with `SetTable()` (not implemented in wx) or `AssignTable()`\n(not implemented in wx)) then you must override `wxGridTableBase::InsertCols()` (not\nimplemented in wx) in your derived table class.\n\nReturn: true if the columns were successfully inserted, false if an error occurred (most\nlikely the table couldn't be updated).","ref":"wxGrid.html#insertCols/2"},{"type":"function","title":"wxGrid.insertRows/1","doc":"","ref":"wxGrid.html#insertRows/1"},{"type":"function","title":"wxGrid.insertRows/2","doc":"Inserts one or more new rows into a grid with the first new row at the specified\nposition.\n\nNotice that you must implement `wxGridTableBase::InsertRows()` (not implemented in wx) if\nyou use a grid with a custom table, please see `insertCols/2` for more information.\n\nReturn: true if the rows were successfully inserted, false if an error occurred (most\nlikely the table couldn't be updated).","ref":"wxGrid.html#insertRows/2"},{"type":"function","title":"wxGrid.isCellEditControlEnabled/1","doc":"Returns true if the in-place edit control is currently enabled.","ref":"wxGrid.html#isCellEditControlEnabled/1"},{"type":"function","title":"wxGrid.isCurrentCellReadOnly/1","doc":"Returns true if the current cell is read-only.\n\nSee:\n* `setReadOnly/4`\n\n* `isReadOnly/3`","ref":"wxGrid.html#isCurrentCellReadOnly/1"},{"type":"function","title":"wxGrid.isEditable/1","doc":"Returns false if the whole grid has been set as read-only or true otherwise.\n\nSee `enableEditing/2` for more information about controlling the editing status of grid cells.","ref":"wxGrid.html#isEditable/1"},{"type":"function","title":"wxGrid.isInSelection/2","doc":"Returns true if the given cell is selected.","ref":"wxGrid.html#isInSelection/2"},{"type":"function","title":"wxGrid.isInSelection/3","doc":"Returns true if the given cell is selected.","ref":"wxGrid.html#isInSelection/3"},{"type":"function","title":"wxGrid.isReadOnly/3","doc":"Returns true if the cell at the specified location can't be edited.\n\nSee:\n* `setReadOnly/4`\n\n* `isCurrentCellReadOnly/1`","ref":"wxGrid.html#isReadOnly/3"},{"type":"function","title":"wxGrid.isSelection/1","doc":"Returns true if there are currently any selected cells, rows, columns or blocks.","ref":"wxGrid.html#isSelection/1"},{"type":"function","title":"wxGrid.isVisible/2","doc":"","ref":"wxGrid.html#isVisible/2"},{"type":"function","title":"wxGrid.isVisible/3","doc":"Returns true if a cell is either entirely or at least partially visible in the grid\nwindow.\n\nBy default, the cell must be entirely visible for this function to return true but if `wholeCellVisible`\nis false, the function returns true even if the cell is only partially visible.","ref":"wxGrid.html#isVisible/3"},{"type":"function","title":"wxGrid.isVisible/4","doc":"Returns true if a cell is either entirely or at least partially visible in the grid\nwindow.\n\nBy default, the cell must be entirely visible for this function to return true but if `wholeCellVisible`\nis false, the function returns true even if the cell is only partially visible.","ref":"wxGrid.html#isVisible/4"},{"type":"function","title":"wxGrid.makeCellVisible/2","doc":"Brings the specified cell into the visible grid cell area with minimal scrolling.\n\nDoes nothing if the cell is already visible.","ref":"wxGrid.html#makeCellVisible/2"},{"type":"function","title":"wxGrid.makeCellVisible/3","doc":"Brings the specified cell into the visible grid cell area with minimal scrolling.\n\nDoes nothing if the cell is already visible.","ref":"wxGrid.html#makeCellVisible/3"},{"type":"function","title":"wxGrid.moveCursorDown/2","doc":"Moves the grid cursor down by one row.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorDown/2"},{"type":"function","title":"wxGrid.moveCursorDownBlock/2","doc":"Moves the grid cursor down in the current column such that it skips to the beginning or\nend of a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorDownBlock/2"},{"type":"function","title":"wxGrid.moveCursorLeft/2","doc":"Moves the grid cursor left by one column.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorLeft/2"},{"type":"function","title":"wxGrid.moveCursorLeftBlock/2","doc":"Moves the grid cursor left in the current row such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorLeftBlock/2"},{"type":"function","title":"wxGrid.moveCursorRight/2","doc":"Moves the grid cursor right by one column.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorRight/2"},{"type":"function","title":"wxGrid.moveCursorRightBlock/2","doc":"Moves the grid cursor right in the current row such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorRightBlock/2"},{"type":"function","title":"wxGrid.moveCursorUp/2","doc":"Moves the grid cursor up by one row.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorUp/2"},{"type":"function","title":"wxGrid.moveCursorUpBlock/2","doc":"Moves the grid cursor up in the current column such that it skips to the beginning or end\nof a block of non-empty cells.\n\nIf a block of cells was previously selected it will expand if the argument is true or be\ncleared if the argument is false.","ref":"wxGrid.html#moveCursorUpBlock/2"},{"type":"function","title":"wxGrid.movePageDown/1","doc":"Moves the grid cursor down by some number of rows so that the previous bottom visible row\nbecomes the top visible row.","ref":"wxGrid.html#movePageDown/1"},{"type":"function","title":"wxGrid.movePageUp/1","doc":"Moves the grid cursor up by some number of rows so that the previous top visible row\nbecomes the bottom visible row.","ref":"wxGrid.html#movePageUp/1"},{"type":"function","title":"wxGrid.new/0","doc":"Default constructor.\n\nYou must call `Create()` (not implemented in wx) to really create the grid window and\nalso call `createGrid/4` or `SetTable()` (not implemented in wx) or `AssignTable()` (not implemented in\nwx) to initialize its contents.","ref":"wxGrid.html#new/0"},{"type":"function","title":"wxGrid.new/2","doc":"","ref":"wxGrid.html#new/2"},{"type":"function","title":"wxGrid.new/3","doc":"Constructor creating the grid window.\n\nYou must call either `createGrid/4` or `SetTable()` (not implemented in wx) or `AssignTable()` (not\nimplemented in wx) to initialize the grid contents before using it.","ref":"wxGrid.html#new/3"},{"type":"function","title":"wxGrid.registerDataType/4","doc":"Register a new data type.\n\nThe data types allow to naturally associate specific renderers and editors to the cells\ncontaining values of the given type. For example, the grid automatically registers a data\ntype with the name `wxGRID_VALUE_STRING` which uses `m:wxGridCellStringRenderer` and `m:wxGridCellTextEditor`\nas its renderer and editor respectively - this is the data type used by all the cells of\nthe default `wxGridStringTable` (not implemented in wx), so this renderer and editor are\nused by default for all grid cells.\n\nHowever if a custom table returns `wxGRID_VALUE_BOOL` from its `wxGridTableBase::GetTypeName()`\n(not implemented in wx) method, then `m:wxGridCellBoolRenderer` and `m:wxGridCellBoolEditor`\nare used for it because the grid also registers a boolean data type with this name.\n\nAnd as this mechanism is completely generic, you may register your own data types using\nyour own custom renderers and editors. Just remember that the table must identify a cell\nas being of the given type for them to be used for this cell.","ref":"wxGrid.html#registerDataType/4"},{"type":"function","title":"wxGrid.saveEditControlValue/1","doc":"Sets the value of the current grid cell to the current in-place edit control value.\n\nThis is called automatically when the grid cursor moves from the current cell to a new\ncell. It is also a good idea to call this function when closing a grid since any edits to\nthe final cell location will not be saved otherwise.","ref":"wxGrid.html#saveEditControlValue/1"},{"type":"function","title":"wxGrid.selectAll/1","doc":"Selects all cells in the grid.","ref":"wxGrid.html#selectAll/1"},{"type":"function","title":"wxGrid.selectBlock/3","doc":"","ref":"wxGrid.html#selectBlock/3"},{"type":"function","title":"wxGrid.selectBlock/4","doc":"Selects a rectangular block of cells.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.","ref":"wxGrid.html#selectBlock/4"},{"type":"function","title":"wxGrid.selectBlock/5","doc":"","ref":"wxGrid.html#selectBlock/5"},{"type":"function","title":"wxGrid.selectBlock/6","doc":"Selects a rectangular block of cells.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.","ref":"wxGrid.html#selectBlock/6"},{"type":"function","title":"wxGrid.selectCol/2","doc":"","ref":"wxGrid.html#selectCol/2"},{"type":"function","title":"wxGrid.selectCol/3","doc":"Selects the specified column.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\ncolumn will be added to the existing selection.\n\nThis method won't select anything if the current selection mode is wxGridSelectRows.","ref":"wxGrid.html#selectCol/3"},{"type":"function","title":"wxGrid.selectRow/2","doc":"","ref":"wxGrid.html#selectRow/2"},{"type":"function","title":"wxGrid.selectRow/3","doc":"Selects the specified row.\n\nIf `addToSelected` is false then any existing selection will be deselected; if true the\nrow will be added to the existing selection.\n\nThis method won't select anything if the current selection mode is wxGridSelectColumns.","ref":"wxGrid.html#selectRow/3"},{"type":"function","title":"wxGrid.setCellAlignment/5","doc":"Sets the horizontal and vertical alignment for grid cell text at the specified location.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\n\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#setCellAlignment/5"},{"type":"function","title":"wxGrid.setCellBackgroundColour/4","doc":"Set the background colour for the given cell or all cells by default.","ref":"wxGrid.html#setCellBackgroundColour/4"},{"type":"function","title":"wxGrid.setCellEditor/4","doc":"Sets the editor for the grid cell at the specified location.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","ref":"wxGrid.html#setCellEditor/4"},{"type":"function","title":"wxGrid.setCellFont/4","doc":"Sets the font for text in the grid cell at the specified location.","ref":"wxGrid.html#setCellFont/4"},{"type":"function","title":"wxGrid.setCellRenderer/4","doc":"Sets the renderer for the grid cell at the specified location.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.","ref":"wxGrid.html#setCellRenderer/4"},{"type":"function","title":"wxGrid.setCellTextColour/4","doc":"Sets the text colour for the given cell.","ref":"wxGrid.html#setCellTextColour/4"},{"type":"function","title":"wxGrid.setCellValue/3","doc":"Sets the string value for the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `getCellValue/3` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanSetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","ref":"wxGrid.html#setCellValue/3"},{"type":"function","title":"wxGrid.setCellValue/4","doc":"Sets the string value for the cell at the specified location.\n\nFor simple applications where a grid object automatically uses a default grid table of\nstring values you use this function together with `getCellValue/3` to access cell values. For more complex\napplications where you have derived your own grid table class that contains various data\ntypes (e.g. numeric, boolean or user-defined custom types) then you only use this function\nfor those cells that contain string values.\n\nSee `wxGridTableBase::CanSetValueAs()` (not implemented in wx) and the overview_grid for\nmore information.","ref":"wxGrid.html#setCellValue/4"},{"type":"function","title":"wxGrid.setColAttr/3","doc":"Sets the cell attributes for all cells in the specified column.\n\nFor more information about controlling grid cell attributes see the `m:wxGridCellAttr`\ncell attribute class and the overview_grid.","ref":"wxGrid.html#setColAttr/3"},{"type":"function","title":"wxGrid.setColFormatBool/2","doc":"Sets the specified column to display boolean values.\n\nSee: `setColFormatCustom/3`","ref":"wxGrid.html#setColFormatBool/2"},{"type":"function","title":"wxGrid.setColFormatCustom/3","doc":"Sets the specified column to display data in a custom format.\n\nThis method provides an alternative to defining a custom grid table which would return `typeName`\nfrom its GetTypeName() method for the cells in this column: while it doesn't really\nchange the type of the cells in this column, it does associate the renderer and editor\nused for the cells of the specified type with them.\n\nSee the overview_grid for more information on working with custom data types.","ref":"wxGrid.html#setColFormatCustom/3"},{"type":"function","title":"wxGrid.setColFormatFloat/2","doc":"","ref":"wxGrid.html#setColFormatFloat/2"},{"type":"function","title":"wxGrid.setColFormatFloat/3","doc":"Sets the specified column to display floating point values with the given width and\nprecision.\n\nSee: `setColFormatCustom/3`","ref":"wxGrid.html#setColFormatFloat/3"},{"type":"function","title":"wxGrid.setColFormatNumber/2","doc":"Sets the specified column to display integer values.\n\nSee: `setColFormatCustom/3`","ref":"wxGrid.html#setColFormatNumber/2"},{"type":"function","title":"wxGrid.setColLabelAlignment/3","doc":"Sets the horizontal and vertical alignment of column label text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#setColLabelAlignment/3"},{"type":"function","title":"wxGrid.setColLabelSize/2","doc":"Sets the height of the column labels.\n\nIf `height` equals to `wxGRID_AUTOSIZE` then height is calculated automatically so that\nno label is truncated. Note that this could be slow for a large table.","ref":"wxGrid.html#setColLabelSize/2"},{"type":"function","title":"wxGrid.setColLabelValue/3","doc":"Set the value for the given column label.\n\nIf you are using a custom grid table you must override `wxGridTableBase::SetColLabelValue()`\n(not implemented in wx) for this to have any effect.","ref":"wxGrid.html#setColLabelValue/3"},{"type":"function","title":"wxGrid.setColMinimalAcceptableWidth/2","doc":"Sets the minimal `width` to which the user can resize columns.\n\nSee: `getColMinimalAcceptableWidth/1`","ref":"wxGrid.html#setColMinimalAcceptableWidth/2"},{"type":"function","title":"wxGrid.setColMinimalWidth/3","doc":"Sets the minimal `width` for the specified column `col`.\n\nIt is usually best to call this method during grid creation as calling it later will not\nresize the column to the given minimal width even if it is currently narrower than it.\n\n`width` must be greater than the minimal acceptable column width as returned by `getColMinimalAcceptableWidth/1`.","ref":"wxGrid.html#setColMinimalWidth/3"},{"type":"function","title":"wxGrid.setColSize/3","doc":"Sets the width of the specified column.","ref":"wxGrid.html#setColSize/3"},{"type":"function","title":"wxGrid.setDefaultCellAlignment/3","doc":"Sets the default horizontal and vertical alignment for grid cell text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#setDefaultCellAlignment/3"},{"type":"function","title":"wxGrid.setDefaultCellBackgroundColour/2","doc":"Sets the default background colour for grid cells.","ref":"wxGrid.html#setDefaultCellBackgroundColour/2"},{"type":"function","title":"wxGrid.setDefaultCellFont/2","doc":"Sets the default font to be used for grid cell text.","ref":"wxGrid.html#setDefaultCellFont/2"},{"type":"function","title":"wxGrid.setDefaultCellTextColour/2","doc":"Sets the current default colour for grid cell text.","ref":"wxGrid.html#setDefaultCellTextColour/2"},{"type":"function","title":"wxGrid.setDefaultColSize/2","doc":"","ref":"wxGrid.html#setDefaultColSize/2"},{"type":"function","title":"wxGrid.setDefaultColSize/3","doc":"Sets the default width for columns in the grid.\n\nThis will only affect columns subsequently added to the grid unless `resizeExistingCols`\nis true.\n\nIf `width` is less than `getColMinimalAcceptableWidth/1`, then the minimal acceptable width is used instead of it.","ref":"wxGrid.html#setDefaultColSize/3"},{"type":"function","title":"wxGrid.setDefaultEditor/2","doc":"Sets the default editor for grid cells.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellEditor` and the overview_grid for more information about cell editors\nand renderers.","ref":"wxGrid.html#setDefaultEditor/2"},{"type":"function","title":"wxGrid.setDefaultRenderer/2","doc":"Sets the default renderer for grid cells.\n\nThe grid will take ownership of the pointer.\n\nSee `m:wxGridCellRenderer` and the overview_grid for more information about cell editors\nand renderers.","ref":"wxGrid.html#setDefaultRenderer/2"},{"type":"function","title":"wxGrid.setDefaultRowSize/2","doc":"","ref":"wxGrid.html#setDefaultRowSize/2"},{"type":"function","title":"wxGrid.setDefaultRowSize/3","doc":"Sets the default height for rows in the grid.\n\nThis will only affect rows subsequently added to the grid unless `resizeExistingRows` is true.\n\nIf `height` is less than `getRowMinimalAcceptableHeight/1`, then the minimal acceptable height is used instead of it.","ref":"wxGrid.html#setDefaultRowSize/3"},{"type":"function","title":"wxGrid.setGridCursor/2","doc":"Set the grid cursor to the specified cell.\n\nThe grid cursor indicates the current cell and can be moved by the user using the arrow\nkeys or the mouse.\n\nCalling this function generates a `wxEVT_GRID_SELECT_CELL` event and if the event handler\nvetoes this event, the cursor is not moved.\n\nThis function doesn't make the target call visible, use `GoToCell()` (not implemented in\nwx) to do this.","ref":"wxGrid.html#setGridCursor/2"},{"type":"function","title":"wxGrid.setGridCursor/3","doc":"Set the grid cursor to the specified cell.\n\nThe grid cursor indicates the current cell and can be moved by the user using the arrow\nkeys or the mouse.\n\nCalling this function generates a `wxEVT_GRID_SELECT_CELL` event and if the event handler\nvetoes this event, the cursor is not moved.\n\nThis function doesn't make the target call visible, use `GoToCell()` (not implemented in\nwx) to do this.","ref":"wxGrid.html#setGridCursor/3"},{"type":"function","title":"wxGrid.setGridLineColour/2","doc":"Sets the colour used to draw grid lines.","ref":"wxGrid.html#setGridLineColour/2"},{"type":"function","title":"wxGrid.setLabelBackgroundColour/2","doc":"Sets the background colour for row and column labels.","ref":"wxGrid.html#setLabelBackgroundColour/2"},{"type":"function","title":"wxGrid.setLabelFont/2","doc":"Sets the font for row and column labels.","ref":"wxGrid.html#setLabelFont/2"},{"type":"function","title":"wxGrid.setLabelTextColour/2","doc":"Sets the colour for row and column label text.","ref":"wxGrid.html#setLabelTextColour/2"},{"type":"function","title":"wxGrid.setMargins/3","doc":"Sets the extra margins used around the grid area.\n\nA grid may occupy more space than needed for its data display and this function allows\nsetting how big this extra space is","ref":"wxGrid.html#setMargins/3"},{"type":"function","title":"wxGrid.setReadOnly/3","doc":"","ref":"wxGrid.html#setReadOnly/3"},{"type":"function","title":"wxGrid.setReadOnly/4","doc":"Makes the cell at the specified location read-only or editable.\n\nSee: `isReadOnly/3`","ref":"wxGrid.html#setReadOnly/4"},{"type":"function","title":"wxGrid.setRowAttr/3","doc":"Sets the cell attributes for all cells in the specified row.\n\nThe grid takes ownership of the attribute pointer.\n\nSee the `m:wxGridCellAttr` class for more information about controlling cell attributes.","ref":"wxGrid.html#setRowAttr/3"},{"type":"function","title":"wxGrid.setRowLabelAlignment/3","doc":"Sets the horizontal and vertical alignment of row label text.\n\nHorizontal alignment should be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT`.\nVertical alignment should be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGrid.html#setRowLabelAlignment/3"},{"type":"function","title":"wxGrid.setRowLabelSize/2","doc":"Sets the width of the row labels.\n\nIf `width` equals `wxGRID_AUTOSIZE` then width is calculated automatically so that no\nlabel is truncated. Note that this could be slow for a large table.","ref":"wxGrid.html#setRowLabelSize/2"},{"type":"function","title":"wxGrid.setRowLabelValue/3","doc":"Sets the value for the given row label.\n\nIf you are using a derived grid table you must override `wxGridTableBase::SetRowLabelValue()`\n(not implemented in wx) for this to have any effect.","ref":"wxGrid.html#setRowLabelValue/3"},{"type":"function","title":"wxGrid.setRowMinimalAcceptableHeight/2","doc":"Sets the minimal row `height` used by default.\n\nSee `setColMinimalAcceptableWidth/2` for more information.","ref":"wxGrid.html#setRowMinimalAcceptableHeight/2"},{"type":"function","title":"wxGrid.setRowMinimalHeight/3","doc":"Sets the minimal `height` for the specified `row`.\n\nSee `setColMinimalWidth/3` for more information.","ref":"wxGrid.html#setRowMinimalHeight/3"},{"type":"function","title":"wxGrid.setRowSize/3","doc":"Sets the height of the specified row.\n\nSee `setColSize/3` for more information.","ref":"wxGrid.html#setRowSize/3"},{"type":"function","title":"wxGrid.setScrollLineX/2","doc":"Sets the number of pixels per horizontal scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `getScrollLineY/1`\n\n* `setScrollLineY/2`","ref":"wxGrid.html#setScrollLineX/2"},{"type":"function","title":"wxGrid.setScrollLineY/2","doc":"Sets the number of pixels per vertical scroll increment.\n\nThe default is 15.\n\nSee:\n* `getScrollLineX/1`\n\n* `getScrollLineY/1`\n\n* `setScrollLineX/2`","ref":"wxGrid.html#setScrollLineY/2"},{"type":"function","title":"wxGrid.setSelectionBackground/2","doc":"Set the colour to be used for drawing the selection background.","ref":"wxGrid.html#setSelectionBackground/2"},{"type":"function","title":"wxGrid.setSelectionForeground/2","doc":"Set the colour to be used for drawing the selection foreground.","ref":"wxGrid.html#setSelectionForeground/2"},{"type":"function","title":"wxGrid.setSelectionMode/2","doc":"Set the selection behaviour of the grid.\n\nThe existing selection is converted to conform to the new mode if possible and discarded\notherwise (e.g. any individual selected cells are deselected if the new mode allows only\nthe selection of the entire rows or columns).","ref":"wxGrid.html#setSelectionMode/2"},{"type":"function","title":"wxGrid.showCellEditControl/1","doc":"Displays the active in-place cell edit control for the current cell after it was hidden.\n\nThis method should only be called after calling `hideCellEditControl/1`, to start editing the current grid cell\nuse `enableCellEditControl/2` instead.","ref":"wxGrid.html#showCellEditControl/1"},{"type":"function","title":"wxGrid.xToCol/2","doc":"","ref":"wxGrid.html#xToCol/2"},{"type":"function","title":"wxGrid.xToCol/3","doc":"Returns the column at the given pixel position depending on the window.\n\nReturn: The column index or `wxNOT_FOUND`.","ref":"wxGrid.html#xToCol/3"},{"type":"function","title":"wxGrid.xToEdgeOfCol/2","doc":"Returns the column whose right hand edge is close to the given logical `x` position.\n\nIf no column edge is near to this position `wxNOT_FOUND` is returned.","ref":"wxGrid.html#xToEdgeOfCol/2"},{"type":"function","title":"wxGrid.yToEdgeOfRow/2","doc":"Returns the row whose bottom edge is close to the given logical `y` position.\n\nIf no row edge is near to this position `wxNOT_FOUND` is returned.","ref":"wxGrid.html#yToEdgeOfRow/2"},{"type":"function","title":"wxGrid.yToRow/2","doc":"","ref":"wxGrid.html#yToRow/2"},{"type":"function","title":"wxGrid.yToRow/3","doc":"Returns the grid row that corresponds to the logical `y` coordinate.\n\nThe parameter `gridWindow` is new since wxWidgets 3.1.3. If it is specified, i.e.\nnon-NULL, only the cells of this window are considered, i.e. the function returns `wxNOT_FOUND`\nif `y` is out of bounds.\n\nIf `gridWindow` is NULL, the function returns `wxNOT_FOUND` only if there is no row at\nall at the `y` position.","ref":"wxGrid.html#yToRow/3"},{"type":"type","title":"wxGrid.wxGrid/0","doc":"","ref":"wxGrid.html#t:wxGrid/0"},{"type":"module","title":"wxGridBagSizer","doc":"A `m:wxSizer` that can lay out items in a virtual grid like a `m:wxFlexGridSizer` but in\nthis case explicit positioning of the items is allowed using `wxGBPosition` (not\nimplemented in wx), and items can optionally span more than one row and/or column using `wxGBSpan`\n(not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFlexGridSizer`\n\n* `m:wxGridSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxGridBagSizer](https://docs.wxwidgets.org/3.2/classwx_grid_bag_sizer.html)","ref":"wxGridBagSizer.html"},{"type":"function","title":"wxGridBagSizer.add/2","doc":"","ref":"wxGridBagSizer.html#add/2"},{"type":"function","title":"wxGridBagSizer.add/3","doc":"","ref":"wxGridBagSizer.html#add/3"},{"type":"function","title":"wxGridBagSizer.add/4","doc":"Adds the given item to the given position.\n\nReturn: A valid pointer if the item was successfully placed at the given position, or\nNULL if something was already there.","ref":"wxGridBagSizer.html#add/4"},{"type":"function","title":"wxGridBagSizer.add/5","doc":"Adds a spacer to the given position.\n\n`width` and `height` specify the dimension of the spacer to be added.\n\nReturn: A valid pointer if the spacer was successfully placed at the given position, or\nNULL if something was already there.","ref":"wxGridBagSizer.html#add/5"},{"type":"function","title":"wxGridBagSizer.calcMin/1","doc":"Called when the managed size of the sizer is needed or when layout needs done.","ref":"wxGridBagSizer.html#calcMin/1"},{"type":"function","title":"wxGridBagSizer.checkForIntersection/2","doc":"","ref":"wxGridBagSizer.html#checkForIntersection/2"},{"type":"function","title":"wxGridBagSizer.checkForIntersection/3","doc":"Look at all items and see if any intersect (or would overlap) the given item.\n\nReturns true if so, false if there would be no overlap. If an `excludeItem` is given then\nit will not be checked for intersection, for example it may be the item we are checking\nthe position of.","ref":"wxGridBagSizer.html#checkForIntersection/3"},{"type":"function","title":"wxGridBagSizer.checkForIntersection/4","doc":"","ref":"wxGridBagSizer.html#checkForIntersection/4"},{"type":"function","title":"wxGridBagSizer.destroy/1","doc":"Destroys the object","ref":"wxGridBagSizer.html#destroy/1"},{"type":"function","title":"wxGridBagSizer.findItem/2","doc":"Find the sizer item for the given window or subsizer, returns NULL if not found.\n\n(non-recursive)","ref":"wxGridBagSizer.html#findItem/2"},{"type":"function","title":"wxGridBagSizer.findItemAtPoint/2","doc":"Return the sizer item located at the point given in pt, or NULL if there is no item at\nthat point.\n\nThe (x,y) coordinates in `pt` correspond to the client coordinates of the window using\nthe sizer for layout. (non-recursive)","ref":"wxGridBagSizer.html#findItemAtPoint/2"},{"type":"function","title":"wxGridBagSizer.findItemAtPosition/2","doc":"Return the sizer item for the given grid cell, or NULL if there is no item at that\nposition.\n\n(non-recursive)","ref":"wxGridBagSizer.html#findItemAtPosition/2"},{"type":"function","title":"wxGridBagSizer.findItemWithData/2","doc":"Return the sizer item that has a matching user data (it only compares pointer values) or\nNULL if not found.\n\n(non-recursive)","ref":"wxGridBagSizer.html#findItemWithData/2"},{"type":"function","title":"wxGridBagSizer.getCellSize/3","doc":"Get the size of the specified cell, including hgap and vgap.\n\nOnly valid after window layout has been performed.","ref":"wxGridBagSizer.html#getCellSize/3"},{"type":"function","title":"wxGridBagSizer.getEmptyCellSize/1","doc":"Get the size used for cells in the grid with no item.","ref":"wxGridBagSizer.html#getEmptyCellSize/1"},{"type":"function","title":"wxGridBagSizer.getItemPosition/2","doc":"","ref":"wxGridBagSizer.html#getItemPosition/2"},{"type":"function","title":"wxGridBagSizer.getItemSpan/2","doc":"","ref":"wxGridBagSizer.html#getItemSpan/2"},{"type":"function","title":"wxGridBagSizer.new/0","doc":"","ref":"wxGridBagSizer.html#new/0"},{"type":"function","title":"wxGridBagSizer.new/1","doc":"Constructor, with optional parameters to specify the gap between the rows and columns.","ref":"wxGridBagSizer.html#new/1"},{"type":"function","title":"wxGridBagSizer.setEmptyCellSize/2","doc":"Set the size used for cells in the grid with no item.","ref":"wxGridBagSizer.html#setEmptyCellSize/2"},{"type":"function","title":"wxGridBagSizer.setItemPosition/3","doc":"","ref":"wxGridBagSizer.html#setItemPosition/3"},{"type":"function","title":"wxGridBagSizer.setItemSpan/3","doc":"","ref":"wxGridBagSizer.html#setItemSpan/3"},{"type":"type","title":"wxGridBagSizer.wxGridBagSizer/0","doc":"","ref":"wxGridBagSizer.html#t:wxGridBagSizer/0"},{"type":"module","title":"wxGridCellAttr","doc":"This class can be used to alter the cells' appearance in the grid by changing their\nattributes from the defaults.\n\nAn object of this class may be returned by `wxGridTableBase::GetAttr()` (not implemented\nin wx).\n\nNote that objects of this class are reference-counted and it's recommended to use\nwxGridCellAttrPtr smart pointer class when working with them to avoid memory leaks.\n\nwxWidgets docs: [wxGridCellAttr](https://docs.wxwidgets.org/3.2/classwx_grid_cell_attr.html)","ref":"wxGridCellAttr.html"},{"type":"function","title":"wxGridCellAttr.getAlignment/1","doc":"Get the alignment to use for the cell with the given attribute.\n\nIf this attribute doesn't specify any alignment, the default attribute alignment is used\n(which can be changed using `wxGrid:setDefaultCellAlignment/3` but is left and top by default).\n\nNotice that `hAlign` and `vAlign` values are always overwritten by this function, use `GetNonDefaultAlignment()`\n(not implemented in wx) if this is not desirable.","ref":"wxGridCellAttr.html#getAlignment/1"},{"type":"function","title":"wxGridCellAttr.getBackgroundColour/1","doc":"Returns the background colour.","ref":"wxGridCellAttr.html#getBackgroundColour/1"},{"type":"function","title":"wxGridCellAttr.getEditor/4","doc":"Returns the cell editor.\n\nThe caller is responsible for calling `DecRef()` (not implemented in wx) on the returned\npointer, use `GetEditorPtr()` (not implemented in wx) to do it automatically.","ref":"wxGridCellAttr.html#getEditor/4"},{"type":"function","title":"wxGridCellAttr.getFont/1","doc":"Returns the font.","ref":"wxGridCellAttr.html#getFont/1"},{"type":"function","title":"wxGridCellAttr.getRenderer/4","doc":"Returns the cell renderer.\n\nThe caller is responsible for calling `DecRef()` (not implemented in wx) on the returned\npointer, use `GetRendererPtr()` (not implemented in wx) to do it automatically.","ref":"wxGridCellAttr.html#getRenderer/4"},{"type":"function","title":"wxGridCellAttr.getTextColour/1","doc":"Returns the text colour.","ref":"wxGridCellAttr.html#getTextColour/1"},{"type":"function","title":"wxGridCellAttr.hasAlignment/1","doc":"Returns true if this attribute has a valid alignment set.","ref":"wxGridCellAttr.html#hasAlignment/1"},{"type":"function","title":"wxGridCellAttr.hasBackgroundColour/1","doc":"Returns true if this attribute has a valid background colour set.","ref":"wxGridCellAttr.html#hasBackgroundColour/1"},{"type":"function","title":"wxGridCellAttr.hasEditor/1","doc":"Returns true if this attribute has a valid cell editor set.","ref":"wxGridCellAttr.html#hasEditor/1"},{"type":"function","title":"wxGridCellAttr.hasFont/1","doc":"Returns true if this attribute has a valid font set.","ref":"wxGridCellAttr.html#hasFont/1"},{"type":"function","title":"wxGridCellAttr.hasRenderer/1","doc":"Returns true if this attribute has a valid cell renderer set.","ref":"wxGridCellAttr.html#hasRenderer/1"},{"type":"function","title":"wxGridCellAttr.hasTextColour/1","doc":"Returns true if this attribute has a valid text colour set.","ref":"wxGridCellAttr.html#hasTextColour/1"},{"type":"function","title":"wxGridCellAttr.isReadOnly/1","doc":"Returns true if this cell is set as read-only.","ref":"wxGridCellAttr.html#isReadOnly/1"},{"type":"function","title":"wxGridCellAttr.setAlignment/3","doc":"Sets the alignment.\n\n`hAlign` can be one of `wxALIGN_LEFT`, `wxALIGN_CENTRE` or `wxALIGN_RIGHT` and `vAlign`\ncan be one of `wxALIGN_TOP`, `wxALIGN_CENTRE` or `wxALIGN_BOTTOM`.","ref":"wxGridCellAttr.html#setAlignment/3"},{"type":"function","title":"wxGridCellAttr.setBackgroundColour/2","doc":"Sets the background colour.","ref":"wxGridCellAttr.html#setBackgroundColour/2"},{"type":"function","title":"wxGridCellAttr.setDefAttr/2","doc":"","ref":"wxGridCellAttr.html#setDefAttr/2"},{"type":"function","title":"wxGridCellAttr.setEditor/2","doc":"Sets the editor to be used with the cells with this attribute.","ref":"wxGridCellAttr.html#setEditor/2"},{"type":"function","title":"wxGridCellAttr.setFont/2","doc":"Sets the font.","ref":"wxGridCellAttr.html#setFont/2"},{"type":"function","title":"wxGridCellAttr.setReadOnly/1","doc":"","ref":"wxGridCellAttr.html#setReadOnly/1"},{"type":"function","title":"wxGridCellAttr.setReadOnly/2","doc":"Sets the cell as read-only.","ref":"wxGridCellAttr.html#setReadOnly/2"},{"type":"function","title":"wxGridCellAttr.setRenderer/2","doc":"Sets the renderer to be used for cells with this attribute.\n\nTakes ownership of the pointer.","ref":"wxGridCellAttr.html#setRenderer/2"},{"type":"function","title":"wxGridCellAttr.setTextColour/2","doc":"Sets the text colour.","ref":"wxGridCellAttr.html#setTextColour/2"},{"type":"type","title":"wxGridCellAttr.wxGridCellAttr/0","doc":"","ref":"wxGridCellAttr.html#t:wxGridCellAttr/0"},{"type":"module","title":"wxGridCellBoolEditor","doc":"Grid cell editor for boolean data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellBoolEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_bool_editor.html)","ref":"wxGridCellBoolEditor.html"},{"type":"function","title":"wxGridCellBoolEditor.destroy/1","doc":"Destroys the object","ref":"wxGridCellBoolEditor.html#destroy/1"},{"type":"function","title":"wxGridCellBoolEditor.isTrueValue/1","doc":"Returns true if the given `value` is equal to the string representation of the truth\nvalue we currently use (see `useStringValues/1`).","ref":"wxGridCellBoolEditor.html#isTrueValue/1"},{"type":"function","title":"wxGridCellBoolEditor.new/0","doc":"Default constructor.","ref":"wxGridCellBoolEditor.html#new/0"},{"type":"function","title":"wxGridCellBoolEditor.useStringValues/0","doc":"","ref":"wxGridCellBoolEditor.html#useStringValues/0"},{"type":"function","title":"wxGridCellBoolEditor.useStringValues/1","doc":"This method allows you to customize the values returned by `wxGridCellNumberEditor:getValue/1`\nfor the cell using this editor.\n\nBy default, the default values of the arguments are used, i.e. `\"1\"` is returned if the\ncell is checked and an empty string otherwise.","ref":"wxGridCellBoolEditor.html#useStringValues/1"},{"type":"type","title":"wxGridCellBoolEditor.wxGridCellBoolEditor/0","doc":"","ref":"wxGridCellBoolEditor.html#t:wxGridCellBoolEditor/0"},{"type":"module","title":"wxGridCellBoolRenderer","doc":"This class may be used to format boolean data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellBoolRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_bool_renderer.html)","ref":"wxGridCellBoolRenderer.html"},{"type":"function","title":"wxGridCellBoolRenderer.destroy/1","doc":"Destroys the object","ref":"wxGridCellBoolRenderer.html#destroy/1"},{"type":"function","title":"wxGridCellBoolRenderer.new/0","doc":"","ref":"wxGridCellBoolRenderer.html#new/0"},{"type":"type","title":"wxGridCellBoolRenderer.wxGridCellBoolRenderer/0","doc":"","ref":"wxGridCellBoolRenderer.html#t:wxGridCellBoolRenderer/0"},{"type":"module","title":"wxGridCellChoiceEditor","doc":"Grid cell editor for string data providing the user a choice from a list of strings.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellChoiceEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_choice_editor.html)","ref":"wxGridCellChoiceEditor.html"},{"type":"function","title":"wxGridCellChoiceEditor.destroy/1","doc":"Destroys the object","ref":"wxGridCellChoiceEditor.html#destroy/1"},{"type":"function","title":"wxGridCellChoiceEditor.new/1","doc":"","ref":"wxGridCellChoiceEditor.html#new/1"},{"type":"function","title":"wxGridCellChoiceEditor.new/2","doc":"Choice cell renderer ctor.","ref":"wxGridCellChoiceEditor.html#new/2"},{"type":"function","title":"wxGridCellChoiceEditor.setParameters/2","doc":"Parameters string format is \"item1[,item2[...,itemN]]\".\n\nThis method can be called before the editor is used for the first time, or later, in\nwhich case it replaces the previously specified strings with the new ones.","ref":"wxGridCellChoiceEditor.html#setParameters/2"},{"type":"type","title":"wxGridCellChoiceEditor.wxGridCellChoiceEditor/0","doc":"","ref":"wxGridCellChoiceEditor.html#t:wxGridCellChoiceEditor/0"},{"type":"module","title":"wxGridCellEditor","doc":"This class is responsible for providing and manipulating the in-place edit controls for\nthe grid.\n\nInstances of `m:wxGridCellEditor` (actually, instances of derived classes since it is an\nabstract class) can be associated with the cell attributes for individual cells, rows,\ncolumns, or even for the entire grid.\n\nNormally `m:wxGridCellEditor` shows some UI control allowing the user to edit the cell,\nbut starting with wxWidgets 3.1.4 it's also possible to define \"activatable\" cell editors,\nthat change the value of the cell directly when it's activated (typically by pressing\nSpace key or clicking on it), see `TryActivate()` (not implemented in wx) method. Note\nthat when implementing an editor which is always activatable, i.e. never shows any\nin-place editor, it is more convenient to derive its class from `wxGridCellActivatableEditor`\n(not implemented in wx) than from `m:wxGridCellEditor` itself.\n\nSee:\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nwxWidgets docs: [wxGridCellEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_editor.html)","ref":"wxGridCellEditor.html"},{"type":"function","title":"wxGridCellEditor.create/4","doc":"Creates the actual edit control.","ref":"wxGridCellEditor.html#create/4"},{"type":"function","title":"wxGridCellEditor.handleReturn/2","doc":"Some types of controls on some platforms may need some help with the Return key.","ref":"wxGridCellEditor.html#handleReturn/2"},{"type":"function","title":"wxGridCellEditor.isCreated/1","doc":"Returns true if the edit control has been created.","ref":"wxGridCellEditor.html#isCreated/1"},{"type":"function","title":"wxGridCellEditor.reset/1","doc":"Reset the value in the control back to its starting value.","ref":"wxGridCellEditor.html#reset/1"},{"type":"function","title":"wxGridCellEditor.setSize/2","doc":"Size and position the edit control.","ref":"wxGridCellEditor.html#setSize/2"},{"type":"function","title":"wxGridCellEditor.show/2","doc":"","ref":"wxGridCellEditor.html#show/2"},{"type":"function","title":"wxGridCellEditor.show/3","doc":"Show or hide the edit control, use the specified attributes to set colours/fonts for it.","ref":"wxGridCellEditor.html#show/3"},{"type":"function","title":"wxGridCellEditor.startingClick/1","doc":"If the editor is enabled by clicking on the cell, this method will be called.","ref":"wxGridCellEditor.html#startingClick/1"},{"type":"function","title":"wxGridCellEditor.startingKey/2","doc":"If the editor is enabled by pressing keys on the grid, this will be called to let the\neditor do something about that first key if desired.","ref":"wxGridCellEditor.html#startingKey/2"},{"type":"type","title":"wxGridCellEditor.wxGridCellEditor/0","doc":"","ref":"wxGridCellEditor.html#t:wxGridCellEditor/0"},{"type":"module","title":"wxGridCellFloatEditor","doc":"The editor for floating point numbers data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellNumberEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellFloatEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_float_editor.html)","ref":"wxGridCellFloatEditor.html"},{"type":"function","title":"wxGridCellFloatEditor.destroy/1","doc":"Destroys the object","ref":"wxGridCellFloatEditor.html#destroy/1"},{"type":"function","title":"wxGridCellFloatEditor.new/0","doc":"","ref":"wxGridCellFloatEditor.html#new/0"},{"type":"function","title":"wxGridCellFloatEditor.new/1","doc":"Float cell editor ctor.","ref":"wxGridCellFloatEditor.html#new/1"},{"type":"function","title":"wxGridCellFloatEditor.setParameters/2","doc":"The parameters string format is \"width[,precision[,format]]\" where `format` should be\nchosen between f|e|g|E|G (f is used by default)","ref":"wxGridCellFloatEditor.html#setParameters/2"},{"type":"type","title":"wxGridCellFloatEditor.wxGridCellFloatEditor/0","doc":"","ref":"wxGridCellFloatEditor.html#t:wxGridCellFloatEditor/0"},{"type":"module","title":"wxGridCellFloatRenderer","doc":"This class may be used to format floating point data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellStringRenderer`\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellFloatRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_float_renderer.html)","ref":"wxGridCellFloatRenderer.html"},{"type":"function","title":"wxGridCellFloatRenderer.destroy/1","doc":"Destroys the object","ref":"wxGridCellFloatRenderer.html#destroy/1"},{"type":"function","title":"wxGridCellFloatRenderer.getPrecision/1","doc":"Returns the precision.","ref":"wxGridCellFloatRenderer.html#getPrecision/1"},{"type":"function","title":"wxGridCellFloatRenderer.getWidth/1","doc":"Returns the width.","ref":"wxGridCellFloatRenderer.html#getWidth/1"},{"type":"function","title":"wxGridCellFloatRenderer.new/0","doc":"","ref":"wxGridCellFloatRenderer.html#new/0"},{"type":"function","title":"wxGridCellFloatRenderer.new/1","doc":"Float cell renderer ctor.","ref":"wxGridCellFloatRenderer.html#new/1"},{"type":"function","title":"wxGridCellFloatRenderer.setParameters/2","doc":"The parameters string format is \"width[,precision[,format]]\" where `format` should be\nchosen between f|e|g|E|G (f is used by default)","ref":"wxGridCellFloatRenderer.html#setParameters/2"},{"type":"function","title":"wxGridCellFloatRenderer.setPrecision/2","doc":"Sets the precision.","ref":"wxGridCellFloatRenderer.html#setPrecision/2"},{"type":"function","title":"wxGridCellFloatRenderer.setWidth/2","doc":"Sets the width.","ref":"wxGridCellFloatRenderer.html#setWidth/2"},{"type":"type","title":"wxGridCellFloatRenderer.wxGridCellFloatRenderer/0","doc":"","ref":"wxGridCellFloatRenderer.html#t:wxGridCellFloatRenderer/0"},{"type":"module","title":"wxGridCellNumberEditor","doc":"Grid cell editor for numeric integer data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellTextEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellTextEditor`\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellNumberEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_number_editor.html)","ref":"wxGridCellNumberEditor.html"},{"type":"function","title":"wxGridCellNumberEditor.destroy/1","doc":"Destroys the object","ref":"wxGridCellNumberEditor.html#destroy/1"},{"type":"function","title":"wxGridCellNumberEditor.getValue/1","doc":"Returns the value currently in the editor control.","ref":"wxGridCellNumberEditor.html#getValue/1"},{"type":"function","title":"wxGridCellNumberEditor.new/0","doc":"","ref":"wxGridCellNumberEditor.html#new/0"},{"type":"function","title":"wxGridCellNumberEditor.new/1","doc":"Allows you to specify the range for acceptable data.\n\nValues equal to -1 for both `min` and `max` indicate that no range checking should be\ndone.","ref":"wxGridCellNumberEditor.html#new/1"},{"type":"function","title":"wxGridCellNumberEditor.setParameters/2","doc":"Parameters string format is \"min,max\".","ref":"wxGridCellNumberEditor.html#setParameters/2"},{"type":"type","title":"wxGridCellNumberEditor.wxGridCellNumberEditor/0","doc":"","ref":"wxGridCellNumberEditor.html#t:wxGridCellNumberEditor/0"},{"type":"module","title":"wxGridCellNumberRenderer","doc":"This class may be used to format integer data in a cell.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellStringRenderer`\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellNumberRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_number_renderer.html)","ref":"wxGridCellNumberRenderer.html"},{"type":"function","title":"wxGridCellNumberRenderer.destroy/1","doc":"Destroys the object","ref":"wxGridCellNumberRenderer.html#destroy/1"},{"type":"function","title":"wxGridCellNumberRenderer.new/0","doc":"Default constructor.","ref":"wxGridCellNumberRenderer.html#new/0"},{"type":"type","title":"wxGridCellNumberRenderer.wxGridCellNumberRenderer/0","doc":"","ref":"wxGridCellNumberRenderer.html#t:wxGridCellNumberRenderer/0"},{"type":"module","title":"wxGridCellRenderer","doc":"This class is responsible for actually drawing the cell in the grid.\n\nYou may pass it to the `m:wxGridCellAttr` (below) to change the format of one given cell\nor to `wxGrid:setDefaultRenderer/2` to change the view of all cells. This is an abstract class, and you will normally\nuse one of the predefined derived classes or derive your own class from it.\n\nSee:\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\n* `m:wxGridCellStringRenderer`\n\nwxWidgets docs: [wxGridCellRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_renderer.html)","ref":"wxGridCellRenderer.html"},{"type":"function","title":"wxGridCellRenderer.draw/8","doc":"Draw the given cell on the provided DC inside the given rectangle using the style\nspecified by the attribute and the default or selected state corresponding to the\nisSelected value.\n\nThis pure virtual function has a default implementation which will prepare the DC using\nthe given attribute: it will draw the rectangle with the background colour from attr and\nset the text colour and font.","ref":"wxGridCellRenderer.html#draw/8"},{"type":"function","title":"wxGridCellRenderer.getBestSize/6","doc":"Get the preferred size of the cell for its contents.\n\nThis method must be overridden in the derived classes to return the minimal fitting size\nfor displaying the content of the given grid cell.","ref":"wxGridCellRenderer.html#getBestSize/6"},{"type":"type","title":"wxGridCellRenderer.wxGridCellRenderer/0","doc":"","ref":"wxGridCellRenderer.html#t:wxGridCellRenderer/0"},{"type":"module","title":"wxGridCellStringRenderer","doc":"This class may be used to format string data in a cell; it is the default for string\ncells.\n\nSee:\n* `m:wxGridCellRenderer`\n\n* `m:wxGridCellBoolRenderer`\n\n* `m:wxGridCellFloatRenderer`\n\n* `m:wxGridCellNumberRenderer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellRenderer`\n\nwxWidgets docs: [wxGridCellStringRenderer](https://docs.wxwidgets.org/3.2/classwx_grid_cell_string_renderer.html)","ref":"wxGridCellStringRenderer.html"},{"type":"function","title":"wxGridCellStringRenderer.destroy/1","doc":"Destroys the object","ref":"wxGridCellStringRenderer.html#destroy/1"},{"type":"function","title":"wxGridCellStringRenderer.new/0","doc":"","ref":"wxGridCellStringRenderer.html#new/0"},{"type":"type","title":"wxGridCellStringRenderer.wxGridCellStringRenderer/0","doc":"","ref":"wxGridCellStringRenderer.html#t:wxGridCellStringRenderer/0"},{"type":"module","title":"wxGridCellTextEditor","doc":"Grid cell editor for string/text data.\n\nSee:\n* `m:wxGridCellEditor`\n\n* `m:wxGridCellBoolEditor`\n\n* `m:wxGridCellChoiceEditor`\n\n* `m:wxGridCellFloatEditor`\n\n* `m:wxGridCellNumberEditor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxGridCellEditor`\n\nwxWidgets docs: [wxGridCellTextEditor](https://docs.wxwidgets.org/3.2/classwx_grid_cell_text_editor.html)","ref":"wxGridCellTextEditor.html"},{"type":"function","title":"wxGridCellTextEditor.destroy/1","doc":"Destroys the object","ref":"wxGridCellTextEditor.html#destroy/1"},{"type":"function","title":"wxGridCellTextEditor.new/0","doc":"","ref":"wxGridCellTextEditor.html#new/0"},{"type":"function","title":"wxGridCellTextEditor.new/1","doc":"Text cell editor constructor.","ref":"wxGridCellTextEditor.html#new/1"},{"type":"function","title":"wxGridCellTextEditor.setParameters/2","doc":"The parameters string format is \"n\" where n is a number representing the maximum width.","ref":"wxGridCellTextEditor.html#setParameters/2"},{"type":"type","title":"wxGridCellTextEditor.wxGridCellTextEditor/0","doc":"","ref":"wxGridCellTextEditor.html#t:wxGridCellTextEditor/0"},{"type":"module","title":"wxGridEvent","doc":"This event class contains information about various grid events.\n\nNotice that all grid event table macros are available in two versions: `EVT_GRID_XXX` and `EVT_GRID_CMD_XXX`.\nThe only difference between the two is that the former doesn't allow to specify the grid\nwindow identifier and so takes a single parameter, the event handler, but is not suitable\nif there is more than one grid control in the window where the event table is used (as it\nwould catch the events from all the grids). The version with `CMD` takes the id as first\nargument and the event handler as the second one and so can be used with multiple grids as\nwell. Otherwise there are no difference between the two and only the versions without the\nid are documented below for brevity.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxGridEvent](https://docs.wxwidgets.org/3.2/classwx_grid_event.html)","ref":"wxGridEvent.html"},{"type":"module","title":"Events - wxGridEvent","doc":"Use `wxEvtHandler:connect/3` with `wxGridEventType` to subscribe to events of this type.","ref":"wxGridEvent.html#module-events"},{"type":"function","title":"wxGridEvent.altDown/1","doc":"Returns true if the Alt key was down at the time of the event.","ref":"wxGridEvent.html#altDown/1"},{"type":"function","title":"wxGridEvent.controlDown/1","doc":"Returns true if the Control key was down at the time of the event.","ref":"wxGridEvent.html#controlDown/1"},{"type":"function","title":"wxGridEvent.getCol/1","doc":"Column at which the event occurred.\n\nNotice that for a `wxEVT_GRID_SELECT_CELL` event this column is the column of the newly\nselected cell while the previously selected cell can be retrieved using `wxGrid:getGridCursorCol/1`.","ref":"wxGridEvent.html#getCol/1"},{"type":"function","title":"wxGridEvent.getPosition/1","doc":"Position in pixels at which the event occurred.","ref":"wxGridEvent.html#getPosition/1"},{"type":"function","title":"wxGridEvent.getRow/1","doc":"Row at which the event occurred.\n\nNotice that for a `wxEVT_GRID_SELECT_CELL` event this row is the row of the newly\nselected cell while the previously selected cell can be retrieved using `wxGrid:getGridCursorRow/1`.","ref":"wxGridEvent.html#getRow/1"},{"type":"function","title":"wxGridEvent.metaDown/1","doc":"Returns true if the Meta key was down at the time of the event.","ref":"wxGridEvent.html#metaDown/1"},{"type":"function","title":"wxGridEvent.selecting/1","doc":"Returns true if the user is selecting grid cells, or false if deselecting.","ref":"wxGridEvent.html#selecting/1"},{"type":"function","title":"wxGridEvent.shiftDown/1","doc":"Returns true if the Shift key was down at the time of the event.","ref":"wxGridEvent.html#shiftDown/1"},{"type":"type","title":"wxGridEvent.wxGrid/0","doc":"","ref":"wxGridEvent.html#t:wxGrid/0"},{"type":"type","title":"wxGridEvent.wxGridEvent/0","doc":"","ref":"wxGridEvent.html#t:wxGridEvent/0"},{"type":"type","title":"wxGridEvent.wxGridEventType/0","doc":"","ref":"wxGridEvent.html#t:wxGridEventType/0"},{"type":"module","title":"wxGridSizer","doc":"A grid sizer is a sizer which lays out its children in a two-dimensional table with all\ntable fields having the same size, i.e.\n\nthe width of each field is the width of the widest child, the height of each field is the\nheight of the tallest child.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxGridSizer](https://docs.wxwidgets.org/3.2/classwx_grid_sizer.html)","ref":"wxGridSizer.html"},{"type":"function","title":"wxGridSizer.destroy/1","doc":"Destroys the object","ref":"wxGridSizer.html#destroy/1"},{"type":"function","title":"wxGridSizer.getCols/1","doc":"Returns the number of columns that has been specified for the sizer.\n\nReturns zero if the sizer is automatically adjusting the number of columns depending on\nnumber of its children. To get the effective number of columns or rows being currently\nused, see `GetEffectiveColsCount()` (not implemented in wx)","ref":"wxGridSizer.html#getCols/1"},{"type":"function","title":"wxGridSizer.getHGap/1","doc":"Returns the horizontal gap (in pixels) between cells in the sizer.","ref":"wxGridSizer.html#getHGap/1"},{"type":"function","title":"wxGridSizer.getRows/1","doc":"Returns the number of rows that has been specified for the sizer.\n\nReturns zero if the sizer is automatically adjusting the number of rows depending on\nnumber of its children. To get the effective number of columns or rows being currently\nused, see `GetEffectiveRowsCount()` (not implemented in wx).","ref":"wxGridSizer.html#getRows/1"},{"type":"function","title":"wxGridSizer.getVGap/1","doc":"Returns the vertical gap (in pixels) between the cells in the sizer.","ref":"wxGridSizer.html#getVGap/1"},{"type":"function","title":"wxGridSizer.new/1","doc":"","ref":"wxGridSizer.html#new/1"},{"type":"function","title":"wxGridSizer.new/2","doc":"","ref":"wxGridSizer.html#new/2"},{"type":"function","title":"wxGridSizer.new/3","doc":"","ref":"wxGridSizer.html#new/3"},{"type":"function","title":"wxGridSizer.new/4","doc":"","ref":"wxGridSizer.html#new/4"},{"type":"function","title":"wxGridSizer.setCols/2","doc":"Sets the number of columns in the sizer.","ref":"wxGridSizer.html#setCols/2"},{"type":"function","title":"wxGridSizer.setHGap/2","doc":"Sets the horizontal gap (in pixels) between cells in the sizer.","ref":"wxGridSizer.html#setHGap/2"},{"type":"function","title":"wxGridSizer.setRows/2","doc":"Sets the number of rows in the sizer.","ref":"wxGridSizer.html#setRows/2"},{"type":"function","title":"wxGridSizer.setVGap/2","doc":"Sets the vertical gap (in pixels) between the cells in the sizer.","ref":"wxGridSizer.html#setVGap/2"},{"type":"type","title":"wxGridSizer.wxGridSizer/0","doc":"","ref":"wxGridSizer.html#t:wxGridSizer/0"},{"type":"module","title":"wxHelpEvent","doc":"A help event is sent when the user has requested context-sensitive help.\n\nThis can either be caused by the application requesting context-sensitive help mode via `wxContextHelp`\n(not implemented in wx), or (on MS Windows) by the system generating a WM_HELP message\nwhen the user pressed F1 or clicked on the query button in a dialog caption.\n\nA help event is sent to the window that the user clicked on, and is propagated up the\nwindow hierarchy until the event is processed or there are no more event handlers.\n\nThe application should call `wxEvent:getId/1` to check the identity of the clicked-on window, and then\neither show some suitable help or call `wxEvent:skip/2` if the identifier is unrecognised.\n\nCalling Skip is important because it allows wxWidgets to generate further events for\nancestors of the clicked-on window. Otherwise it would be impossible to show help for\ncontainer windows, since processing would stop after the first window found.\n\nSee:\n* `m:wxDialog`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxHelpEvent](https://docs.wxwidgets.org/3.2/classwx_help_event.html)","ref":"wxHelpEvent.html"},{"type":"module","title":"Events - wxHelpEvent","doc":"Use `wxEvtHandler:connect/3` with `wxHelpEventType` to subscribe to events of this type.","ref":"wxHelpEvent.html#module-events"},{"type":"function","title":"wxHelpEvent.getOrigin/1","doc":"Returns the origin of the help event which is one of the `wxHelpEvent::Origin` (not\nimplemented in wx) values.\n\nThe application may handle events generated using the keyboard or mouse differently, e.g.\nby using `wx_misc:getMousePosition/0` for the mouse events.\n\nSee: `setOrigin/2`","ref":"wxHelpEvent.html#getOrigin/1"},{"type":"function","title":"wxHelpEvent.getPosition/1","doc":"Returns the left-click position of the mouse, in screen coordinates.\n\nThis allows the application to position the help appropriately.","ref":"wxHelpEvent.html#getPosition/1"},{"type":"function","title":"wxHelpEvent.setOrigin/2","doc":"Set the help event origin, only used internally by wxWidgets normally.\n\nSee: `getOrigin/1`","ref":"wxHelpEvent.html#setOrigin/2"},{"type":"function","title":"wxHelpEvent.setPosition/2","doc":"Sets the left-click position of the mouse, in screen coordinates.","ref":"wxHelpEvent.html#setPosition/2"},{"type":"type","title":"wxHelpEvent.wxHelp/0","doc":"","ref":"wxHelpEvent.html#t:wxHelp/0"},{"type":"type","title":"wxHelpEvent.wxHelpEvent/0","doc":"","ref":"wxHelpEvent.html#t:wxHelpEvent/0"},{"type":"type","title":"wxHelpEvent.wxHelpEventType/0","doc":"","ref":"wxHelpEvent.html#t:wxHelpEventType/0"},{"type":"module","title":"wxHtmlEasyPrinting","doc":"This class provides very simple interface to printing architecture.\n\nIt allows you to print HTML documents using only a few commands.\n\nNote: Do not create this class on the stack only. You should create an instance on app\nstartup and use this instance for all printing operations. The reason is that this class\nstores various settings in it.\n\nwxWidgets docs: [wxHtmlEasyPrinting](https://docs.wxwidgets.org/3.2/classwx_html_easy_printing.html)","ref":"wxHtmlEasyPrinting.html"},{"type":"function","title":"wxHtmlEasyPrinting.destroy/1","doc":"Destroys the object","ref":"wxHtmlEasyPrinting.html#destroy/1"},{"type":"function","title":"wxHtmlEasyPrinting.getPageSetupData/1","doc":"Returns a pointer to `m:wxPageSetupDialogData` instance used by this class.\n\nYou can set its parameters (via SetXXXX methods).","ref":"wxHtmlEasyPrinting.html#getPageSetupData/1"},{"type":"function","title":"wxHtmlEasyPrinting.getPrintData/1","doc":"Returns pointer to `m:wxPrintData` instance used by this class.\n\nYou can set its parameters (via SetXXXX methods).","ref":"wxHtmlEasyPrinting.html#getPrintData/1"},{"type":"function","title":"wxHtmlEasyPrinting.new/0","doc":"","ref":"wxHtmlEasyPrinting.html#new/0"},{"type":"function","title":"wxHtmlEasyPrinting.new/1","doc":"Constructor.","ref":"wxHtmlEasyPrinting.html#new/1"},{"type":"function","title":"wxHtmlEasyPrinting.pageSetup/1","doc":"Display page setup dialog and allows the user to modify settings.","ref":"wxHtmlEasyPrinting.html#pageSetup/1"},{"type":"function","title":"wxHtmlEasyPrinting.previewFile/2","doc":"Preview HTML file.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","ref":"wxHtmlEasyPrinting.html#previewFile/2"},{"type":"function","title":"wxHtmlEasyPrinting.previewText/2","doc":"","ref":"wxHtmlEasyPrinting.html#previewText/2"},{"type":"function","title":"wxHtmlEasyPrinting.previewText/3","doc":"Preview HTML text (not file!).\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the error.","ref":"wxHtmlEasyPrinting.html#previewText/3"},{"type":"function","title":"wxHtmlEasyPrinting.printFile/2","doc":"Print HTML file.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","ref":"wxHtmlEasyPrinting.html#printFile/2"},{"type":"function","title":"wxHtmlEasyPrinting.printText/2","doc":"","ref":"wxHtmlEasyPrinting.html#printText/2"},{"type":"function","title":"wxHtmlEasyPrinting.printText/3","doc":"Print HTML text (not file!).\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the error.","ref":"wxHtmlEasyPrinting.html#printText/3"},{"type":"function","title":"wxHtmlEasyPrinting.setFonts/3","doc":"","ref":"wxHtmlEasyPrinting.html#setFonts/3"},{"type":"function","title":"wxHtmlEasyPrinting.setFonts/4","doc":"Sets fonts.\n\nSee `wxHtmlDCRenderer::SetFonts` (not implemented in wx) for detailed description.","ref":"wxHtmlEasyPrinting.html#setFonts/4"},{"type":"function","title":"wxHtmlEasyPrinting.setFooter/2","doc":"","ref":"wxHtmlEasyPrinting.html#setFooter/2"},{"type":"function","title":"wxHtmlEasyPrinting.setFooter/3","doc":"Set page footer.\n\nThe following macros can be used inside it: @DATE@ is replaced by the current date in\ndefault format @PAGENUM@ is replaced by page number @PAGESCNT@ is replaced by total number\nof pages @TIME@ is replaced by the current time in default format @TITLE@ is replaced with\nthe title of the document","ref":"wxHtmlEasyPrinting.html#setFooter/3"},{"type":"function","title":"wxHtmlEasyPrinting.setHeader/2","doc":"","ref":"wxHtmlEasyPrinting.html#setHeader/2"},{"type":"function","title":"wxHtmlEasyPrinting.setHeader/3","doc":"Set page header.\n\nThe following macros can be used inside it:\n\n* @DATE@ is replaced by the current date in default format\n\n* @PAGENUM@ is replaced by page number\n\n* @PAGESCNT@ is replaced by total number of pages\n\n* @TIME@ is replaced by the current time in default format\n\n* @TITLE@ is replaced with the title of the document","ref":"wxHtmlEasyPrinting.html#setHeader/3"},{"type":"type","title":"wxHtmlEasyPrinting.wxHtmlEasyPrinting/0","doc":"","ref":"wxHtmlEasyPrinting.html#t:wxHtmlEasyPrinting/0"},{"type":"module","title":"wxHtmlLinkEvent","doc":"This event class is used for the events generated by `m:wxHtmlWindow`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxHtmlLinkEvent](https://docs.wxwidgets.org/3.2/classwx_html_link_event.html)","ref":"wxHtmlLinkEvent.html"},{"type":"module","title":"Events - wxHtmlLinkEvent","doc":"Use `wxEvtHandler:connect/3` with `wxHtmlLinkEventType` to subscribe to events of this type.","ref":"wxHtmlLinkEvent.html#module-events"},{"type":"function","title":"wxHtmlLinkEvent.getLinkInfo/1","doc":"Returns the `wx_wxHtmlLinkInfo()` which contains info about the cell clicked and the\nhyperlink it contains.","ref":"wxHtmlLinkEvent.html#getLinkInfo/1"},{"type":"type","title":"wxHtmlLinkEvent.wxHtmlLink/0","doc":"","ref":"wxHtmlLinkEvent.html#t:wxHtmlLink/0"},{"type":"type","title":"wxHtmlLinkEvent.wxHtmlLinkEvent/0","doc":"","ref":"wxHtmlLinkEvent.html#t:wxHtmlLinkEvent/0"},{"type":"type","title":"wxHtmlLinkEvent.wxHtmlLinkEventType/0","doc":"","ref":"wxHtmlLinkEvent.html#t:wxHtmlLinkEventType/0"},{"type":"module","title":"wxHtmlWindow","doc":"`m:wxHtmlWindow` is probably the only class you will directly use unless you want to do\nsomething special (like adding new tag handlers or MIME filters).\n\nThe purpose of this class is to display rich content pages (either local file or\ndownloaded via HTTP protocol) in a window based on a subset of the HTML standard. The\nwidth of the window is constant, given in the constructor and virtual height is changed\ndynamically depending on page size. Once the window is created you can set its content by\ncalling `setPage/2` with raw HTML, `loadPage/2` with a `wxFileSystem` (not implemented in wx) location or `loadFile/2` with a filename.\n\nNote: If you want complete HTML/CSS support as well as a Javascript engine, consider\nusing `m:wxWebView` instead.\n\n`m:wxHtmlWindow` uses the `m:wxImage` class for displaying images, so you need to\ninitialize the handlers for any image formats you use before loading a page. See\n?wxInitAllImageHandlers and `wxImage::AddHandler` (not implemented in wx).","ref":"wxHtmlWindow.html"},{"type":"module","title":"Styles - wxHtmlWindow","doc":"This class supports the following styles:\n\n* wxHW_SCROLLBAR_NEVER: Never display scrollbars, not even when the page is larger than the\nwindow.\n\n* wxHW_SCROLLBAR_AUTO: Display scrollbars only if page's size exceeds window's size.\n\n* wxHW_NO_SELECTION: Don't allow the user to select text.\n\nSee: `m:wxHtmlLinkEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxHtmlWindow](https://docs.wxwidgets.org/3.2/classwx_html_window.html)","ref":"wxHtmlWindow.html#module-styles"},{"type":"module","title":"Events - wxHtmlWindow","doc":"Event types emitted from this class:\n\n* [`html_cell_clicked`](`m:wxHtmlLinkEvent`)\n\n* [`html_cell_hover`](`m:wxHtmlLinkEvent`)\n\n* [`command_html_link_clicked`](`m:wxHtmlLinkEvent`)","ref":"wxHtmlWindow.html#module-events"},{"type":"function","title":"wxHtmlWindow.appendToPage/2","doc":"Appends HTML fragment to currently displayed text and refreshes the window.\n\nReturn: false if an error occurred, true otherwise.","ref":"wxHtmlWindow.html#appendToPage/2"},{"type":"function","title":"wxHtmlWindow.destroy/1","doc":"Destroys the object","ref":"wxHtmlWindow.html#destroy/1"},{"type":"function","title":"wxHtmlWindow.getOpenedAnchor/1","doc":"Returns anchor within currently opened page (see `getOpenedPage/1`).\n\nIf no page is opened or if the displayed page wasn't produced by call to `loadPage/2`, empty string\nis returned.","ref":"wxHtmlWindow.html#getOpenedAnchor/1"},{"type":"function","title":"wxHtmlWindow.getOpenedPage/1","doc":"Returns full location of the opened page.\n\nIf no page is opened or if the displayed page wasn't produced by call to `loadPage/2`, empty string\nis returned.","ref":"wxHtmlWindow.html#getOpenedPage/1"},{"type":"function","title":"wxHtmlWindow.getOpenedPageTitle/1","doc":"Returns title of the opened page or wxEmptyString if the current page does not contain\n* * tag.","ref":"wxHtmlWindow.html#getOpenedPageTitle/1"},{"type":"function","title":"wxHtmlWindow.getRelatedFrame/1","doc":"Returns the related frame.","ref":"wxHtmlWindow.html#getRelatedFrame/1"},{"type":"function","title":"wxHtmlWindow.historyBack/1","doc":"Moves back to the previous page.\n\nOnly pages displayed using `loadPage/2` are stored in history list.","ref":"wxHtmlWindow.html#historyBack/1"},{"type":"function","title":"wxHtmlWindow.historyCanBack/1","doc":"Returns true if it is possible to go back in the history i.e.\n\n`historyBack/1` won't fail.","ref":"wxHtmlWindow.html#historyCanBack/1"},{"type":"function","title":"wxHtmlWindow.historyCanForward/1","doc":"Returns true if it is possible to go forward in the history i.e.\n\n`historyForward/1` won't fail.","ref":"wxHtmlWindow.html#historyCanForward/1"},{"type":"function","title":"wxHtmlWindow.historyClear/1","doc":"Clears history.","ref":"wxHtmlWindow.html#historyClear/1"},{"type":"function","title":"wxHtmlWindow.historyForward/1","doc":"Moves to next page in history.\n\nOnly pages displayed using `loadPage/2` are stored in history list.","ref":"wxHtmlWindow.html#historyForward/1"},{"type":"function","title":"wxHtmlWindow.loadFile/2","doc":"Loads an HTML page from a file and displays it.\n\nReturn: false if an error occurred, true otherwise\n\nSee: `loadPage/2`","ref":"wxHtmlWindow.html#loadFile/2"},{"type":"function","title":"wxHtmlWindow.loadPage/2","doc":"Unlike `setPage/2` this function first loads the HTML page from `location` and then\ndisplays it.\n\nReturn: false if an error occurred, true otherwise\n\nSee: `loadFile/2`","ref":"wxHtmlWindow.html#loadPage/2"},{"type":"function","title":"wxHtmlWindow.new/0","doc":"Default ctor.","ref":"wxHtmlWindow.html#new/0"},{"type":"function","title":"wxHtmlWindow.new/1","doc":"","ref":"wxHtmlWindow.html#new/1"},{"type":"function","title":"wxHtmlWindow.new/2","doc":"Constructor.\n\nThe parameters are the same as `wxScrolled::wxScrolled()` (not implemented in wx)\nconstructor.","ref":"wxHtmlWindow.html#new/2"},{"type":"function","title":"wxHtmlWindow.selectAll/1","doc":"Selects all text in the window.\n\nSee:\n* `selectLine/2`\n\n* `selectWord/2`","ref":"wxHtmlWindow.html#selectAll/1"},{"type":"function","title":"wxHtmlWindow.selectionToText/1","doc":"Returns the current selection as plain text.\n\nReturns an empty string if no text is currently selected.","ref":"wxHtmlWindow.html#selectionToText/1"},{"type":"function","title":"wxHtmlWindow.selectLine/2","doc":"Selects the line of text that `pos` points at.\n\nNote that `pos` is relative to the top of displayed page, not to window's origin, use `wxScrolledWindow:calcUnscrolledPosition/3` to\nconvert physical coordinate.\n\nSee:\n* `selectAll/1`\n\n* `selectWord/2`","ref":"wxHtmlWindow.html#selectLine/2"},{"type":"function","title":"wxHtmlWindow.selectWord/2","doc":"Selects the word at position `pos`.\n\nNote that `pos` is relative to the top of displayed page, not to window's origin, use `wxScrolledWindow:calcUnscrolledPosition/3` to\nconvert physical coordinate.\n\nSee:\n* `selectAll/1`\n\n* `selectLine/2`","ref":"wxHtmlWindow.html#selectWord/2"},{"type":"function","title":"wxHtmlWindow.setBorders/2","doc":"This function sets the space between border of window and HTML contents.\n\nSee image:","ref":"wxHtmlWindow.html#setBorders/2"},{"type":"function","title":"wxHtmlWindow.setFonts/3","doc":"","ref":"wxHtmlWindow.html#setFonts/3"},{"type":"function","title":"wxHtmlWindow.setFonts/4","doc":"This function sets font sizes and faces.\n\nSee `wxHtmlDCRenderer::SetFonts` (not implemented in wx) for detailed description.","ref":"wxHtmlWindow.html#setFonts/4"},{"type":"function","title":"wxHtmlWindow.setPage/2","doc":"Sets the source of a page and displays it, for example:\n\nIf you want to load a document from some location use `loadPage/2` instead.\n\nReturn: false if an error occurred, true otherwise.","ref":"wxHtmlWindow.html#setPage/2"},{"type":"function","title":"wxHtmlWindow.setRelatedFrame/3","doc":"Sets the frame in which page title will be displayed.\n\n`format` is the format of the frame title, e.g. \"HtmlHelp : %s\". It must contain exactly\none s. This s is substituted with HTML page title.","ref":"wxHtmlWindow.html#setRelatedFrame/3"},{"type":"function","title":"wxHtmlWindow.setRelatedStatusBar/2","doc":"`After` calling `setRelatedFrame/3`, this sets statusbar slot where messages will be\ndisplayed.\n\n(Default is -1 = no messages.)","ref":"wxHtmlWindow.html#setRelatedStatusBar/2"},{"type":"function","title":"wxHtmlWindow.setRelatedStatusBar/3","doc":"`Sets` the associated statusbar where messages will be displayed.\n\nCall this instead of `setRelatedFrame/3` if you want statusbar updates only, no changing of the frame title.\n\nSince: 2.9.0","ref":"wxHtmlWindow.html#setRelatedStatusBar/3"},{"type":"function","title":"wxHtmlWindow.toText/1","doc":"Returns content of currently displayed page as plain text.","ref":"wxHtmlWindow.html#toText/1"},{"type":"type","title":"wxHtmlWindow.wxHtmlWindow/0","doc":"","ref":"wxHtmlWindow.html#t:wxHtmlWindow/0"},{"type":"module","title":"wxIcon","doc":"An icon is a small rectangular bitmap usually used for denoting a minimized application.\n\nIt differs from a `m:wxBitmap` in always having a mask associated with it for transparent\ndrawing. On some platforms, icons and bitmaps are implemented identically, since there is\nno real distinction between a `m:wxBitmap` with a mask and an icon; and there is no\nspecific icon format on some platforms (X-based applications usually standardize on XPMs\nfor small bitmaps and icons). However, some platforms (such as Windows) make the\ndistinction, so a separate class is provided.\n\nRemark: It is usually desirable to associate a pertinent icon with a frame. Icons can\nalso be used for other purposes, for example with `m:wxTreeCtrl` and `m:wxListCtrl`. Icons\nhave different formats on different platforms therefore separate icons will usually be\ncreated for the different environments. Platform-specific methods for creating a `m:wxIcon`\nstructure are catered for, and this is an occasion where conditional compilation will\nprobably be required. Note that a new icon must be created for every time the icon is to\nbe used for a new window. In Windows, the icon will not be reloaded if it has already been\nused. An icon allocated to a frame will be deleted when the frame is deleted. For more\ninformation please see overview_bitmap.\n\nPredefined objects (include wx.hrl): ?wxNullIcon\n\nSee:\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap)\n\n* [Overview bitmap](https://docs.wxwidgets.org/3.2/overview_bitmap.html#overview_bitmap_supportedformats)\n\n* `m:wxIconBundle`\n\n* `wxDC:drawIcon/3`\n\n* `m:wxCursor`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxIcon](https://docs.wxwidgets.org/3.2/classwx_icon.html)","ref":"wxIcon.html"},{"type":"function","title":"wxIcon.copyFromBitmap/2","doc":"Copies `bmp` bitmap to this icon.\n\nUnder MS Windows the bitmap must have mask colour set.\n\nSee: `wxBitmap:loadFile/3`","ref":"wxIcon.html#copyFromBitmap/2"},{"type":"function","title":"wxIcon.destroy/1","doc":"Destroys the object","ref":"wxIcon.html#destroy/1"},{"type":"function","title":"wxIcon.new/0","doc":"Default ctor.\n\nConstructs an icon object with no data; an assignment or another member function such as `wxBitmap:loadFile/3`\nmust be called subsequently.","ref":"wxIcon.html#new/0"},{"type":"function","title":"wxIcon.new/1","doc":"Copy ctor.","ref":"wxIcon.html#new/1"},{"type":"function","title":"wxIcon.new/2","doc":"Loads an icon from a file or resource.\n\nSee: `wxBitmap:loadFile/3`","ref":"wxIcon.html#new/2"},{"type":"type","title":"wxIcon.wxIcon/0","doc":"","ref":"wxIcon.html#t:wxIcon/0"},{"type":"module","title":"wxIconBundle","doc":"This class contains multiple copies of an icon in different sizes.\n\nIt is typically used in `wxDialog::SetIcons` (not implemented in wx) and `wxTopLevelWindow:setIcons/2`.\n\nPredefined objects (include wx.hrl): ?wxNullIconBundle\n\nwxWidgets docs: [wxIconBundle](https://docs.wxwidgets.org/3.2/classwx_icon_bundle.html)","ref":"wxIconBundle.html"},{"type":"function","title":"wxIconBundle.addIcon/2","doc":"Adds the icon to the collection; if the collection already contains an icon with the same\nwidth and height, it is replaced by the new one.","ref":"wxIconBundle.html#addIcon/2"},{"type":"function","title":"wxIconBundle.addIcon/3","doc":"","ref":"wxIconBundle.html#addIcon/3"},{"type":"function","title":"wxIconBundle.destroy/1","doc":"Destroys the object","ref":"wxIconBundle.html#destroy/1"},{"type":"function","title":"wxIconBundle.getIcon/1","doc":"","ref":"wxIconBundle.html#getIcon/1"},{"type":"function","title":"wxIconBundle.getIcon/2","doc":"Same as.\n\n.","ref":"wxIconBundle.html#getIcon/2"},{"type":"function","title":"wxIconBundle.getIcon/3","doc":"Returns the icon with the given size.\n\nIf `size` is ?wxDefaultSize, it is interpreted as the standard system icon size, i.e. the\nsize returned by `wxSystemSettings:getMetric/2` for `wxSYS_ICON_X` and `wxSYS_ICON_Y`.\n\nIf the bundle contains an icon with exactly the requested size, it's always returned.\nOtherwise, the behaviour depends on the flags. If only `wxIconBundle::FALLBACK_NONE` (not\nimplemented in wx) is given, the function returns an invalid icon. If `wxIconBundle::FALLBACK_SYSTEM`\n(not implemented in wx) is given, it tries to find the icon of standard system size,\nregardless of the size passed as parameter. Otherwise, or if the icon system size is not\nfound neither, but `wxIconBundle::FALLBACK_NEAREST_LARGER` (not implemented in wx) flag is\nspecified, the function returns the smallest icon of the size larger than the requested\none or, if this fails too, just the icon closest to the specified size.\n\nThe `flags` parameter is available only since wxWidgets 2.9.4.","ref":"wxIconBundle.html#getIcon/3"},{"type":"function","title":"wxIconBundle.new/0","doc":"Default ctor.","ref":"wxIconBundle.html#new/0"},{"type":"function","title":"wxIconBundle.new/1","doc":"Initializes the bundle with the icon(s) found in the file.","ref":"wxIconBundle.html#new/1"},{"type":"function","title":"wxIconBundle.new/2","doc":"","ref":"wxIconBundle.html#new/2"},{"type":"type","title":"wxIconBundle.wxIconBundle/0","doc":"","ref":"wxIconBundle.html#t:wxIconBundle/0"},{"type":"module","title":"wxIconizeEvent","doc":"An event being sent when the frame is iconized (minimized) or restored.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxTopLevelWindow:iconize/2`\n\n* `wxTopLevelWindow:isIconized/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxIconizeEvent](https://docs.wxwidgets.org/3.2/classwx_iconize_event.html)","ref":"wxIconizeEvent.html"},{"type":"module","title":"Events - wxIconizeEvent","doc":"Use `wxEvtHandler:connect/3` with `wxIconizeEventType` to subscribe to events of this type.","ref":"wxIconizeEvent.html#module-events"},{"type":"function","title":"wxIconizeEvent.isIconized/1","doc":"Returns true if the frame has been iconized, false if it has been restored.","ref":"wxIconizeEvent.html#isIconized/1"},{"type":"type","title":"wxIconizeEvent.wxIconize/0","doc":"","ref":"wxIconizeEvent.html#t:wxIconize/0"},{"type":"type","title":"wxIconizeEvent.wxIconizeEvent/0","doc":"","ref":"wxIconizeEvent.html#t:wxIconizeEvent/0"},{"type":"type","title":"wxIconizeEvent.wxIconizeEventType/0","doc":"","ref":"wxIconizeEvent.html#t:wxIconizeEventType/0"},{"type":"module","title":"wxIdleEvent","doc":"This class is used for idle events, which are generated when the system becomes idle.\n\nNote that, unless you do something specifically, the idle events are not sent if the\nsystem remains idle once it has become it, e.g. only a single idle event will be generated\nuntil something else resulting in more normal events happens and only then is the next\nidle event sent again.\n\nIf you need to ensure a continuous stream of idle events, you can either use `requestMore/2` method in\nyour handler or call ?wxWakeUpIdle() periodically (for example from a timer event\nhandler), but note that both of these approaches (and especially the first one) increase\nthe system load and so should be avoided if possible.\n\nBy default, idle events are sent to all windows, including even the hidden ones because\nthey may be shown if some condition is met from their `wxEVT_IDLE` (or related `wxEVT_UPDATE_UI`)\nhandler. The children of hidden windows do not receive idle events however as they can't\nchange their state in any way noticeable by the user. Finally, the global `wxApp` (not\nimplemented in wx) object also receives these events, as usual, so it can be used for any\nglobal idle time processing.\n\nIf sending idle events to all windows is causing a significant overhead in your\napplication, you can call `setMode/1` with the value wxIDLE_PROCESS_SPECIFIED, and set the\nwxWS_EX_PROCESS_IDLE extra window style for every window which should receive idle events,\nall the other ones will not receive them in this case.\n\nDelayed Action Mechanism\n\n`m:wxIdleEvent` can be used to perform some action \"at slightly later time\". This can be\nnecessary in several circumstances when, for whatever reason, something can't be done in\nthe current event handler. For example, if a mouse event handler is called with the mouse\nbutton pressed, the mouse can be currently captured and some operations with it - notably\ncapturing it again - might be impossible or lead to undesirable results. If you still want\nto capture it, you can do it from `wxEVT_IDLE` handler when it is called the next time\ninstead of doing it immediately.\n\nThis can be achieved in two different ways: when using static event tables, you will need\na flag indicating to the (always connected) idle event handler whether the desired action\nshould be performed. The originally called handler would then set it to indicate that it\nshould indeed be done and the idle handler itself would reset it to prevent it from doing\nthe same action again.\n\nUsing dynamically connected event handlers things are even simpler as the original event\nhandler can simply `wxEvtHandler::Connect()` (not implemented in wx) or `wxEvtHandler::Bind()`\n(not implemented in wx) the idle event handler which would only be executed then and\ncould `wxEvtHandler::Disconnect()` (not implemented in wx) or `wxEvtHandler::Unbind()`\n(not implemented in wx) itself.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxUpdateUIEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxIdleEvent](https://docs.wxwidgets.org/3.2/classwx_idle_event.html)","ref":"wxIdleEvent.html"},{"type":"module","title":"Events - wxIdleEvent","doc":"Use `wxEvtHandler:connect/3` with `wxIdleEventType` to subscribe to events of this type.","ref":"wxIdleEvent.html#module-events"},{"type":"function","title":"wxIdleEvent.getMode/0","doc":"Static function returning a value specifying how wxWidgets will send idle events: to all\nwindows, or only to those which specify that they will process the events.\n\nSee: `setMode/1`","ref":"wxIdleEvent.html#getMode/0"},{"type":"function","title":"wxIdleEvent.moreRequested/1","doc":"Returns true if the OnIdle function processing this event requested more processing time.\n\nSee: `requestMore/2`","ref":"wxIdleEvent.html#moreRequested/1"},{"type":"function","title":"wxIdleEvent.requestMore/1","doc":"","ref":"wxIdleEvent.html#requestMore/1"},{"type":"function","title":"wxIdleEvent.requestMore/2","doc":"Tells wxWidgets that more processing is required.\n\nThis function can be called by an OnIdle handler for a window or window event handler to\nindicate that wxApp::OnIdle should forward the OnIdle event once more to the application windows.\n\nIf no window calls this function during OnIdle, then the application will remain in a\npassive event loop (not calling OnIdle) until a new event is posted to the application by\nthe windowing system.\n\nSee: `moreRequested/1`","ref":"wxIdleEvent.html#requestMore/2"},{"type":"function","title":"wxIdleEvent.setMode/1","doc":"Static function for specifying how wxWidgets will send idle events: to all windows, or\nonly to those which specify that they will process the events.","ref":"wxIdleEvent.html#setMode/1"},{"type":"type","title":"wxIdleEvent.wxIdle/0","doc":"","ref":"wxIdleEvent.html#t:wxIdle/0"},{"type":"type","title":"wxIdleEvent.wxIdleEvent/0","doc":"","ref":"wxIdleEvent.html#t:wxIdleEvent/0"},{"type":"type","title":"wxIdleEvent.wxIdleEventType/0","doc":"","ref":"wxIdleEvent.html#t:wxIdleEventType/0"},{"type":"module","title":"wxImage","doc":"This class encapsulates a platform-independent image.\n\nAn image can be created from data, or using `wxBitmap:convertToImage/1`. An image can be loaded from a file in a\nvariety of formats, and is extensible to new formats via image format handlers. Functions\nare available to set and get image bits, so it can be used for basic image manipulation.\n\nA `m:wxImage` cannot (currently) be drawn directly to a `m:wxDC`. Instead, a\nplatform-specific `m:wxBitmap` object must be created from it using the\nwxBitmap::wxBitmap(wxImage,int depth) constructor. This bitmap can then be drawn in a\ndevice context, using `wxDC:drawBitmap/4`.\n\nMore on the difference between `m:wxImage` and `m:wxBitmap`: `m:wxImage` is just a buffer\nof RGB bytes with an optional buffer for the alpha bytes. It is all generic, platform\nindependent and image file format independent code. It includes generic code for scaling,\nresizing, clipping, and other manipulations of the image data. OTOH, `m:wxBitmap` is\nintended to be a wrapper of whatever is the native image format that is quickest/easiest\nto draw to a DC or to be the target of the drawing operations performed on a `m:wxMemoryDC`.\nBy splitting the responsibilities between wxImage/wxBitmap like this then it's easier to\nuse generic code shared by all platforms and image types for generic operations and\nplatform specific code where performance or compatibility is needed.\n\nOne colour value of the image may be used as a mask colour which will lead to the\nautomatic creation of a `m:wxMask` object associated to the bitmap object.\n\nAlpha channel support\n\nStarting from wxWidgets 2.5.0 `m:wxImage` supports alpha channel data, that is in\naddition to a byte for the red, green and blue colour components for each pixel it also\nstores a byte representing the pixel opacity.\n\nAn alpha value of 0 corresponds to a transparent pixel (null opacity) while a value of\n255 means that the pixel is 100% opaque. The constants ?wxIMAGE\\_ALPHA\\_TRANSPARENT and\n?wxIMAGE\\_ALPHA\\_OPAQUE can be used to indicate those values in a more readable form.\n\nWhile all images have RGB data, not all images have an alpha channel. Before using `getAlpha/3` you\nshould check if this image contains an alpha channel with `hasAlpha/1`. Currently the BMP, PNG, TGA,\nand TIFF format handlers have full alpha channel support for loading so if you want to use\nalpha you have to use one of these formats. If you initialize the image alpha channel\nyourself using `setAlpha/4`, you should save it in either PNG, TGA, or TIFF format to avoid losing it\nas these are the only handlers that currently support saving with alpha.\n\nAvailable image handlers\n\nThe following image handlers are available. wxBMPHandler is always installed by default.\nTo use other image formats, install the appropriate handler with `wxImage::AddHandler`\n(not implemented in wx) or call ?wxInitAllImageHandlers().\n\n* wxBMPHandler: For loading (including alpha support) and saving, always installed.\n\n* `wxPNGHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxJPEGHandler` (not implemented in wx): For loading and saving.\n\n* `wxGIFHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxPCXHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxPNMHandler` (not implemented in wx): For loading and saving (see below).\n\n* `wxTIFFHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxTGAHandler` (not implemented in wx): For loading and saving. Includes alpha support.\n\n* `wxIFFHandler` (not implemented in wx): For loading only.\n\n* `wxXPMHandler` (not implemented in wx): For loading and saving.\n\n* wxICOHandler: For loading and saving.\n\n* wxCURHandler: For loading and saving.\n\n* wxANIHandler: For loading only.\n\nWhen saving in PCX format, `wxPCXHandler` (not implemented in wx) will count the number\nof different colours in the image; if there are 256 or less colours, it will save as 8\nbit, else it will save as 24 bit.\n\nLoading PNMs only works for ASCII or raw RGB images. When saving in PNM format, `wxPNMHandler`\n(not implemented in wx) will always save as raw RGB.\n\nSaving GIFs requires images of maximum 8 bpp (see `wxQuantize` (not implemented in wx)),\nand the alpha channel converted to a mask (see `convertAlphaToMask/5`). Saving an animated GIF requires images of\nthe same size (see `wxGIFHandler::SaveAnimation` (not implemented in wx))\n\nPredefined objects (include wx.hrl): ?wxNullImage\n\nSee:\n* `m:wxBitmap`\n\n* ?wxInitAllImageHandlers()\n\nwxWidgets docs: [wxImage](https://docs.wxwidgets.org/3.2/classwx_image.html)","ref":"wxImage.html"},{"type":"function","title":"wxImage.blur/2","doc":"Blurs the image in both horizontal and vertical directions by the specified pixel `blurRadius`.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blurHorizontal/2`\n\n* `blurVertical/2`","ref":"wxImage.html#blur/2"},{"type":"function","title":"wxImage.blurHorizontal/2","doc":"Blurs the image in the horizontal direction only.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blur/2`\n\n* `blurVertical/2`","ref":"wxImage.html#blurHorizontal/2"},{"type":"function","title":"wxImage.blurVertical/2","doc":"Blurs the image in the vertical direction only.\n\nThis should not be used when using a single mask colour for transparency.\n\nSee:\n* `blur/2`\n\n* `blurHorizontal/2`","ref":"wxImage.html#blurVertical/2"},{"type":"function","title":"wxImage.convertAlphaToMask/1","doc":"","ref":"wxImage.html#convertAlphaToMask/1"},{"type":"function","title":"wxImage.convertAlphaToMask/2","doc":"If the image has alpha channel, this method converts it to mask.\n\nIf the image has an alpha channel, all pixels with alpha value less than `threshold` are\nreplaced with the mask colour and the alpha channel is removed. Otherwise nothing is done.\n\nThe mask colour is chosen automatically using `findFirstUnusedColour/2`, see the overload below if this is not appropriate.\n\nReturn: Returns true on success, false on error.","ref":"wxImage.html#convertAlphaToMask/2"},{"type":"function","title":"wxImage.convertAlphaToMask/4","doc":"","ref":"wxImage.html#convertAlphaToMask/4"},{"type":"function","title":"wxImage.convertAlphaToMask/5","doc":"If the image has alpha channel, this method converts it to mask using the specified\ncolour as the mask colour.\n\nIf the image has an alpha channel, all pixels with alpha value less than `threshold` are\nreplaced with the mask colour and the alpha channel is removed. Otherwise nothing is done.\n\nSince: 2.9.0\n\nReturn: Returns true on success, false on error.","ref":"wxImage.html#convertAlphaToMask/5"},{"type":"function","title":"wxImage.convertToGreyscale/1","doc":"Returns a greyscale version of the image.\n\nSince: 2.9.0","ref":"wxImage.html#convertToGreyscale/1"},{"type":"function","title":"wxImage.convertToGreyscale/4","doc":"Returns a greyscale version of the image.\n\nThe returned image uses the luminance component of the original to calculate the\ngreyscale. Defaults to using the standard ITU-T BT.601 when converting to YUV, where every\npixel equals (R * `weight_r`) + (G * `weight_g`) + (B * `weight_b`).","ref":"wxImage.html#convertToGreyscale/4"},{"type":"function","title":"wxImage.convertToMono/4","doc":"Returns monochromatic version of the image.\n\nThe returned image has white colour where the original has (r,g,b) colour and black\ncolour everywhere else.","ref":"wxImage.html#convertToMono/4"},{"type":"function","title":"wxImage.copy/1","doc":"Returns an identical copy of this image.","ref":"wxImage.html#copy/1"},{"type":"function","title":"wxImage.create/2","doc":"","ref":"wxImage.html#create/2"},{"type":"function","title":"wxImage.create/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxImage.html#create/3"},{"type":"function","title":"wxImage.create/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxImage.html#create/4"},{"type":"function","title":"wxImage.create/5","doc":"Creates a fresh image.\n\nSee `new/4` for more info.\n\nReturn: true if the call succeeded, false otherwise.","ref":"wxImage.html#create/5"},{"type":"function","title":"wxImage.Destroy/1","doc":"Destroys the image data.","ref":"wxImage.html#Destroy/1"},{"type":"function","title":"wxImage.destroy/1","doc":"Destroys the object","ref":"wxImage.html#destroy/1"},{"type":"function","title":"wxImage.findFirstUnusedColour/1","doc":"","ref":"wxImage.html#findFirstUnusedColour/1"},{"type":"function","title":"wxImage.findFirstUnusedColour/2","doc":"Finds the first colour that is never used in the image.\n\nThe search begins at given initial colour and continues by increasing R, G and B\ncomponents (in this order) by 1 until an unused colour is found or the colour space exhausted.\n\nThe parameters `r`, `g`, `b` are pointers to variables to save the colour.\n\nThe parameters `startR`, `startG`, `startB` define the initial values of the colour. The\nreturned colour will have RGB values equal to or greater than these.\n\nReturn: Returns false if there is no unused colour left, true on success.\n\nNote: This method involves computing the histogram, which is a computationally intensive\noperation.","ref":"wxImage.html#findFirstUnusedColour/2"},{"type":"function","title":"wxImage.getAlpha/1","doc":"Returns pointer to the array storing the alpha values for this image.\n\nThis pointer is NULL for the images without the alpha channel. If the image does have it,\nthis pointer may be used to directly manipulate the alpha values which are stored as the\nRGB ones.","ref":"wxImage.html#getAlpha/1"},{"type":"function","title":"wxImage.getAlpha/3","doc":"Return alpha value at given pixel location.","ref":"wxImage.html#getAlpha/3"},{"type":"function","title":"wxImage.getBlue/3","doc":"Returns the blue intensity at the given coordinate.","ref":"wxImage.html#getBlue/3"},{"type":"function","title":"wxImage.getData/1","doc":"Returns the image data as an array.\n\nThis is most often used when doing direct image manipulation. The return value points to\nan array of characters in RGBRGBRGB... format in the top-to-bottom, left-to-right order,\nthat is the first RGB triplet corresponds to the first pixel of the first row, the second\none - to the second pixel of the first row and so on until the end of the first row, with\nsecond row following after it and so on.\n\nYou should not delete the returned pointer nor pass it to `setData/4`.","ref":"wxImage.html#getData/1"},{"type":"function","title":"wxImage.getGreen/3","doc":"Returns the green intensity at the given coordinate.","ref":"wxImage.html#getGreen/3"},{"type":"function","title":"wxImage.getHeight/1","doc":"Gets the height of the image in pixels.\n\nSee: `getWidth/1`","ref":"wxImage.html#getHeight/1"},{"type":"function","title":"wxImage.getImageCount/1","doc":"","ref":"wxImage.html#getImageCount/1"},{"type":"function","title":"wxImage.getImageCount/2","doc":"If the image file contains more than one image and the image handler is capable of\nretrieving these individually, this function will return the number of available images.\n\nFor the overload taking the parameter `filename`, that's the name of the file to query.\nFor the overload taking the parameter `stream`, that's the opened input stream with image data.\n\nSee `wxImageHandler::GetImageCount()` (not implemented in wx) for more info.\n\nThe parameter `type` may be one of the following values:\n\n* wxBITMAP_TYPE_BMP: Load a Windows bitmap file.\n\n* wxBITMAP_TYPE_GIF: Load a GIF bitmap file.\n\n* wxBITMAP_TYPE_JPEG: Load a JPEG bitmap file.\n\n* wxBITMAP_TYPE_PNG: Load a PNG bitmap file.\n\n* wxBITMAP_TYPE_PCX: Load a PCX bitmap file.\n\n* wxBITMAP_TYPE_PNM: Load a PNM bitmap file.\n\n* wxBITMAP_TYPE_TIFF: Load a TIFF bitmap file.\n\n* wxBITMAP_TYPE_TGA: Load a TGA bitmap file.\n\n* wxBITMAP_TYPE_XPM: Load a XPM bitmap file.\n\n* wxBITMAP_TYPE_ICO: Load a Windows icon file (ICO).\n\n* wxBITMAP_TYPE_CUR: Load a Windows cursor file (CUR).\n\n* wxBITMAP_TYPE_ANI: Load a Windows animated cursor file (ANI).\n\n* wxBITMAP_TYPE_ANY: Will try to autodetect the format.\n\nReturn: Number of available images. For most image handlers, this is 1 (exceptions are\nTIFF and ICO formats as well as animated GIFs for which this function returns the number\nof frames in the animation).","ref":"wxImage.html#getImageCount/2"},{"type":"function","title":"wxImage.getImageExtWildcard/0","doc":"Iterates all registered `wxImageHandler` (not implemented in wx) objects, and returns a\nstring containing file extension masks suitable for passing to file open/save dialog\nboxes.\n\nReturn: The format of the returned string is `\"(*.ext1;*.ext2)|*.ext1;*.ext2\"`. It is\nusually a good idea to prepend a description before passing the result to the dialog.\nExample:","ref":"wxImage.html#getImageExtWildcard/0"},{"type":"function","title":"wxImage.getMaskBlue/1","doc":"Gets the blue value of the mask colour.","ref":"wxImage.html#getMaskBlue/1"},{"type":"function","title":"wxImage.getMaskGreen/1","doc":"Gets the green value of the mask colour.","ref":"wxImage.html#getMaskGreen/1"},{"type":"function","title":"wxImage.getMaskRed/1","doc":"Gets the red value of the mask colour.","ref":"wxImage.html#getMaskRed/1"},{"type":"function","title":"wxImage.getOption/2","doc":"Gets a user-defined string-valued option.\n\nGeneric options:\n\n* `wxIMAGE_OPTION_FILENAME:` The name of the file from which the image was loaded.\n\nOptions specific to `wxGIFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_GIF_COMMENT:` The comment text that is read from or written to the GIF\nfile. In an animated GIF each frame can have its own comment. If there is only a comment\nin the first frame of a GIF it will not be repeated in other frames.\n\nReturn: The value of the option or an empty string if not found. Use `hasOption/2` if an empty string\ncan be a valid option value.\n\nSee:\n* `setOption/3`\n\n* `getOptionInt/2`\n\n* `hasOption/2`","ref":"wxImage.html#getOption/2"},{"type":"function","title":"wxImage.getOptionInt/2","doc":"Gets a user-defined integer-valued option.\n\nThe function is case-insensitive to `name`. If the given option is not present, the\nfunction returns 0. Use `hasOption/2` if 0 is a possibly valid value for the option.\n\nGeneric options:\n\n* `wxIMAGE_OPTION_MAX_WIDTH` and `wxIMAGE_OPTION_MAX_HEIGHT:` If either of these options is\nspecified, the loaded image will be scaled down (preserving its aspect ratio) so that its\nwidth is less than the max width given if it is not 0 `and` its height is less than the\nmax height given if it is not 0. This is typically used for loading thumbnails and the\nadvantage of using these options compared to calling `rescale/4` after loading is that some handlers\n(only JPEG one right now) support rescaling the image during loading which is vastly more\nefficient than loading the entire huge image and rescaling it later (if these options are\nnot supported by the handler, this is still what happens however). These options must be\nset before calling `loadFile/4` to have any effect.\n\n* `wxIMAGE_OPTION_ORIGINAL_WIDTH` and `wxIMAGE_OPTION_ORIGINAL_HEIGHT:` These options will\nreturn the original size of the image if either `wxIMAGE_OPTION_MAX_WIDTH` or `wxIMAGE_OPTION_MAX_HEIGHT`\nis specified.\n\nSince: 2.9.3\n\n* `wxIMAGE_OPTION_QUALITY:` JPEG quality used when saving. This is an integer in 0..100\nrange with 0 meaning very poor and 100 excellent (but very badly compressed). This option\nis currently ignored for the other formats.\n\n* `wxIMAGE_OPTION_RESOLUTIONUNIT:` The value of this option determines whether the\nresolution of the image is specified in centimetres or inches, see wxImageResolution enum elements.\n\n* `wxIMAGE_OPTION_RESOLUTION`, `wxIMAGE_OPTION_RESOLUTIONX` and `wxIMAGE_OPTION_RESOLUTIONY:`\nThese options define the resolution of the image in the units corresponding to `wxIMAGE_OPTION_RESOLUTIONUNIT`\noptions value. The first option can be set before saving the image to set both horizontal\nand vertical resolution to the same value. The X and Y options are set by the image\nhandlers if they support the image resolution (currently BMP, JPEG and TIFF handlers do)\nand the image provides the resolution information and can be queried after loading the image.\n\nOptions specific to `wxPNGHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_PNG_FORMAT:` Format for saving a PNG file, see wxImagePNGType for the\nsupported values.\n\n* `wxIMAGE_OPTION_PNG_BITDEPTH:` Bit depth for every channel (R/G/B/A).\n\n* `wxIMAGE_OPTION_PNG_FILTER:` Filter for saving a PNG file, see libpng ([http://www.libpng.org/pub/png/libpng-1.2.5-manual.html](http://www.libpng.org/pub/png/libpng-1.2.5-manual.html))\nfor possible values (e.g. PNG_FILTER_NONE, PNG_FILTER_SUB, PNG_FILTER_UP, etc).\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL:` Compression level (0..9) for saving a PNG file.\nAn high value creates smaller-but-slower PNG file. Note that unlike other formats (e.g.\nJPEG) the PNG format is always lossless and thus this compression level doesn't tradeoff\nthe image quality.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_MEM_LEVEL:` Compression memory usage level (1..9) for\nsaving a PNG file. An high value means the saving process consumes more memory, but may\ncreate smaller PNG file.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY:` Possible values are 0 for default strategy, 1\nfor filter, and 2 for Huffman-only. You can use OptiPNG ([http://optipng.sourceforge.net/](http://optipng.sourceforge.net/))\nto get a suitable value for your application.\n\n* `wxIMAGE_OPTION_PNG_COMPRESSION_BUFFER_SIZE:` Internal buffer size (in bytes) for saving\na PNG file. Ideally this should be as big as the resulting PNG file. Use this option if\nyour application produces images with small size variation.\n\nOptions specific to `wxTIFFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE:` Number of bits per sample (channel). Currently\nvalues of 1 and 8 are supported. A value of 1 results in a black and white image. A value\nof 8 (the default) can mean greyscale or RGB, depending on the value of `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL`.\n\n* `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL:` Number of samples (channels) per pixel. Currently\nvalues of 1 and 3 are supported. A value of 1 results in either a greyscale (by default)\nor black and white image, depending on the value of `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE`. A\nvalue of 3 (the default) will result in an RGB image.\n\n* `wxIMAGE_OPTION_TIFF_COMPRESSION:` Compression type. By default it is set to 1\n(COMPRESSION_NONE). Typical other values are 5 (COMPRESSION_LZW) and 7 (COMPRESSION_JPEG).\nSee tiff.h for more options.\n\n* `wxIMAGE_OPTION_TIFF_PHOTOMETRIC:` Specifies the photometric interpretation. By default\nit is set to 2 (PHOTOMETRIC_RGB) for RGB images and 0 (PHOTOMETRIC_MINISWHITE) for\ngreyscale or black and white images. It can also be set to 1 (PHOTOMETRIC_MINISBLACK) to\ntreat the lowest value as black and highest as white. If you want a greyscale image it is\nalso sufficient to only specify `wxIMAGE_OPTION_TIFF_PHOTOMETRIC` and set it to either\nPHOTOMETRIC_MINISWHITE or PHOTOMETRIC_MINISBLACK. The other values are taken care of.\n\nOptions specific to `wxGIFHandler` (not implemented in wx):\n\n* `wxIMAGE_OPTION_GIF_TRANSPARENCY:` How to deal with transparent pixels. By default, the\ncolor of transparent pixels is changed to bright pink, so that if the image is\naccidentally drawn without transparency, it will be obvious. Normally, this would not be\nnoticed, as these pixels will not be rendered. But in some cases it might be useful to\nload a GIF without making any modifications to its colours. Use `wxIMAGE_OPTION_GIF_TRANSPARENCY_UNCHANGED`\nto keep the colors correct. Use `wxIMAGE_OPTION_GIF_TRANSPARENCY_HIGHLIGHT` to convert\ntransparent pixels to pink (default). This option has been added in wxWidgets 3.1.1.\n\nNote: Be careful when combining the options `wxIMAGE_OPTION_TIFF_SAMPLESPERPIXEL`, `wxIMAGE_OPTION_TIFF_BITSPERSAMPLE`,\nand `wxIMAGE_OPTION_TIFF_PHOTOMETRIC`. While some measures are taken to prevent illegal\ncombinations and/or values, it is still easy to abuse them and come up with invalid\nresults in the form of either corrupted images or crashes.\n\nReturn: The value of the option or 0 if not found. Use `hasOption/2` if 0 can be a valid option value.\n\nSee:\n* `setOption/3`\n\n* `getOption/2`","ref":"wxImage.html#getOptionInt/2"},{"type":"function","title":"wxImage.getOrFindMaskColour/1","doc":"Get the current mask colour or find a suitable unused colour that could be used as a mask\ncolour.\n\nReturns true if the image currently has a mask.","ref":"wxImage.html#getOrFindMaskColour/1"},{"type":"function","title":"wxImage.getPalette/1","doc":"Returns the palette associated with the image.\n\nCurrently the palette is only used when converting to `m:wxBitmap` under Windows.\n\nSome of the `m:wxImage` handlers have been modified to set the palette if one exists in\nthe image file (usually 256 or less colour images in GIF or PNG format).","ref":"wxImage.html#getPalette/1"},{"type":"function","title":"wxImage.getRed/3","doc":"Returns the red intensity at the given coordinate.","ref":"wxImage.html#getRed/3"},{"type":"function","title":"wxImage.getSubImage/2","doc":"Returns a sub image of the current one as long as the rect belongs entirely to the image.","ref":"wxImage.html#getSubImage/2"},{"type":"function","title":"wxImage.getWidth/1","doc":"Gets the width of the image in pixels.\n\nSee: `getHeight/1`","ref":"wxImage.html#getWidth/1"},{"type":"function","title":"wxImage.hasAlpha/1","doc":"Returns true if this image has alpha channel, false otherwise.\n\nSee:\n* `getAlpha/3`\n\n* `setAlpha/4`","ref":"wxImage.html#hasAlpha/1"},{"type":"function","title":"wxImage.hasMask/1","doc":"Returns true if there is a mask active, false otherwise.","ref":"wxImage.html#hasMask/1"},{"type":"function","title":"wxImage.hasOption/2","doc":"Returns true if the given option is present.\n\nThe function is case-insensitive to `name`.\n\nThe lists of the currently supported options are in `getOption/2` and `getOptionInt/2` function docs.\n\nSee:\n* `setOption/3`\n\n* `getOption/2`\n\n* `getOptionInt/2`","ref":"wxImage.html#hasOption/2"},{"type":"function","title":"wxImage.initAlpha/1","doc":"Initializes the image alpha channel data.\n\nIt is an error to call it if the image already has alpha data. If it doesn't, alpha data\nwill be by default initialized to all pixels being fully opaque. But if the image has a\nmask colour, all mask pixels will be completely transparent.","ref":"wxImage.html#initAlpha/1"},{"type":"function","title":"wxImage.initStandardHandlers/0","doc":"Internal use only.\n\nAdds standard image format handlers. It only install wxBMPHandler for the time being,\nwhich is used by `m:wxBitmap`.\n\nThis function is called by wxWidgets on startup, and shouldn't be called by the user.\n\nSee: ?wxInitAllImageHandlers()","ref":"wxImage.html#initStandardHandlers/0"},{"type":"function","title":"wxImage.isOk/1","doc":"Returns true if image data is present.","ref":"wxImage.html#isOk/1"},{"type":"function","title":"wxImage.isTransparent/3","doc":"","ref":"wxImage.html#isTransparent/3"},{"type":"function","title":"wxImage.isTransparent/4","doc":"Returns true if the given pixel is transparent, i.e. either has the mask colour if this\nimage has a mask or if this image has alpha channel and alpha value of this pixel is\nstrictly less than `threshold`.","ref":"wxImage.html#isTransparent/4"},{"type":"function","title":"wxImage.loadFile/2","doc":"","ref":"wxImage.html#loadFile/2"},{"type":"function","title":"wxImage.loadFile/3","doc":"Loads an image from a file.\n\nIf no handler type is provided, the library will try to autodetect the format.","ref":"wxImage.html#loadFile/3"},{"type":"function","title":"wxImage.loadFile/4","doc":"Loads an image from a file.\n\nIf no handler type is provided, the library will try to autodetect the format.","ref":"wxImage.html#loadFile/4"},{"type":"function","title":"wxImage.mirror/1","doc":"","ref":"wxImage.html#mirror/1"},{"type":"function","title":"wxImage.mirror/2","doc":"Returns a mirrored copy of the image.\n\nThe parameter `horizontally` indicates the orientation.","ref":"wxImage.html#mirror/2"},{"type":"function","title":"wxImage.new/0","doc":"Creates an empty `m:wxImage` object without an alpha channel.","ref":"wxImage.html#new/0"},{"type":"function","title":"wxImage.new/1","doc":"Equivalent to: `new/2`","ref":"wxImage.html#new/1"},{"type":"function","title":"wxImage.new/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxImage.html#new/2"},{"type":"function","title":"wxImage.new/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxImage.html#new/3"},{"type":"function","title":"wxImage.new/4","doc":"Creates an image from data in memory.\n\nIf `static_data` is false then the `m:wxImage` will take ownership of the data and free\nit afterwards. For this, it has to be allocated with `malloc`.","ref":"wxImage.html#new/4"},{"type":"function","title":"wxImage.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxImage.html#ok/1"},{"type":"function","title":"wxImage.removeHandler/1","doc":"Finds the handler with the given name, and removes it.\n\nThe handler is also deleted.\n\nReturn: true if the handler was found and removed, false otherwise.","ref":"wxImage.html#removeHandler/1"},{"type":"function","title":"wxImage.replace/7","doc":"Replaces the colour specified by `r1`,g1,b1 by the colour `r2`,g2,b2.","ref":"wxImage.html#replace/7"},{"type":"function","title":"wxImage.rescale/3","doc":"","ref":"wxImage.html#rescale/3"},{"type":"function","title":"wxImage.rescale/4","doc":"Changes the size of the image in-place by scaling it: after a call to this function,the\nimage will have the given width and height.\n\nFor a description of the `quality` parameter, see the `scale/4` function. Returns the (modified)\nimage itself.\n\nSee: `scale/4`","ref":"wxImage.html#rescale/4"},{"type":"function","title":"wxImage.resize/3","doc":"","ref":"wxImage.html#resize/3"},{"type":"function","title":"wxImage.resize/4","doc":"Changes the size of the image in-place without scaling it by adding either a border with\nthe given colour or cropping as necessary.\n\nThe image is pasted into a new image with the given `size` and background colour at the\nposition `pos` relative to the upper left of the new image.\n\nIf `red` = green = blue = -1 then use either the current mask colour if set or find, use,\nand set a suitable mask colour for any newly exposed areas.\n\nReturn: The (modified) image itself.\n\nSee: `size/4`","ref":"wxImage.html#resize/4"},{"type":"function","title":"wxImage.rotate90/1","doc":"","ref":"wxImage.html#rotate90/1"},{"type":"function","title":"wxImage.rotate90/2","doc":"Returns a copy of the image rotated 90 degrees in the direction indicated by `clockwise`.","ref":"wxImage.html#rotate90/2"},{"type":"function","title":"wxImage.rotate/3","doc":"","ref":"wxImage.html#rotate/3"},{"type":"function","title":"wxImage.rotate/4","doc":"Rotates the image about the given point, by `angle` radians.\n\nPassing true to `interpolating` results in better image quality, but is slower.\n\nIf the image has a mask, then the mask colour is used for the uncovered pixels in the\nrotated image background. Else, black (rgb 0, 0, 0) will be used.\n\nReturns the rotated image, leaving this image intact.","ref":"wxImage.html#rotate/4"},{"type":"function","title":"wxImage.rotateHue/2","doc":"Rotates the hue of each pixel in the image by `angle`, which is a double in the range of\n-1.0 to +1.0, where -1.0 corresponds to -360 degrees and +1.0 corresponds to +360 degrees.","ref":"wxImage.html#rotateHue/2"},{"type":"function","title":"wxImage.saveFile/2","doc":"Saves an image in the named file.\n\nFile type is determined from the extension of the file name. Note that this function may\nfail if the extension is not recognized! You can use one of the forms above to save images\nto files with non-standard extensions.","ref":"wxImage.html#saveFile/2"},{"type":"function","title":"wxImage.saveFile/3","doc":"Saves an image in the named file.","ref":"wxImage.html#saveFile/3"},{"type":"function","title":"wxImage.scale/3","doc":"","ref":"wxImage.html#scale/3"},{"type":"function","title":"wxImage.scale/4","doc":"Returns a scaled version of the image.\n\nThis is also useful for scaling bitmaps in general as the only other way to scale bitmaps\nis to blit a `m:wxMemoryDC` into another `m:wxMemoryDC`.\n\nThe parameter `quality` determines what method to use for resampling the image, see\nwxImageResizeQuality documentation.\n\nIt should be noted that although using `wxIMAGE_QUALITY_HIGH` produces much nicer looking\nresults it is a slower method. Downsampling will use the box averaging method which seems\nto operate very fast. If you are upsampling larger images using this method you will most\nlikely notice that it is a bit slower and in extreme cases it will be quite substantially\nslower as the bicubic algorithm has to process a lot of data.\n\nIt should also be noted that the high quality scaling may not work as expected when using\na single mask colour for transparency, as the scaling will blur the image and will\ntherefore remove the mask partially. Using the alpha channel will work.\n\nExample:\n\nSee: `rescale/4`","ref":"wxImage.html#scale/4"},{"type":"function","title":"wxImage.setAlpha/2","doc":"This function is similar to `setData/4` and has similar restrictions.\n\nThe pointer passed to it may however be NULL in which case the function will allocate the\nalpha array internally - this is useful to add alpha channel data to an image which\ndoesn't have any.\n\nIf the pointer is not NULL, it must have one byte for each image pixel and be allocated\nwith malloc(). `m:wxImage` takes ownership of the pointer and will free it unless `static_data`\nparameter is set to true - in this case the caller should do it.","ref":"wxImage.html#setAlpha/2"},{"type":"function","title":"wxImage.setAlpha/4","doc":"Sets the alpha value for the given pixel.\n\nThis function should only be called if the image has alpha channel data, use `hasAlpha/1` to check\nfor this.","ref":"wxImage.html#setAlpha/4"},{"type":"function","title":"wxImage.setData/2","doc":"Sets the image data without performing checks.\n\nThe data given must have the size (width*height*3) or results will be unexpected. Don't\nuse this method if you aren't sure you know what you are doing.\n\nThe data must have been allocated with `malloc()`, `NOT` with `operator` new.\n\nIf `static_data` is false, after this call the pointer to the data is owned by the `m:wxImage`\nobject, that will be responsible for deleting it. Do not pass to this function a pointer\nobtained through `getData/1`.","ref":"wxImage.html#setData/2"},{"type":"function","title":"wxImage.setData/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxImage.html#setData/4"},{"type":"function","title":"wxImage.setMask/1","doc":"","ref":"wxImage.html#setMask/1"},{"type":"function","title":"wxImage.setMask/2","doc":"Specifies whether there is a mask or not.\n\nThe area of the mask is determined by the current mask colour.","ref":"wxImage.html#setMask/2"},{"type":"function","title":"wxImage.setMaskColour/4","doc":"Sets the mask colour for this image (and tells the image to use the mask).","ref":"wxImage.html#setMaskColour/4"},{"type":"function","title":"wxImage.setMaskFromImage/5","doc":"Sets image's mask so that the pixels that have RGB value of mr,mg,mb in mask will be\nmasked in the image.\n\nThis is done by first finding an unused colour in the image, setting this colour as the\nmask colour and then using this colour to draw all pixels in the image who corresponding\npixel in mask has given RGB value.\n\nThe parameter `mask` is the mask image to extract mask shape from. It must have the same\ndimensions as the image.\n\nThe parameters `mr`, `mg`, `mb` are the RGB values of the pixels in mask that will be\nused to create the mask.\n\nReturn: Returns false if mask does not have same dimensions as the image or if there is\nno unused colour left. Returns true if the mask was successfully applied.\n\nNote: Note that this method involves computing the histogram, which is a computationally\nintensive operation.","ref":"wxImage.html#setMaskFromImage/5"},{"type":"function","title":"wxImage.setOption/3","doc":"Sets a user-defined option.\n\nThe function is case-insensitive to `name`.\n\nFor example, when saving as a JPEG file, the option `quality` is used, which is a number\nbetween 0 and 100 (0 is terrible, 100 is very good).\n\nThe lists of the currently supported options are in `getOption/2` and `getOptionInt/2` function docs.\n\nSee:\n* `getOption/2`\n\n* `getOptionInt/2`\n\n* `hasOption/2`","ref":"wxImage.html#setOption/3"},{"type":"function","title":"wxImage.setPalette/2","doc":"Associates a palette with the image.\n\nThe palette may be used when converting `m:wxImage` to `m:wxBitmap` (MSW only at present)\nor in file save operations (none as yet).","ref":"wxImage.html#setPalette/2"},{"type":"function","title":"wxImage.setRGB/5","doc":"Sets the colour of the pixels within the given rectangle.\n\nThis routine performs bounds-checks for the coordinate so it can be considered a safe way\nto manipulate the data.","ref":"wxImage.html#setRGB/5"},{"type":"function","title":"wxImage.setRGB/6","doc":"Set the color of the pixel at the given x and y coordinate.","ref":"wxImage.html#setRGB/6"},{"type":"function","title":"wxImage.size/3","doc":"","ref":"wxImage.html#size/3"},{"type":"function","title":"wxImage.size/4","doc":"Returns a resized version of this image without scaling it by adding either a border with\nthe given colour or cropping as necessary.\n\nThe image is pasted into a new image with the given `size` and background colour at the\nposition `pos` relative to the upper left of the new image.\n\nIf `red` = green = blue = -1 then the areas of the larger image not covered by this image\nare made transparent by filling them with the image mask colour (which will be allocated\nautomatically if it isn't currently set).\n\nOtherwise, the areas will be filled with the colour with the specified RGB components.\n\nSee: `resize/4`","ref":"wxImage.html#size/4"},{"type":"type","title":"wxImage.wxImage/0","doc":"","ref":"wxImage.html#t:wxImage/0"},{"type":"module","title":"wxImageList","doc":"A `m:wxImageList` contains a list of images, which are stored in an unspecified form.\n\nImages can have masks for transparent drawing, and can be made from a variety of sources\nincluding bitmaps and icons.\n\n`m:wxImageList` is used principally in conjunction with `m:wxTreeCtrl` and `m:wxListCtrl` classes.\n\nSee:\n* `m:wxTreeCtrl`\n\n* `m:wxListCtrl`\n\nwxWidgets docs: [wxImageList](https://docs.wxwidgets.org/3.2/classwx_image_list.html)","ref":"wxImageList.html"},{"type":"function","title":"wxImageList.add/2","doc":"Adds a new image using an icon.\n\nReturn: The new zero-based image index.\n\nRemark: The original bitmap or icon is not affected by the `add/3` operation, and can be deleted\nafterwards. If the bitmap is wider than the images in the list, then the bitmap will\nautomatically be split into smaller images, each matching the dimensions of the image\nlist. This does not apply when adding icons.\n\nOnly for:wxmsw,wxosx","ref":"wxImageList.html#add/2"},{"type":"function","title":"wxImageList.add/3","doc":"Adds a new image or images using a bitmap and mask colour.\n\nReturn: The new zero-based image index.\n\nRemark: The original bitmap or icon is not affected by the `add/3` operation, and can be deleted\nafterwards. If the bitmap is wider than the images in the list, then the bitmap will\nautomatically be split into smaller images, each matching the dimensions of the image\nlist. This does not apply when adding icons.","ref":"wxImageList.html#add/3"},{"type":"function","title":"wxImageList.create/3","doc":"","ref":"wxImageList.html#create/3"},{"type":"function","title":"wxImageList.create/4","doc":"Initializes the list.\n\nSee `new/3` for details.","ref":"wxImageList.html#create/4"},{"type":"function","title":"wxImageList.destroy/1","doc":"Destroys the object","ref":"wxImageList.html#destroy/1"},{"type":"function","title":"wxImageList.draw/5","doc":"","ref":"wxImageList.html#draw/5"},{"type":"function","title":"wxImageList.draw/6","doc":"Draws a specified image onto a device context.","ref":"wxImageList.html#draw/6"},{"type":"function","title":"wxImageList.getBitmap/2","doc":"Returns the bitmap corresponding to the given index.","ref":"wxImageList.html#getBitmap/2"},{"type":"function","title":"wxImageList.getIcon/2","doc":"Returns the icon corresponding to the given index.","ref":"wxImageList.html#getIcon/2"},{"type":"function","title":"wxImageList.getImageCount/1","doc":"Returns the number of images in the list.","ref":"wxImageList.html#getImageCount/1"},{"type":"function","title":"wxImageList.getSize/2","doc":"Retrieves the size of the images in the list.\n\nCurrently, the `index` parameter is ignored as all images in the list have the same size.\n\nReturn: true if the function succeeded, false if it failed (for example, if the image\nlist was not yet initialized).","ref":"wxImageList.html#getSize/2"},{"type":"function","title":"wxImageList.new/0","doc":"Default ctor.","ref":"wxImageList.html#new/0"},{"type":"function","title":"wxImageList.new/2","doc":"","ref":"wxImageList.html#new/2"},{"type":"function","title":"wxImageList.new/3","doc":"Constructor specifying the image size, whether image masks should be created, and the\ninitial size of the list.\n\nSee: `create/4`","ref":"wxImageList.html#new/3"},{"type":"function","title":"wxImageList.remove/2","doc":"Removes the image at the given position.","ref":"wxImageList.html#remove/2"},{"type":"function","title":"wxImageList.removeAll/1","doc":"Removes all the images in the list.","ref":"wxImageList.html#removeAll/1"},{"type":"function","title":"wxImageList.replace/3","doc":"Replaces the existing image with the new image.\n\nReturn: true if the replacement was successful, false otherwise.\n\nRemark: The original bitmap or icon is not affected by the `replace/4` operation, and can be deleted afterwards.\n\nOnly for:wxmsw,wxosx","ref":"wxImageList.html#replace/3"},{"type":"function","title":"wxImageList.replace/4","doc":"Replaces the existing image with the new image.\n\nWindows only.\n\nReturn: true if the replacement was successful, false otherwise.\n\nRemark: The original bitmap or icon is not affected by the `replace/4` operation, and can be deleted\nafterwards.","ref":"wxImageList.html#replace/4"},{"type":"type","title":"wxImageList.wxImageList/0","doc":"","ref":"wxImageList.html#t:wxImageList/0"},{"type":"module","title":"wxInitDialogEvent","doc":"A `m:wxInitDialogEvent` is sent as a dialog or panel is being initialised.\n\nHandlers for this event can transfer data to the window.\n\nThe default handler calls `wxWindow:transferDataToWindow/1`.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxInitDialogEvent](https://docs.wxwidgets.org/3.2/classwx_init_dialog_event.html)","ref":"wxInitDialogEvent.html"},{"type":"module","title":"Events - wxInitDialogEvent","doc":"Use `wxEvtHandler:connect/3` with `wxInitDialogEventType` to subscribe to events of this type.","ref":"wxInitDialogEvent.html#module-events"},{"type":"type","title":"wxInitDialogEvent.wxInitDialog/0","doc":"","ref":"wxInitDialogEvent.html#t:wxInitDialog/0"},{"type":"type","title":"wxInitDialogEvent.wxInitDialogEvent/0","doc":"","ref":"wxInitDialogEvent.html#t:wxInitDialogEvent/0"},{"type":"type","title":"wxInitDialogEvent.wxInitDialogEventType/0","doc":"","ref":"wxInitDialogEvent.html#t:wxInitDialogEventType/0"},{"type":"module","title":"wxJoystickEvent","doc":"This event class contains information about joystick events, particularly events received\nby windows.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxJoystickEvent](https://docs.wxwidgets.org/3.2/classwx_joystick_event.html)","ref":"wxJoystickEvent.html"},{"type":"module","title":"Events - wxJoystickEvent","doc":"Use `wxEvtHandler:connect/3` with `wxJoystickEventType` to subscribe to events of this type.","ref":"wxJoystickEvent.html#module-events"},{"type":"function","title":"wxJoystickEvent.buttonDown/1","doc":"","ref":"wxJoystickEvent.html#buttonDown/1"},{"type":"function","title":"wxJoystickEvent.buttonDown/2","doc":"Returns true if the event was a down event from the specified button (or any button).","ref":"wxJoystickEvent.html#buttonDown/2"},{"type":"function","title":"wxJoystickEvent.buttonIsDown/1","doc":"","ref":"wxJoystickEvent.html#buttonIsDown/1"},{"type":"function","title":"wxJoystickEvent.buttonIsDown/2","doc":"Returns true if the specified button (or any button) was in a down state.","ref":"wxJoystickEvent.html#buttonIsDown/2"},{"type":"function","title":"wxJoystickEvent.buttonUp/1","doc":"","ref":"wxJoystickEvent.html#buttonUp/1"},{"type":"function","title":"wxJoystickEvent.buttonUp/2","doc":"Returns true if the event was an up event from the specified button (or any button).","ref":"wxJoystickEvent.html#buttonUp/2"},{"type":"function","title":"wxJoystickEvent.getButtonChange/1","doc":"Returns the identifier of the button changing state.\n\nThe return value is where `n` is the index of the button changing state, which can also\nbe retrieved using `GetButtonOrdinal()` (not implemented in wx).\n\nNote that for `n` equal to 1, 2, 3 or 4 there are predefined `wxJOY_BUTTONn` constants\nwhich can be used for more clarity, however these constants are not defined for the\nbuttons beyond the first four.","ref":"wxJoystickEvent.html#getButtonChange/1"},{"type":"function","title":"wxJoystickEvent.getButtonState/1","doc":"Returns the down state of the buttons.\n\nThis is a `wxJOY_BUTTONn` identifier, where `n` is one of 1, 2, 3, 4.","ref":"wxJoystickEvent.html#getButtonState/1"},{"type":"function","title":"wxJoystickEvent.getJoystick/1","doc":"Returns the identifier of the joystick generating the event - one of wxJOYSTICK1 and\nwxJOYSTICK2.","ref":"wxJoystickEvent.html#getJoystick/1"},{"type":"function","title":"wxJoystickEvent.getPosition/1","doc":"Returns the x, y position of the joystick event.\n\nThese coordinates are valid for all the events except wxEVT_JOY_ZMOVE.","ref":"wxJoystickEvent.html#getPosition/1"},{"type":"function","title":"wxJoystickEvent.getZPosition/1","doc":"Returns the z position of the joystick event.\n\nThis method can only be used for wxEVT_JOY_ZMOVE events.","ref":"wxJoystickEvent.html#getZPosition/1"},{"type":"function","title":"wxJoystickEvent.isButton/1","doc":"Returns true if this was a button up or down event (`not` 'is any button down?').","ref":"wxJoystickEvent.html#isButton/1"},{"type":"function","title":"wxJoystickEvent.isMove/1","doc":"Returns true if this was an x, y move event.","ref":"wxJoystickEvent.html#isMove/1"},{"type":"function","title":"wxJoystickEvent.isZMove/1","doc":"Returns true if this was a z move event.","ref":"wxJoystickEvent.html#isZMove/1"},{"type":"type","title":"wxJoystickEvent.wxJoystick/0","doc":"","ref":"wxJoystickEvent.html#t:wxJoystick/0"},{"type":"type","title":"wxJoystickEvent.wxJoystickEvent/0","doc":"","ref":"wxJoystickEvent.html#t:wxJoystickEvent/0"},{"type":"type","title":"wxJoystickEvent.wxJoystickEventType/0","doc":"","ref":"wxJoystickEvent.html#t:wxJoystickEventType/0"},{"type":"module","title":"wxKeyEvent","doc":"This event class contains information about key press and release events.\n\nThe main information carried by this event is the key being pressed or released. It can\nbe accessed using either `getKeyCode/1` function or `getUnicodeKey/1`. For the printable characters, the latter should be\nused as it works for any keys, including non-Latin-1 characters that can be entered when\nusing national keyboard layouts. `getKeyCode/1` should be used to handle special characters (such as\ncursor arrows keys or `HOME` or `INS` and so on) which correspond to ?wxKeyCode enum\nelements above the `WXK_START` constant. While `getKeyCode/1` also returns the character code for\nLatin-1 keys for compatibility, it doesn't work for Unicode characters in general and will\nreturn `WXK_NONE` for any non-Latin-1 ones. For this reason, it's recommended to always\nuse `getUnicodeKey/1` and only fall back to `getKeyCode/1` if `getUnicodeKey/1` returned `WXK_NONE` meaning that the event corresponds to\na non-printable special keys.\n\nWhile both of these functions can be used with the events of `wxEVT_KEY_DOWN`, `wxEVT_KEY_UP`\nand `wxEVT_CHAR` types, the values returned by them are different for the first two\nevents and the last one. For the latter, the key returned corresponds to the character\nthat would appear in e.g. a text zone if the user pressed the key in it. As such, its\nvalue depends on the current state of the Shift key and, for the letters, on the state of\nCaps Lock modifier. For example, if `A` key is pressed without Shift being held down, `m:wxKeyEvent`\nof type `wxEVT_CHAR` generated for this key press will return (from either `getKeyCode/1` or `getUnicodeKey/1` as their\nmeanings coincide for ASCII characters) key code of 97 corresponding the ASCII value of `a`.\nAnd if the same key is pressed but with Shift being held (or Caps Lock being active), then\nthe key could would be 65, i.e. ASCII value of capital `A`.\n\nHowever for the key down and up events the returned key code will instead be `A`\nindependently of the state of the modifier keys i.e. it depends only on physical key being\npressed and is not translated to its logical representation using the current keyboard\nstate. Such untranslated key codes are defined as follows:\n\n* For the letters they correspond to the `upper` case value of the letter.\n\n* For the other alphanumeric keys (e.g. `7` or `+`), the untranslated key code corresponds to\nthe character produced by the key when it is pressed without Shift. E.g. in standard US\nkeyboard layout the untranslated key code for the key `=/+` in the upper right corner of\nthe keyboard is 61 which is the ASCII value of `=`.\n\n* For the rest of the keys (i.e. special non-printable keys) it is the same as the normal\nkey code as no translation is used anyhow.\n\nNotice that the first rule applies to all Unicode letters, not just the usual Latin-1\nones. However for non-Latin-1 letters only `getUnicodeKey/1` can be used to retrieve the key code as `getKeyCode/1` just\nreturns `WXK_NONE` in this case.\n\nTo summarize: you should handle `wxEVT_CHAR` if you need the translated key and `wxEVT_KEY_DOWN`\nif you only need the value of the key itself, independent of the current keyboard state.\n\nNote: Not all key down events may be generated by the user. As an example, `wxEVT_KEY_DOWN`\nwith `=` key code can be generated using the standard US keyboard layout but not using\nthe German one because the `=` key corresponds to Shift-0 key combination in this layout\nand the key code for it is `0`, not `=`. Because of this you should avoid requiring your\nusers to type key events that might be impossible to enter on their keyboard.\n\nAnother difference between key and char events is that another kind of translation is\ndone for the latter ones when the Control key is pressed: char events for ASCII letters in\nthis case carry codes corresponding to the ASCII value of Ctrl-Latter, i.e. 1 for Ctrl-A,\n2 for Ctrl-B and so on until 26 for Ctrl-Z. This is convenient for terminal-like\napplications and can be completely ignored by all the other ones (if you need to handle\nCtrl-A it is probably a better idea to use the key event rather than the char one). Notice\nthat currently no translation is done for the presses of [, `\\`, ], `^` and `_` keys which\nmight be mapped to ASCII values from 27 to 31. Since version 2.9.2, the enum values `WXK_CONTROL_A`\n- `WXK_CONTROL_Z` can be used instead of the non-descriptive constant values 1-26.\n\nFinally, modifier keys only generate key events but no char events at all. The modifiers\nkeys are `WXK_SHIFT`, `WXK_CONTROL`, `WXK_ALT` and various `WXK_WINDOWS_XXX` from\n?wxKeyCode enum.\n\nModifier keys events are special in one additional aspect: usually the keyboard state\nassociated with a key press is well defined, e.g. `shiftDown/1` returns `true` only if the Shift key\nwas held pressed when the key that generated this event itself was pressed. There is an\nambiguity for the key press events for Shift key itself however. By convention, it is\nconsidered to be already pressed when it is pressed and already released when it is\nreleased. In other words, `wxEVT_KEY_DOWN` event for the Shift key itself will have `wxMOD_SHIFT`\nin `getModifiers/1` and `shiftDown/1` will return true while the `wxEVT_KEY_UP` event for Shift itself will not have `wxMOD_SHIFT`\nin its modifiers and `shiftDown/1` will return false.\n\n`Tip:` You may discover the key codes and modifiers generated by all the keys on your\nsystem interactively by running the page_samples_keyboard wxWidgets sample and pressing\nsome keys in it.\n\nNote: If a key down (`EVT_KEY_DOWN`) event is caught and the event handler does not call `event.Skip()`\nthen the corresponding char event (`EVT_CHAR`) will not happen. This is by design and\nenables the programs that handle both types of events to avoid processing the same key\ntwice. As a consequence, if you do not want to suppress the `wxEVT_CHAR` events for the\nkeys you handle, always call `event.Skip()` in your `wxEVT_KEY_DOWN` handler. Not doing\nmay also prevent accelerators defined using this key from working.\n\nNote: If a key is maintained in a pressed state, you will typically get a lot of\n(automatically generated) key down events but only one key up one at the end when the key\nis released so it is wrong to assume that there is one up event corresponding to each down one.\n\nNote: For Windows programmers: The key and char events in wxWidgets are similar to but\nslightly different from Windows `WM_KEYDOWN` and `WM_CHAR` events. In particular, Alt-x\ncombination will generate a char event in wxWidgets (unless it is used as an accelerator)\nand almost all keys, including ones without ASCII equivalents, generate char events too.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxKeyEvent](https://docs.wxwidgets.org/3.2/classwx_key_event.html)","ref":"wxKeyEvent.html"},{"type":"module","title":"Events - wxKeyEvent","doc":"Use `wxEvtHandler:connect/3` with `wxKeyEventType` to subscribe to events of this type.","ref":"wxKeyEvent.html#module-events"},{"type":"function","title":"wxKeyEvent.altDown/1","doc":"Returns true if the Alt key is pressed.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","ref":"wxKeyEvent.html#altDown/1"},{"type":"function","title":"wxKeyEvent.cmdDown/1","doc":"Returns true if the key used for command accelerators is pressed.\n\nSame as `controlDown/1`. Deprecated.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","ref":"wxKeyEvent.html#cmdDown/1"},{"type":"function","title":"wxKeyEvent.controlDown/1","doc":"Returns true if the Control key or Apple/Command key under macOS is pressed.\n\nThis function doesn't distinguish between right and left control keys.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","ref":"wxKeyEvent.html#controlDown/1"},{"type":"function","title":"wxKeyEvent.getKeyCode/1","doc":"Returns the key code of the key that generated this event.\n\nASCII symbols return normal ASCII values, while events from special keys such as \"left\ncursor arrow\" (`WXK_LEFT`) return values outside of the ASCII range. See ?wxKeyCode for a\nfull list of the virtual key codes.\n\nNote that this method returns a meaningful value only for special non-alphanumeric keys\nor if the user entered a Latin-1 character (this includes ASCII and the accented letters\nfound in Western European languages but not letters of other alphabets such as e.g.\nCyrillic). Otherwise it simply method returns `WXK_NONE` and `getUnicodeKey/1` should be used to obtain the\ncorresponding Unicode character.\n\nUsing `getUnicodeKey/1` is in general the right thing to do if you are interested in the characters typed\nby the user, `getKeyCode/1` should be only used for special keys (for which `getUnicodeKey/1` returns `WXK_NONE`). To\nhandle both kinds of keys you might write:","ref":"wxKeyEvent.html#getKeyCode/1"},{"type":"function","title":"wxKeyEvent.getModifiers/1","doc":"Return the bit mask of all pressed modifier keys.\n\nThe return value is a combination of `wxMOD_ALT`, `wxMOD_CONTROL`, `wxMOD_SHIFT` and `wxMOD_META`\nbit masks. Additionally, `wxMOD_NONE` is defined as 0, i.e. corresponds to no modifiers\n(see `HasAnyModifiers()` (not implemented in wx)) and `wxMOD_CMD` is either `wxMOD_CONTROL`\n(MSW and Unix) or `wxMOD_META` (Mac), see `cmdDown/1`. See ?wxKeyModifier for the full list of modifiers.\n\nNotice that this function is easier to use correctly than, for example, `controlDown/1` because when\nusing the latter you also have to remember to test that none of the other modifiers is pressed:\n\nand forgetting to do it can result in serious program bugs (e.g. program not working with\nEuropean keyboard layout where `AltGr` key which is seen by the program as combination of\nCTRL and ALT is used). On the other hand, you can simply write:\n\nwith this function.","ref":"wxKeyEvent.html#getModifiers/1"},{"type":"function","title":"wxKeyEvent.getPosition/1","doc":"Obtains the position (in client coordinates) at which the key was pressed.\n\nNotice that under most platforms this position is simply the current mouse pointer\nposition and has no special relationship to the key event itself.\n\n`x` and `y` may be NULL if the corresponding coordinate is not needed.","ref":"wxKeyEvent.html#getPosition/1"},{"type":"function","title":"wxKeyEvent.getRawKeyCode/1","doc":"Returns the raw key code for this event.\n\nThe flags are platform-dependent and should only be used if the functionality provided by\nother `m:wxKeyEvent` methods is insufficient.\n\nUnder MSW, the raw key code is the value of `wParam` parameter of the corresponding message.\n\nUnder GTK, the raw key code is the `keyval` field of the corresponding GDK event.\n\nUnder macOS, the raw key code is the `keyCode` field of the corresponding NSEvent.\n\nNote: Currently the raw key codes are not supported by all ports, use #ifdef\nwxHAS_RAW_KEY_CODES to determine if this feature is available.","ref":"wxKeyEvent.html#getRawKeyCode/1"},{"type":"function","title":"wxKeyEvent.getRawKeyFlags/1","doc":"Returns the low level key flags for this event.\n\nThe flags are platform-dependent and should only be used if the functionality provided by\nother `m:wxKeyEvent` methods is insufficient.\n\nUnder MSW, the raw flags are just the value of `lParam` parameter of the corresponding message.\n\nUnder GTK, the raw flags contain the `hardware_keycode` field of the corresponding GDK event.\n\nUnder macOS, the raw flags contain the modifiers state.\n\nNote: Currently the raw key flags are not supported by all ports, use #ifdef\nwxHAS_RAW_KEY_CODES to determine if this feature is available.","ref":"wxKeyEvent.html#getRawKeyFlags/1"},{"type":"function","title":"wxKeyEvent.getUnicodeKey/1","doc":"Returns the Unicode character corresponding to this key event.\n\nIf the key pressed doesn't have any character value (e.g. a cursor key) this method will\nreturn `WXK_NONE`. In this case you should use `getKeyCode/1` to retrieve the value of the key.\n\nThis function is only available in Unicode build, i.e. when `wxUSE_UNICODE` is 1.","ref":"wxKeyEvent.html#getUnicodeKey/1"},{"type":"function","title":"wxKeyEvent.getX/1","doc":"Returns the X position (in client coordinates) of the event.\n\nSee: `getPosition/1`","ref":"wxKeyEvent.html#getX/1"},{"type":"function","title":"wxKeyEvent.getY/1","doc":"Returns the Y position (in client coordinates) of the event.\n\nSee: `getPosition/1`","ref":"wxKeyEvent.html#getY/1"},{"type":"function","title":"wxKeyEvent.hasModifiers/1","doc":"Returns true if Control or Alt are pressed.\n\nChecks if Control, Alt or, under macOS only, Command key are pressed (notice that the\nreal Control key is still taken into account under OS X too).\n\nThis method returns false if only Shift is pressed for compatibility reasons and also\nbecause pressing Shift usually doesn't change the interpretation of key events, see `HasAnyModifiers()`\n(not implemented in wx) if you want to take Shift into account as well.","ref":"wxKeyEvent.html#hasModifiers/1"},{"type":"function","title":"wxKeyEvent.metaDown/1","doc":"Returns true if the Meta/Windows/Apple key is pressed.\n\nThis function tests the state of the key traditionally called Meta under Unix systems,\nWindows keys under MSW Notice that `getModifiers/1` should usually be used instead of this one.\n\nSee: `cmdDown/1`","ref":"wxKeyEvent.html#metaDown/1"},{"type":"function","title":"wxKeyEvent.shiftDown/1","doc":"Returns true if the Shift key is pressed.\n\nThis function doesn't distinguish between right and left shift keys.\n\nNotice that `getModifiers/1` should usually be used instead of this one.","ref":"wxKeyEvent.html#shiftDown/1"},{"type":"type","title":"wxKeyEvent.wxKey/0","doc":"","ref":"wxKeyEvent.html#t:wxKey/0"},{"type":"type","title":"wxKeyEvent.wxKeyEvent/0","doc":"","ref":"wxKeyEvent.html#t:wxKeyEvent/0"},{"type":"type","title":"wxKeyEvent.wxKeyEventType/0","doc":"","ref":"wxKeyEvent.html#t:wxKeyEventType/0"},{"type":"module","title":"wxLayoutAlgorithm","doc":"`m:wxLayoutAlgorithm` implements layout of subwindows in MDI or SDI frames.\n\nIt sends a `wxCalculateLayoutEvent` (not implemented in wx) event to children of the\nframe, asking them for information about their size. For MDI parent frames, the algorithm\nallocates the remaining space to the MDI client window (which contains the MDI child frames).\n\nFor SDI (normal) frames, a 'main' window is specified as taking up the remaining space.\n\nBecause the event system is used, this technique can be applied to any windows, which are\nnot necessarily 'aware' of the layout classes (no virtual functions in `m:wxWindow` refer\nto `m:wxLayoutAlgorithm` or its events). However, you may wish to use `m:wxSashLayoutWindow`\nfor your subwindows since this class provides handlers for the required events, and\naccessors to specify the desired size of the window. The sash behaviour in the base class\ncan be used, optionally, to make the windows user-resizable.\n\n`m:wxLayoutAlgorithm` is typically used in IDE (integrated development environment)\napplications, where there are several resizable windows in addition to the MDI client\nwindow, or other primary editing window. Resizable windows might include toolbars, a\nproject window, and a window for displaying error and warning messages.\n\nWhen a window receives an OnCalculateLayout event, it should call SetRect in the given\nevent object, to be the old supplied rectangle minus whatever space the window takes up.\nIt should also set its own size accordingly. `wxSashLayoutWindow::OnCalculateLayout` (not\nimplemented in wx) generates an OnQueryLayoutInfo event which it sends to itself to\ndetermine the orientation, alignment and size of the window, which it gets from internal\nmember variables set by the application.\n\nThe algorithm works by starting off with a rectangle equal to the whole frame client\narea. It iterates through the frame children, generating\nwxLayoutAlgorithm::OnCalculateLayout events which subtract the window size and return the\nremaining rectangle for the next window to process. It is assumed (by `wxSashLayoutWindow::OnCalculateLayout`\n(not implemented in wx)) that a window stretches the full dimension of the frame client,\naccording to the orientation it specifies. For example, a horizontal window will stretch\nthe full width of the remaining portion of the frame client area. In the other\norientation, the window will be fixed to whatever size was specified by\nwxLayoutAlgorithm::OnQueryLayoutInfo. An alignment setting will make the window 'stick' to\nthe left, top, right or bottom of the remaining client area. This scheme implies that\norder of window creation is important. Say you wish to have an extra toolbar at the top of\nthe frame, a project window to the left of the MDI client window, and an output window\nabove the status bar. You should therefore create the windows in this order: toolbar,\noutput window, project window. This ensures that the toolbar and output window take up\nspace at the top and bottom, and then the remaining height in-between is used for the\nproject window.\n\n`m:wxLayoutAlgorithm` is quite independent of the way in which\nwxLayoutAlgorithm::OnCalculateLayout chooses to interpret a window's size and alignment.\nTherefore you could implement a different window class with a new\nwxLayoutAlgorithm::OnCalculateLayout event handler, that has a more sophisticated way of\nlaying out the windows. It might allow specification of whether stretching occurs in the\nspecified orientation, for example, rather than always assuming stretching. (This could,\nand probably should, be added to the existing implementation).\n\nNote: `m:wxLayoutAlgorithm` has nothing to do with `wxLayoutConstraints` (not implemented\nin wx). It is an alternative way of specifying layouts for which the normal constraint\nsystem is unsuitable.\n\nSee:\n* `m:wxSashEvent`\n\n* `m:wxSashLayoutWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nwxWidgets docs: [wxLayoutAlgorithm](https://docs.wxwidgets.org/3.2/classwx_layout_algorithm.html)","ref":"wxLayoutAlgorithm.html"},{"type":"function","title":"wxLayoutAlgorithm.destroy/1","doc":"Destroys the object","ref":"wxLayoutAlgorithm.html#destroy/1"},{"type":"function","title":"wxLayoutAlgorithm.layoutFrame/2","doc":"","ref":"wxLayoutAlgorithm.html#layoutFrame/2"},{"type":"function","title":"wxLayoutAlgorithm.layoutFrame/3","doc":"Lays out the children of a normal frame.\n\n`mainWindow` is set to occupy the remaining space. This function simply calls `layoutWindow/3`.","ref":"wxLayoutAlgorithm.html#layoutFrame/3"},{"type":"function","title":"wxLayoutAlgorithm.layoutMDIFrame/2","doc":"","ref":"wxLayoutAlgorithm.html#layoutMDIFrame/2"},{"type":"function","title":"wxLayoutAlgorithm.layoutMDIFrame/3","doc":"Lays out the children of an MDI parent frame.\n\nIf `rect` is non-NULL, the given rectangle will be used as a starting point instead of\nthe frame's client area. The MDI client window is set to occupy the remaining space.","ref":"wxLayoutAlgorithm.html#layoutMDIFrame/3"},{"type":"function","title":"wxLayoutAlgorithm.layoutWindow/2","doc":"","ref":"wxLayoutAlgorithm.html#layoutWindow/2"},{"type":"function","title":"wxLayoutAlgorithm.layoutWindow/3","doc":"Lays out the children of a normal frame or other window.\n\n`mainWindow` is set to occupy the remaining space. If this is not specified, then the\nlast window that responds to a calculate layout event in query mode will get the remaining\nspace (that is, a non-query OnCalculateLayout event will not be sent to this window and\nthe window will be set to the remaining size).","ref":"wxLayoutAlgorithm.html#layoutWindow/3"},{"type":"function","title":"wxLayoutAlgorithm.new/0","doc":"Default constructor.","ref":"wxLayoutAlgorithm.html#new/0"},{"type":"type","title":"wxLayoutAlgorithm.wxLayoutAlgorithm/0","doc":"","ref":"wxLayoutAlgorithm.html#t:wxLayoutAlgorithm/0"},{"type":"module","title":"wxListBox","doc":"A listbox is used to select one or more of a list of strings.\n\nThe strings are displayed in a scrolling box, with the selected string(s) marked in\nreverse video. A listbox can be single selection (if an item is selected, the previous\nselection is removed) or multiple selection (clicking an item toggles the item on or off\nindependently of other selections).\n\nList box elements are numbered from zero and while the maximal number of elements is\nunlimited, it is usually better to use a virtual control, not requiring to add all the\nitems to it at once, such as `wxDataViewCtrl` (not implemented in wx) or `m:wxListCtrl`\nwith `wxLC_VIRTUAL` style, once more than a few hundreds items need to be displayed\nbecause this control is not optimized, neither from performance nor from user interface\npoint of view, for large number of items.\n\nNotice that the list box doesn't support control characters other than `TAB`.","ref":"wxListBox.html"},{"type":"module","title":"Styles - wxListBox","doc":"This class supports the following styles:\n\n* wxLB_SINGLE: Single-selection list.\n\n* wxLB_MULTIPLE: Multiple-selection list: the user can toggle multiple items on and off.\nThis is the same as wxLB_EXTENDED in wxGTK2 port.\n\n* wxLB_EXTENDED: Extended-selection list: the user can extend the selection by using `SHIFT`\nor `CTRL` keys together with the cursor movement keys or the mouse.\n\n* wxLB_HSCROLL: Create horizontal scrollbar if contents are too wide (Windows only).\n\n* wxLB_ALWAYS_SB: Always show a vertical scrollbar.\n\n* wxLB_NEEDED_SB: Only create a vertical scrollbar if needed.\n\n* wxLB_NO_SB: Don't create vertical scrollbar (wxMSW and wxGTK only).\n\n* wxLB_SORT: The listbox contents are sorted in alphabetical order. Note that `wxLB_SINGLE`, `wxLB_MULTIPLE`\nand `wxLB_EXTENDED` styles are mutually exclusive and you can specify at most one of them\n(single selection is the default). See also overview_windowstyles.\n\nSee:\n* `m:wxChoice`\n\n* `m:wxComboBox`\n\n* `m:wxListCtrl`\n\n* `m:wxCommandEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControlWithItems`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListBox](https://docs.wxwidgets.org/3.2/classwx_list_box.html)","ref":"wxListBox.html#module-styles"},{"type":"module","title":"Events - wxListBox","doc":"Event types emitted from this class:\n\n* [`command_listbox_selected`](`m:wxCommandEvent`)\n\n* [`command_listbox_doubleclicked`](`m:wxCommandEvent`)","ref":"wxListBox.html#module-events"},{"type":"function","title":"wxListBox.create/6","doc":"","ref":"wxListBox.html#create/6"},{"type":"function","title":"wxListBox.create/7","doc":"","ref":"wxListBox.html#create/7"},{"type":"function","title":"wxListBox.deselect/2","doc":"Deselects an item in the list box.\n\nRemark: This applies to multiple selection listboxes only.","ref":"wxListBox.html#deselect/2"},{"type":"function","title":"wxListBox.destroy/1","doc":"Destroys the object","ref":"wxListBox.html#destroy/1"},{"type":"function","title":"wxListBox.getSelections/1","doc":"Fill an array of ints with the positions of the currently selected items.\n\nReturn: The number of selections.\n\nRemark: Use this with a multiple selection listbox.\n\nSee:\n* `wxControlWithItems:getSelection/1`\n\n* `wxControlWithItems:getStringSelection/1`\n\n* `wxControlWithItems:setSelection/2`","ref":"wxListBox.html#getSelections/1"},{"type":"function","title":"wxListBox.hitTest/2","doc":"Returns the item located at `point`, or `wxNOT\\_FOUND` if there is no item located at `point`.\n\nIt is currently implemented for wxMSW, wxMac and wxGTK2 ports.\n\nReturn: Item located at point, or wxNOT_FOUND if unimplemented or the item does not exist.\n\nSince: 2.7.0","ref":"wxListBox.html#hitTest/2"},{"type":"function","title":"wxListBox.hitTest/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxListBox.html#hitTest/3"},{"type":"function","title":"wxListBox.insertItems/3","doc":"Insert the given number of strings before the specified position.","ref":"wxListBox.html#insertItems/3"},{"type":"function","title":"wxListBox.isSelected/2","doc":"Determines whether an item is selected.\n\nReturn: true if the given item is selected, false otherwise.","ref":"wxListBox.html#isSelected/2"},{"type":"function","title":"wxListBox.new/0","doc":"Default constructor.","ref":"wxListBox.html#new/0"},{"type":"function","title":"wxListBox.new/2","doc":"","ref":"wxListBox.html#new/2"},{"type":"function","title":"wxListBox.new/3","doc":"Constructor, creating and showing a list box.\n\nSee the other `new/3` constructor; the only difference is that this overload takes a `wxArrayString`\n(not implemented in wx) instead of a pointer to an array of `wxString` (not implemented\nin wx).","ref":"wxListBox.html#new/3"},{"type":"function","title":"wxListBox.set/2","doc":"Replaces the current control contents with the given items.\n\nNotice that calling this method is usually much faster than appending them one by one if\nyou need to add a lot of items.","ref":"wxListBox.html#set/2"},{"type":"function","title":"wxListBox.setFirstItem/2","doc":"Set the specified item to be the first visible item.","ref":"wxListBox.html#setFirstItem/2"},{"type":"type","title":"wxListBox.wxListBox/0","doc":"","ref":"wxListBox.html#t:wxListBox/0"},{"type":"module","title":"wxListCtrl","doc":"A list control presents lists in a number of formats: list view, report view, icon view\nand small icon view.\n\nIn any case, elements are numbered from zero. For all these modes, the items are stored\nin the control and must be added to it using `insertItem/4` method.\n\nA special case of report view quite different from the other modes of the list control is\na virtual control in which the items data (including text, images and attributes) is\nmanaged by the main program and is requested by the control itself only when needed which\nallows having controls with millions of items without consuming much memory. To use\nvirtual list control you must use `setItemCount/2` first and override at least `wxListCtrl::OnGetItemText`\n(not implemented in wx) (and optionally `wxListCtrl::OnGetItemImage` (not implemented in\nwx) or `wxListCtrl::OnGetItemColumnImage` (not implemented in wx) and `wxListCtrl::OnGetItemAttr`\n(not implemented in wx)) to return the information about the items when the control\nrequests it.\n\nVirtual list control can be used as a normal one except that no operations which can take\ntime proportional to the number of items in the control happen - this is required to allow\nhaving a practically infinite number of items. For example, in a multiple selection\nvirtual list control, the selections won't be sent when many items are selected at once\nbecause this could mean iterating over all the items.\n\nUsing many of `m:wxListCtrl` features is shown in the corresponding sample.\n\nTo intercept events from a list control, use the event table macros described in `m:wxListEvent`.\n\n`wxMac Note`: Starting with wxWidgets 2.8, `m:wxListCtrl` uses a native implementation\nfor report mode, and uses a generic implementation for other modes. You can use the\ngeneric implementation for report mode as well by setting the `mac.listctrl.always_use_generic`\nsystem option (see `m:wxSystemOptions`) to 1.","ref":"wxListCtrl.html"},{"type":"module","title":"Styles - wxListCtrl","doc":"This class supports the following styles:\n\n* wxLC_LIST: Multicolumn list view, with optional small icons. Columns are computed\nautomatically, i.e. you don't set columns as in `wxLC_REPORT`. In other words, the list\nwraps, unlike a `m:wxListBox`.\n\n* wxLC_REPORT: Single or multicolumn report view, with optional header.\n\n* wxLC_VIRTUAL: The application provides items text on demand. May only be used with `wxLC_REPORT`.\n\n* wxLC_ICON: Large icon view, with optional labels.\n\n* wxLC_SMALL_ICON: Small icon view, with optional labels.\n\n* wxLC_ALIGN_TOP: Icons align to the top. Win32 default, Win32 only.\n\n* wxLC_ALIGN_LEFT: Icons align to the left.\n\n* wxLC_AUTOARRANGE: Icons arrange themselves. Win32 only.\n\n* wxLC_EDIT_LABELS: Labels are editable: the application will be notified when editing\nstarts.\n\n* wxLC_NO_HEADER: No header in report mode.\n\n* wxLC_SINGLE_SEL: Single selection (default is multiple).\n\n* wxLC_SORT_ASCENDING: Sort in ascending order. (You must still supply a comparison\ncallback in `sortItems/2`.)\n\n* wxLC_SORT_DESCENDING: Sort in descending order. (You must still supply a comparison\ncallback in `sortItems/2`.)\n\n* wxLC_HRULES: Draws light horizontal rules between rows in report mode.\n\n* wxLC_VRULES: Draws light vertical rules between columns in report mode.\n\nSee:\n* [Overview listctrl](https://docs.wxwidgets.org/3.2/overview_listctrl.html#overview_listctrl)\n\n* `m:wxListView`\n\n* `m:wxListBox`\n\n* `m:wxTreeCtrl`\n\n* `m:wxImageList`\n\n* `m:wxListEvent`\n\n* `m:wxListItem`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListCtrl](https://docs.wxwidgets.org/3.2/classwx_list_ctrl.html)","ref":"wxListCtrl.html#module-styles"},{"type":"module","title":"Events - wxListCtrl","doc":"Event types emitted from this class:\n\n* [`command_list_begin_drag`](`m:wxListEvent`)\n\n* [`command_list_begin_rdrag`](`m:wxListEvent`)\n\n* [`command_list_begin_label_edit`](`m:wxListEvent`)\n\n* [`command_list_end_label_edit`](`m:wxListEvent`)\n\n* [`command_list_delete_item`](`m:wxListEvent`)\n\n* [`command_list_delete_all_items`](`m:wxListEvent`)\n\n* [`command_list_item_selected`](`m:wxListEvent`)\n\n* [`command_list_item_deselected`](`m:wxListEvent`)\n\n* [`command_list_item_activated`](`m:wxListEvent`)\n\n* [`command_list_item_focused`](`m:wxListEvent`)\n\n* [`command_list_item_middle_click`](`m:wxListEvent`)\n\n* [`command_list_item_right_click`](`m:wxListEvent`)\n\n* [`command_list_key_down`](`m:wxListEvent`)\n\n* [`command_list_insert_item`](`m:wxListEvent`)\n\n* [`command_list_col_click`](`m:wxListEvent`)\n\n* [`command_list_col_right_click`](`m:wxListEvent`)\n\n* [`command_list_col_begin_drag`](`m:wxListEvent`)\n\n* [`command_list_col_dragging`](`m:wxListEvent`)\n\n* [`command_list_col_end_drag`](`m:wxListEvent`)\n\n* [`command_list_cache_hint`](`m:wxListEvent`)","ref":"wxListCtrl.html#module-events"},{"type":"function","title":"wxListCtrl.arrange/1","doc":"","ref":"wxListCtrl.html#arrange/1"},{"type":"function","title":"wxListCtrl.arrange/2","doc":"Arranges the items in icon or small icon view.\n\nThis only has effect on Win32. `flag` is one of:\n\n* wxLIST_ALIGN_DEFAULT: Default alignment.\n\n* wxLIST_ALIGN_LEFT: Align to the left side of the control.\n\n* wxLIST_ALIGN_TOP: Align to the top side of the control.\n\n* wxLIST_ALIGN_SNAP_TO_GRID: Snap to grid.","ref":"wxListCtrl.html#arrange/2"},{"type":"function","title":"wxListCtrl.assignImageList/3","doc":"Sets the image list associated with the control and takes ownership of it (i.e.\n\nthe control will, unlike when using `setImageList/3`, delete the list when destroyed). `which` is one of `wxIMAGE_LIST_NORMAL`, `wxIMAGE_LIST_SMALL`, `wxIMAGE_LIST_STATE`\n(the last is unimplemented).\n\nSee: `setImageList/3`","ref":"wxListCtrl.html#assignImageList/3"},{"type":"function","title":"wxListCtrl.clearAll/1","doc":"Deletes all items and all columns.\n\nNote: This sends an event of type `wxEVT_LIST_DELETE_ALL_ITEMS` under all platforms.","ref":"wxListCtrl.html#clearAll/1"},{"type":"function","title":"wxListCtrl.create/2","doc":"","ref":"wxListCtrl.html#create/2"},{"type":"function","title":"wxListCtrl.create/3","doc":"","ref":"wxListCtrl.html#create/3"},{"type":"function","title":"wxListCtrl.deleteAllItems/1","doc":"Deletes all items in the list control.\n\nThis function does `not` send the `wxEVT_LIST_DELETE_ITEM` event because deleting many\nitems from the control would be too slow then (unlike `deleteItem/2`) but it does send the special `wxEVT_LIST_DELETE_ALL_ITEMS`\nevent if the control was not empty. If it was already empty, nothing is done and no event\nis sent.\n\nReturn: true if the items were successfully deleted or if the control was already empty,\nfalse if an error occurred while deleting the items.","ref":"wxListCtrl.html#deleteAllItems/1"},{"type":"function","title":"wxListCtrl.deleteColumn/2","doc":"Deletes a column.","ref":"wxListCtrl.html#deleteColumn/2"},{"type":"function","title":"wxListCtrl.deleteItem/2","doc":"Deletes the specified item.\n\nThis function sends the `wxEVT_LIST_DELETE_ITEM` event for the item being deleted.\n\nSee: `deleteAllItems/1`","ref":"wxListCtrl.html#deleteItem/2"},{"type":"function","title":"wxListCtrl.destroy/1","doc":"Destroys the object","ref":"wxListCtrl.html#destroy/1"},{"type":"function","title":"wxListCtrl.editLabel/2","doc":"Starts editing the label of the given item.\n\nThis function generates a `EVT_LIST_BEGIN_LABEL_EDIT` event which can be vetoed so that\nno text control will appear for in-place editing.\n\nIf the user changed the label (i.e. s/he does not press ESC or leave the text control\nwithout changes, a `EVT_LIST_END_LABEL_EDIT` event will be sent which can be vetoed as\nwell.","ref":"wxListCtrl.html#editLabel/2"},{"type":"function","title":"wxListCtrl.ensureVisible/2","doc":"Ensures this item is visible.","ref":"wxListCtrl.html#ensureVisible/2"},{"type":"function","title":"wxListCtrl.findItem/3","doc":"","ref":"wxListCtrl.html#findItem/3"},{"type":"function","title":"wxListCtrl.findItem/4","doc":"Find an item nearest this position in the specified direction, starting from `start` or\nthe beginning if `start` is -1.\n\nReturn: The next matching item if any or `-1` (wxNOT_FOUND) otherwise.","ref":"wxListCtrl.html#findItem/4"},{"type":"function","title":"wxListCtrl.getColumn/3","doc":"Gets information about this column.\n\nSee `setItem/5` for more information.","ref":"wxListCtrl.html#getColumn/3"},{"type":"function","title":"wxListCtrl.getColumnCount/1","doc":"Returns the number of columns.","ref":"wxListCtrl.html#getColumnCount/1"},{"type":"function","title":"wxListCtrl.getColumnWidth/2","doc":"Gets the column width (report view only).","ref":"wxListCtrl.html#getColumnWidth/2"},{"type":"function","title":"wxListCtrl.getCountPerPage/1","doc":"Gets the number of items that can fit vertically in the visible area of the list control\n(list or report view) or the total number of items in the list control (icon or small icon\nview).","ref":"wxListCtrl.html#getCountPerPage/1"},{"type":"function","title":"wxListCtrl.getEditControl/1","doc":"Returns the edit control being currently used to edit a label.\n\nReturns NULL if no label is being edited.\n\nNote: It is currently only implemented for wxMSW and the generic version, not for the\nnative macOS version.","ref":"wxListCtrl.html#getEditControl/1"},{"type":"function","title":"wxListCtrl.getImageList/2","doc":"Returns the specified image list.\n\n`which` may be one of:\n\n* wxIMAGE_LIST_NORMAL: The normal (large icon) image list.\n\n* wxIMAGE_LIST_SMALL: The small icon image list.\n\n* wxIMAGE_LIST_STATE: The user-defined state image list (unimplemented).","ref":"wxListCtrl.html#getImageList/2"},{"type":"function","title":"wxListCtrl.getItem/2","doc":"Gets information about the item.\n\nSee `setItem/5` for more information.\n\nYou must call `info.SetId()` to set the ID of item you're interested in before calling\nthis method, and `info.SetMask()` with the flags indicating what fields you need to\nretrieve from `info`.","ref":"wxListCtrl.html#getItem/2"},{"type":"function","title":"wxListCtrl.getItemBackgroundColour/2","doc":"Returns the colour for this item.\n\nIf the item has no specific colour, returns an invalid colour (and not the default\nbackground control of the control itself).\n\nSee: `getItemTextColour/2`","ref":"wxListCtrl.html#getItemBackgroundColour/2"},{"type":"function","title":"wxListCtrl.getItemCount/1","doc":"Returns the number of items in the list control.","ref":"wxListCtrl.html#getItemCount/1"},{"type":"function","title":"wxListCtrl.getItemData/2","doc":"Gets the application-defined data associated with this item.","ref":"wxListCtrl.html#getItemData/2"},{"type":"function","title":"wxListCtrl.getItemFont/2","doc":"Returns the item's font.","ref":"wxListCtrl.html#getItemFont/2"},{"type":"function","title":"wxListCtrl.getItemPosition/2","doc":"Returns the position of the item, in icon or small icon view.","ref":"wxListCtrl.html#getItemPosition/2"},{"type":"function","title":"wxListCtrl.getItemRect/2","doc":"","ref":"wxListCtrl.html#getItemRect/2"},{"type":"function","title":"wxListCtrl.getItemRect/3","doc":"Returns the rectangle representing the item's size and position, in physical coordinates.\n\n`code` is one of wxLIST_RECT_BOUNDS, wxLIST_RECT_ICON, wxLIST_RECT_LABEL.","ref":"wxListCtrl.html#getItemRect/3"},{"type":"function","title":"wxListCtrl.getItemSpacing/1","doc":"Retrieves the spacing between icons in pixels: horizontal spacing is returned as `x`\ncomponent of the {Width,Height} object and the vertical spacing as its `y` component.","ref":"wxListCtrl.html#getItemSpacing/1"},{"type":"function","title":"wxListCtrl.getItemState/3","doc":"Gets the item state.\n\nFor a list of state flags, see `setItem/5`. The `stateMask` indicates which state flags are of\ninterest.","ref":"wxListCtrl.html#getItemState/3"},{"type":"function","title":"wxListCtrl.getItemText/2","doc":"","ref":"wxListCtrl.html#getItemText/2"},{"type":"function","title":"wxListCtrl.getItemText/3","doc":"Gets the item text for this item.","ref":"wxListCtrl.html#getItemText/3"},{"type":"function","title":"wxListCtrl.getItemTextColour/2","doc":"Returns the colour for this item.\n\nIf the item has no specific colour, returns an invalid colour (and not the default\nforeground control of the control itself as this wouldn't allow distinguishing between\nitems having the same colour as the current control foreground and items with default\ncolour which, hence, have always the same colour as the control).","ref":"wxListCtrl.html#getItemTextColour/2"},{"type":"function","title":"wxListCtrl.getNextItem/2","doc":"","ref":"wxListCtrl.html#getNextItem/2"},{"type":"function","title":"wxListCtrl.getNextItem/3","doc":"Searches for an item with the given geometry or state, starting from `item` but excluding\nthe `item` itself.\n\nIf `item` is -1, the first item that matches the specified flags will be returned.\nReturns the first item with given state following `item` or -1 if no such item found. This\nfunction may be used to find all selected items in the control like this:\n\n`geometry` can be one of:\n\n* wxLIST_NEXT_ABOVE: Searches for an item above the specified item.\n\n* wxLIST_NEXT_ALL: Searches for subsequent item by index.\n\n* wxLIST_NEXT_BELOW: Searches for an item below the specified item.\n\n* wxLIST_NEXT_LEFT: Searches for an item to the left of the specified item.\n\n* wxLIST_NEXT_RIGHT: Searches for an item to the right of the specified item.\n\nNote: this parameter is only supported by wxMSW currently and ignored on other platforms.\n\n`state` can be a bitlist of the following:\n\n* wxLIST_STATE_DONTCARE: Don't care what the state is.\n\n* wxLIST_STATE_DROPHILITED: The item indicates it is a drop target.\n\n* wxLIST_STATE_FOCUSED: The item has the focus.\n\n* wxLIST_STATE_SELECTED: The item is selected.\n\n* wxLIST_STATE_CUT: The item is selected as part of a cut and paste operation.","ref":"wxListCtrl.html#getNextItem/3"},{"type":"function","title":"wxListCtrl.getSelectedItemCount/1","doc":"Returns the number of selected items in the list control.","ref":"wxListCtrl.html#getSelectedItemCount/1"},{"type":"function","title":"wxListCtrl.getTextColour/1","doc":"Gets the text colour of the list control.","ref":"wxListCtrl.html#getTextColour/1"},{"type":"function","title":"wxListCtrl.getTopItem/1","doc":"Gets the index of the topmost visible item when in list or report view.","ref":"wxListCtrl.html#getTopItem/1"},{"type":"function","title":"wxListCtrl.getViewRect/1","doc":"Returns the rectangle taken by all items in the control.\n\nIn other words, if the controls client size were equal to the size of this rectangle, no\nscrollbars would be needed and no free space would be left.\n\nNote that this function only works in the icon and small icon views, not in list or\nreport views (this is a limitation of the native Win32 control).","ref":"wxListCtrl.html#getViewRect/1"},{"type":"function","title":"wxListCtrl.hitTest/2","doc":"Determines which item (if any) is at the specified point, giving details in `flags`.\n\nReturns index of the item or `wxNOT_FOUND` if no item is at the specified point.\n\n`flags` will be a combination of the following flags:\n\n* wxLIST_HITTEST_ABOVE: Above the control's client area.\n\n* wxLIST_HITTEST_BELOW: Below the control's client area.\n\n* wxLIST_HITTEST_TOLEFT: To the left of the control's client area.\n\n* wxLIST_HITTEST_TORIGHT: To the right of the control's client area.\n\n* wxLIST_HITTEST_NOWHERE: Inside the control's client area but not over an item.\n\n* wxLIST_HITTEST_ONITEMICON: Over an item's icon.\n\n* wxLIST_HITTEST_ONITEMLABEL: Over an item's text.\n\n* wxLIST_HITTEST_ONITEMSTATEICON: Over the checkbox of an item.\n\n* wxLIST_HITTEST_ONITEM: Combination of `wxLIST_HITTEST_ONITEMICON`, `wxLIST_HITTEST_ONITEMLABEL`, `wxLIST_HITTEST_ONITEMSTATEICON`.\n\nIf `ptrSubItem` is not NULL and the `m:wxListCtrl` is in the report mode the subitem (or\ncolumn) number will also be provided. This feature is only available in version 2.7.0 or\nhigher and is currently only implemented under wxMSW and requires at least comctl32.dll of\nversion 4.70 on the host system or the value stored in `ptrSubItem` will be always -1. To\ncompile this feature into wxWidgets library you need to have access to commctrl.h of\nversion 4.70 that is provided by Microsoft.","ref":"wxListCtrl.html#hitTest/2"},{"type":"function","title":"wxListCtrl.insertColumn/3","doc":"For report view mode (only), inserts a column.\n\nFor more details, see `setItem/5`. Also see `insertColumn/4` overload for a usually more convenient alternative to\nthis method and the description of how the item width is interpreted by this method.","ref":"wxListCtrl.html#insertColumn/3"},{"type":"function","title":"wxListCtrl.insertColumn/4","doc":"For report view mode (only), inserts a column.\n\nInsert a new column in the list control in report view mode at the given position\nspecifying its most common attributes.\n\nNotice that to set the image for the column you need to use `insertColumn/4` overload and specify\n?wxLIST\\_MASK\\_IMAGE in the item mask.\n\nReturn: The index of the inserted column or -1 if adding it failed.","ref":"wxListCtrl.html#insertColumn/4"},{"type":"function","title":"wxListCtrl.insertItem/2","doc":"Inserts an item, returning the index of the new item if successful, -1 otherwise.","ref":"wxListCtrl.html#insertItem/2"},{"type":"function","title":"wxListCtrl.insertItem/3","doc":"Insert a string item.","ref":"wxListCtrl.html#insertItem/3"},{"type":"function","title":"wxListCtrl.insertItem/4","doc":"Insert an image/string item.","ref":"wxListCtrl.html#insertItem/4"},{"type":"function","title":"wxListCtrl.new/0","doc":"","ref":"wxListCtrl.html#new/0"},{"type":"function","title":"wxListCtrl.new/1","doc":"","ref":"wxListCtrl.html#new/1"},{"type":"function","title":"wxListCtrl.new/2","doc":"","ref":"wxListCtrl.html#new/2"},{"type":"function","title":"wxListCtrl.refreshItem/2","doc":"Redraws the given `item`.\n\nThis is only useful for the virtual list controls as without calling this function the\ndisplayed value of the item doesn't change even when the underlying data does change.\n\nSee: `refreshItems/3`","ref":"wxListCtrl.html#refreshItem/2"},{"type":"function","title":"wxListCtrl.refreshItems/3","doc":"Redraws the items between `itemFrom` and `itemTo`.\n\nThe starting item must be less than or equal to the ending one.\n\nJust as `refreshItem/2` this is only useful for virtual list controls.","ref":"wxListCtrl.html#refreshItems/3"},{"type":"function","title":"wxListCtrl.scrollList/3","doc":"Scrolls the list control.\n\nIf in icon, small icon or report view mode, `dx` specifies the number of pixels to\nscroll. If in list view mode, `dx` specifies the number of columns to scroll. `dy` always\nspecifies the number of pixels to scroll vertically.\n\nNote: This method is currently only implemented in the Windows version.","ref":"wxListCtrl.html#scrollList/3"},{"type":"function","title":"wxListCtrl.setBackgroundColour/2","doc":"Sets the background colour.\n\nNote that the `wxWindow:getBackgroundColour/1` function of `m:wxWindow` base class can be used to retrieve the current\nbackground colour.","ref":"wxListCtrl.html#setBackgroundColour/2"},{"type":"function","title":"wxListCtrl.setColumn/3","doc":"Sets information about this column.\n\nSee `setItem/5` for more information.","ref":"wxListCtrl.html#setColumn/3"},{"type":"function","title":"wxListCtrl.setColumnWidth/3","doc":"Sets the column width.\n\n`width` can be a width in pixels or `wxLIST_AUTOSIZE` (-1) or `wxLIST_AUTOSIZE_USEHEADER` (-2).\n\n`wxLIST_AUTOSIZE` will resize the column to the length of its longest item.\n\n`wxLIST_AUTOSIZE_USEHEADER` will resize the column to the length of the header (Win32) or\n80 pixels (other platforms).\n\nIn small or normal icon view, `col` must be -1, and the column width is set for all\ncolumns.","ref":"wxListCtrl.html#setColumnWidth/3"},{"type":"function","title":"wxListCtrl.setImageList/3","doc":"Sets the image list associated with the control.\n\n`which` is one of `wxIMAGE_LIST_NORMAL`, `wxIMAGE_LIST_SMALL`, `wxIMAGE_LIST_STATE` (the\nlast is unimplemented).\n\nThis method does not take ownership of the image list, you have to delete it yourself.\n\nSee: `assignImageList/3`","ref":"wxListCtrl.html#setImageList/3"},{"type":"function","title":"wxListCtrl.setItem/2","doc":"Sets the data of an item.\n\nUsing the `m:wxListItem`'s mask and state mask, you can change only selected attributes\nof a `m:wxListCtrl` item.\n\nReturn: true if the item was successfully updated or false if the update failed for some\nreason (e.g. an invalid item index).","ref":"wxListCtrl.html#setItem/2"},{"type":"function","title":"wxListCtrl.setItem/4","doc":"","ref":"wxListCtrl.html#setItem/4"},{"type":"function","title":"wxListCtrl.setItem/5","doc":"Sets an item string field at a particular column.\n\nReturn: true if the item was successfully updated or false if the update failed for some\nreason (e.g. an invalid item index).","ref":"wxListCtrl.html#setItem/5"},{"type":"function","title":"wxListCtrl.setItemBackgroundColour/3","doc":"Sets the background colour for this item.\n\nThis function only works in report view mode. The colour can be retrieved using `getItemBackgroundColour/2`.","ref":"wxListCtrl.html#setItemBackgroundColour/3"},{"type":"function","title":"wxListCtrl.setItemColumnImage/4","doc":"Sets the image associated with the item.\n\nIn report view, you can specify the column. The image is an index into the image list\nassociated with the list control.","ref":"wxListCtrl.html#setItemColumnImage/4"},{"type":"function","title":"wxListCtrl.setItemCount/2","doc":"This method can only be used with virtual list controls.\n\nIt is used to indicate to the control the number of items it contains. After calling it,\nthe main program should be ready to handle calls to various item callbacks (such as `wxListCtrl::OnGetItemText`\n(not implemented in wx)) for all items in the range from 0 to `count`.\n\nNotice that the control is not necessarily redrawn after this call as it may be\nundesirable if an item which is not visible on the screen anyhow was added to or removed\nfrom a control displaying many items, if you do need to refresh the display you can just\ncall `wxWindow:refresh/2` manually.","ref":"wxListCtrl.html#setItemCount/2"},{"type":"function","title":"wxListCtrl.setItemData/3","doc":"Associates application-defined data with this item.\n\nNotice that this function cannot be used to associate pointers with the control items,\nuse `SetItemPtrData()` (not implemented in wx) instead.","ref":"wxListCtrl.html#setItemData/3"},{"type":"function","title":"wxListCtrl.setItemFont/3","doc":"Sets the item's font.","ref":"wxListCtrl.html#setItemFont/3"},{"type":"function","title":"wxListCtrl.setItemImage/3","doc":"","ref":"wxListCtrl.html#setItemImage/3"},{"type":"function","title":"wxListCtrl.setItemImage/4","doc":"Sets the unselected and selected images associated with the item.\n\nThe images are indices into the image list associated with the list control.","ref":"wxListCtrl.html#setItemImage/4"},{"type":"function","title":"wxListCtrl.setItemPosition/3","doc":"Sets the position of the item, in icon or small icon view.\n\nWindows only.","ref":"wxListCtrl.html#setItemPosition/3"},{"type":"function","title":"wxListCtrl.setItemState/4","doc":"Sets the item state.\n\nThe `stateMask` is a combination of `wxLIST_STATE_XXX` constants described in `m:wxListItem`\ndocumentation. For each of the bits specified in `stateMask`, the corresponding state is\nset or cleared depending on whether `state` argument contains the same bit or not.\n\nSo to select an item you can use while to deselect it you should use\n\nConsider using `m:wxListView` if possible to avoid dealing with this error-prone and\nconfusing method.\n\nAlso notice that contrary to the usual rule that only user actions generate events, this\nmethod does generate wxEVT_LIST_ITEM_SELECTED event when it is used to select an item.","ref":"wxListCtrl.html#setItemState/4"},{"type":"function","title":"wxListCtrl.setItemText/3","doc":"Sets the item text for this item.","ref":"wxListCtrl.html#setItemText/3"},{"type":"function","title":"wxListCtrl.setItemTextColour/3","doc":"Sets the colour for this item.\n\nThis function only works in report view. The colour can be retrieved using `getItemTextColour/2`.","ref":"wxListCtrl.html#setItemTextColour/3"},{"type":"function","title":"wxListCtrl.setSingleStyle/2","doc":"","ref":"wxListCtrl.html#setSingleStyle/2"},{"type":"function","title":"wxListCtrl.setSingleStyle/3","doc":"Adds or removes a single window style.","ref":"wxListCtrl.html#setSingleStyle/3"},{"type":"function","title":"wxListCtrl.setTextColour/2","doc":"Sets the text colour of the list control.","ref":"wxListCtrl.html#setTextColour/2"},{"type":"function","title":"wxListCtrl.setWindowStyleFlag/2","doc":"Sets the whole window style, deleting all items.","ref":"wxListCtrl.html#setWindowStyleFlag/2"},{"type":"function","title":"wxListCtrl.sortItems/2","doc":"","ref":"wxListCtrl.html#sortItems/2"},{"type":"type","title":"wxListCtrl.wxListCtrl/0","doc":"","ref":"wxListCtrl.html#t:wxListCtrl/0"},{"type":"module","title":"wxListEvent","doc":"A list event holds information about events associated with `m:wxListCtrl` objects.\n\nSee: `m:wxListCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxListEvent](https://docs.wxwidgets.org/3.2/classwx_list_event.html)","ref":"wxListEvent.html"},{"type":"module","title":"Events - wxListEvent","doc":"Use `wxEvtHandler:connect/3` with `wxListEventType` to subscribe to events of this type.","ref":"wxListEvent.html#module-events"},{"type":"function","title":"wxListEvent.getCacheFrom/1","doc":"For `EVT\\_LIST\\_CACHE\\_HINT` event only: return the first item which the list control\nadvises us to cache.","ref":"wxListEvent.html#getCacheFrom/1"},{"type":"function","title":"wxListEvent.getCacheTo/1","doc":"For `EVT\\_LIST\\_CACHE\\_HINT` event only: return the last item (inclusive) which the list\ncontrol advises us to cache.","ref":"wxListEvent.html#getCacheTo/1"},{"type":"function","title":"wxListEvent.getColumn/1","doc":"The column position: it is only used with `COL` events.\n\nFor the column dragging events, it is the column to the left of the divider being\ndragged, for the column click events it may be -1 if the user clicked in the list control\nheader outside any column.","ref":"wxListEvent.html#getColumn/1"},{"type":"function","title":"wxListEvent.getData/1","doc":"The data.","ref":"wxListEvent.html#getData/1"},{"type":"function","title":"wxListEvent.getImage/1","doc":"The image.","ref":"wxListEvent.html#getImage/1"},{"type":"function","title":"wxListEvent.getIndex/1","doc":"The item index.","ref":"wxListEvent.html#getIndex/1"},{"type":"function","title":"wxListEvent.getItem/1","doc":"An item object, used by some events.\n\nSee also `wxListCtrl:setItem/5`.","ref":"wxListEvent.html#getItem/1"},{"type":"function","title":"wxListEvent.getKeyCode/1","doc":"Key code if the event is a keypress event.","ref":"wxListEvent.html#getKeyCode/1"},{"type":"function","title":"wxListEvent.getLabel/1","doc":"The (new) item label for `EVT_LIST_END_LABEL_EDIT` event.","ref":"wxListEvent.html#getLabel/1"},{"type":"function","title":"wxListEvent.getMask/1","doc":"The mask.","ref":"wxListEvent.html#getMask/1"},{"type":"function","title":"wxListEvent.getPoint/1","doc":"The position of the mouse pointer if the event is a drag event.","ref":"wxListEvent.html#getPoint/1"},{"type":"function","title":"wxListEvent.getText/1","doc":"The text.","ref":"wxListEvent.html#getText/1"},{"type":"function","title":"wxListEvent.isEditCancelled/1","doc":"This method only makes sense for `EVT\\_LIST\\_END\\_LABEL\\_EDIT` message and returns true\nif it the label editing has been cancelled by the user (`getLabel/1` returns an empty\nstring in this case but it doesn't allow the application to distinguish between really\ncancelling the edit and the admittedly rare case when the user wants to rename it to an\nempty string).","ref":"wxListEvent.html#isEditCancelled/1"},{"type":"type","title":"wxListEvent.wxList/0","doc":"","ref":"wxListEvent.html#t:wxList/0"},{"type":"type","title":"wxListEvent.wxListEvent/0","doc":"","ref":"wxListEvent.html#t:wxListEvent/0"},{"type":"type","title":"wxListEvent.wxListEventType/0","doc":"","ref":"wxListEvent.html#t:wxListEventType/0"},{"type":"module","title":"wxListItem","doc":"This class stores information about a `m:wxListCtrl` item or column.\n\n`m:wxListItem` is a class which contains information about:\n\n* Zero based item position; see `setId/2` and `getId/1`.\n\n* Zero based column index; see `setColumn/2` and `getColumn/1`.\n\n* The label (or header for columns); see `setText/2` and `getText/1`.\n\n* The zero based index into an image list; see `getImage/1` and `setImage/2`.\n\n* Application defined data; see `SetData()` (not implemented in wx) and `GetData()` (not\nimplemented in wx).\n\n* For columns only: the width of the column; see `setWidth/2` and `getWidth/1`.\n\n* For columns only: the format of the column; one of `wxLIST_FORMAT_LEFT`, `wxLIST_FORMAT_RIGHT`, `wxLIST_FORMAT_CENTRE`.\nSee `setAlign/2` and `getAlign/1`.\n\n* The state of the item; see `setState/2` and `getState/1`. This is a bitlist of the following flags:\n\n* `wxLIST_STATE_FOCUSED:` The item has the focus.\n\n* `wxLIST_STATE_SELECTED:` The item is selected.\n\n* `wxLIST_STATE_DONTCARE:` No special flags (the value of this constant is 0).\n\n* `wxLIST_STATE_DROPHILITED:` The item is highlighted to receive a drop event. Win32 only.\n\n* `wxLIST_STATE_CUT:` The item is in the cut state. Win32 only.\n\n* A mask indicating which state flags are valid; this is a bitlist of the flags reported\nabove for the item state. See `setStateMask/2` and GetStateMask().\n\n* A mask indicating which fields of this class are valid; see `setMask/2` and `getMask/1`. This is a bitlist of\nthe following flags:\n\n* `wxLIST_MASK_STATE:` The state field is valid.\n\n* `wxLIST_MASK_TEXT:` The label field is valid.\n\n* `wxLIST_MASK_IMAGE:` The image field is valid.\n\n* `wxLIST_MASK_DATA:` The application-defined data field is valid.\n\n* `wxLIST_MASK_WIDTH:` The column width field is valid.\n\n* `wxLIST_MASK_FORMAT:` The column format field is valid.\n\nThe `m:wxListItem` object can also contain item-specific colour and font information: for\nthis you need to call one of `setTextColour/2`, `setBackgroundColour/2` or `setFont/2` functions on it passing it the colour/font to use. If\nthe colour/font is not specified, the default list control colour/font is used.\n\nSee: `m:wxListCtrl`\n\nwxWidgets docs: [wxListItem](https://docs.wxwidgets.org/3.2/classwx_list_item.html)","ref":"wxListItem.html"},{"type":"function","title":"wxListItem.clear/1","doc":"Resets the item state to the default.","ref":"wxListItem.html#clear/1"},{"type":"function","title":"wxListItem.destroy/1","doc":"Destroys the object","ref":"wxListItem.html#destroy/1"},{"type":"function","title":"wxListItem.getAlign/1","doc":"Returns the alignment for this item.\n\nCan be one of `wxLIST_FORMAT_LEFT`, `wxLIST_FORMAT_RIGHT` or `wxLIST_FORMAT_CENTRE`.","ref":"wxListItem.html#getAlign/1"},{"type":"function","title":"wxListItem.getBackgroundColour/1","doc":"Returns the background colour for this item.","ref":"wxListItem.html#getBackgroundColour/1"},{"type":"function","title":"wxListItem.getColumn/1","doc":"Returns the zero-based column; meaningful only in report mode.","ref":"wxListItem.html#getColumn/1"},{"type":"function","title":"wxListItem.getFont/1","doc":"Returns the font used to display the item.","ref":"wxListItem.html#getFont/1"},{"type":"function","title":"wxListItem.getId/1","doc":"Returns the zero-based item position.","ref":"wxListItem.html#getId/1"},{"type":"function","title":"wxListItem.getImage/1","doc":"Returns the zero-based index of the image associated with the item into the image list.","ref":"wxListItem.html#getImage/1"},{"type":"function","title":"wxListItem.getMask/1","doc":"Returns a bit mask indicating which fields of the structure are valid.\n\nCan be any combination of the following values:\n\n* wxLIST_MASK_STATE: `GetState` is valid.\n\n* wxLIST_MASK_TEXT: `GetText` is valid.\n\n* wxLIST_MASK_IMAGE: `GetImage` is valid.\n\n* wxLIST_MASK_DATA: `GetData` is valid.\n\n* wxLIST_MASK_WIDTH: `GetWidth` is valid.\n\n* wxLIST_MASK_FORMAT: `GetFormat` is valid.","ref":"wxListItem.html#getMask/1"},{"type":"function","title":"wxListItem.getState/1","doc":"Returns a bit field representing the state of the item.\n\nCan be any combination of:\n\n* wxLIST_STATE_DONTCARE: No special flags (the values of this constant is 0).\n\n* wxLIST_STATE_DROPHILITED: The item is highlighted to receive a drop event. Win32 only.\n\n* wxLIST_STATE_FOCUSED: The item has the focus.\n\n* wxLIST_STATE_SELECTED: The item is selected.\n\n* wxLIST_STATE_CUT: The item is in the cut state. Win32 only.","ref":"wxListItem.html#getState/1"},{"type":"function","title":"wxListItem.getText/1","doc":"Returns the label/header text.","ref":"wxListItem.html#getText/1"},{"type":"function","title":"wxListItem.getTextColour/1","doc":"Returns the text colour.","ref":"wxListItem.html#getTextColour/1"},{"type":"function","title":"wxListItem.getWidth/1","doc":"Meaningful only for column headers in report mode.\n\nReturns the column width.","ref":"wxListItem.html#getWidth/1"},{"type":"function","title":"wxListItem.new/0","doc":"Constructor.","ref":"wxListItem.html#new/0"},{"type":"function","title":"wxListItem.new/1","doc":"","ref":"wxListItem.html#new/1"},{"type":"function","title":"wxListItem.setAlign/2","doc":"Sets the alignment for the item.\n\nSee also `getAlign/1`","ref":"wxListItem.html#setAlign/2"},{"type":"function","title":"wxListItem.setBackgroundColour/2","doc":"Sets the background colour for the item.","ref":"wxListItem.html#setBackgroundColour/2"},{"type":"function","title":"wxListItem.setColumn/2","doc":"Sets the zero-based column.\n\nMeaningful only in report mode.","ref":"wxListItem.html#setColumn/2"},{"type":"function","title":"wxListItem.setFont/2","doc":"Sets the font for the item.","ref":"wxListItem.html#setFont/2"},{"type":"function","title":"wxListItem.setId/2","doc":"Sets the zero-based item position.","ref":"wxListItem.html#setId/2"},{"type":"function","title":"wxListItem.setImage/2","doc":"Sets the zero-based index of the image associated with the item into the image list.","ref":"wxListItem.html#setImage/2"},{"type":"function","title":"wxListItem.setMask/2","doc":"Sets the mask of valid fields.\n\nSee `getMask/1`.","ref":"wxListItem.html#setMask/2"},{"type":"function","title":"wxListItem.setState/2","doc":"Sets the item state flags (note that the valid state flags are influenced by the value of\nthe state mask, see `setStateMask/2`).\n\nSee `getState/1` for valid flag values.","ref":"wxListItem.html#setState/2"},{"type":"function","title":"wxListItem.setStateMask/2","doc":"Sets the bitmask that is used to determine which of the state flags are to be set.\n\nSee also `setState/2`.","ref":"wxListItem.html#setStateMask/2"},{"type":"function","title":"wxListItem.setText/2","doc":"Sets the text label for the item.","ref":"wxListItem.html#setText/2"},{"type":"function","title":"wxListItem.setTextColour/2","doc":"Sets the text colour for the item.","ref":"wxListItem.html#setTextColour/2"},{"type":"function","title":"wxListItem.setWidth/2","doc":"Meaningful only for column headers in report mode.\n\nSets the column width.","ref":"wxListItem.html#setWidth/2"},{"type":"type","title":"wxListItem.wxListItem/0","doc":"","ref":"wxListItem.html#t:wxListItem/0"},{"type":"module","title":"wxListItemAttr","doc":"Functions for wxListItemAttr class\n\nwxWidgets docs: [wxListItemAttr](https://docs.wxwidgets.org/3.2/classwx_list_item_attr.html)","ref":"wxListItemAttr.html"},{"type":"function","title":"wxListItemAttr.destroy/1","doc":"Destroys the object","ref":"wxListItemAttr.html#destroy/1"},{"type":"function","title":"wxListItemAttr.getBackgroundColour/1","doc":"","ref":"wxListItemAttr.html#getBackgroundColour/1"},{"type":"function","title":"wxListItemAttr.getFont/1","doc":"","ref":"wxListItemAttr.html#getFont/1"},{"type":"function","title":"wxListItemAttr.getTextColour/1","doc":"","ref":"wxListItemAttr.html#getTextColour/1"},{"type":"function","title":"wxListItemAttr.hasBackgroundColour/1","doc":"","ref":"wxListItemAttr.html#hasBackgroundColour/1"},{"type":"function","title":"wxListItemAttr.hasFont/1","doc":"","ref":"wxListItemAttr.html#hasFont/1"},{"type":"function","title":"wxListItemAttr.hasTextColour/1","doc":"","ref":"wxListItemAttr.html#hasTextColour/1"},{"type":"function","title":"wxListItemAttr.new/0","doc":"","ref":"wxListItemAttr.html#new/0"},{"type":"function","title":"wxListItemAttr.new/3","doc":"","ref":"wxListItemAttr.html#new/3"},{"type":"function","title":"wxListItemAttr.setBackgroundColour/2","doc":"","ref":"wxListItemAttr.html#setBackgroundColour/2"},{"type":"function","title":"wxListItemAttr.setFont/2","doc":"","ref":"wxListItemAttr.html#setFont/2"},{"type":"function","title":"wxListItemAttr.setTextColour/2","doc":"","ref":"wxListItemAttr.html#setTextColour/2"},{"type":"type","title":"wxListItemAttr.wxListItemAttr/0","doc":"","ref":"wxListItemAttr.html#t:wxListItemAttr/0"},{"type":"module","title":"wxListView","doc":"This class currently simply presents a simpler to use interface for the `m:wxListCtrl` --\nit can be thought of as a `façade` for that complicated class.\n\nUsing it is preferable to using `m:wxListCtrl` directly whenever possible because in the\nfuture some ports might implement `m:wxListView` but not the full set of `m:wxListCtrl` features.\n\nOther than different interface, this class is identical to `m:wxListCtrl`. In particular,\nit uses the same events, same window styles and so on.\n\nSee: `setColumnImage/3`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListView](https://docs.wxwidgets.org/3.2/classwx_list_view.html)","ref":"wxListView.html"},{"type":"function","title":"wxListView.clearColumnImage/2","doc":"Resets the column image -- after calling this function, no image will be shown.\n\nSee: `setColumnImage/3`","ref":"wxListView.html#clearColumnImage/2"},{"type":"function","title":"wxListView.focus/2","doc":"Sets focus to the item with the given `index`.","ref":"wxListView.html#focus/2"},{"type":"function","title":"wxListView.getFirstSelected/1","doc":"Returns the first selected item in a (presumably) multiple selection control.\n\nTogether with `getNextSelected/2` it can be used to iterate over all selected items in the control.\n\nReturn: The first selected item, if any, -1 otherwise.","ref":"wxListView.html#getFirstSelected/1"},{"type":"function","title":"wxListView.getFocusedItem/1","doc":"Returns the currently focused item or -1 if none.\n\nSee:\n* `isSelected/2`\n\n* `focus/2`","ref":"wxListView.html#getFocusedItem/1"},{"type":"function","title":"wxListView.getNextSelected/2","doc":"Used together with `getFirstSelected/1` to iterate over all selected items in the\ncontrol.\n\nReturn: Returns the next selected item or -1 if there are no more of them.","ref":"wxListView.html#getNextSelected/2"},{"type":"function","title":"wxListView.isSelected/2","doc":"Returns true if the item with the given `index` is selected, false otherwise.\n\nSee:\n* `getFirstSelected/1`\n\n* `getNextSelected/2`","ref":"wxListView.html#isSelected/2"},{"type":"function","title":"wxListView.select/2","doc":"","ref":"wxListView.html#select/2"},{"type":"function","title":"wxListView.select/3","doc":"Selects or unselects the given item.\n\nNotice that this method inherits the unusual behaviour of `wxListCtrl:setItemState/4` which sends a\nwxEVT_LIST_ITEM_SELECTED event when it is used to select an item, contrary to the usual\nrule that only the user actions result in selection.","ref":"wxListView.html#select/3"},{"type":"function","title":"wxListView.setColumnImage/3","doc":"Sets the column image for the specified column.\n\nTo use the column images, the control must have a valid image list with at least one image.","ref":"wxListView.html#setColumnImage/3"},{"type":"type","title":"wxListView.wxListView/0","doc":"","ref":"wxListView.html#t:wxListView/0"},{"type":"module","title":"wxListbook","doc":"`m:wxListbook` is a class similar to `m:wxNotebook` but which uses a `m:wxListCtrl` to\nshow the labels instead of the tabs.\n\nThe underlying `m:wxListCtrl` displays page labels in a one-column report view by\ndefault. Calling wxBookCtrl::SetImageList will implicitly switch the control to use an\nicon view.\n\nFor usage documentation of this class, please refer to the base abstract class\nwxBookCtrl. You can also use the page_samples_notebook to see `m:wxListbook` in action.","ref":"wxListbook.html"},{"type":"module","title":"Styles - wxListbook","doc":"This class supports the following styles:\n\n* wxLB_DEFAULT: Choose the default location for the labels depending on the current\nplatform (left everywhere except Mac where it is top).\n\n* wxLB_TOP: Place labels above the page area.\n\n* wxLB_LEFT: Place labels on the left side.\n\n* wxLB_RIGHT: Place labels on the right side.\n\n* wxLB_BOTTOM: Place labels below the page area.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxListbook](https://docs.wxwidgets.org/3.2/classwx_listbook.html)","ref":"wxListbook.html#module-styles"},{"type":"module","title":"Events - wxListbook","doc":"Event types emitted from this class:\n\n* [`listbook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`listbook_page_changing`](`m:wxBookCtrlEvent`)","ref":"wxListbook.html#module-events"},{"type":"function","title":"wxListbook.addPage/3","doc":"","ref":"wxListbook.html#addPage/3"},{"type":"function","title":"wxListbook.addPage/4","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","ref":"wxListbook.html#addPage/4"},{"type":"function","title":"wxListbook.advanceSelection/1","doc":"","ref":"wxListbook.html#advanceSelection/1"},{"type":"function","title":"wxListbook.advanceSelection/2","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","ref":"wxListbook.html#advanceSelection/2"},{"type":"function","title":"wxListbook.assignImageList/2","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxListbook.html#assignImageList/2"},{"type":"function","title":"wxListbook.changeSelection/2","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","ref":"wxListbook.html#changeSelection/2"},{"type":"function","title":"wxListbook.create/3","doc":"","ref":"wxListbook.html#create/3"},{"type":"function","title":"wxListbook.create/4","doc":"Create the list book control that has already been constructed with the default\nconstructor.","ref":"wxListbook.html#create/4"},{"type":"function","title":"wxListbook.deleteAllPages/1","doc":"Deletes all pages.","ref":"wxListbook.html#deleteAllPages/1"},{"type":"function","title":"wxListbook.destroy/1","doc":"Destroys the object","ref":"wxListbook.html#destroy/1"},{"type":"function","title":"wxListbook.getCurrentPage/1","doc":"Returns the currently selected page or NULL.","ref":"wxListbook.html#getCurrentPage/1"},{"type":"function","title":"wxListbook.getImageList/1","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxListbook.html#getImageList/1"},{"type":"function","title":"wxListbook.getPage/2","doc":"Returns the window at the given page position.","ref":"wxListbook.html#getPage/2"},{"type":"function","title":"wxListbook.getPageCount/1","doc":"Returns the number of pages in the control.","ref":"wxListbook.html#getPageCount/1"},{"type":"function","title":"wxListbook.getPageImage/2","doc":"Returns the image index for the given page.","ref":"wxListbook.html#getPageImage/2"},{"type":"function","title":"wxListbook.getPageText/2","doc":"Returns the string for the given page.","ref":"wxListbook.html#getPageText/2"},{"type":"function","title":"wxListbook.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","ref":"wxListbook.html#getSelection/1"},{"type":"function","title":"wxListbook.hitTest/2","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","ref":"wxListbook.html#hitTest/2"},{"type":"function","title":"wxListbook.insertPage/4","doc":"","ref":"wxListbook.html#insertPage/4"},{"type":"function","title":"wxListbook.insertPage/5","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","ref":"wxListbook.html#insertPage/5"},{"type":"function","title":"wxListbook.new/0","doc":"Default ctor.","ref":"wxListbook.html#new/0"},{"type":"function","title":"wxListbook.new/2","doc":"","ref":"wxListbook.html#new/2"},{"type":"function","title":"wxListbook.new/3","doc":"Constructs a listbook control.","ref":"wxListbook.html#new/3"},{"type":"function","title":"wxListbook.setImageList/2","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","ref":"wxListbook.html#setImageList/2"},{"type":"function","title":"wxListbook.setPageImage/3","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","ref":"wxListbook.html#setPageImage/3"},{"type":"function","title":"wxListbook.setPageSize/2","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","ref":"wxListbook.html#setPageSize/2"},{"type":"function","title":"wxListbook.setPageText/3","doc":"Sets the text for the given page.","ref":"wxListbook.html#setPageText/3"},{"type":"function","title":"wxListbook.setSelection/2","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","ref":"wxListbook.html#setSelection/2"},{"type":"type","title":"wxListbook.wxListbook/0","doc":"","ref":"wxListbook.html#t:wxListbook/0"},{"type":"module","title":"wxLocale","doc":"`m:wxLocale` class encapsulates all language-dependent settings and is a generalization\nof the C locale concept.\n\nIn wxWidgets this class manages current locale. It also initializes and activates `wxTranslations`\n(not implemented in wx) object that manages message catalogs.\n\nFor a list of the supported languages, please see ?wxLanguage enum values. These\nconstants may be used to specify the language in `init/3` and are returned by `getSystemLanguage/0`.\n\nSee:\n* [Overview i18n](https://docs.wxwidgets.org/3.2/overview_i18n.html#overview_i18n)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_internat)\n\nwxWidgets docs: [wxLocale](https://docs.wxwidgets.org/3.2/classwx_locale.html)","ref":"wxLocale.html"},{"type":"function","title":"wxLocale.addCatalog/2","doc":"Calls wxTranslations::AddCatalog(const wxString&).","ref":"wxLocale.html#addCatalog/2"},{"type":"function","title":"wxLocale.addCatalog/3","doc":"Calls `wxTranslations::AddCatalog(const wxString&, wxLanguage)` (not implemented in wx).","ref":"wxLocale.html#addCatalog/3"},{"type":"function","title":"wxLocale.addCatalog/4","doc":"Calls `wxTranslations::AddCatalog(const wxString&, wxLanguage, const wxString&)` (not\nimplemented in wx).","ref":"wxLocale.html#addCatalog/4"},{"type":"function","title":"wxLocale.addCatalogLookupPathPrefix/1","doc":"Calls `wxFileTranslationsLoader::AddCatalogLookupPathPrefix()` (not implemented in wx).","ref":"wxLocale.html#addCatalogLookupPathPrefix/1"},{"type":"function","title":"wxLocale.destroy/1","doc":"Destroys the object","ref":"wxLocale.html#destroy/1"},{"type":"function","title":"wxLocale.getCanonicalName/1","doc":"Returns the canonical form of current locale name.\n\nCanonical form is the one that is used on UNIX systems: it is a two- or five-letter\nstring in xx or xx_YY format, where xx is ISO 639 code of language and YY is ISO 3166 code\nof the country. Examples are \"en\", \"en_GB\", \"en_US\" or \"fr_FR\". This form is internally\nused when looking up message catalogs. Compare `getSysName/1`.","ref":"wxLocale.html#getCanonicalName/1"},{"type":"function","title":"wxLocale.getHeaderValue/2","doc":"","ref":"wxLocale.html#getHeaderValue/2"},{"type":"function","title":"wxLocale.getHeaderValue/3","doc":"Calls `wxTranslations::GetHeaderValue()` (not implemented in wx).","ref":"wxLocale.html#getHeaderValue/3"},{"type":"function","title":"wxLocale.getLanguage/1","doc":"Returns the ?wxLanguage constant of current language.\n\nNote that you can call this function only if you used the form of `init/3` that takes ?wxLanguage\nargument.","ref":"wxLocale.html#getLanguage/1"},{"type":"function","title":"wxLocale.getLanguageName/1","doc":"Returns English name of the given language or empty string if this language is unknown.\n\nSee `GetLanguageInfo()` (not implemented in wx) for a remark about special meaning of `wxLANGUAGE_DEFAULT`.","ref":"wxLocale.html#getLanguageName/1"},{"type":"function","title":"wxLocale.getLocale/1","doc":"Returns the locale name as passed to the constructor or `init/3`.\n\nThis is a full, human-readable name, e.g. \"English\" or \"French\".","ref":"wxLocale.html#getLocale/1"},{"type":"function","title":"wxLocale.getName/1","doc":"Returns the current short name for the locale (as given to the constructor or the `init/3`\nfunction).","ref":"wxLocale.html#getName/1"},{"type":"function","title":"wxLocale.getString/2","doc":"","ref":"wxLocale.html#getString/2"},{"type":"function","title":"wxLocale.getString/3","doc":"Calls wxGetTranslation(const wxString&, const wxString&).","ref":"wxLocale.html#getString/3"},{"type":"function","title":"wxLocale.getString/4","doc":"","ref":"wxLocale.html#getString/4"},{"type":"function","title":"wxLocale.getString/5","doc":"Calls wxGetTranslation(const wxString&, const wxString&, unsigned, const wxString&).","ref":"wxLocale.html#getString/5"},{"type":"function","title":"wxLocale.getSysName/1","doc":"Returns current platform-specific locale name as passed to setlocale().\n\nCompare `getCanonicalName/1`.","ref":"wxLocale.html#getSysName/1"},{"type":"function","title":"wxLocale.getSystemEncoding/0","doc":"Tries to detect the user's default font encoding.\n\nReturns ?wxFontEncoding() value or `wxFONTENCODING_SYSTEM` if it couldn't be determined.","ref":"wxLocale.html#getSystemEncoding/0"},{"type":"function","title":"wxLocale.getSystemEncodingName/0","doc":"Tries to detect the name of the user's default font encoding.\n\nThis string isn't particularly useful for the application as its form is\nplatform-dependent and so you should probably use `getSystemEncoding/0` instead.\n\nReturns a user-readable string value or an empty string if it couldn't be determined.","ref":"wxLocale.html#getSystemEncodingName/0"},{"type":"function","title":"wxLocale.getSystemLanguage/0","doc":"Tries to detect the user's default locale setting.\n\nReturns the ?wxLanguage value or `wxLANGUAGE_UNKNOWN` if the language-guessing algorithm failed.\n\nNote: This function works with `locales` and returns the user's default locale. This may\nbe, and usually is, the same as their preferred UI language, but it's not the same thing.\nUse wxTranslation to obtain `language` information.","ref":"wxLocale.html#getSystemLanguage/0"},{"type":"function","title":"wxLocale.init/1","doc":"","ref":"wxLocale.html#init/1"},{"type":"function","title":"wxLocale.init/2","doc":"Initializes the `m:wxLocale` instance.\n\nThe call of this function has several global side effects which you should understand:\nfirst of all, the application locale is changed - note that this will affect many of\nstandard C library functions such as printf() or strftime(). Second, this `m:wxLocale`\nobject becomes the new current global locale for the application and so all subsequent\ncalls to ?wxGetTranslation() will try to translate the messages using the message catalogs\nfor this locale.\n\nReturn: true on success or false if the given locale couldn't be set.","ref":"wxLocale.html#init/2"},{"type":"function","title":"wxLocale.init/3","doc":"Deprecated:\n\nThis form is deprecated, use the other one unless you know what you are doing.","ref":"wxLocale.html#init/3"},{"type":"function","title":"wxLocale.isLoaded/2","doc":"Calls `wxTranslations::IsLoaded()` (not implemented in wx).","ref":"wxLocale.html#isLoaded/2"},{"type":"function","title":"wxLocale.isOk/1","doc":"Returns true if the locale could be set successfully.","ref":"wxLocale.html#isOk/1"},{"type":"function","title":"wxLocale.new/0","doc":"This is the default constructor and it does nothing to initialize the object: `init/3`\nmust be used to do that.","ref":"wxLocale.html#new/0"},{"type":"function","title":"wxLocale.new/1","doc":"Equivalent to: `new/2`","ref":"wxLocale.html#new/1"},{"type":"function","title":"wxLocale.new/2","doc":"See `init/3` for parameters description.\n\nThe call of this function has several global side effects which you should understand:\nfirst of all, the application locale is changed - note that this will affect many of\nstandard C library functions such as printf() or strftime(). Second, this `m:wxLocale`\nobject becomes the new current global locale for the application and so all subsequent\ncalls to ?wxGetTranslation() will try to translate the messages using the message catalogs\nfor this locale.","ref":"wxLocale.html#new/2"},{"type":"type","title":"wxLocale.wxLocale/0","doc":"","ref":"wxLocale.html#t:wxLocale/0"},{"type":"module","title":"wxLogNull","doc":"This class allows you to temporarily suspend logging.\n\nAll calls to the log functions during the life time of an object of this class are just ignored.\n\nIn particular, it can be used to suppress the log messages given by wxWidgets itself but\nit should be noted that it is rarely the best way to cope with this problem as `all` log\nmessages are suppressed, even if they indicate a completely different error than the one\nthe programmer wanted to suppress.\n\nFor instance, the example of the overview:\n\nwould be better written as:\n\nwxWidgets docs: [wxLogNull](https://docs.wxwidgets.org/3.2/classwx_log_null.html)","ref":"wxLogNull.html"},{"type":"function","title":"wxLogNull.destroy/1","doc":"Destroys the object","ref":"wxLogNull.html#destroy/1"},{"type":"function","title":"wxLogNull.new/0","doc":"Suspends logging.","ref":"wxLogNull.html#new/0"},{"type":"type","title":"wxLogNull.wxLogNull/0","doc":"","ref":"wxLogNull.html#t:wxLogNull/0"},{"type":"module","title":"wxMDIChildFrame","doc":"An MDI child frame is a frame that can only exist inside a `m:wxMDIClientWindow`, which\nis itself a child of `m:wxMDIParentFrame`.","ref":"wxMDIChildFrame.html"},{"type":"module","title":"Styles - wxMDIChildFrame","doc":"This class supports the following styles:\n\nAll of the standard `m:wxFrame` styles can be used but most of them are ignored by\nTDI-based MDI implementations.\n\nRemark: Although internally an MDI child frame is a child of the MDI client window, in\nwxWidgets you create it as a child of `m:wxMDIParentFrame`. In fact, you can usually\nforget that the client window exists. MDI child frames are clipped to the area of the MDI\nclient window, and may be iconized on the client window. You can associate a menubar with\na child frame as usual, although an MDI child doesn't display its menubar under its own\ntitle bar. The MDI parent frame's menubar will be changed to reflect the currently active\nchild frame. If there are currently no children, the parent frame's own menubar will be displayed.\n\nSee:\n* `m:wxMDIClientWindow`\n\n* `m:wxMDIParentFrame`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIChildFrame](https://docs.wxwidgets.org/3.2/classwx_m_d_i_child_frame.html)","ref":"wxMDIChildFrame.html#module-styles"},{"type":"function","title":"wxMDIChildFrame.activate/1","doc":"Activates this MDI child frame.\n\nSee:\n* `maximize/2`\n\n* `restore/1`","ref":"wxMDIChildFrame.html#activate/1"},{"type":"function","title":"wxMDIChildFrame.create/4","doc":"","ref":"wxMDIChildFrame.html#create/4"},{"type":"function","title":"wxMDIChildFrame.create/5","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","ref":"wxMDIChildFrame.html#create/5"},{"type":"function","title":"wxMDIChildFrame.destroy/1","doc":"Destroys the object","ref":"wxMDIChildFrame.html#destroy/1"},{"type":"function","title":"wxMDIChildFrame.maximize/1","doc":"","ref":"wxMDIChildFrame.html#maximize/1"},{"type":"function","title":"wxMDIChildFrame.maximize/2","doc":"Maximizes this MDI child frame.\n\nThis function doesn't do anything if `IsAlwaysMaximized()` (not implemented in wx)\nreturns true.\n\nSee:\n* `activate/1`\n\n* `restore/1`","ref":"wxMDIChildFrame.html#maximize/2"},{"type":"function","title":"wxMDIChildFrame.new/0","doc":"Default constructor.","ref":"wxMDIChildFrame.html#new/0"},{"type":"function","title":"wxMDIChildFrame.new/3","doc":"","ref":"wxMDIChildFrame.html#new/3"},{"type":"function","title":"wxMDIChildFrame.new/4","doc":"Constructor, creating the window.\n\nSee: `create/5`","ref":"wxMDIChildFrame.html#new/4"},{"type":"function","title":"wxMDIChildFrame.restore/1","doc":"Restores this MDI child frame (unmaximizes).\n\nThis function doesn't do anything if `IsAlwaysMaximized()` (not implemented in wx)\nreturns true.\n\nSee:\n* `activate/1`\n\n* `maximize/2`","ref":"wxMDIChildFrame.html#restore/1"},{"type":"type","title":"wxMDIChildFrame.wxMDIChildFrame/0","doc":"","ref":"wxMDIChildFrame.html#t:wxMDIChildFrame/0"},{"type":"module","title":"wxMDIClientWindow","doc":"An MDI client window is a child of `m:wxMDIParentFrame`, and manages zero or more `m:wxMDIChildFrame`\nobjects.\n\nThe client window is the area where MDI child windows exist. It doesn't have to cover\nthe whole parent frame; other windows such as toolbars and a help window might coexist\nwith it. There can be scrollbars on a client window, which are controlled by the parent\nwindow style.\n\nThe `m:wxMDIClientWindow` class is usually adequate without further derivation, and it is\ncreated automatically when the MDI parent frame is created. If the application needs to\nderive a new class, the function `wxMDIParentFrame::OnCreateClient()` (not implemented in\nwx) must be overridden in order to give an opportunity to use a different class of client window.\n\nUnder wxMSW, the client window will automatically have a sunken border style when the\nactive child is not maximized, and no border style when a child is maximized.\n\nSee:\n* `m:wxMDIChildFrame`\n\n* `m:wxMDIParentFrame`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIClientWindow](https://docs.wxwidgets.org/3.2/classwx_m_d_i_client_window.html)","ref":"wxMDIClientWindow.html"},{"type":"function","title":"wxMDIClientWindow.createClient/2","doc":"","ref":"wxMDIClientWindow.html#createClient/2"},{"type":"function","title":"wxMDIClientWindow.createClient/3","doc":"Called by `m:wxMDIParentFrame` immediately after creating the client window.\n\nThis function may be overridden in the derived class but the base class version must\nusually be called first to really create the window.","ref":"wxMDIClientWindow.html#createClient/3"},{"type":"function","title":"wxMDIClientWindow.destroy/1","doc":"Destroys the object","ref":"wxMDIClientWindow.html#destroy/1"},{"type":"function","title":"wxMDIClientWindow.new/0","doc":"Default constructor.\n\nObjects of this class are only created by `m:wxMDIParentFrame` which uses the default\nconstructor and calls `createClient/3` immediately afterwards.","ref":"wxMDIClientWindow.html#new/0"},{"type":"type","title":"wxMDIClientWindow.wxMDIClientWindow/0","doc":"","ref":"wxMDIClientWindow.html#t:wxMDIClientWindow/0"},{"type":"module","title":"wxMDIParentFrame","doc":"An MDI (Multiple Document Interface) parent frame is a window which can contain MDI child\nframes in its client area which emulates the full desktop.\n\nMDI is a user-interface model in which all the window reside inside the single parent\nwindow as opposed to being separate from each other. It remains popular despite dire\nwarnings from Microsoft itself (which popularized this model in the first model) that MDI\nis obsolete.\n\nAn MDI parent frame always has a `m:wxMDIClientWindow` associated with it, which is the\nparent for MDI child frames. In the simplest case, the client window takes up the entire\nparent frame area but it is also possible to resize it to be smaller in order to have\nother windows in the frame, a typical example is using a sidebar along one of the window edges.\n\nThe appearance of MDI applications differs between different ports. The classic MDI\nmodel, with child windows which can be independently moved, resized etc, is only available\nunder MSW, which provides native support for it. In Mac ports, multiple top level windows\nare used for the MDI children too and the MDI parent frame itself is invisible, to\naccommodate the native look and feel requirements. In all the other ports, a tab-based MDI\nimplementation (sometimes called TDI) is used and so at most one MDI child is visible at\nany moment (child frames are always maximized).\n\nAlthough it is possible to have multiple MDI parent frames, a typical MDI application\nhas a single MDI parent frame window inside which multiple MDI child frames, i.e. objects\nof class `m:wxMDIChildFrame`, can be created.","ref":"wxMDIParentFrame.html"},{"type":"module","title":"Styles - wxMDIParentFrame","doc":"This class supports the following styles:\n\nThere are no special styles for this class, all `m:wxFrame` styles apply to it in the\nusual way. The only exception is that wxHSCROLL and wxVSCROLL styles apply not to the\nframe itself but to the client window, so that using them enables horizontal and vertical\nscrollbars for this window and not the frame.\n\nSee:\n* `m:wxMDIChildFrame`\n\n* `m:wxMDIClientWindow`\n\n* `m:wxFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMDIParentFrame](https://docs.wxwidgets.org/3.2/classwx_m_d_i_parent_frame.html)","ref":"wxMDIParentFrame.html#module-styles"},{"type":"function","title":"wxMDIParentFrame.activateNext/1","doc":"Activates the MDI child following the currently active one.\n\nThe MDI children are maintained in an ordered list and this function switches to the next\nelement in this list, wrapping around the end of it if the currently active child is the\nlast one.\n\nSee: `activatePrevious/1`","ref":"wxMDIParentFrame.html#activateNext/1"},{"type":"function","title":"wxMDIParentFrame.activatePrevious/1","doc":"Activates the MDI child preceding the currently active one.\n\nSee: `activateNext/1`","ref":"wxMDIParentFrame.html#activatePrevious/1"},{"type":"function","title":"wxMDIParentFrame.arrangeIcons/1","doc":"Arranges any iconized (minimized) MDI child windows.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.\n\nSee:\n* `cascade/1`\n\n* `tile/2`","ref":"wxMDIParentFrame.html#arrangeIcons/1"},{"type":"function","title":"wxMDIParentFrame.cascade/1","doc":"Arranges the MDI child windows in a cascade.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.\n\nSee:\n* `tile/2`\n\n* `arrangeIcons/1`","ref":"wxMDIParentFrame.html#cascade/1"},{"type":"function","title":"wxMDIParentFrame.create/4","doc":"","ref":"wxMDIParentFrame.html#create/4"},{"type":"function","title":"wxMDIParentFrame.create/5","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","ref":"wxMDIParentFrame.html#create/5"},{"type":"function","title":"wxMDIParentFrame.destroy/1","doc":"Destroys the object","ref":"wxMDIParentFrame.html#destroy/1"},{"type":"function","title":"wxMDIParentFrame.getActiveChild/1","doc":"Returns a pointer to the active MDI child, if there is one.\n\nIf there are any children at all this function returns a non-NULL pointer.","ref":"wxMDIParentFrame.html#getActiveChild/1"},{"type":"function","title":"wxMDIParentFrame.getClientWindow/1","doc":"Returns a pointer to the client window.","ref":"wxMDIParentFrame.html#getClientWindow/1"},{"type":"function","title":"wxMDIParentFrame.new/0","doc":"Default constructor.\n\nUse `create/5` for the objects created using this constructor.","ref":"wxMDIParentFrame.html#new/0"},{"type":"function","title":"wxMDIParentFrame.new/3","doc":"","ref":"wxMDIParentFrame.html#new/3"},{"type":"function","title":"wxMDIParentFrame.new/4","doc":"Constructor, creating the window.\n\nNotice that if you override virtual `OnCreateClient()` (not implemented in wx) method you\nshouldn't be using this constructor but the default constructor and `create/5` as otherwise your\noverridden method is never going to be called because of the usual C++ virtual call\nresolution rules.\n\nUnder wxMSW, the client window will automatically have a sunken border style when the\nactive child is not maximized, and no border style when a child is maximized.\n\nSee: `create/5`","ref":"wxMDIParentFrame.html#new/4"},{"type":"function","title":"wxMDIParentFrame.tile/1","doc":"","ref":"wxMDIParentFrame.html#tile/1"},{"type":"function","title":"wxMDIParentFrame.tile/2","doc":"Tiles the MDI child windows either horizontally or vertically depending on whether `orient`\nis `wxHORIZONTAL` or `wxVERTICAL`.\n\nThis method is only implemented in MSW MDI implementation and does nothing under the\nother platforms.","ref":"wxMDIParentFrame.html#tile/2"},{"type":"type","title":"wxMDIParentFrame.wxMDIParentFrame/0","doc":"","ref":"wxMDIParentFrame.html#t:wxMDIParentFrame/0"},{"type":"module","title":"wxMask","doc":"This class encapsulates a monochrome mask bitmap, where the masked area is black and the\nunmasked area is white.\n\nWhen associated with a bitmap and drawn in a device context, the unmasked area of the\nbitmap will be drawn, and the masked area will not be drawn.\n\nNote: A mask can be associated also with a bitmap with an alpha channel but drawing such\nbitmaps under wxMSW may be slow so using them should be avoided if drawing performance is\nan important factor.\n\nSee:\n* `m:wxBitmap`\n\n* `wxDC:blit/6`\n\n* `m:wxMemoryDC`\n\nwxWidgets docs: [wxMask](https://docs.wxwidgets.org/3.2/classwx_mask.html)","ref":"wxMask.html"},{"type":"function","title":"wxMask.create/2","doc":"Constructs a mask from a monochrome bitmap.","ref":"wxMask.html#create/2"},{"type":"function","title":"wxMask.create/3","doc":"Constructs a mask from a bitmap and a colour that indicates the background.","ref":"wxMask.html#create/3"},{"type":"function","title":"wxMask.destroy/1","doc":"Destroys the object","ref":"wxMask.html#destroy/1"},{"type":"function","title":"wxMask.new/0","doc":"Default constructor.","ref":"wxMask.html#new/0"},{"type":"function","title":"wxMask.new/1","doc":"Constructs a mask from a monochrome bitmap.","ref":"wxMask.html#new/1"},{"type":"function","title":"wxMask.new/2","doc":"Constructs a mask from a bitmap and a colour that indicates the background.","ref":"wxMask.html#new/2"},{"type":"type","title":"wxMask.wxMask/0","doc":"","ref":"wxMask.html#t:wxMask/0"},{"type":"module","title":"wxMaximizeEvent","doc":"An event being sent when a top level window is maximized.\n\nNotice that it is not sent when the window is restored to its original size after it had\nbeen maximized, only a normal `m:wxSizeEvent` is generated in this case.\n\nCurrently this event is only generated in wxMSW, wxGTK and wxOSX/Cocoa ports so portable\nprograms should only rely on receiving `wxEVT_SIZE` and not necessarily this event when\nthe window is maximized.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxTopLevelWindow:maximize/2`\n\n* `wxTopLevelWindow:isMaximized/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMaximizeEvent](https://docs.wxwidgets.org/3.2/classwx_maximize_event.html)","ref":"wxMaximizeEvent.html"},{"type":"module","title":"Events - wxMaximizeEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMaximizeEventType` to subscribe to events of this type.","ref":"wxMaximizeEvent.html#module-events"},{"type":"type","title":"wxMaximizeEvent.wxMaximize/0","doc":"","ref":"wxMaximizeEvent.html#t:wxMaximize/0"},{"type":"type","title":"wxMaximizeEvent.wxMaximizeEvent/0","doc":"","ref":"wxMaximizeEvent.html#t:wxMaximizeEvent/0"},{"type":"type","title":"wxMaximizeEvent.wxMaximizeEventType/0","doc":"","ref":"wxMaximizeEvent.html#t:wxMaximizeEventType/0"},{"type":"module","title":"wxMemoryDC","doc":"A memory device context provides a means to draw graphics onto a bitmap.\n\nWhen drawing in to a mono-bitmap, using `wxWHITE`, `wxWHITE_PEN` and `wxWHITE_BRUSH` will\ndraw the background colour (i.e. 0) whereas all other colours will draw the foreground\ncolour (i.e. 1).\n\nA bitmap must be selected into the new memory DC before it may be used for anything.\nTypical usage is as follows:\n\nNote that the memory DC must be deleted (or the bitmap selected out of it) before a\nbitmap can be reselected into another memory DC.\n\nAnd, before performing any other operations on the bitmap data, the bitmap must be\nselected out of the memory DC:\n\nThis happens automatically when `m:wxMemoryDC` object goes out of scope.\n\nSee:\n* `m:wxBitmap`\n\n* `m:wxDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxMemoryDC](https://docs.wxwidgets.org/3.2/classwx_memory_d_c.html)","ref":"wxMemoryDC.html"},{"type":"function","title":"wxMemoryDC.destroy/1","doc":"Destroys the object","ref":"wxMemoryDC.html#destroy/1"},{"type":"function","title":"wxMemoryDC.new/0","doc":"Constructs a new memory device context.\n\nUse the `wxDC:isOk/1` member to test whether the constructor was successful in creating a usable\ndevice context. Don't forget to select a bitmap into the DC before drawing on it.","ref":"wxMemoryDC.html#new/0"},{"type":"function","title":"wxMemoryDC.new/1","doc":"Constructs a new memory device context having the same characteristics as the given\nexisting device context.\n\nThis constructor creates a memory device context `compatible` with `dc` in wxMSW, the\nargument is ignored in the other ports. If `dc` is NULL, a device context compatible with\nthe screen is created, just as with the default constructor.","ref":"wxMemoryDC.html#new/1"},{"type":"function","title":"wxMemoryDC.selectObject/2","doc":"Works exactly like `selectObjectAsSource/2` but this is the function you should use when\nyou select a bitmap because you want to modify it, e.g.\n\ndrawing on this DC.\n\nUsing `selectObjectAsSource/2` when modifying the bitmap may incur some problems related to `m:wxBitmap` being a\nreference counted object (see overview_refcount).\n\nBefore using the updated bitmap data, make sure to select it out of context first either\nby selecting ?wxNullBitmap into the device context or destroying the device context entirely.\n\nIf the bitmap is already selected in this device context, nothing is done. If it is\nselected in another context, the function asserts and drawing on the bitmap won't work correctly.\n\nSee: `wxDC:drawBitmap/4`","ref":"wxMemoryDC.html#selectObject/2"},{"type":"function","title":"wxMemoryDC.selectObjectAsSource/2","doc":"Selects the given bitmap into the device context, to use as the memory bitmap.\n\nSelecting the bitmap into a memory DC allows you to draw into the DC (and therefore the\nbitmap) and also to use `wxDC:blit/6` to copy the bitmap to a window. For this purpose, you may find `wxDC:drawIcon/3`\neasier to use instead.\n\nIf the argument is ?wxNullBitmap (or some other uninitialised `m:wxBitmap`) the current\nbitmap is selected out of the device context, and the original bitmap restored, allowing\nthe current bitmap to be destroyed safely.","ref":"wxMemoryDC.html#selectObjectAsSource/2"},{"type":"type","title":"wxMemoryDC.wxMemoryDC/0","doc":"","ref":"wxMemoryDC.html#t:wxMemoryDC/0"},{"type":"module","title":"wxMenu","doc":"A menu is a popup (or pull down) list of items, one of which may be selected before the\nmenu goes away (clicking elsewhere dismisses the menu).\n\nMenus may be used to construct either menu bars or popup menus.\n\nA menu item has an integer ID associated with it which can be used to identify the\nselection, or to change the menu item in some way. A menu item with a special identifier `wxID_SEPARATOR`\nis a separator item and doesn't have an associated command but just makes a separator\nline appear in the menu.\n\nNote: Please note that `wxID_ABOUT` and `wxID_EXIT` are predefined by wxWidgets and have\na special meaning since entries using these IDs will be taken out of the normal menus\nunder macOS and will be inserted into the system menu (following the appropriate macOS\ninterface guideline).\n\nMenu items may be either `normal` items, `check` items or `radio` items. Normal items\ndon't have any special properties while the check items have a boolean flag associated to\nthem and they show a checkmark in the menu when the flag is set. wxWidgets automatically\ntoggles the flag value when the item is clicked and its value may be retrieved using\neither `isChecked/2` method of `m:wxMenu` or `m:wxMenuBar` itself or by using wxEvent::IsChecked when\nyou get the menu notification for the item in question.\n\nThe radio items are similar to the check items except that all the other items in the\nsame radio group are unchecked when a radio item is checked. The radio group is formed by\na contiguous range of radio items, i.e. it starts at the first item of this kind and ends\nwith the first item of a different kind (or the end of the menu). Notice that because the\nradio groups are defined in terms of the item positions inserting or removing the items in\nthe menu containing the radio items risks to not work correctly.\n\nAllocation strategy\n\nAll menus must be created on the `heap` because all menus attached to a menubar or to\nanother menu will be deleted by their parent when it is deleted. The only exception to\nthis rule are the popup menus (i.e. menus used with `wxWindow:popupMenu/4`) as wxWidgets does not destroy them\nto allow reusing the same menu more than once. But the exception applies only to the menus\nthemselves and not to any submenus of popup menus which are still destroyed by wxWidgets\nas usual and so must be heap-allocated.\n\nAs the frame menubar is deleted by the frame itself, it means that normally all menus\nused are deleted automatically.\n\nEvent handling\n\nEvent handlers for the commands generated by the menu items can be connected directly to\nthe menu object itself using `wxEvtHandler::Bind()` (not implemented in wx). If this menu\nis a submenu of another one, the events from its items can also be processed in the parent\nmenu and so on, recursively.\n\nIf the menu is part of a menu bar, then events can also be handled in `m:wxMenuBar` object.\n\nFinally, menu events can also be handled in the associated window, which is either the `m:wxFrame`\nassociated with the menu bar this menu belongs to or the window for which `wxWindow:popupMenu/4` was called for\nthe popup menus.\n\nSee overview_events_bind for how to bind event handlers to the various objects.\n\nSee:\n* `m:wxMenuBar`\n\n* `wxWindow:popupMenu/4`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMenu](https://docs.wxwidgets.org/3.2/classwx_menu.html)","ref":"wxMenu.html"},{"type":"function","title":"wxMenu.append/2","doc":"Adds a menu item object.\n\nThis is the most generic variant of `append/5` method because it may be used for both items\n(including separators) and submenus and because you can also specify various extra\nproperties of a menu item this way, such as bitmaps and fonts.\n\nRemark: See the remarks for the other `append/5` overloads.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","ref":"wxMenu.html#append/2"},{"type":"function","title":"wxMenu.append/3","doc":"","ref":"wxMenu.html#append/3"},{"type":"function","title":"wxMenu.append/4","doc":"Adds a menu item.\n\nExample: or even better for stock menu items (see `wxMenuItem:new/1`):\n\nRemark: This command can be used after the menu has been shown, as well as on initial\ncreation of a menu or menubar.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","ref":"wxMenu.html#append/4"},{"type":"function","title":"wxMenu.append/5","doc":"Adds a submenu.\n\nDeprecated:\n\nThis function is deprecated, use `AppendSubMenu()` (not implemented in wx) instead.\n\nSee:\n* `appendSeparator/1`\n\n* `appendCheckItem/4`\n\n* `appendRadioItem/4`\n\n* `insert/6`\n\n* `setLabel/3`\n\n* `getHelpString/2`\n\n* `setHelpString/3`\n\n* `m:wxMenuItem`","ref":"wxMenu.html#append/5"},{"type":"function","title":"wxMenu.appendCheckItem/3","doc":"","ref":"wxMenu.html#appendCheckItem/3"},{"type":"function","title":"wxMenu.appendCheckItem/4","doc":"Adds a checkable item to the end of the menu.\n\nSee:\n* `append/5`\n\n* `insertCheckItem/5`","ref":"wxMenu.html#appendCheckItem/4"},{"type":"function","title":"wxMenu.appendRadioItem/3","doc":"","ref":"wxMenu.html#appendRadioItem/3"},{"type":"function","title":"wxMenu.appendRadioItem/4","doc":"Adds a radio item to the end of the menu.\n\nAll consequent radio items form a group and when an item in the group is checked, all the\nothers are automatically unchecked.\n\nNote: Radio items are not supported under wxMotif.\n\nSee:\n* `append/5`\n\n* `insertRadioItem/5`","ref":"wxMenu.html#appendRadioItem/4"},{"type":"function","title":"wxMenu.appendSeparator/1","doc":"Adds a separator to the end of the menu.\n\nSee:\n* `append/5`\n\n* `insertSeparator/2`","ref":"wxMenu.html#appendSeparator/1"},{"type":"function","title":"wxMenu.break/1","doc":"Inserts a break in a menu, causing the next appended item to appear in a new column.\n\nThis function only actually inserts a break in wxMSW and does nothing under the other\nplatforms.","ref":"wxMenu.html#break/1"},{"type":"function","title":"wxMenu.check/3","doc":"Checks or unchecks the menu item.\n\nSee: `isChecked/2`","ref":"wxMenu.html#check/3"},{"type":"function","title":"wxMenu.Destroy/2","doc":"Deletes the menu item from the menu.\n\nIf the item is a submenu, it will be deleted. Use `remove/2` if you want to keep the submenu (for\nexample, to reuse it later).\n\nSee:\n* `findItem/2`\n\n* `delete/2`\n\n* `remove/2`","ref":"wxMenu.html#Destroy/2"},{"type":"function","title":"wxMenu.delete/2","doc":"Deletes the menu item from the menu.\n\nIf the item is a submenu, it will `not` be deleted. Use `'Destroy'/2` if you want to delete a submenu.\n\nSee:\n* `findItem/2`\n\n* `'Destroy'/2`\n\n* `remove/2`","ref":"wxMenu.html#delete/2"},{"type":"function","title":"wxMenu.destroy/1","doc":"Destroys the object","ref":"wxMenu.html#destroy/1"},{"type":"function","title":"wxMenu.enable/3","doc":"Enables or disables (greys out) a menu item.\n\nSee: `isEnabled/2`","ref":"wxMenu.html#enable/3"},{"type":"function","title":"wxMenu.findItem/2","doc":"Finds the menu id for a menu item string.\n\nReturn: Menu item identifier, or wxNOT_FOUND if none is found.\n\nRemark: Any special menu codes are stripped out of source and target strings before\nmatching.","ref":"wxMenu.html#findItem/2"},{"type":"function","title":"wxMenu.findItemByPosition/2","doc":"Returns the `m:wxMenuItem` given a position in the menu.","ref":"wxMenu.html#findItemByPosition/2"},{"type":"function","title":"wxMenu.getHelpString/2","doc":"Returns the help string associated with a menu item.\n\nReturn: The help string, or the empty string if there is no help string or the item was\nnot found.\n\nSee:\n* `setHelpString/3`\n\n* `append/5`","ref":"wxMenu.html#getHelpString/2"},{"type":"function","title":"wxMenu.getLabel/2","doc":"Returns a menu item label.\n\nReturn: The item label, or the empty string if the item was not found.\n\nSee: `setLabel/3`","ref":"wxMenu.html#getLabel/2"},{"type":"function","title":"wxMenu.getMenuItemCount/1","doc":"Returns the number of items in the menu.","ref":"wxMenu.html#getMenuItemCount/1"},{"type":"function","title":"wxMenu.getMenuItems/1","doc":"","ref":"wxMenu.html#getMenuItems/1"},{"type":"function","title":"wxMenu.getTitle/1","doc":"Returns the title of the menu.\n\nSee: `setTitle/2`","ref":"wxMenu.html#getTitle/1"},{"type":"function","title":"wxMenu.insert/3","doc":"Inserts the given `item` before the position `pos`.\n\nInserting the item at position `getMenuItemCount/1` is the same as appending it.\n\nSee:\n* `append/5`\n\n* `prepend/5`","ref":"wxMenu.html#insert/3"},{"type":"function","title":"wxMenu.insert/4","doc":"Inserts the given `item` before the position `pos`.\n\nInserting the item at position `getMenuItemCount/1` is the same as appending it.\n\nSee:\n* `append/5`\n\n* `prepend/5`","ref":"wxMenu.html#insert/4"},{"type":"function","title":"wxMenu.insert/5","doc":"","ref":"wxMenu.html#insert/5"},{"type":"function","title":"wxMenu.insert/6","doc":"Inserts the given `submenu` before the position `pos`.\n\n`text` is the text shown in the menu for it and `help` is the help string shown in the\nstatus bar when the submenu item is selected.\n\nSee: `prepend/5`","ref":"wxMenu.html#insert/6"},{"type":"function","title":"wxMenu.insertCheckItem/4","doc":"","ref":"wxMenu.html#insertCheckItem/4"},{"type":"function","title":"wxMenu.insertCheckItem/5","doc":"Inserts a checkable item at the given position.\n\nSee:\n* `insert/6`\n\n* `appendCheckItem/4`","ref":"wxMenu.html#insertCheckItem/5"},{"type":"function","title":"wxMenu.insertRadioItem/4","doc":"","ref":"wxMenu.html#insertRadioItem/4"},{"type":"function","title":"wxMenu.insertRadioItem/5","doc":"Inserts a radio item at the given position.\n\nSee:\n* `insert/6`\n\n* `appendRadioItem/4`","ref":"wxMenu.html#insertRadioItem/5"},{"type":"function","title":"wxMenu.insertSeparator/2","doc":"Inserts a separator at the given position.\n\nSee:\n* `insert/6`\n\n* `appendSeparator/1`","ref":"wxMenu.html#insertSeparator/2"},{"type":"function","title":"wxMenu.isChecked/2","doc":"Determines whether a menu item is checked.\n\nReturn: true if the menu item is checked, false otherwise.\n\nSee: `check/3`","ref":"wxMenu.html#isChecked/2"},{"type":"function","title":"wxMenu.isEnabled/2","doc":"Determines whether a menu item is enabled.\n\nReturn: true if the menu item is enabled, false otherwise.\n\nSee: `enable/3`","ref":"wxMenu.html#isEnabled/2"},{"type":"function","title":"wxMenu.new/0","doc":"Constructs a `m:wxMenu` object.","ref":"wxMenu.html#new/0"},{"type":"function","title":"wxMenu.new/1","doc":"Constructs a `m:wxMenu` object.","ref":"wxMenu.html#new/1"},{"type":"function","title":"wxMenu.new/2","doc":"Constructs a `m:wxMenu` object with a title.","ref":"wxMenu.html#new/2"},{"type":"function","title":"wxMenu.prepend/2","doc":"Inserts the given `item` at position 0, i.e. before all the other existing items.\n\nSee:\n* `append/5`\n\n* `insert/6`","ref":"wxMenu.html#prepend/2"},{"type":"function","title":"wxMenu.prepend/3","doc":"Inserts the given `item` at position 0, i.e. before all the other existing items.\n\nSee:\n* `append/5`\n\n* `insert/6`","ref":"wxMenu.html#prepend/3"},{"type":"function","title":"wxMenu.prepend/4","doc":"","ref":"wxMenu.html#prepend/4"},{"type":"function","title":"wxMenu.prepend/5","doc":"Inserts the given `submenu` at position 0.\n\nSee: `insert/6`","ref":"wxMenu.html#prepend/5"},{"type":"function","title":"wxMenu.prependCheckItem/3","doc":"","ref":"wxMenu.html#prependCheckItem/3"},{"type":"function","title":"wxMenu.prependCheckItem/4","doc":"Inserts a checkable item at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendCheckItem/4`","ref":"wxMenu.html#prependCheckItem/4"},{"type":"function","title":"wxMenu.prependRadioItem/3","doc":"","ref":"wxMenu.html#prependRadioItem/3"},{"type":"function","title":"wxMenu.prependRadioItem/4","doc":"Inserts a radio item at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendRadioItem/4`","ref":"wxMenu.html#prependRadioItem/4"},{"type":"function","title":"wxMenu.prependSeparator/1","doc":"Inserts a separator at position 0.\n\nSee:\n* `prepend/5`\n\n* `appendSeparator/1`","ref":"wxMenu.html#prependSeparator/1"},{"type":"function","title":"wxMenu.remove/2","doc":"Removes the menu item from the menu but doesn't delete the associated C++ object.\n\nThis allows you to reuse the same item later by adding it back to the menu (especially\nuseful with submenus).\n\nReturn: A pointer to the item which was detached from the menu.","ref":"wxMenu.html#remove/2"},{"type":"function","title":"wxMenu.setHelpString/3","doc":"Sets an item's help string.\n\nSee: `getHelpString/2`","ref":"wxMenu.html#setHelpString/3"},{"type":"function","title":"wxMenu.setLabel/3","doc":"Sets the label of a menu item.\n\nSee:\n* `append/5`\n\n* `getLabel/2`","ref":"wxMenu.html#setLabel/3"},{"type":"function","title":"wxMenu.setTitle/2","doc":"Sets the title of the menu.\n\nRemark: Notice that you can only call this method directly for the popup menus, to change\nthe title of a menu that is part of a menu bar you need to use `wxMenuBar:setLabelTop/3`.\n\nSee: `getTitle/1`","ref":"wxMenu.html#setTitle/2"},{"type":"type","title":"wxMenu.wxMenu/0","doc":"","ref":"wxMenu.html#t:wxMenu/0"},{"type":"module","title":"wxMenuBar","doc":"A menu bar is a series of menus accessible from the top of a frame.\n\nRemark: To respond to a menu selection, provide a handler for EVT_MENU, in the frame that\ncontains the menu bar.\n\nIf you have a toolbar which uses the same identifiers as your EVT_MENU entries, events\nfrom the toolbar will also be processed by your EVT_MENU event handlers.\n\nTip: under Windows, if you discover that menu shortcuts (for example, Alt-F to show the\nfile menu) are not working, check any EVT_CHAR events you are handling in child windows.\nIf you are not calling event.Skip() for events that you don't process in these event\nhandlers, menu shortcuts may cease to work.\n\nSee:\n* `m:wxMenu`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMenuBar](https://docs.wxwidgets.org/3.2/classwx_menu_bar.html)","ref":"wxMenuBar.html"},{"type":"function","title":"wxMenuBar.append/3","doc":"Adds the item to the end of the menu bar.\n\nReturn: true on success, false if an error occurred.\n\nSee: `insert/4`","ref":"wxMenuBar.html#append/3"},{"type":"function","title":"wxMenuBar.check/3","doc":"Checks or unchecks a menu item.\n\nRemark: Only use this when the menu bar has been associated with a frame; otherwise, use\nthe `m:wxMenu` equivalent call.","ref":"wxMenuBar.html#check/3"},{"type":"function","title":"wxMenuBar.destroy/1","doc":"Destroys the object","ref":"wxMenuBar.html#destroy/1"},{"type":"function","title":"wxMenuBar.enable/3","doc":"Enables or disables (greys out) a menu item.\n\nRemark: Only use this when the menu bar has been associated with a frame; otherwise, use\nthe `m:wxMenu` equivalent call.","ref":"wxMenuBar.html#enable/3"},{"type":"function","title":"wxMenuBar.enableTop/3","doc":"Enables or disables a whole menu.\n\nRemark: Only use this when the menu bar has been associated with a frame.","ref":"wxMenuBar.html#enableTop/3"},{"type":"function","title":"wxMenuBar.findItem/2","doc":"Finds the menu item object associated with the given menu item identifier.\n\nReturn: The found menu item object, or NULL if one was not found.","ref":"wxMenuBar.html#findItem/2"},{"type":"function","title":"wxMenuBar.findMenu/2","doc":"Returns the index of the menu with the given `title` or `wxNOT\\_FOUND` if no such menu\nexists in this menubar.\n\nThe `title` parameter may specify either the menu title (with accelerator characters,\ni.e. `\"&File\"`) or just the menu label (`\"File\"`) indifferently.","ref":"wxMenuBar.html#findMenu/2"},{"type":"function","title":"wxMenuBar.findMenuItem/3","doc":"Finds the menu item id for a menu name/menu item string pair.\n\nReturn: The menu item identifier, or wxNOT_FOUND if none was found.\n\nRemark: Any special menu codes are stripped out of source and target strings before\nmatching.","ref":"wxMenuBar.html#findMenuItem/3"},{"type":"function","title":"wxMenuBar.getAutoWindowMenu/0","doc":"","ref":"wxMenuBar.html#getAutoWindowMenu/0"},{"type":"function","title":"wxMenuBar.getHelpString/2","doc":"Gets the help string associated with the menu item identifier.\n\nReturn: The help string, or the empty string if there was no help string or the menu item\nwas not found.\n\nSee: `setHelpString/3`","ref":"wxMenuBar.html#getHelpString/2"},{"type":"function","title":"wxMenuBar.getLabel/2","doc":"Gets the label associated with a menu item.\n\nReturn: The menu item label, or the empty string if the item was not found.\n\nRemark: Use only after the menubar has been associated with a frame.","ref":"wxMenuBar.html#getLabel/2"},{"type":"function","title":"wxMenuBar.getLabelTop/2","doc":"Equivalent to: `getMenuLabel/2`","ref":"wxMenuBar.html#getLabelTop/2"},{"type":"function","title":"wxMenuBar.getMenu/2","doc":"Returns the menu at `menuIndex` (zero-based).","ref":"wxMenuBar.html#getMenu/2"},{"type":"function","title":"wxMenuBar.getMenuCount/1","doc":"Returns the number of menus in this menubar.","ref":"wxMenuBar.html#getMenuCount/1"},{"type":"function","title":"wxMenuBar.getMenuLabel/2","doc":"Returns the label of a top-level menu.\n\nNote that the returned string includes the accelerator characters that have been\nspecified in the menu title string during its construction.\n\nReturn: The menu label, or the empty string if the menu was not found.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee:\n* `getMenuLabelText/2`\n\n* `setMenuLabel/3`","ref":"wxMenuBar.html#getMenuLabel/2"},{"type":"function","title":"wxMenuBar.getMenuLabelText/2","doc":"Returns the label of a top-level menu.\n\nNote that the returned string does not include any accelerator characters that may have\nbeen specified in the menu title string during its construction.\n\nReturn: The menu label, or the empty string if the menu was not found.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee:\n* `getMenuLabel/2`\n\n* `setMenuLabel/3`","ref":"wxMenuBar.html#getMenuLabelText/2"},{"type":"function","title":"wxMenuBar.insert/4","doc":"Inserts the menu at the given position into the menu bar.\n\nInserting menu at position 0 will insert it in the very beginning of it, inserting at\nposition `getMenuCount/1` is the same as calling `append/3`.\n\nReturn: true on success, false if an error occurred.\n\nSee: `append/3`","ref":"wxMenuBar.html#insert/4"},{"type":"function","title":"wxMenuBar.isChecked/2","doc":"Determines whether an item is checked.\n\nReturn: true if the item was found and is checked, false otherwise.","ref":"wxMenuBar.html#isChecked/2"},{"type":"function","title":"wxMenuBar.isEnabled/2","doc":"Determines whether an item is enabled.\n\nReturn: true if the item was found and is enabled, false otherwise.","ref":"wxMenuBar.html#isEnabled/2"},{"type":"function","title":"wxMenuBar.macGetCommonMenuBar/0","doc":"Enables you to get the global menubar on Mac, that is, the menubar displayed when the app\nis running without any frames open.\n\nReturn: The global menubar.\n\nRemark: Only exists on Mac, other platforms do not have this method.\n\nOnly for:wxosx","ref":"wxMenuBar.html#macGetCommonMenuBar/0"},{"type":"function","title":"wxMenuBar.macSetCommonMenuBar/1","doc":"Enables you to set the global menubar on Mac, that is, the menubar displayed when the app\nis running without any frames open.\n\nRemark: Only exists on Mac, other platforms do not have this method.\n\nOnly for:wxosx","ref":"wxMenuBar.html#macSetCommonMenuBar/1"},{"type":"function","title":"wxMenuBar.new/0","doc":"Construct an empty menu bar.","ref":"wxMenuBar.html#new/0"},{"type":"function","title":"wxMenuBar.new/1","doc":"","ref":"wxMenuBar.html#new/1"},{"type":"function","title":"wxMenuBar.oSXGetAppleMenu/1","doc":"Returns the Apple menu.\n\nThis is the leftmost menu with application's name as its title. You shouldn't remove any\nitems from it, but it is safe to insert extra menu items or submenus into it.\n\nOnly for:wxosx\n\nSince: 3.0.1","ref":"wxMenuBar.html#oSXGetAppleMenu/1"},{"type":"function","title":"wxMenuBar.remove/2","doc":"Removes the menu from the menu bar and returns the menu object - the caller is\nresponsible for deleting it.\n\nThis function may be used together with `insert/4` to change the menubar dynamically.\n\nSee: `replace/4`","ref":"wxMenuBar.html#remove/2"},{"type":"function","title":"wxMenuBar.replace/4","doc":"Replaces the menu at the given position with another one.\n\nReturn: The menu which was previously at position pos. The caller is responsible for\ndeleting it.\n\nSee:\n* `insert/4`\n\n* `remove/2`","ref":"wxMenuBar.html#replace/4"},{"type":"function","title":"wxMenuBar.setAutoWindowMenu/1","doc":"","ref":"wxMenuBar.html#setAutoWindowMenu/1"},{"type":"function","title":"wxMenuBar.setHelpString/3","doc":"Sets the help string associated with a menu item.\n\nSee: `getHelpString/2`","ref":"wxMenuBar.html#setHelpString/3"},{"type":"function","title":"wxMenuBar.setLabel/3","doc":"Sets the label of a menu item.\n\nRemark: Use only after the menubar has been associated with a frame.\n\nSee: `getLabel/2`","ref":"wxMenuBar.html#setLabel/3"},{"type":"function","title":"wxMenuBar.setLabelTop/3","doc":"Equivalent to: `setMenuLabel/3`","ref":"wxMenuBar.html#setLabelTop/3"},{"type":"function","title":"wxMenuBar.setMenuLabel/3","doc":"Sets the label of a top-level menu.\n\nRemark: Use only after the menubar has been associated with a frame.","ref":"wxMenuBar.html#setMenuLabel/3"},{"type":"type","title":"wxMenuBar.wxMenuBar/0","doc":"","ref":"wxMenuBar.html#t:wxMenuBar/0"},{"type":"module","title":"wxMenuEvent","doc":"This class is used for a variety of menu-related events.\n\nNote that these do not include menu command events, which are handled using `m:wxCommandEvent`\nobjects.\n\nEvents of this class are generated by both menus that are part of a `m:wxMenuBar`,\nattached to `m:wxFrame`, and popup menus shown by `wxWindow:popupMenu/4`. They are sent to the following objects\nuntil one of them handles the event: `-# The menu object itself, as returned by GetMenu(), if any. -# The wxMenuBar to which\nthis menu is attached, if any. -# The window associated with the menu, e.g. the one\ncalling PopupMenu() for the popup menus. -# The top level parent of that window if it's\ndifferent from the window itself. `\nThis is similar to command events generated by the menu items, but, unlike them, `m:wxMenuEvent`\nare only sent to the window itself and its top level parent but not any intermediate\nwindows in the hierarchy.\n\nThe default handler for `wxEVT_MENU_HIGHLIGHT` in `m:wxFrame` displays help text in the\nstatus bar, see `wxFrame:setStatusBarPane/2`.\n\nSee:\n* `m:wxCommandEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMenuEvent](https://docs.wxwidgets.org/3.2/classwx_menu_event.html)","ref":"wxMenuEvent.html"},{"type":"module","title":"Events - wxMenuEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMenuEventType` to subscribe to events of this type.","ref":"wxMenuEvent.html#module-events"},{"type":"function","title":"wxMenuEvent.getMenu/1","doc":"Returns the menu which is being opened or closed, or the menu containing the highlighted\nitem.\n\nNote that the returned value can be NULL if the menu being opened doesn't have a\ncorresponding `m:wxMenu`, e.g. this happens when opening the system menu in wxMSW port.\n\nRemark: Since 3.1.3 this function can be used with `OPEN`, `CLOSE` and `HIGHLIGHT`\nevents. Before 3.1.3, this method can only be used with the `OPEN` and `CLOSE` events.","ref":"wxMenuEvent.html#getMenu/1"},{"type":"function","title":"wxMenuEvent.getMenuId/1","doc":"Returns the menu identifier associated with the event.\n\nThis method should be only used with the `HIGHLIGHT` events.","ref":"wxMenuEvent.html#getMenuId/1"},{"type":"function","title":"wxMenuEvent.isPopup/1","doc":"Returns true if the menu which is being opened or closed is a popup menu, false if it is\na normal one.\n\nThis method should only be used with the `OPEN` and `CLOSE` events.","ref":"wxMenuEvent.html#isPopup/1"},{"type":"type","title":"wxMenuEvent.wxMenu/0","doc":"","ref":"wxMenuEvent.html#t:wxMenu/0"},{"type":"type","title":"wxMenuEvent.wxMenuEvent/0","doc":"","ref":"wxMenuEvent.html#t:wxMenuEvent/0"},{"type":"type","title":"wxMenuEvent.wxMenuEventType/0","doc":"","ref":"wxMenuEvent.html#t:wxMenuEventType/0"},{"type":"module","title":"wxMenuItem","doc":"A menu item represents an item in a menu.\n\nNote that you usually don't have to deal with it directly as `m:wxMenu` methods usually\nconstruct an object of this class for you.\n\nAlso please note that the methods related to fonts and bitmaps are currently only\nimplemented for Windows, Mac and GTK+.\n\nSee:\n* `m:wxMenuBar`\n\n* `m:wxMenu`\n\nwxWidgets docs: [wxMenuItem](https://docs.wxwidgets.org/3.2/classwx_menu_item.html)","ref":"wxMenuItem.html"},{"type":"module","title":"Events - wxMenuItem","doc":"Event types emitted from this class:\n\n* [`menu_open`](`m:wxMenuEvent`)\n\n* [`menu_close`](`m:wxMenuEvent`)\n\n* [`menu_highlight`](`m:wxMenuEvent`)","ref":"wxMenuItem.html#module-events"},{"type":"function","title":"wxMenuItem.check/1","doc":"","ref":"wxMenuItem.html#check/1"},{"type":"function","title":"wxMenuItem.check/2","doc":"Checks or unchecks the menu item.\n\nNote that this only works when the item is already appended to a menu.","ref":"wxMenuItem.html#check/2"},{"type":"function","title":"wxMenuItem.destroy/1","doc":"Destroys the object","ref":"wxMenuItem.html#destroy/1"},{"type":"function","title":"wxMenuItem.enable/1","doc":"","ref":"wxMenuItem.html#enable/1"},{"type":"function","title":"wxMenuItem.enable/2","doc":"Enables or disables the menu item.","ref":"wxMenuItem.html#enable/2"},{"type":"function","title":"wxMenuItem.getBitmap/1","doc":"Returns the checked or unchecked bitmap.\n\nOnly for:wxmsw","ref":"wxMenuItem.html#getBitmap/1"},{"type":"function","title":"wxMenuItem.getHelp/1","doc":"Returns the help string associated with the menu item.","ref":"wxMenuItem.html#getHelp/1"},{"type":"function","title":"wxMenuItem.getId/1","doc":"Returns the menu item identifier.","ref":"wxMenuItem.html#getId/1"},{"type":"function","title":"wxMenuItem.getItemLabel/1","doc":"Returns the text associated with the menu item including any accelerator characters that\nwere passed to the constructor or `setItemLabel/2`.\n\nSee:\n* `getItemLabelText/1`\n\n* `getLabelText/1`","ref":"wxMenuItem.html#getItemLabel/1"},{"type":"function","title":"wxMenuItem.getItemLabelText/1","doc":"Returns the text associated with the menu item, without any accelerator characters.\n\nSee:\n* `getItemLabel/1`\n\n* `getLabelText/1`","ref":"wxMenuItem.html#getItemLabelText/1"},{"type":"function","title":"wxMenuItem.getKind/1","doc":"Returns the item kind, one of `wxITEM_SEPARATOR`, `wxITEM_NORMAL`, `wxITEM_CHECK` or `wxITEM_RADIO`.","ref":"wxMenuItem.html#getKind/1"},{"type":"function","title":"wxMenuItem.getLabel/1","doc":"Equivalent to: `getItemLabelText/1`","ref":"wxMenuItem.html#getLabel/1"},{"type":"function","title":"wxMenuItem.getLabelFromText/1","doc":"Equivalent to: `getLabelText/1`","ref":"wxMenuItem.html#getLabelFromText/1"},{"type":"function","title":"wxMenuItem.getLabelText/1","doc":"Strips all accelerator characters and mnemonics from the given `text`.\n\nFor example:\n\nwill return just `\"Hello\"`.\n\nSee:\n* `getItemLabelText/1`\n\n* `getItemLabel/1`","ref":"wxMenuItem.html#getLabelText/1"},{"type":"function","title":"wxMenuItem.getMenu/1","doc":"Returns the menu this menu item is in, or NULL if this menu item is not attached.","ref":"wxMenuItem.html#getMenu/1"},{"type":"function","title":"wxMenuItem.getSubMenu/1","doc":"Returns the submenu associated with the menu item, or NULL if there isn't one.","ref":"wxMenuItem.html#getSubMenu/1"},{"type":"function","title":"wxMenuItem.getText/1","doc":"Equivalent to: `getItemLabel/1`","ref":"wxMenuItem.html#getText/1"},{"type":"function","title":"wxMenuItem.isCheckable/1","doc":"Returns true if the item is checkable.\n\nNotice that the radio buttons are considered to be checkable as well, so this method\nreturns true for them too. Use `IsCheck()` (not implemented in wx) if you want to test for\nthe check items only.","ref":"wxMenuItem.html#isCheckable/1"},{"type":"function","title":"wxMenuItem.isChecked/1","doc":"Returns true if the item is checked.","ref":"wxMenuItem.html#isChecked/1"},{"type":"function","title":"wxMenuItem.isEnabled/1","doc":"Returns true if the item is enabled.","ref":"wxMenuItem.html#isEnabled/1"},{"type":"function","title":"wxMenuItem.isSeparator/1","doc":"Returns true if the item is a separator.","ref":"wxMenuItem.html#isSeparator/1"},{"type":"function","title":"wxMenuItem.isSubMenu/1","doc":"Returns true if the item is a submenu.","ref":"wxMenuItem.html#isSubMenu/1"},{"type":"function","title":"wxMenuItem.new/0","doc":"","ref":"wxMenuItem.html#new/0"},{"type":"function","title":"wxMenuItem.new/1","doc":"Constructs a `m:wxMenuItem` object.\n\nMenu items can be standard, or \"stock menu items\", or custom. For the standard menu items\n(such as commands to open a file, exit the program and so on, see page_stockitems for the\nfull list) it is enough to specify just the stock ID and leave `text` and `help` string\nempty. Some platforms (currently wxGTK only, and see the remark in `setBitmap/2` documentation) will\nalso show standard bitmaps for stock menu items.\n\nLeaving at least `text` empty for the stock menu items is actually strongly recommended\nas they will have appearance and keyboard interface (including standard accelerators)\nfamiliar to the user.\n\nFor the custom (non-stock) menu items, `text` must be specified and while `help` string\nmay be left empty, it's recommended to pass the item description (which is automatically\nshown by the library in the status bar when the menu item is selected) in this parameter.\n\nFinally note that you can e.g. use a stock menu label without using its stock help string:\n\nthat is, stock properties are set independently one from the other.","ref":"wxMenuItem.html#new/1"},{"type":"function","title":"wxMenuItem.setBitmap/2","doc":"Sets the bitmap for the menu item.\n\nIt is equivalent to wxMenuItem::SetBitmaps(bmp, wxNullBitmap) if `checked` is true\n(default value) or SetBitmaps(wxNullBitmap, bmp) otherwise.\n\n`setBitmap/2` must be called before the item is appended to the menu, i.e. appending the item without\na bitmap and setting one later is not guaranteed to work. But the bitmap can be changed or\nreset later if it had been set up initially.\n\nNotice that GTK+ uses a global setting called `gtk-menu-images` to determine if the\nimages should be shown in the menus at all. If it is off (which is the case in e.g. Gnome\n2.28 by default), no images will be shown, consistently with the native behaviour.\n\nOnly for:wxmsw,wxosx,wxgtk","ref":"wxMenuItem.html#setBitmap/2"},{"type":"function","title":"wxMenuItem.setHelp/2","doc":"Sets the help string.","ref":"wxMenuItem.html#setHelp/2"},{"type":"function","title":"wxMenuItem.setItemLabel/2","doc":"Sets the label associated with the menu item.\n\nNote that if the ID of this menu item corresponds to a stock ID, then it is not necessary\nto specify a label: wxWidgets will automatically use the stock item label associated with\nthat ID. See the `new/1` for more info.\n\nThe label string for the normal menu items (not separators) may include the accelerator\nwhich can be used to activate the menu item from keyboard. An accelerator key can be\nspecified using the ampersand `&` character. In order to embed an ampersand character in\nthe menu item text, the ampersand must be doubled.\n\nOptionally you can specify also an accelerator string appending a tab character `\\t`\nfollowed by a valid key combination (e.g. `CTRL+V`). Its general syntax is any combination\nof `\"CTRL\"`, `\"RAWCTRL\"`, `\"ALT\"` and `\"SHIFT\"` strings (case doesn't matter) separated by\neither `'-'` or `'+'` characters and followed by the accelerator itself. Notice that `CTRL`\ncorresponds to the \"Ctrl\" key on most platforms but not under macOS where it is mapped to\n\"Cmd\" key on Mac keyboard. Usually this is exactly what you want in portable code but if\nyou really need to use the (rarely used for this purpose) \"Ctrl\" key even under Mac, you\nmay use `RAWCTRL` to prevent this mapping. Under the other platforms `RAWCTRL` is the same\nas plain `CTRL`.\n\nThe accelerator may be any alphanumeric character, any function key (from `F1` to `F12`),\nany numpad digit key using `KP_` prefix (i.e. from `KP_0` to `KP_9`) or one of the special\nstrings listed below (again, case doesn't matter) corresponding to the specified key code:\n\n* `Del` or `Delete:` WXK_DELETE\n\n* `Back:` WXK_BACK\n\n* `Ins` or `Insert:` WXK_INSERT\n\n* `Enter` or `Return:` WXK_RETURN\n\n* `PgUp` or `PageUp:` WXK_PAGEUP\n\n* `PgDn` or `PageDown:` WXK_PAGEDOWN\n\n* `Left:` WXK_LEFT\n\n* `Right:` WXK_RIGHT\n\n* `Up:` WXK_UP\n\n* `Down:` WXK_DOWN\n\n* `Home:` WXK_HOME\n\n* `End:` WXK_END\n\n* `Space:` WXK_SPACE\n\n* `Tab:` WXK_TAB\n\n* `Esc` or `Escape:` WXK_ESCAPE\n\n* `Cancel:` WXK_CANCEL\n\n* `Clear:` WXK_CLEAR\n\n* `Menu:` WXK_MENU\n\n* `Pause:` WXK_PAUSE\n\n* `Capital:` WXK_CAPITAL\n\n* `Select:` WXK_SELECT\n\n* `Print:` WXK_PRINT\n\n* `Execute:` WXK_EXECUTE\n\n* `Snapshot:` WXK_SNAPSHOT\n\n* `Help:` WXK_HELP\n\n* `Add:` WXK_ADD\n\n* `Separator:` WXK_SEPARATOR\n\n* `Subtract:` WXK_SUBTRACT\n\n* `Decimal:` WXK_DECIMAL\n\n* `Divide:` WXK_DIVIDE\n\n* `Num_lock:` WXK_NUMLOCK\n\n* `Scroll_lock:` WXK_SCROLL\n\n* `KP_Space:` WXK_NUMPAD_SPACE\n\n* `KP_Tab:` WXK_NUMPAD_TAB\n\n* `KP_Enter:` WXK_NUMPAD_ENTER\n\n* `KP_Home:` WXK_NUMPAD_HOME\n\n* `KP_Left:` WXK_NUMPAD_LEFT\n\n* `KP_Up:` WXK_NUMPAD_UP\n\n* `KP_Right:` WXK_NUMPAD_RIGHT\n\n* `KP_Down:` WXK_NUMPAD_DOWN\n\n* `KP_PageUp:` WXK_NUMPAD_PAGEUP\n\n* `KP_PageDown:` WXK_NUMPAD_PAGEDOWN\n\n* `KP_Prior:` WXK_NUMPAD_PAGEUP\n\n* `KP_Next:` WXK_NUMPAD_PAGEDOWN\n\n* `KP_End:` WXK_NUMPAD_END\n\n* `KP_Begin:` WXK_NUMPAD_BEGIN\n\n* `KP_Insert:` WXK_NUMPAD_INSERT\n\n* `KP_Delete:` WXK_NUMPAD_DELETE\n\n* `KP_Equal:` WXK_NUMPAD_EQUAL\n\n* `KP_Multiply:` WXK_NUMPAD_MULTIPLY\n\n* `KP_Add:` WXK_NUMPAD_ADD\n\n* `KP_Separator:` WXK_NUMPAD_SEPARATOR\n\n* `KP_Subtract:` WXK_NUMPAD_SUBTRACT\n\n* `KP_Decimal:` WXK_NUMPAD_DECIMAL\n\n* `KP_Divide:` WXK_NUMPAD_DIVIDE\n\n* `Windows_Left:` WXK_WINDOWS_LEFT\n\n* `Windows_Right:` WXK_WINDOWS_RIGHT\n\n* `Windows_Menu:` WXK_WINDOWS_MENU\n\n* `Command:` WXK_COMMAND\n\nExamples:\n\nNote: In wxGTK using `\"SHIFT\"` with non-alphabetic characters currently doesn't work,\neven in combination with other modifiers, due to GTK+ limitation. E.g. `Shift+Ctrl+A`\nworks but `Shift+Ctrl+1` or `Shift+/` do not, so avoid using accelerators of this form in\nportable code.\n\nNote: In wxGTk, the left/right/up/down arrow keys do not work as accelerator keys for a\nmenu item unless a modifier key is used. Additionally, the following keycodes are not\nsupported as menu accelerator keys:\n\n* WXK_COMMAND/WXK_CONTROL\n\n* WXK_SHIFT\n\n* WXK_ALT\n\n* WXK_SCROLL\n\n* WXK_CAPITAL\n\n* WXK_NUMLOCK\n\n* WXK_NUMPAD_TAB\n\n* WXK_TAB\n\n* WXK_WINDOWS_LEFT\n\n* WXK_WINDOWS_RIGHT\n\n* WXK_ADD\n\n* WXK_SEPARATOR\n\n* WXK_SUBTRACT\n\n* WXK_DECIMAL\n\n* WXK_DIVIDE\n\n* WXK_SNAPSHOT\n\nSee:\n* `getItemLabel/1`\n\n* `getItemLabelText/1`","ref":"wxMenuItem.html#setItemLabel/2"},{"type":"function","title":"wxMenuItem.setMenu/2","doc":"Sets the parent menu which will contain this menu item.","ref":"wxMenuItem.html#setMenu/2"},{"type":"function","title":"wxMenuItem.setSubMenu/2","doc":"Sets the submenu of this menu item.","ref":"wxMenuItem.html#setSubMenu/2"},{"type":"function","title":"wxMenuItem.setText/2","doc":"Equivalent to: `setItemLabel/2`","ref":"wxMenuItem.html#setText/2"},{"type":"type","title":"wxMenuItem.wxMenuItem/0","doc":"","ref":"wxMenuItem.html#t:wxMenuItem/0"},{"type":"module","title":"wxMessageDialog","doc":"This class represents a dialog that shows a single or multi-line message, with a choice\nof OK, Yes, No and Cancel buttons.","ref":"wxMessageDialog.html"},{"type":"module","title":"Styles - wxMessageDialog","doc":"This class supports the following styles:\n\n* wxOK: Puts an Ok button in the message box. May be combined with `wxCANCEL`.\n\n* wxCANCEL: Puts a Cancel button in the message box. Must be combined with either `wxOK` or `wxYES_NO`.\n\n* wxYES_NO: Puts Yes and No buttons in the message box. It is recommended to always use `wxCANCEL`\nwith this style as otherwise the message box won't have a close button under wxMSW and\nthe user will be forced to answer it.\n\n* wxHELP: Puts a Help button to the message box. This button can have special appearance or\nbe specially positioned if its label is not changed from the default one. Notice that\nusing this button is not supported when showing a message box from non-main thread in\nwxOSX/Cocoa. Available since wxWidgets 2.9.3.\n\n* wxNO_DEFAULT: Makes the \"No\" button default, can only be used with `wxYES_NO`.\n\n* wxCANCEL_DEFAULT: Makes the \"Cancel\" button default, can only be used with `wxCANCEL`.\nThis style is currently not supported (and ignored) in wxOSX.\n\n* wxYES_DEFAULT: Makes the \"Yes\" button default, this is the default behaviour and this\nflag exists solely for symmetry with `wxNO_DEFAULT`.\n\n* wxOK_DEFAULT: Makes the \"OK\" button default, this is the default behaviour and this flag\nexists solely for symmetry with `wxCANCEL_DEFAULT`.\n\n* wxICON_NONE: Displays no icon in the dialog if possible (an icon might still be displayed\nif the current platform mandates its use). This style may be used to prevent the dialog\nfrom using the default icon based on `wxYES_NO` presence as explained in `wxICON_QUESTION`\nand `wxICON_INFORMATION` documentation below.\n\n* wxICON_ERROR: Displays an error icon in the dialog.\n\n* wxICON_WARNING: Displays a warning icon in the dialog. This style should be used for\ninformative warnings or, in combination with `wxYES_NO` or `wxCANCEL`, for questions that\nhave potentially serious consequences (caution icon is used on macOS in this case).\n\n* wxICON_QUESTION: Displays a question mark symbol. This icon is automatically used with `wxYES_NO`\nso it's usually unnecessary to specify it explicitly. This style is not supported for\nmessage dialogs under wxMSW when a task dialog is used to implement them (i.e. when\nrunning under Windows Vista or later) because [Microsoft guidelines](https://docs.microsoft.com/en-us/windows/desktop/uxguide/mess-confirm)\nindicate that no icon should be used for routine confirmations. If it is specified, no\nicon will be displayed.\n\n* wxICON_INFORMATION: Displays an information symbol. This icon is used by default if `wxYES_NO`\nis not given so it is usually unnecessary to specify it explicitly.\n\n* wxICON_EXCLAMATION: Alias for `wxICON_WARNING`.\n\n* wxICON_HAND: Alias for `wxICON_ERROR`.\n\n* wxICON_AUTH_NEEDED: Displays an authentication needed symbol. This style is only\nsupported for message dialogs under wxMSW when a task dialog is used to implement them\n(i.e. when running under Windows Vista or later). In other cases the default icon\nselection logic will be used. Note this can be combined with other styles to provide a\nfallback. For instance, using wxICON_AUTH_NEEDED | wxICON_QUESTION will show a shield\nsymbol on Windows Vista or above and a question symbol on other platforms. Available since\nwxWidgets 2.9.5\n\n* wxSTAY_ON_TOP: Makes the message box stay on top of all other windows and not only just\nits parent (currently implemented only under MSW and GTK).\n\n* wxCENTRE: Centre the message box on its parent or on the screen if parent is not\nspecified. Setting this style under MSW makes no differences as the dialog is always\ncentered on the parent.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_msg)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMessageDialog](https://docs.wxwidgets.org/3.2/classwx_message_dialog.html)","ref":"wxMessageDialog.html#module-styles"},{"type":"function","title":"wxMessageDialog.destroy/1","doc":"Destroys the object","ref":"wxMessageDialog.html#destroy/1"},{"type":"function","title":"wxMessageDialog.new/2","doc":"","ref":"wxMessageDialog.html#new/2"},{"type":"function","title":"wxMessageDialog.new/3","doc":"Constructor specifying the message box properties.\n\nUse `wxDialog:showModal/1` to show the dialog.\n\n`style` may be a bit list of the identifiers described above.\n\nNotice that not all styles are compatible: only one of `wxOK` and `wxYES_NO` may be\nspecified (and one of them must be specified) and at most one default button style can be\nused and it is only valid if the corresponding button is shown in the message box.","ref":"wxMessageDialog.html#new/3"},{"type":"type","title":"wxMessageDialog.wxMessageDialog/0","doc":"","ref":"wxMessageDialog.html#t:wxMessageDialog/0"},{"type":"module","title":"wxMiniFrame","doc":"A miniframe is a frame with a small title bar.\n\nIt is suitable for floating toolbars that must not take up too much screen area.\n\nAn example of mini frame can be seen in the page_samples_dialogs using the \"Mini frame\"\ncommand of the \"Generic dialogs\" submenu.","ref":"wxMiniFrame.html"},{"type":"module","title":"Styles - wxMiniFrame","doc":"This class supports the following styles:\n\n* wxICONIZE: Display the frame iconized (minimized) (Windows only).\n\n* wxCAPTION: Puts a caption on the frame.\n\n* wxMINIMIZE: Identical to wxICONIZE.\n\n* wxMINIMIZE_BOX: Displays a minimize box on the frame (Windows and Motif only).\n\n* wxMAXIMIZE: Displays the frame maximized (Windows only).\n\n* wxMAXIMIZE_BOX: Displays a maximize box on the frame (Windows and Motif only).\n\n* wxCLOSE_BOX: Displays a close box on the frame.\n\n* wxSTAY_ON_TOP: Stay on top of other windows (Windows only).\n\n* wxSYSTEM_MENU: Displays a system menu (Windows and Motif only).\n\n* wxRESIZE_BORDER: Displays a resizable border around the window.\n\nRemark: This class has miniframe functionality under Windows and GTK, i.e. the presence\nof mini frame will not be noted in the task bar and focus behaviour is different. On other\nplatforms, it behaves like a normal frame.\n\nSee:\n* `m:wxMDIParentFrame`\n\n* `m:wxMDIChildFrame`\n\n* `m:wxFrame`\n\n* `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMiniFrame](https://docs.wxwidgets.org/3.2/classwx_mini_frame.html)","ref":"wxMiniFrame.html#module-styles"},{"type":"function","title":"wxMiniFrame.create/4","doc":"","ref":"wxMiniFrame.html#create/4"},{"type":"function","title":"wxMiniFrame.create/5","doc":"Used in two-step frame construction.\n\nSee `new/4` for further details.","ref":"wxMiniFrame.html#create/5"},{"type":"function","title":"wxMiniFrame.destroy/1","doc":"Destroys the object","ref":"wxMiniFrame.html#destroy/1"},{"type":"function","title":"wxMiniFrame.new/0","doc":"Default ctor.","ref":"wxMiniFrame.html#new/0"},{"type":"function","title":"wxMiniFrame.new/3","doc":"","ref":"wxMiniFrame.html#new/3"},{"type":"function","title":"wxMiniFrame.new/4","doc":"Constructor, creating the window.\n\nRemark: The frame behaves like a normal frame on non-Windows platforms.\n\nSee: `create/5`","ref":"wxMiniFrame.html#new/4"},{"type":"type","title":"wxMiniFrame.wxMiniFrame/0","doc":"","ref":"wxMiniFrame.html#t:wxMiniFrame/0"},{"type":"module","title":"wxMirrorDC","doc":"`m:wxMirrorDC` is a simple wrapper class which is always associated with a real `m:wxDC`\nobject and either forwards all of its operations to it without changes (no mirroring takes\nplace) or exchanges `x` and `y` coordinates which makes it possible to reuse the same code\nto draw a figure and its mirror -- i.e.\n\nreflection related to the diagonal line x == y.\n\nSince: 2.5.0\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxMirrorDC](https://docs.wxwidgets.org/3.2/classwx_mirror_d_c.html)","ref":"wxMirrorDC.html"},{"type":"function","title":"wxMirrorDC.destroy/1","doc":"Destroys the object","ref":"wxMirrorDC.html#destroy/1"},{"type":"function","title":"wxMirrorDC.new/2","doc":"Creates a (maybe) mirrored DC associated with the real `dc`.\n\nEverything drawn on `m:wxMirrorDC` will appear (and maybe mirrored) on `dc`.\n\n`mirror` specifies if we do mirror (if it is true) or not (if it is false).","ref":"wxMirrorDC.html#new/2"},{"type":"type","title":"wxMirrorDC.wxMirrorDC/0","doc":"","ref":"wxMirrorDC.html#t:wxMirrorDC/0"},{"type":"module","title":"wxMouseCaptureChangedEvent","doc":"An mouse capture changed event is sent to a window that loses its mouse capture.\n\nThis is called even if `wxWindow:releaseMouse/1` was called by the application code. Handling this event allows an\napplication to cater for unexpected capture releases which might otherwise confuse mouse\nhandling code.\n\nOnly for:wxmsw\n\nSee:\n* `m:wxMouseCaptureLostEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:captureMouse/1`\n\n* `wxWindow:releaseMouse/1`\n\n* `wxWindow:getCapture/0`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseCaptureChangedEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_capture_changed_event.html)","ref":"wxMouseCaptureChangedEvent.html"},{"type":"module","title":"Events - wxMouseCaptureChangedEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMouseCaptureChangedEventType` to subscribe to events of this type.","ref":"wxMouseCaptureChangedEvent.html#module-events"},{"type":"function","title":"wxMouseCaptureChangedEvent.getCapturedWindow/1","doc":"Returns the window that gained the capture, or NULL if it was a non-wxWidgets window.","ref":"wxMouseCaptureChangedEvent.html#getCapturedWindow/1"},{"type":"type","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChanged/0","doc":"","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChanged/0"},{"type":"type","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChangedEvent/0","doc":"","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChangedEvent/0"},{"type":"type","title":"wxMouseCaptureChangedEvent.wxMouseCaptureChangedEventType/0","doc":"","ref":"wxMouseCaptureChangedEvent.html#t:wxMouseCaptureChangedEventType/0"},{"type":"module","title":"wxMouseCaptureLostEvent","doc":"A mouse capture lost event is sent to a window that had obtained mouse capture, which was\nsubsequently lost due to an \"external\" event (for example, when a dialog box is shown or\nif another application captures the mouse).\n\nIf this happens, this event is sent to all windows that are on the capture stack (i.e.\ncalled CaptureMouse, but didn't call ReleaseMouse yet). The event is not sent if the\ncapture changes because of a call to CaptureMouse or ReleaseMouse.\n\nThis event is currently emitted under Windows only.\n\nSee:\n* `m:wxMouseCaptureChangedEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:captureMouse/1`\n\n* `wxWindow:releaseMouse/1`\n\n* `wxWindow:getCapture/0`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseCaptureLostEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_capture_lost_event.html)","ref":"wxMouseCaptureLostEvent.html"},{"type":"module","title":"Events - wxMouseCaptureLostEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMouseCaptureLostEventType` to subscribe to events of this type.","ref":"wxMouseCaptureLostEvent.html#module-events"},{"type":"type","title":"wxMouseCaptureLostEvent.wxMouseCaptureLost/0","doc":"","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLost/0"},{"type":"type","title":"wxMouseCaptureLostEvent.wxMouseCaptureLostEvent/0","doc":"","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLostEvent/0"},{"type":"type","title":"wxMouseCaptureLostEvent.wxMouseCaptureLostEventType/0","doc":"","ref":"wxMouseCaptureLostEvent.html#t:wxMouseCaptureLostEventType/0"},{"type":"module","title":"wxMouseEvent","doc":"This event class contains information about the events generated by the mouse: they\ninclude mouse buttons press and release events and mouse move events.\n\nAll mouse events involving the buttons use `wxMOUSE_BTN_LEFT` for the left mouse button, `wxMOUSE_BTN_MIDDLE`\nfor the middle one and `wxMOUSE_BTN_RIGHT` for the right one. And if the system supports\nmore buttons, the `wxMOUSE_BTN_AUX1` and `wxMOUSE_BTN_AUX2` events can also be generated.\nNote that not all mice have even a middle button so a portable application should avoid\nrelying on the events from it (but the right button click can be emulated using the left\nmouse button with the control key under Mac platforms with a single button mouse).\n\nFor the `wxEVT_ENTER_WINDOW` and `wxEVT_LEAVE_WINDOW` events purposes, the mouse is\nconsidered to be inside the window if it is in the window client area and not inside one\nof its children. In other words, the parent window receives `wxEVT_LEAVE_WINDOW` event not\nonly when the mouse leaves the window entirely but also when it enters one of its children.\n\nThe position associated with a mouse event is expressed in the window coordinates of the\nwindow which generated the event, you can use `wxWindow:clientToScreen/3` to convert it to screen coordinates and\npossibly call `wxWindow:screenToClient/2` next to convert it to window coordinates of another window.\n\nNote: Note the difference between methods like `leftDown/1` and the inherited `leftIsDown/1`: the former returns\ntrue when the event corresponds to the left mouse button click while the latter returns\ntrue if the left mouse button is currently being pressed. For example, when the user is\ndragging the mouse you can use `leftIsDown/1` to test whether the left mouse button is (still)\ndepressed. Also, by convention, if `leftDown/1` returns true, `leftIsDown/1` will also return true in wxWidgets\nwhatever the underlying GUI behaviour is (which is platform-dependent). The same applies,\nof course, to other mouse buttons as well.\n\nSee: `m:wxKeyEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMouseEvent](https://docs.wxwidgets.org/3.2/classwx_mouse_event.html)","ref":"wxMouseEvent.html"},{"type":"module","title":"Events - wxMouseEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMouseEventType` to subscribe to events of this type.","ref":"wxMouseEvent.html#module-events"},{"type":"function","title":"wxMouseEvent.altDown/1","doc":"Returns true if the Alt key is pressed.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","ref":"wxMouseEvent.html#altDown/1"},{"type":"function","title":"wxMouseEvent.aux1DClick/1","doc":"Returns true if the event was a first extra button double click.","ref":"wxMouseEvent.html#aux1DClick/1"},{"type":"function","title":"wxMouseEvent.aux1Down/1","doc":"Returns true if the first extra button mouse button changed to down.","ref":"wxMouseEvent.html#aux1Down/1"},{"type":"function","title":"wxMouseEvent.aux1Up/1","doc":"Returns true if the first extra button mouse button changed to up.","ref":"wxMouseEvent.html#aux1Up/1"},{"type":"function","title":"wxMouseEvent.aux2DClick/1","doc":"Returns true if the event was a second extra button double click.","ref":"wxMouseEvent.html#aux2DClick/1"},{"type":"function","title":"wxMouseEvent.aux2Down/1","doc":"Returns true if the second extra button mouse button changed to down.","ref":"wxMouseEvent.html#aux2Down/1"},{"type":"function","title":"wxMouseEvent.aux2Up/1","doc":"Returns true if the second extra button mouse button changed to up.","ref":"wxMouseEvent.html#aux2Up/1"},{"type":"function","title":"wxMouseEvent.button/2","doc":"Returns true if the event was generated by the specified button.","ref":"wxMouseEvent.html#button/2"},{"type":"function","title":"wxMouseEvent.buttonDClick/1","doc":"","ref":"wxMouseEvent.html#buttonDClick/1"},{"type":"function","title":"wxMouseEvent.buttonDClick/2","doc":"If the argument is omitted, this returns true if the event was a mouse double click\nevent.\n\nOtherwise the argument specifies which double click event was generated (see `button/2` for the\npossible values).","ref":"wxMouseEvent.html#buttonDClick/2"},{"type":"function","title":"wxMouseEvent.buttonDown/1","doc":"","ref":"wxMouseEvent.html#buttonDown/1"},{"type":"function","title":"wxMouseEvent.buttonDown/2","doc":"If the argument is omitted, this returns true if the event was a mouse button down event.\n\nOtherwise the argument specifies which button-down event was generated (see `button/2` for the\npossible values).","ref":"wxMouseEvent.html#buttonDown/2"},{"type":"function","title":"wxMouseEvent.buttonUp/1","doc":"","ref":"wxMouseEvent.html#buttonUp/1"},{"type":"function","title":"wxMouseEvent.buttonUp/2","doc":"If the argument is omitted, this returns true if the event was a mouse button up event.\n\nOtherwise the argument specifies which button-up event was generated (see `button/2` for the\npossible values).","ref":"wxMouseEvent.html#buttonUp/2"},{"type":"function","title":"wxMouseEvent.cmdDown/1","doc":"Returns true if the key used for command accelerators is pressed.\n\nSame as `controlDown/1`. Deprecated.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","ref":"wxMouseEvent.html#cmdDown/1"},{"type":"function","title":"wxMouseEvent.controlDown/1","doc":"Returns true if the Control key or Apple/Command key under macOS is pressed.\n\nThis function doesn't distinguish between right and left control keys.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","ref":"wxMouseEvent.html#controlDown/1"},{"type":"function","title":"wxMouseEvent.dragging/1","doc":"Returns true if this was a dragging event (motion while a button is depressed).\n\nSee: `moving/1`","ref":"wxMouseEvent.html#dragging/1"},{"type":"function","title":"wxMouseEvent.entering/1","doc":"Returns true if the mouse was entering the window.\n\nSee: `leaving/1`","ref":"wxMouseEvent.html#entering/1"},{"type":"function","title":"wxMouseEvent.getButton/1","doc":"Returns the mouse button which generated this event or `wxMOUSE\\_BTN\\_NONE` if no button\nis involved (for mouse move, enter or leave event, for example).\n\nOtherwise `wxMOUSE_BTN_LEFT` is returned for the left button down, up and double click\nevents, `wxMOUSE_BTN_MIDDLE` and `wxMOUSE_BTN_RIGHT` for the same events for the middle\nand the right buttons respectively.","ref":"wxMouseEvent.html#getButton/1"},{"type":"function","title":"wxMouseEvent.getLinesPerAction/1","doc":"Returns the configured number of lines (or whatever) to be scrolled per wheel action.\n\nDefault value under most platforms is three.","ref":"wxMouseEvent.html#getLinesPerAction/1"},{"type":"function","title":"wxMouseEvent.getLogicalPosition/2","doc":"Returns the logical mouse position in pixels (i.e. translated according to the\ntranslation set for the DC, which usually indicates that the window has been scrolled).","ref":"wxMouseEvent.html#getLogicalPosition/2"},{"type":"function","title":"wxMouseEvent.getPosition/1","doc":"Returns the physical mouse position.","ref":"wxMouseEvent.html#getPosition/1"},{"type":"function","title":"wxMouseEvent.getWheelAxis/1","doc":"Gets the axis the wheel operation concerns.\n\nUsually the mouse wheel is used to scroll vertically so `wxMOUSE_WHEEL_VERTICAL` is\nreturned but some mice (and most trackpads) also allow to use the wheel to scroll\nhorizontally in which case `wxMOUSE_WHEEL_HORIZONTAL` is returned.\n\nNotice that before wxWidgets 2.9.4 this method returned `int`.","ref":"wxMouseEvent.html#getWheelAxis/1"},{"type":"function","title":"wxMouseEvent.getWheelDelta/1","doc":"Get wheel delta, normally 120.\n\nThis is the threshold for action to be taken, and one such action (for example, scrolling\none increment) should occur for each delta.","ref":"wxMouseEvent.html#getWheelDelta/1"},{"type":"function","title":"wxMouseEvent.getWheelRotation/1","doc":"Get wheel rotation, positive or negative indicates direction of rotation.\n\nCurrent devices all send an event when rotation is at least +/-WheelDelta, but finer\nresolution devices can be created in the future.\n\nBecause of this you shouldn't assume that one event is equal to 1 line, but you should be\nable to either do partial line scrolling or wait until several events accumulate before\nscrolling.","ref":"wxMouseEvent.html#getWheelRotation/1"},{"type":"function","title":"wxMouseEvent.getX/1","doc":"Returns X coordinate of the physical mouse event position.","ref":"wxMouseEvent.html#getX/1"},{"type":"function","title":"wxMouseEvent.getY/1","doc":"Returns Y coordinate of the physical mouse event position.","ref":"wxMouseEvent.html#getY/1"},{"type":"function","title":"wxMouseEvent.isButton/1","doc":"Returns true if the event was a mouse button event (not necessarily a button down event -\nthat may be tested using `buttonDown/2`).","ref":"wxMouseEvent.html#isButton/1"},{"type":"function","title":"wxMouseEvent.isPageScroll/1","doc":"Returns true if the system has been setup to do page scrolling with the mouse wheel\ninstead of line scrolling.","ref":"wxMouseEvent.html#isPageScroll/1"},{"type":"function","title":"wxMouseEvent.leaving/1","doc":"Returns true if the mouse was leaving the window.\n\nSee: `entering/1`","ref":"wxMouseEvent.html#leaving/1"},{"type":"function","title":"wxMouseEvent.leftDClick/1","doc":"Returns true if the event was a left double click.","ref":"wxMouseEvent.html#leftDClick/1"},{"type":"function","title":"wxMouseEvent.leftDown/1","doc":"Returns true if the left mouse button changed to down.","ref":"wxMouseEvent.html#leftDown/1"},{"type":"function","title":"wxMouseEvent.leftIsDown/1","doc":"Returns true if the left mouse button is currently down.","ref":"wxMouseEvent.html#leftIsDown/1"},{"type":"function","title":"wxMouseEvent.leftUp/1","doc":"Returns true if the left mouse button changed to up.","ref":"wxMouseEvent.html#leftUp/1"},{"type":"function","title":"wxMouseEvent.metaDown/1","doc":"Returns true if the Meta key was down at the time of the event.","ref":"wxMouseEvent.html#metaDown/1"},{"type":"function","title":"wxMouseEvent.middleDClick/1","doc":"Returns true if the event was a middle double click.","ref":"wxMouseEvent.html#middleDClick/1"},{"type":"function","title":"wxMouseEvent.middleDown/1","doc":"Returns true if the middle mouse button changed to down.","ref":"wxMouseEvent.html#middleDown/1"},{"type":"function","title":"wxMouseEvent.middleIsDown/1","doc":"Returns true if the middle mouse button is currently down.","ref":"wxMouseEvent.html#middleIsDown/1"},{"type":"function","title":"wxMouseEvent.middleUp/1","doc":"Returns true if the middle mouse button changed to up.","ref":"wxMouseEvent.html#middleUp/1"},{"type":"function","title":"wxMouseEvent.moving/1","doc":"Returns true if this was a motion event and no mouse buttons were pressed.\n\nIf any mouse button is held pressed, then this method returns false and `dragging/1` returns true.","ref":"wxMouseEvent.html#moving/1"},{"type":"function","title":"wxMouseEvent.rightDClick/1","doc":"Returns true if the event was a right double click.","ref":"wxMouseEvent.html#rightDClick/1"},{"type":"function","title":"wxMouseEvent.rightDown/1","doc":"Returns true if the right mouse button changed to down.","ref":"wxMouseEvent.html#rightDown/1"},{"type":"function","title":"wxMouseEvent.rightIsDown/1","doc":"Returns true if the right mouse button is currently down.","ref":"wxMouseEvent.html#rightIsDown/1"},{"type":"function","title":"wxMouseEvent.rightUp/1","doc":"Returns true if the right mouse button changed to up.","ref":"wxMouseEvent.html#rightUp/1"},{"type":"function","title":"wxMouseEvent.shiftDown/1","doc":"Returns true if the Shift key is pressed.\n\nThis function doesn't distinguish between right and left shift keys.\n\nNotice that `wxKeyEvent:getModifiers/1` should usually be used instead of this one.","ref":"wxMouseEvent.html#shiftDown/1"},{"type":"type","title":"wxMouseEvent.wxMouse/0","doc":"","ref":"wxMouseEvent.html#t:wxMouse/0"},{"type":"type","title":"wxMouseEvent.wxMouseEvent/0","doc":"","ref":"wxMouseEvent.html#t:wxMouseEvent/0"},{"type":"type","title":"wxMouseEvent.wxMouseEventType/0","doc":"","ref":"wxMouseEvent.html#t:wxMouseEventType/0"},{"type":"module","title":"wxMoveEvent","doc":"A move event holds information about window position change.\n\nThese events are currently generated for top level (see `m:wxTopLevelWindow`) windows in\nall ports, but are not generated for the child windows in wxGTK.\n\nSee:\n* {X,Y}\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxMoveEvent](https://docs.wxwidgets.org/3.2/classwx_move_event.html)","ref":"wxMoveEvent.html"},{"type":"module","title":"Events - wxMoveEvent","doc":"Use `wxEvtHandler:connect/3` with `wxMoveEventType` to subscribe to events of this type.","ref":"wxMoveEvent.html#module-events"},{"type":"function","title":"wxMoveEvent.getPosition/1","doc":"Returns the position of the window generating the move change event.","ref":"wxMoveEvent.html#getPosition/1"},{"type":"function","title":"wxMoveEvent.getRect/1","doc":"","ref":"wxMoveEvent.html#getRect/1"},{"type":"type","title":"wxMoveEvent.wxMove/0","doc":"","ref":"wxMoveEvent.html#t:wxMove/0"},{"type":"type","title":"wxMoveEvent.wxMoveEvent/0","doc":"","ref":"wxMoveEvent.html#t:wxMoveEvent/0"},{"type":"type","title":"wxMoveEvent.wxMoveEventType/0","doc":"","ref":"wxMoveEvent.html#t:wxMoveEventType/0"},{"type":"module","title":"wxMultiChoiceDialog","doc":"This class represents a dialog that shows a list of strings, and allows the user to\nselect one or more.","ref":"wxMultiChoiceDialog.html"},{"type":"module","title":"Styles - wxMultiChoiceDialog","doc":"This class supports the following styles:\n\n* wxOK: Show an OK button.\n\n* wxCANCEL: Show a Cancel button.\n\n* wxCENTRE: Centre the message.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_multichoice)\n\n* `m:wxSingleChoiceDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxMultiChoiceDialog](https://docs.wxwidgets.org/3.2/classwx_multi_choice_dialog.html)","ref":"wxMultiChoiceDialog.html#module-styles"},{"type":"function","title":"wxMultiChoiceDialog.destroy/1","doc":"Destroys the object","ref":"wxMultiChoiceDialog.html#destroy/1"},{"type":"function","title":"wxMultiChoiceDialog.getSelections/1","doc":"Returns array with indexes of selected items.","ref":"wxMultiChoiceDialog.html#getSelections/1"},{"type":"function","title":"wxMultiChoiceDialog.new/4","doc":"","ref":"wxMultiChoiceDialog.html#new/4"},{"type":"function","title":"wxMultiChoiceDialog.new/5","doc":"Constructor taking an array of `wxString` (not implemented in wx) choices.\n\nRemark: Use `wxDialog:showModal/1` to show the dialog.","ref":"wxMultiChoiceDialog.html#new/5"},{"type":"function","title":"wxMultiChoiceDialog.setSelections/2","doc":"Sets selected items from the array of selected items' indexes.","ref":"wxMultiChoiceDialog.html#setSelections/2"},{"type":"type","title":"wxMultiChoiceDialog.wxMultiChoiceDialog/0","doc":"","ref":"wxMultiChoiceDialog.html#t:wxMultiChoiceDialog/0"},{"type":"module","title":"wxNavigationKeyEvent","doc":"This event class contains information about navigation events, generated by navigation\nkeys such as tab and page down.\n\nThis event is mainly used by wxWidgets implementations. A `m:wxNavigationKeyEvent`\nhandler is automatically provided by wxWidgets when you enable keyboard navigation inside\na window by inheriting it from wxNavigationEnabled<>.\n\nSee: `wxWindow:navigate/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxNavigationKeyEvent](https://docs.wxwidgets.org/3.2/classwx_navigation_key_event.html)","ref":"wxNavigationKeyEvent.html"},{"type":"module","title":"Events - wxNavigationKeyEvent","doc":"Use `wxEvtHandler:connect/3` with `wxNavigationKeyEventType` to subscribe to events of this type.","ref":"wxNavigationKeyEvent.html#module-events"},{"type":"function","title":"wxNavigationKeyEvent.getCurrentFocus/1","doc":"Returns the child that has the focus, or NULL.","ref":"wxNavigationKeyEvent.html#getCurrentFocus/1"},{"type":"function","title":"wxNavigationKeyEvent.getDirection/1","doc":"Returns true if the navigation was in the forward direction.","ref":"wxNavigationKeyEvent.html#getDirection/1"},{"type":"function","title":"wxNavigationKeyEvent.isFromTab/1","doc":"Returns true if the navigation event was from a tab key.\n\nThis is required for proper navigation over radio buttons.","ref":"wxNavigationKeyEvent.html#isFromTab/1"},{"type":"function","title":"wxNavigationKeyEvent.isWindowChange/1","doc":"Returns true if the navigation event represents a window change (for example, from\nCtrl-Page Down in a notebook).","ref":"wxNavigationKeyEvent.html#isWindowChange/1"},{"type":"function","title":"wxNavigationKeyEvent.setCurrentFocus/2","doc":"Sets the current focus window member.","ref":"wxNavigationKeyEvent.html#setCurrentFocus/2"},{"type":"function","title":"wxNavigationKeyEvent.setDirection/2","doc":"Sets the direction to forward if `direction` is true, or backward if false.","ref":"wxNavigationKeyEvent.html#setDirection/2"},{"type":"function","title":"wxNavigationKeyEvent.setFromTab/2","doc":"Marks the navigation event as from a tab key.","ref":"wxNavigationKeyEvent.html#setFromTab/2"},{"type":"function","title":"wxNavigationKeyEvent.setWindowChange/2","doc":"Marks the event as a window change event.","ref":"wxNavigationKeyEvent.html#setWindowChange/2"},{"type":"type","title":"wxNavigationKeyEvent.wxNavigationKey/0","doc":"","ref":"wxNavigationKeyEvent.html#t:wxNavigationKey/0"},{"type":"type","title":"wxNavigationKeyEvent.wxNavigationKeyEvent/0","doc":"","ref":"wxNavigationKeyEvent.html#t:wxNavigationKeyEvent/0"},{"type":"type","title":"wxNavigationKeyEvent.wxNavigationKeyEventType/0","doc":"","ref":"wxNavigationKeyEvent.html#t:wxNavigationKeyEventType/0"},{"type":"module","title":"wxNotebook","doc":"This class represents a notebook control, which manages multiple windows with associated\ntabs.\n\nTo use the class, create a `m:wxNotebook` object and call `wxBookCtrlBase:addPage/4` or `wxBookCtrlBase:insertPage/5`, passing a window to be\nused as the page. Do not explicitly delete the window for a page that is currently managed\nby `m:wxNotebook`.\n\n`wxNotebookPage` is a typedef for `m:wxWindow`.","ref":"wxNotebook.html"},{"type":"module","title":"Styles - wxNotebook","doc":"This class supports the following styles:\n\n* wxNB_TOP: Place tabs on the top side.\n\n* wxNB_LEFT: Place tabs on the left side.\n\n* wxNB_RIGHT: Place tabs on the right side.\n\n* wxNB_BOTTOM: Place tabs under instead of above the notebook pages.\n\n* wxNB_FIXEDWIDTH: (Windows only) All tabs will have same width.\n\n* wxNB_MULTILINE: (Windows only) There can be several rows of tabs.\n\n* wxNB_NOPAGETHEME: (Windows only) Display a solid colour on notebook pages, and not a\ngradient, which can reduce performance. The styles wxNB_LEFT, RIGHT and BOTTOM are not\nsupported under Microsoft Windows when using visual themes.\n\nPage backgrounds\n\nOn Windows, the default theme paints a background on the notebook's pages. If you wish to\nsuppress this theme, for aesthetic or performance reasons, there are three ways of doing\nit. You can use `wxNB_NOPAGETHEME` to disable themed drawing for a particular notebook,\nyou can call `wxSystemOptions:setOption/2` to disable it for the whole application, or you can disable it for\nindividual pages by using `wxWindow:setBackgroundColour/2`.\n\nTo disable themed pages globally:\n\nSet the value to 1 to enable it again. To give a single page a solid background that more\nor less fits in with the overall theme, use:\n\nOn platforms other than Windows, or if the application is not using Windows themes, `getThemeBackgroundColour/1` will\nreturn an uninitialised colour object, and the above code will therefore work on all platforms.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxImageList`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxNotebook](https://docs.wxwidgets.org/3.2/classwx_notebook.html)","ref":"wxNotebook.html#module-styles"},{"type":"module","title":"Events - wxNotebook","doc":"Event types emitted from this class:\n\n* [`command_notebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`command_notebook_page_changing`](`m:wxBookCtrlEvent`)","ref":"wxNotebook.html#module-events"},{"type":"function","title":"wxNotebook.assignImageList/2","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxNotebook.html#assignImageList/2"},{"type":"function","title":"wxNotebook.create/3","doc":"","ref":"wxNotebook.html#create/3"},{"type":"function","title":"wxNotebook.create/4","doc":"Creates a notebook control.\n\nSee `new/3` for a description of the parameters.","ref":"wxNotebook.html#create/4"},{"type":"function","title":"wxNotebook.destroy/1","doc":"Destroys the object","ref":"wxNotebook.html#destroy/1"},{"type":"function","title":"wxNotebook.getImageList/1","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxNotebook.html#getImageList/1"},{"type":"function","title":"wxNotebook.getPageImage/2","doc":"Returns the image index for the given page.","ref":"wxNotebook.html#getPageImage/2"},{"type":"function","title":"wxNotebook.getRowCount/1","doc":"Returns the number of rows in the notebook control.","ref":"wxNotebook.html#getRowCount/1"},{"type":"function","title":"wxNotebook.getThemeBackgroundColour/1","doc":"If running under Windows and themes are enabled for the application, this function\nreturns a suitable colour for painting the background of a notebook page, and can be\npassed to `wxWindow:setBackgroundColour/2`.\n\nOtherwise, an uninitialised colour will be returned.","ref":"wxNotebook.html#getThemeBackgroundColour/1"},{"type":"function","title":"wxNotebook.new/0","doc":"Constructs a notebook control.","ref":"wxNotebook.html#new/0"},{"type":"function","title":"wxNotebook.new/2","doc":"","ref":"wxNotebook.html#new/2"},{"type":"function","title":"wxNotebook.new/3","doc":"Constructs a notebook control.\n\nNote that sometimes you can reduce flicker by passing the wxCLIP_CHILDREN window style.","ref":"wxNotebook.html#new/3"},{"type":"function","title":"wxNotebook.setImageList/2","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","ref":"wxNotebook.html#setImageList/2"},{"type":"function","title":"wxNotebook.setPadding/2","doc":"Sets the amount of space around each page's icon and label, in pixels.\n\nNote: The vertical padding cannot be changed in wxGTK.","ref":"wxNotebook.html#setPadding/2"},{"type":"function","title":"wxNotebook.setPageImage/3","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","ref":"wxNotebook.html#setPageImage/3"},{"type":"function","title":"wxNotebook.setPageSize/2","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","ref":"wxNotebook.html#setPageSize/2"},{"type":"type","title":"wxNotebook.wxNotebook/0","doc":"","ref":"wxNotebook.html#t:wxNotebook/0"},{"type":"module","title":"wxNotificationMessage","doc":"This class allows showing the user a message non intrusively.\n\nCurrently it is implemented natively for Windows, macOS, GTK and uses generic toast\nnotifications under the other platforms. It's not recommended but `wxGenericNotificationMessage`\ncan be used instead of the native ones. This might make sense if your application\nrequires features not available in the native implementation.\n\nNotice that this class is not a window and so doesn't derive from `m:wxWindow`.\n\nPlatform Notes\n\nPar:\n\nUp to Windows 8 balloon notifications are displayed from an icon in the notification area\nof the taskbar. If your application uses a `m:wxTaskBarIcon` you should call `useTaskBarIcon/1` to ensure\nthat only one icon is shown in the notification area. Windows 10 displays all\nnotifications as popup toasts. To suppress the additional icon in the notification area on\nWindows 10 and for toast notification support on Windows 8 it is recommended to call `mSWUseToasts/1`\nbefore showing the first notification message.\n\nPar:\n\nThe macOS implementation uses Notification Center to display native notifications. In\norder to use actions your notifications must use the alert style. This can be enabled by\nthe user in system settings or by setting the `NSUserNotificationAlertStyle` value in\nInfo.plist to `alert`. Please note that the user always has the option to change the\nnotification style.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxNotificationMessage](https://docs.wxwidgets.org/3.2/classwx_notification_message.html)","ref":"wxNotificationMessage.html"},{"type":"module","title":"Events - wxNotificationMessage","doc":"Event types emitted from this class:\n\n* [`notification_message_click`](`m:wxCommandEvent`)\n\n* [`notification_message_dismissed`](`m:wxCommandEvent`)\n\n* [`notification_message_action`](`m:wxCommandEvent`)","ref":"wxNotificationMessage.html#module-events"},{"type":"function","title":"wxNotificationMessage.addAction/2","doc":"","ref":"wxNotificationMessage.html#addAction/2"},{"type":"function","title":"wxNotificationMessage.addAction/3","doc":"Add an action to the notification.\n\nIf supported by the implementation this are usually buttons in the notification\nselectable by the user.\n\nReturn: false if the current implementation or OS version does not support actions in notifications.\n\nSince: 3.1.0","ref":"wxNotificationMessage.html#addAction/3"},{"type":"function","title":"wxNotificationMessage.close/1","doc":"Hides the notification.\n\nReturns true if it was hidden or false if it couldn't be done (e.g. on some systems\nautomatically hidden notifications can't be hidden manually).","ref":"wxNotificationMessage.html#close/1"},{"type":"function","title":"wxNotificationMessage.destroy/1","doc":"Destroys the object","ref":"wxNotificationMessage.html#destroy/1"},{"type":"function","title":"wxNotificationMessage.mSWUseToasts/0","doc":"","ref":"wxNotificationMessage.html#mSWUseToasts/0"},{"type":"function","title":"wxNotificationMessage.mSWUseToasts/1","doc":"Enables toast notifications available since Windows 8 and suppresses the additional icon\nin the notification area on Windows 10.\n\nToast notifications `require` a shortcut to the application in the start menu. The start\nmenu shortcut needs to contain an Application User Model ID. It is recommended that the\napplications setup creates the shortcut and the application specifies the setup created\nshortcut in `shortcutPath`. A call to this method will verify (and if necessary modify)\nthe shortcut before enabling toast notifications.\n\nReturn: false if toast notifications could not be enabled.\n\nOnly for:wxmsw\n\nSince: 3.1.0","ref":"wxNotificationMessage.html#mSWUseToasts/1"},{"type":"function","title":"wxNotificationMessage.new/0","doc":"Default constructor, use `setParent/2`, `setTitle/2` and `setMessage/2` to initialize the\nobject before showing it.","ref":"wxNotificationMessage.html#new/0"},{"type":"function","title":"wxNotificationMessage.new/1","doc":"","ref":"wxNotificationMessage.html#new/1"},{"type":"function","title":"wxNotificationMessage.new/2","doc":"Create a notification object with the given attributes.\n\nSee `setTitle/2`, `setMessage/2`, `setParent/2` and `setFlags/2` for the description of the corresponding parameters.","ref":"wxNotificationMessage.html#new/2"},{"type":"function","title":"wxNotificationMessage.setFlags/2","doc":"This parameter can be currently used to specify the icon to show in the notification.\n\nValid values are `wxICON_INFORMATION`, `wxICON_WARNING` and `wxICON_ERROR` (notice that `wxICON_QUESTION`\nis not allowed here). Some implementations of this class may not support the icons.\n\nSee: `setIcon/2`","ref":"wxNotificationMessage.html#setFlags/2"},{"type":"function","title":"wxNotificationMessage.setIcon/2","doc":"Specify a custom icon to be displayed in the notification.\n\nSome implementations of this class may not support custom icons.\n\nSee: `setFlags/2`\n\nSince: 3.1.0","ref":"wxNotificationMessage.html#setIcon/2"},{"type":"function","title":"wxNotificationMessage.setMessage/2","doc":"Set the main text of the notification.\n\nThis should be a more detailed description than the title but still limited to reasonable\nlength (not more than 256 characters).","ref":"wxNotificationMessage.html#setMessage/2"},{"type":"function","title":"wxNotificationMessage.setParent/2","doc":"Set the parent for this notification: the notification will be associated with the top\nlevel parent of this window or, if this method is not called, with the main application\nwindow by default.","ref":"wxNotificationMessage.html#setParent/2"},{"type":"function","title":"wxNotificationMessage.setTitle/2","doc":"Set the title, it must be a concise string (not more than 64 characters), use `setMessage/2`\nto give the user more details.","ref":"wxNotificationMessage.html#setTitle/2"},{"type":"function","title":"wxNotificationMessage.show/1","doc":"","ref":"wxNotificationMessage.html#show/1"},{"type":"function","title":"wxNotificationMessage.show/2","doc":"Show the notification to the user and hides it after `timeout` seconds are elapsed.\n\nSpecial values `Timeout_Auto` and `Timeout_Never` can be used here, notice that you\nshouldn't rely on `timeout` being exactly respected because the current platform may only\nsupport default timeout value and also because the user may be able to close the notification.\n\nNote: When using native notifications in wxGTK, the timeout is ignored for the\nnotifications with `wxICON_WARNING` or `wxICON_ERROR` flags, they always remain shown\nunless they're explicitly hidden by the user, i.e. behave as if Timeout_Auto were given.\n\nReturn: false if an error occurred.","ref":"wxNotificationMessage.html#show/2"},{"type":"function","title":"wxNotificationMessage.useTaskBarIcon/1","doc":"If the application already uses a `m:wxTaskBarIcon`, it should be connected to\nnotifications by using this method.\n\nThis has no effect if toast notifications are used.\n\nReturn: the task bar icon which was used previously (may be `NULL`)\n\nOnly for:wxmsw","ref":"wxNotificationMessage.html#useTaskBarIcon/1"},{"type":"type","title":"wxNotificationMessage.wxNotificationMessage/0","doc":"","ref":"wxNotificationMessage.html#t:wxNotificationMessage/0"},{"type":"module","title":"wxNotifyEvent","doc":"This class is not used by the event handlers by itself, but is a base class for other\nevent classes (such as `m:wxBookCtrlEvent`).\n\nIt (or an object of a derived class) is sent when the controls state is being changed and\nallows the program to `veto/1` this change if it wants to prevent it from happening.\n\nSee: `m:wxBookCtrlEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxNotifyEvent](https://docs.wxwidgets.org/3.2/classwx_notify_event.html)","ref":"wxNotifyEvent.html"},{"type":"function","title":"wxNotifyEvent.allow/1","doc":"This is the opposite of `veto/1`: it explicitly allows the event to be processed.\n\nFor most events it is not necessary to call this method as the events are allowed anyhow\nbut some are forbidden by default (this will be mentioned in the corresponding event\ndescription).","ref":"wxNotifyEvent.html#allow/1"},{"type":"function","title":"wxNotifyEvent.isAllowed/1","doc":"Returns true if the change is allowed (`veto/1` hasn't been called) or false otherwise\n(if it was).","ref":"wxNotifyEvent.html#isAllowed/1"},{"type":"function","title":"wxNotifyEvent.veto/1","doc":"Prevents the change announced by this event from happening.\n\nIt is in general a good idea to notify the user about the reasons for vetoing the change\nbecause otherwise the applications behaviour (which just refuses to do what the user\nwants) might be quite surprising.","ref":"wxNotifyEvent.html#veto/1"},{"type":"type","title":"wxNotifyEvent.wxNotifyEvent/0","doc":"","ref":"wxNotifyEvent.html#t:wxNotifyEvent/0"},{"type":"module","title":"wxOverlay","doc":"Creates an overlay over an existing window, allowing for manipulations like\nrubberbanding, etc.\n\nOn wxOSX the overlay is implemented with native platform APIs, on the other platforms it\nis simulated using `m:wxMemoryDC`.\n\nSee:\n* `m:wxDCOverlay`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxOverlay](https://docs.wxwidgets.org/3.2/classwx_overlay.html)","ref":"wxOverlay.html"},{"type":"function","title":"wxOverlay.destroy/1","doc":"Destroys the object","ref":"wxOverlay.html#destroy/1"},{"type":"function","title":"wxOverlay.new/0","doc":"","ref":"wxOverlay.html#new/0"},{"type":"function","title":"wxOverlay.reset/1","doc":"Clears the overlay without restoring the former state.\n\nTo be done, for example, when the window content has been changed and repainted.","ref":"wxOverlay.html#reset/1"},{"type":"type","title":"wxOverlay.wxOverlay/0","doc":"","ref":"wxOverlay.html#t:wxOverlay/0"},{"type":"module","title":"wxPageSetupDialog","doc":"This class represents the page setup common dialog.\n\nThe page setup dialog contains controls for paper size (letter, A4, A5 etc.), orientation\n(landscape or portrait), and, only under Windows currently, controls for setting left,\ntop, right and bottom margin sizes in millimetres.\n\nThe exact appearance of this dialog varies among the platforms as a native dialog is used\nwhen available (currently the case for all major platforms).\n\nWhen the dialog has been closed, you need to query the `m:wxPageSetupDialogData` object\nassociated with the dialog.\n\nNote that the OK and Cancel buttons do not destroy the dialog; this must be done by the application.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialogData`\n\nwxWidgets docs: [wxPageSetupDialog](https://docs.wxwidgets.org/3.2/classwx_page_setup_dialog.html)","ref":"wxPageSetupDialog.html"},{"type":"function","title":"wxPageSetupDialog.destroy/1","doc":"Destroys the object","ref":"wxPageSetupDialog.html#destroy/1"},{"type":"function","title":"wxPageSetupDialog.getPageSetupData/1","doc":"Returns the `m:wxPageSetupDialogData` object associated with the dialog.","ref":"wxPageSetupDialog.html#getPageSetupData/1"},{"type":"function","title":"wxPageSetupDialog.new/1","doc":"","ref":"wxPageSetupDialog.html#new/1"},{"type":"function","title":"wxPageSetupDialog.new/2","doc":"Constructor.\n\nPass a parent window, and optionally a pointer to a block of page setup data, which will\nbe copied to the print dialog's internal data.","ref":"wxPageSetupDialog.html#new/2"},{"type":"function","title":"wxPageSetupDialog.showModal/1","doc":"Shows the dialog, returning `wxID\\_OK` if the user pressed OK, and `wxID\\_CANCEL`\notherwise.","ref":"wxPageSetupDialog.html#showModal/1"},{"type":"type","title":"wxPageSetupDialog.wxPageSetupDialog/0","doc":"","ref":"wxPageSetupDialog.html#t:wxPageSetupDialog/0"},{"type":"module","title":"wxPageSetupDialogData","doc":"This class holds a variety of information related to `m:wxPageSetupDialog`.\n\nIt contains a `m:wxPrintData` member which is used to hold basic printer configuration\ndata (as opposed to the user-interface configuration settings stored by `m:wxPageSetupDialogData`).\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPageSetupDialog`\n\nwxWidgets docs: [wxPageSetupDialogData](https://docs.wxwidgets.org/3.2/classwx_page_setup_dialog_data.html)","ref":"wxPageSetupDialogData.html"},{"type":"function","title":"wxPageSetupDialogData.destroy/1","doc":"Destroys the object","ref":"wxPageSetupDialogData.html#destroy/1"},{"type":"function","title":"wxPageSetupDialogData.enableHelp/2","doc":"Enables or disables the \"Help\" button (Windows only).","ref":"wxPageSetupDialogData.html#enableHelp/2"},{"type":"function","title":"wxPageSetupDialogData.enableMargins/2","doc":"Enables or disables the margin controls (Windows only).","ref":"wxPageSetupDialogData.html#enableMargins/2"},{"type":"function","title":"wxPageSetupDialogData.enableOrientation/2","doc":"Enables or disables the orientation control (Windows only).","ref":"wxPageSetupDialogData.html#enableOrientation/2"},{"type":"function","title":"wxPageSetupDialogData.enablePaper/2","doc":"Enables or disables the paper size control (Windows only).","ref":"wxPageSetupDialogData.html#enablePaper/2"},{"type":"function","title":"wxPageSetupDialogData.enablePrinter/2","doc":"Enables or disables the \"Printer\" button, which invokes a printer setup dialog.","ref":"wxPageSetupDialogData.html#enablePrinter/2"},{"type":"function","title":"wxPageSetupDialogData.getDefaultInfo/1","doc":"Returns true if the dialog will simply return default printer information (such as\norientation) instead of showing a dialog (Windows only).","ref":"wxPageSetupDialogData.html#getDefaultInfo/1"},{"type":"function","title":"wxPageSetupDialogData.getDefaultMinMargins/1","doc":"Returns true if the page setup dialog will take its minimum margin values from the\ncurrently selected printer properties (Windows only).","ref":"wxPageSetupDialogData.html#getDefaultMinMargins/1"},{"type":"function","title":"wxPageSetupDialogData.getEnableHelp/1","doc":"Returns true if the printer setup button is enabled.","ref":"wxPageSetupDialogData.html#getEnableHelp/1"},{"type":"function","title":"wxPageSetupDialogData.getEnableMargins/1","doc":"Returns true if the margin controls are enabled (Windows only).","ref":"wxPageSetupDialogData.html#getEnableMargins/1"},{"type":"function","title":"wxPageSetupDialogData.getEnableOrientation/1","doc":"Returns true if the orientation control is enabled (Windows only).","ref":"wxPageSetupDialogData.html#getEnableOrientation/1"},{"type":"function","title":"wxPageSetupDialogData.getEnablePaper/1","doc":"Returns true if the paper size control is enabled (Windows only).","ref":"wxPageSetupDialogData.html#getEnablePaper/1"},{"type":"function","title":"wxPageSetupDialogData.getEnablePrinter/1","doc":"Returns true if the printer setup button is enabled.","ref":"wxPageSetupDialogData.html#getEnablePrinter/1"},{"type":"function","title":"wxPageSetupDialogData.getMarginBottomRight/1","doc":"Returns the right (x) and bottom (y) margins in millimetres.","ref":"wxPageSetupDialogData.html#getMarginBottomRight/1"},{"type":"function","title":"wxPageSetupDialogData.getMarginTopLeft/1","doc":"Returns the left (x) and top (y) margins in millimetres.","ref":"wxPageSetupDialogData.html#getMarginTopLeft/1"},{"type":"function","title":"wxPageSetupDialogData.getMinMarginBottomRight/1","doc":"Returns the right (x) and bottom (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","ref":"wxPageSetupDialogData.html#getMinMarginBottomRight/1"},{"type":"function","title":"wxPageSetupDialogData.getMinMarginTopLeft/1","doc":"Returns the left (x) and top (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","ref":"wxPageSetupDialogData.html#getMinMarginTopLeft/1"},{"type":"function","title":"wxPageSetupDialogData.getPaperId/1","doc":"Returns the paper id (stored in the internal `m:wxPrintData` object).\n\nSee: `wxPrintData:setPaperId/2`","ref":"wxPageSetupDialogData.html#getPaperId/1"},{"type":"function","title":"wxPageSetupDialogData.getPaperSize/1","doc":"Returns the paper size in millimetres.","ref":"wxPageSetupDialogData.html#getPaperSize/1"},{"type":"function","title":"wxPageSetupDialogData.getPrintData/1","doc":"","ref":"wxPageSetupDialogData.html#getPrintData/1"},{"type":"function","title":"wxPageSetupDialogData.isOk/1","doc":"Returns true if the print data associated with the dialog data is valid.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","ref":"wxPageSetupDialogData.html#isOk/1"},{"type":"function","title":"wxPageSetupDialogData.new/0","doc":"Default constructor.","ref":"wxPageSetupDialogData.html#new/0"},{"type":"function","title":"wxPageSetupDialogData.new/1","doc":"Construct an object from a print data object.","ref":"wxPageSetupDialogData.html#new/1"},{"type":"function","title":"wxPageSetupDialogData.setDefaultInfo/2","doc":"Pass true if the dialog will simply return default printer information (such as\norientation) instead of showing a dialog (Windows only).","ref":"wxPageSetupDialogData.html#setDefaultInfo/2"},{"type":"function","title":"wxPageSetupDialogData.setDefaultMinMargins/2","doc":"Pass true if the page setup dialog will take its minimum margin values from the currently\nselected printer properties (Windows only).\n\nUnits are in millimetres.","ref":"wxPageSetupDialogData.html#setDefaultMinMargins/2"},{"type":"function","title":"wxPageSetupDialogData.setMarginBottomRight/2","doc":"Sets the right (x) and bottom (y) margins in millimetres.","ref":"wxPageSetupDialogData.html#setMarginBottomRight/2"},{"type":"function","title":"wxPageSetupDialogData.setMarginTopLeft/2","doc":"Sets the left (x) and top (y) margins in millimetres.","ref":"wxPageSetupDialogData.html#setMarginTopLeft/2"},{"type":"function","title":"wxPageSetupDialogData.setMinMarginBottomRight/2","doc":"Sets the right (x) and bottom (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","ref":"wxPageSetupDialogData.html#setMinMarginBottomRight/2"},{"type":"function","title":"wxPageSetupDialogData.setMinMarginTopLeft/2","doc":"Sets the left (x) and top (y) minimum margins the user can enter (Windows only).\n\nUnits are in millimetres.","ref":"wxPageSetupDialogData.html#setMinMarginTopLeft/2"},{"type":"function","title":"wxPageSetupDialogData.setPaperId/2","doc":"Sets the paper size id.\n\nCalling this function overrides the explicit paper dimensions passed in `setPaperSize/2`.\n\nSee: `wxPrintData:setPaperId/2`","ref":"wxPageSetupDialogData.html#setPaperId/2"},{"type":"function","title":"wxPageSetupDialogData.setPaperSize/2","doc":"Sets the paper size in millimetres.\n\nIf a corresponding paper id is found, it will be set in the internal `m:wxPrintData`\nobject, otherwise the paper size overrides the paper id.","ref":"wxPageSetupDialogData.html#setPaperSize/2"},{"type":"function","title":"wxPageSetupDialogData.setPrintData/2","doc":"Sets the print data associated with this object.","ref":"wxPageSetupDialogData.html#setPrintData/2"},{"type":"type","title":"wxPageSetupDialogData.wxPageSetupDialogData/0","doc":"","ref":"wxPageSetupDialogData.html#t:wxPageSetupDialogData/0"},{"type":"module","title":"wxPaintDC","doc":"A `m:wxPaintDC` must be constructed if an application wishes to paint on the client area\nof a window from within an EVT\\_PAINT() event handler.\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxPaintDC`\nobject. If you have an EVT_PAINT() handler, you `must` create a `m:wxPaintDC` object\nwithin it even if you don't actually use it.\n\nUsing `m:wxPaintDC` within your EVT_PAINT() handler is important because it automatically\nsets the clipping area to the damaged area of the window. Attempts to draw outside this\narea do not appear.\n\nA `m:wxPaintDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxClientDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxWindowDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindowDC`\n\n* `m:wxDC`\n\nwxWidgets docs: [wxPaintDC](https://docs.wxwidgets.org/3.2/classwx_paint_d_c.html)","ref":"wxPaintDC.html"},{"type":"function","title":"wxPaintDC.destroy/1","doc":"Destroys the object","ref":"wxPaintDC.html#destroy/1"},{"type":"function","title":"wxPaintDC.new/1","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","ref":"wxPaintDC.html#new/1"},{"type":"type","title":"wxPaintDC.wxPaintDC/0","doc":"","ref":"wxPaintDC.html#t:wxPaintDC/0"},{"type":"module","title":"wxPaintEvent","doc":"A paint event is sent when a window's contents needs to be repainted.\n\nThe handler of this event must create a `m:wxPaintDC` object and use it for painting the\nwindow contents. For example:\n\nNotice that you must `not` create other kinds of `m:wxDC` (e.g. `m:wxClientDC` or `m:wxWindowDC`)\nin EVT_PAINT handlers and also don't create `m:wxPaintDC` outside of this event handlers.\n\nYou can optimize painting by retrieving the rectangles that have been damaged and only\nrepainting these. The rectangles are in terms of the client area, and are unscrolled, so\nyou will need to do some calculations using the current view position to obtain logical,\nscrolled units. Here is an example of using the `wxRegionIterator` (not implemented in wx)\nclass:\n\nRemark: Please notice that in general it is impossible to change the drawing of a\nstandard control (such as `m:wxButton`) and so you shouldn't attempt to handle paint\nevents for them as even if it might work on some platforms, this is inherently not\nportable and won't work everywhere.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxPaintEvent](https://docs.wxwidgets.org/3.2/classwx_paint_event.html)","ref":"wxPaintEvent.html"},{"type":"module","title":"Events - wxPaintEvent","doc":"Use `wxEvtHandler:connect/3` with `wxPaintEventType` to subscribe to events of this type.","ref":"wxPaintEvent.html#module-events"},{"type":"type","title":"wxPaintEvent.wxPaint/0","doc":"","ref":"wxPaintEvent.html#t:wxPaint/0"},{"type":"type","title":"wxPaintEvent.wxPaintEvent/0","doc":"","ref":"wxPaintEvent.html#t:wxPaintEvent/0"},{"type":"type","title":"wxPaintEvent.wxPaintEventType/0","doc":"","ref":"wxPaintEvent.html#t:wxPaintEventType/0"},{"type":"module","title":"wxPalette","doc":"A palette is a table that maps pixel values to RGB colours.\n\nIt allows the colours of a low-depth bitmap, for example, to be mapped to the available\ncolours in a display. The notion of palettes is becoming more and more obsolete nowadays\nand only the MSW port is still using a native palette. All other ports use generic code\nwhich is basically just an array of colours.\n\nIt is likely that in the future the only use for palettes within wxWidgets will be for\nrepresenting colour indices from images (such as GIF or PNG). The image handlers for these\nformats have been modified to create a palette if there is such information in the\noriginal image file (usually 256 or less colour images). See `m:wxImage` for more information.\n\nPredefined objects (include wx.hrl): ?wxNullPalette\n\nSee:\n* `wxDC:setPalette/2`\n\n* `m:wxBitmap`\n\nwxWidgets docs: [wxPalette](https://docs.wxwidgets.org/3.2/classwx_palette.html)","ref":"wxPalette.html"},{"type":"function","title":"wxPalette.create/4","doc":"Creates a palette from arrays of size `n`, one for each red, blue or green component.\n\nReturn: true if the creation was successful, false otherwise.\n\nSee: `new/3`","ref":"wxPalette.html#create/4"},{"type":"function","title":"wxPalette.destroy/1","doc":"Destroys the object","ref":"wxPalette.html#destroy/1"},{"type":"function","title":"wxPalette.getColoursCount/1","doc":"Returns number of entries in palette.","ref":"wxPalette.html#getColoursCount/1"},{"type":"function","title":"wxPalette.getPixel/4","doc":"Returns a pixel value (index into the palette) for the given RGB values.\n\nReturn: The nearest palette index or `wxNOT_FOUND` for unexpected errors.\n\nSee: `getRGB/2`","ref":"wxPalette.html#getPixel/4"},{"type":"function","title":"wxPalette.getRGB/2","doc":"Returns RGB values for a given palette index.\n\nReturn: true if the operation was successful.\n\nSee: `getPixel/4`","ref":"wxPalette.html#getRGB/2"},{"type":"function","title":"wxPalette.isOk/1","doc":"Returns true if palette data is present.","ref":"wxPalette.html#isOk/1"},{"type":"function","title":"wxPalette.new/0","doc":"Default constructor.","ref":"wxPalette.html#new/0"},{"type":"function","title":"wxPalette.new/1","doc":"Copy constructor, uses overview_refcount.","ref":"wxPalette.html#new/1"},{"type":"function","title":"wxPalette.new/3","doc":"Creates a palette from arrays of size `n`, one for each red, blue or green component.\n\nSee: `create/4`","ref":"wxPalette.html#new/3"},{"type":"function","title":"wxPalette.ok/1","doc":"Equivalent to: `isOk/1`","ref":"wxPalette.html#ok/1"},{"type":"type","title":"wxPalette.wxPalette/0","doc":"","ref":"wxPalette.html#t:wxPalette/0"},{"type":"module","title":"wxPaletteChangedEvent","doc":"Functions for wxPaletteChangedEvent class\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxPaletteChangedEvent](https://docs.wxwidgets.org/3.2/classwx_palette_changed_event.html)","ref":"wxPaletteChangedEvent.html"},{"type":"function","title":"wxPaletteChangedEvent.getChangedWindow/1","doc":"","ref":"wxPaletteChangedEvent.html#getChangedWindow/1"},{"type":"function","title":"wxPaletteChangedEvent.setChangedWindow/2","doc":"","ref":"wxPaletteChangedEvent.html#setChangedWindow/2"},{"type":"type","title":"wxPaletteChangedEvent.wxPaletteChanged/0","doc":"","ref":"wxPaletteChangedEvent.html#t:wxPaletteChanged/0"},{"type":"type","title":"wxPaletteChangedEvent.wxPaletteChangedEvent/0","doc":"","ref":"wxPaletteChangedEvent.html#t:wxPaletteChangedEvent/0"},{"type":"type","title":"wxPaletteChangedEvent.wxPaletteChangedEventType/0","doc":"","ref":"wxPaletteChangedEvent.html#t:wxPaletteChangedEventType/0"},{"type":"module","title":"wxPanel","doc":"A panel is a window on which controls are placed.\n\nIt is usually placed within a frame. Its main feature over its parent class `m:wxWindow`\nis code for handling child windows and TAB traversal, which is implemented natively if\npossible (e.g. in wxGTK) or by wxWidgets itself otherwise.\n\nNote: Tab traversal is implemented through an otherwise undocumented intermediate\nwxControlContainer class from which any class can derive in addition to the normal `m:wxWindow`\nbase class. Please see and to find out how this is achieved.\n\nNote: if not all characters are being intercepted by your OnKeyDown or OnChar handler, it\nmay be because you are using the `wxTAB_TRAVERSAL` style, which grabs some keypresses for\nuse by child controls.\n\nRemark: By default, a panel has the same colouring as a dialog.\n\nSee: `m:wxDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPanel](https://docs.wxwidgets.org/3.2/classwx_panel.html)","ref":"wxPanel.html"},{"type":"module","title":"Events - wxPanel","doc":"Event types emitted from this class:\n\n* [`navigation_key`](`m:wxNavigationKeyEvent`)","ref":"wxPanel.html#module-events"},{"type":"function","title":"wxPanel.destroy/1","doc":"Destroys the object","ref":"wxPanel.html#destroy/1"},{"type":"function","title":"wxPanel.initDialog/1","doc":"Sends a `m:wxInitDialogEvent`, which in turn transfers data to the dialog via validators.\n\nSee: `m:wxInitDialogEvent`","ref":"wxPanel.html#initDialog/1"},{"type":"function","title":"wxPanel.new/0","doc":"Default constructor.","ref":"wxPanel.html#new/0"},{"type":"function","title":"wxPanel.new/1","doc":"","ref":"wxPanel.html#new/1"},{"type":"function","title":"wxPanel.new/2","doc":"Constructor.","ref":"wxPanel.html#new/2"},{"type":"function","title":"wxPanel.setFocusIgnoringChildren/1","doc":"In contrast to `wxWindow:setFocus/1` (see above) this will set the focus to the panel\neven if there are child windows in the panel.\n\nThis is only rarely needed.","ref":"wxPanel.html#setFocusIgnoringChildren/1"},{"type":"type","title":"wxPanel.wxPanel/0","doc":"","ref":"wxPanel.html#t:wxPanel/0"},{"type":"module","title":"wxPasswordEntryDialog","doc":"This class represents a dialog that requests a one-line password string from the user.\n\nIt is implemented as a generic wxWidgets dialog.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_password)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxTextEntryDialog`\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPasswordEntryDialog](https://docs.wxwidgets.org/3.2/classwx_password_entry_dialog.html)","ref":"wxPasswordEntryDialog.html"},{"type":"function","title":"wxPasswordEntryDialog.destroy/1","doc":"Destroys the object","ref":"wxPasswordEntryDialog.html#destroy/1"},{"type":"function","title":"wxPasswordEntryDialog.new/2","doc":"","ref":"wxPasswordEntryDialog.html#new/2"},{"type":"function","title":"wxPasswordEntryDialog.new/3","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.","ref":"wxPasswordEntryDialog.html#new/3"},{"type":"type","title":"wxPasswordEntryDialog.wxPasswordEntryDialog/0","doc":"","ref":"wxPasswordEntryDialog.html#t:wxPasswordEntryDialog/0"},{"type":"module","title":"wxPen","doc":"A pen is a drawing tool for drawing outlines.\n\nIt is used for drawing lines and painting the outline of rectangles, ellipses, etc. It\nhas a colour, a width and a style.\n\nNote: On a monochrome display, wxWidgets shows all non-white pens as black.\n\nDo not initialize objects on the stack before the program commences, since other\nrequired structures may not have been set up yet. Instead, define global pointers to\nobjects and create them in `wxApp::OnInit()` (not implemented in wx) or when required.\n\nAn application may wish to dynamically create pens with different characteristics, and\nthere is the consequent danger that a large number of duplicate pens will be created.\nTherefore an application may wish to get a pointer to a pen by using the global list of\npens ?wxThePenList, and calling the member function `wxPenList::FindOrCreatePen()` (not\nimplemented in wx). See `wxPenList` (not implemented in wx) for more info.\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullPen\n\n* ?wxBLACK\\_DASHED\\_PEN\n\n* ?wxBLACK\\_PEN\n\n* ?wxBLUE\\_PEN\n\n* ?wxCYAN\\_PEN\n\n* ?wxGREEN\\_PEN\n\n* ?wxYELLOW\\_PEN\n\n* ?wxGREY\\_PEN\n\n* ?wxLIGHT\\_GREY\\_PEN\n\n* ?wxMEDIUM\\_GREY\\_PEN\n\n* ?wxRED\\_PEN\n\n* ?wxTRANSPARENT\\_PEN\n\n* ?wxWHITE\\_PEN\n\nSee:\n* `m:wxDC`\n\n* `wxDC:setPen/2`\n\nwxWidgets docs: [wxPen](https://docs.wxwidgets.org/3.2/classwx_pen.html)","ref":"wxPen.html"},{"type":"function","title":"wxPen.destroy/1","doc":"Destroys the object","ref":"wxPen.html#destroy/1"},{"type":"function","title":"wxPen.getCap/1","doc":"Returns the pen cap style, which may be one of `wxCAP\\_ROUND`, `wxCAP\\_PROJECTING` and `wxCAP\\_BUTT`.\n\nThe default is `wxCAP_ROUND`.\n\nSee: `setCap/2`","ref":"wxPen.html#getCap/1"},{"type":"function","title":"wxPen.getColour/1","doc":"Returns a reference to the pen colour.\n\nSee: `setColour/4`","ref":"wxPen.html#getColour/1"},{"type":"function","title":"wxPen.getJoin/1","doc":"Returns the pen join style, which may be one of `wxJOIN\\_BEVEL`, `wxJOIN\\_ROUND` and `wxJOIN\\_MITER`.\n\nThe default is `wxJOIN_ROUND`.\n\nSee: `setJoin/2`","ref":"wxPen.html#getJoin/1"},{"type":"function","title":"wxPen.getStyle/1","doc":"Returns the pen style.\n\nSee:\n* `new/2`\n\n* `setStyle/2`","ref":"wxPen.html#getStyle/1"},{"type":"function","title":"wxPen.getWidth/1","doc":"Returns the pen width.\n\nSee: `setWidth/2`","ref":"wxPen.html#getWidth/1"},{"type":"function","title":"wxPen.isOk/1","doc":"Returns true if the pen is initialised.\n\nNotice that an uninitialized pen object can't be queried for any pen properties and all\ncalls to the accessor methods on it will result in an assert failure.","ref":"wxPen.html#isOk/1"},{"type":"function","title":"wxPen.new/0","doc":"Default constructor.\n\nThe pen will be uninitialised, and `isOk/1` will return false.","ref":"wxPen.html#new/0"},{"type":"function","title":"wxPen.new/1","doc":"Copy constructor, uses overview_refcount.","ref":"wxPen.html#new/1"},{"type":"function","title":"wxPen.new/2","doc":"Constructs a pen from a colour object, pen width and style.\n\nRemark: Different versions of Windows and different versions of other platforms support\nvery different subsets of the styles above so handle with care.\n\nSee:\n* `setStyle/2`\n\n* `setColour/4`\n\n* `setWidth/2`","ref":"wxPen.html#new/2"},{"type":"function","title":"wxPen.setCap/2","doc":"Sets the pen cap style, which may be one of `wxCAP\\_ROUND`, `wxCAP\\_PROJECTING` and `wxCAP\\_BUTT`.\n\nThe default is `wxCAP_ROUND`.\n\nSee: `getCap/1`","ref":"wxPen.html#setCap/2"},{"type":"function","title":"wxPen.setColour/2","doc":"The pen's colour is changed to the given colour.\n\nSee: `getColour/1`","ref":"wxPen.html#setColour/2"},{"type":"function","title":"wxPen.setColour/4","doc":"","ref":"wxPen.html#setColour/4"},{"type":"function","title":"wxPen.setJoin/2","doc":"Sets the pen join style, which may be one of `wxJOIN\\_BEVEL`, `wxJOIN\\_ROUND` and `wxJOIN\\_MITER`.\n\nThe default is `wxJOIN_ROUND`.\n\nSee: `getJoin/1`","ref":"wxPen.html#setJoin/2"},{"type":"function","title":"wxPen.setStyle/2","doc":"Set the pen style.\n\nSee: `new/2`","ref":"wxPen.html#setStyle/2"},{"type":"function","title":"wxPen.setWidth/2","doc":"Sets the pen width.\n\nSee: `getWidth/1`","ref":"wxPen.html#setWidth/2"},{"type":"type","title":"wxPen.wxPen/0","doc":"","ref":"wxPen.html#t:wxPen/0"},{"type":"module","title":"wxPickerBase","doc":"Base abstract class for all pickers which support an auxiliary text control.\n\nThis class handles all positioning and sizing of the text control like a an horizontal `m:wxBoxSizer`\nwould do, with the text control on the left of the picker button.\n\nThe proportion (see `m:wxSizer` documentation for more info about proportion values) of\nthe picker control defaults to 1 when there isn't a text control associated (see `wxPB_USE_TEXTCTRL`\nstyle) and to 0 otherwise.","ref":"wxPickerBase.html"},{"type":"module","title":"Styles - wxPickerBase","doc":"This class supports the following styles:\n\n* wxPB_USE_TEXTCTRL: Creates a text control to the left of the picker which is completely\nmanaged by this `m:wxPickerBase` class.\n\nSee: `m:wxColourPickerCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPickerBase](https://docs.wxwidgets.org/3.2/classwx_picker_base.html)","ref":"wxPickerBase.html#module-styles"},{"type":"function","title":"wxPickerBase.getInternalMargin/1","doc":"Returns the margin (in pixel) between the picker and the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#getInternalMargin/1"},{"type":"function","title":"wxPickerBase.getPickerCtrlProportion/1","doc":"Returns the proportion value of the picker.","ref":"wxPickerBase.html#getPickerCtrlProportion/1"},{"type":"function","title":"wxPickerBase.getTextCtrl/1","doc":"Returns a pointer to the text control handled by this window or NULL if the `wxPB\\_USE\\_TEXTCTRL`\nstyle was not specified when this control was created.\n\nRemark: The contents of the text control could be an invalid representation of the entity\nwhich can be chosen through the picker (e.g. when the user enters an invalid colour syntax\nbecause of a typo). Thus you should never parse the content of the textctrl to get the\nuser's input; rather use the derived-class getter (e.g. `wxColourPickerCtrl:getColour/1`, `wxFilePickerCtrl:getPath/1`, etc).","ref":"wxPickerBase.html#getTextCtrl/1"},{"type":"function","title":"wxPickerBase.getTextCtrlProportion/1","doc":"Returns the proportion value of the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#getTextCtrlProportion/1"},{"type":"function","title":"wxPickerBase.hasTextCtrl/1","doc":"Returns true if this window has a valid text control (i.e. if the `wxPB\\_USE\\_TEXTCTRL`\nstyle was given when creating this control).","ref":"wxPickerBase.html#hasTextCtrl/1"},{"type":"function","title":"wxPickerBase.isPickerCtrlGrowable/1","doc":"Returns true if the picker control is growable.","ref":"wxPickerBase.html#isPickerCtrlGrowable/1"},{"type":"function","title":"wxPickerBase.isTextCtrlGrowable/1","doc":"Returns true if the text control is growable.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#isTextCtrlGrowable/1"},{"type":"function","title":"wxPickerBase.setInternalMargin/2","doc":"Sets the margin (in pixel) between the picker and the text control.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#setInternalMargin/2"},{"type":"function","title":"wxPickerBase.setPickerCtrlGrowable/1","doc":"","ref":"wxPickerBase.html#setPickerCtrlGrowable/1"},{"type":"function","title":"wxPickerBase.setPickerCtrlGrowable/2","doc":"Sets the picker control as growable when `grow` is true.","ref":"wxPickerBase.html#setPickerCtrlGrowable/2"},{"type":"function","title":"wxPickerBase.setPickerCtrlProportion/2","doc":"Sets the proportion value of the picker.\n\nLook at the detailed description of `m:wxPickerBase` for more info.","ref":"wxPickerBase.html#setPickerCtrlProportion/2"},{"type":"function","title":"wxPickerBase.setTextCtrlGrowable/1","doc":"","ref":"wxPickerBase.html#setTextCtrlGrowable/1"},{"type":"function","title":"wxPickerBase.setTextCtrlGrowable/2","doc":"Sets the text control as growable when `grow` is true.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#setTextCtrlGrowable/2"},{"type":"function","title":"wxPickerBase.setTextCtrlProportion/2","doc":"Sets the proportion value of the text control.\n\nLook at the detailed description of `m:wxPickerBase` for more info.\n\nThis function can be used only when `hasTextCtrl/1` returns true.","ref":"wxPickerBase.html#setTextCtrlProportion/2"},{"type":"type","title":"wxPickerBase.wxPickerBase/0","doc":"","ref":"wxPickerBase.html#t:wxPickerBase/0"},{"type":"module","title":"wxPopupTransientWindow","doc":"A `m:wxPopupWindow` which disappears automatically when the user clicks mouse outside it\nor if it loses focus in any other way.\n\nThis window can be useful for implementing custom combobox-like controls for example.\n\nSee: `m:wxPopupWindow`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPopupWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPopupTransientWindow](https://docs.wxwidgets.org/3.2/classwx_popup_transient_window.html)","ref":"wxPopupTransientWindow.html"},{"type":"function","title":"wxPopupTransientWindow.destroy/1","doc":"Destroys the object","ref":"wxPopupTransientWindow.html#destroy/1"},{"type":"function","title":"wxPopupTransientWindow.dismiss/1","doc":"Hide the window.","ref":"wxPopupTransientWindow.html#dismiss/1"},{"type":"function","title":"wxPopupTransientWindow.new/0","doc":"Default constructor.","ref":"wxPopupTransientWindow.html#new/0"},{"type":"function","title":"wxPopupTransientWindow.new/1","doc":"","ref":"wxPopupTransientWindow.html#new/1"},{"type":"function","title":"wxPopupTransientWindow.new/2","doc":"Constructor.","ref":"wxPopupTransientWindow.html#new/2"},{"type":"function","title":"wxPopupTransientWindow.popup/1","doc":"","ref":"wxPopupTransientWindow.html#popup/1"},{"type":"function","title":"wxPopupTransientWindow.popup/2","doc":"Popup the window (this will show it too).\n\nIf `focus` is non-NULL, it will be kept focused while this window is shown if supported\nby the current platform, otherwise the popup itself will receive focus. In any case, the\npopup will disappear automatically if it loses focus because of a user action.\n\nSee: `dismiss/1`","ref":"wxPopupTransientWindow.html#popup/2"},{"type":"type","title":"wxPopupTransientWindow.wxPopupTransientWindow/0","doc":"","ref":"wxPopupTransientWindow.html#t:wxPopupTransientWindow/0"},{"type":"module","title":"wxPopupWindow","doc":"A special kind of top level window used for popup menus, combobox popups and such.","ref":"wxPopupWindow.html"},{"type":"module","title":"Styles - wxPopupWindow","doc":"This class supports the following styles:\n\n* wxPU_CONTAINS_CONTROLS: By default in wxMSW, a popup window will not take focus from its\nparent window. However many standard controls, including common ones such as `m:wxTextCtrl`,\nneed focus to function correctly and will not work when placed on a default popup. This\nflag can be used to make the popup take focus and let all controls work but at the price\nof not allowing the parent window to keep focus while the popup is shown, which can also\nbe sometimes desirable. This style is currently only implemented in MSW and simply does\nnothing under the other platforms (it's new since wxWidgets 3.1.3).\n\nSee:\n* `m:wxDialog`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPopupWindow](https://docs.wxwidgets.org/3.2/classwx_popup_window.html)","ref":"wxPopupWindow.html#module-styles"},{"type":"function","title":"wxPopupWindow.create/2","doc":"","ref":"wxPopupWindow.html#create/2"},{"type":"function","title":"wxPopupWindow.create/3","doc":"Create method for two-step creation.","ref":"wxPopupWindow.html#create/3"},{"type":"function","title":"wxPopupWindow.destroy/1","doc":"Destroys the object","ref":"wxPopupWindow.html#destroy/1"},{"type":"function","title":"wxPopupWindow.new/0","doc":"Default constructor.","ref":"wxPopupWindow.html#new/0"},{"type":"function","title":"wxPopupWindow.new/1","doc":"","ref":"wxPopupWindow.html#new/1"},{"type":"function","title":"wxPopupWindow.new/2","doc":"Constructor.","ref":"wxPopupWindow.html#new/2"},{"type":"function","title":"wxPopupWindow.position/3","doc":"Move the popup window to the right position, i.e. such that it is entirely visible.\n\nThe popup is positioned at ptOrigin + size if it opens below and to the right (default),\nat ptOrigin - sizePopup if it opens above and to the left etc.","ref":"wxPopupWindow.html#position/3"},{"type":"type","title":"wxPopupWindow.wxPopupWindow/0","doc":"","ref":"wxPopupWindow.html#t:wxPopupWindow/0"},{"type":"module","title":"wxPostScriptDC","doc":"This defines the wxWidgets Encapsulated PostScript device context, which can write\nPostScript files on any platform.\n\nSee `m:wxDC` for descriptions of the member functions.\n\nStarting a document\n\nDocument should be started with call to `wxDC:startDoc/2` prior to calling any function to execute a\ndrawing operation. However, some functions, like `wxDC:setFont/2`, may be legitimately called even before `wxDC:startDoc/2`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxPostScriptDC](https://docs.wxwidgets.org/3.2/classwx_post_script_d_c.html)","ref":"wxPostScriptDC.html"},{"type":"function","title":"wxPostScriptDC.destroy/1","doc":"Destroys the object","ref":"wxPostScriptDC.html#destroy/1"},{"type":"function","title":"wxPostScriptDC.new/0","doc":"","ref":"wxPostScriptDC.html#new/0"},{"type":"function","title":"wxPostScriptDC.new/1","doc":"Constructs a PostScript printer device context from a `m:wxPrintData` object.","ref":"wxPostScriptDC.html#new/1"},{"type":"type","title":"wxPostScriptDC.wxPostScriptDC/0","doc":"","ref":"wxPostScriptDC.html#t:wxPostScriptDC/0"},{"type":"module","title":"wxPreviewCanvas","doc":"A preview canvas is the default canvas used by the print preview system to display the\npreview.\n\nSee:\n* `m:wxPreviewFrame`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxScrolledWindow`\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewCanvas](https://docs.wxwidgets.org/3.2/classwx_preview_canvas.html)","ref":"wxPreviewCanvas.html"},{"type":"type","title":"wxPreviewCanvas.wxPreviewCanvas/0","doc":"","ref":"wxPreviewCanvas.html#t:wxPreviewCanvas/0"},{"type":"module","title":"wxPreviewControlBar","doc":"This is the default implementation of the preview control bar, a panel with buttons and a\nzoom control.\n\nYou can derive a new class from this and override some or all member functions to change\nthe behaviour and appearance; or you can leave it as it is.\n\nSee:\n* `m:wxPreviewFrame`\n\n* `m:wxPreviewCanvas`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewControlBar](https://docs.wxwidgets.org/3.2/classwx_preview_control_bar.html)","ref":"wxPreviewControlBar.html"},{"type":"function","title":"wxPreviewControlBar.createButtons/1","doc":"Creates buttons, according to value of the button style flags.","ref":"wxPreviewControlBar.html#createButtons/1"},{"type":"function","title":"wxPreviewControlBar.destroy/1","doc":"Destroys the object","ref":"wxPreviewControlBar.html#destroy/1"},{"type":"function","title":"wxPreviewControlBar.getPrintPreview/1","doc":"Gets the print preview object associated with the control bar.","ref":"wxPreviewControlBar.html#getPrintPreview/1"},{"type":"function","title":"wxPreviewControlBar.getZoomControl/1","doc":"Gets the current zoom setting in percent.","ref":"wxPreviewControlBar.html#getZoomControl/1"},{"type":"function","title":"wxPreviewControlBar.new/3","doc":"","ref":"wxPreviewControlBar.html#new/3"},{"type":"function","title":"wxPreviewControlBar.new/4","doc":"Constructor.\n\nThe `buttons` parameter may be a combination of the following, using the bitwise 'or' operator:\n\n* wxPREVIEW_PRINT: Create a print button.\n\n* wxPREVIEW_NEXT: Create a next page button.\n\n* wxPREVIEW_PREVIOUS: Create a previous page button.\n\n* wxPREVIEW_ZOOM: Create a zoom control.\n\n* wxPREVIEW_DEFAULT: Equivalent to a combination of `wxPREVIEW_PREVIOUS`, `wxPREVIEW_NEXT`\nand `wxPREVIEW_ZOOM`.","ref":"wxPreviewControlBar.html#new/4"},{"type":"function","title":"wxPreviewControlBar.setZoomControl/2","doc":"Sets the zoom control.","ref":"wxPreviewControlBar.html#setZoomControl/2"},{"type":"type","title":"wxPreviewControlBar.wxPreviewControlBar/0","doc":"","ref":"wxPreviewControlBar.html#t:wxPreviewControlBar/0"},{"type":"module","title":"wxPreviewFrame","doc":"This class provides the default method of managing the print preview interface.\n\nMember functions may be overridden to replace functionality, or the class may be used\nwithout derivation.\n\nSee:\n* `m:wxPreviewCanvas`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPrintPreview`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPreviewFrame](https://docs.wxwidgets.org/3.2/classwx_preview_frame.html)","ref":"wxPreviewFrame.html"},{"type":"function","title":"wxPreviewFrame.createCanvas/1","doc":"Creates a `m:wxPreviewCanvas`.\n\nOverride this function to allow a user-defined preview canvas object to be created.","ref":"wxPreviewFrame.html#createCanvas/1"},{"type":"function","title":"wxPreviewFrame.createControlBar/1","doc":"Creates a `m:wxPreviewControlBar`.\n\nOverride this function to allow a user-defined preview control bar object to be created.","ref":"wxPreviewFrame.html#createControlBar/1"},{"type":"function","title":"wxPreviewFrame.destroy/1","doc":"Destroys the object","ref":"wxPreviewFrame.html#destroy/1"},{"type":"function","title":"wxPreviewFrame.initialize/1","doc":"Initializes the frame elements and prepares for showing it.\n\nCalling this method is equivalent to calling `InitializeWithModality()` (not implemented\nin wx) with wxPreviewFrame_AppModal argument, please see its documentation for more details.\n\nPlease notice that this function is virtual mostly for backwards compatibility only,\nthere is no real need to override it as it's never called by wxWidgets itself.","ref":"wxPreviewFrame.html#initialize/1"},{"type":"function","title":"wxPreviewFrame.new/2","doc":"","ref":"wxPreviewFrame.html#new/2"},{"type":"function","title":"wxPreviewFrame.new/3","doc":"Constructor.\n\nPass a print preview object plus other normal frame arguments. The print preview object\nwill be destroyed by the frame when it closes.","ref":"wxPreviewFrame.html#new/3"},{"type":"function","title":"wxPreviewFrame.onCloseWindow/2","doc":"Enables any disabled frames in the application, and deletes the print preview object,\nimplicitly deleting any printout objects associated with the print preview object.","ref":"wxPreviewFrame.html#onCloseWindow/2"},{"type":"type","title":"wxPreviewFrame.wxPreviewFrame/0","doc":"","ref":"wxPreviewFrame.html#t:wxPreviewFrame/0"},{"type":"module","title":"wxPrintData","doc":"This class holds a variety of information related to printers and printer device\ncontexts.\n\nThis class is used to create a `wxPrinterDC` (not implemented in wx) and a `m:wxPostScriptDC`.\nIt is also used as a data member of `m:wxPrintDialogData` and `m:wxPageSetupDialogData`,\nas part of the mechanism for transferring data between the print dialogs and the application.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialog`\n\n* `m:wxPrintDialogData`\n\n* `m:wxPageSetupDialogData`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\n* `m:wxPostScriptDC`\n\nwxWidgets docs: [wxPrintData](https://docs.wxwidgets.org/3.2/classwx_print_data.html)","ref":"wxPrintData.html"},{"type":"function","title":"wxPrintData.destroy/1","doc":"Destroys the object","ref":"wxPrintData.html#destroy/1"},{"type":"function","title":"wxPrintData.getBin/1","doc":"Returns the current bin (papersource).\n\nBy default, the system is left to select the bin (`wxPRINTBIN_DEFAULT` is returned).\n\nSee `setBin/2` for the full list of bin values.","ref":"wxPrintData.html#getBin/1"},{"type":"function","title":"wxPrintData.getCollate/1","doc":"Returns true if collation is on.","ref":"wxPrintData.html#getCollate/1"},{"type":"function","title":"wxPrintData.getColour/1","doc":"Returns true if colour printing is on.","ref":"wxPrintData.html#getColour/1"},{"type":"function","title":"wxPrintData.getDuplex/1","doc":"Returns the duplex mode.\n\nOne of wxDUPLEX_SIMPLEX, wxDUPLEX_HORIZONTAL, wxDUPLEX_VERTICAL.","ref":"wxPrintData.html#getDuplex/1"},{"type":"function","title":"wxPrintData.getNoCopies/1","doc":"Returns the number of copies requested by the user.","ref":"wxPrintData.html#getNoCopies/1"},{"type":"function","title":"wxPrintData.getOrientation/1","doc":"Gets the orientation.\n\nThis can be wxLANDSCAPE or wxPORTRAIT.","ref":"wxPrintData.html#getOrientation/1"},{"type":"function","title":"wxPrintData.getPaperId/1","doc":"Returns the paper size id.\n\nSee: `setPaperId/2`","ref":"wxPrintData.html#getPaperId/1"},{"type":"function","title":"wxPrintData.getPrinterName/1","doc":"Returns the printer name.\n\nIf the printer name is the empty string, it indicates that the default printer should be\nused.","ref":"wxPrintData.html#getPrinterName/1"},{"type":"function","title":"wxPrintData.getQuality/1","doc":"Returns the current print quality.\n\nThis can be a positive integer, denoting the number of dots per inch, or one of the\nfollowing identifiers:\n\n* wxPRINT_QUALITY_HIGH\n\n* wxPRINT_QUALITY_MEDIUM\n\n* wxPRINT_QUALITY_LOW\n\n* wxPRINT_QUALITY_DRAFT\n\nOn input you should pass one of these identifiers, but on return you may get back a\npositive integer indicating the current resolution setting.","ref":"wxPrintData.html#getQuality/1"},{"type":"function","title":"wxPrintData.isOk/1","doc":"Returns true if the print data is valid for using in print dialogs.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","ref":"wxPrintData.html#isOk/1"},{"type":"function","title":"wxPrintData.new/0","doc":"Default constructor.","ref":"wxPrintData.html#new/0"},{"type":"function","title":"wxPrintData.new/1","doc":"Copy constructor.","ref":"wxPrintData.html#new/1"},{"type":"function","title":"wxPrintData.setBin/2","doc":"Sets the current bin.","ref":"wxPrintData.html#setBin/2"},{"type":"function","title":"wxPrintData.setCollate/2","doc":"Sets collation to on or off.","ref":"wxPrintData.html#setCollate/2"},{"type":"function","title":"wxPrintData.setColour/2","doc":"Sets colour printing on or off.","ref":"wxPrintData.html#setColour/2"},{"type":"function","title":"wxPrintData.setDuplex/2","doc":"Returns the duplex mode.\n\nOne of wxDUPLEX_SIMPLEX, wxDUPLEX_HORIZONTAL, wxDUPLEX_VERTICAL.","ref":"wxPrintData.html#setDuplex/2"},{"type":"function","title":"wxPrintData.setNoCopies/2","doc":"Sets the default number of copies to be printed out.","ref":"wxPrintData.html#setNoCopies/2"},{"type":"function","title":"wxPrintData.setOrientation/2","doc":"Sets the orientation.\n\nThis can be wxLANDSCAPE or wxPORTRAIT.","ref":"wxPrintData.html#setOrientation/2"},{"type":"function","title":"wxPrintData.setPaperId/2","doc":"Sets the paper id.\n\nThis indicates the type of paper to be used. For a mapping between paper id, paper size\nand string name, see wxPrintPaperDatabase in `\"paper.h\"` (not yet documented).","ref":"wxPrintData.html#setPaperId/2"},{"type":"function","title":"wxPrintData.setPrinterName/2","doc":"Sets the printer name.\n\nThis can be the empty string to indicate that the default printer should be used.","ref":"wxPrintData.html#setPrinterName/2"},{"type":"function","title":"wxPrintData.setQuality/2","doc":"Sets the desired print quality.\n\nThis can be a positive integer, denoting the number of dots per inch, or one of the\nfollowing identifiers:\n\n* wxPRINT_QUALITY_HIGH\n\n* wxPRINT_QUALITY_MEDIUM\n\n* wxPRINT_QUALITY_LOW\n\n* wxPRINT_QUALITY_DRAFT\n\nOn input you should pass one of these identifiers, but on return you may get back a\npositive integer indicating the current resolution setting.","ref":"wxPrintData.html#setQuality/2"},{"type":"type","title":"wxPrintData.wxPrintData/0","doc":"","ref":"wxPrintData.html#t:wxPrintData/0"},{"type":"module","title":"wxPrintDialog","doc":"This class represents the print and print setup common dialogs.\n\nYou may obtain a `wxPrinterDC` (not implemented in wx) device context from a successfully\ndismissed print dialog.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxPrintDialog](https://docs.wxwidgets.org/3.2/classwx_print_dialog.html)","ref":"wxPrintDialog.html"},{"type":"function","title":"wxPrintDialog.destroy/1","doc":"Destroys the object","ref":"wxPrintDialog.html#destroy/1"},{"type":"function","title":"wxPrintDialog.getPrintDC/1","doc":"Returns the device context created by the print dialog, if any.\n\nWhen this function has been called, the ownership of the device context is transferred to\nthe application, so it must then be deleted explicitly.","ref":"wxPrintDialog.html#getPrintDC/1"},{"type":"function","title":"wxPrintDialog.getPrintDialogData/1","doc":"Returns the print dialog data associated with the print dialog.","ref":"wxPrintDialog.html#getPrintDialogData/1"},{"type":"function","title":"wxPrintDialog.new/1","doc":"","ref":"wxPrintDialog.html#new/1"},{"type":"function","title":"wxPrintDialog.new/2","doc":"","ref":"wxPrintDialog.html#new/2"},{"type":"type","title":"wxPrintDialog.wxPrintDialog/0","doc":"","ref":"wxPrintDialog.html#t:wxPrintDialog/0"},{"type":"module","title":"wxPrintDialogData","doc":"This class holds information related to the visual characteristics of `m:wxPrintDialog`.\n\nIt contains a `m:wxPrintData` object with underlying printing settings.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_print)\n\nwxWidgets docs: [wxPrintDialogData](https://docs.wxwidgets.org/3.2/classwx_print_dialog_data.html)","ref":"wxPrintDialogData.html"},{"type":"function","title":"wxPrintDialogData.destroy/1","doc":"Destroys the object","ref":"wxPrintDialogData.html#destroy/1"},{"type":"function","title":"wxPrintDialogData.enableHelp/2","doc":"Enables or disables the \"Help\" button.","ref":"wxPrintDialogData.html#enableHelp/2"},{"type":"function","title":"wxPrintDialogData.enablePageNumbers/2","doc":"Enables or disables the \"Page numbers\" controls.","ref":"wxPrintDialogData.html#enablePageNumbers/2"},{"type":"function","title":"wxPrintDialogData.enablePrintToFile/2","doc":"Enables or disables the \"Print to file\" checkbox.","ref":"wxPrintDialogData.html#enablePrintToFile/2"},{"type":"function","title":"wxPrintDialogData.enableSelection/2","doc":"Enables or disables the \"Selection\" radio button.","ref":"wxPrintDialogData.html#enableSelection/2"},{"type":"function","title":"wxPrintDialogData.getAllPages/1","doc":"Returns true if the user requested that all pages be printed.","ref":"wxPrintDialogData.html#getAllPages/1"},{"type":"function","title":"wxPrintDialogData.getCollate/1","doc":"Returns true if the user requested that the document(s) be collated.","ref":"wxPrintDialogData.html#getCollate/1"},{"type":"function","title":"wxPrintDialogData.getFromPage/1","doc":"Returns the `from` page number, as entered by the user.","ref":"wxPrintDialogData.html#getFromPage/1"},{"type":"function","title":"wxPrintDialogData.getMaxPage/1","doc":"Returns the `maximum` page number.","ref":"wxPrintDialogData.html#getMaxPage/1"},{"type":"function","title":"wxPrintDialogData.getMinPage/1","doc":"Returns the `minimum` page number.","ref":"wxPrintDialogData.html#getMinPage/1"},{"type":"function","title":"wxPrintDialogData.getNoCopies/1","doc":"Returns the number of copies requested by the user.","ref":"wxPrintDialogData.html#getNoCopies/1"},{"type":"function","title":"wxPrintDialogData.getPrintData/1","doc":"Returns a reference to the internal `m:wxPrintData` object.","ref":"wxPrintDialogData.html#getPrintData/1"},{"type":"function","title":"wxPrintDialogData.getPrintToFile/1","doc":"Returns true if the user has selected printing to a file.","ref":"wxPrintDialogData.html#getPrintToFile/1"},{"type":"function","title":"wxPrintDialogData.getSelection/1","doc":"Returns true if the user requested that the selection be printed (where \"selection\" is a\nconcept specific to the application).","ref":"wxPrintDialogData.html#getSelection/1"},{"type":"function","title":"wxPrintDialogData.getToPage/1","doc":"Returns the `\"print to\"` page number, as entered by the user.","ref":"wxPrintDialogData.html#getToPage/1"},{"type":"function","title":"wxPrintDialogData.isOk/1","doc":"Returns true if the print data is valid for using in print dialogs.\n\nThis can return false on Windows if the current printer is not set, for example. On all\nother platforms, it returns true.","ref":"wxPrintDialogData.html#isOk/1"},{"type":"function","title":"wxPrintDialogData.new/0","doc":"Default constructor.","ref":"wxPrintDialogData.html#new/0"},{"type":"function","title":"wxPrintDialogData.new/1","doc":"Copy constructor.","ref":"wxPrintDialogData.html#new/1"},{"type":"function","title":"wxPrintDialogData.setCollate/2","doc":"Sets the \"Collate\" checkbox to true or false.","ref":"wxPrintDialogData.html#setCollate/2"},{"type":"function","title":"wxPrintDialogData.setFromPage/2","doc":"Sets the `from` page number.","ref":"wxPrintDialogData.html#setFromPage/2"},{"type":"function","title":"wxPrintDialogData.setMaxPage/2","doc":"Sets the `maximum` page number.","ref":"wxPrintDialogData.html#setMaxPage/2"},{"type":"function","title":"wxPrintDialogData.setMinPage/2","doc":"Sets the `minimum` page number.","ref":"wxPrintDialogData.html#setMinPage/2"},{"type":"function","title":"wxPrintDialogData.setNoCopies/2","doc":"Sets the default number of copies the user has requested to be printed out.","ref":"wxPrintDialogData.html#setNoCopies/2"},{"type":"function","title":"wxPrintDialogData.setPrintData/2","doc":"Sets the internal `m:wxPrintData`.","ref":"wxPrintDialogData.html#setPrintData/2"},{"type":"function","title":"wxPrintDialogData.setPrintToFile/2","doc":"Sets the \"Print to file\" checkbox to true or false.","ref":"wxPrintDialogData.html#setPrintToFile/2"},{"type":"function","title":"wxPrintDialogData.setSelection/2","doc":"Selects the \"Selection\" radio button.\n\nThe effect of printing the selection depends on how the application implements this\ncommand, if at all.","ref":"wxPrintDialogData.html#setSelection/2"},{"type":"function","title":"wxPrintDialogData.setToPage/2","doc":"Sets the `\"print to\"` page number.","ref":"wxPrintDialogData.html#setToPage/2"},{"type":"type","title":"wxPrintDialogData.wxPrintDialogData/0","doc":"","ref":"wxPrintDialogData.html#t:wxPrintDialogData/0"},{"type":"module","title":"wxPrintPreview","doc":"Objects of this class manage the print preview process.\n\nThe object is passed a `m:wxPrintout` object, and the `m:wxPrintPreview` object itself is\npassed to a `m:wxPreviewFrame` object. Previewing is started by initializing and showing\nthe preview frame. Unlike `wxPrinter:print/4`, flow of control returns to the application immediately after\nthe frame is shown.\n\nNote: The preview shown is only exact on Windows. On other platforms, the `m:wxDC` used\nfor preview is different from what is used for printing and the results may be\nsignificantly different, depending on how is the output created. In particular, printing\ncode relying on `wxDC:getTextExtent/3` heavily (for example, `m:wxHtmlEasyPrinting` and other wxHTML classes do)\nis affected. It is recommended to use native preview functionality on platforms that offer\nit (macOS, GTK+).\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPrintout`\n\n* `m:wxPrinter`\n\n* `m:wxPreviewCanvas`\n\n* `m:wxPreviewControlBar`\n\n* `m:wxPreviewFrame`\n\nwxWidgets docs: [wxPrintPreview](https://docs.wxwidgets.org/3.2/classwx_print_preview.html)","ref":"wxPrintPreview.html"},{"type":"function","title":"wxPrintPreview.destroy/1","doc":"Destroys the object","ref":"wxPrintPreview.html#destroy/1"},{"type":"function","title":"wxPrintPreview.getCanvas/1","doc":"Gets the preview window used for displaying the print preview image.","ref":"wxPrintPreview.html#getCanvas/1"},{"type":"function","title":"wxPrintPreview.getCurrentPage/1","doc":"Gets the page currently being previewed.","ref":"wxPrintPreview.html#getCurrentPage/1"},{"type":"function","title":"wxPrintPreview.getFrame/1","doc":"Gets the frame used for displaying the print preview canvas and control bar.","ref":"wxPrintPreview.html#getFrame/1"},{"type":"function","title":"wxPrintPreview.getMaxPage/1","doc":"Returns the maximum page number.","ref":"wxPrintPreview.html#getMaxPage/1"},{"type":"function","title":"wxPrintPreview.getMinPage/1","doc":"Returns the minimum page number.","ref":"wxPrintPreview.html#getMinPage/1"},{"type":"function","title":"wxPrintPreview.getPrintout/1","doc":"Gets the preview printout object associated with the `m:wxPrintPreview` object.","ref":"wxPrintPreview.html#getPrintout/1"},{"type":"function","title":"wxPrintPreview.getPrintoutForPrinting/1","doc":"Gets the printout object to be used for printing from within the preview interface, or\nNULL if none exists.","ref":"wxPrintPreview.html#getPrintoutForPrinting/1"},{"type":"function","title":"wxPrintPreview.isOk/1","doc":"Returns true if the `m:wxPrintPreview` is valid, false otherwise.\n\nIt could return false if there was a problem initializing the printer device context\n(current printer not set, for example).","ref":"wxPrintPreview.html#isOk/1"},{"type":"function","title":"wxPrintPreview.new/1","doc":"","ref":"wxPrintPreview.html#new/1"},{"type":"function","title":"wxPrintPreview.new/2","doc":"Constructor.\n\nPass a printout object, an optional printout object to be used for actual printing, and\nthe address of an optional block of printer data, which will be copied to the print\npreview object's print data.\n\nIf `printoutForPrinting` is non-NULL, a `\"Print...\"` button will be placed on the preview\nframe so that the user can print directly from the preview interface.\n\nRemark: Do not explicitly delete the printout objects once this constructor has been\ncalled, since they will be deleted in the `m:wxPrintPreview` destructor. The same does not\napply to the `data` argument.\n\nUse `isOk/1` to check whether the `m:wxPrintPreview` object was created correctly.","ref":"wxPrintPreview.html#new/2"},{"type":"function","title":"wxPrintPreview.new/3","doc":"","ref":"wxPrintPreview.html#new/3"},{"type":"function","title":"wxPrintPreview.paintPage/3","doc":"This refreshes the preview window with the preview image.\n\nIt must be called from the preview window's OnPaint member.\n\nThe implementation simply blits the preview bitmap onto the canvas, creating a new\npreview bitmap if none exists.","ref":"wxPrintPreview.html#paintPage/3"},{"type":"function","title":"wxPrintPreview.print/2","doc":"Invokes the print process using the second `m:wxPrintout` object supplied in the `m:wxPrintPreview`\nconstructor.\n\nWill normally be called by the `Print`... panel item on the preview frame's control bar.\n\nReturns false in case of error - call `wxPrinter:getLastError/0` to get detailed information about the kind of the\nerror.","ref":"wxPrintPreview.html#print/2"},{"type":"function","title":"wxPrintPreview.renderPage/2","doc":"Renders a page into a `m:wxMemoryDC`.\n\nUsed internally by `m:wxPrintPreview`.","ref":"wxPrintPreview.html#renderPage/2"},{"type":"function","title":"wxPrintPreview.setCanvas/2","doc":"Sets the window to be used for displaying the print preview image.","ref":"wxPrintPreview.html#setCanvas/2"},{"type":"function","title":"wxPrintPreview.setCurrentPage/2","doc":"Sets the current page to be previewed.","ref":"wxPrintPreview.html#setCurrentPage/2"},{"type":"function","title":"wxPrintPreview.setFrame/2","doc":"Sets the frame to be used for displaying the print preview canvas and control bar.","ref":"wxPrintPreview.html#setFrame/2"},{"type":"function","title":"wxPrintPreview.setPrintout/2","doc":"Associates a printout object with the `m:wxPrintPreview` object.","ref":"wxPrintPreview.html#setPrintout/2"},{"type":"function","title":"wxPrintPreview.setZoom/2","doc":"Sets the percentage preview zoom, and refreshes the preview canvas accordingly.","ref":"wxPrintPreview.html#setZoom/2"},{"type":"type","title":"wxPrintPreview.wxPrintPreview/0","doc":"","ref":"wxPrintPreview.html#t:wxPrintPreview/0"},{"type":"module","title":"wxPrinter","doc":"This class represents the Windows or PostScript printer, and is the vehicle through which\nprinting may be launched by an application.\n\nPrinting can also be achieved through using of lower functions and classes, but this and\nassociated classes provide a more convenient and general method of printing.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPrintout`\n\n* `m:wxPrintPreview`\n\nwxWidgets docs: [wxPrinter](https://docs.wxwidgets.org/3.2/classwx_printer.html)","ref":"wxPrinter.html"},{"type":"function","title":"wxPrinter.createAbortWindow/3","doc":"Creates the default printing abort window, with a cancel button.","ref":"wxPrinter.html#createAbortWindow/3"},{"type":"function","title":"wxPrinter.destroy/1","doc":"Destroys the object","ref":"wxPrinter.html#destroy/1"},{"type":"function","title":"wxPrinter.getAbort/1","doc":"Returns true if the user has aborted the print job.","ref":"wxPrinter.html#getAbort/1"},{"type":"function","title":"wxPrinter.getLastError/0","doc":"Return last error.\n\nValid after calling `print/4`, `printDialog/2` or `wxPrintPreview:print/2`.\n\nThese functions set last error to `wxPRINTER_NO_ERROR` if no error happened.\n\nReturned value is one of the following:","ref":"wxPrinter.html#getLastError/0"},{"type":"function","title":"wxPrinter.getPrintDialogData/1","doc":"Returns the print data associated with the printer object.","ref":"wxPrinter.html#getPrintDialogData/1"},{"type":"function","title":"wxPrinter.new/0","doc":"","ref":"wxPrinter.html#new/0"},{"type":"function","title":"wxPrinter.new/1","doc":"Constructor.\n\nPass an optional pointer to a block of print dialog data, which will be copied to the\nprinter object's local data.\n\nSee:\n* `m:wxPrintDialogData`\n\n* `m:wxPrintData`","ref":"wxPrinter.html#new/1"},{"type":"function","title":"wxPrinter.print/3","doc":"","ref":"wxPrinter.html#print/3"},{"type":"function","title":"wxPrinter.print/4","doc":"Starts the printing process.\n\nProvide a parent window, a user-defined `m:wxPrintout` object which controls the printing\nof a document, and whether the print dialog should be invoked first.\n\n`print/4` could return false if there was a problem initializing the printer device context\n(current printer not set, for example) or the user cancelled printing. Call `getLastError/0` to get\ndetailed information about the kind of the error.","ref":"wxPrinter.html#print/4"},{"type":"function","title":"wxPrinter.printDialog/2","doc":"Invokes the print dialog.\n\nIf successful (the user did not press Cancel and no error occurred), a suitable device\ncontext will be returned; otherwise NULL is returned; call `getLastError/0` to get detailed information\nabout the kind of the error.\n\nRemark: The application must delete this device context to avoid a memory leak.","ref":"wxPrinter.html#printDialog/2"},{"type":"function","title":"wxPrinter.reportError/4","doc":"Default error-reporting function.","ref":"wxPrinter.html#reportError/4"},{"type":"function","title":"wxPrinter.setup/2","doc":"Invokes the print setup dialog.\n\nDeprecated:\n\nThe setup dialog is obsolete, though retained for backward compatibility.","ref":"wxPrinter.html#setup/2"},{"type":"type","title":"wxPrinter.wxPrinter/0","doc":"","ref":"wxPrinter.html#t:wxPrinter/0"},{"type":"module","title":"wxPrintout","doc":"This class encapsulates the functionality of printing out an application document.\n\nA new class must be derived and members overridden to respond to calls such as `OnPrintPage()`\n(not implemented in wx) and `HasPage()` (not implemented in wx) and to render the print\nimage onto an associated `m:wxDC`. Instances of this class are passed to `wxPrinter:print/4` or to a `m:wxPrintPreview`\nobject to initiate printing or previewing.\n\nYour derived `m:wxPrintout` is responsible for drawing both the preview image and the\nprinted page. If your windows' drawing routines accept an arbitrary DC as an argument, you\ncan re-use those routines within your `m:wxPrintout` subclass to draw the printout image.\nYou may also add additional drawing elements within your `m:wxPrintout` subclass, like\nheaders, footers, and/or page numbers. However, the image on the printed page will often\ndiffer from the image drawn on the screen, as will the print preview image - not just in\nthe presence of headers and footers, but typically in scale. A high-resolution printer\npresents a much larger drawing surface (i.e., a higher-resolution DC); a zoomed-out\npreview image presents a much smaller drawing surface (lower-resolution DC). By using the\nroutines FitThisSizeToXXX() and/or MapScreenSizeToXXX() within your `m:wxPrintout`\nsubclass to set the user scale and origin of the associated DC, you can easily use a\nsingle drawing routine to draw on your application's windows, to create the print preview\nimage, and to create the printed paper image, and achieve a common appearance to the\npreview image and the printed page.\n\nSee:\n* [Overview printing](https://docs.wxwidgets.org/3.2/overview_printing.html#overview_printing)\n\n* `m:wxPrintDialog`\n\n* `m:wxPageSetupDialog`\n\n* `m:wxPrinter`\n\n* `m:wxPrintPreview`\n\nwxWidgets docs: [wxPrintout](https://docs.wxwidgets.org/3.2/classwx_printout.html)","ref":"wxPrintout.html"},{"type":"function","title":"wxPrintout.destroy/1","doc":"Destroys the object","ref":"wxPrintout.html#destroy/1"},{"type":"function","title":"wxPrintout.fitThisSizeToPage/2","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the page rectangle and the origin is at\nthe top left corner of the page rectangle.\n\nOn MSW and Mac, the page rectangle is the printable area of the page. On other platforms\nand PostScript printing, the page rectangle is the entire paper.\n\nUse this if you want your printed image as large as possible, but with the caveat that on\nsome platforms, portions of the image might be cut off at the edges.","ref":"wxPrintout.html#fitThisSizeToPage/2"},{"type":"function","title":"wxPrintout.fitThisSizeToPageMargins/3","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the page margins set in the given `m:wxPageSetupDialogData`\nobject.\n\nThis function provides the greatest consistency across all platforms because it does not\ndepend on having access to the printable area of the paper.\n\nRemark: On Mac, the native `m:wxPageSetupDialog` does not let you set the page margins;\nyou'll have to provide your own mechanism, or you can use the Mac-only class\nwxMacPageMarginsDialog.","ref":"wxPrintout.html#fitThisSizeToPageMargins/3"},{"type":"function","title":"wxPrintout.fitThisSizeToPaper/2","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the given image size fits entirely within the paper and the origin is at the top\nleft corner of the paper.\n\nUse this if you're managing your own page margins.\n\nNote: With most printers, the region around the edges of the paper are not printable so\nthat the edges of the image could be cut off.","ref":"wxPrintout.html#fitThisSizeToPaper/2"},{"type":"function","title":"wxPrintout.getDC/1","doc":"Returns the device context associated with the printout (given to the printout at start\nof printing or previewing).\n\nThe application can use `getDC/1` to obtain a device context to draw on.\n\nThis will be a `wxPrinterDC` (not implemented in wx) if printing under Windows or Mac, a `m:wxPostScriptDC`\nif printing on other platforms, and a `m:wxMemoryDC` if previewing.","ref":"wxPrintout.html#getDC/1"},{"type":"function","title":"wxPrintout.getLogicalPageMarginsRect/2","doc":"Return the rectangle corresponding to the page margins specified by the given `m:wxPageSetupDialogData`\nobject in the associated `m:wxDC`'s logical coordinates for the current user scale and\ndevice origin.\n\nThe page margins are specified with respect to the edges of the paper on all platforms.","ref":"wxPrintout.html#getLogicalPageMarginsRect/2"},{"type":"function","title":"wxPrintout.getLogicalPageRect/1","doc":"Return the rectangle corresponding to the page in the associated `m:wxDC` 's logical\ncoordinates for the current user scale and device origin.\n\nOn MSW and Mac, this will be the printable area of the paper. On other platforms and\nPostScript printing, this will be the full paper rectangle.","ref":"wxPrintout.html#getLogicalPageRect/1"},{"type":"function","title":"wxPrintout.getLogicalPaperRect/1","doc":"Return the rectangle corresponding to the paper in the associated `m:wxDC` 's logical\ncoordinates for the current user scale and device origin.","ref":"wxPrintout.html#getLogicalPaperRect/1"},{"type":"function","title":"wxPrintout.getPageSizeMM/1","doc":"Returns the size of the printer page in millimetres.","ref":"wxPrintout.html#getPageSizeMM/1"},{"type":"function","title":"wxPrintout.getPageSizePixels/1","doc":"Returns the size of the printer page in pixels, called the page rectangle.\n\nThe page rectangle has a top left corner at (0,0) and a bottom right corner at (w,h).\nThese values may not be the same as the values returned from `wxDC:getSize/1`;if the printout is being\nused for previewing, a memory device context is used, which uses a bitmap size reflecting\nthe current preview zoom. The application must take this discrepancy into account if\npreviewing is to be supported.","ref":"wxPrintout.html#getPageSizePixels/1"},{"type":"function","title":"wxPrintout.getPaperRectPixels/1","doc":"Returns the rectangle that corresponds to the entire paper in pixels, called the paper\nrectangle.\n\nThis distinction between paper rectangle and page rectangle reflects the fact that most\nprinters cannot print all the way to the edge of the paper. The page rectangle is a\nrectangle whose top left corner is at (0,0) and whose width and height are given by wxDC::GetPageSizePixels().\n\nOn MSW and Mac, the page rectangle gives the printable area of the paper, while the paper\nrectangle represents the entire paper, including non-printable borders. Thus, the\nrectangle returned by wxDC::GetPaperRectPixels() will have a top left corner whose\ncoordinates are small negative numbers and the bottom right corner will have values\nsomewhat larger than the width and height given by wxDC::GetPageSizePixels().\n\nOn other platforms and for PostScript printing, the paper is treated as if its entire\narea were printable, so this function will return the same rectangle as the page\nrectangle.","ref":"wxPrintout.html#getPaperRectPixels/1"},{"type":"function","title":"wxPrintout.getPPIPrinter/1","doc":"Returns the number of pixels per logical inch of the printer device context.\n\nDividing the printer PPI by the screen PPI can give a suitable scaling factor for drawing\ntext onto the printer.\n\nRemember to multiply this by a scaling factor to take the preview DC size into account.\nOr you can just use the FitThisSizeToXXX() and MapScreenSizeToXXX routines below, which do\nmost of the scaling calculations for you.","ref":"wxPrintout.html#getPPIPrinter/1"},{"type":"function","title":"wxPrintout.getPPIScreen/1","doc":"Returns the number of pixels per logical inch of the screen device context.\n\nDividing the printer PPI by the screen PPI can give a suitable scaling factor for drawing\ntext onto the printer.\n\nIf you are doing your own scaling, remember to multiply this by a scaling factor to take\nthe preview DC size into account.","ref":"wxPrintout.html#getPPIScreen/1"},{"type":"function","title":"wxPrintout.getTitle/1","doc":"Returns the title of the printout.","ref":"wxPrintout.html#getTitle/1"},{"type":"function","title":"wxPrintout.isPreview/1","doc":"Returns true if the printout is currently being used for previewing.","ref":"wxPrintout.html#isPreview/1"},{"type":"function","title":"wxPrintout.mapScreenSizeToDevice/1","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that one screen pixel maps to one device pixel on the DC.\n\nThat is, the user scale is set to (1,1) and the device origin is set to (0,0).\n\nUse this if you want to do your own scaling prior to calling `m:wxDC` drawing calls, for\nexample, if your underlying model is floating-point and you want to achieve maximum\ndrawing precision on high-resolution printers.\n\nYou can use the GetLogicalXXXRect() routines below to obtain the paper rectangle, page\nrectangle, or page margins rectangle to perform your own scaling.\n\nNote: While the underlying drawing model of macOS is floating-point, wxWidgets's drawing\nmodel scales from integer coordinates.","ref":"wxPrintout.html#mapScreenSizeToDevice/1"},{"type":"function","title":"wxPrintout.mapScreenSizeToPage/1","doc":"This sets the user scale of the `m:wxDC` associated with this `m:wxPrintout` to the same\nscale as `mapScreenSizeToPaper/1` but sets the logical origin to the top left corner of\nthe page rectangle.","ref":"wxPrintout.html#mapScreenSizeToPage/1"},{"type":"function","title":"wxPrintout.mapScreenSizeToPageMargins/2","doc":"This sets the user scale of the `m:wxDC` associated with this `m:wxPrintout` to the same\nscale as `mapScreenSizeToPageMargins/2` but sets the logical origin to the top left corner\nof the page margins specified by the given `m:wxPageSetupDialogData` object.","ref":"wxPrintout.html#mapScreenSizeToPageMargins/2"},{"type":"function","title":"wxPrintout.mapScreenSizeToPaper/1","doc":"Set the user scale and device origin of the `m:wxDC` associated with this `m:wxPrintout`\nso that the printed page matches the screen size as closely as possible and the logical\norigin is in the top left corner of the paper rectangle.\n\nThat is, a 100-pixel object on screen should appear at the same size on the printed page.\n(It will, of course, be larger or smaller in the preview image, depending on the zoom factor.)\n\nUse this if you want WYSIWYG behaviour, e.g., in a text editor.","ref":"wxPrintout.html#mapScreenSizeToPaper/1"},{"type":"function","title":"wxPrintout.new/2","doc":"","ref":"wxPrintout.html#new/2"},{"type":"function","title":"wxPrintout.new/3","doc":"Constructor.\n\nCreates a `m:wxPrintout` object with a callback fun and optionally other\ncallback funs. The `This` argument is the `m:wxPrintout` object reference to\nthis object\n\nNotice: The callbacks may not call other processes.","ref":"wxPrintout.html#new/3"},{"type":"function","title":"wxPrintout.offsetLogicalOrigin/3","doc":"Shift the device origin by an amount specified in logical coordinates.","ref":"wxPrintout.html#offsetLogicalOrigin/3"},{"type":"function","title":"wxPrintout.setLogicalOrigin/3","doc":"Set the device origin of the associated `m:wxDC` so that the current logical point\nbecomes the new logical origin.","ref":"wxPrintout.html#setLogicalOrigin/3"},{"type":"type","title":"wxPrintout.wxPrintout/0","doc":"","ref":"wxPrintout.html#t:wxPrintout/0"},{"type":"module","title":"wxProgressDialog","doc":"If supported by the platform this class will provide the platform's native progress\ndialog, else it will simply be the `wxGenericProgressDialog` (not implemented in wx).\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxProgressDialog](https://docs.wxwidgets.org/3.2/classwx_progress_dialog.html)","ref":"wxProgressDialog.html"},{"type":"function","title":"wxProgressDialog.destroy/1","doc":"Destroys the object","ref":"wxProgressDialog.html#destroy/1"},{"type":"function","title":"wxProgressDialog.new/2","doc":"","ref":"wxProgressDialog.html#new/2"},{"type":"function","title":"wxProgressDialog.new/3","doc":"","ref":"wxProgressDialog.html#new/3"},{"type":"function","title":"wxProgressDialog.resume/1","doc":"Can be used to continue with the dialog, after the user had clicked the \"Abort\" button.","ref":"wxProgressDialog.html#resume/1"},{"type":"function","title":"wxProgressDialog.update/2","doc":"","ref":"wxProgressDialog.html#update/2"},{"type":"function","title":"wxProgressDialog.update/3","doc":"Updates the dialog, setting the progress bar to the new value and updating the message if\nnew one is specified.\n\nReturns true unless the \"Cancel\" button has been pressed.\n\nIf false is returned, the application can either immediately destroy the dialog or ask\nthe user for the confirmation and if the abort is not confirmed the dialog may be resumed\nwith `resume/1` function.\n\nIf `value` is the maximum value for the dialog, the behaviour of the function depends on\nwhether `wxPD_AUTO_HIDE` was used when the dialog was created. If it was, the dialog is\nhidden and the function returns immediately. If it was not, the dialog becomes a modal\ndialog and waits for the user to dismiss it, meaning that this function does not return\nuntil this happens.\n\nNotice that if `newmsg` is longer than the currently shown message, the dialog will be\nautomatically made wider to account for it. However if the new message is shorter than the\nprevious one, the dialog doesn't shrink back to avoid constant resizes if the message is\nchanged often. To do this and fit the dialog to its current contents you may call `wxWindow:fit/1`\nexplicitly. However the native MSW implementation of this class does make the dialog\nshorter if the new text has fewer lines of text than the old one, so it is recommended to\nkeep the number of lines of text constant in order to avoid jarring dialog size changes.\nYou may also want to make the initial message, specified when creating the dialog, wide\nenough to avoid having to resize the dialog later, e.g. by appending a long string of\nunbreakable spaces (`wxString` (not implemented in wx)(L'\\u00a0', 100)) to it.","ref":"wxProgressDialog.html#update/3"},{"type":"type","title":"wxProgressDialog.wxProgressDialog/0","doc":"","ref":"wxProgressDialog.html#t:wxProgressDialog/0"},{"type":"module","title":"wxQueryNewPaletteEvent","doc":"Functions for wxQueryNewPaletteEvent class\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxQueryNewPaletteEvent](https://docs.wxwidgets.org/3.2/classwx_query_new_palette_event.html)","ref":"wxQueryNewPaletteEvent.html"},{"type":"function","title":"wxQueryNewPaletteEvent.getPaletteRealized/1","doc":"","ref":"wxQueryNewPaletteEvent.html#getPaletteRealized/1"},{"type":"function","title":"wxQueryNewPaletteEvent.setPaletteRealized/2","doc":"","ref":"wxQueryNewPaletteEvent.html#setPaletteRealized/2"},{"type":"type","title":"wxQueryNewPaletteEvent.wxQueryNewPalette/0","doc":"","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPalette/0"},{"type":"type","title":"wxQueryNewPaletteEvent.wxQueryNewPaletteEvent/0","doc":"","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPaletteEvent/0"},{"type":"type","title":"wxQueryNewPaletteEvent.wxQueryNewPaletteEventType/0","doc":"","ref":"wxQueryNewPaletteEvent.html#t:wxQueryNewPaletteEventType/0"},{"type":"module","title":"wxRadioBox","doc":"A radio box item is used to select one of number of mutually exclusive choices.\n\nIt is displayed as a vertical column or horizontal row of labelled buttons.","ref":"wxRadioBox.html"},{"type":"module","title":"Styles - wxRadioBox","doc":"This class supports the following styles:\n\n* wxRA_SPECIFY_ROWS: The major dimension parameter refers to the maximum number of rows.\n\n* wxRA_SPECIFY_COLS: The major dimension parameter refers to the maximum number of columns.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxRadioButton`\n\n* `m:wxCheckBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxRadioBox](https://docs.wxwidgets.org/3.2/classwx_radio_box.html)","ref":"wxRadioBox.html#module-styles"},{"type":"module","title":"Events - wxRadioBox","doc":"Event types emitted from this class:\n\n* [`command_radiobox_selected`](`m:wxCommandEvent`)","ref":"wxRadioBox.html#module-events"},{"type":"function","title":"wxRadioBox.create/7","doc":"","ref":"wxRadioBox.html#create/7"},{"type":"function","title":"wxRadioBox.create/8","doc":"Creates the radiobox for two-step construction.\n\nSee `new/7` for further details.","ref":"wxRadioBox.html#create/8"},{"type":"function","title":"wxRadioBox.destroy/1","doc":"Destroys the object","ref":"wxRadioBox.html#destroy/1"},{"type":"function","title":"wxRadioBox.enable/1","doc":"","ref":"wxRadioBox.html#enable/1"},{"type":"function","title":"wxRadioBox.enable/2","doc":"Enables or disables the radiobox.\n\nSee: `wxWindow:enable/2`","ref":"wxRadioBox.html#enable/2"},{"type":"function","title":"wxRadioBox.enable/3","doc":"Enables or disables an individual button in the radiobox.\n\nSee: `wxWindow:enable/2`","ref":"wxRadioBox.html#enable/3"},{"type":"function","title":"wxRadioBox.getColumnCount/1","doc":"Returns the number of columns in the radiobox.","ref":"wxRadioBox.html#getColumnCount/1"},{"type":"function","title":"wxRadioBox.getItemFromPoint/2","doc":"Returns a radio box item under the point, a zero-based item index, or `wxNOT\\_FOUND` if\nno item is under the point.","ref":"wxRadioBox.html#getItemFromPoint/2"},{"type":"function","title":"wxRadioBox.getItemHelpText/2","doc":"Returns the helptext associated with the specified `item` if any or `wxEmptyString`.\n\nSee: `setItemHelpText/3`","ref":"wxRadioBox.html#getItemHelpText/2"},{"type":"function","title":"wxRadioBox.getItemToolTip/2","doc":"Returns the tooltip associated with the specified `item` if any or NULL.\n\nSee:\n* `setItemToolTip/3`\n\n* `wxWindow:getToolTip/1`","ref":"wxRadioBox.html#getItemToolTip/2"},{"type":"function","title":"wxRadioBox.getRowCount/1","doc":"Returns the number of rows in the radiobox.","ref":"wxRadioBox.html#getRowCount/1"},{"type":"function","title":"wxRadioBox.getSelection/1","doc":"Returns the index of the selected item or `wxNOT\\_FOUND` if no item is selected.\n\nReturn: The position of the current selection.\n\nRemark: This method can be used with single selection list boxes only, you should use `wxListBox:getSelections/1`\nfor the list boxes with wxLB_MULTIPLE style.\n\nSee:\n* `setSelection/2`\n\n* `wxControlWithItems:getStringSelection/1`","ref":"wxRadioBox.html#getSelection/1"},{"type":"function","title":"wxRadioBox.getString/2","doc":"Returns the label of the item with the given index.\n\nReturn: The label of the item or an empty string if the position was invalid.","ref":"wxRadioBox.html#getString/2"},{"type":"function","title":"wxRadioBox.isItemEnabled/2","doc":"Returns true if the item is enabled or false if it was disabled using `enable/3`.\n\nThis function is currently only implemented in wxMSW, wxGTK, wxQT and wxUniversal and\nalways returns true in the other ports.","ref":"wxRadioBox.html#isItemEnabled/2"},{"type":"function","title":"wxRadioBox.isItemShown/2","doc":"Returns true if the item is currently shown or false if it was hidden using `show/3`.\n\nNote that this function returns true for an item which hadn't been hidden even if the\nentire radiobox is not currently shown.\n\nThis function is currently only implemented in wxMSW, wxGTK, wxQT and wxUniversal and\nalways returns true in the other ports.","ref":"wxRadioBox.html#isItemShown/2"},{"type":"function","title":"wxRadioBox.new/6","doc":"","ref":"wxRadioBox.html#new/6"},{"type":"function","title":"wxRadioBox.new/7","doc":"Constructor, creating and showing a radiobox.\n\nSee: `create/8`","ref":"wxRadioBox.html#new/7"},{"type":"function","title":"wxRadioBox.setItemHelpText/3","doc":"Sets the helptext for an item.\n\nEmpty string erases any existing helptext.\n\nSee: `getItemHelpText/2`","ref":"wxRadioBox.html#setItemHelpText/3"},{"type":"function","title":"wxRadioBox.setItemToolTip/3","doc":"Sets the tooltip text for the specified item in the radio group.\n\nThis function is currently only implemented in wxMSW and wxGTK2 and does nothing in the\nother ports.\n\nSee:\n* `getItemToolTip/2`\n\n* `wxWindow:setToolTip/2`","ref":"wxRadioBox.html#setItemToolTip/3"},{"type":"function","title":"wxRadioBox.setSelection/2","doc":"Sets the selection to the given item.\n\nNotice that a radio box always has selection, so `n` must be valid here and passing `wxNOT_FOUND`\nis not allowed.","ref":"wxRadioBox.html#setSelection/2"},{"type":"function","title":"wxRadioBox.show/2","doc":"","ref":"wxRadioBox.html#show/2"},{"type":"function","title":"wxRadioBox.show/3","doc":"Shows or hides individual buttons.\n\nReturn: true if the item has been shown or hidden or false if nothing was done because it\nalready was in the requested state.\n\nSee: `show/3`","ref":"wxRadioBox.html#show/3"},{"type":"type","title":"wxRadioBox.wxRadioBox/0","doc":"","ref":"wxRadioBox.html#t:wxRadioBox/0"},{"type":"module","title":"wxRadioButton","doc":"A radio button item is a button which usually denotes one of several mutually exclusive\noptions.\n\nIt has a text label next to a (usually) round button.\n\nYou can create a group of mutually-exclusive radio buttons by specifying `wxRB_GROUP` for\nthe first in the group. The group ends when another radio button group is created, or\nthere are no more radio buttons.","ref":"wxRadioButton.html"},{"type":"module","title":"Styles - wxRadioButton","doc":"This class supports the following styles:\n\n* wxRB_GROUP: Marks the beginning of a new group of radio buttons.\n\n* wxRB_SINGLE: In some circumstances, radio buttons that are not consecutive siblings\ntrigger a hang bug in Windows (only). If this happens, add this style to mark the button\nas not belonging to a group, and implement the mutually-exclusive group behaviour\nyourself.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxRadioBox`\n\n* `m:wxCheckBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxRadioButton](https://docs.wxwidgets.org/3.2/classwx_radio_button.html)","ref":"wxRadioButton.html#module-styles"},{"type":"module","title":"Events - wxRadioButton","doc":"Event types emitted from this class:\n\n* [`command_radiobutton_selected`](`m:wxCommandEvent`)","ref":"wxRadioButton.html#module-events"},{"type":"function","title":"wxRadioButton.create/4","doc":"","ref":"wxRadioButton.html#create/4"},{"type":"function","title":"wxRadioButton.create/5","doc":"Creates the choice for two-step construction.\n\nSee `new/4` for further details.","ref":"wxRadioButton.html#create/5"},{"type":"function","title":"wxRadioButton.destroy/1","doc":"Destroys the object","ref":"wxRadioButton.html#destroy/1"},{"type":"function","title":"wxRadioButton.getValue/1","doc":"Returns true if the radio button is checked, false otherwise.","ref":"wxRadioButton.html#getValue/1"},{"type":"function","title":"wxRadioButton.new/0","doc":"Default constructor.\n\nSee: `create/5`","ref":"wxRadioButton.html#new/0"},{"type":"function","title":"wxRadioButton.new/3","doc":"","ref":"wxRadioButton.html#new/3"},{"type":"function","title":"wxRadioButton.new/4","doc":"Constructor, creating and showing a radio button.\n\nSee: `create/5`","ref":"wxRadioButton.html#new/4"},{"type":"function","title":"wxRadioButton.setValue/2","doc":"Sets the radio button to checked or unchecked status.\n\nThis does not cause a `wxEVT_RADIOBUTTON` event to get emitted.\n\nIf the radio button belongs to a radio group exactly one button in the group may be\nchecked and so this method can be only called with `value` set to true. To uncheck a radio\nbutton in a group you must check another button in the same group.\n\nNote: Under MSW, the focused radio button is always selected, i.e. its value is true.\nAnd, conversely, calling `SetValue(true)` will also set focus to the radio button if the\nfocus had previously been on another radio button in the same group - as otherwise setting\nit on wouldn't work.","ref":"wxRadioButton.html#setValue/2"},{"type":"type","title":"wxRadioButton.wxRadioButton/0","doc":"","ref":"wxRadioButton.html#t:wxRadioButton/0"},{"type":"module","title":"wxRegion","doc":"A `m:wxRegion` represents a simple or complex region on a device context or window.\n\nThis class uses reference counting and copy-on-write internally so that assignments\nbetween two instances of this class are very cheap. You can therefore use actual objects\ninstead of pointers without efficiency problems. If an instance of this class is changed\nit will create its own data internally so that other instances, which previously shared\nthe data using the reference counting, are not affected.\n\nPredefined objects (include wx.hrl):\n\n* ?wxNullRegion\n\nwxWidgets docs: [wxRegion](https://docs.wxwidgets.org/3.2/classwx_region.html)","ref":"wxRegion.html"},{"type":"function","title":"wxRegion.clear/1","doc":"Clears the current region.\n\nThe object becomes invalid, or null, after being cleared.","ref":"wxRegion.html#clear/1"},{"type":"function","title":"wxRegion.contains/2","doc":"Returns a value indicating whether the given rectangle is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: One of ?wxOutRegion, ?wxPartRegion or ?wxInRegion.\n\nNote: On Windows, only ?wxOutRegion and ?wxInRegion are returned; a value ?wxInRegion\nthen indicates that all or some part of the region is contained in this region.","ref":"wxRegion.html#contains/2"},{"type":"function","title":"wxRegion.contains/3","doc":"Returns a value indicating whether the given point is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: The return value is one of `wxOutRegion` and `wxInRegion`.","ref":"wxRegion.html#contains/3"},{"type":"function","title":"wxRegion.contains/5","doc":"Returns a value indicating whether the given rectangle is contained within the region.\n\nThis method always returns `wxOutRegion` for an invalid region but may, nevertheless, be\nsafely called in this case.\n\nReturn: One of ?wxOutRegion, ?wxPartRegion or ?wxInRegion.\n\nNote: On Windows, only ?wxOutRegion and ?wxInRegion are returned; a value ?wxInRegion\nthen indicates that all or some part of the region is contained in this region.","ref":"wxRegion.html#contains/5"},{"type":"function","title":"wxRegion.convertToBitmap/1","doc":"Convert the region to a black and white bitmap with the white pixels being inside the\nregion.\n\nThis method can't be used for invalid region.","ref":"wxRegion.html#convertToBitmap/1"},{"type":"function","title":"wxRegion.destroy/1","doc":"Destroys the object","ref":"wxRegion.html#destroy/1"},{"type":"function","title":"wxRegion.getBox/1","doc":"","ref":"wxRegion.html#getBox/1"},{"type":"function","title":"wxRegion.intersect/2","doc":"Finds the intersection of this region and another region.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: Creates the intersection of the two regions, that is, the parts which are in both\nregions. The result is stored in this region.","ref":"wxRegion.html#intersect/2"},{"type":"function","title":"wxRegion.intersect/5","doc":"Finds the intersection of this region and another, rectangular region, specified using\nposition and size.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: Creates the intersection of the two regions, that is, the parts which are in both\nregions. The result is stored in this region.","ref":"wxRegion.html#intersect/5"},{"type":"function","title":"wxRegion.isEmpty/1","doc":"Returns true if the region is empty, false otherwise.\n\nAlways returns true if the region is invalid.","ref":"wxRegion.html#isEmpty/1"},{"type":"function","title":"wxRegion.new/0","doc":"Default constructor.\n\nThis constructor creates an invalid, or null, object, i.e. calling IsOk() on it returns\nfalse and `isEmpty/1` returns true.","ref":"wxRegion.html#new/0"},{"type":"function","title":"wxRegion.new/1","doc":"Constructs a region using a bitmap.\n\nSee `union/5` for more details.","ref":"wxRegion.html#new/1"},{"type":"function","title":"wxRegion.new/2","doc":"Constructs a rectangular region from the top left point and the bottom right point.","ref":"wxRegion.html#new/2"},{"type":"function","title":"wxRegion.new/4","doc":"Constructs a rectangular region with the given position and size.","ref":"wxRegion.html#new/4"},{"type":"function","title":"wxRegion.offset/2","doc":"","ref":"wxRegion.html#offset/2"},{"type":"function","title":"wxRegion.offset/3","doc":"Moves the region by the specified offsets in horizontal and vertical directions.\n\nThis method can't be called if the region is invalid as it doesn't make sense to offset\nit then. Attempts to do it will result in assert failure.\n\nReturn: true if successful, false otherwise (the region is unchanged then).","ref":"wxRegion.html#offset/3"},{"type":"function","title":"wxRegion.subtract/2","doc":"Subtracts a region from this region.\n\nThis method always fails, i.e. returns false, if this region is invalid but may\nnevertheless be safely used even in this case.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation combines the parts of 'this' region that are not part of the\nsecond region. The result is stored in this region.","ref":"wxRegion.html#subtract/2"},{"type":"function","title":"wxRegion.union/2","doc":"Finds the union of this region and another, rectangular region.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","ref":"wxRegion.html#union/2"},{"type":"function","title":"wxRegion.union/3","doc":"","ref":"wxRegion.html#union/3"},{"type":"function","title":"wxRegion.union/4","doc":"Finds the union of this region and the non-transparent pixels of a bitmap.\n\nColour to be treated as transparent is specified in the `transColour` argument, along\nwith an optional colour tolerance value.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","ref":"wxRegion.html#union/4"},{"type":"function","title":"wxRegion.union/5","doc":"Finds the union of this region and another, rectangular region, specified using position\nand size.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion. The result is stored in this region.","ref":"wxRegion.html#union/5"},{"type":"function","title":"wxRegion.Xor/2","doc":"Finds the Xor of this region and another region.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given `region`.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion, except for any overlapping areas. The result is stored in this region.","ref":"wxRegion.html#Xor/2"},{"type":"function","title":"wxRegion.Xor/5","doc":"Finds the Xor of this region and another, rectangular region, specified using position\nand size.\n\nThis method can be used even if this region is invalid and has the natural behaviour in\nthis case, i.e. makes this region equal to the given rectangle.\n\nReturn: true if successful, false otherwise.\n\nRemark: This operation creates a region that combines all of this region and the second\nregion, except for any overlapping areas. The result is stored in this region.","ref":"wxRegion.html#Xor/5"},{"type":"type","title":"wxRegion.wxRegion/0","doc":"","ref":"wxRegion.html#t:wxRegion/0"},{"type":"module","title":"wxSashEvent","doc":"A sash event is sent when the sash of a `m:wxSashWindow` has been dragged by the user.\n\nRemark: When a sash belonging to a sash window is dragged by the user, and then released,\nthis event is sent to the window, where it may be processed by an event table entry in a\nderived class, a plug-in event handler or an ancestor class. Note that the `m:wxSashWindow`\ndoesn't change the window's size itself. It relies on the application's event handler to\ndo that. This is because the application may have to handle other consequences of the\nresize, or it may wish to veto it altogether. The event handler should look at the drag\nrectangle: see `getDragRect/1` to see what the new size of the window would be if the resize were to be\napplied. It should also call `getDragStatus/1` to see whether the drag was OK or out of the current allowed range.\n\nSee:\n* `m:wxSashWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSashEvent](https://docs.wxwidgets.org/3.2/classwx_sash_event.html)","ref":"wxSashEvent.html"},{"type":"module","title":"Events - wxSashEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSashEventType` to subscribe to events of this type.","ref":"wxSashEvent.html#module-events"},{"type":"function","title":"wxSashEvent.getDragRect/1","doc":"Returns the rectangle representing the new size the window would be if the resize was\napplied.\n\nIt is up to the application to set the window size if required.","ref":"wxSashEvent.html#getDragRect/1"},{"type":"function","title":"wxSashEvent.getDragStatus/1","doc":"Returns the status of the sash: one of wxSASH\\_STATUS\\_OK,\nwxSASH\\_STATUS\\_OUT\\_OF\\_RANGE.\n\nIf the drag caused the notional bounding box of the window to flip over, for example, the\ndrag will be out of rage.","ref":"wxSashEvent.html#getDragStatus/1"},{"type":"function","title":"wxSashEvent.getEdge/1","doc":"Returns the dragged edge.\n\nThe return value is one of wxSASH_TOP, wxSASH_RIGHT, wxSASH_BOTTOM, wxSASH_LEFT.","ref":"wxSashEvent.html#getEdge/1"},{"type":"type","title":"wxSashEvent.wxSash/0","doc":"","ref":"wxSashEvent.html#t:wxSash/0"},{"type":"type","title":"wxSashEvent.wxSashEvent/0","doc":"","ref":"wxSashEvent.html#t:wxSashEvent/0"},{"type":"type","title":"wxSashEvent.wxSashEventType/0","doc":"","ref":"wxSashEvent.html#t:wxSashEventType/0"},{"type":"module","title":"wxSashLayoutWindow","doc":"`m:wxSashLayoutWindow` responds to OnCalculateLayout events generated by `m:wxLayoutAlgorithm`.\n\nIt allows the application to use simple accessors to specify how the window should be\nlaid out, rather than having to respond to events.\n\nThe fact that the class derives from `m:wxSashWindow` allows sashes to be used if\nrequired, to allow the windows to be user-resizable.\n\nThe documentation for `m:wxLayoutAlgorithm` explains the purpose of this class in more detail.\n\nFor the window styles see `m:wxSashWindow`.\n\nThis class handles the EVT_QUERY_LAYOUT_INFO and EVT_CALCULATE_LAYOUT events for you.\nHowever, if you use sashes, see `m:wxSashWindow` for relevant event information. See also `m:wxLayoutAlgorithm`\nfor information about the layout events.\n\nSee:\n* `m:wxLayoutAlgorithm`\n\n* `m:wxSashWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxSashWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSashLayoutWindow](https://docs.wxwidgets.org/3.2/classwx_sash_layout_window.html)","ref":"wxSashLayoutWindow.html"},{"type":"function","title":"wxSashLayoutWindow.create/2","doc":"","ref":"wxSashLayoutWindow.html#create/2"},{"type":"function","title":"wxSashLayoutWindow.create/3","doc":"Initializes a sash layout window, which can be a child of a frame, dialog or any other\nnon-control window.","ref":"wxSashLayoutWindow.html#create/3"},{"type":"function","title":"wxSashLayoutWindow.destroy/1","doc":"Destroys the object","ref":"wxSashLayoutWindow.html#destroy/1"},{"type":"function","title":"wxSashLayoutWindow.getAlignment/1","doc":"Returns the alignment of the window: one of wxLAYOUT\\_TOP, wxLAYOUT\\_LEFT,\nwxLAYOUT\\_RIGHT, wxLAYOUT\\_BOTTOM.","ref":"wxSashLayoutWindow.html#getAlignment/1"},{"type":"function","title":"wxSashLayoutWindow.getOrientation/1","doc":"Returns the orientation of the window: one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL.","ref":"wxSashLayoutWindow.html#getOrientation/1"},{"type":"function","title":"wxSashLayoutWindow.new/0","doc":"Default ctor.","ref":"wxSashLayoutWindow.html#new/0"},{"type":"function","title":"wxSashLayoutWindow.new/1","doc":"","ref":"wxSashLayoutWindow.html#new/1"},{"type":"function","title":"wxSashLayoutWindow.new/2","doc":"Constructs a sash layout window, which can be a child of a frame, dialog or any other\nnon-control window.","ref":"wxSashLayoutWindow.html#new/2"},{"type":"function","title":"wxSashLayoutWindow.setAlignment/2","doc":"Sets the alignment of the window (which edge of the available parent client area the\nwindow is attached to).\n\n`alignment` is one of wxLAYOUT_TOP, wxLAYOUT_LEFT, wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM.","ref":"wxSashLayoutWindow.html#setAlignment/2"},{"type":"function","title":"wxSashLayoutWindow.setDefaultSize/2","doc":"Sets the default dimensions of the window.\n\nThe dimension other than the orientation will be fixed to this value, and the orientation\ndimension will be ignored and the window stretched to fit the available space.","ref":"wxSashLayoutWindow.html#setDefaultSize/2"},{"type":"function","title":"wxSashLayoutWindow.setOrientation/2","doc":"Sets the orientation of the window (the direction the window will stretch in, to fill the\navailable parent client area).\n\n`orientation` is one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL.","ref":"wxSashLayoutWindow.html#setOrientation/2"},{"type":"type","title":"wxSashLayoutWindow.wxSashLayoutWindow/0","doc":"","ref":"wxSashLayoutWindow.html#t:wxSashLayoutWindow/0"},{"type":"module","title":"wxSashWindow","doc":"`m:wxSashWindow` allows any of its edges to have a sash which can be dragged to resize\nthe window.\n\nThe actual content window will be created by the application as a child of `m:wxSashWindow`.\n\nThe window (or an ancestor) will be notified of a drag via a `m:wxSashEvent` notification.","ref":"wxSashWindow.html"},{"type":"module","title":"Styles - wxSashWindow","doc":"This class supports the following styles:\n\n* wxSW_3D: Draws a 3D effect sash and border.\n\n* wxSW_3DSASH: Draws a 3D effect sash.\n\n* wxSW_3DBORDER: Draws a 3D effect border.\n\n* wxSW_BORDER: Draws a thin black border.\n\nSee:\n* `m:wxSashEvent`\n\n* `m:wxSashLayoutWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSashWindow](https://docs.wxwidgets.org/3.2/classwx_sash_window.html)","ref":"wxSashWindow.html#module-styles"},{"type":"module","title":"Events - wxSashWindow","doc":"Event types emitted from this class:\n\n* [`sash_dragged`](`m:wxSashEvent`)","ref":"wxSashWindow.html#module-events"},{"type":"function","title":"wxSashWindow.destroy/1","doc":"Destroys the object","ref":"wxSashWindow.html#destroy/1"},{"type":"function","title":"wxSashWindow.getMaximumSizeX/1","doc":"Gets the maximum window size in the x direction.","ref":"wxSashWindow.html#getMaximumSizeX/1"},{"type":"function","title":"wxSashWindow.getMaximumSizeY/1","doc":"Gets the maximum window size in the y direction.","ref":"wxSashWindow.html#getMaximumSizeY/1"},{"type":"function","title":"wxSashWindow.getMinimumSizeX/1","doc":"Gets the minimum window size in the x direction.","ref":"wxSashWindow.html#getMinimumSizeX/1"},{"type":"function","title":"wxSashWindow.getMinimumSizeY/1","doc":"Gets the minimum window size in the y direction.","ref":"wxSashWindow.html#getMinimumSizeY/1"},{"type":"function","title":"wxSashWindow.getSashVisible/2","doc":"Returns true if a sash is visible on the given edge, false otherwise.\n\nSee: `setSashVisible/3`","ref":"wxSashWindow.html#getSashVisible/2"},{"type":"function","title":"wxSashWindow.new/0","doc":"Default ctor.","ref":"wxSashWindow.html#new/0"},{"type":"function","title":"wxSashWindow.new/1","doc":"","ref":"wxSashWindow.html#new/1"},{"type":"function","title":"wxSashWindow.new/2","doc":"Constructs a sash window, which can be a child of a frame, dialog or any other\nnon-control window.","ref":"wxSashWindow.html#new/2"},{"type":"function","title":"wxSashWindow.setMaximumSizeX/2","doc":"Sets the maximum window size in the x direction.","ref":"wxSashWindow.html#setMaximumSizeX/2"},{"type":"function","title":"wxSashWindow.setMaximumSizeY/2","doc":"Sets the maximum window size in the y direction.","ref":"wxSashWindow.html#setMaximumSizeY/2"},{"type":"function","title":"wxSashWindow.setMinimumSizeX/2","doc":"Sets the minimum window size in the x direction.","ref":"wxSashWindow.html#setMinimumSizeX/2"},{"type":"function","title":"wxSashWindow.setMinimumSizeY/2","doc":"Sets the minimum window size in the y direction.","ref":"wxSashWindow.html#setMinimumSizeY/2"},{"type":"function","title":"wxSashWindow.setSashVisible/3","doc":"Call this function to make a sash visible or invisible on a particular edge.\n\nSee: `getSashVisible/2`","ref":"wxSashWindow.html#setSashVisible/3"},{"type":"type","title":"wxSashWindow.wxSashWindow/0","doc":"","ref":"wxSashWindow.html#t:wxSashWindow/0"},{"type":"module","title":"wxScreenDC","doc":"A `m:wxScreenDC` can be used to paint on the screen.\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxScreenDC`\nobject.\n\nWhen using multiple monitors, `m:wxScreenDC` corresponds to the entire virtual screen\ncomposed of all of them. Notice that coordinates on `m:wxScreenDC` can be negative in this\ncase, see `wxDisplay:getGeometry/1` for more.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxClientDC`\n\n* `m:wxWindowDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxScreenDC](https://docs.wxwidgets.org/3.2/classwx_screen_d_c.html)","ref":"wxScreenDC.html"},{"type":"function","title":"wxScreenDC.destroy/1","doc":"Destroys the object","ref":"wxScreenDC.html#destroy/1"},{"type":"function","title":"wxScreenDC.new/0","doc":"Constructor.","ref":"wxScreenDC.html#new/0"},{"type":"type","title":"wxScreenDC.wxScreenDC/0","doc":"","ref":"wxScreenDC.html#t:wxScreenDC/0"},{"type":"module","title":"wxScrollBar","doc":"A `m:wxScrollBar` is a control that represents a horizontal or vertical scrollbar.\n\nIt is distinct from the two scrollbars that some windows provide automatically, but the\ntwo types of scrollbar share the way events are received.\n\nRemark: A scrollbar has the following main attributes: range, thumb size, page size, and\nposition. The range is the total number of units associated with the view represented by\nthe scrollbar. For a table with 15 columns, the range would be 15. The thumb size is the\nnumber of units that are currently visible. For the table example, the window might be\nsized so that only 5 columns are currently visible, in which case the application would\nset the thumb size to 5. When the thumb size becomes the same as or greater than the\nrange, the scrollbar will be automatically hidden on most platforms. The page size is the\nnumber of units that the scrollbar should scroll by, when 'paging' through the data. This\nvalue is normally the same as the thumb size length, because it is natural to assume that\nthe visible window size defines a page. The scrollbar position is the current thumb\nposition. Most applications will find it convenient to provide a function called\nAdjustScrollbars() which can be called initially, from an OnSize event handler, and\nwhenever the application data changes in size. It will adjust the view, object and page\nsize according to the size of the window and the size of the data.","ref":"wxScrollBar.html"},{"type":"module","title":"Styles - wxScrollBar","doc":"This class supports the following styles:\n\n* wxSB_HORIZONTAL: Specifies a horizontal scrollbar.\n\n* wxSB_VERTICAL: Specifies a vertical scrollbar.\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen).\n\nIn short, the EVT_SCROLL_CHANGED event is triggered when scrolling/moving has finished\nindependently of the way it had started. Please see the page_samples_widgets (\"Slider\"\npage) to see the difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nSee:\n* [Overview scrolling](https://docs.wxwidgets.org/3.2/overview_scrolling.html#overview_scrolling)\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxScrollBar](https://docs.wxwidgets.org/3.2/classwx_scroll_bar.html)","ref":"wxScrollBar.html#module-styles"},{"type":"module","title":"Events - wxScrollBar","doc":"Event types emitted from this class:\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)","ref":"wxScrollBar.html#module-events"},{"type":"function","title":"wxScrollBar.create/3","doc":"","ref":"wxScrollBar.html#create/3"},{"type":"function","title":"wxScrollBar.create/4","doc":"Scrollbar creation function called by the scrollbar constructor.\n\nSee `new/3` for details.","ref":"wxScrollBar.html#create/4"},{"type":"function","title":"wxScrollBar.destroy/1","doc":"Destroys the object","ref":"wxScrollBar.html#destroy/1"},{"type":"function","title":"wxScrollBar.getPageSize/1","doc":"Returns the page size of the scrollbar.\n\nThis is the number of scroll units that will be scrolled when the user pages up or down.\nOften it is the same as the thumb size.\n\nSee: `setScrollbar/6`","ref":"wxScrollBar.html#getPageSize/1"},{"type":"function","title":"wxScrollBar.getRange/1","doc":"Returns the length of the scrollbar.\n\nSee: `setScrollbar/6`","ref":"wxScrollBar.html#getRange/1"},{"type":"function","title":"wxScrollBar.getThumbPosition/1","doc":"Returns the current position of the scrollbar thumb.\n\nSee: `setThumbPosition/2`","ref":"wxScrollBar.html#getThumbPosition/1"},{"type":"function","title":"wxScrollBar.getThumbSize/1","doc":"Returns the thumb or 'view' size.\n\nSee: `setScrollbar/6`","ref":"wxScrollBar.html#getThumbSize/1"},{"type":"function","title":"wxScrollBar.new/0","doc":"Default constructor.","ref":"wxScrollBar.html#new/0"},{"type":"function","title":"wxScrollBar.new/2","doc":"","ref":"wxScrollBar.html#new/2"},{"type":"function","title":"wxScrollBar.new/3","doc":"Constructor, creating and showing a scrollbar.\n\nSee: `create/4`","ref":"wxScrollBar.html#new/3"},{"type":"function","title":"wxScrollBar.setScrollbar/5","doc":"","ref":"wxScrollBar.html#setScrollbar/5"},{"type":"function","title":"wxScrollBar.setScrollbar/6","doc":"Sets the scrollbar properties.\n\nRemark: Let's say you wish to display 50 lines of text, using the same font. The window\nis sized so that you can only see 16 lines at a time. You would use: The page size is 1\nless than the thumb size so that the last line of the previous page will be visible on the\nnext page, to help orient the user. Note that with the window at this size, the thumb\nposition can never go above 50 minus 16, or 34. You can determine how many lines are\ncurrently visible by dividing the current view size by the character height in pixels.\nWhen defining your own scrollbar behaviour, you will always need to recalculate the\nscrollbar settings when the window size changes. You could therefore put your scrollbar\ncalculations and `setScrollbar/6` call into a function named AdjustScrollbars, which can be called\ninitially and also from a `m:wxSizeEvent` event handler function.","ref":"wxScrollBar.html#setScrollbar/6"},{"type":"function","title":"wxScrollBar.setThumbPosition/2","doc":"Sets the position of the scrollbar.\n\nSee: `getThumbPosition/1`","ref":"wxScrollBar.html#setThumbPosition/2"},{"type":"type","title":"wxScrollBar.wxScrollBar/0","doc":"","ref":"wxScrollBar.html#t:wxScrollBar/0"},{"type":"module","title":"wxScrollEvent","doc":"A scroll event holds information about events sent from stand-alone scrollbars (see `m:wxScrollBar`)\nand sliders (see `m:wxSlider`).\n\nNote that scrolled windows send the `m:wxScrollWinEvent` which does not derive from `m:wxCommandEvent`,\nbut from `m:wxEvent` directly - don't confuse these two kinds of events and use the event\ntable macros mentioned below only for the scrollbar-like controls.\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen).\n\nIn short, the EVT_SCROLL_CHANGED event is triggered when scrolling/ moving has finished\nindependently of the way it had started. Please see the page_samples_widgets (\"Slider\"\npage) to see the difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nRemark: Note that unless specifying a scroll control identifier, you will need to test\nfor scrollbar orientation with `getOrientation/1`, since horizontal and vertical scroll events are processed\nusing the same event handler.\n\nSee:\n* `m:wxScrollBar`\n\n* `m:wxSlider`\n\n* `m:wxSpinButton`\n\n* `m:wxScrollWinEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxScrollEvent](https://docs.wxwidgets.org/3.2/classwx_scroll_event.html)","ref":"wxScrollEvent.html"},{"type":"module","title":"Events - wxScrollEvent","doc":"Use `wxEvtHandler:connect/3` with `wxScrollEventType` to subscribe to events of this type.","ref":"wxScrollEvent.html#module-events"},{"type":"function","title":"wxScrollEvent.getOrientation/1","doc":"Returns wxHORIZONTAL or wxVERTICAL, depending on the orientation of the scrollbar.","ref":"wxScrollEvent.html#getOrientation/1"},{"type":"function","title":"wxScrollEvent.getPosition/1","doc":"Returns the position of the scrollbar.","ref":"wxScrollEvent.html#getPosition/1"},{"type":"type","title":"wxScrollEvent.wxScroll/0","doc":"","ref":"wxScrollEvent.html#t:wxScroll/0"},{"type":"type","title":"wxScrollEvent.wxScrollEvent/0","doc":"","ref":"wxScrollEvent.html#t:wxScrollEvent/0"},{"type":"type","title":"wxScrollEvent.wxScrollEventType/0","doc":"","ref":"wxScrollEvent.html#t:wxScrollEventType/0"},{"type":"module","title":"wxScrollWinEvent","doc":"A scroll event holds information about events sent from scrolling windows.\n\nNote that you can use the EVT_SCROLLWIN* macros for intercepting scroll window events\nfrom the receiving window.\n\nSee:\n* `m:wxScrollEvent`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxScrollWinEvent](https://docs.wxwidgets.org/3.2/classwx_scroll_win_event.html)","ref":"wxScrollWinEvent.html"},{"type":"module","title":"Events - wxScrollWinEvent","doc":"Use `wxEvtHandler:connect/3` with `wxScrollWinEventType` to subscribe to events of this type.","ref":"wxScrollWinEvent.html#module-events"},{"type":"function","title":"wxScrollWinEvent.getOrientation/1","doc":"Returns wxHORIZONTAL or wxVERTICAL, depending on the orientation of the scrollbar.","ref":"wxScrollWinEvent.html#getOrientation/1"},{"type":"function","title":"wxScrollWinEvent.getPosition/1","doc":"Returns the position of the scrollbar for the thumb track and release events.\n\nNote that this field can't be used for the other events, you need to query the window\nitself for the current position in that case.","ref":"wxScrollWinEvent.html#getPosition/1"},{"type":"type","title":"wxScrollWinEvent.wxScrollWin/0","doc":"","ref":"wxScrollWinEvent.html#t:wxScrollWin/0"},{"type":"type","title":"wxScrollWinEvent.wxScrollWinEvent/0","doc":"","ref":"wxScrollWinEvent.html#t:wxScrollWinEvent/0"},{"type":"type","title":"wxScrollWinEvent.wxScrollWinEventType/0","doc":"","ref":"wxScrollWinEvent.html#t:wxScrollWinEventType/0"},{"type":"module","title":"wxScrolledWindow","doc":"The `wxScrolled` (not implemented in wx) class manages scrolling for its client area,\ntransforming the coordinates according to the scrollbar positions, and setting the scroll\npositions, thumb sizes and ranges according to the area in view.\n\nThere are two commonly used (but not the only possible!) specializations of this class:\n\n* ?wxScrolledWindow, aka wxScrolled , is equivalent to ?wxScrolledWindow from\nearlier versions. Derived from `m:wxPanel`, it shares `m:wxPanel`'s behaviour with regard\nto TAB traversal and focus handling. Use this if the scrolled window will have child controls.\n\n* ?wxScrolledCanvas, aka wxScrolled , derives from `m:wxWindow` and so doesn't\nhandle children specially. This is suitable e.g. for implementing scrollable controls such\nas tree or list controls.\n\nNote: See `wxScrolled::Create()` (not implemented in wx) if you want to use `wxScrolled`\n(not implemented in wx) with a custom class.\n\nStarting from version 2.4 of wxWidgets, there are several ways to use a\n?wxScrolledWindow (and now `wxScrolled` (not implemented in wx)). In particular, there are\nthree ways to set the size of the scrolling area:\n\nOne way is to set the scrollbars directly using a call to `setScrollbars/6`. This is the way it used to be\nin any previous version of wxWidgets and it will be kept for backwards compatibility.\n\nAn additional method of manual control, which requires a little less computation of your\nown, is to set the total size of the scrolling area by calling either `wxWindow:setVirtualSize/3`, or `wxWindow:fitInside/1`, and setting\nthe scrolling increments for it by calling `setScrollRate/3`. Scrolling in some orientation is enabled by\nsetting a non-zero increment for it.\n\nThe most automatic and newest way is to simply let sizers determine the scrolling area.\nThis is now the default when you set an interior sizer into a `wxScrolled` (not\nimplemented in wx) with `wxWindow:setSizer/3`. The scrolling area will be set to the size requested by the\nsizer and the scrollbars will be assigned for each orientation according to the need for\nthem and the scrolling increment set by `setScrollRate/3`. As above, scrolling is only enabled in\norientations with a non-zero increment. You can influence the minimum size of the scrolled\narea controlled by a sizer by calling wxWindow::SetVirtualSizeHints(). (Calling `setScrollbars/6` has\nanalogous effects in wxWidgets 2.4 - in later versions it may not continue to override the sizer.)\n\nNote that if maximum size hints are still supported by wxWindow::SetVirtualSizeHints(),\nuse them at your own dire risk. They may or may not have been removed for 2.4, but it\nreally only makes sense to set minimum size hints here. We should probably replace\nwxWindow::SetVirtualSizeHints() with wxWindow::SetMinVirtualSize() or similar and remove\nit entirely in future.\n\nAs with all windows, an application can draw onto a `wxScrolled` (not implemented in wx)\nusing a device context.\n\nYou have the option of handling the OnPaint handler or overriding the `wxScrolled::OnDraw()`\n(not implemented in wx) function, which is passed a pre-scrolled device context (prepared\nby `doPrepareDC/2`).\n\nIf you don't wish to calculate your own scrolling, you must call `doPrepareDC/2` when not drawing from\nwithin `OnDraw()` (not implemented in wx), to set the device origin for the device context\naccording to the current scroll position.\n\nA `wxScrolled` (not implemented in wx) will normally scroll itself and therefore its\nchild windows as well. It might however be desired to scroll a different window than\nitself: e.g. when designing a spreadsheet, you will normally only have to scroll the\n(usually white) cell area, whereas the (usually grey) label area will scroll very\ndifferently. For this special purpose, you can call `setTargetWindow/2` which means that pressing the\nscrollbars will scroll a different window.\n\nNote that the underlying system knows nothing about scrolling coordinates, so that all\nsystem functions (mouse events, expose events, refresh calls etc) as well as the position\nof subwindows are relative to the \"physical\" origin of the scrolled window. If the user\ninsert a child window at position (10,10) and scrolls the window down 100 pixels (moving\nthe child window out of the visible area), the child window will report a position of (10,-90).","ref":"wxScrolledWindow.html"},{"type":"module","title":"Styles - wxScrolledWindow","doc":"This class supports the following styles:\n\n* wxHSCROLL: If this style is specified and ?wxVSCROLL isn't, the window will be scrollable\nonly in horizontal direction (by default, i.e. if neither this style nor ?wxVSCROLL is\nspecified, it scrolls in both directions).\n\n* wxVSCROLL: If this style is specified and ?wxHSCROLL isn't, the window will be scrollable\nonly in vertical direction (by default, i.e. if neither this style nor ?wxHSCROLL is\nspecified, it scrolls in both directions).\n\n* wxALWAYS_SHOW_SB: Since wxWidgets 2.9.5, specifying this style makes the window always\nshow its scrollbars, even if they are not used. See `ShowScrollbars()` (not implemented in\nwx).\n\n* wxRETAINED: Uses a backing pixmap to speed refreshes. Motif only.\n\nSee:\n* `m:wxScrollBar`\n\n* `m:wxClientDC`\n\n* `m:wxPaintDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxPanel`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxScrolledWindow](https://docs.wxwidgets.org/3.2/classwx_scrolled_window.html)","ref":"wxScrolledWindow.html#module-styles"},{"type":"module","title":"Events - wxScrolledWindow","doc":"Event types emitted from this class:\n\n* [`scrollwin_top`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_bottom`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_lineup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_linedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pageup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pagedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbtrack`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbrelease`](`m:wxScrollWinEvent`)","ref":"wxScrolledWindow.html#module-events"},{"type":"function","title":"wxScrolledWindow.calcScrolledPosition/2","doc":"","ref":"wxScrolledWindow.html#calcScrolledPosition/2"},{"type":"function","title":"wxScrolledWindow.calcScrolledPosition/3","doc":"Translates the logical coordinates to the device ones.\n\nFor example, if a window is scrolled 10 pixels to the bottom, the device coordinates of\nthe origin are (0, 0) (as always), but the logical coordinates are (0, 10) and so the call\nto CalcScrolledPosition(0, 10, xx, yy) will return 0 in yy.\n\nSee: `calcUnscrolledPosition/3`","ref":"wxScrolledWindow.html#calcScrolledPosition/3"},{"type":"function","title":"wxScrolledWindow.calcUnscrolledPosition/2","doc":"","ref":"wxScrolledWindow.html#calcUnscrolledPosition/2"},{"type":"function","title":"wxScrolledWindow.calcUnscrolledPosition/3","doc":"Translates the device coordinates to the logical ones.\n\nFor example, if a window is scrolled 10 pixels to the bottom, the device coordinates of\nthe origin are (0, 0) (as always), but the logical coordinates are (0, 10) and so the call\nto CalcUnscrolledPosition(0, 0, xx, yy) will return 10 in yy.\n\nSee: `calcScrolledPosition/3`","ref":"wxScrolledWindow.html#calcUnscrolledPosition/3"},{"type":"function","title":"wxScrolledWindow.destroy/1","doc":"Destroys the object","ref":"wxScrolledWindow.html#destroy/1"},{"type":"function","title":"wxScrolledWindow.doPrepareDC/2","doc":"Call this function to prepare the device context for drawing a scrolled image.\n\nIt sets the device origin according to the current scroll position. `doPrepareDC/2` is called\nautomatically within the default `wxEVT_PAINT` event handler, so your `OnDraw()` (not\nimplemented in wx) override will be passed an already 'pre-scrolled' device context.\nHowever, if you wish to draw from outside of `OnDraw()` (not implemented in wx) (e.g. from\nyour own `wxEVT_PAINT` handler), you must call this function yourself.\n\nFor example:\n\nNotice that the function sets the origin by moving it relatively to the current origin\nposition, so you shouldn't change the origin before calling `doPrepareDC/2` or, if you do, reset it to\n(0, 0) later. If you call `doPrepareDC/2` immediately after device context creation, as in the example\nabove, this problem doesn't arise, of course, so it is customary to do it like this.","ref":"wxScrolledWindow.html#doPrepareDC/2"},{"type":"function","title":"wxScrolledWindow.enableScrolling/3","doc":"Enable or disable use of `wxWindow:scrollWindow/4` for scrolling.\n\nBy default, when a scrolled window is logically scrolled, `wxWindow:scrollWindow/4` is called on the underlying\nwindow which scrolls the window contents and only invalidates the part of the window newly\nbrought into view. If false is passed as an argument, then this \"physical scrolling\" is\ndisabled and the window is entirely invalidated whenever it is scrolled by calling `wxWindow:refresh/2`.\n\nIt should be rarely necessary to disable physical scrolling, so this method shouldn't be\ncalled in normal circumstances.","ref":"wxScrolledWindow.html#enableScrolling/3"},{"type":"function","title":"wxScrolledWindow.getScrollPixelsPerUnit/1","doc":"Get the number of pixels per scroll unit (line), in each direction, as set by `setScrollbars/6`.\n\nA value of zero indicates no scrolling in that direction.\n\nSee:\n* `setScrollbars/6`\n\n* `wxWindow:getVirtualSize/1`","ref":"wxScrolledWindow.html#getScrollPixelsPerUnit/1"},{"type":"function","title":"wxScrolledWindow.getViewStart/1","doc":"This is a simple overload of GetViewStart(int*,int*); see that function for more info.","ref":"wxScrolledWindow.html#getViewStart/1"},{"type":"function","title":"wxScrolledWindow.new/0","doc":"Default constructor.","ref":"wxScrolledWindow.html#new/0"},{"type":"function","title":"wxScrolledWindow.new/1","doc":"","ref":"wxScrolledWindow.html#new/1"},{"type":"function","title":"wxScrolledWindow.new/2","doc":"Constructor.\n\nRemark: The window is initially created without visible scrollbars. Call `setScrollbars/6` to specify how\nbig the virtual window size should be.","ref":"wxScrolledWindow.html#new/2"},{"type":"function","title":"wxScrolledWindow.prepareDC/2","doc":"This function is for backwards compatibility only and simply calls `doPrepareDC/2` now.\n\nNotice that it is not called by the default paint event handle (`doPrepareDC/2` is), so overriding this\nmethod in your derived class is useless.","ref":"wxScrolledWindow.html#prepareDC/2"},{"type":"function","title":"wxScrolledWindow.scroll/2","doc":"This is an overload of `scroll/3`;see that function for more info.","ref":"wxScrolledWindow.html#scroll/2"},{"type":"function","title":"wxScrolledWindow.scroll/3","doc":"Scrolls a window so the view start is at the given point.\n\nRemark: The positions are in scroll units, not pixels, so to convert to pixels you will\nhave to multiply by the number of pixels per scroll increment. If either parameter is\n?wxDefaultCoord (-1), that position will be ignored (no change in that direction).\n\nSee:\n* `setScrollbars/6`\n\n* `getScrollPixelsPerUnit/1`","ref":"wxScrolledWindow.html#scroll/3"},{"type":"function","title":"wxScrolledWindow.setScrollbars/5","doc":"","ref":"wxScrolledWindow.html#setScrollbars/5"},{"type":"function","title":"wxScrolledWindow.setScrollbars/6","doc":"Sets up vertical and/or horizontal scrollbars.\n\nThe first pair of parameters give the number of pixels per 'scroll step', i.e. amount\nmoved when the up or down scroll arrows are pressed. The second pair gives the length of\nscrollbar in scroll steps, which sets the size of the virtual window.\n\n`xPos` and `yPos` optionally specify a position to scroll to immediately.\n\nFor example, the following gives a window horizontal and vertical scrollbars with 20\npixels per scroll step, and a size of 50 steps (1000 pixels) in each direction:\n\n`wxScrolled` (not implemented in wx) manages the page size itself, using the current\nclient window size as the page size.\n\nNote that for more sophisticated scrolling applications, for example where scroll steps\nmay be variable according to the position in the document, it will be necessary to derive\na new class from `m:wxWindow`, overriding OnSize() and adjusting the scrollbars appropriately.\n\nSee: `wxWindow:setVirtualSize/3`","ref":"wxScrolledWindow.html#setScrollbars/6"},{"type":"function","title":"wxScrolledWindow.setScrollRate/3","doc":"Set the horizontal and vertical scrolling increment only.\n\nSee the pixelsPerUnit parameter in `setScrollbars/6`.","ref":"wxScrolledWindow.html#setScrollRate/3"},{"type":"function","title":"wxScrolledWindow.setTargetWindow/2","doc":"Call this function to tell `wxScrolled` (not implemented in wx) to perform the actual\nscrolling on a different window (and not on itself).\n\nThis method is useful when only a part of the window should be scrolled. A typical\nexample is a control consisting of a fixed header and the scrollable contents window: the\nscrollbars are attached to the main window itself, hence it, and not the contents window\nmust be derived from `wxScrolled` (not implemented in wx), but only the contents window\nscrolls when the scrollbars are used. To implement such setup, you need to call this\nmethod with the contents window as argument.\n\nNotice that if this method is used, `GetSizeAvailableForScrollTarget()` (not implemented\nin wx) method must be overridden.","ref":"wxScrolledWindow.html#setTargetWindow/2"},{"type":"type","title":"wxScrolledWindow.wxScrolledWindow/0","doc":"","ref":"wxScrolledWindow.html#t:wxScrolledWindow/0"},{"type":"module","title":"wxSetCursorEvent","doc":"A `m:wxSetCursorEvent` is generated from `m:wxWindow` when the mouse cursor is about to\nbe set as a result of mouse motion.\n\nThis event gives the application the chance to perform specific mouse cursor processing\nbased on the current position of the mouse within the window. Use `setCursor/2` to specify the cursor\nyou want to be displayed.\n\nSee:\n* `wx_misc:setCursor/1`\n\n* `wxWindow:setCursor/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSetCursorEvent](https://docs.wxwidgets.org/3.2/classwx_set_cursor_event.html)","ref":"wxSetCursorEvent.html"},{"type":"module","title":"Events - wxSetCursorEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSetCursorEventType` to subscribe to events of this type.","ref":"wxSetCursorEvent.html#module-events"},{"type":"function","title":"wxSetCursorEvent.getCursor/1","doc":"Returns a reference to the cursor specified by this event.","ref":"wxSetCursorEvent.html#getCursor/1"},{"type":"function","title":"wxSetCursorEvent.getX/1","doc":"Returns the X coordinate of the mouse in client coordinates.","ref":"wxSetCursorEvent.html#getX/1"},{"type":"function","title":"wxSetCursorEvent.getY/1","doc":"Returns the Y coordinate of the mouse in client coordinates.","ref":"wxSetCursorEvent.html#getY/1"},{"type":"function","title":"wxSetCursorEvent.hasCursor/1","doc":"Returns true if the cursor specified by this event is a valid cursor.\n\nRemark: You cannot specify wxNullCursor with this event, as it is not considered a valid\ncursor.","ref":"wxSetCursorEvent.html#hasCursor/1"},{"type":"function","title":"wxSetCursorEvent.setCursor/2","doc":"Sets the cursor associated with this event.","ref":"wxSetCursorEvent.html#setCursor/2"},{"type":"type","title":"wxSetCursorEvent.wxSetCursor/0","doc":"","ref":"wxSetCursorEvent.html#t:wxSetCursor/0"},{"type":"type","title":"wxSetCursorEvent.wxSetCursorEvent/0","doc":"","ref":"wxSetCursorEvent.html#t:wxSetCursorEvent/0"},{"type":"type","title":"wxSetCursorEvent.wxSetCursorEventType/0","doc":"","ref":"wxSetCursorEvent.html#t:wxSetCursorEventType/0"},{"type":"module","title":"wxShowEvent","doc":"An event being sent when the window is shown or hidden.\n\nThe event is triggered by calls to `wxWindow:show/2`, and any user action showing a previously hidden\nwindow or vice versa (if allowed by the current platform and/or window manager). Notice\nthat the event is not triggered when the application is iconized (minimized) or restored\nunder wxMSW.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `wxWindow:show/2`\n\n* `wxWindow:isShown/1`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxShowEvent](https://docs.wxwidgets.org/3.2/classwx_show_event.html)","ref":"wxShowEvent.html"},{"type":"module","title":"Events - wxShowEvent","doc":"Use `wxEvtHandler:connect/3` with `wxShowEventType` to subscribe to events of this type.","ref":"wxShowEvent.html#module-events"},{"type":"function","title":"wxShowEvent.isShown/1","doc":"Return true if the window has been shown, false if it has been hidden.","ref":"wxShowEvent.html#isShown/1"},{"type":"function","title":"wxShowEvent.setShow/2","doc":"Set whether the windows was shown or hidden.","ref":"wxShowEvent.html#setShow/2"},{"type":"type","title":"wxShowEvent.wxShow/0","doc":"","ref":"wxShowEvent.html#t:wxShow/0"},{"type":"type","title":"wxShowEvent.wxShowEvent/0","doc":"","ref":"wxShowEvent.html#t:wxShowEvent/0"},{"type":"type","title":"wxShowEvent.wxShowEventType/0","doc":"","ref":"wxShowEvent.html#t:wxShowEventType/0"},{"type":"module","title":"wxSingleChoiceDialog","doc":"This class represents a dialog that shows a list of strings, and allows the user to\nselect one.\n\nDouble-clicking on a list item is equivalent to single-clicking and then pressing OK.","ref":"wxSingleChoiceDialog.html"},{"type":"module","title":"Styles - wxSingleChoiceDialog","doc":"This class supports the following styles:\n\n* wxOK: Show an OK button.\n\n* wxCANCEL: Show a Cancel button.\n\n* wxCENTRE: Centre the message.\n\nSee:\n* [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_singlechoice)\n\n* `m:wxMultiChoiceDialog`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSingleChoiceDialog](https://docs.wxwidgets.org/3.2/classwx_single_choice_dialog.html)","ref":"wxSingleChoiceDialog.html#module-styles"},{"type":"function","title":"wxSingleChoiceDialog.destroy/1","doc":"Destroys the object","ref":"wxSingleChoiceDialog.html#destroy/1"},{"type":"function","title":"wxSingleChoiceDialog.getSelection/1","doc":"Returns the index of selected item.","ref":"wxSingleChoiceDialog.html#getSelection/1"},{"type":"function","title":"wxSingleChoiceDialog.getStringSelection/1","doc":"Returns the selected string.","ref":"wxSingleChoiceDialog.html#getStringSelection/1"},{"type":"function","title":"wxSingleChoiceDialog.new/4","doc":"","ref":"wxSingleChoiceDialog.html#new/4"},{"type":"function","title":"wxSingleChoiceDialog.new/5","doc":"Constructor, taking an array of `wxString` (not implemented in wx) choices and optional\nclient data.\n\nRemark: Use `wxDialog:showModal/1` to show the dialog.","ref":"wxSingleChoiceDialog.html#new/5"},{"type":"function","title":"wxSingleChoiceDialog.setSelection/2","doc":"Sets the index of the initially selected item.","ref":"wxSingleChoiceDialog.html#setSelection/2"},{"type":"type","title":"wxSingleChoiceDialog.wxSingleChoiceDialog/0","doc":"","ref":"wxSingleChoiceDialog.html#t:wxSingleChoiceDialog/0"},{"type":"module","title":"wxSizeEvent","doc":"A size event holds information about size change events of `m:wxWindow`.\n\nThe EVT_SIZE handler function will be called when the window has been resized.\n\nYou may wish to use this for frames to resize their child windows as appropriate.\n\nNote that the size passed is of the whole window: call `wxWindow:getClientSize/1` for the area which may be used by\nthe application.\n\nWhen a window is resized, usually only a small part of the window is damaged and you may\nonly need to repaint that area. However, if your drawing depends on the size of the\nwindow, you may need to clear the DC explicitly and repaint the whole window. In which\ncase, you may need to call `wxWindow:refresh/2` to invalidate the entire window.\n\n`Important` : Sizers (see overview_sizer ) rely on size events to function correctly.\nTherefore, in a sizer-based layout, do not forget to call Skip on all size events you\ncatch (and don't catch size events at all when you don't need to).\n\nSee:\n* {Width,Height}\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSizeEvent](https://docs.wxwidgets.org/3.2/classwx_size_event.html)","ref":"wxSizeEvent.html"},{"type":"module","title":"Events - wxSizeEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSizeEventType` to subscribe to events of this type.","ref":"wxSizeEvent.html#module-events"},{"type":"function","title":"wxSizeEvent.getRect/1","doc":"","ref":"wxSizeEvent.html#getRect/1"},{"type":"function","title":"wxSizeEvent.getSize/1","doc":"Returns the entire size of the window generating the size change event.\n\nThis is the new total size of the window, i.e. the same size as would be returned by `wxWindow:getSize/1` if\nit were called now. Use `wxWindow:getClientSize/1` if you catch this event in a top level window such as `m:wxFrame`\nto find the size available for the window contents.","ref":"wxSizeEvent.html#getSize/1"},{"type":"type","title":"wxSizeEvent.wxSize/0","doc":"","ref":"wxSizeEvent.html#t:wxSize/0"},{"type":"type","title":"wxSizeEvent.wxSizeEvent/0","doc":"","ref":"wxSizeEvent.html#t:wxSizeEvent/0"},{"type":"type","title":"wxSizeEvent.wxSizeEventType/0","doc":"","ref":"wxSizeEvent.html#t:wxSizeEventType/0"},{"type":"module","title":"wxSizer","doc":"`m:wxSizer` is the abstract base class used for laying out subwindows in a window.\n\nYou cannot use `m:wxSizer` directly; instead, you will have to use one of the sizer\nclasses derived from it. Currently there are `m:wxBoxSizer`, `m:wxStaticBoxSizer`, `m:wxGridSizer`, `m:wxFlexGridSizer`, `wxWrapSizer`\n(not implemented in wx) and `m:wxGridBagSizer`.\n\nThe layout algorithm used by sizers in wxWidgets is closely related to layout in other\nGUI toolkits, such as Java's AWT, the GTK toolkit or the Qt toolkit. It is based upon the\nidea of the individual subwindows reporting their minimal required size and their ability\nto get stretched if the size of the parent window has changed.\n\nThis will most often mean that the programmer does not set the original size of a dialog\nin the beginning, rather the dialog will be assigned a sizer and this sizer will be\nqueried about the recommended size. The sizer in turn will query its children, which can\nbe normal windows, empty space or other sizers, so that a hierarchy of sizers can be\nconstructed. Note that `m:wxSizer` does not derive from `m:wxWindow` and thus does not\ninterfere with tab ordering and requires very little resources compared to a real window\non screen.\n\nWhat makes sizers so well fitted for use in wxWidgets is the fact that every control\nreports its own minimal size and the algorithm can handle differences in font sizes or\ndifferent window (dialog item) sizes on different platforms without problems. If e.g. the\nstandard font as well as the overall design of Motif widgets requires more space than on\nWindows, the initial dialog size will automatically be bigger on Motif than on Windows.\n\nSizers may also be used to control the layout of custom drawn items on the window. The `add/4`, `insert/5`,\nand `prepend/4` functions return a pointer to the newly added `m:wxSizerItem`. Just add empty space\nof the desired size and attributes, and then use the `wxSizerItem:getRect/1` method to determine where the\ndrawing operations should take place.\n\nPlease notice that sizers, like child windows, are owned by the library and will be\ndeleted by it which implies that they must be allocated on the heap. However if you create\na sizer and do not add it to another sizer or window, the library wouldn't be able to\ndelete such an orphan sizer and in this, and only this, case it should be deleted explicitly.\n\nwxSizer flags\n\nThe \"flag\" argument accepted by `m:wxSizerItem` constructors and other functions, e.g. `add/4`,\nis an OR-combination of the following flags. Two main behaviours are defined using these\nflags. One is the border around a window: the border parameter determines the border width\nwhereas the flags given here determine which side(s) of the item that the border will be\nadded. The other flags determine how the sizer item behaves when the space allotted to the\nsizer changes, and is somewhat dependent on the specific kind of sizer used.\n\nSee: [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nwxWidgets docs: [wxSizer](https://docs.wxwidgets.org/3.2/classwx_sizer.html)","ref":"wxSizer.html"},{"type":"function","title":"wxSizer.add/2","doc":"","ref":"wxSizer.html#add/2"},{"type":"function","title":"wxSizer.add/3","doc":"Appends a child to the sizer.\n\n`m:wxSizer` itself is an abstract class, but the parameters are equivalent in the derived\nclasses that you will instantiate to use it so they are described here:","ref":"wxSizer.html#add/3"},{"type":"function","title":"wxSizer.add/4","doc":"Appends a spacer child to the sizer.","ref":"wxSizer.html#add/4"},{"type":"function","title":"wxSizer.addSpacer/2","doc":"This base function adds non-stretchable space to both the horizontal and vertical\norientation of the sizer.\n\nMore readable way of calling:\n\nSee: `addSpacer/2`","ref":"wxSizer.html#addSpacer/2"},{"type":"function","title":"wxSizer.addStretchSpacer/1","doc":"","ref":"wxSizer.html#addStretchSpacer/1"},{"type":"function","title":"wxSizer.addStretchSpacer/2","doc":"Adds stretchable space to the sizer.\n\nMore readable way of calling:","ref":"wxSizer.html#addStretchSpacer/2"},{"type":"function","title":"wxSizer.calcMin/1","doc":"This method is abstract and has to be overwritten by any derived class.\n\nHere, the sizer will do the actual calculation of its children's minimal sizes.","ref":"wxSizer.html#calcMin/1"},{"type":"function","title":"wxSizer.clear/1","doc":"","ref":"wxSizer.html#clear/1"},{"type":"function","title":"wxSizer.clear/2","doc":"Detaches all children from the sizer.\n\nIf `delete_windows` is true then child windows will also be deleted.\n\nNotice that child sizers are always deleted, as a general consequence of the principle\nthat sizers own their sizer children, but don't own their window children (because they\nare already owned by their parent windows).","ref":"wxSizer.html#clear/2"},{"type":"function","title":"wxSizer.detach/2","doc":"Detach a item at position `index` from the sizer without destroying it.\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after detaching a child from the sizer. Returns true if the child item\nwas found and detached, false otherwise.\n\nSee: `remove/2`","ref":"wxSizer.html#detach/2"},{"type":"function","title":"wxSizer.fit/2","doc":"Tell the sizer to resize the `window` so that its client area matches the sizer's minimal\nsize (`ComputeFittingClientSize()` (not implemented in wx) is called to determine it).\n\nThis is commonly done in the constructor of the window itself, see sample in the\ndescription of `m:wxBoxSizer`.\n\nReturn: The new window size.","ref":"wxSizer.html#fit/2"},{"type":"function","title":"wxSizer.fitInside/2","doc":"Tell the sizer to resize the virtual size of the `window` to match the sizer's minimal\nsize.\n\nThis will not alter the on screen size of the window, but may cause the\naddition/removal/alteration of scrollbars required to view the virtual area in windows\nwhich manage it.\n\nSee:\n* `wxScrolledWindow:setScrollbars/6`\n\n* `setVirtualSizeHints/2`","ref":"wxSizer.html#fitInside/2"},{"type":"function","title":"wxSizer.getChildren/1","doc":"","ref":"wxSizer.html#getChildren/1"},{"type":"function","title":"wxSizer.getItem/2","doc":"Finds `m:wxSizerItem` which is located in the sizer at position `index`.\n\nUse parameter `recursive` to search in subsizers too. Returns pointer to item or NULL.","ref":"wxSizer.html#getItem/2"},{"type":"function","title":"wxSizer.getItem/3","doc":"Finds `m:wxSizerItem` which holds the given `window`.\n\nUse parameter `recursive` to search in subsizers too. Returns pointer to item or NULL.","ref":"wxSizer.html#getItem/3"},{"type":"function","title":"wxSizer.getMinSize/1","doc":"Returns the minimal size of the sizer.\n\nThis is either the combined minimal size of all the children and their borders or the\nminimal size set by `setMinSize/3`, depending on which is bigger. Note that the returned value is client\nsize, not window size. In particular, if you use the value to set toplevel window's\nminimal or actual size, use `wxWindow::SetMinClientSize()` (not implemented in wx) or `wxWindow:setClientSize/3`,\nnot `wxWindow:setMinSize/2` or `wxWindow:setSize/6`.","ref":"wxSizer.html#getMinSize/1"},{"type":"function","title":"wxSizer.getPosition/1","doc":"Returns the current position of the sizer.","ref":"wxSizer.html#getPosition/1"},{"type":"function","title":"wxSizer.getSize/1","doc":"Returns the current size of the sizer.","ref":"wxSizer.html#getSize/1"},{"type":"function","title":"wxSizer.hide/2","doc":"Hides the item at position `index`.\n\nTo make a sizer item disappear, use `hide/3` followed by `layout/1`.\n\nUse parameter `recursive` to hide elements found in subsizers. Returns true if the child\nitem was found, false otherwise.\n\nSee:\n* `isShown/2`\n\n* `show/3`","ref":"wxSizer.html#hide/2"},{"type":"function","title":"wxSizer.hide/3","doc":"Hides the child `window`.\n\nTo make a sizer item disappear, use `hide/3` followed by `layout/1`.\n\nUse parameter `recursive` to hide elements found in subsizers. Returns true if the child\nitem was found, false otherwise.\n\nSee:\n* `isShown/2`\n\n* `show/3`","ref":"wxSizer.html#hide/3"},{"type":"function","title":"wxSizer.insert/3","doc":"","ref":"wxSizer.html#insert/3"},{"type":"function","title":"wxSizer.insert/4","doc":"Insert a child into the sizer before any existing item at `index`.\n\nSee `add/4` for the meaning of the other parameters.","ref":"wxSizer.html#insert/4"},{"type":"function","title":"wxSizer.insert/5","doc":"Insert a child into the sizer before any existing item at `index`.\n\nSee `add/4` for the meaning of the other parameters.","ref":"wxSizer.html#insert/5"},{"type":"function","title":"wxSizer.insertSpacer/3","doc":"Inserts non-stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Insert(index, size, size).","ref":"wxSizer.html#insertSpacer/3"},{"type":"function","title":"wxSizer.insertStretchSpacer/2","doc":"","ref":"wxSizer.html#insertStretchSpacer/2"},{"type":"function","title":"wxSizer.insertStretchSpacer/3","doc":"Inserts stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Insert(0, 0, prop).","ref":"wxSizer.html#insertStretchSpacer/3"},{"type":"function","title":"wxSizer.isShown/2","doc":"Returns true if the item at `index` is shown.\n\nSee:\n* `hide/3`\n\n* `show/3`\n\n* `wxSizerItem:isShown/1`","ref":"wxSizer.html#isShown/2"},{"type":"function","title":"wxSizer.layout/1","doc":"Call this to force layout of the children anew, e.g. after having added a child to or\nremoved a child (window, other sizer or space) from the sizer while keeping the current\ndimension.","ref":"wxSizer.html#layout/1"},{"type":"function","title":"wxSizer.prepend/2","doc":"","ref":"wxSizer.html#prepend/2"},{"type":"function","title":"wxSizer.prepend/3","doc":"Same as `add/4`, but prepends the items to the beginning of the list of items (windows,\nsubsizers or spaces) owned by this sizer.","ref":"wxSizer.html#prepend/3"},{"type":"function","title":"wxSizer.prepend/4","doc":"Same as `add/4`, but prepends the items to the beginning of the list of items (windows,\nsubsizers or spaces) owned by this sizer.","ref":"wxSizer.html#prepend/4"},{"type":"function","title":"wxSizer.prependSpacer/2","doc":"Prepends non-stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Prepend(size, size, 0).","ref":"wxSizer.html#prependSpacer/2"},{"type":"function","title":"wxSizer.prependStretchSpacer/1","doc":"","ref":"wxSizer.html#prependStretchSpacer/1"},{"type":"function","title":"wxSizer.prependStretchSpacer/2","doc":"Prepends stretchable space to the sizer.\n\nMore readable way of calling wxSizer::Prepend(0, 0, prop).","ref":"wxSizer.html#prependStretchSpacer/2"},{"type":"function","title":"wxSizer.recalcSizes/1","doc":"Equivalent to: `layout/1`","ref":"wxSizer.html#recalcSizes/1"},{"type":"function","title":"wxSizer.remove/2","doc":"Removes a sizer child from the sizer and destroys it.\n\nNote: This method does not cause any layout or resizing to take place, call `layout/1` to update\nthe layout \"on screen\" after removing a child from the sizer.\n\nReturn: true if the child item was found and removed, false otherwise.","ref":"wxSizer.html#remove/2"},{"type":"function","title":"wxSizer.replace/3","doc":"Detaches the given item at position `index` from the sizer and replaces it with the given `m:wxSizerItem`\n`newitem`.\n\nThe detached child is deleted `only` if it is a sizer or a spacer (but not if it is a `m:wxWindow`\nbecause windows are owned by their parent window, not the sizer).\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after replacing a child from the sizer.\n\nReturns true if the child item was found and removed, false otherwise.","ref":"wxSizer.html#replace/3"},{"type":"function","title":"wxSizer.replace/4","doc":"Detaches the given `oldwin` from the sizer and replaces it with the given `newwin`.\n\nThe detached child window is `not` deleted (because windows are owned by their parent\nwindow, not the sizer).\n\nUse parameter `recursive` to search the given element recursively in subsizers.\n\nThis method does not cause any layout or resizing to take place, call `layout/1` to update the\nlayout \"on screen\" after replacing a child from the sizer.\n\nReturns true if the child item was found and removed, false otherwise.","ref":"wxSizer.html#replace/4"},{"type":"function","title":"wxSizer.setDimension/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxSizer.html#setDimension/3"},{"type":"function","title":"wxSizer.setDimension/5","doc":"Call this to force the sizer to take the given dimension and thus force the items owned\nby the sizer to resize themselves according to the rules defined by the parameter in the `add/4`\nand `prepend/4` methods.","ref":"wxSizer.html#setDimension/5"},{"type":"function","title":"wxSizer.setItemMinSize/3","doc":"","ref":"wxSizer.html#setItemMinSize/3"},{"type":"function","title":"wxSizer.setItemMinSize/4","doc":"","ref":"wxSizer.html#setItemMinSize/4"},{"type":"function","title":"wxSizer.setMinSize/2","doc":"Call this to give the sizer a minimal size.\n\nNormally, the sizer will calculate its minimal size based purely on how much space its\nchildren need. After calling this method `getMinSize/1` will return either the minimal size as requested\nby its children or the minimal size set here, depending on which is bigger.","ref":"wxSizer.html#setMinSize/2"},{"type":"function","title":"wxSizer.setMinSize/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxSizer.html#setMinSize/3"},{"type":"function","title":"wxSizer.setSizeHints/2","doc":"This method first calls `fit/2` and then `setSizeHints/2` on the `window` passed to it.\n\nThis only makes sense when `window` is actually a `m:wxTopLevelWindow` such as a `m:wxFrame`\nor a `m:wxDialog`, since SetSizeHints only has any effect in these classes. It does\nnothing in normal windows or controls.\n\nThis method is implicitly used by `wxWindow:setSizerAndFit/3` which is commonly invoked in the constructor of a\ntoplevel window itself (see the sample in the description of `m:wxBoxSizer`) if the\ntoplevel window is resizable.","ref":"wxSizer.html#setSizeHints/2"},{"type":"function","title":"wxSizer.setVirtualSizeHints/2","doc":"Equivalent to: `fitInside/2`","ref":"wxSizer.html#setVirtualSizeHints/2"},{"type":"function","title":"wxSizer.show/2","doc":"","ref":"wxSizer.html#show/2"},{"type":"function","title":"wxSizer.show/3","doc":"Shows the item at `index`.\n\nTo make a sizer item disappear or reappear, use `show/3` followed by `layout/1`.\n\nReturns true if the child item was found, false otherwise.\n\nSee:\n* `hide/3`\n\n* `isShown/2`","ref":"wxSizer.html#show/3"},{"type":"function","title":"wxSizer.showItems/2","doc":"Show or hide all items managed by the sizer.","ref":"wxSizer.html#showItems/2"},{"type":"type","title":"wxSizer.wxSizer/0","doc":"","ref":"wxSizer.html#t:wxSizer/0"},{"type":"module","title":"wxSizerFlags","doc":"Container for sizer items flags providing readable names for them.\n\nNormally, when you add an item to a sizer via `wxSizer:add/4`, you have to specify a lot of flags and\nparameters which can be unwieldy. This is where `m:wxSizerFlags` comes in: it allows you\nto specify all parameters using the named methods instead. For example, instead of\n\nyou can now write\n\nThis is more readable and also allows you to create `m:wxSizerFlags` objects which can be\nreused for several sizer items.\n\nNote that by specification, all methods of `m:wxSizerFlags` return the `m:wxSizerFlags`\nobject itself to allowing chaining multiple methods calls like in the examples above.\n\nSee: `m:wxSizer`\n\nwxWidgets docs: [wxSizerFlags](https://docs.wxwidgets.org/3.2/classwx_sizer_flags.html)","ref":"wxSizerFlags.html"},{"type":"function","title":"wxSizerFlags.align/2","doc":"Sets the alignment of this `m:wxSizerFlags` to `align`.\n\nThis method replaces the previously set alignment with the specified one.\n\nSee:\n* `left/1`\n\n* `right/1`\n\n* `centre/1`","ref":"wxSizerFlags.html#align/2"},{"type":"function","title":"wxSizerFlags.border/1","doc":"","ref":"wxSizerFlags.html#border/1"},{"type":"function","title":"wxSizerFlags.border/2","doc":"Sets the `m:wxSizerFlags` to have a border with size as returned by `GetDefaultBorder()`\n(not implemented in wx).","ref":"wxSizerFlags.html#border/2"},{"type":"function","title":"wxSizerFlags.border/3","doc":"Sets the `m:wxSizerFlags` to have a border of a number of pixels specified by `borderinpixels`\nwith the directions specified by `direction`.\n\nPrefer to use the overload below or `DoubleBorder()` (not implemented in wx) or `TripleBorder()`\n(not implemented in wx) versions instead of hard-coding the border value in pixels to\navoid too small borders on devices with high DPI displays.","ref":"wxSizerFlags.html#border/3"},{"type":"function","title":"wxSizerFlags.center/1","doc":"Sets the object of the `m:wxSizerFlags` to center itself in the area it is given.","ref":"wxSizerFlags.html#center/1"},{"type":"function","title":"wxSizerFlags.centre/1","doc":"Equivalent to: `center/1`","ref":"wxSizerFlags.html#centre/1"},{"type":"function","title":"wxSizerFlags.destroy/1","doc":"Destroys the object","ref":"wxSizerFlags.html#destroy/1"},{"type":"function","title":"wxSizerFlags.expand/1","doc":"Sets the object of the `m:wxSizerFlags` to expand to fill as much area as it can.","ref":"wxSizerFlags.html#expand/1"},{"type":"function","title":"wxSizerFlags.left/1","doc":"Aligns the object to the left, similar for `Align(wxALIGN\\_LEFT)`.\n\nUnlike `align/2`, this method doesn't change the vertical alignment of the item.","ref":"wxSizerFlags.html#left/1"},{"type":"function","title":"wxSizerFlags.new/0","doc":"","ref":"wxSizerFlags.html#new/0"},{"type":"function","title":"wxSizerFlags.new/1","doc":"Creates the `m:wxSizer` with the proportion specified by `proportion`.","ref":"wxSizerFlags.html#new/1"},{"type":"function","title":"wxSizerFlags.proportion/2","doc":"Sets the proportion of this `m:wxSizerFlags` to `proportion`.","ref":"wxSizerFlags.html#proportion/2"},{"type":"function","title":"wxSizerFlags.right/1","doc":"Aligns the object to the right, similar for `Align(wxALIGN\\_RIGHT)`.\n\nUnlike `align/2`, this method doesn't change the vertical alignment of the item.","ref":"wxSizerFlags.html#right/1"},{"type":"type","title":"wxSizerFlags.wxSizerFlags/0","doc":"","ref":"wxSizerFlags.html#t:wxSizerFlags/0"},{"type":"module","title":"wxSizerItem","doc":"The `m:wxSizerItem` class is used to track the position, size and other attributes of\neach item managed by a `m:wxSizer`.\n\nIt is not usually necessary to use this class because the sizer elements can also be\nidentified by their positions or window or sizer pointers but sometimes it may be more\nconvenient to use it directly.\n\nwxWidgets docs: [wxSizerItem](https://docs.wxwidgets.org/3.2/classwx_sizer_item.html)","ref":"wxSizerItem.html"},{"type":"function","title":"wxSizerItem.assignSizer/2","doc":"Set the sizer tracked by this item.\n\nOld sizer, if any, is deleted.","ref":"wxSizerItem.html#assignSizer/2"},{"type":"function","title":"wxSizerItem.assignSpacer/2","doc":"Set the size of the spacer tracked by this item.\n\nOld spacer, if any, is deleted.","ref":"wxSizerItem.html#assignSpacer/2"},{"type":"function","title":"wxSizerItem.assignSpacer/3","doc":"","ref":"wxSizerItem.html#assignSpacer/3"},{"type":"function","title":"wxSizerItem.assignWindow/2","doc":"Set the window to be tracked by this item.\n\nNote: This is a low-level method which is dangerous if used incorrectly, avoid using it\nif possible, i.e. if higher level methods such as `wxSizer:replace/4` can be used instead.\n\nIf the sizer item previously contained a window, it is dissociated from the sizer\ncontaining this sizer item (if any), but this object doesn't have the pointer to the\ncontaining sizer and so it's the caller's responsibility to call `wxWindow:setContainingSizer/2` on `window`. Failure to\ndo this can result in memory corruption when the window is destroyed later, so it is\ncrucial to not forget to do it.\n\nAlso note that the previously contained window is `not` deleted, so it's also the callers\nresponsibility to do it, if necessary.","ref":"wxSizerItem.html#assignWindow/2"},{"type":"function","title":"wxSizerItem.calcMin/1","doc":"Calculates the minimum desired size for the item, including any space needed by borders.","ref":"wxSizerItem.html#calcMin/1"},{"type":"function","title":"wxSizerItem.deleteWindows/1","doc":"Destroy the window or the windows in a subsizer, depending on the type of item.","ref":"wxSizerItem.html#deleteWindows/1"},{"type":"function","title":"wxSizerItem.destroy/1","doc":"Destroys the object","ref":"wxSizerItem.html#destroy/1"},{"type":"function","title":"wxSizerItem.detachSizer/1","doc":"Enable deleting the SizerItem without destroying the contained sizer.","ref":"wxSizerItem.html#detachSizer/1"},{"type":"function","title":"wxSizerItem.getBorder/1","doc":"Return the border attribute.","ref":"wxSizerItem.html#getBorder/1"},{"type":"function","title":"wxSizerItem.getFlag/1","doc":"Return the flags attribute.\n\nSee `wxSizer flags list` (not implemented in wx) for details.","ref":"wxSizerItem.html#getFlag/1"},{"type":"function","title":"wxSizerItem.getMinSize/1","doc":"Get the minimum size needed for the item.","ref":"wxSizerItem.html#getMinSize/1"},{"type":"function","title":"wxSizerItem.getPosition/1","doc":"What is the current position of the item, as set in the last Layout.","ref":"wxSizerItem.html#getPosition/1"},{"type":"function","title":"wxSizerItem.getProportion/1","doc":"Get the proportion item attribute.","ref":"wxSizerItem.html#getProportion/1"},{"type":"function","title":"wxSizerItem.getRatio/1","doc":"Get the ratio item attribute.","ref":"wxSizerItem.html#getRatio/1"},{"type":"function","title":"wxSizerItem.getRect/1","doc":"Get the rectangle of the item on the parent window, excluding borders.","ref":"wxSizerItem.html#getRect/1"},{"type":"function","title":"wxSizerItem.getSize/1","doc":"Get the current size of the item, as set in the last Layout.","ref":"wxSizerItem.html#getSize/1"},{"type":"function","title":"wxSizerItem.getSizer/1","doc":"If this item is tracking a sizer, return it.\n\nNULL otherwise.","ref":"wxSizerItem.html#getSizer/1"},{"type":"function","title":"wxSizerItem.getSpacer/1","doc":"If this item is tracking a spacer, return its size.","ref":"wxSizerItem.html#getSpacer/1"},{"type":"function","title":"wxSizerItem.getUserData/1","doc":"Get the userData item attribute.","ref":"wxSizerItem.html#getUserData/1"},{"type":"function","title":"wxSizerItem.getWindow/1","doc":"If this item is tracking a window then return it.\n\nNULL otherwise.","ref":"wxSizerItem.html#getWindow/1"},{"type":"function","title":"wxSizerItem.isShown/1","doc":"Returns true if this item is a window or a spacer and it is shown or if this item is a\nsizer and not all of its elements are hidden.\n\nIn other words, for sizer items, all of the child elements must be hidden for the sizer\nitself to be considered hidden.\n\nAs an exception, if the `wxRESERVE_SPACE_EVEN_IF_HIDDEN` flag was used for this sizer\nitem, then `isShown/1` always returns true for it (see `wxSizerFlags::ReserveSpaceEvenIfHidden()`\n(not implemented in wx)).","ref":"wxSizerItem.html#isShown/1"},{"type":"function","title":"wxSizerItem.isSizer/1","doc":"Is this item a sizer?","ref":"wxSizerItem.html#isSizer/1"},{"type":"function","title":"wxSizerItem.isSpacer/1","doc":"Is this item a spacer?","ref":"wxSizerItem.html#isSpacer/1"},{"type":"function","title":"wxSizerItem.isWindow/1","doc":"Is this item a window?","ref":"wxSizerItem.html#isWindow/1"},{"type":"function","title":"wxSizerItem.new/1","doc":"","ref":"wxSizerItem.html#new/1"},{"type":"function","title":"wxSizerItem.new/2","doc":"","ref":"wxSizerItem.html#new/2"},{"type":"function","title":"wxSizerItem.new/3","doc":"Construct a sizer item for tracking a spacer.","ref":"wxSizerItem.html#new/3"},{"type":"function","title":"wxSizerItem.setBorder/2","doc":"Set the border item attribute.","ref":"wxSizerItem.html#setBorder/2"},{"type":"function","title":"wxSizerItem.setDimension/3","doc":"Set the position and size of the space allocated to the sizer, and adjust the position\nand size of the item to be within that space taking alignment and borders into account.","ref":"wxSizerItem.html#setDimension/3"},{"type":"function","title":"wxSizerItem.setFlag/2","doc":"Set the flag item attribute.","ref":"wxSizerItem.html#setFlag/2"},{"type":"function","title":"wxSizerItem.setInitSize/3","doc":"Sets the minimum size to be allocated for this item.\n\nThis is identical to `setMinSize/3`, prefer to use the other function, as its name is more clear.","ref":"wxSizerItem.html#setInitSize/3"},{"type":"function","title":"wxSizerItem.setMinSize/2","doc":"Sets the minimum size to be allocated for this item.\n\nIf this item is a window, the `size` is also passed to `wxWindow:setMinSize/2`.","ref":"wxSizerItem.html#setMinSize/2"},{"type":"function","title":"wxSizerItem.setMinSize/3","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxSizerItem.html#setMinSize/3"},{"type":"function","title":"wxSizerItem.setProportion/2","doc":"Set the proportion item attribute.","ref":"wxSizerItem.html#setProportion/2"},{"type":"function","title":"wxSizerItem.setRatio/2","doc":"","ref":"wxSizerItem.html#setRatio/2"},{"type":"function","title":"wxSizerItem.setRatio/3","doc":"Set the ratio item attribute.","ref":"wxSizerItem.html#setRatio/3"},{"type":"function","title":"wxSizerItem.show/2","doc":"Set the show item attribute, which sizers use to determine if the item is to be made part\nof the layout or not.\n\nIf the item is tracking a window then it is shown or hidden as needed.","ref":"wxSizerItem.html#show/2"},{"type":"type","title":"wxSizerItem.wxSizerItem/0","doc":"","ref":"wxSizerItem.html#t:wxSizerItem/0"},{"type":"module","title":"wxSlider","doc":"A slider is a control with a handle which can be pulled back and forth to change the\nvalue.\n\nOn Windows, the track bar control is used.\n\nOn GTK+, tick marks are only available for version 2.16 and later.\n\nSlider generates the same events as `m:wxScrollBar` but in practice the most convenient\nway to process `m:wxSlider` updates is by handling the slider-specific `wxEVT_SLIDER`\nevent which carries `m:wxCommandEvent` containing just the latest slider position.","ref":"wxSlider.html"},{"type":"module","title":"Styles - wxSlider","doc":"This class supports the following styles:\n\n* wxSL_HORIZONTAL: Displays the slider horizontally (this is the default).\n\n* wxSL_VERTICAL: Displays the slider vertically.\n\n* wxSL_AUTOTICKS: Displays tick marks (Windows, GTK+ 2.16 and later).\n\n* wxSL_MIN_MAX_LABELS: Displays minimum, maximum labels (new since wxWidgets 2.9.1).\n\n* wxSL_VALUE_LABEL: Displays value label (new since wxWidgets 2.9.1).\n\n* wxSL_LABELS: Displays minimum, maximum and value labels (same as wxSL_VALUE_LABEL and\nwxSL_MIN_MAX_LABELS together).\n\n* wxSL_LEFT: Displays ticks on the left and forces the slider to be vertical (Windows and\nGTK+ 3 only).\n\n* wxSL_RIGHT: Displays ticks on the right and forces the slider to be vertical.\n\n* wxSL_TOP: Displays ticks on the top (Windows and GTK+ 3 only).\n\n* wxSL_BOTTOM: Displays ticks on the bottom (this is the default).\n\n* wxSL_BOTH: Displays ticks on both sides of the slider. Windows only.\n\n* wxSL_SELRANGE: Displays a highlighted selection range. Windows only.\n\n* wxSL_INVERSE: Inverses the minimum and maximum endpoints on the slider. Not compatible\nwith wxSL_SELRANGE. Notice that `wxSL_LEFT`, `wxSL_TOP`, `wxSL_RIGHT` and `wxSL_BOTTOM`\nspecify the position of the slider ticks and that the slider labels, if any, are\npositioned on the opposite side. So, to have a label on the left side of a vertical\nslider, `wxSL_RIGHT` must be used (or none of these styles at all should be specified as\nleft and top are default positions for the vertical and horizontal sliders respectively).\n\nThe difference between EVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED\n\nThe EVT_SCROLL_THUMBRELEASE event is only emitted when actually dragging the thumb using\nthe mouse and releasing it (This EVT_SCROLL_THUMBRELEASE event is also followed by an\nEVT_SCROLL_CHANGED event).\n\nThe EVT_SCROLL_CHANGED event also occurs when using the keyboard to change the thumb\nposition, and when clicking next to the thumb (In all these cases the\nEVT_SCROLL_THUMBRELEASE event does not happen). In short, the EVT_SCROLL_CHANGED event is\ntriggered when scrolling/ moving has finished independently of the way it had started.\nPlease see the page_samples_widgets (\"Slider\" page) to see the difference between\nEVT_SCROLL_THUMBRELEASE and EVT_SCROLL_CHANGED in action.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxScrollBar`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSlider](https://docs.wxwidgets.org/3.2/classwx_slider.html)","ref":"wxSlider.html#module-styles"},{"type":"module","title":"Events - wxSlider","doc":"Event types emitted from this class:\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`scroll_top`](`m:wxScrollEvent`)\n\n* [`scroll_bottom`](`m:wxScrollEvent`)\n\n* [`scroll_lineup`](`m:wxScrollEvent`)\n\n* [`scroll_linedown`](`m:wxScrollEvent`)\n\n* [`scroll_pageup`](`m:wxScrollEvent`)\n\n* [`scroll_pagedown`](`m:wxScrollEvent`)\n\n* [`scroll_thumbtrack`](`m:wxScrollEvent`)\n\n* [`scroll_thumbrelease`](`m:wxScrollEvent`)\n\n* [`scroll_changed`](`m:wxScrollEvent`)\n\n* [`command_slider_updated`](`m:wxCommandEvent`)","ref":"wxSlider.html#module-events"},{"type":"function","title":"wxSlider.create/6","doc":"","ref":"wxSlider.html#create/6"},{"type":"function","title":"wxSlider.create/7","doc":"Used for two-step slider construction.\n\nSee `new/6` for further details.","ref":"wxSlider.html#create/7"},{"type":"function","title":"wxSlider.destroy/1","doc":"Destroys the object","ref":"wxSlider.html#destroy/1"},{"type":"function","title":"wxSlider.getLineSize/1","doc":"Returns the line size.\n\nSee: `setLineSize/2`","ref":"wxSlider.html#getLineSize/1"},{"type":"function","title":"wxSlider.getMax/1","doc":"Gets the maximum slider value.\n\nSee:\n* `getMin/1`\n\n* `setRange/3`","ref":"wxSlider.html#getMax/1"},{"type":"function","title":"wxSlider.getMin/1","doc":"Gets the minimum slider value.\n\nSee:\n* `getMin/1`\n\n* `setRange/3`","ref":"wxSlider.html#getMin/1"},{"type":"function","title":"wxSlider.getPageSize/1","doc":"Returns the page size.\n\nSee: `setPageSize/2`","ref":"wxSlider.html#getPageSize/1"},{"type":"function","title":"wxSlider.getThumbLength/1","doc":"Returns the thumb length.\n\nOnly for:wxmsw\n\nSee: `setThumbLength/2`","ref":"wxSlider.html#getThumbLength/1"},{"type":"function","title":"wxSlider.getValue/1","doc":"Gets the current slider value.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`\n\n* `setValue/2`","ref":"wxSlider.html#getValue/1"},{"type":"function","title":"wxSlider.new/0","doc":"Default constructor.","ref":"wxSlider.html#new/0"},{"type":"function","title":"wxSlider.new/5","doc":"","ref":"wxSlider.html#new/5"},{"type":"function","title":"wxSlider.new/6","doc":"Constructor, creating and showing a slider.\n\nSee: `create/7`","ref":"wxSlider.html#new/6"},{"type":"function","title":"wxSlider.setLineSize/2","doc":"Sets the line size for the slider.\n\nSee: `getLineSize/1`","ref":"wxSlider.html#setLineSize/2"},{"type":"function","title":"wxSlider.setPageSize/2","doc":"Sets the page size for the slider.\n\nSee: `getPageSize/1`","ref":"wxSlider.html#setPageSize/2"},{"type":"function","title":"wxSlider.setRange/3","doc":"Sets the minimum and maximum slider values.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`","ref":"wxSlider.html#setRange/3"},{"type":"function","title":"wxSlider.setThumbLength/2","doc":"Sets the slider thumb length.\n\nOnly for:wxmsw\n\nSee: `getThumbLength/1`","ref":"wxSlider.html#setThumbLength/2"},{"type":"function","title":"wxSlider.setValue/2","doc":"Sets the slider position.","ref":"wxSlider.html#setValue/2"},{"type":"type","title":"wxSlider.wxSlider/0","doc":"","ref":"wxSlider.html#t:wxSlider/0"},{"type":"module","title":"wxSpinButton","doc":"A `m:wxSpinButton` has two small up and down (or left and right) arrow buttons.\n\nIt is often used next to a text control for increment and decrementing a value. Portable\nprograms should try to use `m:wxSpinCtrl` instead as `m:wxSpinButton` is not implemented\nfor all platforms but `m:wxSpinCtrl` is as it degenerates to a simple `m:wxTextCtrl` on\nsuch platforms.\n\nNote: the range supported by this control (and `m:wxSpinCtrl`) depends on the platform\nbut is at least `-0x8000` to `0x7fff`. Under GTK and Win32 with sufficiently new version\nof `comctrl32.dll` (at least 4.71 is required, 5.80 is recommended) the full 32 bit range\nis supported.","ref":"wxSpinButton.html"},{"type":"module","title":"Styles - wxSpinButton","doc":"This class supports the following styles:\n\n* wxSP_HORIZONTAL: Specifies a horizontal spin button (note that this style is not\nsupported in wxGTK).\n\n* wxSP_VERTICAL: Specifies a vertical spin button.\n\n* wxSP_ARROW_KEYS: The user can use arrow keys to change the value.\n\n* wxSP_WRAP: The value wraps at the minimum and maximum.\n\nSee: `m:wxSpinCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSpinButton](https://docs.wxwidgets.org/3.2/classwx_spin_button.html)","ref":"wxSpinButton.html#module-styles"},{"type":"module","title":"Events - wxSpinButton","doc":"Event types emitted from this class:\n\n* [`spin`](`m:wxSpinEvent`)\n\n* [`spin_up`](`m:wxSpinEvent`)\n\n* [`spin_down`](`m:wxSpinEvent`)","ref":"wxSpinButton.html#module-events"},{"type":"function","title":"wxSpinButton.create/2","doc":"","ref":"wxSpinButton.html#create/2"},{"type":"function","title":"wxSpinButton.create/3","doc":"Scrollbar creation function called by the spin button constructor.\n\nSee `new/2` for details.","ref":"wxSpinButton.html#create/3"},{"type":"function","title":"wxSpinButton.destroy/1","doc":"Destroys the object","ref":"wxSpinButton.html#destroy/1"},{"type":"function","title":"wxSpinButton.getMax/1","doc":"Returns the maximum permissible value.\n\nSee: `setRange/3`","ref":"wxSpinButton.html#getMax/1"},{"type":"function","title":"wxSpinButton.getMin/1","doc":"Returns the minimum permissible value.\n\nSee: `setRange/3`","ref":"wxSpinButton.html#getMin/1"},{"type":"function","title":"wxSpinButton.getValue/1","doc":"Returns the current spin button value.\n\nSee: `setValue/2`","ref":"wxSpinButton.html#getValue/1"},{"type":"function","title":"wxSpinButton.new/0","doc":"Default constructor.","ref":"wxSpinButton.html#new/0"},{"type":"function","title":"wxSpinButton.new/1","doc":"","ref":"wxSpinButton.html#new/1"},{"type":"function","title":"wxSpinButton.new/2","doc":"Constructor, creating and showing a spin button.\n\nSee: `create/3`","ref":"wxSpinButton.html#new/2"},{"type":"function","title":"wxSpinButton.setRange/3","doc":"Sets the range of the spin button.\n\nIn portable code, `min` should be less than or equal to `max`. In wxMSW it is possible to\nspecify minimum greater than maximum and the native control supports the same range as if\nthey were reversed, but swaps the meaning of up and down arrows, however this dubious\nfeature is not supported on other platforms.\n\nSee:\n* `getMin/1`\n\n* `getMax/1`","ref":"wxSpinButton.html#setRange/3"},{"type":"function","title":"wxSpinButton.setValue/2","doc":"Sets the value of the spin button.","ref":"wxSpinButton.html#setValue/2"},{"type":"type","title":"wxSpinButton.wxSpinButton/0","doc":"","ref":"wxSpinButton.html#t:wxSpinButton/0"},{"type":"module","title":"wxSpinCtrl","doc":"`m:wxSpinCtrl` combines `m:wxTextCtrl` and `m:wxSpinButton` in one control.","ref":"wxSpinCtrl.html"},{"type":"module","title":"Styles - wxSpinCtrl","doc":"This class supports the following styles:\n\n* wxSP_ARROW_KEYS: The user can use arrow keys to change the value.\n\n* wxSP_WRAP: The value wraps at the minimum and maximum.\n\n* wxTE_PROCESS_ENTER: Indicates that the control should generate `wxEVT_TEXT_ENTER` events.\nUsing this style will prevent the user from using the Enter key for dialog navigation\n(e.g. activating the default button in the dialog) under MSW.\n\n* wxALIGN_LEFT: Same as wxTE_LEFT for `m:wxTextCtrl`: the text is left aligned (this is the\ndefault).\n\n* wxALIGN_CENTRE_HORIZONTAL: Same as wxTE_CENTRE for `m:wxTextCtrl`: the text is centered.\n\n* wxALIGN_RIGHT: Same as wxTE_RIGHT for `m:wxTextCtrl`: the text is right aligned.\n\nSee:\n* `m:wxSpinButton`\n\n* `m:wxControl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSpinCtrl](https://docs.wxwidgets.org/3.2/classwx_spin_ctrl.html)","ref":"wxSpinCtrl.html#module-styles"},{"type":"module","title":"Events - wxSpinCtrl","doc":"Event types emitted from this class:\n\n* [`command_spinctrl_updated`](`m:wxSpinEvent`)","ref":"wxSpinCtrl.html#module-events"},{"type":"function","title":"wxSpinCtrl.create/2","doc":"","ref":"wxSpinCtrl.html#create/2"},{"type":"function","title":"wxSpinCtrl.create/3","doc":"Creation function called by the spin control constructor.\n\nSee `new/2` for details.","ref":"wxSpinCtrl.html#create/3"},{"type":"function","title":"wxSpinCtrl.destroy/1","doc":"Destroys the object","ref":"wxSpinCtrl.html#destroy/1"},{"type":"function","title":"wxSpinCtrl.getMax/1","doc":"Gets maximal allowable value.","ref":"wxSpinCtrl.html#getMax/1"},{"type":"function","title":"wxSpinCtrl.getMin/1","doc":"Gets minimal allowable value.","ref":"wxSpinCtrl.html#getMin/1"},{"type":"function","title":"wxSpinCtrl.getValue/1","doc":"Gets the value of the spin control.","ref":"wxSpinCtrl.html#getValue/1"},{"type":"function","title":"wxSpinCtrl.new/0","doc":"Default constructor.","ref":"wxSpinCtrl.html#new/0"},{"type":"function","title":"wxSpinCtrl.new/1","doc":"","ref":"wxSpinCtrl.html#new/1"},{"type":"function","title":"wxSpinCtrl.new/2","doc":"Constructor, creating and showing a spin control.\n\nIf `value` is non-empty, it will be shown in the text entry part of the control and if it\nhas numeric value, the initial numeric value of the control, as returned by `getValue/1` will also be\ndetermined by it instead of by `initial`. Hence, it only makes sense to specify `initial`\nif `value` is an empty string or is not convertible to a number, otherwise `initial` is\nsimply ignored and the number specified by `value` is used.\n\nSee: `create/3`","ref":"wxSpinCtrl.html#new/2"},{"type":"function","title":"wxSpinCtrl.setRange/3","doc":"Sets range of allowable values.\n\nNotice that calling this method may change the value of the control if it's not inside\nthe new valid range, e.g. it will become `minVal` if it is less than it now. However no `wxEVT_SPINCTRL`\nevent is generated, even if it the value does change.\n\nNote: Setting a range including negative values is silently ignored if current base is\nset to 16.","ref":"wxSpinCtrl.html#setRange/3"},{"type":"function","title":"wxSpinCtrl.setSelection/3","doc":"Select the text in the text part of the control between positions `from` (inclusive) and `to`\n(exclusive).\n\nThis is similar to `wxTextCtrl:setSelection/3`.\n\nNote: this is currently only implemented for Windows and generic versions of the control.","ref":"wxSpinCtrl.html#setSelection/3"},{"type":"function","title":"wxSpinCtrl.setValue/2","doc":"Sets the value of the spin control.\n\nIt is recommended to use the overload taking an integer value instead.\n\nNotice that, unlike `wxTextCtrl:setValue/2`, but like most of the other setter methods in wxWidgets, calling\nthis method does not generate any events as events are only generated for the user\nactions.","ref":"wxSpinCtrl.html#setValue/2"},{"type":"type","title":"wxSpinCtrl.wxSpinCtrl/0","doc":"","ref":"wxSpinCtrl.html#t:wxSpinCtrl/0"},{"type":"module","title":"wxSpinEvent","doc":"This event class is used for the events generated by `m:wxSpinButton` and `m:wxSpinCtrl`.\n\nSee:\n* `m:wxSpinButton`\n\n* `m:wxSpinCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSpinEvent](https://docs.wxwidgets.org/3.2/classwx_spin_event.html)","ref":"wxSpinEvent.html"},{"type":"module","title":"Events - wxSpinEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSpinEventType` to subscribe to events of this type.","ref":"wxSpinEvent.html#module-events"},{"type":"function","title":"wxSpinEvent.getPosition/1","doc":"Retrieve the current spin button or control value.","ref":"wxSpinEvent.html#getPosition/1"},{"type":"function","title":"wxSpinEvent.setPosition/2","doc":"Set the value associated with the event.","ref":"wxSpinEvent.html#setPosition/2"},{"type":"type","title":"wxSpinEvent.wxSpin/0","doc":"","ref":"wxSpinEvent.html#t:wxSpin/0"},{"type":"type","title":"wxSpinEvent.wxSpinEvent/0","doc":"","ref":"wxSpinEvent.html#t:wxSpinEvent/0"},{"type":"type","title":"wxSpinEvent.wxSpinEventType/0","doc":"","ref":"wxSpinEvent.html#t:wxSpinEventType/0"},{"type":"module","title":"wxSplashScreen","doc":"`m:wxSplashScreen` shows a window with a thin border, displaying a bitmap describing your\napplication.\n\nShow it in application initialisation, and then either explicitly destroy it or let it time-out.\n\nExample usage:\n\nThis class is derived, and can use functions, from:\n\n* `m:wxFrame`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSplashScreen](https://docs.wxwidgets.org/3.2/classwx_splash_screen.html)","ref":"wxSplashScreen.html"},{"type":"function","title":"wxSplashScreen.destroy/1","doc":"Destroys the object","ref":"wxSplashScreen.html#destroy/1"},{"type":"function","title":"wxSplashScreen.getSplashStyle/1","doc":"Returns the splash style (see `new/6` for details).","ref":"wxSplashScreen.html#getSplashStyle/1"},{"type":"function","title":"wxSplashScreen.getTimeout/1","doc":"Returns the timeout in milliseconds.","ref":"wxSplashScreen.html#getTimeout/1"},{"type":"function","title":"wxSplashScreen.new/5","doc":"","ref":"wxSplashScreen.html#new/5"},{"type":"function","title":"wxSplashScreen.new/6","doc":"Construct the splash screen passing a bitmap, a style, a timeout, a window id, optional\nposition and size, and a window style.\n\n`splashStyle` is a bitlist of some of the following:\n\n* wxSPLASH_CENTRE_ON_PARENT\n\n* wxSPLASH_CENTRE_ON_SCREEN\n\n* wxSPLASH_NO_CENTRE\n\n* wxSPLASH_TIMEOUT\n\n* wxSPLASH_NO_TIMEOUT\n\n`milliseconds` is the timeout in milliseconds.","ref":"wxSplashScreen.html#new/6"},{"type":"type","title":"wxSplashScreen.wxSplashScreen/0","doc":"","ref":"wxSplashScreen.html#t:wxSplashScreen/0"},{"type":"module","title":"wxSplitterEvent","doc":"This class represents the events generated by a splitter control.\n\nAlso there is only one event class, the data associated to the different events is not\nthe same and so not all accessor functions may be called for each event. The documentation\nmentions the kind of event(s) for which the given accessor function makes sense: calling\nit for other types of events will result in assert failure (in debug mode) and will return\nmeaningless results.\n\nSee:\n* `m:wxSplitterWindow`\n\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSplitterEvent](https://docs.wxwidgets.org/3.2/classwx_splitter_event.html)","ref":"wxSplitterEvent.html"},{"type":"module","title":"Events - wxSplitterEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSplitterEventType` to subscribe to events of this type.","ref":"wxSplitterEvent.html#module-events"},{"type":"function","title":"wxSplitterEvent.getSashPosition/1","doc":"Returns the new sash position.\n\nMay only be called while processing `wxEVT_SPLITTER_SASH_POS_CHANGING` and `wxEVT_SPLITTER_SASH_POS_CHANGED`\nevents.","ref":"wxSplitterEvent.html#getSashPosition/1"},{"type":"function","title":"wxSplitterEvent.getWindowBeingRemoved/1","doc":"Returns a pointer to the window being removed when a splitter window is unsplit.\n\nMay only be called while processing `wxEVT_SPLITTER_UNSPLIT` events.","ref":"wxSplitterEvent.html#getWindowBeingRemoved/1"},{"type":"function","title":"wxSplitterEvent.getX/1","doc":"Returns the x coordinate of the double-click point.\n\nMay only be called while processing `wxEVT_SPLITTER_DOUBLECLICKED` events.","ref":"wxSplitterEvent.html#getX/1"},{"type":"function","title":"wxSplitterEvent.getY/1","doc":"Returns the y coordinate of the double-click point.\n\nMay only be called while processing `wxEVT_SPLITTER_DOUBLECLICKED` events.","ref":"wxSplitterEvent.html#getY/1"},{"type":"function","title":"wxSplitterEvent.setSashPosition/2","doc":"In the case of `wxEVT\\_SPLITTER\\_SASH\\_POS\\_CHANGED` events, sets the new sash position.\n\nIn the case of `wxEVT_SPLITTER_SASH_POS_CHANGING` events, sets the new tracking bar\nposition so visual feedback during dragging will represent that change that will actually\ntake place. Set to -1 from the event handler code to prevent repositioning.\n\nMay only be called while processing `wxEVT_SPLITTER_SASH_POS_CHANGING` and `wxEVT_SPLITTER_SASH_POS_CHANGED`\nevents.","ref":"wxSplitterEvent.html#setSashPosition/2"},{"type":"type","title":"wxSplitterEvent.wxSplitter/0","doc":"","ref":"wxSplitterEvent.html#t:wxSplitter/0"},{"type":"type","title":"wxSplitterEvent.wxSplitterEvent/0","doc":"","ref":"wxSplitterEvent.html#t:wxSplitterEvent/0"},{"type":"type","title":"wxSplitterEvent.wxSplitterEventType/0","doc":"","ref":"wxSplitterEvent.html#t:wxSplitterEventType/0"},{"type":"module","title":"wxSplitterWindow","doc":"This class manages up to two subwindows.\n\nThe current view can be split into two programmatically (perhaps from a menu command),\nand unsplit either programmatically or via the `m:wxSplitterWindow` user interface.","ref":"wxSplitterWindow.html"},{"type":"module","title":"Styles - wxSplitterWindow","doc":"This class supports the following styles:\n\n* wxSP_3D: Draws a 3D effect border and sash.\n\n* wxSP_THIN_SASH: Draws a thin sash.\n\n* wxSP_3DSASH: Draws a 3D effect sash (part of default style).\n\n* wxSP_3DBORDER: Synonym for wxSP_BORDER.\n\n* wxSP_BORDER: Draws a standard border.\n\n* wxSP_NOBORDER: No border (default).\n\n* wxSP_NO_XP_THEME: Under Windows, switches off the attempt to draw the splitter using\nWindows theming, so the borders and sash will take on the pre-XP look.\n\n* wxSP_PERMIT_UNSPLIT: Always allow to unsplit, even with the minimum pane size other than\nzero.\n\n* wxSP_LIVE_UPDATE: Don't draw XOR line but resize the child windows immediately.\n\nSee:\n* `m:wxSplitterEvent`\n\n* [Overview splitterwindow](https://docs.wxwidgets.org/3.2/overview_splitterwindow.html#overview_splitterwindow)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxSplitterWindow](https://docs.wxwidgets.org/3.2/classwx_splitter_window.html)","ref":"wxSplitterWindow.html#module-styles"},{"type":"module","title":"Events - wxSplitterWindow","doc":"Event types emitted from this class:\n\n* [`command_splitter_sash_pos_changing`](`m:wxSplitterEvent`)\n\n* [`command_splitter_sash_pos_changed`](`m:wxSplitterEvent`)\n\n* [`command_splitter_unsplit`](`m:wxSplitterEvent`)","ref":"wxSplitterWindow.html#module-events"},{"type":"function","title":"wxSplitterWindow.create/2","doc":"","ref":"wxSplitterWindow.html#create/2"},{"type":"function","title":"wxSplitterWindow.create/3","doc":"Creation function, for two-step construction.\n\nSee `new/2` for details.","ref":"wxSplitterWindow.html#create/3"},{"type":"function","title":"wxSplitterWindow.destroy/1","doc":"Destroys the object","ref":"wxSplitterWindow.html#destroy/1"},{"type":"function","title":"wxSplitterWindow.getMinimumPaneSize/1","doc":"Returns the current minimum pane size (defaults to zero).\n\nSee: `setMinimumPaneSize/2`","ref":"wxSplitterWindow.html#getMinimumPaneSize/1"},{"type":"function","title":"wxSplitterWindow.getSashGravity/1","doc":"Returns the current sash gravity.\n\nSee: `setSashGravity/2`","ref":"wxSplitterWindow.html#getSashGravity/1"},{"type":"function","title":"wxSplitterWindow.getSashPosition/1","doc":"Returns the current sash position.\n\nSee: `setSashPosition/3`","ref":"wxSplitterWindow.html#getSashPosition/1"},{"type":"function","title":"wxSplitterWindow.getSplitMode/1","doc":"Gets the split mode.\n\nSee:\n* `setSplitMode/2`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`","ref":"wxSplitterWindow.html#getSplitMode/1"},{"type":"function","title":"wxSplitterWindow.getWindow1/1","doc":"Returns the left/top or only pane.","ref":"wxSplitterWindow.html#getWindow1/1"},{"type":"function","title":"wxSplitterWindow.getWindow2/1","doc":"Returns the right/bottom pane.","ref":"wxSplitterWindow.html#getWindow2/1"},{"type":"function","title":"wxSplitterWindow.initialize/2","doc":"Initializes the splitter window to have one pane.\n\nThe child window is shown if it is currently hidden.\n\nRemark: This should be called if you wish to initially view only a single pane in the\nsplitter window.\n\nSee:\n* `splitVertically/4`\n\n* `splitHorizontally/4`","ref":"wxSplitterWindow.html#initialize/2"},{"type":"function","title":"wxSplitterWindow.isSplit/1","doc":"Returns true if the window is split, false otherwise.","ref":"wxSplitterWindow.html#isSplit/1"},{"type":"function","title":"wxSplitterWindow.new/0","doc":"Default constructor.","ref":"wxSplitterWindow.html#new/0"},{"type":"function","title":"wxSplitterWindow.new/1","doc":"","ref":"wxSplitterWindow.html#new/1"},{"type":"function","title":"wxSplitterWindow.new/2","doc":"Constructor for creating the window.\n\nRemark: After using this constructor, you must create either one or two subwindows with\nthe splitter window as parent, and then call one of `initialize/2`, `splitVertically/4` and `splitHorizontally/4` in order to set the pane(s).\nYou can create two windows, with one hidden when not being shown; or you can create and\ndelete the second pane on demand.\n\nSee:\n* `initialize/2`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`\n\n* `create/3`","ref":"wxSplitterWindow.html#new/2"},{"type":"function","title":"wxSplitterWindow.replaceWindow/3","doc":"This function replaces one of the windows managed by the `m:wxSplitterWindow` with\nanother one.\n\nIt is in general better to use it instead of calling `unsplit/2` and then resplitting the window\nback because it will provoke much less flicker (if any). It is valid to call this function\nwhether the splitter has two windows or only one.\n\nBoth parameters should be non-NULL and `winOld` must specify one of the windows managed\nby the splitter. If the parameters are incorrect or the window couldn't be replaced, false\nis returned. Otherwise the function will return true, but please notice that it will not\ndelete the replaced window and you may wish to do it yourself.\n\nSee: `getMinimumPaneSize/1`","ref":"wxSplitterWindow.html#replaceWindow/3"},{"type":"function","title":"wxSplitterWindow.setMinimumPaneSize/2","doc":"Sets the minimum pane size.\n\nRemark: The default minimum pane size is zero, which means that either pane can be\nreduced to zero by dragging the sash, thus removing one of the panes. To prevent this\nbehaviour (and veto out-of-range sash dragging), set a minimum size, for example 20\npixels. If the wxSP_PERMIT_UNSPLIT style is used when a splitter window is created, the\nwindow may be unsplit even if minimum size is non-zero.\n\nSee: `getMinimumPaneSize/1`","ref":"wxSplitterWindow.html#setMinimumPaneSize/2"},{"type":"function","title":"wxSplitterWindow.setSashGravity/2","doc":"Sets the sash gravity.\n\nRemark: Gravity is real factor which controls position of sash while resizing `m:wxSplitterWindow`.\nGravity tells `m:wxSplitterWindow` how much will left/top window grow while resizing.\nExample values:\n\n* 0.0: only the bottom/right window is automatically resized\n\n* 0.5: both windows grow by equal size\n\n* 1.0: only left/top window grows Gravity should be a real value between 0.0 and 1.0.\nDefault value of sash gravity is 0.0. That value is compatible with previous (before\ngravity was introduced) behaviour of `m:wxSplitterWindow`.\n\nNotice that when sash gravity for a newly created splitter window, it is often necessary\nto explicitly set the splitter size using `wxWindow:setSize/6` to ensure that is big enough for its initial\nsash position. Otherwise, i.e. if the window is created with the default tiny size and\nonly resized to its correct size later, the initial sash position will be affected by the\ngravity and typically result in sash being at the rightmost position for the gravity of 1.\nSee the example code creating `m:wxSplitterWindow` in the splitter sample for more details.\n\nSee: `getSashGravity/1`","ref":"wxSplitterWindow.html#setSashGravity/2"},{"type":"function","title":"wxSplitterWindow.setSashPosition/2","doc":"","ref":"wxSplitterWindow.html#setSashPosition/2"},{"type":"function","title":"wxSplitterWindow.setSashPosition/3","doc":"Sets the sash position.\n\nRemark: Does not currently check for an out-of-range value.\n\nSee: `getSashPosition/1`","ref":"wxSplitterWindow.html#setSashPosition/3"},{"type":"function","title":"wxSplitterWindow.setSplitMode/2","doc":"Sets the split mode.\n\nRemark: Only sets the internal variable; does not update the display.\n\nSee:\n* `getSplitMode/1`\n\n* `splitVertically/4`\n\n* `splitHorizontally/4`","ref":"wxSplitterWindow.html#setSplitMode/2"},{"type":"function","title":"wxSplitterWindow.splitHorizontally/3","doc":"","ref":"wxSplitterWindow.html#splitHorizontally/3"},{"type":"function","title":"wxSplitterWindow.splitHorizontally/4","doc":"Initializes the top and bottom panes of the splitter window.\n\nThe child windows are shown if they are currently hidden.\n\nReturn: true if successful, false otherwise (the window was already split).\n\nRemark: This should be called if you wish to initially view two panes. It can also be\ncalled at any subsequent time, but the application should check that the window is not\ncurrently split using `isSplit/1`.\n\nSee:\n* `splitVertically/4`\n\n* `isSplit/1`\n\n* `unsplit/2`","ref":"wxSplitterWindow.html#splitHorizontally/4"},{"type":"function","title":"wxSplitterWindow.splitVertically/3","doc":"","ref":"wxSplitterWindow.html#splitVertically/3"},{"type":"function","title":"wxSplitterWindow.splitVertically/4","doc":"Initializes the left and right panes of the splitter window.\n\nThe child windows are shown if they are currently hidden.\n\nReturn: true if successful, false otherwise (the window was already split).\n\nRemark: This should be called if you wish to initially view two panes. It can also be\ncalled at any subsequent time, but the application should check that the window is not\ncurrently split using `isSplit/1`.\n\nSee:\n* `splitHorizontally/4`\n\n* `isSplit/1`\n\n* `unsplit/2`","ref":"wxSplitterWindow.html#splitVertically/4"},{"type":"function","title":"wxSplitterWindow.unsplit/1","doc":"","ref":"wxSplitterWindow.html#unsplit/1"},{"type":"function","title":"wxSplitterWindow.unsplit/2","doc":"Unsplits the window.\n\nReturn: true if successful, false otherwise (the window was not split).\n\nRemark: This call will not actually delete the pane being removed; it calls `OnUnsplit()`\n(not implemented in wx) which can be overridden for the desired behaviour. By default, the\npane being removed is hidden.\n\nSee:\n* `splitHorizontally/4`\n\n* `splitVertically/4`\n\n* `isSplit/1`","ref":"wxSplitterWindow.html#unsplit/2"},{"type":"function","title":"wxSplitterWindow.updateSize/1","doc":"Causes any pending sizing of the sash and child panes to take place immediately.\n\nSuch resizing normally takes place in idle time, in order to wait for layout to be\ncompleted. However, this can cause unacceptable flicker as the panes are resized after the\nwindow has been shown. To work around this, you can perform window layout (for example by\nsending a size event to the parent window), and then call this function, before showing\nthe top-level window.","ref":"wxSplitterWindow.html#updateSize/1"},{"type":"type","title":"wxSplitterWindow.wxSplitterWindow/0","doc":"","ref":"wxSplitterWindow.html#t:wxSplitterWindow/0"},{"type":"module","title":"wxStaticBitmap","doc":"A static bitmap control displays a bitmap.\n\nNative implementations on some platforms are only meant for display of the small icons in\nthe dialog boxes.\n\nIf you want to display larger images portably, you may use generic implementation\nwxGenericStaticBitmap declared in .\n\nNotice that for the best results, the size of the control should be the same as the size\nof the image displayed in it, as happens by default if it's not resized explicitly.\nOtherwise, behaviour depends on the platform: under MSW, the bitmap is drawn centred\ninside the control, while elsewhere it is drawn at the origin of the control. You can use `SetScaleMode()`\n(not implemented in wx) to control how the image is scaled inside the control.\n\nSee: `m:wxBitmap`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticBitmap](https://docs.wxwidgets.org/3.2/classwx_static_bitmap.html)","ref":"wxStaticBitmap.html"},{"type":"function","title":"wxStaticBitmap.create/4","doc":"","ref":"wxStaticBitmap.html#create/4"},{"type":"function","title":"wxStaticBitmap.create/5","doc":"Creation function, for two-step construction.\n\nFor details see `new/4`.","ref":"wxStaticBitmap.html#create/5"},{"type":"function","title":"wxStaticBitmap.destroy/1","doc":"Destroys the object","ref":"wxStaticBitmap.html#destroy/1"},{"type":"function","title":"wxStaticBitmap.getBitmap/1","doc":"Returns the bitmap currently used in the control.\n\nNotice that this method can be called even if `SetIcon()` (not implemented in wx) had\nbeen used.\n\nSee: `setBitmap/2`","ref":"wxStaticBitmap.html#getBitmap/1"},{"type":"function","title":"wxStaticBitmap.new/0","doc":"Default constructor.","ref":"wxStaticBitmap.html#new/0"},{"type":"function","title":"wxStaticBitmap.new/3","doc":"","ref":"wxStaticBitmap.html#new/3"},{"type":"function","title":"wxStaticBitmap.new/4","doc":"Constructor, creating and showing a static bitmap control.\n\nSee: `create/5`","ref":"wxStaticBitmap.html#new/4"},{"type":"function","title":"wxStaticBitmap.setBitmap/2","doc":"Sets the bitmap label.\n\nSee: `getBitmap/1`","ref":"wxStaticBitmap.html#setBitmap/2"},{"type":"type","title":"wxStaticBitmap.wxStaticBitmap/0","doc":"","ref":"wxStaticBitmap.html#t:wxStaticBitmap/0"},{"type":"module","title":"wxStaticBox","doc":"A static box is a rectangle drawn around other windows to denote a logical grouping of\nitems.\n\nNote that while the previous versions required that windows appearing inside a static box\nbe created as its siblings (i.e. use the same parent as the static box itself), since\nwxWidgets 2.9.1 it is also possible to create them as children of `m:wxStaticBox` itself\nand you are actually encouraged to do it like this if compatibility with the previous\nversions is not important.\n\nSo the new recommended way to create static box is:\n\nWhile the compatible - and now deprecated - way is\n\nAlso note that there is a specialized `m:wxSizer` class (`m:wxStaticBoxSizer`) which can\nbe used as an easier way to pack items into a static box.\n\nSee:\n* `m:wxStaticText`\n\n* `m:wxStaticBoxSizer`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticBox](https://docs.wxwidgets.org/3.2/classwx_static_box.html)","ref":"wxStaticBox.html"},{"type":"function","title":"wxStaticBox.create/4","doc":"","ref":"wxStaticBox.html#create/4"},{"type":"function","title":"wxStaticBox.create/5","doc":"Creates the static box for two-step construction.\n\nSee `new/4` for further details.","ref":"wxStaticBox.html#create/5"},{"type":"function","title":"wxStaticBox.destroy/1","doc":"Destroys the object","ref":"wxStaticBox.html#destroy/1"},{"type":"function","title":"wxStaticBox.new/0","doc":"Default constructor.","ref":"wxStaticBox.html#new/0"},{"type":"function","title":"wxStaticBox.new/3","doc":"","ref":"wxStaticBox.html#new/3"},{"type":"function","title":"wxStaticBox.new/4","doc":"Constructor, creating and showing a static box.\n\nSee: `create/5`","ref":"wxStaticBox.html#new/4"},{"type":"type","title":"wxStaticBox.wxStaticBox/0","doc":"","ref":"wxStaticBox.html#t:wxStaticBox/0"},{"type":"module","title":"wxStaticBoxSizer","doc":"`m:wxStaticBoxSizer` is a sizer derived from `m:wxBoxSizer` but adds a static box around\nthe sizer.\n\nThe static box may be either created independently or the sizer may create it itself as a\nconvenience. In any case, the sizer owns the `m:wxStaticBox` control and will delete it in\nthe `m:wxStaticBoxSizer` destructor.\n\nNote that since wxWidgets 2.9.1 you are encouraged to create the windows which are added\nto `m:wxStaticBoxSizer` as children of `m:wxStaticBox` itself, see this class\ndocumentation for more details.\n\nExample of use of this class:\n\nSee:\n* `m:wxSizer`\n\n* `m:wxStaticBox`\n\n* `m:wxBoxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBoxSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxStaticBoxSizer](https://docs.wxwidgets.org/3.2/classwx_static_box_sizer.html)","ref":"wxStaticBoxSizer.html"},{"type":"function","title":"wxStaticBoxSizer.destroy/1","doc":"Destroys the object","ref":"wxStaticBoxSizer.html#destroy/1"},{"type":"function","title":"wxStaticBoxSizer.getStaticBox/1","doc":"Returns the static box associated with the sizer.","ref":"wxStaticBoxSizer.html#getStaticBox/1"},{"type":"function","title":"wxStaticBoxSizer.new/2","doc":"This constructor uses an already existing static box.","ref":"wxStaticBoxSizer.html#new/2"},{"type":"function","title":"wxStaticBoxSizer.new/3","doc":"This constructor creates a new static box with the given label and parent window.","ref":"wxStaticBoxSizer.html#new/3"},{"type":"type","title":"wxStaticBoxSizer.wxStaticBoxSizer/0","doc":"","ref":"wxStaticBoxSizer.html#t:wxStaticBoxSizer/0"},{"type":"module","title":"wxStaticLine","doc":"A static line is just a line which may be used in a dialog to separate the groups of\ncontrols.\n\nThe line may be only vertical or horizontal. Moreover, not all ports (notably not wxGTK)\nsupport specifying the transversal direction of the line (e.g. height for a horizontal\nline) so for maximal portability you should specify it as wxDefaultCoord.","ref":"wxStaticLine.html"},{"type":"module","title":"Styles - wxStaticLine","doc":"This class supports the following styles:\n\n* wxLI_HORIZONTAL: Creates a horizontal line.\n\n* wxLI_VERTICAL: Creates a vertical line.\n\nSee: `m:wxStaticBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticLine](https://docs.wxwidgets.org/3.2/classwx_static_line.html)","ref":"wxStaticLine.html#module-styles"},{"type":"function","title":"wxStaticLine.create/2","doc":"","ref":"wxStaticLine.html#create/2"},{"type":"function","title":"wxStaticLine.create/3","doc":"Creates the static line for two-step construction.\n\nSee `new/2` for further details.","ref":"wxStaticLine.html#create/3"},{"type":"function","title":"wxStaticLine.destroy/1","doc":"Destroys the object","ref":"wxStaticLine.html#destroy/1"},{"type":"function","title":"wxStaticLine.getDefaultSize/0","doc":"This static function returns the size which will be given to the smaller dimension of the\nstatic line, i.e.\n\nits height for a horizontal line or its width for a vertical one.","ref":"wxStaticLine.html#getDefaultSize/0"},{"type":"function","title":"wxStaticLine.isVertical/1","doc":"Returns true if the line is vertical, false if horizontal.","ref":"wxStaticLine.html#isVertical/1"},{"type":"function","title":"wxStaticLine.new/0","doc":"Default constructor.","ref":"wxStaticLine.html#new/0"},{"type":"function","title":"wxStaticLine.new/1","doc":"","ref":"wxStaticLine.html#new/1"},{"type":"function","title":"wxStaticLine.new/2","doc":"Constructor, creating and showing a static line.\n\nSee: `create/3`","ref":"wxStaticLine.html#new/2"},{"type":"type","title":"wxStaticLine.wxStaticLine/0","doc":"","ref":"wxStaticLine.html#t:wxStaticLine/0"},{"type":"module","title":"wxStaticText","doc":"A static text control displays one or more lines of read-only text.\n\n`m:wxStaticText` supports the three classic text alignments, label ellipsization i.e.\nreplacing parts of the text with the ellipsis (\"...\") if the label doesn't fit into the\nprovided space and also formatting markup with `wxControl::SetLabelMarkup()` (not\nimplemented in wx).","ref":"wxStaticText.html"},{"type":"module","title":"Styles - wxStaticText","doc":"This class supports the following styles:\n\n* wxALIGN_LEFT: Align the text to the left.\n\n* wxALIGN_RIGHT: Align the text to the right.\n\n* wxALIGN_CENTRE_HORIZONTAL: Center the text (horizontally).\n\n* wxST_NO_AUTORESIZE: By default, the control will adjust its size to exactly fit to the\nsize of the text when `setLabel/2` is called. If this style flag is given, the control will not change\nits size (this style is especially useful with controls which also have the `wxALIGN_RIGHT`\nor the `wxALIGN_CENTRE_HORIZONTAL` style because otherwise they won't make sense any\nlonger after a call to `setLabel/2`).\n\n* wxST_ELLIPSIZE_START: If the labeltext width exceeds the control width, replace the\nbeginning of the label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in\nwx).\n\n* wxST_ELLIPSIZE_MIDDLE: If the label text width exceeds the control width, replace the\nmiddle of the label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in wx).\n\n* wxST_ELLIPSIZE_END: If the label text width exceeds the control width, replace the end of\nthe label with an ellipsis; uses `wxControl::Ellipsize` (not implemented in wx).\n\nSee:\n* `m:wxStaticBitmap`\n\n* `m:wxStaticBox`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStaticText](https://docs.wxwidgets.org/3.2/classwx_static_text.html)","ref":"wxStaticText.html#module-styles"},{"type":"function","title":"wxStaticText.create/4","doc":"","ref":"wxStaticText.html#create/4"},{"type":"function","title":"wxStaticText.create/5","doc":"Creation function, for two-step construction.\n\nFor details see `new/4`.","ref":"wxStaticText.html#create/5"},{"type":"function","title":"wxStaticText.destroy/1","doc":"Destroys the object","ref":"wxStaticText.html#destroy/1"},{"type":"function","title":"wxStaticText.getLabel/1","doc":"Returns the control's label, as it was passed to `wxControl:setLabel/2`.\n\nNote that the returned string may contains mnemonics (\"&\" characters) if they were passed\nto the `wxControl:setLabel/2` function; use `GetLabelText()` (not implemented in wx) if they are undesired.\n\nAlso note that the returned string is always the string which was passed to `wxControl:setLabel/2` but may be\ndifferent from the string passed to `SetLabelText()` (not implemented in wx) (since this\nlast one escapes mnemonic characters).","ref":"wxStaticText.html#getLabel/1"},{"type":"function","title":"wxStaticText.new/0","doc":"Default constructor.","ref":"wxStaticText.html#new/0"},{"type":"function","title":"wxStaticText.new/3","doc":"","ref":"wxStaticText.html#new/3"},{"type":"function","title":"wxStaticText.new/4","doc":"Constructor, creating and showing a text control.\n\nSee: `create/5`","ref":"wxStaticText.html#new/4"},{"type":"function","title":"wxStaticText.setLabel/2","doc":"Change the label shown in the control.\n\nNotice that since wxWidgets 3.1.1 this function is guaranteed not to do anything if the\nlabel didn't really change, so there is no benefit to checking if the new label is\ndifferent from the current one in the application code.\n\nSee: `wxControl:setLabel/2`","ref":"wxStaticText.html#setLabel/2"},{"type":"function","title":"wxStaticText.wrap/2","doc":"This functions wraps the controls label so that each of its lines becomes at most `width`\npixels wide if possible (the lines are broken at words boundaries so it might not be the\ncase if words are too long).\n\nIf `width` is negative, no wrapping is done. Note that this width is not necessarily the\ntotal width of the control, since a few pixels for the border (depending on the controls\nborder style) may be added.\n\nSince: 2.6.2","ref":"wxStaticText.html#wrap/2"},{"type":"type","title":"wxStaticText.wxStaticText/0","doc":"","ref":"wxStaticText.html#t:wxStaticText/0"},{"type":"module","title":"wxStatusBar","doc":"A status bar is a narrow window that can be placed along the bottom of a frame to give\nsmall amounts of status information.\n\nIt can contain one or more fields, one or more of which can be variable length according\nto the size of the window.\n\n`m:wxStatusBar` also maintains an independent stack of status texts for each field (see `pushStatusText/3`\nand `popStatusText/2`).\n\nNote that in `m:wxStatusBar` context, the terms `pane` and `field` are synonyms.","ref":"wxStatusBar.html"},{"type":"module","title":"Styles - wxStatusBar","doc":"This class supports the following styles:\n\n* wxSTB_SIZEGRIP: Displays a gripper at the right-hand side of the status bar which can be\nused to resize the parent window.\n\n* wxSTB_SHOW_TIPS: Displays tooltips for those panes whose status text has been\nellipsized/truncated because the status text doesn't fit the pane width. Note that this\nstyle has effect only on wxGTK (with GTK+ >= 2.12) currently.\n\n* wxSTB_ELLIPSIZE_START: Replace the beginning of the status texts with an ellipsis when\nthe status text widths exceed the status bar pane's widths (uses `wxControl::Ellipsize`\n(not implemented in wx)).\n\n* wxSTB_ELLIPSIZE_MIDDLE: Replace the middle of the status texts with an ellipsis when the\nstatus text widths exceed the status bar pane's widths (uses `wxControl::Ellipsize` (not\nimplemented in wx)).\n\n* wxSTB_ELLIPSIZE_END: Replace the end of the status texts with an ellipsis when the status\ntext widths exceed the status bar pane's widths (uses `wxControl::Ellipsize` (not\nimplemented in wx)).\n\n* wxSTB_DEFAULT_STYLE: The default style: includes `wxSTB_SIZEGRIP|wxSTB_SHOW_TIPS|wxSTB_ELLIPSIZE_END|wxFULL_REPAINT_ON_RESIZE`.\n\nRemark: It is possible to create controls and other windows on the status bar. Position\nthese windows from an OnSize() event handler.\n\nRemark: Notice that only the first 127 characters of a string will be shown in status bar\nfields under Windows if a proper manifest indicating that the program uses version 6 of\ncommon controls library is not used. This is a limitation of the native control on these platforms.\n\nSee:\n* `m:wxFrame`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_statbar)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStatusBar](https://docs.wxwidgets.org/3.2/classwx_status_bar.html)","ref":"wxStatusBar.html#module-styles"},{"type":"function","title":"wxStatusBar.create/2","doc":"","ref":"wxStatusBar.html#create/2"},{"type":"function","title":"wxStatusBar.create/3","doc":"Creates the window, for two-step construction.\n\nSee `new/2` for details.","ref":"wxStatusBar.html#create/3"},{"type":"function","title":"wxStatusBar.destroy/1","doc":"Destroys the object","ref":"wxStatusBar.html#destroy/1"},{"type":"function","title":"wxStatusBar.getFieldRect/2","doc":"Returns the size and position of a field's internal bounding rectangle.\n\nReturn: true if the field index is valid, false otherwise.\n\nSee: {X,Y,W,H}","ref":"wxStatusBar.html#getFieldRect/2"},{"type":"function","title":"wxStatusBar.getFieldsCount/1","doc":"Returns the number of fields in the status bar.","ref":"wxStatusBar.html#getFieldsCount/1"},{"type":"function","title":"wxStatusBar.getStatusText/1","doc":"","ref":"wxStatusBar.html#getStatusText/1"},{"type":"function","title":"wxStatusBar.getStatusText/2","doc":"Returns the string associated with a status bar field.\n\nReturn: The status field string if the field is valid, otherwise the empty string.\n\nSee: `setStatusText/3`","ref":"wxStatusBar.html#getStatusText/2"},{"type":"function","title":"wxStatusBar.new/0","doc":"Default ctor.","ref":"wxStatusBar.html#new/0"},{"type":"function","title":"wxStatusBar.new/1","doc":"","ref":"wxStatusBar.html#new/1"},{"type":"function","title":"wxStatusBar.new/2","doc":"Constructor, creating the window.\n\nSee: `create/3`","ref":"wxStatusBar.html#new/2"},{"type":"function","title":"wxStatusBar.popStatusText/1","doc":"","ref":"wxStatusBar.html#popStatusText/1"},{"type":"function","title":"wxStatusBar.popStatusText/2","doc":"Restores the text to the value it had before the last call to `pushStatusText/3`.\n\nNotice that if `setStatusText/3` had been called in the meanwhile, `popStatusText/2` will not change the text, i.e. it does\nnot override explicit changes to status text but only restores the saved text if it hadn't\nbeen changed since.\n\nSee: `pushStatusText/3`","ref":"wxStatusBar.html#popStatusText/2"},{"type":"function","title":"wxStatusBar.pushStatusText/2","doc":"","ref":"wxStatusBar.html#pushStatusText/2"},{"type":"function","title":"wxStatusBar.pushStatusText/3","doc":"Saves the current field text in a per-field stack, and sets the field text to the string\npassed as argument.\n\nSee: `popStatusText/2`","ref":"wxStatusBar.html#pushStatusText/3"},{"type":"function","title":"wxStatusBar.setFieldsCount/2","doc":"","ref":"wxStatusBar.html#setFieldsCount/2"},{"type":"function","title":"wxStatusBar.setFieldsCount/3","doc":"Sets the number of fields, and optionally the field widths.","ref":"wxStatusBar.html#setFieldsCount/3"},{"type":"function","title":"wxStatusBar.setMinHeight/2","doc":"Sets the minimal possible height for the status bar.\n\nThe real height may be bigger than the height specified here depending on the size of the\nfont used by the status bar.","ref":"wxStatusBar.html#setMinHeight/2"},{"type":"function","title":"wxStatusBar.setStatusStyles/2","doc":"Sets the styles of the fields in the status line which can make fields appear flat or\nraised instead of the standard sunken 3D border.","ref":"wxStatusBar.html#setStatusStyles/2"},{"type":"function","title":"wxStatusBar.setStatusText/2","doc":"","ref":"wxStatusBar.html#setStatusText/2"},{"type":"function","title":"wxStatusBar.setStatusText/3","doc":"Sets the status text for the `i-th` field.\n\nThe given text will replace the current text. The display of the status bar is updated\nimmediately, so there is no need to call `wxWindow:update/1` after calling this function.\n\nNote that if `pushStatusText/3` had been called before the new text will also replace the last saved value\nto make sure that the next call to `popStatusText/2` doesn't restore the old value, which was overwritten\nby the call to this function.\n\nSee:\n* `getStatusText/2`\n\n* `wxFrame:setStatusText/3`","ref":"wxStatusBar.html#setStatusText/3"},{"type":"function","title":"wxStatusBar.setStatusWidths/2","doc":"Sets the widths of the fields in the status line.\n\nThere are two types of fields: `fixed` widths and `variable` width fields. For the fixed\nwidth fields you should specify their (constant) width in pixels. For the variable width\nfields, specify a negative number which indicates how the field should expand: the space\nleft for all variable width fields is divided between them according to the absolute value\nof this number. A variable width field with width of -2 gets twice as much of it as a\nfield with width -1 and so on.\n\nFor example, to create one fixed width field of width 100 in the right part of the status\nbar and two more fields which get 66% and 33% of the remaining space correspondingly, you\nshould use an array containing -2, -1 and 100.\n\nRemark: The widths of the variable fields are calculated from the total width of all\nfields, minus the sum of widths of the non-variable fields, divided by the number of\nvariable fields.\n\nSee:\n* `setFieldsCount/3`\n\n* `wxFrame:setStatusWidths/2`","ref":"wxStatusBar.html#setStatusWidths/2"},{"type":"type","title":"wxStatusBar.wxStatusBar/0","doc":"","ref":"wxStatusBar.html#t:wxStatusBar/0"},{"type":"module","title":"wxStdDialogButtonSizer","doc":"This class creates button layouts which conform to the standard button spacing and\nordering defined by the platform or toolkit's user interface guidelines (if such things\nexist).\n\nBy using this class, you can ensure that all your standard dialogs look correct on all\nmajor platforms. Currently it conforms to the Windows, GTK+ and macOS human interface guidelines.\n\nWhen there aren't interface guidelines defined for a particular platform or toolkit, `m:wxStdDialogButtonSizer`\nreverts to the Windows implementation.\n\nTo use this class, first add buttons to the sizer by calling `addButton/2` (or `setAffirmativeButton/2`, `setNegativeButton/2` or `setCancelButton/2`) and then call\nRealize in order to create the actual button layout used. Other than these special\noperations, this sizer works like any other sizer.\n\nIf you add a button with wxID_SAVE, on macOS the button will be renamed to \"Save\" and the\nwxID_NO button will be renamed to \"Don't Save\" in accordance with the macOS Human\nInterface Guidelines.\n\nSee:\n* `m:wxSizer`\n\n* [Overview sizer](https://docs.wxwidgets.org/3.2/overview_sizer.html#overview_sizer)\n\n* `wxDialog:createButtonSizer/2`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBoxSizer`\n\n* `m:wxSizer`\n\nwxWidgets docs: [wxStdDialogButtonSizer](https://docs.wxwidgets.org/3.2/classwx_std_dialog_button_sizer.html)","ref":"wxStdDialogButtonSizer.html"},{"type":"function","title":"wxStdDialogButtonSizer.addButton/2","doc":"Adds a button to the `m:wxStdDialogButtonSizer`.\n\nThe `button` must have one of the following identifiers:\n\n* wxID_OK\n\n* wxID_YES\n\n* wxID_SAVE\n\n* wxID_APPLY\n\n* wxID_CLOSE\n\n* wxID_NO\n\n* wxID_CANCEL\n\n* wxID_HELP\n\n* wxID_CONTEXT_HELP","ref":"wxStdDialogButtonSizer.html#addButton/2"},{"type":"function","title":"wxStdDialogButtonSizer.destroy/1","doc":"Destroys the object","ref":"wxStdDialogButtonSizer.html#destroy/1"},{"type":"function","title":"wxStdDialogButtonSizer.new/0","doc":"Constructor for a `m:wxStdDialogButtonSizer`.","ref":"wxStdDialogButtonSizer.html#new/0"},{"type":"function","title":"wxStdDialogButtonSizer.realize/1","doc":"Rearranges the buttons and applies proper spacing between buttons to make them match the\nplatform or toolkit's interface guidelines.","ref":"wxStdDialogButtonSizer.html#realize/1"},{"type":"function","title":"wxStdDialogButtonSizer.setAffirmativeButton/2","doc":"Sets the affirmative button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","ref":"wxStdDialogButtonSizer.html#setAffirmativeButton/2"},{"type":"function","title":"wxStdDialogButtonSizer.setCancelButton/2","doc":"Sets the cancel button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","ref":"wxStdDialogButtonSizer.html#setCancelButton/2"},{"type":"function","title":"wxStdDialogButtonSizer.setNegativeButton/2","doc":"Sets the negative button for the sizer.\n\nThis allows you to use identifiers other than the standard identifiers outlined above.","ref":"wxStdDialogButtonSizer.html#setNegativeButton/2"},{"type":"type","title":"wxStdDialogButtonSizer.wxStdDialogButtonSizer/0","doc":"","ref":"wxStdDialogButtonSizer.html#t:wxStdDialogButtonSizer/0"},{"type":"module","title":"wxStyledTextCtrl","doc":"A wxWidgets implementation of the Scintilla source code editing component.\n\nAs well as features found in standard text editing components, Scintilla includes\nfeatures especially useful when editing and debugging source code. These include support\nfor syntax styling, error indicators, code completion and call tips.\n\nThe selection margin can contain markers like those used in debuggers to indicate\nbreakpoints and the current line. Styling choices are more open than with many editors,\nallowing the use of proportional fonts, bold and italics, multiple foreground and\nbackground colours and multiple fonts.\n\n`m:wxStyledTextCtrl` is a 1 to 1 mapping of \"raw\" scintilla interface, whose\ndocumentation can be found in the Scintilla website ([http://www.scintilla.org/](http://www.scintilla.org/)).\n\nPlease see `m:wxStyledTextEvent` for the documentation of all event types you can use\nwith `m:wxStyledTextCtrl`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxStyledTextCtrl](https://docs.wxwidgets.org/3.2/classwx_styled_text_ctrl.html)","ref":"wxStyledTextCtrl.html"},{"type":"function","title":"wxStyledTextCtrl.addText/2","doc":"Add text to the document at current position.","ref":"wxStyledTextCtrl.html#addText/2"},{"type":"function","title":"wxStyledTextCtrl.addTextRaw/2","doc":"","ref":"wxStyledTextCtrl.html#addTextRaw/2"},{"type":"function","title":"wxStyledTextCtrl.addTextRaw/3","doc":"Add text to the document at current position.","ref":"wxStyledTextCtrl.html#addTextRaw/3"},{"type":"function","title":"wxStyledTextCtrl.allocate/2","doc":"Enlarge the document to a particular size of text bytes.","ref":"wxStyledTextCtrl.html#allocate/2"},{"type":"function","title":"wxStyledTextCtrl.appendText/2","doc":"Append a string to the end of the document without changing the selection.","ref":"wxStyledTextCtrl.html#appendText/2"},{"type":"function","title":"wxStyledTextCtrl.appendTextRaw/2","doc":"","ref":"wxStyledTextCtrl.html#appendTextRaw/2"},{"type":"function","title":"wxStyledTextCtrl.appendTextRaw/3","doc":"Append a string to the end of the document without changing the selection.","ref":"wxStyledTextCtrl.html#appendTextRaw/3"},{"type":"function","title":"wxStyledTextCtrl.autoCompActive/1","doc":"Is there an auto-completion list visible?","ref":"wxStyledTextCtrl.html#autoCompActive/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompCancel/1","doc":"Remove the auto-completion list from the screen.","ref":"wxStyledTextCtrl.html#autoCompCancel/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompComplete/1","doc":"User has selected an item so remove the list and insert the selection.","ref":"wxStyledTextCtrl.html#autoCompComplete/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetAutoHide/1","doc":"Retrieve whether or not autocompletion is hidden automatically when nothing matches.","ref":"wxStyledTextCtrl.html#autoCompGetAutoHide/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetCancelAtStart/1","doc":"Retrieve whether auto-completion cancelled by backspacing before start.","ref":"wxStyledTextCtrl.html#autoCompGetCancelAtStart/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetChooseSingle/1","doc":"Retrieve whether a single item auto-completion list automatically choose the item.","ref":"wxStyledTextCtrl.html#autoCompGetChooseSingle/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetCurrent/1","doc":"Get currently selected item position in the auto-completion list.","ref":"wxStyledTextCtrl.html#autoCompGetCurrent/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetDropRestOfWord/1","doc":"Retrieve whether or not autocompletion deletes any word characters after the inserted\ntext upon completion.","ref":"wxStyledTextCtrl.html#autoCompGetDropRestOfWord/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetIgnoreCase/1","doc":"Retrieve state of ignore case flag.","ref":"wxStyledTextCtrl.html#autoCompGetIgnoreCase/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetMaxHeight/1","doc":"Set the maximum height, in rows, of auto-completion and user lists.","ref":"wxStyledTextCtrl.html#autoCompGetMaxHeight/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetMaxWidth/1","doc":"Get the maximum width, in characters, of auto-completion and user lists.","ref":"wxStyledTextCtrl.html#autoCompGetMaxWidth/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetSeparator/1","doc":"Retrieve the auto-completion list separator character.","ref":"wxStyledTextCtrl.html#autoCompGetSeparator/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompGetTypeSeparator/1","doc":"Retrieve the auto-completion list type-separator character.","ref":"wxStyledTextCtrl.html#autoCompGetTypeSeparator/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompPosStart/1","doc":"Retrieve the position of the caret when the auto-completion list was displayed.","ref":"wxStyledTextCtrl.html#autoCompPosStart/1"},{"type":"function","title":"wxStyledTextCtrl.autoCompSelect/2","doc":"Select the item in the auto-completion list that starts with a string.","ref":"wxStyledTextCtrl.html#autoCompSelect/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetAutoHide/2","doc":"Set whether or not autocompletion is hidden automatically when nothing matches.","ref":"wxStyledTextCtrl.html#autoCompSetAutoHide/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetCancelAtStart/2","doc":"Should the auto-completion list be cancelled if the user backspaces to a position before\nwhere the box was created.","ref":"wxStyledTextCtrl.html#autoCompSetCancelAtStart/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetChooseSingle/2","doc":"Should a single item auto-completion list automatically choose the item.","ref":"wxStyledTextCtrl.html#autoCompSetChooseSingle/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetDropRestOfWord/2","doc":"Set whether or not autocompletion deletes any word characters after the inserted text\nupon completion.","ref":"wxStyledTextCtrl.html#autoCompSetDropRestOfWord/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetFillUps/2","doc":"Define a set of characters that when typed will cause the autocompletion to choose the\nselected item.","ref":"wxStyledTextCtrl.html#autoCompSetFillUps/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetIgnoreCase/2","doc":"Set whether case is significant when performing auto-completion searches.","ref":"wxStyledTextCtrl.html#autoCompSetIgnoreCase/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetMaxHeight/2","doc":"Set the maximum height, in rows, of auto-completion and user lists.\n\nThe default is 5 rows.","ref":"wxStyledTextCtrl.html#autoCompSetMaxHeight/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetMaxWidth/2","doc":"Set the maximum width, in characters, of auto-completion and user lists.\n\nSet to 0 to autosize to fit longest item, which is the default.","ref":"wxStyledTextCtrl.html#autoCompSetMaxWidth/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetSeparator/2","doc":"Change the separator character in the string setting up an auto-completion list.\n\nDefault is space but can be changed if items contain space.","ref":"wxStyledTextCtrl.html#autoCompSetSeparator/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompSetTypeSeparator/2","doc":"Change the type-separator character in the string setting up an auto-completion list.\n\nDefault is '?' but can be changed if items contain '?'.","ref":"wxStyledTextCtrl.html#autoCompSetTypeSeparator/2"},{"type":"function","title":"wxStyledTextCtrl.autoCompShow/3","doc":"Display a auto-completion list.\n\nThe lengthEntered parameter indicates how many characters before the caret should be used\nto provide context.","ref":"wxStyledTextCtrl.html#autoCompShow/3"},{"type":"function","title":"wxStyledTextCtrl.autoCompStops/2","doc":"Define a set of character that when typed cancel the auto-completion list.","ref":"wxStyledTextCtrl.html#autoCompStops/2"},{"type":"function","title":"wxStyledTextCtrl.backTab/1","doc":"Dedent the selected lines.","ref":"wxStyledTextCtrl.html#backTab/1"},{"type":"function","title":"wxStyledTextCtrl.beginUndoAction/1","doc":"Start a sequence of actions that is undone and redone as a unit.\n\nMay be nested.","ref":"wxStyledTextCtrl.html#beginUndoAction/1"},{"type":"function","title":"wxStyledTextCtrl.braceBadLight/2","doc":"Highlight the character at a position indicating there is no matching brace.","ref":"wxStyledTextCtrl.html#braceBadLight/2"},{"type":"function","title":"wxStyledTextCtrl.braceHighlight/3","doc":"Highlight the characters at two positions.","ref":"wxStyledTextCtrl.html#braceHighlight/3"},{"type":"function","title":"wxStyledTextCtrl.braceMatch/2","doc":"Find the position of a matching brace or wxSTC_INVALID_POSITION if no match.","ref":"wxStyledTextCtrl.html#braceMatch/2"},{"type":"function","title":"wxStyledTextCtrl.callTipActive/1","doc":"Is there an active call tip?","ref":"wxStyledTextCtrl.html#callTipActive/1"},{"type":"function","title":"wxStyledTextCtrl.callTipCancel/1","doc":"Remove the call tip from the screen.","ref":"wxStyledTextCtrl.html#callTipCancel/1"},{"type":"function","title":"wxStyledTextCtrl.callTipPosAtStart/1","doc":"Retrieve the position where the caret was before displaying the call tip.\n\nSince: 3.1.0","ref":"wxStyledTextCtrl.html#callTipPosAtStart/1"},{"type":"function","title":"wxStyledTextCtrl.callTipSetBackground/2","doc":"Set the background colour for the call tip.","ref":"wxStyledTextCtrl.html#callTipSetBackground/2"},{"type":"function","title":"wxStyledTextCtrl.callTipSetForeground/2","doc":"Set the foreground colour for the call tip.","ref":"wxStyledTextCtrl.html#callTipSetForeground/2"},{"type":"function","title":"wxStyledTextCtrl.callTipSetForegroundHighlight/2","doc":"Set the foreground colour for the highlighted part of the call tip.","ref":"wxStyledTextCtrl.html#callTipSetForegroundHighlight/2"},{"type":"function","title":"wxStyledTextCtrl.callTipSetHighlight/3","doc":"Highlight a segment of the definition.","ref":"wxStyledTextCtrl.html#callTipSetHighlight/3"},{"type":"function","title":"wxStyledTextCtrl.callTipShow/3","doc":"Show a call tip containing a definition near position pos.","ref":"wxStyledTextCtrl.html#callTipShow/3"},{"type":"function","title":"wxStyledTextCtrl.callTipUseStyle/2","doc":"Enable use of wxSTC_STYLE_CALLTIP and set call tip tab size in pixels.","ref":"wxStyledTextCtrl.html#callTipUseStyle/2"},{"type":"function","title":"wxStyledTextCtrl.cancel/1","doc":"Cancel any modes such as call tip or auto-completion list display.","ref":"wxStyledTextCtrl.html#cancel/1"},{"type":"function","title":"wxStyledTextCtrl.canPaste/1","doc":"Will a paste succeed?","ref":"wxStyledTextCtrl.html#canPaste/1"},{"type":"function","title":"wxStyledTextCtrl.canRedo/1","doc":"Are there any redoable actions in the undo history?","ref":"wxStyledTextCtrl.html#canRedo/1"},{"type":"function","title":"wxStyledTextCtrl.canUndo/1","doc":"Are there any undoable actions in the undo history?","ref":"wxStyledTextCtrl.html#canUndo/1"},{"type":"function","title":"wxStyledTextCtrl.charLeft/1","doc":"Move caret left one character.","ref":"wxStyledTextCtrl.html#charLeft/1"},{"type":"function","title":"wxStyledTextCtrl.charLeftExtend/1","doc":"Move caret left one character extending selection to new caret position.","ref":"wxStyledTextCtrl.html#charLeftExtend/1"},{"type":"function","title":"wxStyledTextCtrl.charLeftRectExtend/1","doc":"Move caret left one character, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#charLeftRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.charRight/1","doc":"Move caret right one character.","ref":"wxStyledTextCtrl.html#charRight/1"},{"type":"function","title":"wxStyledTextCtrl.charRightExtend/1","doc":"Move caret right one character extending selection to new caret position.","ref":"wxStyledTextCtrl.html#charRightExtend/1"},{"type":"function","title":"wxStyledTextCtrl.charRightRectExtend/1","doc":"Move caret right one character, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#charRightRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.chooseCaretX/1","doc":"Set the last x chosen value to be the caret x position.","ref":"wxStyledTextCtrl.html#chooseCaretX/1"},{"type":"function","title":"wxStyledTextCtrl.clear/1","doc":"Clear the selection.","ref":"wxStyledTextCtrl.html#clear/1"},{"type":"function","title":"wxStyledTextCtrl.clearAll/1","doc":"Delete all text in the document.","ref":"wxStyledTextCtrl.html#clearAll/1"},{"type":"function","title":"wxStyledTextCtrl.clearDocumentStyle/1","doc":"Set all style bytes to 0, remove all folding information.","ref":"wxStyledTextCtrl.html#clearDocumentStyle/1"},{"type":"function","title":"wxStyledTextCtrl.clearRegisteredImages/1","doc":"Clear all the registered images.","ref":"wxStyledTextCtrl.html#clearRegisteredImages/1"},{"type":"function","title":"wxStyledTextCtrl.cmdKeyAssign/4","doc":"When key+modifier combination keyDefinition is pressed perform sciCommand.\n\nThe second argument should be a bit list containing one or more of the ?wxSTC\\_KEYMOD\\_\\*\nconstants and the third argument should be one of the ?wxSTC\\_CMD\\_\\* constants.","ref":"wxStyledTextCtrl.html#cmdKeyAssign/4"},{"type":"function","title":"wxStyledTextCtrl.cmdKeyClear/3","doc":"When key+modifier combination keyDefinition is pressed do nothing.\n\nThe second argument should be a bit list containing one or more of the ?wxSTC\\_KEYMOD\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#cmdKeyClear/3"},{"type":"function","title":"wxStyledTextCtrl.cmdKeyClearAll/1","doc":"Drop all key mappings.","ref":"wxStyledTextCtrl.html#cmdKeyClearAll/1"},{"type":"function","title":"wxStyledTextCtrl.cmdKeyExecute/2","doc":"Perform one of the operations defined by the wxSTC_CMD_* constants.","ref":"wxStyledTextCtrl.html#cmdKeyExecute/2"},{"type":"function","title":"wxStyledTextCtrl.colourise/3","doc":"Colourise a segment of the document using the current lexing language.","ref":"wxStyledTextCtrl.html#colourise/3"},{"type":"function","title":"wxStyledTextCtrl.convertEOLs/2","doc":"Convert all line endings in the document to one mode.","ref":"wxStyledTextCtrl.html#convertEOLs/2"},{"type":"function","title":"wxStyledTextCtrl.copy/1","doc":"Copy the selection to the clipboard.","ref":"wxStyledTextCtrl.html#copy/1"},{"type":"function","title":"wxStyledTextCtrl.copyRange/3","doc":"Copy a range of text to the clipboard.\n\nPositions are clipped into the document.","ref":"wxStyledTextCtrl.html#copyRange/3"},{"type":"function","title":"wxStyledTextCtrl.copyText/3","doc":"Copy argument text to the clipboard.","ref":"wxStyledTextCtrl.html#copyText/3"},{"type":"function","title":"wxStyledTextCtrl.create/2","doc":"","ref":"wxStyledTextCtrl.html#create/2"},{"type":"function","title":"wxStyledTextCtrl.create/3","doc":"Create the UI elements for a STC that was created with the default ctor.\n\n(For 2-phase create.)","ref":"wxStyledTextCtrl.html#create/3"},{"type":"function","title":"wxStyledTextCtrl.cut/1","doc":"Cut the selection to the clipboard.","ref":"wxStyledTextCtrl.html#cut/1"},{"type":"function","title":"wxStyledTextCtrl.deleteBack/1","doc":"Delete the selection or if no selection, the character before the caret.","ref":"wxStyledTextCtrl.html#deleteBack/1"},{"type":"function","title":"wxStyledTextCtrl.deleteBackNotLine/1","doc":"Delete the selection or if no selection, the character before the caret.\n\nWill not delete the character before at the start of a line.","ref":"wxStyledTextCtrl.html#deleteBackNotLine/1"},{"type":"function","title":"wxStyledTextCtrl.delLineLeft/1","doc":"Delete back from the current position to the start of the line.","ref":"wxStyledTextCtrl.html#delLineLeft/1"},{"type":"function","title":"wxStyledTextCtrl.delLineRight/1","doc":"Delete forwards from the current position to the end of the line.","ref":"wxStyledTextCtrl.html#delLineRight/1"},{"type":"function","title":"wxStyledTextCtrl.delWordLeft/1","doc":"Delete the word to the left of the caret.","ref":"wxStyledTextCtrl.html#delWordLeft/1"},{"type":"function","title":"wxStyledTextCtrl.delWordRight/1","doc":"Delete the word to the right of the caret.","ref":"wxStyledTextCtrl.html#delWordRight/1"},{"type":"function","title":"wxStyledTextCtrl.destroy/1","doc":"Destroys the object","ref":"wxStyledTextCtrl.html#destroy/1"},{"type":"function","title":"wxStyledTextCtrl.docLineFromVisible/2","doc":"Find the document line of a display line taking hidden lines into account.","ref":"wxStyledTextCtrl.html#docLineFromVisible/2"},{"type":"function","title":"wxStyledTextCtrl.documentEnd/1","doc":"Move caret to last position in document.","ref":"wxStyledTextCtrl.html#documentEnd/1"},{"type":"function","title":"wxStyledTextCtrl.documentEndExtend/1","doc":"Move caret to last position in document extending selection to new caret position.","ref":"wxStyledTextCtrl.html#documentEndExtend/1"},{"type":"function","title":"wxStyledTextCtrl.documentStart/1","doc":"Move caret to first position in document.","ref":"wxStyledTextCtrl.html#documentStart/1"},{"type":"function","title":"wxStyledTextCtrl.documentStartExtend/1","doc":"Move caret to first position in document extending selection to new caret position.","ref":"wxStyledTextCtrl.html#documentStartExtend/1"},{"type":"function","title":"wxStyledTextCtrl.doDragOver/4","doc":"Allow for simulating a DnD DragOver.","ref":"wxStyledTextCtrl.html#doDragOver/4"},{"type":"function","title":"wxStyledTextCtrl.doDropText/4","doc":"Allow for simulating a DnD DropText.","ref":"wxStyledTextCtrl.html#doDropText/4"},{"type":"function","title":"wxStyledTextCtrl.editToggleOvertype/1","doc":"Switch from insert to overtype mode or the reverse.","ref":"wxStyledTextCtrl.html#editToggleOvertype/1"},{"type":"function","title":"wxStyledTextCtrl.emptyUndoBuffer/1","doc":"Delete the undo history.","ref":"wxStyledTextCtrl.html#emptyUndoBuffer/1"},{"type":"function","title":"wxStyledTextCtrl.endUndoAction/1","doc":"End a sequence of actions that is undone and redone as a unit.","ref":"wxStyledTextCtrl.html#endUndoAction/1"},{"type":"function","title":"wxStyledTextCtrl.ensureCaretVisible/1","doc":"Ensure the caret is visible.","ref":"wxStyledTextCtrl.html#ensureCaretVisible/1"},{"type":"function","title":"wxStyledTextCtrl.ensureVisible/2","doc":"Ensure a particular line is visible by expanding any header line hiding it.","ref":"wxStyledTextCtrl.html#ensureVisible/2"},{"type":"function","title":"wxStyledTextCtrl.ensureVisibleEnforcePolicy/2","doc":"Ensure a particular line is visible by expanding any header line hiding it.\n\nUse the currently set visibility policy to determine which range to display.","ref":"wxStyledTextCtrl.html#ensureVisibleEnforcePolicy/2"},{"type":"function","title":"wxStyledTextCtrl.findColumn/3","doc":"Find the position of a column on a line taking into account tabs and multi-byte\ncharacters.\n\nIf beyond end of line, return line end position.","ref":"wxStyledTextCtrl.html#findColumn/3"},{"type":"function","title":"wxStyledTextCtrl.findText/4","doc":"","ref":"wxStyledTextCtrl.html#findText/4"},{"type":"function","title":"wxStyledTextCtrl.findText/5","doc":"` Find some text in the document. @param minPos The position (starting from zero) in the\ndocument at which to begin the search @param maxPos The last position (starting from zero)\nin the document to which the search will be restricted. @param text The text to search\nfor. @param flags (Optional) The search flags. This should be a bit list containing one or\nmore of the @link wxStyledTextCtrl::wxSTC_FIND_WHOLEWORD wxSTC_FIND_* @endlink constants. `\n\nReturn: The position (starting from zero) in the document at which the text was found or\nwxSTC_INVALID_POSITION if the search fails.\n\nRemark: A backwards search can be performed by setting minPos to be greater than maxPos.","ref":"wxStyledTextCtrl.html#findText/5"},{"type":"function","title":"wxStyledTextCtrl.formatRange/8","doc":"On Windows, will draw the document into a display context such as a printer.","ref":"wxStyledTextCtrl.html#formatRange/8"},{"type":"function","title":"wxStyledTextCtrl.formFeed/1","doc":"Insert a Form Feed character.","ref":"wxStyledTextCtrl.html#formFeed/1"},{"type":"function","title":"wxStyledTextCtrl.getAnchor/1","doc":"Returns the position of the opposite end of the selection to the caret.","ref":"wxStyledTextCtrl.html#getAnchor/1"},{"type":"function","title":"wxStyledTextCtrl.getBackSpaceUnIndents/1","doc":"Does a backspace pressed when caret is within indentation unindent?","ref":"wxStyledTextCtrl.html#getBackSpaceUnIndents/1"},{"type":"function","title":"wxStyledTextCtrl.getBufferedDraw/1","doc":"Is drawing done first into a buffer or direct to the screen?","ref":"wxStyledTextCtrl.html#getBufferedDraw/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretForeground/1","doc":"Get the foreground colour of the caret.","ref":"wxStyledTextCtrl.html#getCaretForeground/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretLineBackAlpha/1","doc":"Get the background alpha of the caret line.","ref":"wxStyledTextCtrl.html#getCaretLineBackAlpha/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretLineBackground/1","doc":"Get the colour of the background of the line containing the caret.","ref":"wxStyledTextCtrl.html#getCaretLineBackground/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretLineVisible/1","doc":"Is the background of the line containing the caret in a different colour?","ref":"wxStyledTextCtrl.html#getCaretLineVisible/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretPeriod/1","doc":"Get the time in milliseconds that the caret is on and off.","ref":"wxStyledTextCtrl.html#getCaretPeriod/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretSticky/1","doc":"Can the caret preferred x position only be changed by explicit movement commands?\n\nThe return value will be one of the ?wxSTC\\_CARETSTICKY\\_\\* constants.","ref":"wxStyledTextCtrl.html#getCaretSticky/1"},{"type":"function","title":"wxStyledTextCtrl.getCaretWidth/1","doc":"Returns the width of the insert mode caret.","ref":"wxStyledTextCtrl.html#getCaretWidth/1"},{"type":"function","title":"wxStyledTextCtrl.getCharAt/2","doc":"Returns the character byte at the position.","ref":"wxStyledTextCtrl.html#getCharAt/2"},{"type":"function","title":"wxStyledTextCtrl.getCodePage/1","doc":"Get the code page used to interpret the bytes of the document as characters.","ref":"wxStyledTextCtrl.html#getCodePage/1"},{"type":"function","title":"wxStyledTextCtrl.getColumn/2","doc":"Retrieve the column number of a position, taking tab width into account.","ref":"wxStyledTextCtrl.html#getColumn/2"},{"type":"function","title":"wxStyledTextCtrl.getControlCharSymbol/1","doc":"Get the way control characters are displayed.","ref":"wxStyledTextCtrl.html#getControlCharSymbol/1"},{"type":"function","title":"wxStyledTextCtrl.getCurLine/1","doc":"Retrieve the text of the line containing the caret.\n\nlinePos can optionally be passed in to receive the index of the caret on the line.","ref":"wxStyledTextCtrl.html#getCurLine/1"},{"type":"function","title":"wxStyledTextCtrl.getCurLineRaw/1","doc":"Retrieve the text of the line containing the caret.\n\nReturns the index of the caret on the line.","ref":"wxStyledTextCtrl.html#getCurLineRaw/1"},{"type":"function","title":"wxStyledTextCtrl.getCurrentLine/1","doc":"Returns the line number of the line with the caret.","ref":"wxStyledTextCtrl.html#getCurrentLine/1"},{"type":"function","title":"wxStyledTextCtrl.getCurrentPos/1","doc":"Returns the position of the caret.","ref":"wxStyledTextCtrl.html#getCurrentPos/1"},{"type":"function","title":"wxStyledTextCtrl.getEdgeColour/1","doc":"Retrieve the colour used in edge indication.","ref":"wxStyledTextCtrl.html#getEdgeColour/1"},{"type":"function","title":"wxStyledTextCtrl.getEdgeColumn/1","doc":"Retrieve the column number which text should be kept within.","ref":"wxStyledTextCtrl.html#getEdgeColumn/1"},{"type":"function","title":"wxStyledTextCtrl.getEdgeMode/1","doc":"Retrieve the edge highlight mode.\n\nThe return value will be one of the ?wxSTC\\_EDGE\\_\\* constants.","ref":"wxStyledTextCtrl.html#getEdgeMode/1"},{"type":"function","title":"wxStyledTextCtrl.getEndAtLastLine/1","doc":"Retrieve whether the maximum scroll position has the last line at the bottom of the view.","ref":"wxStyledTextCtrl.html#getEndAtLastLine/1"},{"type":"function","title":"wxStyledTextCtrl.getEndStyled/1","doc":"Retrieve the position of the last correctly styled character.","ref":"wxStyledTextCtrl.html#getEndStyled/1"},{"type":"function","title":"wxStyledTextCtrl.getEOLMode/1","doc":"Retrieve the current end of line mode - one of wxSTC\\_EOL\\_CRLF, wxSTC\\_EOL\\_CR, or\nwxSTC\\_EOL\\_LF.","ref":"wxStyledTextCtrl.html#getEOLMode/1"},{"type":"function","title":"wxStyledTextCtrl.getFirstVisibleLine/1","doc":"Retrieve the display line at the top of the display.","ref":"wxStyledTextCtrl.html#getFirstVisibleLine/1"},{"type":"function","title":"wxStyledTextCtrl.getFoldExpanded/2","doc":"Is a header line expanded?","ref":"wxStyledTextCtrl.html#getFoldExpanded/2"},{"type":"function","title":"wxStyledTextCtrl.getFoldLevel/2","doc":"Retrieve the fold level of a line.","ref":"wxStyledTextCtrl.html#getFoldLevel/2"},{"type":"function","title":"wxStyledTextCtrl.getFoldParent/2","doc":"Find the parent line of a child line.","ref":"wxStyledTextCtrl.html#getFoldParent/2"},{"type":"function","title":"wxStyledTextCtrl.getHighlightGuide/1","doc":"Get the highlighted indentation guide column.","ref":"wxStyledTextCtrl.html#getHighlightGuide/1"},{"type":"function","title":"wxStyledTextCtrl.getIndent/1","doc":"Retrieve indentation size.","ref":"wxStyledTextCtrl.html#getIndent/1"},{"type":"function","title":"wxStyledTextCtrl.getIndentationGuides/1","doc":"Are the indentation guides visible?\n\nThe return value will be one of the ?wxSTC\\_IV\\_\\* constants.","ref":"wxStyledTextCtrl.html#getIndentationGuides/1"},{"type":"function","title":"wxStyledTextCtrl.getLastChild/3","doc":"Find the last child line of a header line.","ref":"wxStyledTextCtrl.html#getLastChild/3"},{"type":"function","title":"wxStyledTextCtrl.getLastKeydownProcessed/1","doc":"Can be used to prevent the EVT_CHAR handler from adding the char.","ref":"wxStyledTextCtrl.html#getLastKeydownProcessed/1"},{"type":"function","title":"wxStyledTextCtrl.getLayoutCache/1","doc":"Retrieve the degree of caching of layout information.\n\nThe return value will be one of the ?wxSTC\\_CACHE\\_\\* constants.","ref":"wxStyledTextCtrl.html#getLayoutCache/1"},{"type":"function","title":"wxStyledTextCtrl.getLength/1","doc":"Returns the number of bytes in the document.","ref":"wxStyledTextCtrl.html#getLength/1"},{"type":"function","title":"wxStyledTextCtrl.getLexer/1","doc":"Retrieve the lexing language of the document.\n\nThe return value will be one of the ?wxSTC\\_LEX\\_\\* constants.","ref":"wxStyledTextCtrl.html#getLexer/1"},{"type":"function","title":"wxStyledTextCtrl.getLine/2","doc":"Retrieve the contents of a line.","ref":"wxStyledTextCtrl.html#getLine/2"},{"type":"function","title":"wxStyledTextCtrl.getLineCount/1","doc":"Returns the number of lines in the document.\n\nThere is always at least one.","ref":"wxStyledTextCtrl.html#getLineCount/1"},{"type":"function","title":"wxStyledTextCtrl.getLineEndPosition/2","doc":"Get the position after the last visible characters on a line.","ref":"wxStyledTextCtrl.html#getLineEndPosition/2"},{"type":"function","title":"wxStyledTextCtrl.getLineIndentation/2","doc":"Retrieve the number of columns that a line is indented.","ref":"wxStyledTextCtrl.html#getLineIndentation/2"},{"type":"function","title":"wxStyledTextCtrl.getLineIndentPosition/2","doc":"Retrieve the position before the first non indentation character on a line.","ref":"wxStyledTextCtrl.html#getLineIndentPosition/2"},{"type":"function","title":"wxStyledTextCtrl.getLineRaw/2","doc":"Retrieve the contents of a line.","ref":"wxStyledTextCtrl.html#getLineRaw/2"},{"type":"function","title":"wxStyledTextCtrl.getLineState/2","doc":"Retrieve the extra styling information for a line.","ref":"wxStyledTextCtrl.html#getLineState/2"},{"type":"function","title":"wxStyledTextCtrl.getLineVisible/2","doc":"Is a line visible?","ref":"wxStyledTextCtrl.html#getLineVisible/2"},{"type":"function","title":"wxStyledTextCtrl.getMarginLeft/1","doc":"Returns the size in pixels of the left margin.","ref":"wxStyledTextCtrl.html#getMarginLeft/1"},{"type":"function","title":"wxStyledTextCtrl.getMarginMask/2","doc":"Retrieve the marker mask of a margin.","ref":"wxStyledTextCtrl.html#getMarginMask/2"},{"type":"function","title":"wxStyledTextCtrl.getMarginRight/1","doc":"Returns the size in pixels of the right margin.","ref":"wxStyledTextCtrl.html#getMarginRight/1"},{"type":"function","title":"wxStyledTextCtrl.getMarginSensitive/2","doc":"Retrieve the mouse click sensitivity of a margin.","ref":"wxStyledTextCtrl.html#getMarginSensitive/2"},{"type":"function","title":"wxStyledTextCtrl.getMarginType/2","doc":"Retrieve the type of a margin.\n\nThe return value will be one of the ?wxSTC\\_MARGIN\\_\\* constants.","ref":"wxStyledTextCtrl.html#getMarginType/2"},{"type":"function","title":"wxStyledTextCtrl.getMarginWidth/2","doc":"Retrieve the width of a margin in pixels.","ref":"wxStyledTextCtrl.html#getMarginWidth/2"},{"type":"function","title":"wxStyledTextCtrl.getMaxLineState/1","doc":"Retrieve the last line number that has line state.","ref":"wxStyledTextCtrl.html#getMaxLineState/1"},{"type":"function","title":"wxStyledTextCtrl.getModEventMask/1","doc":"Get which document modification events are sent to the container.\n\nThe return value will wxSTC_MODEVENTMASKALL if all changes generate events. Otherwise it\nwill be a bit list containing one or more of the ?wxSTC\\_MOD\\_\\* constants, the\n?wxSTC\\_PERFORMED\\_\\* constants, wxSTC_STARTACTION, wxSTC_MULTILINEUNDOREDO,\nwxSTC_MULTISTEPUNDOREDO, and wxSTC_LASTSTEPINUNDOREDO.","ref":"wxStyledTextCtrl.html#getModEventMask/1"},{"type":"function","title":"wxStyledTextCtrl.getModify/1","doc":"Is the document different from when it was last saved?","ref":"wxStyledTextCtrl.html#getModify/1"},{"type":"function","title":"wxStyledTextCtrl.getMouseDownCaptures/1","doc":"Get whether mouse gets captured.","ref":"wxStyledTextCtrl.html#getMouseDownCaptures/1"},{"type":"function","title":"wxStyledTextCtrl.getMouseDwellTime/1","doc":"Retrieve the time the mouse must sit still to generate a mouse dwell event.\n\nThe return value will be a time in milliseconds or wxSTC_TIME_FOREVER.","ref":"wxStyledTextCtrl.html#getMouseDwellTime/1"},{"type":"function","title":"wxStyledTextCtrl.getOvertype/1","doc":"Returns true if overtype mode is active otherwise false is returned.","ref":"wxStyledTextCtrl.html#getOvertype/1"},{"type":"function","title":"wxStyledTextCtrl.getPasteConvertEndings/1","doc":"Get convert-on-paste setting.","ref":"wxStyledTextCtrl.html#getPasteConvertEndings/1"},{"type":"function","title":"wxStyledTextCtrl.getPrintColourMode/1","doc":"Returns the print colour mode.\n\nThe return value will be one of the ?wxSTC\\_PRINT\\_\\* constants.","ref":"wxStyledTextCtrl.html#getPrintColourMode/1"},{"type":"function","title":"wxStyledTextCtrl.getPrintMagnification/1","doc":"Returns the print magnification.","ref":"wxStyledTextCtrl.html#getPrintMagnification/1"},{"type":"function","title":"wxStyledTextCtrl.getPrintWrapMode/1","doc":"Is printing line wrapped?\n\nThe return value will be one of the ?wxSTC\\_WRAP\\_\\* constants.","ref":"wxStyledTextCtrl.html#getPrintWrapMode/1"},{"type":"function","title":"wxStyledTextCtrl.getProperty/2","doc":"Retrieve a \"property\" value previously set with SetProperty.","ref":"wxStyledTextCtrl.html#getProperty/2"},{"type":"function","title":"wxStyledTextCtrl.getReadOnly/1","doc":"In read-only mode?","ref":"wxStyledTextCtrl.html#getReadOnly/1"},{"type":"function","title":"wxStyledTextCtrl.getScrollWidth/1","doc":"Retrieve the document width assumed for scrolling.","ref":"wxStyledTextCtrl.html#getScrollWidth/1"},{"type":"function","title":"wxStyledTextCtrl.getSearchFlags/1","doc":"Get the search flags used by SearchInTarget.\n\nThe return value will be a bit list containing one or more of the ?wxSTC\\_FIND\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#getSearchFlags/1"},{"type":"function","title":"wxStyledTextCtrl.getSelAlpha/1","doc":"Get the alpha of the selection.","ref":"wxStyledTextCtrl.html#getSelAlpha/1"},{"type":"function","title":"wxStyledTextCtrl.getSelectedText/1","doc":"Retrieve the selected text.","ref":"wxStyledTextCtrl.html#getSelectedText/1"},{"type":"function","title":"wxStyledTextCtrl.getSelectedTextRaw/1","doc":"Retrieve the selected text.","ref":"wxStyledTextCtrl.html#getSelectedTextRaw/1"},{"type":"function","title":"wxStyledTextCtrl.getSelection/1","doc":"Gets the current selection span.\n\nIf the returned values are equal, there was no selection. Please note that the indices\nreturned may be used with the other `m:wxTextCtrl` methods but don't necessarily represent\nthe correct indices into the string returned by `wxComboBox:getValue/1` for multiline controls under Windows (at\nleast,) you should use `wxTextCtrl:getStringSelection/1` to get the selected text.","ref":"wxStyledTextCtrl.html#getSelection/1"},{"type":"function","title":"wxStyledTextCtrl.getSelectionEnd/1","doc":"Returns the position at the end of the selection.","ref":"wxStyledTextCtrl.html#getSelectionEnd/1"},{"type":"function","title":"wxStyledTextCtrl.getSelectionMode/1","doc":"Get the mode of the current selection.\n\nThe return value will be one of the ?wxSTC\\_SEL\\_\\* constants.","ref":"wxStyledTextCtrl.html#getSelectionMode/1"},{"type":"function","title":"wxStyledTextCtrl.getSelectionStart/1","doc":"Returns the position at the start of the selection.","ref":"wxStyledTextCtrl.html#getSelectionStart/1"},{"type":"function","title":"wxStyledTextCtrl.getSTCCursor/1","doc":"Get cursor type.\n\nThe return value will be one of the ?wxSTC\\_CURSOR\\* constants.","ref":"wxStyledTextCtrl.html#getSTCCursor/1"},{"type":"function","title":"wxStyledTextCtrl.getSTCFocus/1","doc":"Get internal focus flag.","ref":"wxStyledTextCtrl.html#getSTCFocus/1"},{"type":"function","title":"wxStyledTextCtrl.getStatus/1","doc":"Get error status.\n\nThe return value will be one of the ?wxSTC\\_STATUS\\_\\* constants.","ref":"wxStyledTextCtrl.html#getStatus/1"},{"type":"function","title":"wxStyledTextCtrl.getStyleAt/2","doc":"Returns the style byte at the position.","ref":"wxStyledTextCtrl.html#getStyleAt/2"},{"type":"function","title":"wxStyledTextCtrl.getStyleBits/1","doc":"Retrieve number of bits in style bytes used to hold the lexical state.\n\nDeprecated:","ref":"wxStyledTextCtrl.html#getStyleBits/1"},{"type":"function","title":"wxStyledTextCtrl.getStyleBitsNeeded/1","doc":"Retrieve the number of bits the current lexer needs for styling.\n\nDeprecated:","ref":"wxStyledTextCtrl.html#getStyleBitsNeeded/1"},{"type":"function","title":"wxStyledTextCtrl.getTabIndents/1","doc":"Does a tab pressed when caret is within indentation indent?","ref":"wxStyledTextCtrl.html#getTabIndents/1"},{"type":"function","title":"wxStyledTextCtrl.getTabWidth/1","doc":"Retrieve the visible size of a tab.","ref":"wxStyledTextCtrl.html#getTabWidth/1"},{"type":"function","title":"wxStyledTextCtrl.getTargetEnd/1","doc":"Get the position that ends the target.","ref":"wxStyledTextCtrl.html#getTargetEnd/1"},{"type":"function","title":"wxStyledTextCtrl.getTargetStart/1","doc":"Get the position that starts the target.","ref":"wxStyledTextCtrl.html#getTargetStart/1"},{"type":"function","title":"wxStyledTextCtrl.getText/1","doc":"Retrieve all the text in the document.","ref":"wxStyledTextCtrl.html#getText/1"},{"type":"function","title":"wxStyledTextCtrl.getTextLength/1","doc":"Retrieve the number of characters in the document.","ref":"wxStyledTextCtrl.html#getTextLength/1"},{"type":"function","title":"wxStyledTextCtrl.getTextRange/3","doc":"Retrieve a range of text.","ref":"wxStyledTextCtrl.html#getTextRange/3"},{"type":"function","title":"wxStyledTextCtrl.getTextRangeRaw/3","doc":"Retrieve a range of text.","ref":"wxStyledTextCtrl.html#getTextRangeRaw/3"},{"type":"function","title":"wxStyledTextCtrl.getTextRaw/1","doc":"Retrieve all the text in the document.","ref":"wxStyledTextCtrl.html#getTextRaw/1"},{"type":"function","title":"wxStyledTextCtrl.getTwoPhaseDraw/1","doc":"Is drawing done in two phases with backgrounds drawn before foregrounds?","ref":"wxStyledTextCtrl.html#getTwoPhaseDraw/1"},{"type":"function","title":"wxStyledTextCtrl.getUndoCollection/1","doc":"Is undo history being collected?","ref":"wxStyledTextCtrl.html#getUndoCollection/1"},{"type":"function","title":"wxStyledTextCtrl.getUseAntiAliasing/1","doc":"Returns the current UseAntiAliasing setting.","ref":"wxStyledTextCtrl.html#getUseAntiAliasing/1"},{"type":"function","title":"wxStyledTextCtrl.getUseHorizontalScrollBar/1","doc":"Is the horizontal scroll bar visible?","ref":"wxStyledTextCtrl.html#getUseHorizontalScrollBar/1"},{"type":"function","title":"wxStyledTextCtrl.getUseTabs/1","doc":"Retrieve whether tabs will be used in indentation.","ref":"wxStyledTextCtrl.html#getUseTabs/1"},{"type":"function","title":"wxStyledTextCtrl.getUseVerticalScrollBar/1","doc":"Is the vertical scroll bar visible?","ref":"wxStyledTextCtrl.html#getUseVerticalScrollBar/1"},{"type":"function","title":"wxStyledTextCtrl.getViewEOL/1","doc":"Are the end of line characters visible?","ref":"wxStyledTextCtrl.html#getViewEOL/1"},{"type":"function","title":"wxStyledTextCtrl.getViewWhiteSpace/1","doc":"Are white space characters currently visible? Returns one of wxSTC_WS_* constants.","ref":"wxStyledTextCtrl.html#getViewWhiteSpace/1"},{"type":"function","title":"wxStyledTextCtrl.getWrapMode/1","doc":"Retrieve whether text is word wrapped.\n\nThe return value will be one of the ?wxSTC\\_WRAP\\_\\* constants.","ref":"wxStyledTextCtrl.html#getWrapMode/1"},{"type":"function","title":"wxStyledTextCtrl.getWrapStartIndent/1","doc":"Retrieve the start indent for wrapped lines.","ref":"wxStyledTextCtrl.html#getWrapStartIndent/1"},{"type":"function","title":"wxStyledTextCtrl.getWrapVisualFlags/1","doc":"Retrieve the display mode of visual flags for wrapped lines.\n\nThe return value will be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAG\\_\\* constants.","ref":"wxStyledTextCtrl.html#getWrapVisualFlags/1"},{"type":"function","title":"wxStyledTextCtrl.getWrapVisualFlagsLocation/1","doc":"Retrieve the location of visual flags for wrapped lines.\n\nThe return value will be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAGLOC\\_\\* constants.","ref":"wxStyledTextCtrl.html#getWrapVisualFlagsLocation/1"},{"type":"function","title":"wxStyledTextCtrl.getXOffset/1","doc":"Get the xOffset (ie, horizontal scroll position).","ref":"wxStyledTextCtrl.html#getXOffset/1"},{"type":"function","title":"wxStyledTextCtrl.getZoom/1","doc":"Retrieve the zoom level.","ref":"wxStyledTextCtrl.html#getZoom/1"},{"type":"function","title":"wxStyledTextCtrl.gotoLine/2","doc":"Set caret to start of a line and ensure it is visible.","ref":"wxStyledTextCtrl.html#gotoLine/2"},{"type":"function","title":"wxStyledTextCtrl.gotoPos/2","doc":"Set caret to a position and ensure it is visible.","ref":"wxStyledTextCtrl.html#gotoPos/2"},{"type":"function","title":"wxStyledTextCtrl.hideLines/3","doc":"Make a range of lines invisible.","ref":"wxStyledTextCtrl.html#hideLines/3"},{"type":"function","title":"wxStyledTextCtrl.hideSelection/2","doc":"Draw the selection in normal style or with selection highlighted.","ref":"wxStyledTextCtrl.html#hideSelection/2"},{"type":"function","title":"wxStyledTextCtrl.home/1","doc":"Move caret to first position on line.","ref":"wxStyledTextCtrl.html#home/1"},{"type":"function","title":"wxStyledTextCtrl.homeDisplay/1","doc":"Move caret to first position on display line.","ref":"wxStyledTextCtrl.html#homeDisplay/1"},{"type":"function","title":"wxStyledTextCtrl.homeDisplayExtend/1","doc":"Move caret to first position on display line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#homeDisplayExtend/1"},{"type":"function","title":"wxStyledTextCtrl.homeExtend/1","doc":"Move caret to first position on line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#homeExtend/1"},{"type":"function","title":"wxStyledTextCtrl.homeRectExtend/1","doc":"Move caret to first position on line, extending rectangular selection to new caret\nposition.","ref":"wxStyledTextCtrl.html#homeRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.homeWrapExtend/1","doc":"Like HomeExtend but when word-wrap is enabled extends first to start of display line\nHomeDisplayExtend, then to start of document line HomeExtend.","ref":"wxStyledTextCtrl.html#homeWrapExtend/1"},{"type":"function","title":"wxStyledTextCtrl.indicatorGetForeground/2","doc":"Retrieve the foreground colour of an indicator.","ref":"wxStyledTextCtrl.html#indicatorGetForeground/2"},{"type":"function","title":"wxStyledTextCtrl.indicatorGetStyle/2","doc":"Retrieve the style of an indicator.\n\nThe return value will be one of the ?wxSTC\\_INDIC\\_\\* constants.","ref":"wxStyledTextCtrl.html#indicatorGetStyle/2"},{"type":"function","title":"wxStyledTextCtrl.indicatorSetForeground/3","doc":"Set the foreground colour of an indicator.","ref":"wxStyledTextCtrl.html#indicatorSetForeground/3"},{"type":"function","title":"wxStyledTextCtrl.indicatorSetStyle/3","doc":"Set an indicator to plain, squiggle or TT.\n\nThe second argument should be one of the ?wxSTC\\_INDIC\\_\\* constants.","ref":"wxStyledTextCtrl.html#indicatorSetStyle/3"},{"type":"function","title":"wxStyledTextCtrl.insertText/3","doc":"Insert string at a position.","ref":"wxStyledTextCtrl.html#insertText/3"},{"type":"function","title":"wxStyledTextCtrl.insertTextRaw/3","doc":"Insert string at a position.","ref":"wxStyledTextCtrl.html#insertTextRaw/3"},{"type":"function","title":"wxStyledTextCtrl.lineCopy/1","doc":"Copy the line containing the caret.","ref":"wxStyledTextCtrl.html#lineCopy/1"},{"type":"function","title":"wxStyledTextCtrl.lineCut/1","doc":"Cut the line containing the caret.","ref":"wxStyledTextCtrl.html#lineCut/1"},{"type":"function","title":"wxStyledTextCtrl.lineDelete/1","doc":"Delete the line containing the caret.","ref":"wxStyledTextCtrl.html#lineDelete/1"},{"type":"function","title":"wxStyledTextCtrl.lineDown/1","doc":"Move caret down one line.","ref":"wxStyledTextCtrl.html#lineDown/1"},{"type":"function","title":"wxStyledTextCtrl.lineDownExtend/1","doc":"Move caret down one line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#lineDownExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineDownRectExtend/1","doc":"Move caret down one line, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#lineDownRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineDuplicate/1","doc":"Duplicate the current line.","ref":"wxStyledTextCtrl.html#lineDuplicate/1"},{"type":"function","title":"wxStyledTextCtrl.lineEnd/1","doc":"Move caret to last position on line.","ref":"wxStyledTextCtrl.html#lineEnd/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndDisplay/1","doc":"Move caret to last position on display line.","ref":"wxStyledTextCtrl.html#lineEndDisplay/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndDisplayExtend/1","doc":"Move caret to last position on display line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#lineEndDisplayExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndExtend/1","doc":"Move caret to last position on line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#lineEndExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndRectExtend/1","doc":"Move caret to last position on line, extending rectangular selection to new caret\nposition.","ref":"wxStyledTextCtrl.html#lineEndRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndWrap/1","doc":"Like LineEnd but when word-wrap is enabled goes first to end of display line\nLineEndDisplay, then to start of document line LineEnd.","ref":"wxStyledTextCtrl.html#lineEndWrap/1"},{"type":"function","title":"wxStyledTextCtrl.lineEndWrapExtend/1","doc":"Like LineEndExtend but when word-wrap is enabled extends first to end of display line\nLineEndDisplayExtend, then to start of document line LineEndExtend.","ref":"wxStyledTextCtrl.html#lineEndWrapExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineFromPosition/2","doc":"Retrieve the line containing a position.","ref":"wxStyledTextCtrl.html#lineFromPosition/2"},{"type":"function","title":"wxStyledTextCtrl.lineLength/2","doc":"How many characters are on a line, including end of line characters?","ref":"wxStyledTextCtrl.html#lineLength/2"},{"type":"function","title":"wxStyledTextCtrl.lineScroll/3","doc":"Scroll horizontally and vertically.","ref":"wxStyledTextCtrl.html#lineScroll/3"},{"type":"function","title":"wxStyledTextCtrl.lineScrollDown/1","doc":"Scroll the document down, keeping the caret visible.","ref":"wxStyledTextCtrl.html#lineScrollDown/1"},{"type":"function","title":"wxStyledTextCtrl.lineScrollUp/1","doc":"Scroll the document up, keeping the caret visible.","ref":"wxStyledTextCtrl.html#lineScrollUp/1"},{"type":"function","title":"wxStyledTextCtrl.linesJoin/1","doc":"Join the lines in the target.","ref":"wxStyledTextCtrl.html#linesJoin/1"},{"type":"function","title":"wxStyledTextCtrl.linesOnScreen/1","doc":"Retrieves the number of lines completely visible.","ref":"wxStyledTextCtrl.html#linesOnScreen/1"},{"type":"function","title":"wxStyledTextCtrl.linesSplit/2","doc":"Split the lines in the target into lines that are less wide than pixelWidth where\npossible.","ref":"wxStyledTextCtrl.html#linesSplit/2"},{"type":"function","title":"wxStyledTextCtrl.lineTranspose/1","doc":"Switch the current line with the previous.","ref":"wxStyledTextCtrl.html#lineTranspose/1"},{"type":"function","title":"wxStyledTextCtrl.lineUp/1","doc":"Move caret up one line.","ref":"wxStyledTextCtrl.html#lineUp/1"},{"type":"function","title":"wxStyledTextCtrl.lineUpExtend/1","doc":"Move caret up one line extending selection to new caret position.","ref":"wxStyledTextCtrl.html#lineUpExtend/1"},{"type":"function","title":"wxStyledTextCtrl.lineUpRectExtend/1","doc":"Move caret up one line, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#lineUpRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.loadFile/2","doc":"Load the contents of filename into the editor.","ref":"wxStyledTextCtrl.html#loadFile/2"},{"type":"function","title":"wxStyledTextCtrl.lowerCase/1","doc":"Transform the selection to lower case.","ref":"wxStyledTextCtrl.html#lowerCase/1"},{"type":"function","title":"wxStyledTextCtrl.markerAdd/3","doc":"Add a marker to a line, returning an ID which can be used to find or delete the marker.","ref":"wxStyledTextCtrl.html#markerAdd/3"},{"type":"function","title":"wxStyledTextCtrl.markerAddSet/3","doc":"Add a set of markers to a line.","ref":"wxStyledTextCtrl.html#markerAddSet/3"},{"type":"function","title":"wxStyledTextCtrl.markerDefine/3","doc":"","ref":"wxStyledTextCtrl.html#markerDefine/3"},{"type":"function","title":"wxStyledTextCtrl.markerDefine/4","doc":"Set the symbol used for a particular marker number, and optionally the fore and\nbackground colours.\n\nThe second argument should be one of the ?wxSTC\\_MARK\\_\\* constants.","ref":"wxStyledTextCtrl.html#markerDefine/4"},{"type":"function","title":"wxStyledTextCtrl.markerDefineBitmap/3","doc":"Define a marker with a `m:wxBitmap`.","ref":"wxStyledTextCtrl.html#markerDefineBitmap/3"},{"type":"function","title":"wxStyledTextCtrl.markerDelete/3","doc":"Delete a marker from a line.","ref":"wxStyledTextCtrl.html#markerDelete/3"},{"type":"function","title":"wxStyledTextCtrl.markerDeleteAll/2","doc":"Delete all markers with a particular number from all lines.","ref":"wxStyledTextCtrl.html#markerDeleteAll/2"},{"type":"function","title":"wxStyledTextCtrl.markerDeleteHandle/2","doc":"Delete a marker.","ref":"wxStyledTextCtrl.html#markerDeleteHandle/2"},{"type":"function","title":"wxStyledTextCtrl.markerGet/2","doc":"Get a bit mask of all the markers set on a line.","ref":"wxStyledTextCtrl.html#markerGet/2"},{"type":"function","title":"wxStyledTextCtrl.markerLineFromHandle/2","doc":"Retrieve the line number at which a particular marker is located.","ref":"wxStyledTextCtrl.html#markerLineFromHandle/2"},{"type":"function","title":"wxStyledTextCtrl.markerNext/3","doc":"Find the next line at or after lineStart that includes a marker in mask.\n\nReturn -1 when no more lines.","ref":"wxStyledTextCtrl.html#markerNext/3"},{"type":"function","title":"wxStyledTextCtrl.markerPrevious/3","doc":"Find the previous line before lineStart that includes a marker in mask.","ref":"wxStyledTextCtrl.html#markerPrevious/3"},{"type":"function","title":"wxStyledTextCtrl.markerSetAlpha/3","doc":"Set the alpha used for a marker that is drawn in the text area, not the margin.","ref":"wxStyledTextCtrl.html#markerSetAlpha/3"},{"type":"function","title":"wxStyledTextCtrl.markerSetBackground/3","doc":"Set the background colour used for a particular marker number.","ref":"wxStyledTextCtrl.html#markerSetBackground/3"},{"type":"function","title":"wxStyledTextCtrl.markerSetForeground/3","doc":"Set the foreground colour used for a particular marker number.","ref":"wxStyledTextCtrl.html#markerSetForeground/3"},{"type":"function","title":"wxStyledTextCtrl.moveCaretInsideView/1","doc":"Move the caret inside current view if it's not there already.","ref":"wxStyledTextCtrl.html#moveCaretInsideView/1"},{"type":"function","title":"wxStyledTextCtrl.new/0","doc":"Default ctor.","ref":"wxStyledTextCtrl.html#new/0"},{"type":"function","title":"wxStyledTextCtrl.new/1","doc":"","ref":"wxStyledTextCtrl.html#new/1"},{"type":"function","title":"wxStyledTextCtrl.new/2","doc":"Ctor.","ref":"wxStyledTextCtrl.html#new/2"},{"type":"function","title":"wxStyledTextCtrl.newLine/1","doc":"Insert a new line, may use a CRLF, CR or LF depending on EOL mode.","ref":"wxStyledTextCtrl.html#newLine/1"},{"type":"function","title":"wxStyledTextCtrl.pageDown/1","doc":"Move caret one page down.","ref":"wxStyledTextCtrl.html#pageDown/1"},{"type":"function","title":"wxStyledTextCtrl.pageDownExtend/1","doc":"Move caret one page down extending selection to new caret position.","ref":"wxStyledTextCtrl.html#pageDownExtend/1"},{"type":"function","title":"wxStyledTextCtrl.pageDownRectExtend/1","doc":"Move caret one page down, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#pageDownRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.pageUp/1","doc":"Move caret one page up.","ref":"wxStyledTextCtrl.html#pageUp/1"},{"type":"function","title":"wxStyledTextCtrl.pageUpExtend/1","doc":"Move caret one page up extending selection to new caret position.","ref":"wxStyledTextCtrl.html#pageUpExtend/1"},{"type":"function","title":"wxStyledTextCtrl.pageUpRectExtend/1","doc":"Move caret one page up, extending rectangular selection to new caret position.","ref":"wxStyledTextCtrl.html#pageUpRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.paraDownExtend/1","doc":"Extend selection down one paragraph (delimited by empty lines).","ref":"wxStyledTextCtrl.html#paraDownExtend/1"},{"type":"function","title":"wxStyledTextCtrl.paraUp/1","doc":"Move caret up one paragraph (delimited by empty lines).","ref":"wxStyledTextCtrl.html#paraUp/1"},{"type":"function","title":"wxStyledTextCtrl.paraUpExtend/1","doc":"Extend selection up one paragraph (delimited by empty lines).","ref":"wxStyledTextCtrl.html#paraUpExtend/1"},{"type":"function","title":"wxStyledTextCtrl.paste/1","doc":"Paste the contents of the clipboard into the document replacing the selection.","ref":"wxStyledTextCtrl.html#paste/1"},{"type":"function","title":"wxStyledTextCtrl.pointFromPosition/2","doc":"Retrieve the point in the window where a position is displayed.","ref":"wxStyledTextCtrl.html#pointFromPosition/2"},{"type":"function","title":"wxStyledTextCtrl.positionAfter/2","doc":"Given a valid document position, return the next position taking code page into account.\n\nMaximum value returned is the last position in the document.","ref":"wxStyledTextCtrl.html#positionAfter/2"},{"type":"function","title":"wxStyledTextCtrl.positionBefore/2","doc":"Given a valid document position, return the previous position taking code page into\naccount.\n\nReturns 0 if passed 0.","ref":"wxStyledTextCtrl.html#positionBefore/2"},{"type":"function","title":"wxStyledTextCtrl.positionFromLine/2","doc":"Retrieve the position at the start of a line.","ref":"wxStyledTextCtrl.html#positionFromLine/2"},{"type":"function","title":"wxStyledTextCtrl.positionFromPoint/2","doc":"Find the position from a point within the window.","ref":"wxStyledTextCtrl.html#positionFromPoint/2"},{"type":"function","title":"wxStyledTextCtrl.positionFromPointClose/3","doc":"Find the position from a point within the window but return wxSTC\\_INVALID\\_POSITION if\nnot close to text.","ref":"wxStyledTextCtrl.html#positionFromPointClose/3"},{"type":"function","title":"wxStyledTextCtrl.redo/1","doc":"Redoes the next action on the undo history.","ref":"wxStyledTextCtrl.html#redo/1"},{"type":"function","title":"wxStyledTextCtrl.registerImage/3","doc":"Register an image for use in autocompletion lists.","ref":"wxStyledTextCtrl.html#registerImage/3"},{"type":"function","title":"wxStyledTextCtrl.replaceSelection/2","doc":"Replace the selected text with the argument text.","ref":"wxStyledTextCtrl.html#replaceSelection/2"},{"type":"function","title":"wxStyledTextCtrl.replaceTarget/2","doc":"Replace the target text with the argument text.\n\nText is counted so it can contain NULs. Returns the length of the replacement text.","ref":"wxStyledTextCtrl.html#replaceTarget/2"},{"type":"function","title":"wxStyledTextCtrl.saveFile/2","doc":"Write the contents of the editor to filename.","ref":"wxStyledTextCtrl.html#saveFile/2"},{"type":"function","title":"wxStyledTextCtrl.scrollToColumn/2","doc":"Scroll enough to make the given column visible.","ref":"wxStyledTextCtrl.html#scrollToColumn/2"},{"type":"function","title":"wxStyledTextCtrl.scrollToLine/2","doc":"Scroll enough to make the given line visible.","ref":"wxStyledTextCtrl.html#scrollToLine/2"},{"type":"function","title":"wxStyledTextCtrl.searchAnchor/1","doc":"Sets the current caret position to be the search anchor.","ref":"wxStyledTextCtrl.html#searchAnchor/1"},{"type":"function","title":"wxStyledTextCtrl.searchInTarget/2","doc":"Search for a counted string in the target and set the target to the found range.\n\nText is counted so it can contain NULs. Returns length of range or -1 for failure in\nwhich case target is not moved.","ref":"wxStyledTextCtrl.html#searchInTarget/2"},{"type":"function","title":"wxStyledTextCtrl.searchNext/3","doc":"Find some text starting at the search anchor.\n\nDoes not ensure the selection is visible.","ref":"wxStyledTextCtrl.html#searchNext/3"},{"type":"function","title":"wxStyledTextCtrl.searchPrev/3","doc":"Find some text starting at the search anchor and moving backwards.\n\nDoes not ensure the selection is visible.","ref":"wxStyledTextCtrl.html#searchPrev/3"},{"type":"function","title":"wxStyledTextCtrl.selectAll/1","doc":"Select all the text in the document.","ref":"wxStyledTextCtrl.html#selectAll/1"},{"type":"function","title":"wxStyledTextCtrl.selectionDuplicate/1","doc":"Duplicate the selection.\n\nIf selection empty duplicate the line containing the caret.","ref":"wxStyledTextCtrl.html#selectionDuplicate/1"},{"type":"function","title":"wxStyledTextCtrl.selectionIsRectangle/1","doc":"Is the selection rectangular? The alternative is the more common stream selection.","ref":"wxStyledTextCtrl.html#selectionIsRectangle/1"},{"type":"function","title":"wxStyledTextCtrl.setAnchor/2","doc":"Set the selection anchor to a position.\n\nThe anchor is the opposite end of the selection from the caret.","ref":"wxStyledTextCtrl.html#setAnchor/2"},{"type":"function","title":"wxStyledTextCtrl.setBackSpaceUnIndents/2","doc":"Sets whether a backspace pressed when caret is within indentation unindents.","ref":"wxStyledTextCtrl.html#setBackSpaceUnIndents/2"},{"type":"function","title":"wxStyledTextCtrl.setBufferedDraw/2","doc":"If drawing is buffered then each line of text is drawn into a bitmap buffer before\ndrawing it to the screen to avoid flicker.","ref":"wxStyledTextCtrl.html#setBufferedDraw/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretForeground/2","doc":"Set the foreground colour of the caret.","ref":"wxStyledTextCtrl.html#setCaretForeground/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretLineBackAlpha/2","doc":"Set background alpha of the caret line.","ref":"wxStyledTextCtrl.html#setCaretLineBackAlpha/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretLineBackground/2","doc":"Set the colour of the background of the line containing the caret.","ref":"wxStyledTextCtrl.html#setCaretLineBackground/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretLineVisible/2","doc":"Display the background of the line containing the caret in a different colour.","ref":"wxStyledTextCtrl.html#setCaretLineVisible/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretPeriod/2","doc":"Get the time in milliseconds that the caret is on and off.\n\n0 = steady on.","ref":"wxStyledTextCtrl.html#setCaretPeriod/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretSticky/2","doc":"Stop the caret preferred x position changing when the user types.\n\nThe input should be one of the ?wxSTC\\_CARETSTICKY\\_\\* constants.","ref":"wxStyledTextCtrl.html#setCaretSticky/2"},{"type":"function","title":"wxStyledTextCtrl.setCaretWidth/2","doc":"Set the width of the insert mode caret.","ref":"wxStyledTextCtrl.html#setCaretWidth/2"},{"type":"function","title":"wxStyledTextCtrl.setCharsDefault/1","doc":"Reset the set of characters for whitespace and word characters to the defaults.","ref":"wxStyledTextCtrl.html#setCharsDefault/1"},{"type":"function","title":"wxStyledTextCtrl.setCodePage/2","doc":"Set the code page used to interpret the bytes of the document as characters.","ref":"wxStyledTextCtrl.html#setCodePage/2"},{"type":"function","title":"wxStyledTextCtrl.setControlCharSymbol/2","doc":"Change the way control characters are displayed: If symbol is *< 32, keep the drawn way,\nelse, use the given character.","ref":"wxStyledTextCtrl.html#setControlCharSymbol/2"},{"type":"function","title":"wxStyledTextCtrl.setCurrentPos/2","doc":"Sets the position of the caret.","ref":"wxStyledTextCtrl.html#setCurrentPos/2"},{"type":"function","title":"wxStyledTextCtrl.setEdgeColour/2","doc":"Change the colour used in edge indication.","ref":"wxStyledTextCtrl.html#setEdgeColour/2"},{"type":"function","title":"wxStyledTextCtrl.setEdgeColumn/2","doc":"Set the column number of the edge.\n\nIf text goes past the edge then it is highlighted.","ref":"wxStyledTextCtrl.html#setEdgeColumn/2"},{"type":"function","title":"wxStyledTextCtrl.setEdgeMode/2","doc":"The edge may be displayed by a line (wxSTC\\_EDGE\\_LINE/wxSTC\\_EDGE\\_MULTILINE) or by\nhighlighting text that goes beyond it (wxSTC\\_EDGE\\_BACKGROUND) or not displayed at all\n(wxSTC\\_EDGE\\_NONE).\n\nThe input should be one of the ?wxSTC\\_EDGE\\_\\* constants.","ref":"wxStyledTextCtrl.html#setEdgeMode/2"},{"type":"function","title":"wxStyledTextCtrl.setEOLMode/2","doc":"Set the current end of line mode.\n\nThe input should be one of the ?wxSTC\\_EOL\\_\\* constants.","ref":"wxStyledTextCtrl.html#setEOLMode/2"},{"type":"function","title":"wxStyledTextCtrl.setFoldExpanded/3","doc":"Show the children of a header line.","ref":"wxStyledTextCtrl.html#setFoldExpanded/3"},{"type":"function","title":"wxStyledTextCtrl.setFoldFlags/2","doc":"Set some style options for folding.\n\nThe second argument should be a bit list containing one or more of the\n?wxSTC\\_FOLDFLAG\\_\\* constants.","ref":"wxStyledTextCtrl.html#setFoldFlags/2"},{"type":"function","title":"wxStyledTextCtrl.setFoldLevel/3","doc":"Set the fold level of a line.\n\nThis encodes an integer level along with flags indicating whether the line is a header\nand whether it is effectively white space.","ref":"wxStyledTextCtrl.html#setFoldLevel/3"},{"type":"function","title":"wxStyledTextCtrl.setFoldMarginColour/3","doc":"Set one of the colours used as a chequerboard pattern in the fold margin.","ref":"wxStyledTextCtrl.html#setFoldMarginColour/3"},{"type":"function","title":"wxStyledTextCtrl.setFoldMarginHiColour/3","doc":"Set the other colour used as a chequerboard pattern in the fold margin.","ref":"wxStyledTextCtrl.html#setFoldMarginHiColour/3"},{"type":"function","title":"wxStyledTextCtrl.setHighlightGuide/2","doc":"Set the highlighted indentation guide column.\n\n0 = no highlighted guide.","ref":"wxStyledTextCtrl.html#setHighlightGuide/2"},{"type":"function","title":"wxStyledTextCtrl.setHotspotActiveBackground/3","doc":"Set a back colour for active hotspots.","ref":"wxStyledTextCtrl.html#setHotspotActiveBackground/3"},{"type":"function","title":"wxStyledTextCtrl.setHotspotActiveForeground/3","doc":"Set a fore colour for active hotspots.","ref":"wxStyledTextCtrl.html#setHotspotActiveForeground/3"},{"type":"function","title":"wxStyledTextCtrl.setHotspotActiveUnderline/2","doc":"Enable / Disable underlining active hotspots.","ref":"wxStyledTextCtrl.html#setHotspotActiveUnderline/2"},{"type":"function","title":"wxStyledTextCtrl.setHotspotSingleLine/2","doc":"Limit hotspots to single line so hotspots on two lines don't merge.","ref":"wxStyledTextCtrl.html#setHotspotSingleLine/2"},{"type":"function","title":"wxStyledTextCtrl.setHScrollBar/2","doc":"Set the horizontal scrollbar to use instead of the one that's built-in.","ref":"wxStyledTextCtrl.html#setHScrollBar/2"},{"type":"function","title":"wxStyledTextCtrl.setIndent/2","doc":"Set the number of spaces used for one level of indentation.","ref":"wxStyledTextCtrl.html#setIndent/2"},{"type":"function","title":"wxStyledTextCtrl.setIndentationGuides/2","doc":"Show or hide indentation guides.\n\nThe input should be one of the ?wxSTC\\_IV\\_\\* constants.","ref":"wxStyledTextCtrl.html#setIndentationGuides/2"},{"type":"function","title":"wxStyledTextCtrl.setKeyWords/3","doc":"Set up the key words used by the lexer.","ref":"wxStyledTextCtrl.html#setKeyWords/3"},{"type":"function","title":"wxStyledTextCtrl.setLastKeydownProcessed/2","doc":"Returns the line number of the line with the caret.","ref":"wxStyledTextCtrl.html#setLastKeydownProcessed/2"},{"type":"function","title":"wxStyledTextCtrl.setLayoutCache/2","doc":"Sets the degree of caching of layout information.\n\nThe input should be one of the ?wxSTC\\_CACHE\\_\\* constants.","ref":"wxStyledTextCtrl.html#setLayoutCache/2"},{"type":"function","title":"wxStyledTextCtrl.setLexer/2","doc":"Set the lexing language of the document.\n\nThe input should be one of the ?wxSTC\\_LEX\\_\\* constants.","ref":"wxStyledTextCtrl.html#setLexer/2"},{"type":"function","title":"wxStyledTextCtrl.setLexerLanguage/2","doc":"Set the lexing language of the document based on string name.","ref":"wxStyledTextCtrl.html#setLexerLanguage/2"},{"type":"function","title":"wxStyledTextCtrl.setLineIndentation/3","doc":"Change the indentation of a line to a number of columns.","ref":"wxStyledTextCtrl.html#setLineIndentation/3"},{"type":"function","title":"wxStyledTextCtrl.setLineState/3","doc":"Used to hold extra styling information for each line.","ref":"wxStyledTextCtrl.html#setLineState/3"},{"type":"function","title":"wxStyledTextCtrl.setMarginLeft/2","doc":"Sets the size in pixels of the left margin.","ref":"wxStyledTextCtrl.html#setMarginLeft/2"},{"type":"function","title":"wxStyledTextCtrl.setMarginMask/3","doc":"Set a mask that determines which markers are displayed in a margin.","ref":"wxStyledTextCtrl.html#setMarginMask/3"},{"type":"function","title":"wxStyledTextCtrl.setMarginRight/2","doc":"Sets the size in pixels of the right margin.","ref":"wxStyledTextCtrl.html#setMarginRight/2"},{"type":"function","title":"wxStyledTextCtrl.setMarginSensitive/3","doc":"Make a margin sensitive or insensitive to mouse clicks.","ref":"wxStyledTextCtrl.html#setMarginSensitive/3"},{"type":"function","title":"wxStyledTextCtrl.setMargins/3","doc":"Set the left and right margin in the edit area, measured in pixels.","ref":"wxStyledTextCtrl.html#setMargins/3"},{"type":"function","title":"wxStyledTextCtrl.setMarginType/3","doc":"Set a margin to be either numeric or symbolic.\n\nThe second argument should be one of the ?wxSTC\\_MARGIN\\_\\* constants.","ref":"wxStyledTextCtrl.html#setMarginType/3"},{"type":"function","title":"wxStyledTextCtrl.setMarginWidth/3","doc":"Set the width of a margin to a width expressed in pixels.","ref":"wxStyledTextCtrl.html#setMarginWidth/3"},{"type":"function","title":"wxStyledTextCtrl.setModEventMask/2","doc":"Set which document modification events are sent to the container.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_MOD\\_\\* constants,\nthe ?wxSTC\\_PERFORMED\\_\\* constants, wxSTC_STARTACTION, wxSTC_MULTILINEUNDOREDO,\nwxSTC_MULTISTEPUNDOREDO, and wxSTC_LASTSTEPINUNDOREDO. The input can also be\nwxSTC_MODEVENTMASKALL to indicate that all changes should generate events.","ref":"wxStyledTextCtrl.html#setModEventMask/2"},{"type":"function","title":"wxStyledTextCtrl.setMouseDownCaptures/2","doc":"Set whether the mouse is captured when its button is pressed.","ref":"wxStyledTextCtrl.html#setMouseDownCaptures/2"},{"type":"function","title":"wxStyledTextCtrl.setMouseDwellTime/2","doc":"Sets the time the mouse must sit still to generate a mouse dwell event.\n\nThe input should be a time in milliseconds or wxSTC_TIME_FOREVER.","ref":"wxStyledTextCtrl.html#setMouseDwellTime/2"},{"type":"function","title":"wxStyledTextCtrl.setPasteConvertEndings/2","doc":"Enable/Disable convert-on-paste for line endings.","ref":"wxStyledTextCtrl.html#setPasteConvertEndings/2"},{"type":"function","title":"wxStyledTextCtrl.setPrintColourMode/2","doc":"Modify colours when printing for clearer printed text.\n\nThe input should be one of the ?wxSTC\\_PRINT\\_\\* constants.","ref":"wxStyledTextCtrl.html#setPrintColourMode/2"},{"type":"function","title":"wxStyledTextCtrl.setPrintMagnification/2","doc":"Sets the print magnification added to the point size of each style for printing.","ref":"wxStyledTextCtrl.html#setPrintMagnification/2"},{"type":"function","title":"wxStyledTextCtrl.setProperty/3","doc":"Set up a value that may be used by a lexer for some optional feature.","ref":"wxStyledTextCtrl.html#setProperty/3"},{"type":"function","title":"wxStyledTextCtrl.setReadOnly/2","doc":"Set to read only or read write.","ref":"wxStyledTextCtrl.html#setReadOnly/2"},{"type":"function","title":"wxStyledTextCtrl.setSavePoint/1","doc":"Remember the current position in the undo history as the position at which the document\nwas saved.","ref":"wxStyledTextCtrl.html#setSavePoint/1"},{"type":"function","title":"wxStyledTextCtrl.setScrollWidth/2","doc":"Sets the document width assumed for scrolling.","ref":"wxStyledTextCtrl.html#setScrollWidth/2"},{"type":"function","title":"wxStyledTextCtrl.setSearchFlags/2","doc":"Set the search flags used by SearchInTarget.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_FIND\\_\\* constants.","ref":"wxStyledTextCtrl.html#setSearchFlags/2"},{"type":"function","title":"wxStyledTextCtrl.setSelAlpha/2","doc":"Set the alpha of the selection.","ref":"wxStyledTextCtrl.html#setSelAlpha/2"},{"type":"function","title":"wxStyledTextCtrl.setSelBackground/3","doc":"Set the background colour of the main and additional selections and whether to use this\nsetting.","ref":"wxStyledTextCtrl.html#setSelBackground/3"},{"type":"function","title":"wxStyledTextCtrl.setSelection/3","doc":"Selects the text starting at the first position up to (but not including) the character\nat the last position.\n\nIf both parameters are equal to -1 all text in the control is selected.\n\nNotice that the insertion point will be moved to `from` by this function.\n\nSee: `selectAll/1`","ref":"wxStyledTextCtrl.html#setSelection/3"},{"type":"function","title":"wxStyledTextCtrl.setSelectionEnd/2","doc":"Sets the position that ends the selection - this becomes the caret.","ref":"wxStyledTextCtrl.html#setSelectionEnd/2"},{"type":"function","title":"wxStyledTextCtrl.setSelectionMode/2","doc":"Set the selection mode to stream (wxSTC\\_SEL\\_STREAM) or rectangular\n(wxSTC\\_SEL\\_RECTANGLE/wxSTC\\_SEL\\_THIN) or by lines (wxSTC\\_SEL\\_LINES).","ref":"wxStyledTextCtrl.html#setSelectionMode/2"},{"type":"function","title":"wxStyledTextCtrl.setSelectionStart/2","doc":"Sets the position that starts the selection - this becomes the anchor.","ref":"wxStyledTextCtrl.html#setSelectionStart/2"},{"type":"function","title":"wxStyledTextCtrl.setSelForeground/3","doc":"Set the foreground colour of the main and additional selections and whether to use this\nsetting.","ref":"wxStyledTextCtrl.html#setSelForeground/3"},{"type":"function","title":"wxStyledTextCtrl.setSTCCursor/2","doc":"Sets the cursor to one of the wxSTC_CURSOR* values.","ref":"wxStyledTextCtrl.html#setSTCCursor/2"},{"type":"function","title":"wxStyledTextCtrl.setSTCFocus/2","doc":"Change internal focus flag.","ref":"wxStyledTextCtrl.html#setSTCFocus/2"},{"type":"function","title":"wxStyledTextCtrl.setStatus/2","doc":"Change error status - 0 = OK.\n\nThe input should be one of the ?wxSTC\\_STATUS\\_\\* constants.","ref":"wxStyledTextCtrl.html#setStatus/2"},{"type":"function","title":"wxStyledTextCtrl.setStyleBytes/2","doc":"Set the styles for a segment of the document.","ref":"wxStyledTextCtrl.html#setStyleBytes/2"},{"type":"function","title":"wxStyledTextCtrl.setStyling/3","doc":"Change style from current styling position for length characters to a style and move the\ncurrent styling position to after this newly styled segment.","ref":"wxStyledTextCtrl.html#setStyling/3"},{"type":"function","title":"wxStyledTextCtrl.setTabIndents/2","doc":"Sets whether a tab pressed when caret is within indentation indents.","ref":"wxStyledTextCtrl.html#setTabIndents/2"},{"type":"function","title":"wxStyledTextCtrl.setTabWidth/2","doc":"Change the visible size of a tab to be a multiple of the width of a space character.","ref":"wxStyledTextCtrl.html#setTabWidth/2"},{"type":"function","title":"wxStyledTextCtrl.setTargetEnd/2","doc":"Sets the position that ends the target which is used for updating the document without\naffecting the scroll position.","ref":"wxStyledTextCtrl.html#setTargetEnd/2"},{"type":"function","title":"wxStyledTextCtrl.setTargetStart/2","doc":"Sets the position that starts the target which is used for updating the document without\naffecting the scroll position.","ref":"wxStyledTextCtrl.html#setTargetStart/2"},{"type":"function","title":"wxStyledTextCtrl.setText/2","doc":"Replace the contents of the document with the argument text.","ref":"wxStyledTextCtrl.html#setText/2"},{"type":"function","title":"wxStyledTextCtrl.setTextRaw/2","doc":"Replace the contents of the document with the argument text.","ref":"wxStyledTextCtrl.html#setTextRaw/2"},{"type":"function","title":"wxStyledTextCtrl.setTwoPhaseDraw/2","doc":"In twoPhaseDraw mode, drawing is performed in two phases, first the background and then\nthe foreground.\n\nThis avoids chopping off characters that overlap the next run.","ref":"wxStyledTextCtrl.html#setTwoPhaseDraw/2"},{"type":"function","title":"wxStyledTextCtrl.setUndoCollection/2","doc":"Choose between collecting actions into the undo history and discarding them.","ref":"wxStyledTextCtrl.html#setUndoCollection/2"},{"type":"function","title":"wxStyledTextCtrl.setUseHorizontalScrollBar/2","doc":"Show or hide the horizontal scroll bar.","ref":"wxStyledTextCtrl.html#setUseHorizontalScrollBar/2"},{"type":"function","title":"wxStyledTextCtrl.setUseTabs/2","doc":"Indentation will only use space characters if useTabs is false, otherwise it will use a\ncombination of tabs and spaces.","ref":"wxStyledTextCtrl.html#setUseTabs/2"},{"type":"function","title":"wxStyledTextCtrl.setUseVerticalScrollBar/2","doc":"Show or hide the vertical scroll bar.","ref":"wxStyledTextCtrl.html#setUseVerticalScrollBar/2"},{"type":"function","title":"wxStyledTextCtrl.setViewEOL/2","doc":"Make the end of line characters visible or invisible.","ref":"wxStyledTextCtrl.html#setViewEOL/2"},{"type":"function","title":"wxStyledTextCtrl.setViewWhiteSpace/2","doc":"Make white space characters invisible, always visible or visible outside indentation.\n\nThe input should be one of the ?wxSTC\\_WS\\_\\* constants.","ref":"wxStyledTextCtrl.html#setViewWhiteSpace/2"},{"type":"function","title":"wxStyledTextCtrl.setVisiblePolicy/3","doc":"Set the way the display area is determined when a particular line is to be moved to by\nFind, FindNext, GotoLine, etc.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_VISIBLE\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#setVisiblePolicy/3"},{"type":"function","title":"wxStyledTextCtrl.setVScrollBar/2","doc":"Set the vertical scrollbar to use instead of the one that's built-in.","ref":"wxStyledTextCtrl.html#setVScrollBar/2"},{"type":"function","title":"wxStyledTextCtrl.setWhitespaceBackground/3","doc":"Set the background colour of all whitespace and whether to use this setting.","ref":"wxStyledTextCtrl.html#setWhitespaceBackground/3"},{"type":"function","title":"wxStyledTextCtrl.setWhitespaceChars/2","doc":"Set the set of characters making up whitespace for when moving or selecting by word.\n\nShould be called after SetWordChars.","ref":"wxStyledTextCtrl.html#setWhitespaceChars/2"},{"type":"function","title":"wxStyledTextCtrl.setWhitespaceForeground/3","doc":"Set the foreground colour of all whitespace and whether to use this setting.","ref":"wxStyledTextCtrl.html#setWhitespaceForeground/3"},{"type":"function","title":"wxStyledTextCtrl.setWordChars/2","doc":"Set the set of characters making up words for when moving or selecting by word.\n\nFirst sets defaults like SetCharsDefault.","ref":"wxStyledTextCtrl.html#setWordChars/2"},{"type":"function","title":"wxStyledTextCtrl.setWrapMode/2","doc":"Sets whether text is word wrapped.\n\nThe input should be one of the ?wxSTC\\_WRAP\\_\\* constants.","ref":"wxStyledTextCtrl.html#setWrapMode/2"},{"type":"function","title":"wxStyledTextCtrl.setWrapStartIndent/2","doc":"Set the start indent for wrapped lines.","ref":"wxStyledTextCtrl.html#setWrapStartIndent/2"},{"type":"function","title":"wxStyledTextCtrl.setWrapVisualFlags/2","doc":"Set the display mode of visual flags for wrapped lines.\n\nThe input should be a bit list containing one or more of the ?wxSTC\\_WRAPVISUALFLAG\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#setWrapVisualFlags/2"},{"type":"function","title":"wxStyledTextCtrl.setWrapVisualFlagsLocation/2","doc":"Set the location of visual flags for wrapped lines.\n\nThe input should be a bit list containing one or more of the\n?wxSTC\\_WRAPVISUALFLAGLOC\\_\\* constants.","ref":"wxStyledTextCtrl.html#setWrapVisualFlagsLocation/2"},{"type":"function","title":"wxStyledTextCtrl.setXCaretPolicy/3","doc":"Set the way the caret is kept visible when going sideways.\n\nThe exclusion zone is given in pixels.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_CARET\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#setXCaretPolicy/3"},{"type":"function","title":"wxStyledTextCtrl.setYCaretPolicy/3","doc":"Set the way the line the caret is on is kept visible.\n\nThe exclusion zone is given in lines.\n\nThe first argument should be a bit list containing one or more of the ?wxSTC\\_CARET\\_\\*\nconstants.","ref":"wxStyledTextCtrl.html#setYCaretPolicy/3"},{"type":"function","title":"wxStyledTextCtrl.setZoom/2","doc":"Set the zoom level.\n\nThis number of points is added to the size of all fonts. It may be positive to magnify or\nnegative to reduce.","ref":"wxStyledTextCtrl.html#setZoom/2"},{"type":"function","title":"wxStyledTextCtrl.showLines/3","doc":"Make a range of lines visible.","ref":"wxStyledTextCtrl.html#showLines/3"},{"type":"function","title":"wxStyledTextCtrl.startRecord/1","doc":"Start notifying the container of all key presses and commands.","ref":"wxStyledTextCtrl.html#startRecord/1"},{"type":"function","title":"wxStyledTextCtrl.startStyling/2","doc":"Set the current styling position to start.","ref":"wxStyledTextCtrl.html#startStyling/2"},{"type":"function","title":"wxStyledTextCtrl.stopRecord/1","doc":"Stop notifying the container of all key presses and commands.","ref":"wxStyledTextCtrl.html#stopRecord/1"},{"type":"function","title":"wxStyledTextCtrl.stutteredPageDown/1","doc":"Move caret to bottom of page, or one page down if already at bottom of page.","ref":"wxStyledTextCtrl.html#stutteredPageDown/1"},{"type":"function","title":"wxStyledTextCtrl.stutteredPageDownExtend/1","doc":"Move caret to bottom of page, or one page down if already at bottom of page, extending\nselection to new caret position.","ref":"wxStyledTextCtrl.html#stutteredPageDownExtend/1"},{"type":"function","title":"wxStyledTextCtrl.stutteredPageUp/1","doc":"Move caret to top of page, or one page up if already at top of page.","ref":"wxStyledTextCtrl.html#stutteredPageUp/1"},{"type":"function","title":"wxStyledTextCtrl.stutteredPageUpExtend/1","doc":"Move caret to top of page, or one page up if already at top of page, extending selection\nto new caret position.","ref":"wxStyledTextCtrl.html#stutteredPageUpExtend/1"},{"type":"function","title":"wxStyledTextCtrl.styleClearAll/1","doc":"Clear all the styles and make equivalent to the global default style.","ref":"wxStyledTextCtrl.html#styleClearAll/1"},{"type":"function","title":"wxStyledTextCtrl.styleResetDefault/1","doc":"Reset the default style to its state at startup.","ref":"wxStyledTextCtrl.html#styleResetDefault/1"},{"type":"function","title":"wxStyledTextCtrl.styleSetBackground/3","doc":"Set the background colour of a style.","ref":"wxStyledTextCtrl.html#styleSetBackground/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetBold/3","doc":"Set a style to be bold or not.","ref":"wxStyledTextCtrl.html#styleSetBold/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetCase/3","doc":"Set a style to be mixed case, or to force upper or lower case.\n\nThe second argument should be one of the ?wxSTC\\_CASE\\_\\* constants.","ref":"wxStyledTextCtrl.html#styleSetCase/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetCharacterSet/3","doc":"Set the character set of the font in a style.\n\nConverts the Scintilla character set values to a wxFontEncoding.","ref":"wxStyledTextCtrl.html#styleSetCharacterSet/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetEOLFilled/3","doc":"Set a style to have its end of line filled or not.","ref":"wxStyledTextCtrl.html#styleSetEOLFilled/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetFaceName/3","doc":"Set the font of a style.","ref":"wxStyledTextCtrl.html#styleSetFaceName/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetFont/3","doc":"Set style size, face, bold, italic, and underline attributes from a `m:wxFont`'s\nattributes.","ref":"wxStyledTextCtrl.html#styleSetFont/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetFontAttr/7","doc":"","ref":"wxStyledTextCtrl.html#styleSetFontAttr/7"},{"type":"function","title":"wxStyledTextCtrl.styleSetFontAttr/8","doc":"Set all font style attributes at once.","ref":"wxStyledTextCtrl.html#styleSetFontAttr/8"},{"type":"function","title":"wxStyledTextCtrl.styleSetFontEncoding/3","doc":"Set the font encoding to be used by a style.","ref":"wxStyledTextCtrl.html#styleSetFontEncoding/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetForeground/3","doc":"Set the foreground colour of a style.","ref":"wxStyledTextCtrl.html#styleSetForeground/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetHotSpot/3","doc":"Set a style to be a hotspot or not.","ref":"wxStyledTextCtrl.html#styleSetHotSpot/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetItalic/3","doc":"Set a style to be italic or not.","ref":"wxStyledTextCtrl.html#styleSetItalic/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetSize/3","doc":"Set the size of characters of a style.","ref":"wxStyledTextCtrl.html#styleSetSize/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetSpec/3","doc":"Extract style settings from a spec-string which is composed of one or more of the\nfollowing comma separated elements:\n\nbold turns on bold italic turns on italics fore:[name or #RRGGBB] sets the foreground\ncolour back:[name or #RRGGBB] sets the background colour face:[facename] sets the font\nface name to use size:[num] sets the font size in points eol turns on eol filling\nunderline turns on underlining","ref":"wxStyledTextCtrl.html#styleSetSpec/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetUnderline/3","doc":"Set a style to be underlined or not.","ref":"wxStyledTextCtrl.html#styleSetUnderline/3"},{"type":"function","title":"wxStyledTextCtrl.styleSetVisible/3","doc":"Set a style to be visible or not.","ref":"wxStyledTextCtrl.html#styleSetVisible/3"},{"type":"function","title":"wxStyledTextCtrl.tab/1","doc":"If selection is empty or all on one line replace the selection with a tab character.\n\nIf more than one line selected, indent the lines.","ref":"wxStyledTextCtrl.html#tab/1"},{"type":"function","title":"wxStyledTextCtrl.targetFromSelection/1","doc":"Make the target range start and end be the same as the selection range start and end.","ref":"wxStyledTextCtrl.html#targetFromSelection/1"},{"type":"function","title":"wxStyledTextCtrl.textHeight/2","doc":"Retrieve the height of a particular line of text in pixels.","ref":"wxStyledTextCtrl.html#textHeight/2"},{"type":"function","title":"wxStyledTextCtrl.textWidth/3","doc":"Measure the pixel width of some text in a particular style.\n\nDoes not handle tab or control characters.","ref":"wxStyledTextCtrl.html#textWidth/3"},{"type":"function","title":"wxStyledTextCtrl.toggleCaretSticky/1","doc":"Switch between sticky and non-sticky: meant to be bound to a key.","ref":"wxStyledTextCtrl.html#toggleCaretSticky/1"},{"type":"function","title":"wxStyledTextCtrl.toggleFold/2","doc":"Switch a header line between expanded and contracted.","ref":"wxStyledTextCtrl.html#toggleFold/2"},{"type":"function","title":"wxStyledTextCtrl.undo/1","doc":"Undo one action in the undo history.","ref":"wxStyledTextCtrl.html#undo/1"},{"type":"function","title":"wxStyledTextCtrl.upperCase/1","doc":"Transform the selection to upper case.","ref":"wxStyledTextCtrl.html#upperCase/1"},{"type":"function","title":"wxStyledTextCtrl.usePopUp/2","doc":"Set whether a pop up menu is displayed automatically when the user presses the wrong\nmouse button on certain areas.\n\nThe input should be one of the ?wxSTC\\_POPUP\\_\\* constants.\n\nRemark: When `m:wxContextMenuEvent` is used to create a custom popup menu, this function\nshould be called with wxSTC_POPUP_NEVER. Otherwise the default menu will be shown instead\nof the custom one.","ref":"wxStyledTextCtrl.html#usePopUp/2"},{"type":"function","title":"wxStyledTextCtrl.userListShow/3","doc":"Display a list of strings and send notification when user chooses one.","ref":"wxStyledTextCtrl.html#userListShow/3"},{"type":"function","title":"wxStyledTextCtrl.vCHome/1","doc":"Move caret to before first visible character on line.\n\nIf already there move to first character on line.","ref":"wxStyledTextCtrl.html#vCHome/1"},{"type":"function","title":"wxStyledTextCtrl.vCHomeExtend/1","doc":"Like VCHome but extending selection to new caret position.","ref":"wxStyledTextCtrl.html#vCHomeExtend/1"},{"type":"function","title":"wxStyledTextCtrl.vCHomeRectExtend/1","doc":"Move caret to before first visible character on line.\n\nIf already there move to first character on line. In either case, extend rectangular\nselection to new caret position.","ref":"wxStyledTextCtrl.html#vCHomeRectExtend/1"},{"type":"function","title":"wxStyledTextCtrl.vCHomeWrap/1","doc":"Like VCHome but when word-wrap is enabled goes first to start of display line\nVCHomeDisplay, then behaves like VCHome.","ref":"wxStyledTextCtrl.html#vCHomeWrap/1"},{"type":"function","title":"wxStyledTextCtrl.vCHomeWrapExtend/1","doc":"Like VCHomeExtend but when word-wrap is enabled extends first to start of display line\nVCHomeDisplayExtend, then behaves like VCHomeExtend.","ref":"wxStyledTextCtrl.html#vCHomeWrapExtend/1"},{"type":"function","title":"wxStyledTextCtrl.visibleFromDocLine/2","doc":"Find the display line of a document line taking hidden lines into account.","ref":"wxStyledTextCtrl.html#visibleFromDocLine/2"},{"type":"function","title":"wxStyledTextCtrl.wordEndPosition/3","doc":"Get position of end of word.","ref":"wxStyledTextCtrl.html#wordEndPosition/3"},{"type":"function","title":"wxStyledTextCtrl.wordLeft/1","doc":"Move caret left one word.","ref":"wxStyledTextCtrl.html#wordLeft/1"},{"type":"function","title":"wxStyledTextCtrl.wordLeftEnd/1","doc":"Move caret left one word, position cursor at end of word.","ref":"wxStyledTextCtrl.html#wordLeftEnd/1"},{"type":"function","title":"wxStyledTextCtrl.wordLeftEndExtend/1","doc":"Move caret left one word, position cursor at end of word, extending selection to new\ncaret position.","ref":"wxStyledTextCtrl.html#wordLeftEndExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordLeftExtend/1","doc":"Move caret left one word extending selection to new caret position.","ref":"wxStyledTextCtrl.html#wordLeftExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordPartLeft/1","doc":"Move to the previous change in capitalisation.","ref":"wxStyledTextCtrl.html#wordPartLeft/1"},{"type":"function","title":"wxStyledTextCtrl.wordPartLeftExtend/1","doc":"Move to the previous change in capitalisation extending selection to new caret position.","ref":"wxStyledTextCtrl.html#wordPartLeftExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordPartRight/1","doc":"Move to the change next in capitalisation.","ref":"wxStyledTextCtrl.html#wordPartRight/1"},{"type":"function","title":"wxStyledTextCtrl.wordPartRightExtend/1","doc":"Move to the next change in capitalisation extending selection to new caret position.","ref":"wxStyledTextCtrl.html#wordPartRightExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordRight/1","doc":"Move caret right one word.","ref":"wxStyledTextCtrl.html#wordRight/1"},{"type":"function","title":"wxStyledTextCtrl.wordRightEnd/1","doc":"Move caret right one word, position cursor at end of word.","ref":"wxStyledTextCtrl.html#wordRightEnd/1"},{"type":"function","title":"wxStyledTextCtrl.wordRightEndExtend/1","doc":"Move caret right one word, position cursor at end of word, extending selection to new\ncaret position.","ref":"wxStyledTextCtrl.html#wordRightEndExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordRightExtend/1","doc":"Move caret right one word extending selection to new caret position.","ref":"wxStyledTextCtrl.html#wordRightExtend/1"},{"type":"function","title":"wxStyledTextCtrl.wordStartPosition/3","doc":"Get position of start of word.","ref":"wxStyledTextCtrl.html#wordStartPosition/3"},{"type":"function","title":"wxStyledTextCtrl.wrapCount/2","doc":"The number of display lines needed to wrap a document line.","ref":"wxStyledTextCtrl.html#wrapCount/2"},{"type":"function","title":"wxStyledTextCtrl.zoomIn/1","doc":"Magnify the displayed text by increasing the sizes by 1 point.","ref":"wxStyledTextCtrl.html#zoomIn/1"},{"type":"function","title":"wxStyledTextCtrl.zoomOut/1","doc":"Make the displayed text smaller by decreasing the sizes by 1 point.","ref":"wxStyledTextCtrl.html#zoomOut/1"},{"type":"type","title":"wxStyledTextCtrl.wxStyledTextCtrl/0","doc":"","ref":"wxStyledTextCtrl.html#t:wxStyledTextCtrl/0"},{"type":"module","title":"wxStyledTextEvent","doc":"The type of events sent from `m:wxStyledTextCtrl`.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxStyledTextEvent](https://docs.wxwidgets.org/3.2/classwx_styled_text_event.html)","ref":"wxStyledTextEvent.html"},{"type":"module","title":"Events - wxStyledTextEvent","doc":"Use `wxEvtHandler:connect/3` with `wxStyledTextEventType` to subscribe to events of this type.","ref":"wxStyledTextEvent.html#module-events"},{"type":"function","title":"wxStyledTextEvent.getAlt/1","doc":"Returns true if the Alt key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","ref":"wxStyledTextEvent.html#getAlt/1"},{"type":"function","title":"wxStyledTextEvent.getControl/1","doc":"Returns true if the Control key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","ref":"wxStyledTextEvent.html#getControl/1"},{"type":"function","title":"wxStyledTextEvent.getDragAllowMove/1","doc":"","ref":"wxStyledTextEvent.html#getDragAllowMove/1"},{"type":"function","title":"wxStyledTextEvent.getDragResult/1","doc":"Returns drag result for this event.\n\nThis method is valid for `wxEVT_STC_DRAG_OVER` and `wxEVT_STC_DO_DROP` events.","ref":"wxStyledTextEvent.html#getDragResult/1"},{"type":"function","title":"wxStyledTextEvent.getDragText/1","doc":"Deprecated:\n\nUse `wxCommandEvent:getString/1` instead.","ref":"wxStyledTextEvent.html#getDragText/1"},{"type":"function","title":"wxStyledTextEvent.getFoldLevelNow/1","doc":"Returns the current fold level for the line.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_CHANGEFOLD.","ref":"wxStyledTextEvent.html#getFoldLevelNow/1"},{"type":"function","title":"wxStyledTextEvent.getFoldLevelPrev/1","doc":"Returns previous fold level for the line.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_CHANGEFOLD.","ref":"wxStyledTextEvent.html#getFoldLevelPrev/1"},{"type":"function","title":"wxStyledTextEvent.getKey/1","doc":"Returns the key code of the key that generated this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_CHARADDED`\n\n* `wxEVT_STC_USERLISTSELECTION`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION`\n\n* `wxEVT_STC_AUTOCOMP_COMPLETED`","ref":"wxStyledTextEvent.html#getKey/1"},{"type":"function","title":"wxStyledTextEvent.getLength/1","doc":"Returns the length (number of characters) of this event.\n\nThis method is valid for `wxEVT_STC_MODIFIED` and `wxEVT_STC_NEEDSHOWN` events.","ref":"wxStyledTextEvent.html#getLength/1"},{"type":"function","title":"wxStyledTextEvent.getLine/1","doc":"Returns zero-based line number for this event.\n\nThis method is valid for `wxEVT_STC_DOUBLECLICK` and `wxEVT_STC_MODIFIED` events.","ref":"wxStyledTextEvent.html#getLine/1"},{"type":"function","title":"wxStyledTextEvent.getLinesAdded/1","doc":"Returns the number of lines added or deleted with this event.\n\nThis method is valid for `wxEVT_STC_MODIFIED` events when the result of `getModificationType/1` includes\n?wxSTC\\_MOD\\_INSERTTEXT or ?wxSTC\\_MOD\\_DELETETEXT.","ref":"wxStyledTextEvent.html#getLinesAdded/1"},{"type":"function","title":"wxStyledTextEvent.getListType/1","doc":"Returns the list type for this event.\n\nThe list type is an integer passed to a list when it is created with the `wxStyledTextCtrl:userListShow/3` method and can\nbe used to distinguish lists if more than one is used.\n\nThis method is valid for `wxEVT_STC_AUTOCOMP_SELECTION_CHANGE` and `wxEVT_STC_USERLISTSELECTION`\nevents.","ref":"wxStyledTextEvent.html#getListType/1"},{"type":"function","title":"wxStyledTextEvent.getLParam/1","doc":"Returns the value of the LParam field for this event.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","ref":"wxStyledTextEvent.html#getLParam/1"},{"type":"function","title":"wxStyledTextEvent.getMargin/1","doc":"Returns the zero-based index of the margin that generated this event.\n\nThis method is valid for `wxEVT_STC_MARGINCLICK` and `wxEVT_STC_MARGIN_RIGHT_CLICK`\nevents.","ref":"wxStyledTextEvent.html#getMargin/1"},{"type":"function","title":"wxStyledTextEvent.getMessage/1","doc":"Returns a message number while a macro is being recorded.\n\nMany of the `m:wxStyledTextCtrl` methods such as `wxStyledTextCtrl:insertText/3` and `wxStyledTextCtrl:paste/1` have an event number associated\nwith them. This method returns that number while a macro is being recorded so that the\nmacro can be played back later.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","ref":"wxStyledTextEvent.html#getMessage/1"},{"type":"function","title":"wxStyledTextEvent.getModificationType/1","doc":"Returns the modification type for this event.\n\nThe modification type is a bit list that describes the change that generated this event.\nIt may contain one or more of the following values:\n\n* ?wxSTC\\_MOD\\_INSERTTEXT\n\n* ?wxSTC\\_MOD\\_DELETETEXT\n\n* ?wxSTC\\_MOD\\_CHANGESTYLE\n\n* ?wxSTC\\_MOD\\_CHANGEFOLD\n\n* ?wxSTC\\_PERFORMED\\_USER\n\n* ?wxSTC\\_PERFORMED\\_UNDO\n\n* ?wxSTC\\_PERFORMED\\_REDO\n\n* ?wxSTC\\_MULTISTEPUNDOREDO\n\n* ?wxSTC\\_LASTSTEPINUNDOREDO\n\n* ?wxSTC\\_MOD\\_CHANGEMARKER\n\n* ?wxSTC\\_MOD\\_BEFOREINSERT\n\n* ?wxSTC\\_MOD\\_BEFOREDELETE\n\n* ?wxSTC\\_MULTILINEUNDOREDO\n\n* ?wxSTC\\_STARTACTION\n\n* ?wxSTC\\_MOD\\_CHANGEINDICATOR\n\n* ?wxSTC\\_MOD\\_CHANGELINESTATE\n\n* ?wxSTC\\_MOD\\_CHANGEMARGIN\n\n* ?wxSTC\\_MOD\\_CHANGEANNOTATION\n\n* ?wxSTC\\_MOD\\_CONTAINER\n\n* ?wxSTC\\_MOD\\_LEXERSTATE\n\n* ?wxSTC\\_MOD\\_INSERTCHECK\n\n* ?wxSTC\\_MOD\\_CHANGETABSTOPS\n\nThis method is valid for `wxEVT_STC_MODIFIED` events.","ref":"wxStyledTextEvent.html#getModificationType/1"},{"type":"function","title":"wxStyledTextEvent.getModifiers/1","doc":"Returns the modifiers of the key press or mouse click for this event.\n\nThe returned value is a bit list that may contain one or more of the following values:\n\n* ?wxSTC\\_KEYMOD\\_SHIFT\n\n* ?wxSTC\\_KEYMOD\\_CTRL\n\n* ?wxSTC\\_KEYMOD\\_ALT\n\n* ?wxSTC\\_KEYMOD\\_SUPER\n\n* ?wxSTC\\_KEYMOD\\_META\n\nIn addition, the value can be checked for equality with ?wxSTC\\_KEYMOD\\_NORM to test if\nno modifiers are present.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","ref":"wxStyledTextEvent.html#getModifiers/1"},{"type":"function","title":"wxStyledTextEvent.getPosition/1","doc":"Returns the zero-based text position associated this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_STYLENEEDED`\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MODIFIED`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_NEEDSHOWN`\n\n* `wxEVT_STC_USERLISTSELECTION`\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_CALLTIP_CLICK`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION`\n\n* `wxEVT_STC_AUTOCOMP_SELECTION_CHANGE`\n\n* `wxEVT_STC_AUTOCOMP_COMPLETED`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","ref":"wxStyledTextEvent.html#getPosition/1"},{"type":"function","title":"wxStyledTextEvent.getShift/1","doc":"Returns true if the Shift key is pressed.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DOUBLECLICK`\n\n* `wxEVT_STC_MARGINCLICK`\n\n* `wxEVT_STC_HOTSPOT_CLICK`\n\n* `wxEVT_STC_HOTSPOT_DCLICK`\n\n* `wxEVT_STC_HOTSPOT_RELEASE_CLICK`\n\n* `wxEVT_STC_INDICATOR_CLICK`\n\n* `wxEVT_STC_INDICATOR_RELEASE`\n\n* `wxEVT_STC_MARGIN_RIGHT_CLICK`","ref":"wxStyledTextEvent.html#getShift/1"},{"type":"function","title":"wxStyledTextEvent.getText/1","doc":"Deprecated:\n\nUse `wxCommandEvent:getString/1` instead.","ref":"wxStyledTextEvent.html#getText/1"},{"type":"function","title":"wxStyledTextEvent.getWParam/1","doc":"Returns value of the WParam field for this event.\n\nThis method is valid for `wxEVT_STC_MACRORECORD` events.","ref":"wxStyledTextEvent.html#getWParam/1"},{"type":"function","title":"wxStyledTextEvent.getX/1","doc":"Returns the X coordinate of the mouse for this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_START_DRAG`\n\n* `wxEVT_STC_DRAG_OVER`\n\n* `wxEVT_STC_DO_DROP`","ref":"wxStyledTextEvent.html#getX/1"},{"type":"function","title":"wxStyledTextEvent.getY/1","doc":"Returns the Y coordinate of the mouse for this event.\n\nThis method is valid for the following event types:\n\n* `wxEVT_STC_DWELLSTART`\n\n* `wxEVT_STC_DWELLEND`\n\n* `wxEVT_STC_START_DRAG`\n\n* `wxEVT_STC_DRAG_OVER`\n\n* `wxEVT_STC_DO_DROP`","ref":"wxStyledTextEvent.html#getY/1"},{"type":"type","title":"wxStyledTextEvent.wxStyledText/0","doc":"","ref":"wxStyledTextEvent.html#t:wxStyledText/0"},{"type":"type","title":"wxStyledTextEvent.wxStyledTextEvent/0","doc":"","ref":"wxStyledTextEvent.html#t:wxStyledTextEvent/0"},{"type":"type","title":"wxStyledTextEvent.wxStyledTextEventType/0","doc":"","ref":"wxStyledTextEvent.html#t:wxStyledTextEventType/0"},{"type":"module","title":"wxSysColourChangedEvent","doc":"This class is used for system colour change events, which are generated when the user\nchanges the colour settings using the control panel.\n\nThis is only appropriate under Windows.\n\nRemark: The default event handler for this event propagates the event to child windows,\nsince Windows only sends the events to top-level windows. If intercepting this event for a\ntop-level window, remember to call the base class handler, or to pass the event on to the\nwindow's children explicitly.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxSysColourChangedEvent](https://docs.wxwidgets.org/3.2/classwx_sys_colour_changed_event.html)","ref":"wxSysColourChangedEvent.html"},{"type":"module","title":"Events - wxSysColourChangedEvent","doc":"Use `wxEvtHandler:connect/3` with `wxSysColourChangedEventType` to subscribe to events of this type.","ref":"wxSysColourChangedEvent.html#module-events"},{"type":"type","title":"wxSysColourChangedEvent.wxSysColourChanged/0","doc":"","ref":"wxSysColourChangedEvent.html#t:wxSysColourChanged/0"},{"type":"type","title":"wxSysColourChangedEvent.wxSysColourChangedEvent/0","doc":"","ref":"wxSysColourChangedEvent.html#t:wxSysColourChangedEvent/0"},{"type":"type","title":"wxSysColourChangedEvent.wxSysColourChangedEventType/0","doc":"","ref":"wxSysColourChangedEvent.html#t:wxSysColourChangedEventType/0"},{"type":"module","title":"wxSystemOptions","doc":"`m:wxSystemOptions` stores option/value pairs that wxWidgets itself or applications can\nuse to alter behaviour at run-time.\n\nIt can be used to optimize behaviour that doesn't deserve a distinct API, but is still\nimportant to be able to configure.\n\nSystem options can be set by the program itself using `setOption/2` method and they also can be set\nfrom the program environment by defining an environment variable `wx_option` to set the\ngiven option for all wxWidgets applications or `wx_appname_option` to set it just for the\napplication with the given name (as returned by `wxApp::GetAppName()` (not implemented in\nwx)). Notice that any characters not allowed in the environment variables names, such as\nperiods and dashes, should be replaced with underscores. E.g. to define a system option\n\"foo-bar\" you need to define the environment variable \"wx_foo_bar\".\n\nThe program may use system options for its own needs but they are mostly used to control\nthe behaviour of wxWidgets library itself.\n\nThese options are currently recognised by wxWidgets:\n\nAll platforms\n\n* exit-on-assert: If set to non-zero value, abort the program if an assertion fails. The\ndefault behaviour in case of assertion failure depends on the build mode and can be\nchanged by overriding `wxApp::OnAssertFailure()` (not implemented in wx) but setting this\noption allows changing it without modifying the program code and also applies to asserts\nwhich may happen before the `wxApp` (not implemented in wx) object creation or after its\ndestruction.\n\nWindows\n\n* no-maskblt: 1 to never use WIN32's MaskBlt function, 0 to allow it to be used where\npossible. Default: 0. In some circumstances the MaskBlt function can be slower than using\nthe fallback code, especially if using DC caching. By default, MaskBlt will be used where\nit is implemented by the operating system and driver.\n\n* msw.remap: If 1 (the default), `m:wxToolBar` bitmap colours will be remapped to the\ncurrent theme's values. Set this to 0 to disable this functionality, for example if you're\nusing more than 16 colours in your tool bitmaps.\n\n* msw.window.no-clip-children: If 1, windows will not automatically get the WS_CLIPCHILDREN\nstyle. This restores the way windows are refreshed back to the method used in versions of\nwxWidgets earlier than 2.5.4, and for some complex window hierarchies it can reduce\napparent refresh delays. You may still specify wxCLIP_CHILDREN for individual windows.\n\n* msw.notebook.themed-background: If set to 0, globally disables themed backgrounds on\nnotebook pages. Note that this won't disable the theme on the actual notebook background\n(noticeable only if there are no pages).\n\n* msw.staticbox.optimized-paint: If set to 0, switches off optimized `m:wxStaticBox`\npainting. Setting this to 0 causes more flicker, but allows applications to paint graphics\non the parent of a static box (the optimized refresh causes any such drawing to\ndisappear).\n\n* msw.font.no-proof-quality: If set to 1, use default fonts quality instead of proof\nquality when creating fonts. With proof quality the fonts have slightly better appearance\nbut not all fonts are available in this quality, e.g. the Terminal font in small sizes is\nnot and this option may be used if wider fonts selection is more important than higher\nquality.\n\nGTK+\n\n* gtk.tlw.can-set-transparent: `wxTopLevelWindow::CanSetTransparent()` (not implemented in\nwx) method normally tries to detect automatically whether transparency for top level\nwindows is currently supported, however this may sometimes fail and this option allows\noverriding the automatic detection. Setting it to 1 makes the transparency be always\navailable (setting it can still fail, of course) and setting it to 0 makes it always\nunavailable.\n\n* gtk.desktop: This option can be set to override the default desktop environment\ndetermination. Supported values are GNOME and KDE.\n\n* gtk.window.force-background-colour: If 1, the backgrounds of windows with the\nwxBG_STYLE_COLOUR background style are cleared forcibly instead of relying on the\nunderlying GTK+ window colour. This works around a display problem when running\napplications under KDE with the gtk-qt theme installed (0.6 and below).\n\nMac\n\n* mac.window-plain-transition: If 1, uses a plainer transition when showing a window. You\ncan also use the symbol wxMAC_WINDOW_PLAIN_TRANSITION.\n\n* window-default-variant: The default variant used by windows (cast to integer from the\nwxWindowVariant enum). Also known as wxWINDOW_DEFAULT_VARIANT.\n\n* mac.listctrl.always_use_generic: Tells `m:wxListCtrl` to use the generic control even\nwhen it is capable of using the native control instead. Also known as\nwxMAC_ALWAYS_USE_GENERIC_LISTCTRL.\n\n* mac.textcontrol-use-spell-checker: If 1 activates the spell checking in `m:wxTextCtrl`.\n\n* osx.openfiledialog.always-show-types: Per default a `m:wxFileDialog` with wxFD_OPEN does\nnot show a types-popup on macOS but allows the selection of files from any of the\nsupported types. Setting this to 1 shows a `m:wxChoice` for selection (if there is more\nthan one supported filetype).\n\nMotif\n\n* motif.largebuttons: If 1, uses a bigger default size for wxButtons.\n\nThe compile-time option to include or exclude this functionality is wxUSE_SYSTEM_OPTIONS.\n\nSee: `m:wxSystemSettings`\n\nwxWidgets docs: [wxSystemOptions](https://docs.wxwidgets.org/3.2/classwx_system_options.html)","ref":"wxSystemOptions.html"},{"type":"function","title":"wxSystemOptions.getOption/1","doc":"Gets an option.\n\nThe function is case-insensitive to `name`. Returns empty string if the option hasn't\nbeen set.\n\nSee:\n* `setOption/2`\n\n* `getOptionInt/1`\n\n* `hasOption/1`","ref":"wxSystemOptions.html#getOption/1"},{"type":"function","title":"wxSystemOptions.getOptionInt/1","doc":"Gets an option as an integer.\n\nThe function is case-insensitive to `name`. If the option hasn't been set, this function\nreturns 0.\n\nSee:\n* `setOption/2`\n\n* `getOption/1`\n\n* `hasOption/1`","ref":"wxSystemOptions.html#getOptionInt/1"},{"type":"function","title":"wxSystemOptions.hasOption/1","doc":"Returns true if the given option is present.\n\nThe function is case-insensitive to `name`.\n\nSee:\n* `setOption/2`\n\n* `getOption/1`\n\n* `getOptionInt/1`","ref":"wxSystemOptions.html#hasOption/1"},{"type":"function","title":"wxSystemOptions.isFalse/1","doc":"Returns true if the option with the given `name` had been set to 0 value.\n\nThis is mostly useful for boolean options for which you can't use `GetOptionInt(name)` ==\n0 as this would also be true if the option hadn't been set at all.","ref":"wxSystemOptions.html#isFalse/1"},{"type":"function","title":"wxSystemOptions.setOption/2","doc":"Sets an option.\n\nThe function is case-insensitive to `name`.","ref":"wxSystemOptions.html#setOption/2"},{"type":"type","title":"wxSystemOptions.wxSystemOptions/0","doc":"","ref":"wxSystemOptions.html#t:wxSystemOptions/0"},{"type":"module","title":"wxSystemSettings","doc":"`m:wxSystemSettings` allows the application to ask for details about the system.\n\nThis can include settings such as standard colours, fonts, and user interface element sizes.\n\nSee:\n* `m:wxFont`\n\n* `wx_color()`\n\n* `m:wxSystemOptions`\n\nwxWidgets docs: [wxSystemSettings](https://docs.wxwidgets.org/3.2/classwx_system_settings.html)","ref":"wxSystemSettings.html"},{"type":"function","title":"wxSystemSettings.getColour/1","doc":"Returns a system colour.\n\nReturn: The returned colour is always valid.","ref":"wxSystemSettings.html#getColour/1"},{"type":"function","title":"wxSystemSettings.getFont/1","doc":"Returns a system font.\n\nReturn: The returned font is always valid.","ref":"wxSystemSettings.html#getFont/1"},{"type":"function","title":"wxSystemSettings.getMetric/1","doc":"","ref":"wxSystemSettings.html#getMetric/1"},{"type":"function","title":"wxSystemSettings.getMetric/2","doc":"Returns the value of a system metric, or -1 if the metric is not supported on the current\nsystem.\n\nThe value of `win` determines if the metric returned is a global value or a `m:wxWindow`\nbased value, in which case it might determine the widget, the display the window is on, or\nsomething similar. The window given should be as close to the metric as possible (e.g. a `m:wxTopLevelWindow`\nin case of the wxSYS_CAPTION_Y metric).\n\n`index` can be one of the ?wxSystemMetric enum values.\n\n`win` is a pointer to the window for which the metric is requested. Specifying the `win`\nparameter is encouraged, because some metrics on some ports are not supported without\none,or they might be capable of reporting better values if given one. If a window does not\nmake sense for a metric, one should still be given, as for example it might determine\nwhich displays cursor width is requested with wxSYS_CURSOR_X.","ref":"wxSystemSettings.html#getMetric/2"},{"type":"function","title":"wxSystemSettings.getScreenType/0","doc":"Returns the screen type.\n\nThe return value is one of the ?wxSystemScreenType enum values.","ref":"wxSystemSettings.html#getScreenType/0"},{"type":"type","title":"wxSystemSettings.wxSystemSettings/0","doc":"","ref":"wxSystemSettings.html#t:wxSystemSettings/0"},{"type":"module","title":"wxTaskBarIcon","doc":"This class represents a taskbar icon.\n\nA taskbar icon is an icon that appears in the 'system tray' and responds to mouse clicks,\noptionally with a tooltip above it to help provide information.\n\nX Window System Note\n\nUnder X Window System, the window manager must support either the \"System Tray Protocol\"\n(see [http://freedesktop.org/wiki/Specifications/systemtray-spec](http://freedesktop.org/wiki/Specifications/systemtray-spec))\nby freedesktop.org (WMs used by modern desktop environments such as GNOME >= 2, KDE >= 3\nand XFCE >= 4 all do) or the older methods used in GNOME 1.2 and KDE 1 and 2.\n\nIf it doesn't, the icon will appear as a toplevel window on user's desktop. Because not\nall window managers have system tray, there's no guarantee that `m:wxTaskBarIcon` will\nwork correctly under X Window System and so the applications should use it only as an\noptional component of their user interface. The user should be required to explicitly\nenable the taskbar icon on Unix, it shouldn't be on by default.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTaskBarIcon](https://docs.wxwidgets.org/3.2/classwx_task_bar_icon.html)","ref":"wxTaskBarIcon.html"},{"type":"module","title":"Events - wxTaskBarIcon","doc":"Event types emitted from this class:\n\n* [`taskbar_move`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_down`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_up`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_down`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_up`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_left_dclick`](`m:wxTaskBarIconEvent`)\n\n* [`taskbar_right_dclick`](`m:wxTaskBarIconEvent`)","ref":"wxTaskBarIcon.html#module-events"},{"type":"function","title":"wxTaskBarIcon.destroy/1","doc":"Destroys the object","ref":"wxTaskBarIcon.html#destroy/1"},{"type":"function","title":"wxTaskBarIcon.new/0","doc":"","ref":"wxTaskBarIcon.html#new/0"},{"type":"function","title":"wxTaskBarIcon.new/1","doc":"","ref":"wxTaskBarIcon.html#new/1"},{"type":"function","title":"wxTaskBarIcon.popupMenu/2","doc":"Pops up a menu at the current mouse position.\n\nThe events can be handled by a class derived from `m:wxTaskBarIcon`.\n\nNote: It is recommended to override `CreatePopupMenu()` (not implemented in wx) callback\ninstead of calling this method from event handler, because some ports (e.g. wxCocoa) may\nnot implement `popupMenu/2` and mouse click events at all.","ref":"wxTaskBarIcon.html#popupMenu/2"},{"type":"function","title":"wxTaskBarIcon.removeIcon/1","doc":"Removes the icon previously set with `setIcon/3`.","ref":"wxTaskBarIcon.html#removeIcon/1"},{"type":"function","title":"wxTaskBarIcon.setIcon/2","doc":"","ref":"wxTaskBarIcon.html#setIcon/2"},{"type":"function","title":"wxTaskBarIcon.setIcon/3","doc":"Sets the icon, and optional tooltip text.","ref":"wxTaskBarIcon.html#setIcon/3"},{"type":"type","title":"wxTaskBarIcon.wxTaskBarIcon/0","doc":"","ref":"wxTaskBarIcon.html#t:wxTaskBarIcon/0"},{"type":"module","title":"wxTaskBarIconEvent","doc":"The event class used by `m:wxTaskBarIcon`.\n\nFor a list of the event macros meant to be used with `m:wxTaskBarIconEvent`, please look\nat `m:wxTaskBarIcon` description.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxTaskBarIconEvent](https://docs.wxwidgets.org/3.2/classwx_task_bar_icon_event.html)","ref":"wxTaskBarIconEvent.html"},{"type":"type","title":"wxTaskBarIconEvent.wxTaskBarIcon/0","doc":"","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIcon/0"},{"type":"type","title":"wxTaskBarIconEvent.wxTaskBarIconEvent/0","doc":"","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIconEvent/0"},{"type":"type","title":"wxTaskBarIconEvent.wxTaskBarIconEventType/0","doc":"","ref":"wxTaskBarIconEvent.html#t:wxTaskBarIconEventType/0"},{"type":"module","title":"wxTextAttr","doc":"`m:wxTextAttr` represents the character and paragraph attributes, or style, for a range\nof text in a `m:wxTextCtrl` or `wxRichTextCtrl` (not implemented in wx).\n\nWhen setting up a `m:wxTextAttr` object, pass a bitlist mask to `setFlags/2` to indicate which style\nelements should be changed. As a convenience, when you call a setter such as SetFont, the\nrelevant bit will be set.\n\nSee: `m:wxTextCtrl`\n\nwxWidgets docs: [wxTextAttr](https://docs.wxwidgets.org/3.2/classwx_text_attr.html)","ref":"wxTextAttr.html"},{"type":"function","title":"wxTextAttr.destroy/1","doc":"Destroys the object","ref":"wxTextAttr.html#destroy/1"},{"type":"function","title":"wxTextAttr.getAlignment/1","doc":"Returns the alignment flags.\n\nSee ?wxTextAttrAlignment for a list of available styles.","ref":"wxTextAttr.html#getAlignment/1"},{"type":"function","title":"wxTextAttr.getBackgroundColour/1","doc":"Returns the background colour.","ref":"wxTextAttr.html#getBackgroundColour/1"},{"type":"function","title":"wxTextAttr.getFlags/1","doc":"Returns flags indicating which attributes are applicable.\n\nSee `setFlags/2` for a list of available flags.","ref":"wxTextAttr.html#getFlags/1"},{"type":"function","title":"wxTextAttr.getFont/1","doc":"Creates and returns a font specified by the font attributes in the `m:wxTextAttr` object.\n\nNote that `m:wxTextAttr` does not store a `m:wxFont` object, so this is only a temporary font.\n\nFor greater efficiency, access the font attributes directly.","ref":"wxTextAttr.html#getFont/1"},{"type":"function","title":"wxTextAttr.getFontEncoding/1","doc":"Returns the font encoding.","ref":"wxTextAttr.html#getFontEncoding/1"},{"type":"function","title":"wxTextAttr.getFontFaceName/1","doc":"Returns the font face name.","ref":"wxTextAttr.html#getFontFaceName/1"},{"type":"function","title":"wxTextAttr.getFontSize/1","doc":"Returns the font size in points.","ref":"wxTextAttr.html#getFontSize/1"},{"type":"function","title":"wxTextAttr.getFontStyle/1","doc":"Returns the font style.","ref":"wxTextAttr.html#getFontStyle/1"},{"type":"function","title":"wxTextAttr.getFontUnderlined/1","doc":"Returns true if the font is underlined.","ref":"wxTextAttr.html#getFontUnderlined/1"},{"type":"function","title":"wxTextAttr.getFontWeight/1","doc":"Returns the font weight.","ref":"wxTextAttr.html#getFontWeight/1"},{"type":"function","title":"wxTextAttr.getLeftIndent/1","doc":"Returns the left indent in tenths of a millimetre.","ref":"wxTextAttr.html#getLeftIndent/1"},{"type":"function","title":"wxTextAttr.getLeftSubIndent/1","doc":"Returns the left sub-indent in tenths of a millimetre.","ref":"wxTextAttr.html#getLeftSubIndent/1"},{"type":"function","title":"wxTextAttr.getRightIndent/1","doc":"Returns the right indent in tenths of a millimeter.","ref":"wxTextAttr.html#getRightIndent/1"},{"type":"function","title":"wxTextAttr.getTabs/1","doc":"Returns an array of tab stops, each expressed in tenths of a millimeter.\n\nEach stop is measured from the left margin and therefore each value must be larger than\nthe last.","ref":"wxTextAttr.html#getTabs/1"},{"type":"function","title":"wxTextAttr.getTextColour/1","doc":"Returns the text foreground colour.","ref":"wxTextAttr.html#getTextColour/1"},{"type":"function","title":"wxTextAttr.hasBackgroundColour/1","doc":"Returns true if the attribute object specifies a background colour.","ref":"wxTextAttr.html#hasBackgroundColour/1"},{"type":"function","title":"wxTextAttr.hasFont/1","doc":"Returns true if the attribute object specifies any font attributes.","ref":"wxTextAttr.html#hasFont/1"},{"type":"function","title":"wxTextAttr.hasTextColour/1","doc":"Returns true if the attribute object specifies a text foreground colour.","ref":"wxTextAttr.html#hasTextColour/1"},{"type":"function","title":"wxTextAttr.isDefault/1","doc":"Returns false if we have any attributes set, true otherwise.","ref":"wxTextAttr.html#isDefault/1"},{"type":"function","title":"wxTextAttr.new/0","doc":"Constructors.","ref":"wxTextAttr.html#new/0"},{"type":"function","title":"wxTextAttr.new/1","doc":"","ref":"wxTextAttr.html#new/1"},{"type":"function","title":"wxTextAttr.new/2","doc":"","ref":"wxTextAttr.html#new/2"},{"type":"function","title":"wxTextAttr.setAlignment/2","doc":"Sets the paragraph alignment.\n\nSee ?wxTextAttrAlignment enumeration values.\n\nOf these, wxTEXT_ALIGNMENT_JUSTIFIED is unimplemented. In future justification may be\nsupported when printing or previewing, only.","ref":"wxTextAttr.html#setAlignment/2"},{"type":"function","title":"wxTextAttr.setBackgroundColour/2","doc":"Sets the background colour.","ref":"wxTextAttr.html#setBackgroundColour/2"},{"type":"function","title":"wxTextAttr.setFlags/2","doc":"Sets the flags determining which styles are being specified.\n\nThe ?wxTextAttrFlags values can be passed in a bitlist.","ref":"wxTextAttr.html#setFlags/2"},{"type":"function","title":"wxTextAttr.setFont/2","doc":"","ref":"wxTextAttr.html#setFont/2"},{"type":"function","title":"wxTextAttr.setFont/3","doc":"Sets the attributes for the given font.\n\nNote that `m:wxTextAttr` does not store an actual `m:wxFont` object.","ref":"wxTextAttr.html#setFont/3"},{"type":"function","title":"wxTextAttr.setFontEncoding/2","doc":"Sets the font encoding.","ref":"wxTextAttr.html#setFontEncoding/2"},{"type":"function","title":"wxTextAttr.setFontFaceName/2","doc":"Sets the font face name.","ref":"wxTextAttr.html#setFontFaceName/2"},{"type":"function","title":"wxTextAttr.setFontFamily/2","doc":"Sets the font family.","ref":"wxTextAttr.html#setFontFamily/2"},{"type":"function","title":"wxTextAttr.setFontPixelSize/2","doc":"Sets the font size in pixels.","ref":"wxTextAttr.html#setFontPixelSize/2"},{"type":"function","title":"wxTextAttr.setFontPointSize/2","doc":"Sets the font size in points.","ref":"wxTextAttr.html#setFontPointSize/2"},{"type":"function","title":"wxTextAttr.setFontSize/2","doc":"Sets the font size in points.","ref":"wxTextAttr.html#setFontSize/2"},{"type":"function","title":"wxTextAttr.setFontStyle/2","doc":"Sets the font style (normal, italic or slanted).","ref":"wxTextAttr.html#setFontStyle/2"},{"type":"function","title":"wxTextAttr.setFontUnderlined/2","doc":"Sets the font underlining (solid line, text colour).","ref":"wxTextAttr.html#setFontUnderlined/2"},{"type":"function","title":"wxTextAttr.setFontWeight/2","doc":"Sets the font weight.","ref":"wxTextAttr.html#setFontWeight/2"},{"type":"function","title":"wxTextAttr.setLeftIndent/2","doc":"","ref":"wxTextAttr.html#setLeftIndent/2"},{"type":"function","title":"wxTextAttr.setLeftIndent/3","doc":"Sets the left indent and left subindent in tenths of a millimetre.\n\nThe sub-indent is an offset from the left of the paragraph, and is used for all but the\nfirst line in a paragraph.\n\nA positive value will cause the first line to appear to the left of the subsequent lines,\nand a negative value will cause the first line to be indented relative to the subsequent lines.\n\n`wxRichTextBuffer` (not implemented in wx) uses indentation to render a bulleted item.\nThe left indent is the distance between the margin and the bullet. The content of the\nparagraph, including the first line, starts at leftMargin + leftSubIndent. So the distance\nbetween the left edge of the bullet and the left of the actual paragraph is leftSubIndent.","ref":"wxTextAttr.html#setLeftIndent/3"},{"type":"function","title":"wxTextAttr.setRightIndent/2","doc":"Sets the right indent in tenths of a millimetre.","ref":"wxTextAttr.html#setRightIndent/2"},{"type":"function","title":"wxTextAttr.setTabs/2","doc":"Sets the tab stops, expressed in tenths of a millimetre.\n\nEach stop is measured from the left margin and therefore each value must be larger than\nthe last.","ref":"wxTextAttr.html#setTabs/2"},{"type":"function","title":"wxTextAttr.setTextColour/2","doc":"Sets the text foreground colour.","ref":"wxTextAttr.html#setTextColour/2"},{"type":"type","title":"wxTextAttr.wxTextAttr/0","doc":"","ref":"wxTextAttr.html#t:wxTextAttr/0"},{"type":"module","title":"wxTextCtrl","doc":"A text control allows text to be displayed and edited.\n\nIt may be single line or multi-line. Notice that a lot of methods of the text controls\nare found in the base `wxTextEntry` (not implemented in wx) class which is a common base\nclass for `m:wxTextCtrl` and other controls using a single line text entry field (e.g. `m:wxComboBox`).","ref":"wxTextCtrl.html"},{"type":"module","title":"Styles - wxTextCtrl","doc":"This class supports the following styles:\n\n* wxTE_PROCESS_ENTER: The control will generate the event `wxEVT_TEXT_ENTER` that can be\nhandled by the program. Otherwise, i.e. either if this style not specified at all, or it\nis used, but there is no event handler for this event or the event handler called `wxEvent:skip/2` to\navoid overriding the default handling, pressing Enter key is either processed internally\nby the control or used to activate the default button of the dialog, if any.\n\n* wxTE_PROCESS_TAB: Normally, TAB key is used for keyboard navigation and pressing it in a\ncontrol switches focus to the next one. With this style, this won't happen and if the TAB\nis not otherwise processed (e.g. by `wxEVT_CHAR` event handler), a literal TAB character\nis inserted into the control. Notice that this style has no effect for single-line text\ncontrols when using wxGTK.\n\n* wxTE_MULTILINE: The text control allows multiple lines. If this style is not specified,\nline break characters should not be used in the controls value.\n\n* wxTE_PASSWORD: The text will be echoed as asterisks.\n\n* wxTE_READONLY: The text will not be user-editable.\n\n* wxTE_RICH: Use rich text control under MSW, this allows having more than 64KB of text in\nthe control. This style is ignored under other platforms.\n\n* wxTE_RICH2: Use rich text control version 2.0 or higher under MSW, this style is ignored\nunder other platforms\n\n* wxTE_AUTO_URL: Highlight the URLs and generate the wxTextUrlEvents when mouse events\noccur over them.\n\n* wxTE_NOHIDESEL: By default, the Windows text control doesn't show the selection when it\ndoesn't have focus - use this style to force it to always show it. It doesn't do anything\nunder other platforms.\n\n* wxHSCROLL: A horizontal scrollbar will be created and used, so that text won't be\nwrapped. No effect under wxGTK1.\n\n* wxTE_NO_VSCROLL: For multiline controls only: vertical scrollbar will never be created.\nThis limits the amount of text which can be entered into the control to what can be\ndisplayed in it under wxMSW but not under wxGTK or wxOSX. Currently not implemented for\nthe other platforms.\n\n* wxTE_LEFT: The text in the control will be left-justified (default).\n\n* wxTE_CENTRE: The text in the control will be centered (wxMSW, wxGTK, wxOSX).\n\n* wxTE_RIGHT: The text in the control will be right-justified (wxMSW, wxGTK, wxOSX).\n\n* wxTE_DONTWRAP: Same as wxHSCROLL style: don't wrap at all, show horizontal scrollbar\ninstead.\n\n* wxTE_CHARWRAP: For multiline controls only: wrap the lines too long to be shown entirely\nat any position (wxUniv, wxGTK, wxOSX).\n\n* wxTE_WORDWRAP: For multiline controls only: wrap the lines too long to be shown entirely\nat word boundaries (wxUniv, wxMSW, wxGTK, wxOSX).\n\n* wxTE_BESTWRAP: For multiline controls only: wrap the lines at word boundaries or at any\nother character if there are words longer than the window width (this is the default).\n\n* wxTE_CAPITALIZE: On PocketPC and Smartphone, causes the first letter to be capitalized.\nNote that alignment styles (wxTE_LEFT, wxTE_CENTRE and wxTE_RIGHT) can be changed\ndynamically after control creation on wxMSW, wxGTK and wxOSX. wxTE_READONLY, wxTE_PASSWORD\nand wrapping styles can be dynamically changed under wxGTK but not wxMSW. The other styles\ncan be only set during control creation.\n\nwxTextCtrl Text Format\n\nThe multiline text controls always store the text as a sequence of lines separated by `'\\n'`\ncharacters, i.e. in the Unix text format even on non-Unix platforms. This allows the user\ncode to ignore the differences between the platforms but at a price: the indices in the\ncontrol such as those returned by `getInsertionPoint/1` or `getSelection/1` can `not` be used as indices into the string\nreturned by `getValue/1` as they're going to be slightly off for platforms using `\"\\\\r\\\\n\"` as\nseparator (as Windows does).\n\nInstead, if you need to obtain a substring between the 2 indices obtained from the\ncontrol with the help of the functions mentioned above, you should use `getRange/3`. And the indices\nthemselves can only be passed to other methods, for example `setInsertionPoint/2` or `setSelection/3`.\n\nTo summarize: never use the indices returned by (multiline) `m:wxTextCtrl` as indices\ninto the string it contains, but only as arguments to be passed back to the other `m:wxTextCtrl`\nmethods. This problem doesn't arise for single-line platforms however where the indices\nin the control do correspond to the positions in the value string.\n\nwxTextCtrl Positions and Coordinates\n\nIt is possible to use either linear positions, i.e. roughly (but `not` always exactly, as\nexplained in the previous section) the index of the character in the text contained in the\ncontrol or X-Y coordinates, i.e. column and line of the character when working with this\nclass and it provides the functions `positionToXY/2` and `xYToPosition/3` to convert between the two.\n\nAdditionally, a position in the control can be converted to its coordinates in pixels\nusing `PositionToCoords()` (not implemented in wx) which can be useful to e.g. show a\npopup menu near the given character. And, in the other direction, `HitTest()` (not\nimplemented in wx) can be used to find the character under, or near, the given pixel coordinates.\n\nTo be more precise, positions actually refer to the gaps between characters and not the\ncharacters themselves. Thus, position 0 is the one before the very first character in the\ncontrol and so is a valid position even when the control is empty. And if the control\ncontains a single character, it has two valid positions: 0 before this character and 1 -\nafter it. This, when the documentation of various functions mentions \"invalid position\",\nit doesn't consider the position just after the last character of the line to be invalid,\nonly the positions beyond that one (e.g. 2 and greater in the single character example)\nare actually invalid.\n\nwxTextCtrl Styles.\n\nMulti-line text controls support styling, i.e. provide a possibility to set colours and\nfont for individual characters in it (note that under Windows `wxTE_RICH` style is\nrequired for style support). To use the styles you can either call `setDefaultStyle/2` before inserting the\ntext or call `setStyle/4` later to change the style of the text already in the control (the first\nsolution is much more efficient).\n\nIn either case, if the style doesn't specify some of the attributes (for example you only\nwant to set the text colour but without changing the font nor the text background), the\nvalues of the default style will be used for them. If there is no default style, the\nattributes of the text control itself are used.\n\nSo the following code correctly describes what it does: the second call to `setDefaultStyle/2` doesn't\nchange the text foreground colour (which stays red) while the last one doesn't change the\nbackground colour (which stays grey):\n\nwxTextCtrl and C++ Streams\n\nThis class multiply-inherits from `std::streambuf` (except for some really old compilers\nusing non-standard iostream library), allowing code such as the following:\n\nNote that even if your build of wxWidgets doesn't support this (the symbol `wxHAS_TEXT_WINDOW_STREAM`\nhas value of 0 then) you can still use `m:wxTextCtrl` itself in a stream-like manner:\n\nHowever the possibility to create a `std::ostream` associated with `m:wxTextCtrl` may be\nuseful if you need to redirect the output of a function taking a `std::ostream` as\nparameter to a text control.\n\nAnother commonly requested need is to redirect `std::cout` to the text control. This may\nbe done in the following way:\n\nBut wxWidgets provides a convenient class to make it even simpler so instead you may just do\n\nSee `wxStreamToTextRedirector` (not implemented in wx) for more details.\n\nEvent Handling.\n\nThe following commands are processed by default event handlers in `m:wxTextCtrl`: `wxID_CUT`, `wxID_COPY`, `wxID_PASTE`, `wxID_UNDO`, `wxID_REDO`.\nThe associated UI update events are also processed automatically, when the control has the focus.\n\nSee: `create/4`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTextCtrl](https://docs.wxwidgets.org/3.2/classwx_text_ctrl.html)","ref":"wxTextCtrl.html#module-styles"},{"type":"module","title":"Events - wxTextCtrl","doc":"Event types emitted from this class:\n\n* [`command_text_updated`](`m:wxCommandEvent`)\n\n* [`command_text_enter`](`m:wxCommandEvent`)\n\n* [`text_maxlen`](`m:wxCommandEvent`)","ref":"wxTextCtrl.html#module-events"},{"type":"function","title":"wxTextCtrl.appendText/2","doc":"Appends the text to the end of the text control.\n\nRemark: After the text is appended, the insertion point will be at the end of the text\ncontrol. If this behaviour is not desired, the programmer should use `getInsertionPoint/1` and `setInsertionPoint/2`.\n\nSee: `writeText/2`","ref":"wxTextCtrl.html#appendText/2"},{"type":"function","title":"wxTextCtrl.canCopy/1","doc":"Returns true if the selection can be copied to the clipboard.","ref":"wxTextCtrl.html#canCopy/1"},{"type":"function","title":"wxTextCtrl.canCut/1","doc":"Returns true if the selection can be cut to the clipboard.","ref":"wxTextCtrl.html#canCut/1"},{"type":"function","title":"wxTextCtrl.canPaste/1","doc":"Returns true if the contents of the clipboard can be pasted into the text control.\n\nOn some platforms (Motif, GTK) this is an approximation and returns true if the control\nis editable, false otherwise.","ref":"wxTextCtrl.html#canPaste/1"},{"type":"function","title":"wxTextCtrl.canRedo/1","doc":"Returns true if there is a redo facility available and the last operation can be redone.","ref":"wxTextCtrl.html#canRedo/1"},{"type":"function","title":"wxTextCtrl.canUndo/1","doc":"Returns true if there is an undo facility available and the last operation can be undone.","ref":"wxTextCtrl.html#canUndo/1"},{"type":"function","title":"wxTextCtrl.changeValue/2","doc":"Sets the new text control value.\n\nIt also marks the control as not-modified which means that IsModified() would return\nfalse immediately after the call to `changeValue/2`.\n\nThe insertion point is set to the start of the control (i.e. position 0) by this function.\n\nThis functions does not generate the `wxEVT_TEXT` event but otherwise is identical to `setValue/2`.\n\nSee overview_events_prog for more information.\n\nSince: 2.7.1","ref":"wxTextCtrl.html#changeValue/2"},{"type":"function","title":"wxTextCtrl.clear/1","doc":"Clears the text in the control.\n\nNote that this function will generate a `wxEVT_TEXT` event, i.e. its effect is identical\nto calling `SetValue`(\"\").","ref":"wxTextCtrl.html#clear/1"},{"type":"function","title":"wxTextCtrl.copy/1","doc":"Copies the selected text to the clipboard.","ref":"wxTextCtrl.html#copy/1"},{"type":"function","title":"wxTextCtrl.create/3","doc":"","ref":"wxTextCtrl.html#create/3"},{"type":"function","title":"wxTextCtrl.create/4","doc":"Creates the text control for two-step construction.\n\nThis method should be called if the default constructor was used for the control\ncreation. Its parameters have the same meaning as for the non-default constructor.","ref":"wxTextCtrl.html#create/4"},{"type":"function","title":"wxTextCtrl.cut/1","doc":"Copies the selected text to the clipboard and removes it from the control.","ref":"wxTextCtrl.html#cut/1"},{"type":"function","title":"wxTextCtrl.destroy/1","doc":"Destroys the object","ref":"wxTextCtrl.html#destroy/1"},{"type":"function","title":"wxTextCtrl.discardEdits/1","doc":"Resets the internal modified flag as if the current changes had been saved.","ref":"wxTextCtrl.html#discardEdits/1"},{"type":"function","title":"wxTextCtrl.emulateKeyPress/2","doc":"This function inserts into the control the character which would have been inserted if\nthe given key event had occurred in the text control.\n\nThe `event` object should be the same as the one passed to `EVT_KEY_DOWN` handler\npreviously by wxWidgets. Please note that this function doesn't currently work correctly\nfor all keys under any platform but MSW.\n\nReturn: true if the event resulted in a change to the control, false otherwise.","ref":"wxTextCtrl.html#emulateKeyPress/2"},{"type":"function","title":"wxTextCtrl.getDefaultStyle/1","doc":"Returns the style currently used for the new text.\n\nSee: `setDefaultStyle/2`","ref":"wxTextCtrl.html#getDefaultStyle/1"},{"type":"function","title":"wxTextCtrl.getInsertionPoint/1","doc":"Returns the insertion point, or cursor, position.\n\nThis is defined as the zero based index of the character position to the right of the\ninsertion point. For example, if the insertion point is at the end of the single-line text\ncontrol, it is equal to `getLastPosition/1`.\n\nNotice that insertion position is, in general, different from the index of the character\nthe cursor position at in the string returned by `getValue/1`. While this is always the case for the\nsingle line controls, multi-line controls can use two characters `\"\\\\r\\\\n\"` as line\nseparator (this is notably the case under MSW) meaning that indices in the control and its\nstring value are offset by 1 for every line.\n\nHence to correctly get the character at the current cursor position, taking into account\nthat there can be none if the cursor is at the end of the string, you could do the following:","ref":"wxTextCtrl.html#getInsertionPoint/1"},{"type":"function","title":"wxTextCtrl.getLastPosition/1","doc":"Returns the zero based index of the last position in the text control, which is equal to\nthe number of characters in the control.","ref":"wxTextCtrl.html#getLastPosition/1"},{"type":"function","title":"wxTextCtrl.getLineLength/2","doc":"Gets the length of the specified line, not including any trailing newline character(s).\n\nReturn: The length of the line, or -1 if `lineNo` was invalid.","ref":"wxTextCtrl.html#getLineLength/2"},{"type":"function","title":"wxTextCtrl.getLineText/2","doc":"Returns the contents of a given line in the text control, not including any trailing\nnewline character(s).\n\nReturn: The contents of the line.","ref":"wxTextCtrl.html#getLineText/2"},{"type":"function","title":"wxTextCtrl.getNumberOfLines/1","doc":"Returns the number of lines in the text control buffer.\n\nThe returned number is the number of logical lines, i.e. just the count of the number of\nnewline characters in the control + 1, for wxGTK and wxOSX/Cocoa ports while it is the\nnumber of physical lines, i.e. the count of lines actually shown in the control, in wxMSW.\nBecause of this discrepancy, it is not recommended to use this function.\n\nRemark: Note that even empty text controls have one line (where the insertion point is),\nso `getNumberOfLines/1` never returns 0.","ref":"wxTextCtrl.html#getNumberOfLines/1"},{"type":"function","title":"wxTextCtrl.getRange/3","doc":"Returns the string containing the text starting in the positions `from` and up to `to` in\nthe control.\n\nThe positions must have been returned by another `m:wxTextCtrl` method. Please note that\nthe positions in a multiline `m:wxTextCtrl` do `not` correspond to the indices in the\nstring returned by `getValue/1` because of the different new line representations (`CR` or `CR` LF)\nand so this method should be used to obtain the correct results instead of extracting\nparts of the entire value. It may also be more efficient, especially if the control\ncontains a lot of data.","ref":"wxTextCtrl.html#getRange/3"},{"type":"function","title":"wxTextCtrl.getSelection/1","doc":"Gets the current selection span.\n\nIf the returned values are equal, there was no selection. Please note that the indices\nreturned may be used with the other `m:wxTextCtrl` methods but don't necessarily represent\nthe correct indices into the string returned by `getValue/1` for multiline controls under Windows (at\nleast,) you should use `getStringSelection/1` to get the selected text.","ref":"wxTextCtrl.html#getSelection/1"},{"type":"function","title":"wxTextCtrl.getStringSelection/1","doc":"Gets the text currently selected in the control.\n\nIf there is no selection, the returned string is empty.","ref":"wxTextCtrl.html#getStringSelection/1"},{"type":"function","title":"wxTextCtrl.getStyle/3","doc":"Returns the style at this position in the text control.\n\nNot all platforms support this function.\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee:\n* `setStyle/4`\n\n* `m:wxTextAttr`","ref":"wxTextCtrl.html#getStyle/3"},{"type":"function","title":"wxTextCtrl.getValue/1","doc":"Gets the contents of the control.\n\nNotice that for a multiline text control, the lines will be separated by (Unix-style) `\\n`\ncharacters, even under Windows where they are separated by a `\\r\\n` sequence in the\nnative control.","ref":"wxTextCtrl.html#getValue/1"},{"type":"function","title":"wxTextCtrl.isEditable/1","doc":"Returns true if the controls contents may be edited by user (note that it always can be\nchanged by the program).\n\nIn other words, this functions returns true if the control hasn't been put in read-only\nmode by a previous call to `setEditable/2`.","ref":"wxTextCtrl.html#isEditable/1"},{"type":"function","title":"wxTextCtrl.isModified/1","doc":"Returns true if the text has been modified by user.\n\nNote that calling `setValue/2` doesn't make the control modified.\n\nSee: `markDirty/1`","ref":"wxTextCtrl.html#isModified/1"},{"type":"function","title":"wxTextCtrl.isMultiLine/1","doc":"Returns true if this is a multi line edit control and false otherwise.\n\nSee: `isSingleLine/1`","ref":"wxTextCtrl.html#isMultiLine/1"},{"type":"function","title":"wxTextCtrl.isSingleLine/1","doc":"Returns true if this is a single line edit control and false otherwise.\n\nSee:\n* `isSingleLine/1`\n\n* `isMultiLine/1`","ref":"wxTextCtrl.html#isSingleLine/1"},{"type":"function","title":"wxTextCtrl.loadFile/2","doc":"","ref":"wxTextCtrl.html#loadFile/2"},{"type":"function","title":"wxTextCtrl.loadFile/3","doc":"Loads and displays the named file, if it exists.\n\nReturn: true if successful, false otherwise.","ref":"wxTextCtrl.html#loadFile/3"},{"type":"function","title":"wxTextCtrl.markDirty/1","doc":"Mark text as modified (dirty).\n\nSee: `isModified/1`","ref":"wxTextCtrl.html#markDirty/1"},{"type":"function","title":"wxTextCtrl.new/0","doc":"Default ctor.","ref":"wxTextCtrl.html#new/0"},{"type":"function","title":"wxTextCtrl.new/2","doc":"","ref":"wxTextCtrl.html#new/2"},{"type":"function","title":"wxTextCtrl.new/3","doc":"Constructor, creating and showing a text control.\n\nRemark: The horizontal scrollbar (wxHSCROLL style flag) will only be created for\nmulti-line text controls. Without a horizontal scrollbar, text lines that don't fit in the\ncontrol's size will be wrapped (but no newline character is inserted). Single line\ncontrols don't have a horizontal scrollbar, the text is automatically scrolled so that the\ninsertion point is always visible.\n\nSee: `create/4`","ref":"wxTextCtrl.html#new/3"},{"type":"function","title":"wxTextCtrl.paste/1","doc":"Pastes text from the clipboard to the text item.","ref":"wxTextCtrl.html#paste/1"},{"type":"function","title":"wxTextCtrl.positionToXY/2","doc":"Converts given position to a zero-based column, line number pair.\n\nReturn: true on success, false on failure (most likely due to a too large position parameter).\n\nSee: `xYToPosition/3`","ref":"wxTextCtrl.html#positionToXY/2"},{"type":"function","title":"wxTextCtrl.redo/1","doc":"If there is a redo facility and the last operation can be redone, redoes the last\noperation.\n\nDoes nothing if there is no redo facility.","ref":"wxTextCtrl.html#redo/1"},{"type":"function","title":"wxTextCtrl.remove/3","doc":"Removes the text starting at the first given position up to (but not including) the\ncharacter at the last position.\n\nThis function puts the current insertion point position at `to` as a side effect.","ref":"wxTextCtrl.html#remove/3"},{"type":"function","title":"wxTextCtrl.replace/4","doc":"Replaces the text starting at the first position up to (but not including) the character\nat the last position with the given text.\n\nThis function puts the current insertion point position at `to` as a side effect.","ref":"wxTextCtrl.html#replace/4"},{"type":"function","title":"wxTextCtrl.saveFile/1","doc":"","ref":"wxTextCtrl.html#saveFile/1"},{"type":"function","title":"wxTextCtrl.saveFile/2","doc":"Saves the contents of the control in a text file.\n\nReturn: true if the operation was successful, false otherwise.","ref":"wxTextCtrl.html#saveFile/2"},{"type":"function","title":"wxTextCtrl.setDefaultStyle/2","doc":"Changes the default style to use for the new text which is going to be added to the\ncontrol.\n\nThis applies both to the text added programmatically using `writeText/2` or `appendText/2` and to the text entered\nby the user interactively.\n\nIf either of the font, foreground, or background colour is not set in `style`, the values\nof the previous default style are used for them. If the previous default style didn't set\nthem neither, the global font or colours of the text control itself are used as fall back.\n\nHowever if the `style` parameter is the default `m:wxTextAttr`, then the default style is\njust reset (instead of being combined with the new style which wouldn't change it at all).\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee: `getDefaultStyle/1`","ref":"wxTextCtrl.html#setDefaultStyle/2"},{"type":"function","title":"wxTextCtrl.setEditable/2","doc":"Makes the text item editable or read-only, overriding the `wxTE\\_READONLY` flag.\n\nSee: `isEditable/1`","ref":"wxTextCtrl.html#setEditable/2"},{"type":"function","title":"wxTextCtrl.setInsertionPoint/2","doc":"Sets the insertion point at the given position.","ref":"wxTextCtrl.html#setInsertionPoint/2"},{"type":"function","title":"wxTextCtrl.setInsertionPointEnd/1","doc":"Sets the insertion point at the end of the text control.\n\nThis is equivalent to calling `setInsertionPoint/2` with `getLastPosition/1` argument.","ref":"wxTextCtrl.html#setInsertionPointEnd/1"},{"type":"function","title":"wxTextCtrl.setMaxLength/2","doc":"This function sets the maximum number of characters the user can enter into the control.\n\nIn other words, it allows limiting the text value length to `len` not counting the\nterminating `NUL` character.\n\nIf `len` is 0, the previously set max length limit, if any, is discarded and the user may\nenter as much text as the underlying native text control widget supports (typically at\nleast 32Kb). If the user tries to enter more characters into the text control when it\nalready is filled up to the maximal length, a `wxEVT_TEXT_MAXLEN` event is sent to notify\nthe program about it (giving it the possibility to show an explanatory message, for\nexample) and the extra input is discarded.\n\nNote that in wxGTK this function may only be used with single line text controls.","ref":"wxTextCtrl.html#setMaxLength/2"},{"type":"function","title":"wxTextCtrl.setSelection/3","doc":"Selects the text starting at the first position up to (but not including) the character\nat the last position.\n\nIf both parameters are equal to -1 all text in the control is selected.\n\nNotice that the insertion point will be moved to `from` by this function.","ref":"wxTextCtrl.html#setSelection/3"},{"type":"function","title":"wxTextCtrl.setStyle/4","doc":"Changes the style of the given range.\n\nIf any attribute within `style` is not set, the corresponding attribute from `getDefaultStyle/1` is used.\n\nReturn: true on success, false if an error occurred (this may also mean that the styles\nare not supported under this platform).\n\nSee:\n* `getStyle/3`\n\n* `m:wxTextAttr`","ref":"wxTextCtrl.html#setStyle/4"},{"type":"function","title":"wxTextCtrl.setValue/2","doc":"Sets the new text control value.\n\nIt also marks the control as not-modified which means that IsModified() would return\nfalse immediately after the call to `setValue/2`.\n\nThe insertion point is set to the start of the control (i.e. position 0) by this function\nunless the control value doesn't change at all, in which case the insertion point is left\nat its original position.\n\nNote that, unlike most other functions changing the controls values, this function\ngenerates a `wxEVT_TEXT` event. To avoid this you can use `changeValue/2` instead.","ref":"wxTextCtrl.html#setValue/2"},{"type":"function","title":"wxTextCtrl.showPosition/2","doc":"Makes the line containing the given position visible.","ref":"wxTextCtrl.html#showPosition/2"},{"type":"function","title":"wxTextCtrl.undo/1","doc":"If there is an undo facility and the last operation can be undone, undoes the last\noperation.\n\nDoes nothing if there is no undo facility.","ref":"wxTextCtrl.html#undo/1"},{"type":"function","title":"wxTextCtrl.writeText/2","doc":"Writes the text into the text control at the current insertion position.\n\nRemark: Newlines in the text string are the only control characters allowed, and they\nwill cause appropriate line breaks. See operator<<() and `appendText/2` for more convenient ways of\nwriting to the window. After the write operation, the insertion point will be at the end\nof the inserted text, so subsequent write operations will be appended. To append text\nafter the user may have interacted with the control, call `setInsertionPointEnd/1` before writing.","ref":"wxTextCtrl.html#writeText/2"},{"type":"function","title":"wxTextCtrl.xYToPosition/3","doc":"Converts the given zero based column and line number to a position.\n\nReturn: The position value, or -1 if x or y was invalid.","ref":"wxTextCtrl.html#xYToPosition/3"},{"type":"type","title":"wxTextCtrl.wxTextCtrl/0","doc":"","ref":"wxTextCtrl.html#t:wxTextCtrl/0"},{"type":"module","title":"wxTextDataObject","doc":"`m:wxTextDataObject` is a specialization of `wxDataObjectSimple` (not implemented in wx)\nfor text data.\n\nIt can be used without change to paste data into the `m:wxClipboard` or a `wxDropSource`\n(not implemented in wx). A user may wish to derive a new class from this class for\nproviding text on-demand in order to minimize memory consumption when offering data in\nseveral formats, such as plain text and RTF because by default the text is stored in a\nstring in this class, but it might as well be generated when requested. For this, `getTextLength/1` and `getText/1`\nwill have to be overridden.\n\nNote that if you already have the text inside a string, you will not achieve any\nefficiency gain by overriding these functions because copying wxStrings is already a very\nefficient operation (data is not actually copied because wxStrings are reference counted).\n\nSee:\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)\n\n* `m:wxDataObject`\n\n* `m:wxFileDataObject`\n\n* `m:wxBitmapDataObject`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDataObject`\n\nwxWidgets docs: [wxTextDataObject](https://docs.wxwidgets.org/3.2/classwx_text_data_object.html)","ref":"wxTextDataObject.html"},{"type":"function","title":"wxTextDataObject.destroy/1","doc":"Destroys the object","ref":"wxTextDataObject.html#destroy/1"},{"type":"function","title":"wxTextDataObject.getText/1","doc":"Returns the text associated with the data object.\n\nYou may wish to override this method when offering data on-demand, but this is not\nrequired by wxWidgets' internals. Use this method to get data in text form from the `m:wxClipboard`.","ref":"wxTextDataObject.html#getText/1"},{"type":"function","title":"wxTextDataObject.getTextLength/1","doc":"Returns the data size.\n\nBy default, returns the size of the text data set in the constructor or using `setText/2`. This can\nbe overridden to provide text size data on-demand. It is recommended to return the text\nlength plus 1 for a trailing zero, but this is not strictly required.","ref":"wxTextDataObject.html#getTextLength/1"},{"type":"function","title":"wxTextDataObject.new/0","doc":"","ref":"wxTextDataObject.html#new/0"},{"type":"function","title":"wxTextDataObject.new/1","doc":"Constructor, may be used to initialise the text (otherwise `setText/2` should be used\nlater).","ref":"wxTextDataObject.html#new/1"},{"type":"function","title":"wxTextDataObject.setText/2","doc":"Sets the text associated with the data object.\n\nThis method is called when the data object receives the data and, by default, copies the\ntext into the member variable. If you want to process the text on the fly you may wish to\noverride this function.","ref":"wxTextDataObject.html#setText/2"},{"type":"type","title":"wxTextDataObject.wxTextDataObject/0","doc":"","ref":"wxTextDataObject.html#t:wxTextDataObject/0"},{"type":"module","title":"wxTextEntryDialog","doc":"This class represents a dialog that requests a one-line text string from the user.\n\nIt is implemented as a generic wxWidgets dialog.\n\nSee: [Overview cmndlg](https://docs.wxwidgets.org/3.2/overview_cmndlg.html#overview_cmndlg_textentry)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDialog`\n\n* `m:wxTopLevelWindow`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTextEntryDialog](https://docs.wxwidgets.org/3.2/classwx_text_entry_dialog.html)","ref":"wxTextEntryDialog.html"},{"type":"function","title":"wxTextEntryDialog.destroy/1","doc":"Destroys the object","ref":"wxTextEntryDialog.html#destroy/1"},{"type":"function","title":"wxTextEntryDialog.getValue/1","doc":"Returns the text that the user has entered if the user has pressed OK, or the original\nvalue if the user has pressed Cancel.","ref":"wxTextEntryDialog.html#getValue/1"},{"type":"function","title":"wxTextEntryDialog.new/0","doc":"Default constructor.\n\nCall `Create()` (not implemented in wx) to really create the dialog later.\n\nSince: 2.9.5","ref":"wxTextEntryDialog.html#new/0"},{"type":"function","title":"wxTextEntryDialog.new/2","doc":"","ref":"wxTextEntryDialog.html#new/2"},{"type":"function","title":"wxTextEntryDialog.new/3","doc":"Constructor.\n\nUse `wxDialog:showModal/1` to show the dialog.\n\nSee `Create()` (not implemented in wx) method for parameter description.","ref":"wxTextEntryDialog.html#new/3"},{"type":"function","title":"wxTextEntryDialog.setValue/2","doc":"Sets the default text value.","ref":"wxTextEntryDialog.html#setValue/2"},{"type":"type","title":"wxTextEntryDialog.wxTextEntryDialog/0","doc":"","ref":"wxTextEntryDialog.html#t:wxTextEntryDialog/0"},{"type":"module","title":"wxToggleButton","doc":"`m:wxToggleButton` is a button that stays pressed when clicked by the user.\n\nIn other words, it is similar to `m:wxCheckBox` in functionality but looks like a `m:wxButton`.\n\nSince wxWidgets version 2.9.0 this control emits an update UI event.\n\nYou can see `m:wxToggleButton` in action in page_samples_widgets.\n\nSee:\n* `m:wxCheckBox`\n\n* `m:wxButton`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToggleButton](https://docs.wxwidgets.org/3.2/classwx_toggle_button.html)","ref":"wxToggleButton.html"},{"type":"module","title":"Events - wxToggleButton","doc":"Event types emitted from this class:\n\n* [`command_togglebutton_clicked`](`m:wxCommandEvent`)","ref":"wxToggleButton.html#module-events"},{"type":"function","title":"wxToggleButton.create/4","doc":"","ref":"wxToggleButton.html#create/4"},{"type":"function","title":"wxToggleButton.create/5","doc":"Creates the toggle button for two-step construction.\n\nSee `new/4` for details.","ref":"wxToggleButton.html#create/5"},{"type":"function","title":"wxToggleButton.destroy/1","doc":"Destroys the object","ref":"wxToggleButton.html#destroy/1"},{"type":"function","title":"wxToggleButton.getValue/1","doc":"Gets the state of the toggle button.\n\nReturn: Returns true if it is pressed, false otherwise.","ref":"wxToggleButton.html#getValue/1"},{"type":"function","title":"wxToggleButton.new/0","doc":"Default constructor.","ref":"wxToggleButton.html#new/0"},{"type":"function","title":"wxToggleButton.new/3","doc":"","ref":"wxToggleButton.html#new/3"},{"type":"function","title":"wxToggleButton.new/4","doc":"Constructor, creating and showing a toggle button.\n\nSee: `create/5`","ref":"wxToggleButton.html#new/4"},{"type":"function","title":"wxToggleButton.setValue/2","doc":"Sets the toggle button to the given state.\n\nThis does not cause a `EVT_TOGGLEBUTTON` event to be emitted.","ref":"wxToggleButton.html#setValue/2"},{"type":"type","title":"wxToggleButton.wxToggleButton/0","doc":"","ref":"wxToggleButton.html#t:wxToggleButton/0"},{"type":"module","title":"wxToolBar","doc":"A toolbar is a bar of buttons and/or other controls usually placed below the menu bar in\na `m:wxFrame`.\n\nYou may create a toolbar that is managed by a frame calling `wxFrame:createToolBar/2`. Under Pocket PC, you should\nalways use this function for creating the toolbar to be managed by the frame, so that\nwxWidgets can use a combined menubar and toolbar. Where you manage your own toolbars,\ncreate `m:wxToolBar` as usual.\n\nThere are several different types of tools you can add to a toolbar. These types are\ncontrolled by the ?wxItemKind enumeration.\n\nNote that many methods in `m:wxToolBar` such as `addTool/6` return a `wxToolBarToolBase*` object.\nThis should be regarded as an opaque handle representing the newly added toolbar item,\nproviding access to its id and position within the toolbar. Changes to the item's state\nshould be made through calls to `m:wxToolBar` methods, for example `enableTool/3`. Calls to `wxToolBarToolBase`\n(not implemented in wx) methods (undocumented by purpose) will not change the visible\nstate of the item within the tool bar.\n\nAfter you have added all the tools you need, you must call `realize/1` to effectively construct and\ndisplay the toolbar.\n\n`wxMSW note`: Note that under wxMSW toolbar paints tools to reflect system-wide colours.\nIf you use more than 16 colours in your tool bitmaps, you may wish to suppress this\nbehaviour, otherwise system colours in your bitmaps will inadvertently be mapped to system\ncolours. To do this, set the msw.remap system option before creating the toolbar: If you\nwish to use 32-bit images (which include an alpha channel for transparency) use: Then\ncolour remapping is switched off, and a transparent background used. But only use this\noption under Windows XP with true colour:","ref":"wxToolBar.html"},{"type":"module","title":"Styles - wxToolBar","doc":"This class supports the following styles:\n\n* wxTB_FLAT: Gives the toolbar a flat look (Windows and GTK only).\n\n* wxTB_DOCKABLE: Makes the toolbar floatable and dockable (GTK only).\n\n* wxTB_HORIZONTAL: Specifies horizontal layout (default).\n\n* wxTB_VERTICAL: Specifies vertical layout.\n\n* wxTB_TEXT: Shows the text in the toolbar buttons; by default only icons are shown.\n\n* wxTB_NOICONS: Specifies no icons in the toolbar buttons; by default they are shown.\n\n* wxTB_NODIVIDER: Specifies no divider (border) above the toolbar (Windows only)\n\n* wxTB_NOALIGN: Specifies no alignment with the parent window (Windows only, not very\nuseful).\n\n* wxTB_HORZ_LAYOUT: Shows the text and the icons alongside, not vertically stacked (Windows\nand GTK 2 only). This style must be used with `wxTB_TEXT`.\n\n* wxTB_HORZ_TEXT: Combination of `wxTB_HORZ_LAYOUT` and `wxTB_TEXT`.\n\n* wxTB_NO_TOOLTIPS: Don't show the short help tooltips for the tools when the mouse hovers\nover them.\n\n* wxTB_BOTTOM: Align the toolbar at the bottom of parent window.\n\n* wxTB_RIGHT: Align the toolbar at the right side of parent window.\n\n* wxTB_DEFAULT_STYLE: Combination of `wxTB_HORIZONTAL` and `wxTB_FLAT`. This style is new\nsince wxWidgets 2.9.5. See also overview_windowstyles. Note that the wxMSW native toolbar\nignores `wxTB_NOICONS` style. Also, toggling the `wxTB_TEXT` works only if the style was\ninitially on.\n\nSee: [Overview toolbar](https://docs.wxwidgets.org/3.2/overview_toolbar.html#overview_toolbar)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToolBar](https://docs.wxwidgets.org/3.2/classwx_tool_bar.html)","ref":"wxToolBar.html#module-styles"},{"type":"module","title":"Events - wxToolBar","doc":"Event types emitted from this class:\n\n* [`command_tool_rclicked`](`m:wxCommandEvent`)\n\n* [`command_tool_enter`](`m:wxCommandEvent`)\n\n* [`tool_dropdown`](`m:wxCommandEvent`)","ref":"wxToolBar.html#module-events"},{"type":"function","title":"wxToolBar.addCheckTool/4","doc":"","ref":"wxToolBar.html#addCheckTool/4"},{"type":"function","title":"wxToolBar.addCheckTool/5","doc":"Adds a new check (or toggle) tool to the toolbar.\n\nThe parameters are the same as in `addTool/6`.\n\nSee: `addTool/6`","ref":"wxToolBar.html#addCheckTool/5"},{"type":"function","title":"wxToolBar.addControl/2","doc":"","ref":"wxToolBar.html#addControl/2"},{"type":"function","title":"wxToolBar.addControl/3","doc":"Adds any control to the toolbar, typically e.g. a `m:wxComboBox`.\n\nRemark: wxMac: labels are only displayed if wxWidgets is built with `wxMAC_USE_NATIVE_TOOLBAR`\nset to 1","ref":"wxToolBar.html#addControl/3"},{"type":"function","title":"wxToolBar.addRadioTool/4","doc":"","ref":"wxToolBar.html#addRadioTool/4"},{"type":"function","title":"wxToolBar.addRadioTool/5","doc":"Adds a new radio tool to the toolbar.\n\nConsecutive radio tools form a radio group such that exactly one button in the group is\npressed at any moment, in other words whenever a button in the group is pressed the\npreviously pressed button is automatically released. You should avoid having the radio\ngroups of only one element as it would be impossible for the user to use such button.\n\nBy default, the first button in the radio group is initially pressed, the others are not.\n\nSee: `addTool/6`","ref":"wxToolBar.html#addRadioTool/5"},{"type":"function","title":"wxToolBar.addSeparator/1","doc":"Adds a separator for spacing groups of tools.\n\nNotice that the separator uses the look appropriate for the current platform so it can be\na vertical line (MSW, some versions of GTK) or just an empty space or something else.\n\nSee:\n* `addTool/6`\n\n* `setToolSeparation/2`\n\n* `addStretchableSpace/1`","ref":"wxToolBar.html#addSeparator/1"},{"type":"function","title":"wxToolBar.addStretchableSpace/1","doc":"Adds a stretchable space to the toolbar.\n\nAny space not taken up by the fixed items (all items except for stretchable spaces) is\ndistributed in equal measure between the stretchable spaces in the toolbar. The most\ncommon use for this method is to add a single stretchable space before the items which\nshould be right-aligned in the toolbar, but more exotic possibilities are possible, e.g. a\nstretchable space may be added in the beginning and the end of the toolbar to centre all\ntoolbar items.\n\nSee:\n* `addTool/6`\n\n* `addSeparator/1`\n\n* `insertStretchableSpace/2`\n\nSince: 2.9.1","ref":"wxToolBar.html#addStretchableSpace/1"},{"type":"function","title":"wxToolBar.addTool/2","doc":"Adds a tool to the toolbar.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","ref":"wxToolBar.html#addTool/2"},{"type":"function","title":"wxToolBar.addTool/4","doc":"","ref":"wxToolBar.html#addTool/4"},{"type":"function","title":"wxToolBar.addTool/5","doc":"Adds a tool to the toolbar.\n\nThis most commonly used version has fewer parameters than the full version below which\nspecifies the more rarely used button features.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","ref":"wxToolBar.html#addTool/5"},{"type":"function","title":"wxToolBar.addTool/6","doc":"Adds a tool to the toolbar.\n\nRemark: After you have added tools to a toolbar, you must call `realize/1` in order to have the\ntools appear.\n\nSee:\n* `addSeparator/1`\n\n* `addCheckTool/5`\n\n* `addRadioTool/5`\n\n* `insertTool/6`\n\n* `deleteTool/2`\n\n* `realize/1`","ref":"wxToolBar.html#addTool/6"},{"type":"function","title":"wxToolBar.deleteTool/2","doc":"Removes the specified tool from the toolbar and deletes it.\n\nIf you don't want to delete the tool, but just to remove it from the toolbar (to possibly\nadd it back later), you may use `removeTool/2` instead.\n\nNote: It is unnecessary to call `realize/1` for the change to take place, it will happen immediately.\n\nReturn: true if the tool was deleted, false otherwise.\n\nSee: `deleteToolByPos/2`","ref":"wxToolBar.html#deleteTool/2"},{"type":"function","title":"wxToolBar.deleteToolByPos/2","doc":"This function behaves like `deleteTool/2` but it deletes the tool at the specified\nposition and not the one with the given id.","ref":"wxToolBar.html#deleteToolByPos/2"},{"type":"function","title":"wxToolBar.enableTool/3","doc":"Enables or disables the tool.\n\nRemark: Some implementations will change the visible state of the tool to indicate that\nit is disabled.\n\nSee:\n* `getToolEnabled/2`\n\n* `toggleTool/3`","ref":"wxToolBar.html#enableTool/3"},{"type":"function","title":"wxToolBar.findById/2","doc":"Returns a pointer to the tool identified by `id` or NULL if no corresponding tool is\nfound.","ref":"wxToolBar.html#findById/2"},{"type":"function","title":"wxToolBar.findControl/2","doc":"Returns a pointer to the control identified by `id` or NULL if no corresponding control\nis found.","ref":"wxToolBar.html#findControl/2"},{"type":"function","title":"wxToolBar.findToolForPosition/3","doc":"Finds a tool for the given mouse position.\n\nReturn: A pointer to a tool if a tool is found, or NULL otherwise.\n\nRemark: Currently not implemented in wxGTK (always returns NULL there).","ref":"wxToolBar.html#findToolForPosition/3"},{"type":"function","title":"wxToolBar.getMargins/1","doc":"Returns the left/right and top/bottom margins, which are also used for inter-toolspacing.\n\nSee: `setMargins/3`","ref":"wxToolBar.html#getMargins/1"},{"type":"function","title":"wxToolBar.getToolBitmapSize/1","doc":"Returns the size of bitmap that the toolbar expects to have.\n\nThe default bitmap size is platform-dependent: for example, it is 16*15 for MSW and 24*24\nfor GTK. This size does `not` necessarily indicate the best size to use for the toolbars\non the given platform, for this you should use `wxArtProvider::GetNativeSizeHint(wxART_TOOLBAR)`\nbut in any case, as the bitmap size is deduced automatically from the size of the bitmaps\nassociated with the tools added to the toolbar, it is usually unnecessary to call `setToolBitmapSize/2` explicitly.\n\nRemark: Note that this is the size of the bitmap you pass to `addTool/6`, and not the eventual size\nof the tool button.\n\nSee:\n* `setToolBitmapSize/2`\n\n* `getToolSize/1`","ref":"wxToolBar.html#getToolBitmapSize/1"},{"type":"function","title":"wxToolBar.getToolEnabled/2","doc":"Called to determine whether a tool is enabled (responds to user input).\n\nReturn: true if the tool is enabled, false otherwise.\n\nSee: `enableTool/3`","ref":"wxToolBar.html#getToolEnabled/2"},{"type":"function","title":"wxToolBar.getToolLongHelp/2","doc":"Returns the long help for the given tool.\n\nSee:\n* `setToolLongHelp/3`\n\n* `setToolShortHelp/3`","ref":"wxToolBar.html#getToolLongHelp/2"},{"type":"function","title":"wxToolBar.getToolPacking/1","doc":"Returns the value used for packing tools.\n\nSee: `setToolPacking/2`","ref":"wxToolBar.html#getToolPacking/1"},{"type":"function","title":"wxToolBar.getToolPos/2","doc":"Returns the tool position in the toolbar, or `wxNOT_FOUND` if the tool is not found.","ref":"wxToolBar.html#getToolPos/2"},{"type":"function","title":"wxToolBar.getToolSeparation/1","doc":"Returns the default separator size.\n\nSee: `setToolSeparation/2`","ref":"wxToolBar.html#getToolSeparation/1"},{"type":"function","title":"wxToolBar.getToolShortHelp/2","doc":"Returns the short help for the given tool.\n\nSee:\n* `getToolLongHelp/2`\n\n* `setToolShortHelp/3`","ref":"wxToolBar.html#getToolShortHelp/2"},{"type":"function","title":"wxToolBar.getToolSize/1","doc":"Returns the size of a whole button, which is usually larger than a tool bitmap because of\nadded 3D effects.\n\nSee:\n* `setToolBitmapSize/2`\n\n* `getToolBitmapSize/1`","ref":"wxToolBar.html#getToolSize/1"},{"type":"function","title":"wxToolBar.getToolState/2","doc":"Gets the on/off state of a toggle tool.\n\nReturn: true if the tool is toggled on, false otherwise.\n\nSee: `toggleTool/3`","ref":"wxToolBar.html#getToolState/2"},{"type":"function","title":"wxToolBar.insertControl/3","doc":"","ref":"wxToolBar.html#insertControl/3"},{"type":"function","title":"wxToolBar.insertControl/4","doc":"Inserts the control into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addControl/3`\n\n* `insertTool/6`","ref":"wxToolBar.html#insertControl/4"},{"type":"function","title":"wxToolBar.insertSeparator/2","doc":"Inserts the separator into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addSeparator/1`\n\n* `insertTool/6`","ref":"wxToolBar.html#insertSeparator/2"},{"type":"function","title":"wxToolBar.insertStretchableSpace/2","doc":"Inserts a stretchable space at the given position.\n\nSee `addStretchableSpace/1` for details about stretchable spaces.\n\nSee:\n* `insertTool/6`\n\n* `insertSeparator/2`\n\nSince: 2.9.1","ref":"wxToolBar.html#insertStretchableSpace/2"},{"type":"function","title":"wxToolBar.insertTool/3","doc":"","ref":"wxToolBar.html#insertTool/3"},{"type":"function","title":"wxToolBar.insertTool/5","doc":"","ref":"wxToolBar.html#insertTool/5"},{"type":"function","title":"wxToolBar.insertTool/6","doc":"Inserts the tool with the specified attributes into the toolbar at the given position.\n\nYou must call `realize/1` for the change to take place.\n\nSee:\n* `addTool/6`\n\n* `insertControl/4`\n\n* `insertSeparator/2`\n\nReturn: The newly inserted tool or NULL on failure. Notice that with the overload taking `tool`\nparameter the caller is responsible for deleting the tool in the latter case.","ref":"wxToolBar.html#insertTool/6"},{"type":"function","title":"wxToolBar.realize/1","doc":"This function should be called after you have added tools.","ref":"wxToolBar.html#realize/1"},{"type":"function","title":"wxToolBar.removeTool/2","doc":"Removes the given tool from the toolbar but doesn't delete it.\n\nThis allows inserting/adding this tool back to this (or another) toolbar later.\n\nNote: It is unnecessary to call `realize/1` for the change to take place, it will happen immediately.\n\nSee: `deleteTool/2`","ref":"wxToolBar.html#removeTool/2"},{"type":"function","title":"wxToolBar.setMargins/3","doc":"Set the values to be used as margins for the toolbar.\n\nRemark: This must be called before the tools are added if absolute positioning is to be\nused, and the default (zero-size) margins are to be overridden.\n\nSee: `getMargins/1`","ref":"wxToolBar.html#setMargins/3"},{"type":"function","title":"wxToolBar.setToolBitmapSize/2","doc":"Sets the default size of each tool bitmap.\n\nThe default bitmap size is 16 by 15 pixels.\n\nRemark: This should be called to tell the toolbar what the tool bitmap size is. Call it\nbefore you add tools.\n\nSee:\n* `getToolBitmapSize/1`\n\n* `getToolSize/1`","ref":"wxToolBar.html#setToolBitmapSize/2"},{"type":"function","title":"wxToolBar.setToolLongHelp/3","doc":"Sets the long help for the given tool.\n\nRemark: You might use the long help for displaying the tool purpose on the status line.\n\nSee:\n* `getToolLongHelp/2`\n\n* `setToolShortHelp/3`","ref":"wxToolBar.html#setToolLongHelp/3"},{"type":"function","title":"wxToolBar.setToolPacking/2","doc":"Sets the value used for spacing tools.\n\nThe default value is 1.\n\nRemark: The packing is used for spacing in the vertical direction if the toolbar is\nhorizontal, and for spacing in the horizontal direction if the toolbar is vertical.\n\nSee: `getToolPacking/1`","ref":"wxToolBar.html#setToolPacking/2"},{"type":"function","title":"wxToolBar.setToolSeparation/2","doc":"Sets the default separator size.\n\nThe default value is 5.\n\nSee: `addSeparator/1`","ref":"wxToolBar.html#setToolSeparation/2"},{"type":"function","title":"wxToolBar.setToolShortHelp/3","doc":"Sets the short help for the given tool.\n\nRemark: An application might use short help for identifying the tool purpose in a tooltip.\n\nSee:\n* `getToolShortHelp/2`\n\n* `setToolLongHelp/3`","ref":"wxToolBar.html#setToolShortHelp/3"},{"type":"function","title":"wxToolBar.toggleTool/3","doc":"Toggles a tool on or off.\n\nThis does not cause any event to get emitted.\n\nRemark: Only applies to a tool that has been specified as a toggle tool.","ref":"wxToolBar.html#toggleTool/3"},{"type":"type","title":"wxToolBar.wxToolBar/0","doc":"","ref":"wxToolBar.html#t:wxToolBar/0"},{"type":"module","title":"wxToolTip","doc":"This class holds information about a tooltip associated with a window (see `wxWindow:setToolTip/2`).\n\nThe four static methods, `enable/1`, `setDelay/1` `wxToolTip::SetAutoPop()` (not implemented in wx) and `wxToolTip::SetReshow()`\n(not implemented in wx) can be used to globally alter tooltips behaviour.\n\nwxWidgets docs: [wxToolTip](https://docs.wxwidgets.org/3.2/classwx_tool_tip.html)","ref":"wxToolTip.html"},{"type":"function","title":"wxToolTip.destroy/1","doc":"Destroys the object","ref":"wxToolTip.html#destroy/1"},{"type":"function","title":"wxToolTip.enable/1","doc":"Enable or disable tooltips globally.\n\nNote: May not be supported on all platforms (eg. wxCocoa).","ref":"wxToolTip.html#enable/1"},{"type":"function","title":"wxToolTip.getTip/1","doc":"Get the tooltip text.","ref":"wxToolTip.html#getTip/1"},{"type":"function","title":"wxToolTip.getWindow/1","doc":"Get the associated window.","ref":"wxToolTip.html#getWindow/1"},{"type":"function","title":"wxToolTip.new/1","doc":"Constructor.","ref":"wxToolTip.html#new/1"},{"type":"function","title":"wxToolTip.setDelay/1","doc":"Set the delay after which the tooltip appears.\n\nNote: May not be supported on all platforms.","ref":"wxToolTip.html#setDelay/1"},{"type":"function","title":"wxToolTip.setTip/2","doc":"Set the tooltip text.","ref":"wxToolTip.html#setTip/2"},{"type":"type","title":"wxToolTip.wxToolTip/0","doc":"","ref":"wxToolTip.html#t:wxToolTip/0"},{"type":"module","title":"wxToolbook","doc":"`m:wxToolbook` is a class similar to `m:wxNotebook` but which uses a `m:wxToolBar` to\nshow the labels instead of the tabs.\n\nThere is no documentation for this class yet but its usage is identical to `m:wxNotebook`\n(except for the features clearly related to tabs only), so please refer to that class\ndocumentation for now. You can also use the page_samples_notebook to see `m:wxToolbook` in action.\n\nOne feature of this class not supported by `m:wxBookCtrlBase` is the support for\ndisabling some of the pages, see `EnablePage()` (not implemented in wx).","ref":"wxToolbook.html"},{"type":"module","title":"Styles - wxToolbook","doc":"This class supports the following styles:\n\n* wxTBK_BUTTONBAR: Use wxButtonToolBar-based implementation under macOS (ignored under\nother platforms).\n\n* wxTBK_HORZ_LAYOUT: Shows the text and the icons alongside, not vertically stacked (only\nimplement under Windows and GTK 2 platforms as it relies on `wxTB_HORZ_LAYOUT` flag\nsupport). The common wxBookCtrl styles described in the overview_bookctrl are also supported.\n\nSee:\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* `m:wxBookCtrlBase`\n\n* `m:wxNotebook`\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxToolbook](https://docs.wxwidgets.org/3.2/classwx_toolbook.html)","ref":"wxToolbook.html#module-styles"},{"type":"module","title":"Events - wxToolbook","doc":"Event types emitted from this class:\n\n* [`toolbook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`toolbook_page_changing`](`m:wxBookCtrlEvent`)","ref":"wxToolbook.html#module-events"},{"type":"function","title":"wxToolbook.addPage/3","doc":"","ref":"wxToolbook.html#addPage/3"},{"type":"function","title":"wxToolbook.addPage/4","doc":"Adds a new page.\n\nThe page must have the book control itself as the parent and must not have been added to\nthis control previously.\n\nThe call to this function will generate the page changing and page changed events if `select`\nis true, but not when inserting the very first page (as there is no previous page\nselection to switch from in this case and so it wouldn't make sense to e.g. veto such event).\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `insertPage/5`","ref":"wxToolbook.html#addPage/4"},{"type":"function","title":"wxToolbook.advanceSelection/1","doc":"","ref":"wxToolbook.html#advanceSelection/1"},{"type":"function","title":"wxToolbook.advanceSelection/2","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","ref":"wxToolbook.html#advanceSelection/2"},{"type":"function","title":"wxToolbook.assignImageList/2","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxToolbook.html#assignImageList/2"},{"type":"function","title":"wxToolbook.changeSelection/2","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","ref":"wxToolbook.html#changeSelection/2"},{"type":"function","title":"wxToolbook.create/3","doc":"","ref":"wxToolbook.html#create/3"},{"type":"function","title":"wxToolbook.create/4","doc":"Create the tool book control that has already been constructed with the default\nconstructor.","ref":"wxToolbook.html#create/4"},{"type":"function","title":"wxToolbook.deleteAllPages/1","doc":"Deletes all pages.","ref":"wxToolbook.html#deleteAllPages/1"},{"type":"function","title":"wxToolbook.destroy/1","doc":"Destroys the object","ref":"wxToolbook.html#destroy/1"},{"type":"function","title":"wxToolbook.getCurrentPage/1","doc":"Returns the currently selected page or NULL.","ref":"wxToolbook.html#getCurrentPage/1"},{"type":"function","title":"wxToolbook.getImageList/1","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxToolbook.html#getImageList/1"},{"type":"function","title":"wxToolbook.getPage/2","doc":"Returns the window at the given page position.","ref":"wxToolbook.html#getPage/2"},{"type":"function","title":"wxToolbook.getPageCount/1","doc":"Returns the number of pages in the control.","ref":"wxToolbook.html#getPageCount/1"},{"type":"function","title":"wxToolbook.getPageImage/2","doc":"Returns the image index for the given page.","ref":"wxToolbook.html#getPageImage/2"},{"type":"function","title":"wxToolbook.getPageText/2","doc":"Returns the string for the given page.","ref":"wxToolbook.html#getPageText/2"},{"type":"function","title":"wxToolbook.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote that this method may return either the previously or newly selected page when called\nfrom the `EVT_BOOKCTRL_PAGE_CHANGED` handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","ref":"wxToolbook.html#getSelection/1"},{"type":"function","title":"wxToolbook.hitTest/2","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","ref":"wxToolbook.html#hitTest/2"},{"type":"function","title":"wxToolbook.insertPage/4","doc":"","ref":"wxToolbook.html#insertPage/4"},{"type":"function","title":"wxToolbook.insertPage/5","doc":"Inserts a new page at the specified position.\n\nReturn: true if successful, false otherwise.\n\nRemark: Do not delete the page, it will be deleted by the book control.\n\nSee: `addPage/4`","ref":"wxToolbook.html#insertPage/5"},{"type":"function","title":"wxToolbook.new/0","doc":"Constructs a choicebook control.","ref":"wxToolbook.html#new/0"},{"type":"function","title":"wxToolbook.new/2","doc":"","ref":"wxToolbook.html#new/2"},{"type":"function","title":"wxToolbook.new/3","doc":"","ref":"wxToolbook.html#new/3"},{"type":"function","title":"wxToolbook.setImageList/2","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","ref":"wxToolbook.html#setImageList/2"},{"type":"function","title":"wxToolbook.setPageImage/3","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","ref":"wxToolbook.html#setPageImage/3"},{"type":"function","title":"wxToolbook.setPageSize/2","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","ref":"wxToolbook.html#setPageSize/2"},{"type":"function","title":"wxToolbook.setPageText/3","doc":"Sets the text for the given page.","ref":"wxToolbook.html#setPageText/3"},{"type":"function","title":"wxToolbook.setSelection/2","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `getSelection/1`","ref":"wxToolbook.html#setSelection/2"},{"type":"type","title":"wxToolbook.wxToolbook/0","doc":"","ref":"wxToolbook.html#t:wxToolbook/0"},{"type":"module","title":"wxTopLevelWindow","doc":"`m:wxTopLevelWindow` is a common base class for `m:wxDialog` and `m:wxFrame`.\n\nIt is an abstract base class meaning that you never work with objects of this class\ndirectly, but all of its methods are also applicable for the two classes above.\n\nNote that the instances of `m:wxTopLevelWindow` are managed by wxWidgets in the internal\ntop level window list.\n\nSee:\n* `m:wxDialog`\n\n* `m:wxFrame`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTopLevelWindow](https://docs.wxwidgets.org/3.2/classwx_top_level_window.html)","ref":"wxTopLevelWindow.html"},{"type":"module","title":"Events - wxTopLevelWindow","doc":"Event types emitted from this class:\n\n* [`maximize`](`m:wxMaximizeEvent`)\n\n* [`move`](`m:wxMoveEvent`)\n\n* [`show`](`m:wxShowEvent`)","ref":"wxTopLevelWindow.html#module-events"},{"type":"function","title":"wxTopLevelWindow.centerOnScreen/1","doc":"","ref":"wxTopLevelWindow.html#centerOnScreen/1"},{"type":"function","title":"wxTopLevelWindow.centerOnScreen/2","doc":"Equivalent to: `centreOnScreen/2`","ref":"wxTopLevelWindow.html#centerOnScreen/2"},{"type":"function","title":"wxTopLevelWindow.centreOnScreen/1","doc":"","ref":"wxTopLevelWindow.html#centreOnScreen/1"},{"type":"function","title":"wxTopLevelWindow.centreOnScreen/2","doc":"Centres the window on screen.\n\nSee: `wxWindow:centreOnParent/2`","ref":"wxTopLevelWindow.html#centreOnScreen/2"},{"type":"function","title":"wxTopLevelWindow.getIcon/1","doc":"Returns the standard icon of the window.\n\nThe icon will be invalid if it hadn't been previously set by `setIcon/2`.\n\nSee: `getIcons/1`","ref":"wxTopLevelWindow.html#getIcon/1"},{"type":"function","title":"wxTopLevelWindow.getIcons/1","doc":"Returns all icons associated with the window, there will be none of them if neither `setIcon/2`\nnor `setIcons/2` had been called before.\n\nUse `getIcon/1` to get the main icon of the window.\n\nSee: `m:wxIconBundle`","ref":"wxTopLevelWindow.html#getIcons/1"},{"type":"function","title":"wxTopLevelWindow.getTitle/1","doc":"Gets a string containing the window title.\n\nSee: `setTitle/2`","ref":"wxTopLevelWindow.html#getTitle/1"},{"type":"function","title":"wxTopLevelWindow.iconize/1","doc":"","ref":"wxTopLevelWindow.html#iconize/1"},{"type":"function","title":"wxTopLevelWindow.iconize/2","doc":"Iconizes or restores the window.\n\nNote that in wxGTK the change to the window state is not immediate, i.e. `isIconized/1` will typically\nreturn false right after a call to `iconize/2` and its return value will only change after the\ncontrol flow returns to the event loop and the notification about the window being really\niconized is received.\n\nSee:\n* `isIconized/1`\n\n* `m:wxIconizeEvent`","ref":"wxTopLevelWindow.html#iconize/2"},{"type":"function","title":"wxTopLevelWindow.isActive/1","doc":"Returns true if this window is currently active, i.e. if the user is currently working\nwith it.","ref":"wxTopLevelWindow.html#isActive/1"},{"type":"function","title":"wxTopLevelWindow.isFullScreen/1","doc":"Returns true if the window is in fullscreen mode.\n\nSee: `showFullScreen/3`","ref":"wxTopLevelWindow.html#isFullScreen/1"},{"type":"function","title":"wxTopLevelWindow.isIconized/1","doc":"Returns true if the window is iconized.","ref":"wxTopLevelWindow.html#isIconized/1"},{"type":"function","title":"wxTopLevelWindow.isMaximized/1","doc":"Returns true if the window is maximized.","ref":"wxTopLevelWindow.html#isMaximized/1"},{"type":"function","title":"wxTopLevelWindow.maximize/1","doc":"","ref":"wxTopLevelWindow.html#maximize/1"},{"type":"function","title":"wxTopLevelWindow.maximize/2","doc":"Maximizes or restores the window.\n\nNote that, just as with `iconize/2`, the change to the window state is not immediate in at least\nwxGTK port.\n\nSee: `iconize/2`","ref":"wxTopLevelWindow.html#maximize/2"},{"type":"function","title":"wxTopLevelWindow.requestUserAttention/1","doc":"","ref":"wxTopLevelWindow.html#requestUserAttention/1"},{"type":"function","title":"wxTopLevelWindow.requestUserAttention/2","doc":"Use a system-dependent way to attract users attention to the window when it is in\nbackground.\n\n`flags` may have the value of either `?wxUSER\\_ATTENTION\\_INFO` (default) or `?wxUSER\\_ATTENTION\\_ERROR`\nwhich results in a more drastic action. When in doubt, use the default value.\n\nNote: This function should normally be only used when the application is not already in foreground.\n\nThis function is currently implemented for Win32 where it flashes the window icon in the\ntaskbar, and for wxGTK with task bars supporting it.","ref":"wxTopLevelWindow.html#requestUserAttention/2"},{"type":"function","title":"wxTopLevelWindow.setIcon/2","doc":"Sets the icon for this window.\n\nRemark: The window takes a 'copy' of `icon`, but since it uses reference counting, the\ncopy is very quick. It is safe to delete `icon` after calling this function.\n\nNote: In wxMSW, `icon` must be either 16x16 or 32x32 icon.\n\nSee:\n* `m:wxIcon`\n\n* `setIcons/2`","ref":"wxTopLevelWindow.html#setIcon/2"},{"type":"function","title":"wxTopLevelWindow.setIcons/2","doc":"Sets several icons of different sizes for this window: this allows using different icons\nfor different situations (e.g.\n\ntask switching bar, taskbar, window title bar) instead of scaling, with possibly bad\nlooking results, the only icon set by `setIcon/2`.\n\nNote: In wxMSW, `icons` must contain a 16x16 or 32x32 icon, preferably both.\n\nSee: `m:wxIconBundle`","ref":"wxTopLevelWindow.html#setIcons/2"},{"type":"function","title":"wxTopLevelWindow.setShape/2","doc":"If the platform supports it, sets the shape of the window to that depicted by `region`.\n\nThe system will not display or respond to any mouse event for the pixels that lie outside\nof the region. To reset the window to the normal rectangular shape simply call `setShape/2` again with\nan empty `m:wxRegion`. Returns true if the operation is successful.\n\nThis method is available in this class only since wxWidgets 2.9.3, previous versions only\nprovided it in `m:wxTopLevelWindow`.\n\nNote that windows with non default shape have a fixed size and can't be resized using `wxWindow:setSize/6`.","ref":"wxTopLevelWindow.html#setShape/2"},{"type":"function","title":"wxTopLevelWindow.setTitle/2","doc":"Sets the window title.\n\nSee: `getTitle/1`","ref":"wxTopLevelWindow.html#setTitle/2"},{"type":"function","title":"wxTopLevelWindow.showFullScreen/2","doc":"","ref":"wxTopLevelWindow.html#showFullScreen/2"},{"type":"function","title":"wxTopLevelWindow.showFullScreen/3","doc":"Depending on the value of `show` parameter the window is either shown full screen or\nrestored to its normal state.\n\n`style` is a bit list containing some or all of the following values, which indicate what\nelements of the window to hide in full-screen mode:\n\n* `?wxFULLSCREEN\\_NOMENUBAR`\n\n* `?wxFULLSCREEN\\_NOTOOLBAR`\n\n* `?wxFULLSCREEN\\_NOSTATUSBAR`\n\n* `?wxFULLSCREEN\\_NOBORDER`\n\n* `?wxFULLSCREEN\\_NOCAPTION`\n\n* `?wxFULLSCREEN\\_ALL` (all of the above)\n\nThis function has not been tested with MDI frames.\n\nNote: Showing a window full screen also actually `wxWindow:show/2`s the window if it isn't shown.\n\nSee: `isFullScreen/1`","ref":"wxTopLevelWindow.html#showFullScreen/3"},{"type":"type","title":"wxTopLevelWindow.wxTopLevelWindow/0","doc":"","ref":"wxTopLevelWindow.html#t:wxTopLevelWindow/0"},{"type":"module","title":"wxTreeCtrl","doc":"A tree control presents information as a hierarchy, with items that may be expanded to\nshow further items.\n\nItems in a tree control are referenced by `wxTreeItemId` (not implemented in wx) handles,\nwhich may be tested for validity by calling `wxTreeItemId::IsOk()` (not implemented in wx).\n\nA similar control with a fully native implementation for GTK+ and macOS as well is `wxDataViewTreeCtrl`\n(not implemented in wx).\n\nTo intercept events from a tree control, use the event table macros described in `m:wxTreeEvent`.","ref":"wxTreeCtrl.html"},{"type":"module","title":"Styles - wxTreeCtrl","doc":"This class supports the following styles:\n\n* wxTR_EDIT_LABELS: Use this style if you wish the user to be able to edit labels in the\ntree control.\n\n* wxTR_NO_BUTTONS: For convenience to document that no buttons are to be drawn.\n\n* wxTR_HAS_BUTTONS: Use this style to show + and - buttons to the left of parent items.\n\n* wxTR_TWIST_BUTTONS: Selects alternative style of +/`-` buttons and shows rotating\n(\"twisting\") arrows instead. Currently this style is only implemented under Microsoft\nWindows Vista and later Windows versions and is ignored under the other platforms as\nenabling it is equivalent to using `wxSystemThemedControl::EnableSystemTheme()` (not\nimplemented in wx).\n\n* wxTR_NO_LINES: Use this style to hide vertical level connectors.\n\n* wxTR_FULL_ROW_HIGHLIGHT: Use this style to have the background colour and the selection\nhighlight extend over the entire horizontal row of the tree control window. (This flag is\nignored under Windows unless you specify `wxTR_NO_LINES` as well.)\n\n* wxTR_LINES_AT_ROOT: Use this style to show lines leading to the root nodes (unless no `wxTR_NO_LINES`\nis also used, in which case no lines are shown). Note that in the MSW version, if this\nstyle is omitted, not only the lines, but also the button used for expanding the root item\nis not shown, which can be unexpected, so it is recommended to always use it.\n\n* wxTR_HIDE_ROOT: Use this style to suppress the display of the root node, effectively\ncausing the first-level nodes to appear as a series of root nodes.\n\n* wxTR_ROW_LINES: Use this style to draw a contrasting border between displayed rows.\n\n* wxTR_HAS_VARIABLE_ROW_HEIGHT: Use this style to cause row heights to be just big enough\nto fit the content. If not set, all rows use the largest row height. The default is that\nthis flag is unset. Generic only.\n\n* wxTR_SINGLE: For convenience to document that only one item may be selected at a time.\nSelecting another item causes the current selection, if any, to be deselected. This is the\ndefault.\n\n* wxTR_MULTIPLE: Use this style to allow a range of items to be selected. If a second range\nis selected, the current range, if any, is deselected.\n\n* wxTR_DEFAULT_STYLE: The set of flags that are closest to the defaults for the native\ncontrol for a particular toolkit.\n\nSee also overview_windowstyles.\n\n`Win32` `notes:`\n\n`m:wxTreeCtrl` class uses the standard common treeview control under Win32 implemented in\nthe system library comctl32.dll. Some versions of this library are known to have bugs with\nhandling the tree control colours: the usual symptom is that the expanded items leave\nblack (or otherwise incorrectly coloured) background behind them, especially for the\ncontrols using non-default background colour. The recommended solution is to upgrade the\ncomctl32.dll to a newer version: see [http://www.microsoft.com/downloads/details.aspx?familyid=cb2cf3a2-8025-4e8f-8511-9b476a8d35d2](http://www.microsoft.com/downloads/details.aspx?familyid=cb2cf3a2-8025-4e8f-8511-9b476a8d35d2)\n\nSee:\n* `m:wxTreeEvent`\n\n* [Overview treectrl](https://docs.wxwidgets.org/3.2/overview_treectrl.html#overview_treectrl)\n\n* `m:wxListBox`\n\n* `m:wxListCtrl`\n\n* `m:wxImageList`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTreeCtrl](https://docs.wxwidgets.org/3.2/classwx_tree_ctrl.html)","ref":"wxTreeCtrl.html#module-styles"},{"type":"module","title":"Events - wxTreeCtrl","doc":"Event types emitted from this class:\n\n* [`command_tree_begin_drag`](`m:wxTreeEvent`)\n\n* [`command_tree_begin_rdrag`](`m:wxTreeEvent`)\n\n* [`command_tree_end_drag`](`m:wxTreeEvent`)\n\n* [`command_tree_begin_label_edit`](`m:wxTreeEvent`)\n\n* [`command_tree_end_label_edit`](`m:wxTreeEvent`)\n\n* [`command_tree_delete_item`](`m:wxTreeEvent`)\n\n* [`command_tree_get_info`](`m:wxTreeEvent`)\n\n* [`command_tree_set_info`](`m:wxTreeEvent`)\n\n* [`command_tree_item_activated`](`m:wxTreeEvent`)\n\n* [`command_tree_item_collapsed`](`m:wxTreeEvent`)\n\n* [`command_tree_item_collapsing`](`m:wxTreeEvent`)\n\n* [`command_tree_item_expanded`](`m:wxTreeEvent`)\n\n* [`command_tree_item_expanding`](`m:wxTreeEvent`)\n\n* [`command_tree_item_right_click`](`m:wxTreeEvent`)\n\n* [`command_tree_item_middle_click`](`m:wxTreeEvent`)\n\n* [`command_tree_sel_changed`](`m:wxTreeEvent`)\n\n* [`command_tree_sel_changing`](`m:wxTreeEvent`)\n\n* [`command_tree_key_down`](`m:wxTreeEvent`)\n\n* [`command_tree_item_gettooltip`](`m:wxTreeEvent`)\n\n* [`command_tree_item_menu`](`m:wxTreeEvent`)\n\n* [`command_tree_state_image_click`](`m:wxTreeEvent`)","ref":"wxTreeCtrl.html#module-events"},{"type":"function","title":"wxTreeCtrl.addRoot/2","doc":"","ref":"wxTreeCtrl.html#addRoot/2"},{"type":"function","title":"wxTreeCtrl.addRoot/3","doc":"Adds the root node to the tree, returning the new item.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","ref":"wxTreeCtrl.html#addRoot/3"},{"type":"function","title":"wxTreeCtrl.appendItem/3","doc":"","ref":"wxTreeCtrl.html#appendItem/3"},{"type":"function","title":"wxTreeCtrl.appendItem/4","doc":"Appends an item to the end of the branch identified by `parent`, return a new item id.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","ref":"wxTreeCtrl.html#appendItem/4"},{"type":"function","title":"wxTreeCtrl.assignImageList/2","doc":"Sets the normal image list.\n\nThe image list assigned with this method will be automatically deleted by `m:wxTreeCtrl`\nas appropriate (i.e. it takes ownership of the list).\n\nSee: `setImageList/2`","ref":"wxTreeCtrl.html#assignImageList/2"},{"type":"function","title":"wxTreeCtrl.assignStateImageList/2","doc":"Sets the state image list.\n\nImage list assigned with this method will be automatically deleted by `m:wxTreeCtrl` as\nappropriate (i.e. it takes ownership of the list).\n\nSee: `setStateImageList/2`","ref":"wxTreeCtrl.html#assignStateImageList/2"},{"type":"function","title":"wxTreeCtrl.collapse/2","doc":"Collapses the given item.","ref":"wxTreeCtrl.html#collapse/2"},{"type":"function","title":"wxTreeCtrl.collapseAndReset/2","doc":"Collapses the given item and removes all children.","ref":"wxTreeCtrl.html#collapseAndReset/2"},{"type":"function","title":"wxTreeCtrl.create/2","doc":"","ref":"wxTreeCtrl.html#create/2"},{"type":"function","title":"wxTreeCtrl.create/3","doc":"Creates the tree control.\n\nSee `new/2` for further details.","ref":"wxTreeCtrl.html#create/3"},{"type":"function","title":"wxTreeCtrl.delete/2","doc":"Deletes the specified item.\n\nA `EVT_TREE_DELETE_ITEM` event will be generated.\n\nThis function may cause a subsequent call to `getNextChild/3` to fail.","ref":"wxTreeCtrl.html#delete/2"},{"type":"function","title":"wxTreeCtrl.deleteAllItems/1","doc":"Deletes all items in the control.\n\nThis function generates `wxEVT_TREE_DELETE_ITEM` events for each item being deleted,\nincluding the root one if it is shown, i.e. unless wxTR_HIDE_ROOT style is used.","ref":"wxTreeCtrl.html#deleteAllItems/1"},{"type":"function","title":"wxTreeCtrl.deleteChildren/2","doc":"Deletes all children of the given item (but not the item itself).\n\nA `wxEVT_TREE_DELETE_ITEM` event will be generated for every item being deleted.\n\nIf you have called `setItemHasChildren/3`, you may need to call it again since `deleteChildren/2` does not automatically clear\nthe setting.","ref":"wxTreeCtrl.html#deleteChildren/2"},{"type":"function","title":"wxTreeCtrl.destroy/1","doc":"Destroys the object","ref":"wxTreeCtrl.html#destroy/1"},{"type":"function","title":"wxTreeCtrl.editLabel/2","doc":"Starts editing the label of the given `item`.\n\nThis function generates a `EVT_TREE_BEGIN_LABEL_EDIT` event which can be vetoed so that\nno text control will appear for in-place editing.\n\nIf the user changed the label (i.e. s/he does not press ESC or leave the text control\nwithout changes, a `EVT_TREE_END_LABEL_EDIT` event will be sent which can be vetoed as well.\n\nSee: `m:wxTreeEvent`","ref":"wxTreeCtrl.html#editLabel/2"},{"type":"function","title":"wxTreeCtrl.ensureVisible/2","doc":"Scrolls and/or expands items to ensure that the given item is visible.\n\nThis method can be used, and will work, even while the window is frozen (see `wxWindow:freeze/1`).","ref":"wxTreeCtrl.html#ensureVisible/2"},{"type":"function","title":"wxTreeCtrl.expand/2","doc":"Expands the given item.","ref":"wxTreeCtrl.html#expand/2"},{"type":"function","title":"wxTreeCtrl.getBoundingRect/2","doc":"","ref":"wxTreeCtrl.html#getBoundingRect/2"},{"type":"function","title":"wxTreeCtrl.getBoundingRect/3","doc":"Retrieves the rectangle bounding the `item`.\n\nIf `textOnly` is true, only the rectangle around the item's label will be returned,\notherwise the item's image is also taken into account.\n\nThe return value is true if the rectangle was successfully retrieved or false if it was\nnot (in this case `rect` is not changed) - for example, if the item is currently invisible.\n\nNotice that the rectangle coordinates are logical, not physical ones. So, for example,\nthe x coordinate may be negative if the tree has a horizontal scrollbar and its position\nis not 0.","ref":"wxTreeCtrl.html#getBoundingRect/3"},{"type":"function","title":"wxTreeCtrl.getChildrenCount/2","doc":"","ref":"wxTreeCtrl.html#getChildrenCount/2"},{"type":"function","title":"wxTreeCtrl.getChildrenCount/3","doc":"Returns the number of items in the branch.\n\nIf `recursively` is true, returns the total number of descendants, otherwise only one\nlevel of children is counted.","ref":"wxTreeCtrl.html#getChildrenCount/3"},{"type":"function","title":"wxTreeCtrl.getCount/1","doc":"Returns the number of items in the control.","ref":"wxTreeCtrl.html#getCount/1"},{"type":"function","title":"wxTreeCtrl.getEditControl/1","doc":"Returns the edit control being currently used to edit a label.\n\nReturns NULL if no label is being edited.\n\nNote: This is currently only implemented for wxMSW.","ref":"wxTreeCtrl.html#getEditControl/1"},{"type":"function","title":"wxTreeCtrl.getFirstChild/2","doc":"Returns the first child; call `getNextChild/3` for the next child.\n\nFor this enumeration function you must pass in a 'cookie' parameter which is opaque for\nthe application but is necessary for the library to make these functions reentrant (i.e.\nallow more than one enumeration on one and the same object simultaneously). The cookie\npassed to `getFirstChild/2` and `getNextChild/3` should be the same variable.\n\nReturns an invalid tree item (i.e. `wxTreeItemId::IsOk()` (not implemented in wx) returns\nfalse) if there are no further children.\n\nSee:\n* `getNextChild/3`\n\n* `getNextSibling/2`","ref":"wxTreeCtrl.html#getFirstChild/2"},{"type":"function","title":"wxTreeCtrl.getFirstVisibleItem/1","doc":"Returns the first visible item.","ref":"wxTreeCtrl.html#getFirstVisibleItem/1"},{"type":"function","title":"wxTreeCtrl.getImageList/1","doc":"Returns the normal image list.","ref":"wxTreeCtrl.html#getImageList/1"},{"type":"function","title":"wxTreeCtrl.getIndent/1","doc":"Returns the current tree control indentation.","ref":"wxTreeCtrl.html#getIndent/1"},{"type":"function","title":"wxTreeCtrl.getItemBackgroundColour/2","doc":"Returns the background colour of the item.","ref":"wxTreeCtrl.html#getItemBackgroundColour/2"},{"type":"function","title":"wxTreeCtrl.getItemData/2","doc":"Returns the tree item data associated with the item.","ref":"wxTreeCtrl.html#getItemData/2"},{"type":"function","title":"wxTreeCtrl.getItemFont/2","doc":"Returns the font of the item label.\n\nIf the font hadn't been explicitly set for the specified `item` with `setItemFont/3`, returns an invalid\n?wxNullFont font. `wxWindow:getFont/1` can be used to retrieve the global tree control font used for the items\nwithout any specific font.","ref":"wxTreeCtrl.html#getItemFont/2"},{"type":"function","title":"wxTreeCtrl.getItemImage/2","doc":"","ref":"wxTreeCtrl.html#getItemImage/2"},{"type":"function","title":"wxTreeCtrl.getItemImage/3","doc":"Gets the specified item image.\n\nThe value of `which` may be:\n\n* ?wxTreeItemIcon\\_Normal: to get the normal item image.\n\n* ?wxTreeItemIcon\\_Selected: to get the selected item image (i.e. the image which is shown\nwhen the item is currently selected).\n\n* ?wxTreeItemIcon\\_Expanded: to get the expanded image (this only makes sense for items\nwhich have children - then this image is shown when the item is expanded and the normal\nimage is shown when it is collapsed).\n\n* ?wxTreeItemIcon\\_SelectedExpanded: to get the selected expanded image (which is shown\nwhen an expanded item is currently selected).","ref":"wxTreeCtrl.html#getItemImage/3"},{"type":"function","title":"wxTreeCtrl.getItemParent/2","doc":"Returns the item's parent.","ref":"wxTreeCtrl.html#getItemParent/2"},{"type":"function","title":"wxTreeCtrl.getItemText/2","doc":"Returns the item label.","ref":"wxTreeCtrl.html#getItemText/2"},{"type":"function","title":"wxTreeCtrl.getItemTextColour/2","doc":"Returns the colour of the item label.","ref":"wxTreeCtrl.html#getItemTextColour/2"},{"type":"function","title":"wxTreeCtrl.getLastChild/2","doc":"Returns the last child of the item (or an invalid tree item if this item has no\nchildren).\n\nSee:\n* `getFirstChild/2`\n\n* `getNextSibling/2`\n\n* `getLastChild/2`","ref":"wxTreeCtrl.html#getLastChild/2"},{"type":"function","title":"wxTreeCtrl.getNextChild/3","doc":"Returns the next child; call `getFirstChild/2` for the first child.\n\nFor this enumeration function you must pass in a 'cookie' parameter which is opaque for\nthe application but is necessary for the library to make these functions reentrant (i.e.\nallow more than one enumeration on one and the same object simultaneously). The cookie\npassed to `getFirstChild/2` and `getNextChild/3` should be the same.\n\nReturns an invalid tree item if there are no further children.\n\nSee: `getFirstChild/2`","ref":"wxTreeCtrl.html#getNextChild/3"},{"type":"function","title":"wxTreeCtrl.getNextSibling/2","doc":"Returns the next sibling of the specified item; call `getPrevSibling/2` for the previous\nsibling.\n\nReturns an invalid tree item if there are no further siblings.\n\nSee: `getPrevSibling/2`","ref":"wxTreeCtrl.html#getNextSibling/2"},{"type":"function","title":"wxTreeCtrl.getNextVisible/2","doc":"Returns the next visible item or an invalid item if this item is the last visible one.\n\nNote: The `item` itself must be visible.","ref":"wxTreeCtrl.html#getNextVisible/2"},{"type":"function","title":"wxTreeCtrl.getPrevSibling/2","doc":"Returns the previous sibling of the specified item; call `getNextSibling/2` for the next\nsibling.\n\nReturns an invalid tree item if there are no further children.\n\nSee: `getNextSibling/2`","ref":"wxTreeCtrl.html#getPrevSibling/2"},{"type":"function","title":"wxTreeCtrl.getPrevVisible/2","doc":"Returns the previous visible item or an invalid item if this item is the first visible\none.\n\nNote: The `item` itself must be visible.","ref":"wxTreeCtrl.html#getPrevVisible/2"},{"type":"function","title":"wxTreeCtrl.getRootItem/1","doc":"Returns the root item for the tree control.","ref":"wxTreeCtrl.html#getRootItem/1"},{"type":"function","title":"wxTreeCtrl.getSelection/1","doc":"Returns the selection, or an invalid item if there is no selection.\n\nThis function only works with the controls without `wxTR_MULTIPLE` style, use `getSelections/1` for the\ncontrols which do have this style or, if a single item is wanted, use `GetFocusedItem()`\n(not implemented in wx).","ref":"wxTreeCtrl.html#getSelection/1"},{"type":"function","title":"wxTreeCtrl.getSelections/1","doc":"Fills the array of tree items passed in with the currently selected items.\n\nThis function can be called only if the control has the `wxTR_MULTIPLE` style.\n\nReturns the number of selected items.","ref":"wxTreeCtrl.html#getSelections/1"},{"type":"function","title":"wxTreeCtrl.getStateImageList/1","doc":"Returns the state image list (from which application-defined state images are taken).","ref":"wxTreeCtrl.html#getStateImageList/1"},{"type":"function","title":"wxTreeCtrl.hitTest/2","doc":"Calculates which (if any) item is under the given `point`, returning the tree item id at\nthis point plus extra information `flags`.\n\n`flags` is a bitlist of the following:\n\n* `wxTREE_HITTEST_ABOVE:` Above the client area.\n\n* `wxTREE_HITTEST_BELOW:` Below the client area.\n\n* `wxTREE_HITTEST_NOWHERE:` In the client area but below the last item.\n\n* `wxTREE_HITTEST_ONITEMBUTTON:` On the button associated with an item.\n\n* `wxTREE_HITTEST_ONITEMICON:` On the bitmap associated with an item.\n\n* `wxTREE_HITTEST_ONITEMINDENT:` In the indentation associated with an item.\n\n* `wxTREE_HITTEST_ONITEMLABEL:` On the label (string) associated with an item.\n\n* `wxTREE_HITTEST_ONITEMRIGHT:` In the area to the right of an item.\n\n* `wxTREE_HITTEST_ONITEMSTATEICON:` On the state icon for a tree view item that is in a\nuser-defined state.\n\n* `wxTREE_HITTEST_TOLEFT:` To the right of the client area.\n\n* `wxTREE_HITTEST_TORIGHT:` To the left of the client area.","ref":"wxTreeCtrl.html#hitTest/2"},{"type":"function","title":"wxTreeCtrl.insertItem/4","doc":"","ref":"wxTreeCtrl.html#insertItem/4"},{"type":"function","title":"wxTreeCtrl.insertItem/5","doc":"Inserts an item after a given one (`previous`).\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","ref":"wxTreeCtrl.html#insertItem/5"},{"type":"function","title":"wxTreeCtrl.isBold/2","doc":"Returns true if the given item is in bold state.\n\nSee: `setItemBold/3`","ref":"wxTreeCtrl.html#isBold/2"},{"type":"function","title":"wxTreeCtrl.isExpanded/2","doc":"Returns true if the item is expanded (only makes sense if it has children).","ref":"wxTreeCtrl.html#isExpanded/2"},{"type":"function","title":"wxTreeCtrl.isSelected/2","doc":"Returns true if the item is selected.","ref":"wxTreeCtrl.html#isSelected/2"},{"type":"function","title":"wxTreeCtrl.isTreeItemIdOk/1","doc":"Returns true if the item is valid.","ref":"wxTreeCtrl.html#isTreeItemIdOk/1"},{"type":"function","title":"wxTreeCtrl.isVisible/2","doc":"Returns true if the item is visible on the screen.","ref":"wxTreeCtrl.html#isVisible/2"},{"type":"function","title":"wxTreeCtrl.itemHasChildren/2","doc":"Returns true if the item has children.","ref":"wxTreeCtrl.html#itemHasChildren/2"},{"type":"function","title":"wxTreeCtrl.new/0","doc":"Default Constructor.","ref":"wxTreeCtrl.html#new/0"},{"type":"function","title":"wxTreeCtrl.new/1","doc":"","ref":"wxTreeCtrl.html#new/1"},{"type":"function","title":"wxTreeCtrl.new/2","doc":"Constructor, creating and showing a tree control.\n\nSee: `create/3`","ref":"wxTreeCtrl.html#new/2"},{"type":"function","title":"wxTreeCtrl.prependItem/3","doc":"","ref":"wxTreeCtrl.html#prependItem/3"},{"type":"function","title":"wxTreeCtrl.prependItem/4","doc":"Appends an item as the first child of `parent`, return a new item id.\n\nThe `image` and `selImage` parameters are an index within the normal image list\nspecifying the image to use for unselected and selected items, respectively. If `image` >\n-1 and `selImage` is -1, the same image is used for both selected and unselected items.","ref":"wxTreeCtrl.html#prependItem/4"},{"type":"function","title":"wxTreeCtrl.scrollTo/2","doc":"Scrolls the specified item into view.\n\nNote that this method doesn't work while the window is frozen (See `wxWindow:freeze/1`), at least under MSW.\n\nSee: `ensureVisible/2`","ref":"wxTreeCtrl.html#scrollTo/2"},{"type":"function","title":"wxTreeCtrl.selectItem/2","doc":"","ref":"wxTreeCtrl.html#selectItem/2"},{"type":"function","title":"wxTreeCtrl.selectItem/3","doc":"Selects the given item.\n\nIn multiple selection controls, can be also used to deselect a currently selected item if\nthe value of `select` is false.\n\nNotice that calling this method will generate `wxEVT_TREE_SEL_CHANGING` and `wxEVT_TREE_SEL_CHANGED`\nevents and that the change could be vetoed by the former event handler.","ref":"wxTreeCtrl.html#selectItem/3"},{"type":"function","title":"wxTreeCtrl.setImageList/2","doc":"Sets the normal image list.\n\nThe image list assigned with this method will `not` be deleted by `m:wxTreeCtrl`'s\ndestructor, you must delete it yourself.\n\nSee: `assignImageList/2`","ref":"wxTreeCtrl.html#setImageList/2"},{"type":"function","title":"wxTreeCtrl.setIndent/2","doc":"Sets the indentation for the tree control.","ref":"wxTreeCtrl.html#setIndent/2"},{"type":"function","title":"wxTreeCtrl.setItemBackgroundColour/3","doc":"Sets the colour of the item's background.","ref":"wxTreeCtrl.html#setItemBackgroundColour/3"},{"type":"function","title":"wxTreeCtrl.setItemBold/2","doc":"","ref":"wxTreeCtrl.html#setItemBold/2"},{"type":"function","title":"wxTreeCtrl.setItemBold/3","doc":"Makes item appear in bold font if `bold` parameter is true or resets it to the normal\nstate.\n\nSee: `isBold/2`","ref":"wxTreeCtrl.html#setItemBold/3"},{"type":"function","title":"wxTreeCtrl.setItemData/3","doc":"Sets the item client data.\n\nNotice that the client data previously associated with the `item` (if any) is `not` freed\nby this function and so calling this function multiple times for the same item will result\nin memory leaks unless you delete the old item data pointer yourself.","ref":"wxTreeCtrl.html#setItemData/3"},{"type":"function","title":"wxTreeCtrl.setItemDropHighlight/2","doc":"","ref":"wxTreeCtrl.html#setItemDropHighlight/2"},{"type":"function","title":"wxTreeCtrl.setItemDropHighlight/3","doc":"Gives the item the visual feedback for Drag'n'Drop actions, which is useful if something\nis dragged from the outside onto the tree control (as opposed to a DnD operation within\nthe tree control, which already is implemented internally).","ref":"wxTreeCtrl.html#setItemDropHighlight/3"},{"type":"function","title":"wxTreeCtrl.setItemFont/3","doc":"Sets the item's font.\n\nAll items in the tree should have the same height to avoid text clipping, so the fonts\nheight should be the same for all of them, although font attributes may vary.\n\nSee: `setItemBold/3`","ref":"wxTreeCtrl.html#setItemFont/3"},{"type":"function","title":"wxTreeCtrl.setItemHasChildren/2","doc":"","ref":"wxTreeCtrl.html#setItemHasChildren/2"},{"type":"function","title":"wxTreeCtrl.setItemHasChildren/3","doc":"Force appearance of the button next to the item.\n\nThis is useful to allow the user to expand the items which don't have any children now,\nbut instead adding them only when needed, thus minimizing memory usage and loading time.","ref":"wxTreeCtrl.html#setItemHasChildren/3"},{"type":"function","title":"wxTreeCtrl.setItemImage/3","doc":"","ref":"wxTreeCtrl.html#setItemImage/3"},{"type":"function","title":"wxTreeCtrl.setItemImage/4","doc":"Sets the specified item's image.\n\nSee `getItemImage/3` for the description of the `which` parameter.","ref":"wxTreeCtrl.html#setItemImage/4"},{"type":"function","title":"wxTreeCtrl.setItemText/3","doc":"Sets the item label.","ref":"wxTreeCtrl.html#setItemText/3"},{"type":"function","title":"wxTreeCtrl.setItemTextColour/3","doc":"Sets the colour of the item's text.","ref":"wxTreeCtrl.html#setItemTextColour/3"},{"type":"function","title":"wxTreeCtrl.setStateImageList/2","doc":"Sets the state image list (from which application-defined state images are taken).\n\nImage list assigned with this method will `not` be deleted by `m:wxTreeCtrl`'s\ndestructor, you must delete it yourself.\n\nSee: `assignStateImageList/2`","ref":"wxTreeCtrl.html#setStateImageList/2"},{"type":"function","title":"wxTreeCtrl.setWindowStyle/2","doc":"Sets the mode flags associated with the display of the tree control.\n\nThe new mode takes effect immediately.\n\nNote: Generic only; MSW ignores changes.","ref":"wxTreeCtrl.html#setWindowStyle/2"},{"type":"function","title":"wxTreeCtrl.sortChildren/2","doc":"Sorts the children of the given item using `OnCompareItems()` (not implemented in wx).\n\nYou should override that method to change the sort order (the default is ascending\ncase-sensitive alphabetical order).","ref":"wxTreeCtrl.html#sortChildren/2"},{"type":"function","title":"wxTreeCtrl.toggle/2","doc":"Toggles the given item between collapsed and expanded states.","ref":"wxTreeCtrl.html#toggle/2"},{"type":"function","title":"wxTreeCtrl.toggleItemSelection/2","doc":"Toggles the given item between selected and unselected states.\n\nFor multiselection controls only.","ref":"wxTreeCtrl.html#toggleItemSelection/2"},{"type":"function","title":"wxTreeCtrl.unselect/1","doc":"Removes the selection from the currently selected item (if any).","ref":"wxTreeCtrl.html#unselect/1"},{"type":"function","title":"wxTreeCtrl.unselectAll/1","doc":"This function either behaves the same as `unselect/1` if the control doesn't have `wxTR\\_MULTIPLE`\nstyle, or removes the selection from all items if it does have this style.","ref":"wxTreeCtrl.html#unselectAll/1"},{"type":"function","title":"wxTreeCtrl.unselectItem/2","doc":"Unselects the given item.\n\nThis works in multiselection controls only.","ref":"wxTreeCtrl.html#unselectItem/2"},{"type":"type","title":"wxTreeCtrl.wxTreeCtrl/0","doc":"","ref":"wxTreeCtrl.html#t:wxTreeCtrl/0"},{"type":"module","title":"wxTreeEvent","doc":"A tree event holds information about events associated with `m:wxTreeCtrl` objects.\n\nTo process input from a tree control, use these event handler macros to direct input to\nmember functions that take a `m:wxTreeEvent` argument.\n\nSee: `m:wxTreeCtrl`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxTreeEvent](https://docs.wxwidgets.org/3.2/classwx_tree_event.html)","ref":"wxTreeEvent.html"},{"type":"module","title":"Events - wxTreeEvent","doc":"Use `wxEvtHandler:connect/3` with `wxTreeEventType` to subscribe to events of this type.","ref":"wxTreeEvent.html#module-events"},{"type":"function","title":"wxTreeEvent.getItem/1","doc":"Returns the item (valid for all events).","ref":"wxTreeEvent.html#getItem/1"},{"type":"function","title":"wxTreeEvent.getKeyCode/1","doc":"Returns the key code if the event is a key event.\n\nUse `getKeyEvent/1` to get the values of the modifier keys for this event (i.e. Shift or Ctrl).","ref":"wxTreeEvent.html#getKeyCode/1"},{"type":"function","title":"wxTreeEvent.getKeyEvent/1","doc":"Returns the key event for `EVT_TREE_KEY_DOWN` events.","ref":"wxTreeEvent.html#getKeyEvent/1"},{"type":"function","title":"wxTreeEvent.getLabel/1","doc":"Returns the label if the event is a begin or end edit label event.","ref":"wxTreeEvent.html#getLabel/1"},{"type":"function","title":"wxTreeEvent.getOldItem/1","doc":"Returns the old item index (valid for `EVT\\_TREE\\_SEL\\_CHANGING` and `EVT\\_TREE\\_SEL\\_CHANGED`\nevents).","ref":"wxTreeEvent.html#getOldItem/1"},{"type":"function","title":"wxTreeEvent.getPoint/1","doc":"Returns the position of the mouse pointer if the event is a drag or menu-context event.\n\nIn both cases the position is in client coordinates - i.e. relative to the `m:wxTreeCtrl`\nwindow (so that you can pass it directly to e.g. `wxWindow:popupMenu/4`).","ref":"wxTreeEvent.html#getPoint/1"},{"type":"function","title":"wxTreeEvent.isEditCancelled/1","doc":"Returns true if the label edit was cancelled.\n\nThis should be called from within an `EVT_TREE_END_LABEL_EDIT` handler.","ref":"wxTreeEvent.html#isEditCancelled/1"},{"type":"function","title":"wxTreeEvent.setToolTip/2","doc":"Set the tooltip for the item (valid for `EVT\\_TREE\\_ITEM\\_GETTOOLTIP` events).\n\nWindows only.","ref":"wxTreeEvent.html#setToolTip/2"},{"type":"type","title":"wxTreeEvent.wxTree/0","doc":"","ref":"wxTreeEvent.html#t:wxTree/0"},{"type":"type","title":"wxTreeEvent.wxTreeEvent/0","doc":"","ref":"wxTreeEvent.html#t:wxTreeEvent/0"},{"type":"type","title":"wxTreeEvent.wxTreeEventType/0","doc":"","ref":"wxTreeEvent.html#t:wxTreeEventType/0"},{"type":"module","title":"wxTreebook","doc":"This class is an extension of the `m:wxNotebook` class that allows a tree structured set\nof pages to be shown in a control.\n\nA classic example is a netscape preferences dialog that shows a tree of preference\nsections on the left and select section page on the right.\n\nTo use the class simply create it and populate with pages using `insertPage/5`, `insertSubPage/5`, `addPage/4`, `AddSubPage()` (not\nimplemented in wx).\n\nIf your tree is no more than 1 level in depth then you could simply use `addPage/4` and `AddSubPage()`\n(not implemented in wx) to sequentially populate your tree by adding at every step a page\nor a subpage to the end of the tree.\n\nSee:\n* ?wxBookCtrl\n\n* `m:wxBookCtrlEvent`\n\n* `m:wxNotebook`\n\n* `m:wxTreeCtrl`\n\n* `m:wxImageList`\n\n* [Overview bookctrl](https://docs.wxwidgets.org/3.2/overview_bookctrl.html#overview_bookctrl)\n\n* [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_notebook)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxBookCtrlBase`\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxTreebook](https://docs.wxwidgets.org/3.2/classwx_treebook.html)","ref":"wxTreebook.html"},{"type":"module","title":"Events - wxTreebook","doc":"Event types emitted from this class:\n\n* [`treebook_page_changed`](`m:wxBookCtrlEvent`)\n\n* [`treebook_page_changing`](`m:wxBookCtrlEvent`)","ref":"wxTreebook.html#module-events"},{"type":"function","title":"wxTreebook.addPage/3","doc":"","ref":"wxTreebook.html#addPage/3"},{"type":"function","title":"wxTreebook.addPage/4","doc":"Adds a new page.\n\nThe page is placed at the topmost level after all other pages. NULL could be specified\nfor page to create an empty page.","ref":"wxTreebook.html#addPage/4"},{"type":"function","title":"wxTreebook.advanceSelection/1","doc":"","ref":"wxTreebook.html#advanceSelection/1"},{"type":"function","title":"wxTreebook.advanceSelection/2","doc":"Cycles through the tabs.\n\nThe call to this function generates the page changing events.","ref":"wxTreebook.html#advanceSelection/2"},{"type":"function","title":"wxTreebook.assignImageList/2","doc":"Sets the image list for the page control and takes ownership of the list.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxTreebook.html#assignImageList/2"},{"type":"function","title":"wxTreebook.changeSelection/2","doc":"Changes the selection to the given page, returning the previous selection.\n\nThis function behaves as `setSelection/2` but does `not` generate the page changing events.\n\nSee overview_events_prog for more information.","ref":"wxTreebook.html#changeSelection/2"},{"type":"function","title":"wxTreebook.create/3","doc":"","ref":"wxTreebook.html#create/3"},{"type":"function","title":"wxTreebook.create/4","doc":"Creates a treebook control.\n\nSee `new/3` for the description of the parameters.","ref":"wxTreebook.html#create/4"},{"type":"function","title":"wxTreebook.deleteAllPages/1","doc":"Deletes all pages.","ref":"wxTreebook.html#deleteAllPages/1"},{"type":"function","title":"wxTreebook.destroy/1","doc":"Destroys the object","ref":"wxTreebook.html#destroy/1"},{"type":"function","title":"wxTreebook.expandNode/2","doc":"","ref":"wxTreebook.html#expandNode/2"},{"type":"function","title":"wxTreebook.expandNode/3","doc":"Expands (collapses) the `pageId` node.\n\nReturns the previous state. May generate page changing events (if selected page is under\nthe collapsed branch, then its parent is autoselected).","ref":"wxTreebook.html#expandNode/3"},{"type":"function","title":"wxTreebook.getCurrentPage/1","doc":"Returns the currently selected page or NULL.","ref":"wxTreebook.html#getCurrentPage/1"},{"type":"function","title":"wxTreebook.getImageList/1","doc":"Returns the associated image list, may be NULL.\n\nSee:\n* `m:wxImageList`\n\n* `setImageList/2`","ref":"wxTreebook.html#getImageList/1"},{"type":"function","title":"wxTreebook.getPage/2","doc":"Returns the window at the given page position.","ref":"wxTreebook.html#getPage/2"},{"type":"function","title":"wxTreebook.getPageCount/1","doc":"Returns the number of pages in the control.","ref":"wxTreebook.html#getPageCount/1"},{"type":"function","title":"wxTreebook.getPageImage/2","doc":"Returns the image index for the given page.","ref":"wxTreebook.html#getPageImage/2"},{"type":"function","title":"wxTreebook.getPageText/2","doc":"Returns the string for the given page.","ref":"wxTreebook.html#getPageText/2"},{"type":"function","title":"wxTreebook.getSelection/1","doc":"Returns the currently selected page, or `wxNOT\\_FOUND` if none was selected.\n\nNote: This method may return either the previously or newly selected page when called\nfrom the EVT_TREEBOOK_PAGE_CHANGED() handler depending on the platform and so `wxBookCtrlEvent:getSelection/1` should be\nused instead in this case.","ref":"wxTreebook.html#getSelection/1"},{"type":"function","title":"wxTreebook.hitTest/2","doc":"Returns the index of the tab at the specified position or `wxNOT\\_FOUND` if none.\n\nIf `flags` parameter is non-NULL, the position of the point inside the tab is returned as well.\n\nReturn: Returns the zero-based tab index or `wxNOT_FOUND` if there is no tab at the\nspecified position.","ref":"wxTreebook.html#hitTest/2"},{"type":"function","title":"wxTreebook.insertPage/4","doc":"","ref":"wxTreebook.html#insertPage/4"},{"type":"function","title":"wxTreebook.insertPage/5","doc":"Inserts a new page just before the page indicated by `pagePos`.\n\nThe new page is placed before `pagePos` page and on the same level. NULL could be\nspecified for page to create an empty page.","ref":"wxTreebook.html#insertPage/5"},{"type":"function","title":"wxTreebook.insertSubPage/4","doc":"","ref":"wxTreebook.html#insertSubPage/4"},{"type":"function","title":"wxTreebook.insertSubPage/5","doc":"Inserts a sub page under the specified page.\n\nNULL could be specified for page to create an empty page.","ref":"wxTreebook.html#insertSubPage/5"},{"type":"function","title":"wxTreebook.isNodeExpanded/2","doc":"Returns true if the page represented by `pageId` is expanded.","ref":"wxTreebook.html#isNodeExpanded/2"},{"type":"function","title":"wxTreebook.new/0","doc":"Default constructor.","ref":"wxTreebook.html#new/0"},{"type":"function","title":"wxTreebook.new/2","doc":"","ref":"wxTreebook.html#new/2"},{"type":"function","title":"wxTreebook.new/3","doc":"Creates an empty `m:wxTreebook`.","ref":"wxTreebook.html#new/3"},{"type":"function","title":"wxTreebook.setImageList/2","doc":"Sets the image list to use.\n\nIt does not take ownership of the image list, you must delete it yourself.\n\nSee:\n* `m:wxImageList`\n\n* `assignImageList/2`","ref":"wxTreebook.html#setImageList/2"},{"type":"function","title":"wxTreebook.setPageImage/3","doc":"Sets the image index for the given page.\n\n`image` is an index into the image list which was set with `setImageList/2`.","ref":"wxTreebook.html#setPageImage/3"},{"type":"function","title":"wxTreebook.setPageSize/2","doc":"Sets the width and height of the pages.\n\nNote: This method is currently not implemented for wxGTK.","ref":"wxTreebook.html#setPageSize/2"},{"type":"function","title":"wxTreebook.setPageText/3","doc":"Sets the text for the given page.","ref":"wxTreebook.html#setPageText/3"},{"type":"function","title":"wxTreebook.setSelection/2","doc":"Sets the selection to the given page, returning the previous selection.\n\nNotice that the call to this function generates the page changing events, use the `changeSelection/2`\nfunction if you don't want these events to be generated.\n\nSee: `wxBookCtrlBase:getSelection/1`","ref":"wxTreebook.html#setSelection/2"},{"type":"type","title":"wxTreebook.wxTreebook/0","doc":"","ref":"wxTreebook.html#t:wxTreebook/0"},{"type":"module","title":"wxUpdateUIEvent","doc":"This class is used for pseudo-events which are called by wxWidgets to give an application\nthe chance to update various user interface elements.\n\nWithout update UI events, an application has to work hard to check/uncheck,\nenable/disable, show/hide, and set the text for elements such as menu items and toolbar\nbuttons. The code for doing this has to be mixed up with the code that is invoked when an\naction is invoked for a menu item or button.\n\nWith update UI events, you define an event handler to look at the state of the\napplication and change UI elements accordingly. wxWidgets will call your member functions\nin idle time, so you don't have to worry where to call this code.\n\nIn addition to being a clearer and more declarative method, it also means you don't have\nto worry whether you're updating a toolbar or menubar identifier. The same handler can\nupdate a menu item and toolbar button, if the identifier is the same. Instead of directly\nmanipulating the menu or button, you call functions in the event object, such as `check/2`.\nwxWidgets will determine whether such a call has been made, and which UI element to update.\n\nThese events will work for popup menus as well as menubars. Just before a menu is popped\nup, `wxMenu::UpdateUI` (not implemented in wx) is called to process any UI events for the\nwindow that owns the menu.\n\nIf you find that the overhead of UI update processing is affecting your application, you\ncan do one or both of the following:\n\n* Call `setMode/1` with a value of wxUPDATE_UI_PROCESS_SPECIFIED, and set the extra style\nwxWS_EX_PROCESS_UI_UPDATES for every window that should receive update events. No other\nwindows will receive update events.\n\n* Call `setUpdateInterval/1` with a millisecond value to set the delay between updates. You may need to call `wxWindow:updateWindowUI/2` at\ncritical points, for example when a dialog is about to be shown, in case the user sees a\nslight delay before windows are updated.\n\nNote that although events are sent in idle time, defining a `m:wxIdleEvent` handler for\na window does not affect this because the events are sent from `wxWindow::OnInternalIdle`\n(not implemented in wx) which is always called in idle time.\n\nwxWidgets tries to optimize update events on some platforms. On Windows and GTK+, events\nfor menubar items are only sent when the menu is about to be shown, and not in idle time.\n\nSee: [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxUpdateUIEvent](https://docs.wxwidgets.org/3.2/classwx_update_u_i_event.html)","ref":"wxUpdateUIEvent.html"},{"type":"module","title":"Events - wxUpdateUIEvent","doc":"Use `wxEvtHandler:connect/3` with `wxUpdateUIEventType` to subscribe to events of this type.","ref":"wxUpdateUIEvent.html#module-events"},{"type":"function","title":"wxUpdateUIEvent.canUpdate/1","doc":"Returns true if it is appropriate to update (send UI update events to) this window.\n\nThis function looks at the mode used (see `setMode/1`), the wxWS_EX_PROCESS_UI_UPDATES flag in `window`,\nthe time update events were last sent in idle time, and the update interval, to determine\nwhether events should be sent to this window now. By default this will always return true\nbecause the update mode is initially wxUPDATE_UI_PROCESS_ALL and the interval is set to 0;\nso update events will be sent as often as possible. You can reduce the frequency that\nevents are sent by changing the mode and/or setting an update interval.\n\nSee:\n* `resetUpdateTime/0`\n\n* `setUpdateInterval/1`\n\n* `setMode/1`","ref":"wxUpdateUIEvent.html#canUpdate/1"},{"type":"function","title":"wxUpdateUIEvent.check/2","doc":"Check or uncheck the UI element.","ref":"wxUpdateUIEvent.html#check/2"},{"type":"function","title":"wxUpdateUIEvent.enable/2","doc":"Enable or disable the UI element.","ref":"wxUpdateUIEvent.html#enable/2"},{"type":"function","title":"wxUpdateUIEvent.getChecked/1","doc":"Returns true if the UI element should be checked.","ref":"wxUpdateUIEvent.html#getChecked/1"},{"type":"function","title":"wxUpdateUIEvent.getEnabled/1","doc":"Returns true if the UI element should be enabled.","ref":"wxUpdateUIEvent.html#getEnabled/1"},{"type":"function","title":"wxUpdateUIEvent.getMode/0","doc":"Static function returning a value specifying how wxWidgets will send update events: to\nall windows, or only to those which specify that they will process the events.\n\nSee: `setMode/1`","ref":"wxUpdateUIEvent.html#getMode/0"},{"type":"function","title":"wxUpdateUIEvent.getSetChecked/1","doc":"Returns true if the application has called `check/2`.\n\nFor wxWidgets internal use only.","ref":"wxUpdateUIEvent.html#getSetChecked/1"},{"type":"function","title":"wxUpdateUIEvent.getSetEnabled/1","doc":"Returns true if the application has called `enable/2`.\n\nFor wxWidgets internal use only.","ref":"wxUpdateUIEvent.html#getSetEnabled/1"},{"type":"function","title":"wxUpdateUIEvent.getSetShown/1","doc":"Returns true if the application has called `show/2`.\n\nFor wxWidgets internal use only.","ref":"wxUpdateUIEvent.html#getSetShown/1"},{"type":"function","title":"wxUpdateUIEvent.getSetText/1","doc":"Returns true if the application has called `setText/2`.\n\nFor wxWidgets internal use only.","ref":"wxUpdateUIEvent.html#getSetText/1"},{"type":"function","title":"wxUpdateUIEvent.getShown/1","doc":"Returns true if the UI element should be shown.","ref":"wxUpdateUIEvent.html#getShown/1"},{"type":"function","title":"wxUpdateUIEvent.getText/1","doc":"Returns the text that should be set for the UI element.","ref":"wxUpdateUIEvent.html#getText/1"},{"type":"function","title":"wxUpdateUIEvent.getUpdateInterval/0","doc":"Returns the current interval between updates in milliseconds.\n\nThe value -1 disables updates, 0 updates as frequently as possible.\n\nSee: `setUpdateInterval/1`","ref":"wxUpdateUIEvent.html#getUpdateInterval/0"},{"type":"function","title":"wxUpdateUIEvent.resetUpdateTime/0","doc":"Used internally to reset the last-updated time to the current time.\n\nIt is assumed that update events are normally sent in idle time, so this is called at the\nend of idle processing.\n\nSee:\n* `canUpdate/1`\n\n* `setUpdateInterval/1`\n\n* `setMode/1`","ref":"wxUpdateUIEvent.html#resetUpdateTime/0"},{"type":"function","title":"wxUpdateUIEvent.setMode/1","doc":"Specify how wxWidgets will send update events: to all windows, or only to those which\nspecify that they will process the events.","ref":"wxUpdateUIEvent.html#setMode/1"},{"type":"function","title":"wxUpdateUIEvent.setText/2","doc":"Sets the text for this UI element.","ref":"wxUpdateUIEvent.html#setText/2"},{"type":"function","title":"wxUpdateUIEvent.setUpdateInterval/1","doc":"Sets the interval between updates in milliseconds.\n\nSet to -1 to disable updates, or to 0 to update as frequently as possible. The default is 0.\n\nUse this to reduce the overhead of UI update events if your application has a lot of\nwindows. If you set the value to -1 or greater than 0, you may also need to call `wxWindow:updateWindowUI/2` at\nappropriate points in your application, such as when a dialog is about to be shown.","ref":"wxUpdateUIEvent.html#setUpdateInterval/1"},{"type":"function","title":"wxUpdateUIEvent.show/2","doc":"Show or hide the UI element.","ref":"wxUpdateUIEvent.html#show/2"},{"type":"type","title":"wxUpdateUIEvent.wxUpdateUI/0","doc":"","ref":"wxUpdateUIEvent.html#t:wxUpdateUI/0"},{"type":"type","title":"wxUpdateUIEvent.wxUpdateUIEvent/0","doc":"","ref":"wxUpdateUIEvent.html#t:wxUpdateUIEvent/0"},{"type":"type","title":"wxUpdateUIEvent.wxUpdateUIEventType/0","doc":"","ref":"wxUpdateUIEvent.html#t:wxUpdateUIEventType/0"},{"type":"module","title":"wxWebView","doc":"This control may be used to render web (HTML / CSS / javascript) documents.\n\nIt is designed to allow the creation of multiple backends for each port, although\ncurrently just one is available. It differs from `m:wxHtmlWindow` in that each backend is\nactually a full rendering engine, Trident on MSW and Webkit on macOS and GTK. This allows\nthe correct viewing of complex pages with javascript and css.\n\nBackend Descriptions\n\nPar:\n\nThe IE backend uses Microsoft's Trident rendering engine, specifically the version used\nby the locally installed copy of Internet Explorer. As such it is only available for the\nMSW port. By default recent versions of the [WebBrowser](http://msdn.microsoft.com/en-us/library/aa752085%28v=VS.85%29.aspx)\ncontrol, which this backend uses, emulate Internet Explorer 7. This can be changed with a\nregistry setting by wxWebView::MSWSetEmulationLevel() see [this](http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx#browser_emulation)\narticle for more information. This backend has full support for custom schemes and\nvirtual file systems.\n\nPar:\n\nThe Edge (Chromium) backend uses Microsoft's [Edge WebView2](https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2).\nIt is available for Windows 7 and newer. The following features are currently unsupported\nwith this backend: virtual filesystems, custom urls, find.\n\nThis backend is not enabled by default, to build it follow these steps:\n\n* Visual Studio 2015, or newer, is required\n\n* Download the [WebView2 SDK](https://aka.ms/webviewnuget) nuget package (Version 0.9.488\nor newer)\n\n* Extract the package (it's a zip archive) to `wxWidgets/3rdparty/webview2` (you should\nhave `3rdparty/webview2/build/native/include/WebView2.h` file after unpacking it)\n\n* Enable `wxUSE_WEBVIEW_EDGE` in CMake or `setup.h`\n\n* Build wxWidgets webview library\n\n* Copy `WebView2Loader.dll` from the subdirectory corresponding to the architecture used\n(x86 or x64) of `wxWidgets/3rdparty/webview2/build/` to your applications executable\n\n* At runtime you can use `isBackendAvailable/1` to check if the backend can be used (it will be available if `WebView2Loader.dll`\ncan be loaded and Edge (Chromium) is installed)\n\n* Make sure to add a note about using the WebView2 SDK to your application documentation,\nas required by its licence\n\nPar:\n\nUnder GTK the WebKit backend uses [WebKitGTK+](http://webkitgtk.org/). The current\nminimum version required is 1.3.1 which ships by default with Ubuntu Natty and Debian\nWheezy and has the package name libwebkitgtk-dev. Custom schemes and virtual files systems\nare supported under this backend, however embedded resources such as images and\nstylesheets are currently loaded using the data:// scheme.\n\nPar:\n\nUnder GTK3 the WebKit2 version of [WebKitGTK+](http://webkitgtk.org/) is used. In Ubuntu\nthe required package name is libwebkit2gtk-4.0-dev and under Fedora it is\nwebkitgtk4-devel. All wxWEBVIEW_WEBKIT features are supported except for clearing and\nenabling / disabling the history.\n\nPar:\n\nThe macOS WebKit backend uses Apple's [WebView](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/doc/uid/20001903)\nclass. This backend has full support for custom schemes and virtual file systems.\n\nAsynchronous Notifications\n\nMany of the methods in `m:wxWebView` are asynchronous, i.e. they return immediately and\nperform their work in the background. This includes functions such as `loadURL/2` and `reload/2`. To receive\nnotification of the progress and completion of these functions you need to handle the\nevents that are provided. Specifically `wxEVT_WEBVIEW_LOADED` notifies when the page or a\nsub-frame has finished loading and `wxEVT_WEBVIEW_ERROR` notifies that an error has occurred.\n\nVirtual File Systems and Custom Schemes\n\n`m:wxWebView` supports the registering of custom scheme handlers, for example `file` or `http`.\nTo do this create a new class which inherits from `wxWebViewHandler` (not implemented in\nwx), where wxWebHandler::GetFile() returns a pointer to a `wxFSFile` (not implemented in\nwx) which represents the given url. You can then register your handler with `RegisterHandler()`\n(not implemented in wx) it will be called for all pages and resources.\n\n`wxWebViewFSHandler` (not implemented in wx) is provided to access the virtual file\nsystem encapsulated by `wxFileSystem` (not implemented in wx). The `wxMemoryFSHandler`\n(not implemented in wx) documentation gives an example of how this may be used.\n\n`wxWebViewArchiveHandler` (not implemented in wx) is provided to allow the navigation of\npages inside a zip archive. It supports paths of the form: `scheme:///C`:/example/docs.zip;protocol=zip/main.htm\n\nThis class is derived, and can use functions, from:\n\n* `m:wxControl`\n\n* `m:wxWindow`\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxWebView](https://docs.wxwidgets.org/3.2/classwx_web_view.html)","ref":"wxWebView.html"},{"type":"module","title":"Events - wxWebView","doc":"Event types emitted from this class:\n\n* [`webview_navigating`](`m:wxWebViewEvent`)\n\n* [`webview_navigated`](`m:wxWebViewEvent`)\n\n* [`webview_loaded`](`m:wxWebViewEvent`)\n\n* [`webview_error`](`m:wxWebViewEvent`)\n\n* [`webview_newwindow`](`m:wxWebViewEvent`)\n\n* [`webview_title_changed`](`m:wxWebViewEvent`)","ref":"wxWebView.html#module-events"},{"type":"function","title":"wxWebView.canCopy/1","doc":"Returns true if the current selection can be copied.\n\nNote: This always returns `true` on the macOS WebKit backend.","ref":"wxWebView.html#canCopy/1"},{"type":"function","title":"wxWebView.canCut/1","doc":"Returns true if the current selection can be cut.\n\nNote: This always returns `true` on the macOS WebKit backend.","ref":"wxWebView.html#canCut/1"},{"type":"function","title":"wxWebView.canGoBack/1","doc":"Returns true if it is possible to navigate backward in the history of visited pages.","ref":"wxWebView.html#canGoBack/1"},{"type":"function","title":"wxWebView.canGoForward/1","doc":"Returns true if it is possible to navigate forward in the history of visited pages.","ref":"wxWebView.html#canGoForward/1"},{"type":"function","title":"wxWebView.canPaste/1","doc":"Returns true if data can be pasted.\n\nNote: This always returns `true` on the macOS WebKit backend.","ref":"wxWebView.html#canPaste/1"},{"type":"function","title":"wxWebView.canRedo/1","doc":"Returns true if there is an action to redo.","ref":"wxWebView.html#canRedo/1"},{"type":"function","title":"wxWebView.canSetZoomType/2","doc":"Retrieve whether the current HTML engine supports a zoom type.\n\nReturn: Whether this type of zoom is supported by this HTML engine (and thus can be set\nthrough `setZoomType/2`).","ref":"wxWebView.html#canSetZoomType/2"},{"type":"function","title":"wxWebView.canUndo/1","doc":"Returns true if there is an action to undo.","ref":"wxWebView.html#canUndo/1"},{"type":"function","title":"wxWebView.clearHistory/1","doc":"Clear the history, this will also remove the visible page.\n\nNote: This is not implemented on the WebKit2GTK+ backend.","ref":"wxWebView.html#clearHistory/1"},{"type":"function","title":"wxWebView.clearSelection/1","doc":"Clears the current selection.","ref":"wxWebView.html#clearSelection/1"},{"type":"function","title":"wxWebView.copy/1","doc":"Copies the current selection.","ref":"wxWebView.html#copy/1"},{"type":"function","title":"wxWebView.cut/1","doc":"Cuts the current selection.","ref":"wxWebView.html#cut/1"},{"type":"function","title":"wxWebView.deleteSelection/1","doc":"Deletes the current selection.\n\nNote that for `wxWEBVIEW_BACKEND_WEBKIT` the selection must be editable, either through\nSetEditable or the correct HTML attribute.","ref":"wxWebView.html#deleteSelection/1"},{"type":"function","title":"wxWebView.enableContextMenu/1","doc":"","ref":"wxWebView.html#enableContextMenu/1"},{"type":"function","title":"wxWebView.enableContextMenu/2","doc":"Enable or disable the right click context menu.\n\nBy default the standard context menu is enabled, this method can be used to disable it or\nre-enable it later.\n\nSince: 2.9.5","ref":"wxWebView.html#enableContextMenu/2"},{"type":"function","title":"wxWebView.enableHistory/1","doc":"","ref":"wxWebView.html#enableHistory/1"},{"type":"function","title":"wxWebView.enableHistory/2","doc":"Enable or disable the history.\n\nThis will also clear the history.\n\nNote: This is not implemented on the WebKit2GTK+ backend.","ref":"wxWebView.html#enableHistory/2"},{"type":"function","title":"wxWebView.find/2","doc":"","ref":"wxWebView.html#find/2"},{"type":"function","title":"wxWebView.find/3","doc":"Finds a phrase on the current page and if found, the control will scroll the phrase into\nview and select it.\n\nReturn: If search phrase was not found in combination with the flags then `wxNOT_FOUND`\nis returned. If called for the first time with search phrase then the total number of\nresults will be returned. Then for every time its called with the same search phrase it\nwill return the number of the current match.\n\nNote: This function will restart the search if the flags `wxWEBVIEW_FIND_ENTIRE_WORD` or `wxWEBVIEW_FIND_MATCH_CASE`\nare changed, since this will require a new search. To reset the search, for example\nresetting the highlights call the function with an empty search phrase. This always\nreturns `wxNOT_FOUND` on the macOS WebKit backend.\n\nSince: 2.9.5","ref":"wxWebView.html#find/3"},{"type":"function","title":"wxWebView.getCurrentTitle/1","doc":"Get the title of the current web page, or its URL/path if title is not available.","ref":"wxWebView.html#getCurrentTitle/1"},{"type":"function","title":"wxWebView.getCurrentURL/1","doc":"Get the URL of the currently displayed document.","ref":"wxWebView.html#getCurrentURL/1"},{"type":"function","title":"wxWebView.getPageSource/1","doc":"Get the HTML source code of the currently displayed document.\n\nReturn: The HTML source code, or an empty string if no page is currently shown.","ref":"wxWebView.html#getPageSource/1"},{"type":"function","title":"wxWebView.getPageText/1","doc":"Get the text of the current page.","ref":"wxWebView.html#getPageText/1"},{"type":"function","title":"wxWebView.getSelectedSource/1","doc":"Returns the currently selected source, if any.","ref":"wxWebView.html#getSelectedSource/1"},{"type":"function","title":"wxWebView.getSelectedText/1","doc":"Returns the currently selected text, if any.","ref":"wxWebView.html#getSelectedText/1"},{"type":"function","title":"wxWebView.getZoom/1","doc":"Get the zoom level of the page.\n\nSee `getZoomFactor/1` to get more precise zoom scale value other than as provided by `wxWebViewZoom`.\n\nReturn: The current level of zoom.","ref":"wxWebView.html#getZoom/1"},{"type":"function","title":"wxWebView.getZoomFactor/1","doc":"Get the zoom factor of the page.\n\nReturn: The current factor of zoom.\n\nSince: 3.1.4","ref":"wxWebView.html#getZoomFactor/1"},{"type":"function","title":"wxWebView.getZoomType/1","doc":"Get how the zoom factor is currently interpreted.\n\nReturn: How the zoom factor is currently interpreted by the HTML engine.","ref":"wxWebView.html#getZoomType/1"},{"type":"function","title":"wxWebView.goBack/1","doc":"Navigate back in the history of visited pages.\n\nOnly valid if `canGoBack/1` returns true.","ref":"wxWebView.html#goBack/1"},{"type":"function","title":"wxWebView.goForward/1","doc":"Navigate forward in the history of visited pages.\n\nOnly valid if `canGoForward/1` returns true.","ref":"wxWebView.html#goForward/1"},{"type":"function","title":"wxWebView.hasSelection/1","doc":"Returns true if there is a current selection.","ref":"wxWebView.html#hasSelection/1"},{"type":"function","title":"wxWebView.isBackendAvailable/1","doc":"Allows to check if a specific backend is currently available.\n\nSince: 3.1.4","ref":"wxWebView.html#isBackendAvailable/1"},{"type":"function","title":"wxWebView.isBusy/1","doc":"Returns whether the web control is currently busy (e.g. loading a page).","ref":"wxWebView.html#isBusy/1"},{"type":"function","title":"wxWebView.isContextMenuEnabled/1","doc":"Returns true if a context menu will be shown on right click.\n\nSince: 2.9.5","ref":"wxWebView.html#isContextMenuEnabled/1"},{"type":"function","title":"wxWebView.isEditable/1","doc":"Returns whether the web control is currently editable.","ref":"wxWebView.html#isEditable/1"},{"type":"function","title":"wxWebView.loadURL/2","doc":"Load a web page from a URL.\n\nNote: Web engines generally report errors asynchronously, so if you wish to know whether\nloading the URL was successful, register to receive navigation error events.","ref":"wxWebView.html#loadURL/2"},{"type":"function","title":"wxWebView.new/2","doc":"","ref":"wxWebView.html#new/2"},{"type":"function","title":"wxWebView.new/3","doc":"Factory function to create a new `m:wxWebView` using a `wxWebViewFactory` (not\nimplemented in wx).\n\nReturn: The created `m:wxWebView`, or `NULL` if the requested backend is not available\n\nSince: 2.9.5","ref":"wxWebView.html#new/3"},{"type":"function","title":"wxWebView.paste/1","doc":"Pastes the current data.","ref":"wxWebView.html#paste/1"},{"type":"function","title":"wxWebView.print/1","doc":"Opens a print dialog so that the user may print the currently displayed page.","ref":"wxWebView.html#print/1"},{"type":"function","title":"wxWebView.redo/1","doc":"Redos the last action.","ref":"wxWebView.html#redo/1"},{"type":"function","title":"wxWebView.reload/1","doc":"","ref":"wxWebView.html#reload/1"},{"type":"function","title":"wxWebView.reload/2","doc":"Reload the currently displayed URL.\n\nNote: The flags are ignored by the edge backend.","ref":"wxWebView.html#reload/2"},{"type":"function","title":"wxWebView.runScript/2","doc":"Runs the given JavaScript code.\n\nJavaScript code is executed inside the browser control and has full access to DOM and\nother browser-provided functionality. For example, this code will replace the current\npage contents with the provided string.\n\nIf `output` is non-null, it is filled with the result of executing this code on success,\ne.g. a JavaScript value such as a string, a number (integer or floating point), a boolean\nor JSON representation for non-primitive types such as arrays and objects. For example:\n\nThis function has a few platform-specific limitations:\n\n* When using WebKit v1 in wxGTK2, retrieving the result of JavaScript execution is\nunsupported and this function will always return false if `output` is non-null to indicate\nthis. This functionality is fully supported when using WebKit v2 or later in wxGTK3.\n\n* When using WebKit under macOS, code execution is limited to at most 10MiB of memory and\n10 seconds of execution time.\n\n* When using IE backend under MSW, scripts can only be executed when the current page is\nfully loaded (i.e. `wxEVT_WEBVIEW_LOADED` event was received). A script tag inside the\npage HTML is required in order to run JavaScript.\n\nAlso notice that under MSW converting JavaScript objects to JSON is not supported in the\ndefault emulation mode. `m:wxWebView` implements its own object-to-JSON conversion as a\nfallback for this case, however it is not as full-featured, well-tested or performing as\nthe implementation of this functionality in the browser control itself, so it is\nrecommended to use MSWSetEmulationLevel() to change emulation level to a more modern one\nin which JSON conversion is done by the control itself.\n\nReturn: true if there is a result, false if there is an error.","ref":"wxWebView.html#runScript/2"},{"type":"function","title":"wxWebView.selectAll/1","doc":"Selects the entire page.","ref":"wxWebView.html#selectAll/1"},{"type":"function","title":"wxWebView.setEditable/1","doc":"","ref":"wxWebView.html#setEditable/1"},{"type":"function","title":"wxWebView.setEditable/2","doc":"Set the editable property of the web control.\n\nEnabling allows the user to edit the page even if the `contenteditable` attribute is not\nset. The exact capabilities vary with the backend being used.","ref":"wxWebView.html#setEditable/2"},{"type":"function","title":"wxWebView.setPage/3","doc":"Set the displayed page source to the contents of the given string.\n\nNote: When using `wxWEBVIEW_BACKEND_IE` you must wait for the current page to finish\nloading before calling `setPage/3`. The baseURL parameter is not used in this backend and the edge\nbackend.","ref":"wxWebView.html#setPage/3"},{"type":"function","title":"wxWebView.setZoom/2","doc":"Set the zoom level of the page.\n\nSee `setZoomFactor/2` for more precise scaling other than the measured steps provided by `wxWebViewZoom`.","ref":"wxWebView.html#setZoom/2"},{"type":"function","title":"wxWebView.setZoomFactor/2","doc":"Set the zoom factor of the page.\n\nNote: zoom scale in IE will be converted into `wxWebViewZoom` levels for `wxWebViewZoomType`\nof `wxWEBVIEW_ZOOM_TYPE_TEXT`.\n\nSince: 3.1.4","ref":"wxWebView.html#setZoomFactor/2"},{"type":"function","title":"wxWebView.setZoomType/2","doc":"Set how to interpret the zoom factor.\n\nNote: invoke `canSetZoomType/2` first, some HTML renderers may not support all zoom types.","ref":"wxWebView.html#setZoomType/2"},{"type":"function","title":"wxWebView.stop/1","doc":"Stop the current page loading process, if any.\n\nMay trigger an error event of type `wxWEBVIEW_NAV_ERR_USER_CANCELLED`. TODO: make `wxWEBVIEW_NAV_ERR_USER_CANCELLED`\nerrors uniform across ports.","ref":"wxWebView.html#stop/1"},{"type":"function","title":"wxWebView.undo/1","doc":"Undos the last action.","ref":"wxWebView.html#undo/1"},{"type":"type","title":"wxWebView.wxWebView/0","doc":"","ref":"wxWebView.html#t:wxWebView/0"},{"type":"module","title":"wxWebViewEvent","doc":"A navigation event holds information about events associated with `m:wxWebView` objects.\n\nThis class is derived, and can use functions, from:\n\n* `m:wxNotifyEvent`\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWebViewEvent](https://docs.wxwidgets.org/3.2/classwx_web_view_event.html)","ref":"wxWebViewEvent.html"},{"type":"module","title":"Events - wxWebViewEvent","doc":"Use `wxEvtHandler:connect/3` with `wxWebViewEventType` to subscribe to events of this type.","ref":"wxWebViewEvent.html#module-events"},{"type":"function","title":"wxWebViewEvent.getInt/1","doc":"Returns the integer identifier corresponding to a listbox, choice or radiobox selection\n(only if the event was a selection, not a deselection), or a boolean value representing\nthe value of a checkbox.\n\nFor a menu item, this method returns -1 if the item is not checkable or a boolean value\n(true or false) for checkable items indicating the new state of the item.","ref":"wxWebViewEvent.html#getInt/1"},{"type":"function","title":"wxWebViewEvent.getString/1","doc":"Returns item string for a listbox or choice selection event.\n\nIf one or several items have been deselected, returns the index of the first deselected\nitem. If some items have been selected and others deselected at the same time, it will\nreturn the index of the first selected item.","ref":"wxWebViewEvent.html#getString/1"},{"type":"function","title":"wxWebViewEvent.getTarget/1","doc":"Get the name of the target frame which the url of this event has been or will be loaded\ninto.\n\nThis may return an empty string if the frame is not available.","ref":"wxWebViewEvent.html#getTarget/1"},{"type":"function","title":"wxWebViewEvent.getURL/1","doc":"Get the URL being visited.","ref":"wxWebViewEvent.html#getURL/1"},{"type":"type","title":"wxWebViewEvent.wxWebView/0","doc":"","ref":"wxWebViewEvent.html#t:wxWebView/0"},{"type":"type","title":"wxWebViewEvent.wxWebViewEvent/0","doc":"","ref":"wxWebViewEvent.html#t:wxWebViewEvent/0"},{"type":"type","title":"wxWebViewEvent.wxWebViewEventType/0","doc":"","ref":"wxWebViewEvent.html#t:wxWebViewEventType/0"},{"type":"module","title":"wxWindow","doc":"`m:wxWindow` is the base class for all windows and represents any visible object on\nscreen.\n\nAll controls, top level windows and so on are windows. Sizers and device contexts are\nnot, however, as they don't appear on screen themselves.\n\nPlease note that all children of the window will be deleted automatically by the\ndestructor before the window itself is deleted which means that you don't have to worry\nabout deleting them manually. Please see the window deletion overview for more information.\n\nAlso note that in this, and many others, wxWidgets classes some `GetXXX()` methods may be\noverloaded (as, for example, `getSize/1` or `getClientSize/1`). In this case, the overloads are non-virtual because\nhaving multiple virtual functions with the same name results in a virtual function name\nhiding at the derived class level (in English, this means that the derived class has to\noverride all overloaded variants if it overrides any of them). To allow overriding them in\nthe derived class, wxWidgets uses a unique protected virtual `DoGetXXX()` method and all `GetXXX()`\nones are forwarded to it, so overriding the former changes the behaviour of the latter.","ref":"wxWindow.html"},{"type":"module","title":"Styles - wxWindow","doc":"This class supports the following styles:\n\n* wxBORDER_DEFAULT: The window class will decide the kind of border to show, if any.\n\n* wxBORDER_SIMPLE: Displays a thin border around the window. wxSIMPLE_BORDER is the old\nname for this style.\n\n* wxBORDER_SUNKEN: Displays a sunken border. wxSUNKEN_BORDER is the old name for this\nstyle.\n\n* wxBORDER_RAISED: Displays a raised border. wxRAISED_BORDER is the old name for this\nstyle.\n\n* wxBORDER_STATIC: Displays a border suitable for a static control. wxSTATIC_BORDER is the\nold name for this style. Windows only.\n\n* wxBORDER_THEME: Displays a native border suitable for a control, on the current platform.\nOn Windows, this will be a themed border; on most other platforms a sunken border will be\nused. For more information for themed borders on Windows, please see Themed borders on\nWindows.\n\n* wxBORDER_NONE: Displays no border, overriding the default border style for the window.\nwxNO_BORDER is the old name for this style.\n\n* wxBORDER_DOUBLE: This style is obsolete and should not be used.\n\n* wxTRANSPARENT_WINDOW: The window is transparent, that is, it will not receive paint\nevents. Windows only.\n\n* wxTAB_TRAVERSAL: This style is used by wxWidgets for the windows supporting TAB\nnavigation among their children, such as `m:wxDialog` and `m:wxPanel`. It should almost\nnever be used in the application code.\n\n* wxWANTS_CHARS: Use this to indicate that the window wants to get all char/key events for\nall keys - even for keys like TAB or ENTER which are usually used for dialog navigation\nand which wouldn't be generated without this style. If you need to use this style in order\nto get the arrows or etc., but would still like to have normal keyboard navigation take\nplace, you should call Navigate in response to the key events for Tab and Shift-Tab.\n\n* wxNO_FULL_REPAINT_ON_RESIZE: On Windows, this style used to disable repainting the window\ncompletely when its size is changed. Since this behaviour is now the default, the style is\nnow obsolete and no longer has an effect.\n\n* wxVSCROLL: Use this style to enable a vertical scrollbar. Notice that this style cannot\nbe used with native controls which don't support scrollbars nor with top-level windows in\nmost ports.\n\n* wxHSCROLL: Use this style to enable a horizontal scrollbar. The same limitations as for\nwxVSCROLL apply to this style.\n\n* wxALWAYS_SHOW_SB: If a window has scrollbars, disable them instead of hiding them when\nthey are not needed (i.e. when the size of the window is big enough to not require the\nscrollbars to navigate it). This style is currently implemented for wxMSW, wxGTK and\nwxUniversal and does nothing on the other platforms.\n\n* wxCLIP_CHILDREN: Use this style to eliminate flicker caused by the background being\nrepainted, then children being painted over them. Windows only.\n\n* wxFULL_REPAINT_ON_RESIZE: Use this style to force a complete redraw of the window\nwhenever it is resized instead of redrawing just the part of the window affected by\nresizing. Note that this was the behaviour by default before 2.5.1 release and that if you\nexperience redraw problems with code which previously used to work you may want to try\nthis. Currently this style applies on GTK+ 2 and Windows only, and full repainting is\nalways done on other platforms.","ref":"wxWindow.html#module-styles"},{"type":"module","title":"Extra Styles - wxWindow","doc":"This class supports the following extra styles:\n\n* wxWS_EX_BLOCK_EVENTS: wxCommandEvents and the objects of the derived classes are\nforwarded to the parent window and so on recursively by default. Using this flag for the\ngiven window allows blocking this propagation at this window, i.e. prevent the events from\nbeing propagated further upwards. Dialogs have this flag on by default for the reasons\nexplained in the overview_events.\n\n* wxWS_EX_TRANSIENT: Don't use this window as an implicit parent for the other windows:\nthis must be used with transient windows as otherwise there is the risk of creating a\ndialog/frame with this window as a parent, which would lead to a crash if the parent were\ndestroyed before the child.\n\n* wxWS_EX_CONTEXTHELP: Under Windows, puts a query button on the caption. When pressed,\nWindows will go into a context-sensitive help mode and wxWidgets will send a `wxEVT_HELP`\nevent if the user clicked on an application window. This style cannot be used (because of\nthe underlying native behaviour) together with `wxMAXIMIZE_BOX` or `wxMINIMIZE_BOX`, so\nthese two styles are automatically turned off if this one is used.\n\n* wxWS_EX_PROCESS_IDLE: This window should always process idle events, even if the mode set\nby `wxIdleEvent:setMode/1` is `wxIDLE_PROCESS_SPECIFIED`.\n\n* wxWS_EX_PROCESS_UI_UPDATES: This window should always process UI update events, even if\nthe mode set by `wxUpdateUIEvent:setMode/1` is `wxUPDATE_UI_PROCESS_SPECIFIED`.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)\n\nThis class is derived, and can use functions, from:\n\n* `m:wxEvtHandler`\n\nwxWidgets docs: [wxWindow](https://docs.wxwidgets.org/3.2/classwx_window.html)","ref":"wxWindow.html#module-extra-styles"},{"type":"module","title":"Events - wxWindow","doc":"Event types emitted from this class:\n\n* [`activate`](`m:wxActivateEvent`)\n\n* [`child_focus`](`m:wxChildFocusEvent`)\n\n* [`context_menu`](`m:wxContextMenuEvent`)\n\n* [`help`](`m:wxHelpEvent`)\n\n* [`drop_files`](`m:wxDropFilesEvent`)\n\n* [`erase_background`](`m:wxEraseEvent`)\n\n* [`set_focus`](`m:wxFocusEvent`)\n\n* [`kill_focus`](`m:wxFocusEvent`)\n\n* [`idle`](`m:wxIdleEvent`)\n\n* [`joy_button_down`](`m:wxJoystickEvent`)\n\n* [`joy_button_up`](`m:wxJoystickEvent`)\n\n* [`joy_move`](`m:wxJoystickEvent`)\n\n* [`joy_zmove`](`m:wxJoystickEvent`)\n\n* [`key_down`](`m:wxKeyEvent`)\n\n* [`key_up`](`m:wxKeyEvent`)\n\n* [`char`](`m:wxKeyEvent`)\n\n* [`char_hook`](`m:wxKeyEvent`)\n\n* [`mouse_capture_lost`](`m:wxMouseCaptureLostEvent`)\n\n* [`mouse_capture_changed`](`m:wxMouseCaptureChangedEvent`)\n\n* [`left_down`](`m:wxMouseEvent`)\n\n* [`left_up`](`m:wxMouseEvent`)\n\n* [`middle_down`](`m:wxMouseEvent`)\n\n* [`middle_up`](`m:wxMouseEvent`)\n\n* [`right_down`](`m:wxMouseEvent`)\n\n* [`right_up`](`m:wxMouseEvent`)\n\n* [`motion`](`m:wxMouseEvent`)\n\n* [`enter_window`](`m:wxMouseEvent`)\n\n* [`leave_window`](`m:wxMouseEvent`)\n\n* [`left_dclick`](`m:wxMouseEvent`)\n\n* [`middle_dclick`](`m:wxMouseEvent`)\n\n* [`right_dclick`](`m:wxMouseEvent`)\n\n* [`mousewheel`](`m:wxMouseEvent`)\n\n* [`aux1_down`](`m:wxMouseEvent`)\n\n* [`aux1_up`](`m:wxMouseEvent`)\n\n* [`aux1_dclick`](`m:wxMouseEvent`)\n\n* [`aux2_down`](`m:wxMouseEvent`)\n\n* [`aux2_up`](`m:wxMouseEvent`)\n\n* [`aux2_dclick`](`m:wxMouseEvent`)\n\n* [`paint`](`m:wxPaintEvent`)\n\n* [`scrollwin_top`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_bottom`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_lineup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_linedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pageup`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_pagedown`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbtrack`](`m:wxScrollWinEvent`)\n\n* [`scrollwin_thumbrelease`](`m:wxScrollWinEvent`)\n\n* [`set_cursor`](`m:wxSetCursorEvent`)\n\n* [`size`](`m:wxSizeEvent`)\n\n* [`sys_colour_changed`](`m:wxSysColourChangedEvent`)","ref":"wxWindow.html#module-events"},{"type":"function","title":"wxWindow.cacheBestSize/2","doc":"Sets the cached best size value.\n\nSee: `getBestSize/1`","ref":"wxWindow.html#cacheBestSize/2"},{"type":"function","title":"wxWindow.canSetTransparent/1","doc":"Returns true if the system supports transparent windows and calling `setTransparent/2`\nmay succeed.\n\nIf this function returns false, transparent windows are definitely not supported by the\ncurrent system.","ref":"wxWindow.html#canSetTransparent/1"},{"type":"function","title":"wxWindow.captureMouse/1","doc":"Directs all mouse input to this window.\n\nCall `releaseMouse/1` to release the capture.\n\nNote that wxWidgets maintains the stack of windows having captured the mouse and when the\nmouse is released the capture returns to the window which had had captured it previously\nand it is only really released if there were no previous window. In particular, this means\nthat you must release the mouse as many times as you capture it, unless the window\nreceives the `m:wxMouseCaptureLostEvent` event.\n\nAny application which captures the mouse in the beginning of some operation must handle `m:wxMouseCaptureLostEvent`\nand cancel this operation when it receives the event. The event handler must not\nrecapture mouse.\n\nSee:\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`","ref":"wxWindow.html#captureMouse/1"},{"type":"function","title":"wxWindow.center/1","doc":"","ref":"wxWindow.html#center/1"},{"type":"function","title":"wxWindow.center/2","doc":"Equivalent to: `centre/2`","ref":"wxWindow.html#center/2"},{"type":"function","title":"wxWindow.centerOnParent/1","doc":"","ref":"wxWindow.html#centerOnParent/1"},{"type":"function","title":"wxWindow.centerOnParent/2","doc":"Equivalent to: `centreOnParent/2`","ref":"wxWindow.html#centerOnParent/2"},{"type":"function","title":"wxWindow.centre/1","doc":"","ref":"wxWindow.html#centre/1"},{"type":"function","title":"wxWindow.centre/2","doc":"Centres the window.\n\nRemark: If the window is a top level one (i.e. doesn't have a parent), it will be centred\nrelative to the screen anyhow.\n\nSee: `center/2`","ref":"wxWindow.html#centre/2"},{"type":"function","title":"wxWindow.centreOnParent/1","doc":"","ref":"wxWindow.html#centreOnParent/1"},{"type":"function","title":"wxWindow.centreOnParent/2","doc":"Centres the window on its parent.\n\nThis is a more readable synonym for `centre/2`.\n\nRemark: This methods provides for a way to centre top level windows over their parents\ninstead of the entire screen. If there is no parent or if the window is not a top level\nwindow, then behaviour is the same as `centre/2`.\n\nSee: `wxTopLevelWindow:centreOnScreen/2`","ref":"wxWindow.html#centreOnParent/2"},{"type":"function","title":"wxWindow.clearBackground/1","doc":"Clears the window by filling it with the current background colour.\n\nDoes not cause an erase background event to be generated.\n\nNotice that this uses `m:wxClientDC` to draw on the window and the results of doing it\nwhile also drawing on `m:wxPaintDC` for this window are undefined. Hence this method\nshouldn't be used from EVT_PAINT handlers, just use `wxDC:clear/1` on the `m:wxPaintDC` you already use\nthere instead.","ref":"wxWindow.html#clearBackground/1"},{"type":"function","title":"wxWindow.clientToScreen/2","doc":"Converts to screen coordinates from coordinates relative to this window.","ref":"wxWindow.html#clientToScreen/2"},{"type":"function","title":"wxWindow.clientToScreen/3","doc":"Converts to screen coordinates from coordinates relative to this window.","ref":"wxWindow.html#clientToScreen/3"},{"type":"function","title":"wxWindow.close/1","doc":"","ref":"wxWindow.html#close/1"},{"type":"function","title":"wxWindow.close/2","doc":"This function simply generates a `m:wxCloseEvent` whose handler usually tries to close\nthe window.\n\nIt doesn't close the window itself, however.\n\nReturn: true if the event was handled and not vetoed, false otherwise.\n\nRemark: Close calls the close handler for the window, providing an opportunity for the\nwindow to choose whether to destroy the window. Usually it is only used with the top level\nwindows (`m:wxFrame` and `m:wxDialog` classes) as the others are not supposed to have any\nspecial OnClose() logic. The close handler should check whether the window is being\ndeleted forcibly, using `wxCloseEvent:canVeto/1`, in which case it should destroy the window using `'Destroy'/1`. Note that\ncalling Close does not guarantee that the window will be destroyed; but it provides a way\nto simulate a manual close of a window, which may or may not be implemented by destroying\nthe window. The default implementation of wxDialog::OnCloseWindow does not necessarily\ndelete the dialog, since it will simply simulate an wxID_CANCEL event which is handled by\nthe appropriate button event handler and may do anything at all. To guarantee that the\nwindow will be destroyed, call `'Destroy'/1` instead\n\nSee:\n* `'Destroy'/1`\n\n* `m:wxCloseEvent`","ref":"wxWindow.html#close/2"},{"type":"function","title":"wxWindow.convertDialogToPixels/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#convertDialogToPixels/2"},{"type":"function","title":"wxWindow.convertPixelsToDialog/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#convertPixelsToDialog/2"},{"type":"function","title":"wxWindow.create/3","doc":"","ref":"wxWindow.html#create/3"},{"type":"function","title":"wxWindow.create/4","doc":"Construct the actual window object after creating the C++ object.\n\nThe non-default constructor of `m:wxWindow` class does two things: it initializes the C++\nobject and it also creates the window object in the underlying graphical toolkit. The `create/4`\nmethod can be used to perform the second part later, while the default constructor can be\nused to perform the first part only.\n\nPlease note that the underlying window must be created exactly once, i.e. if you use the\ndefault constructor, which doesn't do this, you `must` call `create/4` before using the window and\nif you use the non-default constructor, you can `not` call `create/4`, as the underlying window is\nalready created.\n\nNote that it is possible and, in fact, useful, to call some methods on the object between\ncreating the C++ object itself and calling `create/4` on it, e.g. a common pattern to avoid showing\nthe contents of a window before it is fully initialized is:\n\nAlso note that it is possible to create an object of a derived type and then call `create/4` on it:\nThis is notably used by overview_xrc.\n\nThe parameters of this method have exactly the same meaning as the non-default\nconstructor parameters, please refer to them for their description.\n\nReturn: true if window creation succeeded or false if it failed","ref":"wxWindow.html#create/4"},{"type":"function","title":"wxWindow.Destroy/1","doc":"Destroys the window safely.\n\nUse this function instead of the delete operator, since different window classes can be\ndestroyed differently. Frames and dialogs are not destroyed immediately when this function\nis called - they are added to a list of windows to be deleted on idle time, when all the\nwindow's events have been processed. This prevents problems with events being sent to\nnon-existent windows.\n\nReturn: true if the window has either been successfully deleted, or it has been added to\nthe list of windows pending real deletion.","ref":"wxWindow.html#Destroy/1"},{"type":"function","title":"wxWindow.destroy/1","doc":"Destroys the object","ref":"wxWindow.html#destroy/1"},{"type":"function","title":"wxWindow.destroyChildren/1","doc":"Destroys all children of a window.\n\nCalled automatically by the destructor.","ref":"wxWindow.html#destroyChildren/1"},{"type":"function","title":"wxWindow.disable/1","doc":"Disables the window.\n\nSame as `enable/2` Enable(false).\n\nReturn: Returns true if the window has been disabled, false if it had been already\ndisabled before the call to this function.","ref":"wxWindow.html#disable/1"},{"type":"function","title":"wxWindow.dragAcceptFiles/2","doc":"Enables or disables eligibility for drop file events (OnDropFiles).\n\nRemark: Windows only until version 2.8.9, available on all platforms since 2.8.10. Cannot\nbe used together with `setDropTarget/2` on non-Windows platforms.\n\nSee: `setDropTarget/2`","ref":"wxWindow.html#dragAcceptFiles/2"},{"type":"function","title":"wxWindow.enable/1","doc":"","ref":"wxWindow.html#enable/1"},{"type":"function","title":"wxWindow.enable/2","doc":"Enable or disable the window for user input.\n\nNote that when a parent window is disabled, all of its children are disabled as well and\nthey are re-enabled again when the parent is.\n\nA window can be created initially disabled by calling this method on it `before` calling `create/4`\nto create the actual underlying window, e.g.\n\nReturn: Returns true if the window has been enabled or disabled, false if nothing was\ndone, i.e. if the window had already been in the specified state.\n\nSee:\n* `isEnabled/1`\n\n* `disable/1`\n\n* `wxRadioBox:enable/3`","ref":"wxWindow.html#enable/2"},{"type":"function","title":"wxWindow.findFocus/0","doc":"Finds the window or control which currently has the keyboard focus.\n\nRemark: Note that this is a static function, so it can be called without needing a `m:wxWindow`\npointer.\n\nSee: `setFocus/1`","ref":"wxWindow.html#findFocus/0"},{"type":"function","title":"wxWindow.findWindow/2","doc":"Find a child of this window, by name.\n\nMay return `this` if it matches itself.\n\nNotice that only real children, not top level windows using this window as parent, are\nsearched by this function.","ref":"wxWindow.html#findWindow/2"},{"type":"function","title":"wxWindow.findWindowById/1","doc":"","ref":"wxWindow.html#findWindowById/1"},{"type":"function","title":"wxWindow.findWindowById/2","doc":"Find the first window with the given `id`.\n\nIf `parent` is NULL, the search will start from all top-level frames and dialog boxes; if\nnon-NULL, the search will be limited to the given window hierarchy. The search is\nrecursive in both cases.\n\nSee: `findWindow/2`\n\nReturn: Window with the given `id` or NULL if not found.","ref":"wxWindow.html#findWindowById/2"},{"type":"function","title":"wxWindow.findWindowByLabel/1","doc":"","ref":"wxWindow.html#findWindowByLabel/1"},{"type":"function","title":"wxWindow.findWindowByLabel/2","doc":"Find a window by its label.\n\nDepending on the type of window, the label may be a window title or panel item label. If `parent`\nis NULL, the search will start from all top-level frames and dialog boxes; if non-NULL,\nthe search will be limited to the given window hierarchy.\n\nThe search is recursive in both cases and, unlike with `findWindow/2`, recurses into top level child\nwindows too.\n\nSee: `findWindow/2`\n\nReturn: Window with the given `label` or NULL if not found.","ref":"wxWindow.html#findWindowByLabel/2"},{"type":"function","title":"wxWindow.findWindowByName/1","doc":"","ref":"wxWindow.html#findWindowByName/1"},{"type":"function","title":"wxWindow.findWindowByName/2","doc":"Find a window by its name (as given in a window constructor or `create/4` function call).\n\nIf `parent` is NULL, the search will start from all top-level frames and dialog boxes; if\nnon-NULL, the search will be limited to the given window hierarchy.\n\nThe search is recursive in both cases and, unlike `findWindow/2`, recurses into top level child windows too.\n\nIf no window with such name is found, `findWindowByLabel/2` is called, i.e. the name is interpreted as\n(internal) name first but if this fails, it's internal as (user-visible) label. As this\nbehaviour may be confusing, it is usually better to use either the `findWindow/2` overload taking the\nname or `findWindowByLabel/2` directly.\n\nReturn: Window with the given `name` or NULL if not found.","ref":"wxWindow.html#findWindowByName/2"},{"type":"function","title":"wxWindow.fit/1","doc":"Sizes the window to fit its best size.\n\nUsing this function is equivalent to setting window size to the return value of `getBestSize/1`.\n\nNote that, unlike `setSizerAndFit/3`, this function only changes the current window size and doesn't change\nits minimal size.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#fit/1"},{"type":"function","title":"wxWindow.fitInside/1","doc":"Similar to `fit/1`, but sizes the interior (virtual) size of a window.\n\nMainly useful with scrolled windows to reset scrollbars after sizing changes that do not\ntrigger a size event, and/or scrolled windows without an interior sizer. This function\nsimilarly won't do anything if there are no subwindows.","ref":"wxWindow.html#fitInside/1"},{"type":"function","title":"wxWindow.freeze/1","doc":"Freezes the window or, in other words, prevents any updates from taking place on screen,\nthe window is not redrawn at all.\n\n`thaw/1` must be called to re-enable window redrawing. Calls to these two functions may be nested\nbut to ensure that the window is properly repainted again, you must thaw it exactly as\nmany times as you froze it.\n\nIf the window has any children, they are recursively frozen too.\n\nThis method is useful for visual appearance optimization (for example, it is a good idea\nto use it before doing many large text insertions in a row into a `m:wxTextCtrl` under\nwxGTK) but is not implemented on all platforms nor for all controls so it is mostly just a\nhint to wxWidgets and not a mandatory directive.\n\nSee:\n* `thaw/1`\n\n* `isFrozen/1`","ref":"wxWindow.html#freeze/1"},{"type":"function","title":"wxWindow.fromDIP/2","doc":"Convert DPI-independent pixel values to the value in pixels appropriate for the current\ntoolkit.\n\nA DPI-independent pixel is just a pixel at the standard 96 DPI resolution. To keep the\nsame physical size at higher resolution, the physical pixel value must be scaled by `getDPIScaleFactor/1` but\nthis scaling may be already done by the underlying toolkit (GTK+, Cocoa, ...)\nautomatically. This method performs the conversion only if it is not already done by the\nlower level toolkit and so by using it with pixel values you can guarantee that the\nphysical size of the corresponding elements will remain the same in all resolutions under\nall platforms. For example, instead of creating a bitmap of the hard coded size of 32\npixels you should use to avoid using tiny bitmaps on high DPI screens.\n\nNotice that this function is only needed when using hard coded pixel values. It is not\nnecessary if the sizes are already based on the DPI-independent units such as dialog units\nor if you are relying on the controls automatic best size determination and using sizers\nto lay out them.\n\nAlso note that if either component of `sz` has the special value of -1, it is returned\nunchanged independently of the current DPI, to preserve the special value of -1 in\nwxWidgets API (it is often used to mean \"unspecified\").\n\nSince: 3.1.0","ref":"wxWindow.html#fromDIP/2"},{"type":"function","title":"wxWindow.getAcceleratorTable/1","doc":"Gets the accelerator table for this window.\n\nSee `m:wxAcceleratorTable`.","ref":"wxWindow.html#getAcceleratorTable/1"},{"type":"function","title":"wxWindow.getBackgroundColour/1","doc":"Returns the background colour of the window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `setForegroundColour/2`\n\n* `getForegroundColour/1`","ref":"wxWindow.html#getBackgroundColour/1"},{"type":"function","title":"wxWindow.getBackgroundStyle/1","doc":"Returns the background style of the window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `getForegroundColour/1`\n\n* `setBackgroundStyle/2`\n\n* `setTransparent/2`","ref":"wxWindow.html#getBackgroundStyle/1"},{"type":"function","title":"wxWindow.getBestSize/1","doc":"This functions returns the best acceptable minimal size for the window.\n\nFor example, for a static control, it will be the minimal size such that the control\nlabel is not truncated. For windows containing subwindows (typically `m:wxPanel`), the size\nreturned by this function will be the same as the size the window would have had after\ncalling `fit/1`.\n\nOverride virtual `DoGetBestSize()` (not implemented in wx) or, better, because it's\nusually more convenient, `DoGetBestClientSize()` (not implemented in wx) when writing your\nown custom window class to change the value returned by this public non-virtual method.\n\nNotice that the best size respects the minimal and maximal size explicitly set for the\nwindow, if any. So even if some window believes that it needs 200 pixels horizontally,\ncalling `setMaxSize/2` with a width of 100 would ensure that `getBestSize/1` returns the width of at most 100 pixels.\n\nSee:\n* `cacheBestSize/2`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#getBestSize/1"},{"type":"function","title":"wxWindow.getCapture/0","doc":"Returns the currently captured window.\n\nSee:\n* `hasCapture/1`\n\n* `captureMouse/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","ref":"wxWindow.html#getCapture/0"},{"type":"function","title":"wxWindow.getCaret/1","doc":"Returns the caret() associated with the window.","ref":"wxWindow.html#getCaret/1"},{"type":"function","title":"wxWindow.getCharHeight/1","doc":"Returns the character height for this window.","ref":"wxWindow.html#getCharHeight/1"},{"type":"function","title":"wxWindow.getCharWidth/1","doc":"Returns the average character width for this window.","ref":"wxWindow.html#getCharWidth/1"},{"type":"function","title":"wxWindow.getChildren/1","doc":"Returns a const reference to the list of the window's children.\n\n`wxWindowList` is a type-safe wxList-like class whose elements are of type `wxWindow*`.","ref":"wxWindow.html#getChildren/1"},{"type":"function","title":"wxWindow.getClientSize/1","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#getClientSize/1"},{"type":"function","title":"wxWindow.getContainingSizer/1","doc":"Returns the sizer of which this window is a member, if any, otherwise NULL.","ref":"wxWindow.html#getContainingSizer/1"},{"type":"function","title":"wxWindow.getContentScaleFactor/1","doc":"Returns the factor mapping logical pixels of this window to physical pixels.\n\nThis function can be used to portably determine the number of physical pixels in a window\nof the given size, by multiplying the window size by the value returned from it. I.e. it\nreturns the factor converting window coordinates to \"content view\" coordinates, where the\nview can be just a simple window displaying a `m:wxBitmap` or `m:wxGLCanvas` or any other\nkind of window rendering arbitrary \"content\" on screen.\n\nFor the platforms not doing any pixel mapping, i.e. where logical and physical pixels are\none and the same, this function always returns 1.0 and so using it is, in principle,\nunnecessary and could be avoided by using preprocessor check for `wxHAVE_DPI_INDEPENDENT_PIXELS`\n`not` being defined, however using this function unconditionally under all platforms is\nusually simpler and so preferable.\n\nNote: Current behaviour of this function is compatible with wxWidgets 3.0, but different\nfrom its behaviour in versions 3.1.0 to 3.1.3, where it returned the same value as `getDPIScaleFactor/1`.\nPlease use the other function if you need to use a scaling factor greater than 1.0 even\nfor the platforms without `wxHAVE_DPI_INDEPENDENT_PIXELS`, such as wxMSW.\n\nSince: 2.9.5","ref":"wxWindow.html#getContentScaleFactor/1"},{"type":"function","title":"wxWindow.getCursor/1","doc":"Return the cursor associated with this window.\n\nSee: `setCursor/2`","ref":"wxWindow.html#getCursor/1"},{"type":"function","title":"wxWindow.getDPI/1","doc":"Return the DPI of the display used by this window.\n\nThe returned value can be different for different windows on systems with support for\nper-monitor DPI values, such as Microsoft Windows 10.\n\nIf the DPI is not available, returns `{Width,Height}` object.\n\nSee: `wxDisplay:getPPI/1`\n\nSince: 3.1.3","ref":"wxWindow.html#getDPI/1"},{"type":"function","title":"wxWindow.getDPIScaleFactor/1","doc":"Returns the ratio of the DPI used by this window to the standard DPI.\n\nThe returned value is 1 for standard DPI screens or 2 for \"200% scaling\" and, unlike for `getContentScaleFactor/1`,\nis the same under all platforms.\n\nThis factor should be used to increase the size of icons and similar windows whose best\nsize is not based on text metrics when using DPI scaling.\n\nE.g. the program may load a 32px bitmap if the content scale factor is 1.0 or 64px\nversion of the same bitmap if it is 2.0 or bigger.\n\nNotice that this method should `not` be used for window sizes expressed in pixels, as\nthey are already scaled by this factor by the underlying toolkit under some platforms. Use `fromDIP/2`\nfor anything window-related instead.\n\nSince: 3.1.4","ref":"wxWindow.html#getDPIScaleFactor/1"},{"type":"function","title":"wxWindow.getDropTarget/1","doc":"Returns the associated drop target, which may be NULL.\n\nSee:\n* `setDropTarget/2`\n\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)","ref":"wxWindow.html#getDropTarget/1"},{"type":"function","title":"wxWindow.getExtraStyle/1","doc":"Returns the extra style bits for the window.","ref":"wxWindow.html#getExtraStyle/1"},{"type":"function","title":"wxWindow.getFont/1","doc":"Returns the font for this window.\n\nSee: `setFont/2`","ref":"wxWindow.html#getFont/1"},{"type":"function","title":"wxWindow.getForegroundColour/1","doc":"Returns the foreground colour of the window.\n\nRemark: The meaning of foreground colour varies according to the window class; it may be\nthe text colour or other colour, or it may not be used at all.\n\nSee:\n* `setForegroundColour/2`\n\n* `setBackgroundColour/2`\n\n* `getBackgroundColour/1`","ref":"wxWindow.html#getForegroundColour/1"},{"type":"function","title":"wxWindow.getGrandParent/1","doc":"Returns the grandparent of a window, or NULL if there isn't one.","ref":"wxWindow.html#getGrandParent/1"},{"type":"function","title":"wxWindow.getHandle/1","doc":"Returns the platform-specific handle of the physical window.\n\nCast it to an appropriate handle, such as `HWND` for Windows, `Widget` for Motif or `GtkWidget`\nfor GTK.","ref":"wxWindow.html#getHandle/1"},{"type":"function","title":"wxWindow.getHelpText/1","doc":"Gets the help text to be used as context-sensitive help for this window.\n\nNote that the text is actually stored by the current `wxHelpProvider` (not implemented in\nwx) implementation, and not in the window object itself.\n\nSee: `setHelpText/2`","ref":"wxWindow.html#getHelpText/1"},{"type":"function","title":"wxWindow.getId/1","doc":"Returns the identifier of the window.\n\nRemark: Each window has an integer identifier. If the application has not provided one\n(or the default wxID_ANY) a unique identifier with a negative value will be generated.\n\nSee:\n* `setId/2`\n\n* [Overview windowids](https://docs.wxwidgets.org/3.2/overview_windowids.html#overview_windowids)","ref":"wxWindow.html#getId/1"},{"type":"function","title":"wxWindow.getLabel/1","doc":"Generic way of getting a label from any window, for identification purposes.\n\nRemark: The interpretation of this function differs from class to class. For frames and\ndialogs, the value returned is the title. For buttons or static text controls, it is the\nbutton text. This function can be useful for meta-programs (such as testing tools or\nspecial-needs access programs) which need to identify windows by name.","ref":"wxWindow.html#getLabel/1"},{"type":"function","title":"wxWindow.getMaxSize/1","doc":"Returns the maximum size of the window.\n\nThis is an indication to the sizer layout mechanism that this is the maximum possible\nsize as well as the upper bound on window's size settable using `setSize/6`.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#getMaxSize/1"},{"type":"function","title":"wxWindow.getMinSize/1","doc":"Returns the minimum size of the window, an indication to the sizer layout mechanism that\nthis is the minimum required size.\n\nThis method normally just returns the value set by `setMinSize/2`, but it can be overridden to do the\ncalculation on demand.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#getMinSize/1"},{"type":"function","title":"wxWindow.getName/1","doc":"Returns the window's name.\n\nRemark: This name is not guaranteed to be unique; it is up to the programmer to supply an\nappropriate name in the window constructor or via `setName/2`.\n\nSee: `setName/2`","ref":"wxWindow.html#getName/1"},{"type":"function","title":"wxWindow.getParent/1","doc":"Returns the parent of the window, or NULL if there is no parent.","ref":"wxWindow.html#getParent/1"},{"type":"function","title":"wxWindow.getPosition/1","doc":"This gets the position of the window in pixels, relative to the parent window for the\nchild windows or relative to the display origin for the top level windows.\n\nSee: `getScreenPosition/1`","ref":"wxWindow.html#getPosition/1"},{"type":"function","title":"wxWindow.getRect/1","doc":"Returns the position and size of the window as a {X,Y,W,H} object.\n\nSee: `getScreenRect/1`","ref":"wxWindow.html#getRect/1"},{"type":"function","title":"wxWindow.getScreenPosition/1","doc":"Returns the window position in screen coordinates, whether the window is a child window\nor a top level one.\n\nSee: `getPosition/1`","ref":"wxWindow.html#getScreenPosition/1"},{"type":"function","title":"wxWindow.getScreenRect/1","doc":"Returns the position and size of the window on the screen as a {X,Y,W,H} object.\n\nSee: `getRect/1`","ref":"wxWindow.html#getScreenRect/1"},{"type":"function","title":"wxWindow.getScrollPos/2","doc":"Returns the built-in scrollbar position.\n\nSee: `setScrollbar/6`","ref":"wxWindow.html#getScrollPos/2"},{"type":"function","title":"wxWindow.getScrollRange/2","doc":"Returns the built-in scrollbar range.\n\nSee: `setScrollbar/6`","ref":"wxWindow.html#getScrollRange/2"},{"type":"function","title":"wxWindow.getScrollThumb/2","doc":"Returns the built-in scrollbar thumb size.\n\nSee: `setScrollbar/6`","ref":"wxWindow.html#getScrollThumb/2"},{"type":"function","title":"wxWindow.getSize/1","doc":"See the GetSize(int*,int*) overload for more info.","ref":"wxWindow.html#getSize/1"},{"type":"function","title":"wxWindow.getSizer/1","doc":"Returns the sizer associated with the window by a previous call to `setSizer/3`, or NULL.","ref":"wxWindow.html#getSizer/1"},{"type":"function","title":"wxWindow.getTextExtent/2","doc":"","ref":"wxWindow.html#getTextExtent/2"},{"type":"function","title":"wxWindow.getTextExtent/3","doc":"Gets the dimensions of the string as it would be drawn on the window with the currently\nselected font.\n\nThe text extent is returned in the `w` and `h` pointers.","ref":"wxWindow.html#getTextExtent/3"},{"type":"function","title":"wxWindow.getThemeEnabled/1","doc":"Returns true if the window uses the system theme for drawing its background.\n\nSee: `setThemeEnabled/2`","ref":"wxWindow.html#getThemeEnabled/1"},{"type":"function","title":"wxWindow.getToolTip/1","doc":"Get the associated tooltip or NULL if none.","ref":"wxWindow.html#getToolTip/1"},{"type":"function","title":"wxWindow.getUpdateRegion/1","doc":"Gets the dimensions of the string as it would be drawn on the window with the currently\nselected font.\n\nReturns the region specifying which parts of the window have been damaged. Should only be\ncalled within an `m:wxPaintEvent` handler.\n\nSee: `m:wxRegion`","ref":"wxWindow.html#getUpdateRegion/1"},{"type":"function","title":"wxWindow.getVirtualSize/1","doc":"This gets the virtual size of the window in pixels.\n\nBy default it returns the client size of the window, but after a call to `setVirtualSize/3` it will return\nthe size set with that method.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#getVirtualSize/1"},{"type":"function","title":"wxWindow.getWindowStyleFlag/1","doc":"Gets the window style that was passed to the constructor or `create/4` method.\n\n`GetWindowStyle()` (not implemented in wx) is another name for the same function.","ref":"wxWindow.html#getWindowStyleFlag/1"},{"type":"function","title":"wxWindow.getWindowVariant/1","doc":"Returns the value previously passed to `setWindowVariant/2`.","ref":"wxWindow.html#getWindowVariant/1"},{"type":"function","title":"wxWindow.hasCapture/1","doc":"Returns true if this window has the current mouse capture.\n\nSee:\n* `captureMouse/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","ref":"wxWindow.html#hasCapture/1"},{"type":"function","title":"wxWindow.hasScrollbar/2","doc":"Returns true if this window currently has a scroll bar for this orientation.\n\nThis method may return false even when `CanScroll()` (not implemented in wx) for the same\norientation returns true, but if `CanScroll()` (not implemented in wx) returns false, i.e.\nscrolling in this direction is not enabled at all, `hasScrollbar/2` always returns false as well.","ref":"wxWindow.html#hasScrollbar/2"},{"type":"function","title":"wxWindow.hasTransparentBackground/1","doc":"Returns true if this window background is transparent (as, for example, for `m:wxStaticText`)\nand should show the parent window background.\n\nThis method is mostly used internally by the library itself and you normally shouldn't\nhave to call it. You may, however, have to override it in your wxWindow-derived class to\nensure that background is painted correctly.","ref":"wxWindow.html#hasTransparentBackground/1"},{"type":"function","title":"wxWindow.hide/1","doc":"Equivalent to calling `show/2`(false).","ref":"wxWindow.html#hide/1"},{"type":"function","title":"wxWindow.inheritAttributes/1","doc":"This function is (or should be, in case of custom controls) called during window creation\nto intelligently set up the window visual attributes, that is the font and the foreground\nand background colours.\n\nBy \"intelligently\" the following is meant: by default, all windows use their own `GetClassDefaultAttributes()`\n(not implemented in wx) default attributes. However if some of the parents attributes are\nexplicitly (that is, using `setFont/2` and not `setOwnFont/2`) changed and if the corresponding attribute hadn't\nbeen explicitly set for this window itself, then this window takes the same value as used\nby the parent. In addition, if the window overrides `shouldInheritColours/1` to return false, the colours will not\nbe changed no matter what and only the font might.\n\nThis rather complicated logic is necessary in order to accommodate the different usage\nscenarios. The most common one is when all default attributes are used and in this case,\nnothing should be inherited as in modern GUIs different controls use different fonts (and\ncolours) than their siblings so they can't inherit the same value from the parent. However\nit was also deemed desirable to allow to simply change the attributes of all children at\nonce by just changing the font or colour of their common parent, hence in this case we do\ninherit the parents attributes.","ref":"wxWindow.html#inheritAttributes/1"},{"type":"function","title":"wxWindow.initDialog/1","doc":"Sends an `wxEVT\\_INIT\\_DIALOG` event, whose handler usually transfers data to the dialog\nvia validators.","ref":"wxWindow.html#initDialog/1"},{"type":"function","title":"wxWindow.invalidateBestSize/1","doc":"Resets the cached best size value so it will be recalculated the next time it is needed.\n\nSee: `cacheBestSize/2`","ref":"wxWindow.html#invalidateBestSize/1"},{"type":"function","title":"wxWindow.isDoubleBuffered/1","doc":"Returns true if the window contents is double-buffered by the system, i.e. if any drawing\ndone on the window is really done on a temporary backing surface and transferred to the\nscreen all at once later.\n\nSee: `m:wxBufferedDC`","ref":"wxWindow.html#isDoubleBuffered/1"},{"type":"function","title":"wxWindow.isEnabled/1","doc":"Returns true if the window is enabled, i.e. if it accepts user input, false otherwise.\n\nNotice that this method can return false even if this window itself hadn't been\nexplicitly disabled when one of its parent windows is disabled. To get the intrinsic\nstatus of this window, use `IsThisEnabled()` (not implemented in wx)\n\nSee: `enable/2`","ref":"wxWindow.html#isEnabled/1"},{"type":"function","title":"wxWindow.isExposed/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#isExposed/2"},{"type":"function","title":"wxWindow.isExposed/3","doc":"Returns true if the given point or rectangle area has been exposed since the last\nrepaint.\n\nCall this in an paint event handler to optimize redrawing by only redrawing those areas,\nwhich have been exposed.","ref":"wxWindow.html#isExposed/3"},{"type":"function","title":"wxWindow.isExposed/5","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#isExposed/5"},{"type":"function","title":"wxWindow.isFrozen/1","doc":"Returns true if the window is currently frozen by a call to `freeze/1`.\n\nSee:\n* `freeze/1`\n\n* `thaw/1`","ref":"wxWindow.html#isFrozen/1"},{"type":"function","title":"wxWindow.isRetained/1","doc":"Returns true if the window is retained, false otherwise.\n\nRemark: Retained windows are only available on X platforms.","ref":"wxWindow.html#isRetained/1"},{"type":"function","title":"wxWindow.isShown/1","doc":"Returns true if the window is shown, false if it has been hidden.\n\nSee: `isShownOnScreen/1`","ref":"wxWindow.html#isShown/1"},{"type":"function","title":"wxWindow.isShownOnScreen/1","doc":"Returns true if the window is physically visible on the screen, i.e. it is shown and all\nits parents up to the toplevel window are shown as well.\n\nSee: `isShown/1`","ref":"wxWindow.html#isShownOnScreen/1"},{"type":"function","title":"wxWindow.isTopLevel/1","doc":"Returns true if the given window is a top-level one.\n\nCurrently all frames and dialogs are considered to be top-level windows (even if they\nhave a parent window).","ref":"wxWindow.html#isTopLevel/1"},{"type":"function","title":"wxWindow.layout/1","doc":"Lays out the children of this window using the associated sizer.\n\nIf a sizer hadn't been associated with this window (see `setSizer/3`), this function doesn't do\nanything, unless this is a top level window (see `layout/1`).\n\nNote that this method is called automatically when the window size changes if it has the\nassociated sizer (or if `setAutoLayout/2` with true argument had been explicitly called), ensuring that it\nis always laid out correctly.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)\n\nReturn: Always returns true, the return value is not useful.","ref":"wxWindow.html#layout/1"},{"type":"function","title":"wxWindow.lineDown/1","doc":"Same as `scrollLines/2` (1).","ref":"wxWindow.html#lineDown/1"},{"type":"function","title":"wxWindow.lineUp/1","doc":"Same as `scrollLines/2` (-1).","ref":"wxWindow.html#lineUp/1"},{"type":"function","title":"wxWindow.lower/1","doc":"Lowers the window to the bottom of the window hierarchy (Z-order).\n\nRemark: This function only works for wxTopLevelWindow-derived classes.\n\nSee: `raise/1`","ref":"wxWindow.html#lower/1"},{"type":"function","title":"wxWindow.move/2","doc":"","ref":"wxWindow.html#move/2"},{"type":"function","title":"wxWindow.move/3","doc":"Moves the window to the given position.\n\nRemark: Implementations of `setSize/6` can also implicitly implement the `move/4` function, which is defined\nin the base `m:wxWindow` class as the call:\n\nSee: `setSize/6`","ref":"wxWindow.html#move/3"},{"type":"function","title":"wxWindow.move/4","doc":"Moves the window to the given position.\n\nRemark: Implementations of SetSize can also implicitly implement the `move/4` function, which is\ndefined in the base `m:wxWindow` class as the call:\n\nSee: `setSize/6`","ref":"wxWindow.html#move/4"},{"type":"function","title":"wxWindow.moveAfterInTabOrder/2","doc":"Moves this window in the tab navigation order after the specified `win`.\n\nThis means that when the user presses `TAB` key on that other window, the focus switches\nto this window.\n\nDefault tab order is the same as creation order, this function and `moveBeforeInTabOrder/2` allow to change it\nafter creating all the windows.","ref":"wxWindow.html#moveAfterInTabOrder/2"},{"type":"function","title":"wxWindow.moveBeforeInTabOrder/2","doc":"Same as `moveAfterInTabOrder/2` except that it inserts this window just before `win`\ninstead of putting it right after it.","ref":"wxWindow.html#moveBeforeInTabOrder/2"},{"type":"function","title":"wxWindow.navigate/1","doc":"","ref":"wxWindow.html#navigate/1"},{"type":"function","title":"wxWindow.navigate/2","doc":"Performs a keyboard navigation action starting from this window.\n\nThis method is equivalent to calling `NavigateIn()` (not implemented in wx) method on the\nparent window.\n\nReturn: Returns true if the focus was moved to another window or false if nothing changed.\n\nRemark: You may wish to call this from a text control custom keypress handler to do the\ndefault navigation behaviour for the tab key, since the standard default behaviour for a\nmultiline text control with the wxTE_PROCESS_TAB style is to insert a tab and not navigate\nto the next control. See also `m:wxNavigationKeyEvent` and HandleAsNavigationKey.","ref":"wxWindow.html#navigate/2"},{"type":"function","title":"wxWindow.new/0","doc":"Default constructor.","ref":"wxWindow.html#new/0"},{"type":"function","title":"wxWindow.new/2","doc":"","ref":"wxWindow.html#new/2"},{"type":"function","title":"wxWindow.new/3","doc":"Constructs a window, which can be a child of a frame, dialog or any other non-control\nwindow.","ref":"wxWindow.html#new/3"},{"type":"function","title":"wxWindow.pageDown/1","doc":"Same as `scrollPages/2` (1).","ref":"wxWindow.html#pageDown/1"},{"type":"function","title":"wxWindow.pageUp/1","doc":"Same as `scrollPages/2` (-1).","ref":"wxWindow.html#pageUp/1"},{"type":"function","title":"wxWindow.popupMenu/2","doc":"","ref":"wxWindow.html#popupMenu/2"},{"type":"function","title":"wxWindow.popupMenu/3","doc":"Pops up the given menu at the specified coordinates, relative to this window, and returns\ncontrol when the user has dismissed the menu.\n\nIf a menu item is selected, the corresponding menu event is generated and will be\nprocessed as usual. If coordinates are not specified, the current mouse cursor position is used.\n\n`menu` is the menu to pop up.\n\nThe position where the menu will appear can be specified either as a {X,Y} `pos` or by\ntwo integers (`x` and `y`).\n\nNote that this function switches focus to this window before showing the menu.\n\nRemark: Just before the menu is popped up, `wxMenu::UpdateUI` (not implemented in wx) is\ncalled to ensure that the menu items are in the correct state. The menu does not get\ndeleted by the window. It is recommended to not explicitly specify coordinates when\ncalling PopupMenu in response to mouse click, because some of the ports (namely, wxGTK)\ncan do a better job of positioning the menu in that case.\n\nSee: `m:wxMenu`","ref":"wxWindow.html#popupMenu/3"},{"type":"function","title":"wxWindow.popupMenu/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#popupMenu/4"},{"type":"function","title":"wxWindow.raise/1","doc":"Raises the window to the top of the window hierarchy (Z-order).\n\nNotice that this function only requests the window manager to raise this window to the\ntop of Z-order. Depending on its configuration, the window manager may raise the window,\nnot do it at all or indicate that a window requested to be raised in some other way, e.g.\nby flashing its icon if it is minimized.\n\nRemark: This function only works for wxTopLevelWindow-derived classes.\n\nSee: `lower/1`","ref":"wxWindow.html#raise/1"},{"type":"function","title":"wxWindow.refresh/1","doc":"","ref":"wxWindow.html#refresh/1"},{"type":"function","title":"wxWindow.refresh/2","doc":"Causes this window, and all of its children recursively (except under wxGTK1 where this\nis not implemented), to be repainted.\n\nNote that repainting doesn't happen immediately but only during the next event loop\niteration, if you need to update the window immediately you should use `update/1` instead.\n\nSee: `refreshRect/3`","ref":"wxWindow.html#refresh/2"},{"type":"function","title":"wxWindow.refreshRect/2","doc":"","ref":"wxWindow.html#refreshRect/2"},{"type":"function","title":"wxWindow.refreshRect/3","doc":"Redraws the contents of the given rectangle: only the area inside it will be repainted.\n\nThis is the same as `refresh/2` but has a nicer syntax as it can be called with a temporary\n{X,Y,W,H} object as argument like this `RefreshRect(wxRect(x, y, w, h))`.","ref":"wxWindow.html#refreshRect/3"},{"type":"function","title":"wxWindow.releaseMouse/1","doc":"Releases mouse input captured with `captureMouse/1`.\n\nSee:\n* `captureMouse/1`\n\n* `hasCapture/1`\n\n* `releaseMouse/1`\n\n* `m:wxMouseCaptureLostEvent`\n\n* `m:wxMouseCaptureChangedEvent`","ref":"wxWindow.html#releaseMouse/1"},{"type":"function","title":"wxWindow.removeChild/2","doc":"Removes a child window.\n\nThis is called automatically by window deletion functions so should not be required by\nthe application programmer. Notice that this function is mostly internal to wxWidgets and\nshouldn't be called by the user code.","ref":"wxWindow.html#removeChild/2"},{"type":"function","title":"wxWindow.reparent/2","doc":"Reparents the window, i.e. the window will be removed from its current parent window\n(e.g.\n\na non-standard toolbar in a `m:wxFrame`) and then re-inserted into another.\n\nNotice that currently you need to explicitly call `wxBookCtrlBase:removePage/2` before reparenting a notebook page.","ref":"wxWindow.html#reparent/2"},{"type":"function","title":"wxWindow.screenToClient/1","doc":"Converts from screen to client window coordinates.","ref":"wxWindow.html#screenToClient/1"},{"type":"function","title":"wxWindow.screenToClient/2","doc":"Converts from screen to client window coordinates.","ref":"wxWindow.html#screenToClient/2"},{"type":"function","title":"wxWindow.scrollLines/2","doc":"Scrolls the window by the given number of lines down (if `lines` is positive) or up.\n\nReturn: Returns true if the window was scrolled, false if it was already on top/bottom\nand nothing was done.\n\nRemark: This function is currently only implemented under MSW and `m:wxTextCtrl` under\nwxGTK (it also works for `wxScrolled` (not implemented in wx) classes under all platforms).\n\nSee: `scrollPages/2`","ref":"wxWindow.html#scrollLines/2"},{"type":"function","title":"wxWindow.scrollPages/2","doc":"Scrolls the window by the given number of pages down (if `pages` is positive) or up.\n\nReturn: Returns true if the window was scrolled, false if it was already on top/bottom\nand nothing was done.\n\nRemark: This function is currently only implemented under MSW and wxGTK.\n\nSee: `scrollLines/2`","ref":"wxWindow.html#scrollPages/2"},{"type":"function","title":"wxWindow.scrollWindow/3","doc":"","ref":"wxWindow.html#scrollWindow/3"},{"type":"function","title":"wxWindow.scrollWindow/4","doc":"Physically scrolls the pixels in the window and move child windows accordingly.\n\nRemark: Note that you can often use `wxScrolled` (not implemented in wx) instead of using\nthis function directly.","ref":"wxWindow.html#scrollWindow/4"},{"type":"function","title":"wxWindow.setAcceleratorTable/2","doc":"Sets the accelerator table for this window.\n\nSee `m:wxAcceleratorTable`.","ref":"wxWindow.html#setAcceleratorTable/2"},{"type":"function","title":"wxWindow.setAutoLayout/2","doc":"Determines whether the `layout/1` function will be called automatically when the window\nis resized.\n\nThis method is called implicitly by `setSizer/3` but if you use `SetConstraints()` (not implemented\nin wx) you should call it manually or otherwise the window layout won't be correctly\nupdated when its size changes.\n\nSee: `setSizer/3`","ref":"wxWindow.html#setAutoLayout/2"},{"type":"function","title":"wxWindow.setBackgroundColour/2","doc":"Sets the background colour of the window.\n\nNotice that as with `setForegroundColour/2`, setting the background colour of a native control may not affect\nthe entire control and could be not supported at all depending on the control and platform.\n\nPlease see `inheritAttributes/1` for explanation of the difference between this method and `setOwnBackgroundColour/2`.\n\nRemark: The background colour is usually painted by the default `m:wxEraseEvent` event\nhandler function under Windows and automatically under GTK. Note that setting the\nbackground colour does not cause an immediate refresh, so you may wish to call `clearBackground/1` or `refresh/2` after\ncalling this function. Using this function will disable attempts to use themes for this\nwindow, if the system supports them. Use with care since usually the themes represent the\nappearance chosen by the user to be used for all applications on the system.\n\nReturn: true if the colour was really changed, false if it was already set to this colour\nand nothing was done.\n\nSee:\n* `getBackgroundColour/1`\n\n* `setForegroundColour/2`\n\n* `getForegroundColour/1`\n\n* `clearBackground/1`\n\n* `refresh/2`\n\n* `m:wxEraseEvent`\n\n* `m:wxSystemSettings`","ref":"wxWindow.html#setBackgroundColour/2"},{"type":"function","title":"wxWindow.setBackgroundStyle/2","doc":"Sets the background style of the window.\n\nThe default background style is `wxBG_STYLE_ERASE` which indicates that the window\nbackground may be erased in `EVT_ERASE_BACKGROUND` handler. This is a safe, compatibility\ndefault; however you may want to change it to `wxBG_STYLE_SYSTEM` if you don't define any\nerase background event handlers at all, to avoid unnecessary generation of erase\nbackground events and always let system erase the background. And you should change the\nbackground style to `wxBG_STYLE_PAINT` if you define an `EVT_PAINT` handler which\ncompletely overwrites the window background as in this case erasing it previously, either\nin `EVT_ERASE_BACKGROUND` handler or in the system default handler, would result in\nflicker as the background pixels will be repainted twice every time the window is redrawn.\nDo ensure that the background is entirely erased by your `EVT_PAINT` handler in this case\nhowever as otherwise garbage may be left on screen.\n\nNotice that in previous versions of wxWidgets a common way to work around the above\nmentioned flickering problem was to define an empty `EVT_ERASE_BACKGROUND` handler.\nSetting background style to `wxBG_STYLE_PAINT` is a simpler and more efficient solution to\nthe same problem.\n\nUnder wxGTK and wxOSX, you can use ?wxBG\\_STYLE\\_TRANSPARENT to obtain full transparency\nof the window background. Note that wxGTK supports this only since GTK 2.12 with a\ncompositing manager enabled, call `IsTransparentBackgroundSupported()` (not implemented in\nwx) to check whether this is the case.\n\nAlso, in order for `SetBackgroundStyle(wxBG_STYLE_TRANSPARENT)` to work, it must be\ncalled before `create/4`. If you're using your own wxWindow-derived class you should write your code\nin the following way:\n\nSee:\n* `setBackgroundColour/2`\n\n* `getForegroundColour/1`\n\n* `setTransparent/2`","ref":"wxWindow.html#setBackgroundStyle/2"},{"type":"function","title":"wxWindow.setCaret/2","doc":"Sets the caret() associated with the window.","ref":"wxWindow.html#setCaret/2"},{"type":"function","title":"wxWindow.setClientSize/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#setClientSize/2"},{"type":"function","title":"wxWindow.setClientSize/3","doc":"This sets the size of the window client area in pixels.\n\nUsing this function to size a window tends to be more device-independent than `setSize/6`, since the\napplication need not worry about what dimensions the border or title bar have when trying\nto fit the window around panel items, for example.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setClientSize/3"},{"type":"function","title":"wxWindow.setContainingSizer/2","doc":"Used by `m:wxSizer` internally to notify the window about being managed by the given\nsizer.\n\nThis method should not be called from outside the library, unless you're implementing a\ncustom sizer class - and in the latter case you must call this method with the pointer to\nthe sizer itself whenever a window is added to it and with NULL argument when the window\nis removed from it.","ref":"wxWindow.html#setContainingSizer/2"},{"type":"function","title":"wxWindow.setCursor/2","doc":"Sets the window's cursor.\n\nNotice that the window cursor also sets it for the children of the window implicitly.\n\nThe `cursor` may be `wxNullCursor` in which case the window cursor will be reset back to default.\n\nSee:\n* `wx_misc:setCursor/1`\n\n* `m:wxCursor`","ref":"wxWindow.html#setCursor/2"},{"type":"function","title":"wxWindow.setDoubleBuffered/2","doc":"Turn on or off double buffering of the window if the system supports it.","ref":"wxWindow.html#setDoubleBuffered/2"},{"type":"function","title":"wxWindow.setDropTarget/2","doc":"Associates a drop target with this window.\n\nIf the window already has a drop target, it is deleted.\n\nSee:\n* `getDropTarget/1`\n\n* [Overview dnd](https://docs.wxwidgets.org/3.2/overview_dnd.html#overview_dnd)","ref":"wxWindow.html#setDropTarget/2"},{"type":"function","title":"wxWindow.setExtraStyle/2","doc":"Sets the extra style bits for the window.\n\nThe currently defined extra style bits are reported in the class description.","ref":"wxWindow.html#setExtraStyle/2"},{"type":"function","title":"wxWindow.setFocus/1","doc":"This sets the window to receive keyboard input.\n\nSee:\n* `m:wxFocusEvent`\n\n* `setFocus/1`\n\n* `wxPanel:setFocusIgnoringChildren/1`","ref":"wxWindow.html#setFocus/1"},{"type":"function","title":"wxWindow.setFocusFromKbd/1","doc":"This function is called by wxWidgets keyboard navigation code when the user gives the\nfocus to this window from keyboard (e.g. using `TAB` key).\n\nBy default this method simply calls `setFocus/1` but can be overridden to do something in addition to\nthis in the derived classes.","ref":"wxWindow.html#setFocusFromKbd/1"},{"type":"function","title":"wxWindow.setFont/2","doc":"Sets the font for this window.\n\nThis function should not be called for the parent window if you don't want its font to be\ninherited by its children, use `setOwnFont/2` instead in this case and see `inheritAttributes/1` for more explanations.\n\nPlease notice that the given font is not automatically used for `m:wxPaintDC` objects\nassociated with this window, you need to call `wxDC:setFont/2` too. However this font is used by any\nstandard controls for drawing their text as well as by `getTextExtent/3`.\n\nReturn: true if the font was really changed, false if it was already set to this font and\nnothing was done.\n\nSee:\n* `getFont/1`\n\n* `inheritAttributes/1`","ref":"wxWindow.html#setFont/2"},{"type":"function","title":"wxWindow.setForegroundColour/2","doc":"Sets the foreground colour of the window.\n\nThe meaning of foreground colour varies according to the window class; it may be the text\ncolour or other colour, or it may not be used at all. Additionally, not all native\ncontrols support changing their foreground colour so this method may change their colour\nonly partially or even not at all.\n\nPlease see `inheritAttributes/1` for explanation of the difference between this method and `setOwnForegroundColour/2`.\n\nReturn: true if the colour was really changed, false if it was already set to this colour\nand nothing was done.\n\nSee:\n* `getForegroundColour/1`\n\n* `setBackgroundColour/2`\n\n* `getBackgroundColour/1`\n\n* `shouldInheritColours/1`","ref":"wxWindow.html#setForegroundColour/2"},{"type":"function","title":"wxWindow.setHelpText/2","doc":"Sets the help text to be used as context-sensitive help for this window.\n\nNote that the text is actually stored by the current `wxHelpProvider` (not implemented in\nwx) implementation, and not in the window object itself.\n\nSee: `getHelpText/1`","ref":"wxWindow.html#setHelpText/2"},{"type":"function","title":"wxWindow.setId/2","doc":"Sets the identifier of the window.\n\nRemark: Each window has an integer identifier. If the application has not provided one,\nan identifier will be generated. Normally, the identifier should be provided on creation\nand should not be modified subsequently.\n\nSee:\n* `getId/1`\n\n* [Overview windowids](https://docs.wxwidgets.org/3.2/overview_windowids.html#overview_windowids)","ref":"wxWindow.html#setId/2"},{"type":"function","title":"wxWindow.setLabel/2","doc":"Sets the window's label.\n\nSee: `getLabel/1`","ref":"wxWindow.html#setLabel/2"},{"type":"function","title":"wxWindow.setMaxSize/2","doc":"Sets the maximum size of the window, to indicate to the sizer layout mechanism that this\nis the maximum possible size.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setMaxSize/2"},{"type":"function","title":"wxWindow.setMinSize/2","doc":"Sets the minimum size of the window, to indicate to the sizer layout mechanism that this\nis the minimum required size.\n\nYou may need to call this if you change the window size after construction and before\nadding to its parent sizer.\n\nNotice that calling this method doesn't prevent the program from making the window\nexplicitly smaller than the specified size by calling `setSize/6`, it just ensures that it won't\nbecome smaller than this size during the automatic layout.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setMinSize/2"},{"type":"function","title":"wxWindow.setName/2","doc":"Sets the window's name.\n\nSee: `getName/1`","ref":"wxWindow.html#setName/2"},{"type":"function","title":"wxWindow.setOwnBackgroundColour/2","doc":"Sets the background colour of the window but prevents it from being inherited by the\nchildren of this window.\n\nSee:\n* `setBackgroundColour/2`\n\n* `inheritAttributes/1`","ref":"wxWindow.html#setOwnBackgroundColour/2"},{"type":"function","title":"wxWindow.setOwnFont/2","doc":"Sets the font of the window but prevents it from being inherited by the children of this\nwindow.\n\nSee:\n* `setFont/2`\n\n* `inheritAttributes/1`","ref":"wxWindow.html#setOwnFont/2"},{"type":"function","title":"wxWindow.setOwnForegroundColour/2","doc":"Sets the foreground colour of the window but prevents it from being inherited by the\nchildren of this window.\n\nSee:\n* `setForegroundColour/2`\n\n* `inheritAttributes/1`","ref":"wxWindow.html#setOwnForegroundColour/2"},{"type":"function","title":"wxWindow.setPalette/2","doc":"Deprecated:\n\nuse `wxDC:setPalette/2` instead.","ref":"wxWindow.html#setPalette/2"},{"type":"function","title":"wxWindow.setScrollbar/5","doc":"","ref":"wxWindow.html#setScrollbar/5"},{"type":"function","title":"wxWindow.setScrollbar/6","doc":"Sets the scrollbar properties of a built-in scrollbar.\n\nRemark: Let's say you wish to display 50 lines of text, using the same font. The window\nis sized so that you can only see 16 lines at a time. You would use: Note that with the\nwindow at this size, the thumb position can never go above 50 minus 16, or 34. You can\ndetermine how many lines are currently visible by dividing the current view size by the\ncharacter height in pixels. When defining your own scrollbar behaviour, you will always\nneed to recalculate the scrollbar settings when the window size changes. You could\ntherefore put your scrollbar calculations and SetScrollbar call into a function named\nAdjustScrollbars, which can be called initially and also from your `m:wxSizeEvent` handler function.\n\nSee:\n* [Overview scrolling](https://docs.wxwidgets.org/3.2/overview_scrolling.html#overview_scrolling)\n\n* `m:wxScrollBar`\n\n* `m:wxScrollWinEvent`","ref":"wxWindow.html#setScrollbar/6"},{"type":"function","title":"wxWindow.setScrollPos/3","doc":"","ref":"wxWindow.html#setScrollPos/3"},{"type":"function","title":"wxWindow.setScrollPos/4","doc":"Sets the position of one of the built-in scrollbars.\n\nRemark: This function does not directly affect the contents of the window: it is up to\nthe application to take note of scrollbar attributes and redraw contents accordingly.\n\nSee:\n* `setScrollbar/6`\n\n* `getScrollPos/2`\n\n* `getScrollThumb/2`\n\n* `m:wxScrollBar`","ref":"wxWindow.html#setScrollPos/4"},{"type":"function","title":"wxWindow.setSize/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#setSize/2"},{"type":"function","title":"wxWindow.setSize/3","doc":"Sets the size of the window in pixels.\n\nThe size is specified using a {X,Y,W,H}, {Width,Height} or by a couple of `int` objects.\n\nRemark: This form must be used with non-default width and height values.\n\nSee:\n* `move/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setSize/3"},{"type":"function","title":"wxWindow.setSize/5","doc":"","ref":"wxWindow.html#setSize/5"},{"type":"function","title":"wxWindow.setSize/6","doc":"Sets the size of the window in pixels.\n\nRemark: This overload sets the position and optionally size, of the window. Parameters\nmay be wxDefaultCoord to indicate either that a default should be supplied by wxWidgets,\nor that the current value of the dimension should be used.\n\nSee:\n* `move/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setSize/6"},{"type":"function","title":"wxWindow.setSizeHints/2","doc":"","ref":"wxWindow.html#setSizeHints/2"},{"type":"function","title":"wxWindow.setSizeHints/3","doc":"Use of this function for windows which are not toplevel windows (such as `m:wxDialog` or `m:wxFrame`)\nis discouraged.\n\nPlease use `setMinSize/2` and `setMaxSize/2` instead.\n\nSee:\n* `setSizeHints/4`\n\n* [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setSizeHints/3"},{"type":"function","title":"wxWindow.setSizeHints/4","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#setSizeHints/4"},{"type":"function","title":"wxWindow.setSizer/2","doc":"","ref":"wxWindow.html#setSizer/2"},{"type":"function","title":"wxWindow.setSizer/3","doc":"Sets the window to have the given layout sizer.\n\nThe window will then own the object, and will take care of its deletion. If an existing\nlayout constraints object is already owned by the window, it will be deleted if the `deleteOld`\nparameter is true.\n\nNote that this function will also call `setAutoLayout/2` implicitly with true parameter if the `sizer` is\nnon-NULL and false otherwise so that the sizer will be effectively used to layout the\nwindow children whenever it is resized.\n\nRemark: SetSizer enables and disables Layout automatically.","ref":"wxWindow.html#setSizer/3"},{"type":"function","title":"wxWindow.setSizerAndFit/2","doc":"","ref":"wxWindow.html#setSizerAndFit/2"},{"type":"function","title":"wxWindow.setSizerAndFit/3","doc":"Associate the sizer with the window and set the window size and minimal size accordingly.\n\nThis method calls `setSizer/3` and then `wxSizer:setSizeHints/2` which sets the initial window size to the size needed to\naccommodate all sizer elements and sets the minimal size to the same size, this preventing\nthe user from resizing this window to be less than this minimal size (if it's a top-level\nwindow which can be directly resized by the user).","ref":"wxWindow.html#setSizerAndFit/3"},{"type":"function","title":"wxWindow.setThemeEnabled/2","doc":"This function tells a window if it should use the system's \"theme\" code to draw the\nwindows' background instead of its own background drawing code.\n\nThis does not always have any effect since the underlying platform obviously needs to\nsupport the notion of themes in user defined windows. One such platform is GTK+ where\nwindows can have (very colourful) backgrounds defined by a user's selected theme.\n\nDialogs, notebook pages and the status bar have this flag set to true by default so that\nthe default look and feel is simulated best.\n\nSee: `getThemeEnabled/1`","ref":"wxWindow.html#setThemeEnabled/2"},{"type":"function","title":"wxWindow.setToolTip/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#setToolTip/2"},{"type":"function","title":"wxWindow.setTransparent/2","doc":"Set the transparency of the window.\n\nIf the system supports transparent windows, returns true, otherwise returns false and the\nwindow remains fully opaque. See also `canSetTransparent/1`.\n\nThe parameter `alpha` is in the range 0..255 where 0 corresponds to a fully transparent\nwindow and 255 to the fully opaque one. The constants `wxIMAGE_ALPHA_TRANSPARENT` and `wxIMAGE_ALPHA_OPAQUE`\ncan be used.","ref":"wxWindow.html#setTransparent/2"},{"type":"function","title":"wxWindow.setVirtualSize/2","doc":"This is an overloaded member function, provided for convenience. It differs from the\nabove function only in what argument(s) it accepts.","ref":"wxWindow.html#setVirtualSize/2"},{"type":"function","title":"wxWindow.setVirtualSize/3","doc":"Sets the virtual size of the window in pixels.\n\nSee: [Overview windowsizing](https://docs.wxwidgets.org/3.2/overview_windowsizing.html#overview_windowsizing)","ref":"wxWindow.html#setVirtualSize/3"},{"type":"function","title":"wxWindow.setWindowStyle/2","doc":"See `setWindowStyleFlag/2` for more info.","ref":"wxWindow.html#setWindowStyle/2"},{"type":"function","title":"wxWindow.setWindowStyleFlag/2","doc":"Sets the style of the window.\n\nPlease note that some styles cannot be changed after the window creation and that `refresh/2` might\nneed to be called after changing the others for the change to take place immediately.\n\nSee Window styles for more information about flags.\n\nSee: `getWindowStyleFlag/1`","ref":"wxWindow.html#setWindowStyleFlag/2"},{"type":"function","title":"wxWindow.setWindowVariant/2","doc":"Chooses a different variant of the window display to use.\n\nWindow variants currently just differ in size, as can be seen from ?wxWindowVariant\ndocumentation. Under all platforms but macOS, this function does nothing more than change\nthe font used by the window. However under macOS it is implemented natively and selects\nthe appropriate variant of the native widget, which has better appearance than just scaled\ndown or up version of the normal variant, so it should be preferred to directly tweaking\nthe font size.\n\nBy default the controls naturally use the normal variant.","ref":"wxWindow.html#setWindowVariant/2"},{"type":"function","title":"wxWindow.shouldInheritColours/1","doc":"Return true from here to allow the colours of this window to be changed by `inheritAttributes/1`.\n\nReturning false forbids inheriting them from the parent window.\n\nThe base class version returns false, but this method is overridden in `m:wxControl`\nwhere it returns true.","ref":"wxWindow.html#shouldInheritColours/1"},{"type":"function","title":"wxWindow.show/1","doc":"","ref":"wxWindow.html#show/1"},{"type":"function","title":"wxWindow.show/2","doc":"Shows or hides the window.\n\nYou may need to call `raise/1` for a top level window if you want to bring it to top, although\nthis is not needed if `show/2` is called immediately after the frame creation.\n\nNotice that the default state of newly created top level windows is hidden (to allow you\nto create their contents without flicker) unlike for all the other, not derived from `m:wxTopLevelWindow`,\nwindows that are by default created in the shown state.\n\nReturn: true if the window has been shown or hidden or false if nothing was done because\nit already was in the requested state.\n\nSee:\n* `isShown/1`\n\n* `hide/1`\n\n* `wxRadioBox:show/3`\n\n* `m:wxShowEvent`","ref":"wxWindow.html#show/2"},{"type":"function","title":"wxWindow.thaw/1","doc":"Re-enables window updating after a previous call to `freeze/1`.\n\nTo really thaw the control, it must be called exactly the same number of times as `freeze/1`.\n\nIf the window has any children, they are recursively thawed too.\n\nSee:\n* `freeze/1`\n\n* `isFrozen/1`","ref":"wxWindow.html#thaw/1"},{"type":"function","title":"wxWindow.toDIP/2","doc":"Convert pixel values of the current toolkit to DPI-independent pixel values.\n\nA DPI-independent pixel is just a pixel at the standard 96 DPI resolution. To keep the\nsame physical size at higher resolution, the physical pixel value must be scaled by `getDPIScaleFactor/1` but\nthis scaling may be already done by the underlying toolkit (GTK+, Cocoa, ...)\nautomatically. This method performs the conversion only if it is not already done by the\nlower level toolkit, For example, you may want to use this to store window sizes and\npositions so that they can be re-used regardless of the display DPI:\n\nAlso note that if either component of `sz` has the special value of -1, it is returned\nunchanged independently of the current DPI, to preserve the special value of -1 in\nwxWidgets API (it is often used to mean \"unspecified\").\n\nSince: 3.1.0","ref":"wxWindow.html#toDIP/2"},{"type":"function","title":"wxWindow.transferDataFromWindow/1","doc":"Transfers values from child controls to data areas specified by their validators.\n\nReturns false if a transfer failed.\n\nNotice that this also calls `transferDataFromWindow/1` for all children recursively.\n\nSee:\n* `transferDataToWindow/1`\n\n* `validate/1`","ref":"wxWindow.html#transferDataFromWindow/1"},{"type":"function","title":"wxWindow.transferDataToWindow/1","doc":"Transfers values to child controls from data areas specified by their validators.\n\nNotice that this also calls `transferDataToWindow/1` for all children recursively.\n\nReturn: Returns false if a transfer failed.\n\nSee:\n* `transferDataFromWindow/1`\n\n* `validate/1`","ref":"wxWindow.html#transferDataToWindow/1"},{"type":"function","title":"wxWindow.update/1","doc":"Calling this method immediately repaints the invalidated area of the window and all of\nits children recursively (this normally only happens when the flow of control returns to\nthe event loop).\n\nNotice that this function doesn't invalidate any area of the window so nothing happens if\nnothing has been invalidated (i.e. marked as requiring a redraw). Use `refresh/2` first if you want\nto immediately redraw the window unconditionally.","ref":"wxWindow.html#update/1"},{"type":"function","title":"wxWindow.updateWindowUI/1","doc":"","ref":"wxWindow.html#updateWindowUI/1"},{"type":"function","title":"wxWindow.updateWindowUI/2","doc":"This function sends one or more `m:wxUpdateUIEvent` to the window.\n\nThe particular implementation depends on the window; for example a `m:wxToolBar` will\nsend an update UI event for each toolbar button, and a `m:wxFrame` will send an update UI\nevent for each menubar menu item.\n\nYou can call this function from your application to ensure that your UI is up-to-date at\nthis point (as far as your `m:wxUpdateUIEvent` handlers are concerned). This may be\nnecessary if you have called `wxUpdateUIEvent:setMode/1` or `wxUpdateUIEvent:setUpdateInterval/1` to limit the overhead that wxWidgets incurs by sending\nupdate UI events in idle time. `flags` should be a bitlist of one or more of the\n?wxUpdateUI enumeration.\n\nIf you are calling this function from an OnInternalIdle or OnIdle function, make sure you\npass the wxUPDATE_UI_FROMIDLE flag, since this tells the window to only update the UI\nelements that need to be updated in idle time. Some windows update their elements only\nwhen necessary, for example when a menu is about to be shown. The following is an example\nof how to call UpdateWindowUI from an idle function.\n\nSee: `m:wxUpdateUIEvent`","ref":"wxWindow.html#updateWindowUI/2"},{"type":"function","title":"wxWindow.validate/1","doc":"Validates the current values of the child controls using their validators.\n\nNotice that this also calls `validate/1` for all children recursively.\n\nReturn: Returns false if any of the validations failed.\n\nSee:\n* `transferDataFromWindow/1`\n\n* `transferDataToWindow/1`","ref":"wxWindow.html#validate/1"},{"type":"function","title":"wxWindow.warpPointer/3","doc":"Moves the pointer to the given position on the window.\n\nNote: Apple Human Interface Guidelines forbid moving the mouse cursor programmatically so\nyou should avoid using this function in Mac applications (and probably avoid using it\nunder the other platforms without good reason as well).","ref":"wxWindow.html#warpPointer/3"},{"type":"type","title":"wxWindow.wxWindow/0","doc":"","ref":"wxWindow.html#t:wxWindow/0"},{"type":"module","title":"wxWindowCreateEvent","doc":"This event is sent just after the actual window associated with a `m:wxWindow` object has\nbeen created.\n\nSince it is derived from `m:wxCommandEvent`, the event propagates up the window hierarchy.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxWindowDestroyEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWindowCreateEvent](https://docs.wxwidgets.org/3.2/classwx_window_create_event.html)","ref":"wxWindowCreateEvent.html"},{"type":"module","title":"Events - wxWindowCreateEvent","doc":"Use `wxEvtHandler:connect/3` with `wxWindowCreateEventType` to subscribe to events of this type.","ref":"wxWindowCreateEvent.html#module-events"},{"type":"type","title":"wxWindowCreateEvent.wxWindowCreate/0","doc":"","ref":"wxWindowCreateEvent.html#t:wxWindowCreate/0"},{"type":"type","title":"wxWindowCreateEvent.wxWindowCreateEvent/0","doc":"","ref":"wxWindowCreateEvent.html#t:wxWindowCreateEvent/0"},{"type":"type","title":"wxWindowCreateEvent.wxWindowCreateEventType/0","doc":"","ref":"wxWindowCreateEvent.html#t:wxWindowCreateEventType/0"},{"type":"module","title":"wxWindowDC","doc":"A `m:wxWindowDC` must be constructed if an application wishes to paint on the whole area\nof a window (client and decorations).\n\nThis should normally be constructed as a temporary stack object; don't store a `m:wxWindowDC`\nobject.\n\nTo draw on a window from inside an EVT_PAINT() handler, construct a `m:wxPaintDC` object instead.\n\nTo draw on the client area of a window from outside an EVT_PAINT() handler, construct a `m:wxClientDC`\nobject.\n\nA `m:wxWindowDC` object is initialized to use the same font and colours as the window it\nis associated with.\n\nSee:\n* `m:wxDC`\n\n* `m:wxMemoryDC`\n\n* `m:wxPaintDC`\n\n* `m:wxClientDC`\n\n* `m:wxScreenDC`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxDC`\n\nwxWidgets docs: [wxWindowDC](https://docs.wxwidgets.org/3.2/classwx_window_d_c.html)","ref":"wxWindowDC.html"},{"type":"function","title":"wxWindowDC.destroy/1","doc":"Destroys the object","ref":"wxWindowDC.html#destroy/1"},{"type":"function","title":"wxWindowDC.new/1","doc":"Constructor.\n\nPass a pointer to the window on which you wish to paint.","ref":"wxWindowDC.html#new/1"},{"type":"type","title":"wxWindowDC.wxWindowDC/0","doc":"","ref":"wxWindowDC.html#t:wxWindowDC/0"},{"type":"module","title":"wxWindowDestroyEvent","doc":"This event is sent as early as possible during the window destruction process.\n\nFor the top level windows, as early as possible means that this is done by `m:wxFrame` or `m:wxDialog`\ndestructor, i.e. after the destructor of the derived class was executed and so any\nmethods specific to the derived class can't be called any more from this event handler. If\nyou need to do this, you must call `wxWindow::SendDestroyEvent()` (not implemented in wx)\nfrom your derived class destructor.\n\nFor the child windows, this event is generated just before deleting the window from `wxWindow:'Destroy'/1`\n(which is also called when the parent window is deleted) or from the window destructor if\noperator `delete` was used directly (which is not recommended for this very reason).\n\nIt is usually pointless to handle this event in the window itself but it ca be very\nuseful to receive notifications about the window destruction in the parent window or in\nany other object interested in this window.\n\nSee:\n* [Overview events](https://docs.wxwidgets.org/3.2/overview_events.html#overview_events)\n\n* `m:wxWindowCreateEvent`\n\nThis class is derived, and can use functions, from:\n\n* `m:wxCommandEvent`\n\n* `m:wxEvent`\n\nwxWidgets docs: [wxWindowDestroyEvent](https://docs.wxwidgets.org/3.2/classwx_window_destroy_event.html)","ref":"wxWindowDestroyEvent.html"},{"type":"type","title":"wxWindowDestroyEvent.wxWindowDestroy/0","doc":"","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroy/0"},{"type":"type","title":"wxWindowDestroyEvent.wxWindowDestroyEvent/0","doc":"","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroyEvent/0"},{"type":"type","title":"wxWindowDestroyEvent.wxWindowDestroyEventType/0","doc":"","ref":"wxWindowDestroyEvent.html#t:wxWindowDestroyEventType/0"},{"type":"module","title":"wxXmlResource","doc":"This is the main class for interacting with the XML-based resource system.\n\nThe class holds XML resources from one or more .xml files, binary files or zip archive files.\n\nNote that this is a singleton class and you'll never allocate/deallocate it. Just use the\nstatic `get/0` getter.\n\nSee:\n* [Overview xrc](https://docs.wxwidgets.org/3.2/overview_xrc.html#overview_xrc)\n\n* [Overview xrcformat](https://docs.wxwidgets.org/3.2/overview_xrcformat.html#overview_xrcformat)\n\nwxWidgets docs: [wxXmlResource](https://docs.wxwidgets.org/3.2/classwxXml_resource.html)","ref":"wxXmlResource.html"},{"type":"function","title":"wxXmlResource.attachUnknownControl/3","doc":"","ref":"wxXmlResource.html#attachUnknownControl/3"},{"type":"function","title":"wxXmlResource.attachUnknownControl/4","doc":"Attaches an unknown control to the given panel/window/dialog.\n\nUnknown controls are used in conjunction with .","ref":"wxXmlResource.html#attachUnknownControl/4"},{"type":"function","title":"wxXmlResource.clearHandlers/1","doc":"Removes all handlers and deletes them (this means that any handlers added using `AddHandler()`\n(not implemented in wx) must be allocated on the heap).","ref":"wxXmlResource.html#clearHandlers/1"},{"type":"function","title":"wxXmlResource.compareVersion/5","doc":"Compares the XRC version to the argument.\n\nReturns -1 if the XRC version is less than the argument, +1 if greater, and 0 if they are\nequal.","ref":"wxXmlResource.html#compareVersion/5"},{"type":"function","title":"wxXmlResource.destroy/1","doc":"Destroys the object","ref":"wxXmlResource.html#destroy/1"},{"type":"function","title":"wxXmlResource.get/0","doc":"Gets the global resources object or creates one if none exists.","ref":"wxXmlResource.html#get/0"},{"type":"function","title":"wxXmlResource.getFlags/1","doc":"Returns flags, which may be a bitlist of ?wxXmlResourceFlags enumeration values.","ref":"wxXmlResource.html#getFlags/1"},{"type":"function","title":"wxXmlResource.getVersion/1","doc":"Returns version information (a.b.c.d = d + 256*c + 2562*b + 2563*a).","ref":"wxXmlResource.html#getVersion/1"},{"type":"function","title":"wxXmlResource.getXRCID/1","doc":"","ref":"wxXmlResource.html#getXRCID/1"},{"type":"function","title":"wxXmlResource.getXRCID/2","doc":"Returns a numeric ID that is equivalent to the string ID used in an XML resource.\n\nIf an unknown `str_id` is requested (i.e. other than wxID_XXX or integer), a new record\nis created which associates the given string with a number.\n\nIf `value_if_not_found` is `wxID_NONE`, the number is obtained via `wx_misc:newId/0`. Otherwise `value_if_not_found`\nis used.\n\nMacro `XRCID(name)` is provided for convenient use in event tables.\n\nNote: IDs returned by XRCID() cannot be used with the `EVT_*_RANGE` macros, because the\norder in which they are assigned to symbolic `name` values is not guaranteed.","ref":"wxXmlResource.html#getXRCID/2"},{"type":"function","title":"wxXmlResource.initAllHandlers/1","doc":"Initializes handlers for all supported controls/windows.\n\nThis will make the executable quite big because it forces linking against most of the\nwxWidgets library.","ref":"wxXmlResource.html#initAllHandlers/1"},{"type":"function","title":"wxXmlResource.load/2","doc":"Loads resources from XML files that match given filemask.\n\nExample:\n\nNote: If wxUSE_FILESYS is enabled, this method understands `wxFileSystem` (not\nimplemented in wx) URLs (see `wxFileSystem::FindFirst()` (not implemented in wx)).\n\nNote: If you are sure that the argument is name of single XRC file (rather than an URL or\na wildcard), use `LoadFile()` (not implemented in wx) instead.","ref":"wxXmlResource.html#load/2"},{"type":"function","title":"wxXmlResource.loadBitmap/2","doc":"Loads a bitmap resource from a file.","ref":"wxXmlResource.html#loadBitmap/2"},{"type":"function","title":"wxXmlResource.loadDialog/3","doc":"Loads a dialog.\n\n`parent` points to parent window (if any).","ref":"wxXmlResource.html#loadDialog/3"},{"type":"function","title":"wxXmlResource.loadDialog/4","doc":"Loads a dialog.\n\n`parent` points to parent window (if any).\n\nThis form is used to finish creation of an already existing instance (the main reason for\nthis is that you may want to use derived class with a new event table). Example:","ref":"wxXmlResource.html#loadDialog/4"},{"type":"function","title":"wxXmlResource.loadFrame/3","doc":"Loads a frame from the resource.\n\n`parent` points to parent window (if any).","ref":"wxXmlResource.html#loadFrame/3"},{"type":"function","title":"wxXmlResource.loadFrame/4","doc":"Loads the contents of a frame onto an existing `m:wxFrame`.\n\nThis form is used to finish creation of an already existing instance (the main reason for\nthis is that you may want to use derived class with a new event table).","ref":"wxXmlResource.html#loadFrame/4"},{"type":"function","title":"wxXmlResource.loadIcon/2","doc":"Loads an icon resource from a file.","ref":"wxXmlResource.html#loadIcon/2"},{"type":"function","title":"wxXmlResource.loadMenu/2","doc":"Loads menu from resource.\n\nReturns NULL on failure.","ref":"wxXmlResource.html#loadMenu/2"},{"type":"function","title":"wxXmlResource.loadMenuBar/2","doc":"","ref":"wxXmlResource.html#loadMenuBar/2"},{"type":"function","title":"wxXmlResource.loadMenuBar/3","doc":"Loads a menubar from resource.\n\nReturns NULL on failure.","ref":"wxXmlResource.html#loadMenuBar/3"},{"type":"function","title":"wxXmlResource.loadPanel/3","doc":"Loads a panel.\n\n`parent` points to the parent window.","ref":"wxXmlResource.html#loadPanel/3"},{"type":"function","title":"wxXmlResource.loadPanel/4","doc":"Loads a panel.\n\n`parent` points to the parent window. This form is used to finish creation of an already\nexisting instance.","ref":"wxXmlResource.html#loadPanel/4"},{"type":"function","title":"wxXmlResource.loadToolBar/3","doc":"Loads a toolbar.","ref":"wxXmlResource.html#loadToolBar/3"},{"type":"function","title":"wxXmlResource.new/0","doc":"","ref":"wxXmlResource.html#new/0"},{"type":"function","title":"wxXmlResource.new/1","doc":"Constructor.","ref":"wxXmlResource.html#new/1"},{"type":"function","title":"wxXmlResource.new/2","doc":"Constructor.","ref":"wxXmlResource.html#new/2"},{"type":"function","title":"wxXmlResource.set/1","doc":"Sets the global resources object and returns a pointer to the previous one (may be NULL).","ref":"wxXmlResource.html#set/1"},{"type":"function","title":"wxXmlResource.setFlags/2","doc":"Sets flags (bitlist of ?wxXmlResourceFlags enumeration values).","ref":"wxXmlResource.html#setFlags/2"},{"type":"function","title":"wxXmlResource.unload/2","doc":"This function unloads a resource previously loaded by `load/2`.\n\nReturns true if the resource was successfully unloaded and false if it hasn't been found\nin the list of loaded resources.","ref":"wxXmlResource.html#unload/2"},{"type":"function","title":"wxXmlResource.xrcctrl/3","doc":"","ref":"wxXmlResource.html#xrcctrl/3"},{"type":"type","title":"wxXmlResource.wxXmlResource/0","doc":"","ref":"wxXmlResource.html#t:wxXmlResource/0"},{"type":"module","title":"wx_misc","doc":"Miscellaneous functions.","ref":"wx_misc.html"},{"type":"function","title":"wx_misc.beginBusyCursor/0","doc":"","ref":"wx_misc.html#beginBusyCursor/0"},{"type":"function","title":"wx_misc.beginBusyCursor/1","doc":"Changes the cursor to the given cursor for all windows in the application.\n\nUse `wx_misc:endBusyCursor/0` to revert the cursor back to its previous state. These two calls can be nested, and\na counter ensures that only the outer calls take effect.\n\nSee: `wx_misc:isBusy/0`","ref":"wx_misc.html#beginBusyCursor/1"},{"type":"function","title":"wx_misc.bell/0","doc":"Ring the system bell.\n\nNote: This function is categorized as a GUI one and so is not thread-safe.","ref":"wx_misc.html#bell/0"},{"type":"function","title":"wx_misc.displaySize/0","doc":"Returns the display size in pixels.\n\nNote: Use of this function is not recommended in the new code as it only works for the\nprimary display. Use `wxDisplay:getGeometry/1` to retrieve the size of the appropriate display instead.\n\nEither of output pointers can be NULL if the caller is not interested in the\ncorresponding value.\n\nSee: `m:wxDisplay`","ref":"wx_misc.html#displaySize/0"},{"type":"function","title":"wx_misc.endBusyCursor/0","doc":"Changes the cursor back to the original cursor, for all windows in the application.\n\nUse with `wx_misc:beginBusyCursor/1`.\n\nSee: `wx_misc:isBusy/0`","ref":"wx_misc.html#endBusyCursor/0"},{"type":"function","title":"wx_misc.findMenuItemId/3","doc":"Find a menu item identifier associated with the given frame's menu bar.","ref":"wx_misc.html#findMenuItemId/3"},{"type":"function","title":"wx_misc.findWindowAtPoint/1","doc":"Find the deepest window at the given mouse position in screen coordinates, returning the\nwindow if found, or NULL if not.\n\nThis function takes child windows at the given position into account even if they are\ndisabled. The hidden children are however skipped by it.","ref":"wx_misc.html#findWindowAtPoint/1"},{"type":"function","title":"wx_misc.getCurrentId/0","doc":"Returns the current id.","ref":"wx_misc.html#getCurrentId/0"},{"type":"function","title":"wx_misc.getEmailAddress/0","doc":"Copies the user's email address into the supplied buffer, by concatenating the values\nreturned by `wxGetFullHostName()` (not implemented in wx) and `wx_misc:getUserId/0`.\n\nReturn: true if successful, false otherwise.","ref":"wx_misc.html#getEmailAddress/0"},{"type":"function","title":"wx_misc.getHomeDir/0","doc":"Return the (current) user's home directory.","ref":"wx_misc.html#getHomeDir/0"},{"type":"function","title":"wx_misc.getKeyState/1","doc":"For normal keys, returns true if the specified key is currently down.\n\nFor togglable keys (Caps Lock, Num Lock and Scroll Lock), returns true if the key is\ntoggled such that its LED indicator is lit. There is currently no way to test whether\ntogglable keys are up or down.\n\nEven though there are virtual key codes defined for mouse buttons, they cannot be used\nwith this function currently.\n\nIn wxGTK, this function can be only used with modifier keys (`WXK_ALT`, `WXK_CONTROL` and `WXK_SHIFT`)\nwhen not using X11 backend currently.","ref":"wx_misc.html#getKeyState/1"},{"type":"function","title":"wx_misc.getMousePosition/0","doc":"Returns the mouse position in screen coordinates.","ref":"wx_misc.html#getMousePosition/0"},{"type":"function","title":"wx_misc.getMouseState/0","doc":"Returns the current state of the mouse.\n\nReturns a `wx_wxMouseState()` instance that contains the current position of the mouse pointer in screen\ncoordinates, as well as boolean values indicating the up/down status of the mouse buttons\nand the modifier keys.","ref":"wx_misc.html#getMouseState/0"},{"type":"function","title":"wx_misc.getOsDescription/0","doc":"Returns the string containing the description of the current platform in a user-readable\nform.\n\nFor example, this function may return strings like \"Windows 10 (build 10240), 64-bit\nedition\" or \"Linux 4.1.4 i386\".","ref":"wx_misc.html#getOsDescription/0"},{"type":"function","title":"wx_misc.getUserId/0","doc":"This function returns the \"user id\" also known as \"login name\" under Unix (i.e.\n\nsomething like \"jsmith\"). It uniquely identifies the current user (on this system). Under\nWindows or NT, this function first looks in the environment variables USER and LOGNAME; if\nneither of these is found, the entry `UserId` in the `wxWidgets` section of the WIN.INI\nfile is tried.\n\nReturn: The login name if successful or an empty string otherwise.","ref":"wx_misc.html#getUserId/0"},{"type":"function","title":"wx_misc.isBusy/0","doc":"Returns true if between two `wx_misc:beginBusyCursor/1` and `wx_misc:endBusyCursor/0`\ncalls.","ref":"wx_misc.html#isBusy/0"},{"type":"function","title":"wx_misc.isPlatform64Bit/0","doc":"Returns true if the operating system the program is running under is 64 bit.\n\nThe check is performed at run-time and may differ from the value available at\ncompile-time (at compile-time you can just check if `sizeof(void*) == 8`) since the\nprogram could be running in emulation mode or in a mixed 32/64 bit system (bi-architecture\noperating system).\n\nNote: This function is not 100% reliable on some systems given the fact that there isn't\nalways a standard way to do a reliable check on the OS architecture.","ref":"wx_misc.html#isPlatform64Bit/0"},{"type":"function","title":"wx_misc.isPlatformLittleEndian/0","doc":"Returns true if the current platform is little endian (instead of big endian).\n\nThe check is performed at run-time.","ref":"wx_misc.html#isPlatformLittleEndian/0"},{"type":"function","title":"wx_misc.launchDefaultBrowser/1","doc":"","ref":"wx_misc.html#launchDefaultBrowser/1"},{"type":"function","title":"wx_misc.launchDefaultBrowser/2","doc":"Opens the `url` in user's default browser.\n\nIf the `flags` parameter contains `wxBROWSER_NEW_WINDOW` flag, a new window is opened for\nthe URL (currently this is only supported under Windows).\n\nAnd unless the `flags` parameter contains `wxBROWSER_NOBUSYCURSOR` flag, a busy cursor is\nshown while the browser is being launched (using `wxBusyCursor` (not implemented in wx)).\n\nThe parameter `url` is interpreted as follows:\n\n* if it has a valid scheme (e.g. `\"file:\"`, `\"http:\"` or `\"mailto:\"`) it is passed to the\nappropriate browser configured in the user system.\n\n* if it has no valid scheme (e.g. it's a local file path without the `\"file:\"` prefix),\nthen ?wxFileExists and ?wxDirExists are used to test if it's a local file/directory; if it\nis, then the browser is called with the `url` parameter eventually prefixed by `\"file:\"`.\n\n* if it has no valid scheme and it's not a local file/directory, then `\"http:\"` is\nprepended and the browser is called.\n\nReturns true if the application was successfully launched.\n\nNote: For some configurations of the running user, the application which is launched to\nopen the given URL may be URL-dependent (e.g. a browser may be used for local URLs while\nanother one may be used for remote URLs).","ref":"wx_misc.html#launchDefaultBrowser/2"},{"type":"function","title":"wx_misc.mSWSetEmulationLevel/1","doc":"","ref":"wx_misc.html#mSWSetEmulationLevel/1"},{"type":"function","title":"wx_misc.mSWSetEmulationLevel/2","doc":"","ref":"wx_misc.html#mSWSetEmulationLevel/2"},{"type":"function","title":"wx_misc.newId/0","doc":"Deprecated:\n\nIds generated by it can conflict with the Ids defined by the user code, use `wxID_ANY` to\nassign ids which are guaranteed to not conflict with the user-defined ids for the controls\nand menu items you create instead of using this function.\n\nGenerates an integer identifier unique to this run of the program.","ref":"wx_misc.html#newId/0"},{"type":"function","title":"wx_misc.registerId/1","doc":"Ensures that Ids subsequently generated by `wx_misc:newId/0` do not clash with the given `id`.","ref":"wx_misc.html#registerId/1"},{"type":"function","title":"wx_misc.setCursor/1","doc":"Globally sets the cursor; only has an effect on Windows, Mac and GTK+.\n\nYou should call this function with wxNullCursor to restore the system cursor.\n\nSee:\n* `m:wxCursor`\n\n* `wxWindow:setCursor/2`","ref":"wx_misc.html#setCursor/1"},{"type":"function","title":"wx_misc.setDetectableAutoRepeat/1","doc":"Don't synthesize KeyUp events holding down a key and producing KeyDown events with\nautorepeat.\n\nOn by default and always on in wxMSW.","ref":"wx_misc.html#setDetectableAutoRepeat/1"},{"type":"function","title":"wx_misc.shell/0","doc":"","ref":"wx_misc.html#shell/0"},{"type":"function","title":"wx_misc.shell/1","doc":"Executes a command in an interactive shell window.\n\nIf no command is specified, then just the shell is spawned.\n\nSee: [Examples](https://docs.wxwidgets.org/3.2/page_samples.html#page_samples_exec)","ref":"wx_misc.html#shell/1"},{"type":"function","title":"wx_misc.shutdown/0","doc":"","ref":"wx_misc.html#shutdown/0"},{"type":"function","title":"wx_misc.shutdown/1","doc":"This function shuts down or reboots the computer depending on the value of the `flags`.\n\nNote: Note that performing the shutdown requires the corresponding access rights\n(superuser under Unix, SE_SHUTDOWN privilege under Windows) and that this function is only\nimplemented under Unix and MSW.\n\nReturn: true on success, false if an error occurred.","ref":"wx_misc.html#shutdown/1"},{"type":"behaviour","title":"wx_object","doc":"wx_object - Generic wx object behaviour.\n\nwx_object - Generic wx object behaviour\n\nThis is a behaviour module that can be used for \"sub classing\" wx objects. It\nworks like a regular gen_server module and creates a server per object.\n\nNOTE: Currently no form of inheritance is implemented.\n\nThe user module should export:\n\ninit(Args) should return \n\\{wxWindow, State\\} | \\{wxWindow, State, Timeout\\} | ignore | \\{stop, Reason\\}\n\nAsynchronous window event handling: \nhandle_event(#wx\\{\\}, State) should return \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nThe user module can export the following callback functions:\n\nhandle_call(Msg, \\{From, Tag\\}, State) should return \n\\{reply, Reply, State\\} | \\{reply, Reply, State, Timeout\\} | \\{noreply, State\\}\n| \\{noreply, State, Timeout\\} | \\{stop, Reason, Reply, State\\}\n\nhandle_cast(Msg, State) should return \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nIf the above are not exported but called, the wx_object process will crash. The\nuser module can also export:\n\nInfo is message e.g. \\{'EXIT', P, R\\}, \\{nodedown, N\\}, ... \nhandle_info(Info, State) should return , ... \n\\{noreply, State\\} | \\{noreply, State, Timeout\\} | \\{stop, Reason, State\\}\n\nIf a message is sent to the wx_object process when handle_info is not exported,\nthe message will be dropped and ignored.\n\nWhen stop is returned in one of the functions above with Reason = normal |\nshutdown | Term, terminate(State) is called. It lets the user module clean up,\nit is always called when server terminates or when wx_object() in the driver is\ndeleted. If the Parent process terminates the Module:terminate/2 function is\ncalled. \nterminate(Reason, State)\n\nExample:\n\n```erlang\n -module(myDialog).\n -export([new/2, show/1, destroy/1]). %% API\n -export([init/1, handle_call/3, handle_event/2,\n handle_info/2, code_change/3, terminate/2]).\n new/2, showModal/1, destroy/1]). %% Callbacks\n\n %% Client API\n new(Parent, Msg) ->\n wx_object:start(?MODULE, [Parent,Id], []).\n\n show(Dialog) ->\n wx_object:call(Dialog, show_modal).\n\n destroy(Dialog) ->\n wx_object:call(Dialog, destroy).\n\n %% Server Implementation ala gen_server\n init([Parent, Str]) ->\n Dialog = wxDialog:new(Parent, 42, \"Testing\", []),\n ...\n wxDialog:connect(Dialog, command_button_clicked),\n {Dialog, MyState}.\n\n handle_call(show, _From, State) ->\n wxDialog:show(State#state.win),\n {reply, ok, State};\n ...\n handle_event(#wx{}, State) ->\n io:format(\"Users clicked button~n\",[]),\n {noreply, State};\n ...\n```","ref":"wx_object.html"},{"type":"behaviour","title":"DATA TYPES - wx_object","doc":"- **[](){: #type-request_id } request_id() = term()**\n\n- **[](){: #type-server_ref } server_ref() =\n [wx:wx_object()](`m:wx#type-wx_object`) | atom() | pid()**","ref":"wx_object.html#module-data-types"},{"type":"function","title":"wx_object.call/2","doc":"call(Obj, Request) -> term()\n\nMake a call to a wx_object server. The call waits until it gets a result.\nInvokes handle_call(Request, From, State) in the server","ref":"wx_object.html#call/2"},{"type":"function","title":"wx_object.call/3","doc":"call(Obj, Request, Timeout) -> term()\n\nMake a call to a wx_object server with a timeout. Invokes handle_call(Request,\nFrom, State) in server","ref":"wx_object.html#call/3"},{"type":"function","title":"wx_object.cast/2","doc":"cast(Obj, Request) -> ok\n\nMake a cast to a wx_object server. Invokes handle_cast(Request, State) in the\nserver","ref":"wx_object.html#cast/2"},{"type":"function","title":"wx_object.check_response/2","doc":"check_response(Msg::term(), Key::request_id()) -> {reply, Reply::term()} | false\n| {error, {term(), server_ref()}}\n\nCheck if a received message was a reply to a RequestId","ref":"wx_object.html#check_response/2"},{"type":"callback","title":"wx_object.code_change/3","doc":"","ref":"wx_object.html#c:code_change/3"},{"type":"function","title":"wx_object.get_pid/1","doc":"get_pid(Obj) -> pid()\n\nGet the pid of the object handle.","ref":"wx_object.html#get_pid/1"},{"type":"callback","title":"wx_object.handle_call/3","doc":"","ref":"wx_object.html#c:handle_call/3"},{"type":"callback","title":"wx_object.handle_cast/2","doc":"","ref":"wx_object.html#c:handle_cast/2"},{"type":"callback","title":"wx_object.handle_event/2","doc":"","ref":"wx_object.html#c:handle_event/2"},{"type":"callback","title":"wx_object.handle_info/2","doc":"","ref":"wx_object.html#c:handle_info/2"},{"type":"callback","title":"wx_object.handle_sync_event/3","doc":"","ref":"wx_object.html#c:handle_sync_event/3"},{"type":"callback","title":"wx_object.init/1","doc":"","ref":"wx_object.html#c:init/1"},{"type":"function","title":"wx_object.reply/2","doc":"reply(X1::{pid(), Tag::term()}, Reply::term()) -> pid()\n\nGet the pid of the object handle.","ref":"wx_object.html#reply/2"},{"type":"function","title":"wx_object.send_request/2","doc":"send_request(Obj, Request::term()) -> request_id()\n\nMake an send_request to a generic server. and return a RequestId which\ncan/should be used with wait_response/\\[1|2]. Invokes handle_call(Request, From,\nState) in server.","ref":"wx_object.html#send_request/2"},{"type":"function","title":"wx_object.set_pid/2","doc":"set_pid(Obj, Pid::pid()) -> wx:wx_object()\n\nSets the controlling process of the object handle.","ref":"wx_object.html#set_pid/2"},{"type":"function","title":"wx_object.start/4","doc":"start(Name, Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","ref":"wx_object.html#start/4"},{"type":"function","title":"wx_object.start_link/3","doc":"start_link(Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","ref":"wx_object.html#start_link/3"},{"type":"function","title":"wx_object.start_link/4","doc":"start_link(Name, Mod, Args, Options) -> wxWindow:wxWindow() | {error, term()}\n\nStarts a generic wx_object server and invokes Mod:init(Args) in the new process.","ref":"wx_object.html#start_link/4"},{"type":"function","title":"wx_object.stop/1","doc":"stop(Obj) -> ok\n\nStops a generic wx_object server with reason 'normal'. Invokes\nterminate(Reason,State) in the server. The call waits until the process is\nterminated. If the process does not exist, an exception is raised.","ref":"wx_object.html#stop/1"},{"type":"function","title":"wx_object.stop/3","doc":"stop(Obj, Reason, Timeout) -> ok\n\nStops a generic wx_object server with the given Reason. Invokes\nterminate(Reason,State) in the server. The call waits until the process is\nterminated. If the call times out, or if the process does not exist, an\nexception is raised.","ref":"wx_object.html#stop/3"},{"type":"callback","title":"wx_object.terminate/2","doc":"","ref":"wx_object.html#c:terminate/2"},{"type":"function","title":"wx_object.wait_response/1","doc":"wait_response(RequestId::request_id()) -> {reply, Reply::term()} | {error,\n{term(), server_ref()}}\n\nWait infinitely for a reply from a generic server.","ref":"wx_object.html#wait_response/1"},{"type":"function","title":"wx_object.wait_response/2","doc":"wait_response(Key::request_id(), Timeout::timeout()) -> {reply, Reply::term()} |\ntimeout | {error, {term(), server_ref()}}\n\nWait 'timeout' for a reply from a generic server.","ref":"wx_object.html#wait_response/2"},{"type":"type","title":"wx_object.event/0","doc":"","ref":"wx_object.html#t:event/0"},{"type":"type","title":"wx_object.request_id/0","doc":"","ref":"wx_object.html#t:request_id/0"},{"type":"type","title":"wx_object.server_ref/0","doc":"","ref":"wx_object.html#t:server_ref/0"},{"type":"extras","title":"Wx Release Notes","doc":"\n# Wx Release Notes\n\nThis document describes the changes made to the Wx application.","ref":"notes.html"},{"type":"extras","title":"Wx 2.4.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-4-2"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.4.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"* Add option to silence wx depracation macros.\n\n Own Id: OTP-18988 Aux Id: PR-7750","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.4 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-4"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Guards have been added to `gen_*:start*` API functions to catch bad arguments\n earlier. Before this change, in some cases, a bad argument could tag along and\n cause the server to fail later, right after start.\n\n Own Id: OTP-18857 Aux Id: GH-7685","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.3.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- The `wx` application would fail to build on macOS with Xcode 15.\n\n Own Id: OTP-18768 Aux Id: PR-7670","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-3"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Runtime dependencies have been updated.\n\n Own Id: OTP-18350\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.2.2.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-2-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- The `wx` application would fail to build on macOS with Xcode 15.\n\n Own Id: OTP-18768 Aux Id: PR-7670","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.2.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Improve debug prints from the nifs. Some minor fixes for wxWidgets-3.2. Fixed\n OpenGL debug functions.\n\n Own Id: OTP-18512","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.2.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Added environment variable `WX_MACOS_NON_GUI_APP` to allow user to override\n `OSXIsGUIApplication` behavior.\n\n Own Id: OTP-18213 Aux Id: PR-6113","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-2"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Added `aux1Down` and `aux2Down` fields to the `wxMouseState` record. Since one\n record have been changed a recompilation of user code might be required.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17950\n\n- Add mac specific menubar functions.\n\n Own Id: OTP-18008 Aux Id: PR-5816","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.1.4 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-1-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix build failure with wxWidgets-3.1.6.\n\n Own Id: OTP-18064 Aux Id: GH-5893","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Enable the possibility to build wx on windows with wxWidgets-3.1.6.\n\n Own Id: OTP-18061 Aux Id: GH-5883","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.1.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed a bug in callback handling which could lead to a unresponsive gui.\n\n Own Id: OTP-17982 Aux Id: GH-5758","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.1.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Removed the `static_data` option from `wxImage` creation functions, as it was\n broken and could lead to crashes. Now image data is always copied to wxWidgets\n as was the default behavior.\n\n Removed some non working `wxGridEvent` event types, which have there own\n events in newer `wxWidgets` versions, and added a couple of event types that\n where missing in `wx`.\n\n Own Id: OTP-17947","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.1.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix crash in cleanup code when a gui application is exiting.\n\n Fix errors in the OpenGL wrapper that could cause crashes and improve the\n documentation.\n\n Own Id: OTP-17745","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix crash when closing an application.\n\n Own Id: OTP-17507\n\n- Some functions with overloaded color arguments could not be used. For example\n the copy constructor `wxTextAttr:new(TextAttr)` did not work.\n\n Own Id: OTP-17577 Aux Id: GH-4999","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Added the Microsoft Edge WebView loader dll to the installer on windows.\n\n Own Id: OTP-17325\n\n- Handle specific Mac gui application events.\n\n Own Id: OTP-17438 Aux Id: PR-4780","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 2.0.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix build problems when wxWidgets are built with -enable-std.\n\n Own Id: OTP-17407 Aux Id: GH-4834\n\n- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 2.0 - Wx Release Notes","doc":"","ref":"notes.html#wx-2-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix compiler warnings produced by the clang compiler.\n\n Own Id: OTP-17105 Aux Id: PR-2872","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- The application has been completely rewritten in order to use wxWidgets\n version 3 as its base.\n\n Add basic documentation generated from the wxWidgets project.\n\n Own Id: OTP-16800\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- Added support for wxWebView.\n\n Own Id: OTP-17213 Aux Id: PR-3027\n\n- Due to the support of the new backend versions some API incompatibilities have\n been introduced. Examples of changes are: \n wxWindowDC default creators have been removed \n wxClientDC default creators have been removed \n wxPaintDC default creators have been removed \n wxWindow:setVirtualSizeHints() has been deprecated in wxWidgets and removed \n wxWindow:makeModal() has been deprecated in wxWidgets and removed \n wxToolBar:add/insertTool without label have been deprecated in wxWidgets and\n removed \n wxStyledTextCtrl some functions have changed arguments from boolean to int \n wxSizerItem:new() Some arguments have become options \n Removed deprecated wxSizerItem:setWindow() use assignWindow() \n Removed deprecated wxSizerItem:setSpacer() use assignSpacer() \n Removed deprecated wxSizerItem:setSpacer() use assignSpacer() \n Removed deprecated wxSizerItem:setSizer() use assignSizer() \n wxMenu append/insert/prepend have changed return value and lost IsCheckable\n argument \n wxListCtrl:setItem/4 changed return value \n wxImage:convertToGreyscale() options have changed \n wxGridSizer:wxGridSizer() options have changed \n wxGrid API have many changes \n wxGraphicsRenderer:create*GradientBrush() uses GradientStops now \n wxGraphicsRenderer:createPen() have been removed \n wxGraphicsRenderer:create*GradientBrush() uses GradientStops now \n wxGLCanvas API is incompatible \n wxFlexGridSizer:wxFlexGridSizer() options have changed \n wxDisplay:new() options have changed \n wxCalendarDateAttr:new(ColText \\[,OptList]) have been removed \n wxBitmapButton:set/getBitmapSelected() have been removed\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17219 Aux Id: OTP-16800","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.9.3.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.9.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed wx initialization on mac, top level menus did not always work on newer\n MacOS versions. The menus will not work until wxWidgets-3.1.5 is released and\n used on these MacOS versions.\n\n Own Id: OTP-17187","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.9.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Add popup menu callback to `wxTaskBarIcon:new/1`.\n\n Own Id: OTP-16983 Aux Id: PR-2743","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.9.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix various compiler warnings on 64-bit Windows.\n\n Own Id: OTP-15800","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.9.0.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.9 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-9"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Added `wxWindow:isShownOnScreen/1`, `wxMouseEvent:getWheelAxis` and mac\n specific menubar functions. Fixed defines that have changed in newer wxWidgets\n versions, that caused some literals to become run-time dependent on wxWidgets\n version.\n\n Own Id: OTP-16285","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.8.9 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix a driver bug that could crashes when allocating memory.\n\n Own Id: OTP-15883 Aux Id: PR-2261","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.8 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.7 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Improved support for wxWidgets 3.1.3 which have changed `wxFONTWEIGTH`, also\n added `wxGCDC` and `wxDisplay` modules.\n\n Fixed a crash on Mojave and check for events more often.\n\n Own Id: OTP-15587","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.6 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed delayed delete bug which caused wx applications to crash on Mojave.\n\n Own Id: OTP-15426 Aux Id: ERL-755","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.5 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed compilation warning on Darwin.\n\n Own Id: OTP-15230 Aux Id: PR-1860","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.4 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-4"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Changed implementation so wx can now be built towards wxWidgets-3.1.1.\n\n Own Id: OTP-15027","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.8.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- wx crashes in otp 20.1 if empty binaries was sent down as arguments.\n\n Own Id: OTP-14688","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Do not deprecate `wxGraphicsContext:createLinearGradientBrush/7` and\n `wxGraphicsContext:createRadialGradientBrush/8` which are still available in\n wxWidgets-3.0.\n\n Own Id: OTP-14539","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- General Unicode improvements.\n\n Own Id: OTP-14462","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.8.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix a livelock that could be caused by `wx:batch/1`.\n\n Own Id: OTP-14289","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.8 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Allow string arguments to be binaries as specified, i.e. unicode:chardata().\n\n Own Id: OTP-13934 Aux Id: ERL-270","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Add wxWindow:dragAcceptFiles/2 and wxDropFilesEvent to support simple drag and\n drop from file browser.\n\n Own Id: OTP-13933","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.7.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Increased the stacksize for the wx thread. The default stacksize on Windows is\n 1MB which is not enough if the user created many nested dialogs.\n\n Own Id: OTP-13816","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.7 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed bugs which could cause called functions to be invoked twice or not at\n all when callbacks where invoked at the same time.\n\n Own Id: OTP-13491","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Changed atom 'boolean' fields in #wxMouseState\\{\\} to 'boolean()'.\n\n Moved out arguments in wxListCtrl:hitTest to result.\n\n Removed no-op functions in wxGauge that have been removed from wxWidgets-3.1.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13553","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.6.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-6-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed commands with multiple binaries, such as `wxImage:new/4`. Added\n `wxWindow:SetDoubleBuffered/1`, `wxWindow:isDoubleBuffered/1`,\n `wxWindow:setTransparent/2` and `wxWindow:canSetTransparent/1`. Fixed timing\n issues.\n\n Own Id: OTP-13404","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.6 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-6"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Add wxOverlay and make wxPostScripDC optional to make it easier to build on\n windows.\n\n Correct some function specifications.\n\n The driver implementation have been optimized and now invokes commands after\n events have been sent to erlang.\n\n Own Id: OTP-13160","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.5 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-5"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Extend AUI functionality.\n\n Own Id: OTP-12961","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.4 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- The undocumented option `generic_debug` for `gen_server` has been removed.\n\n Own Id: OTP-12183\n\n- Remove raise condition where `wx` could crash during emulator stoppage.\n\n Own Id: OTP-12734","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Use wxWidgets-3.0, if found, as default backend on windows.\n\n Own Id: OTP-12632\n\n- Add missing fields in some events records. May require a recompilation of user\n applications.\n\n Own Id: OTP-12660","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.3.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-3-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix timing related crash during wx application stop.\n\n Own Id: OTP-12374","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.3.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed a minor typo in the graphicsContext example.\n\n Own Id: OTP-12259","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.3.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Implement --enable-sanitizers\\[=sanitizers]. Similar to debugging with\n Valgrind, it's very useful to enable -fsanitize= switches to catch bugs at\n runtime.\n\n Own Id: OTP-12153","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix delayed destroy for wxPaintDC objects which could cause an eternal loop\n for modal dialogs.\n\n Fix wxSL_LABELS compatibility between wxWidgets-2.8 and wxWidgets-3.0 versions\n\n Own Id: OTP-11985","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Add missing classes wxPopup\\[Transient]Window, wxActivateEvent and\n wxTextCtrl:cahngeValue/2 function.\n\n Own Id: OTP-11986","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Refactored C++ code, fixed crashes and a deadlock on linux.\n\n Own Id: OTP-11586\n\n- Some local implementations of removing the last element from a list are\n replaced by `lists:droplast/1`. Note that this requires at least `stdlib-2.0`,\n which is the stdlib version delivered in OTP 17.0. (Thanks to Hans Svensson)\n\n Own Id: OTP-11678\n\n- Reworked the internal event handling to avoid crashes in destroy objects.\n Thanks Tom for the bug report.\n\n Own Id: OTP-11699\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.1.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed a problem which caused the debugger to crash when closing a window.\n Fixed static linking on mac.\n\n Own Id: OTP-11444","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 1.1.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- wx initialization hanged with wxWidgets-3.0 on mac. Fixed a crash with\n wxListBox on wxWidgets-3.0 (thanks Sergei Golovan) Fixed documentation links.\n Fixed event callbacks cleanup.\n\n Own Id: OTP-11393\n\n- Improve documentation (Thanks to Boris Mühmer)\n\n Own Id: OTP-11505","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Fix silent make rules (Thanks to Anthony Ramine)\n\n Own Id: OTP-11515","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 1.0 - Wx Release Notes","doc":"","ref":"notes.html#wx-1-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Add \\{silent_start, boolean()\\} option to wx:new/1 in order to be able to\n suppress error messages during startup of wx. (Thanks to Håkan Mattsson)\n\n Own Id: OTP-10585\n\n- Fix wxTreeCtrl:getBoundingRect/2 and wxTreeCtrl:hitTest/1. wxTreeCtrl:hitTest\n now returns a tuple not bug compatible with previous releases but needed.\n\n Own Id: OTP-10743","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- The wx application now compiles and is usable with the unstable development\n branch of wxWidgets-2.9. Some functions are currently not available in\n wxWidgets-2.9 and their erlang counterparts are marked as deprecated. They\n will generate an error if called when linked against wxWidgets-2.9 libraries.\n This means that wx can now be built on 64bit MacOsX, but keep in mind that\n wxWidgets-2.9 is still a development branch and needs (a lot) more work before\n it becomes stable.\n\n Own Id: OTP-10407 Aux Id: kunagi-262 \\[173]","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.99.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-99-2"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Fix errors in wxDC and wxGraphicsContext api.\n\n Add wxTaskBarIcon.\n\n Add wxStyledTextControl:setEdgeMode/2.\n\n Add type and specs for all functions and records.\n\n Own Id: OTP-9947","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.99.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-99-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed a deadlock in the driver, which could happen if a callback caused\n another callback to be invoked.\n\n Own Id: OTP-9725","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Implemented wxSystemOptions.\n\n Load Opengl from libGL.so.1 instead libGL.so to work around linux problems.\n\n Own Id: OTP-9702","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.99 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-99"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- wx: fix obsolete guard warning (list/1) (Thanks to Tuncer Ayaz)\n\n Own Id: OTP-9513\n\n- XML files have been corrected.\n\n Own Id: OTP-9550 Aux Id: OTP-9541","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Support virtual tables in wxListCtrl.\n\n Own Id: OTP-9415","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.10 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fixed wx app files on mac and solaris. Thanks Jachym Holecek and Joe Williams.\n\n Own Id: OTP-9324","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 0.98.9 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Wx crashed if graphics could not be initiated, for instance if DISPLAY was not\n available.\n\n Wx could crash during startup, thanks Boris Muhmer for extra ordinary testing.\n\n Own Id: OTP-9080\n\n- Wx on MacOS X generated complains on stderr about certain cocoa functions not\n being called from the \"Main thread\". This is now corrected.\n\n Own Id: OTP-9081","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Wx 0.98.8 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-8"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Add wxSystemSettings which was missing in the previous release, despite\n previous comments.\n\n Fix an external loop when stopping erlang nicely.\n\n Separate OpenGL to it's own dynamic loaded library, so other graphic libraries\n can reuse the gl module and it will not waste memory if not used.\n\n Own Id: OTP-8951","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.7 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Fix crash (segmentation fault) in callback handling.\n\n Own Id: OTP-8766","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Add wxSystemSettings module.\n\n Add wxTreeCtrl:editLabel/2.\n\n Own Id: OTP-8767","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.6 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-6"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Calling `sys:get_status()` for processes that have globally registered names\n that were not atoms would cause a crash. Corrected. (Thanks to Steve Vinoski.)\n\n Own Id: OTP-8656","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.5 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Corrected incorrectly generated wxFileDialog:getPaths/1. Reported by\n Jason/hornja.\n\n Own Id: OTP-8330\n\n- Fixed a memory reference bug which caused unexplained \\{badarg, Int\\} exits\n when running multiple wx applications.\n\n Own Id: OTP-8461","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Added `wxListCtrl:getEditCtrl/1` (not available on Mac).\n\n Own Id: OTP-8408\n\n- Cleanups suggested by tidier and modernization of types and specs.\n\n Own Id: OTP-8455\n\n- Changed representation of wxTreeItem to be an integer. This saves memory,\n where the driver do not need to keep a object reference to each tree item.\n\n Added getFirstChild and getNextChild to wxTreeCtrl.\n\n Own Id: OTP-8462","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.4 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-4"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Added wx_object improvements from Mazen.\n\n Fixed pid issues, reported by Mazen.\n\n Added wxLogNull class, reported by Amit Murthy.\n\n Various configure fixes.\n\n Own Id: OTP-8243 Aux Id: seq11418\n\n- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8250\n\n- wx now builds with wxWidgets 2.8.4 or a later 2.8 release, thanks Nico Kruber.\n\n Own Id: OTP-8292","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.3 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Wx Release Notes","doc":"- Added wxListCtrl sorting and build fixes supplied by Paul Hampson. Thanks.\n\n Own Id: OTP-8126","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- wxHtmlWindow class implemented.\n\n All exceptions from callbacks are now caught and written to the log.\n\n Some defines where wrong in 'wx.hrl'.\n\n `wx:batch/1` and friends could hang forever if for instance a breakpoint was\n set inside the fun. That caused all wx applications to hang.\n\n Added missing wxAuiPaneInfo constructor and destructor.\n\n Added wxAuiNotebookEvent and wxAuiManagerEvent.\n\n Calling non supported wxWidgets functions hanged instead of crashed.\n\n Update OpenGL to version 3.1 and added some of the missing glu functions.\n\n Fixed wxRadioBox which inherited the wrong class, thanks Atilla Erdodi.\n\n Own Id: OTP-8083\n\n- Removed some of the automatic garbage collecting after application exit, user\n will get a warning instead so he can correct the code.\n\n Own Id: OTP-8138","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.2 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-2"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Olle Mattson have made a large demo, see `examples/demo/`, that triggered the\n following bugs and new features:\n\n New book controls.\n\n Added wxToolbar:addTool/6.\n\n Empty binaries will be used to indicate NULL where applicable.\n\n Own Id: OTP-7943\n\n- Applied patch from Nico Kruber, which fixes building on some wxwidgets\n installations.\n\n Open source","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98.1 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98-1"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- Added `xrcctrl/3` to wxXmlResource and added a resource example.\n\n Added several event types and events records and fixed a couple of event\n related bugs.\n\n Event callbacks can now use `wxEvtHandler:connect/2`.\n\n Error handling and debugging aid have been improved.\n\n Added wxSplitterWindow and wxGauge:pulse and a couple of missing macros in\n `wx.hrl`.\n\n Thanks to Steve Davis for feedback and bug reports.\n\n Own Id: OTP-7875","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Wx 0.98 - Wx Release Notes","doc":"","ref":"notes.html#wx-0-98"},{"type":"extras","title":"Improvements and New Features - Wx Release Notes","doc":"- A first beta release of wxErlang.\n\n Own Id: OTP-7859","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"wx the erlang binding of wxWidgets","doc":"\n# wx the erlang binding of wxWidgets\n\nThe _wx_ application is an erlang binding of _wxWidgets_. This document\ndescribes the erlang mapping to wxWidgets and it's implementation. It is not a\ncomplete users guide to wxWidgets. If you need that, you will have to read the\nwxWidgets documentation instead. _wx_ tries to keep a one-to-one mapping with\nthe original API so that the original documentation and examples shall be as\neasy as possible to use.\n\nWx examples and test suite can be found in the erlang src release. They\ncan also provide some help on how to use the API.\n\nThis is currently a very brief introduction to _wx_. The application is still\nunder development, which means the interface may change, and the test suite\ncurrently have a poor coverage ratio.","ref":"chapter.html"},{"type":"extras","title":"Contents - wx the erlang binding of wxWidgets","doc":"- [Introduction](chapter.md#introduction)\n- [Multiple processes and memory handling](chapter.md#Multiple_processes_and_memory_handling)\n- [Event Handling](chapter.md#Event_Handling)\n- [Acknowledgments](chapter.md#acknowledgments)","ref":"chapter.html#contents"},{"type":"extras","title":"Introduction - wx the erlang binding of wxWidgets","doc":"The original _wxWidgets_ is an object-oriented (C++) API and that is reflected\nin the erlang mapping. In most cases each class in wxWidgets is represented as a\nmodule in erlang. This gives the _wx_ application a huge interface, spread over\nseveral modules, and it all starts with the _wx_ module. The _wx_ module\ncontains functions to create and destroy the GUI, i.e. `wx:new/0`,\n`wx:destroy/0`, and some other useful functions.\n\nObjects or object references in _wx_ should be seen as erlang processes rather\nthan erlang terms. When you operate on them they can change state, e.g. they are\nnot functional objects as erlang terms are. Each object has a type or rather a\nclass, which is manipulated with the corresponding module or by sub-classes of\nthat object. Type checking is done so that a module only operates on it's\nobjects or inherited classes.\n\nAn object is created with _new_ and destroyed with _destroy_. Most functions in\nthe classes are named the same as their C++ counterpart, except that for\nconvenience, in erlang they start with a lowercase letter and the first argument\nis the object reference. Optional arguments are last and expressed as tagged\ntuples in any order.\n\nFor example the _wxWindow_ C++ class is implemented in the _wxWindow_ erlang\nmodule and the member _wxWindow::CenterOnParent_ is thus\n_wxWindow:centerOnParent_. The following C++ code:\n\n```erlang\n wxWindow MyWin = new wxWindow();\n MyWin.CenterOnParent(wxVERTICAL);\n ...\n delete MyWin;\n```\n\nwould in erlang look like:\n\n```erlang\n MyWin = wxWindow:new(),\n wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),\n ...\n wxWindow:destroy(MyWin),\n```\n\nWhen you are reading wxWidgets documentation or the examples, you will notice\nthat some of the most basic classes are missing in _wx_, they are directly\nmapped to corresponding erlang terms:\n\n- **_wxPoint_ is represented by \\{Xcoord,Ycoord\\}**\n\n- **_wxSize_ is represented by \\{Width,Height\\}**\n\n- **_wxRect_ is represented by \\{Xcoord,Ycoord,Width,Height\\}**\n\n- **_wxColour_ is represented by \\{Red,Green,Blue\\[,Alpha]\\}**\n\n- **_wxString_ is represented by\n [unicode:charlist()](`t:unicode:charlist/0`)**\n\n- **_wxGBPosition_ is represented by \\{Row,Column\\}**\n\n- **_wxGBSpan_ is represented by \\{RowSpan,ColumnSPan\\}**\n\n- **_wxGridCellCoords_ is represented by \\{Row,Column\\}**\n\nIn the places where the erlang API differs from the original one it should be\nobvious from the erlang documentation which representation has been used. E.g.\nthe C++ arrays and/or lists are sometimes represented as erlang lists and\nsometimes as tuples.\n\nColours are represented with \\{Red,Green,Blue\\[,Alpha]\\}, the Alpha value is\noptional when used as an argument to functions, but it will always be returned\nfrom _wx_ functions.\n\nDefines, enumerations and global variables exists in `wx.hrl` as defines. Most\nof these defines are constants but not all. Some are platform dependent and\ntherefore the global variables must be instantiated during runtime. These will\nbe acquired from the driver with a call, so not all defines can be used in\nmatching statements. Class local enumerations will be prefixed with the class\nname and a underscore as in `ClassName_Enum`.\n\nAdditionally some global functions, i.e. non-class functions, exist in the\n`wx_misc` module.\n\n_Wx_ is implemented as a (threaded) driver and a rather direct interface\nto the C++ API, with the drawback that if the erlang programmer does an error,\nit might crash the emulator.\n\nSince the driver is threaded it requires a _smp_ enabled emulator, that provides\na thread safe interface to the driver.\n\n[](){: #Multiple_processes_and_memory_handling }","ref":"chapter.html#introduction"},{"type":"extras","title":"Multiple processes and memory handling - wx the erlang binding of wxWidgets","doc":"The intention is that each erlang application calls wx:new() once to setup it's\nGUI which creates an environment and a memory mapping. To be able to use _wx_\nfrom several processes in your application, you must share the environment. You\ncan get the active environment with `wx:get_env/0` and set it in the new\nprocesses with `wx:set_env/1`. Two processes or applications which have both\ncalled wx:new() will not be able use each others objects.\n\n```erlang\n wx:new(),\n MyWin = wxFrame:new(wx:null(), 42, \"Example\", []),\n Env = wx:get_env(),\n spawn(fun() ->\n wx:set_env(Env),\n %% Here you can do wx calls from your helper process.\n ...\n end),\n ...\n```\n\nWhen `wx:destroy/0` is invoked or when all processes in the application have\ndied, the memory is deleted and all windows created by that application are\nclosed.\n\nThe _wx_ application never cleans or garbage collects memory as long as the user\napplication is alive. Most of the objects are deleted when a window is closed,\nor at least all the objects which have a parent argument that is non null. By\nusing `wxCLASS:destroy/1` when possible you can avoid an increasing memory\nusage. This is especially important when _wxWidgets_ assumes or recommends that\nyou (or rather the C++ programmer) have allocated the object on the stack since\nthat will never be done in the erlang binding. For example `wxDC` class or its\nsub-classes or `wxSizerFlags`.\n\nCurrently the dialogs show modal function freezes wxWidgets until the dialog is\nclosed. That is intended but in erlang where you can have several GUI\napplications running at the same time it causes trouble. This will hopefully be\nfixed in future _wxWidgets_ releases.\n\n[](){: #Event_Handling }","ref":"chapter.html#multiple-processes-and-memory-handling"},{"type":"extras","title":"Event Handling - wx the erlang binding of wxWidgets","doc":"Event handling in _wx_ differs most from the original API. You must specify\nevery event you want to handle in _wxWidgets_, that is the same in the erlang\nbinding but you can choose to receive the events as messages or handle them with\ncallback _funs_.\n\nOtherwise the event subscription is handled as _wxWidgets_ dynamic event-handler\nconnection. You subscribe to events of a certain type from objects with an _ID_\nor within a range of *ID*s. The callback _fun_ is optional, if not supplied the\nevent will be sent to the process that called _connect/2_. Thus, a handler is a\ncallback _fun_ or a process which will receive an event message.\n\nEvents are handled in order from bottom to top, in the widgets hierarchy, by the\nlast subscribed handler first. Depending on if `wxEvent:skip()` is called the\nevent will be handled by the other handler(s) afterwards. Most of the events\nhave default event handler(s) installed.\n\nMessage events looks like\n[\\#wx\\{id=integer(), obj=wx:wxObject(), userData=term(), event=Rec](`t:wxEvtHandler:wx/0`)\n\\}. The _id_ is the identifier of the object that received the event. The _obj_\nfield contains the object that you used _connect_ on. The _userData_ field\ncontains a user supplied term, this is an option to _connect_. And the _event_\nfield contains a record with event type dependent information. The first element\nin the event record is always the type you subscribed to. For example if you\nsubscribed to _key_up_ events you will receive the `#wx{event=Event}` where\n_Event_ will be a _wxKey_ event record where `Event#wxKey.type = key_up`.\n\nIn _wxWidgets_ the developer has to call `wxEvent:skip()` if he wants the event\nto be processed by other handlers. You can do the same in _wx_ if you use\ncallbacks. If you want the event as messages you just don't supply a callback\nand you can set the _skip_ option in _connect_ call to true or false, the\ndefault it is false. True means that you get the message but let the subsequent\nhandlers also handle the event. If you want to change this behavior dynamically\nyou must use callbacks and call `wxEvent:skip()`.\n\nCallback event handling is done by using the optional callback _fun/2_ when\nattaching the handler. The _fun(#wx\\{\\},wxObject()_ must take two arguments\nwhere the first is the same as with message events described above and the\nsecond is an object reference to the actual event object. With the event object\nyou can call `wxEvent:skip()` and access all the data. When using callbacks you\nmust call `wxEvent:skip()` by yourself if you want any of the events to be\nforwarded to the following handlers. The actual event objects are deleted after\nthe _fun_ returns.\n\nThe callbacks are always invoked by another process and have exclusive usage of\nthe GUI when invoked. This means that a callback _fun_ cannot use the process\ndictionary and should not make calls to other processes. Calls to another\nprocess inside a callback _fun_ may cause a deadlock if the other process is\nwaiting on completion of his call to the GUI.","ref":"chapter.html#event-handling"},{"type":"extras","title":"Acknowledgments - wx the erlang binding of wxWidgets","doc":"Mats-Ola Persson wrote the initial _wxWidgets_ binding as part of his master\nthesis. The current version is a total re-write but many ideas have been reused.\nThe reason for the re-write was mostly due to the limited requirements he had\nbeen given by us.\n\nAlso thanks to the _wxWidgets_ team that develops and supports it so we have\nsomething to use.","ref":"chapter.html#acknowledgments"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/8803/lib/wx-2.4.2/doc/html/search.html b/prs/8803/lib/wx-2.4.2/doc/html/search.html index 00f584e844e2b..04b7a631dd2a6 100644 --- a/prs/8803/lib/wx-2.4.2/doc/html/search.html +++ b/prs/8803/lib/wx-2.4.2/doc/html/search.html @@ -122,7 +122,7 @@

          - +

          diff --git a/prs/8803/lib/wx-2.4.2/doc/html/wx.epub b/prs/8803/lib/wx-2.4.2/doc/html/wx.epub index 38a9eccbc1221b6f2f10bceabbc9b63913ab1ece..d846a1e64fbecfe9b98d557ff2adcab38c6a25af 100644 GIT binary patch delta 24797 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 delta 24752 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 diff --git a/prs/8803/lib/wx-2.4.2/doc/html/wx_object.html b/prs/8803/lib/wx-2.4.2/doc/html/wx_object.html index 88d825dd07090..8f7edcfd2d69f 100644 --- a/prs/8803/lib/wx-2.4.2/doc/html/wx_object.html +++ b/prs/8803/lib/wx-2.4.2/doc/html/wx_object.html @@ -136,36 +136,36 @@

          shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          -  -export([new/2, show/1, destroy/1]).  %% API
          -  -export([init/1, handle_call/3, handle_event/2,
          -           handle_info/2, code_change/3, terminate/2]).
          +called.
          terminate(Reason, State)

          Example:

            -module(myDialog).
          +  -export([new/2, show/1, destroy/1]).  %% API
          +  -export([init/1, handle_call/3, handle_event/2,
          +           handle_info/2, code_change/3, terminate/2]).
                      new/2, showModal/1, destroy/1]).  %% Callbacks
           
             %% Client API
          -  new(Parent, Msg) ->
          -     wx_object:start(?MODULE, [Parent,Id], []).
          +  new(Parent, Msg) ->
          +     wx_object:start(?MODULE, [Parent,Id], []).
           
          -  show(Dialog) ->
          -     wx_object:call(Dialog, show_modal).
          +  show(Dialog) ->
          +     wx_object:call(Dialog, show_modal).
           
          -  destroy(Dialog) ->
          -     wx_object:call(Dialog, destroy).
          +  destroy(Dialog) ->
          +     wx_object:call(Dialog, destroy).
           
             %% Server Implementation ala gen_server
          -  init([Parent, Str]) ->
          -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
          +  init([Parent, Str]) ->
          +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                ...
          -     wxDialog:connect(Dialog, command_button_clicked),
          -     {Dialog, MyState}.
          +     wxDialog:connect(Dialog, command_button_clicked),
          +     {Dialog, MyState}.
           
          -  handle_call(show, _From, State) ->
          -     wxDialog:show(State#state.win),
          -     {reply, ok, State};
          +  handle_call(show, _From, State) ->
          +     wxDialog:show(State#state.win),
          +     {reply, ok, State};
             ...
          -  handle_event(#wx{}, State) ->
          -     io:format("Users clicked button~n",[]),
          -     {noreply, State};
          +  handle_event(#wx{}, State) ->
          +     io:format("Users clicked button~n",[]),
          +     {noreply, State};
             ...

          diff --git a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_examples.html b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_examples.html index 06c29afd995a7..19c8af8688aaf 100644 --- a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_examples.html +++ b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_examples.html @@ -146,92 +146,92 @@

          user state, use their own state variable instead. Another option (used in e.g. xmerl_eventp.erl) is for customization functions to share one of the local states (in xmerl_eventp.erl, the continuation function and the fetch function -both access the cont_state.)

          Functions to access user state:

          • xmerl_scan:user_state(GlobalState)
          • xmerl_scan:user_state(UserState, GlobalState)

          1.2 Event Function

          {event_fun, fun()} | {event_fun, fun(), EventState}

          The event function is called at the beginning and at the end of a parsed entity. -It has the following format and semantics:

          fun(Event, GlobalState) ->
          -   EventState = xmerl_scan:event_state(GlobalState),
          -   EventState2 = foo(Event, EventState),
          -   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
          -end.

          1.3 Hook Function

          {hook_fun, fun()} | {hook_fun, fun(), HookState}

          The hook function is called when the processor has parsed a complete entity. -Format and semantics:

          fun(Entity, GlobalState) ->
          -   HookState = xmerl_scan:hook_state(GlobalState),
          -   {TransformedEntity, HookState2} = foo(Entity, HookState),
          -   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
          -   {TransformedEntity, GlobalState2}
          +both access the cont_state.)

          Functions to access user state:

          • xmerl_scan:user_state(GlobalState)
          • xmerl_scan:user_state(UserState, GlobalState)

          1.2 Event Function

          {event_fun, fun()} | {event_fun, fun(), EventState}

          The event function is called at the beginning and at the end of a parsed entity. +It has the following format and semantics:

          fun(Event, GlobalState) ->
          +   EventState = xmerl_scan:event_state(GlobalState),
          +   EventState2 = foo(Event, EventState),
          +   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
          +end.

          1.3 Hook Function

          {hook_fun, fun()} | {hook_fun, fun(), HookState}

          The hook function is called when the processor has parsed a complete entity. +Format and semantics:

          fun(Entity, GlobalState) ->
          +   HookState = xmerl_scan:hook_state(GlobalState),
          +   {TransformedEntity, HookState2} = foo(Entity, HookState),
          +   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
          +   {TransformedEntity, GlobalState2}
           end.

          The relationship between the event function, the hook function and the accumulator function is as follows:

          1. The event function is first called with an 'ended' event for the parsed entity.
          2. The hook function is called, possibly re-formatting the entity.
          3. The acc function is called in order to (optionally) add the re-formatted -entity to the contents of its parent element.

          1.4 Fetch Function

          {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

          The fetch function is called in order to fetch an external resource (e.g. a +entity to the contents of its parent element.

        • 1.4 Fetch Function

          {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

          The fetch function is called in order to fetch an external resource (e.g. a DTD).

          The fetch function can respond with three different return values:

          Result ::=
          -   {ok, {file, Filename}, NewGlobalState} |
          -   {ok, {string, String}, NewGlobalState} |
          -   {ok, not_fetched, NewGlobalState}

          Format and semantics:

          fun(URI, GlobalState) ->
          -   FetchState = xmerl_scan:fetch_state(GlobalState),
          -   Result = foo(URI, FetchState).  % Result being one of the above
          -end.

          1.5 Continuation Function

          {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

          The continuation function is called when the parser encounters the end of the -byte stream. Format and semantics:

          fun(Continue, Exception, GlobalState) ->
          -   ContState = xmerl_scan:cont_state(GlobalState),
          -   {Result, ContState2} = get_more_bytes(ContState),
          +   {ok, {file, Filename}, NewGlobalState} |
          +   {ok, {string, String}, NewGlobalState} |
          +   {ok, not_fetched, NewGlobalState}

          Format and semantics:

          fun(URI, GlobalState) ->
          +   FetchState = xmerl_scan:fetch_state(GlobalState),
          +   Result = foo(URI, FetchState).  % Result being one of the above
          +end.

          1.5 Continuation Function

          {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

          The continuation function is called when the parser encounters the end of the +byte stream. Format and semantics:

          fun(Continue, Exception, GlobalState) ->
          +   ContState = xmerl_scan:cont_state(GlobalState),
          +   {Result, ContState2} = get_more_bytes(ContState),
              case Result of
          -      [] ->
          -         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
          -         Exception(GlobalState2);
          +      [] ->
          +         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
          +         Exception(GlobalState2);
                 MoreBytes ->
          -         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
          -         ContState3 = update_cont_state(Rest, ContState2),
          -         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
          -         Continue(MoreBytes2, GlobalState3)
          +         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
          +         ContState3 = update_cont_state(Rest, ContState2),
          +         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
          +         Continue(MoreBytes2, GlobalState3)
              end
          -end.

          1.6 Rules Functions

          {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
          -{rules, Table : ets()}

          The rules functions take care of storing scanner information in a rules +end.

    1.6 Rules Functions

    {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
    +{rules, Table : ets()}

    The rules functions take care of storing scanner information in a rules database. User-provided rules functions may opt to store the information in mnesia, or perhaps in the user_state(RulesState).

    The following modes exist:

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    - ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    -ElemContent ::= {Mode, Elems}
    +instead.

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    + ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    +ElemContent ::= {Mode, Elems}
     Mode        ::= seq | choice
    -Elems       ::= [Elem]
    -Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
    +Elems       ::= [Elem]
    +Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
     Occurrence  ::= '*' | '?' | '+'

    NOTE: When <Elem> is not wrapped with <Occurrence>, (Occurrence = once) is -implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When +implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When parsing very large files, it may not be desirable to do so.In this case, an acc function can be provided that simply doesn't accumulate.

    Note that it is possible to even modify the parsed entity before accumulating it, but this must be done with care. xmerl_scan performs post-processing of the element for namespace management. Thus, the element must keep its original structure for this to work.

    The acc function has the following format and semantics:

    %% default accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {[ParsedEntity|Acc], GlobalState}.
    +fun(ParsedEntity, Acc, GlobalState) ->
    +   {[ParsedEntity|Acc], GlobalState}.
     
     %% non-accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an +fun(ParsedEntity, Acc, GlobalState) -> + {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an external DTD) has been completely parsed. When xmerl_scan was started using xmerl_scan:file/[1,2], the file will be read in full, and closed immediately, before the parsing starts, so when the close function is called, it will not need to actually close the file. In this case, the close function will be a good -place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    +place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
        GlobalState1 = ....  % state variables may be altered

    2 Examples

    -

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
    +

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
     
    --include("xmerl.hrl").
    +-include("xmerl.hrl").
     
    --export([file1/1, file2/1, file3/1]).
    +-export([file1/1, file2/1, file3/1]).
     
    -file1(F) -> xmerl_scan:file(F).
    +file1(F) -> xmerl_scan:file(F).
     
    -file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
    +file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
     
    -file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P,
    -S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F,
    -[{space,normalize}, {acc_fun, Acc}]).
    +
    file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P, +S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F, +[{space,normalize}, {acc_fun, Acc}]).
    diff --git a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_ug.html b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_ug.html index b402937fe1a47..844b38b442492 100644 --- a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_ug.html +++ b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_ug.html @@ -193,16 +193,16 @@

    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,
    +</dog>

    The parse result will be:

    #xmlElement{name = dog,
                 ...
    -            parents = [],
    +            parents = [],
                 ...
    -            attributes = [],
    -            content = [{xmlText,[{dog,1}],1,[],"\
    +            attributes = [],
    +            content = [{xmlText,[{dog,1}],1,[],"\
     Grand Danois\
    -",text}],
    +",text}],
                 ...
    -            }

    Where the content of the top element is: + }

    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{} @@ -271,41 +271,41 @@

    color NMTOKENS #REQUIRED condition (useless | bad | serviceable | moderate | good | excellent | new | outstanding) "excellent" >

    If you want to parse the XML file motorcycles.xml you run it in the Erlang shell -like:

    3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml").
    -{{xmlElement,motorcycles,
    +like:

    3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml").
    +{{xmlElement,motorcycles,
                  motorcycles,
    -             [],
    -             {xmlNamespace,[],[]},
    -             [],
    +             [],
    +             {xmlNamespace,[],[]},
    +             [],
                  1,
    -             [],
    -             [{xmlText,[{motorcycles,1}],1,[],"\
    -  ",text},
    -              {xmlElement,bike,
    +             [],
    +             [{xmlText,[{motorcycles,1}],1,[],"\
    +  ",text},
    +              {xmlElement,bike,
                               bike,
    -                          [],
    -                          {xmlNamespace,[],[]},
    -                          [{motorcycles,1}],
    +                          [],
    +                          {xmlNamespace,[],[]},
    +                          [{motorcycles,1}],
                               2,
    -                          [{xmlAttribute,year,[],[],[],[]|...},
    -                           {xmlAttribute,color,[],[],[]|...}],
    -                          [{xmlText,[{bike,2},{motorcycles|...}],
    +                          [{xmlAttribute,year,[],[],[],[]|...},
    +                           {xmlAttribute,color,[],[],[]|...}],
    +                          [{xmlText,[{bike,2},{motorcycles|...}],
                                         1,
    -                                    []|...},
    -                           {xmlElement,name,name,[]|...},
    -                           {xmlText,[{...}|...],3|...},
    -                           {xmlElement,engine|...},
    -                           {xmlText|...},
    -                           {...}|...],
    -                          [],
    +                                    []|...},
    +                           {xmlElement,name,name,[]|...},
    +                           {xmlText,[{...}|...],3|...},
    +                           {xmlElement,engine|...},
    +                           {xmlText|...},
    +                           {...}|...],
    +                          [],
                               ".",
    -                          undeclared},
    +                          undeclared},
                   ...
    -              ],
    -             [],
    +              ],
    +             [],
                  ".",
    -             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.

    @@ -342,22 +342,22 @@

    {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:

    
    +  {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:

    
     <?xml version="1.0"?><motorcycles>
       <bike year="2000" color="black">
         <name>
    @@ -387,40 +387,40 @@ 

    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="\
    -"}],
    +      [#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},
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},
         ...
    -    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
    +    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
     <!DOCTYPE motorcycles SYSTEM \\"motorcycles.dtd\\">\
    -"],
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
    +"],
    +    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
         ...

    The result will be:

    
     <?xml version="1.0" encoding="utf-8" ?>
     <!DOCTYPE motorcycles SYSTEM "motorcycles.dtd">
    @@ -469,32 +469,32 @@ 

    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,
    +then you can use the xmerl:export/2 function. The following:

    2> {Doc,Misc}=xmerl_scan:file('motorcycles.xml').
    +{{xmlElement,motorcycles,
                  motorcycles,
    -             [],
    -             {xmlNamespace,[],[]},
    -             [],
    +             [],
    +             {xmlNamespace,[],[]},
    +             [],
                  1,
    -             [],
    -             [{xmlText,[{motorcycles,1}],1,[],"\
    -  ",text},
    -              {xmlElement,bike,
    +             [],
    +             [{xmlText,[{motorcycles,1}],1,[],"\
    +  ",text},
    +              {xmlElement,bike,
     ...
    -3> DocHtml=xmerl:export([Doc],xmerl_html).
    -["<!DOCTYPE HTML PUBLIC \\"",
    +3> DocHtml=xmerl:export([Doc],xmerl_html).
    +["<!DOCTYPE HTML PUBLIC \\"",
      "-//W3C//DTD HTML 4.01 Transitional//EN",
      "\\"",
    - [],
    + [],
      ">\
     ",
    - [[["<","motorcycles",">"],
    -   ["\
    + [[["<","motorcycles",">"],
    +   ["\
       ",
    -    [["<",
    +    [["<",
           "bike",
    -      [[" ","year","=\\"","2000","\\""],[" ","color","=\\"","black","\\""]],
    -      ">"],
    +      [[" ","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 @@ -505,17 +505,17 @@

    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 write 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 write 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 +simply write 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 +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>\
    +the template:

    template(E = #xmlElement{name='motorcycles'}) ->
    +    [    "<head>\
     <title>motorcycles</title>\
     </head>\
     ",
    @@ -525,32 +525,32 @@ 

    ", \011 "<ul>\ ", -\011 remove_duplicates(value_of(select("bike/name/manufacturer",E))), +\011 remove_duplicates(value_of(select("bike/name/manufacturer",E))), \011 "\ </ul>\ ", -\011 sort_by_manufacturer(xslapply(fun template/1, E)), +\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 +"];

    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>",
    +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: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:red">Color: ",xslapply(fun template/1,select("@color",E)),"</li>\
     ",
    -    "<li style="color:blue">Shape : ",xslapply(fun template/1,select("@condition",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 +"]};

    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:

    
    @@ -561,106 +561,106 @@ 

    %%% %%% Created : 2 Sep 2004 by Bertil Karlsson <bertil@localhost.localdomain> %%%------------------------------------------------------------------- --module(motorcycles2html). +-module(motorcycles2html). --include_lib("xmerl/include/xmerl.hrl"). +-include_lib("xmerl/include/xmerl.hrl"). --import(xmerl_xs, - [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]). +-import(xmerl_xs, + [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]). --export([process_xml/1,process_to_file/2,process_to_file/1]). - -process_xml(Doc) -> - template(Doc). - -process_to_file(FileName) -> - process_to_file(FileName,'motorcycles.xml'). - -process_to_file(FileName,XMLDoc) -> - case file:open(FileName,[write]) of - {ok,IOF} -> - {XMLContent,_} = xmerl_scan:file(XMLDoc), - TransformedXML=process_xml(XMLContent), - io:format(IOF,"~s",[TransformedXML]), - file:close(IOF); - {error,Reason} -> - io:format("could not open file due to ~p.~n",[Reason]) +-export([process_xml/1,process_to_file/2,process_to_file/1]). + +process_xml(Doc) -> + template(Doc). + +process_to_file(FileName) -> + process_to_file(FileName,'motorcycles.xml'). + +process_to_file(FileName,XMLDoc) -> + case file:open(FileName,[write]) of + {ok,IOF} -> + {XMLContent,_} = xmerl_scan:file(XMLDoc), + TransformedXML=process_xml(XMLContent), + io:format(IOF,"~s",[TransformedXML]), + file:close(IOF); + {error,Reason} -> + io:format("could not open file due to ~p.~n",[Reason]) end. %%% templates -template(E = #xmlElement{name='motorcycles'}) -> - [ "<head>\n<title>motorcycles</title>\n</head>\n", +template(E = #xmlElement{name='motorcycles'}) -> + [ "<head>\n<title>motorcycles</title>\n</head>\n", "<body>\n", "<h1>Used Motorcycles</h1>\n", "<ul>\n", - remove_duplicates(value_of(select("bike/name/manufacturer",E))), + remove_duplicates(value_of(select("bike/name/manufacturer",E))), "\n</ul>\n", - sort_by_manufacturer(xslapply(fun template/1, E)), + sort_by_manufacturer(xslapply(fun template/1, E)), "</body>\n", - "</html>\n"]; -template(E = #xmlElement{name='bike'}) -> - {value_of(select("name/manufacturer",E)),["<dt>",xslapply(fun template/1,select("name",E)),"</dt>", + "</html>\n"]; +template(E = #xmlElement{name='bike'}) -> + {value_of(select("name/manufacturer",E)),["<dt>",xslapply(fun template/1,select("name",E)),"</dt>", "<dd><ul>\n", - "<li style=\"color:green\">Manufacturing year: ",xslapply(fun template/1,select("@year",E)),"</li>\n", - "<li style=\"color:red\">Color: ",xslapply(fun template/1,select("@color",E)),"</li>\n", - "<li style=\"color:blue\">Shape : ",xslapply(fun template/1,select("@condition",E)),"</li>\n", - "</ul></dd>\n"]}; -template(E) -> built_in_rules(fun template/1, E). + "<li style=\"color:green\">Manufacturing year: ",xslapply(fun template/1,select("@year",E)),"</li>\n", + "<li style=\"color:red\">Color: ",xslapply(fun template/1,select("@color",E)),"</li>\n", + "<li style=\"color:blue\">Shape : ",xslapply(fun template/1,select("@condition",E)),"</li>\n", + "</ul></dd>\n"]}; +template(E) -> built_in_rules(fun template/1, E). %%%%%%%%%%% helper routines %% sorts on the bike name element, unwraps the bike information and %% inserts a line feed and indentation on each bike element. -sort_by_manufacturer(L) -> - Tuples=[X1||X1={_,_} <- L], - SortedTS = lists:keysort(1,Tuples), +sort_by_manufacturer(L) -> + Tuples=[X1||X1={_,_} <- L], + SortedTS = lists:keysort(1,Tuples), InsertRefName_UnWrap= - fun([{[Name],V}|Rest],Name,F)-> - [V|F(Rest,Name,F)]; - ([{[Name],V}|Rest],_PreviousName,F) -> - [["<a name=\"",Name,"\"></>"],V|F(Rest,Name,F)]; - ([],_,_) -> [] + fun([{[Name],V}|Rest],Name,F)-> + [V|F(Rest,Name,F)]; + ([{[Name],V}|Rest],_PreviousName,F) -> + [["<a name=\"",Name,"\"></>"],V|F(Rest,Name,F)]; + ([],_,_) -> [] end, - SortedRefed=InsertRefName_UnWrap(SortedTS,no_name,InsertRefName_UnWrap), + SortedRefed=InsertRefName_UnWrap(SortedTS,no_name,InsertRefName_UnWrap), % SortedTs=[Y||{X,Y}<-lists:keysort(1,Tuples)], WS = "\n ", - Fun=fun([H|T],Acc,F)-> - F(T,[H,WS|Acc],F); - ([],Acc,_F)-> - lists:reverse([WS|Acc]) + Fun=fun([H|T],Acc,F)-> + F(T,[H,WS|Acc],F); + ([],Acc,_F)-> + lists:reverse([WS|Acc]) end, - if length(SortedRefed) > 0 -> - Fun(SortedRefed,[],Fun); - true -> [] + if length(SortedRefed) > 0 -> + Fun(SortedRefed,[],Fun); + true -> [] end. %% removes all but the first of an element in L and inserts a html %% reference for each list element. -remove_duplicates(L) -> - remove_duplicates(L,[]). +remove_duplicates(L) -> + remove_duplicates(L,[]). -remove_duplicates([],Acc) -> - make_ref(lists:sort(lists:reverse(Acc))); -remove_duplicates([A|L],Acc) -> - case lists:delete(A,L) of +remove_duplicates([],Acc) -> + make_ref(lists:sort(lists:reverse(Acc))); +remove_duplicates([A|L],Acc) -> + case lists:delete(A,L) of L -> - remove_duplicates(L,[A|Acc]); + remove_duplicates(L,[A|Acc]); L1 -> - remove_duplicates([A|L1],[Acc]) + remove_duplicates([A|L1],[Acc]) end. -make_ref([]) -> []; -make_ref([H]) when is_atom(H) -> - "<ul><a href=\"#"++atom_to_list(H)++"\">"++atom_to_list(H)++"</a></ul>"; -make_ref([H]) when is_list(H) -> +make_ref([]) -> []; +make_ref([H]) when is_atom(H) -> + "<ul><a href=\"#"++atom_to_list(H)++"\">"++atom_to_list(H)++"</a></ul>"; +make_ref([H]) when is_list(H) -> "<ul><a href=\"#"++H++"\">\s"++H++"</a></ul>"; -make_ref([H|T]) when is_atom(H) -> - ["<ul><a href=\"#"++atom_to_list(H)++"\">\s"++atom_to_list(H)++",\n</a></ul>" - |make_ref(T)]; -make_ref([H|T]) when is_list(H) -> - ["<ul><a href=\"#"++H++"\">\s"++H++",\n</a></ul>"|make_ref(T)].

    If we run it like this: +make_ref([H|T]) when is_atom(H) -> + ["<ul><a href=\"#"++atom_to_list(H)++"\">\s"++atom_to_list(H)++",\n</a></ul>" + |make_ref(T)]; +make_ref([H|T]) when is_list(H) -> + ["<ul><a href=\"#"++H++"\">\s"++H++",\n</a></ul>"|make_ref(T)].

    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 diff --git a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xs_examples.html b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xs_examples.html index 6fb1fadd7fab5..b33007dcd6b42 100644 --- a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xs_examples.html +++ b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xs_examples.html @@ -135,13 +135,13 @@

    <h1> <xsl:apply-templates/> </h1> -</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -         xslapply(fun template/1, E),
    -     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
    +</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +         xslapply(fun template/1, E),
    +     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
       <div align="center"><h1><xsl:value-of select="." /></h1></div>
    -</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    -    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
    +</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    +    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns="http://www.w3.org/TR/xhtml1/strict">
     
    @@ -202,60 +202,60 @@ 

    </em> </xsl:template> -</xsl:stylesheet>



    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
    +</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
     
    --import(xmerl_xs,
    -    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
    +-import(xmerl_xs,
    +    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
     
    -doctype()->
    +doctype()->
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
     
    -process_xml(Doc)->
    -    template(Doc).
    +process_xml(Doc)->
    +    template(Doc).
     
    -template(E = #xmlElement{name='doc'})->
    -    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    -      doctype(),
    +template(E = #xmlElement{name='doc'})->
    +    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    +      doctype(),
           "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
           "<head>"
    -      "<title>", value_of(select("title",E)), "</title>"
    +      "<title>", value_of(select("title",E)), "</title>"
           "</head>"
           "<body>",
    -      xslapply( fun template/1, E),
    +      xslapply( fun template/1, E),
           "</body>"
    -      "</html>" ];
    +      "</html>" ];
     
     
    -template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -     xslapply( fun template/1, E),
    -     "</h1>"];
    +template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +     xslapply( fun template/1, E),
    +     "</h1>"];
     
    -template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    -    ["<h2>",
    -     xslapply( fun template/1, E),
    -     "</h2>"];
    +template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    +    ["<h2>",
    +     xslapply( fun template/1, E),
    +     "</h2>"];
     
    -template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    -    ["<h3>",
    -     xslapply( fun template/1, E),
    -     "</h3>"];
    +template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    +    ["<h3>",
    +     xslapply( fun template/1, E),
    +     "</h3>"];
     
    -template(E = #xmlElement{ name='para'}) ->
    -    ["<p>", xslapply( fun template/1, E), "</p>"];
    +template(E = #xmlElement{ name='para'}) ->
    +    ["<p>", xslapply( fun template/1, E), "</p>"];
     
    -template(E = #xmlElement{ name='note'}) ->
    -    ["<p class=\"note\">"
    +template(E = #xmlElement{ name='note'}) ->
    +    ["<p class=\"note\">"
          "<b>NOTE: </b>",
    -     xslapply( fun template/1, E),
    -     "</p>"];
    +     xslapply( fun template/1, E),
    +     "</p>"];
     
    -template(E = #xmlElement{ name='emph'}) ->
    -    ["<em>", xslapply( fun template/1, E), "</em>"];
    +template(E = #xmlElement{ name='emph'}) ->
    +    ["<em>", xslapply( fun template/1, E), "</em>"];
     
    -template(E)->
    -    built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any +template(E)-> + built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any text to be written in "push" transforms. That are the ones using a lot xslapply( fun template/1, E ) instead of value_of(select("xpath",E)), which is pull...


    The largest example is the stylesheet to transform this document from the Simplified Docbook XML format to xhtml. The source file is sdocbook2xhtml.erl.

    @@ -274,21 +274,21 @@

    for-each

    The function for-each is quite common in XSLT stylesheets. I <xsl:template match="line"> <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if> <xsl:value-of select="." /><br /> -</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    -    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    -    ["<p>", Lines, "</p>"].
    +</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    +    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    +    ["<p>", Lines, "</p>"].
     
    -template_pos(E = #xmlElement{name='line'}, P) ->
    -    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
    +template_pos(E = #xmlElement{name='line'}, P) ->
    +    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
     
    -indent_line(0)->"&#160;&#160;";
    -indent_line(_)->"".

    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though +indent_line(0)->"&#160;&#160;"; +indent_line(_)->"".


    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though you are somewhere deep in your tree.

    The xslapply/2 function only carries back the child part of the tree to the template fun. But it is quite easy to write template funs that handles both the -child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    -    ["<h3>", value_of(select("title", ETop))," - ",
    -     xslapply( fun(A) -> template(A, ETop) end, E),
    -     "</h3>"];

    +child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    +    ["<h3>", value_of(select("title", ETop))," - ",
    +     xslapply( fun(A) -> template(A, ETop) end, E),
    +     "</h3>"];

    diff --git a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xsd.html b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xsd.html index bb4443d6dd6f3..955d49188ee02 100644 --- a/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xsd.html +++ b/prs/8803/lib/xmerl-2.0/doc/html/xmerl_xsd.html @@ -806,9 +806,9 @@

    validate(Xml, State, Opts)

    several times towards the same schema it reduces time consumption.

    The result, ValidElement, is the valid element that conforms to the post-schema-validation infoset. When the validator finds an error it tries to continue and reports a list of all errors found. In those cases an unexpected -error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    -2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    -3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values +error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    +2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    +3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values defined in my_XML_Schema.xsd.

    3ER^>4Hmd`rvnRnX< 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%0AGj@9b#bu^)tyvA9U1=03ook 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